diff -r 2eacb6118286 -r ba76fc04e6c2 phoneapp/phoneuicontrol/src/cphonestateincall.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phoneapp/phoneuicontrol/src/cphonestateincall.cpp Fri Jun 04 10:19:18 2010 +0100 @@ -0,0 +1,1586 @@ +/* +* Copyright (c) 2005-2009 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: Implementation of CPhoneStateInCall class. +* +*/ + + +// INCLUDES +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "cphonestateincall.h" +#include "tphonecmdparamboolean.h" +#include "tphonecmdparaminteger.h" +#include "tphonecmdparamstring.h" +#include "tphonecmdparamnote.h" +#include "tphonecmdparamquery.h" +#include "tphonecmdparamcallstatedata.h" +#include "tphonecmdparamsfidata.h" +#include "mphonestatemachine.h" +#include "phonestatedefinitions.h" +#include "phoneviewcommanddefinitions.h" +#include "phoneui.hrh" +#include "phonerssbase.h" +#include "cphonemainresourceresolver.h" +#include "phonelogger.h" +#include "phoneui.pan" +#include "cphonepubsubproxy.h" +#include "cphonedtmfwaitchartimer.h" +#include "tphonecmdparamcallheaderdata.h" +#include "cphonemediatorfactory.h" +#include "cphonemediatorsender.h" +#include "cphoneterminateallconnectionscommand.h" +#include "mphonecustomization.h" + +// ================= MEMBER FUNCTIONS ======================= + +// C++ default constructor can NOT contain any code, that +// might leave. +// +EXPORT_C CPhoneStateInCall::CPhoneStateInCall( + MPhoneStateMachine* aStateMachine, + MPhoneViewCommandHandle* aViewCommandHandle, + MPhoneCustomization* aCustomization ) : + CPhoneState( aStateMachine, aViewCommandHandle, aCustomization ), + iDtmfWaitCharTimer( NULL ) + { + } + +// ----------------------------------------------------------- +// CPhoneStateInCall::~CPhoneStateInCall() +// Destructor +// (other items were commented in a header). +// ----------------------------------------------------------- +// +EXPORT_C CPhoneStateInCall::~CPhoneStateInCall() + { + if( iDtmfWaitCharTimer ) + { + delete iDtmfWaitCharTimer; + } + } + +// ----------------------------------------------------------- +// CPhoneStateInCall::ConstructL() +// Constructor +// (other items were commented in a header). +// ----------------------------------------------------------- +// +EXPORT_C void CPhoneStateInCall::ConstructL() + { + __ASSERT_DEBUG( iStateMachine->PhoneEngineInfo(), + Panic( EPhoneCtrlInvariant ) ); + CPhoneState::BaseConstructL(); + // Enable the volume display + iViewCommandHandle->ExecuteCommandL( EPhoneViewShowNaviPaneAudioVolume ); + } + +// ----------------------------------------------------------- +// CPhoneStateInCall::NewL() +// Constructor +// (other items were commented in a header). +// ----------------------------------------------------------- +// +CPhoneStateInCall* CPhoneStateInCall::NewL( + MPhoneStateMachine* aStateMachine, + MPhoneViewCommandHandle* aViewCommandHandle, + MPhoneCustomization* aPhoneCustomization ) + { + CPhoneStateInCall* self = new (ELeave) CPhoneStateInCall( + aStateMachine, aViewCommandHandle, aPhoneCustomization ); + + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + + return self; + } + +// ----------------------------------------------------------- +// CPhoneStateInCall::HandleKeyMessageL +// ----------------------------------------------------------- +// +EXPORT_C void CPhoneStateInCall::HandleKeyMessageL( + TPhoneKeyEventMessages aMessage, + TKeyCode aCode ) + { + __LOGMETHODSTARTEND(EPhoneControl, + "CPhoneStateInCall::HandleKeyMessageL()" ); + switch ( aCode ) + { + // end-key + case EKeyNo: + HandleEndKeyPressL( aMessage ); + break; + + // Voice key + case EKeyDevice6: + HandleVoiceKeyPressL( aMessage ); + break; + +#ifdef RD_INTELLIGENT_TEXT_INPUT + case EKeyEnter: + if ( iOnScreenDialer && IsDTMFEditorVisibleL() ) + { + SendDtmfL(); + } + else if ( IsNumberEntryVisibleL() ) + { + HandleCommandL( EPhoneCmdOptions ); + } + break; +#endif + + default: + break; + } + } + +// ----------------------------------------------------------- +// CPhoneStateInCall::HandleNumberEntryClearedL() +// ----------------------------------------------------------- +// +EXPORT_C void CPhoneStateInCall::HandleNumberEntryClearedL() + { + __LOGMETHODSTARTEND(EPhoneControl, + "CPhoneStateInCall::HandleNumberEntryClearedL()" ); + // Update single call CBA when number entry is cleared + UpdateInCallCbaL(); + } + +// ----------------------------------------------------------- +// CPhoneStateInCall::HandlePhoneEngineMessageL +// ----------------------------------------------------------- +// +EXPORT_C void CPhoneStateInCall::HandlePhoneEngineMessageL( + const TInt aMessage, + TInt aCallId ) + { + __LOGMETHODSTARTEND(EPhoneControl, + "CPhoneStateInCall::HandlePhoneEngineMessageL()" ); + switch ( aMessage ) + { + case MEngineMonitor::EPEMessageIdle: + HandleIdleL( aCallId ); + break; + + case MEngineMonitor::EPEMessageAudioMuteChanged: + HandleAudioMuteChangedL(); + break; + + case MEngineMonitor::EPEMessageAudioOutputChanged: + HandleAudioOutputChangedL(); + break; + + case MEngineMonitor::EPEMessageSendingDTMF: + case MEngineMonitor::EPEMessageContinuingDTMFSending: + HandleSendingDTMFL(); + break; + + case MEngineMonitor::EPEMessageStoppedDTMF: + HandleStoppedDTMFL(); + break; + + case MEngineMonitor::EPEMessageSentDTMF: + case MEngineMonitor::EPEMessageDTMFSendingAborted: + CancelDTMFSendingL(); + break; + + case MEngineMonitor::EPEMessagePromptSpeedDial: + HandleDTMFPromptSpeedDialL(); + break; + + case MEngineMonitor::EPEMessageSpeedDialNotAssigned: + CPhoneState::SendGlobalErrorNoteL( + EPhoneDtmfSpeedDialNotAssigned ); + break; + + case MEngineMonitor::EPEMessageInvalidSpeedDial: + CPhoneState::SendGlobalErrorNoteL( EPhoneDtmfInvalidSpeedDial ); + break; + + case MEngineMonitor::EPEMessageAudioVolumeChanged: + HandleAudioVolumeChangedL(); + break; + + case MEngineMonitor::EPEMessageDisconnecting: + CancelDTMFSendingL(); + if ( !CPhoneState::IsAnyConnectedCalls() ) + { + CloseDtmfQueryL(); + } + CPhoneState::HandlePhoneEngineMessageL( aMessage, aCallId ); + break; + + case MEngineMonitor::EPEMessageInValidEmergencyNumber: + SendGlobalErrorNoteL( EPhoneNoteTextNotAllowed ); + break; + + case MEngineMonitor::EPEMessageValidEmergencyNumber: + DialVoiceCallL(); + break; + + case MEngineMonitor::EPEMessageRemotePartyInfoChanged: + // If there is a waiting call then update header and label + // else forward message to CPhoneState. + if ( IsWaitingCallL( aCallId ) ) + { + // Update remote info data and label. + UpdateRemoteInfoDataAndLabelL( aCallId, UpdateCallHeaderInfoL( aCallId ) ); + } + else + { + CPhoneState::HandlePhoneEngineMessageL( aMessage, aCallId ); + } + break; + + default: + CPhoneState::HandlePhoneEngineMessageL( aMessage, aCallId ); + break; + } + } + +// ----------------------------------------------------------- +// CPhoneStateInCall::UpdateRemoteInfoDataAndLabelL +// ----------------------------------------------------------- +// +void CPhoneStateInCall::UpdateRemoteInfoDataAndLabelL( + TInt aCallId, + TPhoneCmdParamCallHeaderData aCallHeaderParam ) + { + __LOGMETHODSTARTEND(EPhoneControl, + "CPhoneStateInCall::UpdateRemoteInfoDataAndLabelL ()" ); + // Update the remote info data in the call header + iViewCommandHandle->ExecuteCommandL( + EPhoneViewUpdateCallHeaderRemoteInfoDataAndLabel, + aCallId, + &aCallHeaderParam ); + } + +// ----------------------------------------------------------- +// CPhoneStateInCall::HandleIdleL +// ----------------------------------------------------------- +// +EXPORT_C void CPhoneStateInCall::HandleIdleL( TInt aCallId ) + { + __LOGMETHODSTARTEND(EPhoneControl, + "CPhoneStateInCall::HandleIdleL()" ); + __ASSERT_DEBUG( aCallId >= 0, Panic( EPhoneCtrlParameterNotInitialized ) ); + // Remove call + iViewCommandHandle->ExecuteCommandL( EPhoneViewRemoveCallHeader, aCallId ); + + //Make sure that toolbar is not shown + iViewCommandHandle->ExecuteCommandL( EPhoneViewHideToolbar ); + BeginTransEffectLC( ENumberEntryOpen ); + BeginUiUpdateLC(); + SetDefaultFlagsL(); + if ( IsNumberEntryUsedL() ) + { + // Show the number entry if it exists and update cba's. + SetNumberEntryVisibilityL( ETrue ); + + // Close dtmf dialer when call is disconnected. + if ( IsDTMFEditorVisibleL() ) + { + CloseDTMFEditorL(); + + // Display idle screen and update CBA's + DisplayIdleScreenL(); + } + else if ( iOnScreenDialer && IsCustomizedDialerVisibleL() ) + { + CloseCustomizedDialerL(); + // Display idle screen and update CBA's + DisplayIdleScreenL(); + } + } + else + { + // Close menu bar, if it is displayed + iViewCommandHandle->ExecuteCommandL( EPhoneViewMenuBarClose ); + + if ( !TopAppIsDisplayedL() || IsAutoLockOn() ) + { + // Continue displaying current app but set up the + // idle screen in the background + SetupIdleScreenInBackgroundL(); + } + else + { + // Display idle screen and update CBAs + DisplayIdleScreenL(); + } + } + + DeleteTouchPaneButtons(); + EndUiUpdate(); + EndTransEffect(); + // Display call termination note, if necessary + DisplayCallTerminationNoteL(); + + // Go to idle state + iStateMachine->ChangeState( EPhoneStateIdle ); + } + +// ----------------------------------------------------------- +// CPhoneStateInCall::UpdateInCallCbaL +// ----------------------------------------------------------- +// +EXPORT_C void CPhoneStateInCall::UpdateInCallCbaL() + { + __LOGMETHODSTARTEND(EPhoneControl, "CPhoneStateInCall::UpdateInCallCbaL() "); + UpdateCbaL( EPhoneCallHandlingInCallCBA ); + } + +// ----------------------------------------------------------- +// CPhoneStateInCall::UpdateCbaL +// ----------------------------------------------------------- +// +EXPORT_C void CPhoneStateInCall::UpdateCbaL( TInt aResource ) + { + __LOGMETHODSTARTEND(EPhoneControl, "CPhoneStateInCall::UpdateCbaL() "); + if ( iOnScreenDialer && IsDTMFEditorVisibleL() ) + { + iCbaManager->SetCbaL( EPhoneDtmfDialerCBA ); + } + else if ( iOnScreenDialer && IsCustomizedDialerVisibleL() ) + { + iCbaManager->SetCbaL( CustomizedDialerCbaResourceIdL() ); + } + else + { + iCbaManager->UpdateCbaL( aResource ); + } + } + +// ----------------------------------------------------------- +// CPhoneStateInCall::HandleAudioMuteChangedL +// ----------------------------------------------------------- +// +void CPhoneStateInCall::HandleAudioMuteChangedL() + { + __LOGMETHODSTARTEND(EPhoneControl, + "CPhoneStateInCall::HandleAudioMuteChangedL()" ); + CPhoneState::HandleAudioMuteChangedL(); + + // Update the single call CBA only if the number entry is not + // used + if ( !IsNumberEntryUsedL() ) + { + // Go to current state implementation + UpdateInCallCbaL(); + } + } + +// ----------------------------------------------------------- +// CPhoneStateInCall::HandleAudioOutputChangedL +// ----------------------------------------------------------- +// +void CPhoneStateInCall::HandleAudioOutputChangedL() + { + __LOGMETHODSTARTEND(EPhoneControl, + "CPhoneStateInCall::HandleAudioOutputChangedL()" ); + // Handle the handsfree mode change + CPhoneState::HandleAudioOutputChangedL(); + + // Update the single call CBA only if the number entry is not + // used + if ( !IsNumberEntryVisibleL() ) + { + // Go to current state implementation + UpdateInCallCbaL(); + } + } + +// ----------------------------------------------------------- +// CPhoneStateInCall::HandleAudioVolumeChangedL +// ----------------------------------------------------------- +// +void CPhoneStateInCall::HandleAudioVolumeChangedL() + { + __LOGMETHODSTARTEND(EPhoneControl, + "CPhoneStateInCall::HandleAudioVolumeChangedL()" ); + // Update the volume display + TInt audioVolume = iStateMachine->PhoneEngineInfo()->AudioVolume(); + TPhoneCmdParamInteger volumeParam; + volumeParam.SetInteger( audioVolume ); + iViewCommandHandle->ExecuteCommandL( EPhoneViewSetNaviPaneAudioVolume, + &volumeParam ); + } + +// ----------------------------------------------------------- +// CPhoneStateInCall::HandleSendingDTMFL +// ----------------------------------------------------------- +// +void CPhoneStateInCall::HandleSendingDTMFL() + { + __LOGMETHODSTARTEND(EPhoneControl, + "CPhoneStateInCall::HandleSendingDTMFL()" ); + TPhoneCmdParamNote noteParam; + noteParam.SetType( EPhoneNoteDtmfSending ); + noteParam.SetResourceId( CPhoneMainResourceResolver::Instance()-> + ResolveResourceID( EPhoneSendingDtmfWaitNote ) ); + + // Show the "Sending..." Wait Note, and pre-populate it + // with the PhoneEngine's current DTMF String. + // Set the text for the wait-note. + TPEDtmfString dtmfString = iStateMachine->PhoneEngineInfo()->DtmfString(); + HBufC* noteText = StringLoader::LoadLC( + CPhoneMainResourceResolver::Instance()-> + ResolveResourceID( EPhoneSendingDtmfWaitNoteText ), + dtmfString ); + noteParam.SetText( *noteText ); + + iViewCommandHandle->ExecuteCommandL( EPhoneViewShowNote, ¬eParam ); + + CleanupStack::PopAndDestroy( noteText ); + } + +// ----------------------------------------------------------- +// CPhoneStateInCall::HandleStoppedDTMFL +// ----------------------------------------------------------- +// +void CPhoneStateInCall::HandleStoppedDTMFL() + { + __LOGMETHODSTARTEND(EPhoneControl, + "CPhoneStateInCall::HandleStoppedDTMFL()" ); + // Remove the Sending... note + iViewCommandHandle->ExecuteCommandL( EPhoneViewRemoveNote ); + + // Fetch the remaining (unparsed) portion of the DTMF String + // from PhoneEngine + TPEDtmfString dtmfString = iStateMachine->PhoneEngineInfo()->DtmfString(); + + if ( dtmfString.Length() ) + { + // Show the DTMF Wait Character confirmation query + TPhoneCmdParamQuery queryParam; + queryParam.SetQueryType( EPhoneQueryDialog ); + queryParam.SetQueryResourceId( + CPhoneMainResourceResolver::Instance()->ResolveResourceID( + EPhoneDtmfWaitCharacterConfirmationQuery ) ); + + // Append the PhoneEngine's current DTMF String to the query's prompt + HBufC* queryPrompt = StringLoader::LoadLC( + CPhoneMainResourceResolver::Instance()->ResolveResourceID( + EPhoneDtmfWaitCharacterConfirmationQueryText ), + dtmfString ); + queryParam.SetQueryPrompt( *queryPrompt ); + + iViewCommandHandle->ExecuteCommandL( EPhoneViewShowQuery, + &queryParam ); + + CleanupStack::PopAndDestroy( queryPrompt ); + } + else + { + // Stop the asynchronous sending operation the + // PhoneEngine may be performing. + iStateMachine->SendPhoneEngineMessage( + MPEPhoneModel::EPEMessageStopDTMFSending ); + + // Prompt for more characters by showing DTMF query with empty string + HBufC* emptyString = HBufC::NewLC( KPhoneNumberEntryBufferSize ); + TPtr ptr( emptyString->Des() ); + + ShowDtmfTextQueryL( + CPhoneMainResourceResolver::Instance()-> + ResolveResourceID( EPhoneDtmfNumberQuery ), + CPhoneMainResourceResolver::Instance()-> + ResolveResourceID( EPhoneSendDtmfEmptyEditBoxCBA ), + CPhoneMainResourceResolver::Instance()-> + ResolveResourceID( EPhoneSendDtmfNormalEditBoxCBA ), + &ptr ); + + CleanupStack::PopAndDestroy( emptyString ); + } + } + +// ----------------------------------------------------------- +// CPhoneStateInCall::CancelDTMFSendingL +// ----------------------------------------------------------- +// +void CPhoneStateInCall::CancelDTMFSendingL() + { + __LOGMETHODSTARTEND(EPhoneControl, + "CPhoneStateInCall::CancelDTMFSendingL()" ); + // Remove the Sending... note + iViewCommandHandle->ExecuteCommandL( EPhoneViewRemoveDtmfNote ); + } + +// ----------------------------------------------------------- +// CPhoneStateInCall::HandleDtmfPromptSpeedDialL +// ----------------------------------------------------------- +// +void CPhoneStateInCall::HandleDTMFPromptSpeedDialL() + { + __LOGMETHODSTARTEND(EPhoneControl, + "CPhoneStateInCall::HandleDTMFPromptSpeedDialL()" ); + // Remove the Sending... note + iViewCommandHandle->ExecuteCommandL( EPhoneViewRemoveNote ); + + // Prompt for speed dial number + HBufC* emptyString = HBufC::NewLC( KPhoneNumberEntryBufferSize ); + TPtr ptr( emptyString->Des() ); + + // If the Search softkey is selected before a speed dial number is entered, + // revert back to the DTMF query + ShowDtmfTextQueryL( + CPhoneMainResourceResolver::Instance()-> + ResolveResourceID( EPhoneDtmfSpeedDialNumberQuery ), + CPhoneMainResourceResolver::Instance()-> + ResolveResourceID( EPhoneSendDtmfEmptyEditBoxCBA ), + CPhoneMainResourceResolver::Instance()-> + ResolveResourceID( EPhoneDtmfSpeedDialNormalEditBoxCBA ), + &ptr ); + + CleanupStack::PopAndDestroy( emptyString ); + } + +// ----------------------------------------------------------- +// CPhoneStateInCall::HandleCommandL +// ----------------------------------------------------------- +// +EXPORT_C TBool CPhoneStateInCall::HandleCommandL( TInt aCommand ) + { + __LOGMETHODSTARTEND( EPhoneControl, + "CPhoneStateInCall::HandleCommandL()" ); + __PHONELOG1 ( EBasic, EPhoneControl, + "CPhoneStateInCall::HandleCommandL() - aCommand = %d ", aCommand ); + TBool commandStatus = ETrue; + + switch( aCommand ) + { + case EPhoneInCallCmdDialer: + iViewCommandHandle->ExecuteCommandL( EPhoneViewOpenDialer ); + break; + case EPhoneCmdOptions: + OpenMenuBarL(); + break; + + case EPhoneDtmfDialerCancel: + { + CloseDTMFEditorL(); + + // Activate DTMF list query when cancel is pressed. + // Forwards command to the framework + HandleCommandL( EPhoneInCallCmdDtmfListQuery ); + } + break; + case EPhoneDtmfDialerExit: + { + CloseDTMFEditorL(); + } + break; + + case EPhoneInCallCmdEndThisActiveCall: + CPhoneState::DisconnectCallL(); + break; + + case EPhoneCallComingCmdReject: // fall through + case EPhoneInCallCmdReject: + iStateMachine->SendPhoneEngineMessage( + MPEPhoneModel::EPEMessageReject ); + break; + + case EPhoneInCallCmdMute: // fall through + case EPhoneInCallCmdUnmute: + iStateMachine->PhoneEngineInfo()->SetAudioMuteCommand( + ( aCommand == EPhoneInCallCmdMute ) ); + iStateMachine->SendPhoneEngineMessage( + MPEPhoneModel::EPEMessageSetAudioMute ); + break; + //DTMF list query - dialog + case EPhoneInCallCmdDtmfListQuery: + LaunchDtmfListQueryL(); + break; + + //DTMF list query - Search + case EPhoneInCallCmdDtmfListViewSearch: + LaunchDtmfListViewSearchDialogL(); + break; + + //DTMF manual entry + case EPhoneInCallCmdDtmfManualQuery: + if ( iOnScreenDialer ) + { + ShowDtmfDialerL(); + } + else + { + LaunchDtmfManualQueryL(); + } + break; + + // DTMF manual entry - Search + case EPhoneCmdDtmfSearch: + LaunchDtmfSearchDialogL(); + break; + + // DTMF entry - Ok + case EPhoneCmdDtmfOk: + SendDtmfL(); + break; + + // DTMF Speed entry - Ok + case EPhoneCmdDtmfSpeedDialOk: + SendDtmfSpeedDialNumberL(); + break; + + // DTMF sending - Cancel + case EPhoneInCallCmdCancelSendingDtmfString: + // Stop the asynchronous sending operation the + // PhoneEngine may be performing. + iStateMachine->SendPhoneEngineMessage( + MPEPhoneModel::EPEMessageStopDTMFSending ); + // Remove DTMF sending from screen + iViewCommandHandle->ExecuteCommandL( EPhoneViewRemoveNote ); + break; + + // DTMF wait - Ok + case EPhoneInCallCmdContinueSendingDtmfString: + // Continue sending the DTMF string + if( !iDtmfWaitCharTimer ) + { + iDtmfWaitCharTimer = CPhoneDtmfWaitCharTimer::NewL( + iStateMachine ); + } + iDtmfWaitCharTimer->ButtonPressedL(); + break; + + case EPhoneDialerCmdHelpDtmf: + { + if ( FeatureManager::FeatureSupported( KFeatureIdHelp ) ) + { + TPtrC contextName( KDATA_DIALER_HLP_SEND_DTMF ); + iViewCommandHandle->ExecuteCommandL( + EPhoneViewLaunchHelpApplication, + 0, + contextName ); + } + } + break; + + // New Call - Search + case EPhoneInCallCmdNewCallFind: + LaunchNewCallSearchDialogL(); + break; + + // New Call - Dialog + case EPhoneInCallCmdNewCall: + LaunchNewCallQueryL(); + break; + + case EPhoneViewYesSingleItemFetch: + HandleSuccessFetchedNumberL(); + break; + + case EPhoneViewNoSingleItemFetch: + if ( !iOnScreenDialer ) + { + HandleFailedFetchedNumberL(); + } + break; + + case EPhoneNumberAcqCmdCall: + case EPhoneNumberAcqCmdSendCommand: + if ( IsVideoCallActiveL() ) + { + // Get the number entry contents + HBufC *phoneNumber = HBufC::NewLC( KPhoneNumberEntryBufferSize ); + TPtr ptr( phoneNumber->Des() ); + TPhoneCmdParamString stringParam; + stringParam.SetString( &ptr ); + iViewCommandHandle->ExecuteCommand( + EPhoneViewGetNumberFromEntry, + &stringParam ); + iStateMachine->PhoneEngineInfo()->SetPhoneNumber( ptr ); + + if ( iStateMachine->PhoneEngineInfo()->PhoneNumberIsServiceCode() || + phoneNumber->Des().Length() < KPhoneValidPhoneNumberLength ) + { + // Send a manual control sequence by providing number + // information with dial command + CallFromNumberEntryL(); + } + else + { + iStateMachine->SendPhoneEngineMessage( + MPEPhoneModel::EPEMessageCheckEmergencyNumber ); + } + CleanupStack::PopAndDestroy( phoneNumber ); + } + else + { + // Provide number information with dial command + CallFromNumberEntryL(); + } + break; + + case EPhoneInCallCmdHelp: + if ( FeatureManager::FeatureSupported( KFeatureIdHelp ) ) + { + TPtrC contextName; + if ( IsVideoCallActiveL() ) + { + contextName.Set( KINCAL_HLP_VIDEOCALL() ); + } + else + { + contextName.Set( KINCAL_HLP_CALL_HANDLING() ); + } + iViewCommandHandle->ExecuteCommandL( + EPhoneViewLaunchHelpApplication, 0, contextName ); + } + break; + + case EPhoneCmdEnd: + CloseDtmfQueryL(); + CPhoneState::DisconnectCallL(); + break; + + // 'End all calls' from menu + case EPhoneInCallCmdEndAllCalls: + iStateMachine->SendPhoneEngineMessage( + MPEPhoneModel::EPEMessageReleaseAll ); + break; + + case EPhoneInCallCmdEndThisOutgoingCall: + DisconnectOutgoingCallL(); + break; + + case EPhoneInCallCmdGoToIdle: + { + // Bring Idle app to foreground + iViewCommandHandle->ExecuteCommandL( EPhoneViewBringIdleToForeground ); + break; + } + + case EPhoneNumberAcqCmdVideoCall: + {// Create normal voice call, if number is emergency number. + // Get the number entry contents + HBufC* phoneNumber = PhoneNumberFromEntryLC(); + iStateMachine->PhoneEngineInfo()->SetPhoneNumber( *phoneNumber ); + iStateMachine->SendPhoneEngineMessage( + MPEPhoneModel::EPEMessageCheckEmergencyNumber ); + CleanupStack::PopAndDestroy( phoneNumber );} + break; + + case EPhoneInCallCmdLockKeypad: + case EPhoneInCallCmdLockScreen: + LockKeypadL(); + break; + + case EPhoneViewOpenCallHandling: + if ( iOnScreenDialer && IsNumberEntryUsedL() ) + { + // Remove number entry from screen + iViewCommandHandle->ExecuteCommandL( EPhoneViewRemoveNumberEntry ); + HandleNumberEntryClearedL(); + } + commandStatus = CPhoneState::HandleCommandL( aCommand ); + break; + + default: + commandStatus = CPhoneState::HandleCommandL( aCommand ); + break; + } + + return commandStatus; + } + +// ----------------------------------------------------------- +// CPhoneStateInCall::CreateNumberEntryL +// ----------------------------------------------------------- +// +EXPORT_C void CPhoneStateInCall::CreateNumberEntryL() + { + __LOGMETHODSTARTEND( EPhoneControl, "CPhoneStateInCall::CreateNumberEntryL( ) "); + iViewCommandHandle->ExecuteCommandL( EPhoneViewCreateNumberEntry ); + } + +// ----------------------------------------------------------- +// CPhoneStateInCall::OpenMenuBarL +// ----------------------------------------------------------- +// +EXPORT_C void CPhoneStateInCall::OpenMenuBarL() + { + __LOGMETHODSTARTEND(EPhoneControl, + "CPhoneStateInCall::OpenMenuBarL()" ); + TInt resourceId; + + if ( iOnScreenDialer && IsDTMFEditorVisibleL() ) + { + resourceId = EPhoneDtmfDialerMenubar; + } + else if ( iOnScreenDialer && IsCustomizedDialerVisibleL() ) + { + resourceId = CustomizedDialerMenuResourceIdL(); + } + else if ( IsNumberEntryVisibleL() ) + { + resourceId = EPhoneCallHandlingMenubarWithNumberEntry; + } + else + { + resourceId = EPhoneCallHandlingMenubar; + } + + TPhoneCmdParamInteger integerParam; + integerParam.SetInteger( + CPhoneMainResourceResolver::Instance()-> + ResolveResourceID( resourceId ) ); + iViewCommandHandle->ExecuteCommandL( EPhoneViewMenuBarOpen, + &integerParam ); + } + +// ----------------------------------------------------------- +// CPhoneStateInCall::LaunchNewCallQueryL +// ----------------------------------------------------------- +// +EXPORT_C void CPhoneStateInCall::LaunchNewCallQueryL() + { + __LOGMETHODSTARTEND(EPhoneControl, + "CPhoneStateInCall::LaunchNewCallQueryL()" ); + + if ( iOnScreenDialer ) + { + //In touch, just activate dialer + BeginTransEffectLC( ENumberEntryCreate ); + if ( IsNumberEntryUsedL() ) + { + SetNumberEntryVisibilityL(ETrue); + } + else + { + CreateNumberEntryL(); + SetNumberEntryVisibilityL(ETrue); + } + EndTransEffect(); + } + else + { + HBufC *text = HBufC::NewLC( KPhoneNumberEntryBufferSize ); + TPtr ptr( text->Des() ); + + // Pre-populate the query with the number entry contents, + // if it exists + if ( IsNumberEntryUsedL() ) + { + // get the number entry contents + TPhoneCmdParamString stringParam; + stringParam.SetString( &ptr ); + iViewCommandHandle->ExecuteCommandL( + EPhoneViewGetLocalizedNumberFromEntry, + &stringParam ); + } + + // Show text query with send key enabled + const TBool enableSendKey = ETrue; + + CPhoneState::ShowTextQueryL( + CPhoneMainResourceResolver::Instance()-> + ResolveResourceID( EPhoneNewCallPhoneNumberEditor ), + CPhoneMainResourceResolver::Instance()-> + ResolveResourceID( EPhoneCallHandlingNewCallFindCBA ), + CPhoneMainResourceResolver::Instance()-> + ResolveResourceID( EPhoneCallHandlingNewCallCallCBA ), + &ptr, + enableSendKey ); + + CleanupStack::PopAndDestroy( text ); + } + + } + +// ----------------------------------------------------------- +// CPhoneStateInCall::CallFetchedNumberL +// ----------------------------------------------------------- +// +EXPORT_C void CPhoneStateInCall::CallFetchedNumberL( + const TDesC& aFetchedNumber ) + { + __LOGMETHODSTARTEND(EPhoneControl, + "CPhoneStateInCall::CallFetchedNumberL()" ); + __ASSERT_DEBUG( iStateMachine->PhoneEngineInfo(), + Panic( EPhoneCtrlInvariant ) ); + + // Store the phone number + iStateMachine->PhoneEngineInfo()->SetPhoneNumber( aFetchedNumber ); + + DialVoiceCallL(); + } + +// ----------------------------------------------------------- +// CPhoneStateInCall::SendDtmfL +// ----------------------------------------------------------- +// +void CPhoneStateInCall::SendDtmfL() + { + __LOGMETHODSTARTEND(EPhoneControl, + "CPhoneStateInCall::SendDtmfL()" ); + __ASSERT_DEBUG( iStateMachine->PhoneEngineInfo(), + Panic( EPhoneCtrlInvariant ) ); + + // First get the DTMF sequence from dialog + TPhoneCmdParamString dtmfSequence; + HBufC *content = HBufC::NewLC( KPEDtmfMaxLength ); + TPtr ptr( content->Des() ); + dtmfSequence.SetString( &ptr ); + + if ( iOnScreenDialer && IsDTMFEditorVisibleL() ) + { + iViewCommandHandle->ExecuteCommand( + EPhoneViewGetNumberFromEntry, + &dtmfSequence ); + + CloseDTMFEditorL(); + } + else + { + iViewCommandHandle->ExecuteCommandL( EPhoneViewGetTextQueryContent, + &dtmfSequence ); + } + + // Send the DTMF + if ( ptr.Length() ) + { + iStateMachine->PhoneEngineInfo()->SetDtmfStringCommand( ptr ); + iStateMachine->SendPhoneEngineMessage( + MPEPhoneModel::EPEMessageSendDTMF ); + } + + CleanupStack::PopAndDestroy( content ); + } + +// ----------------------------------------------------------- +// CPhoneStateInCall::SendDtmfSpeedDialNumberL +// ----------------------------------------------------------- +// +void CPhoneStateInCall::SendDtmfSpeedDialNumberL() + { + __LOGMETHODSTARTEND(EPhoneControl, + "CPhoneStateInCall::SendDtmfSpeedDialNumberL()" ); + // First get the DTMF sequence from dialog + TPhoneCmdParamString dtmfSequence; + HBufC *content = HBufC::NewLC( KPEDtmfMaxLength ); + TPtr ptr( content->Des() ); + dtmfSequence.SetString( &ptr ); + iViewCommandHandle->ExecuteCommandL( EPhoneViewGetTextQueryContent, + &dtmfSequence ); + + // Prefix the query content string with the speed dial character '+' + _LIT( KSpeedDialPrefix, "+" ); + ptr.Insert( 0, KSpeedDialPrefix ); + + // Send the DTMF + iStateMachine->PhoneEngineInfo()->SetDtmfStringCommand( ptr ); + iStateMachine->SendPhoneEngineMessage( + MPEPhoneModel::EPEMessageSendDTMF ); + + CleanupStack::PopAndDestroy( content ); + } + +// ----------------------------------------------------------- +// CPhoneStateInCall::LaunchDtmfManualQueryL +// ----------------------------------------------------------- +// +void CPhoneStateInCall::LaunchDtmfManualQueryL() + { + __LOGMETHODSTARTEND(EPhoneControl, "CPhoneStateInCall::LaunchDtmfManualQueryL()" ); + + HBufC *text = HBufC::NewLC( KPhoneNumberEntryBufferSize ); + TPtr ptr( text->Des() ); + // Pre-populate the query with the number entry contents, if it exists + if ( IsNumberEntryUsedL() ) + { + // get the number entry contents + TPhoneCmdParamString stringParam; + stringParam.SetString( &ptr ); + iViewCommandHandle->ExecuteCommandL( + EPhoneViewGetLocalizedNumberFromEntry, + &stringParam ); + } + + ShowDtmfTextQueryL( + CPhoneMainResourceResolver::Instance()-> + ResolveResourceID( EPhoneDtmfNumberQuery ), + CPhoneMainResourceResolver::Instance()-> + ResolveResourceID( EPhoneSendDtmfEmptyEditBoxCBA ), + CPhoneMainResourceResolver::Instance()-> + ResolveResourceID( EPhoneSendDtmfNormalEditBoxCBA ), + &ptr ); + CleanupStack::PopAndDestroy( text ); + } + +// ----------------------------------------------------------- +// CPhoneStateInCall::LaunchDtmfListQueryL +// ----------------------------------------------------------- +// +void CPhoneStateInCall::LaunchDtmfListQueryL() + { + __LOGMETHODSTARTEND(EPhoneControl, + "CPhoneStateInCall::LaunchDtmfListQueryL()" ); + + // Fetch active call's id from view + TPhoneCmdParamCallStateData callStateData; + callStateData.SetCallState( EPEStateConnected ); + iViewCommandHandle->HandleCommandL( + EPhoneViewGetCallIdByState, &callStateData ); + + if ( callStateData.CallId() == KErrNotFound ) + { + callStateData.SetCallState( EPEStateConnecting ); + iViewCommandHandle->HandleCommandL( + EPhoneViewGetCallIdByState, &callStateData ); + } + + if ( callStateData.CallId() > KErrNotFound ) + { + //Get Array of DTMF strings from PhoneEngine + const CDesCArray& dtmfArray = + iStateMachine->PhoneEngineInfo()-> + RemotePredefinedDtmfStrings( callStateData.CallId() ); + + TInt itemCount = dtmfArray.Count(); + if ( itemCount ) + { + + TPhoneCmdParamString stringParam; + //Go through the array and send each dtmf string + //to view. + for ( TInt i=0; iDes() ); + + stringParam.SetString( &ptr ); + iViewCommandHandle->ExecuteCommandL( + EPhoneViewSetListQueryString, + &stringParam ); + CleanupStack::PopAndDestroy( string ); + string = NULL; + } + } + } + else + { + __PHONELOG( EOnlyFatal, EPhoneControl, + "CPhoneStateInCall::LaunchDtmfListQueryL() No found valid call id" ); + } + + // if there is a connected call only then open DtmfListQuery. + if ( IsAnyConnectedCalls() ) + { + TPhoneCmdParamQuery queryDialogParam; + queryDialogParam.SetQueryType( EPhoneDtmfListQueryDialog ); + queryDialogParam.SetQueryResourceId( + CPhoneMainResourceResolver::Instance()-> + ResolveResourceID( EPhoneDtmfNumberListQuery ) ); + + // Display dialog + iViewCommandHandle->ExecuteCommandL( EPhoneViewShowQuery, + &queryDialogParam ); + } + } + +// ----------------------------------------------------------- +// CPhoneStateInCall::LaunchDtmfSearchDialogL +// ----------------------------------------------------------- +// +void CPhoneStateInCall::LaunchDtmfSearchDialogL() + { + __LOGMETHODSTARTEND(EPhoneControl, + "CPhoneStateInCall::LaunchDtmfSearchDialogL()" ); + + TPhoneCmdParamInteger integerParam; + integerParam.SetInteger( EPhoneDtmfNumberQuery ); + iViewCommandHandle->HandleCommandL( EPhoneViewOpenSingleItemFetchDialog, &integerParam ); + } + +// ----------------------------------------------------------- +// CPhoneStateInCall::LaunchDtmfListViewSearchDialogL +// ----------------------------------------------------------- +// +void CPhoneStateInCall::LaunchDtmfListViewSearchDialogL() + { + __LOGMETHODSTARTEND(EPhoneControl, + "CPhoneStateInCall::LaunchDtmfListViewSearchDialogL()" ); + + TPhoneCmdParamInteger integerParam; + integerParam.SetInteger( EPhoneDtmfFetchTitle ); + iViewCommandHandle->HandleCommandL( EPhoneViewOpenSingleItemFetchDialog, &integerParam ); + } + +// ----------------------------------------------------------- +// CPhoneStateInCall::LaunchNewCallSearchDialogL +// ----------------------------------------------------------- +// +void CPhoneStateInCall::LaunchNewCallSearchDialogL() + { + __LOGMETHODSTARTEND(EPhoneControl, + "CPhoneStateInCall::LaunchNewCallSearchDialogL()" ); + + TPhoneCmdParamBoolean blockingDialogStatus; + iViewCommandHandle->ExecuteCommandL( EPhoneViewGetBlockingDialogStatus, + &blockingDialogStatus ); + // Prevents unlegal use of singleitem fetch + if ( !blockingDialogStatus.Boolean() ) + { + + TPhoneCmdParamInteger integerParam; + integerParam.SetInteger( EPhoneNewCallFetchTitle ); + iViewCommandHandle->HandleCommandL( EPhoneViewOpenSingleItemFetchDialog, &integerParam ); + } + } + +// --------------------------------------------------------- +// CPhoneStateInCall::IsVideoCallActiveL +// --------------------------------------------------------- +// +EXPORT_C TBool CPhoneStateInCall::IsVideoCallActiveL() + { + __LOGMETHODSTARTEND(EPhoneControl, + "CPhoneStateInCall::IsVideoCallActive()" ); + TBool retVal = EFalse; + // Fetch active call's id from view + TPhoneCmdParamCallStateData callStateData; + callStateData.SetCallState( EPEStateConnected ); + iViewCommandHandle->HandleCommandL( + EPhoneViewGetCallIdByState, &callStateData ); + + if ( callStateData.CallId() > KErrNotFound ) + { + retVal = IsVideoCall( callStateData.CallId() ); + } + + return retVal; + } + +// --------------------------------------------------------- +// CPhoneStateInCall::IsVideoCallRingingL +// --------------------------------------------------------- +// + +EXPORT_C TBool CPhoneStateInCall::IsVideoCallRingingL() + { + __LOGMETHODSTARTEND(EPhoneControl, + "CPhoneStateInCall::IsVideoCallRingingL()" ); + TBool retVal = EFalse; + // Fetch ringing call id from view + TPhoneCmdParamCallStateData callStateData; + callStateData.SetCallState( EPEStateRinging ); + iViewCommandHandle->HandleCommandL( + EPhoneViewGetCallIdByState, &callStateData ); + + if ( callStateData.CallId() > KErrNotFound ) + { + retVal = IsVideoCall( callStateData.CallId() ); + } + + return retVal; + } + +// --------------------------------------------------------- +// CPhoneStateInCall::GetRingingCallL +// --------------------------------------------------------- +// + +EXPORT_C TInt CPhoneStateInCall::GetRingingCallL() + { + __LOGMETHODSTARTEND(EPhoneControl, + "CPhoneStateInCall::GetRingingCallL()" ); + + // Fetch ringing call id from view + TPhoneCmdParamCallStateData callStateData; + callStateData.SetCallState( EPEStateRinging ); + iViewCommandHandle->HandleCommandL( + EPhoneViewGetCallIdByState, &callStateData ); + + return callStateData.CallId(); + } + +// ----------------------------------------------------------- +// CPhoneStateInCall::DisconnectOutgoingCallL +// ----------------------------------------------------------- +// +EXPORT_C void CPhoneStateInCall::DisconnectOutgoingCallL() + { + __LOGMETHODSTARTEND(EPhoneControl, + "CPhoneStateInCall::DisconnectOutgoingCallL()"); + // Fetch alerting call's id from view + TPhoneCmdParamCallStateData callStateData; + callStateData.SetCallState( EPEStateConnecting ); + iViewCommandHandle->HandleCommandL( + EPhoneViewGetCallIdByState, &callStateData ); + + if( callStateData.CallId() == KErrNotFound ) + { + // No connecting call, find the dialing call + callStateData.SetCallState( EPEStateDialing ); + iViewCommandHandle->HandleCommandL( + EPhoneViewGetCallIdByState, &callStateData ); + + if( callStateData.CallId() == KErrNotFound ) + { + // No dialing call, find the disconnectinging call + callStateData.SetCallState( EPEStateDisconnecting ); + iViewCommandHandle->HandleCommandL( + EPhoneViewGetCallIdByState, &callStateData ); + } + else + { + if ( IsNumberEntryUsedL() ) + { + SetNumberEntryVisibilityL(ETrue); + } + } + } + + if( callStateData.CallId() > KErrNotFound ) + { + // Release the call + iStateMachine->SetCallId( callStateData.CallId() ); + iStateMachine->SendPhoneEngineMessage( + MPEPhoneModel::EPEMessageRelease ); + } + else + { + __PHONELOG( EOnlyFatal, EPhoneControl, + "CPhoneStateInCall::DisconnectOutgoingCallL() has negative call id!" ); + __ASSERT_DEBUG( EFalse, Panic( EPhoneCtrlIndexOutOfBounds ) ); + } + } + +// ----------------------------------------------------------------------------- +// CPhoneStateInCall::LockKeysL +// ----------------------------------------------------------------------------- +// +void CPhoneStateInCall::LockKeypadL() + { + __LOGMETHODSTARTEND(EPhoneControl, + "CPhoneStateInCall::LockKeypadL()"); + + if ( !FeatureManager::FeatureSupported( KFeatureIdKeypadNoSlider ) ) + { + TInt state = KErrNone; + TInt err = RProperty::Get( + KPSUidHWRM, + KHWRMGripStatus, + state ); + if ( state == EPSHWRMGripOpen ) + { + SendGlobalErrorNoteL( EPhoneNoteTextNotAllowed ); + } + else + { + iViewCommandHandle->ExecuteCommandL( + EPhoneViewEnableKeyLock ); + } + } + else + { + iViewCommandHandle->ExecuteCommandL( + EPhoneViewEnableKeyLock ); + } + } + +// ----------------------------------------------------------------------------- +// CPhoneStateInCall::HandleSuccessFetchedNumberL +// ----------------------------------------------------------------------------- +// +void CPhoneStateInCall::HandleSuccessFetchedNumberL() + { + __LOGMETHODSTARTEND(EPhoneControl, + "CPhoneStateInCall::HandleSuccessFetchedNumberL()"); + TBuf fetchContent; + fetchContent = iViewCommandHandle->FetchContent(); + + TPhoneCmdParamInteger fetchTypeParam; + iViewCommandHandle->ExecuteCommand( EPhoneViewGetSingleItemFetchType, + &fetchTypeParam ); + TInt fetchType( fetchTypeParam.Integer() ); + + if ( fetchType == EPhoneNewCallFetchTitle ) + { + if ( iOnScreenDialer ) + { + iViewCommandHandle->ExecuteCommandL( + EPhoneViewSetNumberEntryContent, + 0, + fetchContent ); + } + // Call the fetched number + CallFetchedNumberL( fetchContent ); + } + else if ( fetchType == EPhoneDtmfFetchTitle ) + { + // Send the DTMF + iStateMachine->PhoneEngineInfo()->SetDtmfStringCommand( fetchContent ); + iStateMachine->SendPhoneEngineMessage( + MPEPhoneModel::EPEMessageSendDTMF ); + } + else if( iCustomization && fetchType > EPhoneRssBaseLast ) + { + // Handle unattended transfer contact fetch + iCustomization->HandleCommandL( fetchType ); + } + else // EPhoneCmdDtmfSearch + { + // Send the DTMF + iStateMachine->PhoneEngineInfo()->SetDtmfStringCommand( fetchContent ); + iStateMachine->SendPhoneEngineMessage( + MPEPhoneModel::EPEMessageSendDTMF ); + } + } + +// ----------------------------------------------------------------------------- +// CPhoneStateInCall::HandleFailedFetchedNumberL +// ----------------------------------------------------------------------------- +// +void CPhoneStateInCall::HandleFailedFetchedNumberL() + { + __LOGMETHODSTARTEND(EPhoneControl, + "CPhoneStateInCall::HandleFailedFetchedNumberL()"); + + TPhoneCmdParamInteger fetchTypeParam; + iViewCommandHandle->ExecuteCommand( EPhoneViewGetSingleItemFetchType, + &fetchTypeParam ); + TInt fetchType( fetchTypeParam.Integer() ); + + if ( fetchType == EPhoneNewCallFetchTitle ) + { + HandleCommandL( EPhoneInCallCmdNewCall ); + } + else if ( fetchType == EPhoneDtmfFetchTitle ) + { + HandleCommandL( EPhoneInCallCmdDtmfListQuery ); + } + else // EPhoneCmdDtmfSearch + { + HandleCommandL( EPhoneDtmfFetchTitle ); + } + } + + +// ----------------------------------------------------------------------------- +// CPhoneStateInCall::CloseDtmfQueryL +// ----------------------------------------------------------------------------- +// +EXPORT_C void CPhoneStateInCall::CloseDtmfQueryL() + { + __LOGMETHODSTARTEND(EPhoneControl, + "CPhoneStateInCall::CloseDtmfQueryL()"); + TPhoneCmdParamInteger fetchTypeParam; + iViewCommandHandle->ExecuteCommand( EPhoneViewGetSingleItemFetchType, + &fetchTypeParam ); + TInt fetchType( fetchTypeParam.Integer() ); + + // If DTMF fetch is active then remove numberentry because it is considered + // to be a part of DTMF fetch operation. + if ( fetchType == EPhoneDtmfFetchTitle ) + { + iViewCommandHandle->ExecuteCommandL( EPhoneViewRemoveNumberEntry ); + iViewCommandHandle->ExecuteCommand( EPhoneViewCloseSingleItemFetchDialog ); + } + + // Close dtmf dialer or dtmf query if exist. + if ( IsDTMFEditorVisibleL() ) + { + CloseDTMFEditorL(); + } + } + +// ----------------------------------------------------------- +// CPhoneStateInCall::PhoneNumberAvailableInPhoneEngineL +// ----------------------------------------------------------- +// +EXPORT_C void CPhoneStateInCall::PhoneNumberAvailableInPhoneEngineL( TInt aCallId ) + { + __LOGMETHODSTARTEND( EPhoneControl, "CPhoneStateInCall::PhoneNumberAvailableInPhoneEngineL() "); + TPhoneCmdParamBoolean phoneNumberAvailable; + + const TBool contactInfoAvailable = + iStateMachine->PhoneEngineInfo()->RemoteName( aCallId ).Length() || + iStateMachine->PhoneEngineInfo()->RemoteCompanyName( aCallId ).Length(); + + if( iStateMachine->PhoneEngineInfo()->RemotePhoneNumber( aCallId ).Length() || + contactInfoAvailable ) + { + // Phone number is available straight or via contact info + // so switch to video/voice call is possible + __PHONELOG( EBasic, EPhoneControl, "CPhoneStateInCall::PhoneNumberAvailableInPhoneEngineL - Phonenumber is available" ); + phoneNumberAvailable.SetBoolean( ETrue ); + } + else + { + __PHONELOG( EBasic, EPhoneControl, "CPhoneStateInCall::PhoneNumberAvailableInPhoneEngineL - Phonenumber is not available" ); + phoneNumberAvailable.SetBoolean( EFalse ); + } + + iViewCommandHandle->ExecuteCommandL( EPhoneViewSetPhoneNumberAvailableInPhoneEngine, + &phoneNumberAvailable ); + } + + +// ----------------------------------------------------------------------------- +// CPhoneStateInCall::HandleEndKeyPressL +// ----------------------------------------------------------------------------- +// +void CPhoneStateInCall::HandleEndKeyPressL( TPhoneKeyEventMessages aMessage ) + { + __LOGMETHODSTARTEND(EPhoneControl, + "CPhoneStateInCall::HandleEndKeyPressL()"); + // handle long press of end key + if ( aMessage == EPhoneKeyLongPress ) + { + // Fetch active call's id from view + TPhoneCmdParamCallStateData callStateData; + callStateData.SetCallState( EPEStateConnected ); + iViewCommandHandle->HandleCommandL( + EPhoneViewGetCallIdByState, &callStateData ); + + if( IsVideoCall( callStateData.CallId() ) ) + { + // Video call can be released only after we get response to VT Shutdown Command + CPhoneMediatorFactory::Instance()->Sender()->IssueCommand( + KMediatorVideoTelephonyDomain, + KCatPhoneToVideotelCommands, + EVtCmdReleaseDataport, + TVersion( KPhoneToVideotelCmdVersionMajor, + KPhoneToVideotelCmdVersionMinor, + KPhoneToVideotelCmdVersionBuild ), + KNullDesC8, + CPhoneTerminateAllConnectionsCommand::NewL( *iStateMachine ) ); + } + else + { + // Close all connections + iStateMachine->SendPhoneEngineMessage( + MPEPhoneModel::EPEMessageTerminateAllConnections ); + + if ( IsNumberEntryContentStored() ) + { + ClearNumberEntryContentCache(); + } + } + + if ( IsNumberEntryUsedL() ) + { + if ( iOnScreenDialer && IsDTMFEditorVisibleL() ) + { + CloseDTMFEditorL(); + } + else + { + BeginTransEffectLC( ENumberEntryClose ); + // Remove number entry from screen + iViewCommandHandle->ExecuteCommandL( + EPhoneViewRemoveNumberEntry ); + EndTransEffect(); + // Do state-specific operation when number entry is cleared + HandleNumberEntryClearedL(); + } + } + + if ( !TopAppIsDisplayedL() ) + { + // Bring app to foreground + TPhoneCmdParamInteger uidParam; + uidParam.SetInteger( KUidPhoneApplication.iUid ); + iViewCommandHandle->ExecuteCommandL( + EPhoneViewBringAppToForeground, &uidParam ); + } + } + else + { + if ( IsNumberEntryUsedL() ) + { + if ( iOnScreenDialer && IsDTMFEditorVisibleL() ) + { + CloseDTMFEditorL(); + } + } + + // handle short end key + CPhoneState::DisconnectCallL(); + } + } + +// ----------------------------------------------------------------------------- +// CPhoneStateInCall::HandleVoiceKeyPressL +// ----------------------------------------------------------------------------- +// +void CPhoneStateInCall::HandleVoiceKeyPressL( TPhoneKeyEventMessages aMessage ) + { + __LOGMETHODSTARTEND(EPhoneControl, + "CPhoneStateInCall::HandleVoiceKeyPressL()"); + if ( aMessage == EPhoneKeyShortPress ) + { + // Toggle the handsfree mode + const TBool handsfreeMode = + iStateMachine->PhoneEngineInfo()->AudioOutput() == + EPELoudspeaker; + SetHandsfreeModeL( !handsfreeMode ); + } + else // aMessage == EPhoneKeyLongPress + { + // Display call in progress information note + SendGlobalInfoNoteL( EPhoneCallInProgress ); + } + } + +// ----------------------------------------------------------- +// CPhoneStateInCall::ShowDtmfTextQueryL +// ----------------------------------------------------------- +// +void CPhoneStateInCall::ShowDtmfTextQueryL( + TInt aDialogResourceId, + TInt aDefaultCbaResourceId, + TInt aContentCbaResourceId, + TDes* aDataText, + TBool aSendKeyEnabled ) + { + __LOGMETHODSTARTEND(EPhoneControl, + "CPhoneStateInCall::ShowDtmfTextQueryL()"); + + __ASSERT_DEBUG( aDialogResourceId && + aDefaultCbaResourceId && + aContentCbaResourceId && + aDataText, + Panic( EPhoneCtrlParameterNotInitialized ) ); + TPhoneCmdParamQuery queryDialogParam; + queryDialogParam.SetQueryType( EPhoneDtmfTextQuery ); + queryDialogParam.SetQueryResourceId( aDialogResourceId ); + queryDialogParam.SetDefaultCba( aDefaultCbaResourceId ); + queryDialogParam.SetContentCba( aContentCbaResourceId ); + queryDialogParam.SetDataText( aDataText ); + queryDialogParam.SetSendKeyEnabled( aSendKeyEnabled ); + + // Display dialog + iViewCommandHandle->ExecuteCommandL( EPhoneViewShowQuery, + &queryDialogParam ); + } + +// End of File