videocollection/hgmyvideos/src/vcxhgmyvideosvideomodelhandler.cpp
branchRCL_3
changeset 57 befca0ec475f
child 64 3eb824b18d67
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/videocollection/hgmyvideos/src/vcxhgmyvideosvideomodelhandler.cpp	Wed Sep 01 12:30:28 2010 +0100
@@ -0,0 +1,1419 @@
+/*
+* Copyright (c) 2008-2010 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:      UI level handler for video data.*
+*/
+
+
+
+
+// INCLUDE FILES
+#include <StringLoader.h>
+#include <mpxmediageneraldefs.h>
+#include <mpxmediageneralextdefs.h>
+#include <mpxmedia.h>
+#include <mpxmediaarray.h>
+
+#include <ganes/HgScroller.h>
+#include <ganes/HgItem.h>
+
+#include <vcxhgmyvideos.rsg>
+#include <vcxmyvideosdefs.h>
+#include <MPFileDetailsDialog.h>
+#include <myvideosindicator.h>
+#include <centralrepository.h>
+
+#include "IptvDebug.h"
+
+#include "vcxhgmyvideosmodel.h"
+#include "vcxhgmyvideosmainview.h"
+#include "vcxhgmyvideoscollectionclient.h"
+#include "vcxhgmyvideosvideomodelhandler.h"
+#include "vcxhgmyvideosvideolistimpl.h"
+#include "vcxhgmyvideosvideodataupdater.h"
+
+#include "vcxhgmyvideos.hrh"
+#include "vcxhgmyvideoslistbase.h"
+#include "vcxhgmyvideosindicatorhelper.h"
+#include "vcxhgmyvideosvideodetailsdialog.h"
+#include "vcxhgmyvideosvideolist.h"
+#include "vcxhgmyvideospanics.h"
+
+// CONSTANTS
+const TUint KVcxSecondsInMinute( 60 );
+const TUint KVcxSecondsInHour( 3600 );
+const TUint KVcxVideoSizeGB( 0x40000000 );
+const TUint KVcxVideoSizeHalfGB( 0x20000000 );
+const TUint KVcxVideoSizeMB( 0x100000 );
+const TUint KVcxVideoSizeHalfMB( 0x80000 );
+const TUint KVcxVideoSizeKB( 0x400 );
+const TUint KVcxVideoSizeHalfKB( 0x200 ); 
+
+const TUint KHgBufferSize( 250 );
+const TUint KHgBufferTreshold( 50 );
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CVcxHgMyVideosVideoModelHandler::NewL()
+// -----------------------------------------------------------------------------
+//
+CVcxHgMyVideosVideoModelHandler* CVcxHgMyVideosVideoModelHandler::NewL( 
+        CVcxHgMyVideosVideoListImpl& aVideoListImpl,
+        CVcxHgMyVideosModel& aModel,
+        CVcxHgMyVideosMainView& aView,
+        CHgScroller& aScroller )        
+    {
+    CVcxHgMyVideosVideoModelHandler* self = 
+        CVcxHgMyVideosVideoModelHandler::NewLC( 
+            aVideoListImpl, aModel, aView, aScroller );
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+// CVcxHgMyVideosVideoModelHandler::NewLC()
+// -----------------------------------------------------------------------------
+//
+CVcxHgMyVideosVideoModelHandler* CVcxHgMyVideosVideoModelHandler::NewLC(
+        CVcxHgMyVideosVideoListImpl& aVideoListImpl,
+        CVcxHgMyVideosModel& aModel,
+        CVcxHgMyVideosMainView& aView,
+        CHgScroller& aScroller )        
+    {
+    CVcxHgMyVideosVideoModelHandler* self = 
+        new (ELeave) CVcxHgMyVideosVideoModelHandler( 
+            aVideoListImpl, aModel, aView, aScroller );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+// Constructor
+// -----------------------------------------------------------------------------
+//
+CVcxHgMyVideosVideoModelHandler::CVcxHgMyVideosVideoModelHandler(
+        CVcxHgMyVideosVideoListImpl& aVideoListImpl,
+        CVcxHgMyVideosModel& aModel,
+        CVcxHgMyVideosMainView& aView,
+        CHgScroller& aScroller )
+    : iVideoListImpl( aVideoListImpl ),
+      iModel( aModel ),
+      iView( aView ),
+      iScroller( aScroller ),
+      iCurrentCategoryIndex( KErrNotFound ),
+      iRestoreListPosition( EFalse )
+    {
+    }
+
+// -----------------------------------------------------------------------------
+// CVcxHgMyVideosVideoModelHandler::ConstructL()
+// -----------------------------------------------------------------------------
+//
+void CVcxHgMyVideosVideoModelHandler::ConstructL()
+    {
+    iVideoArray = CVcxHgMyVideosVideoList::NewL();
+
+    iVideoIndicator = CMyVideosIndicator::NewL();
+
+    iDataUpdater = CVcxHgMyVideosVideoDataUpdater::NewL( iModel,
+                                                         iScroller,                                                        
+                                                         *iVideoArray,
+                                                         *iVideoIndicator );
+
+    }
+
+// -----------------------------------------------------------------------------
+// Destructor
+// -----------------------------------------------------------------------------
+//
+CVcxHgMyVideosVideoModelHandler::~CVcxHgMyVideosVideoModelHandler()
+    {
+    iMarkedMediaList.Close();
+    
+    delete iVideoDetails;
+    delete iVideoIndicator;
+    delete iDataUpdater;
+    delete iVideoArray;
+	delete iRepository;
+    }
+
+// -----------------------------------------------------------------------------
+// CVcxHgMyVideosVideoModelHandler::DoModelActivateL()
+// -----------------------------------------------------------------------------
+//
+void CVcxHgMyVideosVideoModelHandler::DoModelActivateL()
+    {
+    IPTVLOGSTRING_LOW_LEVEL( 
+        "MPX My Videos UI # CVcxHgMyVideosVideoModelHandler::DoModelActivateL() - Enter" );
+    
+    iDataUpdater->SetPausedL( EFalse );
+    iModel.CollectionClient().SetVideoModelObserver( this );
+
+    // Set scroller strip type
+    TVcxMyVideosSortingOrder sortOrder = iModel.VideolistSortOrderL();
+    UpdateScrollbarTypeL( sortOrder );
+
+    // Set up scroll buffer
+    iScroller.EnableScrollBufferL( *this, KHgBufferSize, KHgBufferTreshold ); 
+    
+    IPTVLOGSTRING_LOW_LEVEL( 
+        "MPX My Videos UI # CVcxHgMyVideosVideoModelHandler::DoModelActivateL() - Exit" );    
+    }
+
+// -----------------------------------------------------------------------------
+// CVcxHgMyVideosVideoModelHandler::DoModelDeactivate()
+// -----------------------------------------------------------------------------
+//
+void CVcxHgMyVideosVideoModelHandler::DoModelDeactivate()
+    {
+    IPTVLOGSTRING_LOW_LEVEL( 
+        "MPX My Videos UI # CVcxHgMyVideosVideoModelHandler::DoModelDeactivate() - Enter" );
+    
+    TRAP_IGNORE( iDataUpdater->SetPausedL( ETrue ) );
+    iModel.CollectionClient().SetVideoModelObserver( NULL );
+    iScroller.DisableScrollBuffer();
+
+    TRAP_IGNORE( SaveFirstListItemIdL() );
+
+    IPTVLOGSTRING_LOW_LEVEL( 
+        "MPX My Videos UI # CVcxHgMyVideosVideoModelHandler::DoModelDeactivate() - Exit" );    
+    }
+
+// -----------------------------------------------------------------------------
+// CVcxHgMyVideosVideoModelHandler::SaveFirstListItemIdL()
+// -----------------------------------------------------------------------------
+//
+void CVcxHgMyVideosVideoModelHandler::SaveFirstListItemIdL()
+    {
+    iFirstListItemId = iVideoArray->ArrayIndexToMpxItemIdL(
+            iScroller.FirstIndexOnScreen() );
+    }
+
+// -----------------------------------------------------------------------------
+// CVcxHgMyVideosVideoModelHandler::UpdateVideoListL()
+// -----------------------------------------------------------------------------
+//
+void CVcxHgMyVideosVideoModelHandler::UpdateVideoListL( TInt aCategoryIndex )
+    {
+    IPTVLOGSTRING_LOW_LEVEL( 
+        "MPX My Videos UI # CVcxHgMyVideosVideoModelHandler::UpdateVideoListL() - Enter" );
+
+    CVcxHgMyVideosCollectionClient& collectionClient = iModel.CollectionClient();
+
+    if ( aCategoryIndex == iCurrentCategoryIndex )
+        {
+        // If we are re-opening the same video list again, then try 
+        // restore the highlight to previous position.
+        iRestoreListPosition = ETrue;
+        }
+    else
+        {
+        iRestoreListPosition = EFalse;
+        
+        // Removes videos from video list.
+        iVideoArray->RemoveVideoList();
+        
+        // Removes videos from scroller. After this command, list highlight 
+        // disappears, so don't forget to set highlight in NewVideoListL() 
+        // function.
+        iScroller.Reset();
+        }
+        
+    // Ask for video list from MPX collection.
+    collectionClient.GetVideoListL( aCategoryIndex );
+
+    iCurrentCategoryIndex = aCategoryIndex;
+    
+    IPTVLOGSTRING_LOW_LEVEL( 
+        "MPX My Videos UI # CVcxHgMyVideosVideoModelHandler::UpdateVideoListL() - Exit" );    
+    }
+
+// -----------------------------------------------------------------------------
+// CVcxHgMyVideosVideoModelHandler::ResortVideoListL()
+// -----------------------------------------------------------------------------
+//
+void CVcxHgMyVideosVideoModelHandler::ResortVideoListL()
+    {    
+    IPTVLOGSTRING_LOW_LEVEL( 
+        "MPX My Videos UI # ResortVideoListL() - Enter" );
+        	
+    if ( iScroller.ItemCount() > 0 )
+        {
+        TVcxMyVideosSortingOrder sortOrder = iModel.VideolistSortOrderL();
+
+        if ( iVideoListImpl.IsMarking() )
+            {
+            SaveMarkingsL();
+            }
+
+        iVideoArray->ResortVideoListL( sortOrder );
+
+        TInt highlight = iScroller.SelectedIndex();
+        
+        ResetScrollerBufferAndItemsL();
+        
+        iScroller.SetSelectedIndex( highlight );
+        
+        iView.DynInitMskL();
+    	
+        if ( iVideoListImpl.IsMarking() )
+            {
+            RestoreMarkingsL();
+            }
+
+        // Switch to appropriate scroller strip
+        UpdateScrollbarTypeL( sortOrder );
+        }
+        IPTVLOGSTRING_LOW_LEVEL( 
+            "MPX My Videos UI # ResortVideoListL() - Exit" );
+    }
+
+// -----------------------------------------------------------------------------
+// CVcxHgMyVideosVideoModelHandler::Highlight()
+// -----------------------------------------------------------------------------
+//
+TInt CVcxHgMyVideosVideoModelHandler::Highlight()
+    {
+    return iScroller.SelectedIndex();
+    }
+
+// -----------------------------------------------------------------------------
+// CVcxHgMyVideosVideoModelHandler::VideoCount()
+// -----------------------------------------------------------------------------
+//
+TInt CVcxHgMyVideosVideoModelHandler::VideoCount()
+    {
+    return iScroller.ItemCount();
+    }
+
+// -----------------------------------------------------------------------------
+// CVcxHgMyVideosVideoModelHandler::CurrentCategoryIndex() 
+// -----------------------------------------------------------------------------
+//
+TInt CVcxHgMyVideosVideoModelHandler::CurrentCategoryIndex()
+    {
+    return iCurrentCategoryIndex;
+    }
+
+// -----------------------------------------------------------------------------
+// CVcxHgMyVideosVideoModelHandler::MarkedVideosL()
+// -----------------------------------------------------------------------------
+//
+void CVcxHgMyVideosVideoModelHandler::MarkedVideosL( 
+        RArray<TInt>& aMarkedVideos )
+    {
+    iScroller.GetMarkedItemsL( aMarkedVideos );
+    }
+
+// -----------------------------------------------------------------------------
+// CVcxHgMyVideosVideoModelHandler::HandleMarkCommandL()
+// -----------------------------------------------------------------------------
+//
+void CVcxHgMyVideosVideoModelHandler::HandleMarkCommandL( TInt aMarkCommand )
+    {
+    switch ( aMarkCommand )
+        {
+        case EVcxHgMyVideosCmdMark:
+            {
+            TInt highlight = Highlight();
+            iScroller.Mark( highlight );
+            iScroller.RefreshScreen( highlight );
+            }
+            break;
+        case EVcxHgMyVideosCmdUnmark:
+            {
+            TInt highlight = Highlight();
+            iScroller.UnMark( highlight );
+            iScroller.RefreshScreen( highlight );
+            }            
+            break;
+        case EVcxHgMyVideosCmdMarkAll:
+            {
+            iScroller.MarkAll();
+            }
+            break;
+        case EVcxHgMyVideosCmdUnmarkAll:
+            {
+            iScroller.UnMarkAll();
+            }
+            break;
+        default:
+            {
+            IPTVLOGSTRING_LOW_LEVEL( "MPX My Videos UI # HandleMarkCommandL - LEAVE: Invalid mark command" );
+            User::Leave( KErrNotSupported );
+            }
+            break;
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CVcxHgMyVideosVideoModelHandler::VideoAgeProfileL()
+// -----------------------------------------------------------------------------
+//
+TInt32 CVcxHgMyVideosVideoModelHandler::VideoAgeProfileL( TInt aIndex )
+    {
+    return VideoAgeProfileL( iVideoArray->MPXMedia( aIndex ) );
+    }
+
+// -----------------------------------------------------------------------------
+// CVcxHgMyVideosVideoModelHandler::VideoAgeProfileL()
+// -----------------------------------------------------------------------------
+//
+TInt32 CVcxHgMyVideosVideoModelHandler::VideoAgeProfileL( TMPXItemId aId )
+    {
+    return VideoAgeProfileL( iVideoArray->MPXMediaByMPXItemId( aId ) );
+    }
+
+// -----------------------------------------------------------------------------
+// CVcxHgMyVideosVideoModelHandler::VideoAgeProfileL()
+// -----------------------------------------------------------------------------
+//
+TInt32 CVcxHgMyVideosVideoModelHandler::VideoAgeProfileL( CMPXMedia* aMedia )
+    {
+    TInt32 ageProfile( 0 );
+
+    if ( aMedia )
+        {
+        if ( aMedia->IsSupported( KVcxMediaMyVideosAgeProfile ) )
+            {
+            ageProfile = aMedia->ValueTObjectL<TInt32>( KVcxMediaMyVideosAgeProfile );
+            }
+        }
+    
+    return ageProfile;
+    }
+
+// -----------------------------------------------------------------------------
+// CVcxHgMyVideosVideoModelHandler::FindVideoMpxIdL()
+// Tries to find MPX Item Id based on URI. Does not modify MPX Item Id's initial
+// value if video not found.
+// -----------------------------------------------------------------------------
+//
+TBool CVcxHgMyVideosVideoModelHandler::FindVideoMpxIdL( const TDesC& aVideoPath,
+                                                        TMPXItemId& aMpxItemId )
+    {
+    CMPXMedia* media = iVideoArray->MPXMediaByUri( aVideoPath );
+    if ( media )
+        {
+        if ( media->IsSupported( KMPXMediaGeneralId ) )
+            {
+            aMpxItemId = media->ValueTObjectL<TMPXItemId>( KMPXMediaGeneralId );
+            return ETrue;
+            }
+        }
+    return EFalse;
+    }
+
+// -----------------------------------------------------------------------------
+// CVcxHgMyVideosVideoModelHandler::ShowVideoDetailsDialogL()
+// -----------------------------------------------------------------------------
+//
+void CVcxHgMyVideosVideoModelHandler::ShowVideoDetailsDialogL()
+    {
+    TInt highlight = Highlight();
+    
+    if ( highlight != KErrNotFound )
+        {
+        TMPXItemId mpxItemId = iVideoArray->ArrayIndexToMpxItemIdL( highlight );
+        iModel.CollectionClient().GetVideoDetailsL( mpxItemId );        
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+//
+CMyVideosIndicator& CVcxHgMyVideosVideoModelHandler::VideoIndicator()
+    {
+    return *iVideoIndicator;
+    }
+
+// -----------------------------------------------------------------------------
+// CVcxHgMyVideosVideoModelHandler::GetVideoName()
+// -----------------------------------------------------------------------------
+//
+const TDesC& CVcxHgMyVideosVideoModelHandler::GetVideoName( TInt aId )
+    {
+    CMPXMedia* media = iVideoArray->MPXMediaByMPXItemId( TMPXItemId( aId, 0 ) );
+
+    if ( media && media->IsSupported( KMPXMediaGeneralTitle ) )
+        {
+        return media->ValueText( KMPXMediaGeneralTitle );
+        }
+    return KNullDesC;
+    }
+
+// -----------------------------------------------------------------------------
+// CVcxHgMyVideosVideoModelHandler::GetVideoUri()
+// -----------------------------------------------------------------------------
+//
+const TDesC& CVcxHgMyVideosVideoModelHandler::GetVideoUri( TInt aIndex )
+    {
+    CMPXMedia* media = iVideoArray->MPXMedia( aIndex );
+
+    if ( media && media->IsSupported( KMPXMediaGeneralUri ) )
+        {
+        return media->ValueText( KMPXMediaGeneralUri );
+        }
+    return KNullDesC;
+    }
+
+// -----------------------------------------------------------------------------
+// CVcxHgMyVideosVideoModelHandler::GetVideoId()
+// -----------------------------------------------------------------------------
+//
+TInt CVcxHgMyVideosVideoModelHandler::GetVideoId( TInt aIndex )
+    {
+    CMPXMedia* media = iVideoArray->MPXMedia( aIndex );
+
+    if ( media && media->IsSupported( KMPXMediaGeneralId ) )
+        {
+        return media->ValueTObjectL<TMPXItemId>( KMPXMediaGeneralId ).iId1;
+        }
+    
+    return KErrNotFound;
+    }
+
+// -----------------------------------------------------------------------------
+// CVcxHgMyVideosVideoModelHandler::GetVideoSize()
+// -----------------------------------------------------------------------------
+//
+TInt64 CVcxHgMyVideosVideoModelHandler::GetVideoSize( TInt aIndex )
+    {
+    CMPXMedia* media = iVideoArray->MPXMedia( aIndex );
+
+    if ( media && media->IsSupported( KMPXMediaGeneralExtSizeInt64 ) )
+        {
+        return media->ValueTObjectL<TInt64>( KMPXMediaGeneralExtSizeInt64 );
+        }
+    return 0;
+    }
+
+// -----------------------------------------------------------------------------
+// CVcxHgMyVideosVideoModelHandler::DeleteVideosL()
+// -----------------------------------------------------------------------------
+//
+void CVcxHgMyVideosVideoModelHandler::DeleteVideosL( 
+        const RArray<TInt>& aOperationTargets )
+    {
+    CMPXMedia* media = NULL;
+    TMPXItemId mpxItemId;
+    CMPXMedia* mediaToDelete = NULL;
+    CMPXMediaArray* mediasToDelete = CMPXMediaArray::NewL();
+    CleanupStack::PushL( mediasToDelete );
+
+    for ( TInt i = 0; i < aOperationTargets.Count(); i++ )
+        {
+        media = iVideoArray->MPXMediaByMPXItemId( TMPXItemId(aOperationTargets[i],0) );
+
+        if ( media && media->IsSupported( KMPXMediaGeneralId ) )
+            {
+            mpxItemId = media->ValueTObjectL<TMPXItemId>( KMPXMediaGeneralId );
+            mediaToDelete = CMPXMedia::NewL();
+            CleanupStack::PushL( mediaToDelete );
+            mediaToDelete->SetTObjectValueL( KMPXMediaGeneralId, mpxItemId );
+            mediasToDelete->AppendL( *mediaToDelete );
+            CleanupStack::PopAndDestroy( mediaToDelete );
+            iDataUpdater->PrepareForMoveOrDelete( mpxItemId );
+            }
+        }
+
+    if ( mediasToDelete->Count() <= 0 )
+        {
+		User::Leave( KErrNotFound );
+        }
+
+    TRAPD( err, iModel.CollectionClient().DeleteVideosL( mediasToDelete ) );
+    	
+    if ( err != KErrNone )
+        {
+        VideoDeletionCompletedL( aOperationTargets.Count(), mpxItemId );
+		if ( err != KErrNotReady )
+		    {
+			User::Leave( err );
+			}
+        }
+    CleanupStack::PopAndDestroy( mediasToDelete );
+    }
+
+// -----------------------------------------------------------------------------
+// CVcxHgMyVideosVideoModelHandler::MoveOrCopyVideosL()
+// -----------------------------------------------------------------------------
+//
+void CVcxHgMyVideosVideoModelHandler::MoveOrCopyVideosL( 
+        const RArray<TInt>& aOperationTargets,
+        TInt aTargetDrive,
+        TBool aCopy )
+    {
+    CMPXMedia* media = NULL;
+    TMPXItemId mpxItemId;
+    CMPXMedia* mediaToMoveOrCopy = NULL;
+    CMPXMediaArray* mediasToMoveOrCopy = CMPXMediaArray::NewL();
+    CleanupStack::PushL( mediasToMoveOrCopy );
+
+    for ( TInt i = 0; i < aOperationTargets.Count(); i++ )
+        {
+        media = iVideoArray->MPXMediaByMPXItemId( TMPXItemId(aOperationTargets[i],0) );
+                    
+        if ( media && media->IsSupported( KMPXMediaGeneralId ) )
+            {
+            mpxItemId = media->ValueTObjectL<TMPXItemId>( KMPXMediaGeneralId );
+            mediaToMoveOrCopy = CMPXMedia::NewL();
+            CleanupStack::PushL( mediaToMoveOrCopy );
+            mediaToMoveOrCopy->SetTObjectValueL( KMPXMediaGeneralId, mpxItemId );
+            mediasToMoveOrCopy->AppendL( *mediaToMoveOrCopy );
+            CleanupStack::PopAndDestroy( mediaToMoveOrCopy );
+            iDataUpdater->PrepareForMoveOrDelete( mpxItemId );
+            }
+        }
+
+    if ( mediasToMoveOrCopy->Count() <= 0 )
+        {
+		User::Leave( KErrNotFound );
+        }
+		
+    iModel.CollectionClient().MoveOrCopyVideosL( mediasToMoveOrCopy, aTargetDrive, aCopy );
+
+    CleanupStack::PopAndDestroy( mediasToMoveOrCopy );    
+    }
+
+// -----------------------------------------------------------------------------
+// CVcxHgMyVideosVideoModelHandler::PlayVideoL()
+// -----------------------------------------------------------------------------
+//
+void CVcxHgMyVideosVideoModelHandler::PlayVideoL( TInt aIndex )
+    {
+    CMPXMedia* media = iVideoArray->MPXMedia( aIndex );
+
+    if ( media && media->IsSupported( KMPXMediaGeneralId ) )
+        {
+        // Playback should be tried always when single clicking a video in My Videos
+        TMPXItemId mpxItemId = media->ValueTObjectL<TMPXItemId>( KMPXMediaGeneralId );
+        SetVideoLastWatchedL( *media );
+        ClearNewVideoFlagL( *media );
+		IPTVLOGSTRING3_LOW_LEVEL( "CVcxHgMyVideosVideoModelHandler::PlayVideoL() aIndex=%d mpxItemId=%d", aIndex, (TInt) mpxItemId );
+        iModel.CollectionClient().PlayVideoL( mpxItemId );        
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CVcxHgMyVideosVideoModelHandler::Release()
+// -----------------------------------------------------------------------------
+//
+void CVcxHgMyVideosVideoModelHandler::Release( TInt aReleaseStart, 
+                                               TInt aReleaseEnd )
+    {   
+    for ( TInt i = aReleaseStart; i <= aReleaseEnd; i++ )
+        {
+        TRAP_IGNORE( iDataUpdater->ReleaseData( iVideoArray->ArrayIndexToMpxItemIdL( i ) ) );
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CVcxHgMyVideosVideoModelHandler::Request()
+// -----------------------------------------------------------------------------
+//
+void CVcxHgMyVideosVideoModelHandler::Request( TInt aRequestStart, 
+                                               TInt aRequestEnd,
+                                               THgScrollDirection aDirection )
+    {
+    TRAP_IGNORE( HandleRequestL( aRequestStart, aRequestEnd, aDirection ) );
+    }
+
+// -----------------------------------------------------------------------------
+// CVcxHgMyVideosVideoModelHandler::HandleRequestL()
+// -----------------------------------------------------------------------------
+//
+void CVcxHgMyVideosVideoModelHandler::HandleRequestL( TInt aRequestStart, 
+                                                      TInt aRequestEnd,
+                                                      THgScrollDirection /*aDirection*/ )
+    {
+    IPTVLOGSTRING_LOW_LEVEL(
+        "MPX My Videos UI # CVcxHgMyVideosVideoModelHandler::HandleRequestL - Enter" );
+    
+    TInt videoCount = iVideoArray->VideoCount();
+    TInt requestStart = ( aRequestStart >= 0 ? aRequestStart : 0 );
+    TInt requestEnd = ( aRequestEnd < videoCount ? aRequestEnd : ( videoCount - 1 ) );
+    
+    IPTVLOGSTRING3_LOW_LEVEL(
+        "MPX My Videos UI # CVcxHgMyVideosVideoModelHandler::HandleRequestL - aRequestStart: %d, aRequestEnd: %d", requestStart, requestEnd );
+
+    TBool flushNeeded = EFalse;
+    for ( TInt i = requestStart; i <= requestEnd; i++ )
+        {
+        UpdateVideoListItemL( i );
+        iDataUpdater->AddToRequestBufferL( iVideoArray->ArrayIndexToMpxItemIdL( i ) );
+        flushNeeded = ETrue;
+        }
+    if ( flushNeeded )
+        {
+        iDataUpdater->FlushRequestBufferL();
+        }
+
+    iScroller.DrawDeferred();
+        
+    IPTVLOGSTRING_LOW_LEVEL( 
+        "MPX My Videos UI # CVcxHgMyVideosVideoModelHandler::HandleRequestL() - Exit" );    
+    }
+
+// -----------------------------------------------------------------------------
+// CVcxHgMyVideosVideoModelHandler::FormatVideoSecondRowLC()
+// -----------------------------------------------------------------------------
+// 
+HBufC* CVcxHgMyVideosVideoModelHandler::FormatVideoSecondRowLC( CMPXMedia& aMedia )
+
+    {
+    _LIT( KVcxSecondLineSeparator, "," );
+
+    HBufC* details = NULL;
+    HBufC* sizeStr = NULL;
+    HBufC* lengthStr = NULL;
+    TReal32 length( 0 );
+    TInt64 size( 0 );
+    TInt detailsSize( 0 );
+
+    // Use KMPXMediaGeneralDuration or KVcxMediaMyVideosDuration?
+    if ( aMedia.IsSupported( KVcxMediaMyVideosDuration ) )
+        {
+        length = *( aMedia.Value<TReal32>( KVcxMediaMyVideosDuration ) ); // In seconds
+        IPTVLOGSTRING2_LOW_LEVEL( "MPX My Videos UI # FormatVideoSecondRowCompletedLC() length=%f", length );
+        }
+
+    if ( aMedia.IsSupported( KMPXMediaGeneralExtSizeInt64 ) )
+        {
+        size = *( aMedia.Value<TInt64>( KMPXMediaGeneralExtSizeInt64 ) ); // In bytes
+        IPTVLOGSTRING2_LOW_LEVEL( "MPX My Videos UI # FormatVideoSecondRowCompletedLC() size=%ld", size );
+        }
+
+    if ( size > 0 )
+        {
+        TUint64 bytes = static_cast<TUint64>( size );
+        TUint64 dispSize = 0;
+
+        if ( bytes >= KVcxVideoSizeGB )
+            {
+            dispSize  = bytes + KVcxVideoSizeHalfGB;
+            dispSize /= KVcxVideoSizeGB;
+            sizeStr = StringLoader::LoadLC( R_VCXHGMYVIDEOS_SIZE_LIST_GB, dispSize );
+            }
+        else if ( bytes >= KVcxVideoSizeMB )
+            {
+            dispSize  = bytes + KVcxVideoSizeHalfMB;
+            dispSize /= KVcxVideoSizeMB;
+            sizeStr = StringLoader::LoadLC( R_VCXHGMYVIDEOS_SIZE_LIST_MB, dispSize );
+            }
+        else
+            {
+            dispSize  = bytes + KVcxVideoSizeHalfKB;
+            dispSize /= KVcxVideoSizeKB;
+            sizeStr = StringLoader::LoadLC( R_VCXHGMYVIDEOS_LIST_SIZE_KB, dispSize );
+            }
+        detailsSize += sizeStr->Length();
+        }
+    if ( length > 0 )
+        {
+        TUint total = static_cast<TUint>( length );
+        
+        TUint hours = total / KVcxSecondsInHour;
+        TUint minutes = total / KVcxSecondsInMinute % KVcxSecondsInMinute;
+        TUint seconds = total % KVcxSecondsInMinute;
+
+        if ( hours > 0 )
+            {
+            CArrayFix<TInt>* numbers = new (ELeave) CArrayFixFlat<TInt>(2);
+            CleanupStack::PushL( numbers );
+            numbers->AppendL( hours );
+            numbers->AppendL( minutes );
+            lengthStr = StringLoader::LoadL( R_VCXHGMYVIDEOS_VIDEO_LIST_LENGTH_H_MIN, *numbers );
+            CleanupStack::PopAndDestroy( numbers );
+            CleanupStack::PushL( lengthStr );
+            }
+        else if ( minutes > 0 )
+            {
+            CArrayFix<TInt>* numbers = new (ELeave) CArrayFixFlat<TInt>(2);
+            CleanupStack::PushL( numbers );
+            numbers->AppendL( minutes );
+            numbers->AppendL( seconds );
+            lengthStr = StringLoader::LoadL( R_VCXHGMYVIDEOS_VIDEO_LIST_LENGTH_MIN_SEC, *numbers );
+            CleanupStack::PopAndDestroy( numbers );
+            CleanupStack::PushL( lengthStr );
+            }
+        else
+            {
+            lengthStr = StringLoader::LoadLC( R_VCXHGMYVIDEOS_VIDEO_LIST_LENGTH_SEC, seconds ); 
+            }
+        detailsSize += lengthStr->Length();
+        }      
+
+    details = HBufC::NewL( detailsSize + KVcxSecondLineSeparator().Length() );
+    if ( lengthStr )
+        {
+        details->Des().Append( *lengthStr );
+        CleanupStack::PopAndDestroy( lengthStr );
+        }
+    if ( sizeStr )
+        {
+        if ( lengthStr ) // Add separator when both are available.
+            {
+            details->Des().Append( KVcxSecondLineSeparator );
+            }
+        details->Des().Append( *sizeStr );
+        CleanupStack::PopAndDestroy( sizeStr );
+        }
+
+    CleanupStack::PushL( details );
+    return details;
+    }
+
+// -----------------------------------------------------------------------------
+// CVcxHgMyVideosVideoModelHandler::ReplaceVideoArrayL()
+// -----------------------------------------------------------------------------
+// 
+void CVcxHgMyVideosVideoModelHandler::ReplaceVideoArrayL( CMPXMediaArray& aVideoList )
+    {
+    iVideoArray->ReplaceVideoListL( aVideoList );
+    iDataUpdater->InfoArrayChanged();
+    }
+
+// -----------------------------------------------------------------------------
+// CVcxHgMyVideosVideoModelHandler::UpdateVideoListItemL()
+// -----------------------------------------------------------------------------
+// 
+void CVcxHgMyVideosVideoModelHandler::UpdateVideoListItemL( TInt aListIndex )
+    {
+    IPTVLOGSTRING2_LOW_LEVEL( "CVcxHgMyVideosVideoModelHandler::UpdateVideoListItemL() ENTER list index = %d", aListIndex );
+
+    if ( aListIndex >= 0 && aListIndex < iScroller.ItemCount() )
+        {
+        TVcxHgMyVideosIndicatorHelper indicatorHelper;
+        CMPXMedia* media( NULL );
+        
+        media = iVideoArray->MPXMedia( aListIndex );
+
+        if ( media )
+            {           
+            CHgItem& item = iScroller.ItemL( aListIndex );
+            TBool isMarked = ( item.Flags() & CHgItem::EHgItemFlagMarked );
+            item.ClearFlags( item.Flags() );
+            
+            if ( media->IsSupported( KMPXMediaGeneralTitle ) )
+                {
+                HBufC* name( NULL );        
+                name = media->ValueText( KMPXMediaGeneralTitle ).AllocLC();
+                if ( name->Length() > 0 )
+                    {
+                    item.SetTitleL( *name );
+                    }
+                CleanupStack::PopAndDestroy( name );
+                }
+
+            HBufC* details( NULL );
+            
+            details = FormatVideoSecondRowLC( *media );
+            if ( details->Length() > 0 )
+                {
+                item.SetTextL( *details );
+                }
+            CleanupStack::PopAndDestroy( details );
+    
+            TBool isNewVideo( EFalse );
+            if ( media->IsSupported( KMPXMediaGeneralFlags ) )
+                {
+                if ( media->ValueTObjectL<TUint32>( KMPXMediaGeneralFlags ) &
+                     EVcxMyVideosVideoNew )
+                    {
+                    isNewVideo = ETrue;
+                    }
+                }
+            TInt indicator1( 0 );
+            TInt indicator2( 0 );            
+            
+            indicatorHelper.GetIndicatorsForVideoL(
+                iModel,
+                isNewVideo,
+                EFalse, // *Recordings*
+                media->ValueText( KMPXMediaGeneralUri ),
+                TVcxHgMyVideosIndicatorHelper::EIndicatorDrmStatusUnknown,
+                indicator1,
+                indicator2 );   
+            if ( indicator1 )
+                {
+                item.SetFlags( indicator1 );
+                }
+            if ( indicator2 )
+                {
+                item.SetFlags( indicator2 );
+                }
+            if ( isMarked )
+                {
+                item.SetFlags( CHgItem::EHgItemFlagMarked );
+                }
+            if ( item.Icon() && VideoIndicator().IsIndicatorShown( *media ) )
+                {
+                item.SetFlags( CHgItem::EHgItemFlagsIconOverlayIndicator );
+                }
+            if ( media->IsSupported( KMPXMediaGeneralDate ) )
+                {
+                TInt64 itemDate = media->ValueTObjectL<TInt64>( KMPXMediaGeneralDate );
+                item.SetTime( itemDate );
+                }    
+            }
+        }
+
+    IPTVLOGSTRING_LOW_LEVEL( "CVcxHgMyVideosVideoModelHandler::UpdateVideoListItemL() RETURN" );
+    }
+
+// -----------------------------------------------------------------------------
+// CVcxHgMyVideosVideoModelHandler::DeleteItemL()
+// -----------------------------------------------------------------------------
+// 
+void CVcxHgMyVideosVideoModelHandler::DeleteItemL( TMPXItemId aMpxItemId )
+    {
+    // Remove video from data updater.
+    iDataUpdater->ReleaseData( aMpxItemId );
+
+    // Remove video from video array.
+    TInt removedIndex = iVideoArray->RemoveVideo( aMpxItemId );
+    
+    if ( removedIndex != KErrNotFound )
+        {
+        // Remove item from the list.
+        iScroller.RemoveItem( removedIndex );
+        
+        if ( iScroller.ItemCount() > 0 )
+            {
+            TInt selectedIndex = iScroller.SelectedIndex();
+            
+            // Selected index number is greater than
+            // item count. Set the last item to be highlighted.
+            if ( selectedIndex >= iScroller.ItemCount() )
+                {
+                iScroller.SetSelectedIndex( iScroller.ItemCount() - 1 );
+                }
+            }
+        else
+            {
+            // Last item has deleted, set empty text and reset list.
+            iVideoListImpl.SetEmptyListTextByResourceL( R_VCXHGMYVIDEOS_NO_VIDEOS );
+            iScroller.Reset();
+
+            // End marking mode for empty list
+            if ( iVideoListImpl.IsMarking() )
+                {
+                iVideoListImpl.EndMarkingMode();
+                iView.DynInitRskL();
+                }
+            }
+
+        // fix for error where highlight was sometimes lost after delete. Problem is 
+        // that someone is 'stealing' keyboard focus from the scroller (probably the
+        // confirmation note, as user needs to clicks them to start the delete).
+        iScroller.SetFocus( ETrue ); 
+        
+        iScroller.DrawDeferred();
+        iView.DynInitMskL();
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CVcxHgMyVideosVideoModelHandler::InsertVideoL()
+// -----------------------------------------------------------------------------
+// 
+void CVcxHgMyVideosVideoModelHandler::InsertVideoL( CMPXMedia* aVideo )
+    {
+    if ( aVideo )
+        {		
+        if ( aVideo->IsSupported( KMPXMediaGeneralId ) )
+            {           
+            CleanupStack::PushL( aVideo );
+		    TMPXItemId itemId = aVideo->ValueTObjectL<TMPXItemId>( KMPXMediaGeneralId );
+            
+            // Get current sort order.
+            TVcxMyVideosSortingOrder sortOrder = iModel.VideolistSortOrderL();
+            
+            // Ownership of video item is transferred to video array.
+            CleanupStack::Pop( aVideo );
+            iVideoArray->AddToCorrectPlaceL( aVideo, sortOrder );
+            
+            TInt index = iVideoArray->IndexByMPXItemId( itemId );
+            
+            if ( index >= 0 )
+                {
+                // Create a new Hg list item. Ownership of list item  
+                // is transferred to scroller.
+                CHgItem* listItem = CHgItem::NewL();
+                iScroller.InsertItem( listItem, index );
+                            
+                if ( iScroller.SelectedIndex() == KErrNotFound )
+                    {
+                    iScroller.SetSelectedIndex( 0 );
+                    }    
+                UpdateVideoListItemL( index );
+                
+                // Update screen.
+                iScroller.DrawDeferred();
+                iView.DynInitMskL();
+                                                    
+                iDataUpdater->RequestDataL( itemId );    
+                }
+            }
+         else
+            {
+            delete aVideo;
+            }
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CVcxHgMyVideosVideoModelHandler::ValidOrigin()
+// -----------------------------------------------------------------------------
+// 
+TBool CVcxHgMyVideosVideoModelHandler::ValidOrigin( CMPXMedia& aMedia )
+    {
+    IPTVLOGSTRING_LOW_LEVEL( 
+        "MPX My Videos UI # ValidOrigin - Enter" );
+    
+    TBool isValid( EFalse );
+	
+    if ( aMedia.IsSupported( KVcxMediaMyVideosOrigin ) )
+        {
+        TUint8 mediaOrigin( EVcxMyVideosOriginOther );
+        mediaOrigin = aMedia.ValueTObjectL<TUint8>( KVcxMediaMyVideosOrigin );   
+		
+        // All videos
+        if ( CurrentCategoryIndex() == KVcxMvcCategoryIdAll )
+            {
+            IPTVLOGSTRING_LOW_LEVEL( 
+                "MPX My Videos UI # ValidOrigin - Origin: All" );
+            isValid = ETrue;
+            }
+        // Captured
+        else if ( CurrentCategoryIndex() == KVcxMvcCategoryIdCaptured && 
+                mediaOrigin == EVcxMyVideosOriginCapturedWithCamera )
+            {
+            IPTVLOGSTRING_LOW_LEVEL( 
+                "MPX My Videos UI # ValidOrigin - Origin: Captured" );
+            isValid = ETrue;
+            }
+        // Downloads
+        else if ( CurrentCategoryIndex() == KVcxMvcCategoryIdDownloads &&
+                mediaOrigin == EVcxMyVideosOriginDownloaded )
+            {
+            IPTVLOGSTRING_LOW_LEVEL( 
+                "MPX My Videos UI # ValidOrigin - Origin: Downloads" );    	
+            isValid = ETrue;
+            }
+        // Other
+        else if ( CurrentCategoryIndex() == KVcxMvcCategoryIdOther && 
+                ( mediaOrigin == EVcxMyVideosOriginSideLoaded ||
+                mediaOrigin == EVcxMyVideosOriginOther ) )
+            {
+            IPTVLOGSTRING_LOW_LEVEL( 
+                "MPX My Videos UI # ValidOrigin - Origin: Other" ); 
+            isValid = ETrue;
+            }
+        }
+    IPTVLOGSTRING2_LOW_LEVEL( 
+        "MPX My Videos UI # ValidOrigin, isValid %b - Exit", isValid );
+    return isValid;
+    }
+
+// -----------------------------------------------------------------------------
+// CVcxHgMyVideosVideoModelHandler::NewVideoListL()
+// MPX Collection calls this callback when video list is available.
+// -----------------------------------------------------------------------------
+// 
+void CVcxHgMyVideosVideoModelHandler::NewVideoListL( CMPXMediaArray& aVideoList )
+    {
+    IPTVLOGSTRING2_LOW_LEVEL( 
+        "MPX My Videos UI # NewVideoListL(count=%d) - Enter", aVideoList.Count() );
+        
+    TBool sameItems = iVideoArray->HasSameItemsL( aVideoList );
+    if ( !sameItems )
+        {
+        ReplaceVideoArrayL( aVideoList );
+        }
+    
+    TInt videoCount = iVideoArray->VideoCount();         
+    if (  videoCount > 0 )
+        {
+        if ( !sameItems )
+            {
+            ResizeScrollerL( videoCount );
+            }
+
+        TInt firstItemIndex( KErrNotFound );
+
+        if ( iRestoreListPosition )
+            {
+            firstItemIndex = iVideoArray->IndexByMPXItemId( iFirstListItemId );
+            }
+        
+        IPTVLOGSTRING2_LOW_LEVEL( "CVcxHgMyVideosVideoModelHandler::NewVideoListL() Setting list position first index = %d", firstItemIndex );
+        firstItemIndex != KErrNotFound ? iScroller.SetFirstIndexOnScreen( firstItemIndex ) :
+                                    iScroller.SetFirstIndexOnScreen( 0 );
+        }
+    else
+        {
+        ResizeScrollerL( videoCount );
+        iVideoListImpl.SetEmptyListTextByResourceL( R_VCXHGMYVIDEOS_NO_VIDEOS );
+        iScroller.Reset();
+        iScroller.DrawDeferred();
+        }        
+    iView.DynInitMskL();
+ 
+    IPTVLOGSTRING_LOW_LEVEL( "MPX My Videos UI # NewVideoListL() - Exit" );
+    }
+
+// -----------------------------------------------------------------------------
+// CVcxHgMyVideosVideoModelHandler::VideoListModifiedL()
+// MPX Collection calls this callback when the video list has been modified.
+// -----------------------------------------------------------------------------
+// 
+void CVcxHgMyVideosVideoModelHandler::VideoListModifiedL()
+    {
+    IPTVLOGSTRING2_LOW_LEVEL( 
+        "MPX My Videos UI # VideoListModifiedL(count=%d) - Enter", 
+        iVideoArray->VideoCount() );
+
+    TInt videoCount = iVideoArray->VideoCount();
+        
+    if ( iScroller.ItemCount() != videoCount )
+        {
+        iScroller.ResizeL( videoCount );
+        }
+        
+    if ( iScroller.ItemCount() > 0 )
+       {
+       iScroller.DrawDeferred();
+       }
+              
+    iView.DynInitMskL();       
+
+    IPTVLOGSTRING_LOW_LEVEL( 
+        "MPX My Videos UI # VideoListModifiedL() - Exit" );            
+    }
+
+// -----------------------------------------------------------------------------
+// CVcxHgMyVideosVideoModelHandler::VideoModifiedL()
+// MPX Collection calls this callback when single video item has been modified.
+// -----------------------------------------------------------------------------
+// 
+void CVcxHgMyVideosVideoModelHandler::VideoModifiedL( TMPXChangeEventType aEventType,
+                                                      TMPXItemId aMpxItemId,
+                                                      TInt32 aExtraInfo,
+                                                      TBool aSimulated )
+    {
+    IPTVLOGSTRING2_LOW_LEVEL( 
+        "MPX My Videos UI # VideoModifiedL(event=%d)", aEventType );
+        
+    switch ( aEventType )
+        {
+        case EMPXItemInserted:
+            {
+            if ( aMpxItemId.iId2 < 2 )
+                {
+                iModel.CollectionClient().FetchMpxMediaByMpxIdL( aMpxItemId );
+                }
+            }
+            break;
+            
+        case EMPXItemModified:
+            {
+            if ( aExtraInfo == EVcxMyVideosVideoListOrderChanged )
+                {
+                if ( aMpxItemId.iId1 == iCurrentCategoryIndex &&
+                     aMpxItemId.iId2 == 1 )
+                    {                    
+                    // Re-fetch current list completely, MMC card has 
+                    // removed or inserted.
+                    IPTVLOGSTRING_LOW_LEVEL( "MPX My Videos UI # VideoModifiedL - Re-fetching list" );
+                    iModel.CollectionClient().GetVideoListL( iCurrentCategoryIndex );
+                    }
+                }
+            else
+                {
+                TInt index = iVideoArray->IndexByMPXItemId( aMpxItemId );
+                if ( index != KErrNotFound )
+                    {
+                    UpdateVideoListItemL( index );              
+                    iScroller.RefreshScreen( index );
+                
+                    if ( ! aSimulated )
+                        {
+                        iDataUpdater->RequestDataL( aMpxItemId );    
+					    }                      
+                    iView.DynInitMskL();
+                    }
+                }
+            }
+            break;
+        
+        case EMPXItemDeleted:
+            {
+            if ( aMpxItemId.iId2 < 2 )
+                {
+                DeleteItemL( aMpxItemId );    
+                }
+            }
+            break;
+        
+        default:
+            {
+            IPTVLOGSTRING_LOW_LEVEL( 
+                "MPX My Videos UI # VideoModifiedL() Unexpected change!" );
+            #ifdef _DEBUG
+            User::Panic( KVcxHgMyVideosPanic, EVcxHgMyVideosPanicLogicalVideo );
+            #endif // _DEBUG            
+            }
+            break;
+        } 
+    }
+
+// -----------------------------------------------------------------------------
+// CVcxHgMyVideosVideoModelHandler::VideoFetchingCompletedL()
+// MPX Collection calls this callback when a single video has fetched.
+// -----------------------------------------------------------------------------
+// 
+void CVcxHgMyVideosVideoModelHandler::VideoFetchingCompletedL( CMPXMedia* aVideo )
+    {
+    if ( ValidOrigin( *aVideo ) )
+        {
+        // Ownership of video item is transferred.
+        InsertVideoL( aVideo );	
+        }
+    else
+        {
+        delete aVideo;
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CVcxHgMyVideosVideoModelHandler::VideoDeletionCompletedL()
+// MPX Collection calls this callback when deletion of multiple videos completes.
+// -----------------------------------------------------------------------------
+// 
+void CVcxHgMyVideosVideoModelHandler::VideoDeletionCompletedL( TInt aFailedCount,
+                                                               TMPXItemId aFailedMpxId )
+    {
+    CMPXMedia* media = iVideoArray->MPXMediaByMPXItemId( aFailedMpxId );
+
+    if ( aFailedCount == 1 && media && media->IsSupported( KMPXMediaGeneralTitle ) )
+        {
+        iVideoListImpl.VideoDeletionCompletedL( aFailedCount, 
+                                                media->ValueText( KMPXMediaGeneralTitle ) );
+        }
+    else
+        {
+        iVideoListImpl.VideoDeletionCompletedL( aFailedCount, 
+                                                KNullDesC );
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CVcxHgMyVideosVideoModelHandler::VideoMoveOrCopyCompletedL()
+// MPX Collection calls this callback when move or copy command is completed.
+// -----------------------------------------------------------------------------
+// 
+void CVcxHgMyVideosVideoModelHandler::VideoMoveOrCopyCompletedL( TInt aFailedCount,
+                                                                 TMPXItemId aFailedMpxId )
+    {
+    CMPXMedia* media = iVideoArray->MPXMediaByMPXItemId( aFailedMpxId );
+
+    if ( aFailedCount == 1 && media && media->IsSupported( KMPXMediaGeneralTitle ) )
+        {    
+        iVideoListImpl.VideoMoveOrCopyCompletedL( aFailedCount, 
+                                                  media->ValueText( KMPXMediaGeneralTitle ) );
+        }
+    else
+        {
+        iVideoListImpl.VideoMoveOrCopyCompletedL( aFailedCount, 
+                                                  KNullDesC );
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CVcxHgMyVideosVideoModelHandler::VideoDetailsCompletedL()
+// MPX Collection calls this callback when details fetching is completed.
+// -----------------------------------------------------------------------------
+// 
+void CVcxHgMyVideosVideoModelHandler::VideoDetailsCompletedL( const CMPXMedia& aMedia )
+    {
+    if ( !iVideoDetails )
+        {
+	    iVideoDetails = CVcxHgMyVideosVideoDetailsDialog::NewL();
+        }
+    iVideoDetails->ShowVideoDetailsDialogL( aMedia );
+    }
+
+// -----------------------------------------------------------------------------
+// CVcxHgMyVideosVideoModelHandler::UpdateScrollbarTypeL()
+// Update scrollbar strip type depending on sort order
+// -----------------------------------------------------------------------------
+// 
+void CVcxHgMyVideosVideoModelHandler::UpdateScrollbarTypeL( const TVcxMyVideosSortingOrder& aSortingOrder )
+    {
+    if ( EVcxMyVideosSortingName == aSortingOrder )
+        {
+        // First letter on strip
+        iScroller.SetScrollBarTypeL( CHgScroller::EHgScrollerLetterStripLite );        
+        }
+    else if ( EVcxMyVideosSortingCreationDate == aSortingOrder )
+        {
+        // Show date on strip
+        iScroller.SetScrollBarTypeL( CHgScroller::EHgScrollerTimeStrip );
+        }
+    else
+        {
+        // No strip
+        iScroller.SetScrollBarTypeL( CHgScroller::EHgScrollerScrollBar );
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CVcxHgMyVideosVideoModelHandler::ResetScrollerItemsL()
+// -----------------------------------------------------------------------------
+// 
+void CVcxHgMyVideosVideoModelHandler::ResetScrollerItemsL()
+    {
+    // Reset items for refetch
+    TInt count = iScroller.ItemCount();
+    for ( TInt i = 0; i < count; ++i )
+        {
+        iScroller.ItemL( i ).SetIcon( NULL );
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CVcxHgMyVideosVideoModelHandler::ResetScrollerBufferAndItemsL()
+// -----------------------------------------------------------------------------
+// 
+void CVcxHgMyVideosVideoModelHandler::ResetScrollerBufferAndItemsL()
+    {
+    // Reset scroll buffer and items for refetch
+    iScroller.DisableScrollBuffer();
+    iScroller.EnableScrollBufferL( *this, KHgBufferSize, KHgBufferTreshold );
+    ResetScrollerItemsL();
+    }
+
+// -----------------------------------------------------------------------------
+// CVcxHgMyVideosVideoModelHandler::ResizeScrollerL()
+// -----------------------------------------------------------------------------
+// 
+void CVcxHgMyVideosVideoModelHandler::ResizeScrollerL( TInt aNewItemCount )
+    {
+    if (iScroller.ItemCount() > 0)
+        {
+        // Reset scroller without time consuming scaling of icons never shown
+        iScroller.DisableScrollBuffer();
+        iScroller.ResizeL( aNewItemCount );
+        iScroller.EnableScrollBufferL( *this, KHgBufferSize, KHgBufferTreshold );
+        ResetScrollerItemsL();
+        }
+    else
+        {
+        // CHgScroller::Reset() was already called, no need to reset tricks
+        iScroller.ResizeL( aNewItemCount );
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CVcxHgMyVideosVideoModelHandler::SaveMarkingsL()
+// -----------------------------------------------------------------------------
+//
+void CVcxHgMyVideosVideoModelHandler::SaveMarkingsL()
+    {
+    // Get marked list item indexes
+    RArray<TInt> markedVideos;
+    CleanupClosePushL( markedVideos );
+    MarkedVideosL( markedVideos );
+    TInt markedCount( markedVideos.Count() );
+
+    iMarkedMediaList.Reset();
+    iMarkedMediaList.ReserveL( markedCount );
+
+    TInt markedIndex;
+
+    for ( TInt i = 0; i <markedCount; i++ )
+        {
+        markedIndex = markedVideos[ i ];
+        CMPXMedia* media = iVideoArray->MPXMedia( markedIndex );
+        iMarkedMediaList.Append( media );
+        iScroller.ItemL( markedIndex ).ClearFlags( CHgItem::EHgItemFlagMarked );
+        IPTVLOGSTRING3_LOW_LEVEL( "CVcxHgMyVideosVideoModelHandler::SaveMarkingsL() marked index = %d CMPXMedia = 0x%08x", markedIndex, media );
+        }
+
+    CleanupStack::PopAndDestroy( &markedVideos );
+    }
+
+// -----------------------------------------------------------------------------
+// CVcxHgMyVideosVideoModelHandler::RestoreMarkingsL()
+// -----------------------------------------------------------------------------
+//
+void CVcxHgMyVideosVideoModelHandler::RestoreMarkingsL()
+    {
+    TInt videoCount = iVideoArray->VideoCount();
+    TInt found( KErrNotFound );
+
+    for ( TInt i = 0; i < videoCount; i++ )
+        {
+        CMPXMedia* media = iVideoArray->MPXMedia( i );
+        found = iMarkedMediaList.Find( media );
+        if ( KErrNotFound != found )
+            {
+            iScroller.ItemL( i ).SetFlags( CHgItem::EHgItemFlagMarked );
+            }
+        IPTVLOGSTRING4_LOW_LEVEL( "CVcxHgMyVideosVideoModelHandler::RestoreMarkingsL() list index = %d CMPXMedia = 0x%08x found = %d", i, media, found );
+        }
+
+    iMarkedMediaList.Reset();
+    }
+// -----------------------------------------------------------------------------
+// CVcxHgMyVideosVideoModelHandler::SetVideoLastWatchedL()
+// -----------------------------------------------------------------------------
+//
+void CVcxHgMyVideosVideoModelHandler::SetVideoLastWatchedL( CMPXMedia& aMedia )
+    {    
+    if ( !iRepository )
+        {
+        iRepository = CRepository::NewL( TUid::Uid( KVcxMyVideosCollectionCenrepUid ) );
+        }
+    iRepository->Set( KVcxMyVideosCollectionCenrepKeyLastWatchedMpxId, 
+                      TInt( aMedia.ValueTObjectL<TMPXItemId>( KMPXMediaGeneralId ).iId1 ));
+
+    iRepository->Set( KVcxMyVideosCollectionCenrepKeyLastWatchedName,
+                       aMedia.ValueText( KMPXMediaGeneralTitle ));
+
+    iRepository->Set( KVcxMyVideosCollectionCenrepKeyLastWatchedPath,
+                       aMedia.ValueText( KMPXMediaGeneralUri ));
+
+    iRepository->Set( KVcxMyVideosCollectionCenrepKeyLastWatchedIndicator,
+                       TInt( VideoIndicator().IsIndicatorShown( aMedia )) );
+	}
+
+// -----------------------------------------------------------------------------
+// CVcxHgMyVideosVideoModelHandler::ClearNewVideoFlagL()
+// -----------------------------------------------------------------------------
+//
+void CVcxHgMyVideosVideoModelHandler::ClearNewVideoFlagL( CMPXMedia& aMedia )
+    {    
+    TUint32 flags = aMedia.ValueTObjectL<TUint32>( KMPXMediaGeneralFlags );
+    if( flags & EVcxMyVideosVideoNew )
+        {
+        flags &= ~EVcxMyVideosVideoNew;
+        iModel.CollectionClient().SetFlagsL( 
+		    aMedia.ValueTObjectL<TMPXItemId>( KMPXMediaGeneralId ), flags );   
+        }    
+    }