diff -r 4697dfb2d7ad -r 238255e8b033 messagingapp/msgui/msgapp/src/msgviewmanager.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/messagingapp/msgui/msgapp/src/msgviewmanager.cpp Fri Apr 16 14:56:15 2010 +0300 @@ -0,0 +1,614 @@ +/* + * 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 "conversationsengine.h" +#include "msglistview.h" +#include "msgunieditorview.h" +#include "msgconversationbaseview.h" +#include "unifiedviewer.h" +#include "draftslistview.h" +#include "msgsettingsview.h" +#include "convergedmessageid.h" + +// LOCALIZATION +#define LOC_SAVED_TO_DRAFTS ("Saved to Drafts") + +const qint64 NULL_CONVERSATIONID = -1; + +MsgViewManager::MsgViewManager(bool serviceRequest, HbMainWindow* mainWindow, QObject* parent) : + QObject(parent), mMainWindow(mainWindow), mUniEditor(0), mListView(0), mConversationView(0), + mUniViewer(0), mDraftsListView(0), mSettingsView(0), mBackAction(0), mServiceRequest( + serviceRequest), mConversationId(-1) +{ + //creating back action. + mBackAction = new HbAction(Hb::BackAction, this); + connect(mBackAction, SIGNAL(triggered()), this, SLOT(onBackAction())); + + //create clv as first view if not a service request. + if (!mServiceRequest) { + QVariantList param; + param << MsgBaseView::CLV; + param << MsgBaseView::CLV; + switchView(param); + } +} + +MsgViewManager::~MsgViewManager() +{ + // TODO Auto-generated destructor stub +} + +void MsgViewManager::onBackAction() +{ + switch (mCurrentView) { + case MsgBaseView::CLV: + { + if (!mServiceRequest) { + HbApplication::quit(); + } + else { + completeServiceRequest(); + } + + break; + } + + case MsgBaseView::CV: + { + //Save content to drafts before switching to clv + bool result = mConversationView->saveContentToDrafts(); + + //marking messages as red in CV. + mConversationView->markMessagesAsRead(); + + //clearing content of cv. + mConversationView->clearContent(); + + if (mServiceRequest) { + completeServiceRequest(); + } + else { + //switch to clv. + QVariantList param; + param << MsgBaseView::CLV; + param << MsgBaseView::CV; + switchView(param); + if (result) { + HbNotificationDialog::launchDialog(LOC_SAVED_TO_DRAFTS); + } + } + + 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 + bool result = mUniEditor->saveContentToDrafts(); + + //switch to clv. + if (mServiceRequest) { + completeServiceRequest(); + } + else { + //switch to clv. + QVariantList param; + param << MsgBaseView::CLV; + param << MsgBaseView::UNIEDITOR; + switchView(param); + if (result) { + HbNotificationDialog::launchDialog(LOC_SAVED_TO_DRAFTS); + } + } + + break; + } + + case MsgBaseView::UNIVIEWER: + { + //swich to cv. + QVariantList param; + param << MsgBaseView::CV; + param << MsgBaseView::UNIVIEWER; + param << mConversationId; + switchView(param); + + mUniViewer->clearContent(); + + break; + } + + default: + { + break; + } + } +} + +void MsgViewManager::switchView(const QVariantList& data) +{ + 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; + } + } +} + +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::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; + } + else { + param << MsgBaseView::CV; + param << MsgBaseView::SERVICE; + param << conversationId; + } + + switchView(param); + XQServiceUtil::toBackground(false); +} + +void MsgViewManager::send(QVariant data) +{ + ConvergedMessage message; + ConvergedMessageAttachmentList attachmentList; + QString path = data.toString(); + ConvergedMessageAttachment *attachment = new ConvergedMessageAttachment(path); + + 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) +{ + //switch to CLV. + mCurrentView = MsgBaseView::CLV; + mPreviousView = data.at(1).toInt(); + + //delete uni editor. + if (mUniEditor) { + mMainWindow->removeView(mUniEditor); + delete mUniEditor; + mUniEditor = NULL; + } + //remove the settings view from main window + if (mSettingsView) { + mMainWindow->removeView(mSettingsView); + mSettingsView->setNavigationAction(mBackAction); + connect(mBackAction, SIGNAL(triggered()), this, SLOT(onBackAction()), Qt::UniqueConnection); + } + if (mConversationView) { + //clearing content of cv. + mConversationView->clearContent(); + } + + if (!mListView) { + mListView = new MsgListView(); + mListView->setNavigationAction(mBackAction); + connect(mListView, SIGNAL(switchView(const QVariantList&)), this, + SLOT(switchView(const QVariantList&))); + mMainWindow->addView(mListView); + mListView->activateView(); + } + mMainWindow->setCurrentView(mListView); +} + +void MsgViewManager::switchToCv(const QVariantList& data) +{ + //switch to CV. + mCurrentView = MsgBaseView::CV; + mPreviousView = data.at(1).toInt(); + + //delete uni editor. + if (mUniEditor) { + mMainWindow->removeView(mUniEditor); + delete mUniEditor; + mUniEditor = NULL; + } + + QVariant var = data.at(2); + qint64 conversationId; + if (var.type() == QVariant::String) { + QString phoneNumber = var.toString(); + conversationId = findConversationId(phoneNumber); + + if (conversationId == NULL_CONVERSATIONID) { + QVariantList param; + param << MsgBaseView::CLV; + param << MsgBaseView::CV; + 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, false); + mUniViewer->clearContent(); + 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); + } + + mConversationView->openConversation(conversationId); + + if (mServiceRequest) { + mMainWindow->setCurrentView(mConversationView, false); + } + else { + mMainWindow->setCurrentView(mConversationView, false); + } +} + +void MsgViewManager::switchToDlv(const QVariantList& data) +{ + //switch to DLV. + mCurrentView = MsgBaseView::DLV; + mPreviousView = data.at(1).toInt(); + + //delete uni editor. + if (mUniEditor) { + mMainWindow->removeView(mUniEditor); + delete mUniEditor; + mUniEditor = NULL; + } + + 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); +} + +void MsgViewManager::switchToUniEditor(const QVariantList& data) +{ + mCurrentView = MsgBaseView::UNIEDITOR; + mPreviousView = data.at(1).toInt(); + + if (mConversationView) { + //clearing content of cv. + mConversationView->clearContent(); + } + + //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&))); + } + + if (data.length() > 2) { + QByteArray dataArray = data.at(2).toByteArray(); + ConvergedMessage *message = new ConvergedMessage; + QDataStream stream(&dataArray, QIODevice::ReadOnly); + message->deserialize(stream); + + if (data.length() > 3) { + mUniEditor->populateContent(*message, data.at(3).toInt()); + } + else { + if (MsgBaseView::DLV == mPreviousView) { + mUniEditor->openDraftsMessage(*(message->id()), message->messageType()); + } + else { + mUniEditor->populateContent(*message); + } + } + delete message; + } + + if (mServiceRequest) { + mMainWindow->setCurrentView(mUniEditor, false); + } + else { + mMainWindow->setCurrentView(mUniEditor); + } +} + +void MsgViewManager::switchToUniViewer(const QVariantList& data) +{ + mCurrentView = MsgBaseView::UNIVIEWER; + mPreviousView = data.at(1).toInt(); + + //switch to univiewer. + if (data.length() > 2) { + qint32 contactId = data.at(2).toLongLong(); + QByteArray dataArray = data.at(3).toByteArray(); + int msgCount = data.at(4).toInt(); + + ConvergedMessage *message = new ConvergedMessage; + QDataStream stream(&dataArray, QIODevice::ReadOnly); + message->deserialize(stream); + qint32 messageId = message->id()->getId(); + 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); + delete message; + } + mMainWindow->setCurrentView(mUniViewer); +} +void MsgViewManager::switchToMsgSettings(const QVariantList& data) +{ + mCurrentView = MsgBaseView::MSGSETTINGS; + mPreviousView = data.at(1).toInt(); + + if (!mSettingsView) { + mSettingsView = new MsgSettingsView(); + connect(mSettingsView, SIGNAL(switchView(const QVariantList&)), this, + SLOT(switchView(const QVariantList&))); + } + else { + //re-connect the back action + mSettingsView->connectCloseAction(); + } + + mMainWindow->addView(mSettingsView); + disconnect(mBackAction, SIGNAL(triggered()), this, SLOT(onBackAction())); + mMainWindow->setCurrentView(mSettingsView); +} + +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) { + mMainWindow->removeView(mSettingsView); + mSettingsView->setNavigationAction(mBackAction); + connect(mBackAction, SIGNAL(triggered()), this, SLOT(onBackAction())); + } + switch (mCurrentView) { + case MsgBaseView::CLV: + { + if (mListView) + mMainWindow->setCurrentView(mListView); + break; + } + case MsgBaseView::CV: + { + if (mConversationView) + mMainWindow->setCurrentView(mConversationView, false); + break; + } + case MsgBaseView::DLV: + { + if (mDraftsListView) + mMainWindow->setCurrentView(mDraftsListView); + break; + } + case MsgBaseView::UNIEDITOR: + { + if (mServiceRequest) { + mMainWindow->setCurrentView(mUniEditor, false); + } + else { + mMainWindow->setCurrentView(mUniEditor); + } + break; + } + } + } +}