# HG changeset patch # User Dremov Kirill (Nokia-D-MSW/Tampere) # Date 1271249990 -10800 # Node ID 8970fbd719ec0c2cada5b48df5efec271f22f8af # Parent 112a725ff2c2d8ddd81d63d78732d90cb5245a8c Revision: 201013 Kit: 201015 diff -r 112a725ff2c2 -r 8970fbd719ec mediasettings/mediasettingsapp/src/MPSettingsAppUi.cpp --- a/mediasettings/mediasettingsapp/src/MPSettingsAppUi.cpp Wed Mar 31 21:34:36 2010 +0300 +++ b/mediasettings/mediasettingsapp/src/MPSettingsAppUi.cpp Wed Apr 14 15:59:50 2010 +0300 @@ -15,7 +15,7 @@ */ -// Version : %version: 11 % +// Version : %version: 12 % @@ -301,7 +301,7 @@ { MPX_DEBUG1(_L("#MS# CMPSettingsAppUi::HandleKeyEventL()")); // Check if the event should be handled by iTabGroup - if (aType != EEventKey || iNaviPane->Top() != iDecoratedTabGroup) + if ( !iTabGroup || aType != EEventKey || iNaviPane->Top() != iDecoratedTabGroup) { return EKeyWasNotConsumed; } diff -r 112a725ff2c2 -r 8970fbd719ec mediasettings/mediasettingsengine/group/bld.inf --- a/mediasettings/mediasettingsengine/group/bld.inf Wed Mar 31 21:34:36 2010 +0300 +++ b/mediasettings/mediasettingsengine/group/bld.inf Wed Apr 14 15:59:50 2010 +0300 @@ -16,7 +16,7 @@ -// Version : %version: 6 % +// Version : %version: 7 % #include @@ -28,7 +28,7 @@ // Export the loc, stub sis iby files for S60 5.0 // ../rom/mpsettropmodel.iby CORE_APP_LAYER_IBY_EXPORT_PATH(mpsettropmodel.iby) -../rom/mpsettropmodelrsc.iby LANGUAGE_APP_LAYER_IBY_EXPORT_PATH(mpsettropmodelrsc.iby) +../rom/mpsettropmodelrsc.iby CORE_APP_LAYER_IBY_EXPORT_PATH(mpsettropmodelrsc.iby) PRJ_MMPFILES ../group/MPSettROPModel.mmp diff -r 112a725ff2c2 -r 8970fbd719ec videocollection/hgmyvideos/conf/hgmyvideos.confml Binary file videocollection/hgmyvideos/conf/hgmyvideos.confml has changed diff -r 112a725ff2c2 -r 8970fbd719ec videocollection/hgmyvideos/conf/hgmyvideos_20021191.crml Binary file videocollection/hgmyvideos/conf/hgmyvideos_20021191.crml has changed diff -r 112a725ff2c2 -r 8970fbd719ec videocollection/hgmyvideos/data/vcxhgmyvideos.rss --- a/videocollection/hgmyvideos/data/vcxhgmyvideos.rss Wed Mar 31 21:34:36 2010 +0300 +++ b/videocollection/hgmyvideos/data/vcxhgmyvideos.rss Wed Apr 14 15:59:50 2010 +0300 @@ -103,6 +103,11 @@ }, MENU_ITEM { + command = EVcxHgMyVideosCmdDeleteMarked; + txt = qtn_iptv_delete_video_clip; + }, + MENU_ITEM + { command = EVcxHgMyVideosCmdResumeDownload; txt = qtn_iptv_resume_download; flags = EEikMenuItemSpecific; @@ -127,10 +132,20 @@ }, MENU_ITEM { + command = EVcxHgMyVideosCmdCopyMarked; + txt = qtn_iptv_copy_submenu; + }, + MENU_ITEM + { command = EVcxHgMyVideosCmdMove; txt = qtn_iptv_move_submenu; flags = EEikMenuItemSpecific; }, + MENU_ITEM + { + command = EVcxHgMyVideosCmdMoveMarked; + txt = qtn_iptv_move_submenu; + }, MENU_ITEM { command = EVcxHgMyVideosCmdShowViaHomenet; diff -r 112a725ff2c2 -r 8970fbd719ec videocollection/hgmyvideos/inc/vcxhgmyvideos.hrh --- a/videocollection/hgmyvideos/inc/vcxhgmyvideos.hrh Wed Mar 31 21:34:36 2010 +0300 +++ b/videocollection/hgmyvideos/inc/vcxhgmyvideos.hrh Wed Apr 14 15:59:50 2010 +0300 @@ -25,6 +25,7 @@ EVcxHgMyVideosCmdPlay = 700, // Play video EVcxHgMyVideosCmdOpen, // Open video view EVcxHgMyVideosCmdDelete, // Delete video (only for complete files) + EVcxHgMyVideosCmdDeleteMarked, // Delete video (only for complete files) EVcxHgMyVideosCmdResumeDownload, // Resume download (only for downloads) EVcxHgMyVideosCmdCancelDownload, // Cancel download (only for downloads) EVcxHgMyVideosCmdVideoDetails, // Video details @@ -36,7 +37,9 @@ EVcxHgMyVideosCmdSortByName, // Sort submenu: Sort by name EVcxHgMyVideosCmdSortBySize, // Sort submenu: Sort by size EVcxHgMyVideosCmdCopy, // Copy video(s) + EVcxHgMyVideosCmdCopyMarked, // Copy video(s) EVcxHgMyVideosCmdMove, // Move video(s) + EVcxHgMyVideosCmdMoveMarked, // Move video(s) EVcxHgMyVideosCmdMarkUnmarkSubMenu, // Mark or unmark videos sub-menu EVcxHgMyVideosCmdMark, // Mark/Unmark submenu: Mark video EVcxHgMyVideosCmdUnmark, // Mark/Unmark submenu: Unmark video @@ -49,6 +52,7 @@ EVcxHgMyVideosCmdExit, // Exit Video Storage EVcxHgMyVideosCmdToggleMultipleMarking, // Toggle marking mode state EVcxHgMyVideosCmdSend, // Send video + EVcxHgMyVideosCmdSendMarked, // Send video EVcxHgMyVideosCmdNothing, // Non-functional command EVcxHgMyVideosCmdStartMarking, // Sets marking mode on EVcxHgMyVideosCmdStopMarking, // Sets marking mode off diff -r 112a725ff2c2 -r 8970fbd719ec videocollection/hgmyvideos/inc/vcxhgmyvideoscategorymodelhandler.h --- a/videocollection/hgmyvideos/inc/vcxhgmyvideoscategorymodelhandler.h Wed Mar 31 21:34:36 2010 +0300 +++ b/videocollection/hgmyvideos/inc/vcxhgmyvideoscategorymodelhandler.h Wed Apr 14 15:59:50 2010 +0300 @@ -340,6 +340,22 @@ const TFileName& aFileName, TInt aBitmapId, TInt aMaskId ); + + /** + * Check, if the last watched cenrep key is set + * + * @return ETrue if the key has been set, otherwise EFalse + */ + TBool LastWatchedSetL(); + + /** + * Check, if the preloaded video exists + * If the key exists, but the file is missing, it is considered, + * as it does not exist. + * + * @return ETrue if the preloaded does exist, otherwise EFalse + */ + TBool PreloadedExistsL(); private: diff -r 112a725ff2c2 -r 8970fbd719ec videocollection/hgmyvideos/inc/vcxhgmyvideoscenrepkeys.h --- a/videocollection/hgmyvideos/inc/vcxhgmyvideoscenrepkeys.h Wed Mar 31 21:34:36 2010 +0300 +++ b/videocollection/hgmyvideos/inc/vcxhgmyvideoscenrepkeys.h Wed Apr 14 15:59:50 2010 +0300 @@ -48,6 +48,9 @@ const TInt KCRVideoPlayerCapturedVideosIconPath = 0x0A; const TInt KCRVideoPlayerOtherVideosIconPath = 0x0B; +const TInt KCRVideoPlayerPreloadedVideoPath = 0x0C; +const TInt KCRVideoPlayerPreloadedVideoName = 0x0D; +const TInt KCRVideoPlayerPreloadedVideoDescription= 0x0E; const TInt KCRVideoPlayerExtraItem1IconPath = 0x10; const TInt KCRVideoPlayerExtraItem1Title = 0x11; diff -r 112a725ff2c2 -r 8970fbd719ec videocollection/hgmyvideos/inc/vcxhgmyvideosvideolistimpl.h --- a/videocollection/hgmyvideos/inc/vcxhgmyvideosvideolistimpl.h Wed Mar 31 21:34:36 2010 +0300 +++ b/videocollection/hgmyvideos/inc/vcxhgmyvideosvideolistimpl.h Wed Apr 14 15:59:50 2010 +0300 @@ -188,17 +188,6 @@ void HandleMarkCommandL( TInt aMarkCommand ); /** - * Checks the UI and list status, and returns information to show correct - * move and copy -menu items. - * - * @param aShowMoveAndCopySubmenu On return, ETrue if move/copy sub-menu cab be shown. - * @param aShowCopy On return, ETrue if copy menu item can be shown. - * @param aShowMove On return, ETrue if move menu item can be shown. - */ - void ShowMoveAndCopyMenuItemsL( - TBool& aShowMoveAndCopySubmenu, TBool& aShowCopy, TBool& aShowMove ); - - /** * Handles move and copy commands to list. * * @param aCopy ETrue if copy command was given. EFalse if move. @@ -223,7 +212,7 @@ * @param aResourceId Resource ID of menu to be activated. * @param aMenuPane Pointer to menu pane. */ - void DynInitMenuPaneL( TInt aResourceId, CEikMenuPane* aMenuPane ); + void DynInitMenuPaneL( TInt aResourceId, CEikMenuPane* aMenuPane ); /** * Returns correct MSK resource Id based on current state of video list. @@ -408,6 +397,26 @@ void OperationTargetsToMpxIdsL( RArray& operationTargetIndexes, RArray& operationTargetIds ); + /** + * Add "Send" menu item to menus + * + * @param aMenuPane Add the menu item to this menu pane + * @param aAddToOptions If true, also add to Options menu. If false, only add to context menu. + */ + void AddSendItemToMenuPaneL( + CEikMenuPane* aMenuPane, + TBool aAddToOptions ); + + /** + * Handles dynamic initialisation of Move, Copy and Delete menu items + * + * @param aMenuPane Pointer to menu pane. + * @param aItemsMarked If true, also add to Options menu. If false, only add to context menu. + */ + void DynInitMenuPaneFileOperationsL( + CEikMenuPane* aMenuPane, + TBool aItemsMarked ); + protected: /** diff -r 112a725ff2c2 -r 8970fbd719ec videocollection/hgmyvideos/src/vcxhgmyvideoscategorylistimpl.cpp --- a/videocollection/hgmyvideos/src/vcxhgmyvideoscategorylistimpl.cpp Wed Mar 31 21:34:36 2010 +0300 +++ b/videocollection/hgmyvideos/src/vcxhgmyvideoscategorylistimpl.cpp Wed Apr 14 15:59:50 2010 +0300 @@ -156,6 +156,9 @@ // void CVcxHgMyVideosCategoryListImpl::HandleOpenL( TInt /*aIndex*/ ) { + // Reset the visible selection of the list. + iScroller->DrawDeferred(); + TInt highlight = Highlight(); TInt categoryId = iCategoryModel->ResolveCategoryId( highlight ); diff -r 112a725ff2c2 -r 8970fbd719ec videocollection/hgmyvideos/src/vcxhgmyvideoscategorymodelhandler.cpp --- a/videocollection/hgmyvideos/src/vcxhgmyvideoscategorymodelhandler.cpp Wed Mar 31 21:34:36 2010 +0300 +++ b/videocollection/hgmyvideos/src/vcxhgmyvideoscategorymodelhandler.cpp Wed Apr 14 15:59:50 2010 +0300 @@ -38,6 +38,7 @@ #include #include #include +#include #include #include @@ -185,7 +186,24 @@ name = StringLoader::LoadLC( R_VCXHGMYVIDEOS_STORAGE_OTHER_LIST ); break; case KCategoryIdLastWatched: - name = StringLoader::LoadLC( R_VCXHGMYVIDEOS_LAST_WATCHED ); + 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 @@ -261,7 +279,10 @@ maskId = EMbmVcxhgmyvideosiconsQgn_prop_captured_thumbnail_video_mask; break; case KCategoryIdLastWatched: - // Dont set default lw icon here, it'd just blink. + if ( !LastWatchedSetL() ) + { + LoadLastWatchedIconL(); + } break; case KCategoryIdExtraItem1: // ExtraItem1 is always interpreted as Ovi Store @@ -411,7 +432,6 @@ case KVcxMvcCategoryIdTvRecordings: case KVcxMvcCategoryIdCaptured: case KVcxMvcCategoryIdOther: - case KCategoryIdLastWatched: { CMPXMedia* media = GetCategoryDataL( aCategoryId ); if ( media ) @@ -424,6 +444,37 @@ } } break; + case KCategoryIdLastWatched: + { + if ( LastWatchedSetL() ) + { + CMPXMedia* media = GetCategoryDataL( aCategoryId ); + if ( media ) + { + secondRow = FormatCategorySecondRowLC( *media ); + } + else + { + secondRow = KNullDesC().AllocLC(); + } + } + else + { + if ( PreloadedExistsL() ) + { + TBuf string; + TInt error = iModel.GetMyVideosCustomizationString( + KCRVideoPlayerPreloadedVideoDescription, string ); + secondRow = error ? KNullDesC().AllocLC() : string.AllocLC(); + } + else + { + secondRow = KNullDesC().AllocLC(); + } + } + } + break; + case KCategoryIdExtraItem1: // ExtraItem1 is always interpreted as Ovi Store secondRow = StringLoader::LoadLC( R_VCXHGMYVIDEOS_OVI_STORE_VIDEOS ); @@ -936,17 +987,31 @@ // void CVcxHgMyVideosCategoryModelHandler::PlayLastWatchedVidedoL() { - if ( iLastWatched && iLastWatched->IsSupported( KMPXMediaGeneralId ) ) + if ( LastWatchedSetL() ) { - iModel.CollectionClient().PlayVideoL( - *iLastWatched->Value( KMPXMediaGeneralId ) ); - - iModel.SetAppState( CVcxHgMyVideosModel::EVcxMyVideosAppStatePlayer ); + if ( iLastWatched && iLastWatched->IsSupported( KMPXMediaGeneralId ) ) + { + iModel.CollectionClient().PlayVideoL( + *iLastWatched->Value( KMPXMediaGeneralId ) ); + + iModel.SetAppState( CVcxHgMyVideosModel::EVcxMyVideosAppStatePlayer ); + } } else { - // Refresh the list to remove the highlight. - iScroller.DrawDeferred(); + if ( PreloadedExistsL() ) + { + CAknAppUi* appui = static_cast( CCoeEnv::Static()->AppUi() ); + + if ( appui ) + { + TBuf path; + TInt error = iModel.GetMyVideosCustomizationString( + KCRVideoPlayerPreloadedVideoPath, path ); + appui->OpenFileL( path ); + iModel.SetAppState( CVcxHgMyVideosModel::EVcxMyVideosAppStatePlayer ); + } + } } } @@ -957,12 +1022,33 @@ // void CVcxHgMyVideosCategoryModelHandler::LoadLastWatchedIconL() { - CThumbnailObjectSource* source = CThumbnailObjectSource::NewLC( - iLastWatched->ValueText( KMPXMediaGeneralUri ), - KNullDesC ); - - iTnRequestId = iTnManager.GetL( *source ); - CleanupStack::PopAndDestroy( source ); + if ( LastWatchedSetL() ) + { + if ( iLastWatched ) + { + CThumbnailObjectSource* source = CThumbnailObjectSource::NewLC( + iLastWatched->ValueText( KMPXMediaGeneralUri ), + 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 ); + } + } } // ----------------------------------------------------------------------------- @@ -1202,3 +1288,37 @@ return icon; } + +// ----------------------------------------------------------------------------- +// CVcxHgMyVideosVideoModelHandler::LastWatchedSetL() +// ----------------------------------------------------------------------------- +// +TBool CVcxHgMyVideosCategoryModelHandler::LastWatchedSetL() + { + TInt id; + if ( !iModel.GetLastWatchedIdL( id ) && id ) + { + 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; + } + } diff -r 112a725ff2c2 -r 8970fbd719ec videocollection/hgmyvideos/src/vcxhgmyvideosmainview.cpp --- a/videocollection/hgmyvideos/src/vcxhgmyvideosmainview.cpp Wed Mar 31 21:34:36 2010 +0300 +++ b/videocollection/hgmyvideos/src/vcxhgmyvideosmainview.cpp Wed Apr 14 15:59:50 2010 +0300 @@ -15,7 +15,7 @@ */ -// Version : %version: e92_37 % +// Version : %version: 39 % // INCLUDE FILES #include @@ -373,7 +373,8 @@ } } break; - case EVcxHgMyVideosCmdDelete: + case EVcxHgMyVideosCmdDelete: // Fall through + case EVcxHgMyVideosCmdDeleteMarked: { if ( iModel->AppState() == CVcxHgMyVideosModel::EVcxMyVideosAppStateVideoIdle ) { @@ -435,17 +436,22 @@ } break; case EVcxHgMyVideosCmdCopy: - case EVcxHgMyVideosCmdMove: + case EVcxHgMyVideosCmdMove: // Fall through + case EVcxHgMyVideosCmdCopyMarked: // Fall through + case EVcxHgMyVideosCmdMoveMarked: // Fall through { if ( iModel->AppState() == CVcxHgMyVideosModel::EVcxMyVideosAppStateVideoIdle ) { - VideoListL()->HandleMoveOrCopyCommandL( aCommand == EVcxHgMyVideosCmdCopy ? - ETrue : EFalse ); + VideoListL()->HandleMoveOrCopyCommandL( + aCommand == EVcxHgMyVideosCmdCopy || aCommand == EVcxHgMyVideosCmdCopyMarked ? + ETrue : EFalse ); } } break; - case EVcxHgMyVideosCmdSend: + case EVcxHgMyVideosCmdSend: // Fall through + case EVcxHgMyVideosCmdSendMarked: { + Cba()->DrawDeferred(); VideoListL()->HandleSendL(); break; } @@ -606,13 +612,10 @@ void CVcxHgMyVideosMainView::DynInitMenuPaneL( TInt aResourceId, CEikMenuPane* aMenuPane ) { - TBool showMoveAndCopySubmenu = EFalse; - TBool showCopy = EFalse; - TBool showMove = EFalse; - if ( aResourceId == R_VCXHGMYVIDEOS_MAINVIEW_MENU ) { aMenuPane->SetItemDimmed( EVcxHgMyVideosCmdDelete, ETrue ); + aMenuPane->SetItemDimmed( EVcxHgMyVideosCmdDeleteMarked, ETrue ); aMenuPane->SetItemDimmed( EVcxHgMyVideosCmdResumeDownload, ETrue ); aMenuPane->SetItemDimmed( EVcxHgMyVideosCmdCancelDownload, ETrue ); aMenuPane->SetItemDimmed( EVcxHgMyVideosCmdSortSubMenu, ETrue ); @@ -627,6 +630,8 @@ aMenuPane->SetItemDimmed( EVcxHgMyVideosCmdMemoryStatus, ETrue ); aMenuPane->SetItemDimmed( EVcxHgMyVideosCmdCopy, ETrue ); aMenuPane->SetItemDimmed( EVcxHgMyVideosCmdMove, ETrue ); + aMenuPane->SetItemDimmed( EVcxHgMyVideosCmdCopyMarked, ETrue ); + aMenuPane->SetItemDimmed( EVcxHgMyVideosCmdMoveMarked, ETrue ); aMenuPane->SetItemDimmed( EVcxHgMyVideosCmdMarkUnmarkSubMenu, ETrue); if ( iModel->AppState() == CVcxHgMyVideosModel::EVcxMyVideosAppStateCategoryIdle ) @@ -636,14 +641,10 @@ } else if ( iModel->AppState() == CVcxHgMyVideosModel::EVcxMyVideosAppStateVideoIdle ) { - VideoListL()->ShowMoveAndCopyMenuItemsL( showMoveAndCopySubmenu, showCopy, showMove ); - aMenuPane->SetItemDimmed( EVcxHgMyVideosCmdPlay, EFalse ); - aMenuPane->SetItemDimmed( EVcxHgMyVideosCmdCopy, !showCopy ); - aMenuPane->SetItemDimmed( EVcxHgMyVideosCmdMove, !showMove ); aMenuPane->SetItemDimmed( EVcxHgMyVideosCmdMemoryStatus, EFalse ); aMenuPane->SetItemDimmed( EVcxHgMyVideosCmdSortSubMenu, EFalse ); - + // Video list handles initialisation of menu items specific to it. VideoListL()->DynInitMenuPaneL( aResourceId, aMenuPane ); } diff -r 112a725ff2c2 -r 8970fbd719ec videocollection/hgmyvideos/src/vcxhgmyvideosvideolistimpl.cpp --- a/videocollection/hgmyvideos/src/vcxhgmyvideosvideolistimpl.cpp Wed Mar 31 21:34:36 2010 +0300 +++ b/videocollection/hgmyvideos/src/vcxhgmyvideosvideolistimpl.cpp Wed Apr 14 15:59:50 2010 +0300 @@ -249,6 +249,9 @@ // void CVcxHgMyVideosVideoListImpl::HandleOpenL( TInt /*aIndex*/ ) { + // Reset the visible selection of the list. + iScroller->DrawDeferred(); + if ( iModel.TouchSupport() ) { PlayCurrentVideoL(); @@ -622,6 +625,8 @@ EndMarkingMode(); break; } + default: + break; } iView.DynInitMskL(); @@ -629,33 +634,6 @@ } // ----------------------------------------------------------------------------- -// CVcxHgMyVideosVideoListImpl::ShowMoveAndCopyMenuItemsL() -// ----------------------------------------------------------------------------- -// -void CVcxHgMyVideosVideoListImpl::ShowMoveAndCopyMenuItemsL( - TBool& aShowMoveAndCopySubmenu, TBool& aShowCopy, TBool& aShowMove ) - { - RArray operationTargets; - CleanupClosePushL( operationTargets ); - - TRAPD( error, GetOperationTargetIndexesL( operationTargets ) ); - - if ( error != KErrNone ) - { - aShowMoveAndCopySubmenu = aShowCopy = aShowMove = EFalse; - } - else - { - iVideoCopier->ShowMenuItemsL( operationTargets, - aShowMoveAndCopySubmenu, - aShowCopy, - aShowMove ); - } - - CleanupStack::PopAndDestroy( &operationTargets ); - } - -// ----------------------------------------------------------------------------- // CVcxHgMyVideosVideoListImpl::HandleMoveOrCopyCommandL() // ----------------------------------------------------------------------------- // @@ -713,150 +691,67 @@ } #endif - RArray markedVideos; - CleanupClosePushL( markedVideos ); - - iVideoModel->MarkedVideosL( markedVideos ); - TInt highlight = Highlight(); - TInt count = iVideoModel->VideoCount(); - - TVcxMyVideosDownloadState dlState( EVcxMyVideosDlStateNone ); - TBool progressivePlay( EFalse ); - - if ( count > 0 && highlight >= 0 ) + if ( aResourceId == R_VCXHGMYVIDEOS_MAINVIEW_MENU ) { - dlState = iVideoModel->VideoDownloadState( highlight ); - progressivePlay = iVideoModel->IsProgressivePlayPossible( highlight ); - } + // Check if list has videos marked + RArray markedVideos; + CleanupClosePushL( markedVideos ); + iVideoModel->MarkedVideosL( markedVideos ); + TBool videosMarked = ( markedVideos.Count() > 0 ); + CleanupStack::PopAndDestroy( &markedVideos ); - // Check if there are marked items on the list that can be deleted - TBool itemsToDelete( EFalse ); - - for ( TInt i = 0; i < markedVideos.Count(); i++ ) - { - if ( iVideoModel->VideoDownloadState( markedVideos[i] ) == EVcxMyVideosDlStateNone ) - { - itemsToDelete = ETrue; - break; - } - } + TInt highlight = Highlight(); + TInt count = iVideoModel->VideoCount(); - TBool showDelete = ( ( highlight >= 0 ) && ( count > 0 ) - && ( ( dlState == EVcxMyVideosDlStateNone && markedVideos.Count() == 0 ) - || itemsToDelete ) ); - - if ( aResourceId == R_VCXHGMYVIDEOS_MAINVIEW_MENU ) - { + // Show play menuitem for non-touch if ( ! iModel.TouchSupport() ) { - TBool showPlay = ( ( markedVideos.Count() == 0 ) && ( highlight >= 0 ) && ( count > 0 ) - && ( ( dlState == EVcxMyVideosDlStateNone ) || ( progressivePlay ) ) ); + TBool showPlay = ( !videosMarked && ( highlight >= 0 ) && ( count > 0 ) ); aMenuPane->SetItemDimmed( EVcxHgMyVideosCmdPlay, ! showPlay ); } - aMenuPane->SetItemDimmed( EVcxHgMyVideosCmdDelete, ! showDelete ); - - TBool showCancel = ( ( markedVideos.Count() == 0 ) && ( highlight >= 0 ) && ( count > 0 ) - && ( dlState != EVcxMyVideosDlStateNone ) ); - aMenuPane->SetItemDimmed( EVcxHgMyVideosCmdCancelDownload, ! showCancel ); - - TBool showResume = showCancel && ( ( dlState == EVcxMyVideosDlStatePaused ) || - ( dlState == EVcxMyVideosDlStateFailed ) ); - aMenuPane->SetItemDimmed( EVcxHgMyVideosCmdResumeDownload, ! showResume ); + if ( count > 0 ) + { + // Video details. + TBool showVideoDetails = ( !videosMarked && highlight >= 0 ); + aMenuPane->SetItemDimmed( EVcxHgMyVideosCmdVideoDetails, !showVideoDetails ); - TBool showVideoDetails = ( ( markedVideos.Count() == 0 ) && - ( highlight >= 0 ) && - ( count > 0 ) && - ( ( dlState == EVcxMyVideosDlStateNone ) || - ( progressivePlay ) ) ); - - // Dont show file details if file isn't downloaded yet. - if( ( VideoModel().VideoDownloadState( Highlight() ) == EVcxMyVideosDlStateDownloading ) || - ( VideoModel().VideoDownloadState( Highlight() ) == EVcxMyVideosDlStateFailed ) || - ( VideoModel().VideoDownloadState( Highlight() ) == EVcxMyVideosDlStatePaused ) ) - { - showVideoDetails = EFalse; - } - - aMenuPane->SetItemDimmed( EVcxHgMyVideosCmdVideoDetails, ! showVideoDetails ); + // UPnP menu item. Item's behaviour follows video details item. + if ( showVideoDetails && iUPnP->IsApplicable() ) + { + if ( iUPnP->IsStarted() ) + { + aMenuPane->SetItemDimmed( EVcxHgMyVideosCmdStopShowViaHomenet, EFalse); + } + else + { + aMenuPane->SetItemDimmed( EVcxHgMyVideosCmdShowViaHomenet, EFalse ); + } + } - // UPnP menu item. Item's behaviour follows video details item. - if ( showVideoDetails && count > 0 && highlight >= 0 && iUPnP->IsApplicable() ) - { - if ( iUPnP->IsStarted() ) + // Move, copy, delete + DynInitMenuPaneFileOperationsL( aMenuPane, videosMarked ); + + // Send item + if ( highlight >= 0 || videosMarked ) { - aMenuPane->SetItemDimmed( EVcxHgMyVideosCmdStopShowViaHomenet, EFalse); + AddSendItemToMenuPaneL( aMenuPane, videosMarked ); + } + +#ifdef RD_VIDEO_AS_RINGING_TONE + // Assign (use as) menu item + if ( !videosMarked && highlight >= 0 ) + { + aMenuPane->SetItemDimmed( EVcxHgMyVideosCmdAiwAssign, EFalse ); } else { - aMenuPane->SetItemDimmed( EVcxHgMyVideosCmdShowViaHomenet, EFalse ); - } - } - - // Send menu item. - if ( ( highlight >= 0 ) && ( count > 0 ) && - ( dlState == EVcxMyVideosDlStateNone ) ) - { - // Get total size for marked videos - RArray operationTargets; - CleanupClosePushL( operationTargets ); - - GetOperationTargetIndexesL( operationTargets ); - TInt64 attachmentsTotalSize( 0 ); - for ( TInt i = 0; i < operationTargets.Count(); i++ ) - { - attachmentsTotalSize += iVideoModel->GetVideoSize( operationTargets[i] ); + // Hide Assign (use as) menu item + aMenuPane->SetItemDimmed( EVcxHgMyVideosCmdAiwAssign, ETrue ); } - - IPTVLOGSTRING3_LOW_LEVEL( "CVcxHgMyVideosVideoListImpl::DynInitMenuPaneL() %d files with total size %ld", operationTargets.Count(), attachmentsTotalSize ); - - // SendUi uses TInt for size, hide Send menu item for over 2GB attachments - if ( attachmentsTotalSize > 0 && attachmentsTotalSize < KMaxTInt ) - { - // Place Send menu item on top of "Use as" (Assign) submenu - TInt sendItemIndex = 0; -#ifdef RD_VIDEO_AS_RINGING_TONE - aMenuPane->ItemAndPos( EVcxHgMyVideosCmdAiwAssign, sendItemIndex ); -#else - aMenuPane->ItemAndPos( EVcxHgMyVideosCmdSortSubMenu, sendItemIndex ); -#endif - // Add Send item to menu - TSendingCapabilities capabilities( - 0, - attachmentsTotalSize, - TSendingCapabilities::ESupportsAttachments ); - SendUiL()->AddSendMenuItemL( - *aMenuPane, - sendItemIndex, - EVcxHgMyVideosCmdSend, - capabilities ); - aMenuPane->SetItemSpecific( EVcxHgMyVideosCmdSend, ETrue ); - - // The Send item also needs to be flagged as a list query. - CEikMenuPaneItem::SData& itemData = aMenuPane->ItemData( EVcxHgMyVideosCmdSend ); - itemData.iFlags |= EEikMenuItemSpecificListQuery; - } - CleanupStack::PopAndDestroy( &operationTargets ); - } - -#ifdef RD_VIDEO_AS_RINGING_TONE - // Assign (use as) menu item - if ( ( markedVideos.Count() == 0 ) && - ( highlight >= 0 ) && ( count > 0 ) && - ( ( dlState == EVcxMyVideosDlStateNone ) ) ) - { - aMenuPane->SetItemDimmed( EVcxHgMyVideosCmdAiwAssign, EFalse ); - } - else - { - // Hide Assign (use as) menu item - aMenuPane->SetItemDimmed( EVcxHgMyVideosCmdAiwAssign, ETrue ); - } #endif - // Marking submenu - if( count > 0 ) - { + // Marking submenu // Show "Mark/Unmark" only if there are videos in the list aMenuPane->SetItemDimmed( EVcxHgMyVideosCmdMarkUnmarkSubMenu, EFalse); } @@ -867,10 +762,11 @@ // Dont show "Sort by" if list is empty. aMenuPane->SetItemDimmed( EVcxHgMyVideosCmdSortSubMenu, ETrue ); } - + // Hide "Settings" menu item aMenuPane->SetItemDimmed( EVcxHgMyVideosCmdOpenSettings, ETrue ); } + #ifdef RD_VIDEO_AS_RINGING_TONE else if ( aResourceId == R_VCXHGMYVIDEOS_USE_AS_SUBMENU ) { @@ -895,7 +791,6 @@ CleanupStack::PopAndDestroy( &operationTargets ); } #endif - CleanupStack::PopAndDestroy( &markedVideos ); } // ----------------------------------------------------------------------------- @@ -1172,3 +1067,104 @@ } } } + +// --------------------------------------------------------------------------- +// CVcxHgMyVideosVideoListImpl::AddSendItemToMenuPaneL() +// --------------------------------------------------------------------------- +// +void CVcxHgMyVideosVideoListImpl::AddSendItemToMenuPaneL( + CEikMenuPane* aMenuPane, + TBool aAddToOptions ) + { + IPTVLOGSTRING_LOW_LEVEL( "CVcxHgMyVideosVideoListImpl::AddSendItemToMenuPaneL() enter" ); + // Get total size of the videos that we're about to send + RArray operationTargets; + CleanupClosePushL( operationTargets ); + + GetOperationTargetIndexesL( operationTargets ); + TInt64 attachmentsTotalSize( 0 ); + for ( TInt i = 0; i < operationTargets.Count(); i++ ) + { + attachmentsTotalSize += iVideoModel->GetVideoSize( operationTargets[i] ); + } + + IPTVLOGSTRING3_LOW_LEVEL( "CVcxHgMyVideosVideoListImpl::AddSendItemToMenuPaneL() %d files with total size %ld", operationTargets.Count(), attachmentsTotalSize ); + + // SendUi uses TInt for size, hide Send menu item for over 2GB attachments + if ( attachmentsTotalSize > 0 && attachmentsTotalSize < KMaxTInt ) + { + // Find place for Send menu item on top of "Use as" (Assign) or Sort submenu + TInt sendItemIndex = 0; +#ifdef RD_VIDEO_AS_RINGING_TONE + aMenuPane->ItemAndPos( EVcxHgMyVideosCmdAiwAssign, sendItemIndex ); +#else + aMenuPane->ItemAndPos( EVcxHgMyVideosCmdSortSubMenu, sendItemIndex ); +#endif + // Add Send item to context menu + TSendingCapabilities capabilities( + 0, + attachmentsTotalSize, + TSendingCapabilities::ESupportsAttachments ); + SendUiL()->AddSendMenuItemL( + *aMenuPane, + sendItemIndex, + EVcxHgMyVideosCmdSend, + capabilities ); + aMenuPane->SetItemSpecific( EVcxHgMyVideosCmdSend, ETrue ); + // The Send item also needs to be flagged as a list query. + CEikMenuPaneItem::SData& itemData = aMenuPane->ItemData( EVcxHgMyVideosCmdSend ); + itemData.iFlags |= EEikMenuItemSpecificListQuery; + + // Add Send to Options menu + if ( aAddToOptions ) + { + SendUiL()->AddSendMenuItemL( + *aMenuPane, + sendItemIndex, + EVcxHgMyVideosCmdSendMarked, + capabilities ); + aMenuPane->SetItemSpecific( EVcxHgMyVideosCmdSendMarked, EFalse ); + } + } + CleanupStack::PopAndDestroy( &operationTargets ); + IPTVLOGSTRING_LOW_LEVEL( "CVcxHgMyVideosVideoListImpl::AddSendItemToMenuPaneL() return" ); + } + +// --------------------------------------------------------------------------- +// CVcxHgMyVideosVideoListImpl::DynInitMenuPaneFileOperationsL() +// --------------------------------------------------------------------------- +// +void CVcxHgMyVideosVideoListImpl::DynInitMenuPaneFileOperationsL( + CEikMenuPane* aMenuPane, + TBool aItemsMarked ) + { + // Delete + TBool showDelete = ( ( Highlight() >= 0 ) || aItemsMarked ); + + // Move and copy + RArray operationTargets; + CleanupClosePushL( operationTargets ); + + TRAPD( error, GetOperationTargetIndexesL( operationTargets ) ); + + TBool showMoveAndCopySubmenu( EFalse ); + TBool showCopy( EFalse ); + TBool showMove( EFalse ); + + if ( error == KErrNone ) + { + iVideoCopier->ShowMenuItemsL( operationTargets, + showMoveAndCopySubmenu, + showCopy, + showMove ); + } + + aMenuPane->SetItemDimmed( EVcxHgMyVideosCmdCopy, !showCopy ); + aMenuPane->SetItemDimmed( EVcxHgMyVideosCmdMove, !showMove ); + aMenuPane->SetItemDimmed( EVcxHgMyVideosCmdDelete, !showDelete ); + aMenuPane->SetItemDimmed( EVcxHgMyVideosCmdCopyMarked, !showCopy || !aItemsMarked ); + aMenuPane->SetItemDimmed( EVcxHgMyVideosCmdMoveMarked, !showMove || !aItemsMarked ); + aMenuPane->SetItemDimmed( EVcxHgMyVideosCmdDeleteMarked, !showDelete || !aItemsMarked ); + + CleanupStack::PopAndDestroy( &operationTargets ); + } diff -r 112a725ff2c2 -r 8970fbd719ec videoplayback/inc/mpxvideobaseplaybackview.h --- a/videoplayback/inc/mpxvideobaseplaybackview.h Wed Mar 31 21:34:36 2010 +0300 +++ b/videoplayback/inc/mpxvideobaseplaybackview.h Wed Apr 14 15:59:50 2010 +0300 @@ -15,7 +15,8 @@ * */ -// Version : %version: 18 % + +// Version : %version: 19 % // This file defines the API for VideoBasePlaybackView.dll @@ -34,6 +35,7 @@ #include "mpxvideoplaybackcontrol.hrh" #include "mpxvideoplaybackdisplayhandler.h" #include +#include // Constants @@ -47,14 +49,14 @@ class CMPXVideoPlaybackViewFileDetails; - // Class Definitions class CMPXVideoBasePlaybackView : public CAknView, public MMPXPlaybackObserver, public MMPXViewActivationObserver, public MMPXPlaybackCallback, - public MMPXCollectionObserver + public MMPXCollectionObserver, + public MAknWsEventObserver { public: ~CMPXVideoBasePlaybackView(); @@ -69,6 +71,8 @@ void RetrieveFileNameAndModeL( CMPXCommand* aCmd ); + void HandleWsEventL( const TWsEvent& aEvent, CCoeControl* aDestination ); + protected: /** @@ -349,6 +353,8 @@ void HandleRealOneBitmapTimeoutL(); + void SendWindowCommandL( TMPXVideoPlaybackCommand aCmd ); + #ifdef SYMBIAN_ENABLE_64_BIT_FILE_SERVER_API TInt OpenDrmFileHandle64L( RFile64& aFile ); #endif // SYMBIAN_ENABLE_64_BIT_FILE_SERVER_API @@ -358,6 +364,7 @@ MMPXViewUtility* iViewUtility; MMPXCollectionUtility* iCollectionUtility; CMPXVideoPlaybackDisplayHandler* iDisplayHandler; + CAknWsEventMonitor* iAknEventMonitor; TMPXPlaybackState iPlaybackState; @@ -374,6 +381,7 @@ TBool iCollectionMediaRequested; TBool iPdlReloading; TBool iRealOneDelayedPlay; + TBool iKeyboardInFocus; HBufC* iClipName; }; diff -r 112a725ff2c2 -r 8970fbd719ec videoplayback/inc/mpxvideoplaybackmediadetailsviewer.h --- a/videoplayback/inc/mpxvideoplaybackmediadetailsviewer.h Wed Mar 31 21:34:36 2010 +0300 +++ b/videoplayback/inc/mpxvideoplaybackmediadetailsviewer.h Wed Apr 14 15:59:50 2010 +0300 @@ -15,7 +15,7 @@ * */ -// Version : %version: e003sa33#5 % +// Version : %version: e003sa33#6 % #ifndef MPXVIDEOPLAYBACKMEDIADETAILSVIEWER_H_ #define MPXVIDEOPLAYBACKMEDIADETAILSVIEWER_H_ @@ -123,19 +123,19 @@ void UpdateBackgroundBitmapL() const; /** - * Timer callback for scroll filename timer + * Timer callback for scroll timer * @since 9.2 * @param aPtr Pointer to timers callback * @return KErrNone */ - static TInt ScrollFilenameTimer( TAny* aPtr ); + static TInt ScrollTimer( TAny* aPtr ); /** - * Handle Scroll Filename Timer + * Handle Scroll Timer * @since 9.2 * @return void */ - void HandleScrollFilenameTimerL(); + void HandleScrollTimerL(); /** * Determine the number of items to be shown in the viewer @@ -150,9 +150,60 @@ * @return the viewer rect */ TRect CalculateViewerRectL(); + + /** + * Update the text of filename label + */ + void UpdateFilenameL(); + + /** + * Update the text of title label + */ + void UpdateTitleL(); + + private: + + /** + * Scroll the too long text for some label + */ + class TTextScroller + { + public: + + /** + * Constructor + */ + TTextScroller(); + + /** + * Check if the source text needs scrolling. + */ + TBool IsScrollNeeded(); + + /** + * Check if the text of a label needs to be updated + */ + TBool IsUpdateNeeded(); + + /** + * Scroll the source text, and append it to the destination text + * + * @param aSrcText the source text to be scrolled. + * @param aDesText to which the scrolled text to be appended + */ + void ScrollText( const TDesC& aSrcText, TDes& aDesText ); + + private: + TUint32 iDelayBeginningTick; + TInt iTextScrollPos; + TBool iDelay; + TBool iScroll; + TInt iSrcTextLen; + }; private: // Data + CMPXVideoPlaybackControlsController* iController; CEikLabel* iClipnameLabel; @@ -168,11 +219,12 @@ CFbsBitmap* iBackgroundBitmap; CPeriodic* iScrollingTextTimer; - TInt iScrollPosition; - TBool iShouldPauseScrolling; TRect iViewerRect; HBufC* iAdditionalString; - TUint32 iScrollTimerDelayBeginningTick; + TTextScroller iFilenameScroller; + TTextScroller iTitleScroller; + // after every scrolling label has updated, draw them + TBool iScrolledTextUpdated; }; diff -r 112a725ff2c2 -r 8970fbd719ec videoplayback/inc/mpxvideoplaybackviewfiledetails.h --- a/videoplayback/inc/mpxvideoplaybackviewfiledetails.h Wed Mar 31 21:34:36 2010 +0300 +++ b/videoplayback/inc/mpxvideoplaybackviewfiledetails.h Wed Apr 14 15:59:50 2010 +0300 @@ -16,7 +16,7 @@ */ -// Version : %version: 12 % +// Version : %version: e003sa33#13 % #ifndef __MPXVIDEOPLAYBACKVIEWFILEDETAILS__ @@ -51,6 +51,16 @@ * @return generated file name, ownership is transferred */ IMPORT_C HBufC* GenerateFileNameL(); + + /** + * Parse file title + * if title exists, then use it as title content directly. + * if title is null, then for streaming/live streaming clip, + * parse its file name as title content. + * + * @return generated file title, ownership is transferred + */ + IMPORT_C HBufC* GenerateFileTitleL(); private: // diff -r 112a725ff2c2 -r 8970fbd719ec videoplayback/videohelix/inc/mpxvideoplaybackcontroller.h --- a/videoplayback/videohelix/inc/mpxvideoplaybackcontroller.h Wed Mar 31 21:34:36 2010 +0300 +++ b/videoplayback/videohelix/inc/mpxvideoplaybackcontroller.h Wed Apr 14 15:59:50 2010 +0300 @@ -15,7 +15,8 @@ * */ -// Version : %version: ou1cpsw#21 % + +// Version : %version: 22 % #ifndef _CMPXVIDEOPLAYBACKCONTROLLER_H_ @@ -52,6 +53,7 @@ class CMPXVideoSeeker; class CMpxVideoDrmHelper; class CHWRMLight; + // // CLASS DECLARATION // @@ -94,7 +96,7 @@ void HandleSettingChange( const TUid& aRepositoryUid, TUint32 aSettingId ); - void OpenFileL( const TDesC& aMediaFile, RFile& aFile, TInt aPosition, TInt aAccessPointId = KUseDefaultIap ); + void OpenFileL( const TDesC& aMediaFile, RFile& aFile, TInt aPosition, TInt aAccessPointId = KUseDefaultIap ); void HandleGeneralPlaybackCommandL( CMPXCommand& aCmd ); @@ -132,7 +134,7 @@ #ifdef SYMBIAN_ENABLE_64_BIT_FILE_SERVER_API - void OpenFile64L( const TDesC& aMediaFile, RFile64& aFile, TInt aPosition, TInt aAccessPointId = KUseDefaultIap ); + void OpenFile64L( const TDesC& aMediaFile, RFile64& aFile, TInt aPosition, TInt aAccessPointId = KUseDefaultIap ); #endif // SYMBIAN_ENABLE_64_BIT_FILE_SERVER_API @@ -155,33 +157,35 @@ void DetermineMediaTypeL(); void ResetMemberVariables(); - + void StartLightsControl(); void CancelLightsControl(); - + void EnableDisplayBacklight(); void DisableDisplayBacklight(); - + static TInt HandleBackLightTimeout( TAny* aPtr ); void DoHandleBackLightTimeout(); void StartBackLightTimer(); void CancelBackLightTimer(); - + void InitUserActivityTimerL(); void RestartUserActivityTimer(); void CancelUserActivityTimer(); static TInt HandleUserActivityTimeout( TAny* aPtr ); void DoHandleUserActivityTimeout(); - + TTimeIntervalMicroSeconds32 InitDisplayTimerL(); void RestartDisplayTimer(); void CancelDisplayTimer(); static TInt HandleDisplayTimeout( TAny* aPtr ); void DoHandleDisplayTimeout(); - + CHWRMLight* GetLightsL(); void ReleaseLights(); + TBool SendTvOutEventL( TBool aConnected, TBool aPlaybackAllowed ); + protected: /* @@ -244,15 +248,14 @@ // Timer for calling User::ResetInactivityTime() periodicallly while playing. // This keeps backligth on and screensaver off. - CPeriodic* iBackLightTimer; - + CPeriodic* iBackLightTimer; + // Timer to turn display lights off when playing to TV-out - CPeriodic* iDisplayTimer; + CPeriodic* iDisplayTimer; TTimeIntervalMicroSeconds32 iDisplayTimerTimeout; // Timer monitoring user activity when TV-out is connected - CPeriodic* iUserActivityTimer; + CPeriodic* iUserActivityTimer; - TBool iSeekable; CMpxVideoDrmHelper* iDrmHelper; diff -r 112a725ff2c2 -r 8970fbd719ec videoplayback/videohelix/src/mpxvideoplaybackcontroller.cpp --- a/videoplayback/videohelix/src/mpxvideoplaybackcontroller.cpp Wed Mar 31 21:34:36 2010 +0300 +++ b/videoplayback/videohelix/src/mpxvideoplaybackcontroller.cpp Wed Apr 14 15:59:50 2010 +0300 @@ -15,7 +15,8 @@ * */ -// Version : %version: 50 % + +// Version : %version: 52 % // @@ -41,7 +42,7 @@ #include #include #include -#include +#include #include // For display timeout setting #include @@ -164,7 +165,7 @@ iBackLightTimer = CPeriodic::NewL( CActive::EPriorityStandard ); iDrmHelper = CMpxVideoDrmHelper::NewL(); - + iSavedPosition = 0; } @@ -185,7 +186,7 @@ void CMPXVideoPlaybackController::OpenFileL( const TDesC& aMediaFile, RFile& aFile, TInt aPosition, - TInt aAccessPointId ) + TInt aAccessPointId ) { MPX_ENTER_EXIT(_L("CMPXVideoPlaybackController::OpenFileL()"), _L("file = %S"), &aMediaFile ); @@ -216,7 +217,7 @@ SetPlaybackModeL(); iSavedPosition = aPosition; - + // // Create accessory monitor to search for TV-Out events // @@ -349,16 +350,16 @@ delete iPlayer; iPlayer = NULL; } - + if ( iUserActivityTimer ) { iUserActivityTimer->Cancel(); delete iUserActivityTimer; iUserActivityTimer = NULL; } - + ReleaseLights(); - + CancelDisplayTimer(); #ifdef SYMBIAN_ENABLE_64_BIT_FILE_SERVER_API @@ -495,7 +496,7 @@ { iSeekable = aCmd.ValueTObjectL(KMPXMediaGeneralExtVideoSeekable); - if( iFileDetails ) + if ( iFileDetails ) { iFileDetails->iSeekable &= iSeekable; } @@ -1203,7 +1204,7 @@ case EMPXVideoPlaying: { iState = iPlayingState; - + // // If clip is audio only, stop the backlight timer and break switch // If clip has audio and video, proceed to the next case which will @@ -1217,7 +1218,7 @@ { CancelLightsControl(); } - + break; } case EMPXVideoPaused: @@ -1378,9 +1379,9 @@ if ( ! metaData->Name().CompareF( KSeekable ) ) { - if ( ! metaData->Value().CompareF( KTrue ) ) + if ( ! metaData->Value().CompareF( KFalse ) ) { - iFileDetails->iSeekable = ETrue; + iFileDetails->iSeekable = EFalse; } } else if ( ! metaData->Name().CompareF( KLiveStream ) ) @@ -1751,9 +1752,9 @@ return alarm; } -// ----------------------------------------------------------------------------- -// CMPXVideoPlaybackController::IsKeyLocked -// ----------------------------------------------------------------------------- +// ------------------------------------------------------------------------------------------------- +// CMPXVideoPlaybackController::IsKeyLocked +// ------------------------------------------------------------------------------------------------- // TBool CMPXVideoPlaybackController::IsKeyLocked() { @@ -1765,55 +1766,13 @@ return keylock; } -// ------------------------------------------------------------------------------------------------ -// CMPXVideoPlaybackController::HandleTvOutEventL() -// ------------------------------------------------------------------------------------------------ +// ------------------------------------------------------------------------------------------------- +// CMPXVideoPlaybackController::SendTvOutEventL +// ------------------------------------------------------------------------------------------------- // -void CMPXVideoPlaybackController::HandleTvOutEventL( TBool aConnected ) +TBool CMPXVideoPlaybackController::SendTvOutEventL( TBool aConnected, TBool aPlaybackAllowed ) { - MPX_ENTER_EXIT( _L("CMPXVideoPlaybackController::HandleTvOutEventL()"), - _L("aConnected = %d"), aConnected ); - - TBool playbackAllowed = ETrue; - - if ( aConnected ) - { - // - // TV-Out accessory connected - // - if ( ! iAccessoryMonitor->IsTvOutPlaybackAllowed() ) - { - // - // Clip has DRM protection and TV-Out is connected - // Pause playback and display info note - // - DoHandleCommandL( EPbCmdPause ); - - playbackAllowed = EFalse; - - iState->SendErrorToViewL( KMPXVideoTvOutPlaybackNotAllowed ); - } - else - { - // If lights are being controlled enable display timer so that screen backlight will be turned - // of after timeout. - if ( iBackLightTimer->IsActive() ) - { - RestartDisplayTimer(); - } - } - } - else - { - // TV out disconnected - CancelDisplayTimer(); - - // Ensure that lights are on after this - ReleaseLights(); - - // Pause playback since TV-Out accessory has been disconnected. - DoHandleCommandL( EPbCmdPause ); - } + MPX_ENTER_EXIT(_L("CMPXVideoPlaybackController::SendTvOutEventL()")); // // Send notice to the playback view with TV-Out connection status @@ -1826,7 +1785,7 @@ message->SetTObjectValueL ( KMPXMediaVideoPlaybackCommand, EPbCmdTvOutEvent ); message->SetTObjectValueL( KMPXMediaVideoTvOutConnected, aConnected ); - message->SetTObjectValueL( KMPXMediaVideoTvOutPlayAllowed, playbackAllowed ); + message->SetTObjectValueL( KMPXMediaVideoTvOutPlayAllowed, aPlaybackAllowed ); iMPXPluginObs->HandlePlaybackMessage( message, KErrNone ); @@ -1834,6 +1793,60 @@ } // ------------------------------------------------------------------------------------------------ +// CMPXVideoPlaybackController::HandleTvOutEventL() +// ------------------------------------------------------------------------------------------------ +// +void CMPXVideoPlaybackController::HandleTvOutEventL( TBool aConnected ) +{ + MPX_ENTER_EXIT( _L("CMPXVideoPlaybackController::HandleTvOutEventL()"), + _L("aConnected = %d"), aConnected ); + + TBool playbackAllowed = iAccessoryMonitor->IsTvOutPlaybackAllowed(); + + SendTvOutEventL( aConnected, playbackAllowed ); + + // + // Check playback status of clip with new Tv-Out status + // + if ( aConnected ) + { + // + // TV-Out accessory connected + // + if ( ! playbackAllowed ) + { + // + // Clip has DRM protection and TV-Out is connected + // Pause playback and display info note + // + DoHandleCommandL( EPbCmdPause ); + + iState->SendErrorToViewL( KMPXVideoTvOutPlaybackNotAllowed ); + } + else + { + // If lights are being controlled enable display timer so that screen backlight will be turned + // of after timeout. + if ( iBackLightTimer->IsActive() ) + { + RestartDisplayTimer(); + } + } + } + else + { + // TV out disconnected + CancelDisplayTimer(); + + // Ensure that lights are on after this + ReleaseLights(); + + // Pause playback since TV-Out accessory has been disconnected. + DoHandleCommandL( EPbCmdPause ); + } +} + +// ------------------------------------------------------------------------------------------------ // CMPXVideoPlaybackController::CancelBackLightTimer // ------------------------------------------------------------------------------------------------ void CMPXVideoPlaybackController::CancelBackLightTimer() @@ -1844,7 +1857,6 @@ { iBackLightTimer->Cancel(); } - } // ------------------------------------------------------------------------------------------------ @@ -1861,7 +1873,6 @@ KMPXBackLightTimeOut, TCallBack( CMPXVideoPlaybackController::HandleBackLightTimeout, this )); } - } // ------------------------------------------------------------------------------------------------- @@ -1881,13 +1892,13 @@ void CMPXVideoPlaybackController::DoHandleBackLightTimeout() { MPX_ENTER_EXIT(_L("CMPXVideoPlaybackController::DoHandleBackLightTimeout()")); - + TBool tvOutConnected( EFalse ); if ( iAccessoryMonitor ) { tvOutConnected = iAccessoryMonitor->IsTvOutConnected(); } - + // User activity timer runs always when TV-out is connected // it keeps resetting display timer and keeps lights on whenever there is user activity if ( tvOutConnected ) @@ -1896,9 +1907,9 @@ // Cancel activity timer. Otherwise resetting inactivity time would fire user activity detection CancelUserActivityTimer(); } - + User::ResetInactivityTime(); - + if ( tvOutConnected ) { // Restart user activity timer. It must be running between backlight timer intervals so that backlight @@ -1916,7 +1927,7 @@ MPX_ENTER_EXIT(_L("CMPXVideoPlaybackController::StartLightsControl()")); StartBackLightTimer(); - + if (iAccessoryMonitor ) { if ( iAccessoryMonitor->IsTvOutConnected() ) @@ -1933,21 +1944,21 @@ void CMPXVideoPlaybackController::CancelLightsControl() { MPX_ENTER_EXIT(_L("CMPXVideoPlaybackController::CancelLightsControl()")); - + // This is called whenever there is no need to keep screensaver of anymore - // This means that also displaytimer and activity monitoring can be stopped. + // This means that also displaytimer and activity monitoring can be stopped. // This method is not correct place for these calls CancelBackLightTimer(); - + CancelUserActivityTimer(); - + CancelDisplayTimer(); - + // Ensure that lights are on EnableDisplayBacklight(); - - // Release lights if releserved - ReleaseLights(); + + // Release lights if releserved + ReleaseLights(); } @@ -1958,23 +1969,22 @@ TTimeIntervalMicroSeconds32 CMPXVideoPlaybackController::InitDisplayTimerL() { MPX_ENTER_EXIT(_L("CMPXVideoPlaybackController::InitDisplayTimerL()")); - + if ( !iDisplayTimer ) { iDisplayTimer = CPeriodic::NewL( CPeriodic::EPriorityStandard ); - - MPX_DEBUG(_L("CMPXVideoPlaybackController::InitDisplayTimerL() - created") ); - + + MPX_DEBUG(_L("CMPXVideoPlaybackController::InitDisplayTimerL() - created") ); } - + if ( iDisplayTimerTimeout.Int() == 0 ) { // Get the display light time-out value from CenRep - CRepository* repository = CRepository::NewLC( KCRUidLightSettings ); + CRepository* repository = CRepository::NewLC( KCRUidLightSettings ); // What's the timeout value (in seconds ) for the display light? TInt displayTimeOut ( 0 ); repository->Get( KDisplayLightsTimeout, displayTimeOut ); - + if ( ( displayTimeOut * KMPXMicroSecondsInASecond ) > KMaxTInt ) { iDisplayTimerTimeout = KMaxTInt; @@ -1983,15 +1993,14 @@ { iDisplayTimerTimeout = displayTimeOut * KMPXMicroSecondsInASecond; } - + CleanupStack::PopAndDestroy( repository ); - } - - + } + MPX_DEBUG( _L("CMPXVideoPlaybackController::InitDisplayTimerL Timeout(%d)"), iDisplayTimerTimeout.Int() ); - + // Convert the timeout value to microseconds - return iDisplayTimerTimeout; + return iDisplayTimerTimeout; } // ----------------------------------------------------------------------------- @@ -2006,29 +2015,28 @@ // Leave system to safe state if following leaves. Lights stay on MPX_TRAPD(err, displayTimeOut=InitDisplayTimerL(); ) if ( err == KErrNone ) - { + { // check if the display timer is running and cancel it if ( iDisplayTimer->IsActive() ) { iDisplayTimer->Cancel(); } - + MPX_DEBUG( _L("CMPXVideoPlaybackController::RestartDisplayTimer() restarting displayTimer to=%d ms"), displayTimeOut.Int() ); - + iDisplayTimer->Start( displayTimeOut, displayTimeOut, TCallBack( CMPXVideoPlaybackController::HandleDisplayTimeout, this ) ); } - } // ----------------------------------------------------------------------------- // CMPXVideoPlaybackController::CancelDisplayTimer // ----------------------------------------------------------------------------- // -void CMPXVideoPlaybackController::CancelDisplayTimer() +void CMPXVideoPlaybackController::CancelDisplayTimer() { MPX_ENTER_EXIT(_L("CMPXVideoPlaybackController::CancelDisplayTimer")); - + if ( iDisplayTimer ) { if ( iDisplayTimer->IsActive() ) @@ -2071,21 +2079,21 @@ // ------------------------------------------------------------------------------------------------ // CMPXVideoPlaybackController::EnableDisplayBacklight // ------------------------------------------------------------------------------------------------ -// +// void CMPXVideoPlaybackController::EnableDisplayBacklight() { MPX_ENTER_EXIT(_L("CMPXVideoPlaybackController::EnableDisplayBacklight()")); - + // ELightStatusUnknown - We are not controlling lights and we don't care about lights - // ELightOn - Ligths are certainly on + // ELightOn - Ligths are certainly on MPX_DEBUG(_L("CMPXVideoPlaybackController::EnableDisplayBacklight() iLightStatus=%d"), iLightStatus ); - + // We are responsible of turning lights on only if we have switched them off. if ( iLightStatus == CHWRMLight::ELightOff ) { MPX_TRAPD( err, - { + { // Following GetLightsL() call will not leave. // This call should not result to creation of CHWRMLight in this case // because CHWRMLight was created when lights were turned off. @@ -2093,105 +2101,103 @@ if ( lights->LightStatus(CHWRMLight::EPrimaryDisplay) == CHWRMLight::ELightOff ) { MPX_DEBUG(_L("CMPXVideoPlaybackController::EnableDisplayBacklight() enabling") ); - + lights->LightOnL( CHWRMLight::EPrimaryDisplay, 0 ); iLightStatus = CHWRMLight::ELightOn; } } ); - } - } // ------------------------------------------------------------------------------------------------ // CMPXVideoPlaybackController::DisableDisplayBacklight // ------------------------------------------------------------------------------------------------ -// +// void CMPXVideoPlaybackController::DisableDisplayBacklight() { MPX_ENTER_EXIT(_L("CMPXVideoPlaybackController::DisableDisplayBacklight()")); - + // No major harm done if following block leaves. Lights are left on MPX_TRAPD( err, - { + { CHWRMLight* lights = GetLightsL(); if ( lights->LightStatus(CHWRMLight::EPrimaryDisplay) == CHWRMLight::ELightOn ) { MPX_DEBUG(_L("CMPXVideoPlaybackController::DisableDisplayBacklight() disabling") ); - + lights->LightOffL( CHWRMLight::EPrimaryDisplay, 0 ); iLightStatus = CHWRMLight::ELightOff; } } ); - } // ------------------------------------------------------------------------------------------------ // CMPXVideoPlaybackController::InitUserActivityTimer // ------------------------------------------------------------------------------------------------ -// +// void CMPXVideoPlaybackController::InitUserActivityTimerL() { MPX_ENTER_EXIT(_L("CMPXVideoPlaybackController::InitUserActivityTimerL()")); - + iUserActivityTimer = CPeriodic::NewL( CActive::EPriorityStandard); - - // This timer will not run to the end. Timer will be canceled and reset at backlight timeout. + + // This timer will not run to the end. Timer will be canceled and reset at backlight timeout. iUserActivityTimer->Start( 0, KMPXInactivityTimeout, TCallBack( CMPXVideoPlaybackController::HandleUserActivityTimeout, this )); - } // ------------------------------------------------------------------------------------------------ // CMPXVideoPlaybackController::RestartUserActivityTimer // ------------------------------------------------------------------------------------------------ -// -void CMPXVideoPlaybackController::RestartUserActivityTimer() +// +void CMPXVideoPlaybackController::RestartUserActivityTimer() { MPX_ENTER_EXIT(_L("CMPXVideoPlaybackController::RestartUserActivityTimer()")); - + if ( !iUserActivityTimer ) { // This is first call. Create and initialize timer MPX_TRAPD( err, - { + { InitUserActivityTimerL(); } ); - // If user activity timer creation fails we can't detect user activity and - // get lights back on when user taps screen. + + // If user activity timer creation fails we can't detect user activity and + // get lights back on when user taps screen. // Leave lights on. if ( err != KErrNone ) - { - EnableDisplayBacklight(); - } + { + EnableDisplayBacklight(); + } } - + if ( iUserActivityTimer ) { if ( iUserActivityTimer->IsActive() ) { iUserActivityTimer->Cancel(); - } + } + // Not interested about inactivity callback, only activity - // If CPeriodic::Inactivity is started with argument 0 + // If CPeriodic::Inactivity is started with argument 0 // timer will fire when system's user inactivity timer resets. iUserActivityTimer->Inactivity( 0 ); - } + } } // ------------------------------------------------------------------------------------------------ // CMPXVideoPlaybackController::CancelUserActivityTimer // ------------------------------------------------------------------------------------------------ -// -void CMPXVideoPlaybackController::CancelUserActivityTimer() +// +void CMPXVideoPlaybackController::CancelUserActivityTimer() { MPX_ENTER_EXIT(_L("CMPXVideoPlaybackController::CancelUserActivityTimer()")); - - if ( iUserActivityTimer ) - { + + if ( iUserActivityTimer ) + { if ( iUserActivityTimer->IsActive() ) { iUserActivityTimer->Cancel(); @@ -2202,35 +2208,35 @@ // ------------------------------------------------------------------------------------------------ // CMPXVideoPlaybackController::HandleUserActivityTimeout // ------------------------------------------------------------------------------------------------ -// +// TInt CMPXVideoPlaybackController::HandleUserActivityTimeout( TAny* aPtr ) { MPX_ENTER_EXIT(_L("CMPXVideoPlaybackController::HandleUserActivityTimeout()")); - + static_cast(aPtr)->DoHandleUserActivityTimeout(); - return KErrNone; + return KErrNone; } // ------------------------------------------------------------------------------------------------ // CMPXVideoPlaybackController::DoHandleUserActivityTimeout // ------------------------------------------------------------------------------------------------ -// +// void CMPXVideoPlaybackController::DoHandleUserActivityTimeout() { MPX_ENTER_EXIT(_L("CMPXVideoPlaybackController::DoHandleUserActivityTimeout()")); - + // Act only once for detected activity. - if ( iUserActivityTimer->IsActive() ) + if ( iUserActivityTimer->IsActive() ) { iUserActivityTimer->Cancel(); } - + // iUserActivityTimer runs when TV-out is connected and playback with video is going on - // This timer fires in two situations. + // This timer fires in two situations. // a) Lights are off and user activity is detected - Turn lights on and restart display timer // b) Lights are on and user activity is detected - restart display timer to prevent lights go off EnableDisplayBacklight(); - + // Start counting down to next lights off RestartDisplayTimer(); } @@ -2242,8 +2248,8 @@ CHWRMLight* CMPXVideoPlaybackController::GetLightsL() { MPX_ENTER_EXIT(_L("CMPXVideoPlaybackController::GetLightsL()")); - - if ( !iLight ) + + if ( !iLight ) { MPX_DEBUG( _L("CMPXVideoPlaybackController::GetLightsL() - creating") ); iLight = CHWRMLight::NewL(); @@ -2258,13 +2264,13 @@ void CMPXVideoPlaybackController::ReleaseLights() { MPX_ENTER_EXIT(_L("CMPXVideoPlaybackController::ReleaseLights()")); - + if ( iLight ) { - // If iLights was created when ReleaseLights was called then TV out must be connected and lights may be off. + // If iLights was created when ReleaseLights was called then TV out must be connected and lights may be off. // This call ensures that lights are on again. EnableDisplayBacklight(); - + MPX_DEBUG( _L("CMPXVideoPlaybackController::ReleaseLights() - deleting") ); delete iLight; iLight = NULL; @@ -2379,7 +2385,7 @@ iFileHandle64.Close(); } #endif // SYMBIAN_ENABLE_64_BIT_FILE_SERVER_API - + // reset to True iSeekable = ETrue; @@ -2484,8 +2490,8 @@ DetermineMediaTypeL(); SetPlaybackModeL(); - iSavedPosition = aPosition; - + iSavedPosition = aPosition; + // // Create accessory monitor to search for TV-Out events // diff -r 112a725ff2c2 -r 8970fbd719ec videoplayback/videohelix/src/mpxvideoplaybackmode.cpp --- a/videoplayback/videohelix/src/mpxvideoplaybackmode.cpp Wed Mar 31 21:34:36 2010 +0300 +++ b/videoplayback/videohelix/src/mpxvideoplaybackmode.cpp Wed Apr 14 15:59:50 2010 +0300 @@ -15,7 +15,7 @@ * */ -// Version : %version: e003sa33#21 % +// Version : %version: 22 % @@ -199,11 +199,12 @@ } // ------------------------------------------------------------------------------------------------ -// CMPXVideoPlaybackMode::CanPlayNow +// CMPXVideoPlaybackMode::CanPlayNow() // ------------------------------------------------------------------------------------------------ TBool CMPXVideoPlaybackMode::CanPlayNow() { - MPX_DEBUG(_L("CMPXVideoPlaybackMode::CanPlayNow")); + MPX_ENTER_EXIT(_L("CMPXVideoPlaybackMode::CanPlayNow")); + TBool playAllowed = EFalse; if ( iVideoPlaybackCtlr->iAppInForeground && iVideoPlaybackCtlr->iAllowAutoPlay ) @@ -362,31 +363,34 @@ TInt apMaxLen = 3; MPX_TRAPD( err, - HBufC8* accessPoint = HBufC8::NewLC( KMMFAccessPoint().Length() + apMaxLen ); - accessPoint->Des().Format( KMMFAccessPoint, iVideoPlaybackCtlr->iAccessPointId ); + { + HBufC8* accessPoint = HBufC8::NewLC( KMMFAccessPoint().Length() + apMaxLen ); + accessPoint->Des().Format( KMMFAccessPoint, iVideoPlaybackCtlr->iAccessPointId ); - tempBuf = HBufC8::NewLC( accessPoint->Length() ); - tempBuf->Des().Copy( accessPoint->Des() ); + tempBuf = HBufC8::NewLC( accessPoint->Length() ); + tempBuf->Des().Copy( accessPoint->Des() ); - if ( tempBuf ) - { - iVideoPlaybackCtlr->iPlayer->CustomCommandSync( destinationPckg, - EMMFROPControllerSetApplicationConfig, - tempBuf->Des(), - savePckg ); - } + if ( tempBuf ) + { + iVideoPlaybackCtlr->iPlayer->CustomCommandSync( + destinationPckg, + EMMFROPControllerSetApplicationConfig, + tempBuf->Des(), + savePckg ); + } - CleanupStack::PopAndDestroy(2); // accessPoint, tempBuf - ); + CleanupStack::PopAndDestroy(2); + } ); } } // ------------------------------------------------------------------------------------------------ -// CMPXStreamingPlaybackMode::CanPlayNow +// CMPXStreamingPlaybackMode::CanPlayNow // ------------------------------------------------------------------------------------------------ TBool CMPXStreamingPlaybackMode::CanPlayNow() { - MPX_DEBUG(_L("CMPXStreamingPlaybackMode::CanPlayNow")); + MPX_ENTER_EXIT(_L("CMPXStreamingPlaybackMode::CanPlayNow")); + TBool playAllowed = EFalse; if ( iVideoPlaybackCtlr->iAppInForeground && iVideoPlaybackCtlr->iAllowAutoPlay ) @@ -425,6 +429,7 @@ MPX_ENTER_EXIT(_L("CMPXStreamingPlaybackMode::IsTvOutAllowedL(1)")); return ETrue; } + // ------------------------------------------------------------------------------------------------ // CMPXStreamingPlaybackMode::HandlePause() // ------------------------------------------------------------------------------------------------ @@ -440,9 +445,10 @@ { iVideoPlaybackCtlr->ChangeState( EMPXVideoPaused ); - iVideoPlaybackCtlr->iMPXPluginObs->HandlePluginEvent( MMPXPlaybackPluginObserver::EPPaused, - 0, - err ); + iVideoPlaybackCtlr->iMPXPluginObs->HandlePluginEvent( + MMPXPlaybackPluginObserver::EPPaused, + 0, + err ); } else { diff -r 112a725ff2c2 -r 8970fbd719ec videoplayback/videohelix/src/mpxvideoplaybackstate.cpp --- a/videoplayback/videohelix/src/mpxvideoplaybackstate.cpp Wed Mar 31 21:34:36 2010 +0300 +++ b/videoplayback/videohelix/src/mpxvideoplaybackstate.cpp Wed Apr 14 15:59:50 2010 +0300 @@ -15,7 +15,7 @@ * */ -// Version : %version: e003sa33#36 % +// Version : %version: 37 % // @@ -116,8 +116,6 @@ // ------------------------------------------------------------------------------------------------ // CMPXVideoPlaybackState::HandlePause() -// -// @@FP for now we are assuming that Pause is only valid for Playing state // ------------------------------------------------------------------------------------------------ void CMPXVideoPlaybackState::HandlePause() { @@ -187,8 +185,6 @@ void CMPXVideoPlaybackState::HandleBackground() { MPX_ENTER_EXIT(_L("CMPXVideoPlaybackState::HandleBackground()")); - - // Just pause the plackback HandlePause(); } @@ -526,7 +522,7 @@ TMPXAttribute( KMPXMediaVideoDrmProtected ), iVideoPlaybackCtlr->iFileDetails->iDrmProtected ); } - + // // Description // @@ -537,7 +533,7 @@ TMPXAttribute( KMPXMediaVideoDescription ), *( iVideoPlaybackCtlr->iFileDetails->iDescription ) ); } - + // // Location // @@ -548,7 +544,7 @@ TMPXAttribute( KMPXMediaVideoLocation ), *( iVideoPlaybackCtlr->iFileDetails->iLocation ) ); } - + // // Copyright // @@ -559,7 +555,7 @@ TMPXAttribute( KMPXMediaVideoCopyright ), *( iVideoPlaybackCtlr->iFileDetails->iCopyright ) ); } - + // // Language // @@ -570,7 +566,7 @@ TMPXAttribute( KMPXMediaVideoLanguage ), *( iVideoPlaybackCtlr->iFileDetails->iLanguage ) ); } - + // // Keywords // @@ -580,7 +576,7 @@ aMedia->SetTextValueL( TMPXAttribute( KMPXMediaVideoKeywords ), *( iVideoPlaybackCtlr->iFileDetails->iKeywords ) ); - } + } } // ------------------------------------------------------------------------------------------------ @@ -673,6 +669,13 @@ { MPX_ENTER_EXIT(_L("CMPXVideoPlaybackState::CommandHandleBackground()")); + // + // Block playback in the following cases: + // - App is not in foreground + // - Alarm + // - Phone call + // - Video call + // if ( !iVideoPlaybackCtlr->iAppInForeground || iVideoPlaybackCtlr->IsAlarm() || iVideoPlaybackCtlr->IsPhoneCall() || @@ -689,7 +692,7 @@ { MPX_ENTER_EXIT(_L("CMPXVideoPlaybackState::CommandHandleForeground()")); - if ( !iVideoPlaybackCtlr->IsActivePhoneCall() ) + if ( ! iVideoPlaybackCtlr->IsActivePhoneCall() ) { iVideoPlaybackCtlr->iAllowAutoPlay = ETrue; } @@ -979,20 +982,20 @@ if ( aError == KErrNone ) { iVideoPlaybackCtlr->iPlaybackMode->HandleOpenComplete(); - + // - // call setposition with converted value saved in openfile + // call setposition with converted value saved in openfile // - if ( iVideoPlaybackCtlr->iSavedPosition > 0 ) - { + if ( iVideoPlaybackCtlr->iSavedPosition > 0 ) + { MPX_DEBUG(_L("CMPXInitialisingState::HandleOpenComplete() iSavedPosition %d"), iVideoPlaybackCtlr->iSavedPosition ); - + TInt64 pos( iVideoPlaybackCtlr->iSavedPosition ); pos *= KPbMilliMultiplier; - + MPX_TRAPD( err, iVideoPlaybackCtlr->iPlayer->SetPositionL( pos ) ); } - + MPX_DEBUG(_L("CMPXInitialisingState::HandleOpenComplete() Sending Prepare()")); iVideoPlaybackCtlr->iPlayer->Prepare(); @@ -1747,8 +1750,9 @@ } else { - // delayed pause : - // background event was received while we were in buffering state + // + // Delayed pause, background event was received while we were in buffering state + // iVideoPlaybackCtlr->iPlaybackMode->HandlePause(); } } @@ -1775,14 +1779,11 @@ } // ------------------------------------------------------------------------------------------------ -// CMPXBufferingState::HandleBackground() +// CMPXBufferingState::HandleBackground() // ------------------------------------------------------------------------------------------------ void CMPXBufferingState::HandleBackground() { MPX_DEBUG(_L("CMPXBufferingState::HandleBackground()")); - - // we are in buffering state and received a background event - // we cannot pause now but need to pause when buffering is complete iVideoPlaybackCtlr->iPlaybackMode->HandleBackground(); } @@ -1793,8 +1794,10 @@ { MPX_DEBUG(_L("CMPXBufferingState::HandleForeground()")); - // we are in buffering state and received a background event - // we cannot pause now but need to pause when buffering is complete + // + // We are in buffering state and received a background and foreground event + // playback will continue when buffering is complete + // } // ------------------------------------------------------------------------------------------------ @@ -1888,7 +1891,8 @@ // ------------------------------------------------------------------------------------------------ void CMPXSeekingState::HandleBackground() { - MPX_DEBUG(_L("CMPXSeekingState::HandleBackground()")); + MPX_ENTER_EXIT(_L("CMPXSeekingState::HandleBackground()")); + MPX_TRAPD( err, HandleStopSeekL() ); iVideoPlaybackCtlr->iPlaybackMode->HandleBackground(); } @@ -1898,7 +1902,8 @@ // ------------------------------------------------------------------------------------------------ void CMPXSeekingState::HandlePause() { - MPX_DEBUG(_L("CMPXSeekingState::HandlePause()")); + MPX_ENTER_EXIT(_L("CMPXSeekingState::HandlePause()")); + MPX_TRAPD( err, HandleStopSeekL() ); iVideoPlaybackCtlr->iPlaybackMode->HandlePause(); } diff -r 112a725ff2c2 -r 8970fbd719ec videoplayback/videohelix/src/mpxvideoseeker.cpp --- a/videoplayback/videohelix/src/mpxvideoseeker.cpp Wed Mar 31 21:34:36 2010 +0300 +++ b/videoplayback/videohelix/src/mpxvideoseeker.cpp Wed Apr 14 15:59:50 2010 +0300 @@ -15,7 +15,7 @@ * */ -// Version : %version: 8 % +// Version : %version: 9 % // INCLUDE FILES @@ -31,7 +31,7 @@ const TInt KDefaultPlaySpeed(100); // 1x const TInt KDefaultTrickPlaySpeed(400); // 4x #else -const TInt KTrickPlayTimeout(5000000); // 5 sec +const TInt KTrickPlayTimeout(2000000); // 2 sec const TInt KSpeedInterval(125000); // 125 msec const TInt KDurationA(90000000); // 90 sec const TInt KDurationB(180000000); // 180 sec diff -r 112a725ff2c2 -r 8970fbd719ec videoplayback/videoplaybackcontrols/src/mpxvideoplaybackcontrol.cpp --- a/videoplayback/videoplaybackcontrols/src/mpxvideoplaybackcontrol.cpp Wed Mar 31 21:34:36 2010 +0300 +++ b/videoplayback/videoplaybackcontrols/src/mpxvideoplaybackcontrol.cpp Wed Apr 14 15:59:50 2010 +0300 @@ -15,7 +15,7 @@ * */ -// Version : %version: 19 % +// Version : %version: e003sa33#20 % // INCLUDE FILES @@ -562,6 +562,9 @@ { MPX_DEBUG(_L("CMPXVideoPlaybackControlsController::ResetControl()")); + iControl->SetPointerCapture( EFalse ); + iControl->ClaimPointerGrab( EFalse ); + switch( iControlIndex ) { case EMPXButtonBar: diff -r 112a725ff2c2 -r 8970fbd719ec videoplayback/videoplaybackcontrols/src/mpxvideoplaybackcontrolscontroller.cpp --- a/videoplayback/videoplaybackcontrols/src/mpxvideoplaybackcontrolscontroller.cpp Wed Mar 31 21:34:36 2010 +0300 +++ b/videoplayback/videoplaybackcontrols/src/mpxvideoplaybackcontrolscontroller.cpp Wed Apr 14 15:59:50 2010 +0300 @@ -16,7 +16,7 @@ */ -// Version : %version: e003sa33#31 % +// Version : %version: 32 % // INCLUDE FILES @@ -1239,7 +1239,7 @@ // void CMPXVideoPlaybackControlsController::HideAllControls() { - MPX_DEBUG(_L("CMPXVideoPlaybackControlsController::HideAllControls()")); + MPX_ENTER_EXIT(_L("CMPXVideoPlaybackControlsController::HideAllControls()")); ResetDisappearingTimers( EMPXTimerCancel ); @@ -1255,7 +1255,8 @@ // void CMPXVideoPlaybackControlsController::ShowControls() { - MPX_DEBUG(_L("CMPXVideoPlaybackControlsController::ShowControls() iState = %d"), iState); + MPX_ENTER_EXIT(_L("CMPXVideoPlaybackControlsController::ShowControls()"), + _L("iState = %d"), iState ); CloseMediaDetailsViewer(); @@ -1299,7 +1300,7 @@ // void CMPXVideoPlaybackControlsController::UpdateControlsVisibility() { - MPX_DEBUG(_L("CMPXVideoPlaybackControlsController::UpdateControlsVisibility()")); + MPX_ENTER_EXIT(_L("CMPXVideoPlaybackControlsController::UpdateControlsVisibility()")); HideAllControls(); ShowControls(); @@ -1914,6 +1915,8 @@ // void CMPXVideoPlaybackControlsController::CloseMediaDetailsViewer() { + MPX_ENTER_EXIT(_L("CMPXVideoPlaybackControlsController::CloseMediaDetailsViewer()")); + if ( iMediaDetailsViewerControl ) { iMediaDetailsViewerControl->MakeVisible(EFalse); diff -r 112a725ff2c2 -r 8970fbd719ec videoplayback/videoplaybackcontrols/src/mpxvideoplaybackmediadetailsviewer.cpp --- a/videoplayback/videoplaybackcontrols/src/mpxvideoplaybackmediadetailsviewer.cpp Wed Mar 31 21:34:36 2010 +0300 +++ b/videoplayback/videoplaybackcontrols/src/mpxvideoplaybackmediadetailsviewer.cpp Wed Apr 14 15:59:50 2010 +0300 @@ -16,7 +16,7 @@ */ -// Version : %version: e003sa33#16 % +// Version : %version: e003sa33#17 % // INCLUDE FILES @@ -65,7 +65,6 @@ CMPXVideoPlaybackMediaDetailsViewer::CMPXVideoPlaybackMediaDetailsViewer( CMPXVideoPlaybackControlsController* aController ) : iController( aController ) - , iScrollTimerDelayBeginningTick( KInvalidTick ) { } @@ -88,14 +87,11 @@ TSize bitmapSize = Rect().Size(); User::LeaveIfError( iBackgroundBitmap->Create( bitmapSize, EColor16MA ) ); - iScrollPosition = 0; iScrollingTextTimer = CPeriodic::NewL( CActive::EPriorityStandard ); iScrollingTextTimer->Start( 0, 175000, - TCallBack( CMPXVideoPlaybackMediaDetailsViewer::ScrollFilenameTimer, this ) ); - - iShouldPauseScrolling = EFalse; + TCallBack( CMPXVideoPlaybackMediaDetailsViewer::ScrollTimer, this ) ); } // ------------------------------------------------------------------------------------------------- @@ -299,36 +295,53 @@ CleanupStack::PushL( heading ); TBuf licenseField; - licenseField.Append(KLeftMargin); + licenseField.Append( KLeftMargin ); licenseField.Append( *heading ); - iLicenseLabel->OverrideColorL(EColorLabelText, KRgbDarkBlue); - iLicenseLabel->SetTextL(licenseField); - iLicenseLabel->SetAllMarginsTo(KMediaDetailsViewerItemMargin); - iLicenseLabel->SetLabelAlignment(ELayoutAlignCenter); - iLicenseLabel->SetUnderlining(ETrue); + iLicenseLabel->OverrideColorL( EColorLabelText, KRgbDarkBlue ); + iLicenseLabel->SetTextL( licenseField ); + iLicenseLabel->SetAllMarginsTo( KMediaDetailsViewerItemMargin ); + iLicenseLabel->SetLabelAlignment( ELayoutAlignCenter ); + iLicenseLabel->SetUnderlining( ETrue ); iLicenseLabel->MakeVisible( ETrue ); rowsAdded++; CleanupStack::PopAndDestroy( heading ); } + + // Title + HBufC* fileTitle = iController->FileDetails()->GenerateFileTitleL(); + + if ( fileTitle && fileTitle->Length() ) + { + // Title gets populated by UpdateTitle method + iTitleLabel->SetExtent( + TPoint( Rect().iTl.iX, Rect().iTl.iY + ( labelHeight * rowsAdded ) ) , + TSize( labelWidth, labelHeight ) + ); + iTitleLabel->SetAllMarginsTo( KMediaDetailsViewerItemMargin ); + iTitleLabel->MakeVisible( ETrue ); + rowsAdded++; + } + + delete fileTitle; // Filename HBufC* fileName = iController->FileDetails()->GenerateFileNameL(); if ( fileName && fileName->Length() ) { - // file name gets populated by HandleScrollFilenameTimer method + // file name gets populated by UpdateFilename method iClipnameLabel->SetExtent( TPoint( Rect().iTl.iX, Rect().iTl.iY + ( labelHeight * rowsAdded ) ) , TSize( labelWidth, labelHeight ) ); - iClipnameLabel->SetAllMarginsTo(KMediaDetailsViewerItemMargin); + iClipnameLabel->SetAllMarginsTo( KMediaDetailsViewerItemMargin ); iClipnameLabel->MakeVisible( ETrue ); rowsAdded++; - - delete fileName; } - + + delete fileName; + // Mime Type (Format) if ( iController->FileDetails()->iMimeType && iController->FileDetails()->iMimeType->Length() ) { @@ -340,13 +353,13 @@ CleanupStack::PushL( heading ); TBuf formatField; - formatField.Append(KLeftMargin); + formatField.Append( KLeftMargin ); formatField.Append( *heading ); formatField.Append( KHeadingValueSeperator ); TInt allowLen = KMediaDetailsViewerMaxBufLen-formatField.Length(); - formatField.Append( (iController->FileDetails()->iMimeType)->Left(allowLen) ); - iFormatLabel->SetTextL(formatField); - iFormatLabel->SetAllMarginsTo(KMediaDetailsViewerItemMargin); + formatField.Append( ( iController->FileDetails()->iMimeType )->Left( allowLen ) ); + iFormatLabel->SetTextL( formatField ); + iFormatLabel->SetAllMarginsTo( KMediaDetailsViewerItemMargin ); iFormatLabel->MakeVisible( ETrue ); rowsAdded++; @@ -364,7 +377,7 @@ CleanupStack::PushL( heading ); TBuf resolutionField; - resolutionField.Append(KLeftMargin); + resolutionField.Append( KLeftMargin ); resolutionField.Append( *heading ); resolutionField.Append( KHeadingValueSeperator ); resolutionField.AppendNum( iController->FileDetails()->iVideoWidth ); @@ -372,7 +385,7 @@ resolutionField.AppendNum( iController->FileDetails()->iVideoHeight); AknTextUtils::DisplayTextLanguageSpecificNumberConversion( resolutionField ); - iResolutionLabel->SetTextL(resolutionField); + iResolutionLabel->SetTextL( resolutionField ); iResolutionLabel->SetAllMarginsTo(KMediaDetailsViewerItemMargin); iResolutionLabel->MakeVisible( ETrue ); rowsAdded++; @@ -391,7 +404,7 @@ CleanupStack::PushL( heading ); TBuf durationField; - durationField.Append(KLeftMargin); + durationField.Append( KLeftMargin ); durationField.Append( *heading ); durationField.Append( KHeadingValueSeperator ); @@ -409,13 +422,13 @@ } TBuf<64> dur; - TTime durTime = TTime(durationInSeconds * 1000000); - durTime.FormatL(dur, *unitFormatString); + TTime durTime = TTime( durationInSeconds * 1000000 ); + durTime.FormatL( dur, *unitFormatString ); AknTextUtils::DisplayTextLanguageSpecificNumberConversion( dur ); durationField.Append( dur ); - iDurationLabel->SetTextL(durationField); - iDurationLabel->SetAllMarginsTo(KMediaDetailsViewerItemMargin); + iDurationLabel->SetTextL( durationField ); + iDurationLabel->SetAllMarginsTo( KMediaDetailsViewerItemMargin ); iDurationLabel->MakeVisible( ETrue ); rowsAdded++; @@ -434,7 +447,7 @@ CleanupStack::PushL( heading ); TBuf bitrateField; - bitrateField.Append(KLeftMargin); + bitrateField.Append( KLeftMargin ); bitrateField.Append( *heading ); bitrateField.Append( KHeadingValueSeperator ); @@ -442,8 +455,8 @@ StringLoader::LoadLC(R_MPX_BITRATE_UNITS,iController->FileDetails()->iBitRate / 1000 ); bitrateField.Append( *formattedBitrate ); - iBitrateLabel->SetTextL(bitrateField); - iBitrateLabel->SetAllMarginsTo(KMediaDetailsViewerItemMargin); + iBitrateLabel->SetTextL( bitrateField ); + iBitrateLabel->SetAllMarginsTo( KMediaDetailsViewerItemMargin ); iBitrateLabel->MakeVisible( ETrue ); rowsAdded++; @@ -451,30 +464,6 @@ CleanupStack::PopAndDestroy( heading ); } - // Title - if ( iController->FileDetails()->iTitle && iController->FileDetails()->iTitle->Length() ) - { - iTitleLabel->SetExtent( - TPoint( Rect().iTl.iX, Rect().iTl.iY + ( labelHeight * rowsAdded ) ) , - TSize( labelWidth, labelHeight ) - ); - HBufC* heading = iEikonEnv->AllocReadResourceL( R_MPX_TITLE_HEADING ); - CleanupStack::PushL( heading ); - - TBuf titleField; - titleField.Append(KLeftMargin); - titleField.Append( *heading ); - titleField.Append( KHeadingValueSeperator ); - TInt allowLen = KMediaDetailsViewerMaxBufLen-titleField.Length(); - titleField.Append( (iController->FileDetails()->iTitle)->Left(allowLen) ); - iTitleLabel->SetTextL(titleField); - iTitleLabel->SetAllMarginsTo(KMediaDetailsViewerItemMargin); - iTitleLabel->MakeVisible( ETrue ); - rowsAdded++; - - CleanupStack::PopAndDestroy( heading ); - } - // Artist if ( iController->FileDetails()->iArtist && iController->FileDetails()->iArtist->Length() ) { @@ -486,13 +475,13 @@ CleanupStack::PushL( heading ); TBuf artistField; - artistField.Append(KLeftMargin); + artistField.Append( KLeftMargin ); artistField.Append( *heading ); artistField.Append( KHeadingValueSeperator ); TInt allowLen = KMediaDetailsViewerMaxBufLen-artistField.Length(); - artistField.Append( (iController->FileDetails()->iArtist)->Left( allowLen ) ); - iArtistLabel->SetTextL(artistField); - iArtistLabel->SetAllMarginsTo(KMediaDetailsViewerItemMargin); + artistField.Append( ( iController->FileDetails()->iArtist )->Left( allowLen ) ); + iArtistLabel->SetTextL( artistField ); + iArtistLabel->SetAllMarginsTo( KMediaDetailsViewerItemMargin ); iArtistLabel->MakeVisible( ETrue ); rowsAdded++; @@ -508,11 +497,11 @@ ); TBuf titleField; - titleField.Append(KLeftMargin); + titleField.Append( KLeftMargin ); TInt allowLen = KMediaDetailsViewerMaxBufLen-titleField.Length(); - titleField.Append( iAdditionalString->Left(allowLen) ); - iAdditionalLabel->SetTextL(titleField); - iAdditionalLabel->SetAllMarginsTo(KMediaDetailsViewerItemMargin); + titleField.Append( iAdditionalString->Left( allowLen ) ); + iAdditionalLabel->SetTextL( titleField ); + iAdditionalLabel->SetAllMarginsTo( KMediaDetailsViewerItemMargin ); iAdditionalLabel->MakeVisible( ETrue ); rowsAdded++; } @@ -685,98 +674,47 @@ } // ------------------------------------------------------------------------------------------------- -// CMPXVideoPlaybackMediaDetailsViewer::ScrollFilenameTimer +// CMPXVideoPlaybackMediaDetailsViewer::ScrollTimer // ------------------------------------------------------------------------------------------------- // -TInt CMPXVideoPlaybackMediaDetailsViewer::ScrollFilenameTimer( TAny* aPtr ) +TInt CMPXVideoPlaybackMediaDetailsViewer::ScrollTimer( TAny* aPtr ) { TRAP_IGNORE( - static_cast(aPtr)->HandleScrollFilenameTimerL() + static_cast(aPtr)->HandleScrollTimerL() ); return KErrNone; } // ------------------------------------------------------------------------------------------------- -// CMPXVideoPlaybackMediaDetailsViewer::HandleScrollFilenameTimerL +// CMPXVideoPlaybackMediaDetailsViewer::HandleScrollTimerL // ------------------------------------------------------------------------------------------------- // -void CMPXVideoPlaybackMediaDetailsViewer::HandleScrollFilenameTimerL() +void CMPXVideoPlaybackMediaDetailsViewer::HandleScrollTimerL() { - MPX_ENTER_EXIT( _L( "CMPXVideoPlaybackMediaDetailsViewer::HandleScrollFilenameTimerL" ) ); + MPX_ENTER_EXIT( _L( "CMPXVideoPlaybackMediaDetailsViewer::HandleScrollTimerL" ) ); - TBool skipForTimerDelay = EFalse; - - // add a delay after each complete scrolling - if ( iScrollTimerDelayBeginningTick != KInvalidTick ) + if ( iFilenameScroller.IsUpdateNeeded() ) { - if ( ( User::NTickCount() - iScrollTimerDelayBeginningTick ) >= KScrollTimerDelayTickCounts ) - { - iScrollTimerDelayBeginningTick = KInvalidTick; - } - else - { - skipForTimerDelay = ETrue; - } + UpdateFilenameL(); } - - if ( !skipForTimerDelay && iShouldPauseScrolling ) + + if ( iTitleScroller.IsUpdateNeeded() ) { - iShouldPauseScrolling = EFalse; - iScrollTimerDelayBeginningTick = User::NTickCount(); - skipForTimerDelay = ETrue; + UpdateTitleL(); } - // skip the scrolling operation if the loop for delay is going on - if ( !skipForTimerDelay ) + if ( !iFilenameScroller.IsScrollNeeded() && !iTitleScroller.IsScrollNeeded() ) { - HBufC* fileName = iController->FileDetails()->GenerateFileNameL(); - - - if ( fileName && fileName->Length() ) - { - CleanupStack::PushL( fileName ); - - TInt length = fileName->Length(); - - HBufC* heading = iEikonEnv->AllocReadResourceL( R_MPX_FILENAME_HEADING ); - CleanupStack::PushL( heading ); + iScrollingTextTimer->Cancel(); // no need to keep the timer active + } - TBuf filenameField; - filenameField.Append(KLeftMargin); - filenameField.Append( *heading ); - filenameField.Append( KHeadingValueSeperator ); - - if ( length >= KMediaDetailsViewerVisibleCharacters ) - { - filenameField.Append( fileName->Mid( iScrollPosition, - KMediaDetailsViewerVisibleCharacters ) ); - - if ( iScrollPosition == (length - KMediaDetailsViewerVisibleCharacters) ) - { - iScrollPosition = 0; - iShouldPauseScrolling = ETrue; - } - else - { - iScrollPosition++; - } - } - else - { - filenameField.Append( *fileName ); - iScrollingTextTimer->Cancel(); // no need to keep the timer active - } - - iClipnameLabel->SetTextL(filenameField); - DrawNow(); - - CleanupStack::PopAndDestroy( heading ); - CleanupStack::PopAndDestroy( fileName ); - } + if ( iScrolledTextUpdated ) + { + iScrolledTextUpdated = EFalse; + DrawNow(); } } - // ------------------------------------------------------------------------------------------------- // CMPXVideoPlaybackMediaDetailsViewer::NumOfItemsShownInViewer // ------------------------------------------------------------------------------------------------- @@ -816,9 +754,13 @@ numOfItems++; } - if ( iController->FileDetails()->iTitle ) + HBufC* title = NULL; + TRAP_IGNORE ( title = iController->FileDetails()->GenerateFileTitleL() ); + + if ( title ) { numOfItems++; + delete title; } if ( iController->FileDetails()->iArtist ) @@ -895,6 +837,72 @@ } // ------------------------------------------------------------------------------------------------- +// CMPXVideoPlaybackMediaDetailsViewer::UpdateFilenameL +// ------------------------------------------------------------------------------------------------- +// +void CMPXVideoPlaybackMediaDetailsViewer::UpdateFilenameL() +{ + MPX_ENTER_EXIT( _L( "CMPXVideoPlaybackMediaDetailsViewer::UpdateFilenameL" ) ); + + HBufC* fileName = iController->FileDetails()->GenerateFileNameL(); + CleanupStack::PushL( fileName ); + + if ( fileName && fileName->Length() ) + { + HBufC* heading = iEikonEnv->AllocReadResourceL( R_MPX_FILENAME_HEADING ); + CleanupStack::PushL( heading ); + + TBuf filenameField; + filenameField.Append( KLeftMargin ); + filenameField.Append( *heading ); + filenameField.Append( KHeadingValueSeperator ); + + iFilenameScroller.ScrollText( *fileName, filenameField ); + + iClipnameLabel->SetTextL( filenameField ); + + iScrolledTextUpdated = ETrue; + + CleanupStack::PopAndDestroy( heading ); + } + + CleanupStack::PopAndDestroy( fileName ); +} + +// ------------------------------------------------------------------------------------------------- +// CMPXVideoPlaybackMediaDetailsViewer::UpdateTitleL +// ------------------------------------------------------------------------------------------------- +// +void CMPXVideoPlaybackMediaDetailsViewer::UpdateTitleL() +{ + MPX_ENTER_EXIT( _L( "CMPXVideoPlaybackMediaDetailsViewer::UpdateTitleL" ) ); + + HBufC* fileTitle = iController->FileDetails()->GenerateFileTitleL(); + CleanupStack::PushL( fileTitle ); + + if ( fileTitle && fileTitle->Length() ) + { + HBufC* heading = iEikonEnv->AllocReadResourceL( R_MPX_TITLE_HEADING ); + CleanupStack::PushL( heading ); + + TBuf titleField; + titleField.Append( KLeftMargin ); + titleField.Append( *heading ); + titleField.Append( KHeadingValueSeperator ); + + iTitleScroller.ScrollText( *fileTitle, titleField ); + + iTitleLabel->SetTextL( titleField ); + + iScrolledTextUpdated = ETrue; + + CleanupStack::PopAndDestroy( heading ); + } + + CleanupStack::PopAndDestroy( fileTitle ); +} + +// ------------------------------------------------------------------------------------------------- // CMPXVideoPlaybackMediaDetailsViewer::ViewerRect // ------------------------------------------------------------------------------------------------- // @@ -903,5 +911,101 @@ return iViewerRect; } +// ------------------------------------------------------------------------------------------------- +// CMPXVideoPlaybackMediaDetailsViewer::TTextScroller::TTextScroller +// ------------------------------------------------------------------------------------------------- +// +CMPXVideoPlaybackMediaDetailsViewer::TTextScroller::TTextScroller() + : iDelayBeginningTick( KInvalidTick ) + , iTextScrollPos( 0 ) + , iDelay( EFalse ) + , iScroll( ETrue ) + , iSrcTextLen( 0 ) +{ +} + +// ------------------------------------------------------------------------------------------------- +// CMPXVideoPlaybackMediaDetailsViewer::TTextScroller::IsScrollNeeded +// ------------------------------------------------------------------------------------------------- +// +TBool CMPXVideoPlaybackMediaDetailsViewer::TTextScroller::IsScrollNeeded() +{ + return iScroll; +} + +// ------------------------------------------------------------------------------------------------- +// CMPXVideoPlaybackMediaDetailsViewer::TTextScroller::IsUpdateNeeded +// ------------------------------------------------------------------------------------------------- +// +TBool CMPXVideoPlaybackMediaDetailsViewer::TTextScroller::IsUpdateNeeded() +{ + MPX_ENTER_EXIT( _L( "CMPXVideoPlaybackMediaDetailsViewer::TTextScroller::IsUpdateNeeded" ) ); + + // skip the scrolling operation if the loop for delay is going on + TBool skipForTimerDelay = EFalse; + + // add a delay after each complete scrolling + if ( iScroll && iDelayBeginningTick != KInvalidTick ) + { + if ( ( User::NTickCount() - iDelayBeginningTick ) >= KScrollTimerDelayTickCounts ) + { + iDelayBeginningTick = KInvalidTick; + } + else + { + skipForTimerDelay = ETrue; + } + } + + // start delay + if ( iScroll && !skipForTimerDelay && iDelay ) + { + iDelay = EFalse; + iDelayBeginningTick = User::NTickCount(); + skipForTimerDelay = ETrue; + } + + return iScroll && !skipForTimerDelay; +} + +// ------------------------------------------------------------------------------------------------- +// CMPXVideoPlaybackMediaDetailsViewer::TTextScroller::ScrollText +// ------------------------------------------------------------------------------------------------- +// +void CMPXVideoPlaybackMediaDetailsViewer::TTextScroller::ScrollText( + const TDesC& aSrcText, + TDes& aDesText ) +{ + MPX_ENTER_EXIT( _L( "CMPXVideoPlaybackMediaDetailsViewer::TTextScroller::ScrollText" ) ); + + if ( 0 == iSrcTextLen ) + { + iSrcTextLen = aSrcText.Length(); + } + + ASSERT( aSrcText.Length() == iSrcTextLen ); + if ( aSrcText.Length() >= KMediaDetailsViewerVisibleCharacters ) + { + aDesText.Append( aSrcText.Mid( iTextScrollPos, + KMediaDetailsViewerVisibleCharacters ) ); + + if ( iTextScrollPos == ( iSrcTextLen - KMediaDetailsViewerVisibleCharacters ) ) + { + iTextScrollPos = 0; + iDelay = ETrue; + } + else + { + iTextScrollPos++; + } + iScroll = ETrue; + + } + else + { + aDesText.Append( aSrcText ); + iScroll = EFalse; + } +} // End of File diff -r 112a725ff2c2 -r 8970fbd719ec videoplayback/videoplaybackcontrols/src/mpxvideoplaybackprogressbar.cpp --- a/videoplayback/videoplaybackcontrols/src/mpxvideoplaybackprogressbar.cpp Wed Mar 31 21:34:36 2010 +0300 +++ b/videoplayback/videoplaybackcontrols/src/mpxvideoplaybackprogressbar.cpp Wed Apr 14 15:59:50 2010 +0300 @@ -15,7 +15,7 @@ * */ -// Version : %version: e003sa33#19 % +// Version : %version: e003sa33#20 % // INCLUDE FILES @@ -860,6 +860,8 @@ { TPointerEvent event; event.iType = TPointerEvent::EButton1Up; + event.iPosition.iX = iSliderRect.iTl.iX; + MPX_TRAPD( err, HandlePointerEventL(event) ); } } diff -r 112a725ff2c2 -r 8970fbd719ec videoplayback/videoplaybackcontrols/src/mpxvideoplaybackvolumebar.cpp --- a/videoplayback/videoplaybackcontrols/src/mpxvideoplaybackvolumebar.cpp Wed Mar 31 21:34:36 2010 +0300 +++ b/videoplayback/videoplaybackcontrols/src/mpxvideoplaybackvolumebar.cpp Wed Apr 14 15:59:50 2010 +0300 @@ -15,7 +15,7 @@ * */ -// Version : %version: e003sa33#19 % +// Version : %version: e003sa33#20 % // INCLUDE FILES @@ -1004,7 +1004,11 @@ if ( iDragging != EVolumeNotDragging ) { - iDragging = EVolumeNotDragging; + TPointerEvent event; + event.iType = TPointerEvent::EButton1Up; + event.iPosition.iY = ( iSliderRect.iTl.iY + iSliderRect.iBr.iY ) / 2; + + MPX_TRAPD( err, HandlePointerEventL(event) ); } } diff -r 112a725ff2c2 -r 8970fbd719ec videoplayback/videoplaybackcontrols/tsrc/videoplaybackcontrols_test/bwins/ui_videoplaybackcontrolstestu.def --- a/videoplayback/videoplaybackcontrols/tsrc/videoplaybackcontrols_test/bwins/ui_videoplaybackcontrolstestu.def Wed Mar 31 21:34:36 2010 +0300 +++ b/videoplayback/videoplaybackcontrols/tsrc/videoplaybackcontrols_test/bwins/ui_videoplaybackcontrolstestu.def Wed Apr 14 15:59:50 2010 +0300 @@ -7,4 +7,5 @@ ?HandleEventL@CMPXVideoPlaybackControlsController@@QAEXW4TMPXVideoPlaybackControlCommandIds@@H@Z @ 6 NONAME ; void CMPXVideoPlaybackControlsController::HandleEventL(enum TMPXVideoPlaybackControlCommandIds, int) ?NewL@CMPXVideoPlaybackControlsController@@SAPAV1@PAVCMPXVideoPlaybackContainer@@VTRect@@PAVCMPXVideoPlaybackViewFileDetails@@@Z @ 7 NONAME ; class CMPXVideoPlaybackControlsController * CMPXVideoPlaybackControlsController::NewL(class CMPXVideoPlaybackContainer *, class TRect, class CMPXVideoPlaybackViewFileDetails *) ?GenerateFileNameL@CMPXVideoPlaybackViewFileDetails@@QAEPAVHBufC16@@XZ @ 8 NONAME ; class HBufC16 * CMPXVideoPlaybackViewFileDetails::GenerateFileNameL(void) + ?GenerateFileTitleL@CMPXVideoPlaybackViewFileDetails@@QAEPAVHBufC16@@XZ @ 9 NONAME ; class HBufC16 * CMPXVideoPlaybackViewFileDetails::GenerateFileTitleL(void) diff -r 112a725ff2c2 -r 8970fbd719ec videoplayback/videoplaybackcontrols/tsrc/videoplaybackcontrols_test/conf/ui_videoplaybackcontrolstest.cfg --- a/videoplayback/videoplaybackcontrols/tsrc/videoplaybackcontrols_test/conf/ui_videoplaybackcontrolstest.cfg Wed Mar 31 21:34:36 2010 +0300 +++ b/videoplayback/videoplaybackcontrols/tsrc/videoplaybackcontrols_test/conf/ui_videoplaybackcontrolstest.cfg Wed Apr 14 15:59:50 2010 +0300 @@ -857,4 +857,26 @@ pause 2000 [Endtest] +[Test] +title [36] Open Close Media Details Viewer (with empty title) +bringtoforeground +create ui_videoplaybackcontrolstest ControlsTest +ControlsTest CreateControls rtsp:\/\/10.41.2.3/h264/Video%20BitRate%2008%20-%2064/Meat%20Loaf%20-%20I%20would%20do%20anything%20for%20love.3gp EMPXVideoStreaming +pause 100 +ControlsTest AddEmptyTitleFileDetails +pause 100 +ControlsTest SetState EPbStatePlaying +pause 100 +ControlsTest ShowControls +pause 1000 +ControlsTest ShowMediaDetailsViewer +pause 3000 +ControlsTest CloseMediaDetailsViewer +pause 100 +ControlsTest DeleteControls +delete ControlsTest +sendtobackground +pause 2000 +[Endtest] + // End of file diff -r 112a725ff2c2 -r 8970fbd719ec videoplayback/videoplaybackcontrols/tsrc/videoplaybackcontrols_test/eabi/ui_videoplaybackcontrolstestu.def --- a/videoplayback/videoplaybackcontrols/tsrc/videoplaybackcontrols_test/eabi/ui_videoplaybackcontrolstestu.def Wed Mar 31 21:34:36 2010 +0300 +++ b/videoplayback/videoplaybackcontrols/tsrc/videoplaybackcontrols_test/eabi/ui_videoplaybackcontrolstestu.def Wed Apr 14 15:59:50 2010 +0300 @@ -37,4 +37,5 @@ _ZN32CMPXVideoPlaybackViewFileDetails17GenerateFileNameLEv @ 36 NONAME _ZTI35CMPXVideoPlaybackMediaDetailsViewer @ 37 NONAME _ZTV35CMPXVideoPlaybackMediaDetailsViewer @ 38 NONAME + _ZN32CMPXVideoPlaybackViewFileDetails18GenerateFileTitleLEv @ 39 NONAME diff -r 112a725ff2c2 -r 8970fbd719ec videoplayback/videoplaybackcontrols/tsrc/videoplaybackcontrols_test/group/videoplaybackcontrolstest.mmp --- a/videoplayback/videoplaybackcontrols/tsrc/videoplaybackcontrols_test/group/videoplaybackcontrolstest.mmp Wed Mar 31 21:34:36 2010 +0300 +++ b/videoplayback/videoplaybackcontrols/tsrc/videoplaybackcontrols_test/group/videoplaybackcontrolstest.mmp Wed Apr 14 15:59:50 2010 +0300 @@ -15,7 +15,7 @@ * */ -// Version : %version: 9 % +// Version : %version: e003sa33#10 % @@ -90,5 +90,6 @@ LIBRARY RemConInterfaceBase.lib LIBRARY RemConCoreApi.lib LIBRARY ecom.lib +LIBRARY inetprotutil.lib // End of File diff -r 112a725ff2c2 -r 8970fbd719ec videoplayback/videoplaybackcontrols/tsrc/videoplaybackcontrols_test/inc/mpxvpbc_stub.h --- a/videoplayback/videoplaybackcontrols/tsrc/videoplaybackcontrols_test/inc/mpxvpbc_stub.h Wed Mar 31 21:34:36 2010 +0300 +++ b/videoplayback/videoplaybackcontrols/tsrc/videoplaybackcontrols_test/inc/mpxvpbc_stub.h Wed Apr 14 15:59:50 2010 +0300 @@ -15,7 +15,7 @@ * */ -// Version : %version: e003sa33#10 % +// Version : %version: e003sa33#11 % @@ -117,6 +117,12 @@ */ void AddSameARFileDetailsL( TBool aHasVideoTrack = ETrue ); + /** + * Add file details with empty title + * and make sure aspect ratio equal to screen aspect ratio + */ + void AddEmptyTitleFileDetailsL( TBool aHasVideoTrack = ETrue ); + private: // Data TInt iCommand; diff -r 112a725ff2c2 -r 8970fbd719ec videoplayback/videoplaybackcontrols/tsrc/videoplaybackcontrols_test/inc/videoplaybackcontrolstest.h --- a/videoplayback/videoplaybackcontrols/tsrc/videoplaybackcontrols_test/inc/videoplaybackcontrolstest.h Wed Mar 31 21:34:36 2010 +0300 +++ b/videoplayback/videoplaybackcontrols/tsrc/videoplaybackcontrols_test/inc/videoplaybackcontrolstest.h Wed Apr 14 15:59:50 2010 +0300 @@ -15,7 +15,7 @@ * */ -// Version : %version: e003sa33#10 % +// Version : %version: e003sa33#11 % @@ -213,6 +213,12 @@ * @return symbian OS error code. */ virtual TInt AddSameARFileDetails(); + + /** + * Add empty title file details + * @return symbian OS error code. + */ + virtual TInt AddEmptyTitleFileDetailsL(); /** * Create controller diff -r 112a725ff2c2 -r 8970fbd719ec videoplayback/videoplaybackcontrols/tsrc/videoplaybackcontrols_test/src/mpxvpbc_stub.cpp --- a/videoplayback/videoplaybackcontrols/tsrc/videoplaybackcontrols_test/src/mpxvpbc_stub.cpp Wed Mar 31 21:34:36 2010 +0300 +++ b/videoplayback/videoplaybackcontrols/tsrc/videoplaybackcontrols_test/src/mpxvpbc_stub.cpp Wed Apr 14 15:59:50 2010 +0300 @@ -15,7 +15,7 @@ * */ -// Version : %version: e003sa33#14 % +// Version : %version: e003sa33#15 % // INCLUDES @@ -408,4 +408,34 @@ iControlsController->AddFileDetailsL( iFileDetails ); } +// +// ------------------------------------------------------------------------------------------------- +// CMPXVideoPlaybackContainer::AddEmptyTitleFileDetailsL() +// ------------------------------------------------------------------------------------------------- +// +void CMPXVideoPlaybackContainer::AddEmptyTitleFileDetailsL( TBool aHasVideoTrack ) +{ + MPX_DEBUG(_L("CMPXVideoPlaybackContainer::AddEmptyTitleFileDetailsL() ")); + + iFileDetails->iAudioEnabled = ETrue; + iFileDetails->iVideoEnabled = aHasVideoTrack; + iFileDetails->iSeekable = ETrue; + + if ( iFileDetails->iVideoEnabled ) + { + iFileDetails->iVideoHeight = 176; + iFileDetails->iVideoWidth = 144; + + iFileDetails->iBitRate = 8000; + iFileDetails->iMimeType = _L("video/3gp").Alloc(); + } + + if ( iFileDetails->iPlaybackMode == EMPXVideoLiveStreaming ) + { + iFileDetails->iSeekable = EFalse; + } + + iControlsController->AddFileDetailsL( iFileDetails ); +} + // End of File diff -r 112a725ff2c2 -r 8970fbd719ec videoplayback/videoplaybackcontrols/tsrc/videoplaybackcontrols_test/src/mpxvpbvfd_stub.cpp --- a/videoplayback/videoplaybackcontrols/tsrc/videoplaybackcontrols_test/src/mpxvpbvfd_stub.cpp Wed Mar 31 21:34:36 2010 +0300 +++ b/videoplayback/videoplaybackcontrols/tsrc/videoplaybackcontrols_test/src/mpxvpbvfd_stub.cpp Wed Apr 14 15:59:50 2010 +0300 @@ -15,13 +15,14 @@ * */ -// Version : %version: e003sa33#7 % +// Version : %version: e003sa33#8 % // // INCLUDE FILES // #include +#include #include "mpxvideo_debug.h" #include "mpxvideoplaybackviewfiledetails.h" @@ -116,4 +117,65 @@ return fileName; } +// ------------------------------------------------------------------------------------------------- +// CMPXVideoPlaybackViewFileDetails::GenerateFileTitleL +// ------------------------------------------------------------------------------------------------- +// +EXPORT_C HBufC* CMPXVideoPlaybackViewFileDetails::GenerateFileTitleL() +{ + MPX_ENTER_EXIT( _L( "CMPXVideoPlaybackViewFileDetails::GenerateFileTitleL()" ) ); + + HBufC* fileTitle = NULL; + + if ( iTitle && iTitle->Length() ) + { + // + // use file title in metadata as title cotent directly + // + fileTitle = iTitle->AllocL(); + } + else if ( ( EMPXVideoStreaming == iPlaybackMode || EMPXVideoLiveStreaming == iPlaybackMode ) && + iClipName && iClipName->Length() ) + { + // + // parse file name in URL + // + TUriParser parser; + + if ( parser.Parse( iClipName->Des() ) == KErrNone ) + { + + MPX_DEBUG( + _L( " streaming link: schema = %S, urihost = %S, uriPort = %S, uriPath = %S" ), + &( parser.Extract( EUriScheme ) ), + &( parser.Extract( EUriHost ) ), + &( parser.Extract( EUriPort ) ), + &( parser.Extract( EUriPath ) ) ); + + HBufC* nameAndTail = NULL; + + MPX_TRAPD( err, nameAndTail = parser.GetFileNameL( EUriFileNameTail ) ); + + if ( KErrNone == err && nameAndTail ) + { + CleanupStack::PushL( nameAndTail ); + TInt extPos = nameAndTail->Des().LocateReverse( KExtDelimiter ); + + if ( extPos > 0 ) + { + fileTitle = ( nameAndTail->Des().Left( extPos ) ).AllocL(); + } + else + { + fileTitle = nameAndTail->Des().AllocL(); + } + + CleanupStack::PopAndDestroy( nameAndTail ); + } + } + } + + return fileTitle; +} + // EOF diff -r 112a725ff2c2 -r 8970fbd719ec videoplayback/videoplaybackcontrols/tsrc/videoplaybackcontrols_test/src/videoplaybackcontrolstestblocks.cpp --- a/videoplayback/videoplaybackcontrols/tsrc/videoplaybackcontrols_test/src/videoplaybackcontrolstestblocks.cpp Wed Mar 31 21:34:36 2010 +0300 +++ b/videoplayback/videoplaybackcontrols/tsrc/videoplaybackcontrols_test/src/videoplaybackcontrolstestblocks.cpp Wed Apr 14 15:59:50 2010 +0300 @@ -15,7 +15,7 @@ * */ -// Version : %version: e003sa33#11 % +// Version : %version: e003sa33#12 % // [INCLUDE FILES] - do not remove @@ -72,6 +72,7 @@ ENTRY( "AddLongFileDetails", CVideoPlaybackControlsTest::AddLongFileDetails ), ENTRY( "AddAudioOnlyFileDetails", CVideoPlaybackControlsTest::AddAudioOnlyFileDetails ), ENTRY( "AddSameARFileDetails", CVideoPlaybackControlsTest::AddSameARFileDetails ), + ENTRY( "AddEmptyTitleFileDetails", CVideoPlaybackControlsTest::AddEmptyTitleFileDetailsL ), ENTRY( "SetDuration", CVideoPlaybackControlsTest::SetDuration ), ENTRY( "SoftkeyPressed", CVideoPlaybackControlsTest::SoftkeyPressed ), ENTRY( "ShowControls", CVideoPlaybackControlsTest::ShowControls ), @@ -512,6 +513,19 @@ } // ------------------------------------------------------------------------------------------------- +// CVideoPlaybackControlsTest::AddEmptyTitleFileDetails +// ------------------------------------------------------------------------------------------------- +// +TInt CVideoPlaybackControlsTest::AddEmptyTitleFileDetailsL() +{ + MPX_ENTER_EXIT( _L( "CVideoPlaybackControlsTest::AddEmptyTitleFileDetailsL()" ) ); + + MPX_TRAPD( result, iContainer->AddEmptyTitleFileDetailsL() ); + + return result; +} + +// ------------------------------------------------------------------------------------------------- // CVideoPlaybackControlsTest::ParseType // ------------------------------------------------------------------------------------------------- // diff -r 112a725ff2c2 -r 8970fbd719ec videoplayback/videoplaybackviews/bwins/mpxvideoplaybackviewsu.def --- a/videoplayback/videoplaybackviews/bwins/mpxvideoplaybackviewsu.def Wed Mar 31 21:34:36 2010 +0300 +++ b/videoplayback/videoplaybackviews/bwins/mpxvideoplaybackviewsu.def Wed Apr 14 15:59:50 2010 +0300 @@ -11,4 +11,5 @@ ?NewL@CMPXVideoPlaybackView@@SAPAV1@XZ @ 10 NONAME ; class CMPXVideoPlaybackView * CMPXVideoPlaybackView::NewL(void) ?DoHandleKeyEventL@CMPXVideoPlaybackContainer@@QAEXABUTKeyEvent@@W4TEventCode@@@Z @ 11 NONAME ; void CMPXVideoPlaybackContainer::DoHandleKeyEventL(struct TKeyEvent const &, enum TEventCode) ?GenerateFileNameL@CMPXVideoPlaybackViewFileDetails@@QAEPAVHBufC16@@XZ @ 12 NONAME ; class HBufC16 * CMPXVideoPlaybackViewFileDetails::GenerateFileNameL(void) + ?GenerateFileTitleL@CMPXVideoPlaybackViewFileDetails@@QAEPAVHBufC16@@XZ @ 13 NONAME ; class HBufC16 * CMPXVideoPlaybackViewFileDetails::GenerateFileTitleL(void) diff -r 112a725ff2c2 -r 8970fbd719ec videoplayback/videoplaybackviews/eabi/mpxvideoplaybackviewsu.def --- a/videoplayback/videoplaybackviews/eabi/mpxvideoplaybackviewsu.def Wed Mar 31 21:34:36 2010 +0300 +++ b/videoplayback/videoplaybackviews/eabi/mpxvideoplaybackviewsu.def Wed Apr 14 15:59:50 2010 +0300 @@ -21,4 +21,5 @@ _ZTI31CMPXVideoPlaybackDisplayHandler @ 20 NONAME ; ## _ZTV31CMPXVideoPlaybackDisplayHandler @ 21 NONAME ; ## _ZN32CMPXVideoPlaybackViewFileDetails17GenerateFileNameLEv @ 22 NONAME + _ZN32CMPXVideoPlaybackViewFileDetails18GenerateFileTitleLEv @ 23 NONAME diff -r 112a725ff2c2 -r 8970fbd719ec videoplayback/videoplaybackviews/group/mpxvideoplaybackviews.mmp --- a/videoplayback/videoplaybackviews/group/mpxvideoplaybackviews.mmp Wed Mar 31 21:34:36 2010 +0300 +++ b/videoplayback/videoplaybackviews/group/mpxvideoplaybackviews.mmp Wed Apr 14 15:59:50 2010 +0300 @@ -15,7 +15,7 @@ * */ -// Version : %version: ou1cpsw#15 % +// Version : %version: e003sa33#16 % #include @@ -82,7 +82,7 @@ LIBRARY mpfiledetailsdialog.lib LIBRARY sysutil.lib LIBRARY drmuihandling.lib - +LIBRARY inetprotutil.lib #ifdef SYMBIAN_BUILD_GCE LIBRARY mediaclientvideodisplay.lib diff -r 112a725ff2c2 -r 8970fbd719ec videoplayback/videoplaybackviews/src/mpxvideobaseplaybackview.cpp --- a/videoplayback/videoplaybackviews/src/mpxvideobaseplaybackview.cpp Wed Mar 31 21:34:36 2010 +0300 +++ b/videoplayback/videoplaybackviews/src/mpxvideobaseplaybackview.cpp Wed Apr 14 15:59:50 2010 +0300 @@ -16,7 +16,7 @@ */ -// Version : %version: 68 % +// Version : %version: e003sa33#71 % // Include Files @@ -67,7 +67,10 @@ #include "mpxvideo_debug.h" #include "mpxvideoplayercustomviewmsgconsts.h" -// Member Functions +// +// Set a constant for the information timeout of 5 seconds +// +const TInt KInformationNoteTimeout = 5000000; // ------------------------------------------------------------------------------------------------- // CMPXVideoBasePlaybackView::CMPXVideoBasePlaybackView() @@ -113,6 +116,8 @@ iCloseAO = CIdle::NewL( CActive::EPriorityStandard ); BaseConstructL( R_MPX_VIDEO_PLAYBACK_VIEW ); + + iAknEventMonitor = static_cast(CCoeEnv::Static()->AppUi())->EventMonitor(); } // ------------------------------------------------------------------------------------------------- @@ -456,6 +461,15 @@ } // + // Register for window visibility changes + // + iContainer->GetWindow().EnableVisibilityChangeEvents(); + + iKeyboardInFocus = ETrue; + iAknEventMonitor->Enable( ETrue ); + iAknEventMonitor->AddObserverL( this ); + + // // Deactivate the CBA set the LSK & RSK to empty // Cba()->SetCommandSetL( R_AVKON_SOFTKEYS_EMPTY ); @@ -493,6 +507,10 @@ // MPX_TRAPD( err, HandleCommandL( EMPXPbvCmdClose ) ); + iAknEventMonitor->Enable( EFalse ); + iAknEventMonitor->RemoveObserver( this ); + iKeyboardInFocus = EFalse; + // // Delete the display handler when the view is deactivated // @@ -533,8 +551,7 @@ } // ------------------------------------------------------------------------------------------------- -// From CAknView -// Foreground event handling function. +// CMPXVideoBasePlaybackView::HandleForegroundEventL() // ------------------------------------------------------------------------------------------------- // void CMPXVideoBasePlaybackView::HandleForegroundEventL( TBool aForeground ) @@ -542,31 +559,20 @@ MPX_ENTER_EXIT(_L("CMPXVideoBasePlaybackView::HandleForegroundEventL()"), _L("aForeground = %d"), aForeground ); - TMPXVideoPlaybackCommand videoCmd = EPbCmdHandleBackground; - if ( aForeground ) { - videoCmd = EPbCmdHandleForeground; iContainer->HandleEventL( EMPXControlCmdHandleForegroundEvent ); + iKeyboardInFocus = ETrue; + + SendWindowCommandL( EPbCmdHandleForeground ); } else { iContainer->HandleEventL( EMPXControlCmdHandleBackgroundEvent ); - } - - // - // create command to pass to playback plugin - // - CMPXCommand* cmd = CMPXCommand::NewL(); - CleanupStack::PushL( cmd ); + iKeyboardInFocus = EFalse; - cmd->SetTObjectValueL( KMPXCommandGeneralDoSync, ETrue ); - cmd->SetTObjectValueL( KMPXCommandGeneralId, KMPXMediaIdVideoPlayback ); - cmd->SetTObjectValueL( KMPXMediaVideoPlaybackCommand, videoCmd ); - cmd->SetTObjectValueL( KMPXMediaVideoAppForeground, IsAppInFrontL() ); - - iPlaybackUtility->CommandL( *cmd ); - CleanupStack::PopAndDestroy( cmd ); + SendWindowCommandL( EPbCmdHandleBackground ); + } CAknView::HandleForegroundEventL( aForeground ); } @@ -873,6 +879,9 @@ { MPX_ENTER_EXIT(_L("CMPXVideoBasePlaybackView::HandleClosePlaybackViewL()")); + // Reset the playback state to stopped + iPlaybackState = EPbStateStopped; + if ( IsMultiItemPlaylist() ) { RemoveBackgroundSurfaceL(); @@ -1056,7 +1065,6 @@ } } - // ------------------------------------------------------------------------------------------------- // Handle playback error message. // ------------------------------------------------------------------------------------------------- @@ -1080,7 +1088,6 @@ MPX_ENTER_EXIT(_L("CMPXVideoBasePlaybackView::HandlePlaybackCommandComplete()")); } - // ------------------------------------------------------------------------------------------------- // CMPXVideoBasePlaybackView::ParseMetaDataL() // ------------------------------------------------------------------------------------------------- @@ -1377,9 +1384,6 @@ // Handle the plugin error HandlePluginErrorL( error ); - - // Reset the playback state to stopped - iPlaybackState = EPbStateStopped; } else { @@ -1480,6 +1484,7 @@ HBufC* text = StringLoader::LoadLC( aResourceId ); CAknInformationNote* dlg = new (ELeave) CAknInformationNote( aWaitingDialog ); + dlg->SetTimeout( (CAknNoteDialog::TTimeout) KInformationNoteTimeout ); dlg->ExecuteLD( *text ); CleanupStack::PopAndDestroy( text ); } @@ -1517,7 +1522,6 @@ iPlaybackUtility->CommandL( *aCmd ); } - // ------------------------------------------------------------------------------------------------- // CMPXVideoBasePlaybackView::ActivateClosePlayerActiveObject // ------------------------------------------------------------------------------------------------- @@ -1624,10 +1628,9 @@ } } -// --------------------------------------------------------------------------- -// CMPXVideoBasePlaybackView::IsAppInFrontL() -// Returns true if app is foreground. Uses windowgroup id -// --------------------------------------------------------------------------- +// ------------------------------------------------------------------------------------------------- +// CMPXVideoBasePlaybackView::IsAppInFrontL() +// ------------------------------------------------------------------------------------------------- // TBool CMPXVideoBasePlaybackView::IsAppInFrontL() { @@ -1642,15 +1645,14 @@ CArrayFixFlat* wgList = new (ELeave) CArrayFixFlat( wsSession.NumWindowGroups() ); - // check if our window is front or not if ( wsSession.WindowGroupList( 0, wgList ) == KErrNone ) { + // + // If this window group is at the start of the window group array, + // this application is in the front + // ret = ( iCoeEnv->RootWin().Identifier() == wgList->At(0) ); } - else - { - ret = EFalse; - } delete wgList; } @@ -2206,4 +2208,53 @@ } } +// ------------------------------------------------------------------------------------------------- +// CMPXVideoBasePlaybackView::HandleWsEventL() +// ------------------------------------------------------------------------------------------------- +// +void CMPXVideoBasePlaybackView::HandleWsEventL( const TWsEvent& aEvent, + CCoeControl* /*aDestination*/ ) +{ + // + // Fg/Bg events aren't received when the view has lost keyboard focus + // If we are sent to full background, sent a background command to the playback plugin + // + if ( ! iKeyboardInFocus && aEvent.Type() == EEventWindowVisibilityChanged ) + { + MPX_DEBUG(_L("CMpxVideoPlayerAppUi::HandleWsEventL() EEventWindowVisibilityChanged")); + + TUint visible = aEvent.VisibilityChanged()->iFlags; + + if ( visible & TWsVisibilityChangedEvent::ENotVisible ) + { + MPX_DEBUG(_L("CMpxVideoPlayerAppUi::HandleWsEventL() ENotVisible")); + SendWindowCommandL( EPbCmdHandleBackground ); + } + } +} + +// ------------------------------------------------------------------------------------------------- +// CMPXVideoBasePlaybackView::SendWindowCommandL() +// ------------------------------------------------------------------------------------------------- +// +void CMPXVideoBasePlaybackView::SendWindowCommandL( TMPXVideoPlaybackCommand aCmd ) +{ + MPX_ENTER_EXIT(_L("CMpxVideoPlayerAppUi::SendWindowCommandL()"), + _L("aCmd = %d"), aCmd ); + + // + // create command to pass to playback plugin + // + CMPXCommand* cmd = CMPXCommand::NewL(); + CleanupStack::PushL( cmd ); + + cmd->SetTObjectValueL( KMPXCommandGeneralDoSync, ETrue ); + cmd->SetTObjectValueL( KMPXCommandGeneralId, KMPXMediaIdVideoPlayback ); + cmd->SetTObjectValueL( KMPXMediaVideoPlaybackCommand, aCmd ); + cmd->SetTObjectValueL( KMPXMediaVideoAppForeground, IsAppInFrontL() ); + + iPlaybackUtility->CommandL( *cmd ); + CleanupStack::PopAndDestroy( cmd ); +} + // EOF diff -r 112a725ff2c2 -r 8970fbd719ec videoplayback/videoplaybackviews/src/mpxvideoplaybackuserinputhandler.cpp --- a/videoplayback/videoplaybackviews/src/mpxvideoplaybackuserinputhandler.cpp Wed Mar 31 21:34:36 2010 +0300 +++ b/videoplayback/videoplaybackviews/src/mpxvideoplaybackuserinputhandler.cpp Wed Apr 14 15:59:50 2010 +0300 @@ -15,7 +15,7 @@ * */ -// Version : %version: ou1cpsw#16 % +// Version : %version: 17 % // INCLUDE FILES @@ -72,7 +72,7 @@ CMPXVideoPlaybackUserInputHandler* CMPXVideoPlaybackUserInputHandler::NewL( CMPXVideoPlaybackContainer* aContainer ) { - MPX_DEBUG(_L("CMPXVideoPlaybackUserInputHandler::NewL()")); + MPX_ENTER_EXIT(_L("CMPXVideoPlaybackUserInputHandler::NewL()")); CMPXVideoPlaybackUserInputHandler* self = new (ELeave) CMPXVideoPlaybackUserInputHandler( aContainer ); @@ -109,6 +109,8 @@ // CMPXVideoPlaybackUserInputHandler::~CMPXVideoPlaybackUserInputHandler() { + MPX_ENTER_EXIT(_L("CMPXVideoPlaybackUserInputHandler::~CMPXVideoPlaybackUserInputHandler()")); + if ( iVolumeRepeatTimer ) { iVolumeRepeatTimer->Cancel(); @@ -122,7 +124,6 @@ iCoreTarget = NULL; iInterfaceSelector = NULL; } - } // ------------------------------------------------------------------------------------------------- @@ -136,21 +137,19 @@ _L("CMPXVideoPlaybackUserInputHandler::MrccatoPlay"), _L("aButtonAct = %d"), aButtonAct ); - ProcessMediaKey(ERemConCoreApiPlay, aButtonAct); + ProcessMediaKey( ERemConCoreApiPlay, aButtonAct ); } // ------------------------------------------------------------------------------------------------- // CMPXVideoPlaybackUserInputHandler::MrccatoCommand() // ------------------------------------------------------------------------------------------------- // -void CMPXVideoPlaybackUserInputHandler::MrccatoCommand(TRemConCoreApiOperationId aOperationId, - TRemConCoreApiButtonAction aButtonAct ) +void CMPXVideoPlaybackUserInputHandler::MrccatoCommand( TRemConCoreApiOperationId aOperationId, + TRemConCoreApiButtonAction aButtonAct ) { - MPX_ENTER_EXIT( - _L("CMPXVideoPlaybackUserInputHandler::MrccatoCommand"), - _L("aButtonAct = %d"), aButtonAct ); + MPX_ENTER_EXIT(_L("CMPXVideoPlaybackUserInputHandler::MrccatoCommand")); - ProcessMediaKey(aOperationId, aButtonAct); + ProcessMediaKey( aOperationId, aButtonAct ); } // ------------------------------------------------------------------------------------------------- @@ -160,7 +159,8 @@ void CMPXVideoPlaybackUserInputHandler::DoHandleMediaKey( TRemConCoreApiOperationId aOperationId, TRemConCoreApiButtonAction aButtonAct ) { - MPX_ENTER_EXIT(_L("CMPXVideoPlaybackUserInputHandler::DoHandleMediaKey()")); + MPX_ENTER_EXIT(_L("CMPXVideoPlaybackUserInputHandler::DoHandleMediaKey()"), + _L("aOperationId = %d"), aOperationId ); switch ( aOperationId ) { @@ -178,47 +178,45 @@ } case ERemConCoreApiRewind: { - HandleRewind(aButtonAct); + HandleRewind( aButtonAct ); break; } case ERemConCoreApiFastForward: { - HandleFastForward(aButtonAct); + HandleFastForward( aButtonAct ); break; } case ERemConCoreApiVolumeUp: { - HandleVolumeUp(aButtonAct); + HandleVolumeUp( aButtonAct ); break; } case ERemConCoreApiVolumeDown: { - HandleVolumeDown(aButtonAct); + HandleVolumeDown( aButtonAct ); break; } case ERemConCoreApiPausePlayFunction: { if ( aButtonAct == ERemConCoreApiButtonClick ) { - TRAP_IGNORE(iContainer->HandleCommandL(EMPXPbvCmdPlayPause)); + TRAP_IGNORE(iContainer->HandleCommandL( EMPXPbvCmdPlayPause )); } break; } case ERemConCoreApiPause: { - TRAP_IGNORE(iContainer->HandleCommandL(EMPXPbvCmdPause)); + TRAP_IGNORE( iContainer->HandleCommandL(EMPXPbvCmdPause) ); break; } case ERemConCoreApiPlay: { if ( aButtonAct == ERemConCoreApiButtonClick ) { - TRAP_IGNORE(iContainer->HandleCommandL(EMPXPbvCmdPlay)); + TRAP_IGNORE( iContainer->HandleCommandL( EMPXPbvCmdPlay ) ); } break; } - default: - break; } } @@ -226,15 +224,17 @@ // CMPXVideoPlaybackUserInputHandler::HandleFastForward() // ------------------------------------------------------------------------------------------------- // -void CMPXVideoPlaybackUserInputHandler::HandleFastForward(TRemConCoreApiButtonAction aButtonAct) +void CMPXVideoPlaybackUserInputHandler::HandleFastForward( TRemConCoreApiButtonAction aButtonAct ) { - if (aButtonAct == ERemConCoreApiButtonPress) + MPX_ENTER_EXIT(_L("CMPXVideoPlaybackUserInputHandler::HandleFastForward()")); + + if ( aButtonAct == ERemConCoreApiButtonPress ) { - TRAP_IGNORE(iContainer->HandleCommandL(EMPXPbvCmdSeekForward)); + TRAP_IGNORE( iContainer->HandleCommandL( EMPXPbvCmdSeekForward ) ); } - else if (aButtonAct == ERemConCoreApiButtonRelease) + else if ( aButtonAct == ERemConCoreApiButtonRelease ) { - TRAP_IGNORE(iContainer->HandleCommandL(EMPXPbvCmdEndSeek)); + TRAP_IGNORE( iContainer->HandleCommandL( EMPXPbvCmdEndSeek ) ); } } @@ -243,15 +243,17 @@ // CMPXVideoPlaybackUserInputHandler::HandleRewind() // ------------------------------------------------------------------------------------------------- // -void CMPXVideoPlaybackUserInputHandler::HandleRewind(TRemConCoreApiButtonAction aButtonAct) +void CMPXVideoPlaybackUserInputHandler::HandleRewind( TRemConCoreApiButtonAction aButtonAct ) { - if (aButtonAct == ERemConCoreApiButtonPress) + MPX_ENTER_EXIT(_L("CMPXVideoPlaybackUserInputHandler::HandleFastForward()")); + + if ( aButtonAct == ERemConCoreApiButtonPress ) { - TRAP_IGNORE(iContainer->HandleCommandL(EMPXPbvCmdSeekBackward)); + TRAP_IGNORE( iContainer->HandleCommandL( EMPXPbvCmdSeekBackward ) ); } - else if (aButtonAct == ERemConCoreApiButtonRelease) + else if ( aButtonAct == ERemConCoreApiButtonRelease ) { - TRAP_IGNORE(iContainer->HandleCommandL(EMPXPbvCmdEndSeek)); + TRAP_IGNORE( iContainer->HandleCommandL( EMPXPbvCmdEndSeek ) ); } } @@ -259,8 +261,11 @@ // CMPXVideoPlaybackUserInputHandler::HandleVolumeUp() // ------------------------------------------------------------------------------------------------- // -void CMPXVideoPlaybackUserInputHandler::HandleVolumeUp(TRemConCoreApiButtonAction aButtonAct) +void CMPXVideoPlaybackUserInputHandler::HandleVolumeUp( TRemConCoreApiButtonAction aButtonAct ) { + MPX_ENTER_EXIT(_L("CMPXVideoPlaybackUserInputHandler::HandleVolumeUp()"), + _L("aButtonAct = %d"), aButtonAct ); + switch ( aButtonAct ) { case ERemConCoreApiButtonPress: @@ -272,6 +277,7 @@ } iVolumeRepeatUp = ETrue; + iVolumeRepeatTimer->Start( KAknStandardKeyboardRepeatRate, KAknStandardKeyboardRepeatRate, @@ -301,8 +307,10 @@ // CMPXVideoPlaybackUserInputHandler::HandleVolumeDown() // ------------------------------------------------------------------------------------------------- // -void CMPXVideoPlaybackUserInputHandler::HandleVolumeDown(TRemConCoreApiButtonAction aButtonAct) +void CMPXVideoPlaybackUserInputHandler::HandleVolumeDown( TRemConCoreApiButtonAction aButtonAct ) { + MPX_ENTER_EXIT(_L("CMPXVideoPlaybackUserInputHandler::HandleVolumeDown()")); + switch ( aButtonAct ) { case ERemConCoreApiButtonPress: @@ -314,6 +322,7 @@ } iVolumeRepeatUp = EFalse; + iVolumeRepeatTimer->Start( KAknStandardKeyboardRepeatRate, KAknStandardKeyboardRepeatRate, @@ -348,25 +357,25 @@ const TPointerEvent& aPointerEvent, TMPXVideoControlType aMPXControl ) { - MPX_DEBUG(_L("CMPXVideoPlaybackUserInputHandler::ProcessPointerEvent")); + MPX_ENTER_EXIT(_L("CMPXVideoPlaybackUserInputHandler::ProcessPointerEvent()")); - switch (iProcessingInputType) + switch ( iProcessingInputType ) { case EMpxVideoNone: { - if (aPointerEvent.iType == TPointerEvent::EButton1Down && iForeground) + if ( aPointerEvent.iType == TPointerEvent::EButton1Down && iForeground ) { iProcessingInputType = EMpxVideoTouch; - ReRoutePointerEventL(aControl, aPointerEvent, aMPXControl); + ReRoutePointerEventL( aControl, aPointerEvent, aMPXControl ); } break; } case EMpxVideoTouch: { - if (aPointerEvent.iType != TPointerEvent::EButton1Down) + if ( aPointerEvent.iType != TPointerEvent::EButton1Down ) { - ReRoutePointerEventL(aControl, aPointerEvent, aMPXControl); + ReRoutePointerEventL( aControl, aPointerEvent, aMPXControl ); // reset the value only on pointer up event - but not on drag if ( aPointerEvent.iType == TPointerEvent::EButton1Up ) @@ -376,11 +385,6 @@ } break; } - default: - { - // user input is disallowed - break; - } } // switch } @@ -392,13 +396,13 @@ void CMPXVideoPlaybackUserInputHandler::ProcessKeyEventL( const TKeyEvent& aKeyEvent, TEventCode aType ) { - MPX_DEBUG(_L("MPXVideoPlaybackUserInputHandler::ProcessKeyEvent")); + MPX_ENTER_EXIT(_L("MPXVideoPlaybackUserInputHandler::ProcessKeyEvent()")); - switch (iProcessingInputType) + switch ( iProcessingInputType ) { case EMpxVideoNone: { - if (aType == EEventKeyDown && iForeground) + if ( aType == EEventKeyDown && iForeground ) { iProcessingInputType = EMpxVideoKeyboard; iLastPressedKeyCode = aKeyEvent.iCode; @@ -410,12 +414,12 @@ } case EMpxVideoKeyboard: { - if (aType == EEventKeyUp) + if ( aType == EEventKeyUp ) { // only handle up event for the key being handled // ignore spurious key presses - if (aKeyEvent.iCode == iLastPressedKeyCode && - aKeyEvent.iScanCode == iLastPressedKeyScanCode) + if ( aKeyEvent.iCode == iLastPressedKeyCode && + aKeyEvent.iScanCode == iLastPressedKeyScanCode ) { iContainer->DoHandleKeyEventL(aKeyEvent, aType); @@ -425,11 +429,6 @@ } break; } - default: - { - // user input is disallowed - break; - } } // switch } @@ -440,50 +439,51 @@ void CMPXVideoPlaybackUserInputHandler::ProcessMediaKey( TRemConCoreApiOperationId aOperationId, TRemConCoreApiButtonAction aButtonAct ) { - MPX_DEBUG(_L("CMPXVideoPlaybackUserInputHandler::ProcessMediaKey")); + MPX_ENTER_EXIT(_L("CMPXVideoPlaybackUserInputHandler::ProcessMediaKey()"), + _L("iProcessingInputType = %d, aButtonAct = %d"), + iProcessingInputType, aButtonAct ); switch ( iProcessingInputType ) { case EMpxVideoNone: { - if ( aButtonAct == ERemConCoreApiButtonPress && iForeground ) - { - iProcessingInputType = EMpxVideoMediaKeys; - iLastMediaKeyPressed = aOperationId; - DoHandleMediaKey(aOperationId, aButtonAct); - } - else if (aButtonAct == ERemConCoreApiButtonClick && iForeground) + if ( iForeground ) { - DoHandleMediaKey(aOperationId, aButtonAct); - // reset on click AND/OR release - iProcessingInputType = EMpxVideoNone; - } - break; - } - case EMpxVideoMediaKeys: - { - if (aButtonAct == ERemConCoreApiButtonRelease) - { - // handle only if this release is for media-key being currently handled - // ignore spurious media key presses - if (iLastMediaKeyPressed == aOperationId) + if ( aButtonAct == ERemConCoreApiButtonPress ) { - DoHandleMediaKey(aOperationId, aButtonAct); + iProcessingInputType = EMpxVideoMediaKeys; + iLastMediaKeyPressed = aOperationId; + DoHandleMediaKey( aOperationId, aButtonAct ); + } + else if ( aButtonAct == ERemConCoreApiButtonClick ) + { + DoHandleMediaKey( aOperationId, aButtonAct ); // reset on click AND/OR release iProcessingInputType = EMpxVideoNone; } } break; } - default: + case EMpxVideoMediaKeys: { - // user input is disallowed + if ( aButtonAct == ERemConCoreApiButtonRelease ) + { + // + // Handle only if this release is for media-key being currently handled + // Ignore spurious media key presses + // + if ( iLastMediaKeyPressed == aOperationId ) + { + DoHandleMediaKey( aOperationId, aButtonAct ); + + iProcessingInputType = EMpxVideoNone; + } + } break; } } // switch } - // ------------------------------------------------------------------------------------------------- // CMPXVideoPlaybackUserInputHandler::HandleVolumeRepeatTimeoutL() // ------------------------------------------------------------------------------------------------- @@ -503,7 +503,7 @@ // void CMPXVideoPlaybackUserInputHandler::HandleVolumeRepeatL() { - MPX_DEBUG(_L("CMPXVideoPlaybackUserInputHandler::HandleVolumeRepeatL()")); + MPX_ENTER_EXIT(_L("CMPXVideoPlaybackUserInputHandler::HandleVolumeRepeatL()")); TMPXVideoPlaybackViewCommandIds command = EMPXPbvCmdDecreaseVolume; @@ -520,11 +520,11 @@ // CMPXVideoPlaybackUserInputHandler::ReRoutePointerEventL() // ------------------------------------------------------------------------------------------------- // -void CMPXVideoPlaybackUserInputHandler::ReRoutePointerEventL(CCoeControl* aControl, - const TPointerEvent& aPointerEvent, - TMPXVideoControlType aMPXControl) +void CMPXVideoPlaybackUserInputHandler::ReRoutePointerEventL( CCoeControl* aControl, + const TPointerEvent& aPointerEvent, + TMPXVideoControlType aMPXControl ) { - MPX_DEBUG(_L("CMPXVideoPlaybackUserInputHandler::ReRoutePointerEventL()")); + MPX_ENTER_EXIT(_L("CMPXVideoPlaybackUserInputHandler::ReRoutePointerEventL()")); if ( aMPXControl == EMpxVideoPlaybackContainer ) { @@ -540,14 +540,25 @@ // CMPXVideoPlaybackUserInputHandler::SetForeground() // ------------------------------------------------------------------------------------------------- // -void CMPXVideoPlaybackUserInputHandler::SetForeground(TBool aForeground) +void CMPXVideoPlaybackUserInputHandler::SetForeground( TBool aForeground ) { + MPX_ENTER_EXIT(_L("CMPXVideoPlaybackUserInputHandler::SetForeground()"), + _L("aForeground = %d"), aForeground ); + iForeground = aForeground; - if ( !iForeground ) + if ( ! iForeground ) { - // we are in background so reset iProcessingInputType value + // + // Keyboard focus has been lost + // Reset input type and clear volume timer if necessary + // iProcessingInputType = EMpxVideoNone; + + if ( iVolumeRepeatTimer->IsActive() ) + { + iVolumeRepeatTimer->Cancel(); + } } } diff -r 112a725ff2c2 -r 8970fbd719ec videoplayback/videoplaybackviews/src/mpxvideoplaybackviewfiledetails.cpp --- a/videoplayback/videoplaybackviews/src/mpxvideoplaybackviewfiledetails.cpp Wed Mar 31 21:34:36 2010 +0300 +++ b/videoplayback/videoplaybackviews/src/mpxvideoplaybackviewfiledetails.cpp Wed Apr 14 15:59:50 2010 +0300 @@ -15,13 +15,14 @@ * */ -// Version : %version: 10 % +// Version : %version: e003sa33#11 % // // INCLUDE FILES // #include +#include #include "mpxvideo_debug.h" #include "mpxvideoplaybackviewfiledetails.h" @@ -126,4 +127,65 @@ return fileName; } +// ------------------------------------------------------------------------------------------------- +// CMPXVideoPlaybackViewFileDetails::GenerateFileTitleL +// ------------------------------------------------------------------------------------------------- +// +EXPORT_C HBufC* CMPXVideoPlaybackViewFileDetails::GenerateFileTitleL() +{ + MPX_ENTER_EXIT( _L( "CMPXVideoPlaybackViewFileDetails::GenerateFileTitleL()" ) ); + + HBufC* fileTitle = NULL; + + if ( iTitle && iTitle->Length() ) + { + // + // use file title in metadata as title cotent directly + // + fileTitle = iTitle->AllocL(); + } + else if ( ( EMPXVideoStreaming == iPlaybackMode || EMPXVideoLiveStreaming == iPlaybackMode ) && + iClipName && iClipName->Length() ) + { + // + // parse file name in URL + // + TUriParser parser; + + if ( parser.Parse( iClipName->Des() ) == KErrNone ) + { + + MPX_DEBUG( + _L( " streaming link: schema = %S, urihost = %S, uriPort = %S, uriPath = %S" ), + &( parser.Extract( EUriScheme ) ), + &( parser.Extract( EUriHost ) ), + &( parser.Extract( EUriPort ) ), + &( parser.Extract( EUriPath ) ) ); + + HBufC* nameAndTail = NULL; + + MPX_TRAPD( err, nameAndTail = parser.GetFileNameL( EUriFileNameTail ) ); + + if ( KErrNone == err && nameAndTail ) + { + CleanupStack::PushL( nameAndTail ); + TInt extPos = nameAndTail->Des().LocateReverse( KExtDelimiter ); + + if ( extPos > 0 ) + { + fileTitle = ( nameAndTail->Des().Left( extPos ) ).AllocL(); + } + else + { + fileTitle = nameAndTail->Des().AllocL(); + } + + CleanupStack::PopAndDestroy( nameAndTail ); + } + } + } + + return fileTitle; +} + // EOF