mpxplugins/viewplugins/views/commonplaybackview/src/mpxcommonplaybackviewcontainer.cpp
changeset 0 ff3acec5bc43
child 1 8118492f1bdf
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mpxplugins/viewplugins/views/commonplaybackview/src/mpxcommonplaybackviewcontainer.cpp	Thu Dec 17 08:45:05 2009 +0200
@@ -0,0 +1,1684 @@
+/*
+* Copyright (c) 2006 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 Common Playback view's container.
+*
+*/
+
+
+
+// INCLUDE FILES
+#include <eiklabel.h>
+#include <eikimage.h>
+#include <eikprogi.h>
+#include <eikmenub.h>
+#include <eikappui.h>
+#include <eikenv.h>
+#include <aknview.h>
+#include <AknsUtils.h>
+#include <AknDef.h>
+#include <AknsConstants.h>
+#include <AknsSkinInstance.h>
+#include <AknsControlContext.h>
+#include <AknsDrawUtils.h>
+#include <AknsBasicBackgroundControlContext.h>
+#include <barsread.h>
+#include <centralrepository.h>
+#include <StringLoader.h>
+#include <fontids.hrh>
+#include <gulfont.h>
+#include <applayout.cdl.h>
+#include <AknIconArray.h>
+#include <AknIconUtils.h>
+#include <gulicon.h>
+#include <featmgr.h>
+#include <aknnotewrappers.h>
+
+#include <data_caging_path_literals.hrh>
+#include <aknlayoutscalable_apps.cdl.h>
+#include <layoutmetadata.cdl.h>
+#include <avkon.mbg>
+#include <mpxcommonplaybackview.rsg>
+#include <mpxcommonplaybackview.mbg>
+#include <mpxconstants.h>
+#include <mpxfmtx.rsg> // For FF_FMTX
+#include <mpxappui.hrh>
+
+#include "mpxcommonplaybackviewcontainer.h"
+#include "mpxcommonplaybackviewlayout.h"
+#include "mpxcommonplaybackview.hrh"
+#include "mpxplaybackview.hlp.hrh"
+#include "mpxplaybackviewinfolabel.h"
+#include "mpxplaybackviewlayoutinterface.h"
+#include "mpxlayoutswitchobserver.h"
+#include "mpxcommonuihelper.h"
+#include <mpxinternalcrkeys.h>
+#include "mpxbuttonmanager.h"
+#include "mpxlog.h"
+
+#include <touchfeedback.h>
+
+// CONSTANTS
+const TInt KLabelCount = ETextCount;
+const TInt KMPXMinSecSeparatorIndex = 2;
+
+_LIT(KMPXZeroDurationMark, "--");
+
+const TInt KOneHourInSeconds = 3600;
+const TInt KMPXTimeIndicatorLength = 16;
+
+// S60 softkey positions in CBA
+const TInt KMPXCbaLeftSoftkeyPos = 0;
+const TInt KMPXCbaRightSoftkeyPos = 2;
+
+// delay for actual seek operation
+const TInt KSeekDelay = 100000; // 0.1s
+
+const TInt KOneSecondInOneMilliSecond = 1000;
+// ======== MEMBER FUNCTIONS ========
+
+
+// ---------------------------------------------------------------------------
+// Symbian 2nd phase constructor can leave.
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CMPXCommonPlaybackViewContainer::ConstructL( const TRect& /*aRect*/ )
+    {
+    MPX_DEBUG1( "CMPXCommonPlaybackViewContainer::ConstructL() entering" );
+
+    CreateWindowL();
+
+    TAknWindowLineLayout screenLayout =
+        AknLayout::screen();
+    TRect screenRect = screenLayout.Rect();
+    iBackground = CAknsBasicBackgroundControlContext::NewL(
+        KAknsIIDQsnBgAreaMainMp, screenRect, EFalse );
+
+	iSeekTimer = CPeriodic::NewL( EPriorityLow );
+
+    TInt flags( 0 );
+    CRepository* repository = CRepository::NewL( KCRUidMPXMPFeatures );
+    User::LeaveIfError( repository->Get( KMPXMPLocalVariation, flags ));
+    delete repository;
+    repository = NULL;
+
+    iEnableMarquee = static_cast<TBool>( flags & KMPXMarqueeArtistName );
+
+    iEnableButtons = static_cast<TBool>( flags & KMPXRockerMappingSupport );
+
+    CreateBackgroundImagesL();
+
+    // Create labels
+    CreateLabelsL();
+    iLabels[ETextPlaylistCount]->MakeVisible( ETrue );
+
+	if ( FeatureManager::FeatureSupported( KFeatureIdFmtx ) )
+		{
+    	// By default, FMTX label is displayed
+    	iLabels[ETextFMFrequency]->MakeVisible( ETrue );
+    	SetFMTXMode(ETrue);
+		}
+
+    // Create icons
+    CreateIconsL();
+
+    // Create buttons if enabled
+    if ( iEnableButtons )
+        {
+        TRect rockerParentRect;
+        if ( iCurrentLayout.Width())
+        {
+            rockerParentRect = iCurrentLayout;
+        }
+        else
+        {
+            rockerParentRect = iCurrentLayout;
+        }
+
+        iButtonManager = CMPXButtonManager::NewL(
+            this,
+            iLayout,
+            *this);
+
+        iButtonManager->SetContainerWindowL( *this );
+        iButtonManager->SetMopParent( this );
+        iButtonManager->SetRect(rockerParentRect);
+        }
+
+     // Read time format strings from AVKON resource
+    iMinSecFormatString = StringLoader::LoadL(
+        R_QTN_TIME_DURAT_MIN_SEC_WITH_ZERO );
+
+    iShortFormatString =
+        StringLoader::LoadL( R_QTN_TIME_DURAT_SHORT_WITH_ZERO );
+
+    iCommonUiHelper = CMPXCommonUiHelper::NewL();
+
+    // Refresh the progress bar
+    UpdateProgressBarGraphics();
+
+    iMode = EUninitialized;
+    iLabels[ETextDownloadState]->MakeVisible( ETrue );
+    iLabels[ETextArtist]->MakeVisible( EFalse );
+    iLabels[ETextTrack]->MakeVisible( EFalse );
+    iLabels[ETextElapsedTime]->MakeVisible( EFalse );
+    iLabels[ETextRemainingTime]->MakeVisible( EFalse );
+    iDisplayAlbumArt = EFalse;
+    ActivateL();
+
+    iTouchDown = EFalse;
+    iActiveView = ETrue;
+    iPrerollCompleted = EFalse;
+
+	DrawableWindow()->SetPointerGrab( ETrue );
+    EnableDragEvents();
+
+    MPX_DEBUG1( "CMPXCommonPlaybackViewContainer::ConstructL() exiting" );
+    }
+
+// ---------------------------------------------------------------------------
+// Destructor
+// ---------------------------------------------------------------------------
+//
+EXPORT_C CMPXCommonPlaybackViewContainer::~CMPXCommonPlaybackViewContainer()
+    {
+    // Pointer events
+    SetGloballyCapturing( EFalse );
+    SetPointerCapture( EFalse );
+
+    FreeIcons();
+    delete iTrackAlbumArt;
+
+    delete iBackground;
+    iLabels.ResetAndDestroy();
+    delete iMinSecFormatString;
+    delete iShortFormatString;
+    delete iCommonUiHelper;
+
+    delete iOffScreenBitmap;
+    delete iOSBitmapContext;
+    delete iOSBitmapDevice;
+
+    delete iButtonManager;
+
+   MTouchFeedback* feedback = MTouchFeedback::Instance();
+   if (feedback)
+       {
+       feedback->RemoveFeedbackForControl(this);
+       }
+
+    if ( iIdle )
+        {
+        iIdle->Cancel();
+        delete iIdle;
+        }
+
+	if ( iSeekTimer )
+		{
+		iSeekTimer->Cancel();
+		delete iSeekTimer;
+		}
+    }
+
+// ---------------------------------------------------------------------------
+// Updates time indicators.
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CMPXCommonPlaybackViewContainer::UpdateTimeIndicatorsL(
+    TInt aPlaybackPosInSeconds,
+    TInt aTotalLengthInSeconds )
+    {
+    iTrackTotalLengthInSeconds = aTotalLengthInSeconds;
+    if (!iTouchDown)
+        {
+        if( iDragProgressBar )
+          {
+          TInt expectPlaybackPos = iNewSongPosition / KOneSecondInOneMilliSecond;
+          if( expectPlaybackPos == aPlaybackPosInSeconds )
+              {
+              iDragProgressBar = EFalse;
+              }
+          else
+              {
+              return;
+              }
+          }
+    if ( aTotalLengthInSeconds == 0 )
+        {
+        TLocale locale;
+        TBuf<KMPXTimeIndicatorLength> pos;
+        TChar separator = locale.TimeSeparator( KMPXMinSecSeparatorIndex );
+        pos = KMPXZeroDurationMark;
+        pos.Append( separator );
+        pos += KMPXZeroDurationMark;
+
+        UpdateLabelL( ETextElapsedTime, pos );
+        UpdateLabelL( ETextRemainingTime, pos );
+        }
+    else
+        {
+        CMPXCommonUiHelper::TMPXDuratDisplayMode durationMode =
+            CMPXCommonUiHelper::EMPXDuratAuto;
+        if ( aTotalLengthInSeconds > KOneHourInSeconds )
+            {
+            durationMode = CMPXCommonUiHelper::EMPXDuratHMS;
+            }
+
+        // Convert ellapsed time to texts
+        HBufC* position = iCommonUiHelper->DisplayableDurationL(
+            aPlaybackPosInSeconds,
+            durationMode );
+        CleanupStack::PushL( position );
+
+        TInt remainingTime = aTotalLengthInSeconds - aPlaybackPosInSeconds;
+        if ( remainingTime < 0 )
+            {
+            // Convert all negative value to zero
+            remainingTime = 0;
+            }
+
+        // Convert remaining time to texts
+        HBufC* remaining = iCommonUiHelper->DisplayableDurationL(
+            remainingTime,
+            durationMode );
+        CleanupStack::PushL( remaining );
+
+        UpdateLabelL( ETextElapsedTime, *position );
+        UpdateLabelL( ETextRemainingTime, *remaining );
+
+        CleanupStack::PopAndDestroy( remaining );
+        CleanupStack::PopAndDestroy( position );
+        }
+
+    if ( ( iMode != EUninitialized )
+         || ( iMode == EPlayMode || iMode == EPauseMode ) )
+        {
+        if ( aTotalLengthInSeconds )
+            {
+            TReal t = aTotalLengthInSeconds;
+            iPlaybackRatio = aPlaybackPosInSeconds / t;
+            }
+        RefreshProgressBar();
+        }
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// Updates label
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CMPXCommonPlaybackViewContainer::UpdateLabelL(
+    TMPXPbvTextIndicator aLabel,
+    const TDesC& aText )
+    {
+    ASSERT( aLabel >= 0 && aLabel < iLabels.Count() );
+    CMPXPlaybackViewInfoLabel* label = iLabels[aLabel];
+    if(aLabel == ETextDownloadState)
+        {
+        iSliderPaneRect = iLayout->IndicatorLayout( Rect(), ESliderPane );
+        iLayout->LayoutLabel(
+        iLabels[ETextDownloadState], iSliderPaneRect, ETextDownloadState );
+
+        MAknsSkinInstance* skin = AknsUtils::SkinInstance();
+        TRgb color = KRgbBlack;
+
+        AknsUtils::GetCachedColor(
+            skin,
+            color,
+            KAknsIIDQsnTextColors,
+            EAknsCIQsnTextColorsCG50 );
+
+        AknLayoutUtils::OverrideControlColorL(
+            *iLabels[ETextDownloadState],
+            EColorLabelText,
+            color );
+        }
+    if ( label )
+        {
+        TBool needRedraw = EFalse;
+
+        if ( label->FullText() != aText )
+            {
+            needRedraw = ETrue;
+            label->SetLabelTextL( aText);
+            }
+
+        if ( needRedraw && label->IsVisible() )
+            {
+            label->StartMarquee();
+            label->DrawDeferred();
+            }
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// Sets main pane mode.
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CMPXCommonPlaybackViewContainer::SetMode( TMPXPbvPlaybackMode aMode )
+    {
+    iMode = aMode;
+    iDisplayAlbumArt = ETrue;
+
+    switch ( iMode )
+        {
+	    case EUninitialized:
+	    	{
+	    	// Set label visibility
+	        iLabels[ETextDownloadState]->MakeVisible( ETrue );
+	        iLabels[ETextArtist]->MakeVisible( ETrue );
+	        iLabels[ETextTrack]->MakeVisible( ETrue );
+	        //iLabels[ETextEmpty]->MakeVisible( EFalse );
+	        iLabels[ETextElapsedTime]->MakeVisible( ETrue && iPrerollCompleted);
+	        iLabels[ETextRemainingTime]->MakeVisible( ETrue && iPrerollCompleted);
+        	break;
+        	}
+        case ENoTracksMode:
+            {
+            // Set label visibility
+            iLabels[ETextDownloadState]->MakeVisible( ETrue );
+            iLabels[ETextArtist]->MakeVisible( EFalse );
+            iLabels[ETextTrack]->MakeVisible( EFalse );
+            //iLabels[ETextEmpty]->MakeVisible( ETrue );
+            iLabels[ETextElapsedTime]->MakeVisible( ETrue && iPrerollCompleted);
+            iLabels[ETextRemainingTime]->MakeVisible( ETrue && iPrerollCompleted);
+            iDisplayAlbumArt = EFalse;
+            break;
+            }
+        case EStopMode:
+            {
+            // Fixed the layout for Download label and time label are overlaped in position
+            iLabels[ETextDownloadState]->MakeVisible( EFalse );
+            iLabels[ETextTrack]->MakeVisible( ETrue );
+            iLabels[ETextArtist]->MakeVisible( ETrue );
+            //iLabels[ETextEmpty]->MakeVisible( EFalse );
+            iLabels[ETextElapsedTime]->MakeVisible( ETrue && iPrerollCompleted);
+            iLabels[ETextRemainingTime]->MakeVisible( ETrue && iPrerollCompleted);
+            break;
+            }
+        case EInitialising:
+            {
+            iLabels[ETextDownloadState]->MakeVisible( ETrue );
+            iLabels[ETextTrack]->MakeVisible( ETrue );
+            iLabels[ETextArtist]->MakeVisible( ETrue );
+            //iLabels[ETextEmpty]->MakeVisible( EFalse );
+            iLabels[ETextElapsedTime]->MakeVisible( ETrue && iPrerollCompleted);
+            iLabels[ETextRemainingTime]->MakeVisible( ETrue && iPrerollCompleted);
+            break;
+            }
+        case EMediaKeySkipping:
+            {
+            iLabels[ETextDownloadState]->MakeVisible( ETrue );
+            iLabels[ETextTrack]->MakeVisible( ETrue );
+            iLabels[ETextArtist]->MakeVisible( ETrue );
+            //iLabels[ETextEmpty]->MakeVisible( EFalse );
+            iLabels[ETextElapsedTime]->MakeVisible( ETrue && iPrerollCompleted);
+            iLabels[ETextRemainingTime]->MakeVisible( ETrue && iPrerollCompleted);
+            break;
+            }
+        case EInvalidMode:
+            {
+            iLabels[ETextDownloadState]->MakeVisible( EFalse );
+            iLabels[ETextTrack]->MakeVisible( EFalse );
+            iLabels[ETextArtist]->MakeVisible( EFalse );
+            //iLabels[ETextEmpty]->MakeVisible( EFalse );
+            iLabels[ETextElapsedTime]->MakeVisible( ETrue && iPrerollCompleted);
+            iLabels[ETextRemainingTime]->MakeVisible( ETrue && iPrerollCompleted);
+
+            break;
+            }
+        case EBufferingMode:
+            {
+            // Set label visibility
+            iLabels[ETextDownloadState]->MakeVisible( EFalse );
+            iLabels[ETextArtist]->MakeVisible( ETrue );
+            iLabels[ETextTrack]->MakeVisible( ETrue );
+            //iLabels[ETextEmpty]->MakeVisible( EFalse );
+            iLabels[ETextElapsedTime]->MakeVisible( ETrue && iPrerollCompleted);
+            iLabels[ETextRemainingTime]->MakeVisible( ETrue && iPrerollCompleted);
+            break;
+            }
+        default:
+            {
+            // Set label visibility
+            iLabels[ETextDownloadState]->MakeVisible( EFalse );
+            iLabels[ETextArtist]->MakeVisible( ETrue );
+            iLabels[ETextTrack]->MakeVisible( ETrue );
+            //iLabels[ETextEmpty]->MakeVisible( EFalse );
+            iLabels[ETextElapsedTime]->MakeVisible( ETrue && iPrerollCompleted);
+            iLabels[ETextRemainingTime]->MakeVisible( ETrue && iPrerollCompleted);
+            break;
+            }
+        }
+
+    if ( iMode == EPlayMode )
+        {
+        iLabels[ETextArtist]->StartMarquee();
+        iLabels[ETextTrack]->StartMarquee();
+        }
+    else
+        {
+        iLabels[ETextArtist]->StopMarquee();
+        iLabels[ETextTrack]->StopMarquee();
+        }
+    DrawDeferred();
+    }
+
+// ---------------------------------------------------------------------------
+// Set random mode.
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CMPXCommonPlaybackViewContainer::SetRandomMode( TBool aRandomMode )
+    {
+    iRandomMode = aRandomMode;
+    Window().Invalidate( iRandomIconRect );
+    }
+
+// ---------------------------------------------------------------------------
+// Set repeat mode.
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CMPXCommonPlaybackViewContainer::SetRepeatMode(
+    TBool aRepeatAll,
+    TBool aRepeatOne )
+    {
+    iRepeatAllMode = aRepeatAll;
+    iRepeatOneMode = aRepeatOne;
+    Window().Invalidate( iRepeatIconRect );
+    }
+
+// ---------------------------------------------------------------------------
+// Set RealPlayer mode.
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CMPXCommonPlaybackViewContainer::SetRealAudioMode(
+    TBool aRealAudioMode )
+    {
+#ifdef RD_RA_SUPPORT_FOR_MUSIC_PLAYER
+    iRealAudioMode = aRealAudioMode;
+    Window().Invalidate( iRealIconRect );
+#else
+    (void) aRealAudioMode;
+    ASSERT( 0 );
+#endif
+    }
+
+// -----------------------------------------------------------------------------
+// CMPXCommonPlaybackViewContainer::UpdateButtons
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CMPXCommonPlaybackViewContainer::UpdateButtons(
+    TMPXPlaybackState aState )
+    {
+    if ( iEnableButtons )
+        {
+        iButtonManager->UpdateButtonStates( aState );
+        DrawDeferred();
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// Set layout for all elements and set sizes for icons.
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CMPXCommonPlaybackViewContainer::UpdateLayout()
+    {
+    MPX_FUNC( "CMPXCommonPlaybackViewContainer::UpdateLayout" );
+    TRAP_IGNORE( DoUpdateLayoutL() );
+    }
+
+// ---------------------------------------------------------------------------
+// Updates duration label.
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CMPXCommonPlaybackViewContainer::UpdateDurationLabelL(
+    TInt aTotalLengthInSeconds )
+    {
+    HBufC* labelText( NULL );
+    HBufC* duration( NULL );
+
+    if ( aTotalLengthInSeconds == 0 )
+        {
+        TLocale locale;
+        TChar separator = locale.TimeSeparator( KMPXMinSecSeparatorIndex );
+
+        duration = HBufC::NewLC( KMPXTimeIndicatorLength );
+        TPtr durationTPtr( duration->Des() );
+
+        durationTPtr = KMPXZeroDurationMark;
+        durationTPtr.Append( separator );
+        durationTPtr += KMPXZeroDurationMark;
+        }
+    else
+        {
+        // Convert track duration to text
+        duration = iCommonUiHelper->DisplayableDurationL(
+            aTotalLengthInSeconds );
+        CleanupStack::PushL( duration );
+        }
+
+    labelText = StringLoader::LoadLC(
+        R_MPX_PBV_TRACK_DURATION_FORMAT,
+        *duration );
+
+    CleanupStack::PopAndDestroy( labelText );
+    CleanupStack::PopAndDestroy( duration );
+    }
+
+// ---------------------------------------------------------------------------
+// Force softkey label colors to what is specified in skin
+// for Music Player soft keys.
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CMPXCommonPlaybackViewContainer::UpdateSoftkeyColors()
+    {
+    CEikButtonGroupContainer* cbgc = CEikButtonGroupContainer::Current();
+    MEikButtonGroup* bg = NULL;
+    if ( cbgc )
+        {
+        bg = cbgc->ButtonGroup();
+        }
+
+    if ( bg )
+        {
+        MAknsSkinInstance* skin = AknsUtils::SkinInstance();
+
+        TRgb color = KRgbBlack;
+        CCoeControl* lsk = cbgc->ControlOrNull(
+            bg->CommandId( KMPXCbaLeftSoftkeyPos ) );
+        if ( lsk )
+            {
+            // Color is not updated if it not found from the skin
+            if (!AknsUtils::GetCachedColor(
+                skin, color, KAknsIIDQsnTextColors,
+                EAknsCIQsnTextColorsCG47 ) )
+                {
+                TRAP_IGNORE(
+                    AknLayoutUtils::OverrideControlColorL( *lsk,
+                    EColorLabelText,
+                    color ) );
+                }
+            }
+
+        CCoeControl* rsk = cbgc->ControlOrNull(
+            bg->CommandId( KMPXCbaRightSoftkeyPos ) );
+        if ( rsk )
+            {
+            // Color is not updated if it not found from the skin
+            if ( !AknsUtils::GetCachedColor(
+                skin, color, KAknsIIDQsnTextColors,
+                EAknsCIQsnTextColorsCG46 ) )
+                {
+                TRAP_IGNORE(
+                    AknLayoutUtils::OverrideControlColorL( *rsk,
+                    EColorLabelText,
+                    color ) );
+                }
+            }
+        cbgc->DrawDeferred();
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// Handles foreground events
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CMPXCommonPlaybackViewContainer::HandleForegroundEventL(
+    TBool aForeground )
+    {
+    MPX_FUNC( "CMPXCommonPlaybackViewContainer::HandleForegroundEventL" );
+    if ( !aForeground && iEnableButtons )
+        {
+        // if losing foreground and buttons are enabled
+        iButtonManager->HandleForegroundLostL();
+        }
+
+    if ( !aForeground && iTouchDown )
+        {
+        // Pointer events
+        SetGloballyCapturing( EFalse );
+        SetPointerCapture( EFalse );
+
+        iTouchDown = EFalse;
+        }
+
+	// Special case: if going to background but still partially visible
+	if( iActiveView && !aForeground )
+		{
+		CAknAppUi* appUi = (CAknAppUi*)CEikonEnv::Static()->AppUi();
+		if( !appUi->IsFaded() )
+		    {
+		    iActiveView = EFalse;
+		    }
+		}
+	else
+		{
+		iActiveView = aForeground;
+		}
+
+    RefreshProgressBar();
+    }
+
+// ---------------------------------------------------------------------------
+// From MMPXAlbumArtUtilObserver
+// Notify that extraction of album art started.
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CMPXCommonPlaybackViewContainer::ExtractAlbumArtStarted()
+    {
+    MPX_DEBUG1("CMPXCommonPlaybackViewContainer::ExtractAlbumArtStarted(): Entering");
+
+    MPX_DEBUG1("CMPXCommonPlaybackViewContainer::ExtractAlbumArtStarted(): Exiting");
+    }
+
+
+// ---------------------------------------------------------------------------
+// From MMPXAlbumArtUtilObserver
+// Album art is extracted from file and ready to use.
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CMPXCommonPlaybackViewContainer::ExtractAlbumArtCompleted(
+    CFbsBitmap* aBitmap,
+    TInt aErr )
+    {
+    // Here we are making the assumption that if we get an update on album
+    // art, it is Ok to Start displaying the items.
+    iLabels[ETextTrack]->MakeVisible( ETrue );
+    iLabels[ETextArtist]->MakeVisible( ETrue );
+    iLabels[ETextElapsedTime]->MakeVisible( ETrue);
+    iLabels[ETextRemainingTime]->MakeVisible( ETrue);
+    iPrerollCompleted = ETrue;
+
+    MPX_DEBUG3( "CMPXCommonPlaybackViewContainer::ExtractAlbumArtCompleted(bitmap:0x%x, err:%d)",
+        aBitmap, aErr );
+
+    delete iTrackAlbumArt;
+    iTrackAlbumArt = NULL;
+
+    if ( aBitmap && KErrNone == aErr )
+        {
+        iTrackAlbumArt = aBitmap;
+        }
+
+    DrawDeferred(); 
+    //Window().Invalidate( iAlbumArtRect );
+    //Window().Invalidate( iSliderPaneRect );
+    }
+
+// ---------------------------------------------------------------------------
+// From CCoeControl
+// Handles key events.
+// ---------------------------------------------------------------------------
+//
+EXPORT_C TKeyResponse CMPXCommonPlaybackViewContainer::OfferKeyEventL(
+    const TKeyEvent& aKeyEvent,
+    TEventCode aType )
+    {
+    MPX_DEBUG4( "CMPXCommonPlaybackViewContainer::OfferKeyEventL(iCode=%d, iScanCode=%d, aType=%d)",
+        aKeyEvent.iCode, aKeyEvent.iScanCode, aType );
+
+    TKeyResponse response = EKeyWasNotConsumed;
+
+    if ( iEnableButtons )
+        {
+        response = iButtonManager->OfferKeyEventL( aKeyEvent, aType );
+        if ( response == EKeyWasConsumed )
+            {
+            CWindowGc& gc = SystemGc();
+            gc.Activate( *DrawableWindow() );
+//            iButtonManager->RedrawIfNeeded(gc);
+            gc.Deactivate();
+            }
+        }
+
+    if ( response == EKeyWasNotConsumed )
+        {
+// TODO
+/*
+        if ( aKeyEvent.iCode == EKeyLeftArrow && !FeatureManager::FeatureSupported(
+                    KFeatureIdSideVolumeKeys ))
+            {
+            iCommandObserver->ProcessCommandL( EMPlayerCmdDecreaseVolume) ;
+            response = EKeyWasConsumed;
+            }
+        else if ( aKeyEvent.iCode == EKeyRightArrow && !FeatureManager::FeatureSupported(
+                    KFeatureIdSideVolumeKeys ))
+            {
+            iCommandObserver->ProcessCommandL( EMPlayerCmdIncreaseVolume );
+            response = EKeyWasConsumed;
+            }
+        else
+            {
+            // Do nothing
+            }
+*/
+        }
+
+    return response;
+    }
+
+// ---------------------------------------------------------------------------
+// From CCoeControl
+// Handles a change to the control's resources.
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CMPXCommonPlaybackViewContainer::HandleResourceChange( TInt aType )
+    {
+    CCoeControl::HandleResourceChange( aType );
+
+    if ( aType == KAknsMessageSkinChange )
+        {
+		iRefreshBackBuffer = ETrue;
+        // Reload icons
+        TRAP_IGNORE(
+            {
+            CreateIconsL();
+            } );
+
+        // Make sure execute layout again
+        iCurrentLayout = TRect();
+        UpdateLayout(); // To make sure AknIconUtils::SetSize() gets called
+        }
+    else if ( aType == KEikDynamicLayoutVariantSwitch )
+        {
+        iLayoutObserver->HandleLayoutChange();
+        UpdateBackgroundSkinControlContext( Rect() );
+
+        // recreate background image
+        TRAP_IGNORE( CreateBackgroundImagesL() );
+        }
+    else
+        {
+        // pass
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// From CCoeControl
+// Gets the control's help context.
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CMPXCommonPlaybackViewContainer::GetHelpContext(
+    TCoeHelpContext& aContext ) const
+    {
+    aContext.iMajor = KAppUidMusicPlayerX;
+/*
+    if ( iIsEmbedded )
+        {
+        // TODO: Handle for embedded mode
+        aContext.iContext = KMUS_HLP_PLAYBACK_VIEW;
+        }
+    else
+        {
+        aContext.iContext = KMUS_HLP_PLAYBACK_VIEW;
+        }
+*/
+    }
+
+// ---------------------------------------------------------------------------
+// Starts marquee for a playback label
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CMPXCommonPlaybackViewContainer::StartMarquee(
+    TMPXPbvTextIndicator aLabel )
+    {
+    MPX_FUNC( "CMPXCommonPlaybackViewContainer::StartMarquee" );
+    ASSERT( aLabel >= 0 && aLabel < iLabels.Count() );
+    CMPXPlaybackViewInfoLabel* label = iLabels[aLabel];
+    if ( label )
+        {
+        if ( label->IsVisible() )
+            {
+            label->StartMarquee();
+            label->DrawDeferred();
+            }
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// Creates background images
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CMPXCommonPlaybackViewContainer::CreateBackgroundImagesL()
+    {
+
+    CWindowGc& gc( SystemGc() );
+    CGraphicsDevice* device( gc.Device() );
+    TSize size( device->SizeInPixels() );
+    TDisplayMode mode( device->DisplayMode() );
+
+    if( iOffScreenBitmap && 
+		size == iOffScreenBitmap->SizeInPixels() &&
+		mode == iOffScreenBitmap->DisplayMode() )
+    	{
+		// No need to update backbuffer
+    	return;
+    	}
+
+    delete iOffScreenBitmap;
+    iOffScreenBitmap = NULL;
+    delete iOSBitmapContext;
+    iOSBitmapContext = NULL;
+    delete iOSBitmapDevice;
+    iOSBitmapDevice = NULL;
+
+    iOffScreenBitmap = new (ELeave) CFbsBitmap();
+    TInt err( iOffScreenBitmap->Create( size, mode ));
+    if ( KErrNone != err )
+        {
+        delete iOffScreenBitmap;
+        iOffScreenBitmap = NULL;
+        User::Leave( err );
+        }
+
+    iOSBitmapDevice = CFbsBitmapDevice::NewL( iOffScreenBitmap );
+    err = iOSBitmapDevice->CreateContext( iOSBitmapContext );
+    if ( KErrNone != err )
+        {
+        delete iOSBitmapDevice;
+        iOSBitmapDevice = NULL;
+        User::Leave( err );
+        }
+    iRefreshBackBuffer = ETrue;
+    }
+
+// ---------------------------------------------------------------------------
+// Creates labels.
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CMPXCommonPlaybackViewContainer::CreateLabelsL()
+    {
+    CMPXPlaybackViewInfoLabel* label = NULL;
+
+    for ( TInt index = 0; index < KLabelCount; ++index )
+        {
+        label = new ( ELeave ) CMPXPlaybackViewInfoLabel();
+        CleanupStack::PushL( label );
+        label->SetContainerWindowL( *this );
+        label->SetTextL( KNullDesC );
+        label->ConstructL(
+            iEnableMarquee && ( index == ETextTrack ) );
+
+        label->SetBackground( iBackground );
+        User::LeaveIfError( iLabels.Append( label ) );
+        CleanupStack::Pop( label );
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// Creates icons.
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CMPXCommonPlaybackViewContainer::CreateIconsL()
+    {
+    FreeIcons();
+
+    // Play/stop/pause icons
+    iPlayIcon =
+        iLayout->GetIndicatorIconMaskL( EIconPlay );
+    iPauseIcon =
+        iLayout->GetIndicatorIconMaskL(EIconPause );
+
+    // Repeat, random, etc
+    iRepeatAllIcon =
+        iLayout->GetIndicatorIconMaskL( EIconRepeatAll );
+    iRepeatOneIcon =
+        iLayout->GetIndicatorIconMaskL( EIconRepeatOne );
+    iRandomIcon =
+        iLayout->GetIndicatorIconMaskL( EIconRandom );
+#ifdef RD_RA_SUPPORT_FOR_MUSIC_PLAYER
+    iRealIcon =
+        iLayout->GetIndicatorIconMaskL( EIconReal );
+#endif
+
+    // Download slider
+    iDownloadSlider = iLayout->GetIndicatorIconMaskL(
+        EDownloadSlider );
+    iPlaybackSlider = iLayout->GetIndicatorIconMaskL(
+        EPlaybackSlider );
+    iSliderBackground = iLayout->GetIndicatorIconMaskL(
+        ESliderBackground );
+
+    // Default album art
+    iDefaultAlbumArt = iLayout->GetIndicatorIconMaskL(
+        EAlbumArtArea );
+    }
+
+// ---------------------------------------------------------------------------
+// Deletes all icon objects.
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CMPXCommonPlaybackViewContainer::FreeIcons()
+    {
+    delete iPauseIcon;
+    iPauseIcon = NULL;
+    delete iPlayIcon;
+    iPlayIcon = NULL;
+    delete iRandomIcon;
+    iRandomIcon = NULL;
+    delete iRepeatOneIcon;
+    iRepeatOneIcon = NULL;
+    delete iRepeatAllIcon;
+    iRepeatAllIcon = NULL;
+    delete iDownloadSlider;
+    iDownloadSlider = NULL;
+    delete iPlaybackSlider;
+    iPlaybackSlider = NULL;
+    delete iSliderBackground;
+    iSliderBackground = NULL;
+    delete iDefaultAlbumArt;
+    iDefaultAlbumArt = NULL;
+#ifdef RD_RA_SUPPORT_FOR_MUSIC_PLAYER
+    delete iRealIcon;
+    iRealIcon = NULL;
+#endif
+    }
+
+// ---------------------------------------------------------------------------
+// Draw an icon
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CMPXCommonPlaybackViewContainer::DrawIndicator(
+    CBitmapContext& aGc,
+    const TRect& aDirtyRect,
+    const TRect& aIndicatorRect,
+    const CGulIcon* aIcon,
+    TBool aInvertMask ) const
+    {
+    if ( aIcon && aIndicatorRect.Intersects( aDirtyRect ) )
+        {
+        aGc.BitBltMasked(
+            aIndicatorRect.iTl,
+            aIcon->Bitmap(),
+            TRect( aIndicatorRect.Size() ),
+            aIcon->Mask(),
+            aInvertMask );
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// Redraw part of the screen.
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CMPXCommonPlaybackViewContainer::RedrawRect(
+    const TRect& aRect,
+    CBitmapContext& aGc) const
+    {
+    MAknsSkinInstance* skin = AknsUtils::SkinInstance();
+    AknsDrawUtils::DrawBackground(
+        skin,
+        iBackground,
+        this,
+        aGc,
+        aRect.iTl,
+        aRect,
+        KAknsDrawParamDefault );
+
+
+    TBool embedded = iEikonEnv->StartedAsServerApp();
+
+    if ( iPrerollCompleted )
+        {
+        if ( iRepeatAllMode && !embedded )
+            {
+            DrawIndicator( aGc, aRect, iRepeatIconRect, iRepeatAllIcon );
+            }
+
+        if ( iRepeatOneMode && !embedded )
+            {
+            DrawIndicator(aGc, aRect, iRepeatIconRect, iRepeatOneIcon);
+            }
+
+        if ( iRandomMode && !embedded )
+            {
+            DrawIndicator(aGc, aRect, iRandomIconRect, iRandomIcon);
+            }
+
+#ifdef RD_RA_SUPPORT_FOR_MUSIC_PLAYER
+        if ( iRealAudioMode )
+            {
+            DrawIndicator( aGc, aRect, iRealIconRect, iRealIcon );
+            }
+#endif
+
+        DrawIndicator( aGc, aRect, iSliderBackgroundRect, iSliderBackground );
+        if ( iMode == EPlayMode || iMode == EPauseMode )
+            {
+
+            DrawIndicator( aGc, aRect, TRect(iDownloadSliderRect.iTl,
+                    iDownloadSlider->Bitmap()->SizeInPixels()),
+                    iDownloadSlider );
+            DrawIndicator(aGc, aRect, TRect(iPlaybackSliderRect.iTl,
+                    iPlaybackSlider->Bitmap()->SizeInPixels() ),
+                    iPlaybackSlider );
+            }
+
+        if ( iDisplayAlbumArt && aRect.Intersects( iAlbumArtRect ) )
+            {
+            if ( iTrackAlbumArt )
+                {
+                // Calculating the CenterPoint for Drawing the albumart image 
+                TSize bmpSizeInPixels = iTrackAlbumArt->SizeInPixels();
+                TInt xPos = ( iAlbumArtRect.Width() - bmpSizeInPixels.iWidth )
+                        / 2;
+                TInt yPos =
+                        ( iAlbumArtRect.Height() - bmpSizeInPixels.iHeight )
+                                / 2;
+                TPoint Centerpos = TPoint(xPos, yPos );
+                // bitmap top left corner position
+                Centerpos += iAlbumArtRect.iTl;
+
+                // Draw album art and frame
+                aGc.BitBlt( Centerpos, iTrackAlbumArt);
+                TRgb color = KRgbBlack;
+                AknsUtils::GetCachedColor( skin, color, KAknsIIDQsnTextColors,
+                        EAknsCIQsnTextColorsCG50 );
+                TRect imageRect( Centerpos, iTrackAlbumArt->SizeInPixels() );
+                aGc.SetPenStyle( CGraphicsContext::ESolidPen );
+                aGc.SetBrushStyle( CGraphicsContext::ENullBrush );
+                aGc.SetPenColor( color );
+                aGc.DrawRect( imageRect );
+                }
+            else
+                {
+                DrawIndicator( aGc, aRect, iAlbumArtRect, iDefaultAlbumArt );
+                }
+            }
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// Update progress bar graphics based on current playback
+// and download position.
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CMPXCommonPlaybackViewContainer::UpdateProgressBarGraphics()
+    {
+    TSize downloadBarSize = iDownloadSliderRect.Size();
+    TSize playbackBarSize = iPlaybackSliderRect.Size();
+
+    downloadBarSize.iWidth *= iDownloadRatio;
+    playbackBarSize.iWidth *= iPlaybackRatio;
+
+    AknIconUtils::SetSize(
+        iDownloadSlider->Bitmap(),
+        downloadBarSize,
+        EAspectRatioNotPreserved );
+    AknIconUtils::SetSize(
+        iPlaybackSlider->Bitmap(),
+        playbackBarSize,
+        EAspectRatioNotPreserved );
+    }
+
+// ---------------------------------------------------------------------------
+// Update progress bar graphics and redraw.
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CMPXCommonPlaybackViewContainer::RefreshProgressBar()
+    {
+    UpdateProgressBarGraphics();
+    Window().Invalidate( iSliderPaneRect );
+    }
+
+// ---------------------------------------------------------------------------
+// Update label text color according to skin
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CMPXCommonPlaybackViewContainer::UpdateLabelColorsL()
+    {
+    MAknsSkinInstance* skin = AknsUtils::SkinInstance();
+    TRgb color = KRgbBlack;
+    // Color is not updated if it not found from the skin
+    AknsUtils::GetCachedColor(
+        skin,
+        color,
+        KAknsIIDQsnTextColors,
+        EAknsCIQsnTextColorsCG50 );
+
+    for ( TInt i = 0; i < iLabels.Count(); i++ )
+        {
+        AknLayoutUtils::OverrideControlColorL(
+            *iLabels[i],
+            EColorLabelText,
+            color );
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// Update skin control context for background
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CMPXCommonPlaybackViewContainer::UpdateBackgroundSkinControlContext(
+    const TRect& aRect )
+    {
+    CAknsBasicBackgroundControlContext* background =
+        static_cast<CAknsBasicBackgroundControlContext*>( iBackground );
+
+    if ( Layout_Meta_Data::IsLandscapeOrientation() )
+        {
+        TAknWindowLineLayout screenLayout =
+            AknLayout::screen();
+        TRect screenRect = screenLayout.Rect();
+        background->SetBitmap( KAknsIIDQsnBgAreaMainMp );
+        background->SetRect( screenRect );
+        }
+    else
+        {
+        background->SetBitmap( KAknsIIDQsnBgAreaMainMp );
+        background->SetRect( aRect );
+        }
+    iRefreshBackBuffer = ETrue;
+    }
+
+// ---------------------------------------------------------------------------
+// Set FMTX mode.
+// FMTX label shouldn't appear in some playback views
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CMPXCommonPlaybackViewContainer::SetFMTXMode(
+    TBool aFMTXMode )
+    {
+	if ( FeatureManager::FeatureSupported( KFeatureIdFmtx ) )
+		{
+	    iFMTXMode = aFMTXMode;
+		}
+    }
+
+// ---------------------------------------------------------------------------
+// From CCoeControl
+// Responds to changes to the size and position of the contents of this
+// control.
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CMPXCommonPlaybackViewContainer::SizeChanged()
+    {
+    MPX_FUNC("CMPXCommonPlaybackViewContainer::SizeChanged()");
+    UpdateLayout();
+    UpdateSoftkeyColors();
+    UpdateBackgroundSkinControlContext( Rect() );
+    }
+
+// ---------------------------------------------------------------------------
+// From CCoeControl
+// Gets the number of controls contained in a compound control.
+// ---------------------------------------------------------------------------
+//
+EXPORT_C TInt CMPXCommonPlaybackViewContainer::CountComponentControls() const
+    {
+    if(iPrerollCompleted)
+        {
+        return KLabelCount + 1; // ButtonManager
+        }
+    else
+        {
+        return 0;
+        }
+   } 
+// ---------------------------------------------------------------------------
+// From CCoeControl
+// Gets an indexed component of a compound control.
+// ---------------------------------------------------------------------------
+//
+EXPORT_C CCoeControl* CMPXCommonPlaybackViewContainer::ComponentControl( TInt aIndex ) const
+    {
+    CCoeControl* control = NULL;
+    if(iPrerollCompleted)
+        {
+        if (aIndex < KLabelCount)
+            {
+            control = iLabels[aIndex];
+            }
+        else
+            {
+            control = iButtonManager;
+            }
+        }
+
+    return control;
+    }
+
+// ---------------------------------------------------------------------------
+// From CCoeControl
+// Draws the control.
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CMPXCommonPlaybackViewContainer::Draw( const TRect& aRect ) const
+    {
+    if( iActiveView || iRefreshBackBuffer )
+        {
+        if ( iOSBitmapContext )
+            {
+            RedrawRect( aRect, *iOSBitmapContext );
+            iRefreshBackBuffer = EFalse;
+            }
+        }
+
+    // Draw off-screen bitmap to display
+    if ( iOffScreenBitmap )
+        {
+        CWindowGc& gc = SystemGc();
+		gc.BitBlt( TPoint(),iOffScreenBitmap );
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CMPXCommonPlaybackViewContainer::HandleButtonCommandL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CMPXCommonPlaybackViewContainer::HandleButtonCommandL( TInt aCommand )
+    {
+    MPX_DEBUG2("CMPXCommonPlaybackViewContainer::HandleButtonCommandL(%d) entering", aCommand);
+    if ( iCommandObserver )
+        {
+        iCommandObserver->ProcessCommandL( aCommand );
+        }
+    MPX_DEBUG1("CMPXCommonPlaybackViewContainer::HandleButtonCommandL() exiting");
+    }
+
+// ---------------------------------------------------------------------------
+// CMPXCommonPlaybackViewContainer::HandlePointerEventL
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CMPXCommonPlaybackViewContainer::HandlePointerEventL(const TPointerEvent& aPointerEvent)
+    {
+    MPX_DEBUG1( "CMPXCommonPlaybackViewContainer::HandlePointerEventL" );
+    if(AknLayoutUtils::PenEnabled())
+        {
+        TSize playbackBarSize = iPlaybackSliderRect.Size();
+        TReal width;
+        switch( aPointerEvent.iType )
+            {
+            case TPointerEvent::EButton1Down:
+                {
+                if ( iSliderPaneRect.Contains(aPointerEvent.iPosition) && 
+                        ( iMode == EPlayMode || iMode == EPauseMode ))
+                    {
+                    // Pointer events
+                    SetGloballyCapturing( ETrue );
+                    SetPointerCapture( ETrue );
+
+                    MPX_DEBUG1( "CMPXCommonPlaybackViewContainer::HandlePointerEventL btnDOWN" );
+                    iTouchDown = ETrue;
+                    width = aPointerEvent.iPosition.iX - iSliderBackgroundRect.iTl.iX;
+                    playbackBarSize.iWidth = width;
+                    AknIconUtils::SetSize(
+                        iPlaybackSlider->Bitmap(),
+                        playbackBarSize,
+                        EAspectRatioNotPreserved );
+                    }
+                if ( iAlbumArtRect.Contains(aPointerEvent.iPosition ) )
+                    {                    
+                    MTouchFeedback* feedback = MTouchFeedback::Instance();
+                    if (feedback)
+                        {
+                        feedback->InstantFeedback(ETouchFeedbackBasic);
+                        }                
+                 
+                    if ( iCommandObserver )
+        								{
+                        iCommandObserver->ProcessCommandL( EMPXCmdVolumeChanged );
+                        }
+                    }
+                break;
+                }
+
+            case TPointerEvent::EDrag:
+                {
+                if(iTouchDown && ( iMode == EPlayMode || iMode == EPauseMode ) )
+                    {
+                    MPX_DEBUG1( "CMPXCommonPlaybackViewContainer::HandlePointerEventL ****btnDrag****" );
+
+                    MTouchFeedback* feedback = MTouchFeedback::Instance();
+                    if (feedback)
+                        {
+                        feedback->InstantFeedback(ETouchFeedbackSensitive);
+                        }
+
+                    if (aPointerEvent.iPosition.iX <= iSliderBackgroundRect.iTl.iX)
+                        {
+                        width = 0;
+                        }
+                    else if (aPointerEvent.iPosition.iX >= iSliderBackgroundRect.iBr.iX)
+                        {
+                        width = iSliderBackgroundRect.iBr.iX - iSliderBackgroundRect.iTl.iX;
+                        }
+                    else
+                        {
+                        width = aPointerEvent.iPosition.iX - iSliderBackgroundRect.iTl.iX;
+                        }
+
+                    playbackBarSize.iWidth = width;
+                    AknIconUtils::SetSize(
+                        iPlaybackSlider->Bitmap(),
+                        playbackBarSize,
+                        EAspectRatioNotPreserved );
+
+                    // Update the ellapsed and remaining time texts for user feedback
+                    TReal totalWidth = iPlaybackSliderRect.Width();
+                    TReal ratio = width/totalWidth;
+                    TInt newSongPositionInSec = ratio * iTrackTotalLengthInSeconds;
+                                CMPXCommonUiHelper::TMPXDuratDisplayMode durationMode =
+                    CMPXCommonUiHelper::EMPXDuratAuto;
+                    if ( iTrackTotalLengthInSeconds > KOneHourInSeconds )
+                        {
+                        durationMode = CMPXCommonUiHelper::EMPXDuratHMS;
+                        }
+
+                    // Convert ellapsed time to text
+                    HBufC* position = iCommonUiHelper->DisplayableDurationL(
+                        newSongPositionInSec,
+                        durationMode );
+                    CleanupStack::PushL( position );
+
+                    TInt remainingTime = iTrackTotalLengthInSeconds - newSongPositionInSec;
+                    if ( remainingTime < 0 )
+                        {
+                        remainingTime = 0;
+                        }
+
+                    // Convert remaining time to text
+                    HBufC* remaining = iCommonUiHelper->DisplayableDurationL(
+                        remainingTime,
+                        durationMode );
+                    CleanupStack::PushL( remaining );
+
+                    UpdateLabelL( ETextElapsedTime, *position );
+                    UpdateLabelL( ETextRemainingTime, *remaining );
+                    CleanupStack::PopAndDestroy( remaining );
+                    CleanupStack::PopAndDestroy( position );
+
+                    // Invalidate rect so it will be redrawn immediately
+                    Window().Invalidate( iSliderPaneRect );
+                    }
+                else
+                    {
+                    SetGloballyCapturing( EFalse );
+                    SetPointerCapture( EFalse );
+                    iTouchDown = EFalse;
+                    }
+                break;
+                }
+
+            case TPointerEvent::EButton1Up:
+                {
+                MPX_DEBUG1( "CMPXCommonPlaybackViewContainer::HandlePointerEventL btnUP" );
+                if(iTouchDown)
+                    {
+                    // Pointer events
+                    SetGloballyCapturing( EFalse );
+                    SetPointerCapture( EFalse );
+                    if ( ( iMode == EPlayMode || iMode == EPauseMode ) )
+                        {
+                        iTouchDown = EFalse;
+                        if ( aPointerEvent.iPosition.iX
+                                <= iSliderBackgroundRect.iTl.iX )
+                            {
+                            width = 0;
+                            }
+                        else if ( aPointerEvent.iPosition.iX
+                                >= iSliderBackgroundRect.iBr.iX )
+                            {
+                            width = iSliderBackgroundRect.iBr.iX
+                                    - iSliderBackgroundRect.iTl.iX;
+                            }
+                        else
+                            {
+                            width = aPointerEvent.iPosition.iX
+                                    - iSliderBackgroundRect.iTl.iX;
+                            }
+                        playbackBarSize.iWidth = width;
+                        AknIconUtils::SetSize( iPlaybackSlider->Bitmap(),
+                                playbackBarSize, EAspectRatioNotPreserved );
+
+                        // Set new song position based upon progress bar location
+                        TReal totalWidth = iPlaybackSliderRect.Width();
+                        TReal ratio = width / totalWidth;
+                        iNewSongPosition = (ratio
+                                * iTrackTotalLengthInSeconds) * 1000;
+
+                        // Invalidate rect so it will be redrawn immediately
+					    Window().Invalidate( iSliderPaneRect );
+					    iSeekTimer->Cancel();
+					    iSeekTimer->Start( KSeekDelay, KSeekDelay, TCallBack( CallSetPosition, this ) );
+					    iDragProgressBar = ETrue;
+                        }
+                    }
+                break;
+                }
+
+            default:
+                {
+                MPX_DEBUG1( "CMPXCommonPlaybackViewContainer::HandlePointerEventL default" );
+                break;
+                }
+            }
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CMPXCommonPlaybackViewContainer::GetNewSongPosition
+// ---------------------------------------------------------------------------
+//
+EXPORT_C TInt CMPXCommonPlaybackViewContainer::GetNewSongPosition()
+    {
+    return iNewSongPosition;
+    }
+
+// ---------------------------------------------------------------------------
+// CMPXCommonPlaybackViewContainer::SetNewSongPosition
+// ---------------------------------------------------------------------------
+//
+void CMPXCommonPlaybackViewContainer::SetNewSongPosition( const TInt64& aPositon )
+    {
+    iNewSongPosition = aPositon;
+    }
+
+// ---------------------------------------------------------------------------
+// Helper function to set layout for all elements and set sizes for icons.
+// ---------------------------------------------------------------------------
+//
+void CMPXCommonPlaybackViewContainer::DoUpdateLayoutL()
+    {
+    TRect myRect = Rect();
+    if ( myRect == iCurrentLayout )
+        {
+        // Layout has not changed, do nothing
+        return;
+        }
+
+    CreateBackgroundImagesL();
+
+    MPX_DEBUG5( "CMPXCommonPlaybackViewContainer::DoUpdateLayoutL() -- new layout: top-left (%d, %d) size (%d, %d)",
+        myRect.iTl.iX, myRect.iTl.iY, myRect.Size().iWidth, myRect.Size().iHeight );
+
+    // Get layout data
+    iSliderPaneRect = iLayout->IndicatorLayout(
+        myRect, ESliderPane );
+    iLayout->LayoutLabel(
+        iLabels[ETextElapsedTime], iSliderPaneRect, ETextElapsedTime );
+    iLayout->LayoutLabel(
+        iLabels[ETextRemainingTime], iSliderPaneRect, ETextRemainingTime );
+    iLayout->LayoutLabel(
+        iLabels[ETextArtist], myRect, ETextArtist );
+    iLayout->LayoutLabel(
+        iLabels[ETextTrack], myRect, ETextTrack );
+    iLayout->LayoutLabel(
+        iLabels[ETextPlaylistCount], myRect, ETextPlaylistCount );
+    //iLayout->LayoutLabel(
+    //    iLabels[ETextEmpty], myRect, ETextEmpty );
+    iLayout->LayoutLabel(
+        iLabels[ETextDownloadState], iSliderPaneRect, ETextDownloadState );
+
+   	if ( iFMTXMode )
+       	{
+       	iLayout->LayoutLabel(
+           	iLabels[ETextFMFrequency], myRect, ETextFMFrequency );
+       	}
+
+    // Check if the artist and title rects intersect, if so move them
+    TRect titleRect = iLabels[ETextTrack]->Rect();
+    TRect artistRect = iLabels[ETextArtist]->Rect();
+    if ( titleRect.Intersects( artistRect ))
+        {
+        TRect intersection = titleRect;
+        intersection.Intersection( artistRect );
+        TInt diff = -(intersection.Height());
+        iLayout->LayoutLabel(
+            iLabels[ETextTrack], myRect, ETextTrack, 0, diff );
+        }
+
+    iIconLayout = iLayout->IndicatorLayout( myRect, EIconPlay );
+    iRandomIconRect = iLayout->IndicatorLayout( myRect, EIconRandom );
+    iRepeatIconRect = iLayout->IndicatorLayout( myRect, EIconRepeatAll );
+    iBackgroundLayout = myRect;
+
+    iDownloadSliderRect = iLayout->IndicatorLayout(
+        iSliderPaneRect, EDownloadSlider );
+    iPlaybackSliderRect = iLayout->IndicatorLayout(
+        iSliderPaneRect, EPlaybackSlider );
+    iSliderBackgroundRect = iLayout->IndicatorLayout(
+        iSliderPaneRect, ESliderBackground );
+
+    iAlbumArtRect = iLayout->IndicatorLayout(
+        myRect, EAlbumArtArea );
+
+#ifdef RD_RA_SUPPORT_FOR_MUSIC_PLAYER
+    iRealIconRect = iLayout->IndicatorLayout( myRect, EIconReal );
+#endif
+
+    // Scale icons
+    if ( iPauseIcon )
+        {
+        AknIconUtils::SetSize(
+            iPauseIcon->Bitmap(), iIconLayout.Size() );
+        }
+    if ( iPlayIcon )
+        {
+        AknIconUtils::SetSize(
+            iPlayIcon->Bitmap(), iIconLayout.Size() );
+        }
+    if ( iRandomIcon )
+        {
+        AknIconUtils::SetSize(
+            iRandomIcon->Bitmap(), iRandomIconRect.Size() );
+        }
+    if ( iRepeatAllIcon )
+        {
+        AknIconUtils::SetSize(
+            iRepeatAllIcon->Bitmap(), iRepeatIconRect.Size() );
+        }
+    if ( iRepeatOneIcon )
+        {
+        AknIconUtils::SetSize(
+            iRepeatOneIcon->Bitmap(), iRepeatIconRect.Size() );
+        }
+
+    if ( iSliderBackground )
+        {
+        AknIconUtils::SetSize(
+            iSliderBackground->Bitmap(),
+            iSliderBackgroundRect.Size(),
+            EAspectRatioNotPreserved );
+        UpdateProgressBarGraphics();
+        if ( iMode == EPlayMode || iMode == EPauseMode )
+           {
+            MTouchFeedback* feedback = MTouchFeedback::Instance();
+            if ( feedback )
+                {
+                feedback->SetFeedbackArea( this, 0, iSliderPaneRect,
+                    ETouchFeedbackBasic, ETouchEventStylusDown);
+                }
+           }
+        }
+
+    if ( iDefaultAlbumArt )
+        {
+        AknIconUtils::SetSize(
+            iDefaultAlbumArt->Bitmap(), iAlbumArtRect.Size() );
+        }
+
+#ifdef RD_RA_SUPPORT_FOR_MUSIC_PLAYER
+    if (iRealIcon)
+        {
+        AknIconUtils::SetSize(
+             iRealIcon->Bitmap(), iRealIconRect.Size() );
+        }
+#endif
+
+    iCurrentLayout = myRect;
+
+    if ( iEnableButtons )
+        {
+        if (iButtonManager)
+            {
+            iButtonManager->SetParentRect( myRect );
+            iButtonManager->SetRect(myRect);
+            }
+        }
+
+    // Update label colors according to skin (ignore the color in layout data)
+    UpdateLabelColorsL();
+
+    // update artist/title labels to use the full length of control
+    // other controls should not have been clipped in the first place
+    if ( iLabels[ ETextTrack ]->FullText().Length() > 0 )
+        {
+        HBufC* title = iLabels[ ETextTrack ]->FullText().AllocLC();
+        iLabels[ ETextTrack ]->SetLabelTextL( *title );
+        CleanupStack::PopAndDestroy( title );
+        }
+    if ( iLabels[ ETextArtist ]->FullText().Length() > 0 )
+        {
+        HBufC* title = iLabels[ ETextArtist ]->FullText().AllocLC();
+        iLabels[ ETextArtist ]->SetLabelTextL( *title );
+        CleanupStack::PopAndDestroy( title );
+        }
+
+    MPX_DEBUG1( "CMPXCommonPlaybackViewContainer::DoUpdateLayoutL() exiting" );
+    }
+
+// -----------------------------------------------------------------------------
+// CMPXCommonPlaybackViewContainer::ReStoreButtons
+// -----------------------------------------------------------------------------
+//
+void CMPXCommonPlaybackViewContainer::RestoreButtons( 
+    TMPXPlaybackState aState )
+    {
+    if ( iEnableButtons )
+        {
+        iButtonManager->RestoreButtonStates( aState );
+        DrawDeferred();
+        }
+    }
+
+TInt CMPXCommonPlaybackViewContainer::CallSetPosition()
+	{
+	TRAP_IGNORE( HandleButtonCommandL( EMPXPbvCmdPosition ) );
+	iSeekTimer->Cancel();
+	return 0;
+	}
+
+TInt CMPXCommonPlaybackViewContainer::CallSetPosition( TAny* aAny )
+	{
+	return ((CMPXCommonPlaybackViewContainer*)aAny)->CallSetPosition();
+	}
+
+// -----------------------------------------------------------------------------
+// CMPXCommonPlaybackViewContainer::AdjustOrdinalPosition
+// -----------------------------------------------------------------------------
+//
+void CMPXCommonPlaybackViewContainer::AdjustOrdinalPosition( TInt aNewOrdinalPosition )
+    {
+    return Window().SetOrdinalPosition( aNewOrdinalPosition );
+    }
+//  End of File