mobilemessaging/audiomsg/src/audiomessageappui.cpp
changeset 0 72b543305e3a
child 1 d09ac5c1e252
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mobilemessaging/audiomsg/src/audiomessageappui.cpp	Thu Dec 17 08:44:11 2009 +0200
@@ -0,0 +1,4666 @@
+/*
+* Copyright (c) 2005-2008 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:   Provides AudioMessage App UI methods.
+*
+*/
+
+
+
+#include <apgwgnam.h>
+#include <eikrted.h>
+#include <data_caging_path_literals.hrh>
+ 
+#include <akntabgrp.h>
+#include <aknEditStateIndicator.h>
+#include <akntitle.h>
+#include <aknnotewrappers.h>
+#include <AknWaitDialog.h>
+#include <AknsUtils.h>
+#include <akncontext.h>
+#include <AknTaskList.h>
+#include <AknGlobalNote.h>
+#include <aknnavi.h>
+#include <aknnavide.h>
+#include <AknIndicatorContainer.h>
+#include <AknIconArray.h>           // CAknIconArray
+#include <aknlists.h>
+#include <AknStatuspaneUtils.h>     // AknStatuspaneUtils
+#include <aknlayoutscalable_apps.cdl.h>
+#include <aknlayoutscalable_avkon.cdl.h>
+#include <MuiuMessageIterator.h>
+#ifdef RD_SCALABLE_UI_V2
+#include <akntoolbar.h> 
+#include <eikcolib.h>
+#endif
+    
+#include <aknclearer.h>
+#include <e32property.h>  
+#include <ctsydomainpskeys.h>
+
+// Common components
+#include <commonphoneparser.h> //Common phone number validity checker
+#include <CommonUiInternalCRKeys.h>
+#include <DocumentHandler.h>
+#include <featmgr.h>
+#include <finditemmenu.h>
+#include <finditem.hrh> //Place holder
+#include <ItemFinder.h>
+#include <StringLoader.h>  
+#include <messagingvariant.hrh>
+
+// Core UI
+#include <CoreApplicationUIsSDKCRKeys.h>
+
+// Help
+#include <hlplch.h>
+#include <csxhelp/msg.hlp.hrh>
+
+// Profiles
+#include <Profile.hrh>
+#include <ProfileEngineSDKCRKeys.h>
+
+// Messaging
+#include <mmsvattachmentmanager.h>
+#include <mtmuibas.h> 
+#include <MtmExtendedCapabilities.hrh>
+
+// MsgCommonUtils
+#include <msgvoipextension.h>
+
+// MUIU
+#include <MuiuOperationWait.h>
+#include <akninputblock.h>
+#include <MuiuMsvUiServiceUtilities.h>
+#include <muiumsvuiserviceutilitiesinternal.h>
+#include <MsgFolderSelectionDialog.h> //Folder Selection dialog, DoMoveMessageL
+#include <messaginginternalcrkeys.h>  //Inputmode, speaker setting
+#include <MuiuMsgEditorLauncher.h>
+
+// MsgEditor
+#include <MsgCheckNames.h>
+#include <MsgAttachmentUtils.h>
+#include <MsgEditorAppUiExtension.h>// for iMsgEditorAppUiExtension
+
+// Send UI
+#include <sendui.h> 
+#include <SenduiMtmUids.h> 
+#include <CMessageData.h> //DoReplyViaL
+
+// MMS Engine
+#include <mmsgenutils.h> //PureAddress
+#include <mmsclient.h>
+#include <MsgMimeTypes.h>   
+#include <MsgMediaResolver.h>
+#include <MsgMediaInfo.h>
+#include <msgmediacontrol.h>
+#include <uniaddresshandler.h>
+
+#include "AudioMessageLogging.h"
+#include "audiomessageappui.h"
+#include "audiomessageinsertoperation.h"
+#include "audiomessagelaunchoperation.h"
+#include "audiomessagesaveoperation.h"
+#include "audiomessagesendoperation.h"
+#include "audiomessagesendreadreportoperation.h"
+#include "audiomessageprogressdialog.h"
+#include <audiomessage.mbg>   
+#include <audiomessage.rsg> 
+
+#define KFSWApUid TUid::Uid( 0x10207218 )
+#define KAknNfySrvUid TUid::Uid(0x10281EF2 )
+
+#ifndef RD_MSG_NAVIPANE_IMPROVEMENT
+const TUint KNaviGranularity = 2;
+#endif
+const TMsvId KNewMessageFolder = KMsvDraftEntryIdValue;
+const TSize KPriorityIconSize = TSize( 10,16 ); // width, height
+const TInt  KDelayedExitDelay = 1500000;
+const TUid KUidAudioMessageApplication = { 0x1020745A };
+const TInt KAmsNotCaptured = -1;
+const TInt KDefaultVolume = 5;
+const TInt KAmsBytesInKilo = 1024;
+const TInt KMaxAliasLength = 64;
+
+_LIT( KAmrFileExt,".amr");
+//#ifndef RD_MSG_NAVIPANE_IMPROVEMENT
+_LIT( KAmsBitmapFileName, "audiomessage.mif" );
+//#endif
+
+// ======== MEMBER FUNCTIONS ========
+ 
+
+// ---------------------------------------------------------
+// CAudioMessageAppUi::Constructor
+// ---------------------------------------------------------
+//
+CAudioMessageAppUi::CAudioMessageAppUi()
+    :
+    iWaitResId( -1 ),
+    iEditorFlags( 0 ),
+    iProgressDlg( NULL ),
+    iAlias ( NULL ),
+    iCurrentVolume( KDefaultVolume ),
+    iVoiceKeyHandle( KAmsNotCaptured ),
+   	iSpeakerEarpiece( ETrue ),
+    iInserting( EFalse ),
+    iCurrentSkResId ( 0 )
+    {
+    }
+
+// ---------------------------------------------------------
+// CAudioMessageAppUi::ConstructL
+// ---------------------------------------------------------
+//
+void CAudioMessageAppUi::ConstructL()
+    {
+AMSLOGGER_WRITE( "CAudioMessageAppUi::ConstructL" );
+    if ( iEikonEnv->EikAppUi() )
+        {
+        iAbsorber = CAknInputBlock::NewLC();
+        CleanupStack::Pop( iAbsorber );
+        }
+
+    CMsgEditorAppUi::ConstructL();
+ 
+    // Get supported features from feature manager.
+    FeatureManager::InitializeLibL();
+    if ( FeatureManager::FeatureSupported( KFeatureIdHelp ) )
+        {
+        iSupportedFeatures |= EUniFeatureHelp;
+        }
+    if ( FeatureManager::FeatureSupported( KFeatureIdOfflineMode ) )
+        {   
+        iSupportedFeatures |= EUniFeatureOffline;      
+        }        
+    FeatureManager::UnInitializeLib();
+    iMsgVoIPExtension = CMsgVoIPExtension::NewL();
+    
+    iSettingsRepository = CRepository::NewL( KCRUidMuiuSettings );
+ 
+    TInt highlight = 0;
+    // Automatic highlight setting storage and change notifications
+    iCUiRepository = CRepository::NewL( KCRUidCommonUi );
+    iCUiRepository->Get( KCuiAutomaticHighlight, highlight  );
+    iNotifyHandler = CCenRepNotifyHandler::NewL( *this,
+                                                 *iCUiRepository,
+                                                 CCenRepNotifyHandler::EIntKey,
+                                                 KCuiAutomaticHighlight );
+    
+    TInt featureBitmask = 0;
+    CRepository* muiuRepository = CRepository::NewL( KCRUidMuiuVariation );
+    muiuRepository->Get( KMuiuMmsFeatures, featureBitmask );
+
+    if ( featureBitmask & KMmsFeatureIdPrioritySupport )
+       {          
+       iSupportedFeatures |= EUniFeaturePriority;     
+       }
+    if ( featureBitmask & KMmsFeatureIdDeliveryStatusDialog ) 
+        {         
+        iSupportedFeatures |= EUniFeatureDeliveryStatus;
+        }
+
+
+    delete muiuRepository;
+    
+    //Read speaker setting ( earpiece / loudspeaker )
+    iAudioMesseageRepository = CRepository::NewL( KCRUidAudioMsg );
+    iAudioMesseageRepository -> Get( KAudioMsgSpeaker, iSpeakerEarpiece );
+
+    iNotifyHandler->StartListeningL();
+    // Set up highlighting
+    if ( highlight == 0 )
+        {
+        iEditorFlags &= ~EAutohighLightEnabled;
+        }
+    else
+        {
+        iEditorFlags |= EAutohighLightEnabled;
+        }
+        
+        
+    // Disable task swapper from options menu during launch
+    MenuBar()->SetMenuType( CEikMenuBar::EMenuOptionsNoTaskSwapper );
+        
+
+    iTitlePane = static_cast<CAknTitlePane*>
+        ( StatusPane()->ControlL( TUid::Uid( EEikStatusPaneUidTitle ) ) );
+
+    if ( !iEikonEnv->StartedAsServerApp( ) )
+        {
+        Document()->PrepareToLaunchL( this );
+        }
+
+    Document()->SetEditorModelObserver( this );
+   	iClipFileName = StringLoader::LoadL( R_QTN_VOREC_FIRST_MEMO_NAME );
+   	iTimeDuratBase = StringLoader::LoadL( R_QTN_TIME_DURAT_MIN_SEC );
+
+
+    CEikStatusPane* sp = StatusPane();
+    CAknContextPane* contextPane = static_cast< CAknContextPane* >
+       ( sp->ControlL( TUid::Uid( EEikStatusPaneUidContext ) ) );
+
+      // Audiomsg window group id
+    iMyWgId = iCoeEnv->RootWin().Identifier();
+    
+    CApaWindowGroupName::FindByAppUid(
+        KFSWApUid,
+        iCoeEnv->WsSession(),
+        iFSWindowGroupId );
+        
+    CApaWindowGroupName::FindByAppUid(
+        KAknNfySrvUid,
+        iCoeEnv->WsSession(),
+        iAknNfySrvUi );    
+
+  	// Set path of bitmap file
+  	TParse fileParse;
+  	fileParse.Set( KAmsBitmapFileName, &KDC_APP_BITMAP_DIR, NULL );
+    
+    iAppIcon = AknsUtils::CreateGulIconL( 
+        AknsUtils::SkinInstance(), 
+        KAknsIIDQgnPropMceAudioTitle,
+        fileParse.FullName(),
+        EMbmAudiomessageQgn_prop_mce_audio_title,
+        EMbmAudiomessageQgn_prop_mce_audio_title_mask );
+
+    iCoeEnv->RootWin().EnableFocusChangeEvents();   // ignore error
+    
+    iScreenClearer = CAknLocalScreenClearer::NewLC( EFalse );
+    CleanupStack::Pop( iScreenClearer );    
+AMSLOGGER_WRITE( "CAudioMessageAppUi::ConstructL ends" );    	
+    }
+
+// ---------------------------------------------------------
+// CAudioMessageAppUi::Destructor
+// ---------------------------------------------------------
+//
+CAudioMessageAppUi::~CAudioMessageAppUi()
+    {
+AMSLOGGER_WRITE( "CAudioMessageAppUi::~CAudioMessageAppUi" );    
+    
+    
+    iEditorFlags |= EEditorExiting;
+    //Write speaker setting ( earpiece / loudspeaker )
+    if ( iAudioMesseageRepository)
+    	{	
+        iAudioMesseageRepository -> Set( KAudioMsgSpeaker, iSpeakerEarpiece );
+        delete iAudioMesseageRepository;
+    	}
+    // Release voice key
+    if ( iVoiceKeyHandle >= 0 )
+        {
+        iCoeEnv->RootWin().CancelCaptureKey( iVoiceKeyHandle );
+        iVoiceKeyHandle = KAmsNotCaptured;
+        }
+
+    delete iAddressHandler;
+  
+  
+    delete iAppIcon;
+  
+    // remember input mode:
+    if ( iEditorFlags & ELaunchSuccessful )
+        {
+        TInt id( EMsgComponentIdNull );
+        CMsgBaseControl* ctrl = iView->FocusedControl();  // ctrl can be NULL.
+        if ( ctrl )
+            {
+            id = ctrl->ControlId();
+            }
+        if ( id == EMsgComponentIdNull )
+            {
+            id = EMsgComponentIdTo;
+            }
+        if ( id == EMsgComponentIdTo )
+            {
+            CMsgAddressControl* rec = iView ?
+                static_cast< CMsgAddressControl* >( iView->ControlById( id ) )
+                : NULL;
+            if ( rec )
+                {
+                TInt inputMode = rec->Editor().AknEditorCurrentInputMode();
+                iSettingsRepository->Set( KMuiuToInputMode, inputMode );
+                }
+            }
+        }
+
+    delete iSettingsRepository;
+    delete iLaunchOperation;
+    delete iSaveOperation;
+    delete iSendOperation;
+    delete iInsertOperation;
+    if ( iWaitDialog )
+    	{
+    	TRAP_IGNORE( iWaitDialog->ProcessFinishedL() );
+    	}    
+    delete iIdle;
+    delete iAbsorber;
+    delete iFindItemMenu;
+    delete iNotifyHandler;
+    delete iCUiRepository;
+#ifndef RD_MSG_NAVIPANE_IMPROVEMENT    
+    delete iNavi_next_prev_msg_arrows;
+#endif    
+#ifdef RD_SCALABLE_UI_V2
+    if ( iToolbar )
+        {
+        delete iToolbar;    
+        }
+#endif
+    delete iMsgVoIPExtension;
+    delete iClipFileName;
+    delete iTimeDuratBase;
+    delete iInsertingMedia;
+    delete iAlias;	
+    delete iScreenClearer;	
+    delete iSendReadReportOperation;
+AMSLOGGER_WRITE( "CAudioMessageAppUi::~CAudioMessageAppUi ends" );       
+  }
+
+// ---------------------------------------------------------
+// CAudioMessageAppUi::LaunchViewL
+// ---------------------------------------------------------
+//
+void CAudioMessageAppUi::LaunchViewL()
+    {
+    AMSLOGGER_WRITE( "CAudioMessageAppUi::LaunchViewL >>" ); 
+    if ( iEditorFlags & EEditorExiting )
+        {
+        // Start the delayed exit here if exit command was given before application was
+        // ready to handle it. Delayed exit is used as LauchViewL cannot 
+        // make proper exit if Exit() is called here.
+        //DoDelayedExitL( 0 );
+        return;
+        }
+    Document()->SetClipStatus( EAmsClipNone );
+    iMtm = &( Document()->Mtm() );
+    const TMsvEntry& entry = Document()->Entry();
+    if ( entry.iType.iUid != KUidMsvMessageEntryValue )
+        {
+        User::Leave( KErrGeneral );
+        }
+
+    TRAPD( error, iMtm->LoadMessageL() );
+    if ( error )
+        {
+        if ( error != KErrNoMemory )
+            {
+            ShowErrorNoteL( R_AUDIOMESSAGE_ERROR_MSG_CORRUPT, ETrue );
+            }
+        User::Leave( error );
+        }
+
+    delete iAbsorber;
+    iAbsorber = NULL;
+
+    Document()->SetMessageType();
+
+  	if ( !iMtm->Entry().Entry().ReadOnly() ) // editor
+    	{
+    	//SendKey disabled
+    	iAvkonAppUi->SetKeyEventFlags( 
+            CAknAppUiBase::EDisableSendKeyShort | 
+            CAknAppUiBase::EDisableSendKeyLong ); 
+               
+    	SetFixedToolbarL( R_AMSEDITOR_APP_TOOLBAR );
+    	iView = CMsgEditorView::NewL( *this,
+        CMsgEditorView::EMsgDoNotUseDefaultBodyControl );
+
+      	// Add TO-control to editor
+      	iView->AddControlFromResourceL(
+          	R_AUDIOMESSAGE_TO,
+          	EMsgAddressControl,
+          	EMsgAppendControl,
+          	EMsgHeader );
+
+	    // If editor opened from Phonebook or Logs details must be checked
+	    // so we can add address/alias to Recipient -field
+	    const TPtrC details = iMtm->Entry().Entry().iDetails;
+
+	  	// Message in draft folder OR opening with data in address -field
+	    if ( entry.iMtmData1 & KMmsMessageEditorOriented
+	         || details.Length() 
+	         || iMtm->Entry().Entry().Parent() == KMsvDraftEntryIdValue )
+	    	{
+	      	// Set name/number
+	      	InsertRecipientL();
+	    	}
+	    // Restore AddressControl's input mode
+	    CMsgAddressControl* to = ToCtrl();
+	    TInt inputMode = EAknEditorNumericInputMode;
+	  	if ( iSettingsRepository )
+	        {
+	        iSettingsRepository->Get( KMuiuToInputMode, inputMode );
+	    	}
+	    to->Editor().SetAknEditorInputMode( inputMode );
+	    Document()->SetAppMode( EAmsEditor );   	
+	   	InitEditorNaviPaneL();
+
+	   	//End key should not close application in editor
+	   	CMsgEditorAppUi::SetCloseWithEndKey( EFalse);
+	   	}
+	else // viewer
+    	{
+    	SetFixedToolbarL( R_AMSVIEWER_APP_TOOLBAR );
+    	iView = CMsgEditorView::NewL( *this,
+        	CMsgEditorView::EMsgReadOnly |
+        	CMsgEditorView::EMsgDoNotUseDefaultBodyControl );
+
+      	Document()->SetAppMode( EAmsViewer );
+      	// Message in sent folder or moved from sent to documents	
+        if ( entry.iMtmData1 & KMmsMessageEditorOriented  
+             || entry.Parent() == KMsvSentEntryIdValue )
+      		{
+      		// Add TO -control to viewer and set name/number
+      		InsertRecipientL();
+      		}
+    	else // Message in inbox
+	      	{
+	      	// Add FROM -control to viewer and set name/number
+	      	SetSenderL();
+	      	// Add SUBJECT -control to viewer and set subject
+	      	SetSubjectL();
+	      	}
+	    Document()->SetInsertedStatus( EAmsInsideMessage );  	
+    	InitViewerNaviPaneL();
+    	}
+    
+
+    iView->SetEdwinObserverL( this );
+    iLaunchOperation = CAudioMessageLaunchOperation::NewL(
+        *this,
+        *Document(),
+        *iView );
+    iLaunchOperation->Launch();
+ 
+    ShowWaitNoteL( R_QTN_AUDIOMESSAGE_WAIT_OPENING_EDITOR );
+    AMSLOGGER_WRITE( "CAudioMessageAppUi::LaunchViewL <<" ); 
+    }
+
+
+// ---------------------------------------------------------
+// CAudioMessageAppUi::FinalizeLaunchL
+// ---------------------------------------------------------
+//
+void CAudioMessageAppUi::FinalizeLaunchL()
+    {
+    AMSLOGGER_WRITE( "CAudioMessageAppUi::FinalizeLaunchL >>" ); 
+    if ( iEditorFlags & EEditorExiting )
+        {
+        // Start the delayed exit here if exit command was given before application was
+        // ready to handle it. Delayed exit is used as LauchViewL cannot 
+        // make proper exit if Exit() is called here.
+        //DoDelayedExitL( 0 );
+        return;
+        }
+    
+    SetAddressSize();
+    
+    if ( Document()->GetClipStatus() == EAmsClipAttachment )
+      	{
+      	FetchAudioFileDataL() ;
+      	}
+
+    if ( !iMtm->Entry().Entry().ReadOnly() )//editor
+      	{
+      	iView->ExecuteL( ClientRect(), EMsgComponentIdImage );
+      	if ( Document()->GetInsertedStatus() == EAmsSmilAdded ) // from gallery and smil added
+      		{
+      	    iView->SetFocus( EMsgComponentIdTo );
+      	    ShowInformationNoteL( R_AUDIOMESSAGE_INSERTED, EFalse );
+      		}
+      	else
+      	    {
+      	    iView->SetFocus( EMsgComponentIdImage );
+      	    }	
+        }
+    else //viewer
+      	{
+      	iView->ExecuteL( ClientRect(), EMsgComponentIdNull );
+      	iView->SetFocus( EMsgComponentIdImage );
+      	SetFindMode( iEditorFlags & EAutohighLightEnabled ) ;
+        SetViewerToolBarItemVisibilities();
+        }
+    SetTitleIconL();
+    AMSLOGGER_WRITE( "CAudioMessageAppUi::FinalizeLaunchL <<" ); 
+    }
+
+// ---------------------------------------------------------
+// CAudioMessageAppUi::HandleCommandL
+// Error: EGWG-7HWE2P : Purushotham Reddy K
+// ---------------------------------------------------------
+//
+void CAudioMessageAppUi::HandleCommandL( TInt aCommand )
+    {
+    TRAPD( error, DoHandleCommandL( aCommand ) );
+    if ( error != KErrNone )    
+        {
+        AMSLOGGER_WRITEF( _L("iHandleCommandL: LEAVE (%d) "), error ); 
+        iEditorFlags &= ~EProgressInUse;
+        delete iAbsorber;
+        iAbsorber = NULL;
+        
+        //See the code where the following has been set EFalse
+        iAvkonAppUi->Cba()->MakeVisible( ETrue );
+        iInserting = EFalse;
+        iView->MakeVisible( ETrue );
+        //EGWG-7HWE2P
+        if(error == KErrInUse)
+            {
+            //If this error is due to record is already in use in another message editor,
+            //then de-highlight the record button.
+            iToolbar->SetItemDimmed(EAmsEditorToolbarRecord, EFalse, ETrue);
+            }
+        User::Leave( error );
+        }
+    }
+
+// ---------------------------------------------------------
+// CAudioMessageAppUi::SetFixedToolbarL
+// ---------------------------------------------------------
+//
+void CAudioMessageAppUi::SetFixedToolbarL( const TInt aResId )
+    {
+#ifdef RD_SCALABLE_UI_V2
+    if ( AknLayoutUtils::PenEnabled() && !iToolbar)
+    	{
+    	CEikAppUiFactory* appUiFactory 
+    	    = static_cast<CEikAppUiFactory*>( iEikonEnv->AppUiFactory() );
+        CAknToolbar* oldFixedToolbar = appUiFactory->CurrentFixedToolbar();
+        iToolbar = CAknToolbar::NewL( aResId );
+        iToolbar->SetToolbarObserver( this );
+        
+        if ( oldFixedToolbar != iToolbar )
+            {
+            oldFixedToolbar->SetToolbarVisibility( EFalse );    
+            }
+        appUiFactory->SetViewFixedToolbar( iToolbar );    	
+        iToolbar->SetToolbarVisibility( ETrue, EFalse ); 
+    	}
+    else if ( AknLayoutUtils::PenEnabled() && iToolbar )
+        {
+        CEikAppUiFactory* appUiFactory = static_cast<CEikAppUiFactory*>( iEikonEnv->AppUiFactory() );
+        CAknToolbar* oldFixedToolbar = appUiFactory->CurrentFixedToolbar();
+        if ( oldFixedToolbar != iToolbar )
+            {
+            oldFixedToolbar->SetToolbarVisibility( EFalse );
+            appUiFactory->SetViewFixedToolbar( iToolbar );     
+            }
+        }
+
+    #endif
+    return;
+    }
+
+
+// ---------------------------------------------------------
+// CAudioMessageAppUi::HandleCommandL
+// ---------------------------------------------------------
+//
+void CAudioMessageAppUi::DoHandleCommandL(TInt aCommand)
+    {
+AMSLOGGER_WRITE( "CAudioMessageAppUi::HandleCommandL >>" ); 
+    if ( iEditorFlags & EEditorExiting )
+        {
+        // Do not handle any event if we are exiting.
+        return;
+        }
+    
+    if ( !( iEditorFlags & ELaunchSuccessful ) )
+        {
+        if ( aCommand == EEikCmdExit )
+            {
+            if ( !Document()->IsLaunched() )
+                {
+                //We come here e.g. when editor is started in very low memory
+                iEditorFlags |= EEditorExiting;
+                DoDelayedExitL( 0 );
+                return;
+                }   
+            }
+        else
+            {
+            // Do not handle other than exit command if application has not
+            // finished launching.
+            return;
+            }    
+        }
+
+  	if ( iFindItemMenu && iFindItemMenu->CommandIsValidL( aCommand ) )
+    	{
+    	iFindItemMenu->HandleItemFinderCommandL( aCommand );
+    	return;
+    	}
+    switch ( aCommand )
+        {
+        case EAmsEditorCmdSend:
+            DoUserSendL();
+            break;
+        case EAmsEditorCmdAddRecipient:
+            DoUserAddRecipientL();
+          	break;
+        case EAmsViewerCmdSaveAudio:
+        case EAmsEditorCmdSaveAudio:
+          	SaveAudioClipL();
+          	break;
+        case EAmsEditorCmdPlayAudio:
+            PlayAudioL();
+            break;
+        case EAmsViewerCmdForward:
+          	DoForwardL();
+          	break;
+        case EAmsViewerCmdRemoveAudio:
+          	DeleteMessageL();
+          	break;
+        case EAmsEditorCmdMessageInfo:
+            DoUserMessageInfoL();
+            break;
+        case EAmsViewerCmdDeliveryStatus:
+            OpenDeliveryPopupL();
+            break;
+        case EAmsViewerCmdMoveToFolder:
+            DoMoveMessageL();
+            break;
+        case EAknCmdHelp:
+            LaunchHelpL();
+            break;
+    	case EAknCmdExit:
+        case EEikCmdExit:
+            ExitAndSaveL( );
+            break;
+        // Reply submenu commands
+        case EAmsViewerCmdReplyToSender:
+          	DoReplyViaL( EReplyToSender );
+          	break;
+        case EAmsViewerCmdReplyToAll:
+          	DoReplyViaL( EReplyToAll );
+          	break;       
+        case EAmsViewerCmdReplyViaMessage:
+          	DoReplyViaL( EReplyViaMessage );
+          	break;          	
+        case EAmsEditorCmdRecordAudio:
+           	InsertAudioL( ETrue );
+            break;
+        case EAmsEditorCmdFromGallery:
+            InsertAudioL( EFalse );
+            break;
+        case EAmsEditorCmdReRecordAudio:
+            InsertAudioL( ETrue );
+            break;
+        case EAmsEditorCmdFromGallery2:
+            InsertAudioL( EFalse );
+          	break;
+        // Button commands
+        case EAknSoftkeyClose:
+            DoBackSaveL();
+            break;
+        case EAmsSoftkeyAdd:
+            // Call this function so that check name functionality is called first
+        	DoSelectionKeyL( );
+        	break;
+        case EAmsSoftkeyPlay:
+        	PlayAudioL();
+        	break;
+        case EAmsSoftkeyRecord:
+        	InsertAudioL( ETrue );
+        	break;
+        case EAmsEditorCmdChangePriority:
+            DoEditAmsPriorityL( );
+            break;
+        case EAmsDispSizeAutomatic:
+        case EAmsDispSizeLarge:
+        case EAmsDispSizeNormal:
+        case EAmsDispSizeSmall:
+            DoHandleLocalZoomChangeL( aCommand );
+            break;        	
+        default:
+            CMsgEditorAppUi::HandleCommandL( aCommand );
+            break;
+        }
+    AMSLOGGER_WRITE( "CAudioMessageAppUi::HandleCommandL <<" ); 
+    }
+
+// ---------------------------------------------------------
+// CAudioMessageAppUi::EditorObserver
+// ---------------------------------------------------------
+//
+void CAudioMessageAppUi::EditorObserver( TMsgEditorObserverFunc aFunc, TAny* aArg1,
+  TAny* aArg2, TAny* aArg3 )
+    {
+    TRAP_IGNORE( DoEditorObserverL( aFunc,aArg1,aArg2,aArg3 ) );
+    }
+
+// ---------------------------------------------------------
+// CAudioMessageAppUi::DoEditorObserverL
+// ---------------------------------------------------------
+//
+void CAudioMessageAppUi::DoEditorObserverL( TMsgEditorObserverFunc aFunc, TAny* aArg1,
+  TAny* aArg2, TAny*/* aArg3*/ )
+    {
+    
+    switch ( aFunc )
+        {
+        case MMsgEditorObserver::EMsgHandleFocusChange:   
+	        {
+AMSLOGGER_WRITE( "DoEditorObserverL: EMsgHandleFocusChange" ); 	        
+	        TMsgFocusEvent event = *( static_cast<TMsgFocusEvent*>( aArg1 ) );  
+					// Handling of SendKey in Viewer mode
+					if ( Document()->GetAppMode() == EAmsViewer )
+						{
+						if((event == EMsgFocusToHeader) && (iSenderType == ESenderTypePhoneNumber))
+							{
+							//disable dialer
+							iAvkonAppUi->SetKeyEventFlags( 
+			    				CAknAppUiBase::EDisableSendKeyShort | 
+			    				CAknAppUiBase::EDisableSendKeyLong ); 	
+							}
+							else if(event == EMsgFocusToBody)
+							{
+							//enable dialer
+							iAvkonAppUi->SetKeyEventFlags( 0x00); 
+							}	
+						}
+	        if( event == EMsgFocusMovedTo )
+                {
+                SetNaviPaneL( );
+                UpdateSoftKeysL(); 
+                }
+	        }
+	        break;
+	    
+	    
+#ifdef RD_SCALABLE_UI_V2	    
+	    case MMsgEditorObserver::EMsgControlPointerEvent:
+            {
+            TPointerEvent* ptrEvent = static_cast<TPointerEvent*>( aArg2 );    
+            if ( Document()->GetAppMode() == EAmsViewer )
+            	{
+            	CMsgBaseControl* control = static_cast<CMsgBaseControl*>( aArg1 );
+            	if(control)
+	            	{
+	            	TInt id = control->ControlId();	            
+								if(id == EMsgComponentIdFrom && iSenderType == ESenderTypePhoneNumber)
+									{     
+									//disable dialer
+									iAvkonAppUi->SetKeyEventFlags( 
+				    					CAknAppUiBase::EDisableSendKeyShort | 
+				    					CAknAppUiBase::EDisableSendKeyLong ); 								
+									}
+								else            
+									{
+	                	//enable dialer
+									iAvkonAppUi->SetKeyEventFlags( 0x00);
+									}
+	            	}
+            	}           
+     	    if ( ptrEvent->iType == TPointerEvent::EButton1Down )
+    	        {
+        	        TPoint point = ptrEvent->iPosition;
+        	        
+        	        TRect bodyRect = iView->FormComponent( EMsgBody ).Rect();
+        	        TRect focusedRect = iView->FocusedControl()->Rect();
+        	        //the bodyrect was already focused i.e not the first press
+        	        if ( bodyRect == focusedRect )
+        	            {
+        	            TSize frameSize = iLaunchOperation->FrameSize();
+                        bodyRect.Shrink((bodyRect.Width()-frameSize.iWidth)/2,
+                            (bodyRect.Height()-frameSize.iHeight)/2);
+                        
+            	        if ( bodyRect.Contains( point ) )
+                            {//the image is clicked - the nth time
+                   	        if ( Document()->GetClipStatus() != EAmsClipNone )
+                			    {
+                			    HandleCommandL( EAmsEditorCmdPlayAudio );
+                			    }
+                    		//there is no any clip, so try to record new.
+                	    	else
+                	    		{
+                	    		HandleCommandL(EAmsEditorCmdRecordAudio);
+                            	}
+                            }
+        	            }
+    	        }
+                
+            break;
+            }
+ #endif //RD_SCALABLE_UI_V2           
+  
+	    case MMsgEditorObserver::EMsgButtonEvent:
+            {
+AMSLOGGER_WRITE( "DoEditorObserverL: EMsgButtonEvent" );            
+            CMsgAddressControl* toControl = ToCtrl();
+			if( toControl == static_cast<CMsgAddressControl*>( aArg1 ) )
+				{
+                TBool modified = EFalse;
+                if ( toControl->GetRecipientsL()->Count() )
+                    {
+                    // Recipients found. Verify addresses.
+                    if ( !VerifyAddressesL( modified ) )
+                        {
+                        // Illegal address found.
+                        modified = ETrue;
+                        }
+                    }
+                if ( !modified )//else
+                    {
+                    // Nothing changed on the UI. Open PhoneBook.
+                   HandleCommandL( EAmsEditorCmdAddRecipient ); 
+                    }
+				}
+            }
+            break;
+        default:
+            break;
+        } 
+    }
+
+// ---------------------------------------------------------
+// CAudioMessageAppUi::FetchFileL
+// ---------------------------------------------------------
+//
+TBool CAudioMessageAppUi::FetchFileL( TFileName &aFileName )
+    {
+    AMSLOGGER_WRITE( "CAudioMessageAppUi::FetchFileL >>" ); 
+    CDesCArrayFlat* dummy = new ( ELeave ) CDesCArrayFlat( 1 );
+    CleanupStack::PushL( dummy );
+    //TFileName fileName;
+
+    TBool fetchOK = MsgAttachmentUtils::FetchFileL(
+        MsgAttachmentUtils::EAudio,
+        //fileName,
+        aFileName,
+        *dummy,
+        ETrue,
+        EFalse,
+        this );
+    //aFileName = fileName;
+    CleanupStack::PopAndDestroy( dummy );
+    AMSLOGGER_WRITE( "CAudioMessageAppUi::FetchFileL <<" ); 
+    return fetchOK;
+    }
+
+// ---------------------------------------------------------
+// CAudioMessageAppUi::VerifySelectionL
+// ---------------------------------------------------------
+//
+TBool CAudioMessageAppUi::VerifySelectionL( const MDesCArray* aSelectedFiles )
+    {
+   	AMSLOGGER_WRITE( "CAudioMessageAppUi::VerifySelectionL >>" ); 
+	CAknInputBlock::NewLC();
+	
+   	TBool ret = EFalse;
+    if ( aSelectedFiles->MdcaCount() == 1 )
+        {
+        TPtrC ptr = aSelectedFiles->MdcaPoint( 0 );
+        if ( CreateMediaInfoForInsertL( ptr ) )
+            {
+            ret = ETrue;
+            }
+        }
+
+    CleanupStack::PopAndDestroy(); //input blocker
+    AMSLOGGER_WRITE( "CAudioMessageAppUi::VerifySelectionL <<" ); 
+    return ret;
+    }
+
+// ---------------------------------------------------------
+// CAudioMessageAppUi::HandleEdwinEventL
+//
+// Performs character counter updating if neccessary. This is needed
+// for supporting on-screen keyboard. Normally character input
+// is handled already on OfferKeyEventL function but it does no
+// harm to do it here again.
+// ---------------------------------------------------------
+//
+void CAudioMessageAppUi::HandleEdwinEventL( CEikEdwin* /*aEdwin*/, TEdwinEvent aEventType )
+    {
+    AMSLOGGER_WRITE( "CAudioMessageAppUi::HandleEdwinEventL >>" ); 
+    if ( aEventType == MEikEdwinObserver::EEventTextUpdate )
+        {
+        HandleCharInputL();
+        }
+    AMSLOGGER_WRITE( "CAudioMessageAppUi::HandleEdwinEventL <<" ); 
+    }
+
+// ---------------------------------------------------------
+// CAudioMessageAppUi::HandleKeyEventL
+// ---------------------------------------------------------
+//
+TKeyResponse CAudioMessageAppUi::HandleKeyEventL(
+    const TKeyEvent& aKeyEvent,
+    TEventCode aType )
+    {
+    AMSLOGGER_WRITE( "CAudioMessageAppUi::HandleKeyEventL >>" ); 
+    if(iEditorFlags & EProgressInUse)
+    	{
+        return EKeyWasNotConsumed;
+    	}
+    
+    if (!(iEditorFlags & ELaunchSuccessful))
+    	{
+        return EKeyWasNotConsumed;
+    	}
+    // still launching
+    if ( !Document()->IsLaunched() )
+        {
+        return EKeyWasNotConsumed;
+        }
+   	if ( iInserting )
+      	{
+        return EKeyWasNotConsumed;
+      	}
+
+    if ( iView && !IsDisplayingMenuOrDialog() )
+        {
+        switch ( aKeyEvent.iCode )
+        	{
+            case EKeyLeftArrow:
+#ifdef RD_MSG_NAVIPANE_IMPROVEMENT            
+               	if ( Document()->GetAppMode() == EAmsViewer &&
+               			IsNextMessageAvailableL( EFalse ))
+                	{
+                   	NextMessageL( EFalse );
+                	}
+#else
+                if ( Document()->GetAppMode() == EAmsViewer &&
+               			iNaviPane->Top() == iNavi_next_prev_msg_arrows &&
+               			IsNextMessageAvailableL( EFalse ))
+                	{
+                   	NextMessageL( EFalse );
+                	}
+#endif            
+    	
+                break;
+          	case EKeyRightArrow:
+#ifdef RD_MSG_NAVIPANE_IMPROVEMENT          	
+                if ( Document()->GetAppMode() == EAmsViewer &&
+              			IsNextMessageAvailableL( ETrue ))
+                	{
+                   	NextMessageL( ETrue );
+                	}
+#else
+                if ( Document()->GetAppMode() == EAmsViewer &&
+              			iNaviPane->Top() == iNavi_next_prev_msg_arrows &&
+              			IsNextMessageAvailableL( ETrue ))
+                	{
+                   	NextMessageL( ETrue );
+                	}
+#endif                	
+                break;
+           	case EKeyOK: // Selection key: Show context menus OR play/record clip
+                {
+                if ( Document()->GetAppMode() == EAmsEditor )
+                  	{
+                  	HandleCommandL( EAmsSoftkeyAdd );
+                  	return EKeyWasConsumed;
+                  	}
+                else
+                  	{
+                  	CMsgBaseControl* ctrl = iView->FocusedControl();
+                  	if (  ctrl->ControlId() == EMsgComponentIdImage)
+                    	{
+                    	HandleCommandL( EAmsSoftkeyAdd );
+                    	}
+                  	else
+                    	{
+                    	MenuBar()->SetMenuTitleResourceId( R_AUDIOMESSAGE_VIEWER_SELECTMENU );
+                    	MenuBar()->SetMenuType(CEikMenuBar::EMenuContext);
+                    	TRAP_IGNORE(MenuBar()->TryDisplayMenuBarL());
+                    	MenuBar()->SetMenuTitleResourceId( R_AUDIOMESSAGE_MENUBAR );
+                    	MenuBar()->SetMenuType(CEikMenuBar::EMenuOptions);
+                    	return EKeyWasConsumed;
+                    	}
+
+                  	}
+                return EKeyWasConsumed;
+                }
+           	case EKeyYes:
+                {
+                if ( Document()->GetAppMode() == EAmsEditor )
+                  	{
+                  	// CallCreationKey: Send message if recipients and audio clip exists.
+                  	//                  Otherwise fetch recipients
+                  	if ( !IsHeaderEmpty() &&
+                     		( !IsBodyEmpty() ||
+                       		Document()->GetClipStatus() != EAmsClipNone ) )
+                      	{
+                      	// has address/es and audio clip inserted/recorded -> Send
+                      	HandleCommandL( EAmsEditorCmdSend );
+                      	}
+                  	else if ( IsHeaderEmpty() )
+                      	{
+                      	HandleCommandL( EAmsEditorCmdAddRecipient ); 
+                      	}
+                  	else if ( IsBodyEmpty() )
+                    	{
+                    	ShowInformationNoteL( R_AUDIOMESSAGE_INFO_CANNOT_SEND, EFalse );
+                    	}
+                  	}
+                else
+                  	{
+                  	// if from field not having a valid phone number, show dialer
+                  	CMsgBaseControl* ctrl = iView->FocusedControl();
+                  	if(	iSenderType == ESenderTypePhoneNumber && 
+                  		ctrl && ctrl->ControlId() == EMsgComponentIdFrom)
+	             				{
+	             				DoCallToSenderL();									
+                  		}
+                	else
+											{
+                  		iAvkonAppUi->SetKeyEventFlags( 0x00);
+											}
+                  	}
+                return EKeyWasConsumed;
+                }
+            case EKeyBackspace:
+            case EKeyDelete:
+                {
+                CMsgBaseControl* ctrl = iView->FocusedControl();
+                if ( ctrl && ctrl->ControlId() == EMsgComponentIdImage &&
+                   		Document()->GetAppMode() == EAmsEditor  &&
+                   		!IsBodyEmpty()  )
+                	{
+                    RemoveAudioL();
+                    return EKeyWasConsumed;
+                    }
+                 if ( Document()->GetAppMode() == EAmsViewer )
+                 	{
+                    HandleCommandL( EAmsViewerCmdRemoveAudio );
+                    return EKeyWasConsumed;
+                 	}
+                }
+            	break;
+            case EKeyEnter:
+            	{
+              	if (DoEnterKeyL() )
+                	{
+                  	return EKeyWasConsumed;
+                  	}
+              	break;
+              	}
+        	case EKeyNull:
+        		if( aKeyEvent.iScanCode == 0xA5 /*EStdKeySpace*/ )
+        			{
+       				SetNaviPaneL( );
+        			}
+        		break;
+            default:
+                break;
+            }
+
+        switch ( aKeyEvent.iScanCode )
+            {
+            case EStdKeyUpArrow:
+                // FALLTHROUGH
+            case EStdKeyDownArrow:
+                // FALLTHROUGH
+            case EStdKeyLeftArrow:
+                // FALLTHROUGH
+            case EStdKeyRightArrow:
+                // FALLTHROUGH
+            case EStdKeyDevice1: // Close key
+                // FALLTHROUGH
+            case EStdKeyRightShift: // Shift
+                // FALLTHROUGH
+            case EStdKeyApplication0: // Task switching
+    AMSLOGGER_WRITE( "CAudioMessageAppUi::HandleKeyEventL <<" ); 
+                return CMsgEditorAppUi::HandleKeyEventL( aKeyEvent, aType );
+            default:
+                break;
+            }
+
+        TKeyResponse resp = CMsgEditorAppUi::HandleKeyEventL( aKeyEvent, aType );
+
+        if ( aType == EEventKeyUp )
+            {
+            // Check if character inserted to controls
+            HandleCharInputL();
+            }
+AMSLOGGER_WRITE( "CAudioMessageAppUi::HandleKeyEventL <<" ); 
+
+        return resp;
+        }
+    else
+        {
+    AMSLOGGER_WRITE( "CAudioMessageAppUi::HandleKeyEventL <<" ); 
+        return CMsgEditorAppUi::HandleKeyEventL( aKeyEvent, aType );
+        }
+    }
+
+// ---------------------------------------------------------
+// CAudioMessageAppUi::HandleCharInputL
+// ---------------------------------------------------------
+//
+void CAudioMessageAppUi::HandleCharInputL()
+    {
+    AMSLOGGER_WRITE( "CAudioMessageAppUi::HandleCharInputL >>" ); 
+    if ( Document()->IsLaunched() )
+        {
+        CMsgBaseControl* ctrl = iView->FocusedControl();
+        TBool changed = EFalse;
+
+        if ( ctrl )
+            {
+            switch ( ctrl->ControlId() )
+                {
+                case EMsgComponentIdTo:
+                    if ( ctrl->IsModified() )
+                        {
+                  		Document()->SetHeaderModified( ETrue );
+                        changed = ETrue;
+                        }
+                    SetAddressSize();
+                    break;
+                case EMsgComponentIdFirstFreeEditorSpecificId:
+                  	if ( ctrl->IsModified() )
+                    	{
+                    	Document()->SetBodyModified( ETrue );
+                    	changed = ETrue;
+                    	}
+                  	break;
+                default:
+                    break;
+                }
+            }
+        if ( changed )
+            {
+      		SetNaviPaneL( );
+            }
+        }
+    AMSLOGGER_WRITE( "CAudioMessageAppUi::HandleCharInputL <<" ); 
+    }
+
+// ---------------------------------------------------------
+// CAudioMessageAppUi::DynInitMenuPaneL
+// ---------------------------------------------------------
+//
+void CAudioMessageAppUi::DynInitMenuPaneL( TInt aResourceId, CEikMenuPane* aMenuPane )
+    {
+    AMSLOGGER_WRITE( "CAudioMessageAppUi::DynInitMenuPaneL >>" ); 
+    // Confirm app is running properly 
+    if ( !Document()->IsLaunched() )
+        {
+        // If not, hide everything and return
+        TInt amountOfItems = aMenuPane->NumberOfItemsInPane();
+        if ( amountOfItems )
+            {
+            aMenuPane->DeleteBetweenMenuItems( 0, amountOfItems-1 );
+            return;
+            }
+        }
+
+  	if ( !iFindItemMenu )
+        {
+        iFindItemMenu = CFindItemMenu::NewL( EFindItemMenuPlaceHolder );
+        if ( SenderType() == ESenderTypeMailAddress )
+            {
+            // Set sender type to find menu
+            iFindItemMenu->SetSenderDescriptorType( CItemFinder::EEmailAddress );
+            }
+    else
+        {
+            // Set sender type to find menu
+            iFindItemMenu->SetSenderDescriptorType( CItemFinder::EPhoneNumber );
+            }
+        }
+
+    switch ( aResourceId )
+        {
+        case R_AUDIOMESSAGE_MAIN_MENU:
+            {
+            if ( !iMtm->Entry().Entry().ReadOnly() ) // editor
+              	{
+                /*if ( Document()->GetClipStatus() == EAmsClipNone )
+              		{
+              		aMenuPane->SetItemDimmed( EAmsEditorCmdSend, ETrue );
+              		}*/
+              	if ( Document()->GetClipStatus() == EAmsClipNone )
+	                {
+	                aMenuPane->SetItemDimmed( EAmsEditorSubmenuReplaceAudioCommands, ETrue );
+	                aMenuPane->SetItemDimmed( EAmsEditorCmdPlayAudio, ETrue );
+	                aMenuPane->SetItemDimmed( EAmsEditorCmdSaveAudio, ETrue );
+	                }
+	            else
+                	{
+                	aMenuPane->SetItemDimmed( EAmsEditorSubmenuInsertAudioCommands, ETrue );
+                	}
+              	if ( Document()->GetClipStatus() == EAmsClipFromGallery )
+                	{
+                	aMenuPane->SetItemDimmed( EAmsEditorCmdSaveAudio, ETrue );
+                	}
+              	if ( !( iSupportedFeatures & EUniFeatureHelp ) )
+                  	{
+                  	aMenuPane->SetItemDimmed( EAknCmdHelp, ETrue );
+                  	}
+              	aMenuPane->SetItemDimmed( EAmsViewerCmdSaveAudio, ETrue );
+	            aMenuPane->SetItemDimmed( EAmsViewerCmdSubmenuReply, ETrue );
+	            aMenuPane->SetItemDimmed( EAmsViewerCmdForward, ETrue );
+	            aMenuPane->SetItemDimmed( EFindItemMenuPlaceHolder, ETrue );
+	            aMenuPane->SetItemDimmed( EAmsViewerCmdDeliveryStatus, ETrue );
+	            aMenuPane->SetItemDimmed( EAmsViewerCmdMoveToFolder, ETrue );
+	            aMenuPane->SetItemDimmed( EAmsViewerCmdRemoveAudio, ETrue );              	
+              	if ( !(iSupportedFeatures & EUniFeaturePriority) )              	
+				    {
+				    aMenuPane->SetItemDimmed( EAmsEditorCmdChangePriority, ETrue );
+				   	}
+              	}
+            else // viewer 
+              	{
+            	const TPtrC details = iMtm->Entry().Entry().iDetails;
+
+                if( (FocusedControlId( ) == EMsgComponentIdFrom) && ( ( iMtm->Sender( ) ).Length() ) )
+                    {
+                    iFindItemMenu->SetSenderHighlightStatus( ETrue );
+                    iFindItemMenu->SetSenderDisplayText( TMmsGenUtils::PureAddress( iMtm->Sender( ) ) );
+                    }
+	            else
+	     	        {
+                    iFindItemMenu->SetSenderHighlightStatus( EFalse );
+		            }
+              	iFindItemMenu->AddItemFindMenuL (
+                  	0,
+                  	aMenuPane,
+                  	EFindItemMenuPlaceHolder,
+                  	TMmsGenUtils::PureAddress( iMtm->Sender() ),
+          			( details.Length() == 0 ),
+                  	EFalse );
+          		//in sent folder reply is dimmed
+               	if ( iMtm->Entry().Entry().Parent() == KMsvSentEntryIdValue )
+                	{
+                    aMenuPane->SetItemDimmed( EAmsViewerCmdSubmenuReply, ETrue );
+                	}
+        		if ( iMtm->Sender().Length() <= 0 )
+        			{
+                  	aMenuPane->SetItemDimmed( EAmsViewerCmdSubmenuReply, ETrue );
+        			}
+	            aMenuPane->SetItemDimmed( EAmsEditorCmdSaveAudio, ETrue );
+	            aMenuPane->SetItemDimmed( EAmsEditorCmdSend, ETrue );
+	            aMenuPane->SetItemDimmed( EAmsEditorCmdAddRecipient, ETrue );
+	            aMenuPane->SetItemDimmed( EAmsEditorSubmenuInsertAudioCommands, ETrue );
+	            aMenuPane->SetItemDimmed( EAmsEditorSubmenuReplaceAudioCommands, ETrue );
+	            aMenuPane->SetItemDimmed( EAmsEditorCmdChangePriority, ETrue );          
+                if (! (     iSupportedFeatures & EUniFeatureDeliveryStatus  
+                        && ( ( Document( )->Entry( ).iMtmData2 & KMmsDeliveryStatusMask) 
+                        != KMmsDeliveryStatusNotRequested ) ) )
+                    {
+    		        aMenuPane->SetItemDimmed( EAmsViewerCmdDeliveryStatus, ETrue );
+                    }
+              	if ( !( iSupportedFeatures & EUniFeatureHelp ) )
+                  	{
+                  	aMenuPane->SetItemDimmed( EAknCmdHelp, ETrue );
+                  	}
+
+              	}
+            }
+            break;
+        case R_AUDIOMESSAGE_VIEWER_CONTEXT_MENU://call, reply fw, delete
+          	{
+          	const TPtrC details = iMtm->Entry().Entry().iDetails;
+            if( (FocusedControlId( ) == EMsgComponentIdFrom) && ( ( iMtm->Sender( ) ).Length() ) )
+                {
+                iFindItemMenu->SetSenderHighlightStatus( ETrue );
+                iFindItemMenu->SetSenderDisplayText( TMmsGenUtils::PureAddress( iMtm->Sender( ) ) );
+                }
+            else
+     	        {
+                iFindItemMenu->SetSenderHighlightStatus( EFalse );
+	            }
+          	iFindItemMenu->AddItemFindMenuL (
+            	0,
+        		aMenuPane,
+              	EFindItemContextMenuPlaceHolder,
+              	TMmsGenUtils::PureAddress( iMtm->Sender() ),
+        		( details.Length() != 0 ), //"Is sender known"
+            	ETrue );
+            // no items dimmed for now
+          	if ( iMtm->Sender().Length() <= 0 )
+          		{
+              	aMenuPane->SetItemDimmed( EAmsViewerCmdSubmenuReply, ETrue );
+          		}
+          	break;
+          	}
+        case R_AUDIOMESSAGE_ZOOM_SUBMENU:
+            {
+            TInt zoomLevel = KErrGeneral;
+            iMsgEditorAppUiExtension->iSettingCachePlugin.GetValue( KAknLocalZoomLayoutSwitch, 
+                                                                    zoomLevel );
+            switch ( zoomLevel )
+                {
+                case EAknUiZoomAutomatic:
+                    {
+                    aMenuPane->SetItemButtonState( EAmsDispSizeAutomatic,
+                                                   EEikMenuItemSymbolOn );
+                    break;
+                    }
+                case EAknUiZoomNormal:
+                    {
+                    aMenuPane->SetItemButtonState( EAmsDispSizeNormal,
+                                                   EEikMenuItemSymbolOn );
+                    break;
+                    }
+                case EAknUiZoomSmall:
+                    {
+                    aMenuPane->SetItemButtonState( EAmsDispSizeSmall,
+                                                   EEikMenuItemSymbolOn );
+                    break;
+                    }
+                case EAknUiZoomLarge:
+                    {
+                    aMenuPane->SetItemButtonState( EAmsDispSizeLarge,
+                                                   EEikMenuItemSymbolOn );
+                    break;
+                    }
+                default:
+                    {
+                    break;
+                    }
+                }
+            break;
+            }  	
+       	case R_AUDIOMESSAGE_REPLY_SUBMENU:
+        	{
+            if ( iMtm->AddresseeList().Count() < 2  )
+            	{
+                aMenuPane->SetItemDimmed( EAmsViewerCmdReplyToAll, ETrue );
+            	}
+        	break;
+        	}
+        default:
+          	if ( iFindItemMenu )
+            	{
+        		iFindItemMenu->UpdateItemFinderMenuL( aResourceId, aMenuPane );
+            	}
+          	break;
+        }
+    AMSLOGGER_WRITE( "CAudioMessageAppUi::DynInitMenuPaneL <<" ); 
+    }
+
+// ---------------------------------------------------------
+// CAudioMessageAppUi::IsMessageEmpty
+// ---------------------------------------------------------
+//
+TBool CAudioMessageAppUi::IsMessageEmpty() const
+    {
+    AMSLOGGER_WRITE( "CAudioMessageAppUi::IsMessageEmpty >>" ); 
+    return ( IsHeaderEmpty() && IsBodyEmpty() );
+    }
+
+// ---------------------------------------------------------
+// CAudioMessageAppUi::DoUserSendL
+// ---------------------------------------------------------
+// 
+void CAudioMessageAppUi::DoUserSendL()
+    {
+    AMSLOGGER_WRITE( "CAudioMessageAppUi::DoUserSendL >>" ); 
+    //Send command may be issued without recipient
+    //in this case the phonebook is opened
+	if(iInserting)
+		{
+		return;
+		}
+    if ( IsHeaderEmpty() )
+        {
+        HandleCommandL( EAmsEditorCmdAddRecipient ); 
+        return;
+        }
+    else if ( IsBodyEmpty() )
+        {
+        ShowInformationNoteL( R_AUDIOMESSAGE_INFO_CANNOT_SEND, EFalse );
+        return;
+        }
+
+    iCoeEnv->SyncNotifyFocusObserversOfChangeInFocus();
+    // Check message size
+    if ( TUint( MessageSizeInBytes() ) > Document()->MaxMessageSize() )
+        {
+        TInt maxInKilos = ( Document()->MaxMessageSize() + KAmsBytesInKilo - 1 ) / KAmsBytesInKilo;
+        HBufC* string = StringLoader::LoadLC(
+            R_AUDIOMESSAGE_INFO_OBJECT_TOO_BIG,
+            maxInKilos,
+            iCoeEnv );
+        CAknInformationNote* note = new ( ELeave ) CAknInformationNote();
+        note->ExecuteLD( *string );
+        CleanupStack::PopAndDestroy( string );  // string
+        return;
+        }
+    TBool dummy;
+    if ( !CheckNamesL( dummy ) )
+        {
+        return;
+        }
+
+    TInt resourceId = IsPhoneOfflineL()
+        ? R_QTN_WAIT_MSG_SAVED_OUTBOX
+        : R_QTN_AUDIOMESSAGE_WAIT_SEND_MESSAGE;
+
+    if ( !iAddressHandler )
+        {
+        iAddressHandler = CUniAddressHandler::NewL(
+            *iMtm,
+            *ToCtrl(),
+            *iCoeEnv );
+        }
+    iSendOperation = CAudioMessageSendOperation::NewL(
+        *ToCtrl(),
+        *iAddressHandler,
+        *this,
+        *Document(),
+        *iView );       
+        
+    iEditorFlags |= EEditorClosing;
+
+    iAbsorber = CAknInputBlock::NewLC();
+    CleanupStack::Pop( iAbsorber ); //iAbsorber
+
+    iSendOperation->Send();
+    ShowWaitNoteL( resourceId );
+    AMSLOGGER_WRITE( "CAudioMessageAppUi::DoUserSendL <<" ); 
+    }
+
+// ---------------------------------------------------------
+// CAudioMessageAppUi::DoMsgSaveExitL
+// ---------------------------------------------------------
+//
+void CAudioMessageAppUi::DoMsgSaveExitL()
+    {
+    AMSLOGGER_WRITE( "CAudioMessageAppUi::DoMsgSaveExitL >>" ); 
+    if ( CAknEnv::AppWithShutterRunning() )
+        {
+        iEditorFlags |= ERunAppShutterAtExit;
+        }
+    if ( IsMessageEmpty() )
+        {
+        DeleteCurrentEntryL();
+        }
+   	else if ( CanSaveMessageL())
+      	{
+     	if (  Document()->Modified() )
+         	{
+          	// Needs saving
+          	if ( IsForeground() )
+              	{
+              	TInt resId =
+                  	Document()->Saved() ?
+                  	R_QTN_AUDIOMESSAGE_WAIT_SAVING_MESSAGE :
+                  	R_QTN_AUDIOMESSAGE_WAIT_SAVING_MESSAGE_NEW;
+		       	// Cannot trap call below.
+		        iEditorFlags |= EEditorClosing;
+		        DoSaveL();
+		        ShowWaitNoteL( resId );
+              	}
+          	else
+              	{
+              	TInt err(KErrNone);
+              	TRAP( err, DoSaveL() );
+              	}
+          	BeginActiveWait();
+          	if ( iEditorFlags & ERunAppShutterAtExit )
+              	{
+              	CAknEnv::RunAppShutter();
+              	}
+            }
+      	}
+    AMSLOGGER_WRITE( "CAudioMessageAppUi::DoMsgSaveExitL <<" ); 
+    }
+
+// ---------------------------------------------------------
+// CAudioMessageAppUi::DeleteCurrentEntryL
+// ---------------------------------------------------------
+//
+void CAudioMessageAppUi::DeleteCurrentEntryL()
+    {
+    AMSLOGGER_WRITE( "CAudioMessageAppUi::DeleteCurrentEntryL >>" ); 
+    CAudioMessageDocument& doc = *Document();
+
+    TInt msgStoreDrive = Document()->Session( ).CurrentDriveL( );
+    FsSession().GetReserveAccess( msgStoreDrive );
+
+    if ( doc.CurrentEntry().OwningService() == KMsvLocalServiceIndexEntryId )
+        {
+        const TMsvId id = doc.Entry().Id();
+        TRAPD(
+                err, 
+                {
+                doc.CurrentEntry().SetEntryL( doc.Entry().Parent() );
+                doc.CurrentEntry().DeleteL( id );
+                }
+            );
+        if ( err != KErrNone )
+            {
+            doc.Session().RemoveEntry( id );
+            }
+        }
+    FsSession().ReleaseReserveAccess( msgStoreDrive );
+    AMSLOGGER_WRITE( "CAudioMessageAppUi::DeleteCurrentEntryL <<" ); 
+    }
+
+// ---------------------------------------------------------
+// CAudioMessageAppUi::DeleteAndExitL
+// ---------------------------------------------------------
+//
+void CAudioMessageAppUi::DeleteAndExitL()
+    {
+    AMSLOGGER_WRITE( "CAudioMessageAppUi::DeleteAndExitL >>" ); 
+    DeleteCurrentEntryL();
+    AMSLOGGER_WRITE( "CAudioMessageAppUi::DeleteAndExitL <<" ); 
+    Exit( EAknSoftkeyBack );
+    }
+
+
+// ---------------------------------------------------------
+// CAudioMessageAppUi::ExitAndSaveL
+// ---------------------------------------------------------
+//
+void CAudioMessageAppUi::ExitAndSaveL( )
+    {
+    AMSLOGGER_WRITE( "CAudioMessageAppUi::ExitAndSaveL >>" ); 
+    if ( iEditorFlags & EEditorClosing )
+        {
+        Exit( EAknSoftkeyClose );
+        return;
+        }
+    if ( CAknEnv::AppWithShutterRunning() )
+        {
+        iEditorFlags |= ERunAppShutterAtExit;
+        }
+    if (    iEditorFlags & ELaunchSuccessful
+        &&  Document()->MediaAvailable() )
+        {
+        TInt err(KErrNone);
+        TRAP( err, DoMsgSaveExitL() );
+        }
+    AMSLOGGER_WRITE( "CAudioMessageAppUi::ExitAndSaveL <<" ); 
+    Exit();
+    }
+
+// ---------------------------------------------------------
+// CAudioMessageAppUi::DeleteMessageL
+// ---------------------------------------------------------
+//
+void CAudioMessageAppUi::DeleteMessageL()
+  	{
+  	AMSLOGGER_WRITE( "CAudioMessageAppUi::DeleteMessageL >>" ); 
+  	if ( !ShowConfirmationQueryL( R_AUDIOMESSAGE_QUEST_DELETE_MESSAGE ) )
+  		{
+	    CMsgBaseControl* ctrl = iView->FocusedControl();  // ctrl can be NULL.
+		SetNaviPaneL();
+    	return;
+    	}
+  	DeleteAndExitL();
+  	AMSLOGGER_WRITE( "CAudioMessageAppUi::DeleteMessageL <<" ); 
+  	}
+
+// ---------------------------------------------------------
+// CAudioMessageAppUi::DoBackSaveL
+// ---------------------------------------------------------
+//
+void CAudioMessageAppUi::DoBackSaveL()
+    {
+    AMSLOGGER_WRITE( "CAudioMessageAppUi::DoBackSaveL >>" ); 
+    //Make sure this function is not run in case of very fast press
+    //of close key after play soft key	
+	if ( iEditorFlags & EProgressInUse)
+		{
+		return;
+		}
+
+    if ( Document()->GetAppMode() == EAmsViewer )
+      	{
+      	Exit( EAknSoftkeyClose );
+      	}
+    if ( IsMessageEmpty() && Document()->GetClipStatus() == EAmsClipNone )
+        {
+        if ( iMtm->Entry().Entry().Visible() )
+            {
+            ShowInformationNoteL( R_AUDIOMESSAGE_INFO_DELETED, ETrue );
+            }
+        DeleteAndExitL();
+        }
+    else
+        {
+        TInt closeVal = ShowCloseQueryL();
+        if ( closeVal == EMsgCloseCancel )
+            {
+            return;
+            }
+        else if ( closeVal == EMsgCloseDelete )
+            {
+            DeleteCurrentEntryL();
+        	Exit( EAknSoftkeyBack );
+            }
+        else // closeVal == EMsgCloseSave
+            {
+            // Message has data or there is a recipient
+            if ( Document()->Modified() || ToCtrl() )
+                {
+                if ( CanSaveMessageL() )
+                    {
+                    TInt resId =
+                        Document()->Saved() ?
+                        R_QTN_AUDIOMESSAGE_WAIT_SAVING_MESSAGE :
+                        R_QTN_AUDIOMESSAGE_WAIT_SAVING_MESSAGE_NEW;
+                    iEditorFlags |= EEditorClosing;
+
+                    DoSaveL();
+                    ShowWaitNoteL( resId );
+                    BeginActiveWait();
+                    }
+                else
+                    {
+                    if ( ShowConfirmationQueryL( R_AUDIOMESSAGE_QUEST_CLOSE_OOD ) )
+                        {
+                        // Exit without saving.
+                        Exit( EAknSoftkeyClose );
+                        }
+                    }
+                }
+            else
+               {
+                // No changes -> just go away.
+               Exit( EAknSoftkeyClose );
+               }
+            }
+        }
+    AMSLOGGER_WRITE( "CAudioMessageAppUi::DoBackSaveL <<" ); 
+    }
+
+// ---------------------------------------------------------
+// CAudioMessageAppUi::CanSaveMessageL
+// ---------------------------------------------------------
+//
+TBool CAudioMessageAppUi::CanSaveMessageL() const
+    {
+    AMSLOGGER_WRITE( "CAudioMessageAppUi::CanSaveMessageL" ); 
+   	TInt bytes =
+       	Document()->AddressSize() +
+        Document()->AudioFileSize();
+    return !( MsvUiServiceUtilities::DiskSpaceBelowCriticalLevelL(Document()->Session(),
+        bytes ) );
+    }
+
+// ---------------------------------------------------------
+// CAudioMessageAppUi::DoSaveL
+// ---------------------------------------------------------
+//
+void CAudioMessageAppUi::DoSaveL()
+    {
+    AMSLOGGER_WRITE( "CAudioMessageAppUi::DoSaveL >>" ); 
+    if ( !CanSaveMessageL() )
+        {
+        User::Leave( KErrDiskFull );
+        }
+    iAbsorber = CAknInputBlock::NewLC();
+    CleanupStack::Pop( iAbsorber );
+ 
+    delete iSaveOperation;
+    iSaveOperation = NULL;
+    iSaveOperation = CAudioMessageSaveOperation::NewL( *ToCtrl(),
+        *this,
+        *Document(),
+        *iView );
+    iSaveOperation->Save();
+    AMSLOGGER_WRITE( "CAudioMessageAppUi::DoSaveL <<" ); 
+    }
+
+
+// ---------------------------------------------------------
+// CAudioMessageAppUi::CheckNamesL
+// ---------------------------------------------------------
+//
+TBool CAudioMessageAppUi::CheckNamesL( TBool& aModified )
+    {	
+    AMSLOGGER_WRITE( "CAudioMessageAppUi::CheckNamesL >>" ); 
+    iCoeEnv->SyncNotifyFocusObserversOfChangeInFocus();
+    CMsgAddressControl* headerField = ToCtrl();
+    aModified = EFalse;
+    TBool retVal = VerifyAddressesL( aModified );
+
+    if ( aModified )
+        {
+        Document()->SetHeaderModified( ETrue );
+        SetAddressSize();
+    	SetNaviPaneL( );
+        }
+
+    if ( !retVal )
+        {
+        //We'll get here if there's illegal addresses
+        if ( headerField )
+            {
+            // Search first invalid address
+            CMsgRecipientArray* recipients = headerField->GetRecipientsL();
+            TInt addrCnt = recipients->Count();
+
+            for ( TInt k = 0; k < addrCnt ; k++ )
+                {
+                CMsgRecipientItem* addrItem = recipients->At( k );
+                if ( addrItem && !addrItem->IsValidated() )
+                    {
+                    TInt ret = headerField->HighlightUnvalidatedStringL();
+                    if ( !ret )
+                        {
+                        // highlight succeeded
+                        break;
+                        }
+                    }
+                }
+            }
+        }
+AMSLOGGER_WRITE( "CAudioMessageAppUi::CheckNamesL <<" ); 
+    return retVal;
+    }
+
+// ---------------------------------------------------------
+// CAudioMessageAppUi::VerifyAddressesL
+// ---------------------------------------------------------
+//
+TBool CAudioMessageAppUi::VerifyAddressesL( TBool& aModified )
+    {
+    AMSLOGGER_WRITE( "CAudioMessageAppUi::VerifyAddressesL >>" ); 
+    if ( !iAddressHandler )
+        {
+        iAddressHandler = CUniAddressHandler::NewL(
+            *iMtm,
+            *ToCtrl(),
+            *iCoeEnv );
+        }
+    AMSLOGGER_WRITE( "CAudioMessageAppUi::VerifyAddressesL ... after return <<" ); 
+
+    return iAddressHandler->VerifyAddressesL( aModified );
+    }
+
+// ---------------------------------------------------------
+// CAudioMessageAppUi::DoUserAddRecipientL
+// ---------------------------------------------------------
+//JANI-7H3EVA :: fix:: Reddy
+//
+void CAudioMessageAppUi::DoUserAddRecipientL()
+    {
+    AMSLOGGER_WRITE( "CAudioMessageAppUi::DoUserAddRecipientL >>" ); 
+    
+    if(iToolbar)
+        {
+        iToolbar->SetToolbarVisibility(EFalse, EFalse);
+        }
+ 
+    if ( !iAddressHandler )
+        {
+        iAddressHandler = CUniAddressHandler::NewL(
+            *iMtm,
+            *ToCtrl(),
+            *iCoeEnv );
+        }
+
+    TBool dummy( EFalse );
+    TBool recipientAdded( EFalse );
+    recipientAdded =  iAddressHandler->AddRecipientL( dummy ); 
+    if (recipientAdded)
+        {
+        Document()->SetHeaderModified( ETrue );
+        SetAddressSize();
+        }
+    
+    if(iToolbar)
+        {
+        iToolbar->SetToolbarVisibility(ETrue, EFalse);
+        }
+        
+    if( recipientAdded)
+        {
+        iView->SetFocus( EMsgComponentIdTo );
+        }
+
+    AMSLOGGER_WRITE( "CAudioMessageAppUi::DoUserAddRecipientL <<" ); 
+    }
+
+// ---------------------------------------------------------
+// CAudioMessageAppUi::SetSubjectL
+// ---------------------------------------------------------
+//
+void CAudioMessageAppUi::SetSubjectL()
+  	{
+  	AMSLOGGER_WRITE( "CAudioMessageAppUi::SetSubjectL >>" ); 
+  	HBufC* subject = iMtm->SubjectL().AllocLC();
+  	TPtr subjectPtr = subject->Des();
+  	subjectPtr.Trim();
+  	if ( subjectPtr.Length() )
+    	{
+        iView->AddControlFromResourceL( R_AUDIOMESSAGE_SUBJECT, EMsgExpandableControl,
+          	EMsgAppendControl, EMsgHeader );
+      	CMsgExpandableControl* subjectControl =
+      		static_cast<CMsgExpandableControl*> ( iView->ControlById( EMsgComponentIdSubject ) );
+        subjectControl->Editor().SetTextL( subject );
+      	}
+  	CleanupStack::PopAndDestroy( subject ); //subject
+  	AMSLOGGER_WRITE( "CAudioMessageAppUi::SetSubjectL <<" ); 
+  	}
+
+// ---------------------------------------------------------
+// CAudioMessageAppUi::SetSenderL
+// ---------------------------------------------------------
+//
+void CAudioMessageAppUi::SetSenderL()
+  	{
+  	AMSLOGGER_WRITE( "CAudioMessageAppUi::SetSenderL >>" ); 
+  	iView->AddControlFromResourceL( R_AUDIOMESSAGE_VIEWER_FROM,
+                  EMsgAddressControl,
+                  EMsgAppendControl,
+                  EMsgHeader );
+
+  	CMsgAddressControl* fromCtrl = FromCtrl();
+    const TPtrC sender = iMtm->Sender();
+    const TPtrC details = iMtm->Entry().Entry().iDetails;
+
+    if ( sender.Length() )
+        {
+        if ( CommonPhoneParser::IsValidPhoneNumber(
+            TMmsGenUtils::PureAddress( sender ),
+            CommonPhoneParser::ESMSNumber ) )
+            {
+            iSenderType = ESenderTypePhoneNumber;
+            }
+        else
+            {
+            //We trust on that there won't be illegal addresses
+            //in received messages
+            iSenderType = ESenderTypeMailAddress;
+            }
+
+        //Check if MMS engine has put an alias into iDetails field
+        if ( sender.Compare( details ) != 0 )
+            {
+            TPtrC alias = KNullDesC();
+            
+            if ( details.Length() && !iAlias )
+                {
+                iAlias = details.AllocL( );
+                alias.Set( *iAlias );
+                }
+            MVPbkContactLink* link = NULL;
+            fromCtrl->AddRecipientL( alias,
+                          TMmsGenUtils::PureAddress( sender ),
+                          ETrue,
+                          link );
+
+            }
+        else
+            {
+            MVPbkContactLink* link = NULL;
+            fromCtrl->AddRecipientL( TMmsGenUtils::Alias( sender ),
+                          TMmsGenUtils::PureAddress( sender ),
+                          ETrue,
+                          link );
+
+            }
+        }
+        else
+        	{
+        	iSenderType = ESenderTypeNone;       	
+        	}
+  	AMSLOGGER_WRITE( "CAudioMessageAppUi::SetSenderL <<" ); 
+  	}
+
+// ---------------------------------------------------------
+// CAudioMessageAppUi::InsertRecipientL
+// EKLU-7LGCPT :: Filter Invalid contact details
+// ---------------------------------------------------------
+void CAudioMessageAppUi::InsertRecipientL()
+  	{
+  	AMSLOGGER_WRITE( "CAudioMessageAppUi::InsertRecipientL >>" ); 
+
+  	if ( Document()->GetAppMode() == EAmsViewer )
+    	{
+    	iView->AddControlFromResourceL(  R_AUDIOMESSAGE_VIEWER_TO,
+               EMsgAddressControl,
+               EMsgAppendControl,
+               EMsgHeader );
+    	}
+    
+    TBool addInvalidRecipient = EFalse;
+    if ( !iAddressHandler )
+        {
+        iAddressHandler = CUniAddressHandler::NewL( *iMtm, *ToCtrl(), *iCoeEnv );
+        }
+    
+    if( Document()->Entry().iMtmData1 & KMmsMessageEditorOriented )
+        {
+        //if opened from draft folders, then simply open the message as saved, without any cntact filtering
+        addInvalidRecipient = ETrue;
+        }
+    iAddressHandler->CopyAddressesFromMtmL( EMsvRecipientTo, addInvalidRecipient );
+    iAddressHandler->ShowInvalidRecipientInfoNotesL();
+
+  	AMSLOGGER_WRITE( "CAudioMessageAppUi::InsertRecipientL <<" ); 
+  	}
+
+// ---------------------------------------------------------
+// CAudioMessageAppUi::DoUserMessageInfoL
+// ---------------------------------------------------------
+//
+void CAudioMessageAppUi::DoUserMessageInfoL()
+    {
+    AMSLOGGER_WRITE( "CAudioMessageAppUi::DoUserMessageInfoL >>" ); 
+    CBaseMtmUi& uiMtm = Document()->MtmUi();
+    CAknInputBlock::NewLC();
+  	if ( Document()->HeaderModified() )
+    	{
+     	const CMsvRecipientList& addresses = iMtm->AddresseeList();
+    	// Reset addresses in clientMtm
+      	for ( TInt i = iMtm->AddresseeList().Count(); --i >=  0; )
+        	{
+            iMtm->RemoveAddressee( i );
+        	}
+
+      	const CMsgRecipientArray* recipients = ToCtrl()->GetRecipientsL();
+      	// inserts addresses from address control to clientMtm
+      	TInt addrCnt = recipients->Count();
+      	for ( TInt ii = 0; ii < addrCnt ; ii++ )
+      	    {
+      	    CMsgRecipientItem* addrItem = recipients->At(ii);
+      	    TPtr realAddress = addrItem->Address()->Des();
+      	    TPtr alias = addrItem->Name()->Des();
+      	    iMtm->AddAddresseeL( EMsvRecipientTo, realAddress, alias );
+      	    }
+      	iMtm->SaveMessageL();
+      	Document()->SetHeaderModified( EFalse );
+    	}
+
+  	TMmsMsvEntry tEntry = static_cast<TMmsMsvEntry>( Document()->Entry() );
+    tEntry.iBioType = KUidMsgSubTypeMmsAudioMsg.iUid;
+    // Save made because user launched Message Info, Preview or Objects view
+    // Message should stay invisible and in preparation if it was.
+    if ( !tEntry.Visible() )
+     	{
+        // Guarantee that when Visible is ETrue InPreparation is EFalse
+        tEntry.SetInPreparation( ETrue );
+        }
+    Document()->CurrentEntry().ChangeL(tEntry);
+    // Pack message size
+    TInt sizeInKilos = 0;
+  	if ( EAmsClipAttachment == Document()->GetClipStatus() )
+  		{
+        sizeInKilos = ( Document()->AudioFileSize() + KAmsBytesInKilo - 1 ) / KAmsBytesInKilo;
+  		}
+    else
+    	{
+      	sizeInKilos=( MessageSizeInBytes() + KAmsBytesInKilo - 1 ) / KAmsBytesInKilo;
+    	}
+
+    TPckgBuf<TInt> param( sizeInKilos );
+
+    //These are not used. They just have to be there
+    CMsvEntrySelection* selection = new ( ELeave ) CMsvEntrySelection;
+    CleanupStack::PushL( selection );
+
+    // Change to "sync" operation
+    CMsvSingleOpWatcher* watch = CMsvSingleOpWatcher::NewLC( *Document() );
+    CMsvOperation* op = uiMtm.InvokeAsyncFunctionL(
+        KMtmUiFunctionMessageInfo,
+        *selection,
+        watch->iStatus,
+        param );
+    CleanupStack::Pop( watch ); // watch
+    Document()->AddSingleOperationL( op, watch );
+
+    CleanupStack::PopAndDestroy( 2 ); // selection, CAknInputBlock
+	SetNaviPaneL();
+    AMSLOGGER_WRITE( "CAudioMessageAppUi::DoUserMessageInfoL <<" ); 
+    }
+
+// ---------------------------------------------------------
+// CAudioMessageAppUi::SetAudioClipIconL
+// ---------------------------------------------------------
+//
+void CAudioMessageAppUi::SetAudioClipIconL( TAmsRecordIconStatus aStatus )
+  	{
+  	AMSLOGGER_WRITE( "CAudioMessageAppUi::SetAudioClipIconL >>" ); 
+    iLaunchOperation->DoPrepareBodyL( aStatus );
+    AMSLOGGER_WRITE( "CAudioMessageAppUi::SetAudioClipIconL <<" ); 
+  	}
+
+// ---------------------------------------------------------
+// CAudioMessageAppUi::PlayAudioL
+// ---------------------------------------------------------
+//
+void CAudioMessageAppUi::PlayAudioL()
+	{
+	AMSLOGGER_WRITE( "CAudioMessageAppUi::PlayAudioL >>" ); 
+	//Make sure this function is not run in case of very fast double press
+	//of play softkey
+	if ( iEditorFlags & EProgressInUse)
+		{
+		return;
+		}
+	
+	iEditorFlags |= EProgressInUse;
+  	if ( IsSilentModeL()
+        && !ShowConfirmationQueryL( R_QTN_AUDIOMESSAGE_OBEY_SILENT_MODE ) )
+  		{
+  		iEditorFlags &= ~EProgressInUse;	
+    	return;
+    	}
+  	CMsvStore* store = Document()->Mtm().Entry().ReadStoreL();
+  	CleanupStack::PushL( store );
+  	MMsvAttachmentManager& manager = store->AttachmentManagerL();
+    RFile rFile = manager.GetAttachmentFileL( Document()->iAudio );
+    CleanupClosePushL( rFile );
+
+    // Capture voice key while recording
+    if ( iVoiceKeyHandle <= 0 )
+        {
+        iVoiceKeyHandle = iCoeEnv->RootWin().CaptureKey(
+            EKeyDevice6, 0, 0 );
+        }
+
+	iProgressDlg = CAudioMessageProgressDialog::NewL( rFile, 
+				iCurrentVolume, iSpeakerEarpiece, EFalse, *Document() );
+	iProgressDlg->SetNaviObserver( this );	
+
+    TRAPD( err, iProgressDlg->ExecuteLD( R_AUDIOMESSAGE_VOICE_SPEAK_DIALOG ) );
+    if (err == KErrNotSupported)
+    	{
+    	Document()->SetClipStatus( EAmsClipCorrupted ); 
+    	SetAudioClipIconL( EAudioCorrupted );
+    	ShowErrorNoteL( R_AUDIOMESSAGE_ERROR_MSG_CORRUPT, ETrue );
+    	User::Leave( KErrNotSupported );
+    	}
+    else if (err != KErrNone )
+    	{
+    	User::Leave( err );
+    	}
+    
+
+    SetNaviPaneL();	
+
+	iProgressDlg = NULL;
+	
+    CleanupStack::PopAndDestroy( &rFile );
+    CleanupStack::PopAndDestroy( store );
+
+  	// Release voice key
+  	if ( iVoiceKeyHandle >= 0 )
+      	{
+      	iCoeEnv->RootWin().CancelCaptureKey( iVoiceKeyHandle );
+      	iVoiceKeyHandle = KAmsNotCaptured;
+      	}
+   	iEditorFlags &= ~EProgressInUse;
+AMSLOGGER_WRITE( "CAudioMessageAppUi::PlayAudioL <<" ); 
+	}
+
+// ---------------------------------------------------------
+// CAudioMessageAppUi::InsertAudioL
+// ---------------------------------------------------------
+//
+void CAudioMessageAppUi::InsertAudioL( TBool aNew )
+    {
+    AMSLOGGER_WRITE( "CAudioMessageAppUi::InsertAudioL >>" ); 
+
+   	iEditorFlags |= EProgressInUse;
+
+    if ( aNew )
+     	{
+     	if ( !iAbsorber )
+            {
+            iAbsorber = CAknInputBlock::NewLC();
+        	CleanupStack::Pop( iAbsorber );
+            }
+            
+        if ( UnsupportedCallTypeOngoing() )
+        	{
+            delete iAbsorber;
+            iAbsorber = NULL;
+            iEditorFlags &= ~EProgressInUse;
+            return;
+        	}
+
+        SetNaviPaneL( );// Capture voice key while recording
+      	if ( iVoiceKeyHandle <= 0 )
+              {
+              iVoiceKeyHandle = iCoeEnv->RootWin().CaptureKey(
+                  EKeyDevice6, 0, 0 );
+              }
+
+      	TFileName* cmdFileName = new( ELeave ) TFileName;
+    	CleanupStack::PushL( cmdFileName );
+
+        MsgAttachmentUtils::GetMsgEditorTempPath( *cmdFileName );  // It's cleaned by base editor
+        // Create temp directory if needed
+        TInt err = iEikonEnv->FsSession( ).MkDirAll( *cmdFileName );
+      	if ( err != KErrNone && err != KErrAlreadyExists )
+        	{
+            User::Leave( err );
+            }
+      	// prepare cmdFile name
+      	cmdFileName->Append( *iClipFileName );
+      	cmdFileName->Append( KAmrFileExt );
+      	RFile rFile;
+        User::LeaveIfError( rFile.Replace( FsSession(), *cmdFileName, EFileWrite ) ); 	
+    	CleanupClosePushL( rFile );
+    	
+    	iProgressDlg 
+    	    = CAudioMessageProgressDialog::NewL( rFile, iCurrentVolume, iSpeakerEarpiece, ETrue, *Document());
+    	iProgressDlg->SetMaxMessageSize( Document()->MaxMessageSize() );
+    	iProgressDlg->SetNaviObserver( this );
+	
+        delete iAbsorber;
+        iAbsorber = NULL;
+        
+        iProgressDlg->ExecuteLD( R_AUDIOMESSAGE_VOICE_SPEAK_DIALOG );
+		iAvkonAppUi->Cba()->MakeVisible( EFalse );
+	
+        if ( !iAbsorber )
+         	{
+            iAbsorber = CAknInputBlock::NewLC();
+        	CleanupStack::Pop( iAbsorber );
+          	}
+        iProgressDlg=NULL;
+           	
+      	CleanupStack::PopAndDestroy( &rFile );
+      	if(!CheckIncomingCall())
+      	    {
+      	    ShowWaitNoteL( R_QTN_AUDIOMESSAGE_WAIT_INSERTING);
+      	    }
+      	DoInsertAudioL( *cmdFileName  );
+        	
+         // Release voice key
+        if ( iVoiceKeyHandle >= 0 )
+          	{
+          	iCoeEnv->RootWin().CancelCaptureKey( iVoiceKeyHandle );
+          	iVoiceKeyHandle = KAmsNotCaptured;
+          	}
+      	}
+    else
+        {
+        //must update navi here because if you got clip already and play it and after that
+        //you insert a new clip from gallery the navi field is not correct
+        SetNaviPaneL( );
+      	TFileName tmpFileName;
+      	if ( FetchFileL( tmpFileName ) )
+          	{
+          	if(!CheckIncomingCall())
+      	    	{
+      	   		 ShowWaitNoteL( R_QTN_AUDIOMESSAGE_WAIT_INSERTING);
+      	   	 	}
+        	if ( !iInsertOperation )
+                {
+                iInsertOperation = CAudioMessageInsertOperation::NewL(
+                    *this,
+                    *Document(),
+                    *iView );
+                }
+
+            iInserting = ETrue;
+            iAbsorber = CAknInputBlock::NewLC();
+            CleanupStack::Pop( iAbsorber );
+            iInsertOperation->Insert( iInsertingMedia, EFalse, EFalse  );
+            Document()->SetClipStatus( EAmsClipFromGallery );	
+          	}
+        }
+    
+	iEditorFlags &= ~EProgressInUse;
+AMSLOGGER_WRITE( "CAudioMessageAppUi::InsertAudioL <<" ); 
+    }
+
+
+// ---------------------------------------------------------
+// CAudioMessageAppUi::DoInsertAudioL
+// ---------------------------------------------------------
+//
+void CAudioMessageAppUi::DoInsertAudioL( TFileName &aCmdFileName )
+    {
+    if ( iInsertingMedia )
+	    {
+	    delete iInsertingMedia;
+	    iInsertingMedia = NULL;
+	    }
+    RFile fileHandle = Document()->MediaResolver()->FileHandleL( aCmdFileName );
+    CleanupClosePushL( fileHandle );
+    iInsertingMedia = Document()->MediaResolver()->CreateMediaInfoL( fileHandle );
+    // No need to parse info details
+    CleanupStack::PopAndDestroy( &fileHandle );
+
+    if ( !iInsertOperation )
+     	{
+        		iInsertOperation = CAudioMessageInsertOperation::NewL(
+               	 	*this,
+                	*Document(),
+                	*iView );
+        }
+    iInserting = ETrue;
+    iInsertOperation->Insert( iInsertingMedia, EFalse ,ETrue );
+    Document()->SetClipStatus( EAmsClipFromRecorder );
+    CleanupStack::PopAndDestroy( &aCmdFileName );
+    }
+
+
+// ---------------------------------------------------------
+// CAudioMessageAppUi::CreateMediaInfoForInsertL
+// ---------------------------------------------------------
+//
+TBool CAudioMessageAppUi::CreateMediaInfoForInsertL( const TDesC& aFileName )
+    {
+    AMSLOGGER_WRITE( "CAudioMessageAppUi::CreateMediaInfoForInsertL >>" ); 
+    if ( iInsertingMedia )
+      	{
+      	delete iInsertingMedia;
+      	iInsertingMedia = NULL;
+      	}
+
+    RFile fileHandle = Document()->MediaResolver()->FileHandleL( aFileName );
+    CleanupClosePushL( fileHandle );
+    iInsertingMedia = Document()->MediaResolver()->CreateMediaInfoL( fileHandle );
+    Document()->MediaResolver()->ParseInfoDetailsL( iInsertingMedia, fileHandle );
+    CleanupStack::PopAndDestroy( &fileHandle );
+    
+    TInt errResId = 0;
+    if ( MsvUiServiceUtilities::DiskSpaceBelowCriticalLevelL( 
+            Document()->Mtm().Session(),
+         	iInsertingMedia->FileSize() ) )
+    	{
+        User::Leave( KErrDiskFull );
+        }
+  	if ( iInsertingMedia->FileSize() > Document()->MaxMessageSize() )
+    	{
+    	errResId = R_AUDIOMESSAGE_INFO_SIZE_EXCEEDED;
+    	}
+  	else if ( iInsertingMedia->MimeType().CompareF( KMsgMimeAudioAmr ) != 0 )
+    	{
+    	errResId = R_AUDIOMESSAGE_INFO_INVALID_OBJECT;
+    	}
+    	// Supported type check
+    else if ( iInsertingMedia->Protection() )
+        {
+        errResId = R_AUDIOMESSAGE_INFO_UNABLE_TO_INSERT_DRM;
+        }
+    else if ( iInsertingMedia->Corrupt() )
+        {
+        // Corrupt is set to only supported media types
+        errResId = R_AUDIOMESSAGE_INFO_CORRUPTED_OBJECT;
+        }
+    if ( errResId != 0 )
+        {
+        delete iInsertingMedia;
+        iInsertingMedia = NULL;
+        ShowInformationNoteL( errResId, EFalse );
+AMSLOGGER_WRITE( "CAudioMessageAppUi::CreateMediaInfoForInsertL <<" ); 
+        return EFalse;
+        }
+AMSLOGGER_WRITE( "CAudioMessageAppUi::CreateMediaInfoForInsertL <<" ); 
+    return ETrue;
+
+    }
+ 
+
+// ---------------------------------------------------------
+// CAudioMessageAppUi::InitViewerNaviPaneL
+// ---------------------------------------------------------
+//
+void CAudioMessageAppUi::InitViewerNaviPaneL()
+    {
+    AMSLOGGER_WRITE( "CAudioMessageAppUi::InitNaviPaneL >>" ); 
+#ifdef RD_MSG_NAVIPANE_IMPROVEMENT
+    //main navi control container
+    iNaviPane = static_cast<CAknNavigationControlContainer*>
+        ( StatusPane( )->ControlL(  TUid::Uid( EEikStatusPaneUidNavi ) ) );
+
+    
+    //length
+    MAknEditingStateIndicator* editIndi = iAvkonEnv->EditingStateIndicator();
+    if( editIndi )
+    	{
+    	iNavi_length = editIndi->IndicatorContainer();	
+    	}    
+
+    TMsgEditorMsgPriority priority = EMsgEditorMsgPriorityNormal;
+    
+    if ( iMtm->MessagePriority() == EMmsPriorityHigh )
+        {
+        priority = EMsgEditorMsgPriorityHigh;
+        }
+    else if ( iMtm->MessagePriority() == EMmsPriorityLow )
+        {
+        priority = EMsgEditorMsgPriorityLow;
+        }
+    
+    TBool utcTime = ETrue;    
+    CreateViewerNaviPaneL( Document()->Entry().iDate, priority, utcTime  );
+
+    iNaviPane->PushL( *iNaviDecorator );  // <- This has nothing to do with cleanup-stack
+     
+#else    
+    //main navi control container
+    iNaviPane = static_cast<CAknNavigationControlContainer*>
+        ( StatusPane( )->ControlL(  TUid::Uid( EEikStatusPaneUidNavi ) ) ); 
+
+#endif    
+    AMSLOGGER_WRITE( "CAudioMessageAppUi::InitNaviPaneL <<" ); 
+    }
+   
+// ---------------------------------------------------------
+// CAudioMessageAppUi::InitViewerNaviPaneL
+// ---------------------------------------------------------
+//
+void CAudioMessageAppUi::InitEditorNaviPaneL()
+    {
+    AMSLOGGER_WRITE( "CAudioMessageAppUi::InitEditorNaviPaneL >>" ); 
+
+    //main navi control container
+    iNaviPane = static_cast<CAknNavigationControlContainer*>
+        ( StatusPane( )->ControlL(  TUid::Uid( EEikStatusPaneUidNavi ) ) ); 
+    
+    //length
+    MAknEditingStateIndicator* editIndi = iAvkonEnv->EditingStateIndicator();
+    if ( editIndi )
+      	{
+      	iNavi_length = editIndi->IndicatorContainer();
+      	} 
+    iNaviDecorator = iNaviPane->CreateEditorIndicatorContainerL();    
+    AMSLOGGER_WRITE( "CAudioMessageAppUi::InitEditorNaviPaneL <<" ); 
+    }     
+
+
+// ---------------------------------------------------------
+// CAudioMessageAppUi::UpdateViewerNaviFieldL 
+// ---------------------------------------------------------
+//
+void CAudioMessageAppUi::UpdateViewerNaviFieldL()
+  	{	
+AMSLOGGER_WRITE( "CAudioMessageAppUi::UpdateViewerNaviFieldL >>" );   	
+#ifndef RD_MSG_NAVIPANE_IMPROVEMENT	
+    TInt indexInFolder = 0;
+    TInt msgsInFolder = 0;
+    MessageIndexInFolderL( indexInFolder, msgsInFolder );
+ 
+    CArrayFixFlat<TInt>* array = new ( ELeave ) CArrayFixFlat<TInt>(KNaviGranularity);
+    CleanupStack::PushL( array );
+    array->AppendL( indexInFolder + 1 );
+    array->AppendL( msgsInFolder );
+
+    HBufC* buf = StringLoader::LoadLC( R_AUDIOMESSAGE_VIEWER_ORDINAL_NUMBER, *array,
+      iCoeEnv );
+    //Pushed into CleanupStack
+    TBuf<20> finalText;
+    finalText.Append(*buf);
+	AknTextUtils::LanguageSpecificNumberConversion( finalText );
+    
+    //Creates iNavi_next_prev_msg_arrows
+    CreateTabGroupL( finalText );
+    CleanupStack::PopAndDestroy( 2 ); //buf, array
+    iNavi_next_prev_msg_arrows->MakeScrollButtonVisible( ETrue );
+    //NaviButtons are dimmed by default
+    if ( IsNextMessageAvailableL( ETrue ) )
+        {
+        iNavi_next_prev_msg_arrows->SetScrollButtonDimmed( CAknNavigationDecorator::
+          ERightButton, EFalse );
+        }
+    if ( IsNextMessageAvailableL( EFalse ) )
+        {
+        iNavi_next_prev_msg_arrows->SetScrollButtonDimmed( CAknNavigationDecorator::
+          ELeftButton, EFalse );
+        }
+  	iNaviPane->PushL( *iNavi_next_prev_msg_arrows );	
+#endif
+	AMSLOGGER_WRITE( "CAudioMessageAppUi::UpdateViewerNaviFieldL <<" ); 	
+ 		}
+
+
+// ---------------------------------------------------------
+// CAudioMessageAppUi::UpdateEditorNaviFieldL 
+// ---------------------------------------------------------
+//
+void CAudioMessageAppUi::UpdateEditorNaviFieldL( TAmsNaviType aNaviType)
+  	{	
+  	AMSLOGGER_WRITE( "CAudioMessageAppUi::UpdateEditorNaviFieldL >>" ); 
+  	TTimeIntervalMicroSeconds duration = Document()->GetDuration();
+    TTime lengthAsTime( duration.Int64() );
+	TInt strLength = iTimeDuratBase->Length();	
+	HBufC* lengthNow2 = HBufC::NewLC( strLength );
+ 	TPtr lengthNow(lengthNow2->Des());
+	lengthAsTime.FormatL( lengthNow, *iTimeDuratBase);
+ 
+    TInt priorityHigh;
+    TInt priorityLow;
+
+    if ( iMtm->MessagePriority() == EMmsPriorityLow )
+        {
+        priorityHigh = EAknIndicatorStateOff;
+        priorityLow = EAknIndicatorStateOn;
+        }
+    else if ( iMtm->MessagePriority() == EMmsPriorityHigh )
+        {
+        priorityHigh = EAknIndicatorStateOn;
+        priorityLow = EAknIndicatorStateOff;
+        }
+    else
+        {
+        priorityHigh = EAknIndicatorStateOff;
+        priorityLow = EAknIndicatorStateOff;
+        }
+   	AknTextUtils::LanguageSpecificNumberConversion( lengthNow );
+
+ 	switch ( aNaviType )
+ 		{
+    	case EAmsOnlyLength:
+    		{
+         	CAknIndicatorContainer* indiContainer =
+          		static_cast<CAknIndicatorContainer*>( iNaviDecorator->DecoratedControl() );
+        	if ( indiContainer )
+        		{
+            	indiContainer->
+                	SetIndicatorValueL(TUid::Uid(EAknNaviPaneEditorIndicatorMessageLength),
+                	lengthNow);
+            	
+            	indiContainer->
+              		SetIndicatorState(TUid::Uid(EAknNaviPaneEditorIndicatorMessageLength),
+                	EAknIndicatorStateOn);
+            	
+      		    indiContainer->
+              	    SetIndicatorState(TUid::Uid(EAknNaviPaneEditorIndicatorMcePriorityHigh),
+              	    priorityHigh);
+                
+                indiContainer->
+              	    SetIndicatorState(TUid::Uid(EAknNaviPaneEditorIndicatorMcePriorityLow),
+                    priorityLow);
+      		    
+      		    iNaviPane->PushL( *iNaviDecorator);
+        		}
+    		}
+      		break;
+    	case EAmsTextEditorAndLength:
+    		{
+          	if ( !iNavi_length )
+          		{
+			  	MAknEditingStateIndicator* editIndi = iAvkonEnv->EditingStateIndicator();
+			   	if ( editIndi )
+			      	{
+			      	iNavi_length = editIndi->IndicatorContainer();
+			      	}
+
+          		}
+          	if ( iNavi_length )
+              	{
+              	iNavi_length->
+                	SetIndicatorValueL(TUid::Uid(EAknNaviPaneEditorIndicatorMessageLength),
+                	lengthNow);
+              	iNavi_length->
+                	SetIndicatorState(TUid::Uid(EAknNaviPaneEditorIndicatorMessageLength),
+                  	EAknIndicatorStateOn);
+              	}
+      		break;
+    		}
+    	case EAmsMsgArrows:
+ 		    {	
+            //Not in editor mode
+	      	break;
+    		}
+    	default:
+      		break;
+  		}
+  		CleanupStack::PopAndDestroy( lengthNow2 );	
+	AMSLOGGER_WRITE( "CAudioMessageAppUi::UpdateEditorNaviFieldL <<" ); 	
+ 		}
+// ---------------------------------------------------------
+// CAudioMessageAppUi::CreateTabGroupL
+// ---------------------------------------------------------
+//
+#ifndef RD_MSG_NAVIPANE_IMPROVEMENT 
+void CAudioMessageAppUi::CreateTabGroupL( const TDesC& aText )
+    {
+    AMSLOGGER_WRITE( "CAudioMessageAppUi::CreateTabGroupL >>" ); 
+    CFbsBitmap* bitmapPriority = NULL;
+   	CFbsBitmap* maskPriority = NULL;
+    //Delete (possibly) existing navi decorator
+    delete iNavi_next_prev_msg_arrows;
+    iNavi_next_prev_msg_arrows = NULL;
+
+    //Create TabGroup
+    iNavi_next_prev_msg_arrows = iNaviPane->CreateTabGroupL();
+    CAknTabGroup* tabGroup = static_cast<CAknTabGroup*>( iNavi_next_prev_msg_arrows->
+     	DecoratedControl() );
+  	// Set path of bitmap file
+  	TParse fileParse;
+  	fileParse.Set( KAmsBitmapFileName, &KDC_APP_BITMAP_DIR, NULL );
+
+  	if ( ( iMtm->MessagePriority() == EMmsPriorityHigh ) || (iMtm->MessagePriority() ==
+    	EMmsPriorityLow) )
+    	{
+    	if ( iMtm->MessagePriority() == EMmsPriorityHigh )
+      		{
+      		// Create high priority bitmap
+          	AknsUtils::CreateIconL( AknsUtils::SkinInstance(), KAknsIIDQgnIndiMcePriorityHigh,
+              	bitmapPriority, maskPriority, fileParse.FullName(),
+              	EMbmAudiomessageQgn_indi_mce_priority_high,
+              	EMbmAudiomessageQgn_indi_mce_priority_high_mask );
+      		}
+    	else
+      		{
+      		// Create low priority bitmap
+          	AknsUtils::CreateIconL( AknsUtils::SkinInstance(), KAknsIIDQgnIndiMcePriorityLow,
+              	bitmapPriority, maskPriority, fileParse.FullName(),
+              	EMbmAudiomessageQgn_indi_mce_priority_low,
+              	EMbmAudiomessageQgn_indi_mce_priority_low_mask );
+      		}
+
+    	if ( !bitmapPriority )
+      		{
+      		User::Leave( KErrNotFound );
+      		}
+   		CleanupStack::PushL( bitmapPriority );
+        CleanupStack::PushL( maskPriority );
+        // Priority bitmap has been created, set size
+        User::LeaveIfError( AknIconUtils::SetSize( bitmapPriority, KPriorityIconSize ) );
+    	}
+
+  	if (bitmapPriority)
+    	{
+    	tabGroup->AddTabL( 0, aText, bitmapPriority, maskPriority );
+      	CleanupStack::Pop( maskPriority ); // ownership change
+      	CleanupStack::Pop( bitmapPriority ); // ownership change
+    	}
+  	else
+    	{
+    	tabGroup->AddTabL( 0, aText );  // No icons required
+    	}
+    tabGroup->SetActiveTabById( 0 );
+    tabGroup->SetTabFixedWidthL( EAknTabWidthWithOneTab );
+#ifdef RD_SCALABLE_UI_V2
+    iNavi_next_prev_msg_arrows->SetNaviDecoratorObserver( this );
+#endif    
+    AMSLOGGER_WRITE( "CAudioMessageAppUi::CreateTabGroupL <<" ); 
+    }
+#endif //!RD_MSG_NAVIPANE_IMPROVEMENT     
+
+
+// ---------------------------------------------------------
+// CAudioMessageAppUi::UpdateNaviVol
+// ---------------------------------------------------------
+//
+void CAudioMessageAppUi::UpdateNaviVol( TInt aCurrentVolumeValue )
+  	{
+  	AMSLOGGER_WRITE( "CAudioMessageAppUi::UpdateNaviVol >>" ); 
+    iCurrentVolume=aCurrentVolumeValue;
+    AMSLOGGER_WRITE( "CAudioMessageAppUi::UpdateNaviVol <<" ); 
+  	}
+
+// ---------------------------------------------------------
+// CAudioMessageAppUi::GetVolume
+// ---------------------------------------------------------
+//
+TInt CAudioMessageAppUi::GetVolume()
+    {
+    return iCurrentVolume;
+    }
+// ---------------------------------------------------------
+// CAudioMessageAppUi::SetSpeakerOutput
+// ---------------------------------------------------------
+//
+void CAudioMessageAppUi::SetSpeakerOutput(TBool aEarpiece)
+  	{
+  	iSpeakerEarpiece = aEarpiece;
+  	}
+
+// ---------------------------------------------------------
+// CAudioMessageAppUi::ShowInformationNoteL
+// ---------------------------------------------------------
+//
+void CAudioMessageAppUi::ShowInformationNoteL( TInt aResourceID, TBool aWaiting )
+    {
+    AMSLOGGER_WRITE( "CAudioMessageAppUi::ShowInformationNoteL >>" ); 
+    HBufC* prompt = NULL;
+    switch ( aResourceID )
+        {
+        case R_AUDIOMESSAGE_INFO_OBJECT_TOO_BIG:
+        	{
+            TInt maxInKilos 
+                = ( Document()->MaxMessageSize() + KAmsBytesInKilo - 1 ) / KAmsBytesInKilo;
+            prompt = StringLoader::LoadLC( aResourceID, maxInKilos, iCoeEnv  );
+            break;
+        	}
+        default:
+            prompt = StringLoader::LoadLC( aResourceID, iCoeEnv );
+            break;
+        }
+
+    CAknInformationNote* note = new ( ELeave ) CAknInformationNote( aWaiting );
+    note->ExecuteLD( *prompt );
+    CleanupStack::PopAndDestroy( prompt );
+    AMSLOGGER_WRITE( "CAudioMessageAppUi::ShowInformationNoteL <<" ); 
+    }
+
+// ---------------------------------------------------------
+// CAudioMessageAppUi::ShowErrorNoteL
+// ---------------------------------------------------------
+//
+void CAudioMessageAppUi::ShowErrorNoteL( TInt aResourceID, TBool aWaiting )
+    {
+    AMSLOGGER_WRITE( "CAudioMessageAppUi::ShowErrorNoteL >>" ); 
+    HBufC* prompt = StringLoader::LoadLC( aResourceID, iCoeEnv );
+    CAknErrorNote* note = new ( ELeave ) CAknErrorNote( aWaiting );
+    note->ExecuteLD( *prompt );
+    CleanupStack::PopAndDestroy( prompt );
+    AMSLOGGER_WRITE( "CAudioMessageAppUi::ShowErrorNoteL <<" ); 
+    }
+
+// ---------------------------------------------------------
+// CAudioMessageAppUi::ShowConfirmationQueryL
+// ---------------------------------------------------------
+//
+TInt CAudioMessageAppUi::ShowConfirmationQueryL( TInt aResourceID )
+    {
+    HBufC* prompt = StringLoader::LoadLC( aResourceID, iCoeEnv );
+    CAknQueryDialog* dlg = CAknQueryDialog::NewL();
+    TInt retVal = dlg->ExecuteLD( R_AUDIOMESSAGE_CONFIRMATION_QUERY, *prompt );
+    CleanupStack::PopAndDestroy( prompt );
+    AMSLOGGER_WRITE( "CAudioMessageAppUi::ShowConfirmationQueryL <<" ); 
+    return retVal;
+    }
+
+// ---------------------------------------------------------
+// CAudioMessageAppUi::ShowWaitNoteL
+// ---------------------------------------------------------
+//
+TBool CAudioMessageAppUi::ShowWaitNoteL( TInt aResourceId )
+    {
+    AMSLOGGER_WRITE( "CAudioMessageAppUi::ShowWaitNoteL >>" ); 
+    TInt waitNoteResource = R_AUDIOMESSAGE_WAIT_NOTE;
+    HBufC* string = NULL;
+
+    switch ( aResourceId )
+        {
+        case R_QTN_AUDIOMESSAGE_WAIT_SEND_MESSAGE:
+            {
+            waitNoteResource = R_AUDIOMESSAGE_WAIT_NOTE_ICON;//
+            }
+            //fallthroug
+        case R_QTN_WAIT_MSG_SAVED_OUTBOX:
+        case R_QTN_AUDIOMESSAGE_WAIT_OPENING_EDITOR:
+        case R_QTN_AUDIOMESSAGE_WAIT_SAVING_MESSAGE:
+        case R_QTN_AUDIOMESSAGE_WAIT_SAVING_MESSAGE_NEW:
+        case R_QTN_AUDIOMESSAGE_WAIT_INSERTING:
+            {
+            string = StringLoader::LoadLC(
+                aResourceId,
+                iCoeEnv );
+            }
+            break;
+        default:
+            break;
+        }
+    
+    if ( aResourceId == R_QTN_WAIT_MSG_SAVED_OUTBOX
+        || aResourceId == R_QTN_AUDIOMESSAGE_WAIT_SEND_MESSAGE
+        //|| aResourceId == R_QTN_AUDIOMESSAGE_WAIT_SAVING_MESSAGE
+        || aResourceId == R_QTN_AUDIOMESSAGE_WAIT_SAVING_MESSAGE_NEW )
+    	{
+    	if (!iWaitDialog)
+    	iWaitDialog = new( ELeave )CAknWaitDialog(
+            reinterpret_cast<CEikDialog**>( &iWaitDialog ), ETrue);
+    	}
+    else
+    	{
+    	if (!iWaitDialog)
+    	iWaitDialog = new( ELeave )CAknWaitDialog(
+            reinterpret_cast<CEikDialog**>( &iWaitDialog ));
+    	}
+    	
+    iWaitDialog->SetCallback( this );	
+    iWaitDialog->SetTextL( *string );
+    iWaitResId = aResourceId;
+    if (string)
+        {
+        CleanupStack::PopAndDestroy( string );
+        }
+    iWaitDialog->PrepareLC( waitNoteResource );
+
+    AMSLOGGER_WRITE( "CAudioMessageAppUi::ShowWaitNoteL <<" );
+    return iWaitDialog->RunLD();
+    }
+
+// ---------------------------------------------------------
+// CAudioMessageAppUi::RemoveWaitNote
+// ---------------------------------------------------------
+//
+void CAudioMessageAppUi::RemoveWaitNote()
+    {
+    AMSLOGGER_WRITE( "CAudioMessageAppUi::RemoveWaitNote >>" ); 
+    //This also deletes the dialog
+    if ( iWaitDialog)
+    	{
+    	TRAP_IGNORE( iWaitDialog->ProcessFinishedL() );
+    	}
+    AMSLOGGER_WRITE( "CAudioMessageAppUi::RemoveWaitNote <<" ); 
+    }
+
+// ---------------------------------------------------------
+// CAudioMessageAppUi::SetAddressSize
+// ---------------------------------------------------------
+//
+void CAudioMessageAppUi::SetAddressSize()
+    {
+    AMSLOGGER_WRITE( "CAudioMessageAppUi::SetAddressSize >>" ); 
+    TInt entryCnt( 0 );
+    TInt sizeInBytes( 0 );
+    TInt tempBytes( 0 );
+
+    if ( !iMtm->Entry().Entry().ReadOnly() )//not viewer
+      	{
+      	CMsgAddressControl* to = ToCtrl();
+      	to->GetSizeOfAddresses( entryCnt, tempBytes );
+      	sizeInBytes += tempBytes;
+      	Document()->SetAddressSize( sizeInBytes );
+      	}
+    AMSLOGGER_WRITE( "CAudioMessageAppUi::SetAddressSize <<" ); 
+    }
+
+// ---------------------------------------------------------
+// CAudioMessageAppUi::SetBodySize
+// ---------------------------------------------------------
+//
+void CAudioMessageAppUi::SetBodySize()
+    {
+    AMSLOGGER_WRITE( "CAudioMessageAppUi::SetBodySize >>" ); 
+    TInt sizeInBytes( 0 );
+
+    if (iInsertingMedia)
+      	{
+      	sizeInBytes = iInsertingMedia->FileSize();
+      	}
+    Document()->SetAudioFileSize( sizeInBytes );
+    AMSLOGGER_WRITE( "CAudioMessageAppUi::SetBodySize <<" ); 
+    }
+
+// ---------------------------------------------------------
+// CAudioMessageAppUi::IsForward
+// ---------------------------------------------------------
+//
+TBool CAudioMessageAppUi::IsForward() const
+    {
+    TMmsMsvEntry entry = static_cast<TMmsMsvEntry>( Document()->Entry() );
+    return entry.IsForwardedMessage();
+    }
+
+// ---------------------------------------------------------
+// CAudioMessageAppUi::RemoveAudioL
+// ---------------------------------------------------------
+//
+void CAudioMessageAppUi::RemoveAudioL()
+    {
+    AMSLOGGER_WRITE( "CAudioMessageAppUi::RemoveAudioL >>" ); 
+  	if ( ShowConfirmationQueryL( R_AUDIOMESSAGE_QUEST_REMOVE_AUDIO ) )
+    	{
+    	if ( !iInsertOperation )
+      		{
+      		iInsertOperation = CAudioMessageInsertOperation::NewL(
+            	*this,
+            	*Document(),
+            	*iView );
+      		}
+      	//In a case when phone is in silent mode and try to remove audio clip...
+      	//Press msk twice extremely fast. It will take the second press as play
+      	//audio and the UI is messed. Following will prevent it.
+      	//Flag released when remove operation returns.		
+    	iEditorFlags |= EProgressInUse;
+    	iInsertOperation->Insert( iInsertingMedia, ETrue );
+    	}
+    AMSLOGGER_WRITE( "CAudioMessageAppUi::RemoveAudioL <<" ); 
+    }
+
+// ---------------------------------------------------------
+// CAudioMessageAppUi::MessageSizeInBytes
+// ---------------------------------------------------------
+//
+TInt CAudioMessageAppUi::MessageSizeInBytes()
+    {
+    TInt mSize = 0;
+    if ( iInsertingMedia )
+    	{
+    	mSize = iInsertingMedia->FileSize();
+    	}
+    else
+    	{
+      	mSize = 0;
+    	}
+    return mSize;
+    }
+
+// ---------------------------------------------------------
+// CAudioMessageAppUi::DoSelectionKeyL
+// ---------------------------------------------------------
+//
+void CAudioMessageAppUi::DoSelectionKeyL()
+    {
+    AMSLOGGER_WRITE( "CAudioMessageAppUi::DoSelectionKeyL >>" ); 
+    CMsgBaseControl* ctrl = iView->FocusedControl();
+    if ( ctrl )
+     	{
+        switch ( ctrl->ControlId() )
+            {
+            case EMsgComponentIdTo:
+                if ( Document()->GetAppMode() == EAmsEditor )
+                	{
+                  	TBool modified = EFalse;
+                  	if ( !VerifyAddressesL( modified ) )
+                      	{
+                      	// Illegal address found.
+                      	modified = ETrue;
+                      	}
+                  	if ( !modified )//else
+                      	{
+            			// Nothing changed on the UI. Open PhoneBook.
+                    	HandleCommandL( EAmsEditorCmdAddRecipient ); 
+            			}
+                	}
+            	else
+              		{
+                  	MenuBar()->SetMenuTitleResourceId( R_AUDIOMESSAGE_VIEWER_SELECTMENU );
+                  	MenuBar()->SetMenuType(CEikMenuBar::EMenuContext);
+                  	TRAP_IGNORE(MenuBar()->TryDisplayMenuBarL());
+                  	MenuBar()->SetMenuTitleResourceId( R_AUDIOMESSAGE_MENUBAR );
+                  	MenuBar()->SetMenuType(CEikMenuBar::EMenuOptions);
+              		}
+                break;
+      		default:
+        		//if audio clip is inserted, just play it
+        		if ( Document()->GetClipStatus() != EAmsClipNone )
+        			{
+        			HandleCommandL( EAmsEditorCmdPlayAudio );
+        			}
+        		//there is no any clip, so try to record new.
+        		else
+        			{
+                	HandleCommandL( EAmsEditorCmdRecordAudio );
+                	}
+                break;
+        	}
+    	}
+    AMSLOGGER_WRITE( "CAudioMessageAppUi::DoSelectionKeyL <<" ); 
+    }
+    
+// ---------------------------------------------------------
+// CAudioMessageAppUi::IsPhoneOfflineL
+// ---------------------------------------------------------
+//
+TBool CAudioMessageAppUi::IsPhoneOfflineL() const
+    {
+    AMSLOGGER_WRITE( "CAudioMessageAppUi::IsPhoneOfflineL >>" ); 
+    if ( iSupportedFeatures & EUniFeatureOffline )
+        {
+        TInt connAllowed = 1;
+        CRepository* repository = CRepository::NewL( KCRUidCoreApplicationUIs );
+        TInt err = repository->Get( KCoreAppUIsNetworkConnectionAllowed, connAllowed );
+        delete repository;
+        repository = NULL;
+        if ( !err && !connAllowed )
+            {
+            return ETrue;
+            }
+        }
+    return EFalse;
+    }
+
+// ---------------------------------------------------------
+// CAudioMessageAppUi::LaunchHelpL
+// ---------------------------------------------------------
+//
+void CAudioMessageAppUi::LaunchHelpL()
+    { 
+    AMSLOGGER_WRITE( "CAudioMessageAppUi::LaunchHelpL >>" ); 
+    // activate Help application
+    if ( iSupportedFeatures & EUniFeatureHelp )
+        {
+        //CArrayFix<TCoeHelpContext>* helpContext = AppHelpContextL();
+        HlpLauncher::LaunchHelpApplicationL( iEikonEnv->WsSession()
+            , iEikonEnv->EikAppUi()->AppHelpContextL()/* helpContext*/ ); 
+        }
+    }
+
+// ---------------------------------------------------------
+// CAudioMessageAppUi::HelpContextL
+// ---------------------------------------------------------
+//
+CArrayFix<TCoeHelpContext>* CAudioMessageAppUi::HelpContextL() const
+    {
+    CArrayFix<TCoeHelpContext>* r = new ( ELeave ) CArrayFixFlat<TCoeHelpContext>( 1 );
+    CleanupStack::PushL( r );
+    if ( Document()->GetAppMode() == EAmsViewer )
+    	{
+      	r->AppendL( TCoeHelpContext( KUidAudioMessageApplication, KAUDIO_MSG_HLP_VIEWER() ) );
+    	}
+    else // Document()->GetAppMode() == EAmsEditor 
+    	{
+      	r->AppendL( TCoeHelpContext( KUidAudioMessageApplication, KAUDIO_MSG_HLP_EDITOR() ) );
+    	}
+	
+    CleanupStack::Pop( r );
+    return r;
+    }
+
+// ---------------------------------------------------------
+// CAudioMessageAppUi::NumberConversionLC
+// ---------------------------------------------------------
+//
+HBufC* CAudioMessageAppUi::NumberConversionLC( const TDesC& aOrigNumber, TBool aDirection )
+    {
+    HBufC* addressCopy = aOrigNumber.AllocLC();
+    TPtr tempTPtr = addressCopy->Des();
+    if ( aDirection )
+        {
+        AknTextUtils::DisplayTextLanguageSpecificNumberConversion( tempTPtr );
+        }
+    else
+        {
+        AknTextUtils::ConvertDigitsTo( tempTPtr, EDigitTypeWestern );
+        }
+    return addressCopy;
+    }
+
+// ---------------------------------------------------------
+// CAudioMessageAppUi::DoInsertCompleteL
+// ---------------------------------------------------------
+//
+void CAudioMessageAppUi::DoInsertCompleteL( TBool aErrorNone )
+    {
+    AMSLOGGER_WRITE( "CAudioMessageAppUi::DoInsertCompleteL >>" ); 
+	if( !CheckIncomingCall() )
+	    {
+	    RemoveWaitNote();
+	    }
+	else
+	    {
+        //There may have been fatal error in inserting
+        if ( iInsertOperation && iInsertOperation->GetError()<0 )
+            {
+           	;//Do nothing, error note is shown elsewhere and application is closed
+            }
+        else
+            {
+            HBufC* labell = StringLoader::LoadLC( R_AUDIOMESSAGE_INSERTED );
+  		    CAknGlobalNote *globalNote = CAknGlobalNote::NewLC();
+	        globalNote->ShowNoteL( EAknGlobalInformationNote, *labell );
+	        CleanupStack::PopAndDestroy( globalNote );
+            CleanupStack::PopAndDestroy( labell );
+            }     
+	    }
+	
+   	CAknInputBlock::NewLC(); // Absorb keys
+   	iAvkonAppUi->Cba()->MakeVisible( ETrue );
+    iInserting = EFalse;
+  	if ( aErrorNone )
+    	{
+	    SetBodySize();
+	    Document()->SetBodyModified( ETrue );
+	    Document()->SetInsertedStatus( EAmsRecorded );
+	    SetAudioClipIconL( EAudioInserted );
+       	iView->SetFocus( EMsgComponentIdImage );       
+    	}
+  	else
+    	{
+      	ShowInsertErrorsL();
+    	}
+
+    UpdateSoftKeysL();	
+  	FetchAudioFileDataL( ) ;
+   	CleanupStack::PopAndDestroy();// Absorb keys
+    AMSLOGGER_WRITE( "CAudioMessageAppUi::DoInsertCompleteL <<" ); 
+    }
+
+// ---------------------------------------------------------
+// CAudioMessageAppUi::EditorOperationEvent
+// ---------------------------------------------------------
+//
+void CAudioMessageAppUi::EditorOperationEvent( TAmsOperationType aOperation,
+  TAmsOperationEvent aEvent )
+    {
+    AMSLOGGER_WRITE( "CAudioMessageAppUi::EditorOperationEvent >>" ); 
+    if ( iEditorFlags & EEditorExiting )
+        {
+        // Do not handle any event if we are exiting.
+        return;
+        }
+    
+    delete iAbsorber;
+    iAbsorber = NULL;
+
+    TRAPD( error, DoEditorOperationEventL( aOperation, aEvent ) );
+	if (error != KErrNone)
+		{
+		Exit ( error );
+		}
+    AMSLOGGER_WRITE( "CAudioMessageAppUi::EditorOperationEvent <<" ); 
+    }
+
+// ---------------------------------------------------------
+// CAudioMessageAppUi::DoEditorOperationEventL
+// ---------------------------------------------------------
+//
+void CAudioMessageAppUi::DoEditorOperationEventL( TAmsOperationType aOperation,
+  TAmsOperationEvent aEvent )
+    {
+    AMSLOGGER_WRITE( "CAudioMessageAppUi::DoEditorOperationEventL >>" ); 
+    switch ( aOperation )
+        {
+      	case EAmsOperationInsert:
+            if ( aEvent == EAmsOperationProcessing )
+                {
+                ShowWaitNoteL( R_QTN_AUDIOMESSAGE_WAIT_INSERTING );
+                }
+            else if ( aEvent == EAmsOperationError )
+              	{
+              	DoInsertCompleteL( EFalse );
+              	}
+            else
+                {
+                DoInsertCompleteL( ETrue );
+                }
+            break;
+        case EAmsOperationLaunch:
+            DoLaunchCompleteL( aEvent );
+            break;
+        case EAmsOperationSave:
+            DoSaveCompleteL();
+            break;
+        case EAmsOperationSend:
+            DoSendCompleteL();
+            break;
+        case EAmsOperationRemove:
+            DoRemoveCompleteL();
+            iEditorFlags &= ~EProgressInUse;
+            break;
+        case EAmsOperationSendReadReport:
+            // free resources
+            delete iSendReadReportOperation;
+            iSendReadReportOperation = NULL;
+            break;
+        default:
+            {
+            // nothing to do
+            break;
+            }
+        }   
+    AMSLOGGER_WRITE( "CAudioMessageAppUi::DoEditorOperationEventL <<" ); 
+    }  
+
+// ---------------------------------------------------------
+// CAudioMessageAppUi::DoRemoveCompleteL
+// ---------------------------------------------------------
+//
+void CAudioMessageAppUi::DoRemoveCompleteL()
+  	{
+  	AMSLOGGER_WRITE( "CAudioMessageAppUi::DoRemoveCompleteL >>" ); 
+    CAknInputBlock::NewLC(); // Absorb keys
+    Document()->SetAudioFileSize( 0 );
+    Document()->SetDuration( 0 );
+ 	SetNaviPaneL();
+    Document()->SetBodyModified( ETrue );
+    Document()->SetClipStatus( EAmsClipNone );
+    SetAudioClipIconL( EAudioInsert );   
+  	UpdateSoftKeysL();
+    ShowInformationNoteL( R_AUDIOMESSAGE_INFO_CLIP_DELETED, EFalse );
+  	CleanupStack::PopAndDestroy();
+  	AMSLOGGER_WRITE( "CAudioMessageAppUi::DoRemoveCompleteL <<" ); 
+  	}
+
+// ---------------------------------------------------------
+// CAudioMessageAppUi::DoLaunchCompleteL
+// EKLU-7LGCPT :: Filter Invalid contact details
+// ---------------------------------------------------------
+//
+void CAudioMessageAppUi::DoLaunchCompleteL( TAmsOperationEvent aEvent )
+    {
+    AMSLOGGER_WRITE( "CAudioMessageAppUi::DoLaunchCompleteL >>" ); 
+    TInt error = iLaunchOperation->GetError();
+    RemoveWaitNote();
+    
+    if ( error == EAmsExit )
+      	{
+        DoDelayedExitL( 0 );
+        }
+    else if ( error != KErrNone )
+    	{
+    	if ( !ShowLaunchErrorsL( error  ) )
+    		{
+    		//In this case the error not is shown
+    		DoDelayedExitL( KDelayedExitDelay );
+    		}
+    	else
+    		{
+    		DoDelayedExitL( 0 );
+    		}
+    	}
+
+    else
+        {
+       	FinalizeLaunchL();
+       	
+       	// Enable task swapper to options menu after launch has been completed.
+        MenuBar()->SetMenuType( CEikMenuBar::EMenuOptions );
+       	
+       	delete iScreenClearer;
+        iScreenClearer = NULL;
+        
+        iEditorFlags |= ELaunchSuccessful;
+        //Set softkeys
+
+        UpdateSoftKeysL();
+        //SetNaviPaneL();		
+        	
+        TRAP_IGNORE( SendReadReportL( aEvent ) );
+        }
+    AMSLOGGER_WRITE( "CAudioMessageAppUi::DoLaunchCompleteL <<" );    
+    }
+ 
+// ---------------------------------------------------------   
+// CAudioMessageAppUi::DoDelayedExitL
+// ---------------------------------------------------------
+//
+void CAudioMessageAppUi::DoDelayedExitL( TInt aDelayTime )
+    {
+AMSLOGGER_WRITE( "CAudioMessageAppUi::DoDelayedExitL" );      
+    delete iIdle;
+    iIdle = 0;
+    iIdle = CPeriodic::NewL( EPriorityNormal /*- 1*/);
+    iIdle->Start(   aDelayTime,
+                    aDelayTime,
+                    TCallBack( DelayedExit, this ));
+    }
+
+// ---------------------------------------------------------
+// CAudioMessageAppUi::DelayedExit
+// ---------------------------------------------------------
+//
+TInt CAudioMessageAppUi::DelayedExit( TAny* aThis )
+    {
+    AMSLOGGER_WRITE( "CAudioMessageAppUi::DelayedExit" ); 
+    CAudioMessageAppUi* editor = static_cast<CAudioMessageAppUi*>( aThis );
+    editor->DoExternalExit();
+  	CAknEnv::RunAppShutter( );
+    return KErrNone;
+    }
+
+// ---------------------------------------------------------
+// CAudioMessageAppUi::DoExternalExit
+// ---------------------------------------------------------
+//
+void CAudioMessageAppUi::DoExternalExit()
+    {
+    delete iAbsorber;
+    iAbsorber=NULL;
+    Exit( EAknSoftkeyClose );
+    }
+
+// ---------------------------------------------------------
+// CAudioMessageAppUi::DoSaveCompleteL
+// ---------------------------------------------------------
+//
+void CAudioMessageAppUi::DoSaveCompleteL()
+    {
+    EndActiveWait();
+    if ( iWaitDialog )
+        {
+        // Processing continued at DialogDismissedL when wait note
+        // has dismissed itself.
+        iWaitDialog->ProcessFinishedL();
+        }    
+    else
+        {
+        DoOpComplete2ndPhaseL();
+        }
+    
+    }
+    
+// ---------------------------------------------------------
+// CAudioMessageAppUi::DoOpComplete2ndPhaseL
+//
+// Performs the real send operation completing code.
+// ---------------------------------------------------------
+//
+void CAudioMessageAppUi::DoOpComplete2ndPhaseL()
+    { 
+    DoDelayedExitL( 0 );
+    }    
+
+// ---------------------------------------------------------
+// CAudioMessageAppUi::DoSendCompleteL
+// ---------------------------------------------------------
+//
+void CAudioMessageAppUi::DoSendCompleteL()
+    {
+    if ( iWaitDialog )
+        {
+        // Processing continued at DialogDismissedL when wait note
+        // has dismissed itself.
+        iWaitDialog->ProcessFinishedL();
+        }    
+    else
+        {
+        DoOpComplete2ndPhaseL();
+        }    
+    }
+
+// ---------------------------------------------------------
+// CAudioMessageAppUi::BeginActiveWait
+// ---------------------------------------------------------
+//
+void CAudioMessageAppUi::BeginActiveWait()
+    {
+    if ( iWait.IsStarted() )
+        {
+        return;
+        }
+    iWait.Start();
+    }
+
+// ---------------------------------------------------------
+// CAudioMessageAppUi::EndActiveWait
+// ---------------------------------------------------------
+//
+void CAudioMessageAppUi::EndActiveWait()
+    {
+    if ( iWait.IsStarted() )
+        {
+        iWait.AsyncStop();
+        }
+    }
+
+		
+// ---------------------------------------------------------
+// CAudioMessageAppUi::ShowLaunchErrorsL
+// ---------------------------------------------------------
+//
+TBool CAudioMessageAppUi::ShowLaunchErrorsL( TInt aError )
+    {
+    AMSLOGGER_WRITE( "CAudioMessageAppUi::ShowLaunchErrorsL >>" ); 
+    TInt errRes = -1;
+    switch ( aError )
+        {
+        case EAmsSendUiUnsupported:
+            SetErrorResource( errRes, R_AUDIOMESSAGE_INFO_UNSUPPORTED_OBJECT );
+          break;
+        case EAmsSendUiCorrupted:
+            SetErrorResource( errRes, R_AUDIOMESSAGE_INFO_CORRUPTED_OBJECT );
+            break;
+        case EAmsProtectedObject:
+            SetErrorResource( errRes, R_AUDIOMESSAGE_INFO_SEND_FORBID );
+            break;
+        default:
+            // e.g leave in startup
+            break;
+        }
+
+    if ( errRes != -1 )
+        {
+        ShowInformationNoteL( errRes, EFalse );
+    AMSLOGGER_WRITE( "CAudioMessageAppUi::ShowLaunchErrorsL, false <<" ); 
+        return EFalse;
+        }
+
+    //else nothing
+   AMSLOGGER_WRITE( "CAudioMessageAppUi::ShowLaunchErrorsL, true <<" ); 
+    return ETrue;
+    }
+
+// ---------------------------------------------------------
+// CAudioMessageAppUi::SetErrorResource
+// ---------------------------------------------------------
+//
+void CAudioMessageAppUi::SetErrorResource( TInt& aStoreId, TInt aNewId )
+    {
+    if ( ErrorPriority( aNewId ) >= ErrorPriority( aStoreId ) )
+        {
+        if ( aStoreId == R_AUDIOMESSAGE_INFO_CORRUPTED_OBJECT &&
+            ( aNewId == R_AUDIOMESSAGE_INFO_CORRUPTED_OBJECT  ) )
+            {
+            //set plural
+            aStoreId = R_AUDIOMESSAGE_INFO_CORRUPTED_OBJECT;
+            }
+        else if ( aStoreId == R_AUDIOMESSAGE_INFO_UNSUPPORTED_OBJECT &&
+            ( aNewId == R_AUDIOMESSAGE_INFO_UNSUPPORTED_OBJECT ) )
+            {
+            //set plural
+            aStoreId = R_AUDIOMESSAGE_INFO_UNSUPPORTED_OBJECT;
+            }
+        else if ( aStoreId != -1 && aStoreId != aNewId )
+            {
+            // Set "general error"
+            aStoreId = aNewId;
+            }
+        else
+            {
+            aStoreId = aNewId;
+            }
+        }
+    }
+
+// ---------------------------------------------------------
+// CAudioMessageAppUi::ErrorPriority
+// ---------------------------------------------------------
+//
+TInt CAudioMessageAppUi::ErrorPriority( TInt aErrorId )
+    {
+    TInt priority = 0;
+    switch ( aErrorId )
+        {
+        case R_AUDIOMESSAGE_INFO_SEND_FORBID:
+            priority++;
+        case R_AUDIOMESSAGE_INFO_OBJECT_TOO_BIG:
+            priority++;
+        case R_AUDIOMESSAGE_ERROR_CANNOT_OPEN:
+             priority++;
+        case R_AUDIOMESSAGE_INFO_UNSUPPORTED_OBJECT:
+            priority++;
+        default:
+            break;
+        }
+    return priority;
+    }
+
+// ---------------------------------------------------------
+// CAudioMessageAppUi::ShowInsertErrorsL
+// ---------------------------------------------------------
+//
+void CAudioMessageAppUi::ShowInsertErrorsL()
+    {
+    AMSLOGGER_WRITE( "CAudioMessageAppUi::ShowInsertErrorsL >>" ); 
+    TBool abortedByUser = EFalse;
+    TInt errRes( -1 );
+    TInt error = iInsertOperation->GetError();
+    
+    //Let's first check if there is degative error value.
+    //In that case the runL has been leaved e.g. in case low memory
+    if ( error < 0 )
+        {
+        iEikonEnv->HandleError( error );
+        return;
+        }
+    
+    
+    switch ( error )
+        {
+        case EAmsInsertTooBig:
+            SetErrorResource( errRes, R_AUDIOMESSAGE_INFO_OBJECT_TOO_BIG );
+            break;
+       	case EAmsInsertNotSupported:
+            SetErrorResource( errRes, R_AUDIOMESSAGE_INFO_UNSUPPORTED_OBJECT );
+            break;
+    	default:
+            break;
+    	}
+    if ( !abortedByUser && errRes != -1 )
+        {
+        ShowInformationNoteL( errRes, EFalse );
+        }
+    }
+
+
+// ---------------------------------------------------------
+// CAudioMessageAppUi::OpenDeliveryPopupL
+// ---------------------------------------------------------
+//
+void CAudioMessageAppUi::OpenDeliveryPopupL()
+    {
+    AMSLOGGER_WRITE( "CAudioMessageAppUi::OpenDeliveryPopupL >>" ); 
+    //These are not used. They just have to be there.
+    TPckgBuf<TInt> param( 0 ); 
+    CMsvEntrySelection* selection = new ( ELeave ) CMsvEntrySelection;
+    CleanupStack::PushL( selection );
+
+    CMsvSingleOpWatcher* watch = CMsvSingleOpWatcher::NewLC( *Document() );
+    CMsvOperation* op = Document()->MtmUi().InvokeAsyncFunctionL(
+        KMtmUiFunctionDeliveryStatus,
+        *selection,
+        watch->iStatus,
+        param ); // launch the dialog through MMSUI
+    CleanupStack::Pop( watch ); 
+    Document()->AddSingleOperationL( op, watch );
+    CleanupStack::PopAndDestroy( selection ); // selection
+    }
+
+// ---------------------------------------------------------
+// CAudioMessageAppUi::DoMoveMessageL
+// ---------------------------------------------------------
+//
+void CAudioMessageAppUi::DoMoveMessageL()
+    {
+    AMSLOGGER_WRITE( "CAudioMessageAppUi::DoMoveMessageL >>" ); 
+    //ask folder with a dialog (from muiu)
+    TMsvId target = Document()->Entry().Parent();
+    HBufC* title = StringLoader::LoadLC( R_AMSVIEWER_MOVE_TEXT, iCoeEnv );
+    TBool success = CMsgFolderSelectionDialog::SelectFolderL(target, *title);
+    CleanupStack::PopAndDestroy( title ); // title
+    if ( success )
+        {
+        MoveMessageEntryL( target );
+    AMSLOGGER_WRITE( "CAudioMessageAppUi::DoMoveMessageL <<" ); 
+        Exit( EAknSoftkeyClose );
+        }
+    AMSLOGGER_WRITE( "CAudioMessageAppUi::DoMoveMessageL <<" ); 
+    }
+
+
+
+// ---------------------------------------------------------
+// CAudioMessageAppUi::DoReplyViaL
+// ---------------------------------------------------------
+//
+void CAudioMessageAppUi::DoReplyViaL( TInt aCase  )
+    {
+    AMSLOGGER_WRITE( "CAudioMessageAppUi::DoDoReplyViaL >>" ); 
+     
+    if ( iToolbar ) 
+        {
+        iToolbar->SetToolbarVisibility( EFalse, EFalse );     
+        }
+
+    //to reduce flickering during closing
+	if (!(iEditorBaseFeatures & EStayInViewerAfterReply ))
+        {
+        iView->MakeVisible( EFalse );
+        }
+
+    switch ( aCase )
+            {
+            case EReplyToSender:
+                ReplyL( KNewMessageFolder );  //Draft
+                break;
+            case EReplyToAll:
+                ReplyToAllL( KNewMessageFolder );
+                break;                         
+            case EReplyViaMessage:
+                DoDoReplyViaMessageL();
+                break;  
+    
+            default:
+                break;
+            }      
+            
+    if (!(iEditorBaseFeatures & EStayInViewerAfterReply)) 
+        {
+        Exit( EAknSoftkeyClose );
+        }
+    if ( iToolbar ) 
+        {
+        iToolbar->SetToolbarVisibility( ETrue, EFalse );     
+        }  
+    AMSLOGGER_WRITE( "CAudioMessageAppUi::DoDoReplyViaL <<" );    
+    }
+    
+// ---------------------------------------------------------
+// CAudioMessageAppUi::DoDoReplyViaMessageL
+// ---------------------------------------------------------
+//
+void CAudioMessageAppUi::DoDoReplyViaMessageL(  )
+    {
+    CMessageData* msgData = CMessageData::NewLC();
+    TPtrC alias = KNullDesC();
+
+    const TPtrC details = iMtm->Entry().Entry().iDetails;
+
+    if ( details.Length() && !iAlias )
+        {
+        iAlias = details.AllocL( );
+        alias.Set( *iAlias );
+        }
+        
+     const TPtrC description = iMtm->Entry().Entry().iDescription;
+     TPtrC subject = KNullDesC();       
+
+	// Add address
+	const TPtrC sender = iMtm->Sender();
+   	if ( sender != KNullDesC() )
+		{
+	    if ( iAlias )
+	    	{
+            msgData->AppendToAddressL( TMmsGenUtils::PureAddress ( sender ), *iAlias );
+            }
+        else
+            {
+            msgData->AppendToAddressL( TMmsGenUtils::PureAddress ( sender ) );
+         	}
+	 	}
+	 	
+	//Add Subject Header	
+ 	HBufC* prefixSubject = CreateSubjectPrefixStringL( iMtm->SubjectL(), ETrue );
+    CleanupStack::PushL( prefixSubject ); 
+    if ( prefixSubject )
+        {
+        msgData->SetSubjectL( prefixSubject );
+        }
+    else
+        {
+        TPtrC subjectDes = iMtm->SubjectL();
+        msgData->SetSubjectL( &subjectDes );
+        }
+    CleanupStack::PopAndDestroy( prefixSubject ); 
+
+    CSendUi* sendUi = CSendUi::NewLC();
+    sendUi->CreateAndSendMessageL(
+            	KSenduiMtmUniMessageUid,
+               	msgData);
+    CleanupStack::PopAndDestroy( sendUi );
+    CleanupStack::PopAndDestroy( msgData );
+    }    
+ 
+// ---------------------------------------------------------
+// CAudioMessageAppUi::DoForwardL
+// ---------------------------------------------------------
+//
+void CAudioMessageAppUi::DoForwardL()
+    {
+    AMSLOGGER_WRITE( "CAudioMessageAppUi::DoForwardL >>" ); 
+    if ( iToolbar ) 
+        {
+        iToolbar->SetToolbarVisibility( EFalse, EFalse );     
+        }
+    
+    if (!(iEditorBaseFeatures & EStayInViewerAfterReply ))
+        {
+        iView->MakeVisible( EFalse );
+        }
+    
+    ForwardL( KNewMessageFolder );
+    if (!(iEditorBaseFeatures & EStayInViewerAfterReply))
+	    {
+	    Exit( EAknSoftkeyClose );
+	    }
+    if ( iToolbar ) 
+        {
+        iToolbar->SetToolbarVisibility( ETrue, EFalse );     
+        } 
+    AMSLOGGER_WRITE( "CAudioMessageAppUi::DoForwardL <<" ); 
+    }
+
+
+// ---------------------------------------------------------
+// CAudioMessageAppUi::FetchAudioFileDataL
+// ---------------------------------------------------------
+//
+void CAudioMessageAppUi::FetchAudioFileDataL( )
+    {
+    AMSLOGGER_WRITE( "CAudioMessageAppUi::FetchAudioFileDataL >>" ); 
+    CMsvStore* store = Document()->Mtm().Entry().ReadStoreL();
+    CleanupStack::PushL( store );
+    MMsvAttachmentManager& manager = store->AttachmentManagerL();
+	RFile rFile = manager.GetAttachmentFileL( Document()->iAudio );
+
+    CleanupClosePushL( rFile );
+
+    TInt currentSize = 0;
+    rFile.Size( currentSize );
+    Document()->SetAudioFileSize( currentSize );
+
+    TDataType testType( KMsgMimeAudioAmr );
+    if ( Document()->GetAppMode() == EAmsViewer && !( Document()->IsAmrL( rFile, testType ) ))
+        {
+        Document()->SetClipStatus( EAmsClipCorrupted ); 
+    	SetAudioClipIconL( EAudioCorrupted );
+        UpdateSoftKeysL(); 
+        ShowInformationNoteL( R_AUDIOMESSAGE_ERROR_MSG_CORRUPT, EFalse );
+        }
+    
+    CleanupStack::PopAndDestroy( &rFile );
+    CleanupStack::PopAndDestroy( store );
+    AMSLOGGER_WRITE( "CAudioMessageAppUi::FetchAudioFileDataL <<" ); 
+    }
+
+// ---------------------------------------------------------
+// CAudioMessageAppUi::FocusedControlId
+// ---------------------------------------------------------
+//
+TInt CAudioMessageAppUi::FocusedControlId()
+    {
+    TInt controlType = EMsgComponentIdNull;
+    if ( iView && iView->FocusedControl() )
+        {
+        controlType = iView->FocusedControl()->ControlId();
+        }
+    return controlType;
+    }
+
+// ---------------------------------------------------------
+// CAudioMessageAppUi::IsSilentModeL
+// ---------------------------------------------------------
+//
+TBool CAudioMessageAppUi::IsSilentModeL()
+    {
+    TBool result( EFalse );
+
+    CRepository* repository = CRepository::NewLC( KCRUidProfileEngine );
+    TInt defaultType( EProfileGeneralId );
+    User::LeaveIfError( repository->Get( KProEngActiveProfile, defaultType ) );
+    CleanupStack::PopAndDestroy( repository );
+
+    if ( defaultType == EProfileSilentId )
+        {
+        result = ETrue;
+        }
+    return result;
+    }
+
+
+// ---------------------------------------------------------
+// CAudioMessageAppUi::HandleWsEventL
+// ---------------------------------------------------------
+//
+void CAudioMessageAppUi::HandleWsEventL(const TWsEvent& aEvent,CCoeControl* aDestination)
+  	{
+  	const TInt systemAppWgId( 4 );
+  	switch ( aEvent.Type() )
+    	{
+        case EEventFocusGroupChanged:
+        	{
+AMSLOGGER_WRITE( "CAudioMessageAppUi::HandleWsEventL: EEventFocusGroupChanged " );           	
+          	TInt windowGroupId = iEikonEnv->WsSession().GetFocusWindowGroup();
+
+          	if ( ( windowGroupId != iMyWgId  ) && ( windowGroupId != iFSWindowGroupId ) &&
+              	( windowGroupId != systemAppWgId ) && (windowGroupId != iAknNfySrvUi ) )
+            	if ( iProgressDlg )
+            		{                                       		
+AMSLOGGER_WRITE( "HandleWsEventL(): Event caused  iProgressDlg->Stop() " );            		                                      		
+AMSLOGGER_WRITEF( _L("iEikonEnv->WsSession().GetFocusWindowGroup() = : %d"), windowGroupId );
+              		iProgressDlg->Stop();
+              		
+             		// Release voice key
+          			if ( iVoiceKeyHandle >= 0 )
+              			{
+              		    iCoeEnv->RootWin().CancelCaptureKey( iVoiceKeyHandle );
+              			iVoiceKeyHandle = KAmsNotCaptured;
+              			}
+            		}	
+          	break;
+        	}
+
+        default:
+            {
+            break;
+            }
+    	}
+    CMsgEditorAppUi::HandleWsEventL( aEvent, aDestination );      	
+  	}
+
+
+// ---------------------------------------------------------
+// CAudioMessageAppUi::SaveAudioClipL
+// ---------------------------------------------------------
+//
+void CAudioMessageAppUi::SaveAudioClipL()
+    {
+    AMSLOGGER_WRITE( "CAudioMessageAppUi::SaveAudioClipL >>" ); 
+    TFileName fileName;
+    TDataType dataType( KMsgMimeAudioAmr );
+
+    CMsvStore* store = Document()->Mtm().Entry().ReadStoreL();
+    CleanupStack::PushL( store );
+    MMsvAttachmentManager& manager = store->AttachmentManagerL();
+ 
+	RFile rFile = manager.GetAttachmentFileL( Document()->iAudio );
+
+    rFile.Name(fileName);
+    const TPtrC newName = fileName;
+    
+    
+    CDocumentHandler* docHandler = CDocumentHandler::NewL( );
+    CleanupStack::PushL(docHandler);
+    CleanupClosePushL( rFile );
+
+    TInt ret = docHandler->CopyL( rFile,
+                            	newName,
+                                dataType,
+                                KEntryAttNormal );
+    if ( ret != KErrNone && ret != KUserCancel )
+        {
+        User::LeaveIfError( ret );
+        }
+    CleanupStack::PopAndDestroy(3, store);
+    AMSLOGGER_WRITE( "CAudioMessageAppUi::SaveAudioClipL <<" ); 
+    }
+
+// ---------------------------------------------------------
+// CAudioMessageAppUi::ShowAddressInfoNoteL
+// ---------------------------------------------------------
+//
+void CAudioMessageAppUi::ShowAddressInfoNoteL( const TDesC& aAddress, const TDesC& aAlias )
+    {
+    AMSLOGGER_WRITE( "CAudioMessageAppUi::ShowAddressInfoNoteL >>" ); 
+    TInt cleanupCount = 0;
+    HBufC* string = NULL;
+    HBufC* convertedAddress = NumberConversionLC( aAddress, ETrue );
+    cleanupCount++;
+
+    if ( aAlias.Length() == 0 )
+        {
+        string = StringLoader::LoadLC(
+            R_AUDIOMESSAGE_INFO_FAIL_RECIPIENT_NO_ALIAS,
+            *convertedAddress,
+            iCoeEnv );
+        cleanupCount++;
+        }
+    else
+        {
+        CDesCArrayFlat* stringArr = new ( ELeave ) CDesCArrayFlat( 2 );
+        CleanupStack::PushL( stringArr );
+        cleanupCount++;
+        stringArr->AppendL( aAlias );    //First string
+        stringArr->AppendL( *convertedAddress );  //Second string
+        string = StringLoader::LoadLC(
+            R_AUDIOMESSAGE_INFO_FAIL_RECIPIENT,
+            *stringArr,
+            iCoeEnv );
+        cleanupCount++;
+        }
+
+    CAknInformationNote* note = new ( ELeave ) CAknInformationNote( ETrue );
+    note->ExecuteLD( *string );
+    CleanupStack::PopAndDestroy( cleanupCount );  // string, (stringArr)
+    AMSLOGGER_WRITE( "CAudioMessageAppUi::ShowAddressInfoNoteL <<" ); 
+    }
+
+// ---------------------------------------------------------
+// CAudioMessageAppUi::DoCallToSenderL
+// ---------------------------------------------------------
+//
+void CAudioMessageAppUi::DoCallToSenderL()
+  	{
+  	AMSLOGGER_WRITE( "CAudioMessageAppUi::DoCallToSenderL >>" ); 
+    if ( !iMsgVoIPExtension )
+        {
+        return;
+        }
+  	
+    TPtrC senderAddr = KNullDesC( );
+    TPtrC alias = KNullDesC();
+    TPtrC focusedAddr = KNullDesC( );
+
+    senderAddr.Set( TMmsGenUtils::PureAddress( iMtm->Sender() ) );
+      
+    HBufC* ali = HBufC::NewL( KMaxAliasLength );
+    CleanupStack::PushL( ali ); 
+    TPtr aliPtr ( ali->Des() );
+    
+    TMmsGenUtils::GetAlias( 
+        iMtm->Sender() ,
+        aliPtr,
+        KMaxAliasLength,
+        FsSession()   ); 
+    alias.Set( aliPtr );
+
+    // find item not possible as there is no message body
+
+    MsvUiServiceUtilitiesInternal::InternetOrVoiceCallServiceL( 
+            *iMsgVoIPExtension,
+            senderAddr,
+            alias,
+            focusedAddr,
+            ETrue,
+            iEikonEnv );
+   CleanupStack::PopAndDestroy( ali ); 
+AMSLOGGER_WRITE( "CAudioMessageAppUi::DoCallToSenderL <<" ); 
+  	}
+
+// ---------------------------------------------------------
+// CAudioMessageAppUi::SetFindMode
+// ---------------------------------------------------------
+//
+void CAudioMessageAppUi::SetFindMode( TBool aEnable )
+    {
+    if ( iView )
+        {
+        CMsgBaseControl* fromControl = iView->ControlById( EMsgComponentIdFrom );
+        if ( fromControl && iMtm->Sender().Length() )
+            {
+            static_cast<CMsgAddressControl*>( fromControl )
+                ->SetAddressFieldAutoHighlight( aEnable );
+            }
+        }
+    }
+
+// ---------------------------------------------------------
+// CAudioMessageAppUi::HandleNotifyInt
+// ---------------------------------------------------------
+//
+void CAudioMessageAppUi::HandleNotifyInt( TUint32 /*aId*/, TInt aNewValue )
+    {
+    if ( aNewValue == 0 )
+        {
+        iEditorFlags &= ~EAutohighLightEnabled;
+        }
+    else
+        {
+        iEditorFlags |= EAutohighLightEnabled;
+        }
+    SetFindMode( iEditorFlags & EAutohighLightEnabled );
+    }
+
+// ---------------------------------------------------------
+// CAudioMessageAppUi::SetNaviPaneL
+// ---------------------------------------------------------
+//
+void CAudioMessageAppUi::SetNaviPaneL()
+	{
+   	CMsgBaseControl* ctrl = iView->FocusedControl();
+    if ( Document()->GetAppMode() == EAmsEditor )
+    	{
+	   	if (  ctrl->ControlId() == EMsgComponentIdImage )
+	       	{
+	  		UpdateEditorNaviFieldL( EAmsOnlyLength );
+	       	}
+	   	else
+	       	{
+	  		UpdateEditorNaviFieldL( EAmsTextEditorAndLength );
+	       	}
+    	}
+    else
+    	{
+	  	UpdateViewerNaviFieldL(  );
+    	}
+	}
+
+#ifdef RD_SCALABLE_UI_V2
+
+// -----------------------------------------------------------------------------
+// handles the touch-ui related control events for next/previous message
+// -----------------------------------------------------------------------------
+//
+void CAudioMessageAppUi::HandleNaviDecoratorEventL( TInt aEventID )     
+    {
+    if( IsNextMessageAvailableL( aEventID == EAknNaviDecoratorEventRightTabArrow ) )
+        {
+        /* no need for separate checks for right and left arrows
+            because IsNextMessageAvailableL() and NextMessageL
+            are called with the truth-value of the same comparison */
+        NextMessageL( aEventID == EAknNaviDecoratorEventRightTabArrow );
+        }
+    }
+
+#else
+void CAudioMessageAppUi::HandleNaviDecoratorEventL( TInt /* aEventID */)
+    {}
+#endif
+
+
+// ---------------------------------------------------------
+// CAudioMessageAppUi::DialogDismissedL
+//
+// This is a bit tricky. DialogDismissedL is called when wait dialog
+// is really dismissed from the screen. Wait dialog is not neccessary
+// dismmissed at once the ProcessFinishedL function is called. This 
+// is because of some minimum delayes etc. tied to the visibility of
+// wait dialog. But this more complex than that as wait dialog can be dismissed
+// by end key or escape key from the screen before the operation has really been
+// completed or cancelled. This needs to be taken into account here.
+// ---------------------------------------------------------
+//
+void CAudioMessageAppUi::DialogDismissedL( TInt dismissed )
+    {
+    if ( dismissed == EAknSoftkeyDone )
+        {
+        switch ( iWaitResId )
+            {
+            case R_QTN_AUDIOMESSAGE_WAIT_SAVING_MESSAGE :
+            case R_QTN_AUDIOMESSAGE_WAIT_SAVING_MESSAGE_NEW:
+                {
+                //We are still in saving phase. Prevents opening the options menu
+                if ( !iAbsorber )
+                    {
+                    iAbsorber = CAknInputBlock::NewLC();
+        	        CleanupStack::Pop( iAbsorber );
+                    }
+                DoOpComplete2ndPhaseL();
+                break;
+                }
+            case R_QTN_AUDIOMESSAGE_WAIT_INSERTING:
+                {
+                //There may have been fatal error in inserting
+                if ( iInsertOperation && iInsertOperation->GetError()<0 )
+                    {
+                    ;//Do nothing, error note is shown elsewhere and application is closed
+                    }
+                else
+                    {
+                    HBufC* labell = StringLoader::LoadLC( R_AUDIOMESSAGE_INSERTED );
+  		            CAknGlobalNote *globalNote = CAknGlobalNote::NewLC();
+	                globalNote->ShowNoteL( EAknGlobalInformationNote, *labell );
+	                CleanupStack::PopAndDestroy( globalNote );
+                    CleanupStack::PopAndDestroy( labell );
+                    }
+                  	 break;                 
+                }
+            case R_QTN_AUDIOMESSAGE_WAIT_SEND_MESSAGE:
+            case R_QTN_WAIT_MSG_SAVED_OUTBOX:
+                {
+                //We are still in sending/saving phase. Prevents opening the options menu
+                if ( !iAbsorber )
+                    {
+                    iAbsorber = CAknInputBlock::NewLC();
+        	        CleanupStack::Pop( iAbsorber );
+                    }
+                DoOpComplete2ndPhaseL();
+                break;
+                }   
+            case R_QTN_AUDIOMESSAGE_WAIT_OPENING_EDITOR:
+                {
+                break;
+                }    
+            default:
+                {
+                break;
+                }
+            }
+        }
+    else if ( dismissed == EEikBidCancel )
+        {
+        iWaitDialog = NULL;
+        }
+    
+    iWaitDialog = NULL;
+    iWaitResId = -1;
+    }
+
+// -----------------------------------------------------------------------------
+// Update softkeys
+// Err ID: EJJN-7J3BBY :: 05/09/2008 :: Purushotham Reddy K
+// -----------------------------------------------------------------------------
+//
+void CAudioMessageAppUi::DoUpdateSoftKeysL( TInt aSk )
+	{   
+    if ( iCurrentSkResId != aSk )
+    	{
+        CEikButtonGroupContainer* cba  = CEikButtonGroupContainer::Current();     
+        if(cba)
+            {
+            cba->SetCommandSetL( aSk  );
+            iCurrentSkResId = aSk;	
+    	    cba->DrawNow();
+            }
+    	}
+	}
+
+// -----------------------------------------------------------------------------
+// Update softkeys second version
+// This can be called without knowing the application state or focused item
+// -----------------------------------------------------------------------------
+//
+void CAudioMessageAppUi::UpdateSoftKeysL( )
+	{
+	CMsgBaseControl* ctrl = iView->FocusedControl();
+       	        
+    if ( Document()->GetAppMode() == EAmsViewer )
+		{
+        if ( ctrl->ControlId() == EMsgComponentIdImage)
+	        {
+            DoUpdateSoftKeysL( R_AUDIOMESSAGE_OPTIONS_PLAY_BACK);
+	        }
+	    else
+	        {   
+		    MenuBar()->SetContextMenuTitleResourceId(
+		        R_AUDIOMESSAGE_VIEWER_SELECTMENU );
+
+            DoUpdateSoftKeysL( R_AUDIOMESSAGE_OPTIONS_CONTEXTOPTIONS_BACK ); 	
+	        }
+		}
+	 else  //AppMode == EAmsEditor
+	    {
+	    if ( ctrl->ControlId() == EMsgComponentIdImage )
+	        {
+            //Now we are in the body we must check if the clip has already been recorded
+            if( Document()->GetClipStatus() != EAmsClipNone )
+            	{
+                DoUpdateSoftKeysL( R_AUDIOMESSAGE_OPTIONS_PLAY_CLOSE );
+                }
+            else 
+             	{
+                DoUpdateSoftKeysL( R_AUDIOMESSAGE_OPTIONS_RECORD_CLOSE );
+                }
+	        }
+	    else
+	        {
+	        DoUpdateSoftKeysL( R_AUDIOMESSAGE_OPTIONS_ADD_CLOSE );
+	        }
+	    }
+	}
+// ---------------------------------------------------------
+// CAudioMessageAppUi::DoEditMmsPriorityL
+// ---------------------------------------------------------
+void CAudioMessageAppUi::DoEditAmsPriorityL( )
+    {
+    AMSLOGGER_WRITE( "CAudioMessageAppUi::DoEditAmsPriorityL >>" ); 
+    TInt currentlySelected = 0;
+    switch( Document()->Mtm().MessagePriority(  ) )
+        {
+        case EMmsPriorityNormal:
+            currentlySelected = 1;
+            break;
+        case EMmsPriorityLow:
+            currentlySelected = 2;
+            break;
+        default:
+            break;
+        }
+     
+	// Create listbox    
+    CAknSingleGraphicPopupMenuStyleListBox* listBox 
+        = new (ELeave) CAknSingleGraphicPopupMenuStyleListBox;
+    CleanupStack::PushL( listBox );
+    
+    // Create popup
+    CAknPopupList* popup = CAknPopupList::NewL( 
+                listBox, 
+                R_AVKON_SOFTKEYS_SELECT_CANCEL, 
+                AknPopupLayouts::EMenuGraphicWindow );
+    CleanupStack::PushL( popup );
+
+	// Construct listbox
+    listBox->ConstructL( popup, CEikListBox::ELeftDownInViewRect );
+    listBox->CreateScrollBarFrameL( ETrue );
+    listBox->ScrollBarFrame( )->SetScrollBarVisibilityL( CEikScrollBarFrame::EOff,
+                                                      CEikScrollBarFrame::EAuto );
+  
+	// Set title    
+    HBufC* title = StringLoader::LoadLC( R_AUDIOMESSAGE_PRIORITY_TITLE, iCoeEnv );
+    popup->SetTitleL( title->Des( ) );
+    CleanupStack::PopAndDestroy( title );
+
+	CAknIconArray* iconArray = RadioButtonArrayL( );
+    listBox->ItemDrawer( )->FormattedCellData( )->SetIconArray( iconArray ); // FormattedCellData owns
+
+    listBox->HandleItemAdditionL( );
+
+    TResourceReader reader;
+    iEikonEnv->CreateResourceReaderLC( reader, R_AUDIOMESSAGE_PRIORITY_LIST );
+    
+    const TInt KSettingsGranularity = 4;
+    CDesCArrayFlat* items = new ( ELeave ) CDesCArrayFlat( KSettingsGranularity );
+    CleanupStack::PushL( items );
+
+    // Get the labels from resources
+    const TInt count = reader.ReadInt16();
+
+    for ( TInt loop = 0; loop < count; loop++ )
+        {
+        HBufC* label = reader.ReadHBufCL();        
+        CleanupStack::PushL( label );
+        TPtr pLabel = label->Des();
+        AknTextUtils::DisplayTextLanguageSpecificNumberConversion( pLabel );
+        
+        TBuf<20> itemString;
+        if( currentlySelected == loop )
+            { // This one is selected
+            itemString.AppendNum( 1 );
+            }
+        else
+            {
+            itemString.AppendNum( 0 );
+            }
+
+        _LIT( KT,"\t");
+        itemString.Append( KT );
+        itemString.Append( pLabel );
+        items->AppendL( itemString );
+        
+        CleanupStack::PopAndDestroy( label );
+        label = NULL;
+        }
+
+    CTextListBoxModel* model = listBox->Model( );
+    model->SetItemTextArray( items );
+    model->SetOwnershipType( ELbmOwnsItemArray );
+	CleanupStack::Pop( items ); // model owns it now  
+	CleanupStack::PopAndDestroy( ); // reader 
+    listBox->SetCurrentItemIndexAndDraw( currentlySelected );
+
+    TInt result = popup->ExecuteLD();
+ 
+    if( result )
+        {
+        // OK, user chose the priority bit
+        switch( listBox->CurrentItemIndex( ) )
+            {
+            case 0:
+                Document()->Mtm().SetMessagePriority( EMmsPriorityHigh );
+                break;
+            case 1:
+                Document()->Mtm().SetMessagePriority( EMmsPriorityNormal );
+                break;
+            default:
+                Document()->Mtm().SetMessagePriority( EMmsPriorityLow );
+                break;
+            }   
+        }
+    UpdateIndicatorIcons( (TMmsMessagePriority)Document()->Mtm().MessagePriority() );    
+    Document()->SetHeaderModified( ETrue ); //This makes us save headers in case of 
+                                            //Message details menu shown
+    CleanupStack::Pop( popup ); 
+    CleanupStack::PopAndDestroy( listBox );
+    AMSLOGGER_WRITE( "CAudioMessageAppUi::DoEditAmsPriorityL <<" ); 
+    }
+
+// ---------------------------------------------------------
+// CAudioMessageAppUi::RadioButtonArrayL
+// ---------------------------------------------------------
+CAknIconArray* CAudioMessageAppUi::RadioButtonArrayL( )
+	{
+    TFileName fileName;
+    fileName.Copy( KAvkonBitmapFile );
+
+    CAknIconArray* iconArray = new (ELeave) CAknIconArray( 2 );
+    CleanupStack::PushL( iconArray ); 
+
+    CFbsBitmap* bitmap = NULL;
+    CFbsBitmap* mask = NULL;
+    CGulIcon* icon = NULL;
+
+    TAknsItemID skinId = KAknsIIDQgnPropRadiobuttOff;
+    TInt bitmapId = EMbmAvkonQgn_prop_radiobutt_off;
+
+    AknsUtils::CreateIconL(
+        AknsUtils::SkinInstance(),
+        skinId,
+        bitmap,
+        mask,
+        fileName,
+        bitmapId,
+        bitmapId+1
+        );
+    CleanupStack::PushL( bitmap );
+    CleanupStack::PushL( mask );
+    icon = CGulIcon::NewL( bitmap, mask );
+    CleanupStack::Pop( mask );
+    CleanupStack::Pop( bitmap );
+    CleanupStack::PushL( icon ); 
+    iconArray->AppendL( icon );
+    CleanupStack::Pop( icon );   
+
+    skinId = KAknsIIDQgnPropRadiobuttOn;
+    bitmapId = EMbmAvkonQgn_prop_radiobutt_on;
+
+    AknsUtils::CreateIconL(
+        AknsUtils::SkinInstance(),
+        skinId,
+        bitmap,
+        mask,
+        fileName,
+        bitmapId,
+        bitmapId+1
+        );
+    CleanupStack::PushL( bitmap );
+    CleanupStack::PushL( mask );
+    icon = CGulIcon::NewL( bitmap, mask );
+    CleanupStack::Pop( mask );//popup mask first
+    CleanupStack::Pop( bitmap );//then bitmap
+    CleanupStack::PushL( icon ); 
+    iconArray->AppendL( icon );
+    CleanupStack::Pop( icon );   
+
+    CleanupStack::Pop( iconArray );
+    
+    return iconArray;
+	}
+
+// ---------------------------------------------------------
+// CAudioMessageAppUi::UpdateIndicatorIcons
+//
+// ---------------------------------------------------------
+//
+void CAudioMessageAppUi::UpdateIndicatorIcons( TMmsMessagePriority aPriority )
+    {
+    TInt priorityHigh;
+    TInt priorityLow;
+
+	if( aPriority == EMmsPriorityLow )
+	    {
+	    priorityHigh = EAknIndicatorStateOff;
+	    priorityLow = EAknIndicatorStateOn;
+	    }
+	else if( aPriority == EMmsPriorityHigh )
+	    {
+	    priorityHigh = EAknIndicatorStateOn;
+	    priorityLow = EAknIndicatorStateOff;
+	    }
+	else
+	    {
+	    priorityHigh = EAknIndicatorStateOff;
+	    priorityLow = EAknIndicatorStateOff;
+	    }
+
+    MAknEditingStateIndicator* editIndi = iAvkonEnv->EditingStateIndicator();
+        
+    CAknIndicatorContainer* naviIndi = 
+        static_cast<CAknIndicatorContainer*>( iNaviDecorator->DecoratedControl() );
+    
+    // Update the Edwin indicator pane
+    if( editIndi )
+        {
+        CAknIndicatorContainer* indiContainer = editIndi->IndicatorContainer();
+        if ( indiContainer )
+            {
+            indiContainer->SetIndicatorState(
+                        TUid::Uid(EAknNaviPaneEditorIndicatorMcePriorityHigh), 
+                        priorityHigh);
+            indiContainer->SetIndicatorState(
+                        TUid::Uid(EAknNaviPaneEditorIndicatorMcePriorityLow), 
+                        priorityLow);
+            }
+        }
+    // Update the navi indicator pane
+    if( naviIndi )
+        {
+        naviIndi->SetIndicatorState(TUid::Uid(EAknNaviPaneEditorIndicatorMcePriorityHigh), 
+                    priorityHigh);
+        naviIndi->SetIndicatorState(TUid::Uid(EAknNaviPaneEditorIndicatorMcePriorityLow), 
+                    priorityLow);
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// SendReadReportL
+// -----------------------------------------------------------------------------
+//
+void CAudioMessageAppUi::SendReadReportL( TAmsOperationEvent aEvent )
+    {
+    // send read report
+    if (    aEvent == 	EAmsOperationComplete
+        &&  Document( )->LaunchFlags() & EMsgUnreadMessage )
+        {
+        // Do not leave because of read report
+        iSendReadReportOperation = new (ELeave ) CAudioMessageSendReadReportOperation(
+                                                    *this,
+                                                    *Document( ) );
+        iSendReadReportOperation->SendReadReportL( );
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// DoHandleLocalZoomChangeL
+// -----------------------------------------------------------------------------
+//
+void CAudioMessageAppUi::DoHandleLocalZoomChangeL( TInt aCommand )
+	{
+	switch ( aCommand )
+		{	
+	    case EAmsDispSizeAutomatic:
+		    {
+		    HandleLocalZoomChangeL( EMsgDispSizeAutomatic );
+		    break;
+		    }
+        case EAmsDispSizeLarge:
+            {
+            HandleLocalZoomChangeL( EMsgDispSizeLarge );
+		    break;
+		    }
+        case EAmsDispSizeSmall:
+            {
+            HandleLocalZoomChangeL( EMsgDispSizeSmall );
+		    break;
+		    }
+	    default: //EAmsDispSizeNormal
+            {
+            HandleLocalZoomChangeL(  EMsgDispSizeNormal );
+		    break;
+		    }	    
+		}
+	}
+
+// -----------------------------------------------------------------------------
+// UnsupportedCallTypeOngoing
+// -----------------------------------------------------------------------------
+//
+TBool CAudioMessageAppUi::UnsupportedCallTypeOngoing(  )
+	{
+	TBool unsupported( EFalse );
+	TInt value( 0 );
+
+	TInt err( 0 );
+    RProperty property;
+    err = property.Attach( KPSUidCtsyCallInformation, KCTsyCallState );
+	if ( err )
+		{
+		return EFalse;
+		}
+
+    property.Get( value );
+
+    switch ( value )
+	    {
+    	case EPSCTsyCallStateUninitialized:
+    	case EPSCTsyCallStateNone:
+    		{ // No any kind of call in progress
+    		return EFalse;
+    		}
+		default: // Call in progress, check if it is videocall
+		    {
+		    err = property.Attach( KPSUidCtsyCallInformation,
+        		KCTsyCallType );
+        	if ( err )
+        		{
+        		return EFalse;
+        		}
+        	value = 0;
+    		property.Get( value );
+			break;
+		    }
+    	}
+
+	switch( value )
+		{
+		// Video call ongoing
+		case EPSCTsyCallTypeH324Multimedia:
+			{
+			unsupported = ETrue;
+			break;			
+			}
+		// Voip call ongoing
+		case EPSCTsyCallTypeVoIP:
+			{
+			unsupported = ETrue;
+			break;			
+			}			
+		}
+	
+	return unsupported;
+	}
+	
+TBool CAudioMessageAppUi::CheckIncomingCall(  )
+    {
+	TInt value( 0 );
+	TInt err( 0 );
+	RProperty property;
+	err  = property.Attach( KPSUidCtsyCallInformation, KCTsyCallState );
+	if ( err )
+		{
+		return EFalse;
+		}
+	property.Get( value );
+
+    switch ( value )
+        {
+		case EPSCTsyCallStateUninitialized:
+		case EPSCTsyCallStateNone:
+			{ // No any kind of call in progress
+			return EFalse;
+			}
+		default: // Call in progress, 
+	    	{
+			//we can return from here, as we found call in progress
+			return ETrue;
+	    	}
+        }
+    }
+// ---------------------------------------------------------
+// CAudioMessageAppUi::HandleIteratorEventL
+// ---------------------------------------------------------
+//
+#ifndef RD_MSG_NAVIPANE_IMPROVEMENT
+void CAudioMessageAppUi::HandleIteratorEventL( TMessageIteratorEvent aEvent )
+    {
+    if ( aEvent == EFolderCountChanged  )
+        {
+        SetNaviPaneL();
+        }
+    }
+#endif // RD_MSG_NAVIPANE_IMPROVEMENT
+
+
+// ---------------------------------------------------------
+// DynInitToolbarL
+// ---------------------------------------------------------
+//
+#ifdef RD_SCALABLE_UI_V2
+void CAudioMessageAppUi::DynInitToolbarL(  TInt            /*aResourceId*/, 
+                                        CAknToolbar*    /*aToolbar*/ )
+    {
+    }
+#endif        
+// ---------------------------------------------------------
+// OfferToolbarEventL
+// ---------------------------------------------------------
+//
+#ifdef RD_SCALABLE_UI_V2
+void CAudioMessageAppUi::OfferToolbarEventL( TInt aCommand )
+    {
+    switch ( aCommand )
+        {
+        case EAmsViewerToolbarReply:
+            if ( IsOwnMessage( ) )
+                {
+                HandleCommandL( EAmsViewerCmdReplyToAll );
+                }
+            else
+                {
+                HandleCommandL( EAmsViewerCmdReplyToSender );
+                }
+            
+            break;
+
+        case EAmsViewerToolbarForward:
+            HandleCommandL( EAmsViewerCmdForward );
+            break;
+
+        case EAmsViewerToolbarDelete:
+            HandleCommandL( EAmsViewerCmdRemoveAudio );
+            break;
+            
+        case EAmsEditorToolbarSend:
+            HandleCommandL( EAmsEditorCmdSend );
+            break;
+            
+        case EAmsEditorToolbarRecord:
+            HandleCommandL( EAmsEditorCmdRecordAudio );
+            break;
+            
+        case EAmsEditorToolbarAddRecipient:
+            HandleCommandL( EAmsEditorCmdAddRecipient );
+            break; 
+                   
+        default:
+            break;
+
+       
+        }
+    } 
+
+// ---------------------------------------------------------
+// SetEditorToolBarItemVisibilities
+// ---------------------------------------------------------
+//
+void CAudioMessageAppUi::SetEditorToolBarItemVisibilities()
+    {
+    /*TBool sendDimming( EFalse );
+    TBool recordDimming( EFalse );
+    TBool AddRecipientDimming( EFalse );*/
+    }
+
+// ---------------------------------------------------------
+// SetViewerToolBarItemVisibilities
+// ---------------------------------------------------------
+//
+void CAudioMessageAppUi::SetViewerToolBarItemVisibilities()
+    {
+    TBool replyDimming( EFalse );
+    
+    if ( iToolbar )
+        {                
+        if ( IsOwnMessage( ) || !HasSender( ) )
+            {
+            replyDimming = ETrue;
+            }
+
+        iToolbar->SetItemDimmed(    EAmsViewerToolbarReply,
+                                    replyDimming,
+                                    ETrue );
+        }
+    }
+    
+// ---------------------------------------------------------
+// CAudioMessageAppUi::IsOwnMessage
+// ---------------------------------------------------------
+//
+TBool CAudioMessageAppUi::IsOwnMessage( ) const
+    {
+    const TMmsMsvEntry* mmsEntry =
+        static_cast<const TMmsMsvEntry*>( &Document( )->Entry( ) );
+    return ( !(mmsEntry->IsMobileTerminated( ) ) );
+    }    
+    
+// ---------------------------------------------------------
+// CAudioMessageAppUi::HasSender
+// ---------------------------------------------------------
+//
+TBool CAudioMessageAppUi::HasSender( ) const
+    {
+    return ( iMtm->Sender( ).Length( ) > 0 );
+    }    
+#endif
+
+// ---------------------------------------------------------
+// CAudioMessageAppUi::HandleResourceChangeL
+// ---------------------------------------------------------
+//
+void CAudioMessageAppUi::HandleResourceChangeL( TInt aType )
+    {
+     // Base class call must be first
+    CMsgEditorAppUi::HandleResourceChangeL(aType);
+    
+    if ( aType == KAknsMessageSkinChange )
+        {
+        if ( iAppIcon )
+            {
+            delete iAppIcon;
+            iAppIcon = NULL;
+            }
+    
+        // Set path of bitmap file
+  	    TParse fileParse;
+  	    fileParse.Set( KAmsBitmapFileName, &KDC_APP_BITMAP_DIR, NULL );
+    
+        iAppIcon = AknsUtils::CreateGulIconL( 
+            AknsUtils::SkinInstance(), 
+            KAknsIIDQgnPropMceAudioTitle,
+            fileParse.FullName(),
+            EMbmAudiomessageQgn_prop_mce_audio_title,
+            EMbmAudiomessageQgn_prop_mce_audio_title_mask );
+        SetTitleIconL();   
+        }
+    else if ( aType == KEikDynamicLayoutVariantSwitch && Document()->IsLaunched() )
+        {
+        //The following does not change the icon but scales it
+        SetAudioClipIconL( Document()->GetRecordIconStatus() );  
+        
+        if ( !iMtm->Entry().Entry().ReadOnly() ) // editor
+    	    {
+    	    SetFixedToolbarL( R_AMSEDITOR_APP_TOOLBAR );      	        
+    	    }
+    	else
+    	    {
+    	    SetFixedToolbarL( R_AMSVIEWER_APP_TOOLBAR );
+    	    SetViewerToolBarItemVisibilities();
+    	    }    
+        SetTitleIconL();   
+        }
+     
+    }
+
+
+// ---------------------------------------------------------
+// CAudioMessageAppUi::SetTitleIconL
+// ---------------------------------------------------------
+//
+void CAudioMessageAppUi::SetTitleIconL()
+    {
+    SetTitleIconSize();
+    // Create duplicates of the icon to be used
+    CFbsBitmap* bitmap = new( ELeave ) CFbsBitmap();
+    CleanupStack::PushL( bitmap );
+    
+    CFbsBitmap* bitmapMask = new( ELeave ) CFbsBitmap();
+    CleanupStack::PushL( bitmapMask );
+    
+    User::LeaveIfError( bitmap->Duplicate( iAppIcon->Bitmap()->Handle() ) );
+    User::LeaveIfError( bitmapMask->Duplicate( iAppIcon->Mask()->Handle() ) );
+
+    iTitlePane->SetSmallPicture( bitmap, bitmapMask, ETrue );
+    iTitlePane->DrawNow();
+    
+    CleanupStack::Pop( bitmapMask );
+    CleanupStack::Pop( bitmap );
+    }
+    
+// ---------------------------------------------------------
+// CAudioMessageAppUi::SetTitleIconSize
+//
+// Sets the correct size from LAF for title icon
+// ---------------------------------------------------------
+//
+void CAudioMessageAppUi::SetTitleIconSize()
+    {
+    TRect mainPane;
+    AknLayoutUtils::LayoutMetricsRect( AknLayoutUtils::ETitlePane, mainPane );
+    TAknLayoutRect titleIconPaneLayoutRect;
+    
+    if ( AknStatuspaneUtils::StaconPaneActive() )
+        {
+        titleIconPaneLayoutRect.LayoutRect( 
+            mainPane,
+            AknLayoutScalable_Avkon::title_pane_stacon_g1( 0 ).LayoutLine() );
+        }
+    else
+        {
+        titleIconPaneLayoutRect.LayoutRect( 
+            mainPane,
+            AknLayoutScalable_Avkon::title_pane_g2( 0 ).LayoutLine() );
+        }
+    
+    TSize iconSize = titleIconPaneLayoutRect.Rect().Size();
+    AknIconUtils::SetSize( iAppIcon->Bitmap(), iconSize, EAspectRatioPreserved );
+    }    
+    
+// ---------------------------------------------------------
+// CAudioMessageAppUi::DoEnterKeyL
+// ---------------------------------------------------------
+//
+TBool CAudioMessageAppUi::DoEnterKeyL()
+    {
+    TBool result( EFalse );
+    CMsgBaseControl* ctrl = iView->FocusedControl();
+
+    if ( ctrl )
+        {
+        switch ( ctrl->ControlId() )
+            {
+            case EMsgComponentIdAudio:
+            case EMsgComponentIdImage:
+                {
+                DoSelectionKeyL();
+                result = ETrue;
+                break;
+                }
+                
+            case EMsgComponentIdFrom:
+                {
+                MenuBar()->SetMenuTitleResourceId( R_AUDIOMESSAGE_VIEWER_SELECTMENU );
+                MenuBar()->SetMenuType(CEikMenuBar::EMenuContext);
+                TRAP_IGNORE(MenuBar()->TryDisplayMenuBarL());
+                MenuBar()->SetMenuTitleResourceId( R_AUDIOMESSAGE_MENUBAR );
+                MenuBar()->SetMenuType(CEikMenuBar::EMenuOptions);
+                result = ETrue;
+                break;
+                }
+                
+            default:
+                {
+                break;
+                }
+            }
+        }
+    
+    return result;
+    }