/*
* 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 <aknViewAppUi.h>
#include <AknQueryDialog.h>
#include <avkon.hrh>
#include <barsread.h>
#include <eikbtgpc.h>
#include <eikmenub.h>
#include <StringLoader.h>
#include <apparc.h>
#include <eikenv.h>
#include <eikappui.h>
#include <eikapp.h>
#include <CommonContentPolicy.h>
#include <vwsdef.h>
#include <pathinfo.h>
#include <sendui.h>
#include <avkon.rsg>
#include <featmgr.h>
#include <VoiceRecorderUID.h>
#include <voicerecorder.rsg>
#include <e32property.h>
#include <coreapplicationuisdomainpskeys.h>
#include <AknLaunchAppService.h>
#include <AiwGenericParam.h>
#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);
}
*/