videoplayback/videoplaybackviews/src/mpxvideopdlplaybackview.cpp
branchRCL_3
changeset 23 befca0ec475f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/videoplayback/videoplaybackviews/src/mpxvideopdlplaybackview.cpp	Wed Sep 01 12:30:28 2010 +0100
@@ -0,0 +1,578 @@
+/*
+* 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 "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:  Implementation of Video playback view
+*
+*/
+
+
+// Version : %version: 30 %
+
+
+//  Include Files
+#include <aknViewAppUi.h>
+#include <mpxplaybackutility.h>
+#include <mpxviewutility.h>
+#include <mpxcommandgeneraldefs.h>
+#include <mpxvideoplaybackviews.rsg>
+#include <mmf/common/mmferrors.h>
+#include <eikmenup.h>
+#include <AknTaskList.h>
+
+#include "mpxcommonvideoplaybackview.hrh"
+#include "mpxvideoplaybackuids.hrh"
+#include "mpxvideopdlplaybackview.h"
+#include "mpxvideoplaybackcontainer.h"
+#include "mpxvideoplaybackviewfiledetails.h"
+#include "mpxvideoplaybackuserinputhandler.h"
+#include <mpxvideoplaybackdefs.h>
+#include "mpxvideo_debug.h"
+
+//  Member Functions
+
+// -------------------------------------------------------------------------------------------------
+//   CMPXVideoPdlPlaybackView::NewLC()
+// -------------------------------------------------------------------------------------------------
+//
+EXPORT_C CMPXVideoPdlPlaybackView* CMPXVideoPdlPlaybackView::NewLC()
+{
+    MPX_ENTER_EXIT(_L("CMPXVideoPdlPlaybackView::NewLC()"));
+
+    CMPXVideoPdlPlaybackView* self = new (ELeave) CMPXVideoPdlPlaybackView();
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    return self;
+}
+
+// -------------------------------------------------------------------------------------------------
+//   CMPXVideoPdlPlaybackView::NewL()
+// -------------------------------------------------------------------------------------------------
+//
+EXPORT_C CMPXVideoPdlPlaybackView* CMPXVideoPdlPlaybackView::NewL()
+{
+    CMPXVideoPdlPlaybackView* self = CMPXVideoPdlPlaybackView::NewLC();
+    CleanupStack::Pop( self );
+    return self;
+}
+
+// -------------------------------------------------------------------------------------------------
+//   CMPXVideoPdlPlaybackView::CMPXVideoPdlPlaybackView()
+// -------------------------------------------------------------------------------------------------
+//
+CMPXVideoPdlPlaybackView::CMPXVideoPdlPlaybackView()
+// note, CBase initialises all member variables to zero
+{
+}
+
+// -------------------------------------------------------------------------------------------------
+//   CMPXVideoPdlPlaybackView::ConstructL()
+// -------------------------------------------------------------------------------------------------
+//
+void CMPXVideoPdlPlaybackView::ConstructL()
+{
+    MPX_ENTER_EXIT(_L("CMPXVideoPdlPlaybackView::ConstructL()"));
+
+    InitializeVideoPlaybackViewL();
+
+    iBlockInputsTimer = CPeriodic::NewL( CActive::EPriorityStandard );
+
+    iSyncClose = ETrue;
+}
+
+// -------------------------------------------------------------------------------------------------
+//   CMPXVideoPdlPlaybackView::~CMPXVideoPdlPlaybackView()
+// -------------------------------------------------------------------------------------------------
+//
+CMPXVideoPdlPlaybackView::~CMPXVideoPdlPlaybackView()
+{
+    MPX_DEBUG(_L("CMPXVideoPdlPlaybackView::~CMPXVideoPdlPlaybackView()"));
+
+    if ( iBlockInputsTimer )
+    {
+        iBlockInputsTimer->Cancel();
+        delete iBlockInputsTimer;
+        iBlockInputsTimer = NULL;
+    }
+}
+
+// -------------------------------------------------------------------------------------------------
+//   CMPXVideoPdlPlaybackView::Id()
+// -------------------------------------------------------------------------------------------------
+//
+TUid CMPXVideoPdlPlaybackView::Id() const
+{
+    return TUid::Uid( KMPXVIDEOPDLPLAYBACKVIEWUID );
+}
+
+// -------------------------------------------------------------------------------------------------
+//   CMPXVideoPdlPlaybackView::ViewImplementationIdId()
+// -------------------------------------------------------------------------------------------------
+//
+TUid CMPXVideoPdlPlaybackView::ViewImplementationId() const
+{
+    return TUid::Uid( KMPXVIDEOPDLPLAYBACKVIEWPLUGINIMPLEMENTATIONUID );
+}
+
+// -------------------------------------------------------------------------------------------------
+//   CMPXVideoPdlPlaybackView::CloseEmbeddedPlaybackViewL
+// -------------------------------------------------------------------------------------------------
+//
+void CMPXVideoPdlPlaybackView::CloseEmbeddedPlaybackViewL()
+{
+    MPX_ENTER_EXIT(_L("CMPXVideoPdlPlaybackView::CloseEmbeddedPlaybackViewL()"),
+                   _L("iPlaybackState = %d"), iPlaybackState );
+
+    //
+    //  If playback state is playing, pause playback
+    //  If playback state is stopped, close the plugin so file will be moved
+    //
+    if ( iPlaybackState == EPbStatePlaying )
+    {
+        HandleCommandL( EMPXPbvCmdPause );
+    }
+    else if ( iPlaybackState == EPbStateStopped )
+    {
+        ActivateClosePlayerActiveObject();
+    }
+
+    //
+    //  Embedded PDL
+    //  If we are in the foreground, bring the browser to the foreground
+    //
+    if ( ! BringUpBrowserL() )
+    {
+        //
+        //  Browser cannot be found, exit application
+        //
+        AppUi()->RunAppShutter();
+    }
+}
+
+// -------------------------------------------------------------------------------------------------
+//   CMPXVideoPdlPlaybackView::BringUpBrowserL
+// -------------------------------------------------------------------------------------------------
+//
+TBool CMPXVideoPdlPlaybackView::BringUpBrowserL()
+{
+    MPX_ENTER_EXIT(_L("CMPXVideoPdlPlaybackView::BringUpBrowserL()"));
+
+    TBool browserFound( EFalse );
+
+    RWsSession& wsSession=iEikonEnv->WsSession();
+    CAknTaskList* taskList = CAknTaskList::NewL( wsSession );
+    TApaTask task = taskList->FindRootApp( TUid::Uid( KBROWSERUID ) );
+
+    delete taskList;
+
+    if ( task.Exists() )
+    {
+        task.BringToForeground();
+        browserFound = ETrue;
+    }
+
+    return browserFound;
+}
+
+// -------------------------------------------------------------------------------------------------
+//   CMPXVideoPdlPlaybackView::RetrievePdlInformationL
+// -------------------------------------------------------------------------------------------------
+//
+void CMPXVideoPdlPlaybackView::RetrievePdlInformationL()
+{
+    MPX_ENTER_EXIT(_L("CMPXVideoPdlPlaybackView::RetrievePdlInformationL()"));
+
+    CMPXCommand* cmd( CMPXCommand::NewL() );
+    CleanupStack::PushL( cmd );
+
+    cmd->SetTObjectValueL<TBool>( KMPXCommandGeneralDoSync, ETrue );
+    cmd->SetTObjectValueL<TInt>( KMPXCommandGeneralId, KMPXCommandIdPlaybackPD );
+    cmd->SetTObjectValueL<TMPXPlaybackPdCommand>( KMPXCommandPlaybackGeneralType,
+                                                  EPbCmdGetPdStatus );
+
+    iPlaybackUtility->CommandL( *cmd );
+
+    //
+    //  Parse the PDL information
+    //
+    iPdlState = cmd->ValueTObjectL<TMPXPlaybackPdDownloadState>( KMPXCommandPlaybackPDState );
+    TInt downloadedBytes = cmd->ValueTObjectL<TInt>( KMPXCommandPlaybackPDDownloadedBytes );
+    iDownloadSize = cmd->ValueTObjectL<TInt>( KMPXCommandPlaybackPDTotalBytes );
+
+    MPX_DEBUG(_L("    PDL State = %d, current size = %d, total size = %d"),
+        iPdlState, downloadedBytes, iDownloadSize );
+
+    CleanupStack::PopAndDestroy( cmd );
+
+    if ( iContainer )
+    {
+        //
+        //  Check for a saved download.
+        //  The download size and downloaded bytes will be set to 100 so
+        //  the download progress bar will show 100%
+        //
+        if ( iPdlState == EPbDlStateNotDownloading || iPdlState == EPbDlStateDownloadCompleted )
+        {
+            iDownloadSize   = 100;
+            downloadedBytes = 100;
+        }
+
+        iContainer->HandleEventL( EMPXControlCmdSetDownloadSize, iDownloadSize );
+        iContainer->HandleEventL( EMPXControlCmdDownloadUpdated, downloadedBytes );
+    }
+}
+
+// -------------------------------------------------------------------------------------------------
+//   CMPXVideoPdlPlaybackView::HandlePluginErrorL()
+// -------------------------------------------------------------------------------------------------
+//
+void CMPXVideoPdlPlaybackView::HandlePluginErrorL( TInt aError )
+{
+    MPX_DEBUG(
+      _L("CMPXVideoPdlPlaybackView::HandlePluginErrorL() aError = %d"), aError );
+
+    switch ( aError )
+    {
+        case KErrAbort:
+        {
+            //
+            //  For progressive download mode, this indicates that the file
+            //  could not be played until the entire file is downloaded.
+            //
+            DisplayInfoMessageL( R_MPX_VIDEO_PDL_WAIT_DL_COMPLETE_MSG, ETrue );
+            ClosePlaybackViewWithErrorL();
+
+            break;
+        }
+        case KErrEof:
+        {
+            //
+            //  For progressive download mode, this indicates that the file
+            //  has timed out waiting for more data to be downloaded
+            //
+            DisplayErrorMessageL( R_MPX_VIDEO_PDL_ALL_CONTENT_PLAYED_MSG );
+            ClosePlaybackViewWithErrorL();
+
+            break;
+        }
+        case KErrNotSupported:
+        case KErrUnknown:
+        case KErrMMDecoder:
+        case KErrCorrupt:
+        case KErrTooBig:
+        {
+            //
+            //  We have received an error for an invalid clip.
+            //  If the download is complete, display the invalid
+            //  clip message.  If the download is in progress,
+            //  we do not know if the clip is invalid yet.
+            //  Show message to wait for more data.
+            //
+            if ( iPdlState >= EPbDlStateNotDownloading )
+            {
+                DisplayErrorMessageL( R_MPX_PDL_MORE_DATA_NEEDED_MSG );
+            }
+            else
+            {
+                DisplayErrorMessageL( R_MPX_VIDEO_INVALID_CLIP );
+            }
+
+            ClosePlaybackViewWithErrorL();
+
+            break;
+        }
+        default:
+        {
+            CMPXVideoBasePlaybackView::HandlePluginErrorL( aError );
+        }
+    }
+}
+
+// -----------------------------------------------------------------------------
+//   CMPXVideoPdlPlaybackView::HandlePdlStateChangeL
+// -----------------------------------------------------------------------------
+//
+void CMPXVideoPdlPlaybackView::HandlePdlStateChangeL( TInt aState )
+{
+    MPX_ENTER_EXIT(_L("CMPXVideoPdlPlaybackView::HandlePdlStateChangeL()"),
+                   _L("aState = %d"), aState );
+
+    TMPXPlaybackPdDownloadState prevPdlState = iPdlState;
+    iPdlState = (TMPXPlaybackPdDownloadState)aState;
+
+    switch ( aState )
+    {
+        case EPbDlStateDownloadError:
+        case EPbDlStateDownloadCanceled:
+        {
+            HandleCommandL( EMPXPbvCmdStop );
+            ClosePlaybackViewWithErrorL();
+            break;
+        }
+        case EPbDlStateDownloading:
+        {
+            if ( prevPdlState == EPbDlStateDownloadPaused )
+            {
+                if ( iContainer )
+                {
+                    iContainer->HandleEventL( EMPXControlCmdClearDownloadPaused );
+                }
+            }
+
+            break;
+        }
+        case EPbDlStateDownloadPaused:
+        {
+            //
+            //  If we are buffering, display information message and pause
+            //
+            if ( iPlaybackState == EPbStateBuffering  )
+            {
+                HandleCommandL( EMPXPbvCmdPause );
+
+                DisplayInfoMessageL( R_MPX_VIDEO_PDL_ALL_CONTENT_PLAYED_MSG, ETrue );
+                HandleCommandL( EAknSoftkeyBack );
+            }
+            else
+            {
+                //
+                //  Download has been paused, let container show
+                //  the download paused icon
+                //
+                if ( iContainer )
+                {
+                    iContainer->HandleEventL( EMPXControlCmdSetDownloadPaused );
+                }
+            }
+
+            break;
+        }
+        case EPbDlStateDownloadCompleted:
+        {
+            if ( iContainer )
+            {
+                iContainer->HandleEventL( EMPXControlCmdDownloadComplete, iDownloadSize );
+            }
+
+            break;
+        }
+        case EPbDlStateNotDownloading:
+        {
+            break;
+        }
+    }
+}
+
+// -------------------------------------------------------------------------------------------------
+//   CMPXVideoPdlPlaybackView::HandleStoppedStateL
+// -------------------------------------------------------------------------------------------------
+//
+void CMPXVideoPdlPlaybackView::HandleStoppedStateL()
+{
+    MPX_DEBUG(_L("CMPXVideoPdlPlaybackView::HandleStoppedStateL()"));
+
+    if ( iPdlReloading )
+    {
+        iPdlReloading = EFalse;
+    }
+    else
+    {
+        ClosePlaybackViewL();
+    }
+}
+
+// -------------------------------------------------------------------------------------------------
+//   CMPXVideoPdlPlaybackView::HandleBufferingStateL
+// -------------------------------------------------------------------------------------------------
+//
+void CMPXVideoPdlPlaybackView::HandleBufferingStateL()
+{
+    MPX_DEBUG(_L("CMPXVideoPdlPlaybackView::HandleBufferingStateL()"));
+
+    //
+    //  If the download is paused and the state is buffering,
+    //  display information message
+    //
+    if ( iPdlState == EPbDlStateDownloadPaused  )
+    {
+        HandleCommandL( EMPXPbvCmdPause );
+
+        DisplayInfoMessageL( R_MPX_VIDEO_PDL_ALL_CONTENT_PLAYED_MSG, ETrue );
+        HandleCommandL( EAknSoftkeyBack );
+    }
+}
+
+// -------------------------------------------------------------------------------------------------
+//   CMPXVideoPdlPlaybackView::SendPdlCustomCommandL()
+// -------------------------------------------------------------------------------------------------
+//
+void CMPXVideoPdlPlaybackView::SendPdlCustomCommandL( TMPXPlaybackPdCommand aCustomCmd )
+{
+    MPX_ENTER_EXIT(_L("CMPXVideoPdlPlaybackView::SendPdlCustomCommandL"),
+                   _L("aCustomCmd = %d"), aCustomCmd );
+
+    CMPXCommand* cmd = CMPXCommand::NewL();
+    CleanupStack::PushL( cmd );
+
+    cmd->SetTObjectValueL<TBool>( KMPXCommandGeneralDoSync, ETrue );
+    cmd->SetTObjectValueL<TInt>( KMPXCommandGeneralId, KMPXCommandIdPlaybackPD );
+    cmd->SetTObjectValueL<TMPXPlaybackPdCommand>( KMPXCommandPlaybackGeneralType, aCustomCmd );
+
+    iPlaybackUtility->CommandL( *cmd );
+
+    CleanupStack::PopAndDestroy( cmd );
+}
+
+// -------------------------------------------------------------------------------------------------
+//   CMPXVideoPdlPlaybackView::ClosePlaybackViewWithErrorL()
+// -------------------------------------------------------------------------------------------------
+//
+void CMPXVideoPdlPlaybackView::ClosePlaybackViewWithErrorL()
+{
+    MPX_ENTER_EXIT(_L("CMPXVideoPdlPlaybackView::ClosePlaybackViewWithErrorL"));
+
+    //
+    //  An error has been processed, set the playback state to Stopped and close the view
+    //
+    iPlaybackState = EPbStateStopped;
+
+    ClosePlaybackViewL();
+}
+
+// -------------------------------------------------------------------------------------------------
+//   CMPXVideoPdlPlaybackView::HandleInitializingStateL()
+// -------------------------------------------------------------------------------------------------
+//
+void CMPXVideoPdlPlaybackView::HandleInitializingStateL( TMPXPlaybackState aLastState )
+{
+    MPX_ENTER_EXIT(_L("CMPXVideoPdlPlaybackView::HandleInitializingStateL()"),
+                   _L("aLastState = %d"), aLastState );
+
+    //
+    //  For PDL view, reset the container and controls for new download
+    //
+    DoHandleInitializingStateL( aLastState );
+
+    //
+    //  User inputs should not be blocked since the new download is initializing
+    //
+    ResetPdlUserInputs();
+}
+
+// -------------------------------------------------------------------------------------------------
+//   CMPXVideoPdlPlaybackView::SendWindowCommandL()
+// -------------------------------------------------------------------------------------------------
+//
+void CMPXVideoPdlPlaybackView::SendWindowCommandL( TMPXVideoPlaybackCommand aCmd )
+{
+    MPX_ENTER_EXIT(_L("CMPXVideoPdlPlaybackView::SendWindowCommandL()"),
+                   _L("aCmd = %d"), aCmd );
+
+    CMPXVideoBasePlaybackView::SendWindowCommandL( aCmd );
+
+    if ( aCmd == EPbCmdHandleForeground )
+    {
+        //
+        //  If user inputs are blocked, start timer to unblock them
+        //
+        if ( iUserInputsBlocked )
+        {
+            if ( iBlockInputsTimer->IsActive() )
+            {
+                iBlockInputsTimer->Cancel();
+            }
+
+            //
+            //  Set timer to unblock user inputs after 1 second
+            //  The message from the download manager should take less than 1 second
+            //
+            iBlockInputsTimer->Start(
+                1000000,
+                0,
+                TCallBack( CMPXVideoPdlPlaybackView::HandleBlockInputsTimeOut, this ) );
+        }
+    }
+    else if ( aCmd == EPbCmdHandleBackground && ! IsAppInFrontL() )
+    {
+        //
+        //  Block all inputs when PDL view is sent to full background
+        //  Commands will be enabled when new command is received from LWP
+        //
+        iUserInputsBlocked = ETrue;
+        iContainer->UserInputHandler()->BlockPdlUserInputs( iUserInputsBlocked );
+    }
+}
+
+// -------------------------------------------------------------------------------------------------
+//   CMPXVideoPdlPlaybackView::HandlePdlReloadComplete()
+// -------------------------------------------------------------------------------------------------
+//
+void CMPXVideoPdlPlaybackView::HandlePdlReloadComplete()
+{
+    MPX_ENTER_EXIT(_L("CMPXVideoPdlPlaybackView::HandlePdlReloadComplete()"));
+
+    //
+    //  User inputs should not be blocked since the new PDL command is complete
+    //
+    ResetPdlUserInputs();
+}
+
+// -------------------------------------------------------------------------------------------------
+//   CMPXVideoPdlPlaybackView::ResetPdlUserInputs()
+// -------------------------------------------------------------------------------------------------
+//
+void CMPXVideoPdlPlaybackView::ResetPdlUserInputs()
+{
+    MPX_ENTER_EXIT(_L("CMPXVideoPdlPlaybackView::ResetPdlUserInputs()"));
+
+    iUserInputsBlocked = EFalse;
+    iContainer->UserInputHandler()->BlockPdlUserInputs( iUserInputsBlocked );
+
+    if ( iBlockInputsTimer->IsActive() )
+    {
+        iBlockInputsTimer->Cancel();
+    }
+}
+
+// -------------------------------------------------------------------------------------------------
+//   CMPXVideoPdlPlaybackView::HandleBlockInputsTimeOut()
+// -------------------------------------------------------------------------------------------------
+//
+TInt CMPXVideoPdlPlaybackView::HandleBlockInputsTimeOut( TAny* aPtr )
+{
+    MPX_DEBUG(_L("CMPXVideoPdlPlaybackView::HandleBlockInputsTimeOut()"));
+
+    static_cast<CMPXVideoPdlPlaybackView*>(aPtr)->DoHandleBlockInputsTimeOut();
+    return KErrNone;
+}
+
+// -------------------------------------------------------------------------------------------------
+//   CMPXVideoPdlPlaybackView::DoHandleBlockInputsTimeOut()
+// -------------------------------------------------------------------------------------------------
+//
+void CMPXVideoPdlPlaybackView::DoHandleBlockInputsTimeOut()
+{
+    //
+    //  Check if we are reloading due to the message from the Download Manager
+    //  If we are still reloading, keep the user inputs blocked.
+    //  If not, unblock the user inputs
+    //
+    if ( ! iPdlReloading )
+    {
+        //
+        //  Reload message not received, unblock inputs
+        //
+        ResetPdlUserInputs();
+    }
+}
+
+// EOF