diff -r 5253a20d2a1e -r a4d6f1ea0416 emailuis/emailui/src/FreestyleEmailUiMailListVisualiser.cpp --- a/emailuis/emailui/src/FreestyleEmailUiMailListVisualiser.cpp Mon Jan 18 20:08:26 2010 +0200 +++ b/emailuis/emailui/src/FreestyleEmailUiMailListVisualiser.cpp Tue Jan 26 11:45:42 2010 +0200 @@ -2,9 +2,9 @@ * 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 the License "Symbian Foundation License v1.0" +* under the terms of "Eclipse Public License v1.0" * which accompanies this distribution, and is available -* at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +* at the URL "http://www.eclipse.org/legal/epl-v10.html". * * Initial Contributors: * Nokia Corporation - initial contribution. @@ -97,7 +97,192 @@ _LIT( KMissingPreviewDataMarker, "..." ); static const TInt KMaxItemsFethed = 1000; -static const TInt KCMsgBlock = 100; +static const TInt KCMsgBlock = 15; +static const TInt KCMsgMaxBlock = 120; + +// --------------------------------------------------------------------------- +// Generic method for deleting a pointer and setting it NULL. +// --------------------------------------------------------------------------- +// +template void SafeDelete(T*& ptr) + { + delete ptr; + ptr = NULL; + } + +// CMailListModelUpdater + +// --------------------------------------------------------------------------- +// Constructor +// --------------------------------------------------------------------------- +// +CMailListModelUpdater::CMailListModelUpdater() : CActive(EPriorityStandard) + { + CActiveScheduler::Add(this); + } + +// --------------------------------------------------------------------------- +// Destructor +// --------------------------------------------------------------------------- +// +CMailListModelUpdater::~CMailListModelUpdater() + { + iObserver = NULL; + Cancel(); + iSorting.Close(); + } + +// --------------------------------------------------------------------------- +// Returns arrays for sorting parameters. Updater owns the arrays because +// it has to stay alive as long as the iterator is being used. +// --------------------------------------------------------------------------- +// +RArray& CMailListModelUpdater::Sorting() + { + iSorting.Reset(); + return iSorting; + } + +// --------------------------------------------------------------------------- +// Update the mail list model from given iterator. Update progress will be +// informed to the observer. +// --------------------------------------------------------------------------- +// +void CMailListModelUpdater::UpdateModelL(MObserver& aObserver, MFSMailIterator* aIterator) + { + Cancel(); + iObserver = &aObserver; + iIterator = aIterator; + Signal(EInitialize); + } + +// --------------------------------------------------------------------------- +// Internal method. Sets new state and signals itself. +// --------------------------------------------------------------------------- +// +void CMailListModelUpdater::Signal(TState aState, TInt aError) + { + iState = aState; + iStatus = KRequestPending; + SetActive(); + TRequestStatus* status = &iStatus; + User::RequestComplete(status, aError); + } + +// --------------------------------------------------------------------------- +// Initialization state. Reset update and call UpdateBeginL() for the observer. +// --------------------------------------------------------------------------- +// +void CMailListModelUpdater::InitializeL() + { + iBlockSize = KCMsgBlock; + iParentId = KFsTreeRootID; + iId = TFSMailMsgId(); + iItemsFetched = 0; + iObserver->UpdateBeginL(); + Signal(EFetch); + } + +// --------------------------------------------------------------------------- +// Fetch state. Fetch next messages and if there is more messages signal +// fetch state again OR proceed to finalizing state. +// --------------------------------------------------------------------------- +// +void CMailListModelUpdater::FetchL() + { + RPointerArray messages(iBlockSize); + CleanupClosePushL(messages); + const TBool moreMessages(iIterator->NextL(iId, iBlockSize, messages)); + iBlockSize = Min(KCMsgMaxBlock, iBlockSize * 2); + if (messages.Count() > 0) + { + iItemsFetched += messages.Count(); + iId = messages[messages.Count() - 1]->GetMessageId(); + iObserver->UpdateProgressL(iParentId, messages); + } + CleanupStack::PopAndDestroy(); // messages.Close() + if (moreMessages && iItemsFetched < KMaxItemsFethed) + { + Signal(EFetch); + } + else + { + Signal(EFinalize); + } + } + +// --------------------------------------------------------------------------- +// Finalizing state. Notify observer that model update has been done and +// free the resources. +// --------------------------------------------------------------------------- +// +void CMailListModelUpdater::FinalizeL() + { + iObserver->UpdateCompleteL(); + Reset(); + } + +// --------------------------------------------------------------------------- +// If the state is anything but EIdle, returns ETrue. +// --------------------------------------------------------------------------- +// +TBool CMailListModelUpdater::IsUpdating() const + { + return iState > EIdle; + } + +// --------------------------------------------------------------------------- +// Reset the state to EIdle and free resources. +// --------------------------------------------------------------------------- +// +void CMailListModelUpdater::Reset() + { + iSorting.Reset(); + SafeDelete(iIterator); + iState = EIdle; + } + +// --------------------------------------------------------------------------- +// Active objects RunL() +// --------------------------------------------------------------------------- +// +void CMailListModelUpdater::RunL() + { + const TInt error(iStatus.Int()); + if (!error) + { + switch (iState) + { + case EInitialize: + InitializeL(); + break; + case EFetch: + FetchL(); + break; + case EFinalize: + default: + FinalizeL(); + break; + } + } + else + { + iObserver->UpdateErrorL(error); + } + } + +// --------------------------------------------------------------------------- +// Update has been cancelled. Inform the observer and free resources. +// --------------------------------------------------------------------------- +// +void CMailListModelUpdater::DoCancel() + { + if (iObserver) + { + iObserver->UpdateCancelled(IsUpdating()); + } + Reset(); + } // --------------------------------------------------------------------------- // Static constructor. @@ -139,6 +324,8 @@ BaseConstructL( R_FSEMAILUI_MAIL_LIST_VIEW ); + iMailListModelUpdater = new (ELeave) CMailListModelUpdater(); + // Don't construct this anywhere else than here. // Don't delete this until in the destructor to avoid NULL checks. iModel = CFSEmailUiMailListModel::NewL( &iAppUi ); @@ -282,8 +469,8 @@ : CFsEmailUiViewBase( aMailListControlGroup, *aAppUi ), iEnv( aEnv ), iListMarkItemsState( ETrue ), //Initlly list has no markings - iConsumeStdKeyYes_KeyUp( EFalse ), // use to prevent Call application execution if call for contact processed - iMoveToFolderOngoing( EFalse ) + iMoveToFolderOngoing( EFalse ), + iConsumeStdKeyYes_KeyUp( EFalse ) // use to prevent Call application execution if call for contact processed { FUNC_LOG; } @@ -295,12 +482,8 @@ CFSEmailUiMailListVisualiser::~CFSEmailUiMailListVisualiser() { FUNC_LOG; - if ( iMailFolder ) - { - delete iMailFolder; - iMailFolder = NULL; - } - + SafeDelete(iMailListModelUpdater); + SafeDelete(iMailFolder); delete iTouchManager; delete iStylusPopUpMenu; delete iMailList; @@ -314,35 +497,31 @@ void CFSEmailUiMailListVisualiser::PrepareForExit() { FUNC_LOG; + iMailListModelUpdater->Cancel(); if ( iMsgNoteTimer ) { iMsgNoteTimer->Cancel(); - delete iMsgNoteTimer; - iMsgNoteTimer = NULL; + SafeDelete(iMsgNoteTimer); } if ( iDateChangeTimer ) { iDateChangeTimer->Cancel(); - delete iDateChangeTimer; - iDateChangeTimer = NULL; + SafeDelete(iDateChangeTimer); } if ( iMailListUpdater ) { iMailListUpdater->Stop(); - delete iMailListUpdater; - iMailListUpdater = NULL; + SafeDelete(iMailListUpdater); } if ( iAsyncRedrawer ) { iAsyncRedrawer->Cancel(); - delete iAsyncRedrawer; - iAsyncRedrawer = NULL; + SafeDelete(iAsyncRedrawer); } if ( iAsyncCallback ) { iAsyncCallback->Cancel(); - delete iAsyncCallback; - iAsyncCallback = NULL; + SafeDelete(iAsyncCallback); } if ( iMailList ) { @@ -352,16 +531,10 @@ { iControlBarControl->RemoveObserver( *this ); } - // + SafeDelete(iMailFolder); iTreeItemArray.Reset(); - if ( iMailFolder ) - { - delete iMailFolder; - iMailFolder = NULL; - } // Reset, not delete to avoid NULL checks. iModel->Reset(); - // } // --------------------------------------------------------------------------- @@ -375,6 +548,101 @@ } // --------------------------------------------------------------------------- +// @see CMailListModelUpdater::MObserver::UpdateErrorL +// --------------------------------------------------------------------------- +// +void CFSEmailUiMailListVisualiser::UpdateErrorL(TInt aError) + { + FUNC_LOG; + User::Leave(aError); + } + +// --------------------------------------------------------------------------- +// @see CMailListModelUpdater::MObserver::UpdateBeginL +// --------------------------------------------------------------------------- +// +void CFSEmailUiMailListVisualiser::UpdateBeginL() + { + FUNC_LOG; + iModel->Reset(); + iTreeItemArray.Reset(); + } + +// --------------------------------------------------------------------------- +// @see CMailListModelUpdater::MObserver::UpdateProgressL +// --------------------------------------------------------------------------- +// +void CFSEmailUiMailListVisualiser::UpdateProgressL(TFsTreeItemId& aParentId, RPointerArray& aMessages) + { + FUNC_LOG; + const TInt itemsInModel(iModel->Count()); + CreateModelItemsL(aMessages); + RefreshListItemsL(aParentId, itemsInModel, iModel->Count()); + } + +// --------------------------------------------------------------------------- +// @see CMailListModelUpdater::MObserver::UpdateCompleteL +// --------------------------------------------------------------------------- +// +void CFSEmailUiMailListVisualiser::UpdateCompleteL() + { + FUNC_LOG; + if ( !iModel->Count() ) + { + iFocusedControl = EControlBarComponent; + } + else + { + iFocusedControl = EMailListComponent; + if (iMailList->FocusedItem() == KFsTreeNoneID) + { + iMailList->SetFocusedItemL( iTreeItemArray[0].iListItemId ); + } + } + SetListAndCtrlBarFocusL(); + iAppUi.StartMonitoringL(); + } + +// --------------------------------------------------------------------------- +// @see CMailListModelUpdater::MObserver::UpdateCancelled +// --------------------------------------------------------------------------- +// +void CFSEmailUiMailListVisualiser::UpdateCancelled(const TBool aForceRefresh) + { + FUNC_LOG; + iForceRefresh = aForceRefresh; + } + +// --------------------------------------------------------------------------- +// Asynchronous mail list model update. +// --------------------------------------------------------------------------- +// +void CFSEmailUiMailListVisualiser::UpdateMailListModelAsyncL() + { + FUNC_LOG; + if ( iMailFolder ) + { + TFSMailDetails details( EFSMsgDataEnvelope ); + RArray& sorting(iMailListModelUpdater->Sorting()); + sorting.AppendL( iCurrentSortCriteria ); + if ( iCurrentSortCriteria.iField != EFSMailSortByDate ) + { + // Add date+descending as secondary sort criteria if primary field is something else than date + TFSMailSortCriteria secondarySortCriteria; + secondarySortCriteria.iField = EFSMailSortByDate; + secondarySortCriteria.iOrder = EFSMailDescending; + sorting.AppendL( secondarySortCriteria ); + } + // List all or maximum number of messages + iMailListModelUpdater->UpdateModelL(*this, iMailFolder->ListMessagesL(details, sorting)); + } + else + { + UpdateCompleteL(); + } + } + +// --------------------------------------------------------------------------- // // // --------------------------------------------------------------------------- @@ -382,9 +650,10 @@ void CFSEmailUiMailListVisualiser::UpdateMailListModelL() { FUNC_LOG; + // Make sure asynchronous update is not going on + iMailListModelUpdater->Cancel(); // Reset model with each update iModel->Reset(); - if ( iMailFolder ) { // Update folder if provided, otherwise use current folder @@ -446,15 +715,31 @@ { FUNC_LOG; // New Items - CFSEmailUiMailListModelItem* newItem = NULL; + CFSEmailUiMailListModelItem* newItem(NULL); // Draw first separator if there are messages. if ( aMessages.Count() && iNodesInUse == EListControlSeparatorEnabled ) { + if (iModel->Count()) + { + CFSMailMessage* nextMessage = aMessages[0]; + CFSEmailUiMailListModelItem* previousMessage(static_cast(iModel->Item(iModel->Count() - 1))); + TBool needANewDivider = + !MessagesBelongUnderSameSeparatorL( previousMessage->MessagePtr(), *nextMessage ); + if ( needANewDivider ) + { + newItem = CreateSeparatorModelItemLC( *nextMessage ); + iModel->AppendL( newItem ); + CleanupStack::Pop( newItem ); + } + } + else + { newItem = CreateSeparatorModelItemLC( *aMessages[0] ); iModel->AppendL( newItem ); CleanupStack::Pop( newItem ); } + } // Start appending items for (int i = 0; i < aMessages.Count(); i++) @@ -951,6 +1236,7 @@ { iAppUi.FolderList().HidePopupL(); } + DisableMailList( EFalse ); // inform baseView if view entered with forward navigation TBool forwardNavigation = EFalse; @@ -1116,19 +1402,24 @@ // CHECK IF MODEL NEEDS TO BE UPDATED if ( activationData.iMailBoxId != prevMailBoxId || activationData.iFolderId != prevFolderId || - activationData.iRequestRefresh ) + activationData.iRequestRefresh || + iForceRefresh ) { + iForceRefresh = EFalse; // Set initial sort criteria when folder is changed iCurrentSortCriteria.iField = EFSMailSortByDate; iCurrentSortCriteria.iOrder = EFSMailDescending; SetSortButtonTextAndIconL(); - delete iMailFolder; - iMailFolder = NULL; + SafeDelete(iMailFolder); TRAP_IGNORE( iMailFolder = iAppUi.GetMailClient()->GetFolderByUidL( activationData.iMailBoxId, activationData.iFolderId ) ); if ( !iMailFolder ) { + if ( forwardNavigation ) + { + iAppUi.StartMonitoringL(); + } // Safety, try to revert back to standard folder inbox TFSMailMsgId inboxId = iAppUi.GetActiveMailbox()->GetStandardFolderId( EFSInbox ); iMailFolder = iAppUi.GetMailClient()->GetFolderByUidL( activationData.iMailBoxId, inboxId ); @@ -1150,9 +1441,6 @@ // Check sync icon timer and sync status ConnectionIconHandling(); - iMailList->HideListL(); - iMailList->ShowListL(); - // REBUILD TREE LIST IF NECESSARY if ( refreshNeeded ) { @@ -1161,25 +1449,38 @@ TFSMailMsgId focused = MsgIdFromListId( iMailList->FocusedItem() ); // Clear any previous items from the screen and then make the view visible + iMailList->BeginUpdate(); iMailList->RemoveAllL(); iTreeItemArray.Reset(); - UpdateMailListModelL(); - RefreshDeferred( &focused ); + iModel->Reset(); + iMailList->EndUpdateL(); + iMailList->ShowListL(); + + // If coming from wizard use synchronous list updating + if (activationData.iReturnAfterWizard) + { + UpdateMailListModelL(); + } + else + { + UpdateMailListModelAsyncL(); + } } - // THE CORRECT FOLDER IS ALREADY OPEN. CHECK IF SOME PARTIAL UPDATE IS NEEDED. else { - // hide & show list to force it to adept to changed screen size + iMailList->ShowListL(); + if (forwardNavigation) + { + iAppUi.StartMonitoringL(); + } SetListAndCtrlBarFocusL(); // ShowListL() makes list focused and this may need to be reverted UnmarkAllItemsL(); - if ( aCustomMessageId == TUid::Uid(KMailSettingsReturnFromPluginSettings) ) { // Better to refresh launcher grid view because mailbox branding might be changed. iAppUi.LauncherGrid().SetRefreshNeeded(); } - // Check the validity of focused message, it may be deleted or // reply/forward, read/unread status might have changed in editor or viewer UpdateItemAtIndexL( HighlightedIndex() ); @@ -1240,14 +1541,19 @@ // void CFSEmailUiMailListVisualiser::ChildDoDeactivate() { - FUNC_LOG; + FUNC_LOG; + if (iMailListModelUpdater) + { + iMailListModelUpdater->Cancel(); + } if ( !iAppUi.AppUiExitOngoing() ) - { - TRAP_IGNORE( { + { + TRAP_IGNORE( { + iMailList->HideListL(); iMailList->SetFocusedL( EFalse ); } ); - iMailTreeListVisualizer->NotifyControlVisibilityChange( EFalse ); - } + iMailTreeListVisualizer->NotifyControlVisibilityChange( EFalse ); + } iThisViewActive = EFalse; } @@ -1761,22 +2067,13 @@ CFSEmailUiMailListModelItem* item( NULL ); SetMailListItemsExtendedL(); - TBool allowRefresh(EFalse); TInt count(0); count = iModel->Count(); for ( TInt i=0; i < count; i++ ) { item = static_cast(iModel->Item(i)); - if ( i == 0 || i == count - 1 ) - {//first item - show scrollbar - //last item - update scrollbar - allowRefresh = ETrue; - } - else - {//rest of the messages - insert without updating - allowRefresh = EFalse; - } + const TBool allowRefresh(i == 0 || (i == count - 1)); // Append separator item text into the list if ( item && item->ModelItemType() == ETypeSeparator ) @@ -1791,6 +2088,39 @@ } } +// --------------------------------------------------------------------------- +// +// +// --------------------------------------------------------------------------- +// +void CFSEmailUiMailListVisualiser::RefreshListItemsL(TFsTreeItemId& aLatestNodeId, const TInt aStartIndex, const TInt aEndIndex) + { + FUNC_LOG; + // IMPLEMENTATION OF FILLING UP THE LIST + iMailList->BeginUpdate(); + CFSEmailUiMailListModelItem* item( NULL ); + if (aLatestNodeId == KFsTreeRootID && !aStartIndex) + { + iMailList->RemoveAllL(); + iTreeItemArray.Reset(); + SetMailListItemsExtendedL(); + } + for ( TInt i = aStartIndex; i < aEndIndex; i++ ) + { + item = static_cast(iModel->Item(i)); + // Append separator item text into the list + if ( item && item->ModelItemType() == ETypeSeparator ) + { + aLatestNodeId = InsertNodeItemL( i, KErrNotFound, EFalse ); + } + // Append mail item into the list + else if ( item && item->ModelItemType() == ETypeMailItem ) + { + InsertListItemL( i, aLatestNodeId, KErrNotFound, EFalse ); + } + } + iMailList->EndUpdateL(); + } void CFSEmailUiMailListVisualiser::SetMailListItemsExtendedL() { @@ -3907,10 +4237,10 @@ // MSK label can now be updated when shift key has been handled SetMskL(); // On KeyUp of EStdKeyYes usually Call application is called - prevent it - if ( iConsumeStdKeyYes_KeyUp && (aEvent.Code() == EEventKeyUp )) + if ( iConsumeStdKeyYes_KeyUp && (aEvent.Code() == EEventKeyUp )) { iConsumeStdKeyYes_KeyUp = EFalse; // in case call button was consumed elsewhere first key up enables calling Call application - if ( EStdKeyYes == scanCode) + if ( EStdKeyYes == scanCode) { result = ETrue; // consume not to switch to Call application when call to contact was processed return result; @@ -5673,6 +6003,9 @@ { CFSEmailUiMailListModelItem* item = static_cast( iModel->Item( i ) ); + // when the item is a separator check whether its MessagePtr is valid (actually it's a reference) + if( &(item->MessagePtr()) != NULL) + { if ( aMessageId == item->MessagePtr().GetMessageId() ) { TModelItemType itemType = item->ModelItemType(); @@ -5692,6 +6025,7 @@ } } } + } return idx; } @@ -5844,8 +6178,8 @@ if ( !iMailFolder || ( iMailFolder && iMailFolder->GetFolderId() != aSelectedFolderId ) ) { - delete iMailFolder; - iMailFolder = NULL; + iMailListModelUpdater->Cancel(); + SafeDelete(iMailFolder); iMailFolder = iAppUi.GetMailClient()->GetFolderByUidL( iAppUi.GetActiveMailboxId(), aSelectedFolderId ); if ( !iMailFolder ) @@ -5889,8 +6223,8 @@ //Set touchmanager back to active DisableMailList(EFalse); iAppUi.SetActiveMailboxL( aSelectedMailboxId ); - delete iMailFolder; - iMailFolder = NULL; + iMailListModelUpdater->Cancel(); + SafeDelete(iMailFolder); iMailFolder = iAppUi.GetMailClient()->GetFolderByUidL( iAppUi.GetActiveMailboxId(), iAppUi.GetActiveBoxInboxId() ); // Set initial sort criteria when folder has changed @@ -6305,13 +6639,21 @@ void CFSEmailUiMailListVisualiser::ReplyL( CFSMailMessage* aMsgPtr ) { FUNC_LOG; - DoReplyForwardL( KEditorCmdReply, aMsgPtr ); + // Replying not possible from drafts folder + if ( iMailFolder && iMailFolder->GetFolderType() != EFSDraftsFolder ) + { + DoReplyForwardL( KEditorCmdReply, aMsgPtr ); + } } void CFSEmailUiMailListVisualiser::ReplyAllL( CFSMailMessage* aMsgPtr ) { FUNC_LOG; - DoReplyForwardL( KEditorCmdReplyAll, aMsgPtr ); + // Replying all not possible from drafts folder + if ( iMailFolder && iMailFolder->GetFolderType() != EFSDraftsFolder ) + { + DoReplyForwardL( KEditorCmdReplyAll, aMsgPtr ); + } } void CFSEmailUiMailListVisualiser::ForwardL( CFSMailMessage* aMsgPtr ) @@ -6393,8 +6735,8 @@ if ( entryId == currentFolderId ) { // Current folder deleted, try to revert back to standard folder inbox. - delete iMailFolder; - iMailFolder = NULL; + iMailListModelUpdater->Cancel(); + SafeDelete(iMailFolder); TFSMailMsgId inboxId = iAppUi.GetActiveMailbox()->GetStandardFolderId( EFSInbox ); if ( !inboxId.IsNullId() ) { @@ -6433,9 +6775,11 @@ if ( parentFolderId && ( *parentFolderId == currentFolderId ) ) { // Refresh mailfolder to get correct actual data - delete iMailFolder; - iMailFolder = NULL; + /* + iMailListModelUpdater->Cancel(); + SafeDelete(iMailFolder); iMailFolder = iAppUi.GetMailClient()->GetFolderByUidL( aMailboxId, currentFolderId ); + */ RemoveMsgItemsFromListIfFoundL( *removedEntries ); } } @@ -6447,8 +6791,8 @@ if ( FolderId().IsNullId() ) { // Refresh mailfolder to standard folder inbox in case of zero id - delete iMailFolder; - iMailFolder = NULL; + iMailListModelUpdater->Cancel(); + SafeDelete(iMailFolder); TFSMailMsgId inboxId = iAppUi.GetActiveMailbox()->GetStandardFolderId( EFSInbox ); if ( !inboxId.IsNullId() ) { @@ -6493,9 +6837,11 @@ else if ( fromFolderId && ( currentFolderId == *fromFolderId ) ) { // Refresh mailfolder to get correct actual data - delete iMailFolder; - iMailFolder = NULL; + /* + iMailListModelUpdater->Cancel(); + SafeDelete(iMailFolder); iMailFolder = iAppUi.GetMailClient()->GetFolderByUidL( aMailboxId, currentFolderId ); + */ RemoveMsgItemsFromListIfFoundL( *entries ); } else @@ -6512,14 +6858,16 @@ if ( *parentFolderId == currentFolderId ) { // Refresh mailfolder to get correct actual data - delete iMailFolder; - iMailFolder = NULL; + /* + iMailListModelUpdater->Cancel(); + SafeDelete(iMailFolder); iMailFolder = iAppUi.GetMailClient()->GetFolderByUidL( aMailboxId, currentFolderId ); + */ for ( TInt i=0 ; iCount() ; i++ ) { TFSMailMsgId msgId = (*entries)[i]; TInt idx = ItemIndexFromMessageId( msgId ); - if ( idx >= 0 ) + if ( idx != KErrNotFound ) { UpdateItemAtIndexL( idx ); } @@ -7268,6 +7616,7 @@ { FUNC_LOG; CActiveScheduler::Add( this ); + iDayCount = DayCount(); } // ----------------------------------------------------------------------------- @@ -7315,20 +7664,58 @@ void CDateChangeTimer::RunL() { FUNC_LOG; + + if (iStatus.Int() != KErrNone) + { + INFO_1("### CDateChangeTimer::RunL (err=%d) ###", iStatus.Int()); + } + + + TBool dayChanged = EFalse; + TInt dayCount = DayCount(); + if (dayCount != iDayCount) + { + + iDayCount = dayCount; + dayChanged = ETrue; + } + + if ( KErrCancel == iStatus.Int() ) { ; - } - // System time changed? - else if ( KErrAbort == iStatus.Int() ) + } + else if ( KErrAbort == iStatus.Int() ) // System time changed { + if (dayChanged) + { + TRAP_IGNORE( iMailListVisualiser.NotifyDateChangedL() ); + } Start(); } - // Interval is over - else + else // interval is over { // Update mail list and reissue the request for timer event TRAP_IGNORE( iMailListVisualiser.NotifyDateChangedL() ); Start(); } + } + + +TInt CDateChangeTimer::DayCount() + { + TTime now; + now.HomeTime(); + TTime minTime = Time::MinTTime(); + TTimeIntervalDays days = now.DaysFrom(minTime); + return days.Int(); + } + + + + + + + +