diff -r 072a5fa0c63b -r c6bafb5162d8 voicerecorder/RecViewSrc/CVRRecViewModel.h --- /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 +#include +#include +#include +#include + +#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* 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__