diff -r 33a5d2bbf6fc -r 73a1feb507fb mmshplugins/mmshaiwplugin/src/musaiwprovider.cpp --- a/mmshplugins/mmshaiwplugin/src/musaiwprovider.cpp Thu Aug 19 09:51:39 2010 +0300 +++ b/mmshplugins/mmshaiwplugin/src/musaiwprovider.cpp Tue Aug 31 15:12:07 2010 +0300 @@ -27,6 +27,8 @@ #include "musresourcefinderutil.h" #include "mussettings.h" #include "mussesseioninformationapi.h" +#include "musindicatorapi.h" +#include "mussessionproperties.h" #include @@ -48,6 +50,7 @@ #include #include #include +#include //////// public -- constructor and destructor //////// @@ -77,8 +80,9 @@ { MUS_LOG( "mus: [AIWPRO] -> CMusAiwProvider::~CMusAiwProvider" ) delete iResourceFileName ; - iResourceFileName = NULL ; - + iResourceFileName = NULL ; + delete iIndicator; + iIndicator = NULL ; MUS_LOG( "mus: [AIWPRO] <- CMusAiwProvider::~CMusAiwProvider" ) } @@ -143,25 +147,7 @@ TInt /* aCascadeId */, const CAiwGenericParamList& /* aInParamList */ ) { - FeatureManager::InitializeLibL(); - TBool support = FeatureManager::FeatureSupported( KFeatureIdMultimediaSharing ); - FeatureManager::UnInitializeLib(); - if( support ) - { - DoInitializeMenuPaneL( aMenuPane, aIndex ); - } - } - - -// ----------------------------------------------------------------------------- -// Initializes menu pane by adding provider-specific menu items. -// ----------------------------------------------------------------------------- -// -void CMusAiwProvider::DoInitializeMenuPaneL( - CAiwMenuPane& aMenuPane, - TInt aIndex) - { - MUS_LOG1( "mus: [AIWPRO] -> CMusAiwProvider::DoInitializeMenuPaneL( %d )", + MUS_LOG1( "mus: [AIWPRO] -> CMusAiwProvider::InitializeMenuPaneL( %d )", aIndex ) if( iResourceFileName == NULL ) @@ -172,7 +158,10 @@ TFileName filename ( *iResourceFileName ); MUS_LOG_TDESC( "mus: [AIWPRO] Resource filename: ", filename ) - if( ApplicationRunningL() ) + // If app running but hidden from fast swap it means that application + // is hidden from user and options menu should look same as + // when application is not yet started + if( ApplicationRunningL() && !HiddenFromFastSwapL() ) { MUS_LOG( "mus: [AIWPRO] Application already running:\ giving _continue sharing_ menu command" ) @@ -191,6 +180,10 @@ { OperatorVariantStartUpL( filename, aMenuPane, aIndex ); } + else if ( IsFastStartupModeL() ) + { + FastModeStartUpL( filename, aMenuPane, aIndex ); + } else { NoVariationStartUpL( filename, aMenuPane, aIndex ); @@ -198,7 +191,7 @@ } - MUS_LOG( "mus: [AIWPRO] <- CMusAiwProvider::DoInitializeMenuPaneL" ) + MUS_LOG( "mus: [AIWPRO] <- CMusAiwProvider::InitializeMenuPaneL" ) } // ----------------------------------------------------------------------------- @@ -209,7 +202,12 @@ void CMusAiwProvider::DoInitialiseL() { MUS_LOG( "mus: [AIWPRO] -> CMusAiwProvider::DoInitialiseL") - + + if ( !iIndicator ) + { + MUS_LOG( "mus: [AIWPRO] : creating indicator") + iIndicator = CMusIndicatorApi::NewL(); + } MUS_LOG( "mus: [AIWPRO] <- CMusAiwProvider::DoInitialiseL") } @@ -252,19 +250,10 @@ 3.When iAvailability plugin says OK ( Based on call,network,settingui item) 4.Also in confrence and hold cases */ - if ( iAvailability == MultimediaSharing::ESipRegistrationPending || - iAvailability == MultimediaSharing::ESipOptionsSent || - iAvailability == MultimediaSharing::EMultimediaSharingAvailable || - iAvailability == MultimediaSharing::EErrCallOnHold || - iAvailability == MultimediaSharing::EErrConferenceCall || - iAvailability == MultimediaSharing::ESipOptionsNotCapable || - iAvailability == MultimediaSharing::ESipOptionsNotSent || - iAvailability == MultimediaSharing::EErrNetwork || - iAvailability == MultimediaSharing::EManualActivation || - iAvailability == MultimediaSharing::EErrConnection || - iAvailability == MultimediaSharing::EErrSipRegistration ) + if ( AvailabilityOk( iAvailability ) ) { - MUS_LOG1( "mus: [AIWPRO] Showing AIW Menu -> iAvailability = %d ",iAvailability ) + MUS_LOG1( "mus: [AIWPRO] Showing AIW Menu -> iAvailability = %d ", + iAvailability ) TInt resourceID = R_MUSAIWPROVIDER_BASIC_CASCADED_SUBMENU ; if ( !FeatureManager::FeatureSupported( KFeatureIdCamera ) ) { @@ -278,7 +267,8 @@ } else { - MUS_LOG1( "mus: [AIWPRO] Not Showing AIW Menu -> iAvailability = %d ",iAvailability ) + MUS_LOG1( "mus: [AIWPRO] Not Showing AIW Menu -> iAvailability = %d ", + iAvailability ) } CleanupStack::PopAndDestroy( manager ); MUS_LOG( "mus: [AIWPRO] <- CMusAiwProvider::NoVariationStartUpL" ) @@ -300,7 +290,8 @@ // should be shown in call menu only if iAvailability plugin returns OK if ( iAvailability == MultimediaSharing::EMultimediaSharingAvailable ) { - MUS_LOG1( "mus: [AIWPRO] Showing AIW Menu -> iAvailability = %d ", iAvailability ) + MUS_LOG1( "mus: [AIWPRO] Showing AIW Menu -> iAvailability = %d ", + iAvailability ) TInt resourceID = R_MUSAIWPROVIDER_BASIC_CASCADED_SUBMENU ; if ( !FeatureManager::FeatureSupported( KFeatureIdCamera ) ) { @@ -314,7 +305,8 @@ } else { - MUS_LOG1( "mus: [AIWPRO] Not Showing AIW Menu -> iAvailability = %d ",iAvailability ) + MUS_LOG1( "mus: [AIWPRO] Not Showing AIW Menu -> iAvailability = %d ", + iAvailability ) } CleanupStack::PopAndDestroy( manager ); @@ -323,6 +315,60 @@ } // ----------------------------------------------------------------------------- +// In fast mode, Multimediasharing Menu items +// should not be shown before options queries have completed. Outcome +// of queries does not matter. +// ----------------------------------------------------------------------------- +// +void CMusAiwProvider::FastModeStartUpL( + TFileName& aFileName, CAiwMenuPane& aMenuPane, TInt aIndex ) + { + MUS_LOG( "mus: [AIWPRO] -> CMusAiwProvider::FastModeStartUpL" ) + + if ( MultimediaSharingSettings::CapabilityQuerySettingL() != + MusSettingsKeys::EParallel ) + { + // If parallel capability query is not enabled, use normal startup as + // capability query is essential for fast session setup + NoVariationStartUpL( aFileName, aMenuPane, aIndex ); + } + else + { + CMusManager* manager = CMusManager::NewLC(); + iAvailability = manager->AvailabilityL(); + + if ( iAvailability == MultimediaSharing::ESipRegistrationPending || + iAvailability == MultimediaSharing::ESipOptionsSent || + !AvailabilityOk( iAvailability ) ) + { + // Need to wait for options to complete + MUS_LOG1( "mus: [AIWPRO] Not Showing AIW Menu -> iAvailability = %d ", + iAvailability ) + } + else + { + // It does not matter what was result of query + MUS_LOG1( "mus: [AIWPRO] Showing AIW Menu -> iAvailability = %d ", + iAvailability ) + TInt resourceID = R_MUSAIWPROVIDER_BASIC_CASCADED_SUBMENU ; + if ( !FeatureManager::FeatureSupported( KFeatureIdCamera ) ) + { + MUS_LOG( "mus: [AIWPRO] Camera Not Available" ) + resourceID = R_MUSAIWPROVIDER_NOCAMERA_CASCADED_SUBMENU ; + } + aMenuPane.AddMenuItemsL( aFileName, + resourceID, + KMusAiwProviderUid, + aIndex ); + } + + CleanupStack::PopAndDestroy( manager ); + } + + MUS_LOG( "mus: [AIWPRO] <- CMusAiwProvider::FastModeStartUpL" ) + } + +// ----------------------------------------------------------------------------- // // ----------------------------------------------------------------------------- // @@ -501,32 +547,29 @@ { MUS_LOG( "mus: [AIWPRO] \ EMusCommandLiveShare: Will now attempt to start Mus." ) - TRAP( error, manager->StartApplicationL( - MultimediaSharing::EMusLiveVideo ) ); + TRAP( error, StartApplicationL( *manager, MultimediaSharing::EMusLiveVideo ) ); break; } case EMusCommandClipShare: { MUS_LOG( "mus: [AIWPRO] \ - EMusCommandClipShare: Will now attempt to start Mus." ) - TRAP( error, manager->StartApplicationL( - MultimediaSharing::EMusClipVideo ) ); + EMusCommandClipShare: Will now attempt to start Mus." ) + TRAP( error, StartApplicationL( *manager, MultimediaSharing::EMusClipVideo ) ); + break; } case EMusCommandImageShare: { MUS_LOG( "mus: [AIWPRO] \ EMusCommandImageShare: Will now attempt to start Mus." ) - TRAP( error, manager->StartApplicationL( - MultimediaSharing::EMusStillImage ) ); + TRAP( error, StartApplicationL( *manager, MultimediaSharing::EMusStillImage ) ); break; } case EMusCommandContinue: { MUS_LOG( "mus: [AIWPRO] \ EMusCommandContinue: Will now attempt to start/continue Mus." ) - TRAP( error, manager->StartApplicationL( - MultimediaSharing::EMusContinue ) ); + TRAP( error, StartApplicationL( *manager, MultimediaSharing::EMusContinue ) ); break; } default: @@ -548,4 +591,129 @@ MUS_LOG( "mus: [AIWPRO] <- CMusAiwProvider::HandleMenuCmdL" ) } +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +TBool CMusAiwProvider::AvailabilityOk( + MultimediaSharing::TMusAvailabilityStatus aAvailability ) const + { + return ( + aAvailability == MultimediaSharing::ESipRegistrationPending || + aAvailability == MultimediaSharing::ESipOptionsSent || + aAvailability == MultimediaSharing::EMultimediaSharingAvailable || + aAvailability == MultimediaSharing::EErrCallOnHold || + aAvailability == MultimediaSharing::EErrConferenceCall || + aAvailability == MultimediaSharing::ESipOptionsNotCapable || + aAvailability == MultimediaSharing::ESipOptionsNotSent || + aAvailability == MultimediaSharing::EErrNetwork || + aAvailability == MultimediaSharing::EManualActivation || + aAvailability == MultimediaSharing::EErrConnection || + aAvailability == MultimediaSharing::EErrSipRegistration ); + } + +// ----------------------------------------------------------------------------- +// App's fastswap visibility status is interesting only in fast mode. +// ----------------------------------------------------------------------------- +// +TBool CMusAiwProvider::HiddenFromFastSwapL() + { + MUS_LOG( "mus: [AIWPRO] -> CMusAiwProvider::HiddenFromFastSwapL" ) + + TBool hidden( EFalse ); + if ( !IsFastStartupModeL() ) + { + MUS_LOG( "mus: [AIWPRO] <- CMusAiwProvider::HiddenFromFastSwapL" ) + return hidden; + } + + const TInt KMusAiwMaxHiddenAppSizeMod = 4; + TBuf16 hiddenList; + TInt err = RProperty::Get( KPSUidUikon, KUikAppHiddenList, hiddenList ); + MUS_LOG1( "mus: [AIWPRO] Hidden list read:%d", err ) + + if ( err == KErrNone ) + { + TBool continueFinding( ETrue ); + MUS_LOG1( "mus: [AIWPRO] Hidden list len:%d", hiddenList.Length() ) + for ( TInt i = 0; i < KMaxHiddenApps && continueFinding; i++ ) + { + // 32-bit uid values are retrieved in two 16-bit parts + __ASSERT_ALWAYS( hiddenList.Length() > i + 1, User::Leave( KErrEof ) ); + TUint32 listValue = hiddenList[ i ] << 16; + listValue += hiddenList[ ++i ]; + // the value NULL marks the end of array -> leave the loop + if ( listValue ) + { + MUS_LOG1( "mus: [AIWPRO] Hidden uid:%d", listValue ) + if ( listValue == KMusUiUid ) + { + hidden = ETrue; + continueFinding = EFalse; + } + } + else + { + // Zero value means ending of list + continueFinding = EFalse; + } + } + } + + MUS_LOG1( "mus: [AIWPRO] <- CMusAiwProvider::HiddenFromFastSwapL:%d", hidden ) + + return hidden; + } + +// ----------------------------------------------------------------------------- +// Check whether fast mode is enabled, take in count that key +// might not be present. +// ----------------------------------------------------------------------------- +// +TBool CMusAiwProvider::IsFastStartupModeL() + { + TBool fastModeEnabled( EFalse ); + MusSettingsKeys::TFastMode fastMode( MusSettingsKeys::EFastModeOff ); + TRAPD( err, fastMode = MultimediaSharingSettings::FastStartupModeL() ); + if ( err == KErrNoMemory ) + { + User::Leave( err ); + } + if ( err == KErrNone ) + { + fastModeEnabled = ( fastMode == MusSettingsKeys::EFastModeOn ); + } + return fastModeEnabled; + } + +// ----------------------------------------------------------------------------- +// If fast mode is enabled and app is running and hidden, it has been started +// with live use-case but user does not know that. If user tries to do +// clip usecase in such situation, use case is just updated and engine +// takes case of bringing hidden application to foreground. +// ----------------------------------------------------------------------------- +// +void CMusAiwProvider::StartApplicationL( + CMusManager& aManager, MultimediaSharing::TMusUseCase aUseCase ) + { + MUS_LOG( "mus: [AIWPRO] -> CMusAiwProvider::StartApplicationL" ) + + TBool startApp( ETrue ); + if ( IsFastStartupModeL() && aUseCase == MultimediaSharing::EMusClipVideo && + ApplicationRunningL() && HiddenFromFastSwapL() ) + { + MUS_LOG( "mus: [AIWPRO] App already running hidden, change only usecase!" ) + User::LeaveIfError( RProperty::Set( + NMusSessionApi::KCategoryUid, NMusSessionApi::KUseCase, aUseCase ) ); + startApp = EFalse; + } + + if ( startApp ) + { + aManager.StartApplicationL( aUseCase ); + } + + MUS_LOG( "mus: [AIWPRO] <- CMusAiwProvider::StartApplicationL" ) + } + // end of file