diff -r 000000000000 -r 5f000ab63145 phoneapp/phoneuistates/src/cphoneconferenceandsingleandwaiting.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phoneapp/phoneuistates/src/cphoneconferenceandsingleandwaiting.cpp Mon Jan 18 20:18:27 2010 +0200 @@ -0,0 +1,541 @@ +/* +* 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: Implementation of CPhoneConferenceAndSingleAndWaiting class. +* +*/ + + +// INCLUDES +#include +#include +#include "cphoneconferenceandsingleandwaiting.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" +#include "mphonestorage.h" +#include "cphonecenrepproxy.h" +#include + +// ================= MEMBER FUNCTIONS ======================= + +// C++ default constructor can NOT contain any code, that +// might leave. +// +CPhoneConferenceAndSingleAndWaiting::CPhoneConferenceAndSingleAndWaiting( + MPhoneStateMachine* aStateMachine, + MPhoneViewCommandHandle* aViewCommandHandle, + MPhoneCustomization* aPhoneCustomization ) : + CPhoneConferenceAndSingle( aStateMachine, aViewCommandHandle, aPhoneCustomization ) + { + } + +// ----------------------------------------------------------- +// CPhoneConferenceAndSingleAndWaiting::~CPhoneConferenceAndSingleAndWaiting() +// Destructor +// (other items were commented in a header). +// ----------------------------------------------------------- +// +CPhoneConferenceAndSingleAndWaiting::~CPhoneConferenceAndSingleAndWaiting() + { + // Reset flag + if ( iViewCommandHandle ) + { + TPhoneCmdParamBoolean dtmfSendFlag; + dtmfSendFlag.SetBoolean( EFalse ); + iViewCommandHandle->ExecuteCommandL( EPhoneViewSetDtmfOptionsFlag, + &dtmfSendFlag ); + } + } + +// ----------------------------------------------------------- +// CPhoneConferenceAndSingleAndWaiting::ConstructL() +// Constructor +// (other items were commented in a header). +// ----------------------------------------------------------- +// +void CPhoneConferenceAndSingleAndWaiting::ConstructL() + { + CPhoneConferenceAndSingle::ConstructL(); + } + +// ----------------------------------------------------------- +// CPhoneConferenceAndSingleAndWaiting::NewL() +// Constructor +// (other items were commented in a header). +// ----------------------------------------------------------- +// +CPhoneConferenceAndSingleAndWaiting* CPhoneConferenceAndSingleAndWaiting::NewL( + MPhoneStateMachine* aStateMachine, + MPhoneViewCommandHandle* aViewCommandHandle, + MPhoneCustomization* aPhoneCustomization ) + { + CPhoneConferenceAndSingleAndWaiting* self = new( ELeave ) CPhoneConferenceAndSingleAndWaiting( + aStateMachine, aViewCommandHandle, aPhoneCustomization ); + + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + + return self; + } + +// ----------------------------------------------------------- +// CPhoneConferenceAndSingleAndWaiting::HandlePhoneEngineMessageL +// ----------------------------------------------------------- +// +void CPhoneConferenceAndSingleAndWaiting::HandlePhoneEngineMessageL( + const TInt aMessage, + TInt aCallId ) + { + __LOGMETHODSTARTEND(EPhoneControl, "CPhoneConferenceAndSingleAndWaiting::HandlePhoneEngineMessageL()"); + switch ( aMessage ) + { + case MEngineMonitor::EPEMessageAddedConferenceMember: + HandleAddedConferenceMemberL( aCallId ); + break; + + case MEngineMonitor::EPEMessageIdle: + HandleIdleL( aCallId ); + break; + + default: + CPhoneConferenceAndSingle::HandlePhoneEngineMessageL( aMessage, + aCallId ); + break; + } + } + +// ----------------------------------------------------------- +// CPhoneConferenceAndSingleAndWaiting::OpenMenuBarL +// ----------------------------------------------------------- +// +void CPhoneConferenceAndSingleAndWaiting::OpenMenuBarL() + { + __LOGMETHODSTARTEND( EPhoneUIStates, + "CPhoneConferenceAndSingleAndWaiting::OpenMenuBarL()"); + TInt resourceId = NULL; + + // Set specific flag to view so that DTMF menu item available + TPhoneCmdParamBoolean dtmfSendFlag; + dtmfSendFlag.SetBoolean( ETrue ); + iViewCommandHandle->ExecuteCommandL( EPhoneViewSetDtmfOptionsFlag, + &dtmfSendFlag ); + + + TPhoneCmdParamCallStateData callStateData; + callStateData.SetCallState( EPEStateHeld ); + iViewCommandHandle->HandleCommandL( EPhoneViewGetCallIdByState, + &callStateData ); + if( callStateData.CallId() == KConferenceCallId ) + { + // Conference call is on hold and single is active + if ( IsNumberEntryVisibleL() ) + { + resourceId = EPhoneCallActiveHeldConfAndWaitingMenubarWithNumberEntry; + } + else if ( IsConferenceBubbleInSelectionMode() ) + { + resourceId = EPhoneConfCallParticipantsDropMenubar; + } + else + { + resourceId = EPhoneCallActiveHeldConfAndWaitingMenubar; + } + } + else if( callStateData.CallId() >= 0 ) + { + // Single call is on hold and conference is active + if ( IsNumberEntryVisibleL() ) + { + resourceId = EPhoneConfCallActiveHeldAndWaitingMenubarWithNumberEntry; + } + else if ( IsConferenceBubbleInSelectionMode() ) + { + resourceId = EPhoneConfCallParticipantsDropMenubar; + } + else + { + resourceId = EPhoneConfCallActiveHeldAndWaitingMenubar; + } + } + else + { + return; // negative call id, don't do anything + } + + TPhoneCmdParamInteger integerParam; + integerParam.SetInteger( + CPhoneMainResourceResolver::Instance()-> + ResolveResourceID( resourceId ) ); + iViewCommandHandle->ExecuteCommandL( EPhoneViewMenuBarOpen, + &integerParam ); + } + +// ----------------------------------------------------------- +// CPhoneConferenceAndSingleAndWaiting::HandleIdleL +// ----------------------------------------------------------- +// +void CPhoneConferenceAndSingleAndWaiting::HandleIdleL( TInt aCallId ) + { + __LOGMETHODSTARTEND( EPhoneUIStates, + "CPhoneConferenceAndSingleAndWaiting::HandleIdleL()"); + + // Effect is shown when dialer exist. + TBool effectStarted ( EFalse ); + if ( !NeedToSendToBackgroundL() ) + { + BeginTransEffectLC( ENumberEntryOpen ); + effectStarted = ETrue; + } + + BeginUiUpdateLC(); + // Set touch controls + SetTouchPaneButtonEnabled( EPhoneCallComingCmdAnswer ); + SetTouchPaneButtons( EPhoneWaitingCallButtons ); + + + TPhoneCmdParamBoolean conferenceExistsForCallId; + iViewCommandHandle->ExecuteCommandL( EPhoneViewGetCallExistsInConference, + aCallId, &conferenceExistsForCallId ); + + if( conferenceExistsForCallId.Boolean() ) + { + // Remove conference member from conference bubble + iViewCommandHandle->ExecuteCommandL( EPhoneViewRemoveFromConference, + aCallId ); + } + else + { + // Remove call + iViewCommandHandle->ExecuteCommandL( EPhoneViewRemoveCallHeader, aCallId ); + + TPhoneCmdParamBoolean conferenceBubbleExists; + iViewCommandHandle->ExecuteCommandL( EPhoneViewGetIsConference, + &conferenceBubbleExists ); + if( !conferenceBubbleExists.Boolean() ) + { + // Idle message came for conference member. + MakeTransitionAccordingToActiveCallsL(); + } + else + { + TPhoneCmdParamCallStateData callStateData; + callStateData.SetCallState( EPEStateRinging ); + iViewCommandHandle->HandleCommandL( EPhoneViewGetCallIdByState, + &callStateData ); + if( callStateData.CallId() >= 0 ) + { + // We have Conference and Waiting calls left + MakeStateTransitionToConferenceAndWaitingL( aCallId ); + } + else + { + // We have Conference and Single calls left + MakeStateTransitionToConferenceAndSingleL( aCallId ); + } + } + } + EndUiUpdate(); + if ( effectStarted ) + { + EndTransEffect(); + } + } + +// ----------------------------------------------------------- +// CPhoneConferenceAndSingleAndWaiting::HandleAddedConferenceMemberL +// ----------------------------------------------------------- +// +void CPhoneConferenceAndSingleAndWaiting::HandleAddedConferenceMemberL( TInt aCallId ) + { + __LOGMETHODSTARTEND( EPhoneUIStates, "CPhoneConferenceAndSingleAndWaiting::HandleAddedConferenceMemberL"); + // Update conference bubble + iViewCommandHandle->ExecuteCommandL( EPhoneViewAddToConference ); + + UpdateConferenceSecurityStatusL( aCallId ); + + MakeStateTransitionToConferenceAndWaitingL( KConferenceCallId ); + } + +// ----------------------------------------------------------- +// CPhoneConferenceAndSingleAndWaiting::MakeStateTransitionToConferenceAndWaitingL +// ----------------------------------------------------------- +// +void CPhoneConferenceAndSingleAndWaiting::MakeStateTransitionToConferenceAndWaitingL( TInt /*aCallId*/ ) + { + __LOGMETHODSTARTEND( EPhoneUIStates, + "CPhoneConferenceAndSingleAndWaiting::MakeStateTransitionToConferenceAndWaitingL()"); + if ( !IsNumberEntryUsedL() ) + { + // Close menu bar, if number entry isnt open. + iViewCommandHandle->ExecuteCommandL( EPhoneViewMenuBarClose ); + } + + SetTouchPaneButtons( EPhoneWaitingCallButtons ); + SetTouchPaneButtonEnabled( EPhoneCallComingCmdAnswer ); + + // Check if HW Keys or Call UI should be disabled + CheckDisableHWKeysAndCallUIL(); + + // Go to Conference And Waiting state + UpdateCbaL( EPhoneCallHandlingCallWaitingCBA ); + iStateMachine->ChangeState( EPhoneStateConferenceAndWaiting ); + } + +// ----------------------------------------------------------- +// CPhoneConferenceAndSingleAndWaiting::MakeStateTransitionToConferenceAndSingleL +// ----------------------------------------------------------- +// +void CPhoneConferenceAndSingleAndWaiting::MakeStateTransitionToConferenceAndSingleL( TInt /*aCallId*/ ) + { + __LOGMETHODSTARTEND( EPhoneUIStates, + "CPhoneConferenceAndSingleAndWaiting::MakeStateTransitionToConferenceAndSingleL()"); + + if( /*FeatureManager::FeatureSupported( KFeatureIdFfTouchUnlockStroke ) + */ 1 && iStateMachine->PhoneStorage()->IsScreenLocked() ) + { + EnableCallUIL(); + } + + // Reset blocked keys list + iStateMachine->PhoneStorage()->ResetBlockedKeysList(); + + if ( !IsNumberEntryUsedL() ) + { + // Close menu bar, if number entry isnt open. + iViewCommandHandle->ExecuteCommandL( EPhoneViewMenuBarClose ); + } + + if ( IsNumberEntryUsedL() ) + { + if ( NeedToSendToBackgroundL() ) + { + // Return phone to the background if send to background is needed. + iViewCommandHandle->ExecuteCommandL( EPhoneViewSendToBackground ); + + iViewCommandHandle->ExecuteCommandL( EPhoneViewSetControlAndVisibility ); + + UpdateCbaL( EPhoneCallHandlingInCallCBA ); + } + else + { + // Show the number entry if it exists + SetNumberEntryVisibilityL(ETrue); + } + } + else + { + UpdateCbaL( EPhoneCallHandlingNewCallSwapCBA ); + // If numberentry is not open just check NeedToSendToBackgroundL and + // sendbackround if needed. + if ( NeedToSendToBackgroundL() ) + { + // Return phone to the background if send to background is needed. + iViewCommandHandle->ExecuteCommandL( EPhoneViewSendToBackground ); + } + } + + SetTouchPaneButtons( EPhoneConferenceAndSingleButtons ); + SetTouchPaneButtonEnabled( EPhoneCallComingCmdAnswer ); + SetTouchPaneButtonDisabled( EPhoneInCallCmdPrivate ); + // Go to conference and single state + // CBA updates in above if-else conditions + iStateMachine->ChangeState( EPhoneStateConferenceAndSingle ); + } + +// ----------------------------------------------------------- +// CPhoneConferenceAndSingleAndWaiting::HandleConferenceIdleL +// ----------------------------------------------------------- +// +void CPhoneConferenceAndSingleAndWaiting::HandleConferenceIdleL() + { + __LOGMETHODSTARTEND( EPhoneUIStates, + "CPhoneConferenceAndSingleAndWaiting::HandleConferenceIdleL()"); + + BeginUiUpdateLC(); + + iViewCommandHandle->ExecuteCommandL( EPhoneViewRemoveConferenceBubble ); + + // Close menu bar, if it is displayed + iViewCommandHandle->ExecuteCommandL( EPhoneViewMenuBarClose ); + + // Remove any phone dialogs if they are displayed + iViewCommandHandle->ExecuteCommandL( EPhoneViewRemovePhoneDialogs ); + + MakeTransitionAccordingToActiveCallsL(); + + EndUiUpdate(); + } + +// -------------------------------------------------------------- +// CPhoneConferenceAndSingleAndWaiting::HandleKeyMessageL +// -------------------------------------------------------------- +// +void CPhoneConferenceAndSingleAndWaiting::HandleKeyMessageL( + TPhoneKeyEventMessages aMessage, + TKeyCode aCode ) + { + __LOGMETHODSTARTEND( EPhoneUIStates, + "CPhoneConferenceAndSingleAndWaiting::HandleKeyMessageL()"); + switch ( aCode ) + { + // send-key + case EKeyYes: + if( IsNumberEntryVisibleL() ) + { + CallFromNumberEntryL(); + } + else + { + // Not allowed to answer + SendGlobalWarningNoteL( + EPhoneNoteTextCallNotAllowed ); + } + break; + + default: + // do base operation + CPhoneConferenceAndSingle::HandleKeyMessageL( aMessage, aCode ); + break; + } + } + +// ----------------------------------------------------------- +// CPhoneConferenceAndSingleAndWaiting::HandleKeyEventL +// ----------------------------------------------------------- +// +void CPhoneConferenceAndSingleAndWaiting::HandleKeyEventL( + const TKeyEvent& aKeyEvent, + TEventCode aEventCode ) + { + if( EKeyDeviceF == aKeyEvent.iCode ) + { + __PHONELOG( EBasic, EPhoneUIStates, + "CPhoneConferenceAndSingleAndWaiting::HandleKeyMessageL-deviceF" ); + HandleHoldSwitchL(); + } + } + +// ----------------------------------------------------------- +// CPhoneConferenceAndSingleAndWaiting::UpdateInCallCbaL +// ----------------------------------------------------------- +// +void CPhoneConferenceAndSingleAndWaiting::UpdateInCallCbaL() + { + __LOGMETHODSTARTEND(EPhoneControl, "CPhoneConferenceAndSingleAndWaiting::UpdateInCallCbaL() "); + + UpdateCbaL ( EPhoneCallHandlingCallWaitingCBA ); + } + +// ----------------------------------------------------------- +// CPhoneConferenceAndSingleAndWaiting::MakeTransitionAccordingToActiveCallsL +// ----------------------------------------------------------- +// +void CPhoneConferenceAndSingleAndWaiting::MakeTransitionAccordingToActiveCallsL() + { + TPhoneCmdParamInteger activeCallCount; + iViewCommandHandle->ExecuteCommandL( + EPhoneViewGetCountOfActiveCalls, &activeCallCount ); + + switch( activeCallCount.Integer() ) + { + case ENoActiveCalls: // Go to incoming state + { + // Get Waiting call's Call Id + TPhoneCmdParamCallStateData callStateData; + callStateData.SetCallState( EPEStateRinging ); + iViewCommandHandle->HandleCommandL( EPhoneViewGetCallIdByState, + &callStateData ); + + if ( callStateData.CallId() != KErrNotFound ) + { + // Display ringing bubble + TPhoneCmdParamCallHeaderData callHeaderParam; + callHeaderParam.SetCallState( EPEStateRinging ); + + SetCallHeaderTextsForCallComingInL( callStateData.CallId(), EFalse, &callHeaderParam ); + + iViewCommandHandle->ExecuteCommandL( EPhoneViewUpdateBubble, + callStateData.CallId(), + &callHeaderParam ); + + // Capture keys when there is an incoming call + CaptureKeysDuringCallNotificationL( ETrue ); + + // Go to Incoming state + iCbaManager->UpdateIncomingCbaL( callStateData.CallId() ); + + // Check if HW Keys or Call UI should be disabled + CheckDisableHWKeysAndCallUIL(); + + SetTouchPaneButtons( EPhoneIncomingCallButtons ); + UpdateSilenceButtonDimming(); + SetTouchPaneButtonEnabled( EPhoneCallComingCmdAnswer ); + SetRingingTonePlaybackL( callStateData.CallId() ); + SetToolbarDimming( ETrue ); + iStateMachine->ChangeState( EPhoneStateIncoming ); + } + else + { + SetDefaultFlagsL(); + UpdateCbaL( EPhoneEmptyCBA ); + iStateMachine->ChangeState( EPhoneStateIdle ); + } + } + break; + case EOneActiveCall: + { + // Go to Single And Waiting state + UpdateCbaL( EPhoneCallHandlingCallWaitingCBA ); + SetTouchPaneButtons( EPhoneWaitingCallButtons ); + SetTouchPaneButtonEnabled( EPhoneCallComingCmdAnswer ); + + // Check if HW Keys or Call UI should be disabled + CheckDisableHWKeysAndCallUIL(); + + iStateMachine->ChangeState( EPhoneStateWaitingInSingle ); + } + break; + case ETwoActiveCalls: + { + // Go to Two Singles And Waiting state + UpdateCbaL( EPhoneCallHandlingCallWaitingCBA ); + + // Check if HW Keys or Call UI should be disabled + CheckDisableHWKeysAndCallUIL(); + + SetTouchPaneButtons( EPhoneWaitingCallButtons ); + iStateMachine->ChangeState( EPhoneStateTwoSinglesAndWaiting ); + } + break; + default: + // Too many active calls to handle reliable state change now. + // Waiting for all conference member idles + // This case may happen when 'End all calls' because conferenceIdle may + // come earlier than idle for conference member + break; + } + + } + +// End of File