diff -r 000000000000 -r 96612d01cf9f videofeeds/hgvodui/src/vcxhgvodservicegrouplistmodelhandler.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/videofeeds/hgvodui/src/vcxhgvodservicegrouplistmodelhandler.cpp Mon Jan 18 20:21:12 2010 +0200 @@ -0,0 +1,456 @@ +/* +* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: HG VOD* +*/ + + + + +#include +#include +#include +#include +#include +#include + +#include "vcxnsserviceproviderif.h" +#include "vcxnscategoryproviderif.h" +#include "vcxhgvodservicegrouplistimpl.h" +#include "vcxhgvodservicegrouplistmodelhandler.h" +#include "vcxhgvodmainview.h" +#include "vcxhgvodmainviewcontainer.h" +#include "vcxhgvodui.hrh" +#include "vcxhgvodutils.h" +#include "vcxnsuiengine.h" +#include "vcxnsservice.h" +#include "vcxnscategory.h" +#include "vcxhgvodthumbnailmanager.h" + +TInt FindServiceGroupIndex( TUint32 aId, RPointerArray* aArray ) + { + TInt index( KErrNotFound ); + for ( TInt i = 0; i < aArray->Count(); i++ ) + { + if ( (*aArray)[i]->GetServiceId() == aId ) + { + index = i; + break; + } + } + + return index; + } + +// ----------------------------------------------------------------------------- +// CVcxHgVodServiceListModelHandler::~CVcxHgVodServiceListModelHandler() +// Destructor +// ----------------------------------------------------------------------------- +// +CVcxHgVodServiceGroupListModelHandler::~CVcxHgVodServiceGroupListModelHandler() + { + if ( iServiceProvider ) + { + iServiceProvider->DeRegisterObserver( this ); + } + + delete iTnManager; + } + +// ----------------------------------------------------------------------------- +// CVcxHgVodServiceListImpl::NewL() +// ----------------------------------------------------------------------------- +// +CVcxHgVodServiceGroupListModelHandler* CVcxHgVodServiceGroupListModelHandler::NewL( + CVcxNsUiEngine& aDataProviderIf, + CVcxHgVodMainView& aView, + CHgScroller& aScroller, + CVcxHgVodServiceGroupListImpl& aServiceGroupListImpl ) + { + CVcxHgVodServiceGroupListModelHandler* self = + CVcxHgVodServiceGroupListModelHandler::NewLC( + aDataProviderIf, + aView, + aScroller, + aServiceGroupListImpl ); + CleanupStack::Pop( self ); + return self; + } + +// ----------------------------------------------------------------------------- +// CVcxHgVodServiceGroupListModelHandler::NewLC() +// ----------------------------------------------------------------------------- +// +CVcxHgVodServiceGroupListModelHandler* CVcxHgVodServiceGroupListModelHandler::NewLC( + CVcxNsUiEngine& aDataProviderIf, + CVcxHgVodMainView& aView, + CHgScroller& aScroller, + CVcxHgVodServiceGroupListImpl& aServiceGroupListImpl ) + { + CVcxHgVodServiceGroupListModelHandler* self = + new (ELeave) CVcxHgVodServiceGroupListModelHandler( + aDataProviderIf, + aView, + aScroller, + aServiceGroupListImpl ); + CleanupStack::PushL( self ); + self->ConstructL(); + return self; + } + +// ----------------------------------------------------------------------------- +// CVcxHgVodServiceGroupListModelHandler::CVcxHgVodServiceGroupListModelHandler() +// Constructor +// ----------------------------------------------------------------------------- +// +CVcxHgVodServiceGroupListModelHandler::CVcxHgVodServiceGroupListModelHandler( + CVcxNsUiEngine& aDataProviderIf, + CVcxHgVodMainView& aView, + CHgScroller& aScroller, + CVcxHgVodServiceGroupListImpl& aServiceGroupListImpl ) + : iDataProviderIf ( aDataProviderIf ), + iScroller ( aScroller ), + iView ( aView ), + iListImpl ( aServiceGroupListImpl ) + { + } + +// ----------------------------------------------------------------------------- +// CVcxHgVodServiceGroupListModelHandler::ConstructL() +// ----------------------------------------------------------------------------- +// +void CVcxHgVodServiceGroupListModelHandler::ConstructL() + { + iServiceProvider = iDataProviderIf.GetServiceProviderL(); + iTnManager = CVcxHgVodThumbnailManager::NewL( iView.EikonEnv().FsSession() ); + } + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void CVcxHgVodServiceGroupListModelHandler::ServiceAdded( TInt /*aIndex*/ ) + { + } + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void CVcxHgVodServiceGroupListModelHandler::ServiceUpdated( TInt aIndex ) + { + TRAP_IGNORE( UpdateListItemL( aIndex ) ); + } + +// ----------------------------------------------------------------------------- +// Refresh view, update all services. +// ----------------------------------------------------------------------------- +// +void CVcxHgVodServiceGroupListModelHandler::RefreshView() + { + if ( iDataProviderIf.VcAppState() == EStateCustomView ) + { + TRAPD( err, iGroupServices = &(iServiceProvider->GetActiveGroupListL()) ); + + if ( err == KErrNone ) + { + 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 ); + } + } + } + } + +// ----------------------------------------------------------------------------- +// Handle service removal (no implementation) +// ----------------------------------------------------------------------------- +// +void CVcxHgVodServiceGroupListModelHandler::ServiceRemoved( + TInt /*aIndex*/, + RPointerArray& /*aUpdatedServiceList*/ ) + { + } + +// ----------------------------------------------------------------------------- +// Application state change initialized by data provider. +// ----------------------------------------------------------------------------- +// +void CVcxHgVodServiceGroupListModelHandler::HandleAppStateChangedL() + { + iView.ChangeListViewL(); + } + +// ----------------------------------------------------------------------------- +// Open defined browser link +// ----------------------------------------------------------------------------- +// +void CVcxHgVodServiceGroupListModelHandler::OpenBrowserLinkL( const TDesC& aUri ) + { + iListImpl.OpenEmbeddedBrowserL( aUri ); + } + +// ----------------------------------------------------------------------------- +// open streaming link +// ----------------------------------------------------------------------------- +// +void CVcxHgVodServiceGroupListModelHandler::OpenStreamingLinkL( const TDesC& aUri ) + { + iView.PlayStreamL( aUri ); + } + +// ----------------------------------------------------------------------------- +// Activate model +// ----------------------------------------------------------------------------- +// +void CVcxHgVodServiceGroupListModelHandler::DoActivateModelL( ) + { + iServiceProvider->RegisterObserver( this ); + + iGroupServices = &(iServiceProvider->GetActiveGroupListL()); + iScroller.EnableScrollBufferL( *this, KScrollerBufferSize, KScrollerBufferTreshold ); + iScroller.Reset(); + RefreshViewL(); + + iScroller.SetSelectedIndex( iHighlight ); + iScroller.ControlEnv()->WsSession().ClearAllRedrawStores(); + iScroller.MakeVisible( ETrue ); + iScroller.DrawDeferred(); + } + +// ----------------------------------------------------------------------------- +// Deactivate model +// ----------------------------------------------------------------------------- +// +void CVcxHgVodServiceGroupListModelHandler::DoDeActivateModel( ) + { + if ( iServiceProvider ) + { + iServiceProvider->DeRegisterObserver( this ); + } + + iTnManager->Reset(); + + iHighlight = iScroller.SelectedIndex(); + iScroller.DisableScrollBuffer(); + iScroller.MakeVisible( EFalse ); + } + +// ----------------------------------------------------------------------------- +// Get highlight index +// ----------------------------------------------------------------------------- +// +TInt CVcxHgVodServiceGroupListModelHandler::GetSelected() + { + return iScroller.SelectedIndex(); + } + +// --------------------------------------------------------- +// CVcxHgVodServiceGroupListModelHandler::IsEmptyModel +// --------------------------------------------------------- +// +TBool CVcxHgVodServiceGroupListModelHandler::IsEmptyModel() + { + return iScroller.ItemCount() <= 0; + } + +// --------------------------------------------------------- +// CVcxHgVodServiceGroupListModelHandler::GenerateInfoTextLC +// --------------------------------------------------------- +// +HBufC* CVcxHgVodServiceGroupListModelHandler::GenerateInfoTextLC( + CVcxNsService& aGroupService ) + { + if ( aGroupService.Type() == CVcxNsService::EVcxNsGroupedSearch ) + { + MVcxNsCategoryProviderIf* categoryProvider = + iDataProviderIf.GetCategoryProviderL(); + + CVcxNsCategory* category = NULL; + if ( categoryProvider ) + { + category = categoryProvider->GetCategoryDataL( + aGroupService.GetServiceId(), + KIptvRssSearchCategoryId ); + } + + TInt count = 0; + if ( category ) + { + count = category->GetVideoCount(); + } + + if ( count == 1 ) + { + return CVcxHgVodUtils::LoadStringFromResourceLC( + R_VCXHG_SEARCH_VIDEOS_FOUND_ONE ); + } + else if ( count > 1 ) + { + return CVcxHgVodUtils::LoadStringFromResourceLC( + R_VCXHG_SEARCH_VIDEOS_FOUND, count ); + } + } + + return aGroupService.GetDesc().AllocLC(); + } + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +TInt CVcxHgVodServiceGroupListModelHandler::ItemCount() + { + return iScroller.ItemCount(); + } + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void CVcxHgVodServiceGroupListModelHandler::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 ) ); + } + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void CVcxHgVodServiceGroupListModelHandler::RefreshViewL() + { + iScroller.Reset(); + + if ( iGroupServices && iGroupServices->Count() > 0 ) + { + iScroller.ResizeL( iGroupServices->Count() ); + } + else + { + CVcxNsService* service = iServiceProvider->GetActiveServiceData(); + if ( service && + service->Type() == CVcxNsService::EVcxNsMainGroup && + service->GetUpdateStatus() == CVcxNsService::EUpdateFailed ) + { + //Does this need empty list text? (not specified in ui spec) + //There's no text available, so if update failed, return + //to video feeds view. + iView.HandleCommandL( EAknSoftkeyBack ); + } + + iListImpl.CheckSoftkeysL(); + } + + iScroller.DrawDeferred(); + } + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void CVcxHgVodServiceGroupListModelHandler::UpdateListItemL( TInt aIndex ) + + { + if ( iDataProviderIf.VcAppState() == EStateCustomView && + aIndex >= 0 && aIndex < iScroller.ItemCount() && + iGroupServices && iGroupServices->Count() > aIndex ) + { + CHgItem& item = iScroller.ItemL( aIndex ); + CVcxNsService& service = *(*iGroupServices)[aIndex]; + + item.SetTitleL( service.GetName() ); + + HBufC* info = GenerateInfoTextLC( service ); + + item.SetTextL( *info ); + CleanupStack::PopAndDestroy( info ); + + item.SetIcon( NULL ); + + const TDesC& iconPath = service.GetIconPath(); + if ( iconPath.Length() > 0 ) + { + iTnManager->AddThumbnailRequestL( *this, + service.GetIconPath(), + CHgDoubleGraphicList::PreferredImageSize(), + service.GetServiceId() ); + } + iScroller.RefreshScreen( aIndex ); + } + + iListImpl.SetMskL( R_VCXHG_VOD_MSK_BUTTON_OPEN ); + } + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void CVcxHgVodServiceGroupListModelHandler::DoThumbnailReadyL( + CGulIcon* aIcon, + TInt64 aClientId ) + { + CleanupStack::PushL( aIcon ); + TInt index = FindServiceGroupIndex( (TUint32)aClientId, iGroupServices ); + + 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 ); + } + } + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void CVcxHgVodServiceGroupListModelHandler::Request( TInt aBufferStart, + TInt aBufferEnd, THgScrollDirection /*aDirection*/ ) + { + for ( TInt i = aBufferStart; i <= aBufferEnd; i++ ) + { + TRAP_IGNORE( UpdateListItemL( i ) ); + } + } + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void CVcxHgVodServiceGroupListModelHandler::Release( TInt /*aBufferStart*/, + TInt /*aBufferEnd*/ ) + { + // No implementation required. + }