diff -r 6e7b00453237 -r d17dc5398051 appinstall_plat/sifui_api/src/sifuiprivate.cpp --- a/appinstall_plat/sifui_api/src/sifuiprivate.cpp Thu May 27 12:58:35 2010 +0300 +++ b/appinstall_plat/sifui_api/src/sifuiprivate.cpp Fri Jun 11 13:45:18 2010 +0300 @@ -16,15 +16,22 @@ */ #include "sifuiprivate.h" // CSifUiPrivate -#include "sifuidefs.h" // SIF UI device dialog parameters #include "sifuicertificateinfo.h" // CSifUiCertificateInfo #include "sifuiappinfo.h" // CSifUiAppInfo #include // CHbSymbianVariantMap +#include // CHbDeviceNotificationDialogSymbian #include // CApaMaskedBitmap #include // RDesReadStream +#include // RProperty const TInt KDriveLettersLen = 32; const TInt KCertificateBufferGranularity = 1024; +const TInt KProgFull = 100; // 100% + +const TUid KInstallIndicatorCategory = { 0x20022FC5 }; +const TUint KInstallIndicatorStatus = 0x2002E690; + +_LIT( KSifUiDefaultApplicationIcon, "qtg_large_application" ); // ======== MEMBER FUNCTIONS ======== @@ -52,9 +59,10 @@ delete iWait; delete iDeviceDialog; delete iVariantMap; - delete iBitmap; + delete iIndicator; + delete iAppInfo; delete iSelectableDrives; - delete iCertificateInfo; + delete iCertificateBuffer; } // --------------------------------------------------------------------------- @@ -70,15 +78,10 @@ { AddParamL( KSifUiMemorySelection, *iSelectableDrives ); } - if( iCertificateInfo ) - { - User::LeaveIfError( VariantMapL()->Add( KSifUiCertificates, iCertificateInfo ) ); - iCertificateInfo = NULL; - } + AddParamsCertificatesL(); - DisplayDeviceDialogL(); - User::LeaveIfError( WaitForResponse() ); - return( iReturnValue == KErrNone ); + UpdateDialogAndWaitForResponseL(); + return( iDialogReturnValue == KErrNone ); } // --------------------------------------------------------------------------- @@ -132,16 +135,15 @@ void CSifUiPrivate::SetCertificateInfoL( const RPointerArray& aCertificates ) { - if( iCertificateInfo ) + if( iCertificateBuffer ) { - delete iCertificateInfo; - iCertificateInfo = NULL; + delete iCertificateBuffer; + iCertificateBuffer = NULL; } if( aCertificates.Count() ) { - CBufBase* buf = CBufFlat::NewL( KCertificateBufferGranularity ); - CleanupStack::PushL( buf ); - RBufWriteStream writeStream( *buf ); + iCertificateBuffer = CBufFlat::NewL( KCertificateBufferGranularity ); + RBufWriteStream writeStream( *iCertificateBuffer ); CleanupClosePushL( writeStream ); TInt32 count = aCertificates.Count(); @@ -151,10 +153,7 @@ aCertificates[ index ]->ExternalizeL( writeStream ); } - const TPtrC8 dataPtr( buf->Ptr( 0 ).Ptr(), buf->Size() ); - iCertificateInfo = CHbSymbianVariant::NewL( &dataPtr, CHbSymbianVariant::EBinary ); - - CleanupStack::PopAndDestroy( 2, buf ); // writeStream, buf + CleanupStack::PopAndDestroy( &writeStream ); } } @@ -169,8 +168,10 @@ AddParamsAppInfoL( aAppInfo ); AddParamL( KSifUiProgressNoteFinalValue, aProgressBarFinalValue ); + iProgressBarFinalValue = aProgressBarFinalValue; + AddParamsHiddenButtonsL(); - DisplayDeviceDialogL(); + UpdateDialogOrIndicatorWithoutWaitingL(); } // --------------------------------------------------------------------------- @@ -182,8 +183,44 @@ ChangeNoteTypeL( ESifUiProgressNote ); AddParamL( KSifUiProgressNoteValue, aNewValue ); + iProgressBarCurrentValue += aNewValue; + AddParamsHiddenButtonsL(); - DisplayDeviceDialogL(); + UpdateDialogOrIndicatorWithoutWaitingL(); + } + +// --------------------------------------------------------------------------- +// CSifUiPrivate::IsCancelled() +// --------------------------------------------------------------------------- +// +TBool CSifUiPrivate::IsCancelled() + { + return( iDialogReturnValue == KErrCancel ); + } + +// --------------------------------------------------------------------------- +// CSifUiPrivate::SetButtonVisible() +// --------------------------------------------------------------------------- +// +void CSifUiPrivate::SetButtonVisible( CSifUi::TOptionalButton aButton, TBool aIsVisible ) + { + switch( aButton ) + { + case CSifUi::EHideProgressButton: + iNoHideProgressButton = !aIsVisible; + break; + case CSifUi::ECancelProgressButton: + iNoCancelProgressButton = !aIsVisible; + break; + case CSifUi::EShowInAppLibButton: + iNoShowInAppLibButton = !aIsVisible; + break; + case CSifUi::EErrorDetailsButton: + iNoErrorDetailsButton = !aIsVisible; + break; + default: + break; + } } // --------------------------------------------------------------------------- @@ -194,8 +231,9 @@ { ChangeNoteTypeL( ESifUiCompleteNote ); - DisplayDeviceDialogL(); - User::LeaveIfError( WaitForResponse() ); + AddParamsHiddenButtonsL(); + + CompleteDialogOrIndicatorAndWaitForResponseL( KErrNone ); } // --------------------------------------------------------------------------- @@ -214,8 +252,7 @@ AddParamL( KSifUiErrorDetails, aErrorDetails ); } - DisplayDeviceDialogL(); - User::LeaveIfError( WaitForResponse() ); + CompleteDialogOrIndicatorAndWaitForResponseL( aErrorCode ); } // --------------------------------------------------------------------------- @@ -226,7 +263,7 @@ { if( iWait && iWait->IsStarted() && iWait->CanStopNow() ) { - iCompletionCode = KErrCancel; + iWaitCompletionCode = KErrCancel; iWait->AsyncStop(); } } @@ -256,19 +293,36 @@ iSelectedDriveSet = ETrue; } - const CHbSymbianVariant* acceptedVariant = aData.Get( KSifUiQueryAccepted ); - if( acceptedVariant ) + const CHbSymbianVariant* variant = aData.Get( KSifUiQueryReturnValue ); + if( variant ) { - TBool* acceptedValue = acceptedVariant->Value(); - if( acceptedValue && *acceptedValue ) + TInt* value = variant->Value(); + if( value ) { - iReturnValue = KErrNone; + TSifUiDeviceDialogReturnValue returnValue = + static_cast( *value ); + switch( returnValue ) + { + case ESifUiContinue: + iDialogReturnValue = KErrNone; + WaitedResponseReceived( KErrNone ); + break; + case ESifUiCancel: + iDialogReturnValue = KErrCancel; + WaitedResponseReceived( KErrNone ); + break; + case ESifUiIndicator: + ActivateInstallIndicatorL(); + break; + default: + __ASSERT_DEBUG( EFalse, User::Invariant() ); + break; + } } else { - iReturnValue = KErrCancel; + __ASSERT_DEBUG( EFalse, User::Invariant() ); } - ResponseReceived( KErrNone ); } } @@ -279,14 +333,29 @@ void CSifUiPrivate::DeviceDialogClosed( TInt aCompletionCode ) { iIsDisplayingDialog = EFalse; - ResponseReceived( aCompletionCode ); + WaitedResponseReceived( aCompletionCode ); + } + +// --------------------------------------------------------------------------- +// CSifUiPrivate::IndicatorUserActivated() +// --------------------------------------------------------------------------- +// +void CSifUiPrivate::IndicatorUserActivated( const TDesC& aType, + CHbSymbianVariantMap& /*aData*/ ) + { + if( aType == KSifUiInstallIndicatorType ) + { + CloseInstallIndicator(); + TRAP_IGNORE( DisplayDeviceDialogL() ); + } } // --------------------------------------------------------------------------- // CSifUiPrivate::CSifUiPrivate() // --------------------------------------------------------------------------- // -CSifUiPrivate::CSifUiPrivate() : CActive( CActive::EPriorityStandard ) +CSifUiPrivate::CSifUiPrivate() : CActive( CActive::EPriorityStandard ), + iIsFirstTimeToDisplay( ETrue ) { CActiveScheduler::Add( this ); } @@ -298,7 +367,8 @@ void CSifUiPrivate::ConstructL() { iWait = new( ELeave ) CActiveSchedulerWait; - // iDeviceDialog is allocated later, first call of DisplayDeviceDialogL() + // iDeviceDialog is created later, in the first call of DisplayDeviceDialogL() + // iIndicator is also created later, in the first call of ActivateInstallIndicator() } // --------------------------------------------------------------------------- @@ -335,6 +405,7 @@ { ClearParams(); AddParamL( KSifUiDialogType, aType ); + iDialogType = static_cast< TSifUiDeviceDialogType >( aType ); } // --------------------------------------------------------------------------- @@ -376,7 +447,6 @@ // void CSifUiPrivate::AddParamsAppInfoL( const CSifUiAppInfo& aAppInfo ) { - // TODO: icons missing, could use binary transfer as in certificates AddParamL( KSifUiApplicationName, aAppInfo.Name() ); const TVersion& version( aAppInfo.Version() ); if( version.iBuild || version.iMajor || version.iMinor ) @@ -391,32 +461,238 @@ { AddParamL( KSifUiApplicationSize, aAppInfo.Size() ); } + // TODO: icons missing, could use binary transfer as in certificates + + if( iAppInfo != &aAppInfo ) + { + if( iAppInfo ) + { + delete iAppInfo; + iAppInfo = NULL; + } + iAppInfo = CSifUiAppInfo::NewL( aAppInfo ); + } + } + +// --------------------------------------------------------------------------- +// CSifUiPrivate::AddParamsCertificatesL() +// --------------------------------------------------------------------------- +// +void CSifUiPrivate::AddParamsCertificatesL() + { + if( iCertificateBuffer ) + { + const TPtrC8 dataPtr( iCertificateBuffer->Ptr( 0 ).Ptr(), + iCertificateBuffer->Size() ); + CHbSymbianVariant* certificates = CHbSymbianVariant::NewL( &dataPtr, + CHbSymbianVariant::EBinary ); + CleanupStack::PushL( certificates ); + User::LeaveIfError( VariantMapL()->Add( KSifUiCertificates, certificates ) ); + CleanupStack::Pop( certificates ); + } + } + +// --------------------------------------------------------------------------- +// CSifUiPrivate::AddParamsHiddenButtonsL() +// --------------------------------------------------------------------------- +// +void CSifUiPrivate::AddParamsHiddenButtonsL() + { + CHbSymbianVariant* variant = NULL; + if( iNoHideProgressButton ) + { + variant = CHbSymbianVariant::NewL( &iNoHideProgressButton, CHbSymbianVariant::EBool ); + TInt err = VariantMapL()->Add( KSifUiProgressNoteIsHideButtonHidden, variant ); + User::LeaveIfError( err ); + } + if( iNoCancelProgressButton ) + { + variant = CHbSymbianVariant::NewL( &iNoCancelProgressButton, CHbSymbianVariant::EBool ); + TInt err = VariantMapL()->Add( KSifUiProgressNoteIsCancelButtonHidden, variant ); + User::LeaveIfError( err ); + } + if( iNoShowInAppLibButton ) + { + variant = CHbSymbianVariant::NewL( &iNoShowInAppLibButton, CHbSymbianVariant::EBool ); + TInt err = VariantMapL()->Add( KSifUiCompleteNoteIsShowButtonHidden, variant ); + User::LeaveIfError( err ); + } + if( iNoErrorDetailsButton ) + { + variant = CHbSymbianVariant::NewL( &iNoErrorDetailsButton, CHbSymbianVariant::EBool ); + TInt err = VariantMapL()->Add( KSifUiErrorNoteIsDetailsButtonHidden, variant ); + User::LeaveIfError( err ); + } + } + +// --------------------------------------------------------------------------- +// CSifUiPrivate::ResendAllInstallationDetailsL() +// --------------------------------------------------------------------------- +// +void CSifUiPrivate::ResendAllInstallationDetailsL() + { + AddParamL( KSifUiDialogType, iDialogType ); + if( iAppInfo ) + { + AddParamsAppInfoL( *iAppInfo ); + } + AddParamsCertificatesL(); + // TODO: AddParamsIconL(); + AddParamsHiddenButtonsL(); + } + +// --------------------------------------------------------------------------- +// CSifUiPrivate::ActivateInstallIndicatorL() +// --------------------------------------------------------------------------- +// +void CSifUiPrivate::ActivateInstallIndicatorL() + { + if( !iIndicator ) + { + iIndicator = CHbIndicatorSymbian::NewL(); + iIndicator->SetObserver( this ); + } + + if( iAppInfo && iAppInfo->Name().Length() ) + { + CHbSymbianVariant* param = NULL; + TPtrC appName = iAppInfo->Name(); + param = CHbSymbianVariant::NewL( &appName, CHbSymbianVariant::EDes ); + CleanupStack::PushL( param ); + iIndicator->Activate( KSifUiInstallIndicatorType, param ); + CleanupStack::PopAndDestroy( param ); + } + else + { + iIndicator->Activate( KSifUiInstallIndicatorType ); + } } // --------------------------------------------------------------------------- -// CSifUiPrivate::AddParamsIconL() +// CSifUiPrivate::UpdateInstallIndicatorProgressL() +// --------------------------------------------------------------------------- +// +void CSifUiPrivate::UpdateInstallIndicatorProgressL() + { + if( iProgressBarFinalValue ) + { + CHbSymbianVariant* param = NULL; + TInt progressPercent = KProgFull * iProgressBarCurrentValue / iProgressBarFinalValue; + param = CHbSymbianVariant::NewL( &progressPercent, CHbSymbianVariant::EInt ); + CleanupStack::PushL( param ); + iIndicator->Activate( KSifUiInstallIndicatorType, param ); + CleanupStack::PopAndDestroy( param ); + } + } + +// --------------------------------------------------------------------------- +// CSifUiPrivate::CloseInstallIndicator() +// --------------------------------------------------------------------------- +// +void CSifUiPrivate::CloseInstallIndicator() + { + if( iIndicator ) + { + iIndicator->Deactivate( KSifUiInstallIndicatorType ); + delete iIndicator; + iIndicator = NULL; + } + } + +// --------------------------------------------------------------------------- +// CSifUiPrivate::IsIndicatorActive() +// --------------------------------------------------------------------------- +// +TBool CSifUiPrivate::IsIndicatorActive() + { + TBool isActive = EFalse; + + if( iIndicator ) + { + TInt value = 0; + TInt err = RProperty::Get( KInstallIndicatorCategory, KInstallIndicatorStatus, + value ); + if( !err ) + { + isActive = ( value > 0 ); + } + } + + return isActive; + } + +// --------------------------------------------------------------------------- +// CSifUiPrivate::ShowInstallIndicatorCompleteL() // --------------------------------------------------------------------------- // -void CSifUiPrivate::AddParamsIconL( const CApaMaskedBitmap* aIcon ) +void CSifUiPrivate::ShowInstallIndicatorCompleteL( TInt aErrorCode ) { - // TODO: remove this function - if( aIcon ) + CHbDeviceNotificationDialogSymbian* completeNote = + CHbDeviceNotificationDialogSymbian::NewL(); + CleanupStack::PushL( completeNote ); + completeNote->SetIconNameL( KSifUiDefaultApplicationIcon ); + if( aErrorCode == KErrNone ) + { + // TODO: use HbTextResolverSymbian to get localized text + _LIT( KInstalled, "Installed" ); + completeNote->SetTitleL( KInstalled ); + } + else { - if( iBitmap ) + // TODO: use HbTextResolverSymbian to get localized text + _LIT( KInstallationFailed, "Installation failed" ); + completeNote->SetTitleL( KInstallationFailed ); + } + completeNote->ShowL(); + CleanupStack::PopAndDestroy( completeNote ); + } + +// --------------------------------------------------------------------------- +// CSifUiPrivate::UpdateDialogAndWaitForResponseL() +// --------------------------------------------------------------------------- +// +void CSifUiPrivate::UpdateDialogAndWaitForResponseL() + { + CloseInstallIndicator(); + DisplayDeviceDialogL(); + WaitForResponseL(); + } + +// --------------------------------------------------------------------------- +// CSifUiPrivate::UpdateDialogOrIndicatorWithoutWaitingL() +// --------------------------------------------------------------------------- +// +void CSifUiPrivate::UpdateDialogOrIndicatorWithoutWaitingL() + { + if( IsIndicatorActive() ) + { + UpdateInstallIndicatorProgressL(); + } + else + { + DisplayDeviceDialogL(); + } + } + +// --------------------------------------------------------------------------- +// CSifUiPrivate::CompleteDialogOrIndicatorAndWaitForResponseL() +// --------------------------------------------------------------------------- +// +void CSifUiPrivate::CompleteDialogOrIndicatorAndWaitForResponseL( TInt aErrorCode ) + { + if( !IsCancelled() ) + { + if( IsIndicatorActive() ) { - delete iBitmap; - iBitmap = NULL; + UpdateInstallIndicatorProgressL(); + ShowInstallIndicatorCompleteL( aErrorCode ); + CloseInstallIndicator(); } - iBitmap = CApaMaskedBitmap::NewL( aIcon ); - - CHbSymbianVariantMap* map = VariantMapL(); - CHbSymbianVariant* variant = NULL; - TInt bitmapHandle = iBitmap->Handle(); - variant = CHbSymbianVariant::NewL( &bitmapHandle, CHbSymbianVariant::EInt ); - User::LeaveIfError( map->Add( KSifUiApplicationIconHandle, variant ) ); - TInt bitmapMaskHandle = iBitmap->Mask()->Handle(); - variant = CHbSymbianVariant::NewL( &bitmapMaskHandle, CHbSymbianVariant::EInt ); - User::LeaveIfError( map->Add( KSifUiApplicationIconMaskHandle, variant ) ); + else + { + DisplayDeviceDialogL(); + WaitForResponseL(); + } } } @@ -436,37 +712,42 @@ { iDeviceDialog = CHbDeviceDialogSymbian::NewL(); } + if( !iIsFirstTimeToDisplay ) + { + ResendAllInstallationDetailsL(); + } User::LeaveIfError( iDeviceDialog->Show( KSifUiDeviceDialog, *VariantMapL(), this ) ); iIsDisplayingDialog = ETrue; } + iIsFirstTimeToDisplay = EFalse; } // --------------------------------------------------------------------------- -// CSifUiPrivate::WaitForResponse() +// CSifUiPrivate::WaitForResponseL() // --------------------------------------------------------------------------- // -TInt CSifUiPrivate::WaitForResponse() +void CSifUiPrivate::WaitForResponseL() { - iCompletionCode = KErrInUse; - iReturnValue = KErrUnknown; + iWaitCompletionCode = KErrInUse; // changed in WaitedResponseReceived() or in DoCancel() + iDialogReturnValue = KErrUnknown; // changed in DataReceived() if( !IsActive() && iWait && !iWait->IsStarted() ) { iStatus = KRequestPending; SetActive(); iWait->Start(); } - return iCompletionCode; + User::LeaveIfError( iWaitCompletionCode ); } // --------------------------------------------------------------------------- -// CSifUiPrivate::ResponseReceived() +// CSifUiPrivate::WaitedResponseReceived() // --------------------------------------------------------------------------- // -void CSifUiPrivate::ResponseReceived( TInt aCompletionCode ) +void CSifUiPrivate::WaitedResponseReceived( TInt aCompletionCode ) { if( IsActive() ) { - iCompletionCode = aCompletionCode; + iWaitCompletionCode = aCompletionCode; TRequestStatus* status( &iStatus ); User::RequestComplete( status, KErrNone ); }