photosgallery/viewframework/views/listview/src/glxpreviewthumbnailbinding.cpp
branchRCL_3
changeset 13 71da52165949
parent 9 6b87b143d312
child 18 bcb43dc84c44
--- 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 <glxlog.h>
 
 #include <glxuistd.h>                    // Fetch context priority def'ns
-
+#include <mglxcache.h> 
 #include <ganes/HgDoubleGraphicList.h>
 
 
 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);
     }