diff -r 6a20128ce557 -r ebfee66fde93 messagingapp/msgnotifications/msgindicatorplugin/src/msgindicator.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/messagingapp/msgnotifications/msgindicatorplugin/src/msgindicator.cpp Fri Jun 04 10:25:39 2010 +0100 @@ -0,0 +1,342 @@ +/* + * 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: + * + */ + +#include "msgindicator.h" +#include "msgindicator_p.h" +#include "msginfodefs.h" +#include "debugtraces.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +//Localized Constants +#define LOC_UNREAD_MESSAGES hbTrId("txt_messaging_list_ln") +#define LOC_NEW_MESSAGES hbTrId("txt_common_opt_ln_new_messages") +#define LOC_RECEIVED_FILES hbTrId("Received files") +#define LOC_UNREAD_SINGLE_MESSAGE hbTrId("Unread Message") +#define LOC_UNREAD_MULTIPLE_MESSAGES hbTrId("Unread Messages") +#define LOC_FAILED_SINGLE_MESSAGE hbTrId("Failed Message") +#define LOC_FAILED_MULTIPLE_MESSAGES hbTrId("Failed Messages") +#define LOC_OUTGOING_SINGLE_MESSAGE hbTrId("Outgoing Message") +#define LOC_OUTGOING_MULTIPLE_MESSAGES hbTrId("Outgoing Messages") + +/** + * The number of indicators. + */ +static const int MsgIndicatorCount = 4; + +/** + * The attibutes of an indicator. + */ +struct MsgIndicatorInfo +{ + QString icon; + QString primaryText; + QString secondaryText; +}; + +/** + * Array of Indicator information elements + */ + +//TODO: Localize + + +// TODO: get regular icons, thes are placeholders.hanlde later +static const MsgIndicatorInfo IndicatorInfo[MsgIndicatorCount] = { + { "", "", "" }, + { "qtg_large_new_message", "newindicatorplugin", "%1 unread messages" }, + { "qtg_small_fail", "failedindicatorplugin", "%1 Failed message%2" }, + { "qtg_small_outbox","pendingindicatorplugin", "%1 Outgoing message%2" } +}; + +// ---------------------------------------------------------------------------- +// ServiceRequestSenderTask::ServiceRequestSenderTask +// @see msgindicator.h +// ---------------------------------------------------------------------------- +ServiceRequestSenderTask::ServiceRequestSenderTask(qint64 conversationId): +mConvId(conversationId) + { + } + +// ---------------------------------------------------------------------------- +// ServiceRequestSenderTask::~ServiceRequestSenderTask +// @see msgindicator.h +// ---------------------------------------------------------------------------- +ServiceRequestSenderTask::~ServiceRequestSenderTask() + { + } + +// ---------------------------------------------------------------------------- +// ServiceRequestSenderTask::run +// @see msgindicator.h +// ---------------------------------------------------------------------------- +void ServiceRequestSenderTask::run() + { + QList args; + QString serviceName("com.nokia.services.hbserviceprovider"); + QString operation("open(qint64)"); + XQAiwRequest* request; + XQApplicationManager appManager; + request = appManager.create(serviceName, "conversationview", operation, false); // embedded + if ( request == NULL ) + { + return; + } + args << QVariant(mConvId); + request->setArguments(args); + request->send(); + delete request; + } + +// ---------------------------------------------------------------------------- +// MsgIndicator::MsgIndicator +// @see msgindicator.h +// ---------------------------------------------------------------------------- +MsgIndicator::MsgIndicator(const QString &indicatorType) : + HbIndicatorInterface(indicatorType, HbIndicatorInterface::NotificationCategory, + InteractionActivated), + mIndicatorType(NULL) +{ + d_ptr = new MsgIndicatorPrivate(this); +} + +// ---------------------------------------------------------------------------- +// MsgIndicator::~MsgIndicator +// @see msgindicator.h +// ---------------------------------------------------------------------------- +MsgIndicator::~MsgIndicator() +{ + delete d_ptr; +} + +// ---------------------------------------------------------------------------- +// MsgIndicator::handleInteraction +// @see msgindicator.h +// ---------------------------------------------------------------------------- +bool MsgIndicator::handleInteraction(InteractionType type) + { + bool handled = false; + if (type == InteractionActivated) + { + QThreadPool::globalInstance()->start(new ServiceRequestSenderTask( + mConversationId)); + handled = true; + } + return handled; +} + +// ---------------------------------------------------------------------------- +// MsgIndicator::indicatorData +// @see msgindicator.h +// ---------------------------------------------------------------------------- +QVariant MsgIndicator::indicatorData(int role) const +{ + switch (role) { + case PrimaryTextRole: + { + return mPrimaryText; + } + case SecondaryTextRole: + { + return mSecondaryText; + } + case DecorationNameRole: + { + return IndicatorInfo[mIndicatorType].icon; + } + case MonoDecorationNameRole: + { + if (NewIndicatorPlugin == mIndicatorType) { + return IndicatorInfo[mIndicatorType].icon; + } + else { + // Don't show status-bar icons for indications other + // than new-message + return QVariant(); + } + } + default: + return QVariant(); + } +} + +// ---------------------------------------------------------------------------- +// MsgIndicator::handleClientRequest +// @see msgindicator.h +// ---------------------------------------------------------------------------- +bool MsgIndicator::handleClientRequest(RequestType type, const QVariant ¶meter) +{ + + bool handled(false); + switch (type) { + case RequestActivate: + { + QByteArray dataArray = parameter.toByteArray(); + QDataStream messageStream(&dataArray, QIODevice::ReadOnly); + MsgInfo info; + info.deserialize(messageStream); + + mCount = info.mMsgCount; + mIndicatorType = info.mIndicatorType; + mPrimaryText = getPrimaryText(info); + mSecondaryText = getSecondaryText(info); + mConversationId = info.mConversationId; + emit + dataChanged(); + handled = true; + } + break; + + case RequestDeactivate: + { + // reset data + mConversationId = -100; + mBodyText = QString(); + emit deactivate(); + } + break; + default: + break; + } + + return handled; +} + +// ---------------------------------------------------------------------------- +// MsgIndicator::prepareDisplayName +// @see msgindicator.h +// ---------------------------------------------------------------------------- +QString MsgIndicator::prepareDisplayName(MsgInfo& indicatorData) const +{ + //Set the Contact Name/Number + + QString displayName; + + if (ECsBlueTooth == indicatorData.mMessageType) { + displayName = LOC_RECEIVED_FILES; + } + else { + indicatorData.mDisplayName.removeDuplicates(); + indicatorData.mDisplayName.sort(); + displayName = indicatorData.mDisplayName.at(0); + + for (int i = 1; i < indicatorData.mDisplayName.count(); ++i) { + displayName += QString(", ") + indicatorData.mDisplayName.at(i); + } + } + return displayName; +} + +// ---------------------------------------------------------------------------- +// MsgIndicator::getPrimaryText +// @see msgindicator.h +// ---------------------------------------------------------------------------- +QString MsgIndicator::getPrimaryText(MsgInfo& data) +{ + if (data.mIndicatorType == NewIndicatorPlugin) { + return getUnreadPrimaryText(data); + } + else { + QString primaryText; + if (mCount >= 1) { + if (data.mIndicatorType == FailedIndicatorPlugin) { + primaryText += QString("%1 ").arg(mCount); + primaryText += (mCount > 1)? + LOC_FAILED_MULTIPLE_MESSAGES : LOC_FAILED_SINGLE_MESSAGE; + } + else { + primaryText += QString("%1 ").arg(mCount); + primaryText += (mCount > 1)? + LOC_OUTGOING_MULTIPLE_MESSAGES : LOC_OUTGOING_SINGLE_MESSAGE; + } + } + return primaryText; + } +} + +// ---------------------------------------------------------------------------- +// MsgIndicator::getUnreadPrimaryText +// @see msgindicator.h +// ---------------------------------------------------------------------------- +QString MsgIndicator::getUnreadPrimaryText(MsgInfo& data) +{ + mConversationId = -100; + + d_ptr->getIndicatorInfo(data); + + mConversationFromSingleContact = data.mFromSingle; + mBodyText = data.mDescription; + + if (mConversationFromSingleContact) { + mConversationId = (int) data.mConversationId; + QString name = data.mDisplayName.at(0); + name.append(QString(" (%1)").arg(data.mMsgCount)); + return name; + } + else { + QString text = QString("%1 ").arg(mCount) + LOC_UNREAD_MULTIPLE_MESSAGES; + return text; + } + +} + +// ---------------------------------------------------------------------------- +// MsgIndicator::getSecondaryText +// @see msgindicator.h +// ---------------------------------------------------------------------------- +QString MsgIndicator::getSecondaryText(MsgInfo& info) +{ + QString secondaryText(""); + + if (info.mIndicatorType == NewIndicatorPlugin) { + secondaryText = info.mDescription; + + if (info.mFromSingle) { + if (ECsBlueTooth == info.mMessageType) { + QFileInfo fname(secondaryText); + secondaryText = fname.fileName(); + } + } + else { + info.mConversationId = -100; + } + } + else { + info.mDisplayName.removeDuplicates(); + info.mDisplayName.sort(); + int count = info.mDisplayName.count(); + if (count > 1) { + info.mConversationId = -100; + } + + secondaryText.append(info.mDisplayName.at(0)); + for (int i = 1; i < info.mDisplayName.count(); ++i) { + secondaryText.append(", "); + secondaryText.append(info.mDisplayName.at(i)); + } + } + return secondaryText; +}