devicediagnostics/diagplugins/diagvibrateplugin/src/diagvibrateplugin.cpp
changeset 0 3ce708148e4d
child 54 9360ca28b668
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/devicediagnostics/diagplugins/diagvibrateplugin/src/diagvibrateplugin.cpp	Thu Dec 17 08:40:12 2009 +0200
@@ -0,0 +1,865 @@
+/*
+* Copyright (c) 2007 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:  Vibrate plugin interface implementation
+*
+*/
+
+
+// INCLUDE FILES
+#include <avkon.hrh>
+#include <AknQueryDialog.h>
+#include <aknmessagequerydialog.h>
+#include <DiagFrameworkDebug.h>         
+#include <DiagTestExecParam.h>      
+#include <DiagTestObserver.h>       
+#include <devdiagvibratepluginrsc.rsg>
+#include <hal.h>
+#include <hwrmpowerstatesdkpskeys.h>
+#include <MProEngEngine.h>
+#include <MProEngProfile.h>
+#include <MProEngToneSettings.h>
+#include <ProEngFactory.h> 
+#include <DiagEngineCommon.h>    
+#include <DiagCommonDialog.h>    
+#include <StringLoader.h>           
+#include <centralrepository.h>
+
+#include "diagvibrateplugin.h"
+#include "diagvibrateplugin.hrh"
+#include "diagvibratepluginengine.h"
+#include "diagvibratepluginprivatecrkeys.h"
+
+// EXTERNAL DATA STRUCTURES
+
+// EXTERNAL FUNCTION PROTOTYPES
+
+// CONSTANTS
+const TUid KDiagVibratePluginUid = { DIAG_VIBRATE_PLUGIN_UID };
+static const TInt KProgressDialogIncrementSize = 10;
+static const TInt KProgressDialogFinalValue = 100;
+static const TInt KHundredthsInSecond = 100;
+
+static const TInt KVibratePluginTotalStep = 1;
+
+// MACROS
+_LIT( KDiagVibratePluginResourceFileName, "z:DevDiagVibratePluginRsc.rsc" );
+
+// LOCAL CONSTANTS AND MACROS
+#ifdef _DEBUG
+    enum TVibratePluginPanic
+        {
+        EPanicUnknownVibraState= 900,
+        EPanicInitParamsNull,
+        EPanicStateRepeated
+        };
+
+    _LIT( KVibratePluginErrorUnknownVibraStateText, "VibraStatusChanged: Unknown vibra state" );
+    _LIT( KVibratePluginErrorInitParamsNullText, "NewL: InitParams NULL" );
+    _LIT( KVibratePluginErrorStateRepeatedText, "State change not effective" );
+#endif
+
+// MODULE DATA STRUCTURES
+
+// LOCAL FUNCTION PROTOTYPES
+
+// FORWARD DECLARATIONS
+
+// ============================= LOCAL FUNCTIONS ==============================
+
+// ========================= MEMBER FUNCTIONS ================================
+
+// ---------------------------------------------------------------------------
+// CDiagVibratePlugin::NewL()
+//
+// Symbian OS default constructor
+// ---------------------------------------------------------------------------
+//
+MDiagPlugin* CDiagVibratePlugin::NewL( TAny* aInitParams )
+    {
+    __ASSERT_DEBUG( aInitParams, User::Panic ( KVibratePluginErrorInitParamsNullText, 
+        EPanicInitParamsNull ));
+
+    CDiagPluginConstructionParam* param = NULL;
+    param = static_cast<CDiagPluginConstructionParam*>( aInitParams );    
+
+    CleanupStack::PushL( param );    
+    CDiagVibratePlugin* self = new( ELeave ) CDiagVibratePlugin ( param );
+    CleanupStack::Pop( param );
+
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    
+    CleanupStack::Pop( self ); // self
+    return self;
+    }
+
+
+// ----------------------------------------------------------------------------
+// CDiagVibratePlugin::~CDiagVibratePlugin
+//
+// Destructor
+// ----------------------------------------------------------------------------
+//
+CDiagVibratePlugin::~CDiagVibratePlugin()
+    {
+    Cancel();
+    delete iProgressDialog;
+    delete iEngine;
+    }
+
+
+// ---------------------------------------------------------------------------
+// From MDiagPlugin
+// CDiagVibratePlugin::IsVisible()
+// ---------------------------------------------------------------------------
+//
+TBool CDiagVibratePlugin::IsVisible() const
+    {
+    return ETrue;
+    }
+
+
+// ---------------------------------------------------------------------------
+// From MDiagTestPlugin
+// CDiagVibratePlugin::RunMode()
+// ---------------------------------------------------------------------------
+//
+MDiagTestPlugin::TRunMode CDiagVibratePlugin::RunMode() const
+    {
+    return EInteractiveDialog;
+    }
+
+
+// ---------------------------------------------------------------------------
+// From MDiagTestPlugin
+// CDiagVibratePlugin::TotalSteps()
+// ---------------------------------------------------------------------------
+//
+TUint CDiagVibratePlugin::TotalSteps() const
+    {
+    return KVibratePluginTotalStep;
+    }
+
+
+// ---------------------------------------------------------------------------
+// From MDiagPlugin
+// CDiagVibratePlugin::GetPluginNameL
+// ---------------------------------------------------------------------------
+//
+HBufC* CDiagVibratePlugin::GetPluginNameL( TNameLayoutType aLayoutType ) const
+    {
+    switch ( aLayoutType )
+        {
+        case ENameLayoutHeadingPane:
+            return StringLoader::LoadL( R_DIAG_MSG_TITLE_VIBRATE );
+
+        case ENameLayoutPopupInfoPane:
+            return StringLoader::LoadL ( R_DIAG_MSG_INFO_VIBRATE );
+
+        case ENameLayoutTitlePane:
+            return StringLoader::LoadL( R_DIAG_TITLE_TEST_VIBRATE );
+
+        case ENameLayoutListSingleGraphic:
+            return StringLoader::LoadL( R_DIAG_LST_TEST_VIBRATE );
+
+        case ENameLayoutListSingle:
+            return StringLoader::LoadL ( R_DIAG_LST_VIBRATE );
+
+        default:
+            LOGSTRING2( "CDiagVibratePlugin::GetPluginNameL: "
+                L"ERROR: Unsupported layout type %d", aLayoutType )
+            __ASSERT_DEBUG( 0, User::Invariant() );
+            return StringLoader::LoadL( R_DIAG_LST_VIBRATE );
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// From MDiagPlugin
+// CDiagVibratePlugin::Uid
+// ---------------------------------------------------------------------------
+//
+TUid CDiagVibratePlugin::Uid() const
+    {
+    return KDiagVibratePluginUid;
+    }
+
+
+// ---------------------------------------------------------------------------
+// From MDiagVibratePluginObserver
+// MDiagVibratePluginObserver::VibraStatusChanged
+// ---------------------------------------------------------------------------
+//
+void CDiagVibratePlugin::VibraStatusChanged( TVibrateStatus aStatus )
+    {
+    CDiagVibratePlugin::TState newState = EStateUnknown; 
+    
+    switch ( aStatus )
+        {
+        case EVibrateStarted:
+            //The vibra can be started only from the idle state
+            newState = ( iState == EStateIdle || iState == EStateRestart) ? EStateVibrating : EStateUnknown;
+            break;
+             
+        case EVibrateEnded:
+            //Vibra should not be stopped before it is started
+            newState = ( iState == EStateVibrating ) ? EStateUserQuery : EStateUnknown;
+            break;
+            
+        case EVibrateFailed:
+            //check if already failed, cancelled or skipped
+            newState = ( iState != EStateFailed && iState != EStateCancelled &&
+                         iState != EStateSkipped ) ? EStateFailed : EStateUnknown;
+            break;        
+                
+        case EVibrateBlocked:
+			newState = ( iState == EStateVibrating ) ? EStateBlocked : EStateUnknown;
+			break;
+        default: //should never happen..
+            __ASSERT_DEBUG( 0, User::Panic( KVibratePluginErrorUnknownVibraStateText,
+                EPanicUnknownVibraState ) );
+            return;
+        }
+        
+    if ( newState != EStateUnknown) // Check if new state is available
+        {
+        SetState( newState );
+        SetActive();
+        TRequestStatus* status = &iStatus;
+        User::RequestComplete(status, KErrNone);
+        }
+        
+    }
+
+// ----------------------------------------------------------------------------
+// From MProgressDialogCallback
+// Progress dialog has been dismissed
+// ----------------------------------------------------------------------------
+//
+void CDiagVibratePlugin::DialogDismissedL( TInt aButtonId )
+    {
+    //Processing the user input only if the state is still vibrating
+    if ( iState == EStateVibrating )
+        {
+        iEngine->StopVibra();
+
+        CDiagVibratePlugin::TState newState = EStateUnknown; 
+        
+        switch ( aButtonId )
+            {
+            case ECBACmdSkip:
+                newState = EStateSkipped;
+                break;
+
+            case ECBACmdCancel:
+                newState = EStateCancelled;
+                break;
+                
+            default:
+                break;
+            }
+        
+        if ( newState != EStateUnknown )
+            {
+            SetState( newState );
+            SetActive();
+            TRequestStatus* status = &iStatus;
+            User::RequestComplete(status, KErrNone);
+            }
+        }
+    else if(aButtonId == EAknSoftkeyOk)
+        {
+        CDiagVibratePlugin::TState newState = EStateUserQuery;
+        SetState( newState );
+        SetActive();
+        TRequestStatus* status = &iStatus;
+        User::RequestComplete(status, KErrNone);
+        }
+     
+    }
+
+// ----------------------------------------------------------------------------
+// CDiagVibratePlugin::CDiagVibratePlugin()
+//
+// Constructor
+// ----------------------------------------------------------------------------
+//
+CDiagVibratePlugin::CDiagVibratePlugin( CDiagPluginConstructionParam* aParam )
+    :   CDiagTestPluginBase( aParam ),
+        iState( EStateCancelled )
+    {
+    }
+
+
+// ---------------------------------------------------------------------------
+// CDiagVibratePlugin::ConstructL()
+//
+// Symbian OS two-phased constructor
+// ---------------------------------------------------------------------------
+//
+void CDiagVibratePlugin::ConstructL()
+    {
+    BaseConstructL ( KDiagVibratePluginResourceFileName );
+    ReadVibrationTimeL();
+    }
+
+
+// ---------------------------------------------------------------------------
+// From CDiagTestPluginBase
+// CDiagVibratePlugin::DoRunTestL()
+// ---------------------------------------------------------------------------
+//
+void CDiagVibratePlugin::DoRunTestL()
+    {
+    SetState( EStateIdle );
+
+    //Let's confirm from the user that the test should be run
+    FOREVER
+        {
+        CAknMessageQueryDialog* dialog = new ( ELeave ) CAknMessageQueryDialog();
+        dialog->PrepareLC( R_VIBRATEPLUGIN_STARTQUERY );
+        
+        // If the test is run as a single test removing skip button
+        if ( SinglePluginExecution() )
+            {
+            CEikButtonGroupContainer& cba = dialog->ButtonGroupContainer();
+            cba.SetCommandSetL( R_VIBRATE_SOFTKEYS_OK__CANCEL );
+            }
+
+        TInt queryResult;
+        
+        if ( !RunWaitingDialogL( dialog, queryResult ) )
+            {
+            // Dialog is dismissed by deletion. Exit immediately without
+            // accessing member variable, to prevent crash
+            return;
+            }
+
+        //Let's check the user answer
+        switch ( queryResult )
+            {
+            
+            // ADO & Platformization Changes
+            //case ECBACmdSkip:
+            case ECBACmdCancel:
+                CompleteTestL( CDiagResultsDatabaseItem::ESkipped );
+                return;
+
+			case ECBACmdSkip:
+			
+            //case ECBACmdCancel:
+                {
+                //if ( SinglePluginExecution() )
+                  //  {
+                   // CompleteTestL( CDiagResultsDatabaseItem::ECancelled );
+                   // return;
+                   // }
+               // else 
+                 //   {
+                      // See if the user really wants to cancel tests.
+                    TInt confirmResult = 0;
+                
+                    CAknDialog* dlg = ExecutionParam().Engine().
+                    CreateCommonDialogLC( EDiagCommonDialogConfirmSkipAll, NULL );
+                
+                    if ( !RunWaitingDialogL( dlg, confirmResult ) )
+                        {
+                        return;
+                        }
+                    /*
+                    if ( confirmResult != EAknSoftkeyNo )
+                        {
+                       CompleteTestL( CDiagResultsDatabaseItem::ECancelled ); 
+                        return;
+                        }
+                    */
+                    if (confirmResult)
+                           {
+                           //CompleteTestL( CDiagResultsDatabaseItem::ECancelled ); 
+                           return;
+                           }
+                    
+                 //   }
+              
+                // Break and display the dialog again.
+                }
+                break;
+                // Changes ends
+                
+            case EAknSoftkeyOk:
+                {
+                //Let's check that the charger is not connected
+                
+                if ( IsChargerConnected() && !DisplayDisconnectChargerQueryL() )
+                    {
+                    return;
+                    }
+                //Let's start the test by activating active object
+                SetActive();
+                TRequestStatus* status = &iStatus;
+                User::RequestComplete(status, KErrNone);
+                return;
+                }
+            default:
+                return;
+            }
+        }
+    }
+
+
+// ---------------------------------------------------------------------------
+// From CActive
+// CDiagVibratePlugin::RunL
+// ---------------------------------------------------------------------------
+//
+void CDiagVibratePlugin::RunL()
+    {
+
+	// ravi - badwarning #546-D    
+    TRequestStatus* status = &iStatus;
+    
+    switch (iState) 
+        {
+        case EStateRestart:
+        	{
+        	iEngine->StopVibra();
+        	LOGSTRING( "In RunL, EStateRestart");
+            ShowVibratingNoteL();
+            iEngine = CDiagVibratePluginEngine::NewL( *this );    
+            TRAPD(Err,iEngine->StartVibraL( iVibrationTime ));
+            if (Err == KErrNone)
+            LOGSTRING("Leave code for restart = Kerrnone");
+            LOGSTRING2( "Leave Code for in Restart StartVibra in Hex( 0x%x )", Err );
+            break;
+        	}
+        case EStateIdle:
+            if(!SetVibrateSettingOnL())
+            	break;
+            ShowVibratingNoteL();
+            iEngine = CDiagVibratePluginEngine::NewL( *this );    
+            iEngine->StartVibraL( iVibrationTime );
+            break;
+            
+        case EStateVibrating:
+            //Vibration started -> no action needed
+            break;
+            
+        case EStateUserQuery: 
+            {
+            delete iEngine;
+            iEngine = NULL;
+            
+            if ( iProgressDialog )
+                {
+                iProgressDialog->ProcessFinishedL();
+                }
+ 
+            SetVibrateSettingToOriginalValueL();
+            //displaying user query: did the phone vibrate
+
+            CAknQueryDialog* dialog = new ( ELeave ) CAknQueryDialog( CAknQueryDialog::ENoTone );
+            dialog->PrepareLC( R_VIBRATEPLUGIN_CONFQUERY_DLG );
+
+            TInt queryResult;
+            if ( RunWaitingDialogL( dialog, queryResult ) )
+                {
+                //Let's check the user answer    
+                switch ( queryResult )
+                    {
+                    case EAknSoftkeyYes:
+                        LOGSTRING("CDiagVibratePlugin-EAknSoftkeyYes")
+                        CompleteTestL( CDiagResultsDatabaseItem::ESuccess );
+                        break;
+                        
+                    case ECBACmdNo:
+                        LOGSTRING("CDiagVibratePlugin-EAknSoftkeyNo")
+                        CompleteTestL( CDiagResultsDatabaseItem::EFailed );
+                        break;
+                    
+                    default:
+                        LOGSTRING("CDiagVibratePlugin-Default")
+                        break;
+                    }
+                }
+            }
+            break;
+            
+        case EStateCancelled:
+            {
+             if ( SinglePluginExecution() )
+                {
+                CompleteTestL( CDiagResultsDatabaseItem::ECancelled );
+                return;
+                }
+             else 
+                {                                                    
+                TInt confirmResult = 0;
+                CAknDialog* dlg = ExecutionParam().Engine().
+                CreateCommonDialogLC( EDiagCommonDialogConfirmCancelAll, NULL );
+                
+                if ( !RunWaitingDialogL( dlg, confirmResult ) )
+                    {
+                    //the dialog got deleted, returning right away
+                    return;
+                    }                    
+                    
+                if ( confirmResult == EAknSoftkeyYes )
+                    {
+                    //test is cancelled
+                    CompleteTestL( CDiagResultsDatabaseItem::ECancelled );
+                    }
+                else //EAknSoftKeyNo
+                    {
+                    //let's rerun the test
+                    DoStopAndCleanupL();
+                    DoRunTestL();
+                    }
+                }
+            }
+            break; 
+        
+        case EStateSkipped:
+            CompleteTestL( CDiagResultsDatabaseItem::ESkipped );
+            break;
+       
+        case EStateFailed:
+            CompleteTestL( CDiagResultsDatabaseItem::EFailed );
+            break;
+        
+        case EStateBlocked:
+        	LOGSTRING( "In RunL, EStateBlocked");
+        	if ( iProgressDialog )
+        		{
+        		iProgressDialog->ProcessFinishedL();       
+        		}
+        	if (!DisplayDisconnectChargerQueryL() )
+               {
+                return;
+               }
+                //Let's start the test by activating active object
+            SetState( EStateRestart );
+            SetActive();
+            User::RequestComplete(status, KErrNone);
+
+        	break;
+            
+        default:
+            __ASSERT_DEBUG( 0, User::Panic( KVibratePluginErrorUnknownVibraStateText,
+                EPanicUnknownVibraState ) );
+            break;    
+        }
+    }    
+
+
+// ---------------------------------------------------------------------------
+// From CActive
+// CDiagVibratePlugin::DoCancel
+// ---------------------------------------------------------------------------
+//
+void CDiagVibratePlugin::DoCancel()
+    {
+    }    
+
+
+// ---------------------------------------------------------------------------
+// Cleanup the created resources
+// CDiagVibratePlugin::DoStopAndCleanupL
+// ---------------------------------------------------------------------------
+//
+void CDiagVibratePlugin::DoStopAndCleanupL()
+    {
+    delete iEngine;    
+    iEngine = NULL;
+    if ( iProgressDialog )
+        {
+        iProgressDialog->ProcessFinishedL();       
+        }
+    SetVibrateSettingToOriginalValueL();
+    iVibrateSettingUpdated = EFalse;
+    if ( iState != EStateCancelled )
+        {
+        SetState( EStateCancelled );
+        }
+    }
+
+    
+// ---------------------------------------------------------------------------
+// Makes sure vibrate is enabled in the profile
+// CDiagVibratePlugin::SetVibrateSettingOnL
+// ---------------------------------------------------------------------------
+//
+TInt CDiagVibratePlugin::SetVibrateSettingOnL()
+    {
+    MProEngEngine* profileEng = ProEngFactory::NewEngineL();
+    CleanupDeletePushL(profileEng);
+
+    MProEngProfile* profile = profileEng->ActiveProfileL();
+    MProEngToneSettings& profileToneSettings = profile->ToneSettings();
+    iOrigVibrateSetting = profileToneSettings.VibratingAlert();
+   
+   //set the vibration setting on if it is not on already
+    if (!iOrigVibrateSetting)
+        {
+        if(!ShowActivateConfNoteL())
+        {
+        		profile->Release();    
+    			CleanupStack::PopAndDestroy(profileEng);
+    			return EFalse;
+    	}
+        profileToneSettings.SetVibratingAlert(ETrue);
+        profile->CommitChangeL();
+        iVibrateSettingUpdated = ETrue;
+        }
+    
+    profile->Release();    
+    CleanupStack::PopAndDestroy(profileEng);
+    return ETrue;
+    }
+    
+    
+TInt CDiagVibratePlugin::ShowActivateConfNoteL()
+{
+	CAknQueryDialog * dialog = new (ELeave) CAknQueryDialog();
+    dialog->PrepareLC( R_VIBRATEPLUGIN_VIBRATE_ACTIVATE_DLG );
+    
+    
+    TInt queryResult;
+        
+    if ( !RunWaitingDialogL( dialog, queryResult ) )
+         {
+         // Dialog is dismissed by deletion. Exit immediately without
+         // accessing member variable, to prevent crash
+         return EFalse;
+         }
+
+        //Let's check the user answer
+        switch ( queryResult )
+            {
+            
+            case ECBACmdNo:
+                CompleteTestL( CDiagResultsDatabaseItem::ESkipped );
+                return EFalse;
+
+            case EAknSoftkeyYes:
+            	return ETrue;
+
+            default:
+                return EFalse;
+            }	
+	
+}
+
+    
+// ---------------------------------------------------------------------------
+// Sets the vibration setting to its original value
+// CDiagVibratePlugin::SetVibrateSettingToOriginalValueL
+// ---------------------------------------------------------------------------
+//
+void CDiagVibratePlugin::SetVibrateSettingToOriginalValueL()
+    {
+    if ( !iVibrateSettingUpdated )
+        {
+        return;
+        }
+        
+    MProEngEngine* profileEng = ProEngFactory::NewEngineL();
+    MProEngProfile* profile = profileEng->ActiveProfileL();
+    MProEngToneSettings& profileToneSettings = profile->ToneSettings();
+    
+    //Check if vibrate setting need to be turned off again
+    if ( !iOrigVibrateSetting )
+        {
+        profileToneSettings.SetVibratingAlert( EFalse );
+        profile->CommitChangeL();
+        }
+        
+    profile->Release();
+    profileEng->Release();                
+
+    iVibrateSettingUpdated = EFalse;
+    }    
+
+
+// ---------------------------------------------------------------------------
+// Checks if the charger is connected if yes the user is asked to removed it.
+// CDiagVibratePlugin::IsChargerConnected
+// ---------------------------------------------------------------------------
+//
+TBool CDiagVibratePlugin::IsChargerConnected() const
+    {
+    TInt charger;
+    TBool result = EFalse;
+    
+    if( RProperty::Get( KPSUidHWRMPowerState, KHWRMChargingStatus, charger ) == KErrNone )
+        {
+        switch( charger )
+            {
+            case EChargingStatusCharging:
+            case EChargingStatusNotCharging:
+            case EChargingStatusChargingComplete:
+            case EChargingStatusAlmostComplete:
+            case EChargingStatusChargingContinued:
+                result = ETrue;
+                break;
+                
+            case EChargingStatusNotConnected:
+            default:
+                break;
+            }
+        }
+        
+    return( result );
+    }
+
+
+// ---------------------------------------------------------------------------
+// Sets the internal state
+// CDiagVibratePlugin::SetState
+// ---------------------------------------------------------------------------
+//
+void CDiagVibratePlugin::SetState( CDiagVibratePlugin::TState aState )
+    {
+    __ASSERT_DEBUG( iState != aState, User::Panic( KVibratePluginErrorStateRepeatedText,
+                EPanicStateRepeated ) );
+
+    iState = aState;
+    }
+
+// ---------------------------------------------------------------------------
+// Displays disconnect charger query
+// CDiagVibratePlugin::DisplayDisconnectChargerQuery
+// ---------------------------------------------------------------------------
+//
+TBool CDiagVibratePlugin::DisplayDisconnectChargerQueryL()
+    {
+    FOREVER
+        {
+        CAknQueryDialog* dialog = new ( ELeave ) CAknQueryDialog( CAknQueryDialog::ENoTone );
+        dialog->PrepareLC( R_VIBRATEPLUGIN_DISCONNECT_CHARGER_DLG );
+
+
+        TInt queryResult;
+        
+        if ( !RunWaitingDialogL( dialog, queryResult ) )
+            {
+            // Dialog is dismissed by deletion. Exit immediately without
+            // accessing member variable, to prevent crash
+            return EFalse;
+            }
+
+        //Let's check the user answer
+        switch ( queryResult )
+            {
+            
+            case ECBACmdCancel:
+                {
+                if ( SinglePluginExecution() )
+                    {
+                    CompleteTestL( CDiagResultsDatabaseItem::ESkipped );
+                    return EFalse;
+                    }
+                else
+                    {
+                    // See if the user really wants to cancel tests.
+                    TInt confirmResult = 0;
+                    
+                    CAknDialog* dlg = ExecutionParam().Engine().
+                        CreateCommonDialogLC( EDiagCommonDialogConfirmCancelAll, NULL );
+                    
+                    if ( !RunWaitingDialogL( dlg, confirmResult ) )
+                        {
+                        return EFalse;
+                        }
+                        
+                    if ( confirmResult)
+                        {
+                        return EFalse;
+                        }
+                    else
+                        {
+                        continue;
+                        }
+                    }
+
+                // Break and display the dialog again.
+                }
+                
+            case EAknSoftkeyOk:
+                if ( !IsChargerConnected() )
+                    {
+                    return ETrue;   
+                    }
+                break;
+            default:
+                return EFalse;
+            }
+        }
+    }
+
+
+// ---------------------------------------------------------------------------
+// Displays vibrating progress dialog
+// ---------------------------------------------------------------------------
+//
+void CDiagVibratePlugin::ShowVibratingNoteL()
+    {
+    if ( iProgressDialog )
+        {
+        delete iProgressDialog;
+        iProgressDialog = NULL;
+        }
+    
+    //Calculate progress bar update interval in hundredths of seconds
+    TInt interval = KHundredthsInSecond * iVibrationTime *
+                    ( ( TReal ) KProgressDialogIncrementSize / 
+                    KProgressDialogFinalValue );
+                    
+    iProgressDialog = new ( ELeave ) CAknProgressDialog( 
+                        KProgressDialogFinalValue, 
+                        KProgressDialogIncrementSize,
+                        interval,
+                        reinterpret_cast <CEikDialog**> ( &iProgressDialog ) );
+
+    iProgressDialog->SetCallback( this );
+    iProgressDialog->PrepareLC( R_VIBRATEPLUGIN_PROGRESS_NOTE_VIBRATING );
+    
+    // If the test is run as a single test removing skip button
+    if ( SinglePluginExecution() )
+        {
+        CEikButtonGroupContainer& cba = iProgressDialog->ButtonGroupContainer();
+        cba.SetCommandSetL( R_VIBRATE_SOFTKEYS_STOP__CANCEL );
+        }
+
+    iProgressDialog->RunLD();
+    }
+
+
+// ---------------------------------------------------------------------------
+// Reads vibration time from central repository
+// ---------------------------------------------------------------------------
+//
+void CDiagVibratePlugin::ReadVibrationTimeL()
+    {
+    LOGSTRING( "CDiagVibratePlugin::ReadVibrationTimeL begin" );
+                
+    CRepository* repository = CRepository::NewLC( KCRUidDevDiagVibraTestPlugin );  
+         
+    User::LeaveIfError( repository->Get( KDevDiagVibraTestVibrateTime, iVibrationTime ) );
+    
+    CleanupStack::PopAndDestroy( repository );
+    
+    LOGSTRING( "CDiagVibratePlugin::ReadVibrationTimeL end" );
+    }
+    
+
+// End of File