--- /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