/*
* 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:  CDiagVibratePugin derives from CDiagTestPluginBase and 
*                  is the access point to run the vibrate test.
*
*/


#ifndef __DIAGVIBRATEPLUGIN_H__
#define __DIAGVIBRATEPLUGIN_H__

// INCLUDES
#include <DiagTestPluginBase.h>         //CDiagTestPluginBase
#include <AknProgressDialog.h>          //MProgressDialogCallback

#include "diagvibratepluginobserver.h"  //MDiagVibratePluginObserver

// CONSTANTS

// MACROS

// DATA TYPES

// FUNCTION PROTOTYPES

// FORWARD DECLARATIONS
class CDiagVibratePluginEngine;

// CLASS DEFINITION
class CDiagVibratePlugin : public CDiagTestPluginBase, 
                           public MDiagVibratePluginObserver,
                           public MProgressDialogCallback

    {
    public: // Constructors and destructor

        /**
        * Symbian OS two-phased constructor
        * @return MDiagPlugin*
        */
        static MDiagPlugin* NewL( TAny* aInitParams );

        /**
        * Destructor
        */
        virtual ~CDiagVibratePlugin();

    public: // From CDiagTestPluginBase

        /**
        * @see CDiagTestPluginBase::Visible()
        */
        virtual TBool IsVisible() const;

        /**
        * @see CDiagTestPluginBase::RunMode()
        */
        virtual TRunMode RunMode() const;

        /**
        * @see CDiagTestPluginBase::TotalSteps()
        */
        virtual TUint TotalSteps() const;

        /**
        * @see CDiagTestPluginBase::GetPluginNameL
        */
        virtual HBufC* GetPluginNameL( TNameLayoutType aLayoutType ) const;

        /**
        * @see CDiagTestPluginBase::Uid
        */
        virtual TUid Uid() const;

    public: // from MDiagVibratePluginObserver

        /**
         * Inform vibrate status changes
         *
         * @param aStatus Status of the vibrate engine
         */
        virtual void VibraStatusChanged( TVibrateStatus aStatus );

    private: // from CDiagTestPluginBase

        /**
        * Handle plug-in execution.
        * @see CDiagTestPluginBase::DoRunTestL
        */
        void DoRunTestL();

        /**
        * Clean up
        * @see CDiagTestPluginBase::DoStopAndCleanupL
        */
        void DoStopAndCleanupL();

    private: // from CActive
    
        /**
        * Handle active object completion event
        */
        virtual void RunL();
    
        /**
        * Handle cancel
        */
        virtual void DoCancel();
    
    private: // from MProgressDialogCallback
        
        /**
        * Called when the progress dialog is dismissed.
        *
        * @param aButtonId - indicate which button made dialog to dismiss
        */
        virtual void DialogDismissedL( TInt aButtonId );
    
    private: 

        /**
        * C++ default constructor.
        */
        CDiagVibratePlugin( CDiagPluginConstructionParam* aInitParams  );

        /**
        * Symbian OS default constructor.
        *
        */
        void ConstructL();

   private:    // data
    
        /**  enum for the vibrate plugin internal state */
        enum TState
            {
            EStateUnknown = 0,
            EStateFailed,
            EStateCancelled,
            EStateSkipped,
            EStateIdle,
            EStateVibrating,
            EStateUserQuery,
            EStateBlocked,
            EStateRestart
            };

    private:    // private functions
    
        /**
        * Makes sure vibrate is enabled in the profile
        */
        TInt SetVibrateSettingOnL();

        /**
        * Sets the vibration setting to its original value
        */
        void SetVibrateSettingToOriginalValueL();

        /**
        * Checks if the charger is connected
        */
        TBool IsChargerConnected() const;

        /**
        * Sets the state
        * @param aState State to be set
        */
        void SetState( CDiagVibratePlugin::TState aState );
        
        /**
        * Displays disconnect charger dlg
        * @return TBool
        */
        TBool DisplayDisconnectChargerQueryL();
        
        /**
        * Displays vibrating progress dialog
        */
        void ShowVibratingNoteL();
        
        /**
        * Gets vibration time in seconds from CR
        */
        void ReadVibrationTimeL();
        
        /*
        * confirmation query for activating the vibration in profile.
        */
        TInt ShowActivateConfNoteL();
       
    private: // data

        /**
        * Vibrate plugin engine
        * own
        */
        CDiagVibratePluginEngine* iEngine;

        /**
        * Progress Dialog
        * own
        */
        CAknProgressDialog* iProgressDialog;

        /**
        * State of the vibrate plugin
        */
        TState iState;
        
        /**
        * Indicates if the profile vibrate setting was 
        * temporalily set active 
        */
        TBool iVibrateSettingUpdated;
        
        /**
        * Original profile vibrate setting
        */
        TBool iOrigVibrateSetting;
        
        /**
        * Vibration time in seconds
        */
        TInt iVibrationTime;        
        
    };

#endif // __DIAGVIBRATEPLUGIN_H__

// End of File
