diff -r 6b87b143d312 -r 71da52165949 photosgallery/viewframework/views/listview/src/glxpreviewthumbnailbinding.cpp --- a/photosgallery/viewframework/views/listview/src/glxpreviewthumbnailbinding.cpp Fri Feb 19 22:51:01 2010 +0200 +++ b/photosgallery/viewframework/views/listview/src/glxpreviewthumbnailbinding.cpp Fri Mar 12 15:42:44 2010 +0200 @@ -28,66 +28,16 @@ #include #include // Fetch context priority def'ns - +#include #include const TInt KInitialThumbnailsTimeDelay(100000); -const TInt KWaitCount(5); +const TInt KWaitCount(10); const TInt KThumbnailStartTimeDelay(250000); -const TInt KThumbnailIntervalTimeDelay(50000); const TInt KPreviewThumbnailFetchCount(1); -// ---------------------------------------------------------------------------- -// CWaitScheduler::NewL() -// ---------------------------------------------------------------------------- -CGlxWaitScheduler* CGlxWaitScheduler::NewL() - { - TRACER("CGlxWaitScheduler::NewL()"); - CGlxWaitScheduler* self = new( ELeave ) CGlxWaitScheduler(); - CleanupStack::PushL( self ); - self->ConstructL( ); - CleanupStack::Pop( self ); - return self; - } -CGlxWaitScheduler::CGlxWaitScheduler() -: CActive( EPriorityStandard ) - { - TRACER("CGlxWaitScheduler::CGlxWaitScheduler()"); - CActiveScheduler::Add( this ); - } - -void CGlxWaitScheduler::ConstructL() - { - TRACER("CGlxWaitScheduler::ConstructL()"); - // Do nothing - } - -CGlxWaitScheduler::~CGlxWaitScheduler() - { - TRACER("CGlxWaitScheduler::~CGlxWaitScheduler()"); - Cancel(); - } - -void CGlxWaitScheduler::WaitForRequest() - { - TRACER("CGlxWaitScheduler::WaitForRequest()"); - SetActive(); - iScheduler.Start(); - } - -void CGlxWaitScheduler::RunL() - { - TRACER("CGlxWaitScheduler::RunL()"); - iScheduler.AsyncStop(); - } - -void CGlxWaitScheduler::DoCancel() - { - TRACER("CGlxWaitScheduler::DoCancel()"); - //Do nothing - } // ---------------------------------------------------------------------------- // NewL @@ -148,7 +98,6 @@ iThumbnailContext->SetDefaultSpec(iGridIconSize.iWidth, iGridIconSize.iHeight); iThumbnailContext->AddAttributeL(tnAttr); - iBitmapScaler = CBitmapScaler::NewL(); } // ---------------------------------------------------------------------------- @@ -175,13 +124,7 @@ } delete iTimer; iTimer = NULL; - iPreviewItemCount.Close(); - - if(iBitmapScaler) - { - delete iBitmapScaler; - iBitmapScaler = NULL; - } + iPreviewItemCount.Close(); } // ---------------------------------------------------------------------------- @@ -208,9 +151,9 @@ if (value) { CFbsBitmap* bitmap = new (ELeave) CFbsBitmap; - bitmap->Duplicate( value->iBitmap->Handle()); - //ScaleBitmapToListSizeL(value->iBitmap, bitmap); - iObserver.PreviewTNReadyL(bitmap, NULL,iProgressIndex); + ScaleBitmapToListSizeL(value->iBitmap, bitmap); + GLX_LOG_INFO1("iObserver.PreviewTNReadyL() iTrial=%d", iTrial); + iObserver.PreviewTNReadyL(bitmap, NULL,iPopulateListTNs); } } } @@ -218,7 +161,7 @@ { if (iTrial == KWaitCount) { - iObserver.PreviewTNReadyL(NULL, NULL, KErrNotFound); + iObserver.PreviewTNReadyL(NULL, NULL, iPopulateListTNs); iTrial=0; return; } @@ -240,15 +183,15 @@ if (value) { CFbsBitmap* bitmap = new (ELeave) CFbsBitmap; - bitmap->Duplicate( value->iBitmap->Handle()); - //ScaleBitmapToListSizeL(value->iBitmap, bitmap); - iObserver.PreviewTNReadyL(bitmap, NULL,iProgressIndex); + ScaleBitmapToListSizeL(value->iBitmap, bitmap); + GLX_LOG_INFO1("iObserver.PreviewTNReadyL() iTrialCount=%d", iTrialCount); + iObserver.PreviewTNReadyL(bitmap, NULL,iPopulateListTNs); } else { if (iTrialCount == KWaitCount) { - iObserver.PreviewTNReadyL(NULL, NULL, KErrNotFound); + iObserver.PreviewTNReadyL(NULL, NULL, iPopulateListTNs); iTrialCount=0; return; } @@ -283,13 +226,13 @@ // ---------------------------------------------------------------------------- // void CGlxPreviewThumbnailBinding::HandleItemChangedL(const CMPXCollectionPath& aPath, - TBool aPopulateListTNs, TBool aBackwardNavigation) + TBool aPopulateListTNs, TBool aIsRefreshNeeded, TBool aBackwardNavigation) { TRACER("CGlxPreviewThumbnailBinding::HandleItemChangedL"); iTimerTicked = EFalse; iPopulateListTNs = aPopulateListTNs; - iBackwardNavigation = aBackwardNavigation; iProgressIndex = KErrNone; + iIsRefreshNeeded = aIsRefreshNeeded; // remove and close old medialist if( iMediaList ) @@ -307,6 +250,13 @@ iMediaList->AddContextL(iThumbnailContext, KGlxFetchContextPriorityNormal); // adding the medialist to observ any changes or updates done iMediaList->AddMediaListObserverL(this); + + if(aBackwardNavigation) + { + //On backward navigation start the timer manually, since we do not + //get the attribute callback. + StartTimer(iPopulateListTNs); + } } // ---------------------------------------------------------------------------- @@ -328,16 +278,8 @@ if (iPopulateListTNs) { - if (iBackwardNavigation) - { - iTimer->Start(KThumbnailIntervalTimeDelay, KThumbnailIntervalTimeDelay/KWaitCount, - TCallBack(IsTimeL,this)); - } - else - { - iTimer->Start(KThumbnailStartTimeDelay, + iTimer->Start(KThumbnailStartTimeDelay, KInitialThumbnailsTimeDelay, TCallBack(IsTimeL,this)); - } } } @@ -401,6 +343,13 @@ if (value) { iPreviewItemCount.AppendL( aItemIndex ); + // sometimes we get HandleAttributesAvailableL callback after some delay + // when we do cache cleanup. + if(!iPopulateListTNs) + { + iPopulateListTNs = ETrue; + StartTimer(iPopulateListTNs); + } } } } @@ -483,29 +432,54 @@ // void CGlxPreviewThumbnailBinding::HandlePopulatedL( MGlxMediaList* /*aList*/ ) { - TRACER("CGlxPreviewThumbnailBinding::HandlePopulatedL()"); - //Start the timer - StartTimer(iPopulateListTNs); - } + TRACER("CGlxPreviewThumbnailBinding::HandlePopulatedL()"); + + // Do cache cleanup. If iIsRefreshNeeded is set, + // then clean up the item at 0th index + if (iPopulateListTNs && iIsRefreshNeeded) + { + if (iMediaList && iMediaList->Count() > 0) + { + GLX_LOG_INFO("**** Cache Cleanup ****"); + MGlxCache* cacheManager = MGlxCache::InstanceL(); + cacheManager->ForceCleanupMedia(iMediaList->IdSpaceId(0), + iMediaList->Item(0).Id()); + cacheManager->Close(); + } + } + //Start the timer + StartTimer(iPopulateListTNs); + } // ---------------------------------------------------------------------------- // ScaleBitmapToListSizeL // ---------------------------------------------------------------------------- // void CGlxPreviewThumbnailBinding::ScaleBitmapToListSizeL( - CFbsBitmap* aSrcBitmap, CFbsBitmap* aDestBitmap) - { - TRACER("CGlxPreviewThumbnailBinding::ScaleBitmapToListSizeL()"); - - // Create the bitmap with the list preferred size - aDestBitmap->Create(CHgDoubleGraphicList::PreferredImageSize(), EColor16MU); - - CGlxWaitScheduler* waitScheduler = CGlxWaitScheduler::NewL(); - CleanupStack::PushL( waitScheduler ); - - iBitmapScaler->Scale(&waitScheduler->iStatus, *aSrcBitmap, - *aDestBitmap, ETrue); - waitScheduler->WaitForRequest(); - - CleanupStack::PopAndDestroy( waitScheduler ); + CFbsBitmap* aSrcBitmap, CFbsBitmap* aDestBitmap) + { + TRACER("CGlxPreviewThumbnailBinding::ScaleBitmapToListSizeL()"); + TSize destSize = CHgDoubleGraphicList::PreferredImageSize(); + TSize srcSize = aSrcBitmap->SizeInPixels(); + if (destSize.iHeight * srcSize.iWidth < destSize.iWidth * srcSize.iHeight) + { + // Source has taller aspect than target so reduce target width + destSize.iWidth = ((destSize.iHeight * srcSize.iWidth) + / (srcSize.iHeight)); + } + else + { + // Source has wider aspect than target so reduce target height + destSize.iHeight = (destSize.iWidth * srcSize.iHeight) + / srcSize.iWidth; + } + aDestBitmap->Create(destSize, aSrcBitmap->DisplayMode()); + CFbsBitmapDevice* bitmapDevice = CFbsBitmapDevice::NewL(aDestBitmap); + CleanupStack::PushL(bitmapDevice); + CFbsBitGc* bitmapGc = CFbsBitGc::NewL(); + CleanupStack::PushL(bitmapGc); + bitmapGc->Activate(bitmapDevice); + bitmapGc->DrawBitmap(TRect(destSize), aSrcBitmap); + CleanupStack::PopAndDestroy(bitmapGc); + CleanupStack::PopAndDestroy(bitmapDevice); }