appinstall_plat/sifui_api/src/sifuiprivate.cpp
changeset 42 d17dc5398051
parent 37 6e7b00453237
child 55 ac7f90a6ff4c
child 60 245df5276b97
--- 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 <hb/hbcore/hbsymbianvariant.h>         // CHbSymbianVariantMap
+#include <hb/hbwidgets/hbdevicenotificationdialogsymbian.h> // CHbDeviceNotificationDialogSymbian
 #include <apgicnfl.h>                           // CApaMaskedBitmap
 #include <s32mem.h>                             // RDesReadStream
+#include <e32property.h>                        // 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<CSifUiCertificateInfo>& 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<TBool>();
-        if( acceptedValue && *acceptedValue )
+        TInt* value = variant->Value<TInt>();
+        if( value )
             {
-            iReturnValue = KErrNone;
+            TSifUiDeviceDialogReturnValue returnValue =
+                    static_cast<TSifUiDeviceDialogReturnValue>( *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 );
         }