diff -r 139d4b7b2938 -r 99bcbff212ad emailservices/nmailagent/src/nmmailagent.cpp --- a/emailservices/nmailagent/src/nmmailagent.cpp Mon May 24 21:02:02 2010 +0300 +++ b/emailservices/nmailagent/src/nmmailagent.cpp Fri May 28 13:56:43 2010 +0300 @@ -15,12 +15,21 @@ * */ +#include +#include + +#include "emailtrace.h" #include "nmmailagentheaders.h" #include "nmmailagent.h" +#include + // CONSTS const int NmAgentIndicatorNotSet = -1; const int NmAgentAlertToneTimer = 60000; // 60s +static const QString NmMailboxIndicatorType = "com.nokia.nmail.indicatorplugin_%1/1.0"; +static const QString NmSendIndicatorName = "com.nokia.nmail.indicatorplugin.send/1.0"; +static const QString NmUnreadIndicatorName = "com.nokia.nmail.indicatorplugin.unread/1.0"; /*! @@ -31,6 +40,8 @@ NmMailboxInfo::NmMailboxInfo() { + NM_FUNCTION; + mId = 0; mIndicatorIndex = NmAgentIndicatorNotSet; mSyncState = SyncComplete; @@ -45,11 +56,14 @@ } NmMailAgent::NmMailAgent() : + mIndicator(NULL), + mSystemTone(NULL), mPluginFactory(NULL), - mSendingState(false), - mAlertToneAllowed(true) + mAlertToneAllowed(true), + mLastOutboxCount(0), + mUnreadIndicatorActive(false) { - NMLOG("NmMailAgent::NmMailAgent"); + NM_FUNCTION; } /*! @@ -57,7 +71,8 @@ */ void NmMailAgent::delayedStart() { - NMLOG("NmMailAgent::delayedStart"); + NM_FUNCTION; + if (!init()) { // Initialisation failed. Quit the agent. QCoreApplication::exit(1); @@ -69,13 +84,20 @@ */ bool NmMailAgent::init() { - NMLOG("NmMailAgent::init"); + NM_FUNCTION; + mPluginFactory = NmDataPluginFactory::instance(); if (!mPluginFactory) { - NMLOG("NmMailAgent::init PluginFactory not created"); + NM_ERROR(1,"NmMailAgent::init(): PluginFactory not created"); return false; } + //mSystemTone = new XQSystemToneService(); + + mIndicator = new HbIndicator(); + connect(mIndicator,SIGNAL(userActivated(const QString &, const QVariantMap&)), + this, SLOT(indicatorActivated(const QString&, const QVariantMap&))); + QList *plugins = mPluginFactory->pluginInstances(); foreach (QObject *plugin, *plugins) { @@ -109,7 +131,10 @@ NmMailAgent::~NmMailAgent() { + NM_FUNCTION; + qDeleteAll(mMailboxes); + //delete mSystemTone; NmDataPluginFactory::releaseInstance(mPluginFactory); } @@ -118,7 +143,8 @@ */ void NmMailAgent::initMailboxStatus() { - NMLOG("NmMailAgent::initMailboxStatus"); + NM_FUNCTION; + QList mailboxes; QList *plugins = mPluginFactory->pluginInstances(); @@ -153,6 +179,7 @@ } qDeleteAll(mailboxes); } + updateSendIndicator(); } /*! @@ -163,7 +190,8 @@ */ bool NmMailAgent::updateUnreadCount(const NmId &mailboxId, NmMailboxInfo &mailboxInfo) { - NMLOG("NmMailAgent::getUnreadCount"); + NM_FUNCTION; + int newUnreadMessages(0); NmDataPluginInterface *plugin = mPluginFactory->interfaceInstance(mailboxId); @@ -202,8 +230,8 @@ // Save updated list of unread message IDs mailboxInfo.mUnreadMailIdList = newUnreadMessageIdList; } - NMLOG(QString("NmMailAgent::getUnreadCount count=%1 new=%2"). - arg(mailboxInfo.mUnreadMailIdList.count()).arg(newUnreadMessages)); + NM_COMMENT(QString("NmMailAgent::getUnreadCount(): count=%1, new=%2"). + arg(mailboxInfo.mUnreadMailIdList.count()).arg(newUnreadMessages)); return (newUnreadMessages > 0); } @@ -216,7 +244,8 @@ */ int NmMailAgent::getOutboxCount(const NmId &mailboxId) { - NMLOG("NmMailAgent::getOutboxCount"); + NM_FUNCTION; + int count(0); NmDataPluginInterface *plugin = mPluginFactory->interfaceInstance(mailboxId); @@ -231,12 +260,37 @@ count = messageList.count(); qDeleteAll(messageList); } - NMLOG(QString("NmMailAgent::getOutboxCount count=%1").arg(count)); + NM_COMMENT(QString("NmMailAgent::getOutboxCount(): count=%1").arg(count)); return count; } /*! + Get list of unread counts in active mailboxes + \returns total number of unread mails +*/ +int NmMailAgent::getTotalUnreadCount() const +{ + int unreads = 0; + foreach (const NmMailboxInfo *mailbox, mMailboxes) { + if (mailbox->mActive) { + unreads += mailbox->mUnreadMailIdList.count(); + } + } + return unreads; +} + +/*! + Update the "@" indicator state according to unread state + \return true if the indicator was activated +*/ +bool NmMailAgent::updateUnreadIndicator() +{ + int unreads = getTotalUnreadCount(); + return updateUnreadIndicator(unreads>0); +} + +/*! Update the mailbox visibility and status \param mailboxId id of the mailbox \param active visibility state of the mailbox @@ -246,14 +300,7 @@ bool NmMailAgent::updateMailboxState(const NmId &mailboxId, bool active, bool refreshAlways) { - // Update the global sending state - mSendingState = false; - foreach (NmMailboxInfo *mailboxInfo, mMailboxes) { - if (mailboxInfo->mOutboxMails>0) { - mSendingState = true; - break; - } - } + NM_FUNCTION; NmMailboxInfo *mailboxInfo = getMailboxInfo(mailboxId); bool changed = false; @@ -264,7 +311,7 @@ if (active) { // Mailbox is not yet assigned to any indicator if (mailboxInfo->mIndicatorIndex < 0) { - mailboxInfo->mIndicatorIndex = getIndicatorIndex(); + mailboxInfo->mIndicatorIndex = getFreeIndicatorIndex(); } updateIndicator(true,*mailboxInfo); @@ -290,11 +337,12 @@ bool NmMailAgent::updateIndicator(bool active, const NmMailboxInfo& mailboxInfo) { - NMLOG(QString("NmMailAgent::updateIndicator index=%1 active=%2"). + NM_FUNCTION; + NM_COMMENT(QString("NmMailAgent::updateIndicator(): index=%1, active=%2"). arg(mailboxInfo.mIndicatorIndex).arg(active)); bool ok = false; - QString name = QString("com.nokia.nmail.indicatorplugin_%1/1.0"). + QString name = QString(NmMailboxIndicatorType). arg(mailboxInfo.mIndicatorIndex); QList list; @@ -305,15 +353,62 @@ list.append(mailboxInfo.mConnectState); list.append(mailboxInfo.mOutboxMails); list.append(mailboxInfo.mIconName); - list.append(mSendingState); + list.append(mLastOutboxCount); - HbIndicator indicator; if (active) { - ok = indicator.activate(name,list); + ok = mIndicator->activate(name,list); } else { - ok = indicator.deactivate(name,list); + ok = mIndicator->deactivate(name,list); + } + + updateUnreadIndicator(); + + return ok; +} + +/*! + update the unread indicator state + \return true if the indicator was activated +*/ +bool NmMailAgent::updateUnreadIndicator(bool active) +{ + NM_FUNCTION; + bool activated = false; + + if (active) { + mIndicator->activate(NmUnreadIndicatorName); + if (!mUnreadIndicatorActive) { + activated = true; + } } + else { + mIndicator->deactivate(NmUnreadIndicatorName); + } + mUnreadIndicatorActive = active; + + return activated; +} + +/*! + Opens inbox view to specific mailbox + \return true if inbox is succesfully opened +*/ +bool NmMailAgent::launchMailbox(quint64 mailboxId) +{ + NM_FUNCTION; + + XQServiceRequest request( + emailFullServiceNameMailbox, + emailOperationViewInbox, + true); + + QList list; + list.append(QVariant(mailboxId)); + + request.setArguments(list); + bool ok = request.send(); + NM_COMMENT(QString("Launch ok=%1 error=%2").arg(ok).arg(request.latestError())); return ok; } @@ -321,8 +416,10 @@ Get next free indicator index, starting from 0 @return index of the indicator that is available */ -int NmMailAgent::getIndicatorIndex() +int NmMailAgent::getFreeIndicatorIndex() { + NM_FUNCTION; + int index = 0; bool found(false); do { @@ -345,7 +442,8 @@ */ void NmMailAgent::handleMailboxEvent(NmMailboxEvent event, const QList &mailboxIds) { - NMLOG(QString("NmMailAgent::handleMailboxEvent %1").arg(event)); + NM_FUNCTION; + NM_COMMENT(QString("NmMailAgent::handleMailboxEvent(): event=%1").arg(event)); switch(event) { case NmMailboxCreated: @@ -381,6 +479,7 @@ // Will hide also the indicator removeMailboxInfo(mailboxId); } + updateUnreadIndicator(); break; default: break; @@ -388,6 +487,47 @@ } /*! + Map the type name to mailbox info + \return NULL if no mailbox match the type +*/ +NmMailboxInfo *NmMailAgent::getMailboxByType(const QString &type) +{ + foreach (NmMailboxInfo *mailbox, mMailboxes) { + // mailbox is shown in indicators + if (mailbox->mIndicatorIndex >= 0 && mailbox->mActive) { + QString typeName = QString(NmMailboxIndicatorType).arg(mailbox->mIndicatorIndex); + + // type names match(!) + if(type==typeName) { + return mailbox; + } + } + } + return NULL; +} + +/*! + Called when indicator is clicked from the indicator menu + - indicator will be hide from the menu + - mailbox will be launched +*/ +void NmMailAgent::indicatorActivated(const QString &type, const QVariantMap &data) +{ + NM_FUNCTION; + Q_UNUSED(data); + + // map the indicator type to mailbox + NmMailboxInfo *info = getMailboxByType(type); + if (info) { + info->mLastSeenTime = QDateTime::currentDateTime(); + info->mActive = false; // indicator is no longer active + updateUnreadIndicator(); + + launchMailbox(info->mId.id()); + } +} + +/*! Received from NmFrameworkAdapter messageEvent signal \sa NmFrameworkAdapter */ @@ -397,7 +537,10 @@ const QList &messageIds, const NmId& mailboxId) { - NMLOG(QString("NmMailAgent::handleMessageEvent %1 %2").arg(event).arg(mailboxId.id())); + NM_FUNCTION; + NM_COMMENT(QString("NmMailAgent::handleMessageEvent(): event=%1, id=%2"). + arg(event).arg(mailboxId.id())); + bool updateNeeded = false; bool activate = false; @@ -425,6 +568,12 @@ if (messageUnread) { mailboxInfo->mUnreadMailIdList.append(messageId); updateMailboxState(mailboxId, true, false); + + // make the "@" appear immediatelly + updateUnreadIndicator(true); + + // Play the tone as well + playAlertTone(); } } } @@ -438,11 +587,12 @@ if (mailboxInfo->mOutboxFolderId == folderId) { // The first mail created in the outbox if (mailboxInfo->mOutboxMails <= 0) { - NMLOG("NmMailAgent: first mail in outbox"); + NM_COMMENT("NmMailAgent: first mail in outbox"); activate = true; updateNeeded = true; } mailboxInfo->mOutboxMails += messageIds.count(); + updateSendIndicator(); } break; } @@ -460,8 +610,8 @@ int oldCount = mailboxInfo->mUnreadMailIdList.count(); activate = updateUnreadCount(mailboxId, *mailboxInfo); - // new unread mails found or no more unread mails in the mailbox - if (activate || (oldCount>0 && mailboxInfo->mUnreadMailIdList.count()==0)) { + // new unread mails found or no more unread mails in the inbox + if (oldCount>0 && mailboxInfo->mUnreadMailIdList.count()==0) { updateNeeded = true; } } @@ -485,12 +635,12 @@ // The last mail was now deleted if (mailboxInfo->mOutboxMails == 0) { - NMLOG("NmMailAgent: last mail deleted from outbox"); - + NM_COMMENT("NmMailAgent: last mail deleted from outbox"); // Keep it active if there is unread mails activate = mailboxInfo->mUnreadMailIdList.count() > 0; updateNeeded = true; } + updateSendIndicator(); } break; } @@ -499,6 +649,8 @@ } if (updateNeeded) { + updateUnreadIndicator(); + NmMailboxInfo *mailboxInfo = getMailboxInfo(mailboxId); updateMailboxState(mailboxId, activate, true /* force refresh */); @@ -513,7 +665,10 @@ NmSyncState state, const NmOperationCompletionEvent &event) { - NMLOG(QString("NmMailAgent::handleSyncStateEvent %1 %2").arg(state).arg(event.mMailboxId.id())); + NM_FUNCTION; + NM_COMMENT(QString("NmMailAgent::handleSyncStateEvent(): state=%1, id=%2"). + arg(state).arg(event.mMailboxId.id())); + NmMailboxInfo *info = getMailboxInfo(event.mMailboxId); if (info) { info->mSyncState = state; @@ -537,12 +692,15 @@ info->mOutboxMails; // Refresh the indicator if messages created or changed - NMLOG(QString(" created=%1, changed=%2, deleted=%3"). + NM_COMMENT(QString("NmMailAgent::handleSyncStateEvent(): " + "created=%1, changed=%2, deleted=%3"). arg(info->mInboxCreatedMessages). arg(info->mInboxChangedMessages). arg(info->mInboxDeletedMessages)); bool refresh = (info->mInboxCreatedMessages > 0) || (info->mInboxChangedMessages > 0); + updateUnreadIndicator(); + if (activate) { updateMailboxState(event.mMailboxId, active, refresh); } @@ -556,8 +714,11 @@ */ void NmMailAgent::handleConnectionEvent(NmConnectState state, const NmId mailboxId, int errorcode) { - Q_UNUSED(errorcode); - NMLOG(QString("NmMailAgent::handleConnectionEvent %1 %2 %3").arg(state).arg(mailboxId.id()).arg(errorcode)); + NM_FUNCTION; + NM_COMMENT(QString("NmMailAgent::handleConnectionEvent(): state=%1, id=%2"). + arg(state).arg(mailboxId.id())); + Q_UNUSED(errorcode); + NmMailboxInfo *mailboxInfo = getMailboxInfo(mailboxId); if (mailboxInfo) { // Connecting, Connected, Disconnecting, Disconnected @@ -571,6 +732,8 @@ */ bool NmMailAgent::removeMailboxInfo(const NmId &id) { + NM_FUNCTION; + bool found = false; foreach (NmMailboxInfo *mailbox, mMailboxes) { if (mailbox->mId == id) { @@ -592,6 +755,8 @@ */ NmMailboxInfo *NmMailAgent::createMailboxInfo(const NmId &id) { + NM_FUNCTION; + // get information of the mailbox NmMailbox *mailbox = NULL; NmMailboxInfo *info = NULL; @@ -612,6 +777,8 @@ */ NmMailboxInfo *NmMailAgent::createMailboxInfo(const NmMailbox &mailbox, NmDataPluginInterface *plugin) { + NM_FUNCTION; + NmMailboxInfo *mailboxInfo = new NmMailboxInfo(); mailboxInfo->mId = mailbox.id(); mailboxInfo->mName = mailbox.name(); @@ -645,6 +812,8 @@ */ NmMailboxInfo *NmMailAgent::getMailboxInfo(const NmId &id) { + NM_FUNCTION; + foreach (NmMailboxInfo *mailbox, mMailboxes) { if (mailbox->mId == id) { return mailbox; @@ -666,7 +835,7 @@ bool NmMailAgent::getMessageUnreadInfo(const NmId &folderId, const NmId &messageId, const NmId &mailboxId, bool &unreadMessage) { - NMLOG("NmMailAgent::messageInfo"); + NM_FUNCTION; NmDataPluginInterface *plugin = mPluginFactory->interfaceInstance(mailboxId); bool ok = false; @@ -687,15 +856,23 @@ } /*! - Plays email alert tune when new messages arrive + Plays email alert tone when new messages arrive + \returns true if the tone was played */ -void NmMailAgent::playAlertTone() +bool NmMailAgent::playAlertTone() { + NM_FUNCTION; + bool played = false; + if (mAlertToneAllowed) { - // play alert + //mSystemTone->playTone(XQSystemToneService::EmailAlertTone); + + // play alert only once per minute mAlertToneAllowed = false; QTimer::singleShot(NmAgentAlertToneTimer, this, SLOT(enableAlertTone())); + played = true; } + return played; } /*! @@ -703,8 +880,34 @@ */ void NmMailAgent::enableAlertTone() { + NM_FUNCTION; + mAlertToneAllowed = true; } +/*! + update send indicator according to outbox state +*/ +void NmMailAgent::updateSendIndicator() +{ + // Get number of mails in outboxes + int outboxMails = 0; + foreach (NmMailboxInfo *mailboxInfo, mMailboxes) { + outboxMails += mailboxInfo->mOutboxMails; + } + + if( outboxMails == 0 ) { + mIndicator->deactivate(NmSendIndicatorName); + } + else if (outboxMails > mLastOutboxCount) { + // New mails detected in outbox + + // indicator will disappear automatically after a delay + mIndicator->activate(NmSendIndicatorName); + } + + mLastOutboxCount = outboxMails; +} + // End of file