diff -r 000000000000 -r ff3acec5bc43 mpxplugins/viewplugins/views/embeddedplaybackview/src/mpxembeddedplaybackviewimp.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mpxplugins/viewplugins/views/embeddedplaybackview/src/mpxembeddedplaybackviewimp.cpp Thu Dec 17 08:45:05 2009 +0200 @@ -0,0 +1,762 @@ +/* +* 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 Playback view +* +*/ + + + +// INCLUDE FILES +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "mpxcommonuihelper.h" +#include +#include "mpxcommonplaybackview.hrh" +#include "mpxembeddedplaybackview.hrh" +#include "mpxembeddedplaybackviewimp.h" +#include "mpxembeddedplaybackviewcontainer.h" +#include "mpxembeddedplaybackviewlayout.h" +#include +#include "mpxlog.h" +#include +#include +#include +#include "mpxcommonplaybackview.hrh" +#include +#include +#include + +// CONSTANTS +_LIT( KMPXEmbeddedPlaybackRscPath, "mpxembeddedplaybackview.rsc" ); +const TInt KMPXOneSecInMilliSecs( 1000 ); +_LIT(KMPXMusicplayerPrivateFolder, "\\private\\"); + + +// ======== MEMBER FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// C++ default constructor can NOT contain any code, that +// might leave. +// --------------------------------------------------------------------------- +// +CMPXEmbeddedPlaybackViewImp::CMPXEmbeddedPlaybackViewImp() + { + // Do nothing + } + +// --------------------------------------------------------------------------- +// Symbian 2nd phase constructor can leave. +// --------------------------------------------------------------------------- +// +void CMPXEmbeddedPlaybackViewImp::ConstructL() + { + MPX_FUNC( "CMPXEmbeddedPlaybackViewImp::ConstructL" ); + + // Load embedded resource + CCoeEnv* coeEnv = iEikonEnv; + TParse parse; + parse.Set( KMPXEmbeddedPlaybackRscPath, &KDC_APP_RESOURCE_DIR, NULL ); + TFileName resourceFile( parse.FullName() ); + User::LeaveIfError( MPXUser::CompleteWithDllPath( resourceFile ) ); + BaflUtils::NearestLanguageFile( coeEnv->FsSession(), resourceFile ); + iEmbeddedResourceOffset = coeEnv->AddResourceFileL( resourceFile ); + + CMPXCommonPlaybackViewImp::ConstructL(); + BaseConstructL( R_MPX_EMBEDDED_PLAYBACK_VIEW ); + + if(AknLayoutUtils::PenEnabled()) + { + CAknView::ShowToolbarOnViewActivation(ETrue); + if ( Toolbar() ) + { + iToolbar = Toolbar(); + iToolbar->SetToolbarObserver( this ); + } + } + + // Override base class setting to allow + // embedded playback to properly fetch media properties. + iLastPBViewActivated = ETrue; + } + +// --------------------------------------------------------------------------- +// Two-phased constructor. +// --------------------------------------------------------------------------- +// +CMPXEmbeddedPlaybackViewImp* CMPXEmbeddedPlaybackViewImp::NewL() + { + CMPXEmbeddedPlaybackViewImp* self = CMPXEmbeddedPlaybackViewImp::NewLC(); + CleanupStack::Pop( self ); + return self; + } + +// --------------------------------------------------------------------------- +// Two-phased constructor. +// --------------------------------------------------------------------------- +// +CMPXEmbeddedPlaybackViewImp* CMPXEmbeddedPlaybackViewImp::NewLC() + { + CMPXEmbeddedPlaybackViewImp* self = new ( ELeave ) CMPXEmbeddedPlaybackViewImp(); + CleanupStack::PushL( self ); + self->ConstructL(); + return self; + } + +// --------------------------------------------------------------------------- +// Destructor +// --------------------------------------------------------------------------- +// +CMPXEmbeddedPlaybackViewImp::~CMPXEmbeddedPlaybackViewImp() + { + MPX_DEBUG1( "CMPXEmbeddedPlaybackViewImp::~CMPXEmbeddedPlaybackViewImp entering" ); + + if ( iEmbeddedResourceOffset ) + { + iEikonEnv->DeleteResourceFile( iEmbeddedResourceOffset ); + } + + delete iPlaybackViewLayout; + + MPX_DEBUG1( "CMPXEmbeddedPlaybackViewImp::~CMPXEmbeddedPlaybackViewImp exiting" ); + } + + +// --------------------------------------------------------------------------- +// Updates Title Pane. +// --------------------------------------------------------------------------- +// +void CMPXEmbeddedPlaybackViewImp::UpdateTitlePaneL() + { + MPX_FUNC( "CMPXEmbeddedPlaybackViewImp::UpdateTitlePaneL" ); + + CAknTitlePane* title( static_cast + ( StatusPane()->ControlL( TUid::Uid( EEikStatusPaneUidTitle )))); + if ( title ) + { + RProcess process; + TApaAppInfo appInfo; + RApaLsSession session; + User::LeaveIfError( session.Connect() ); // May want to ignore error + CleanupClosePushL( session ); + + TInt err = session.GetAppInfo( appInfo, MPXTlsHelper::HostUid() ); + if(!err) + { + title->SetTextL( appInfo.iCaption ); + } + CleanupStack::PopAndDestroy(); // Close RApaLsSession session + } + } + +// --------------------------------------------------------------------------- +// Updates track info field. +// --------------------------------------------------------------------------- +// +void CMPXEmbeddedPlaybackViewImp::UpdateTrackInfoL( + const CMPXMedia* aMedia ) + { + MPX_FUNC( "CMPXEmbeddedPlaybackViewImp::UpdateTrackInfo" ); + + CMPXCommonPlaybackViewImp::UpdateTrackInfoL( aMedia ); + + if( iContainer && + aMedia && + iCommonUiHelper->IsHostPodcastingAppL() ) + { + // if embedded view is launched via podcasting app + // display episode name and title + + // Set ETextArtist field as Podcast Title + if ( aMedia->IsSupported( + TMPXAttribute( KMPXMediaIdMusic, + EMPXMediaMusicAlbum ))) + { + HBufC* titleText = aMedia->ValueText( + TMPXAttribute( KMPXMediaIdMusic, + EMPXMediaMusicAlbum )).AllocL(); + CleanupStack::PushL(titleText); + if ( titleText->Length() > 0) + { + iContainer->UpdateLabelL( ETextArtist, *titleText ); + } + else + { + HBufC* unknownText = + StringLoader::LoadLC( R_MPX_QTN_NMP_UNKNOWN_TITLE ); + iContainer->UpdateLabelL( + ETextArtist, *unknownText ); + CleanupStack::PopAndDestroy( unknownText ); + } + CleanupStack::PopAndDestroy( titleText ); + } + else + { + HBufC* unknownText = + StringLoader::LoadLC( R_MPX_QTN_NMP_UNKNOWN_TITLE ); + iContainer->UpdateLabelL( + ETextArtist, *unknownText ); + CleanupStack::PopAndDestroy( unknownText ); + } + } + } + +// --------------------------------------------------------------------------- +// Displays error notes. +// --------------------------------------------------------------------------- +// +void CMPXEmbeddedPlaybackViewImp::HandleErrorL( TInt aError ) + { + if ( aError ) + { + MPX_DEBUG2( "CMPXEmbeddedPlaybackViewImp::HandleErrorL(%d)", aError ); + + TBool omaFlag = EFalse; + TInt plCount( KErrNotFound ); + MMPXSource* source = iPlaybackUtility->Source(); + if ( source ) + { + CMPXCollectionPlaylist* pl( source->PlaylistL() ); + if ( pl ) + { + CleanupStack::PushL( pl ); + plCount = pl->Count(); + CleanupStack::PopAndDestroy( pl ); + } + } + + if ( plCount == 1 ) + { +#ifndef CAMESE_IN_DRM_UTILITY + // If Camese support is enabled, + // check if the song is protected WMA + // and let Camese handle it in case it is. + if (iCameseSuperDistSupport && + iMedia) + { + // Check protection and media type + if ( iMedia->IsSupported( KMPXMediaDrmProtected ) && + iMedia->IsSupported( KMPXMediaDrmType ) ) + { + TBool prot( iMedia->ValueTObjectL( KMPXMediaDrmProtected ) ); + TMPXMediaDrmType type( iMedia->ValueTObjectL( KMPXMediaDrmType ) ); + + if (prot && (EMPXDrmTypeWMA == type)) + { + MPX_DEBUG1( "CMPXEmbeddedPlaybackViewImp::HandleErrorL: Let Camese Handle Error"); + // Let Camese Handle errors in this case. + return; + } + if (prot && (EMPXDrmTypeOMA == type)) + { + omaFlag = ETrue; + } + } + } +#endif + if ( aError == KErrCorrupt || aError == KErrNotSupported ) + { + // special handling is needed for KErrCorrupt/KErrNotSupported with just 1 song + iCommonUiHelper->HandleErrorL( aError ); + } + else if (omaFlag) + { + iCommonUiHelper->HandleErrorL( aError, iMedia ); + } + else + { + CMPXCommonPlaybackViewImp::HandleErrorL( aError ); + } + + iPlaybackUtility->CommandL( EPbCmdStop ); + if( aError != KErrArgument && aError != KErrCompletion ) + { + HandleCommandL( EAknSoftkeyBack ); + } + } + else + { + // let base class handle it + CMPXCommonPlaybackViewImp::HandleErrorL( aError ); + } + } + } + +// --------------------------------------------------------------------------- +// From base class CMPXCommonPlaybackViewImp +// +// Handle playback property. +// --------------------------------------------------------------------------- +// +void CMPXEmbeddedPlaybackViewImp::DoHandlePropertyL( + TMPXPlaybackProperty aProperty, + TInt aValue, + TInt aError ) + { + MPX_FUNC( "CMPXEmbeddedPlaybackViewImp::DoHandlePropertyL" ); + MPX_DEBUG4( "HandlePropertyL - Property(%d); Value(%d); Error(%d)", aProperty, aValue, aError ); + + if ( KErrNone == aError ) + { + switch ( aProperty ) + { + case EPbPropertyPosition: + { + TInt duration(aValue / KMPXOneSecInMilliSecs); + if( duration > iDuration) + { + HandleCommandL(EMPXCmdStop); + } + else + { + CMPXCommonPlaybackViewImp::DoHandlePropertyL(aProperty, + aValue, + aError); + } + break; + } + default: + { + CMPXCommonPlaybackViewImp::DoHandlePropertyL(aProperty, + aValue, + aError); + break; + } + } + } + else + { + HandleErrorL( aError ); + } + } + +// --------------------------------------------------------------------------- +// From MMPXCHelperEmbeddedOpenObserver +// Handles errors from that occured in embedded mode +// --------------------------------------------------------------------------- +// +void CMPXEmbeddedPlaybackViewImp::HandleEmbeddedOpenL( + TInt aErr, + TMPXGeneralCategory /*aCategory*/ ) + { + if ( KErrNone != aErr ) + { + HandleErrorL( aErr ); + + // Kill MPX + AppUi()->RunAppShutter(); + } + } + +// --------------------------------------------------------------------------- +// From MEikMenuObserver +// Dynamically initialises a menu pane. +// --------------------------------------------------------------------------- +// +void CMPXEmbeddedPlaybackViewImp::DynInitMenuPaneL( + TInt aResourceId, + CEikMenuPane* aMenuPane ) + { + // Override base menu actions + switch ( aResourceId ) + { + case R_MPX_EMBEDDED_PLAYBACK_VIEW_MENU: + { + if ( iCommonUiHelper->IsHostMessagingL() ) + { + AppUi()->HandleCommandL( EMPXCmdIsFileSaved ); + } + // Disable Save command if not launched from the specified apps + if ( !MPXTlsHelper::NeedSave() || + EPbStateNotInitialised == iPlaybackState || + EPbStateInitialising == iPlaybackState ) + { + aMenuPane->SetItemDimmed( + EMPXPbvCmdSave, + ETrue); + } + TBool isOfflineMode( EFalse ); + TBool isFormatNotSupported( EFalse ); + if ( !isOfflineMode && iMedia ) + { + if ( iMedia->IsSupported( KMPXMediaDrmProtected ) ) + { + if ( iMedia->ValueTObjectL( KMPXMediaDrmProtected ) && + iMedia->IsSupported( KMPXMediaDrmCanSetAutomated ) ) + { + // if it's drm protected, check if + // KMPXMediaDrmCanSetAutomated + isFormatNotSupported = !( + iMedia->ValueTObjectL( KMPXMediaDrmCanSetAutomated ) ); + } + } + } + if ( isOfflineMode || + !iMedia || + isFormatNotSupported ) + { + aMenuPane->SetItemDimmed( + EMPXPbvCmdUseAsCascade, + ETrue ); + } + + if(iCommonUiHelper->IsHostPodcastingAppL()) + { + aMenuPane->SetItemDimmed( + EMPXPbvCmdUseAsCascade, + ETrue ); + + aMenuPane->SetItemDimmed( + EMPXPbvCmdSave, + ETrue); + } + + // Check if FM Transmitter is supported + if ( !FeatureManager::FeatureSupported( KFeatureIdFmtx ) ) + { + aMenuPane->SetItemDimmed( + EMPXPbvCmdFMTransmitter, + ETrue ); + } + break; + } + default: + { + // Call base clase to handle other cases + CMPXCommonPlaybackViewImp::DynInitMenuPaneL( aResourceId, aMenuPane ); + break; + } + } + } + +// --------------------------------------------------------------------------- +// From CAknView +// Returns views id. +// --------------------------------------------------------------------------- +// +TUid CMPXEmbeddedPlaybackViewImp::Id() const + { + return TUid::Uid( KMPXEmbeddedPlaybackViewId ); + } + +// --------------------------------------------------------------------------- +// From CAknView +// Command handling function +// --------------------------------------------------------------------------- +// +void CMPXEmbeddedPlaybackViewImp::HandleCommandL( TInt aCommand ) + { + MPX_DEBUG2("CMPXEmbeddedPlaybackViewImp::HandleCommandL(%d): entering", aCommand); + + switch ( aCommand ) + { + case EMPXPbvCmdSave: + { + HandleSaveL( EMPXNpvOpenAfterSave ); + break; + } + case EMPXCmdSaveCancelled: + { + iSaveInProgress = EFalse; + break; + } + case EMPXCmdSaveComplete: + { + iSaveInProgress = EFalse; + MPXTlsHelper::SetNeedSave( EFalse ); + break; + } + case EMPXCmdSaveNotProgress: + { + iSaveInProgress = EFalse; + break; + } + case EAknSoftkeyBack: + { + if ( iCommonUiHelper->IsHostMessagingL() ) + { + AppUi()->HandleCommandL( EMPXCmdIsFileSaved ); + } + // If this was a playlist, transition back to collection view + // + if( MPXTlsHelper::LaunchMode() == EMPXLaunchModePlaylist ) + { + CMPXCommonPlaybackViewImp::HandleCommandL( aCommand ); + } + // Song Handling, does it need to be saved? + // + else if ( MPXTlsHelper::NeedSave() ) + { + HandleSaveL( EMXPNpvExitAppAfterSave ); + } + else + { + // If back command, only shutdown the embedded view + AppUi()->RunAppShutter(); + } + break; + } + case EAknCmdExit: + case EAknSoftkeyExit: + case EEikCmdExit: + { + if ( MPXTlsHelper::NeedSave() ) + { + HandleSaveL( EMPXNpvExitHostAppAfterSave ); + } + else + { + // If exit command, then close host application as well + CAknEnv::RunAppShutter(); + } + break; + } + case EMPXPbvCmdUseAsCascade: + case EMPXPbvCmdAiwCmdAssign: + { + const TDesC& savedpath = MPXTlsHelper::FilePath(); + const TDesC& mediapath = iMedia->ValueText( KMPXMediaGeneralUri ); + TFileName fullName(mediapath); + TParsePtrC fileParse( fullName ); + TBool isPrivate = (fileParse.NamePresent() && + !KMPXMusicplayerPrivateFolder().CompareF( + fileParse.Path().Left( + KMPXMusicplayerPrivateFolder().Length()))); + + if ( iCommonUiHelper->IsHostMessagingL() + && mediapath.CompareF(savedpath) && isPrivate ) + { + HandleSaveL( (TMPXNpvSaveMode)aCommand ); + } + else + { + CMPXCommonPlaybackViewImp::HandleCommandL( aCommand ); + } + break; + } + default: + { + CMPXCommonPlaybackViewImp::HandleCommandL( aCommand ); + break; + } + } + + MPX_DEBUG1("CMPXEmbeddedPlaybackViewImp::HandleCommandL(): exiting"); + } + +// --------------------------------------------------------------------------- +// From CAknView +// Handles a view activation. +// --------------------------------------------------------------------------- +// +void CMPXEmbeddedPlaybackViewImp::DoActivateL( + const TVwsViewId& aPrevViewId, + TUid aCustomMessageId, + const TDesC8& aCustomMessage ) + { + MPX_FUNC( "CMPXEmbeddedPlaybackViewImp::DoActivateL()" ); + + if ( !iContainer ) + { + if ( !iPlaybackViewLayout ) + { + iPlaybackViewLayout = CMPXEmbeddedPlaybackViewLayout::NewL(); + } + iContainer = new ( ELeave ) CMPXEmbeddedPlaybackViewContainer( + this, + this, + iPlaybackViewLayout, + iCommonUiHelper ); + iContainer->SetMopParent( this ); + iContainer->ConstructL( ClientRect() ); + AppUi()->AddToStackL( *this, iContainer ); + } + + CMPXCommonPlaybackViewImp::DoActivateL( aPrevViewId , aCustomMessageId, aCustomMessage ); + } + +// --------------------------------------------------------------------------- +// Handle media properties. +// Notes: The client is responsible for delete the object of aProperties. +// --------------------------------------------------------------------------- +// +void CMPXEmbeddedPlaybackViewImp::DoHandleMediaL( + const CMPXMedia& aMedia, + TInt aError ) + { + MPX_FUNC("CMPXEmbeddedPlaybackViewImp::DoHandleMediaL"); + if ( iPrepareToSave ) + { + delete iMedia; + iMedia = NULL; + iPrepareToSave = EFalse; + + if ( KErrNone == aError ) + { + iMedia = CMPXMedia::NewL( aMedia ); + HandleSaveL( EMPXNpvUsePreviousMode ); + } + else + { + HandleErrorL( aError ); + } + } + else + { + CMPXCommonPlaybackViewImp::DoHandleMediaL( aMedia, aError ); + } + } + +// --------------------------------------------------------------------------- +// Handle saving a file +// --------------------------------------------------------------------------- +// +void CMPXEmbeddedPlaybackViewImp::HandleSaveL( TMPXNpvSaveMode aMode ) + { + MPX_DEBUG1("CMPXEmbeddedPlaybackViewImp::HandleSaveL(): entering"); + + if ( !iSaveInProgress ) + { + if ( aMode != EMPXNpvUsePreviousMode ) + { + iSaveMode = aMode; + } + + if ( !iMedia ) + { + iPrepareToSave = ETrue; + RequestMediaL(); + } + else + { + iSaveInProgress = ETrue; + TInt cmd( EMPXCmdSaveAndReopen ); + if ( iSaveMode == EMXPNpvExitAppAfterSave ) + { + cmd = EMPXCmdSaveAndExit; + } + else if ( iSaveMode == EMPXNpvExitHostAppAfterSave ) + { + cmd = EMPXCmdSaveAndExitHostApp; + } + else if ( iSaveMode == EMPXPbvCmdUseAsCascade ) + { + cmd = EMPXCmdSaveForUseAsContact; + } + else if ( iSaveMode == EMPXPbvCmdAiwCmdAssign ) + { + cmd = EMPXCmdSaveForUseAsRingtone; + } + MPX_TRAPD( err, AppUi()->HandleCommandL( cmd ) ); + if ( KErrNone != err ) + { + iSaveInProgress = EFalse; + HandleErrorL( err ); + } + } + } + + MPX_DEBUG1("CMPXEmbeddedPlaybackViewImp::HandleSaveL(): exiting"); + } + +// --------------------------------------------------------------------------- +// Handle playback message. +// --------------------------------------------------------------------------- +// +void CMPXEmbeddedPlaybackViewImp::DoHandlePlaybackMessageL( + const CMPXMessage& aMessage ) + { + MPX_DEBUG1( "CMPXEmbeddedPlaybackViewImp::DoHandlePlaybackMessageL"); + + TMPXMessageId id( *aMessage.Value( KMPXMessageGeneralId ) ); + if ( KMPXMessageGeneral == id ) + { + TInt type( *aMessage.Value( KMPXMessageGeneralType ) ); + TInt data( *aMessage.Value( KMPXMessageGeneralData ) ); + switch ( *aMessage.Value( KMPXMessageGeneralEvent ) ) + { + case TMPXPlaybackMessage::EStateChanged: + UpdateMiddleSoftKeyDisplayL(); + UpdateToolbar(); + break; + + default: + break; + } + } + CMPXCommonPlaybackViewImp::DoHandlePlaybackMessageL (aMessage); + } + +// ----------------------------------------------------------------------------- +// From MAknToolbarObserver +// Used to change toolbar settings before toolbar becomes visible +// ----------------------------------------------------------------------------- +// +void CMPXEmbeddedPlaybackViewImp::DynInitToolbarL(TInt aResourceId, CAknToolbar* aToolbar) + { + if (aResourceId == R_MPX_PBV_TOUCH_TOOLBAR) + { + // Put initializations here to take effect before toolbar is shown + UpdateToolbar(); + aToolbar->UpdateBackground(); + } + } + +// ----------------------------------------------------------------------------- +// From MAknToolbarObserver +// Handles toolbar events +// ----------------------------------------------------------------------------- +// +void CMPXEmbeddedPlaybackViewImp::OfferToolbarEventL( TInt aCommandId ) + { + TInt commandId = aCommandId; + TInt eventModifiers = iToolbar->EventModifiers(); + if ( eventModifiers == CAknToolbar::ELongPress ) + { + if ( aCommandId == EMPXPbvCmdNextListItem ) + { + commandId = EMPXPbvCmdSeekForward; + } + else if ( aCommandId == EMPXPbvCmdPreviousListItem ) + { + commandId = EMPXPbvCmdSeekBackward; + } + } + else if ( eventModifiers == CAknToolbar::ELongPressEnded ) + { + if ( aCommandId == EMPXPbvCmdNextListItem || aCommandId == EMPXPbvCmdPreviousListItem ) + { + commandId = EMPXPbvCmdEndSeek; + } + } + + CAknView::ProcessCommandL( commandId ); + } + +// End of File