videofeeds/hgvodui/src/vcxhgvodinformationpopup.cpp
changeset 0 96612d01cf9f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/videofeeds/hgvodui/src/vcxhgvodinformationpopup.cpp	Mon Jan 18 20:21:12 2010 +0200
@@ -0,0 +1,324 @@
+/*
+* Copyright (c) 2005-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:    VoD information popup functionality implementation*
+*/
+
+
+
+
+// INCLUDE FILES
+#include <AknInfoPopupNoteController.h>
+#include <aknview.h>
+#include <e32base.h>
+#include <eikmenup.h>
+#include <StringLoader.h>
+#include "vcxnsservice.h"
+#include "vcxnsserviceproviderif.h"
+#include "vcxnsuiengine.h"
+#include <vcxhgvodui.rsg>
+
+#include "vcxhgvodinformationpopup.h"
+
+// CONSTANTS
+const TInt KTimeForPopupInView = 60000;   // 60 sec
+const TInt KVcxNsInformationPopupTimerMediumDelay = 100000;  // 0,1 sec
+const TInt KVcxNsInformationPopupTimerShortDelay = 100;     // 0,0001 sec
+const TInt KNoDelay = 10;      // 0,00001 sec
+
+// ============================ MEMBER FUNCTIONS =============================
+
+// ---------------------------------------------------------
+// CVcxHgVodInformationPopup::CVcxHgVodInformationPopup
+// ---------------------------------------------------------
+//
+CVcxHgVodInformationPopup::CVcxHgVodInformationPopup( 
+    CAknView& aParentView, 
+    CVcxNsUiEngine& aUiEngine )
+: iParentView ( aParentView ),
+  iUiEngine ( aUiEngine )
+      {
+      }
+
+// ---------------------------------------------------------
+// CVcxHgVodInformationPopup::ConstructL
+// ---------------------------------------------------------
+//
+void CVcxHgVodInformationPopup::ConstructL()
+    {
+    iTimer = CIptvTimer::NewL( CActive::EPriorityStandard, *this );
+    iPopupText = StringLoader::LoadL( R_VCXHG_VOD_UPDATING );
+    }
+
+// ---------------------------------------------------------
+// CVcxHgVodInformationPopup::NewL
+// ---------------------------------------------------------
+//
+CVcxHgVodInformationPopup* CVcxHgVodInformationPopup::NewL( 
+    CAknView& aParentView,
+    CVcxNsUiEngine& aUiEngine )
+    {
+    CVcxHgVodInformationPopup* self = 
+        new( ELeave ) CVcxHgVodInformationPopup ( aParentView, aUiEngine );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+// ---------------------------------------------------------
+// CVcxHgVodInformationPopup::~CVcxHgVodInformationPopup
+// ---------------------------------------------------------
+//
+CVcxHgVodInformationPopup::~CVcxHgVodInformationPopup()
+    {
+    DeleteControl();
+    
+    delete iPopupText;
+    
+    if (iTimer->IsActive())
+        {
+        iTimer->Cancel();
+        }
+    delete iTimer;
+    }
+
+// ---------------------------------------------------------
+// CVcxHgVodInformationPopup::CreateControl
+// ---------------------------------------------------------
+//
+TBool CVcxHgVodInformationPopup::CreateControlL()
+    {
+    TBool controlCreated( EFalse );
+    
+    if ( !iPopupController )
+        {
+        iPopupController = CAknInfoPopupNoteController::NewL();
+
+        iPopupController->AddObserverL(*this);
+        iPopupController->SetTimePopupInView( KTimeForPopupInView );
+        //Show immediately
+        iPopupController->SetTimeDelayBeforeShow( KNoDelay ); 
+
+        if ( !iPopupText )
+            {
+            iPopupText = StringLoader::LoadL( R_VCXHG_VOD_UPDATING );
+            }
+
+        iPopupController->SetTextL( iPopupText->Des() );
+
+        TRect clientRect = iParentView.ClientRect();
+        TPoint topRight( clientRect.iBr.iX, clientRect.iTl.iY );
+        iTopRight = topRight;
+        
+        controlCreated = ETrue;
+        }
+
+    iPopupController->SetPositionAndAlignment( iTopRight, EHRightVCenter );
+    
+    return controlCreated;
+    }
+
+// ---------------------------------------------------------
+// CVcxHgVodInformationPopup::DeleteControl
+// ---------------------------------------------------------
+//
+void CVcxHgVodInformationPopup::DeleteControl()
+    {
+    if ( iPopupController )
+        {
+        iPopupController->RemoveObserver(*this);
+	
+    	delete iPopupController;
+    	iPopupController = NULL;   
+        }
+    }
+
+// ---------------------------------------------------------
+// CVcxHgVodInformationPopup::SetTextL
+// ---------------------------------------------------------
+//
+void CVcxHgVodInformationPopup::SetTextL( const TDesC& aText )
+    {
+    if ( iPopupText && iPopupController )
+        {
+        delete iPopupText;
+        iPopupText = NULL;
+        iPopupText  = HBufC16::NewL( aText.Length() );
+        *iPopupText = aText;
+        iPopupController->SetTextL( iPopupText->Des() );
+        }
+    }
+
+// ---------------------------------------------------------
+// CVcxHgVodInformationPopup::Hide
+// ---------------------------------------------------------
+//
+void CVcxHgVodInformationPopup::Hide()
+    {
+    if ( iTimer->IsActive() )
+        {
+        iTimer->Cancel();
+        }    
+
+    if ( iPopupController )
+        {
+        iPopupController->HideInfoPopupNote();
+        }
+        
+    DeleteControl();
+    
+    // Reset the text when hiding on purpose.
+    delete iPopupText;
+    iPopupText = NULL;
+    }
+
+// ---------------------------------------------------------
+// CVcxHgVodInformationPopup::ShowL
+// ---------------------------------------------------------
+//
+void CVcxHgVodInformationPopup::ShowL()
+    {
+    CreateControlL();
+
+    if ( iPopupController )
+        {
+        iPopupController->ShowInfoPopupNote();    
+        }
+    }
+
+// ---------------------------------------------------------
+// CVcxHgVodInformationPopup::HandleInfoPopupNoteEvent
+// ---------------------------------------------------------
+//
+void CVcxHgVodInformationPopup::HandleInfoPopupNoteEvent(
+    CAknInfoPopupNoteController* aController,
+    MAknInfoPopupNoteObserver::TAknInfoPopupNoteEvent aEvent )
+    {
+    if ( aController )
+        {
+        if ( aEvent == EInfoPopupNoteHidden )   
+            {
+            TVcxNsAppState state = iUiEngine.VcAppState();
+            
+            if ( ( state == EStateContentView || state == EStateCategoryView )
+                    && iParentView.IsForeground() )
+                {
+                // Check if still updating --> if yes, show note again.
+                // We do this because any key press closes the note.
+                TRAP_IGNORE 
+                    (
+                    if ( iUiEngine.GetServiceProviderL()->GetActiveServiceData()->
+                               GetUpdateStatus() == CVcxNsService::EUpdateOngoing )
+                        {
+                        if ( iTimer->IsActive() )
+                            {
+                            iTimer->Cancel();
+                            }
+                        iTimer->After( KVcxNsInformationPopupTimerShortDelay );    
+                        }
+                    )
+                }
+            }
+        else
+            {
+            if ( iTimer->IsActive() )
+                {
+                iTimer->Cancel();
+                }
+            }
+        }
+    }
+
+// ---------------------------------------------------------
+// CVcxHgVodInformationPopup::TimerExpired()
+// ---------------------------------------------------------
+//
+void CVcxHgVodInformationPopup::TimerExpired( CIptvTimer* /*aTimer*/ )
+    {
+    DeleteControl();
+    TVcxNsAppState state = iUiEngine.VcAppState();
+
+    if ( state == EStatePlayback || state == EStateNoState  )
+        {
+        if ( iTimer->IsActive() )
+            {
+            iTimer->Cancel();
+            }
+        return;
+        }
+
+    // When timer expires, check that view still exist (might have been closed)
+    // and update is still ongoing (might have been finished). If both are true
+    // the information pop-up needs to be shown still.
+    
+    if ( ( state == EStateContentView || state == EStateCategoryView )
+            && iParentView.IsForeground() )
+        {
+        MVcxNsServiceProviderIf* serviceIf = NULL;
+        TRAPD( leave, serviceIf = iUiEngine.GetServiceProviderL() );
+        if ( !leave && serviceIf &&
+             serviceIf->GetActiveServiceData()->GetUpdateStatus() == CVcxNsService::EUpdateOngoing  )
+            {
+            // If there's a menu, we need to delay note for a moment. Can't display with menu.
+            if( iParentView.MenuBar() && iParentView.MenuBar()->IsDisplayed() )
+                {
+                if ( iTimer->IsActive() )
+                    {
+                    iTimer->Cancel();
+                    }
+                iTimer->After( KVcxNsInformationPopupTimerMediumDelay );
+                }
+            else
+                {
+                TRAP_IGNORE( ShowL() );
+                }
+            }
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+//
+void CVcxHgVodInformationPopup::HandleForegroundEventL( TBool aForeground )
+    {
+    if ( aForeground )
+        { 
+        // Don't active timer after Hide() has been called (iPopupText is then NULL)
+        if ( iPopupText )
+            {
+            iTimer->Cancel();
+            iTimer->After( KVcxNsInformationPopupTimerShortDelay ); 
+            }
+        }
+    else
+        {
+        // Nothing to do
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+//
+void CVcxHgVodInformationPopup::HandleSizeChange()
+    {
+    // Must update popup position relative to client rect.
+    // Don't active timer after Hide() has been called (iPopupText is then NULL)
+    if ( iPopupController && iPopupText )
+        {
+        iTimer->Cancel();
+        iTimer->After( KVcxNsInformationPopupTimerShortDelay ); 
+        }
+    }