messagingapp/msgui/msgapp/src/msgviewmanager.cpp
branchRCL_3
changeset 57 ebe688cedc25
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/messagingapp/msgui/msgapp/src/msgviewmanager.cpp	Tue Aug 31 15:11:31 2010 +0300
@@ -0,0 +1,1232 @@
+/*
+ * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:
+ * class to manage differnt messaging views.
+ *
+ */
+
+#include "msgviewmanager.h"
+
+#include <HbMainWindow>
+#include <HbAction>
+#include <xqserviceutil.h>
+#include <QSqlQuery>
+#include <QSqlError>
+#include <HbApplication>
+#include <xqappmgr.h>
+#include <hbmessagebox.h>
+#include <HbView>
+
+#include "conversationsengine.h"
+#include "msglistview.h"
+#include "msgunieditorview.h"
+#include "msgconversationbaseview.h"
+#include "unifiedviewer.h"
+#include "draftslistview.h"
+#include "msgsettingsview.h"
+#include "convergedmessageid.h"
+#include "ringbc.h"
+#include "unidatamodelloader.h"
+#include "unidatamodelplugininterface.h"
+#include "msgcontacthandler.h"
+#include "debugtraces.h"
+#include "msgaudiofetcherview.h"
+
+// LOCALIZATION
+#define LOC_DELETE_MESSAGE hbTrId("txt_messaging_dialog_delete_message")
+#define LOC_DIALOG_SAVE_RINGTONE hbTrId("txt_conversations_dialog_save_ringing_tone")
+
+const qint64 NULL_CONVERSATIONID = -1;
+
+MsgViewManager::MsgViewManager(bool serviceRequest, HbMainWindow* mainWindow, QObject* parent,int activityMsgId) :
+    QObject(parent), mMainWindow(mainWindow), mUniEditor(0), mListView(0), mConversationView(0),
+        mUniViewer(0), mDraftsListView(0), mSettingsView(0), mAudioFetcherView(0), mBackAction(0),
+        mServiceRequest(serviceRequest), mConversationId(-1), mViewServiceRequest(false),mMessageId(-1)
+{
+    //creating back action.
+    mBackAction = new HbAction(Hb::BackNaviAction, this);
+    connect(mBackAction, SIGNAL(triggered()), this, SLOT(onBackAction()));
+
+    //create clv as first view if not a service request.
+    if (!mServiceRequest) {
+    
+    if(activityMsgId == NULL_CONVERSATIONID)
+        {
+        QVariantList param;
+        param << MsgBaseView::CLV;
+        param << MsgBaseView::CLV;
+        switchView(param);
+        }
+    else 
+        {
+        openUniEditorActivity(activityMsgId);
+        }
+    }
+    else
+    {
+        mDummyview = new HbView();
+        mMainWindow->addView(mDummyview);
+        mMainWindow->setCurrentView(mDummyview);
+        mViewTobeDeleted << mDummyview;
+    }
+}
+
+MsgViewManager::~MsgViewManager()
+{
+    // TODO Auto-generated destructor stub
+    mEditorData.clear();
+}
+
+void MsgViewManager::onBackAction()
+{
+    switch (mCurrentView) {
+    case MsgBaseView::CLV:
+    {
+        // if its viewer service then quit the application
+        if (mViewServiceRequest) {
+            HbApplication::quit();
+            break;
+        }
+
+        if (!mServiceRequest) {
+            HbApplication::quit();
+        }
+        else {
+            completeServiceRequest();
+        }
+
+        break;
+    }
+
+    case MsgBaseView::CV:
+    {
+	    mConversationId = -1; //reset the conversation view id since its closed
+		
+        //Save content to drafts before switching to clv
+        mConversationView->saveContentToDrafts();
+
+        //marking messages as red in CV.
+        mConversationView->markMessagesAsRead();
+
+        // reset the conversation id published
+        mConversationView->setPSCVId(false);
+
+        //clearing content of cv.
+        mConversationView->clearContent();
+
+        // if service request for veiwer the just switch to univiewer.
+        if (mViewServiceRequest) {
+            mCurrentView = MsgBaseView::UNIVIEWER;
+            mMainWindow->setCurrentView(mUniViewer);
+            break;
+        }
+
+        if (mServiceRequest) {
+            completeServiceRequest();
+        }
+        else {
+            //switch to clv.
+            QVariantList param;
+            param << MsgBaseView::CLV;
+            param << MsgBaseView::CV;
+            switchView(param);
+        }
+
+        break;
+    }
+
+    case MsgBaseView::DLV:
+    {
+        if (mServiceRequest) {
+            completeServiceRequest();
+        }
+        else {
+            //switch to clv.
+            QVariantList param;
+            param << MsgBaseView::CLV;
+            param << MsgBaseView::DLV;
+            switchView(param);
+        }
+
+        break;
+    }
+
+    case MsgBaseView::UNIEDITOR:
+    {
+        //Save content to drafts before switching to clv
+        mUniEditor->saveContentToDrafts();
+
+        // if service request for veiwer the just switch to univiewer.
+        if (mViewServiceRequest) {
+            mCurrentView = MsgBaseView::UNIVIEWER;
+            mMainWindow->setCurrentView(mUniViewer);
+            break;
+        }
+
+        //switch to clv.
+        if (mServiceRequest) {
+            completeServiceRequest();
+        }
+        else {
+            //switch to previous view.
+            QVariantList param;
+            param << mPreviousView;
+            param << MsgBaseView::UNIEDITOR;
+            
+            if(mPreviousView == MsgBaseView::CV) {
+                param << mConversationId;
+                }
+            else if(mPreviousView == MsgBaseView::UNIVIEWER){
+                qint32 contactId = mViewerData.at(0).toLongLong();
+                qint32 messageId = mViewerData.at(1).toInt();
+                int msgCount = mViewerData.at(2).toInt();
+                
+                param << contactId;
+                param << messageId;
+                param << msgCount;
+            }
+            else if(mPreviousView == MsgBaseView::UNIEDITOR){
+                //TODO: Remove error handling once Audio fetcher 
+                //becomes dialog
+                param[0] = MsgBaseView::CLV;
+                }
+            
+            switchView(param);
+        }
+
+        break;
+    }
+
+    case MsgBaseView::UNIVIEWER:
+    {
+        // if its launched via service request quit the app
+        if (mViewServiceRequest) {
+            HbApplication::quit();
+        }
+        else {
+            QVariantList param;
+            if (mConversationId != -1)
+                {
+                    //this means CV is till open then just open the fresh CV
+                    param << MsgBaseView::CV;
+                    param << MsgBaseView::UNIVIEWER;
+                    param << mConversationView->conversationId();
+                }
+                else
+                {
+                    param << MsgBaseView::CLV;
+                    param << MsgBaseView::UNIVIEWER;
+                }
+            switchView(param);
+
+        }
+        break;
+    }
+    case MsgBaseView::MSGSETTINGS:
+    {
+        QVariantList param;
+        param << MsgBaseView::DEFAULT;
+        param << MsgBaseView::MSGSETTINGS;
+        switchView(param);
+        break;
+    }
+    case MsgBaseView::AUDIOFETCHER:
+    {
+        // switch back to previous view
+        QVariantList param;
+        param << mPreviousView;
+        param << MsgBaseView::AUDIOFETCHER;
+        if(mPreviousView == MsgBaseView::CV)
+        {
+            param << mConversationId;
+        }
+        switchView(param);
+        break;
+    }
+    default:
+    {
+        break;
+    }
+    }
+}
+
+void MsgViewManager::switchView(const QVariantList& data)
+{
+    QCRITICAL_WRITE("MsgViewManager::switchView start.");
+    
+    int viewId = data.at(0).toInt();
+
+    switch (viewId) {
+    case MsgBaseView::DEFAULT:
+    {
+        handleDefault(data);
+        break;
+    }
+    case MsgBaseView::CLV:
+    {
+         switchToClv(data);
+         break;
+    }
+
+    case MsgBaseView::CV:
+    {
+         switchToCv(data);
+         break;
+    }
+
+    case MsgBaseView::DLV:
+    {
+        switchToDlv(data);
+        break;
+    }
+
+    case MsgBaseView::UNIEDITOR:
+    {
+        switchToUniEditor(data);
+        break;
+    }
+
+    case MsgBaseView::UNIVIEWER:
+    {
+        switchToUniViewer(data);
+        break;
+    }
+
+    case MsgBaseView::MSGSETTINGS:
+    {
+        switchToMsgSettings(data);
+        break;
+    }
+    case MsgBaseView::AUDIOFETCHER:
+    {
+        switchToAudioFetcher(data);
+        break;
+    }
+    }
+    QCRITICAL_WRITE("MsgViewManager::switchView end.");
+}
+
+void MsgViewManager::deletePreviousView()
+{
+    while(mViewTobeDeleted.count())
+    {
+        HbView* v = mViewTobeDeleted.takeAt(0);
+        mMainWindow->removeView(v);
+        delete v;
+    }
+}
+
+
+void MsgViewManager::send(const qint32 contactId, const QString phoneNumber,
+    const QString displayName)
+{
+    qint64 conversationId = ConversationsEngine::instance()-> getConversationIdFromContactId(
+        contactId);
+
+    //set mode to viewer, if conversations found else send mode.
+    QVariantList param;
+    if (conversationId > 0) {
+        param << MsgBaseView::CV;
+        param << MsgBaseView::SERVICE;
+        param << conversationId;
+    }
+    else {
+        ConvergedMessage message;
+        ConvergedMessageAddress address;
+        address.setAddress(phoneNumber);
+        address.setAlias(displayName);
+        message.addToRecipient(address);
+
+        QByteArray dataArray;
+        QDataStream messageStream(&dataArray, QIODevice::WriteOnly | QIODevice::Append);
+        message.serialize(messageStream);
+
+        param << MsgBaseView::UNIEDITOR;
+        param << MsgBaseView::SERVICE;
+        param << dataArray;
+    }
+    switchView(param);
+    XQServiceUtil::toBackground(false);
+}
+
+void MsgViewManager::send(const QString phoneNumber, const QString alias, const QString bodyText)
+{
+    ConvergedMessage message;
+    ConvergedMessageAddress address;
+    address.setAddress(phoneNumber);
+    address.setAlias(alias);
+    message.addToRecipient(address);
+    message.setBodyText(bodyText);
+
+    QVariantList param;
+    QByteArray dataArray;
+    QDataStream messageStream(&dataArray, QIODevice::WriteOnly | QIODevice::Append);
+    message.serialize(messageStream);
+
+    param << MsgBaseView::UNIEDITOR;
+    param << MsgBaseView::SERVICE;
+    param << dataArray;
+
+    switchView(param);
+    XQServiceUtil::toBackground(false);
+}
+
+void MsgViewManager::setServiceRequest(bool request)
+{
+    mServiceRequest = request;
+    mViewAtServiceRequest = mCurrentView;
+}
+
+void MsgViewManager::switchToLastSavedView()
+{
+    QVariantList param;
+
+    switch (mViewAtServiceRequest) {
+    case MsgBaseView::CV:
+    {
+        param << MsgBaseView::CV;
+        param << MsgBaseView::SERVICE;
+        param << mConversationId;
+        break;
+    }
+    case MsgBaseView::UNIVIEWER:
+    {
+        param << MsgBaseView::UNIVIEWER;
+        param << MsgBaseView::SERVICE;
+        break;
+    }
+    default:
+    {
+        param << MsgBaseView::CLV;
+        param << MsgBaseView::SERVICE;
+        break;
+    }
+    }
+    switchView(param);
+}
+
+void MsgViewManager::open(qint64 conversationId)
+{
+    QVariantList param;
+
+    if (conversationId < 0) {
+        param << MsgBaseView::CLV;
+        param << MsgBaseView::SERVICE;
+
+        if( mCurrentView == MsgBaseView::CV && mConversationView)
+            {
+            mConversationView->setPSCVId(false);
+            }
+    }
+    else {
+        param << MsgBaseView::CV;
+        param << MsgBaseView::SERVICE;
+        param << conversationId;
+    }
+
+    switchView(param);
+    XQServiceUtil::toBackground(false);
+}
+
+void MsgViewManager::send(QVariant data)
+{
+    ConvergedMessage message;
+    ConvergedMessageAttachmentList attachmentList;
+    // handle multiple files from sendUI
+    // e.g. contacts can send multiple vcards
+    QStringList receivedFiles = data.toStringList();
+    int recFileCount = receivedFiles.count();
+    for (int i = 0; i < recFileCount; i++) {
+        ConvergedMessageAttachment *attachment =
+            new ConvergedMessageAttachment(receivedFiles.at(i));
+        attachmentList.append(attachment);
+    }
+    message.addAttachments(attachmentList);
+
+    QByteArray dataArray;
+    QDataStream messageStream(&dataArray, QIODevice::WriteOnly | QIODevice::Append);
+    message.serialize(messageStream);
+
+    QVariantList param;
+    param << MsgBaseView::UNIEDITOR;
+    param << MsgBaseView::SERVICE;
+    param << dataArray;
+
+    switchView(param);
+    XQServiceUtil::toBackground(false);
+}
+
+qint64 MsgViewManager::findConversationId(const QString phoneNum)
+{
+    return ConversationsEngine::instance()-> getConversationIdFromAddress(phoneNum);
+}
+
+//will be depricated in future.
+void MsgViewManager::openEditor(QString phoneNumber, QString name)
+{
+    ConvergedMessage message;
+    ConvergedMessageAddress address;
+    address.setAddress(phoneNumber);
+    address.setAlias(name);
+    message.addToRecipient(address);
+
+    QByteArray dataArray;
+    QDataStream messageStream(&dataArray, QIODevice::WriteOnly | QIODevice::Append);
+    message.serialize(messageStream);
+
+    QVariantList param;
+    param << MsgBaseView::UNIEDITOR;
+    param << MsgBaseView::SERVICE;
+    param << dataArray;
+
+    switchView(param);
+    XQServiceUtil::toBackground(false);
+}
+
+void MsgViewManager::completeServiceRequest()
+{
+    mServiceRequest = false;
+    XQServiceUtil::toBackground(true);
+    switchToLastSavedView();
+}
+
+void MsgViewManager::switchToClv(const QVariantList& data)
+{
+    mPreviousView = data.at(1).toInt();
+
+    // delete case from viewer service
+    if (mViewServiceRequest && (mPreviousView == MsgBaseView::UNIVIEWER)) {
+        // quit the application
+        HbApplication::quit();
+    }
+
+    // this is the case when viewer/editor is opened and contacts update takes
+    // place resulting in CV close, the view should directly come to CLV 
+    // bypassing the CV
+    if ((mCurrentView == MsgBaseView::UNIVIEWER 
+            && mPreviousView != MsgBaseView::UNIVIEWER)
+            || (mCurrentView == MsgBaseView::UNIEDITOR
+                    && mPreviousView != MsgBaseView::UNIEDITOR))
+    {
+        //dont do anything
+        //wait for the back from viewer/editor
+        //and reset the open CV id
+        mConversationId = -1;
+        return;
+    }
+
+    //delete UniEditor
+    if (mUniEditor)
+    {
+        appendViewToBeDeleted(mUniEditor);
+        mUniEditor = NULL;
+    }
+
+    //delete UniViewer
+    if (mUniViewer)
+    {
+        appendViewToBeDeleted(mUniViewer);
+        mUniViewer = NULL;
+    }
+
+    if (mConversationView) {
+        mConversationView->saveContentToDrafts();
+        //clearing content of cv.
+        mConversationView->clearContent();
+        //reset the open CV id
+        mConversationId = -1;
+    }
+    
+    //switch to CLV.
+    mCurrentView = MsgBaseView::CLV;
+    if (!mListView) {
+        mListView = new MsgListView();
+        mListView->setNavigationAction(mBackAction);
+        connect(mListView, SIGNAL(switchView(const QVariantList&)), this,
+            SLOT(switchView(const QVariantList&)));
+        mMainWindow->addView(mListView);
+    }
+
+    mMainWindow->setCurrentView(mListView,true,Hb::ViewSwitchSequential);
+}
+
+void MsgViewManager::switchToCv(const QVariantList& data)
+{
+    QCRITICAL_WRITE("MsgViewManager::switchToCv start.");
+    
+    //switch to CV.
+    mCurrentView = MsgBaseView::CV;
+    mPreviousView = data.at(1).toInt();
+
+    // delete case from viewer service
+    if (mViewServiceRequest && (mPreviousView == MsgBaseView::UNIVIEWER)) {
+        // quit the application
+        HbApplication::quit();
+    }
+
+    // delete Audio Fetcher view
+    if(mAudioFetcherView)
+    {
+        appendViewToBeDeleted(mAudioFetcherView);
+        mAudioFetcherView = NULL;
+    }
+
+    //delete UniEditor
+    if (mUniEditor)
+    {
+        // Save to drafts if CV is launched via service
+        if (mPreviousView == MsgBaseView::SERVICE) {
+            mUniEditor->saveContentToDrafts();
+        }
+        appendViewToBeDeleted(mUniEditor);
+        mUniEditor = NULL;
+    }
+
+    //delete UniViewer
+    if (mUniViewer)
+    {
+        appendViewToBeDeleted(mUniViewer);
+        mUniViewer = NULL;
+    }
+
+    QVariant var = data.at(2);
+    qint64 conversationId;
+    if (var.type() == QVariant::String) {
+        QString phoneNumber = var.toString();
+        qint32 contactId = findContactId(phoneNumber);
+        if (contactId != -1) {
+            conversationId = ConversationsEngine::instance()->getConversationIdFromContactId(contactId);
+        }
+        else {
+            conversationId = findConversationId(phoneNumber);
+        }
+
+        if (conversationId == NULL_CONVERSATIONID) {
+            QVariantList param;
+            param << MsgBaseView::CLV;
+            param << MsgBaseView::CV;
+
+            if( mCurrentView == MsgBaseView::CV && mConversationView){
+                mConversationView->setPSCVId(false);
+                }
+
+            switchView(param);
+            return;
+        }
+    }
+    else if (var.type() == QVariant::Invalid) {
+        // this case comes when a message is deleted from
+        // Unified viewer  set curent view as conversation view
+        // and return
+        mMainWindow->setCurrentView(mConversationView,true,Hb::ViewSwitchSequential);
+
+		// publish already opened conversation's id
+        mConversationView->setPSCVId(true);
+        return;
+    }
+    else {
+        conversationId = var.toLongLong();
+    }
+    //switch to CV.
+    mConversationId = conversationId;
+
+    if (!mConversationView) {
+        mConversationView = new MsgConversationBaseView();
+        mConversationView->setNavigationAction(mBackAction);
+        connect(mConversationView, SIGNAL(switchView(const QVariantList&)), this,
+            SLOT(switchView(const QVariantList&)));
+
+        mMainWindow->addView(mConversationView);
+    }
+    else if (mConversationView->conversationId() != mConversationId){
+  		//Save content to drafts before switching to different CV
+        mConversationView->saveContentToDrafts();
+        //clearing content of current cv.
+        mConversationView->clearContent();
+    }
+
+    mConversationView->openConversation(conversationId);
+    mMainWindow->setCurrentView(mConversationView,true,Hb::ViewSwitchSequential);
+    
+    QCRITICAL_WRITE("MsgViewManager::switchToCv end.");
+}
+
+void MsgViewManager::switchToDlv(const QVariantList& data)
+{
+    //delete UniEditor
+    if (mUniEditor)
+    {
+        appendViewToBeDeleted(mUniEditor);
+        mUniEditor = NULL;
+    }
+    
+    //switch to DLV.
+    mCurrentView = MsgBaseView::DLV;
+    mPreviousView = data.at(1).toInt();
+
+    if (!mDraftsListView) {
+        mDraftsListView = new DraftsListView();
+        mDraftsListView->setNavigationAction(mBackAction);
+        connect(mDraftsListView, SIGNAL(switchView(const QVariantList&)), this,
+            SLOT(switchView(const QVariantList&)));
+
+        mMainWindow->addView(mDraftsListView);
+    }
+    mMainWindow->setCurrentView(mDraftsListView,true,Hb::ViewSwitchSequential);
+}
+
+void MsgViewManager::switchToUniEditor(const QVariantList& data)
+{
+    QCRITICAL_WRITE("MsgViewManager::switchToUniEditor start.");
+    
+    /**
+     * Editor is tried to open again before exiting the previously
+     * opened editor. Multi taping in DLV or Forward.
+     */
+    if (mUniEditor && !mAudioFetcherView)
+    {
+        return;
+    }
+
+    mCurrentView = MsgBaseView::UNIEDITOR;
+    if(MsgBaseView::AUDIOFETCHER != data.at(1).toInt())
+    {
+        mPreviousView = data.at(1).toInt();
+    }
+
+    // delete Audio Fetcher view
+    if(mAudioFetcherView)
+    {
+        appendViewToBeDeleted(mAudioFetcherView);
+        mAudioFetcherView = NULL;
+    }
+
+    // delete UniViewer
+	if (mUniViewer )
+	{
+	    appendViewToBeDeleted(mUniViewer);
+	    mUniViewer = NULL;
+	}
+
+    if (mConversationView)
+    {
+        //clearing content of cv.
+        mConversationView->clearContent();
+    }
+
+    // reset conversation id published
+    if(mPreviousView == MsgBaseView::CV && mConversationView)
+    {
+        mConversationView->setPSCVId(false);
+    }
+
+    //swich to unieditor.
+    if (!mUniEditor) {
+        mUniEditor = new MsgUnifiedEditorView();
+        mMainWindow->addView(mUniEditor);
+        mUniEditor->setNavigationAction(mBackAction);
+        connect(mUniEditor, SIGNAL(switchView(const QVariantList&)), this,
+            SLOT(switchView(const QVariantList&)));
+    }
+
+    // check if additional data for unieditor's consumption is available
+    if (data.length() > 2) {
+        QVariantList editorData;
+        // i=2 because view manager consumed first two args
+        for (int i = 2; i < data.length(); i++) {
+            editorData << data.at(i);
+        }
+
+        if (MsgBaseView::DLV == mPreviousView) {
+            //Populate editor after view ready indication 
+            populateUniEditorAfterViewReady(editorData);
+        }
+        else {
+            mUniEditor->populateContent(editorData);
+        }
+    }
+
+    mMainWindow->setCurrentView(mUniEditor,true,Hb::ViewSwitchSequential);
+    
+    QCRITICAL_WRITE("MsgViewManager::switchToUniEditor end.");
+}
+
+void MsgViewManager::switchToUniViewer(const QVariantList& data)
+{
+    /**
+     * Viewer is tried to open again before exiting the previously
+     * opened viewer. Multi taping bubbles in CV.
+     */
+    if (mUniViewer) {
+        return;
+    }
+
+    if (mUniEditor)
+    {
+        appendViewToBeDeleted(mUniEditor);
+        mUniEditor = NULL;
+    }
+
+    //Clear the old viewer data
+    mViewerData.clear();
+    
+    mCurrentView = MsgBaseView::UNIVIEWER;
+    mPreviousView = data.at(1).toInt();
+
+    //switch to univiewer.
+    if (data.length() > 2) {
+        qint32 contactId = data.at(2).toLongLong();
+        qint32 messageId = data.at(3).toInt();
+        int msgCount = data.at(4).toInt();
+
+        //Save the viewer data to be used when u come back from Editor
+        mViewerData << contactId;
+        mViewerData << messageId;
+        mViewerData << msgCount;
+        
+        if (!mUniViewer) {
+            mUniViewer = new UnifiedViewer(messageId);
+            mUniViewer->setNavigationAction(mBackAction);
+            mMainWindow->addView(mUniViewer);
+            connect(mUniViewer, SIGNAL(switchView(const QVariantList&)), this,
+                SLOT(switchView(const QVariantList&)));
+        }
+        mUniViewer->populateContent(messageId, true, msgCount);
+    }
+
+    if(mPreviousView==MsgBaseView::CV && mConversationView)
+        {
+        mConversationView->setPSCVId(false);
+        }
+
+    mMainWindow->setCurrentView(mUniViewer,true,Hb::ViewSwitchSequential);
+}
+void MsgViewManager::switchToMsgSettings(const QVariantList& data)
+{
+    int previousView = data.at(1).toInt();
+    
+    MsgSettingsView::SettingsView view = MsgSettingsView::DefaultView;
+    if (previousView == MsgBaseView::UNIEDITOR || previousView
+            == MsgBaseView::CV)
+        {
+        view = (MsgSettingsView::SettingsView)data.at(2).toInt();
+        }
+
+    //launch settings service
+    QList<QVariant> args;
+    QString serviceName("messagesettings");
+    QString interfaceName("com.nokia.symbian.IMessageSettings");
+    QString operation("launchSettings(int)");
+    XQAiwRequest* request;
+    XQApplicationManager appManager;
+    request = appManager.create(serviceName, interfaceName, operation, true); //embedded
+    if ( request == NULL )
+        {
+        return;       
+        }
+ 
+    args <<  view;
+
+    request->setArguments(args);
+
+    if(previousView==MsgBaseView::CV && mConversationView){
+        mConversationView->setPSCVId(false);
+        }
+
+    if(!request->send())
+        {
+        QDEBUG_WRITE("launchSettings failed")
+        }
+    delete request;
+
+    
+    if(previousView==MsgBaseView::CV && mConversationView){
+        mConversationView->setPSCVId(true);
+        }
+}
+
+void MsgViewManager::handleDefault(const QVariantList& data)
+{
+    //special handling incase we switch from settings-view
+    int previousViewId = data.at(1).toInt();
+    if (MsgBaseView::MSGSETTINGS == previousViewId) {
+        //switch to view, where from settings view was launched
+        mCurrentView = mPreviousView;
+        mPreviousView = previousViewId;
+        //remove the settings view from main window
+        if (mSettingsView)
+        {
+            appendViewToBeDeleted(mSettingsView);
+            mSettingsView = NULL;
+        }
+        switch (mCurrentView) {
+        case MsgBaseView::CLV:
+        {
+            if (mListView)
+                mMainWindow->setCurrentView(mListView,true,Hb::ViewSwitchSequential);
+            break;
+        }
+        case MsgBaseView::CV:
+        {
+            if (mConversationView)
+                mMainWindow->setCurrentView(mConversationView,true,Hb::ViewSwitchSequential);
+            break;
+        }
+        case MsgBaseView::DLV:
+        {
+            if (mDraftsListView)
+                mMainWindow->setCurrentView(mDraftsListView,true,Hb::ViewSwitchSequential);
+            break;
+        }
+        case MsgBaseView::UNIEDITOR:
+        {
+            if (mServiceRequest) {
+                mMainWindow->setCurrentView(mUniEditor,true,Hb::ViewSwitchSequential);
+            }
+            else {
+                mMainWindow->setCurrentView(mUniEditor,true,Hb::ViewSwitchSequential);
+            }
+            break;
+        }
+        }
+    }
+}
+
+void MsgViewManager::view(int msgId)
+{
+    int msgType;
+    int msgSubType;
+    mMessageId = msgId;
+    qint32 messageId(msgId);
+    ConversationsEngine::instance()->markAsReadAndGetType(messageId, msgType, msgSubType);
+
+    switch (msgType) {
+    case ConvergedMessage::Sms:
+    case ConvergedMessage::Mms:
+    case ConvergedMessage::MmsNotification:
+    {
+        handleSmsMmsMsg(msgId);
+        break;
+    }
+    case ConvergedMessage::BioMsg:
+    {
+        if (msgSubType == ConvergedMessage::RingingTone) {
+            handleRingtoneMsg(msgId);
+
+        }
+        else if (msgSubType == ConvergedMessage::Provisioning) {
+            handleProvisoningMsg(msgId);
+        }
+        break;
+    }
+    case ConvergedMessage::BT:
+    {
+        break;
+    }
+    default:
+    {
+        // for un supported message show delete option
+        HbMessageBox::question(LOC_DELETE_MESSAGE,this,
+                               SLOT(onDialogDeleteMsg(HbAction*)),
+                               HbMessageBox::Delete | HbMessageBox::Cancel);
+        break;
+    }
+    }
+}
+
+// ----------------------------------------------------------------------------
+// MsgViewManager::handleSmsMmsMsg
+// @see header
+// ----------------------------------------------------------------------------
+void MsgViewManager::handleSmsMmsMsg(int msgId)
+{
+    mViewServiceRequest = true;
+
+    mCurrentView = MsgBaseView::UNIVIEWER;
+
+    if (!mUniViewer) {
+        mUniViewer = new UnifiedViewer(msgId);
+        mUniViewer->setNavigationAction(mBackAction);
+        mMainWindow->addView(mUniViewer);
+        connect(mUniViewer, SIGNAL(switchView(const QVariantList&)), this,
+            SLOT(switchView(const QVariantList&)));
+    }
+    mUniViewer->populateContent(msgId, true, -1);
+
+    mMainWindow->setCurrentView(mUniViewer,true,Hb::ViewSwitchSequential);
+}
+
+// ----------------------------------------------------------------------------
+// MsgViewManager::handleRingtoneMsg
+// @see header
+// ----------------------------------------------------------------------------
+void MsgViewManager::handleRingtoneMsg(int msgId)
+{
+    mMessageId = msgId;
+    HbMessageBox::question(LOC_DIALOG_SAVE_RINGTONE, this,
+                           SLOT(onDialogSaveTone(HbAction*)), 
+                           HbMessageBox::Save | HbMessageBox::Cancel);
+}
+
+// ----------------------------------------------------------------------------
+// MsgViewManager::handleProvisoningMsg
+// @see header
+// ----------------------------------------------------------------------------
+void MsgViewManager::handleProvisoningMsg(int msgId)
+{
+    QString messageId;
+    messageId.setNum(msgId);
+
+    XQApplicationManager* aiwMgr = new XQApplicationManager();
+
+    XQAiwRequest* request = aiwMgr->create("com.nokia.services.MDM", "Provisioning",
+        "ProcessMessage(QString)", true); // embedded
+
+    if (request) {
+        QList<QVariant> args;
+        args << QVariant(messageId);
+        request->setArguments(args);
+
+        // Send the request
+        bool res = request->send();
+
+        // Cleanup
+        delete request;
+    }
+
+    delete aiwMgr;
+
+    // close the application once its handled
+    HbApplication::quit();
+}
+
+void MsgViewManager::setViewInteractive()
+{
+    if(!mMainWindow->isInteractive())
+    {
+        mMainWindow->setInteractive(true);
+    }
+
+    disconnect(mMainWindow, SIGNAL(viewReady()),this,SLOT(setViewInteractive()));
+}
+
+void  MsgViewManager::appendViewToBeDeleted(HbView* view)
+{
+    if (view)
+    {
+        mViewTobeDeleted << view;
+        connect(mMainWindow, SIGNAL(viewReady()), this, SLOT(deletePreviousView()), Qt::UniqueConnection);
+    }
+}
+
+// ----------------------------------------------------------------------------
+// MsgViewManager::populateEditorAfterViewReady
+// @see header
+// ----------------------------------------------------------------------------
+void MsgViewManager::populateUniEditorAfterViewReady(const QVariantList& editorData)
+	{
+    QCRITICAL_WRITE("MsgViewManager::populateUniEditorAfterViewReady start.");
+	 //Save the editor data and use it in ViewReady handler
+	 mEditorData = editorData;	 
+	 connect(mMainWindow, SIGNAL(viewReady()), this, SLOT(populateUniEditorView()));
+	QCRITICAL_WRITE("MsgViewManager::populateUniEditorAfterViewReady end.");
+	}
+
+// ----------------------------------------------------------------------------
+// MsgViewManager::populateUniEditorView
+// @see header
+// ----------------------------------------------------------------------------
+void MsgViewManager::populateUniEditorView()
+    {
+    QCRITICAL_WRITE("MsgViewManager::populateUniEditorView start.");
+    if (mUniEditor)
+        {
+        mUniEditor->openDraftsMessage(mEditorData);
+        }
+    mEditorData.clear();
+    
+    disconnect(mMainWindow, SIGNAL(viewReady()), this,
+            SLOT(populateUniEditorView()));
+    QCRITICAL_WRITE("MsgViewManager::populateUniEditorView end.");
+}
+
+// ----------------------------------------------------------------------------
+// MsgViewManager::onDialogDeleteMsg
+// @see header
+// ----------------------------------------------------------------------------
+void MsgViewManager::onDialogDeleteMsg(HbAction* action)
+{
+    HbMessageBox *dlg = qobject_cast<HbMessageBox*> (sender());
+    if (action == dlg->actions().at(0)) {
+        QList<int> msgIdList;
+        msgIdList << mMessageId;
+        ConversationsEngine::instance()->deleteMessages(msgIdList);
+    }
+    HbApplication::quit(); // exit after handling
+}
+
+// ----------------------------------------------------------------------------
+// MsgViewManager::onDialogSaveTone
+// @see header
+// ----------------------------------------------------------------------------
+void MsgViewManager::onDialogSaveTone(HbAction* action)
+    {
+        HbMessageBox *dlg = qobject_cast<HbMessageBox*> (sender());
+        if (action == dlg->actions().at(0)) {
+            UniDataModelLoader* pluginLoader = new UniDataModelLoader();
+            UniDataModelPluginInterface* pluginInterface = pluginLoader->getDataModelPlugin(
+                ConvergedMessage::BioMsg);
+            pluginInterface->setMessageId(mMessageId);
+            UniMessageInfoList attachments = pluginInterface->attachmentList();
+
+            QString attachmentPath = attachments.at(0)->path();
+
+            RingBc* ringBc = new RingBc();
+            ringBc->saveTone(attachmentPath);
+
+            // clear attachement list : its allocated at data model
+            while (!attachments.isEmpty()) {
+                delete attachments.takeFirst();
+            }
+
+            delete ringBc;
+            delete pluginLoader;
+        }
+
+        // close the application once its handled
+        HbApplication::quit();
+}
+
+// ----------------------------------------------------------------------------
+// MsgViewManager::currentView
+// @see header
+// ----------------------------------------------------------------------------
+int MsgViewManager::currentView()
+    {
+    return mCurrentView;
+    }
+
+// ----------------------------------------------------------------------------
+// MsgViewManager::switchToAudioFetcher
+// @see header
+// ----------------------------------------------------------------------------
+void MsgViewManager::switchToAudioFetcher(const QVariantList& data)
+    {
+    /**
+     * Audio Fetcher is tried to open again
+     */
+    if(mAudioFetcherView)
+        {
+        return;
+        }
+
+    //switch to Audio Fetcher view
+    mCurrentView = MsgBaseView::AUDIOFETCHER;
+    mPreviousView = data.at(1).toInt();
+    QVariantList editorData;
+    // i=2 because view manager consumed first two args
+    for (int i = 2; i < data.length(); i++) {
+        editorData << data.at(i);
+    }
+    mAudioFetcherView = new MsgAudioFetcherView(editorData);
+    mAudioFetcherView->setNavigationAction(mBackAction);
+    connect(mAudioFetcherView, SIGNAL(switchView(const QVariantList&)), this,
+            SLOT(switchView(const QVariantList&)));
+
+    if(mPreviousView==MsgBaseView::CV && mConversationView)
+        {
+        mConversationView->setPSCVId(false);
+        }
+
+    mMainWindow->addView(mAudioFetcherView);
+    mMainWindow->setCurrentView(mAudioFetcherView,true,Hb::ViewSwitchSequential);
+    }
+
+// ----------------------------------------------------------------------------
+// MsgViewManager::saveContentToDraft
+// @see header
+// ----------------------------------------------------------------------------
+int MsgViewManager::saveContentToDraft()
+    {
+    int msgId = NULL_CONVERSATIONID;
+    if( mCurrentView == MsgBaseView::CV )
+        {
+        msgId = mConversationView->saveContentToDrafts();
+        }
+    else if( mCurrentView ==MsgBaseView::UNIEDITOR)
+        {
+        msgId  = mUniEditor->saveContentToDrafts();
+        }
+    return msgId;
+    }
+
+// ----------------------------------------------------------------------------
+// MsgViewManager::saveContentToDraft
+// @see header
+// ----------------------------------------------------------------------------
+void MsgViewManager::openUniEditorActivity(int activityMsgId)
+{
+    int msgType;
+    int msgSubType;
+  
+    qint32 messageId(activityMsgId);
+    // get the message type
+    ConversationsEngine::instance()->markAsReadAndGetType(messageId, msgType, msgSubType);
+    
+    if (!mUniEditor) {
+           mUniEditor = new MsgUnifiedEditorView();
+           mMainWindow->addView(mUniEditor);
+           mUniEditor->setNavigationAction(mBackAction);
+           connect(mUniEditor, SIGNAL(switchView(const QVariantList&)), this,
+               SLOT(switchView(const QVariantList&)));
+       }
+    
+    // buffer data to open the draft message
+    ConvergedMessageId convergedMsgId(activityMsgId);
+    ConvergedMessage message;
+    message.setMessageType((ConvergedMessage::MessageType) msgType);
+    message.setMessageId(convergedMsgId);
+
+    // Launch uni-editor view
+    QByteArray dataArray;
+    QDataStream messageStream(&dataArray, QIODevice::WriteOnly | QIODevice::Append);
+    message.serialize(messageStream);
+    
+    QVariantList editorData;
+    editorData << dataArray;
+    mUniEditor->openDraftsMessage(editorData);
+    
+    // set the current view
+    mCurrentView = MsgBaseView::UNIEDITOR;
+    mPreviousView =MsgBaseView::CLV;
+    mMainWindow->setCurrentView(mUniEditor,true,Hb::ViewSwitchSequential);
+}
+
+// ----------------------------------------------------------------------------
+// MsgViewManager::findContactId
+// @see header
+// ----------------------------------------------------------------------------
+qint32 MsgViewManager::findContactId(QString address)
+    {
+    QString displayLabel;
+    int count;
+    int localId =
+            MsgContactHandler::resolveContactDisplayName(address,
+                                                         displayLabel,
+                                                         count);
+
+        return localId;
+    }
+
+//EOF