photosgallery/viewframework/medialists/src/glxmedialist.cpp
branchRCL_3
changeset 18 78ad99c24f08
parent 13 bcb43dc84c44
child 19 420f6808bf21
--- a/photosgallery/viewframework/medialists/src/glxmedialist.cpp	Tue May 11 16:13:40 2010 +0300
+++ b/photosgallery/viewframework/medialists/src/glxmedialist.cpp	Tue May 25 12:42:31 2010 +0300
@@ -39,6 +39,17 @@
 #include "mglxmedialistobserver.h"
 #include "glxmediastaticitemdefs.h"
 
+/**
+ * Min & Max wait interval for a modify event, in microseconds
+ * This is to allow thumbnail manager to procees the event first.
+ */
+const TInt KModifyEventMinWaitInterval = 2000000;
+const TInt KModifyEventMaxWaitInterval = 3000000;
+/**
+ * Maximum items count for minimum wait interval.
+ */
+const TInt KMaxItemsCount = 500;
+
 namespace NGlxMediaList
     {
     /**
@@ -1288,6 +1299,7 @@
     iMediaListArray = CGlxMediaListArray::InstanceL();
     iCountAttributes.AppendL(KGlxMediaCollectionPluginSpecificSubTitle);
     iCountAttributes.AppendL(KGlxMediaGeneralSlideshowableContent);
+    iCountAttributes.AppendL(KMPXMediaGeneralCount);
     }
 
 // -----------------------------------------------------------------------------
@@ -1510,6 +1522,32 @@
             }
 
         CleanupStack::PopAndDestroy(&itemIndices);
+		
+        RPointerArray<CGlxMediaList>& mediaLists = iMediaListArray->Array();
+        TInt listCount = mediaLists.Count();
+        GLX_DEBUG2("ML:HandleItemModifiedL listCount=%d", listCount);
+        if (listCount > 0)
+            {
+            CGlxMediaList* mediaList = mediaLists[listCount-1];
+            // Force a delay to allow TNM to process the modified event
+            if (mediaList == this)
+                {
+                GLX_DEBUG3("ML:HandleItemModifiedL(wait) listCount=%d, Id=%d",
+                                                  listCount, id.Value());
+                TTimeIntervalMicroSeconds32 timeout;
+                timeout = (mediaList->Count() > KMaxItemsCount ?
+                  KModifyEventMaxWaitInterval : KModifyEventMinWaitInterval );
+                RTimer timer;
+                CleanupClosePushL(timer);
+                TRequestStatus status;
+                timer.CreateLocal();
+                timer.After(status, timeout);
+			 	// User::WaitForRequest() will add codescanner warning but is necessary 
+			 	// as User::WaitForAnyRequest() cannot be used in this case
+                User::WaitForRequest(status);
+                CleanupStack::PopAndDestroy(&timer);
+                }
+            }
         }
     }
 
@@ -1847,17 +1885,8 @@
 
 void CGlxMediaList::CancelPreviousRequests()
 	{
-	TRACER("CGlxMediaList::CancelPreviousRequests");	
-	
-	TInt focusIndex = FocusIndex();
-	
-	if(focusIndex >= KErrNone)
-		{	
-		if(!Item(focusIndex).Properties())
-			{
-			// If media is NULL, cancel the previous pending request.
-			// Place a new request for the item in focus, to fetch the media attributes
-			iManager->CancelPreviousRequest();		
-			}
-		}
-	}
+    TRACER("CGlxMediaList::CancelPreviousRequests");
+    // Cancel the previous pending request.
+    // Place a new request for the item in focus, to fetch the media attributes
+    iManager->CancelPreviousRequest();
+    }