tactilefeedback/tactilefeedbackresolver/inc/tactilefeedbackresolver.h
author Pat Downey <patd@symbian.org>
Wed, 01 Sep 2010 12:23:25 +0100
branchRCL_3
changeset 37 09b094b73eb8
parent 36 39d4c97df8cb
permissions -rw-r--r--
Revert incorrect RCL_3 drop: Revision: 201033 Kit: 201035

/*
* Copyright (c) 2007-2009 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:  Class for resolving physical feedback type based on 
*                tactile feedback settings and current device state.
* Part of:      Tactile Feedback.
*
*/


#ifndef C_TACTILEFEEDBACKRESOLVER_H
#define C_TACTILEFEEDBACKRESOLVER_H

#include <e32base.h>
#include <touchlogicalfeedback.h>
#include <cenrepnotifyhandler.h>

#include "tactilepropertyobserver.h"

class CRepository;
class CTactilePlayer;
class CTactilePropertyWatcher;

/**
 *  Class for procuding physical feedback based on logical
 *  feedback type.
 *
 *  Feedback is generated according to Tactile Feedback settings and
 *  current device state, and it may be that feedback is not even generated
 *  at all.
 *
 *  @lib tactilefeedbackresolver.lib
 *  @since S60 5.2
  */
class CTactileFeedbackResolver: public CBase,
                                public MTactilePropertyObserver,
                                public MCenRepNotifyHandlerCallback
    {
public:

    static CTactileFeedbackResolver* NewL();

    virtual ~CTactileFeedbackResolver();

    /**
     * Produces immediately physical feedback according to given
     * logical feedback type.
     *
     * Actual physical feedback type depends on settings of existing player 
     * plugins and current device state.
     *
     * @param aFeedback  - Logical feedback type.
     * @param aPlayVibra - If EFalse then vibra feedback is not played.
     * @param aPlayAudio - If EFalse then audio feedback is not played.
     */
    void PlayFeedback( TTouchLogicalFeedback aFeedback,
                       TBool aPlayVibra,
                       TBool aPlayAudio );

    /**
     * Starts playing continuous feedback.
     *
     * @since S60 5.2
     * @param aType         - Type of continuous feedback to be played.
     * @param aIntensity    - Intensity of continuous feedback. Value
     *                        range for intensity is 0-100%.
     */ 
    void StartFeedback( TTouchContinuousFeedback aType,
                        TInt aIntensity );
                        
    /**
     * Modifies the intensity of ongoing continuous feedback.
     * @since S60 5.2
     * @param aIntensity    - New intensity for continuous feedback. Value
     *                        range for intensity is 0-100%. 
     */                         
    void ModifyFeedback( TInt aIntensity );
    
    /**
     * Stops the ongoing feedback.
     *
     * @since S60 5.2
     */    
    void StopFeedback();
    
    /**
     * Produces immediate physical feedback according to given
     * logical feedback type and given level. 
     *
     * @since S60 5.2
     * @param aLevel        - Level value defines the strength of playing 
     *                        effect. Maximum level value is player dependent.
     * @param aFeedbackType - Logical feedback type.
     * @param aType         - Type of feedback to be previewed. 
     */    
    void PlayPreviewFeedback( TInt aLevel,
                              TTouchLogicalFeedback aFeedback,
                              TTouchFeedbackType aType );

    /**
     * Starts playing continuous feedback of given type on given level.
     *
     * @since S60 5.2
     * @param aLevel        - Level value defines the strength of playing 
     *                        effect. Maximum level value is player dependent.     
     * @param aFeedback     - Type of continuous feedback to be played.
     * @param aIntensity    - Intensity of continuous feedback. Value
     *                        range for intensity is 0-100% from basic
     *                        strength (aLevel).
     * @param aType         - Type of feedback to be previewed.
     */    
    void StartPreviewFeedback( TInt aLevel,
                               TTouchContinuousFeedback aFeedback,
                               TInt aIntensity,
                               TTouchFeedbackType aType );

    /**
     * Stops the ongoing preview of continuous feedback.
     *
     * @since S60 5.2
     */
    void StopPreviewFeedback();    

private:
    /**
     * Constructor.
     */
    CTactileFeedbackResolver();

    /**
     * 2nd phase constructor..
     */
    void ConstructL();

    /**
     * Central repository related initializations.
     */
    void InitializeCrKeysL();

    /**
     * Publish & Subscribe related initializations.
     */
     void InitializePsKeysL();
     
    /**
     * This function reads the feedback enabled/disabled value from
     * the dedicated P&S key, and stores it into iFeedbackEnabled
     * -member variable.
     *
     * Dedicated fuction used for avoiding duplicate code (in
     * construction and when the P&S key changes)
     */
     void ReadFeedbackEnabledFromPS();
     
// from base class MTactilePropertyObserver

    /**
     * From MTactilePropertyObserver
     *
     * This is called when the property for temporary disabling feedback
     * is updated.
     *
     * @param aCategory - The UID of the changed property
     * @param aKey      - The key (i.e. identifier) of the changed property
     */
    void PropertyChangedL( const TUid aCategory, 
                           const TUint aKey );
                           
    
//from base class MCenRepNotifyHandlerCallback.

    /**
     * From MCenRepNotifyHandlerCallback.
     *
     * This is called when Tactile Feedback settings in Central Repository
     * are changed.
     *
     * @param aId       - The id of the changed Central Repository value.
     */        
    void HandleNotifyGeneric( TUint32 aId );
        
private: 
    /**
     * Handle changes in tactile feedback settings.
     */    
    void DoHandleNotifyGenericL( TUint32 aId );
    
    /**
     * Create haptics player. ECom implementation uid is used for selecting
     * the player plugin. 
     */    
    void CreateHapticsPlayerL( TUid aHapticsUid );
    
    /**
     * Create audio player. ECom implementation uid is used for selecting
     * the player plugin.
     */    
    void CreateAudioPlayerL( TUid aAudioUid );

    /**
     * Return ETrue if aFeedback's priority is higher than current playing
     * feedback, namely iLastFeedback.
     *
     * TODO: Currently, we only take Popup and Button effects into
     * account. Ultimately, a complete priority queue should be set up.
     */
    TBool IsHigherThanPlaying ( TTouchLogicalFeedback aFeedback ) const;
    
private: // data

    /**
     * Access to the P&S property, which is used for temporary disabling
     * the feedback.
     * Own.  
     */
    CTactilePropertyWatcher* iPropertyWatcher;
    
    /**
     * Haptics player.
     * Own.  
     */
    CTactilePlayer*       iHapticsPlayer;
    
    /**
     * Audio player.
     * Own.  
     */    
    CTactilePlayer*       iAudioPlayer;
    
    /**
     * Central repository for reading tactile feedback settings.
     * Own.
     */
    CRepository*          iRepository;
    
    /**
     * Central repository notifier, which sends notification when tactile 
     * feedback settings has been changed.
     * Own.
     */
    CCenRepNotifyHandler* iCenRepNotifier; 
    
    /**
     * This flag indicates the vibra feedback state according to the P&S key
     * that can be used for globally disabling vibra and/or audio
     * feedback.  
     */    
    TBool iVibraEnabled;
    
    /**
     * This flag indicates the audio feedback state according to the P&S key
     * that can be used for globally disabling vibra and/or audio
     * feedback.  
     */    
    TBool iAudioEnabled;
    
    /**
     * This flag indicates whether the continuous feedback is started or not.
     * 
     */
    TBool iFeedbackStarted;
    
    /**
     * Minimum interval between feedbacks.
     * 
     */
    TTimeIntervalMicroSeconds iMinimumInterval;
    
    /**
     * Timestamp of the last played feedback.
     * 
     */    
    TTime iLastFeedbackTimeStamp;
    
    /**
     * This flag determinates the playing order of feedback types.
     * ETrue  - vibra feedback is played first.
     * EFalse - audio feedback is played first.
     */
    TBool iVibraFirst;

    /**
     * Name of the last played feedback.
     * 
     */
    TTouchLogicalFeedback iLastFeedback;
    };


#endif // C_TACTILEFEEDBACKPLAYER_H