diff -r 000000000000 -r 5f000ab63145 phoneapp/phoneuistates/src/cphonetwosinglesandwaiting.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phoneapp/phoneuistates/src/cphonetwosinglesandwaiting.cpp Mon Jan 18 20:18:27 2010 +0200 @@ -0,0 +1,431 @@ +/* +* Copyright (c) 2005 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 CPhoneTwoSinglesAndWaiting class. +* +*/ + + +// INCLUDES +#include +#include +#include +#include +#include "cphonetwosinglesandwaiting.h" +#include "tphonecmdparamboolean.h" +#include "mphonestatemachine.h" +#include "tphonecmdparamboolean.h" +#include "tphonecmdparaminteger.h" +#include "tphonecmdparamcallheaderdata.h" +#include "tphonecmdparamglobalnote.h" +#include "tphonecmdparamstring.h" +#include "tphonecmdparamcallstatedata.h" +#include "phoneviewcommanddefinitions.h" +#include "phoneui.hrh" +#include "cphonemainresourceresolver.h" +#include "phonerssbase.h" +#include "phonestatedefinitionsgsm.h" +#include "phonelogger.h" +#include "mphonestorage.h" + +// ================= MEMBER FUNCTIONS ======================= + +// C++ default constructor can NOT contain any code, that +// might leave. +// +CPhoneTwoSinglesAndWaiting::CPhoneTwoSinglesAndWaiting( + MPhoneStateMachine* aStateMachine, + MPhoneViewCommandHandle* aViewCommandHandle, + MPhoneCustomization* aPhoneCustomization ) : + CPhoneTwoSingles( aStateMachine, aViewCommandHandle, aPhoneCustomization ) + { + } + +// ----------------------------------------------------------- +// CPhoneTwoSinglesAndWaiting::~CPhoneTwoSinglesAndWaiting() +// Destructor +// (other items were commented in a header). +// ----------------------------------------------------------- +// +CPhoneTwoSinglesAndWaiting::~CPhoneTwoSinglesAndWaiting() + { + } + +// ----------------------------------------------------------- +// CPhoneTwoSinglesAndWaiting::ConstructL() +// Constructor +// (other items were commented in a header). +// ----------------------------------------------------------- +// +void CPhoneTwoSinglesAndWaiting::ConstructL() + { + CPhoneTwoSingles::ConstructL(); + + // Fetch ringing call's id from view + TPhoneCmdParamCallStateData callStateData; + callStateData.SetCallState( EPEStateRinging ); + iViewCommandHandle->HandleCommandL( + EPhoneViewGetCallIdByState, &callStateData ); + iRingingCallId = callStateData.CallId(); + } + +// ----------------------------------------------------------- +// CPhoneTwoSinglesAndWaiting::NewL() +// Constructor +// (other items were commented in a header). +// ----------------------------------------------------------- +// +CPhoneTwoSinglesAndWaiting* CPhoneTwoSinglesAndWaiting::NewL( + MPhoneStateMachine* aStateMachine, + MPhoneViewCommandHandle* aViewCommandHandle, + MPhoneCustomization* aPhoneCustomization ) + { + CPhoneTwoSinglesAndWaiting* self = new( ELeave ) CPhoneTwoSinglesAndWaiting( + aStateMachine, aViewCommandHandle, aPhoneCustomization ); + + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + + return self; + } + +// ----------------------------------------------------------- +// CPhoneTwoSinglesAndWaiting::HandleKeyMessageL +// ----------------------------------------------------------- +// +void CPhoneTwoSinglesAndWaiting::HandleKeyMessageL( + TPhoneKeyEventMessages aMessage, + TKeyCode aCode ) + { + __LOGMETHODSTARTEND( EPhoneUIStates, + "CPhoneTwoSinglesAndWaiting::HandleKeyMessageL()"); + switch ( aCode ) + { + // send-key + case EKeyYes: + { + if( IsNumberEntryVisibleL() ) + { + CallFromNumberEntryL(); + } + else + { + // Waiting call bubble is over number entry + // so display not allowed note because we + // can't answer the call + SendGlobalWarningNoteL( EPhoneNoteTextCallNotAllowed ); + } + break; + } + + default: + CPhoneTwoSingles::HandleKeyMessageL( aMessage, aCode ); + break; + } + } + +// ----------------------------------------------------------- +// CPhoneTwoSinglesAndWaiting::HandleKeyEventL +// ----------------------------------------------------------- +// +void CPhoneTwoSinglesAndWaiting::HandleKeyEventL( + const TKeyEvent& aKeyEvent, + TEventCode aEventCode ) + { + if( EKeyDeviceF == aKeyEvent.iCode ) + { + __PHONELOG( EBasic, EPhoneUIStates, + "CPhoneTwoSinglesAndWaiting::HandleKeyMessageL-deviceF" ); + HandleHoldSwitchL(); + } + } + +// ----------------------------------------------------------- +// CPhoneTwoSinglesAndWaiting::HandlePhoneEngineMessageL +// ----------------------------------------------------------- +// +void CPhoneTwoSinglesAndWaiting::HandlePhoneEngineMessageL( + const TInt aMessage, + TInt aCallId ) + { + __LOGMETHODSTARTEND( EPhoneUIStates, + "CPhoneTwoSinglesAndWaiting::HandlePhoneEngineMessageL()"); + switch ( aMessage ) + { + case MEngineMonitor::EPEMessageIdle: + HandleIdleL( aCallId ); + break; + + default: + CPhoneTwoSingles::HandlePhoneEngineMessageL( aMessage, aCallId ); + break; + } + } + +// ----------------------------------------------------------- +// CPhoneTwoSinglesAndWaiting::HandleErrorL +// ----------------------------------------------------------- +// +EXPORT_C void CPhoneTwoSinglesAndWaiting::HandleErrorL( + const TPEErrorInfo& aErrorInfo ) + { + __LOGMETHODSTARTEND( EPhoneUIStates, "CPhoneTwoSinglesAndWaiting::HandleErrorL()"); + + if( aErrorInfo.iErrorCode == ECCPErrorCCUserAlertingNoAnswer ) + { + // Should not shown "No Answer" note + __PHONELOG1( EBasic, EPhoneUIStates, + "PhoneUIControl: CPhoneTwoSinglesAndWaiting::HandleErrorL - aErrorInfo.iErrorCode =%d ", + aErrorInfo.iErrorCode); + } + else + { + CPhoneState::HandleErrorL( aErrorInfo ); + } + } + +// ----------------------------------------------------------- +// CPhoneTwoSinglesAndWaiting::OpenMenuBarL +// ----------------------------------------------------------- +// +void CPhoneTwoSinglesAndWaiting::OpenMenuBarL() + { + __LOGMETHODSTARTEND( EPhoneUIStates, + "CPhoneTwoSinglesAndWaiting::OpenMenuBarL()"); + + TInt resourceId ( EPhoneCallTwoSinglesWaitingLockMenubar ); + + if ( !IsAutoLockOn() ) + { + if ( IsNumberEntryVisibleL() ) + { + resourceId = EPhoneCallActiveHeldAndWaitingMenubarWithNumberEntry; + } + else + { + resourceId = EPhoneCallActiveHeldAndWaitingMenubar; + } + } + + TPhoneCmdParamInteger integerParam; + integerParam.SetInteger( + CPhoneMainResourceResolver::Instance()-> + ResolveResourceID( resourceId ) ); + iViewCommandHandle->ExecuteCommandL( EPhoneViewMenuBarOpen, + &integerParam ); + } + +// ----------------------------------------------------------- +// CPhoneTwoSinglesAndWaiting::HandleIdleL +// ----------------------------------------------------------- +// +void CPhoneTwoSinglesAndWaiting::HandleIdleL( TInt aCallId ) + { + __LOGMETHODSTARTEND( EPhoneUIStates, + "CPhoneTwoSinglesAndWaiting::HandleIdleL()"); + + // Effect is shown when dialer exist. + + TBool effectStarted ( EFalse ); + if ( !NeedToSendToBackgroundL()) + { + BeginTransEffectLC( ENumberEntryOpen ); + effectStarted = ETrue; + } + + BeginUiUpdateLC(); + + if ( !IsNumberEntryUsedL() ) + { + // Close menu bar, if number entry isnt open. + iViewCommandHandle->ExecuteCommandL( EPhoneViewMenuBarClose ); + } + + // Remove call + iViewCommandHandle->ExecuteCommandL( EPhoneViewRemoveCallHeader, aCallId ); + + if ( iRingingCallId == aCallId ) + { + StateTransitionToTwoSinglesL(); + } + else + { + StateTransitionToSingleAndWaitingL(); + } + + EndUiUpdate(); + if ( effectStarted ) + { + EndTransEffect(); + } + } + +// ----------------------------------------------------------- +// CPhoneTwoSinglesAndWaiting::StateTransitionToTwoSinglesL +// ----------------------------------------------------------- +// +void CPhoneTwoSinglesAndWaiting::StateTransitionToTwoSinglesL() + { + __LOGMETHODSTARTEND( EPhoneUIStates, + "CPhoneTwoSinglesAndWaiting::StateTransitionToTwoSinglesL()"); + if ( IsNumberEntryUsedL() ) + { + // Go to background if necessary + 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 + { + // Set Two singles softkeys + 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 ); + } + } + + if( FeatureManager::FeatureSupported( KFeatureIdFfTouchUnlockStroke ) + && iStateMachine->PhoneStorage()->IsScreenLocked() ) + { + EnableCallUIL(); + } + + // Reset blocked keys list + iStateMachine->PhoneStorage()->ResetBlockedKeysList(); + + // Go to two singles state + SetTouchPaneButtonEnabled( EPhoneCallComingCmdAnswer ); + SetTouchPaneButtons( EPhoneTwoSinglesButtons ); + // CBA updates in above if-else conditions + iStateMachine->ChangeState( EPhoneStateTwoSingles ); + } + +// ----------------------------------------------------------- +// CPhoneTwoSinglesAndWaiting::StateTransitionToSingleAndWaitingL +// ----------------------------------------------------------- +// +void CPhoneTwoSinglesAndWaiting::StateTransitionToSingleAndWaitingL() + { + __LOGMETHODSTARTEND( EPhoneUIStates, + "CPhoneTwoSinglesAndWaiting::StateTransitionToSingleAndWaitingL()"); + // Go to two singles state + UpdateCbaL( EPhoneCallHandlingCallWaitingCBA ); + + // Set touch controls + SetTouchPaneButtonEnabled( EPhoneCallComingCmdAnswer ); + + // Check if HW Keys or Call UI should be disabled + CheckDisableHWKeysAndCallUIL(); + + SetTouchPaneButtons( EPhoneWaitingCallButtons ); + + iStateMachine->ChangeState( EPhoneStateWaitingInSingle ); + } + +// ----------------------------------------------------------- +// CPhoneTwoSinglesAndWaiting::HandleConnectedConferenceL +// ----------------------------------------------------------- +// +void CPhoneTwoSinglesAndWaiting::HandleConnectedConferenceL( TInt aCallId ) + { + __LOGMETHODSTARTEND( EPhoneUIStates, + "CPhoneTwoSinglesAndWaiting::HandleConnectedConferenceL()"); + BeginUiUpdateLC(); + // Update call state + TPhoneCmdParamCallHeaderData callHeaderParam; + + TInt callLabelId; + TBuf conferenceText( KNullDesC ); + callLabelId = CPhoneMainResourceResolver::Instance()-> + ResolveResourceID( EPhoneCLIConferenceCall ); + + StringLoader::Load( + conferenceText, + callLabelId, + CCoeEnv::Static() ); + callHeaderParam.SetCLIText( conferenceText, CBubbleManager::ERight ); + + callHeaderParam.SetCiphering( + iStateMachine->PhoneEngineInfo()->IsSecureCall( aCallId ) ); + + callHeaderParam.SetCipheringIndicatorAllowed( + iStateMachine->PhoneEngineInfo()->SecureSpecified() ); + + // Service identifier must be given so that service specific settings + // can be taken into account at phoneuiview. + callHeaderParam.SetServiceId( + iStateMachine->PhoneEngineInfo()->ServiceId( aCallId ) ); + + // Set touch controls + SetTouchPaneButtonEnabled( EPhoneCallComingCmdAnswer ); + + // Check if HW Keys or Call UI should be disabled + CheckDisableHWKeysAndCallUIL(); + + SetTouchPaneButtons( EPhoneWaitingCallButtons ); + + iViewCommandHandle->ExecuteCommandL( EPhoneViewCreateConference, aCallId, + &callHeaderParam ); + + // Clear the flag + TPhoneCmdParamBoolean booleanParam; + booleanParam.SetBoolean( EFalse ); + iViewCommandHandle->ExecuteCommandL( + EPhoneViewSetNeedToSendToBackgroundStatus, &booleanParam ); + + EndUiUpdate(); + // Go to Conference And Waiting state + // No need for CBA update + iStateMachine->ChangeState( EPhoneStateConferenceAndWaiting ); + } + +// ----------------------------------------------------------- +// CPhoneTwoSinglesAndWaiting::UpdateInCallCbaL +// ----------------------------------------------------------- +// +void CPhoneTwoSinglesAndWaiting::UpdateInCallCbaL() + { + __LOGMETHODSTARTEND( EPhoneUIStates, + "CPhoneTwoSinglesAndWaiting::UpdateInCallCbaL()"); + UpdateCbaL ( EPhoneCallHandlingCallWaitingCBA ); + } + +// ----------------------------------------------------------- +// CPhoneTwoSinglesAndWaiting::HandleNumberEntryClearedL() +// ----------------------------------------------------------- +// +void CPhoneTwoSinglesAndWaiting::HandleNumberEntryClearedL() + { + __LOGMETHODSTARTEND( EPhoneUIStates, + "CPhoneTwoSinglesAndWaiting::HandleNumberEntryClearedL()"); + UpdateCbaL( EPhoneCallHandlingCallWaitingCBA ); + } + +// End of File