diff -r 2eacb6118286 -r ba76fc04e6c2 phoneapp/phoneuistates/src/cphoneconferenceandwaitingandcallsetup.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phoneapp/phoneuistates/src/cphoneconferenceandwaitingandcallsetup.cpp Fri Jun 04 10:19:18 2010 +0100 @@ -0,0 +1,497 @@ +/* +* Copyright (c) 2006-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: Implementation of CPhoneConferenceAndWaitingAndCallSetup class. +* +*/ + + +// INCLUDES +#include +#include +#include "cphoneconferenceandwaitingandcallsetup.h" +#include "mphonestatemachine.h" +#include "phoneviewcommanddefinitions.h" +#include "tphonecmdparamcallheaderdata.h" +#include "phonestatedefinitionsgsm.h" +#include "phonelogger.h" +#include "tphonecmdparamboolean.h" +#include "tphonecmdparaminteger.h" +#include "tphonecmdparamcallstatedata.h" +#include "cphonemainresourceresolver.h" +#include "phonerssbase.h" +#include "tphonecmdparamglobalnote.h" +#include "phoneui.hrh" + +// ================= MEMBER FUNCTIONS ======================= + +// C++ default constructor can NOT contain any code, that +// might leave. +// +CPhoneConferenceAndWaitingAndCallSetup::CPhoneConferenceAndWaitingAndCallSetup( + MPhoneStateMachine* aStateMachine, + MPhoneViewCommandHandle* aViewCommandHandle, + MPhoneCustomization* aPhoneCustomization ) : + CPhoneConference( aStateMachine, aViewCommandHandle, aPhoneCustomization ) + { + } + +// ----------------------------------------------------------- +// CPhoneConferenceAndWaitingAndCallSetup::~CPhoneConferenceAndWaitingAndCallSetup() +// Destructor +// (other items were commented in a header). +// ----------------------------------------------------------- +// +CPhoneConferenceAndWaitingAndCallSetup::~CPhoneConferenceAndWaitingAndCallSetup() + { + // Reset flag + if ( iViewCommandHandle ) + { + TPhoneCmdParamBoolean dtmfSendFlag; + dtmfSendFlag.SetBoolean( EFalse ); + iViewCommandHandle->ExecuteCommand( EPhoneViewSetDtmfOptionsFlag, + &dtmfSendFlag ); + } + } + +// ----------------------------------------------------------- +// CPhoneConferenceAndWaitingAndCallSetup::ConstructL() +// Constructor +// (other items were commented in a header). +// ----------------------------------------------------------- +// +void CPhoneConferenceAndWaitingAndCallSetup::ConstructL() + { + CPhoneConference::ConstructL(); + } + +// ----------------------------------------------------------- +// CPhoneConferenceAndWaitingAndCallSetup::NewL() +// Constructor +// (other items were commented in a header). +// ----------------------------------------------------------- +// +CPhoneConferenceAndWaitingAndCallSetup* CPhoneConferenceAndWaitingAndCallSetup::NewL( + MPhoneStateMachine* aStateMachine, + MPhoneViewCommandHandle* aViewCommandHandle, + MPhoneCustomization* aPhoneCustomization ) + { + __LOGMETHODSTARTEND( EPhoneUIStates, + "CPhoneConferenceAndWaitingAndCallSetup::NewL"); + CPhoneConferenceAndWaitingAndCallSetup* self = + new( ELeave ) CPhoneConferenceAndWaitingAndCallSetup( + aStateMachine, aViewCommandHandle, aPhoneCustomization ); + + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + + return self; + } + +// ----------------------------------------------------------- +// CPhoneConferenceAndWaitingAndCallSetup::HandlePhoneEngineMessageL +// ----------------------------------------------------------- +// +void CPhoneConferenceAndWaitingAndCallSetup::HandlePhoneEngineMessageL( + const TInt aMessage, + TInt aCallId ) + { + __LOGMETHODSTARTEND(EPhoneControl, + "CPhoneConferenceAndWaitingAndCallSetup::HandlePhoneEngineMessageL()"); + switch ( aMessage ) + { + case MEngineMonitor::EPEMessageConnecting: + iAlerting = ETrue; + HandleConnectingL( aCallId ); + break; + + case MEngineMonitor::EPEMessageConnected: + HandleConnectedL( aCallId ); + break; + + case MEngineMonitor::EPEMessageConferenceIdle: + HandleConferenceIdleL(); + break; + + case MEngineMonitor::EPEMessageIdle: + HandleIdleL( aCallId ); + break; + + default: + CPhoneConference::HandlePhoneEngineMessageL( aMessage, + aCallId ); + break; + } + } + +// ----------------------------------------------------------- +// CPhoneConferenceAndWaitingAndCallSetup::HandleCommandL +// ----------------------------------------------------------- +// +TBool CPhoneConferenceAndWaitingAndCallSetup::HandleCommandL( TInt aCommand ) + { + __LOGMETHODSTARTEND( EPhoneUIStates, + "CPhoneConferenceAndWaitingAndCallSetup::HandleCommandL()"); + TBool commandStatus = ETrue; + + switch( aCommand ) + { + case EPhoneDtmfDialerCancel: + { + CloseDTMFEditorL(); + } + break; + + default: + commandStatus = CPhoneConference::HandleCommandL( aCommand ); + break; + } + + return commandStatus; + } + +// -------------------------------------------------------------- +// CPhoneConferenceAndWaitingAndCallSetup::HandleKeyMessageL +// -------------------------------------------------------------- +// +void CPhoneConferenceAndWaitingAndCallSetup::HandleKeyMessageL( + TPhoneKeyEventMessages aMessage, + TKeyCode aCode ) + { + __LOGMETHODSTARTEND( EPhoneUIStates, + "CPhoneConferenceAndWaitingAndCallSetup::HandleKeyMessageL"); + switch ( aCode ) + { + // send-key + case EKeyYes: + if( IsNumberEntryVisibleL() ) + { + CallFromNumberEntryL(); + } + else + { + // Number entry is behind waiting call bubble. + // We can't answer to call in this state so display + // Not allowed -note. + SendGlobalErrorNoteL( + EPhoneNoteTextNotAllowed ); + } + break; + + default: + // do base operation + CPhoneConference::HandleKeyMessageL( aMessage, aCode ); + break; + } + } + +// ----------------------------------------------------------- +// CPhoneConferenceAndWaitingAndCallSetup::OpenMenuBarL +// ----------------------------------------------------------- +// +void CPhoneConferenceAndWaitingAndCallSetup::OpenMenuBarL() + { + __LOGMETHODSTARTEND( EPhoneUIStates, + "CPhoneConferenceAndWaitingAndCallSetup::OpenMenuBarL"); + + // Set specific flag to view so that DTMF menu item available + TPhoneCmdParamBoolean dtmfSendFlag; + dtmfSendFlag.SetBoolean( ETrue ); + iViewCommandHandle->ExecuteCommandL( EPhoneViewSetDtmfOptionsFlag, + &dtmfSendFlag ); + + TInt resourceId ( EPhoneAlertingWaitingAndConfHeldCallMenuBar ); + if ( iOnScreenDialer && IsDTMFEditorVisibleL() ) + { + resourceId = EPhoneDtmfDialerMenubar; + } + else if ( IsNumberEntryVisibleL() ) + { + resourceId = + EPhoneAlertingWaitingAndConfHeldCallMenuBarWithNumberEntry; + } + else if ( IsConferenceBubbleInSelectionMode() ) + { + resourceId = EPhoneConfCallParticipantsDropMenubar; + } + + TPhoneCmdParamInteger integerParam; + integerParam.SetInteger( + CPhoneMainResourceResolver::Instance()-> + ResolveResourceID( resourceId ) ); + + iViewCommandHandle->ExecuteCommandL( EPhoneViewMenuBarOpen, + &integerParam ); + } + +// ----------------------------------------------------------- +// CPhoneConferenceAndWaitingAndCallSetup::UpdateInCallCbaL +// ----------------------------------------------------------- +// +void CPhoneConferenceAndWaitingAndCallSetup::UpdateInCallCbaL() + { + __LOGMETHODSTARTEND(EPhoneControl, + "CPhoneConferenceAndWaitingAndCallSetup::SetCallSetupCbaL() "); + + if ( iAlerting ) + { + UpdateCbaL ( EPhoneCallHandlingCallWaitingCBA ); + } + else + { + UpdateCbaL( EPhoneCallHandlingCallSetupCBA ); + } + } + +// ----------------------------------------------------------- +// CPhoneConferenceAndWaitingAndCallSetup::HandleConnectingL +// ----------------------------------------------------------- +// +void CPhoneConferenceAndWaitingAndCallSetup::HandleConnectingL( TInt aCallId ) + { + __LOGMETHODSTARTEND( EPhoneUIStates, + "CPhoneConferenceAndWaitingAndCallSetup::HandleConnectingL"); + + BeginUiUpdateLC(); + + UpdateRemoteInfoDataL ( aCallId ); + + iViewCommandHandle->ExecuteCommandL( EPhoneViewRemoveGlobalNote ); + // Re-enable global notes + TPhoneCmdParamBoolean globalNotifierParam; + globalNotifierParam.SetBoolean( EFalse ); + iViewCommandHandle->ExecuteCommandL( EPhoneViewSetGlobalNotifiersDisabled, + &globalNotifierParam ); + + // Stop capturing keys + CaptureKeysDuringCallNotificationL( EFalse ); + + TPhoneCmdParamCallHeaderData callHeaderParam; + callHeaderParam.SetCallState( EPEStateConnecting ); + iViewCommandHandle->ExecuteCommandL( EPhoneViewUpdateBubble, aCallId, + &callHeaderParam ); + + // Remove the number entry if it isn't DTMF dialer + if ( !iOnScreenDialer || !IsNumberEntryVisibleL() || !IsDTMFEditorVisibleL() ) + { + iViewCommandHandle->ExecuteCommandL( EPhoneViewRemoveNumberEntry ); + } + + EndUiUpdate(); + + UpdateCbaL( EPhoneCallHandlingCallWaitingCBA ); + } + +// ----------------------------------------------------------- +// CPhoneConferenceAndWaitingAndCallSetup::HandleConnectedL +// ----------------------------------------------------------- +// +void CPhoneConferenceAndWaitingAndCallSetup::HandleConnectedL( TInt aCallId ) + { + __LOGMETHODSTARTEND( EPhoneUIStates, + "CPhoneConferenceAndWaitingAndCallSetup::HandleConnectedL"); + + BeginUiUpdateLC(); + + UpdateRemoteInfoDataL ( aCallId ); + + // Show bubble + TPhoneCmdParamCallHeaderData callHeaderParam; + callHeaderParam.SetCallState( EPEStateConnected ); + iViewCommandHandle->ExecuteCommandL( EPhoneViewUpdateBubble, aCallId, + &callHeaderParam ); + + // Capturing keys and number entry must be removed because some + // networks jump over connecting state directly to connected state. + CaptureKeysDuringCallNotificationL( EFalse ); + + // Remove the number entry if it isn't DTMF dialer + if ( !iOnScreenDialer || !IsNumberEntryVisibleL() || !IsDTMFEditorVisibleL() ) + { + iViewCommandHandle->ExecuteCommandL( EPhoneViewRemoveNumberEntry ); + } + + HandleColpNoteL( aCallId ); + + SetTouchPaneButtons( EPhoneWaitingCallButtons ); + SetTouchPaneButtonDisabled( EPhoneCallComingCmdAnswer ); + EndUiUpdate(); + + // Go to Conference And Single And Waiting state + UpdateCbaL( EPhoneCallHandlingCallWaitingCBA ); + iStateMachine->ChangeState( EPhoneStateConferenceAndSingleAndWaiting ); + } + +// ----------------------------------------------------------- +// CPhoneConferenceAndWaitingAndCallSetup::UpdateConnectingCbaL +// ----------------------------------------------------------- +// +void CPhoneConferenceAndWaitingAndCallSetup::UpdateConnectingCbaL() + { + __LOGMETHODSTARTEND(EPhoneControl, + "CPhoneConferenceAndCallSetup::UpdateInCallCbaL() "); + + UpdateCbaL( EPhoneCallHandlingInCallCBA ); + } + +// ----------------------------------------------------------- +// CPhoneConferenceAndWaitingAndCallSetup::HandleConferenceIdleL +// ----------------------------------------------------------- +// +void CPhoneConferenceAndWaitingAndCallSetup::HandleConferenceIdleL() + { + __LOGMETHODSTARTEND( EPhoneUIStates, + "CPhoneConferenceAndWaitingAndCallSetup::HandleConferenceIdleL"); + + BeginTransEffectLC( ENumberEntryOpen ); + BeginUiUpdateLC(); + + iViewCommandHandle->ExecuteCommandL( EPhoneViewRemoveConferenceBubble ); + + // Close menu bar, if it is displayed + iViewCommandHandle->ExecuteCommandL( EPhoneViewMenuBarClose ); + + if ( IsNumberEntryUsedL() ) + { + // Show the number entry if it exists + SetNumberEntryVisibilityL(ETrue); + } + + TPhoneCmdParamCallStateData callStateData; + callStateData.SetCallState( EPEStateConnected ); + iViewCommandHandle->HandleCommandL( EPhoneViewGetCallIdByState, + &callStateData ); + + if( callStateData.CallId() > KErrNotFound ) + { + // Go to Single And Waiting And Call Setup state + SetTouchPaneButtons( EPhoneCallSetupButtons ); + // No need update cbas + iStateMachine->ChangeState( EPhoneStateSingleAndCallSetupAndWaiting ); + } + else + { + callStateData.SetCallState( EPEStateHeld ); + iViewCommandHandle->HandleCommandL( EPhoneViewGetCallIdByState, + &callStateData ); + if( callStateData.CallId() > KErrNotFound ) + { + // Go to Single And Waiting And Call Setup state + SetTouchPaneButtons( EPhoneCallSetupButtons ); + // No need update cbas + iStateMachine->ChangeState( EPhoneStateSingleAndCallSetupAndWaiting ); + } + else + { + // Reset Hold flag to view + TPhoneCmdParamBoolean holdFlag; + holdFlag.SetBoolean( EFalse ); + iViewCommandHandle->ExecuteCommandL( EPhoneViewSetHoldFlag, &holdFlag ); + + // Go to Call Setup And Waiting state + SetTouchPaneButtons( EPhoneCallSetupButtons ); + + SetToolbarDimming( ETrue ); + + // No need update cbas + iStateMachine->ChangeState( EPhoneStateCallSetupAndWaiting ); + } + } + EndUiUpdate(); + EndTransEffect(); + } + +// ----------------------------------------------------------- +// CPhoneConferenceAndWaitingAndCallSetup::HandleIdleL +// ----------------------------------------------------------- +// +void CPhoneConferenceAndWaitingAndCallSetup::HandleIdleL( TInt aCallId ) + { + __LOGMETHODSTARTEND( EPhoneUIStates, + "CPhoneConferenceAndWaitingAndCallSetup::HandleIdleL"); + + // Re-enable global notes + TPhoneCmdParamBoolean globalNotifierParam; + globalNotifierParam.SetBoolean( EFalse ); + iViewCommandHandle->ExecuteCommandL( EPhoneViewSetGlobalNotifiersDisabled, + &globalNotifierParam ); + + // Stop capturing keys + CaptureKeysDuringCallNotificationL( EFalse ); + + // Close menu bar, if it is displayed + iViewCommandHandle->ExecuteCommandL( EPhoneViewMenuBarClose ); + + TPhoneCmdParamBoolean conferenceExistsForCallId; + iViewCommandHandle->ExecuteCommandL( EPhoneViewGetCallExistsInConference, + aCallId, &conferenceExistsForCallId ); + + if( conferenceExistsForCallId.Boolean() ) + { + // Remove conference member from conference bubble + iViewCommandHandle->ExecuteCommandL( EPhoneViewRemoveFromConference, + aCallId ); + return; + } + else + { + // Remove call + iViewCommandHandle->ExecuteCommandL( EPhoneViewRemoveCallHeader, aCallId ); + + TPhoneCmdParamBoolean conferenceBubbleExists; + iViewCommandHandle->ExecuteCommandL( EPhoneViewGetIsConference, + &conferenceBubbleExists ); + if( !conferenceBubbleExists.Boolean() ) + { + // Idle message came for last conference member. + // Don't do anything, wait for ConferenceIdle message + } + else + { + BeginTransEffectLC( ENumberEntryOpen ); + BeginUiUpdateLC(); + TPhoneCmdParamCallStateData callStateData; + callStateData.SetCallState( EPEStateRinging ); + iViewCommandHandle->HandleCommandL( EPhoneViewGetCallIdByState, + &callStateData ); + if( callStateData.CallId() > KErrNotFound ) + { + CheckIfRestoreNEContentAfterDtmfDialer(); + + if ( IsNumberEntryUsedL() ) + { + // Show the number entry if callsetup failed with number busy + // etc reason. + SetNumberEntryVisibilityL(ETrue); + } + + // Go to Conference And Waiting state + SetTouchPaneButtons( EPhoneWaitingCallButtons ); + UpdateCbaL( EPhoneCallHandlingCallWaitingCBA ); + iStateMachine->ChangeState( EPhoneStateConferenceAndWaiting ); + } + else + { + // Go to Conference And Call Setup state + SetTouchPaneButtons( EPhoneCallSetupButtons ); + UpdateCbaL( EPhoneCallHandlingInCallCBA ); + iStateMachine->ChangeState( EPhoneStateConferenceAndCallSetup ); + } + EndUiUpdate(); + EndTransEffect(); + } + } + } + +// End of File