voicerecorder/RecViewSrc/CVRRecViewModel.h
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Thu, 19 Aug 2010 09:57:40 +0300
branchRCL_3
changeset 19 2f5c9ee7098c
parent 13 4e5b531d23cb
permissions -rw-r--r--
Revision: 201030 Kit: 201033

/*
* Copyright (c) 2002 - 2006 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: 
*     This class is the data model and state machine of the Recorder View.
*     The state machine is defined by a VR_STATEMACHINE resource structure.
*
*/


#ifndef __CVRRECVIEWMODEL_H__
#define __CVRRECVIEWMODEL_H__

// INCLUDES
#include <e32base.h>
#include <e32std.h>
#include <e32property.h> 
#include <AknNotifyStd.h>
#include <badesca.h>

#include "MVRIHFObserver.h"
#include "MVRKeyObserver.h"
#include "MVRDecoratorModel.h"
#include "MVRButtonPanelModel.h"
#include "MVRStateInfoModel.h"
#include "MVRObserver.h"
#include "MVRSelectionProvider.h"
#include "MVRVolumeChangeObserver.h"

#include "MVRSystemEventObserver.h"
#include "MVRMediaRemovalObserver.h"


#include "TVRContext.h"
#include "voicerecorder.hrh"

#include "MVRStateInfoObserver.h"

// FORWARD DECLARATIONS
class CAknGlobalNote;
class CSendUi;
class MVRMdaRecorder;
class CVRMemo;
class MVRObserver;
class TResourceReader;
class TVRState;
class CVRSystemEventHandler;
class CVRMediaRemovalMonitor;


