voicerecorder/RecViewSrc/CVRRecViewModel.h
branchRCL_3
changeset 25 c6bafb5162d8
child 29 c9b63fff5abf
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/voicerecorder/RecViewSrc/CVRRecViewModel.h	Wed Sep 01 12:29:14 2010 +0100
@@ -0,0 +1,761 @@
+/*
+* 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__