/*
* Copyright (c) 2007-2008 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:  Header file for CCamBatteryPaneController class.
*
*  Copyright © 2007-2008 Nokia.  All rights reserved.
*  This material, including documentation and any related computer
*  programs, is protected by copyright controlled by Nokia.  All
*  rights are reserved.  Copying, including reproducing, storing,
*  adapting or translating, any or all of this material requires the
*  prior written consent of Nokia.  This material also contains
*  confidential information which may not be disclosed to others
*  without the prior written consent of Nokia.

*
*
*/


#ifndef CAMBATTERYPANECONTROLLER_H
#define CAMBATTERYPANECONTROLLER_H

// INCLUDES

#include <e32base.h>
#include "CamPropertyObserver.h" // MPropertyObserver

// CONSTANTS

// Battery strength and animation timer constants.
const TInt KMinBatteryStrength      = 0;
const TInt KMaxBatteryStrength      = 7;
const TInt KBatteryRechargeTick     = 500000;

// FORWARD DECLARATIONS

class CCamBatteryPaneDrawer;
class CCamPropertyWatcher;
class CWindowGc;
class CBitmapContext;

// CLASS DECLARATION

/**
* Abstract API for battery pane observer.
* Derived classes, which have subscribed to CCamBatteryPaneController
* receive notification when the battery pane contents change
*/
class MCamBatteryPaneObserver
    {
    public:    
        /**
        * The battery pane contents have changed
        */
        virtual void BatteryPaneUpdated() = 0;
    };   

/**
* Watches changes in battery strength and charge properties and provides
* animation of recharging. Notifies observer of changes in the battery pane.
* Handles drawing requests by passing them to owned CCamBatteryPaneDrawer
* object.
*/
class CCamBatteryPaneController: public CBase, public MPropertyObserver
    {
    
    public: // Construction and destruction
        /**
        * Descructor
        */
        ~CCamBatteryPaneController();
        /**
        * Two-phased constructor
        * @param aObserver              Battery pane observer
        * @param aCallbackActive        Callback to the observer active
        * @return Pointer to the created 
        */
        static CCamBatteryPaneController* NewL(
                MCamBatteryPaneObserver& aObserver,
                TBool aCallbackActive );
    
    
    public: // From MPropertyObserver
        /**
        * The value of a watched property has changed
        * @param aCategory The category of the property
        * @param aKey the Identifier of the property
        */    
        void HandlePropertyChangedL( const TUid& aCategory, const TUint aKey );
        
               
    public: // New functions
        /**
        * Pause battery pane controller. With value ETrue, stops listening
        * to battery pane events, with EFalse reinitializes and starts
        * listening to the events again.
        */
        void Pause( TBool aPause );        
    
        /**
        * Activate or deactivate callbacks to observer when there
        * are changes in the battery pane.
        * @param aActive Callback to observer active
        */          
        void SetCallbackActive( TBool aActive );
        
        /**
        * Set location in the screen, where the battery pane is
        * to be drawn.
        * @param aLocation Drawing location
        */        
        void SetLocation( TPoint aLocation );
        
        /**
        * Set battery strength.
        * @param aStrength Battery strength
        */
        void SetBatteryStrength( TInt aStrength );
                
        /**
        * Start the recharging animation
        */        
        void StartRecharging();        
        
        /**
        * Stop the recharging animation
        */  
        void StopRecharging();
        
        /**
        * Get battery pane's rectangle
        * @return rectangle
        */
        TRect Rect() const; 
        
        /**
        * Get rectangle of the animated part of battery pane
        * @return rectangle
        */
        TRect AnimationRect() const;                 

        /**
        * Draw the battery pane
        * @param aGc Graphics context
        */                 
        void Draw( CBitmapContext& aGc ) const;
        //void Draw( CWindowGc& aGc ) const;
        
        /**
        * Handle resource change event
        * @param aType Type of the resource change
        */
        void HandleResourceChange( TInt aType );        
        
    protected:
        /**
        * Second phase constructor
        */
        void ConstructL();
    
    private:
        /**
        * Constructor.
        * @param aObserver Battery pane observer
        * @param aCallbackActive Callback to the observer active
        */
        CCamBatteryPaneController(
            MCamBatteryPaneObserver& aObserver,
            TBool aCallbackActive );

        /**
        * 
        * @param aThis Pointer to the object owning the ticker
        */
        static TInt TickerCallback( TAny* aThis );        
        
        /**
        * Changes the (charging) battery strenght value as needed to show the next
        * frame of the animation.
        */
        void UpdateRechargeBatteryStrength();
        
        /**
        * Notifies observer of changes in the battery pane,
        * if iCallbackActive is set
        */
        void NotifyObserver();
        
        /**
        * Read current status of the properties. Set battery level
        * and start/stop battery recharging animation accordingly.
        */
        void ReadCurrentState();
        
        /**
        * Start/stop the charging animation, depending on aStatus value
        * @param aStatus Value of the charging status property
        */
        void HandleChargingStatusChange( TInt aStatus );
        
    private:            
        // Current battery strength
        TInt                        iBatteryStrength;
    
        // Recharging animation status
        TBool                       iRecharging;
        TInt                        iRechargeBatteryStrength;
    
        // Object that handles the actual drawing
        CCamBatteryPaneDrawer*      iDrawer;
        
        // Recharge animation timer
        CPeriodic*                  iTicker;
   
        // Observer of the battery pane changes
        MCamBatteryPaneObserver&    iObserver;
        TBool                       iCallbackActive;
    
        // Property watchers for battery charging and strength
        CCamPropertyWatcher*        iBatteryStrengthWatcher;
        CCamPropertyWatcher*        iBatteryChargingWatcher;
        
        TBool                       iPaused;
    };
        
#endif