// CLASS DEFINITION
/**
* This class is the data model and state machine of the Recorder View.
* The state machine is defined by a VR_STATEMACHINE resource structure.
*/
NONSHARABLE_CLASS( CVRRecViewModel ): 
	  public CBase,
	  public MVRDecoratorModel, public MVRButtonPanelModel,
	  public MVRStateInfoModel, public MVRObserver,
	  public MVRKeyObserver, public MVRVolumeChangeObserver,
      public MVRSystemEventObserver,
      public MVRMediaRemovalObserver      
	{
	private:	// nested classes

		class TVRLabelLayoutLink
			{
			public:
				/**
				* Constructs this object from a VR_LABEL_LINK resource
				* @param aReader A resource reader object initialised
				*		 to a resource.
				*/
				void ReadFromResource( TResourceReader& aReader );
			public:

				// Link to the latin layout
				TInt iEuroId;
				
				// Link to the APAC layout
				TInt iApacId;
				
				// Link to the A/H layout
				TInt iArabicHebrewId;
			};
		
	public: // Constructors and destructor

		/**
		* Default constructor.
		*/
		CVRRecViewModel();

		/**
		* Destructor
		*/
		~CVRRecViewModel();

		/**
		* Constructs the model from a VR_STATEMACHINE resource.
		* @param aReader A resource reader object initialised to a resource.
		*/
		void ConstructFromResourceL( TResourceReader& aReader );

	public: // from MVRKeyObserver

		/**
		* This function is called when a subject wants to report a key event.
		* @param aKeyEvent The key event.
		* @param aType The type of key event: EEventKey, EEventKeyUp
		*              or EEventKeyDown
		* @return Indicates whether or not the key event was used.
		*/
		TBool ProcessKeyEventL( const TKeyEvent& aKeyEvent,
								const TEventCode aType );

	public: // from MVRDecoratorModel

		/**
		* Returns the resource id for current softkeys
		* @return Softkey resource identifier
		*/
		TInt CbaResourceId() const;

		/**
		* Returns the resource id for current menu bar
		* @return Menu bar resource identifier.
		*/
		TInt MenuBarResourceId() const;

		/**
		* Used to get the state of the volume control component.
		*/
		void GetVolumeControlState( TVRVolumeControlState& aState,
											TInt& aVolume );

		/**
		* Specifies the current help context.
		* @param aContext the context IDs are placed here
		*/
		void GetHelpContext( TCoeHelpContext& aContext ) const;


		/**
		* Registers an observer for receiving
		* update notifications from this interface.
		* @param aObserver The observer object.
		*/
		void SetDecoratorObserver( MVRObserver* aObserver );
		
		/**
		* Tells in return value if CBA Buttons should be enabled or not
		* @return ETrue if buttons should be enabled, EFalse otherwise
		*/
		TBool CBAEnabled() const;
		
	public: // from MVRButtonPanelModel

		/**
		* Returns the number of buttons.
		* @return number of buttons (>=0)
		*/
		TInt ButtonCount() const;

		/**
		* Returns the state of a specific button.
		* @param aButtonId Button identifier
		* @return ENormal or EDimmed
		*/
		TInt ButtonState( TInt aButtonId ) const;

		/**
		* Returns the command id of a specific button.
		* @param aButtonId Button identifier
		* @return One of TVRCommands
		*/
		TInt CommandId( TInt aButtonId ) const;

		/**
		* Returns the id of the button that should have initial focus.
		* @return Button identifier
		*/
		TInt InitialFocusButtonId() const;

		/**
		* Registers an observer for receiving
		* update notifications from this interface.
		* @param aObserver The observer object.
		*/
		void SetButtonPanelObserver( MVRObserver* aObserver );

		/**
		* Checks if button panel model needs to reset the focus
		* for example after a state change
		* @return Is reset needed
		*/		
		TBool ResetNeeded();
		
		/**
		* Returns an ID of the current visual state.
		* @returns Visual state Id.
		*/
		TUint VisualStateId() const;
		
        /**
		* Checks if there is a call incoming at the moment
		* @return ETrue if call incoming, EFalse otherwise
		*/
        TBool IncomingCall() const;	

		/**
		* Checks if model is in a state where it can take and handle
		* new commands
		* @return Can model handle new commands
		*/
		TBool CanHandleCommands() const;

	public: // from MVRStateInfoModel

		/**
		* Returns the length of the current memo
		* @return The duration in microseconds.
		*/
		TTimeIntervalMicroSeconds Duration() const;

		/**
		* Returns the playing or recording position of the current memo.
		* @return The position in microseconds.
		*/
		TTimeIntervalMicroSeconds Position() const;

		/**
		* Returns the text content for a label.
		* @param aName Returned text is placed in this descriptor
		* @param aLabelIndex Label identifier (>=0)
		*/
		void GetLabel( TDes& aName, TInt aLabelIndex ) const;

		/**
		* Returns the resource id for a label.
		* @param aLabelIndex Label identifier (>=0)
		* @return The resource id for the specified label
		*/
		TInt ResourceIdForLabel( TInt aLabelIndex, TAknLayoutId aLayout ) const;

		/**
		* Registers an observer for receiving
		* update notifications from this interface.
		* @param aObserver The observer object.
		*/
		void SetStateInfoObserver( MVRObserver* aObserver );
		
		/**
		* Determines if model has a progress bar
		* @return ETrue, if model has a progress bar, otherwise EFalse
		*/
		TBool HasProgressBar() const;
		
		/**
		* Determines if model has a volume control in this state
		* @return ETrue, if model has a volume control, otherwise EFalse
		*/
		TBool HasVolumeControl() const;
		
		/**
		* Registers an observer to communicate about the changes in InfoPanel. 
		* @param aObserver The observer object.
		*/
		void SetStateInfoPanelObserver( MVRStateInfoObserver* aObserver );

	public: // from MVRObserver

		/**
		* Called to notify a change in the observed subject's state.
		*/
		void Update( TVRUpdateCommand aCommand );

	public: // from MVRSelectionProvider

		/**
		* Returns the current memo name in an array
		* Ownership is transferred. Caller must destroy the returned array.
		* @return The array containing 0 or 1 names.
		*/
		MDesCArray* GetSelectedFilesLC() const;

	public: // from MVRVolumeChangeObserver

		/**
		* Called to notify a change in volume settings.
		* @param aStep Volume level in steps
		* @param aMaxSteps How many steps there are (10 usually).
		*/
		void SetVolume( TInt aStep, TInt aMaxSteps );

		/***
		* Indicates if volume can be set, because rinto tone
		* volume change has no effect if the tone is playing.
		*/
		TBool CanSetVolume();

	public: // CVRSystemEventObserver
	
		void HandleSystemEventL();

		void HandleMMCEjectEventL();
		
	public: // new methods

		/**
		* Handles a option menu / command button / softkey command.
		* @param aCommandId Command identifier, one of TVRCommands
		*/
		void HandleCommandL( TInt aCommandId );
		
		/**
		* Returns iInRecording flag
		* @return True or False
		*/
        TBool GetInRecordingFlag();
        
       /**
		* set iInRecording flag
		* 
		*/
        void SetInRecordingFlag(TBool);


		/**
		* Check if stop has been called before
		* @return True or False
		*/
        TBool GetIfStopCalled();


		/**
		* Enters a new state machine context.
		* Executes the initial state transition defined by the context.
		* @param aContext Identifies the new context.
		*/
		void EnterContextL( const TVRRecViewContexts& aContext );

		/**
		* Leaves the current state machine context.
		*/
		void LeaveContext();

		/**
		* Sets the memo name. Forwards the call to CVRMemo.
		* @param aFilename The new file name
		*/
		void SetMemoName( const TDesC& aFilename );

		/**
		* Sets the memo name to a new, unique, one.
		* Forwards the call to CVRMemo.
		*/
		void SetMemoNameNewL( TBool aEmbedded = EFalse );

		/**
		* Sets the path to directory where memos will be saved.
		* Forwards the call to CVRMemo.
		*/
		void SetSavingLocationL( const TDesC& aPath );

		/**
		* Returns the complete file name (path and everything).
		* @return Reference to the memo name.
		*/
		const TDesC& Filename() const;

		/**
		* Returns embedding status.
		* @param ETrue if the current context is an embedded one.
		*/
		TBool IsEmbedded() const;

		/**
		* Indicates if we are in a state that can accept
		* more commands (i.e. all async calls have completed).
		* @return ETrue if it's ok to proceed calling methods.
		*/
		TBool CanAcceptCommands() const;

		/**
		* Sends the current memo via MMS/Infra/Bluetooth/Email
		* @param aSendUi The CSendUi object used for sending
		*/
		void SendViaL( CSendUi* aSendUi );

		/**
		* Activates the recorder view model
		*/
		void ActivateL();

		/**
		* Deactivates the recorder view model
		*/
		void Deactivate();

        /**
        * Sets the file handle to record into
        */
        void SetFileHandle( RFile& aFile );

        /**
        * Returns the active file handle of CVRMemo object
        */
        RFile& MemoFileHandle();
        
        /**
        * Enables or disables the Volume Control drawing in current
        * visual state
        * @param aVolumeControl ETrue if Volume Control should be enabled
        * 						EFalse if disabled 
        */
        void EnableVolumeControl( TBool aVolumeControl );
        
        /**
		* Returns the active quality setting.
		* @return Quality setting of the active memo
		*/
		TVRQuality Quality() const;
		
        /**
         * Send exit event to UI
         */
        void SendExitEvent();
        
        /**
        * Set the value of iIsDriveReady.
        * @param The new value of iIsDriveReady.
        */
        void SetIsDriveReady(TBool aIsDriveReady);
                
        /**
        * Get the value of iIsDriveReady.
        * @return The value of iIsDriveReady.
        */
        TBool GetIsDriveReady();

	private: // new methods

		/**
		* Enters a new state.
		* Executes a function identified by the state transition.
		* Notifies all registered observers.
		* @param aNewState identifies the new state.
		* @param aForce force change state (even if new is same as old)
		*/
		void ChangeState( TUint aNewState, TBool aForced = EFalse );

		/**
		* Retrieves transition information to the given transition object.
		* @param aTransition Transition to be filled in.
		* @param aCommandId The command that triggered this transition.
		*/
		void GetTransition( TVRContext::TTransition& aTransition,
							TUint aCommandId ) const;

		/**
		* Retrieves transition information to the given transition object.
		* This is used the retrieve the initial transition of a state.
		* @param aTransition Transition to be filled in.
		*/
		void GetTransition( TVRContext::TTransition& aTransition ) const;

		/**
		* Calls the specified function.
		* @param aFunctionId Function identifier (TVRFunctions)
		* @return EFalse if the function want's to cancel the state change
		*/
		TBool CallFunctionByIdL( TInt aFunctionId );

		/**
		* Returns the text content for a label.
		* This is a leaving variant of GetLabel(). It is called by
		* GetLabel() inside a TRAP.
		* @param aName Returned text is placed in this descriptor
		* @param aLabelIndex Label identifier (>=0)
		*/
		void GetLabelL( TDes& aName, TInt aLabelIndex ) const;

		/**
		* Stops recording and saves the memo.
		* The specified note text is displayed while saving.
		* @param aResourceId  Identifies the note text.
		*/
		void StopAndSaveL( TInt aResourceId );

		/**
		* Stops recording and saves the memo.
		* The specified note text is displayed while saving.
		* Leaves the memo detached so that application can be closed.
		* @param aResourceId  Identifies the note text.
		*/
		void StopAndCloseL( TInt aResourceId );

		/**
		* Shows a global note.
		* @param aResourceId Identifies the note text.
		* @param aNoteType Identifies the note type.
		*/
		void ShowNoteL( TInt aResourceId, TAknGlobalNoteType aNoteType );

		/**
		* Loads the volume settings (IHF & ear piece) from VoiceRecorder.ini
		*/
		void LoadVolumeSettingsL();

		/**
		* Saves the volume settings (IHF & ear piece) to VoiceRecorder.ini
		* Note: This method is non-leaving and ignores all errors, because
		* it's called inside the destructor. LoadVolumeSettingsL() has
		* sanity checking so the situation isn't fatal if the saving fails.
		*/
		void SaveVolumeSettings();

		/**
		* Sets IHF on/off, if the phone is not in voice on alerting state
		* @param aIhf ETrue == set IHF on, EFalse == set IHF off
		*/
		void SetIHFIfCallNotActive( TBool aIhf );

		/*
		* Checks if the current default speaker is loudspeaker or earpiece
		*/
		void CheckIhfState();

		/**
		* Sets the volume on the media server client object according
		* to the current active IHF setting.
		*/
		void SetRecorderVolume();

		/**
		* Reads the default speaker setting and sets iIhfState accordingly
		*/
		void ReadDefaultSpeakerL();

		/*
		* Handles error in Update method.
		* @param aErr Id of the error
		*/
		void HandleUpdateErrorL( TInt aErr );

		/*
		* Formats time to R_QTN_TIME_DURAT_LONG or 
		* R_QTN_TIME_DURAT_MIN_SEC_WITH_ZERO depending of time value
		* @param aTime Time that is formatted
		* @param aString Buffer that holds the formatted time
		*/
		void FormatTimeL( const TTime& aTime, TDes& aString ) const;
		
		/*
		* Generates an array of services that should be dimmed from the 
		* options menu "Send" selection list
		* @return A pointer to an array that consists of the service Uids 
		* 		that should be dimmed
		*/
		CArrayFixFlat<TUid>* SendViaServicesToDimLC();

	private: // data

		/**
		* The state machine structure.
		*/
		TVRContext iContexts[ ENumContexts ];

		/**
		* The current context.
		*/
		TVRRecViewContexts iContext;

		/**
		* Pointer to the current state. Contained in iContexts.
		*/
		TVRState* iState;

		/**
		* Pointer to the voice memo object. Owned
		*/
		CVRMemo* iMemo;

		/**
		* Pointer to the recorder object. Owned
		*/
		MVRMdaRecorder* iRecorder;

		/**
		* Pointer to a global information note object. Owned
		*/
		CAknGlobalNote* iGlobalNote;

		/**
		* Pointer to an array of UI states. Owned
		*/
		CArrayFixSeg< TVRState > iStateArray;

		/**
		* Pointer to an array of label sets. Owned.
		*/
		CArrayPtrSeg< CDesCArray > iLabelSets;

		/**
		* Pointer to an array of label resource ids. Owned.
		*/
		TVRLabelLayoutLink* iLabelLayoutLinks;

		/**
		* Pointer to the button panel observer. Not owned.
		*/
		MVRObserver* iButtonPanelObserver;

		/**
		* Pointer to the decorator observer. Not owned.
		*/
		MVRObserver* iDecoratorObserver;

		/**
		* Pointer to the state info observer. Not owned.
		*/
		MVRObserver* iStateInfoObserver;

		/**
		* Format string placeholder.
		* R_QTN_DATE_USUAL_WITH_ZERO is loaded to it in construction.
		*/
		TBuf< VRLABELMAXLENGTH > iDateUsualWithZero;

		/**
		* Format string placeholder.
		* R_QTN_TIME_USUAL_WITH_ZERO is loaded to it in construction.
		*/
		TBuf< VRLABELMAXLENGTH > iTimeUsualWithZero;

		/**
		* Format string placeholder.
		* R_QTN_TIME_DURAT_MIN_SEC_WITH_ZERO is loaded to it in construction.
		*/
		TBuf< VRLABELMAXLENGTH > iTimeDuratMinSecWithZero;
		
		/**
		* Format string placeholder.
		* R_QTN_TIME_DURAT_LONG is loaded to it in construction.
		*/		
		TBuf< VRLABELMAXLENGTH > iTimeDuratLong;

		/**
		* ETrue if the model has succesfully entered a context.
		*/
		TBool iContextEntered;

		/**
		* For listening call events. Owned.
		*/
		CVRSystemEventHandler* iCurrentCallHandler;

		CVRMediaRemovalMonitor* iCurrentMMCEjectHandler;


		/**
		* Current logical state (i.e. what the user sees, not the actual
		* state of the HW) of the IHF
		*/
		TBool iIhfState;

		/**
		* Prefered volume of the IHF
		*/
		TInt iIhfVolume;

		/**
		* Used to tell the IHF change event listener, that the next IHF
		* change is not made with voice key and is to be ignored
		*/
		TBool iIgnoreNextIhfChange;

		/**
		* Indicates if the view is actually active, so that the model
		* knows when to ignore IHF change events
		*/
		TBool iActive;

		/**
		* Default speaker when playing
		*/
		TVRSpeaker iDefaultSpeaker;

		/**
		* Indicates if End key is pressed so view deactivation can trigger 
		* right operation ( paused memo is saved as well )
		*/
		TBool iIsEndKey;

		/*
		* Id for canceling waitnote
		*/
		TInt iNoteId;

		/*
		*
		*/
		TBool iIsNoteLaunched;

		/**
		* Default audio format for recording audio clip
		*/
		TInt iVRAudioFormat;

		/**
		* Allow In-call recording functionality
		*/
		TInt iVRAllowInCallRecording;


		/**
		* The call state retrieved on previous notification
		*/
		TInt iPreviousCallState;
		
		/**
		* Should the button panel reset itself on update
		*/
		TBool iResetButtons;
		
		/**
		* If model can handle commands. i.e. no critical command handling
		* just ongoing, e.g. waiting start tone play before starting
		* recording
		*/
		TBool iCanHandleCommands;
		
		/**
		* Pointer to the state info panel observer. Not owned.
		*/
		MVRStateInfoObserver* iStateInfoPanelObserver;
		
		/**
		* State of the CBA buttons. If EFalse LSK/RSK deliver ECmdNOP which
		* causes no action.
		*/
		TBool iCBAEnabled;
		
	    /**
	     * To judge whether the current drive is ready for recording
	     */
	    TBool iIsDriveReady;
	};

#endif // __CVRRECVIEWMODEL_H__