--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videofeeds/hgvodui/src/vcxhgvodcontentlistmodelhandler.cpp Mon Jan 18 20:21:12 2010 +0200
@@ -0,0 +1,574 @@
+/*
+* Copyright (c) 2008-2009 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: HG VOD*
+*/
+
+
+
+
+#include <aknnotewrappers.h>
+#include <StringLoader.h>
+#include <vcxhgvodui.rsg>
+#include <ganes/HgScroller.h>
+#include <ganes/HgItem.h>
+#include <ganes/HgDoubleGraphicList.h>
+
+#include "CIptvUtil.h"
+#include "vcxhgvodcontentlistimpl.h"
+#include "vcxhgvodcontentlistmodelhandler.h"
+#include "vcxhgvodmainviewcontainer.h"
+#include "vcxnsuiengine.h"
+#include "vcxnsserviceproviderif.h"
+#include "vcxnscategoryproviderif.h"
+#include "vcxnscontentproviderif.h"
+#include "vcxnsservice.h"
+#include "vcxnscategory.h"
+#include "vcxnscontent.h"
+#include "vcxhgvodutils.h"
+#include "vcxhgvodui.hrh"
+#include "vcxhgvodmainview.h"
+#include "vcxhgvodmainviewcontainer.h"
+#include "vcxhgvodvideodetailsdialog.h"
+#include "vcxhgvodthumbnailmanager.h"
+
+const TInt KFullPercents = 100;
+const TInt KFullPercentsToList = 99;
+
+TInt FindContentIndex( TUint32 aId, RPointerArray<CVcxNsContent>* aArray )
+ {
+ TInt index( KErrNotFound );
+ if ( aArray )
+ {
+ for ( TInt i = 0; i < aArray->Count(); i++ )
+ {
+ if ( (*aArray)[i]->GetContentId() == aId )
+ {
+ index = i;
+ break;
+ }
+ }
+ }
+
+ return index;
+ }
+
+// -----------------------------------------------------------------------------
+// CVcxHgVodServiceListModelHandler::~CVcxHgVodServiceListModelHandler()
+// Destructor
+// -----------------------------------------------------------------------------
+//
+CVcxHgVodContentListModelHandler::~CVcxHgVodContentListModelHandler()
+ {
+ if ( iContentProvider )
+ {
+ iContentProvider->DeRegisterObserver( this );
+ }
+
+ delete iTnManager;
+ }
+
+// -----------------------------------------------------------------------------
+// CVcxHgVodServiceListImpl::NewL()
+// -----------------------------------------------------------------------------
+//
+CVcxHgVodContentListModelHandler* CVcxHgVodContentListModelHandler::NewL(
+ CVcxNsUiEngine& aDataProviderIf,
+ CVcxHgVodMainView& aView,
+ CHgScroller& aScroller,
+ CVcxHgVodContentListImpl& aContentListImpl )
+ {
+ CVcxHgVodContentListModelHandler* self =
+ CVcxHgVodContentListModelHandler::NewLC(
+ aDataProviderIf,
+ aView,
+ aScroller,
+ aContentListImpl );
+ CleanupStack::Pop( self );
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CVcxHgVodContentListModelHandler::NewLC()
+// -----------------------------------------------------------------------------
+//
+CVcxHgVodContentListModelHandler* CVcxHgVodContentListModelHandler::NewLC(
+ CVcxNsUiEngine& aDataProviderIf,
+ CVcxHgVodMainView& aView,
+ CHgScroller& aScroller,
+ CVcxHgVodContentListImpl& aContentListImpl )
+ {
+ CVcxHgVodContentListModelHandler* self =
+ new (ELeave) CVcxHgVodContentListModelHandler(
+ aDataProviderIf, aView, aScroller, aContentListImpl );
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CVcxHgVodContentListModelHandler::CVcxHgVodContentListModelHandler()
+// Constructor
+// -----------------------------------------------------------------------------
+//
+CVcxHgVodContentListModelHandler::CVcxHgVodContentListModelHandler(
+ CVcxNsUiEngine& aDataProviderIf,
+ CVcxHgVodMainView& aView,
+ CHgScroller& aScroller,
+ CVcxHgVodContentListImpl& aContentListImpl )
+ : iDataProviderIf ( aDataProviderIf ),
+ iView ( aView ),
+ iScroller ( aScroller ),
+ iListImpl ( aContentListImpl )
+ {
+ }
+
+// -----------------------------------------------------------------------------
+// CVcxHgVodContentListModelHandler::ConstructL()
+// -----------------------------------------------------------------------------
+//
+void CVcxHgVodContentListModelHandler::ConstructL()
+ {
+ iContentProvider = iDataProviderIf.GetContentProviderL();
+ iTnManager = CVcxHgVodThumbnailManager::NewL( iView.EikonEnv().FsSession() );
+ }
+
+// -----------------------------------------------------------------------------
+// Activate model
+// -----------------------------------------------------------------------------
+//
+void CVcxHgVodContentListModelHandler::DoActivateModelL()
+ {
+ iContentProvider->RegisterObserver( this );
+ iScroller.EnableScrollBufferL( *this, KScrollerBufferSize, KScrollerBufferTreshold );
+ iScroller.Reset();
+ iScroller.ControlEnv()->WsSession().ClearAllRedrawStores();
+ iScroller.MakeVisible( ETrue );
+ iScroller.DrawNow();
+ iScroller.ControlEnv()->WsSession().Flush();
+
+ TRAP_IGNORE( SetListContentL() );
+ }
+
+// -----------------------------------------------------------------------------
+// Deactivate model
+// -----------------------------------------------------------------------------
+//
+void CVcxHgVodContentListModelHandler::DoDeActivateModel( )
+ {
+ if ( iContentProvider )
+ {
+ iContentProvider->SetContentHighlight( iScroller.SelectedIndex() );
+ iContentProvider->DeRegisterObserver( this );
+ }
+
+ iTnManager->Reset();
+ iScroller.DisableScrollBuffer();
+ iScroller.MakeVisible( EFalse );
+ }
+
+// -----------------------------------------------------------------------------
+// Set content for model
+// -----------------------------------------------------------------------------
+//
+void CVcxHgVodContentListModelHandler::SetListContentL()
+ {
+ TInt highlight = 0;
+ iContents = NULL;
+ iContents = &(iContentProvider->GetContentsL( highlight ));
+ if ( iContents )
+ {
+ RefreshViewL();
+
+ if ( iContents->Count() > 0 )
+ {
+ iScroller.SetSelectedIndex( highlight );
+ }
+ }
+
+ UpdateViewDetailsL();
+ }
+
+// -----------------------------------------------------------------------------
+// Get category provider interface
+// -----------------------------------------------------------------------------
+//
+MVcxNsContentProviderIf* CVcxHgVodContentListModelHandler::ContentProvider()
+ {
+ return iContentProvider;
+ }
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+void CVcxHgVodContentListModelHandler::ContentUpdated( TInt aIndex )
+ {
+ TRAP_IGNORE( UpdateListItemL( aIndex ) );
+ TRAP_IGNORE( HandleCommandUpdatesL() );
+ }
+
+// -----------------------------------------------------------------------------
+// Handle command updates
+// -----------------------------------------------------------------------------
+//
+void CVcxHgVodContentListModelHandler::HandleCommandUpdatesL()
+ {
+ iListImpl.CheckMskL();
+ }
+
+// -----------------------------------------------------------------------------
+// Refresh view, all contents updated
+// -----------------------------------------------------------------------------
+//
+void CVcxHgVodContentListModelHandler::RefreshView()
+ {
+ if ( iDataProviderIf.VcAppState() == EStateContentView )
+ {
+ iContents = NULL;
+ TRAP_IGNORE( iContents = &(iContentProvider->GetContentsL()) );
+ if ( iContents )
+ {
+ TInt highlight = iScroller.SelectedIndex();
+
+ TRAP_IGNORE( RefreshViewL() );
+
+ if ( iScroller.ItemCount() > 0 )
+ {
+ if ( highlight < 0 )
+ {
+ highlight = 0;
+ }
+ else if ( highlight >= iScroller.ItemCount() )
+ {
+ highlight = iScroller.ItemCount() - 1;
+ }
+
+ iScroller.SetSelectedIndex( highlight );
+ }
+ }
+
+ TRAP_IGNORE( UpdateViewDetailsL() );
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// Update view details
+// -----------------------------------------------------------------------------
+//
+void CVcxHgVodContentListModelHandler::UpdateViewDetailsL()
+ {
+ iListImpl.UpdateTitlePaneL();
+ iListImpl.CheckMskL();
+
+ if ( iContents && iContents->Count() <= 0
+ && iDataProviderIf.ActiveCategory() == KVcxNsSearchCategoryId )
+ {
+ //When activating search list view and there's no content,
+ //search result is 0 and show no videos found.
+ iListImpl.SetEmptyListTextL( R_VCXHG_NO_VIDEOS_FOUND );
+ }
+ else if ( iContents && iContents->Count() <= 0 )
+ {
+ iListImpl.SetEmptyListTextL( R_VCXHG_VOD_NO_DATA );
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// Application state change initialized by data provider.
+// -----------------------------------------------------------------------------
+//
+void CVcxHgVodContentListModelHandler::HandleAppStateChangedL()
+ {
+ iView.ChangeListViewL();
+ }
+
+// -----------------------------------------------------------------------------
+// CVcxHgVodContentListModelHandler::ShowUpdatingNoteL()
+// -----------------------------------------------------------------------------
+//
+void CVcxHgVodContentListModelHandler::ShowUpdatingNoteL(
+ TBool aShow,
+ TInt aDownloadedTbns,
+ TInt aTotalTbns )
+ {
+ iListImpl.ShowInformationPopupL( aShow, aDownloadedTbns, aTotalTbns );
+ }
+
+// -----------------------------------------------------------------------------
+// CVcxHgVodContentListModelHandler::HandleUpdateErrorL()
+// -----------------------------------------------------------------------------
+//
+void CVcxHgVodContentListModelHandler::HandleUpdateErrorL( TInt aError )
+ {
+ iListImpl.ShowUpdateErrorNoteL( aError );
+
+ if ( aError == EIptvDlAuthFailed )
+ {
+ TRAPD( err, iListImpl.HandleAuthenticationL( ETrue ) );
+
+ if ( err == KErrNone && iContentProvider )
+ {
+ //if no error in authentication, refresh contents.
+ iContentProvider->RefreshContentsL();
+ return;
+ }
+ }
+
+ if ( iScroller.ItemCount() <= 0 )
+ {
+ iListImpl.SetEmptyListTextL( R_VCXHG_VOD_NO_DATA );
+ }
+
+ iScroller.DrawDeferred();
+ }
+
+// -----------------------------------------------------------------------------
+// CVcxHgVodContentListModelHandler::HandleDownloadErrorL()
+// -----------------------------------------------------------------------------
+//
+void CVcxHgVodContentListModelHandler::HandleDownloadErrorL(
+ TIptvDlError aError,
+ CVcxNsContent& aContent )
+ {
+ //
+ // EIptvDlConnectionFailed - Is this handling needed for UI side anymore as connection is
+ // handled in collection side? Is Resume done in collection side also?
+
+ HBufC* textFromResource = NULL;
+
+ switch ( aError )
+ {
+ case EIptvDlContentNotFound:
+ textFromResource = StringLoader::LoadLC( R_VCXHGVOD_ERR_VIDEO_MISSING_FROM_SERVER );
+ break;
+
+ case EIptvDlAuthFailed:
+ iListImpl.HandleAuthenticationL( EFalse, &aContent );
+ iContentProvider->ResumeDownloadL( aContent );
+ break;
+ case EIptvDlDiskFull:
+ {
+ textFromResource = StringLoader::LoadLC( R_VCXHGVOD_ERR_MEMORY_FULL );
+ CAknQueryDialog* dlg = CAknQueryDialog::NewL( );
+ dlg->ExecuteLD( R_VCXHG_CONFIRMATION_QUERY, *textFromResource );
+ CleanupStack::PopAndDestroy( textFromResource );
+ textFromResource = NULL;
+ }
+ break;
+
+ case EIptvDlBadUrl:
+ textFromResource = StringLoader::LoadLC( R_VCXHGVOD_ERR_INVALID_ADDRESS );
+ break;
+
+ case EIptvResumingFromBeginning:
+ {
+ textFromResource = StringLoader::LoadLC( R_VCXHGVOD_RESUME_NOT_POSSIBLE );
+ CAknInformationNote* note = new( ELeave ) CAknInformationNote( ETrue );
+ note->ExecuteLD( *textFromResource );
+ CleanupStack::PopAndDestroy( textFromResource );
+ textFromResource = NULL;
+ }
+ break;
+
+ case EIptvDlGeneral:
+ default:
+ {
+ textFromResource = StringLoader::LoadLC(
+ R_VCXHGVOD_ERR_DOWNLOAD_FAILED, aContent.GetName() );
+ }
+ break;
+ }
+
+ if ( textFromResource )
+ {
+ iListImpl.ShowErrorNoteL( *textFromResource );
+ CleanupStack::PopAndDestroy( textFromResource );
+ }
+ }
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+void CVcxHgVodContentListModelHandler::MvtoThumbnailReady(
+ CGulIcon* aIcon,
+ TInt64 aClientId )
+ {
+ // error ignored, as there is no error handling that can be done if this leaves
+ TRAP_IGNORE( DoThumbnailReadyL( aIcon, aClientId ) );
+ }
+
+// -----------------------------------------------------------------------------
+// Generate text for second line
+// -----------------------------------------------------------------------------
+//
+HBufC* CVcxHgVodContentListModelHandler::GenerateContextInfoTextLC(
+ CVcxNsContent& aContent )
+ {
+ // FormatLengthAndSizeL could return new HBufC*, no need for preallocated.
+ HBufC* formattedString = HBufC::NewLC( 100 );
+ TPtr formattedStringPtr = formattedString->Des();
+ CVcxNsContent::TVcxContentDlStatus dlStatus = aContent.GetDlStatus();
+
+ // If not in download list, size and length to list if available
+ if ( ( dlStatus == CVcxNsContent::EVcxContentDlStateNotFound )
+ || ( dlStatus == CVcxNsContent::EVcxContentDlStateNotDownloadable ) )
+ {
+ CVcxHgVodUtils::FormatLengthAndSizeL(
+ aContent.GetLength(), aContent.GetSize(), formattedStringPtr );
+ }
+ else
+ {
+ // Content is being downloaded, show the status.
+ TInt progress = aContent.GetDlProgress();
+ if ( progress >= KFullPercents )
+ {
+ // always show 99% as highest progress before changing to "downloaded"
+ progress = KFullPercentsToList;
+ }
+ CVcxHgVodUtils::FormatDownloadStateL( dlStatus, progress,
+ formattedStringPtr );
+ }
+
+ return formattedString;
+ }
+
+// -----------------------------------------------------------------------------
+// Get content information of currently selected video and pass it to video details dialog
+// -----------------------------------------------------------------------------
+//
+void CVcxHgVodContentListModelHandler::ShowVideoDetailsL( TInt aSelected )
+ {
+ if ( iContents && aSelected >= 0 && aSelected < iContents->Count() )
+ {
+ CVcxNsContent* content = iContentProvider->GetFullDetailsL( aSelected );
+ iVideoDetails->ShowVideoDetailsDialogL( *content );
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// Check if model is empty
+// -----------------------------------------------------------------------------
+//
+TBool CVcxHgVodContentListModelHandler::IsEmptyModel()
+ {
+ return iScroller.ItemCount() <= 0;
+ }
+
+// -----------------------------------------------------------------------------
+// Update list
+// -----------------------------------------------------------------------------
+//
+void CVcxHgVodContentListModelHandler::RefreshViewL()
+ {
+ iScroller.Reset();
+
+ if ( iContents && iContents->Count() > 0 )
+ {
+ iScroller.ResizeL( iContents->Count() );
+ }
+ iScroller.DrawDeferred();
+ }
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+void CVcxHgVodContentListModelHandler::Request( TInt aBufferStart,
+ TInt aBufferEnd, THgScrollDirection /*aDirection*/ )
+ {
+ for ( TInt i = aBufferStart; i <= aBufferEnd; i++ )
+ {
+ TRAP_IGNORE( UpdateListItemL( i ) );
+ }
+ }
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+void CVcxHgVodContentListModelHandler::Release( TInt /*aBufferStart*/,
+ TInt /*aBufferEnd*/ )
+ {
+ // No implementation required.
+ }
+
+// -----------------------------------------------------------------------------
+// Update single content
+// -----------------------------------------------------------------------------
+//
+void CVcxHgVodContentListModelHandler::UpdateListItemL( TInt aIndex )
+ {
+ if ( iDataProviderIf.VcAppState() == EStateContentView &&
+ aIndex >= 0 && iContents && iContents->Count() > aIndex &&
+ iScroller.ItemCount() > aIndex )
+ {
+ CHgItem& item = iScroller.ItemL( aIndex );
+ CVcxNsContent& content = *(*iContents)[aIndex];
+
+ item.SetTitleL( content.GetName() );
+
+ HBufC* info = GenerateContextInfoTextLC( content );
+
+ if ( info )
+ {
+ item.SetTextL( *info );
+ }
+
+ CleanupStack::PopAndDestroy( info );
+
+ CVcxNsContent::TVcxContentDlStatus dlStatus = content.GetDlStatus();
+
+ if ( !( item.Icon() ) ||
+ ( dlStatus != CVcxNsContent::EVcxContentDlStateDownloading ) )
+ {
+ item.SetIcon( NULL );
+ const TDesC& iconPath = content.GetIconPath();
+
+ if ( iconPath.Length() > 0 )
+ {
+ iTnManager->AddThumbnailRequestL( *this,
+ content.GetIconPath(),
+ CHgDoubleGraphicList::PreferredImageSize(),
+ content.GetContentId() );
+ }
+ }
+ iScroller.RefreshScreen( aIndex );
+ }
+ }
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+void CVcxHgVodContentListModelHandler::DoThumbnailReadyL(
+ CGulIcon* aIcon,
+ TInt64 aClientId )
+ {
+ CleanupStack::PushL( aIcon );
+ TInt index = FindContentIndex( (TUint32)aClientId, iContents );
+
+ if ( index >= 0 && iScroller.ItemCount() > index )
+ {
+ iScroller.ItemL( index ).SetIcon( aIcon );
+ iScroller.RefreshScreen( index );
+ CleanupStack::Pop( aIcon );
+ }
+ else
+ {
+ // For some reason the scroller list was update after image conversion
+ // started, and the icon is no longer needed.
+ CleanupStack::PopAndDestroy( aIcon );
+ }
+ }