videofeeds/hgvodui/src/vcxhgvodservicegrouplistmodelhandler.cpp
changeset 0 96612d01cf9f
--- /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 <aknmessagequerydialog.h>
+#include <StringLoader.h>
+#include <vcxhgvodui.rsg>
+#include <ganes/HgScroller.h>
+#include <ganes/HgItem.h>
+#include <ganes/HgDoubleGraphicList.h>
+
+#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<CVcxNsService>* 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<CVcxNsService>& /*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.
+    }