diff -r 14979e23cb5e -r 3de6c4cf6b67 musichomescreen_multiview/musicplayeractionhandlerplugin/src/musicplayeractionhandler.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/musichomescreen_multiview/musicplayeractionhandlerplugin/src/musicplayeractionhandler.cpp Wed Sep 01 12:32:02 2010 +0100 @@ -0,0 +1,571 @@ +/* +* Copyright (c) 2008-2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Music Player Action Handler Plugin +* +*/ + + +#include <liwvariant.h> // TLiwVariant +#include <apgcli.h> // RApaLsSession, TApaAppInfo +#include <apacmdln.h> // CApaCommandLine +#include <apgtask.h> // TApaTaskList +#include <mpxlog.h> // MPX_DEBUG +#include <mpxparameter.h> // CMPXParameter +#include <mpxplaybackutility.h> // MMPXPlaybackUtility +#include <mpxconstants.h> // KAppUidMusicPlayerX +#include <mpxmusicplayerviewplugin.hrh> // KMPXPluginTypePlaybackUid +#include <AknTaskList.h> // CAknTaskList +#include <gfxtranseffect/gfxtranseffect.h> +#include <akntranseffect.h> + +#include <mpxcommandgeneraldefs.h> +#include <mpxcommonuihelper.h> +#include <mpxcollectionhelperfactory.h> +#include "musicplayeractionhandler.h" +#include <mpxcollectionpath.h> + + + + +const TInt KPlayerMusicPlayerParameterGranularity = 50; +const TUid KMusicPlayerAppUid = { 0x102072C3 }; + +const TInt KMPXStandAloneProcessIDTop32( 1 ); +const TInt KMPXStandAloneProcessIDBottom32( 2 ); +// RProperty key to identify the case when Music Player launching +// in the background +const TInt KMPXLaunchingOnBackground( 100 ); + +//map values +_LIT( KActionPlaybackCommand , "PlaybackCommand" ); +_LIT( KactionMessageToMusicPlayer, "MessageToMusicPlayer" ); +_LIT( KGoToNowPlaying, "GoToNowPlaying" ); +_LIT( KGoToLastPlayed, "GoToLastPlayed" ); +_LIT( KGoToLastPlayedMinimized, "GoToLastPlayedMinimized" ); +_LIT( KGoToMusicLibrary, "GoToMusicLibrary" ); +_LIT( KGoToAlbumView, "GoToAlbumView" ); + +//map keys +_LIT8( KType, "type" ); +_LIT8( KCommand, "command" ); +_LIT8( KMessage, "message" ); + +// ======== MEMBER FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// Symbian 2nd phase constructor can leave. +// --------------------------------------------------------------------------- +// +void CMusicPlayerActionHandler::ConstructL() + { + MPX_DEBUG1("-->CMusicPlayerActionHandler::ConstructL()"); + + //iPlaybackUtility = MMPXPlaybackUtility::UtilityL( KPbModeActivePlayer ); + //iPlaybackUtility = MMPXPlaybackUtility::NewL( KMusicPlayerAppUid); + + MPX_DEBUG1("<--CMusicPlayerActionHandler::ConstructL()"); + } + +// --------------------------------------------------------------------------- +// Two-phased constructor. +// --------------------------------------------------------------------------- +// +CMusicPlayerActionHandler* CMusicPlayerActionHandler::NewL() + { + CMusicPlayerActionHandler* self = CMusicPlayerActionHandler::NewLC(); + CleanupStack::Pop( self ); + return self; + } + +// --------------------------------------------------------------------------- +// Two-phased constructor. +// --------------------------------------------------------------------------- +// +CMusicPlayerActionHandler* CMusicPlayerActionHandler::NewLC() + { + CMusicPlayerActionHandler* self = new( ELeave ) CMusicPlayerActionHandler; + CleanupStack::PushL( self ); + self->ConstructL(); + return self; + } + +// --------------------------------------------------------------------------- +// destructor +// --------------------------------------------------------------------------- +// +CMusicPlayerActionHandler::~CMusicPlayerActionHandler() + { + MPX_DEBUG1("-->CMusicPlayerActionHandler::~CMusicPlayerActionHandler()"); + if ( iPlaybackUtility ) + { + iPlaybackUtility->Close(); + } + MPX_DEBUG1("<--CMusicPlayerActionHandler::~CMusicPlayerActionHandler()"); + } + +// --------------------------------------------------------------------------- +// Executes Playback command on current player +// --------------------------------------------------------------------------- +// +TInt CMusicPlayerActionHandler::ExecutePlaybackCommandL(const CLiwMap* aMap) + { + MPX_DEBUG1("-->CMusicPlayerActionHandler::ExecutePlaybackCommandL()"); + TInt errCode; + TLiwVariant variant; + variant.PushL(); + errCode = ExtractVariantL( aMap, variant, KCommand ); + if ( errCode == KErrNone ) + { + TMPXPlaybackCommand Command; + Command = static_cast<TMPXPlaybackCommand>( variant.AsTInt32() ); + SetPlaybackCommandL( Command ); + } + CleanupStack::PopAndDestroy( &variant); + MPX_DEBUG1("<--CMusicPlayerActionHandler::ExecutePlaybackCommandL()"); + return errCode; + } + +// --------------------------------------------------------------------------- +// Sends a message to music player +// --------------------------------------------------------------------------- +// +TInt CMusicPlayerActionHandler::ExecuteMessageToMusicPlayerL( + const CLiwMap* aMap ) + { + MPX_DEBUG1("-->CMusicPlayerActionHandler::" + "ExecuteMessageToMusicPlayerL()"); + TInt errCode; + RBuf msg; + CleanupClosePushL( msg ); + errCode = ExtractDesL( aMap, msg, KMessage ); + if ( errCode == KErrNone ) + { + if ( ! msg.CompareF( KGoToNowPlaying ) ) + { + errCode = GoToNowPlayingL(); + } + else if ( ! msg.CompareF( KGoToLastPlayed ) ) + { + errCode = GoToLastPlayedL( EFalse ); + } + else if ( ! msg.CompareF( KGoToLastPlayedMinimized ) ) + { + errCode = GoToLastPlayedL( ETrue ); + } + else if ( ! msg.CompareF( KGoToMusicLibrary ) ) + { + errCode = GoToMusicLibraryL(); + } + else if ( ! msg.CompareF( KGoToAlbumView ) ) + { + errCode = GoToAlbumViewL(); + } + } + CleanupStack::PopAndDestroy( &msg ); + MPX_DEBUG1("<--CMusicPlayerActionHandler::" + "ExecuteMessageToMusicPlayerL()"); + return errCode; + } + +// --------------------------------------------------------------------------- +// Opens musicplayer in library view, even if it is already open and playing. +// --------------------------------------------------------------------------- +// +TInt CMusicPlayerActionHandler::GoToMusicLibraryL() + { + MPX_DEBUG1("-->CMusicPlayerActionHandler::GoToMusicLibraryL()"); + //Launch player + RWsSession wsSession; + User::LeaveIfError( wsSession.Connect() ); + CAknTaskList *taskList = CAknTaskList::NewL( wsSession ); + TApaTask task = taskList->FindRootApp( KAppUidMusicPlayerX ); + delete taskList; + CMPXParameter* param = new ( ELeave ) CMPXParameter(); + CleanupStack::PushL( param ); + param->iType.iUid = KMPXPluginTypeCollectionUid; + param->iCmdForward = EMPXCmdFwdNone; + + MMPXCollectionUiHelper* collectionHelper = CMPXCollectionHelperFactory::NewCollectionUiHelperL(); + CMPXCollectionPath* path = collectionHelper->MusicMenuPathL(); + path->AppendL(3); // Albums + if (path) + { + param->iCollectionPath = path; + param->iPathType = EMPXTypeCollectionPath; + } + collectionHelper->Close(); + + CBufBase* buffer = + CBufFlat::NewL( KPlayerMusicPlayerParameterGranularity ); + CleanupStack::PushL( buffer ); + RBufWriteStream writeStream( *buffer ); + CleanupClosePushL( writeStream ); + param->ExternalizeL( writeStream ); + writeStream.CommitL(); + buffer->Compress(); + CleanupStack::PopAndDestroy( &writeStream ); + if ( task.Exists() ) + { +// task.SendMessage( KAppUidMusicPlayerX, buffer->Ptr( 0 )); + BeginFullScreenTransEffect( KAppUidMusicPlayerX ); + wsSession.SendMessageToWindowGroup( task.WgId(), KAppUidMusicPlayerX, + buffer->Ptr( 0 ) ); + } + else //Application needs to be launched. The first view is library view. + { + // Launch Music Player Application + RApaLsSession appArcSession; + _LIT(KEmpty,""); + User::LeaveIfError(appArcSession.Connect()); // connect to AppArc server + TThreadId id; + appArcSession.StartDocument( KEmpty, KAppUidMusicPlayerX, id ); + appArcSession.Close(); + } + CleanupStack::PopAndDestroy( buffer ); + CleanupStack::PopAndDestroy( param ); + wsSession.Close(); + MPX_DEBUG1("<--CMusicPlayerActionHandler::GoToMusicLibraryL()"); + return KErrNone; + } + +// --------------------------------------------------------------------------- +// Opens musicplayer in Album and Artist view, even if it is already open and playing. +// --------------------------------------------------------------------------- +// +TInt CMusicPlayerActionHandler::GoToAlbumViewL() + { + MPX_DEBUG1("-->CMusicPlayerActionHandler::GoToAlbumViewL()"); + //Launch player + RWsSession wsSession; + User::LeaveIfError( wsSession.Connect() ); + CAknTaskList *taskList = CAknTaskList::NewL( wsSession ); + TApaTask task = taskList->FindRootApp( KAppUidMusicPlayerX ); + delete taskList; + CMPXParameter* param = new ( ELeave ) CMPXParameter(); + CleanupStack::PushL( param ); + param->iType.iUid = KMPXPluginTypeCollectionUid; + param->iCmdForward = EMPXCmdFwdNone; + + MMPXCollectionUiHelper* collectionHelper = CMPXCollectionHelperFactory::NewCollectionUiHelperL(); + CMPXCollectionPath* path = collectionHelper->MusicMenuPathL(); + path->AppendL(3); // Albums + if (path) + { + param->iCollectionPath = path; + param->iPathType = EMPXTypeCollectionPath; + } + collectionHelper->Close(); + + CBufBase* buffer = + CBufFlat::NewL( KPlayerMusicPlayerParameterGranularity ); + CleanupStack::PushL( buffer ); + RBufWriteStream writeStream( *buffer ); + CleanupClosePushL( writeStream ); + param->ExternalizeL( writeStream ); + writeStream.CommitL(); + buffer->Compress(); + CleanupStack::PopAndDestroy( &writeStream ); + if ( task.Exists() ) + { +// task.SendMessage( KAppUidMusicPlayerX, buffer->Ptr( 0 )); + BeginFullScreenTransEffect( KAppUidMusicPlayerX ); + wsSession.SendMessageToWindowGroup( task.WgId(), KAppUidMusicPlayerX, + buffer->Ptr( 0 ) ); + } + else //Application needs to be launched. The first view is library view. + { + // Launch Music Player Application + RApaLsSession appArcSession; + _LIT(KEmpty,""); + User::LeaveIfError(appArcSession.Connect()); // connect to AppArc server + TThreadId id; + appArcSession.StartDocument( KEmpty, KAppUidMusicPlayerX, id ); + appArcSession.Close(); + } + CleanupStack::PopAndDestroy( buffer ); + CleanupStack::PopAndDestroy( param ); + wsSession.Close(); + MPX_DEBUG1("<--CMusicPlayerActionHandler::GoToAlbumViewL()"); + return KErrNone; + } + + +// --------------------------------------------------------------------------- +// Opens musicplayer, if it is already open and playing it goes to nowplaying. +// --------------------------------------------------------------------------- +// +TInt CMusicPlayerActionHandler::GoToNowPlayingL() + { + MPX_DEBUG1("-->CMusicPlayerActionHandler::GoToNowPlayingL()"); + //Launch player + RWsSession wsSession; + User::LeaveIfError( wsSession.Connect() ); + CAknTaskList *taskList = CAknTaskList::NewL( wsSession ); + TApaTask task = taskList->FindRootApp( KAppUidMusicPlayerX ); + delete taskList; + CMPXParameter* param = new ( ELeave ) CMPXParameter(); + CleanupStack::PushL( param ); + param->iType.iUid = KMPXPluginTypePlaybackUid; + param->iCmdForward = EMPXCmdFwdNone; + CBufBase* buffer = + CBufFlat::NewL( KPlayerMusicPlayerParameterGranularity ); + CleanupStack::PushL( buffer ); + RBufWriteStream writeStream( *buffer ); + CleanupClosePushL( writeStream ); + param->ExternalizeL( writeStream ); + writeStream.CommitL(); + buffer->Compress(); + CleanupStack::PopAndDestroy( &writeStream ); + if ( task.Exists() ) + { + BeginFullScreenTransEffect( KAppUidMusicPlayerX ); + wsSession.SendMessageToWindowGroup( task.WgId(), KAppUidMusicPlayerX, + buffer->Ptr( 0 ) ); + + + } + else + { + RApaLsSession ls; + CleanupClosePushL( ls ); + User::LeaveIfError( ls.Connect() ); + TApaAppInfo appInfo; + User::LeaveIfError( ls.GetAppInfo( appInfo, KAppUidMusicPlayerX ) ); + CApaCommandLine* apaCommandLine = CApaCommandLine::NewLC(); + apaCommandLine->SetExecutableNameL( appInfo.iFullName ); + apaCommandLine->SetTailEndL( buffer->Ptr( 0 ) ); + User::LeaveIfError( ls.StartApp( *apaCommandLine ) ); + CleanupStack::PopAndDestroy(); // apaCommandLine + CleanupStack::PopAndDestroy(); // ls + } + CleanupStack::PopAndDestroy( buffer ); + CleanupStack::PopAndDestroy( param ); + wsSession.Close(); + MPX_DEBUG1("<--CMusicPlayerActionHandler::GoToNowPlayingL()"); + return KErrNone; + } + + +// --------------------------------------------------------------------------- +// Opens Stand alone MP and goes to now playing, it will display last played +// --------------------------------------------------------------------------- +// +TInt CMusicPlayerActionHandler::GoToLastPlayedL( TBool aMinimized ) + { + MPX_DEBUG1("-->CMusicPlayerActionHandler::GoToLastPlayed()"); + //Launch player + RWsSession wsSession; + User::LeaveIfError( wsSession.Connect() ); + CAknTaskList *taskList = CAknTaskList::NewL( wsSession ); + TApaTask task = taskList->FindRootApp( KAppUidMusicPlayerX ); + delete taskList; + CMPXParameter* param = new ( ELeave ) CMPXParameter(); + CleanupStack::PushL( param ); + param->iType.iUid = KMPXPluginTypeLastPlayedUid;//KMPXPluginTypePlaybackUid; + param->iCmdForward = EMPXCmdFwdNone; + CBufBase* buffer = + CBufFlat::NewL( KPlayerMusicPlayerParameterGranularity ); + CleanupStack::PushL( buffer ); + RBufWriteStream writeStream( *buffer ); + CleanupClosePushL( writeStream ); + param->ExternalizeL( writeStream ); + writeStream.CommitL(); + buffer->Compress(); + CleanupStack::PopAndDestroy( &writeStream ); + if ( task.Exists() ) + { + BeginFullScreenTransEffect( KAppUidMusicPlayerX ); + wsSession.SendMessageToWindowGroup( task.WgId(), KAppUidMusicPlayerX, + buffer->Ptr( 0 ) ); + if (!aMinimized) + { + task.BringToForeground(); + } + } + else + { + RApaLsSession ls; + CleanupClosePushL( ls ); + User::LeaveIfError( ls.Connect() ); + TApaAppInfo appInfo; + User::LeaveIfError( ls.GetAppInfo( appInfo, KAppUidMusicPlayerX ) ); + CApaCommandLine* apaCommandLine = CApaCommandLine::NewLC(); + if (aMinimized) + { + apaCommandLine->SetCommandL(EApaCommandBackground); + + TInt err( RProperty::Define( + KAppUidMusicPlayerX, KMPXLaunchingOnBackground, RProperty::EInt ) ); + MPX_DEBUG2( "CMusicPlayerActionHandler::GoToLastPlayed() RProperty define err = %d", err ); + if ( err == KErrNone || err == KErrAlreadyExists ) + { + err = RProperty::Set( KAppUidMusicPlayerX, + KMPXLaunchingOnBackground, + ETrue ); + MPX_DEBUG2( "CMusicPlayerActionHandler::GoToLastPlayed() RProperty set to true err = %d", err ); + } + } + apaCommandLine->SetExecutableNameL( appInfo.iFullName ); + apaCommandLine->SetTailEndL( buffer->Ptr( 0 ) ); + User::LeaveIfError( ls.StartApp( *apaCommandLine ) ); + CleanupStack::PopAndDestroy(); // apaCommandLine + CleanupStack::PopAndDestroy(); // ls + + if ( aMinimized ) + { + TInt err = RProperty::Set( KAppUidMusicPlayerX, + KMPXLaunchingOnBackground, + EFalse ); + MPX_DEBUG2( "CMusicPlayerActionHandler::GoToLastPlayed() RProperty set to false err = %d", err ); + } + } + CleanupStack::PopAndDestroy( buffer ); + CleanupStack::PopAndDestroy( param ); + wsSession.Close(); + MPX_DEBUG1("<--CMusicPlayerActionHandler::GoToLastPlayed()"); + return KErrNone; + } +// --------------------------------------------------------------------------- +// Extracts a descriptor +// --------------------------------------------------------------------------- +// +TInt CMusicPlayerActionHandler::ExtractDesL( const CLiwMap* aMap, + RBuf& aString, const TDesC8& aMapName ) + { + MPX_DEBUG1("-->CMusicPlayerActionHandler::ExtractDesL()"); + TInt errCode( KErrArgument ); + TLiwVariant variant; + variant.PushL(); + TPtrC tempString( KNullDesC ); + if ( aMap->FindL( aMapName, variant) ) + { + variant.Get( tempString ); + aString.ReAllocL( tempString.Length() ); + aString.Append( tempString ); + errCode = KErrNone; + } + CleanupStack::PopAndDestroy( &variant ); + MPX_DEBUG1("<--CMusicPlayerActionHandler::ExtractDesL()"); + return errCode; + } + +// --------------------------------------------------------------------------- +// Extract variant +// --------------------------------------------------------------------------- +// +TInt CMusicPlayerActionHandler::ExtractVariantL( const CLiwMap* aMap, + TLiwVariant& aVariant, const TDesC8& aMapName ) + { + MPX_DEBUG1("-->CMusicPlayerActionHandler::ExtractVariantL()"); + TInt errCode( KErrNone ); + if ( ! aMap->FindL( aMapName, aVariant ) ) + { + errCode = KErrArgument; + } + MPX_DEBUG1("<--CMusicPlayerActionHandler::ExtractVariantL()"); + return errCode; + } + +// --------------------------------------------------------------------------- +// From CAHPlugin +// Executes provided action +// --------------------------------------------------------------------------- +// +TInt CMusicPlayerActionHandler::ExecuteActionL( const CLiwMap* aMap ) + { + MPX_DEBUG1("-->CMusicPlayerActionHandler::ExecuteActionL()"); + TInt errCode; + RBuf type; + CleanupClosePushL( type ); + errCode = ExtractDesL( aMap, type, KType ); + if ( errCode == KErrNone ) + { + if ( ! type.CompareF( KActionPlaybackCommand ) ) + { + errCode = ExecutePlaybackCommandL( aMap ); + } + else + if ( ! type.CompareF( KactionMessageToMusicPlayer ) ) + { + errCode = ExecuteMessageToMusicPlayerL( aMap ); + } + } + CleanupStack::PopAndDestroy( &type ); + MPX_DEBUG1("<--CMusicPlayerActionHandler::ExecuteActionL()"); + return errCode; + } + +// --------------------------------------------------------------------------- +// Set the command to playbackUtility +// --------------------------------------------------------------------------- +// +void CMusicPlayerActionHandler::SetPlaybackCommandL( TMPXPlaybackCommand aCommand ) + { + MPX_DEBUG1("-->CMusicPlayerActionHandler::SetPlaybackCommandL()"); + //Try to get musicplay StandAloneMode process id + TInt procId( 0 ); + TUint64 mpProcId( 0 ); + TInt err( RProperty::Get( KMusicPlayerAppUid, KMPXStandAloneProcessIDTop32, procId ) ); + if ( err == KErrNone ) + { + mpProcId = TUint64( procId ) << 32; + err = RProperty::Get( KMusicPlayerAppUid, KMPXStandAloneProcessIDBottom32, procId ); + if ( err == KErrNone ) + { + mpProcId += procId; + } + else + { + mpProcId = 0; + } + } + + CMPXCommand* cmd( CMPXCommand::NewL() ); + CleanupStack::PushL( cmd ); + cmd->SetTObjectValueL<TInt>( KMPXCommandGeneralId, KMPXCommandIdPlaybackGeneral ); + cmd->SetTObjectValueL<TBool>( KMPXCommandGeneralDoSync, ETrue ); + cmd->SetTObjectValueL<TInt>( KMPXCommandPlaybackGeneralType, aCommand ); + cmd->SetTObjectValueL<TInt>( KMPXCommandPlaybackGeneralData, 0 ); + if ( mpProcId ) + { + //This attribute will be used by playbckEngine->iLastActiveProcess + cmd->SetTObjectValueL<TProcessId> ( KMPXCommandPlaybackGeneralClientPid, mpProcId ); + } + if ( !iPlaybackUtility ) // Ensure that the utility exists + { + iPlaybackUtility = MMPXPlaybackUtility::NewL( KMusicPlayerAppUid); + } + + iPlaybackUtility->CommandL( *cmd ); + CleanupStack::PopAndDestroy( cmd ); + MPX_DEBUG1("<--CMusicPlayerActionHandler::SetPlaybackCommandL()"); + } + +// --------------------------------------------------------------------------- +// Sets a transition effect, to be called before bringing an application to foreground +// --------------------------------------------------------------------------- +// +void CMusicPlayerActionHandler::BeginFullScreenTransEffect( const TUid& aNext ) + { + MPX_DEBUG1("-->CMusicPlayerActionHandler::BeginFullScreenTransEffect()"); + GfxTransEffect::BeginFullScreen( + AknTransEffect::EApplicationStart, + TRect(), + AknTransEffect::EParameterType, + AknTransEffect::GfxTransParam( aNext, + AknTransEffect::TParameter::EActivateExplicitContinue )); + MPX_DEBUG1("<--CMusicPlayerActionHandler::BeginFullScreenTransEffect()"); + } +// End of File +