diff -r 000000000000 -r 845549f293a7 voicerecorder/RecViewSrc/CVRRecView.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/voicerecorder/RecViewSrc/CVRRecView.cpp Thu Dec 17 08:46:57 2009 +0200 @@ -0,0 +1,802 @@ +/* +* 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: +* Voice Recorder Record View +* +* +*/ + + +// INCLUDE FILES + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "voicerecorder.hrh" +#include "CVRRecView.h" +#include "CVRRecViewContainer.h" +#include "CVRRecViewActivationContainer.h" +#include "CVRRecViewModel.h" +#include "VRUtils.h" + +// CONSTANTS +const TUid KUidMmsEditor = { 0x100058DE }; +const TUid KUidMailEditor = { 0x101F4CD6 }; + + +// ================= MEMBER FUNCTIONS ======================================== + +// --------------------------------------------------------------------------- +// CVRRecView::CVRRecViewModelActivator::CVRRecViewModelActivator +// +// --------------------------------------------------------------------------- +// +CVRRecView::CVRRecViewModelActivator::CVRRecViewModelActivator( + CVRRecViewModel* aModel ) + : CAsyncOneShot( EPriorityNormal ), iModel( aModel ), + iContext( EContextEmptyNormal ) + { + } + + +// --------------------------------------------------------------------------- +// CVRRecView::CVRRecViewModelActivator::~CVRRecViewModelActivator +// +// --------------------------------------------------------------------------- +// +CVRRecView::CVRRecViewModelActivator::~CVRRecViewModelActivator() + { + Cancel(); + } + + +// --------------------------------------------------------------------------- +// CVRRecView::CVRRecViewModelActivator::RunL +// +// --------------------------------------------------------------------------- +// +void CVRRecView::CVRRecViewModelActivator::RunL() + { + // Activate model in correct context + iModel->SetMemoNameNewL( iContext == EContextRecordNewForRemote); + iModel->EnterContextL( iContext ); + iModel->ActivateL(); + + // Notify recview + iCallback.CallBack(); + } + + +// --------------------------------------------------------------------------- +// CVRRecView::CVRRecViewModelActivator::Activate +// +// --------------------------------------------------------------------------- +// +void CVRRecView::CVRRecViewModelActivator::Activate( + TVRRecViewContexts aContext, TCallBack aCallback ) + { + iContext = aContext; + iCallback = aCallback; + Call(); + + } + + +// --------------------------------------------------------------------------- +// CVRRecView::CVRRecViewModelActivator::DoCancel +// +// --------------------------------------------------------------------------- +// +void CVRRecView::CVRRecViewModelActivator::DoCancel() + { + } + + +// --------------------------------------------------------------------------- +// CVRRecView::NewLC +// +// --------------------------------------------------------------------------- +// +EXPORT_C CVRRecView* CVRRecView::NewLC( TInt aViewResourceId, + TInt aModelResourceId ) + { + CVRRecView* recview = new( ELeave ) CVRRecView; + CleanupStack::PushL( recview ); + recview->ConstructL( aViewResourceId, aModelResourceId ); + + return recview; + } + + +// --------------------------------------------------------------------------- +// CVRRecView::~CVRRecView +// +// --------------------------------------------------------------------------- +// +CVRRecView::~CVRRecView() + { + if ( iContainer ) + { + AppUi()->RemoveFromViewStack( *this, iContainer ); + } + + if ( iActivationContainer ) + { + AppUi()->RemoveFromViewStack( *this, iActivationContainer ); + } + + delete iContainer; + delete iActivationContainer; + delete iModel; + delete iSendUi; + delete iModelActivator; + delete iLaunchService; + } + + +// --------------------------------------------------------------------------- +// CVRRecView::ConstructL +// +// --------------------------------------------------------------------------- +// +void CVRRecView::ConstructL( TInt aViewResourceId, TInt aModelResourceId ) + { + BaseConstructL( aViewResourceId ); + + iModel = new( ELeave ) CVRRecViewModel; + TResourceReader reader; + iEikonEnv->CreateResourceReaderLC( reader, aModelResourceId ); + iModel->ConstructFromResourceL( reader ); + CleanupStack::PopAndDestroy(); // reader; + + // Create SendUi (Send as MMS, E-Mail, etc...) + iSendUi = CSendUi::NewL(); + + iModelActivator = new(ELeave) CVRRecViewModelActivator( iModel ); + // iCommand = 0; + } + + +// --------------------------------------------------------------------------- +// CVRRecView::Id +// +// --------------------------------------------------------------------------- +// +TUid CVRRecView::Id() const + { + const TUid KVRRecViewUID = { KVRRecorderViewUID }; + + return KVRRecViewUID; + } + + +// --------------------------------------------------------------------------- +// CVRRecView::HandleCommandL +// +// --------------------------------------------------------------------------- +// +void CVRRecView::HandleCommandL( TInt aCommandId ) + { + // This command must be acceptable all times. + if ( aCommandId == ECmdCancelNote ) + { + iCommand = aCommandId; + if( iModel ) + { + iModel->HandleCommandL( aCommandId ); + } + return; + } + + if ( !iModel->CanAcceptCommands() ) + { + return; + } + + switch ( aCommandId ) + { + // Don't do anything in case of a Task Swapper command + case EAknCmdTaskSwapper: + { + break; + } + // No operation + case ECmdNOP: + { + break; + } + // Go back to voice memo list view + case EAknSoftkeyBack: + { + AppUi()->HandleCommandL( EEikCmdExit ); + break; + } + case ECmdSettings: + { + // Saving the volume control state before entering settings + TBool hasVolumeControl( iModel->HasVolumeControl() ); + // Disabling volume control + iModel->EnableVolumeControl( EFalse ); + iContainer->Update(); + + AppUi()->HandleCommandL( aCommandId ); + + // Set volume control as it was before settings dialog + iModel->EnableVolumeControl( hasVolumeControl ); + iContainer->Update(); + break; + } + case ECmdGoToMyClips: + { + delete iLaunchService; + iLaunchService = NULL; + + TFileName path; + VRUtils::MemoStoreDirectoryL( path ); + TInt sortMode = 0; + + CAiwGenericParamList* inParams = CAiwGenericParamList::NewLC(); + inParams->AppendL(TAiwGenericParam( + EGenericParamDir, TAiwVariant( path ) ) ); + inParams->AppendL(TAiwGenericParam( + EGenericParamDir, TAiwVariant( sortMode ) ) ); + iLaunchService = CAknLaunchAppService::NewL( + TUid::Uid( 0x101F84EB ), NULL, inParams ); + CleanupStack::PopAndDestroy( inParams ); + break; + } + case ECmdSendVia: + { + iModel->SendViaL( iSendUi ); + break; + } + + // Handles Middle SoftKey presses in this view + case ECmdMSK: + { + // Don't forward the command if dimmed button was clicked or + // if model can't handle commands + if ( iModel->ButtonState( iContainer->FocusedButton() ) == EDimmed || + !iModel->CanHandleCommands() ) + { + break; + } + + // Fetch the command to execute + TInt commandId( iModel->CommandId( iContainer->FocusedButton() ) ); + + iModel->HandleCommandL( commandId ); + AppUi()->HandleCommandL( commandId ); + + iContainer->UpdateButtonPanel( EVRUpdateStateChange ); + break; + } + + default: + { + iModel->HandleCommandL( aCommandId ); + AppUi()->HandleCommandL( aCommandId ); + break; + } + } + } + + +// --------------------------------------------------------------------------- +// CVRRecView::DynInitMenuPaneL +// +// --------------------------------------------------------------------------- +// +void CVRRecView::DynInitMenuPaneL( TInt aResourceId, CEikMenuPane* aMenuPane ) + { + + switch ( aResourceId ) + { + case R_VR_REC_MENUPANE_DEFAULT: + { + // Check if HELP is enabled in FeatureManager, if not, disable the Help menu item + if (!FeatureManager::FeatureSupported(KFeatureIdHelp)) + { + aMenuPane->SetItemDimmed(ECmdHelp, ETrue); + } + + AddSendToMenuL( aResourceId, aMenuPane ); + break; + } + + case R_VR_REC_MENUPANE_VIEWER: + { + TUid appuid( KNullUid ); + CEikAppUi* container = iEikonEnv->EikAppUi()->ContainerAppUi(); + if ( container ) + { + // Check if HELP is enabled in FeatureManager, if not, disable the Help menu item + if (!FeatureManager::FeatureSupported(KFeatureIdHelp)) + { + aMenuPane->SetItemDimmed(ECmdHelp, ETrue); + } + + appuid = container->Application()->AppDllUid(); + if ( ( appuid == KUidMmsEditor ) || + ( appuid == KUidMailEditor ) ) + { + aMenuPane->SetItemDimmed( ECmdSaveAttachment, ETrue ); + } + else + { + AddSendToMenuL( aResourceId, aMenuPane ); + } + } + + break; + } + case R_VR_SETTINGS_MENUPANE: + { + // Check if HELP is enabled in FeatureManager, if not, disable the Help menu item + if (!FeatureManager::FeatureSupported(KFeatureIdHelp)) + { + aMenuPane->SetItemDimmed(ECmdHelp, ETrue); + } + break; + } + + case R_VR_REC_MENUPANE_DELETED: + { + // Check if HELP is enabled in FeatureManager, if not, disable the Help menu item + if (!FeatureManager::FeatureSupported(KFeatureIdHelp)) + { + aMenuPane->SetItemDimmed(ECmdHelp, ETrue); + } + + // if recording already started, not allow to start recording again. + if (iModel->GetInRecordingFlag()) + { + aMenuPane->SetItemDimmed(ECmdRecord, ETrue); + aMenuPane->SetItemDimmed(ECmdSettings, ETrue); + iModel->SetInRecordingFlag(EFalse); + } + + break; + } + + case R_VR_REC_MENUPANE_INCALL_RECORDING_DISABLED: + { + // Check if HELP is enabled in FeatureManager, if not, disable the Help menu item + if (!FeatureManager::FeatureSupported(KFeatureIdHelp)) + { + aMenuPane->SetItemDimmed(ECmdHelp, ETrue); + } + break; + } + + case R_VOREC_GS_SETTINGS_MENUPANE: + { + // Check if HELP is enabled in FeatureManager, if not, disable the Help menu item + if (!FeatureManager::FeatureSupported(KFeatureIdHelp)) + { + aMenuPane->SetItemDimmed(EAknCmdHelp, ETrue); + } + break; + } + + default: + { + break; + } + } + } + + +// --------------------------------------------------------------------------- +// CVRRecView::GetSelectedFilesLC +// +// --------------------------------------------------------------------------- +// +MDesCArray* CVRRecView::GetSelectedFilesLC( TVRSelectionStyle& aStyle ) const + { + aStyle = EFocusedItem; + return iModel->GetSelectedFilesLC(); + } + + +// --------------------------------------------------------------------------- +// CVRRecView::DoActivateL +// +// --------------------------------------------------------------------------- +// +void CVRRecView::DoActivateL( const TVwsViewId& aPrevViewId, + TUid aCustomMessageId, + const TDesC8& aCustomMessage ) + { + TRAP_IGNORE( ReallyDoActivateL( aPrevViewId, + aCustomMessageId, + aCustomMessage ) ); + } + + +// --------------------------------------------------------------------------- +// CVRRecView::DoDeactivate +// +// --------------------------------------------------------------------------- +// +void CVRRecView::DoDeactivate() + { + iModel->Deactivate(); + + iModel->LeaveContext(); + + CAknViewAppUi* appUi = AppUi(); + if ( iContainer ) + { + appUi->RemoveFromViewStack( *this, iContainer ); + delete iContainer; + iContainer = NULL; + } + + if ( iActivationContainer ) + { + appUi->RemoveFromViewStack( *this, iActivationContainer ); + delete iActivationContainer; + iActivationContainer = NULL; + } + + } + + +// --------------------------------------------------------------------------- +// CVRRecView::ViewDeactivated +// +// --------------------------------------------------------------------------- +// +void CVRRecView::ViewDeactivated() + { +#ifdef _DEBUG + RDebug::Print( _L( "CVRRecView::ViewDeactivated" )); +#endif + + TInt err = 0; + + if ( !iModel->IncomingCall() && ( iModel->VisualStateId() == EStatePlaying || + iModel->VisualStateId() == EStateRecording ) ) + { + + if (iModel->VisualStateId() == EStateRecording && iCommand == ECmdCancelNote ) + { + TRAP_IGNORE (iModel->HandleCommandL( ECmdSaveAttachment )); + } + + // Is autolock activating? + RProperty prop; + TInt val; + prop.Get( KPSUidCoreApplicationUIs, KCoreAppUIsAutolockStatus, val ); + + if ( val == EAutolockOff && //Do not pause when focus is lost because of autolock + !iModel->GetIfStopCalled()) + { + + //messy, if it is ACC format, stop it. in the future when Pause is supported, it needs change +#ifdef __AAC_ENCODER_PLUGIN + if ((iModel->Quality() == EQualityHigh) && (GetStateId() == EStateRecording)) + { + TRAP_IGNORE (iModel->HandleCommandL( ECmdAutoStopInterrupted )); + } + else + { + TRAP( err, iModel->HandleCommandL( ECmdPause ) ); + } + +#else + TRAP( err, iModel->HandleCommandL( ECmdPause ) ); +#endif + + + if( err ) + { +#ifdef _DEBUG + RDebug::Print( _L("CVRRecView::ViewDeactivated, PauseError Id: %d"), + err ); +#endif + } + } + + } + else + { + TRAP_IGNORE( iModel->HandleCommandL( ECmdAutoStopInterrupted ) ); + } + + CAknView::ViewDeactivated(); + } + + +// --------------------------------------------------------------------------- +// CVRRecView::ViewActivatedL +// The model's ActivateL() function is called to invoke any functionality +// required when the UI is activated (e.g., for In-call recording diabling +// feature) +// --------------------------------------------------------------------------- +// +void CVRRecView::ViewActivatedL(const TVwsViewId& aPrevViewId, + TUid aCustomMessageId, + const TDesC8& aCustomMessage) + { + iModel->ActivateL(); + + CAknView::ViewActivatedL(aPrevViewId, aCustomMessageId, aCustomMessage); + } + + +// --------------------------------------------------------------------------- +// CVRRecView::Cba +// +// --------------------------------------------------------------------------- +// +CEikButtonGroupContainer* CVRRecView::Cba() const + { + return CAknView::Cba(); + } + + +// --------------------------------------------------------------------------- +// CVRRecView::AddSendToMenuL +// Use CSendAppUi to display the Send cascade +// --------------------------------------------------------------------------- +// +void CVRRecView::AddSendToMenuL( TInt aResourceId, CEikMenuPane* aMenuPane ) + { + // If the focused file is closed content (e.g. a DRM file or a protected + // MIDI file), the whole Send option mustn't be shown. + CCommonContentPolicy* ccp = CCommonContentPolicy::NewLC(); + MDesCArray* filenames = iModel->GetSelectedFilesLC(); + if ( filenames->MdcaCount() > 0 && + !ccp->IsClosedFileL( filenames->MdcaPoint( 0 ) ) ) + { + // Set proper capabilities + TSendingCapabilities capabilities( 0, KVRSendUiMsgSize, + TSendingCapabilities::ESupportsAttachments ); + + // We want the send menuitem after a specific item + TInt itemPosForSend( 0 ); + if ( aResourceId == R_VR_REC_MENUPANE_DEFAULT ) + { + aMenuPane->ItemAndPos( ECmdRename, itemPosForSend ); + } + else if ( aResourceId == R_VR_REC_MENUPANE_VIEWER ) + { + aMenuPane->ItemAndPos( ECmdSaveAttachment, itemPosForSend ); + } + itemPosForSend++; + + iSendUi->AddSendMenuItemL( *aMenuPane, + itemPosForSend, + ECmdSendVia, + capabilities ); + } + CleanupStack::PopAndDestroy( 2 ); // ccp, filenames + } + + +// --------------------------------------------------------------------------- +// CVRRecView::LayoutChangedL +// +// --------------------------------------------------------------------------- +// +void CVRRecView::LayoutChangedL( TInt aType ) + { + if ( iContainer ) + { + iContainer->SetRect( ClientRect() ); + iContainer->HandleResourceChangeL( aType ); + } + } + + +// --------------------------------------------------------------------------- +// CVRRecView::ReallyDoActivateL +// +// --------------------------------------------------------------------------- +// +void CVRRecView::ReallyDoActivateL( const TVwsViewId& /*aPrevViewId*/, + TUid aCustomMessageId, + const TDesC8& /*aCustomMessage*/ ) + { + // Don't do anything if activation is ongoing + if ( iActivationContainer ) + { + return; + } + + // If container exists, we have already been activated + // Deactivate needed before new activation. + if ( iContainer ) + { + DoDeactivate(); + } + + // Display an empty UI container until model has been fully activated + iActivationContainer = new( ELeave ) CVRRecViewActivationContainer; + iActivationContainer->ConstructL( ClientRect() ); + CAknViewAppUi* appUi = AppUi(); + appUi->AddToViewStackL( *this, iActivationContainer ); + iActivationContainer->ActivateL(); + + // Activate model in correct context asynchronically. + // iContainer will be activated trough callback after model activation + TCallBack cb( ActivationCallBack, this ); + iModelActivator->Activate( static_cast< TVRRecViewContexts >( + aCustomMessageId.iUid ), cb ); + + // Construct the real container + iContainer = new( ELeave ) CVRRecViewContainer; + iContainer->ConstructL( ClientRect(), iModel, iModel, iModel, this ); + iContainer->SetKeyObserver( iModel ); + iContainer->SetVolumeChangeObserver( iModel ); + } + + +// --------------------------------------------------------------------------- +// CVRRecView::SetFileHandle +// +// --------------------------------------------------------------------------- +// +void CVRRecView::SetFileHandle( RFile& aFile ) + { + iModel->SetFileHandle( aFile ); + } + + +// --------------------------------------------------------------------------- +// CVRRecView::GetFile +// +// --------------------------------------------------------------------------- +// +RFile& CVRRecView::GetFile() + { + return iModel->MemoFileHandle(); + } + + +// --------------------------------------------------------------------------- +// CVRRecView::ActivationCallBack +// +// --------------------------------------------------------------------------- +// +TInt CVRRecView::ActivationCallBack( TAny* aRecView ) + { + CVRRecView* view = reinterpret_cast< CVRRecView* >( aRecView ); + TRAP_IGNORE( view->ActivateContainerL() ); + return ETrue; + } + + +// --------------------------------------------------------------------------- +// CVRRecView::ActivateContainerL +// +// --------------------------------------------------------------------------- +// +void CVRRecView::ActivateContainerL() + { + // Activate the actual container and remove + // the one used during model construction + CAknViewAppUi* appUi = AppUi(); + appUi->AddToViewStackL( *this, iContainer ); + iContainer->ActivateL(); + + // Delete the empty container, it's not needed anymore + if ( iActivationContainer ) + { + appUi->RemoveFromViewStack( *this, iActivationContainer ); + delete iActivationContainer; + iActivationContainer = NULL; + } + + } + +TUint CVRRecView::GetStateId() const + { +// if (iModel) + return iModel->VisualStateId(); + } + + +// --------------------------------------------------------------------------- +// CVRRecView::IsEmbedded +// +// --------------------------------------------------------------------------- +// +TBool CVRRecView::IsEmbedded() const + { + + return iModel->IsEmbedded(); + + } + + +// --------------------------------------------------------------------------- +//Returns the active quality setting. +//return Quality setting of the active memo +// --------------------------------------------------------------------------- +TVRQuality CVRRecView::Quality() const + { + return iModel->Quality(); + } + +// --------------------------------------------------------------------------- +// Called by UI Framework when view switches to and from foreground +// --------------------------------------------------------------------------- +/* +void CVRRecView::HandleForegroundEventL( TBool aForeground ) + { + // If the view is going to background, pause recording for stand alone + // application mode + if ( !aForeground && !iModel->IsEmbedded() && iCommand != ECmdCancelNote ) + { + TInt err(0); + if ( !iModel->IncomingCall() && ( iModel->VisualStateId() == EStatePlaying ||iModel->VisualStateId() == EStateRecording ) ) + { + //messy, if it is ACC format, stop it. in the future when Pause is supported, it needs change +#ifdef __AAC_ENCODER_PLUGIN + if ((iModel->Quality() == EQualityHigh) && (GetStateId() == EStateRecording)) + { + TRAP_IGNORE (iModel->HandleCommandL( ECmdAutoStopInterrupted )); + } + else + { + TRAP( err, iModel->HandleCommandL( ECmdPause ) ); + } + +#else + TRAP( err, iModel->HandleCommandL( ECmdPause ) ); +#endif + + if( err ) + { +#ifdef _DEBUG + RDebug::Print( _L("CVRRecView::ViewDeactivated, PauseError Id: %d"), err ); +#endif + } + } + else + { + TRAP_IGNORE( iModel->HandleCommandL( ECmdAutoStopInterrupted ) ); + } + } + + // iCommand = 0; + + // Forward to handle default event handling. + CAknView::HandleForegroundEventL(aForeground); + } +*/