taskswitcher/teleportui/hgteleportapp/inc/hgteleportdevicestate.h
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Mon, 18 Jan 2010 20:10:36 +0200
changeset 2 08c6ee43b396
permissions -rw-r--r--
Revision: 201001 Kit: 201003

/*
 * ============================================================================
 *  Name        : hgteleportdevicestate.h
 *  Part of     : Hg Teleport
 *  Description : Device state (touch mode, screen orientation) handler
 *  Version     : %version: sa1spcx1#11 %
 *
 *  Copyright © 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.
 * ============================================================================
 * Template version: 4.2
 */

#ifndef HGTELEPORTDEVICESTATE_H_
#define HGTELEPORTDEVICESTATE_H_

#include <e32base.h>
#include "hgteleportappui.h"
#include "hgproplistener.h"

/**
 * Interface for getting notifications about screen orientation
 * and/or touch state etc. changes.
 */
class MHgDeviceStateObserver
    {
public:
    /**
     * Type of change.
     */
    enum TChangeType
        {
        // screen orientation (portrait <=> landscape) has changed
        EOrientation = 0x01,
        // touch enabled/disabled status has changed
        ETouchState = 0x02,
        // skin has changed
        ESkin = 0x04,
        // input device mode change
        EDeviceType = 0x08,
        // all of the above
        EAny = 0xFF
        };

    /**
     * Called when a change, to which the observer is registered,
     * has happened.
     */
    virtual void HandleDeviceStateChanged( TChangeType aChangeType ) = 0;
    };

/**
 * Class for keeping track of screen orientation and touch enabled/disabled changes.
 */
class CHgTeleportDeviceState :
    public CBase,
    public MHgPropertyChangeObserver
    {
public:
    /**
     * Enumeration for TouchState().
     */
    enum TTouchState
        {
        ETouchEnabled,
        ETouchDisabled
        };

    /**
     * Enumeration for Orientation().
     */
    enum TOrientation
        {
        EPortrait,
        ELandscape
        };

    /**
     * Enumeration for DeviceType().
     */
    enum TDeviceType
        {
        EHybrid = 0,
        EFullTouch  = 1
        };

    /**
     * Creates a new instance.
     */
    static CHgTeleportDeviceState* NewL();

    /**
     * Destructor.
     */
    ~CHgTeleportDeviceState();

    /**
     * Returns the current state of touch awareness.
     */
    TTouchState TouchState() const;

    /**
     * Returns the current screen orientation.
     */
    TOrientation Orientation() const;

    /**
     * Returns the current device input type.
     */
    TDeviceType DeviceType() const;

    /**
     * Registers an observer.
     * @param   aObserver   ref to observer
     * (same observer can be added several times with different mask if needed)
     * @param   aMask       bitmask composed from TChangeType values
     * (when to notify the observer)
     */
    void AddObserverL( MHgDeviceStateObserver& aObserver, TInt aMask );

    /**
     * Deregisters the given observer.
     * @param   aObserver   ref to observer
     */
    void RemoveObserver( MHgDeviceStateObserver& aObserver );

    /**
     * Called from appui.
     */
    void HandleResourceChange( TInt aType );
    
    //From MHgPropertyChangeObserver
public:
    /**
     * Observer interface for getting notifications about a P&S property change.
     */
	virtual void PropertyChanged( TUid aCategory, TUint aKey );
private:
    /**
     * Constructor.
     */
    CHgTeleportDeviceState();
    
    /**
     * Performs 2nd phase construction.
     */
    void ConstructL();

    /**
     * Checks if touch is enabled or not and performs
     * appropriate actions.
     */
    void CheckTouchState();

    /**
     * Checks the screen orientation and performs
     * appropriate actions.
     */
    void CheckOrientation();
    
    /**
     * Checks the device input type.
     */
    void CheckDeviceType();
    
    /**
     * Notifies all observers that are registered for the given type.
     */
    void NotifyObservers( MHgDeviceStateObserver::TChangeType aType );

    class SObserver;

    /**
     * Identity function to perform comparison between observer array items.
     */
    static TBool ObserverIdentity( const SObserver& aA, const SObserver& aB );

private:
    /**
     * Current touch enabled/disabled state.
     */
    TTouchState iTouchState;
    
    /**
     * Current screen orientation.
     */
    TOrientation iOrientation;
    
    /**
     * Current the device input type.
     */
    TDeviceType iDeviceType;
    
    /**
     * Observer array entry struct.
     */
    struct SObserver
        {
        TInt iMask;
        MHgDeviceStateObserver* iObserver; // not owned
        SObserver( TInt aMask, MHgDeviceStateObserver* aObserver )
            : iMask( aMask ), iObserver( aObserver ) { }
        };
        
    /**
     * Observer array.
     */
    RArray<SObserver> iObservers;

    /**
     * Counter to indicate that we have not yet returned
     * from a previous HandleResourceChange.
     */
    TInt iResChangeActiveCount;
    
    /**
     * Flip status change observer.
     */
    CHgPropertyListener* iFlipStatusObserver;
    };

#endif // HGTELEPORTDEVICESTATE_H_