diff -r fa1df4b99609 -r ebe688cedc25 messagingapp/msgui/msgapp/src/msgviewmanager.cpp --- /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 +#include +#include +#include +#include +#include +#include +#include +#include + +#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 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 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 (sender()); + if (action == dlg->actions().at(0)) { + QList 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 (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