--- a/messagingapp/msgui/msgapp/src/msgviewmanager.cpp Fri Apr 16 14:56:15 2010 +0300
+++ b/messagingapp/msgui/msgapp/src/msgviewmanager.cpp Mon May 03 12:29:07 2010 +0300
@@ -24,7 +24,8 @@
#include <QSqlQuery>
#include <QSqlError>
#include <HbApplication>
-#include <HbNotificationDialog>
+#include <xqappmgr.h>
+#include <HbMessageBox.h>
#include "conversationsengine.h"
#include "msglistview.h"
@@ -34,16 +35,21 @@
#include "draftslistview.h"
#include "msgsettingsview.h"
#include "convergedmessageid.h"
+#include "ringbc.h"
+#include "unidatamodelloader.h"
+#include "unidatamodelplugininterface.h"
// LOCALIZATION
-#define LOC_SAVED_TO_DRAFTS ("Saved to Drafts")
+#define LOC_BUTTON_DELETE hbTrId("txt_common_button_delete")
+#define LOC_BUTTON_CANCEL hbTrId("txt_common_button_cancel")
+#define LOC_DELETE_MESSAGE hbTrId("txt_messaging_dialog_delete_message")
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)
+ serviceRequest), mConversationId(-1), mViewServiceRequest(false)
{
//creating back action.
mBackAction = new HbAction(Hb::BackAction, this);
@@ -68,6 +74,12 @@
switch (mCurrentView) {
case MsgBaseView::CLV:
{
+ // if its viewer service then quit the application
+ if (mViewServiceRequest) {
+ HbApplication::quit();
+ break;
+ }
+
if (!mServiceRequest) {
HbApplication::quit();
}
@@ -81,7 +93,7 @@
case MsgBaseView::CV:
{
//Save content to drafts before switching to clv
- bool result = mConversationView->saveContentToDrafts();
+ mConversationView->saveContentToDrafts();
//marking messages as red in CV.
mConversationView->markMessagesAsRead();
@@ -89,6 +101,13 @@
//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();
}
@@ -98,9 +117,6 @@
param << MsgBaseView::CLV;
param << MsgBaseView::CV;
switchView(param);
- if (result) {
- HbNotificationDialog::launchDialog(LOC_SAVED_TO_DRAFTS);
- }
}
break;
@@ -125,7 +141,22 @@
case MsgBaseView::UNIEDITOR:
{
//Save content to drafts before switching to clv
- bool result = mUniEditor->saveContentToDrafts();
+ mUniEditor->saveContentToDrafts();
+
+ // if service request for veiwer the just switch to univiewer.
+ if (mViewServiceRequest) {
+ mCurrentView = MsgBaseView::UNIVIEWER;
+ mMainWindow->setCurrentView(mUniViewer);
+ break;
+ }
+
+ //Now UE can be launched from viewer and on its back
+ //we need to clear viewer
+ if (mUniViewer) {
+ mMainWindow->removeView(mUniViewer);
+ delete mUniViewer;
+ mUniViewer = NULL;
+ }
//switch to clv.
if (mServiceRequest) {
@@ -137,9 +168,6 @@
param << MsgBaseView::CLV;
param << MsgBaseView::UNIEDITOR;
switchView(param);
- if (result) {
- HbNotificationDialog::launchDialog(LOC_SAVED_TO_DRAFTS);
- }
}
break;
@@ -147,18 +175,30 @@
case MsgBaseView::UNIVIEWER:
{
- //swich to cv.
- QVariantList param;
- param << MsgBaseView::CV;
- param << MsgBaseView::UNIVIEWER;
- param << mConversationId;
- switchView(param);
+ // if its launched via service request quit the app
+ if (mViewServiceRequest) {
+ HbApplication::quit();
+ }
+ else {
+ QVariantList param;
+ param << MsgBaseView::CV;
+ param << MsgBaseView::UNIVIEWER;
+ param << mConversationId;
+ switchView(param);
- mUniViewer->clearContent();
-
+ delete mUniViewer;
+ mUniViewer = NULL;
+ }
break;
}
-
+ case MsgBaseView::MSGSETTINGS:
+ {
+ QVariantList param;
+ param << MsgBaseView::DEFAULT;
+ param << MsgBaseView::MSGSETTINGS;
+ switchView(param);
+ break;
+ }
default:
{
break;
@@ -245,6 +285,28 @@
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;
@@ -301,10 +363,15 @@
{
ConvergedMessage message;
ConvergedMessageAttachmentList attachmentList;
- QString path = data.toString();
- ConvergedMessageAttachment *attachment = new ConvergedMessageAttachment(path);
-
- attachmentList.append(attachment);
+ // 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;
@@ -360,12 +427,12 @@
mCurrentView = MsgBaseView::CLV;
mPreviousView = data.at(1).toInt();
- //delete uni editor.
- if (mUniEditor) {
- mMainWindow->removeView(mUniEditor);
- delete mUniEditor;
- mUniEditor = NULL;
+ // delete case from viewer service
+ if (mViewServiceRequest && (mPreviousView == MsgBaseView::UNIVIEWER)) {
+ // quit the application
+ HbApplication::quit();
}
+
//remove the settings view from main window
if (mSettingsView) {
mMainWindow->removeView(mSettingsView);
@@ -383,8 +450,21 @@
connect(mListView, SIGNAL(switchView(const QVariantList&)), this,
SLOT(switchView(const QVariantList&)));
mMainWindow->addView(mListView);
- mListView->activateView();
+ }
+
+ //delete uni editor.
+ if (mUniEditor) {
+ mMainWindow->removeView(mUniEditor);
+ delete mUniEditor;
+ mUniEditor = NULL;
}
+
+ if (mUniViewer) {
+ mMainWindow->removeView(mUniViewer);
+ delete mUniViewer;
+ mUniViewer = NULL;
+ }
+
mMainWindow->setCurrentView(mListView);
}
@@ -394,6 +474,12 @@
mCurrentView = MsgBaseView::CV;
mPreviousView = data.at(1).toInt();
+ // delete case from viewer service
+ if (mViewServiceRequest && (mPreviousView == MsgBaseView::UNIVIEWER)) {
+ // quit the application
+ HbApplication::quit();
+ }
+
//delete uni editor.
if (mUniEditor) {
mMainWindow->removeView(mUniEditor);
@@ -401,6 +487,12 @@
mUniEditor = NULL;
}
+ if (mUniViewer) {
+ mMainWindow->removeView(mUniViewer);
+ delete mUniViewer;
+ mUniViewer = NULL;
+ }
+
QVariant var = data.at(2);
qint64 conversationId;
if (var.type() == QVariant::String) {
@@ -419,8 +511,11 @@
// 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();
+ mMainWindow->setCurrentView(mConversationView);
+
+ delete mUniViewer;
+ mUniViewer = NULL;
+
return;
}
else {
@@ -441,10 +536,10 @@
mConversationView->openConversation(conversationId);
if (mServiceRequest) {
- mMainWindow->setCurrentView(mConversationView, false);
+ mMainWindow->setCurrentView(mConversationView);
}
else {
- mMainWindow->setCurrentView(mConversationView, false);
+ mMainWindow->setCurrentView(mConversationView);
}
}
@@ -474,6 +569,14 @@
void MsgViewManager::switchToUniEditor(const QVariantList& data)
{
+ /**
+ * Editor is tried to open again before exiting the previously
+ * opened editor. Multi taping in DLV or Forward.
+ */
+ if (mUniEditor) {
+ return;
+ }
+
mCurrentView = MsgBaseView::UNIEDITOR;
mPreviousView = data.at(1).toInt();
@@ -491,28 +594,24 @@
SLOT(switchView(const QVariantList&)));
}
+ // check if additional data for unieditor's consumption is available
if (data.length() > 2) {
- QByteArray dataArray = data.at(2).toByteArray();
- ConvergedMessage *message = new ConvergedMessage;
- QDataStream stream(&dataArray, QIODevice::ReadOnly);
- message->deserialize(stream);
+ QVariantList editorData;
+ // i=2 because view manager consumed first two args
+ for (int i = 2; i < data.length(); i++) {
+ editorData << data.at(i);
+ }
- if (data.length() > 3) {
- mUniEditor->populateContent(*message, data.at(3).toInt());
+ if (MsgBaseView::DLV == mPreviousView) {
+ mUniEditor->openDraftsMessage(editorData);
}
else {
- if (MsgBaseView::DLV == mPreviousView) {
- mUniEditor->openDraftsMessage(*(message->id()), message->messageType());
- }
- else {
- mUniEditor->populateContent(*message);
- }
+ mUniEditor->populateContent(editorData);
}
- delete message;
}
if (mServiceRequest) {
- mMainWindow->setCurrentView(mUniEditor, false);
+ mMainWindow->setCurrentView(mUniEditor);
}
else {
mMainWindow->setCurrentView(mUniEditor);
@@ -521,6 +620,14 @@
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;
+ }
+
mCurrentView = MsgBaseView::UNIVIEWER;
mPreviousView = data.at(1).toInt();
@@ -533,7 +640,7 @@
ConvergedMessage *message = new ConvergedMessage;
QDataStream stream(&dataArray, QIODevice::ReadOnly);
message->deserialize(stream);
- qint32 messageId = message->id()->getId();
+ qint32 messageId = message->id()->getId();
if (!mUniViewer) {
mUniViewer = new UnifiedViewer(messageId);
mUniViewer->setNavigationAction(mBackAction);
@@ -553,17 +660,10 @@
if (!mSettingsView) {
mSettingsView = new MsgSettingsView();
- connect(mSettingsView, SIGNAL(switchView(const QVariantList&)), this,
- SLOT(switchView(const QVariantList&)));
+ mSettingsView->setNavigationAction(mBackAction);
+ mMainWindow->addView(mSettingsView);
+ mMainWindow->setCurrentView(mSettingsView);
}
- 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)
@@ -577,8 +677,8 @@
//remove the settings view from main window
if (mSettingsView) {
mMainWindow->removeView(mSettingsView);
- mSettingsView->setNavigationAction(mBackAction);
- connect(mBackAction, SIGNAL(triggered()), this, SLOT(onBackAction()));
+ delete mSettingsView;
+ mSettingsView = NULL;
}
switch (mCurrentView) {
case MsgBaseView::CLV:
@@ -590,7 +690,7 @@
case MsgBaseView::CV:
{
if (mConversationView)
- mMainWindow->setCurrentView(mConversationView, false);
+ mMainWindow->setCurrentView(mConversationView);
break;
}
case MsgBaseView::DLV:
@@ -602,7 +702,7 @@
case MsgBaseView::UNIEDITOR:
{
if (mServiceRequest) {
- mMainWindow->setCurrentView(mUniEditor, false);
+ mMainWindow->setCurrentView(mUniEditor);
}
else {
mMainWindow->setCurrentView(mUniEditor);
@@ -612,3 +712,135 @@
}
}
}
+
+void MsgViewManager::view(int msgId)
+{
+ int msgType;
+ int msgSubType;
+
+ 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
+ bool result = HbMessageBox::question(LOC_DELETE_MESSAGE, LOC_BUTTON_DELETE,
+ LOC_BUTTON_CANCEL);
+ if (result) {
+ QList<int> msgIdList;
+ msgIdList << msgId;
+ ConversationsEngine::instance()->deleteMessages(msgIdList);
+ }
+ HbApplication::quit(); // exit after handling
+ 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);
+}
+
+// ----------------------------------------------------------------------------
+// MsgViewManager::handleRingtoneMsg
+// @see header
+// ----------------------------------------------------------------------------
+void MsgViewManager::handleRingtoneMsg(int msgId)
+{
+ if (RingBc::askSaveQuery()) {
+ UniDataModelLoader* pluginLoader = new UniDataModelLoader();
+ UniDataModelPluginInterface* pluginInterface = pluginLoader->getDataModelPlugin(
+ ConvergedMessage::BioMsg);
+ pluginInterface->setMessageId(msgId);
+ 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::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();
+}