diff -r 839377eedc2b -r befca0ec475f videocollection/hgmyvideos/src/vcxhgmyvideoscategorymodelhandler.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/videocollection/hgmyvideos/src/vcxhgmyvideoscategorymodelhandler.cpp Wed Sep 01 12:30:28 2010 +0100 @@ -0,0 +1,1250 @@ +/* +* Copyright (c) 2008 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 "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: UI level handler for category data.* +*/ + + + + +// INCLUDE FILES +#include + +#include +#include +#include + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include "IptvDebug.h" + +#include "vcxhgmyvideoscategorymodelhandler.h" +#include "vcxhgmyvideosmodel.h" +#include "vcxhgmyvideoscollectionclient.h" +#include "vcxhgmyvideosthumbnailmanager.h" +#include "vcxhgmyvideoscenrepkeys.h" + +_LIT( KVcxHgMyVideosMifFile, "\\resource\\apps\\vcxhgmyvideosicons.mif" ); + +// ============================ MEMBER FUNCTIONS =============================== + + +// ----------------------------------------------------------------------------- +// CVcxHgMyVideosCategoryModelHandler::NewL() +// ----------------------------------------------------------------------------- +// +CVcxHgMyVideosCategoryModelHandler* CVcxHgMyVideosCategoryModelHandler::NewL( + CVcxHgMyVideosModel& aModel, + CHgScroller& aScroller ) + { + CVcxHgMyVideosCategoryModelHandler* self = + new (ELeave) CVcxHgMyVideosCategoryModelHandler( aModel, aScroller ); + + return self; + } + + +// ----------------------------------------------------------------------------- +// CVcxHgMyVideosCategoryModelHandler::CVcxHgMyVideosCategoryModelHandler() +// ----------------------------------------------------------------------------- +// +CVcxHgMyVideosCategoryModelHandler::CVcxHgMyVideosCategoryModelHandler( + CVcxHgMyVideosModel& aModel, CHgScroller& aScroller ) + : iModel( aModel ), + iScroller( aScroller ), + iTnManager( aModel.ThumbnailManager() ), + iTnRequestId( KErrNotFound ) + { + } + +// ----------------------------------------------------------------------------- +// CVcxHgMyVideosCategoryModelHandler::~CVcxHgMyVideosCategoryModelHandler() +// ----------------------------------------------------------------------------- +// +CVcxHgMyVideosCategoryModelHandler::~CVcxHgMyVideosCategoryModelHandler() + { + delete iCategoryList; + delete iVideoIndicator; + + iCategoryIdArray.Reset(); + } + +// ----------------------------------------------------------------------------- +// CVcxHgMyVideosCategoryModelHandler::DoModelActivateL() +// ----------------------------------------------------------------------------- +// +void CVcxHgMyVideosCategoryModelHandler::DoModelActivateL() + { + IPTVLOGSTRING_LOW_LEVEL( + "MPX My Videos UI # CVcxHgMyVideosCategoryModelHandler::DoModelActivateL() - Enter" ); + + UpdateCategoryListL(); + + iModel.CollectionClient().SetCategoryModelObserver( this ); + + iTnManager.AddObserverL( *this ); + + IPTVLOGSTRING_LOW_LEVEL( + "MPX My Videos UI # CVcxHgMyVideosCategoryModelHandler::DoModelActivateL() - Exit" ); + } + +// ----------------------------------------------------------------------------- +// CVcxHgMyVideosCategoryModelHandler::DoModelDeactivate() +// ----------------------------------------------------------------------------- +// +void CVcxHgMyVideosCategoryModelHandler::DoModelDeactivate() + { + IPTVLOGSTRING_LOW_LEVEL( + "MPX My Videos UI # CVcxHgMyVideosCategoryModelHandler::DoModelDeactivate() - Enter" ); + + iModel.CollectionClient().SetCategoryModelObserver( NULL ); + + iTnManager.RemoveObserver( *this ); + + TRAP_IGNORE( ClearLastWatchedIconL() ) + + IPTVLOGSTRING_LOW_LEVEL( + "MPX My Videos UI # CVcxHgMyVideosCategoryModelHandler::DoModelDeactivate() - Exit" ); + } + +// ----------------------------------------------------------------------------- +// CVcxHgMyVideosCategoryModelHandler::GetCategoryListL() +// ----------------------------------------------------------------------------- +// +void CVcxHgMyVideosCategoryModelHandler::GetCategoryListL() + { + IPTVLOGSTRING_LOW_LEVEL( + "MPX My Videos UI # CVcxHgMyVideosCategoryModelHandler::GetCategoryListL() - Enter" ); + + iModel.CollectionClient().GetCategoryListL(); + + IPTVLOGSTRING_LOW_LEVEL( + "MPX My Videos UI # CVcxHgMyVideosCategoryModelHandler::GetCategoryListL() - Exit" ); + } + +// ----------------------------------------------------------------------------- +// CVcxHgMyVideosCategoryModelHandler::Highlight() +// ----------------------------------------------------------------------------- +// +TInt CVcxHgMyVideosCategoryModelHandler::Highlight() + { + return iScroller.SelectedIndex(); + } + +// ----------------------------------------------------------------------------- +// CVcxHgMyVideosCategoryModelHandler::GetCategoryNameLC() +// ----------------------------------------------------------------------------- +// +HBufC* CVcxHgMyVideosCategoryModelHandler::GetCategoryNameLC( TInt aCategoryId ) + { + HBufC* name = NULL; + + switch ( aCategoryId ) + { + case KVcxMvcCategoryIdAll: + name = StringLoader::LoadLC( R_VCXHGMYVIDEOS_STORAGE_ALL_LIST ); + break; + case KVcxMvcCategoryIdDownloads: + name = StringLoader::LoadLC( R_VCXHGMYVIDEOS_STORAGE_DOWNLOADS_LIST ); + break; + case KVcxMvcCategoryIdCaptured: + name = StringLoader::LoadLC( R_VCXHGMYVIDEOS_STORAGE_CAPTURED_LIST ); + break; + case KVcxMvcCategoryIdOther: + name = StringLoader::LoadLC( R_VCXHGMYVIDEOS_STORAGE_OTHER_LIST ); + break; + case KCategoryIdLastWatched: + if ( LastWatchedSetL() ) + { + name = StringLoader::LoadLC( R_VCXHGMYVIDEOS_LAST_WATCHED ); + } + else + { + if ( PreloadedExistsL() ) + { + TBuf string; + TInt error = iModel.GetMyVideosCustomizationString( + KCRVideoPlayerPreloadedVideoName, string ); + name = error ? KNullDesC().AllocLC() : string.AllocLC(); + } + else + { + name = StringLoader::LoadLC( R_VCXHGMYVIDEOS_LAST_WATCHED ); + } + } + break; + case KCategoryIdExtraItem1: + // ExtraItem1 is always interpreted as Ovi Store + name = StringLoader::LoadLC( R_VCXHGMYVIDEOS_OVI_STORE ); + break; + case KCategoryIdExtraItem2: + case KCategoryIdExtraItem3: + { + TInt key = 0; + if ( aCategoryId == KCategoryIdExtraItem2 ) + { + key = KCRVideoPlayerExtraItem2Title; + } + else if ( aCategoryId == KCategoryIdExtraItem3 ) + { + key = KCRVideoPlayerExtraItem3Title; + } + + TBuf titleString; + TInt error = iModel.GetMyVideosCustomizationString( key, titleString ); + if ( error == KErrNone ) + { + name = titleString.AllocLC(); + } + else + { + name = KNullDesC().AllocLC(); + } + } + break; + + default: + { + name = KNullDesC().AllocLC(); + IPTVLOGSTRING_LOW_LEVEL( + "MPX My Videos UI # GetCategoryNameLC() Unexpected category!" ); + } + break; + } + return name; + } + +// ----------------------------------------------------------------------------- +// CVcxHgMyVideosCategoryModelHandler::GetCategoryIconL() +// ----------------------------------------------------------------------------- +// +CGulIcon* CVcxHgMyVideosCategoryModelHandler::GetCategoryIconL( TInt aCategoryId ) + { + IPTVLOGSTRING2_LOW_LEVEL( "CVcxHgMyVideosCategoryModelHandler::GetCategoryIconL() Enter! Category id = %d", aCategoryId ); + + CGulIcon* icon( NULL ); + TAknsItemID skinId = KAknsIIDNone; + TInt bitmapId( 0 ); + TInt maskId( 0 ); + TInt key( KErrNotFound ); + TFileName iconFile( KNullDesC() ); + + // Find icon file & bitmap IDs or cenrep keys + switch ( aCategoryId ) + { + case KVcxMvcCategoryIdDownloads: // fall through + case KVcxMvcCategoryIdAll: // fall through + case KVcxMvcCategoryIdOther: + skinId.Set( KAknsIIDQgnPropDownloadThumbnailVideo ); + iconFile = KVcxHgMyVideosMifFile; + bitmapId = EMbmVcxhgmyvideosiconsQgn_prop_download_thumbnail_video; + maskId = EMbmVcxhgmyvideosiconsQgn_prop_download_thumbnail_video_mask; + break; + case KVcxMvcCategoryIdCaptured: + skinId.Set( KAknsIIDQgnPropCapturedThumbnailVideo ); + iconFile = KVcxHgMyVideosMifFile; + bitmapId = EMbmVcxhgmyvideosiconsQgn_prop_captured_thumbnail_video; + maskId = EMbmVcxhgmyvideosiconsQgn_prop_captured_thumbnail_video_mask; + break; + case KCategoryIdLastWatched: + LoadLastWatchedIconL(); + if ( iTnRequestId == KErrNotFound ) + { + // Last watched or preloaded not found => show default icon + skinId.Set( KAknsIIDQgnPropRecentThumbnailVideo ); + iconFile = KVcxHgMyVideosMifFile; + bitmapId = EMbmVcxhgmyvideosiconsQgn_prop_recent_thumbnail_video; + maskId = EMbmVcxhgmyvideosiconsQgn_prop_recent_thumbnail_video_mask; + } + break; + case KCategoryIdExtraItem1: + // ExtraItem1 is always interpreted as Ovi Store + skinId.Set( KAknsIIDQgnPropOviThumbnailVideo ); + iconFile = KVcxHgMyVideosMifFile; + bitmapId = EMbmVcxhgmyvideosiconsQgn_prop_ovi_thumbnail_video; + maskId = EMbmVcxhgmyvideosiconsQgn_prop_ovi_thumbnail_video_mask; + break; + case KCategoryIdExtraItem2: + key = KCRVideoPlayerExtraItem2IconPath; + break; + case KCategoryIdExtraItem3: + key = KCRVideoPlayerExtraItem3IconPath; + break; + default: + { + IPTVLOGSTRING_LOW_LEVEL( + "MPX My Videos UI # GetCategoryIconLC() Unexpected category!" ); + } + break; + } + + if ( key != KErrNotFound ) + { + // Extra item 2 or 3, get icon file from cenrep + TInt error = iModel.GetMyVideosCustomizationString( key, iconFile ); + if ( error == KErrNone && iconFile.Length() > 0 ) + { + IPTVLOGSTRING3_LOW_LEVEL( "CVcxHgMyVideosCategoryModelHandler::GetCategoryIconL() cenrep key %d iconFile %S", key, &iconFile ); + bitmapId = 0x4000; + maskId = 0x4001; + } + else + { // Use default service icon + skinId.Set( KAknsIIDQgnPropServiceThumbnailVideo ); + iconFile = KVcxHgMyVideosMifFile; + bitmapId = EMbmVcxhgmyvideosiconsQgn_prop_service_thumbnail_video; + maskId = EMbmVcxhgmyvideosiconsQgn_prop_service_thumbnail_video_mask; + } + } + + if ( bitmapId && iconFile.Length() > 0 ) + { + // find mif file + TFindFile findFile( iModel.FileServerSessionL() ); + TInt error = findFile.FindByDir( iconFile, KNullDesC ); + + // Create icon if icon file was found + if ( KErrNone == error ) + { + TParse parse; + parse.Set( findFile.File(), NULL, NULL ); + iconFile = parse.FullName(); + IPTVLOGSTRING3_LOW_LEVEL( "CVcxHgMyVideosCategoryModelHandler::GetCategoryIconLC() get %d from file %S", bitmapId, &iconFile ); + + icon = CreateHgListIconL( skinId, iconFile, bitmapId, maskId ); + } + else + { + IPTVLOGSTRING2_LOW_LEVEL( "CVcxHgMyVideosCategoryModelHandler::GetCategoryIconL() FindByDir() returned %d", error ); + } + } + else + { + IPTVLOGSTRING_LOW_LEVEL( "CVcxHgMyVideosCategoryModelHandler::GetCategoryIconLC() no icon file or id" ); + } + + return icon; + } + +// ----------------------------------------------------------------------------- +// CVcxHgMyVideosCategoryModelHandler::FormatCategorySecondRowLC() +// ----------------------------------------------------------------------------- +// +HBufC* CVcxHgMyVideosCategoryModelHandler::FormatCategorySecondRowLC( CMPXMedia& aMedia ) + { + HBufC* details = NULL; + TInt newVideos = 0; + TInt videos = 0; + + if ( aMedia.IsSupported( KVcxMediaMyVideosCategoryNewItemCount ) ) + { + newVideos = *( aMedia.Value( KVcxMediaMyVideosCategoryNewItemCount ) ); + } + if ( aMedia.IsSupported( KVcxMediaMyVideosCategoryItemCount ) ) + { + videos = *( aMedia.Value( KVcxMediaMyVideosCategoryItemCount ) ); + } + + if ( newVideos > 0 ) + { + if ( newVideos == 1 ) + { + details = StringLoader::LoadL( R_VCXHGMYVIDEOS_ONE_NEW_VIDEO ); + } + else + { + details = StringLoader::LoadL( R_VCXHGMYVIDEOS_N_NEW_VIDEOS, newVideos ); + } + CleanupStack::PushL( details ); + } + else + { + if ( videos == 0 ) + { + details = StringLoader::LoadLC( R_VCXHGMYVIDEOS_NO_VIDEOS_IN_CATEGORY ); + } + else if ( videos == 1 ) + { + details = StringLoader::LoadLC( R_VCXHGMYVIDEOS_ONE_VIDEO_IN_CATEGORY ); + } + else + { + details = StringLoader::LoadLC( R_VCXHGMYVIDEOS_VIDEOS_IN_CATEGORY, videos ); + } + } + + return details; + } + + +// ----------------------------------------------------------------------------- +// CVcxHgMyVideosCategoryModelHandler::FormatCategorySecondRowLC() +// ----------------------------------------------------------------------------- +// +HBufC* CVcxHgMyVideosCategoryModelHandler::FormatCategorySecondRowLC( TInt aCategoryId ) + { + HBufC* secondRow = NULL; + + switch ( aCategoryId ) + { + case KVcxMvcCategoryIdAll: + case KVcxMvcCategoryIdDownloads: + case KVcxMvcCategoryIdTvRecordings: + case KVcxMvcCategoryIdCaptured: + case KVcxMvcCategoryIdOther: + { + CMPXMedia* media = GetCategoryDataL( aCategoryId ); + if ( media ) + { + secondRow = FormatCategorySecondRowLC( *media ); + } + else + { + secondRow = KNullDesC().AllocLC(); + } + } + break; + case KCategoryIdLastWatched: + { + if ( LastWatchedSetL() ) + { + TBuf path; + TInt error = iModel.GetLastWatchedPathL( path ); + if ( BaflUtils::FileExists( iModel.FileServerSessionL(), path ) ) + { + TBuf string; + TInt error = iModel.GetLastWatchedNameL( string ); + secondRow = error ? KNullDesC().AllocLC() : string.AllocLC(); + } + else + { + secondRow = StringLoader::LoadLC( R_VCXHGMYVIDEOS_NO_VIDEOS_IN_CATEGORY ); + } + } + else + { + if ( PreloadedExistsL() ) + { + TBuf string; + TInt error = iModel.GetMyVideosCustomizationString( + KCRVideoPlayerPreloadedVideoDescription, string ); + secondRow = error ? KNullDesC().AllocLC() : string.AllocLC(); + } + else + { + secondRow = StringLoader::LoadLC( R_VCXHGMYVIDEOS_NO_VIDEOS_IN_CATEGORY ); + } + } + } + break; + + case KCategoryIdExtraItem1: + // ExtraItem1 is always interpreted as Ovi Store + secondRow = StringLoader::LoadLC( R_VCXHGMYVIDEOS_OVI_STORE_VIDEOS ); + break; + + case KCategoryIdExtraItem2: + case KCategoryIdExtraItem3: + { + TInt key = 0; + if ( aCategoryId == KCategoryIdExtraItem2 ) + { + key = KCRVideoPlayerExtraItem2Text; + } + else if ( aCategoryId == KCategoryIdExtraItem3 ) + { + key = KCRVideoPlayerExtraItem3Text; + } + + TBuf detailsString; + TInt error = iModel.GetMyVideosCustomizationString( key, detailsString ); + if ( error == KErrNone ) + { + secondRow = detailsString.AllocLC(); + } + else + { + secondRow = KNullDesC().AllocLC(); + } + break; + } + default: + { + secondRow = KNullDesC().AllocLC(); + IPTVLOGSTRING_LOW_LEVEL( + "MPX My Videos UI # FormatCategorySecondRowLC() Unexpected category!" ); + break; + } + } + return secondRow; + } + +// ----------------------------------------------------------------------------- +// CVcxHgMyVideosCategoryModelHandler::UiIndexFromMpxItemId() +// ----------------------------------------------------------------------------- +// +TInt CVcxHgMyVideosCategoryModelHandler::UiIndexFromMpxItemId( TMPXItemId& aMpxItemId ) + { + IPTVLOGSTRING_LOW_LEVEL( "MPX My Videos UI # UiIndexFromMpxItemId() - Enter" ); + + TInt index ( KErrNotFound ); + + if ( iCategoryList ) + { + CMPXMedia* media = NULL; + TMPXItemId mpxItemId; + + for ( TInt i = 0; i < iCategoryList->Count(); i++ ) + { + media = (*iCategoryList)[i]; + + if ( media && media->IsSupported( KMPXMediaGeneralId ) ) + { + mpxItemId = *media->Value( KMPXMediaGeneralId ); + + if ( mpxItemId == aMpxItemId ) + { + index = ResolveCategoryArrayIndexById( i ); + break; + } + } + } + } + + IPTVLOGSTRING2_LOW_LEVEL( "MPX My Videos UI # UiIndexFromMpxItemId(), index = %d - Exit", index ); + return index; + } + +// ----------------------------------------------------------------------------- +// CVcxHgMyVideosCategoryModelHandler::ResolveCategoryArrayIndexById() +// ----------------------------------------------------------------------------- +// +TInt CVcxHgMyVideosCategoryModelHandler::ResolveCategoryArrayIndexById( TInt aCategoryId ) + { + TInt ret( KErrNotFound ); + + for(TInt i = 0; i < iCategoryIdArray.Count(); i++ ) + { + if( iCategoryIdArray[ i ] == aCategoryId ) + { + ret = i; + break; + } + } + + return ret; + } + +// ----------------------------------------------------------------------------- +// CVcxHgMyVideosCategoryModelHandler::NewCategoryListL() +// MPX Collection calls this callback when new category list is available. +// ----------------------------------------------------------------------------- +// +void CVcxHgMyVideosCategoryModelHandler::NewCategoryListL( + CMPXMediaArray* aCategoryList, TBool aIsPartial ) + { + IPTVLOGSTRING2_LOW_LEVEL( "MPX My Videos UI # NewCategoryListL() - Enter. IsPartial=%d", aIsPartial ); + + delete iCategoryList; + iCategoryList = aCategoryList; + + UpdateCategoryListL(); + + if ( !aIsPartial ) + { + // KVcxMessageMyVideosListComplete does not come, finish list fetching now + CategoryListFetchingCompletedL(); + } + + IPTVLOGSTRING_LOW_LEVEL( "MPX My Videos UI # NewCategoryListL() - Exit" ); + } + +// ----------------------------------------------------------------------------- +// CVcxHgMyVideosCategoryModelHandler::CategoryListModifiedL() +// MPX Collection calls this callback when the category list is modified. +// ----------------------------------------------------------------------------- +// +void CVcxHgMyVideosCategoryModelHandler::CategoryListModifiedL() + { + IPTVLOGSTRING_LOW_LEVEL( "MPX My Videos UI # CategoryListModifiedL() - Enter" ); + + UpdateCategoryListL(); + + IPTVLOGSTRING_LOW_LEVEL( "MPX My Videos UI # CategoryListModifiedL() - Exit" ); + } + +// ----------------------------------------------------------------------------- +// CVcxHgMyVideosCategoryModelHandler::CategoryModifiedL() +// MPX Collection calls this callback when single category is modified. +// ----------------------------------------------------------------------------- +// +void CVcxHgMyVideosCategoryModelHandler::CategoryModifiedL( TMPXChangeEventType aEventType, + TMPXItemId& aMpxItemId ) + { + IPTVLOGSTRING2_LOW_LEVEL( + "MPX My Videos UI # CategoryModifiedL(event=%d)", aEventType ); + + switch ( aEventType ) + { + case EMPXItemModified: + { + TInt uiIndex = UiIndexFromMpxItemId( aMpxItemId ); + UpdateCategoryListItemL( uiIndex ); + iScroller.RefreshScreen( uiIndex ); + } + break; + + case EMPXItemInserted: + { + TInt id1( 0 ); + TInt ret = iModel.GetLastWatchedIdL( id1 ); + + if ( ret == KErrNone && + id1 == aMpxItemId.iId1 ) + { + ClearLastWatchedIconL(); + UpdateCategoryListItemL( ResolveCategoryArrayIndexById( KCategoryIdLastWatched ) ); + iScroller.RefreshScreen( ResolveCategoryArrayIndexById( KCategoryIdLastWatched ) ); + } + } + break; + case EMPXItemDeleted: + { + TInt id1( 0 ); + TInt ret = iModel.GetLastWatchedIdL( id1 ); + + if ( ret == KErrNone && + id1 == aMpxItemId.iId1 ) + { + ClearLastWatchedIconL(); + UpdateCategoryListItemL( ResolveCategoryArrayIndexById( KCategoryIdLastWatched ) ); + iScroller.RefreshScreen( ResolveCategoryArrayIndexById( KCategoryIdLastWatched ) ); + } + } + break; + default: + { + IPTVLOGSTRING_LOW_LEVEL( + "MPX My Videos UI # CategoryModifiedL() Unexpected event!" ); + } + break; + } + } + +// ----------------------------------------------------------------------------- +// CVcxHgMyVideosCategoryModelHandler::UpdateCategoryListL() +// ----------------------------------------------------------------------------- +// +void CVcxHgMyVideosCategoryModelHandler::UpdateCategoryListL() + { + IPTVLOGSTRING_LOW_LEVEL( "MPX My Videos UI # UpdateCategoryListL() - Enter" ); + + MakeCategoryIdArray(); + + if ( iCategoryIdArray.Count() != iScroller.ItemCount() ) + { + iScroller.ResizeL( iCategoryIdArray.Count() ); + } + + if ( iCategoryIdArray.Count() > 0 ) + { + for ( TInt i = 0; i < iCategoryIdArray.Count(); i++ ) + { + UpdateCategoryListItemL( i ); + } + if ( iScroller.SelectedIndex() < 0 || + iScroller.SelectedIndex() >= iScroller.ItemCount() ) + { + iScroller.SetSelectedIndex( 0 ); + } + } + + // Refresh the whole list. + iScroller.DrawDeferred(); + + IPTVLOGSTRING_LOW_LEVEL( "MPX My Videos UI # UpdateCategoryListL() - Exit" ); + } + +// ----------------------------------------------------------------------------- +// CVcxHgMyVideosCategoryModelHandler::UpdateCategoryListItemL() +// ----------------------------------------------------------------------------- +// +void CVcxHgMyVideosCategoryModelHandler::UpdateCategoryListItemL( TInt aListIndex ) + { + IPTVLOGSTRING2_LOW_LEVEL( + "MPX My Videos UI # UpdateCategoryListItemL (index=%d)", aListIndex ); + + if( aListIndex >= 0 && + aListIndex < iScroller.ItemCount() && + aListIndex < iCategoryIdArray.Count() ) + { + CHgItem& listItem = iScroller.ItemL( aListIndex ); + + HBufC* categoryName( NULL ); + categoryName = GetCategoryNameLC( iCategoryIdArray[ aListIndex ] ); + listItem.SetTitleL( *categoryName ); + CleanupStack::PopAndDestroy( categoryName ); + + HBufC* secondRow( NULL ); + secondRow = FormatCategorySecondRowLC( iCategoryIdArray[ aListIndex ] ); + listItem.SetTextL( *secondRow ); + CleanupStack::PopAndDestroy( secondRow ); + + // Set icon for category + if ( !listItem.Icon() ) + { + listItem.SetIcon( GetCategoryIconL( iCategoryIdArray[ aListIndex ] ) ); + } + } + + IPTVLOGSTRING_LOW_LEVEL( + "MPX My Videos UI # UpdateCategoryListItemL() - Exit" ); + } + +// ----------------------------------------------------------------------------- +// CVcxHgMyVideosCategoryModelHandler::RemoveCategoryListItem() +// ----------------------------------------------------------------------------- +// +void CVcxHgMyVideosCategoryModelHandler::RemoveCategoryListItem( TInt aListIndex ) + { + if ( aListIndex >= 0 && aListIndex < iScroller.ItemCount() ) + { + iScroller.RemoveItem( aListIndex ); + } + } + +// ----------------------------------------------------------------------------- +// CVcxHgMyVideosCategoryModelHandler::ResolveCategoryId() +// ----------------------------------------------------------------------------- +// +TInt CVcxHgMyVideosCategoryModelHandler::ResolveCategoryId( TInt aScrollerIndex ) + { + TInt ret( -1 ); + if ( aScrollerIndex >= 0 && + aScrollerIndex <= iCategoryIdArray.Count() ) + { + ret = iCategoryIdArray[ aScrollerIndex ]; + } + return ret; + } + +// ----------------------------------------------------------------------------- +// CVcxHgMyVideosCategoryModelHandler::MakeCategoryIdArray() +// ----------------------------------------------------------------------------- +// +void CVcxHgMyVideosCategoryModelHandler::MakeCategoryIdArray() + { + IPTVLOGSTRING_LOW_LEVEL("CVcxHgMyVideosCategoryModelHandler::MakeCategoryIdArray"); + + iCategoryIdArray.Reset(); + + TInt error = KErrNone; + TInt value = KErrNotFound; + TInt categoryId = KErrNotFound; + + // Check that cenrep exists and has some valid data + error = iModel.GetMyVideosCustomizationInt( KCRVideoPlayerItemLocation1, value ); + + if ( error == KErrNone && value > EMyVideosListItemTypeEmpty ) + { + IPTVLOGSTRING_LOW_LEVEL( "MPX My Videos UI # MakeCategoryIdArray() Getting category items from cenrep" ); + + for ( TInt i=KCRVideoPlayerItemLocation1; i<=KCRVideoPlayerItemLocation7; i++ ) + { + error = iModel.GetMyVideosCustomizationInt( i , value ); + if ( error == KErrNone && value != EMyVideosListItemTypeEmpty ) + { + switch ( value ) + { + case EMyVideosListItemTypeLastWatched: + categoryId = KCategoryIdLastWatched; + break; + case EMyVideosListItemTypeCapturedVideos: + categoryId = KVcxMvcCategoryIdCaptured; + break; + case EMyVideosListItemTypeOtherVideos: + categoryId = KVcxMvcCategoryIdOther; + break; + case EMyVideosListItemTypeExtra1: + categoryId = KCategoryIdExtraItem1; + break; + case EMyVideosListItemTypeExtra2: + categoryId = KCategoryIdExtraItem2; + break; + case EMyVideosListItemTypeExtra3: + categoryId = KCategoryIdExtraItem3; + break; + case EMyVideosListItemTypeEmpty: + categoryId = KErrNotFound; + break; + default: + categoryId = KErrNotFound; + break; + } + + if ( AcceptCategory( categoryId ) ) + { + iCategoryIdArray.Append( categoryId ); + } + } + } + } + else + { + iCategoryIdArray.Append( KCategoryIdLastWatched ); + iCategoryIdArray.Append( KVcxMvcCategoryIdCaptured ); + iCategoryIdArray.Append( KVcxMvcCategoryIdOther ); + iCategoryIdArray.Append( KCategoryIdExtraItem1 ); + } + } + +// ----------------------------------------------------------------------------- +// CVcxHgMyVideosCategoryModelHandler::AcceptCategory() +// ----------------------------------------------------------------------------- +// +TBool CVcxHgMyVideosCategoryModelHandler::AcceptCategory( TInt aCategoryId ) + { + TBool ret(EFalse); + switch ( aCategoryId ) + { + case KVcxMvcCategoryIdAll: + case KVcxMvcCategoryIdCaptured: + case KVcxMvcCategoryIdOther: + case KCategoryIdLastWatched: + case KCategoryIdExtraItem1: + case KCategoryIdExtraItem2: + case KCategoryIdExtraItem3: + IPTVLOGSTRING2_LOW_LEVEL( + "MPX My Videos UI # AcceptCategory() Accepted category: %d", aCategoryId ); + ret = ETrue; + break; + default: + IPTVLOGSTRING2_LOW_LEVEL( + "MPX My Videos UI # AcceptCategory() Unknown category: %d", aCategoryId ); + break; + } + + return ret; + } + +// ----------------------------------------------------------------------------- +// MPX Collection calls this callback when category list items have been fetched. +// ----------------------------------------------------------------------------- +// +void CVcxHgMyVideosCategoryModelHandler::CategoryListFetchingCompletedL() + { + IPTVLOGSTRING_LOW_LEVEL( "MPX My Videos UI # CategoryListFetchingCompletedL()" ); + + // Send custom command to appui that signals that the + // my videos main view is constructed. + CAknAppUi* appui = static_cast( CCoeEnv::Static()->AppUi() ); + + if ( appui ) + { + appui->HandleCommandL( KVcxMyVideosCmdDoLateConstruct ); + } + } + +// ----------------------------------------------------------------------------- +// CVcxHgMyVideosVideoModelHandler::GetCategoryDataL() +// +// ----------------------------------------------------------------------------- +// +CMPXMedia* CVcxHgMyVideosCategoryModelHandler::GetCategoryDataL( TInt aCategoryId ) + { + if ( iCategoryList && aCategoryId >= 0 && iCategoryList->Count() > aCategoryId ) + { + return (*iCategoryList)[ aCategoryId ]; + } + + return NULL; + } + +// ----------------------------------------------------------------------------- +// CVcxHgMyVideosVideoModelHandler::PlayLastWatchedVidedoL() +// +// ----------------------------------------------------------------------------- +// +void CVcxHgMyVideosCategoryModelHandler::PlayLastWatchedVidedoL() + { + TBuf path; + TInt error( KErrNotFound ); + if ( LastWatchedSetL() ) + { + error = iModel.GetLastWatchedPathL( path ); + } + else if ( PreloadedExistsL() ) + { + error = iModel.GetMyVideosCustomizationString( + KCRVideoPlayerPreloadedVideoPath, path ); + } + + if ( !error && path.Length() && BaflUtils::FileExists( iModel.FileServerSessionL(), path ) ) + { + CAknAppUi* appui = static_cast( CCoeEnv::Static()->AppUi() ); + + if ( appui ) + { + appui->OpenFileL( path ); + iModel.SetAppState( CVcxHgMyVideosModel::EVcxMyVideosAppStatePlayer ); + } + } + } + +// ----------------------------------------------------------------------------- +// CVcxHgMyVideosVideoModelHandler::LoadLastWatchedIconL() +// +// ----------------------------------------------------------------------------- +// +void CVcxHgMyVideosCategoryModelHandler::LoadLastWatchedIconL() + { + if ( LastWatchedSetL() ) + { + TBuf path; + TInt error = iModel.GetLastWatchedPathL( path ); + + if ( BaflUtils::FileExists( iModel.FileServerSessionL(), path ) ) + { + CThumbnailObjectSource* source = CThumbnailObjectSource::NewLC( + path, + KNullDesC ); + iTnRequestId = iTnManager.GetL( *source ); + CleanupStack::PopAndDestroy( source ); + } + } + else + { + if ( PreloadedExistsL() ) + { + TBuf path; + TInt error = iModel.GetMyVideosCustomizationString( + KCRVideoPlayerPreloadedVideoPath, path ); + CThumbnailObjectSource* source = CThumbnailObjectSource::NewLC( + path, + KNullDesC ); + + iTnRequestId = iTnManager.GetL( *source ); + CleanupStack::PopAndDestroy( source ); + } + } + } + +// ----------------------------------------------------------------------------- +// CVcxHgMyVideosVideoModelHandler::ClearLastWatchedIconL() +// +// ----------------------------------------------------------------------------- +// +void CVcxHgMyVideosCategoryModelHandler::ClearLastWatchedIconL() + { + CHgItem& item = iScroller.ItemL( ResolveCategoryArrayIndexById( KCategoryIdLastWatched ) ); + item.ClearFlags( CHgItem::EHgItemFlagsIconOverlayIndicator ); + item.SetIcon( NULL ); + } + +// ----------------------------------------------------------------------------- +// CVcxHgMyVideosVideoModelHandler::SetLastWatchedIndicatorL() +// +// ----------------------------------------------------------------------------- +// +void CVcxHgMyVideosCategoryModelHandler::SetLastWatchedIndicatorL() + { + if ( KErrNotFound != ResolveCategoryArrayIndexById( KCategoryIdLastWatched ) ) + { + CHgItem& lastWatchedItem = iScroller.ItemL( + ResolveCategoryArrayIndexById( KCategoryIdLastWatched ) ); + TInt isIndicator( 0 ); + iModel.GetLastWatchedIndicatorL( isIndicator ); + + TBuf path; + TInt error = iModel.GetLastWatchedPathL( path ); + TBool exist = BaflUtils::FileExists( iModel.FileServerSessionL(), path ); + if ( isIndicator && path.Length() && exist ) + { + lastWatchedItem.SetFlags( CHgItem::EHgItemFlagsIconOverlayIndicator ); + } + else + { + lastWatchedItem.ClearFlags( CHgItem::EHgItemFlagsIconOverlayIndicator ); + } + } + } + +// ----------------------------------------------------------------------------- +// CVcxHgMyVideosVideoModelHandler::VideoIndicatorL() +// +// ----------------------------------------------------------------------------- +// +CMyVideosIndicator& CVcxHgMyVideosCategoryModelHandler::VideoIndicatorL() + { + if ( !iVideoIndicator ) + { + iVideoIndicator = CMyVideosIndicator::NewL(); + } + return *iVideoIndicator; + } + +// ----------------------------------------------------------------------------- +// CVcxHgMyVideosVideoModelHandler::ThumbnailPreviewReady() +// +// ----------------------------------------------------------------------------- +// +void CVcxHgMyVideosCategoryModelHandler::ThumbnailPreviewReady( + MThumbnailData& /*aThumbnail*/, + TThumbnailRequestId /*aId*/ ) + { + // No implementation + } + +// ----------------------------------------------------------------------------- +// CVcxHgMyVideosVideoModelHandler::ThumbnailReady() +// +// ----------------------------------------------------------------------------- +// +void CVcxHgMyVideosCategoryModelHandler::ThumbnailReady( + TInt aError, + MThumbnailData& aThumbnail, + TThumbnailRequestId aId ) + { + if ( aId == iTnRequestId ) + { + iTnRequestId = KErrNotFound; + + TRAP_IGNORE( ThumbnailReadyL( aError, aThumbnail, aId ) ); + } + } + +// ----------------------------------------------------------------------------- +// CVcxHgMyVideosVideoModelHandler::ThumbnailReady() +// +// ----------------------------------------------------------------------------- +// +void CVcxHgMyVideosCategoryModelHandler::ThumbnailReadyL( + TInt aError, + MThumbnailData& aThumbnail, + TThumbnailRequestId /*aId*/ ) + { + TInt lastWatchedIndex = ResolveCategoryArrayIndexById( KCategoryIdLastWatched ); + if ( lastWatchedIndex != KErrNotFound ) + { + CHgItem& listItem = iScroller.ItemL( lastWatchedIndex ); + CGulIcon* thumbnail( NULL ); + + if ( !aError ) + { + thumbnail = CGulIcon::NewL( aThumbnail.DetachBitmap() ); + CleanupStack::PushL( thumbnail ); + SetLastWatchedIndicatorL(); + } + else + { + TFileName iconFile( KVcxHgMyVideosMifFile ); + thumbnail = CreateHgListIconL( + KAknsIIDQgnPropRecentThumbnailVideo, + iconFile, + EMbmVcxhgmyvideosiconsQgn_prop_recent_thumbnail_video, + EMbmVcxhgmyvideosiconsQgn_prop_recent_thumbnail_video_mask ); + + CleanupStack::PushL( thumbnail ); + } + + listItem.SetIcon( thumbnail ); // Takes ownership + CleanupStack::Pop( thumbnail ); + iScroller.RefreshScreen( lastWatchedIndex ); + } + } + + +// ----------------------------------------------------------------------------- +// CVcxHgMyVideosVideoModelHandler::HandleExtraItemSelectionL() +// +// ----------------------------------------------------------------------------- +// +void CVcxHgMyVideosCategoryModelHandler::HandleExtraItemSelectionL( + TInt categoryId, + TVcxHgMyVideosCategoryItemType& aItemType, + TUid& aUid, + TDes& aUrl ) + { + TInt uidKey = 0; + TInt urlKey = 0; + + aItemType = TVcxHgMyVideosCategoryItemTypeUndefined; + + switch ( categoryId ) + { + case KCategoryIdExtraItem1: + { + uidKey = KCRVideoPlayerExtraItem1Uid; + urlKey = KCRVideoPlayerExtraItem1Url; + break; + } + case KCategoryIdExtraItem2: + { + uidKey = KCRVideoPlayerExtraItem2Uid; + urlKey = KCRVideoPlayerExtraItem2Url; + break; + } + case KCategoryIdExtraItem3: + { + uidKey = KCRVideoPlayerExtraItem3Uid; + urlKey = KCRVideoPlayerExtraItem3Url; + break; + } + default: + return; + } + + TBuf urlString; + TInt uidInt( 0 ) ; + + // Try to get URL. + TInt error = iModel.GetMyVideosCustomizationString( urlKey, urlString ); + if ( error == KErrNone && urlString.Size() > 0 ) + { + aUrl = urlString; + aItemType = TVcxHgMyVideosCategoryItemTypeUrl; + } + + // Try to fetch application UID. + error = iModel.GetMyVideosCustomizationInt( uidKey, uidInt ); + if ( error == KErrNone && uidInt != 0 ) + { + aUid = TUid::Uid( uidInt ); + aItemType = TVcxHgMyVideosCategoryItemTypeUid; + } + } + +// ----------------------------------------------------------------------------- +// CVcxHgMyVideosVideoModelHandler::CreateHgListIconL() +// +// ----------------------------------------------------------------------------- +// +CGulIcon* CVcxHgMyVideosCategoryModelHandler::CreateHgListIconL( + const TAknsItemID& aSkinId, + const TFileName& aFileName, + TInt aBitmapId, + TInt aMaskId ) + { + IPTVLOGSTRING3_LOW_LEVEL( "CVcxHgMyVideosCategoryModelHandler::CreateHgListIconL() skin major=%d, skin minor=%d", aSkinId.iMajor, aSkinId.iMinor ); + IPTVLOGSTRING4_LOW_LEVEL( "CVcxHgMyVideosCategoryModelHandler::CreateHgListIconL() bitmap=%d mask=%d file %S", aBitmapId, aMaskId, &aFileName ); + + CFbsBitmap* bitmap( NULL ); + CFbsBitmap* mask( NULL ); + CGulIcon* icon( NULL ); + + // Create default icon for Hg list. + AknsUtils::CreateIconLC( + AknsUtils::SkinInstance(), + aSkinId, + bitmap, + mask, + aFileName, + aBitmapId, + aMaskId ); + + TInt error( KErrNone ); + error = AknIconUtils::SetSize( + bitmap, + CHgDoubleGraphicList::PreferredImageSize(), + EAspectRatioPreservedAndUnusedSpaceRemoved ); + User::LeaveIfError( error ); + + error = AknIconUtils::SetSize( + mask, + CHgDoubleGraphicList::PreferredImageSize(), + EAspectRatioPreservedAndUnusedSpaceRemoved ); + User::LeaveIfError( error ); + + // Ownership of bitmap and mask is transferred to icon. + icon = CGulIcon::NewL( bitmap, mask ); + CleanupStack::Pop( 2 ); // mask and bitmap + + IPTVLOGSTRING2_LOW_LEVEL( "CVcxHgMyVideosCategoryModelHandler::CreateHgListIconL() icon=0x%08x", icon ); + + return icon; + } + +// ----------------------------------------------------------------------------- +// CVcxHgMyVideosVideoModelHandler::CreateEmptyHgListIconL() +// +// ----------------------------------------------------------------------------- +// +CGulIcon* CVcxHgMyVideosCategoryModelHandler::CreateEmptyHgListIconL() + { + IPTVLOGSTRING_LOW_LEVEL( "CVcxHgMyVideosCategoryModelHandler::CreateEmptyHgListIconL()" ); + CGulIcon* icon( NULL ); + CFbsBitmap* bitmap = new (ELeave) CFbsBitmap; + + bitmap->Create( CHgDoubleGraphicList::PreferredImageSize(), ENone ); + CleanupStack::PushL( bitmap ); + icon = CGulIcon::NewL( bitmap ); + CleanupStack::Pop( bitmap ); + + return icon; + } + +// ----------------------------------------------------------------------------- +// CVcxHgMyVideosVideoModelHandler::LastWatchedSetL() +// ----------------------------------------------------------------------------- +// +TBool CVcxHgMyVideosCategoryModelHandler::LastWatchedSetL() + { + TBuf path; + TInt error = iModel.GetLastWatchedPathL( path ); + TInt length = path.Length(); + + if ( error == KErrNone && length > 0 ) + { + return ETrue; + } + else + { + return EFalse; + } + } +// ----------------------------------------------------------------------------- +// CVcxHgMyVideosVideoModelHandler::PreloadedExistsL() +// ----------------------------------------------------------------------------- +// +TBool CVcxHgMyVideosCategoryModelHandler::PreloadedExistsL() + { + TBuf path; + TInt error = iModel.GetMyVideosCustomizationString( KCRVideoPlayerPreloadedVideoPath, path ); + if ( !error && path.Length() && BaflUtils::FileExists( iModel.FileServerSessionL(), path ) ) + { + return ETrue; + } + else + { + return EFalse; + } + }