photosgallery/viewframework/views/gridview/src/glxgridviewmlobserver.cpp
branchRCL_3
changeset 60 5b3385a43d68
child 75 01504893d9cb
equal deleted inserted replaced
59:8e5f6eea9c9f 60:5b3385a43d68
       
     1 /*
       
     2 * Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
       
     3 * All rights reserved.
       
     4 * This component and the accompanying materials are made available
       
     5 * under the terms of "Eclipse Public License v1.0"
       
     6 * which accompanies this distribution, and is available
       
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 *
       
     9 * Initial Contributors:
       
    10 * Nokia Corporation - initial contribution.
       
    11 *
       
    12 * Contributors:
       
    13 *
       
    14 *  Description : Grid view Observers
       
    15 *
       
    16 */
       
    17 
       
    18 
       
    19 // INCLUDE FILES
       
    20 
       
    21 // Ganes Headers
       
    22 #include <ganes/HgItem.h>
       
    23 #include <ganes/HgGrid.h>                               //Hg Grid Widget
       
    24 #include <gulicon.h>
       
    25 
       
    26 //Photos Headers
       
    27 #include <glxtracer.h>                                  // For Tracer
       
    28 #include <glxlog.h>                                     // For Glx Logging
       
    29 #include <glxuiutility.h>                               // For UiUtility instance
       
    30 #include <glxicons.mbg>                                 // For Corrupted and not created icons
       
    31 #include <glxerrormanager.h>                            // For CGlxErrormanager
       
    32 #include <glxuistd.h>
       
    33 #include <mglxmedialist.h>                              // CGlxMedialist
       
    34 #include <glxthumbnailattributeinfo.h>                  // KGlxMediaIdThumbnail
       
    35 #include <glxdrmutility.h>                              // DRM utility class to provide DRM-related functionality
       
    36 #include <mpxmediadrmdefs.h>                            // KMPXMediaDrmProtected
       
    37 #include <glxgridviewdata.rsg>                          // Gridview resource
       
    38 #include <glxgeneraluiutilities.h>
       
    39 
       
    40 // Framework
       
    41 #include <data_caging_path_literals.hrh>
       
    42 #include <StringLoader.h>
       
    43 #include <bldvariant.hrh>                               // For feature constants
       
    44 #include <featmgr.h>		                            // Feature Manager
       
    45 #include <caf/caferr.h>
       
    46 #include <AknUtils.h>
       
    47 
       
    48 #include "glxgridviewmlobserver.h"
       
    49 
       
    50 const TInt KRecreateGridSize(5); //minimum no of items added to trigger recreate grid
       
    51 // ======== MEMBER FUNCTIONS ========
       
    52 
       
    53 // ---------------------------------------------------------------------------
       
    54 // Two-phased constructor.
       
    55 // ---------------------------------------------------------------------------
       
    56 //
       
    57 EXPORT_C CGlxGridViewMLObserver* CGlxGridViewMLObserver::NewL(
       
    58         MHgScrollBufferObserver& aHgScrollBufferObs,
       
    59         MGlxMediaList& aMediaList, CHgGrid* aHgGrid,
       
    60         TGlxFilterItemType aFilterType)
       
    61     {
       
    62     TRACER("CGlxGridViewMLObserver::NewL()");
       
    63     CGlxGridViewMLObserver* self = new (ELeave) CGlxGridViewMLObserver(
       
    64             aHgScrollBufferObs, aMediaList, aHgGrid, aFilterType);
       
    65     CleanupStack::PushL(self);
       
    66     self->ConstructL();
       
    67     CleanupStack::Pop(self);
       
    68     return self;
       
    69     }
       
    70 
       
    71 // ---------------------------------------------------------------------------
       
    72 // C++ default constructor can NOT contain any code, that
       
    73 // might leave.
       
    74 // ---------------------------------------------------------------------------
       
    75 //
       
    76 CGlxGridViewMLObserver::CGlxGridViewMLObserver(
       
    77         MHgScrollBufferObserver& aHgScrollBufferObs,
       
    78         MGlxMediaList& aMediaList, CHgGrid* aHgGrid,
       
    79         TGlxFilterItemType aFilterType) :
       
    80     iHgScrollBufferObs(aHgScrollBufferObs), iMediaList(aMediaList), iHgGrid(
       
    81             aHgGrid), iFilterType(aFilterType)
       
    82     {
       
    83     TRACER("CGlxGridViewMLObserver::CGlxGridViewMLObserver()");
       
    84     }
       
    85 
       
    86 // ---------------------------------------------------------------------------
       
    87 // Symbian 2nd phase constructor can leave.
       
    88 // ---------------------------------------------------------------------------
       
    89 //
       
    90 void CGlxGridViewMLObserver::ConstructL()
       
    91     {
       
    92     TRACER("CGlxGridViewMLObserver::ConstructL()");
       
    93     iMediaList.AddMediaListObserverL(this);
       
    94     // For DRm Utility
       
    95     iDRMUtility = CGlxDRMUtility::InstanceL();
       
    96 
       
    97     CGlxUiUtility* uiUtility = CGlxUiUtility::UtilityL();
       
    98     CleanupClosePushL(*uiUtility);
       
    99     iGridIconSize = uiUtility->GetGridIconSize();
       
   100     iItemsPerPage = uiUtility->VisibleItemsInPageGranularityL();
       
   101     CleanupStack::PopAndDestroy(uiUtility);
       
   102 
       
   103     iQualityTnAttrib = TMPXAttribute (KGlxMediaIdThumbnail,
       
   104         GlxFullThumbnailAttributeId( ETrue,  iGridIconSize.iWidth,
       
   105                 iGridIconSize.iHeight ) );
       
   106 
       
   107     iSpeedTnAttrib = TMPXAttribute (KGlxMediaIdThumbnail,
       
   108         GlxFullThumbnailAttributeId( EFalse,  iGridIconSize.iWidth,
       
   109                 iGridIconSize.iHeight ) );
       
   110 
       
   111     iIconsFileName.Append(KDC_APP_BITMAP_DIR);
       
   112     iIconsFileName.Append(KGlxIconsFilename);
       
   113     iIsDefaultIconSet = EFalse;
       
   114 
       
   115     iDiskErrorIntimated = EFalse;
       
   116     }
       
   117 
       
   118 // ---------------------------------------------------------------------------
       
   119 // Destructor
       
   120 // ---------------------------------------------------------------------------
       
   121 //
       
   122 CGlxGridViewMLObserver::~CGlxGridViewMLObserver()
       
   123     {
       
   124     TRACER("CGlxGridViewMLObserver::~CGlxGridViewMLObserver()");
       
   125     iMediaList.RemoveMediaListObserver( this );
       
   126     if (iDRMUtility)
       
   127         {
       
   128         iDRMUtility->Close();
       
   129         }
       
   130 	iModifiedIndexes.Reset();
       
   131     }
       
   132 
       
   133 // ----------------------------------------------------------------------------
       
   134 // HandleItemAddedL
       
   135 // ----------------------------------------------------------------------------
       
   136 //
       
   137 void CGlxGridViewMLObserver::HandleItemAddedL( TInt aStartIndex, TInt aEndIndex,
       
   138      MGlxMediaList* aList )
       
   139     {
       
   140     TRACER("CGlxGridViewMLObserver::HandleItemAddedL()");
       
   141     GLX_DEBUG3("CGlxGridViewMLObserver::HandleItemAddedL() aStartIndex(%d),"
       
   142             " aEndIndex(%d)", aStartIndex, aEndIndex);
       
   143 
       
   144     if (!iHgGrid)
       
   145         {
       
   146         return;
       
   147         }
       
   148 
       
   149     if ((aEndIndex - aStartIndex) > KRecreateGridSize)
       
   150         {
       
   151 #ifdef _DEBUG
       
   152         TTime startTime;
       
   153         GLX_LOG_INFO("CGlxGridViewMLObserver::HandleItemAddedL - ResizeL(+)");
       
   154         startTime.HomeTime();
       
   155 #endif
       
   156         iHgGrid->ResizeL(aList->Count());
       
   157 #ifdef _DEBUG
       
   158         TTime stopTime;
       
   159         stopTime.HomeTime();
       
   160         GLX_DEBUG2("CGlxGridViewMLObserver::HandleItemAddedL - ResizeL(-) took <%d> us",
       
   161                 (TInt)stopTime.MicroSecondsFrom(startTime).Int64());
       
   162 #endif
       
   163         }
       
   164     else
       
   165         {
       
   166         for (TInt i = aStartIndex; i <= aEndIndex; i++)
       
   167             {
       
   168             iHgGrid->InsertItem(CHgItem::NewL(), i);
       
   169             }
       
   170         }
       
   171     }
       
   172 
       
   173 // ----------------------------------------------------------------------------
       
   174 // HandleItemRemoved
       
   175 // ----------------------------------------------------------------------------
       
   176 //
       
   177 void CGlxGridViewMLObserver::HandleItemRemovedL( TInt aStartIndex,
       
   178         TInt aEndIndex, MGlxMediaList* aList )
       
   179     {
       
   180     TRACER("CGlxGridViewMLObserver::HandleItemRemovedL()");
       
   181     GLX_DEBUG3("CGlxGridViewMLObserver::HandleItemRemovedL() aStartIndex(%d), aEndIndex(%d)",
       
   182         aStartIndex, aEndIndex);
       
   183     if (iHgGrid)
       
   184         {
       
   185         TInt mediaCount = aList->Count();
       
   186         // If the last item is also deleted, refresh the view
       
   187         if (mediaCount <= 0)
       
   188             {
       
   189             if (iMediaList.VisibleWindowIndex() > iMediaList.Count())
       
   190                 {
       
   191                 iMediaList.SetVisibleWindowIndexL(0);
       
   192                 }
       
   193             //This is done since the Hg doesnot refresh the screen
       
   194             //when we remove all the items from the grid
       
   195             GLX_LOG_INFO("CGlxGridViewMLObserver::HandleItemRemovedL - Hg Reset");
       
   196             iHgGrid->DrawDeferred();
       
   197             iHgGrid->Reset();
       
   198             return;
       
   199             }
       
   200 
       
   201         if (aStartIndex == aEndIndex)
       
   202             {
       
   203             iHgGrid->RemoveItem(aStartIndex);
       
   204             }
       
   205         else
       
   206             {
       
   207             GLX_LOG_INFO("CGlxGridViewMLObserver::HandleItemRemovedL - Hg RemoveItems(+)");
       
   208             // Need to disable the buffering support until HgGrid data model
       
   209             // is synced with Medialist; Otherwise, RequestL would result in
       
   210             // requesting same index for the no of items removed.
       
   211             iHgGrid->DisableScrollBuffer();
       
   212             for (TInt i = aEndIndex; i >= aStartIndex; i--)
       
   213                 {
       
   214                 iHgGrid->RemoveItem(i);
       
   215                 }
       
   216             // Enable Buffer support
       
   217             iHgGrid->EnableScrollBufferL(iHgScrollBufferObs, (KNoOfPages
       
   218                     * iItemsPerPage), KBufferTresholdSize);
       
   219             GLX_LOG_INFO("CGlxGridViewMLObserver::HandleItemRemovedL - Hg RemoveItems(-)");
       
   220             }
       
   221 
       
   222         if (iMediaList.VisibleWindowIndex() > iMediaList.Count())
       
   223             {
       
   224             iMediaList.SetVisibleWindowIndexL(iMediaList.Count() - 1);
       
   225             }
       
   226         iHgGrid->RefreshScreen(iHgGrid->FirstIndexOnScreen());
       
   227         }
       
   228     }
       
   229 
       
   230 // ----------------------------------------------------------------------------
       
   231 // HandleAttributesAvailableL
       
   232 // ----------------------------------------------------------------------------
       
   233 //
       
   234 void CGlxGridViewMLObserver::HandleAttributesAvailableL( TInt aItemIndex,
       
   235     const RArray<TMPXAttribute>& aAttributes, MGlxMediaList* /*aList*/ )
       
   236     {
       
   237     TRACER("CGlxGridViewMLObserver::HandleAttributesAvailableL()");
       
   238     GLX_LOG_INFO1("CGlxGridViewMLObserver::HandleAttributesAvailableL "
       
   239                                                "aItemIndex(%d)", aItemIndex);
       
   240     if (!iHgGrid)
       
   241         {
       
   242         return;
       
   243         }
       
   244 
       
   245     TIdentityRelation< TMPXAttribute > match ( &TMPXAttribute::Match );
       
   246     if (KErrNotFound != aAttributes.Find( iQualityTnAttrib, match ) ||
       
   247         KErrNotFound != aAttributes.Find( iSpeedTnAttrib, match ))
       
   248         {
       
   249         const TGlxMedia& item = iMediaList.Item( aItemIndex );
       
   250         TSize setSize = CHgGrid::PreferredImageSize();
       
   251 
       
   252         const CGlxThumbnailAttribute* qualityTn = item.ThumbnailAttribute(
       
   253                                                           iQualityTnAttrib );
       
   254 
       
   255         const CGlxThumbnailAttribute* speedTn = item.ThumbnailAttribute(
       
   256                                                             iSpeedTnAttrib );
       
   257 
       
   258         TInt tnError = GlxErrorManager::HasAttributeErrorL(
       
   259                           item.Properties(), KGlxMediaIdThumbnail );
       
   260         GLX_DEBUG4("GlxGridMLObs::HandleAttributesAvailableL() tnError(%d)"
       
   261                 "qualityTn(%x) and speedTn(%x)",tnError, qualityTn, speedTn );
       
   262 
       
   263         if (qualityTn)
       
   264             {
       
   265             CFbsBitmap* bitmap = new (ELeave) CFbsBitmap;
       
   266             bitmap->Duplicate(qualityTn->iBitmap->Handle());
       
   267             iHgGrid->ItemL(aItemIndex).SetIcon(CGulIcon::NewL(bitmap));
       
   268             GLX_LOG_INFO1("### CGlxGridViewMLObserver::HandleAttributesAvailableL"
       
   269                     " qualityTn-Index is %d",aItemIndex);
       
   270             }
       
   271         else if (speedTn)
       
   272             {
       
   273             CFbsBitmap* bitmap = new (ELeave) CFbsBitmap;
       
   274             bitmap->Duplicate(speedTn->iBitmap->Handle());
       
   275             iHgGrid->ItemL(aItemIndex).SetIcon(CGulIcon::NewL(bitmap));
       
   276             GLX_LOG_INFO1("### CGlxGridViewMLObserver::HandleAttributesAvailableL"
       
   277                     " speedTn-Index is %d",aItemIndex);
       
   278             }
       
   279         else if (item.Category() == EMPXVideo && KErrNone != tnError)
       
   280             {
       
   281             SetIconL(aItemIndex, EMbmGlxiconsQgn_prop_image_notcreated,
       
   282                     EMbmGlxiconsQgn_prop_image_notcreated_mask,
       
   283 					CHgItem::EHgItemFlagsVideo);
       
   284             }
       
   285         else if (KErrNone != tnError && KErrNotSupported != tnError
       
   286                 && KErrArgument != tnError)
       
   287             {
       
   288             SetIconL(aItemIndex, EMbmGlxiconsQgn_prop_image_corrupted,
       
   289                     EMbmGlxiconsQgn_prop_image_corrupted_mask,
       
   290 					CHgItem::EHgItemFlagsNone);
       
   291             }
       
   292         }
       
   293 
       
   294     //Now Update the items with the DRM/video icon and  date/time
       
   295     UpdateItemsL(aItemIndex,aAttributes);
       
   296 
       
   297     //Now refresh the screen based on the attributes available index
       
   298     RefreshScreenL(aItemIndex,aAttributes);
       
   299     }
       
   300 
       
   301 // ----------------------------------------------------------------------------
       
   302 // HandleFocusChangedL
       
   303 // ----------------------------------------------------------------------------
       
   304 //
       
   305 void CGlxGridViewMLObserver::HandleFocusChangedL( NGlxListDefs::
       
   306     TFocusChangeType /*aType*/, TInt aNewIndex, TInt aOldIndex,
       
   307     MGlxMediaList* /*aList*/ )
       
   308     {
       
   309     TRACER("CGlxGridViewMLObserver::HandleFocusChangedL()");
       
   310     if (aOldIndex != KErrNotFound)
       
   311         {
       
   312         iHgGrid->SetSelectedIndex(aNewIndex);
       
   313         iHgGrid->RefreshScreen(aNewIndex);
       
   314         }
       
   315 /*    if (aList->Count())
       
   316         {
       
   317         //  This us to set the context to HG Teleport
       
   318         TGlxMedia item = iMediaList.Item( aNewIndex );
       
   319         iContextUtility->PublishPhotoContextL(item.Uri());
       
   320         }*/
       
   321     }
       
   322 
       
   323 // ----------------------------------------------------------------------------
       
   324 // HandleItemSelected
       
   325 // ----------------------------------------------------------------------------
       
   326 //
       
   327 void CGlxGridViewMLObserver::HandleItemSelectedL(TInt /*aIndex*/,
       
   328     TBool /*aSelected*/, MGlxMediaList* /*aList*/ )
       
   329     {
       
   330     TRACER("CGlxGridViewMLObserver::HandleItemSelectedL()");
       
   331     }
       
   332 
       
   333 // ----------------------------------------------------------------------------
       
   334 // HandleMessageL
       
   335 // ----------------------------------------------------------------------------
       
   336 //
       
   337  void CGlxGridViewMLObserver::HandleMessageL( const CMPXMessage& /*aMessage*/,
       
   338     MGlxMediaList* /*aList*/ )
       
   339     {
       
   340     TRACER("CGlxGridViewMLObserver::HandleMessageL()");
       
   341     }
       
   342 
       
   343 // ----------------------------------------------------------------------------
       
   344 // HandleError
       
   345 // ----------------------------------------------------------------------------
       
   346 //
       
   347 void CGlxGridViewMLObserver::HandleError( TInt /*aError*/ )
       
   348     {
       
   349     TRACER("CGlxGridViewMLObserver::HandleError()");
       
   350     TRAP_IGNORE(HandleErrorL());
       
   351     }
       
   352 
       
   353 // ----------------------------------------------------------------------------
       
   354 // HandleErrorL
       
   355 // ----------------------------------------------------------------------------
       
   356 //
       
   357 void CGlxGridViewMLObserver::HandleErrorL()
       
   358     {
       
   359     TRACER("CGlxGridViewMLObserver::HandleErrorL()");
       
   360 
       
   361     TInt bitmapId  = EMbmGlxiconsQgn_prop_image_corrupted;
       
   362     TInt maskId = EMbmGlxiconsQgn_prop_image_corrupted_mask;
       
   363     TInt flags     = CHgItem::EHgItemFlagsNone ;
       
   364 
       
   365     for ( TInt i = 0; i < iMediaList.Count(); i++ )
       
   366         {
       
   367         const TGlxMedia& item = iMediaList.Item( i );
       
   368         TInt thumbnailError = GlxErrorManager::HasAttributeErrorL(
       
   369                 item.Properties(), KGlxMediaIdThumbnail );
       
   370 
       
   371         if (KErrNone != thumbnailError)
       
   372             {
       
   373             switch (thumbnailError)
       
   374                 {
       
   375                 case KErrCANoRights:;   // Err id = -17452
       
   376                     bitmapId  = EMbmGlxiconsQgn_prop_image_notcreated;
       
   377 					maskId = EMbmGlxiconsQgn_prop_image_notcreated_mask;
       
   378                     flags     = CHgItem::EHgItemFlagsDrmRightsExpired;
       
   379                     break;
       
   380                 case KErrDiskFull:
       
   381                     bitmapId  = EMbmGlxiconsQgn_prop_image_notcreated;
       
   382 					maskId = EMbmGlxiconsQgn_prop_image_notcreated_mask;
       
   383                     flags     = CHgItem::EHgItemFlagsNone ;
       
   384                     if (!iDiskErrorIntimated)
       
   385                         {
       
   386                         DisplayErrorNoteL(KErrDiskFull);
       
   387                         }
       
   388                     break;
       
   389                 default:
       
   390                     {
       
   391                     if (item.Category() == EMPXVideo)
       
   392                         {
       
   393                         bitmapId = EMbmGlxiconsQgn_prop_image_notcreated;
       
   394                         maskId = EMbmGlxiconsQgn_prop_image_notcreated_mask;
       
   395 						flags = CHgItem::EHgItemFlagsVideo;
       
   396                         }
       
   397                     else
       
   398                         {
       
   399                         bitmapId = EMbmGlxiconsQgn_prop_image_corrupted;
       
   400                         maskId = EMbmGlxiconsQgn_prop_image_corrupted_mask;
       
   401                     	flags = CHgItem::EHgItemFlagsNone;
       
   402 					    }
       
   403 
       
   404                     }
       
   405                     break;
       
   406                 }
       
   407 
       
   408             SetIconL(i, bitmapId, maskId, flags);
       
   409             }
       
   410         }
       
   411     iHgGrid->RefreshScreen(iHgGrid->FirstIndexOnScreen());
       
   412     }
       
   413 
       
   414 // ----------------------------------------------------------------------------
       
   415 // SetIconL
       
   416 // ----------------------------------------------------------------------------
       
   417 //
       
   418 void CGlxGridViewMLObserver::SetIconL(TInt aItemIndex, TInt aBitmapId,
       
   419         TInt aMaskId, TInt aFlags)
       
   420     {
       
   421     TRACER("CGlxGridViewMLObserver::SetIconL()");
       
   422     CFbsBitmap* bitmap = NULL;
       
   423     CFbsBitmap* mask = NULL;
       
   424     TSize setSize = CHgGrid::PreferredImageSize();
       
   425     AknsUtils::CreateIconLC(AknsUtils::SkinInstance(), KAknsIIDNone, bitmap,
       
   426             mask, iIconsFileName, aBitmapId, aMaskId);
       
   427     __ASSERT_DEBUG(bitmap, Panic(EGlxPanicNullPointer));
       
   428     __ASSERT_DEBUG(mask, Panic(EGlxPanicNullPointer));
       
   429 
       
   430     AknIconUtils::SetSize(bitmap, setSize,
       
   431             EAspectRatioPreservedAndUnusedSpaceRemoved);
       
   432     AknIconUtils::SetSize(mask, setSize,
       
   433             EAspectRatioPreservedAndUnusedSpaceRemoved);
       
   434 
       
   435     iHgGrid->ItemL(aItemIndex).SetIcon(CGulIcon::NewL(bitmap, mask), aFlags);
       
   436     CleanupStack::Pop(mask);
       
   437     CleanupStack::Pop(bitmap);
       
   438     }
       
   439 
       
   440 // ----------------------------------------------------------------------------
       
   441 // HandleCommandCompleteL
       
   442 // ----------------------------------------------------------------------------
       
   443 //
       
   444 void CGlxGridViewMLObserver::HandleCommandCompleteL( CMPXCommand* /*aCommandResult*/,
       
   445     TInt /*aError*/, MGlxMediaList* /*aList*/ )
       
   446     {
       
   447     TRACER("CGlxGridViewMLObserver::HandleCommandCompleteL()");
       
   448     }
       
   449 
       
   450 // ----------------------------------------------------------------------------
       
   451 // HandleMediaL
       
   452 // ----------------------------------------------------------------------------
       
   453 //
       
   454 void CGlxGridViewMLObserver::HandleMediaL( TInt /*aListIndex*/, MGlxMediaList* /*aList*/ )
       
   455     {
       
   456     TRACER("CGlxGridViewMLObserver::HandleMediaL()");
       
   457     }
       
   458 
       
   459 // ----------------------------------------------------------------------------
       
   460 // HandlePopulatedL
       
   461 // ----------------------------------------------------------------------------
       
   462 //
       
   463 void CGlxGridViewMLObserver::HandlePopulatedL( MGlxMediaList* /*aList*/ )
       
   464     {
       
   465     TRACER("CGlxGridViewMLObserver::HandlePopulatedL()");
       
   466     if (iHgGrid)
       
   467         {
       
   468         // Setting the Empty Text
       
   469         if (iFilterType == EGlxFilterImage)
       
   470             {
       
   471             HBufC* emptyText = StringLoader::LoadLC(
       
   472                     R_GRID_EMPTY_VIEW_TEXT_IMAGE);
       
   473             iHgGrid->SetEmptyTextL(*emptyText);
       
   474             CleanupStack::PopAndDestroy(emptyText);
       
   475             }
       
   476         else if (iFilterType == EGlxFilterVideo)
       
   477             {
       
   478             HBufC* emptyText = StringLoader::LoadLC(
       
   479                     R_GRID_EMPTY_VIEW_TEXT_VIDEO);
       
   480             iHgGrid->SetEmptyTextL(*emptyText);
       
   481             CleanupStack::PopAndDestroy(emptyText);
       
   482             }
       
   483         else
       
   484             {
       
   485             HBufC* emptyText = StringLoader::LoadLC(R_GRID_EMPTY_VIEW_TEXT);
       
   486             iHgGrid->SetEmptyTextL(*emptyText);
       
   487             CleanupStack::PopAndDestroy(emptyText);
       
   488             }
       
   489 
       
   490         GLX_DEBUG2("GridMLObserver::HandlePopulatedL() iMediaList.Count()=%d",
       
   491                 iMediaList.Count());
       
   492 
       
   493         if (iMediaList.Count() <= 0)
       
   494             {
       
   495             GLX_DEBUG1("GridMLObserver::HandlePopulatedL() - SetEmptyTextL()");
       
   496             iHgGrid->DrawNow();
       
   497             }
       
   498 
       
   499         GLX_DEBUG1("GridMLObserver::HandlePopulatedL() - SetDefaultIconL()");
       
   500         SetDefaultIconL(ETrue);
       
   501         }
       
   502     }
       
   503 
       
   504 // ----------------------------------------------------------------------------
       
   505 // HandleItemModifiedL
       
   506 // ----------------------------------------------------------------------------
       
   507 //
       
   508 void CGlxGridViewMLObserver::HandleItemModifiedL(const RArray<TInt>& aItemIndexes,
       
   509     MGlxMediaList* /*aList*/)
       
   510     {
       
   511     TRACER("CGlxGridViewMLObserver::HandleItemModifiedL()");
       
   512     for(TInt index = 0;index<aItemIndexes.Count();index++)
       
   513         {
       
   514         TInt modifiedIndex = aItemIndexes[index];
       
   515         iModifiedIndexes.AppendL(modifiedIndex);
       
   516         }
       
   517     }
       
   518 
       
   519 // ----------------------------------------------------------------------------
       
   520 // HasRelevantThumbnailAttribute
       
   521 // ----------------------------------------------------------------------------
       
   522 //
       
   523 TBool CGlxGridViewMLObserver::HasRelevantThumbnail(TInt aIndex)
       
   524     {
       
   525     TRACER("CGlxGridViewMLObserver::HasRelevantThumbnail()");
       
   526     const TGlxMedia& item = iMediaList.Item( aIndex );
       
   527     const CGlxThumbnailAttribute* qualityTn = item.ThumbnailAttribute(
       
   528                                                       iQualityTnAttrib );
       
   529     const CGlxThumbnailAttribute* speedTn = item.ThumbnailAttribute(
       
   530                                                        iSpeedTnAttrib );
       
   531     if ( qualityTn || speedTn )
       
   532         {
       
   533         GLX_DEBUG1("GridMLObserver::HasRelevantThumbnail() - TN avail");
       
   534         return ETrue;
       
   535         }
       
   536     return EFalse;
       
   537     }
       
   538 
       
   539 
       
   540 // ----------------------------------------------------------------------------
       
   541 // RefreshScreenL
       
   542 // ----------------------------------------------------------------------------
       
   543 //
       
   544 void CGlxGridViewMLObserver::RefreshScreenL(TInt aItemIndex,
       
   545                                       const RArray<TMPXAttribute>& aAttributes)
       
   546     {
       
   547     TRACER("CGlxGridViewMLObserver::RefreshScreenL()");
       
   548     GLX_DEBUG2("CGlxGridViewMLObserver::RefreshScreenL(%d)", aItemIndex);
       
   549     TInt mediaCount = iMediaList.Count();
       
   550     TInt firstIndex = iHgGrid->FirstIndexOnScreen();
       
   551     firstIndex = (firstIndex<0 ? 0 : firstIndex);
       
   552     TInt lastOnScreen = firstIndex + iHgGrid->ItemsOnScreen() - 1;
       
   553     lastOnScreen = (lastOnScreen >mediaCount-1? mediaCount-1:lastOnScreen);
       
   554     if (mediaCount < iItemsPerPage || aItemIndex == firstIndex)
       
   555         {
       
   556         if (aItemIndex == firstIndex && HasRelevantThumbnail(firstIndex)
       
   557                 && HasRelevantThumbnail(lastOnScreen))
       
   558             {
       
   559             GLX_DEBUG2("## GridMLObserver::HandleAttributesAvailableL()"
       
   560                      " RefreshScreen - firstIndex(%d)", firstIndex);
       
   561             iHgGrid->RefreshScreen(firstIndex);
       
   562             }
       
   563         else if (aItemIndex > firstIndex && aItemIndex <= lastOnScreen)
       
   564             {
       
   565             if (HasRelevantThumbnail(lastOnScreen) && HasRelevantThumbnail(
       
   566                     firstIndex))
       
   567                 {
       
   568                 GLX_DEBUG2("GridMLObserver::HandleAttributesAvailableL()"
       
   569                         " RefreshScreen - aItemIndex(%d)", aItemIndex);
       
   570                 iHgGrid->RefreshScreen(aItemIndex);
       
   571                 }
       
   572             }
       
   573 
       
   574         if (!iIsDefaultIconSet)
       
   575             {
       
   576             GLX_DEBUG1("GridMLObserver::HandleAttributesAvailableL()"
       
   577                      " SetDefaultIconL() - 1");
       
   578             SetDefaultIconL(EFalse);
       
   579             }
       
   580         }
       
   581     else if (aItemIndex > firstIndex && aItemIndex <= lastOnScreen)
       
   582         {
       
   583         TIdentityRelation< TMPXAttribute > match ( &TMPXAttribute::Match );
       
   584         if (KErrNotFound != aAttributes.Find(iQualityTnAttrib, match) ||
       
   585             KErrNotFound != aAttributes.Find(iSpeedTnAttrib, match) )
       
   586             {
       
   587             if ( HasRelevantThumbnail(firstIndex) )
       
   588                 {
       
   589                 if ( HasRelevantThumbnail(lastOnScreen) )
       
   590                     {
       
   591                     GLX_DEBUG2("GridMLObserver::HandleAttributesAvailableL()"
       
   592                         " RefreshScreen - aItemIndex(%d)", aItemIndex);
       
   593                     iHgGrid->RefreshScreen(aItemIndex);
       
   594                     }
       
   595                 else if (aItemIndex == lastOnScreen)
       
   596                     {
       
   597                     GLX_DEBUG2("GridMLObserver::HandleAttributesAvailableL()"
       
   598                            " RefreshScreen - lastOnScreen(%d)", lastOnScreen);
       
   599                     iHgGrid->RefreshScreen(lastOnScreen);
       
   600                     }
       
   601                 }
       
   602 
       
   603             if (!iIsDefaultIconSet)
       
   604                 {
       
   605                 GLX_DEBUG1("GridMLObserver::HandleAttributesAvailableL()"
       
   606                          " SetDefaultIconL() - 2");
       
   607                 SetDefaultIconL(EFalse);
       
   608                 }
       
   609             }
       
   610         }
       
   611 
       
   612     if (iModifiedIndexes.Count() > 0)
       
   613         {
       
   614         for(TInt index = 0;index<iModifiedIndexes.Count();index++)
       
   615             {
       
   616             if (iModifiedIndexes[index] == aItemIndex &&
       
   617 			                     HasRelevantThumbnail(aItemIndex))
       
   618                 {
       
   619                 GLX_DEBUG2("GridMLObserver::HandleAttributesAvailableL()"
       
   620                            " RefreshScreen - modified index(%d)", aItemIndex);
       
   621                 iHgGrid->RefreshScreen(aItemIndex);
       
   622                 iModifiedIndexes.Remove(index);
       
   623                 iModifiedIndexes.Compress();
       
   624                 }
       
   625             }
       
   626         }
       
   627     }
       
   628 
       
   629 // ----------------------------------------------------------------------------
       
   630 // UpdateItemsL
       
   631 // ----------------------------------------------------------------------------
       
   632 //
       
   633 void CGlxGridViewMLObserver::UpdateItemsL(TInt aItemIndex,
       
   634                                       const RArray<TMPXAttribute>& aAttributes)
       
   635     {
       
   636     TRACER("CGlxGridViewMLObserver::UpdateItemsL()");
       
   637     TInt mediaCount = iMediaList.Count();
       
   638     const TGlxMedia& item = iMediaList.Item( aItemIndex );
       
   639     TIdentityRelation< TMPXAttribute > match ( &TMPXAttribute::Match );
       
   640 
       
   641     if (aAttributes.Find(KMPXMediaDrmProtected, match) != KErrNotFound)
       
   642         {
       
   643         if (item.IsDrmProtected())
       
   644             {
       
   645             const TDesC& uri = item.Uri();
       
   646             if( uri.Length() > 0)
       
   647                 {
       
   648                 if(iDRMUtility->IsForwardLockedL(uri))
       
   649                     {
       
   650                     /*
       
   651                      * fix for EABI-7RKHDG
       
   652                      * to show the invalid DRM icon
       
   653                      */
       
   654                     TMPXGeneralCategory  cat = item.Category();
       
   655                     TBool checkViewRights = (cat==EMPXImage);
       
   656 
       
   657                     if(iDRMUtility->ItemRightsValidityCheckL(uri, checkViewRights))
       
   658                         {
       
   659                         iHgGrid->ItemL(aItemIndex).SetFlags(
       
   660                                 CHgItem::EHgItemFlagsDrmRightsValid);
       
   661                         }
       
   662                      else
       
   663                         {
       
   664                         iHgGrid->ItemL(aItemIndex).SetFlags(
       
   665                                 CHgItem::EHgItemFlagsDrmRightsExpired);
       
   666                         }
       
   667                     }
       
   668                 else
       
   669                     {
       
   670                     TMPXGeneralCategory  cat = item.Category();
       
   671                     TBool checkViewRights = (cat==EMPXImage);
       
   672 
       
   673                     if(iDRMUtility->ItemRightsValidityCheckL(uri, checkViewRights))
       
   674                         {
       
   675                         iHgGrid->ItemL(aItemIndex).SetFlags(
       
   676                                 CHgItem::EHgItemFlagsDrmRightsValid);
       
   677                         }
       
   678                      else
       
   679                         {
       
   680                         iHgGrid->ItemL(aItemIndex).SetFlags(
       
   681                                 CHgItem::EHgItemFlagsDrmRightsExpired);
       
   682                         }
       
   683                     }
       
   684                 }
       
   685             }
       
   686         }
       
   687 
       
   688     if (aAttributes.Find(KMPXMediaGeneralDate, match) != KErrNotFound)
       
   689         {
       
   690         TTime time(0);
       
   691         if (item.GetDate(time))
       
   692             {
       
   693             iHgGrid->ItemL(aItemIndex).SetTime(time);
       
   694             }
       
   695         }
       
   696 
       
   697     if (aAttributes.Find(KMPXMediaGeneralCategory, match) != KErrNotFound)
       
   698         {
       
   699         if (item.Category() == EMPXVideo)
       
   700             {
       
   701             iHgGrid->ItemL(aItemIndex).SetFlags(CHgItem::EHgItemFlagsVideo);
       
   702             }
       
   703         }
       
   704     }
       
   705 
       
   706 // ----------------------------------------------------------------------------
       
   707 // DisplayErrorNoteL
       
   708 // ----------------------------------------------------------------------------
       
   709 //
       
   710 void CGlxGridViewMLObserver::DisplayErrorNoteL(TInt aError)
       
   711     {
       
   712     TRACER("CGlxGridViewMLObserver::DisplayErrorNoteL()");
       
   713     GLX_LOG_INFO1("CGlxGridViewMLObserver::DisplayErrorNoteL() "
       
   714             " aError(%d)", aError);
       
   715     GlxGeneralUiUtilities::ShowErrorNoteL(aError);
       
   716     iDiskErrorIntimated = ETrue;
       
   717     return;
       
   718     }
       
   719 
       
   720 // ----------------------------------------------------------------------------
       
   721 // SetDefaultIconL
       
   722 // ----------------------------------------------------------------------------
       
   723 //
       
   724 void CGlxGridViewMLObserver::SetDefaultIconL(TBool aTransparent)
       
   725     {
       
   726     TRACER("CGlxGridViewMLObserver::SetDefaultIconL()");
       
   727     GLX_LOG_INFO1("CGlxGridViewMLObserver::SetDefaultIconL() "
       
   728             " aTransparent(%d)", aTransparent);
       
   729     if (aTransparent)
       
   730         {
       
   731         CFbsBitmap* bitmap = new (ELeave) CFbsBitmap();
       
   732 		CleanupStack::PushL(bitmap);
       
   733         CFbsBitmap* mask = new (ELeave) CFbsBitmap();
       
   734 		CleanupStack::PushL(mask);
       
   735         TSize bmpSize = CHgGrid::PreferredImageSize();
       
   736         bitmap->Create(bmpSize, EColor16M);
       
   737         mask->Create(bmpSize, EGray256); // Gray mask
       
   738         const TInt scanlineLength = bmpSize.iWidth; // 1 byte per pixel
       
   739         RBuf8 maskData;
       
   740         maskData.Create(scanlineLength);
       
   741         maskData.FillZ(scanlineLength); // Init with zero
       
   742 
       
   743         mask->BeginDataAccess();
       
   744         for (TInt y = 0; y < bmpSize.iHeight; y++)
       
   745             {
       
   746             mask->SetScanLine(maskData, y);
       
   747             }
       
   748 
       
   749         maskData.Close();
       
   750         mask->EndDataAccess();
       
   751         iHgGrid->SetDefaultIconL(CGulIcon::NewL(bitmap, mask));
       
   752         CleanupStack::Pop(mask);
       
   753         CleanupStack::Pop(bitmap);
       
   754         }
       
   755     else if (!iIsDefaultIconSet)
       
   756         {
       
   757         CFbsBitmap* bitmap = NULL;
       
   758         CFbsBitmap* mask = NULL;
       
   759         TSize setSize = CHgGrid::PreferredImageSize();
       
   760 
       
   761         AknsUtils::CreateIconLC(AknsUtils::SkinInstance(), KAknsIIDNone,
       
   762                 bitmap, mask, iIconsFileName,
       
   763                 EMbmGlxiconsQgn_prop_image_notcreated,
       
   764                 EMbmGlxiconsQgn_prop_image_notcreated_mask);
       
   765         __ASSERT_DEBUG(bitmap, Panic(EGlxPanicNullPointer));
       
   766         __ASSERT_DEBUG(mask, Panic(EGlxPanicNullPointer));
       
   767 
       
   768         AknIconUtils::SetSize(bitmap, setSize,
       
   769                 EAspectRatioPreservedAndUnusedSpaceRemoved);
       
   770         AknIconUtils::SetSize(mask, setSize,
       
   771                 EAspectRatioPreservedAndUnusedSpaceRemoved);
       
   772 
       
   773         iHgGrid->SetDefaultIconL(CGulIcon::NewL(bitmap, mask));
       
   774         CleanupStack::Pop(mask);
       
   775         CleanupStack::Pop(bitmap);
       
   776         iIsDefaultIconSet = ETrue;
       
   777         }
       
   778     }