mpxplugins/viewplugins/views/pdsbplaybackview/src/mpxpdsbplaybackviewimp.cpp
changeset 0 ff3acec5bc43
child 9 13afc0e517bd
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mpxplugins/viewplugins/views/pdsbplaybackview/src/mpxpdsbplaybackviewimp.cpp	Thu Dec 17 08:45:05 2009 +0200
@@ -0,0 +1,908 @@
+/*
+* Copyright (c) 2007 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 Progressive Download Playback view
+*
+*/
+
+
+
+// INCLUDE FILES
+#include <aknViewAppUi.h>
+#include <eikmenub.h>
+#include <eikapp.h>
+#include <AknUtils.h>
+#include <bautils.h>
+#include <featmgr.h>
+#include <data_caging_path_literals.hrh>
+#include <mpxplaybackmessage.h>
+#include <mpxcommonplaybackview.rsg>
+#include <mpxpdsbplaybackview.rsg>
+#include <mpxcmn.h>
+#include <mpxplaybackutility.h>
+#include <mpxviewutility.h>
+#include <StringLoader.h>
+#include <AknQueryDialog.h>
+#include <MProfileEngine.h>
+#include <e32property.h>
+#include <mpxmessagegeneraldefs.h>
+#include <mpxcommandgeneraldefs.h>
+#include <apgwgnam.h>
+#include <mpxuser.h>
+#include <sacls.h>
+
+#include "mpxcommonuihelper.h"
+#include "mpxcommonplaybackview.hrh"
+#include "mpxpdsbplaybackview.hrh"
+#include "mpxpdsbplaybackviewimp.h"
+#include "mpxpdsbplaybackviewcontainer.h"
+#include "mpxpdsbplaybackviewlayout.h"
+#include "mpxlog.h"
+#include "mpxappui.hrh"
+
+#include <akntoolbar.h>
+#include <aknbutton.h>
+
+// CONSTANTS
+_LIT( KMPXPdSbPlaybackRscPath, "mpxpdsbplaybackview.rsc" );
+#define KMPlayerBrowserUid    0x10008D39
+#define KMPlayerBrowserUid2   0x1020724D
+#define KProgressDownloadUid  0x10207BCD
+
+// ======== MEMBER FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// ---------------------------------------------------------------------------
+//
+CMPXPdSbPlaybackViewImp::CMPXPdSbPlaybackViewImp()
+    {
+    // Do nothing
+    }
+
+// ---------------------------------------------------------------------------
+// Symbian 2nd phase constructor can leave.
+// ---------------------------------------------------------------------------
+//
+void CMPXPdSbPlaybackViewImp::ConstructL()
+    {
+    MPX_FUNC( "CMPXPdSbPlaybackViewImp::ConstructL" );
+
+    CMPXCommonPlaybackViewImp::ConstructL();
+    iPlaybackUtility->RemoveObserverL( *this );
+    iPlaybackUtility->Close();
+    iPlaybackUtility = MMPXPlaybackUtility::UtilityL( TUid::Uid(KProgressDownloadUid) );
+    iPlaybackUtility->AddObserverL( *this );
+
+    // Need to set a higher priority because download manager sets it's
+    // own priority high, so we need to make sure we're at least the same
+    iPlaybackUtility->SetPriority( CActive::EPriorityStandard + 2 );
+
+    CCoeEnv* coeEnv = iEikonEnv;
+    TParse parse;
+    parse.Set( KMPXPdSbPlaybackRscPath, &KDC_APP_RESOURCE_DIR, NULL );
+    TFileName resourceFile = parse.FullName();
+    User::LeaveIfError( MPXUser::CompleteWithDllPath( resourceFile ) );
+    BaflUtils::NearestLanguageFile( coeEnv->FsSession(), resourceFile );
+    iPdResourceOffset = coeEnv->AddResourceFileL( resourceFile );
+
+    BaseConstructL( R_MPX_PD_SB_PLAYBACK_VIEW );
+    if(AknLayoutUtils::PenEnabled())
+        {
+        CAknView::ShowToolbarOnViewActivation(ETrue);
+        if ( Toolbar() )
+            {
+            iToolbar = Toolbar();
+            iToolbar->SetToolbarObserver( this );
+            }
+        }
+    iDownloadState = EPbDlStateDownloading;     // Otherwise we will show "Download Stopped"
+    }
+
+// ---------------------------------------------------------------------------
+// Two-phased constructor.
+// ---------------------------------------------------------------------------
+//
+CMPXPdSbPlaybackViewImp* CMPXPdSbPlaybackViewImp::NewL()
+    {
+    CMPXPdSbPlaybackViewImp* self = CMPXPdSbPlaybackViewImp::NewLC();
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+// ---------------------------------------------------------------------------
+// Two-phased constructor.
+// ---------------------------------------------------------------------------
+//
+CMPXPdSbPlaybackViewImp* CMPXPdSbPlaybackViewImp::NewLC()
+    {
+    CMPXPdSbPlaybackViewImp* self = new ( ELeave ) CMPXPdSbPlaybackViewImp();
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    return self;
+    }
+
+// ---------------------------------------------------------------------------
+// Destructor
+// ---------------------------------------------------------------------------
+//
+CMPXPdSbPlaybackViewImp::~CMPXPdSbPlaybackViewImp()
+    {
+    MPX_DEBUG1( "CMPXPdSbPlaybackViewImp::~CMPXPdSbPlaybackViewImp entering" );
+
+    delete iPlaybackViewLayout;
+
+    if ( iPdResourceOffset )
+        {
+        iEikonEnv->DeleteResourceFile( iPdResourceOffset );
+        }
+
+    MPX_DEBUG1( "CMPXPdSbPlaybackViewImp::~CMPXPdSbPlaybackViewImp exiting" );
+    }
+
+
+// ---------------------------------------------------------------------------
+// Gets download information
+// ---------------------------------------------------------------------------
+//
+void CMPXPdSbPlaybackViewImp::GetDownloadInformationL(
+        TUint& aTransactionId,
+        TMPXPlaybackPdDownloadState& aState,
+        TInt& aDownloadedBytes,
+        TInt& aTotalBytes )
+    {
+    MPX_DEBUG1("CMPXPdSbPlaybackViewImp::GetDownloadInformationL() entering");
+
+    // Create the command to send to MPX
+    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 );
+
+    // Check that return values were provided
+    ASSERT( cmd->IsSupported( KMPXCommandPlaybackPDTransactionID ) &&
+            cmd->IsSupported( KMPXCommandPlaybackPDState ) &&
+            cmd->IsSupported( KMPXCommandPlaybackPDDownloadedBytes ) &&
+            cmd->IsSupported( KMPXCommandPlaybackPDTotalBytes ));
+
+    // Copy the return values
+    aTransactionId = cmd->ValueTObjectL<TUint>( KMPXCommandPlaybackPDTransactionID );
+    aState = cmd->ValueTObjectL<TMPXPlaybackPdDownloadState>( KMPXCommandPlaybackPDState );
+    aDownloadedBytes = cmd->ValueTObjectL<TInt>( KMPXCommandPlaybackPDDownloadedBytes );
+    aTotalBytes = cmd->ValueTObjectL<TInt>( KMPXCommandPlaybackPDTotalBytes );
+    CleanupStack::PopAndDestroy( cmd );
+
+    MPX_DEBUG1("CMPXPdSbPlaybackViewImp::GetDownloadInformationL() exiting");
+    }
+
+// -----------------------------------------------------------------------------
+// CMPXPdSbPlaybackViewImp::CheckSignalAvailableL
+// This checks for Network available, and Network Strength > none.
+// - Return ETrue if network available and network strength
+// is Low or Medium or High, otherwise return EFalse.
+// -----------------------------------------------------------------------------
+//
+TBool CMPXPdSbPlaybackViewImp::CheckSignalAvailableL( TUid& aCheck, TInt& aState )
+    {
+    TBool ret( ETrue );
+
+    // Check the network is available.
+    aCheck = KUidNetworkStatus;
+    TInt err( RProperty::Get( KUidSystemCategory, KUidNetworkStatusValue, aState ));
+    if ( err != KErrNone )
+        {
+        aState = ESANetworkUnAvailable;
+        }
+    if( aState != ESANetworkAvailable )
+        {
+        ret = EFalse;
+        }
+
+    // Check network coverage.
+    aCheck = KUidNetworkStrength;
+    err = RProperty::Get( KUidSystemCategory, KUidNetworkStrengthValue, aState );
+    if ( err != KErrNone )
+        {
+        aState = ESANetworkStrengthUnknown;
+        }
+    if( aState != ESANetworkStrengthLow &&
+        aState != ESANetworkStrengthMedium &&
+        aState != ESANetworkStrengthHigh )
+        {
+        ret = EFalse;
+        }
+
+    //passed all tests, OK to send
+    return ret;
+    }
+
+// ---------------------------------------------------------------------------
+// Handle playback message.
+// ---------------------------------------------------------------------------
+//
+void CMPXPdSbPlaybackViewImp::DoHandlePlaybackMessageL(
+    const CMPXMessage& aMessage )
+    {
+    MPX_FUNC( "-->CMPXPdSbPlaybackViewImp::DoHandlePlaybackMessageL" );
+
+    TMPXMessageId id( aMessage.ValueTObjectL<TMPXMessageId>( KMPXMessageGeneralId ) );
+    if ( KMPXMessageGeneral == id )
+        {
+        TInt type( aMessage.ValueTObjectL<TInt>( KMPXMessageGeneralType ) );
+        TInt data( aMessage.ValueTObjectL<TInt>( KMPXMessageGeneralData ) );
+        MPX_DEBUG2( "CMPXPdPlaybackViewImp::DoHandlePlaybackMessageL type = %d", type );
+        switch ( aMessage.ValueTObjectL<TInt>( KMPXMessageGeneralEvent ) )
+            {
+            case TMPXPlaybackMessage::EDownloadPositionChanged:
+                {
+                if ( iContainer )
+                    {
+                    MPX_DEBUG2( "CMPXPdPlaybackViewImp::DoHandlePlaybackMessageL - EDownloadPositionChanged(%d)", data );
+                    CMPXPdSbPlaybackViewContainer* container =
+                        static_cast<CMPXPdSbPlaybackViewContainer*>(iContainer);
+                    container->HandleDownloadPositionChanged( data, iTotalBytes );
+                    }
+                break;
+                }
+            case TMPXPlaybackMessage::EDownloadStateChanged:
+                {
+                TInt data( *aMessage.Value<TInt>( KMPXMessageGeneralData ) );
+                MPX_DEBUG2( "CMPXPdSbPlaybackViewImp::DoHandlePlaybackMessageL - EDownloadStateChanged(%d)", data );
+                iDownloadState = static_cast<TMPXPlaybackPdDownloadState>( data );
+                if ( iDownloadState == EPbDlStateDownloading ||
+                     iDownloadState == EPbDlStateDownloadCompleted )
+                    {
+                    RequestMediaL();
+                    }
+                if( iContainer && iDownloadState == EPbDlStateDownloadCompleted )
+                    {
+                    CMPXPdSbPlaybackViewContainer* container =
+                        static_cast<CMPXPdSbPlaybackViewContainer*>(iContainer);
+                    container->HandleDownloadPositionChanged( iTotalBytes, iTotalBytes );
+                    }
+                UpdateViewL();
+                break;
+                }
+            case TMPXPlaybackMessage::EStateChanged:
+                {
+                MPX_DEBUG2( "CMPXPdSbPlaybackViewImp::DoHandlePlaybackMessageL - EStateChanged(%d)", type );
+
+                UpdateToolbar();
+                UpdateMiddleSoftKeyDisplayL();
+                TInt data( *aMessage.Value<TInt>( KMPXMessageGeneralData ) );
+                TMPXPlaybackState state =
+                    static_cast<TMPXPlaybackState>( type );
+                DoHandleStateChangedL( state, data );
+                if ( iDownloadState == EPbDlStateDownloadPaused && state == EPbStatePaused )
+                    {
+                    iCommonUiHelper->DisplayInfoNoteL( R_MPX_DOWNLOAD_PLAYED_ALL_CONTENT );
+                    }
+                break;
+                }
+            case TMPXPlaybackMessage::EDownloadStarted:
+                {
+                iTotalBytes = aMessage.ValueTObjectL<TInt>( KMPXMessageGeneralData );
+                MPX_DEBUG2( "CMPXPdSbPlaybackViewImp::DoHandlePlaybackMessageL - DownloadStarted, totalBytes = %d", iTotalBytes );
+                break;
+                }
+
+            case TMPXPlaybackMessage::EDownloadUpdated:
+                {
+                iTotalBytes = aMessage.ValueTObjectL<TInt>( KMPXMessageGeneralData );
+                MPX_DEBUG2( "CMPXPdSbPlaybackViewImp::DoHandlePlaybackMessageL - DownloadUpdated, totalBytes = %d", iTotalBytes );
+                break;
+                }
+
+
+            case TMPXPlaybackMessage::EMediaChanged:
+
+                iPlaybackCompleted = ETrue;
+                if ( !iForeground )
+                    {
+                    //TODO: Add something like AppUi()->HandleCommandL( EMPXCmdGoToNowPlaying ); but it should not bring to foreground
+                    }
+                break;
+            case TMPXPlaybackMessage::EDownloadCmdCancelDownload:
+                // stop playback
+                // bring back previous now playing view
+                AppUi()->HandleCommandL( EMPXCmdGoToNowPlaying );
+                // Bring Browser to foreground.
+                BringUpBrowserL();
+                break;
+            case TMPXPlaybackMessage::EDownloadFileMoved:
+                {
+                // set updated Uri from aMessage for iMedia
+                iMedia->SetTextValueL( KMPXMediaGeneralUri, aMessage.ValueText( KMPXMediaGeneralUri ) );
+                break;
+                }
+
+            default:
+                {
+                CMPXCommonPlaybackViewImp::DoHandlePlaybackMessageL( aMessage );
+                break;
+                }
+            }
+        }
+    MPX_DEBUG1("<--CMPXPdSbPlaybackViewImp::DoHandlePlaybackMessageL()");
+    }
+
+// ---------------------------------------------------------------------------
+// Handle playback state changed.
+// ---------------------------------------------------------------------------
+//
+void CMPXPdSbPlaybackViewImp::DoHandleStateChangedL(
+    TMPXPlaybackState aState,
+    TInt aData )
+    {
+    MPX_DEBUG2( "CMPXPdSbPlaybackViewImp::DoHandleStateChangedL(%d)", aState );
+
+    switch ( aState )
+        {
+        case EPbStateInitialising:
+            {
+            UpdatePlaybackState( aState );
+            UpdateDownloadStateLabelL();
+            RequestMediaL();
+            break;
+            }
+        case EPbStatePlaying:
+            RequestMediaL();
+            CMPXCommonPlaybackViewImp::DoHandleStateChangedL( aState, aData );
+            break;
+        case EPbStateStopped:
+        case EPbStatePaused:
+            if ( iExiting )
+                {
+                AppUi()->RunAppShutter();
+                }
+        default:
+            {
+            CMPXCommonPlaybackViewImp::DoHandleStateChangedL( aState, aData );
+            break;
+            }
+        }
+    MPX_DEBUG1("CMPXPdSbPlaybackViewImp::DoHandleStateChangedL()");
+    }
+
+// ---------------------------------------------------------------------------
+// Updates download state label.
+// ---------------------------------------------------------------------------
+//
+void CMPXPdSbPlaybackViewImp::UpdateDownloadStateLabelL()
+    {
+    MPX_DEBUG1("CMPXPdSbPlaybackViewImp::UpdateDownloadStateLabelL() entering");
+
+    if ( iContainer && !iSwitchingView )
+        {
+        TInt resId = KErrNotFound;
+        switch ( iDownloadState )
+            {
+            case EPbDlStateBuffering:
+                {
+                MPX_DEBUG1("CMPXPdSbPlaybackViewImp::UpdateDownloadStateLabelL() - Buffering");
+                resId = R_MPX_DOWNLOAD_STATUS_BUFFERING;
+                break;
+                }
+            case EPbDlStateDownloadPaused:
+                {
+                // If offline mode, this case will be entered.
+                resId = R_MPX_DOWNLOAD_STATUS_PAUSED;
+                TBool offLine( EFalse );
+
+                // Check profile, display "Download Stopped" if
+                // Offline enabled.
+                MProfileEngine* profileEngine( CreateProfileEngineL() );
+
+                if ( profileEngine->ActiveProfileId() == EProfileOffLineId )
+                    {
+                    MPX_DEBUG1("CMPXPdSbPlaybackViewImp::UpdateDownloadStateLabelL() -- OffLine ");
+                    offLine = ETrue;
+                    resId = R_MPX_DOWNLOAD_STATUS_INTERRUPTED;
+                    }
+                profileEngine->Release();
+
+                if ( !offLine )
+                    {
+                    // Check network coverage, display "Download Stopped" if
+                    // No coverage.
+                    TUid uid;
+                    TInt res( 0 );
+                    TBool signalAvailable( CheckSignalAvailableL( uid, res ));
+
+                    if ( !signalAvailable )
+                        {
+                        MPX_DEBUG1("CMPXPdSbPlaybackViewImp::UpdateDownloadStateLabelL() -- No Signal ");
+                        resId = R_MPX_DOWNLOAD_STATUS_INTERRUPTED;
+                        }
+                    }
+
+                break;
+                }
+            case EPbDlStateDownloadError:
+            case EPbDlStateDownloadCanceled:
+            case EPbDlStateNotDownloading:
+                {
+                MPX_DEBUG1("CMPXPdSbPlaybackViewImp::UpdateDownloadStateLabelL() - Download Canceled");
+                resId = R_MPX_DOWNLOAD_STATUS_INTERRUPTED;
+                break;
+                }
+            case EPbDlStateDownloadCompleted:
+                {
+                MPX_DEBUG1("CMPXPdSbPlaybackViewImp::UpdateDownloadStateLabelL() - Download Completed");
+                resId = R_MPX_DOWNLOAD_STATUS_COMPLETED;
+                break;
+                }
+            case EPbDlStateDownloading:
+            default:
+                {
+                MPX_DEBUG2(" default state: %d", iDownloadState );
+                // Do nothing
+                break;
+                }
+            }
+/*
+        // Display Album art in progressive download
+        if( iActualAlbumArtBitmap )
+            {
+            MPX_DEBUG1("CMPlayerPlaybackContainer::UpdateDownloadStateLabelL() - Draw ActualAlbumArt");
+            iAlbumArtBitmap = iActualAlbumArtBitmap;
+            DrawNow();
+            }
+        else
+            {
+            MPX_DEBUG1("CMPlayerPlaybackContainer::UpdateDownloadStateLabelL() - Draw DefaultAlbumArt");
+            // Display default Album Art
+            iAlbumArtBitmap = iDefaultAlbumArtBitmap;
+            DrawNow();
+            }
+*/
+
+        if (resId != KErrNotFound)
+            {
+            // Display download status text
+            HBufC* statusText = StringLoader::LoadLC( resId );
+            iContainer->UpdateLabelL( ETextDownloadState, *statusText );
+            CleanupStack::PopAndDestroy( statusText );
+            }
+        else
+            {
+            // Clear download status text
+            iContainer->UpdateLabelL( ETextDownloadState, KNullDesC );
+            }
+        }
+
+    MPX_DEBUG1("CMPXPdSbPlaybackViewImp::UpdateDownloadStateLabelL() exiting");
+    }
+
+// ---------------------------------------------------------------------------
+// Displays error notes.
+// ---------------------------------------------------------------------------
+//
+void CMPXPdSbPlaybackViewImp::HandleErrorL( TInt aError )
+    {
+    MPX_DEBUG2("CMPXPdSbPlaybackViewImp::HandleErrorL(%d): Entering", aError);
+    if ( aError )
+        {
+        TUint transactionId(0);
+        TMPXPlaybackPdDownloadState state( EPbDlStateNotDownloading );
+        TInt downloadedBytes(0);
+        TInt totalBytes(0);
+        GetDownloadInformationL( transactionId,
+                                 state,
+                                 downloadedBytes,
+                                 totalBytes );
+        if ( EPbDlStateBuffering == state ||
+             EPbDlStateDownloading == state ||
+             EPbDlStateDownloadPaused == state )
+            {
+            CMPXCommand* cmd( CMPXCommand::NewL() );
+            CleanupStack::PushL( cmd );
+            cmd->SetTObjectValueL<TBool>( KMPXCommandGeneralDoSync, ETrue );
+            cmd->SetTObjectValueL<TInt>( KMPXCommandGeneralId, KMPXCommandIdPlaybackPD );
+            cmd->SetTObjectValueL<TMPXPlaybackPdCommand>(
+                KMPXCommandPlaybackGeneralType,
+                EPbCmdCancelPd );
+            iPlaybackUtility->CommandL( *cmd );
+            CleanupStack::PopAndDestroy( cmd );
+            }
+        iCommonUiHelper->HandleErrorL( aError );
+        CMPXCommonPlaybackViewImp::HandleCommandL( EAknSoftkeyBack );
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// From MEikMenuObserver
+// Dynamically initialises a menu pane.
+// ---------------------------------------------------------------------------
+//
+void CMPXPdSbPlaybackViewImp::DynInitMenuPaneL(
+    TInt aResourceId,
+    CEikMenuPane* aMenuPane )
+    {
+    MPX_DEBUG2("CMPXPdSbPlaybackViewImp::DynInitMenuPaneL(%d): entering", aResourceId);
+
+    // Override base menu actions
+    switch ( aResourceId )
+        {
+        case R_MPX_PD_SB_PLAYBACK_VIEW_MENU:
+            {
+            aMenuPane->SetItemDimmed(
+                EMPXPbvCmdResumeDownload,
+                iDownloadState != EPbDlStateDownloadPaused);
+            aMenuPane->SetItemDimmed(
+                EMPXPbvCmdCancelDownload,
+                iDownloadState != EPbDlStateDownloading &&
+                iDownloadState != EPbDlStateBuffering &&
+                iDownloadState != EPbDlStateDownloadPaused);
+
+			// Check if FM Transmitter is supported
+			if ( !FeatureManager::FeatureSupported( KFeatureIdFmtx ) )
+				{
+				aMenuPane->SetItemDimmed(
+					EMPXPbvCmdFMTransmitter,
+					ETrue );
+				}
+
+            if ( iDownloadState == EPbDlStateDownloading ||
+                 iDownloadState == EPbDlStateBuffering ||
+                 iDownloadState == EPbDlStateDownloadPaused ||
+                 iPlaybackState == EPbStateInitialising ||
+                 iPlaybackState == EPbStatePlaying ||
+                 iPlaybackState == EPbStatePaused  )
+                {
+                aMenuPane->SetItemDimmed(
+                    EMPXPbvCmdUseAsCascade, ETrue );
+                }
+			else
+                {
+                aMenuPane->SetItemDimmed(
+                    EMPXPbvCmdUseAsCascade, EFalse );
+                }
+			break;
+            }
+        default:
+            {
+            // Call base clase to handle most cases
+            CMPXCommonPlaybackViewImp::DynInitMenuPaneL( aResourceId, aMenuPane );
+            break;
+            }
+        }
+
+    MPX_DEBUG1("CMPXPdSbPlaybackViewImp::DynInitMenuPaneL(): exiting");
+    }
+
+// ---------------------------------------------------------------------------
+// From CAknView
+// Command handling function.
+// ---------------------------------------------------------------------------
+//
+void CMPXPdSbPlaybackViewImp::HandleCommandL( TInt aCommand )
+    {
+    MPX_DEBUG2("CMPXPdSbPlaybackViewImp::HandleCommandL(%d) entering", aCommand);
+
+    switch (aCommand)
+        {
+        case EMPXPbvCmdResumeDownload:
+            {
+            if ( EPbDlStateDownloadPaused == iDownloadState )
+                {
+                CMPXCommand* cmd( CMPXCommand::NewL() );
+                CleanupStack::PushL( cmd );
+                cmd->SetTObjectValueL<TBool>( KMPXCommandGeneralDoSync, ETrue );
+                cmd->SetTObjectValueL<TInt>( KMPXCommandGeneralId, KMPXCommandIdPlaybackPD );
+                cmd->SetTObjectValueL<TMPXPlaybackPdCommand>(
+                    KMPXCommandPlaybackGeneralType,
+                    EPbCmdResumePd );
+                iPlaybackUtility->CommandL( *cmd );
+                CleanupStack::PopAndDestroy( cmd );
+                }
+            break;
+            }
+        case EMPXPbvCmdCancelDownload:
+            {
+            if ( EPbDlStateDownloading == iDownloadState ||
+                 EPbDlStateBuffering == iDownloadState ||
+                 EPbDlStateDownloadPaused == iDownloadState )
+                {
+                HBufC* queryTxt = StringLoader::LoadLC( R_MPX_CONF_CANCEL_DOWNLOAD_TXT );
+                CAknQueryDialog* query = CAknQueryDialog::NewL(
+                                            CAknQueryDialog::EConfirmationTone );
+
+/* TODO: add when we support cover UI
+#ifdef __COVER_DISPLAY      //VCPCCMOD_BEGIN
+                query->PublishDialogL(
+                        EMPXNoteMusicshopCancel,
+                        KMPXNoteCategory);
+#endif  //__COVER_DISPLAY   //VCPCCMOD_END
+*/
+
+                if ( query->ExecuteLD(
+                        R_MPX_GENERIC_CONFIRMATION_QUERY,
+                        *queryTxt ))
+                    {
+                    iPlaybackUtility->CommandL( EPbCmdStop );
+                    CMPXCommand* cmd( CMPXCommand::NewL() );
+                    CleanupStack::PushL( cmd );
+                    cmd->SetTObjectValueL<TBool>( KMPXCommandGeneralDoSync, ETrue );
+                    cmd->SetTObjectValueL<TInt>( KMPXCommandGeneralId, KMPXCommandIdPlaybackPD );
+                    cmd->SetTObjectValueL<TMPXPlaybackPdCommand>(
+                        KMPXCommandPlaybackGeneralType,
+                        EPbCmdCancelPd );
+                    iPlaybackUtility->CommandL( *cmd );
+                    CleanupStack::PopAndDestroy( cmd );
+                    iPlaybackUtility->CommandL( EPbCmdClose );
+                    }
+                CleanupStack::PopAndDestroy( queryTxt );
+                }
+            break;
+            }
+        case EAknSoftkeyBack:
+            {
+            if ( iPlaybackCompleted )
+                {
+                AppUi()->HandleCommandL( EMPXCmdGoToNowPlaying );
+                }
+            // Goto Browser, Bring Browser to foreground.
+            if ( !BringUpBrowserL() )
+                {
+                //We are in Music Store, launched from Download Mgr. Instead, stop playback
+                iPlaybackUtility->CommandL( EPbCmdStop );
+                iPlaybackUtility->CommandL( EPbCmdClose );
+                iExiting = ETrue;
+                }
+            }
+            break;
+        case EMPXPbvCmdExitPDPlaybackView:
+            if ( iPlaybackState == EPbStatePlaying )
+                {
+                iPlaybackUtility->CommandL( EPbCmdStop );
+                iExiting = ETrue;
+                }
+            else
+                {
+                AppUi()->RunAppShutter();
+                }
+            break;
+        case EMPXPbvCmdGotoMusicMenu:
+            AppUi()->HandleCommandL( EMPXCmdGotoCollection );
+
+        default:
+            {
+            CMPXCommonPlaybackViewImp::HandleCommandL( aCommand );
+            break;
+            }
+        }
+
+    MPX_DEBUG1("CMPXPdSbPlaybackViewImp::HandleCommandL() exiting");
+    }
+
+// ---------------------------------------------------------------------------
+// Handle playback property.
+// ---------------------------------------------------------------------------
+//
+void CMPXPdSbPlaybackViewImp::DoHandlePropertyL(
+    TMPXPlaybackProperty aProperty,
+    TInt aValue,
+    TInt aError )
+    {
+    MPX_FUNC( "CMPXPdSbPlaybackViewImp::DoHandlePropertyL" );
+    MPX_DEBUG4( "HandlePropertyL - Property(%d); Value(%d); Error(%d)", aProperty, aValue, aError );
+
+    if ( KErrNone == aError )
+        {
+        switch ( aProperty  )
+            {
+            case EPbPropertyRandomMode:
+            case EPbPropertyRepeatMode:
+            // ignore these cases in PD
+                break;
+            default:
+                {
+                CMPXCommonPlaybackViewImp::DoHandlePropertyL(aProperty,aValue,aError);
+                break;
+                }
+            }
+        }
+    else
+        {
+        HandleErrorL( aError );
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// From CAknView
+// Returns views id.
+// ---------------------------------------------------------------------------
+//
+TUid CMPXPdSbPlaybackViewImp::Id() const
+    {
+    return TUid::Uid( KMPXPdSbPlaybackViewId );
+    }
+
+// ---------------------------------------------------------------------------
+// From CAknView
+// Processes user commands.
+// ---------------------------------------------------------------------------
+//
+void CMPXPdSbPlaybackViewImp::ProcessCommandL( TInt aCommand )
+    {
+    MPX_DEBUG2("CMPXPdSbPlaybackViewImp::ProcessCommandL(%d): entering", aCommand);
+    if ( aCommand == EAknCmdExit )
+        {
+        if ( MenuBar() )
+            {
+            MenuBar()->StopDisplayingMenuBar();
+            }
+        }
+    CAknView::ProcessCommandL( aCommand );
+    MPX_DEBUG1("CMPXPdSbPlaybackViewImp::ProcessCommandL(): exiting");
+    }
+
+// ---------------------------------------------------------------------------
+// From CAknView
+// Handles a view activation.
+// ---------------------------------------------------------------------------
+//
+void CMPXPdSbPlaybackViewImp::DoActivateL(
+    const TVwsViewId& aPrevViewId,
+    TUid aCustomMessageId,
+    const TDesC8& aCustomMessage )
+    {
+    MPX_FUNC( "CMPXPdSbPlaybackViewImp::DoActivateL()" );
+
+    if ( !iContainer )
+        {
+        if ( !iPlaybackViewLayout )
+            {
+            iPlaybackViewLayout = CMPXPdSbPlaybackViewLayout::NewL();
+            }
+            iContainer = new ( ELeave ) CMPXPdSbPlaybackViewContainer(
+                                        this,
+                                        this,
+                                        iPlaybackViewLayout );
+        iContainer->SetMopParent( this );
+        iContainer->ConstructL( ClientRect() );
+        AppUi()->AddToStackL( *this, iContainer );
+        }
+
+    CMPXCommonPlaybackViewImp::DoActivateL( aPrevViewId , aCustomMessageId, aCustomMessage );
+    UpdateMiddleSoftKeyDisplayL();
+    }
+
+
+// ---------------------------------------------------------
+// Bring Browser application to the foreground.
+// ---------------------------------------------------------
+//
+TBool CMPXPdSbPlaybackViewImp::BringUpBrowserL()
+    {
+    RWsSession& wsSession=iEikonEnv->WsSession();
+    TInt count=wsSession.NumWindowGroups( 0 );
+
+    RArray<RWsSession::TWindowGroupChainInfo> allWgIds;
+    CleanupClosePushL(allWgIds);
+    User::LeaveIfError(wsSession.WindowGroupList(&allWgIds));
+
+    count = allWgIds.Count();
+
+    CApaWindowGroupName* windowName;
+
+    TBool browserFound = EFalse;
+    for ( TInt index=0; index < count; index++ )
+        {
+        RWsSession::TWindowGroupChainInfo& info = allWgIds[index];
+
+        if ( info.iParentId <= 0 )
+            {
+            TInt wgId=info.iId;
+            windowName = CApaWindowGroupName::NewLC(wsSession, wgId);
+            TUid applicationUid = windowName->AppUid();
+            if ( applicationUid == TUid::Uid(KMPlayerBrowserUid))
+                {
+                TApaTask task( iEikonEnv->WsSession() );
+                task.SetWgId( wgId );
+                task.BringToForeground();
+                browserFound = ETrue;
+                }
+            CleanupStack::PopAndDestroy();  //windowName
+            }
+        }
+
+    CleanupStack::PopAndDestroy( &allWgIds );
+
+    return browserFound;
+    }
+
+
+// ---------------------------------------------------------------------------
+// From CAknView
+// Foreground event handling function.
+// ---------------------------------------------------------------------------
+//
+void CMPXPdSbPlaybackViewImp::HandleForegroundEventL( TBool aForeground )
+    {
+    MPX_DEBUG2( "--->CMPXPdSbPlaybackViewImp::HandleForegroundEventL(%d)", aForeground );
+
+    iForeground = aForeground;
+    CMPXCommonPlaybackViewImp::HandleForegroundEventL(aForeground);
+    MPX_DEBUG1( "<---CMPXPdSbPlaybackViewImp::HandleForegroundEventL()" );
+    }
+
+
+// -----------------------------------------------------------------------------
+// From MAknToolbarObserver
+// Used to change toolbar settings before toolbar becomes visible
+// -----------------------------------------------------------------------------
+//
+void CMPXPdSbPlaybackViewImp::DynInitToolbarL(TInt aResourceId, CAknToolbar* aToolbar)
+    {
+    if(aResourceId == R_MPX_PBV_TOUCH_TOOLBAR)
+        {
+        // Put initializations here to take effect before toolbar is shown
+        aToolbar->SetItemDimmed( EMPXPbvCmdPreviousListItem, ETrue, EFalse );
+        aToolbar->SetItemDimmed( EMPXPbvCmdNextListItem, ETrue, EFalse );
+        UpdateToolbar();
+        aToolbar->UpdateBackground();
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// From MAknToolbarObserver
+// Handles toolbar events
+// -----------------------------------------------------------------------------
+//
+void CMPXPdSbPlaybackViewImp::OfferToolbarEventL( TInt aCommandId )
+    {
+    CAknView::ProcessCommandL( aCommandId );
+    }
+
+// ---------------------------------------------------------------------------
+// Updates the middle toolbar button
+// ---------------------------------------------------------------------------
+//
+void CMPXPdSbPlaybackViewImp::UpdateToolbar()
+    {
+    MPX_FUNC( "CMPXPdSbPlaybackViewImp::UpdateToolbar" );
+
+    if ( AknLayoutUtils::PenEnabled() && Toolbar())
+        {
+        CAknToolbar* toolbar = Toolbar();
+        TBool pausePlayDimmed(ETrue);
+        MMPXSource* s = iPlaybackUtility->Source();
+        if ( s )
+            {
+            TMPXPlaybackState state = iPlaybackUtility->StateL();
+            CAknButton* pausePlayControl;
+            pausePlayControl = (CAknButton*)(toolbar->ComponentControl( 1 ));
+            if ((state == EPbStateInitialising) || (state == EPbStatePlaying))
+                {
+                pausePlayControl->SetCurrentState(0, ETrue);
+                }
+            else
+                {
+                pausePlayControl->SetCurrentState(1, ETrue);
+                }
+            if ( state == EPbStatePlaying ||
+                    state == EPbStatePaused ||
+                    state == EPbStateStopped )
+                {
+                pausePlayDimmed = EFalse;
+                }
+            }
+        toolbar->SetItemDimmed( EMPXPbvCmdPlayPause, pausePlayDimmed, ETrue );
+        }
+    }
+//  End of File