diff -r 000000000000 -r 5f000ab63145 phoneapp/phoneuistates/src/cphoneconference.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phoneapp/phoneuistates/src/cphoneconference.cpp Mon Jan 18 20:18:27 2010 +0200 @@ -0,0 +1,1129 @@ +/* +* 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 CPhoneConference class. +* +*/ + + +// INCLUDES +#include +#include +#include +#include +#include +#include +#include +#include "cphoneconference.h" +#include "mphonestatemachine.h" +#include "phoneviewcommanddefinitions.h" +#include "phoneui.hrh" +#include "cphonemainresourceresolver.h" +#include "phonerssbase.h" +#include "tphonecmdparaminteger.h" +#include "tphonecmdparamboolean.h" +#include "tphonecmdparamstring.h" +#include "tphonecmdparamcallheaderdata.h" +#include "tphonecmdparamkeyevent.h" +#include "phonestatedefinitions.h" +#include "tphonecmdparamglobalnote.h" +#include "phonestatedefinitionsgsm.h" +#include "tphonecmdparamcallstatedata.h" +#include "cphonekeys.h" +#include "phonelogger.h" + +// ================= MEMBER FUNCTIONS ======================= + +// C++ default constructor can NOT contain any code, that +// might leave. +// +CPhoneConference::CPhoneConference( + MPhoneStateMachine* aStateMachine, + MPhoneViewCommandHandle* aViewCommandHandle, + MPhoneCustomization* aPhoneCustomization ) : + CPhoneGsmInCall( aStateMachine, aViewCommandHandle, aPhoneCustomization ) + { + } + +// ----------------------------------------------------------- +// CPhoneConference::~CPhoneConference() +// Destructor +// (other items were commented in a header). +// ----------------------------------------------------------- +// +CPhoneConference::~CPhoneConference() + { + } + +// ----------------------------------------------------------- +// CPhoneConference::ConstructL() +// Constructor +// (other items were commented in a header). +// ----------------------------------------------------------- +// +void CPhoneConference::ConstructL() + { + CPhoneGsmInCall::ConstructL(); + + // Re-enable global notes + TPhoneCmdParamBoolean globalNotifierParam; + globalNotifierParam.SetBoolean( EFalse ); + iViewCommandHandle->ExecuteCommandL( EPhoneViewSetGlobalNotifiersDisabled, + &globalNotifierParam ); + + + DefineAndSetHoldFlagL(); + + } + +// ----------------------------------------------------------- +// CPhoneConference::NewL() +// Constructor +// (other items were commented in a header). +// ----------------------------------------------------------- +// +CPhoneConference* CPhoneConference::NewL( + MPhoneStateMachine* aStateMachine, + MPhoneViewCommandHandle* aViewCommandHandle, + MPhoneCustomization* aPhoneCustomization ) + { + CPhoneConference* self = new( ELeave ) CPhoneConference( + aStateMachine, aViewCommandHandle, aPhoneCustomization ); + + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + + return self; + } + +// ----------------------------------------------------------- +// CPhoneConference::HandlePhoneEngineMessageL +// ----------------------------------------------------------- +// +void CPhoneConference::HandlePhoneEngineMessageL( + const TInt aMessage, + TInt aCallId ) + { + __LOGMETHODSTARTEND( EPhoneUIStates, + "CPhoneConference::HandlePhoneEngineMessageL()"); + switch ( aMessage ) + { + case MEngineMonitor::EPEMessageIdle: + HandleIdleL( aCallId ); + break; + + case MEngineMonitor::EPEMessageConferenceIdle: + HandleConferenceIdleL(); + break; + + case MEngineMonitor::EPEMessageHeldConference: + HandleHeldConferenceL( aCallId ); + break; + + case MEngineMonitor::EPEMessageConnectedConference: + HandleConnectedConferenceL(); + break; + + case MEngineMonitor::EPEMessageAddedConferenceMember: + UpdateConferenceSecurityStatusL( aCallId ); + break; + + case MEngineMonitor::EPEMessageWentOneToOne: + HandleWentOneToOneL( aCallId ); + break; + + case MEngineMonitor::EPEMessageHeld: + { + TPhoneCmdParamCallHeaderData callHeaderParam; + callHeaderParam.SetCallState( EPEStateHeld ); + iViewCommandHandle->ExecuteCommandL( EPhoneViewUpdateBubble, aCallId, + &callHeaderParam ); + } + break; + + case MEngineMonitor::EPEMessageConnected: + { + TPhoneCmdParamCallHeaderData callHeaderParam; + callHeaderParam.SetCallState( EPEStateConnected ); + iViewCommandHandle->ExecuteCommandL( EPhoneViewUpdateBubble, aCallId, + &callHeaderParam ); + } + break; + + case MEngineMonitor::EPEMessageDialing: + HandleDiallingL( aCallId ); + break; + + case MEngineMonitor::EPEMessageIncoming: + HandleIncomingL( aCallId ); + break; + + default: + CPhoneGsmInCall::HandlePhoneEngineMessageL( aMessage, aCallId ); + break; + } + } + +// ----------------------------------------------------------- +// CPhoneConference:HandleCommandL +// ----------------------------------------------------------- +// +TBool CPhoneConference::HandleCommandL( TInt aCommand ) + { + __LOGMETHODSTARTEND( EPhoneUIStates, + "CPhoneConference::HandleCommandL()"); + TBool commandStatus = ETrue; + + switch( aCommand ) + { + case EAknSoftkeyCancel: + BeginUiUpdateLC(); + CloseSelectionListL(); + SetTouchPaneButtons( EPhoneConferenceButtons ); + EndUiUpdate(); + UpdateCbaL( EPhoneCallHandlingInCallCBA ); + break; + + case EPhoneInCallCmdHold: + case EPhoneInCallCmdConferenceHold: + iStateMachine->SendPhoneEngineMessage( + CPEPhoneModelIF::EPEMessageHoldConference ); + break; + + case EPhoneInCallCmdUnhold: + case EPhoneInCallCmdConferenceUnhold: + iStateMachine->SendPhoneEngineMessage( + CPEPhoneModelIF::EPEMessageResumeConference ); + break; + + // Conference -> Drop participant + case EPhoneInCallCmdDropSelection: + OpenDropParticipantSelectionL(); + break; + + // Drop CBA + case EPhoneInCallCmdDrop: + DropSelectedParticipantL(); + break; + + case EPhoneInCallCmdPrivateSelection: + OpenPrivateSelectionL(); + break; + + case EPhoneInCallCmdPrivate: + PrivateSelectedParticipantL(); + break; + + case EPhoneInCallCmdNewCall: + LaunchNewCallQueryL(); + break; + + case EPhoneInCallCmdNewCallCall: + CallFromNewCallQueryL(); + break; + + case EPhoneInCallCmdParticipants: + OpenParticipantsListL(); + break; + + case EPhoneViewOpenNumberEntry: + if ( IsConferenceBubbleInSelectionMode() ) + { + CloseSelectionListL(); + SetTouchPaneButtons( EPhoneConferenceButtons ); + } + commandStatus = CPhoneGsmInCall::HandleCommandL( aCommand ); + break; + + default: + commandStatus = CPhoneGsmInCall::HandleCommandL( aCommand ); + break; + } + + return commandStatus; + } + +// ----------------------------------------------------------- +// CPhoneConference::UpdateInCallCbaL +// ----------------------------------------------------------- +// +void CPhoneConference::UpdateInCallCbaL() + { + if ( iViewCommandHandle->HandleCommandL( EPhoneViewIsConferenceInExpandedMode ) + != EPhoneViewResponseSuccess ) + { + UpdateCbaL( EPhoneCallHandlingInCallCBA ); + } + } + +// ----------------------------------------------------------- +// CPhoneConference::OpenMenuBarL +// ----------------------------------------------------------- +// +void CPhoneConference::OpenMenuBarL() + { + __LOGMETHODSTARTEND( EPhoneUIStates, + "CPhoneConference::OpenMenuBarL()"); + TInt resourceId; + + if ( iOnScreenDialer && IsDTMFEditorVisibleL() ) + { + resourceId = EPhoneDtmfDialerMenubar; + } + else if ( IsNumberEntryVisibleL() ) + { + resourceId = EPhoneConfCallMenubarWithNumberEntry; + } + else if ( FeatureManager::FeatureSupported( KFeatureIdTouchCallHandling ) + && IsConferenceBubbleInSelectionMode() ) + { + resourceId = EPhoneConfCallParticipantsMenubar; + } + else + { + resourceId = EPhoneConfCallMenubar; + } + + TPhoneCmdParamInteger integerParam; + integerParam.SetInteger( + CPhoneMainResourceResolver::Instance()-> + ResolveResourceID( resourceId ) ); + iViewCommandHandle->ExecuteCommandL( EPhoneViewMenuBarOpen, + &integerParam ); + } + +// ----------------------------------------------------------- +// CPhoneConference::HandleKeyEventL +// ----------------------------------------------------------- +// +void CPhoneConference::HandleKeyEventL( + const TKeyEvent& aKeyEvent, + TEventCode aEventCode ) + { + __LOGMETHODSTARTEND( EPhoneUIStates, + "CPhoneConference::HandleKeyEventL()"); + if ( IsConferenceBubbleInSelectionMode() ) + { + if ( aKeyEvent.iCode == EKeyUpArrow || + aKeyEvent.iCode == EKeyDownArrow ) + { + TPhoneCmdParamKeyEvent keyEventParam; + keyEventParam.SetKeyEvent( aKeyEvent ); + keyEventParam.SetEventCode( aEventCode ); + + iViewCommandHandle->ExecuteCommandL( + EPhoneViewMoveHighLightInList, &keyEventParam ); + } + } + else + { + if ( CPhoneKeys::IsNumericKey( aKeyEvent, aEventCode ) ) + { + // Handle numeric keys when key events are received + // in conference state. + CPhoneGsmInCall::HandleNumericKeyEventL( aKeyEvent, aEventCode ); + } + else + { + // Handle other key events. + CPhoneState::HandleKeyEventL( aKeyEvent, aEventCode ); + } + } + } + +// -------------------------------------------------------------- +// CPhoneConference::HandleKeyMessageL +// -------------------------------------------------------------- +// +void CPhoneConference::HandleKeyMessageL( + TPhoneKeyEventMessages aMessage, + TKeyCode aCode ) + { + __LOGMETHODSTARTEND( EPhoneUIStates, + "CPhoneConference::HandleKeyMessageL()"); + + switch ( aCode ) + { + // send-key + case EKeyYes: + if( IsNumberEntryVisibleL() ) + { + CallFromNumberEntryL(); + } + else + { + ToggleHoldL(); + } + break; + + default: + // do base operation + CPhoneGsmInCall::HandleKeyMessageL( aMessage, aCode ); + break; + } + } + +// ----------------------------------------------------------- +// CPhoneConference::HandleNumberEntryClearedL +// ----------------------------------------------------------- +// +void CPhoneConference::HandleNumberEntryClearedL() + { + __LOGMETHODSTARTEND( EPhoneUIStates, + "CPhoneConference::HandleNumberEntryClearedL()"); + // Update CBA when number entry is cleared + UpdateInCallCbaL(); + } + +// ----------------------------------------------------------- +// CPhoneConference:HandleIdleL +// ----------------------------------------------------------- +// +void CPhoneConference::HandleIdleL( TInt aCallId ) + { + __LOGMETHODSTARTEND( EPhoneUIStates, + "CPhoneConference::HandleIdleL()"); + // Re-enable global notes + TPhoneCmdParamBoolean globalNotifierParam; + globalNotifierParam.SetBoolean( EFalse ); + iViewCommandHandle->ExecuteCommandL( EPhoneViewSetGlobalNotifiersDisabled, + &globalNotifierParam ); + + // Stop capturing keys + CaptureKeysDuringCallNotificationL( EFalse ); + + // If dialler is not open then close menu bar. + if ( !IsNumberEntryUsedL() ) + { + iViewCommandHandle->ExecuteCommandL( EPhoneViewMenuBarClose ); + } + + // If conference bubble still exists then we have conference and + // single call + TPhoneCmdParamBoolean conferenceBubbleExists; + iViewCommandHandle->ExecuteCommandL( EPhoneViewGetIsConference, + &conferenceBubbleExists ); + + if( conferenceBubbleExists.Boolean() ) + { + // Go to Conference And Single state + iViewCommandHandle->ExecuteCommandL( + EPhoneViewRemoveFromConference, aCallId ); + } + else + { + // Remove call header + iViewCommandHandle->ExecuteCommandL( + EPhoneViewRemoveCallHeader, aCallId ); + } + } + +// ----------------------------------------------------------- +// CPhoneConference:HandleConferenceIdleL +// ----------------------------------------------------------- +// +void CPhoneConference::HandleConferenceIdleL() + { + __LOGMETHODSTARTEND( EPhoneUIStates, + "CPhoneConference::HandleConferenceIdleL()"); + + BeginTransEffectLC( ENumberEntryOpen ); + BeginUiUpdateLC(); + + iViewCommandHandle->ExecuteCommandL( EPhoneViewRemoveConferenceBubble ); + + TPhoneCmdParamInteger activeCallCount; + iViewCommandHandle->ExecuteCommandL( + EPhoneViewGetCountOfActiveCalls, &activeCallCount ); + + switch( activeCallCount.Integer() ) + { + case ENoActiveCalls: + MakeStateTransitionToIdleL(); + break; + + case EOneActiveCall: + { + // Fetch ringing call's id from view + TPhoneCmdParamCallStateData callStateData; + callStateData.SetCallState( EPEStateRinging ); + iViewCommandHandle->HandleCommandL( + EPhoneViewGetCallIdByState, &callStateData ); + + if( callStateData.CallId() > KErrNotFound ) + { + UpdateCbaL( EPhoneCallHandlingCallWaitingCBA ); + iStateMachine->ChangeState( EPhoneStateWaitingInSingle ); + } + else + { + MakeStateTransitionToSingleL(); + } + } + break; + + case ETwoActiveCalls: + MakeStateTransitionToTwoSinglesL(); + break; + + default: + MakeStateTransitionToTwoSinglesL(); + break; + } + + EndUiUpdate(); + EndTransEffect(); + } + +// ----------------------------------------------------------- +// CPhoneConference::HandleHeldConferenceL +// ----------------------------------------------------------- +// +void CPhoneConference::HandleHeldConferenceL( TInt aCallId ) + { + __LOGMETHODSTARTEND( EPhoneUIStates, + "CPhoneConference::HandleHeldConferenceL()"); + TPhoneCmdParamCallHeaderData callHeaderParam; + callHeaderParam.SetCallState( EPEStateHeld ); + + TInt callLabelId; + TBuf labelText( KNullDesC ); + callLabelId = CPhoneMainResourceResolver::Instance()-> + ResolveResourceID( EPhoneCallOnHold ); + + StringLoader::Load( + labelText, + callLabelId, + CCoeEnv::Static() ); + callHeaderParam.SetLabelText( labelText ); + + iViewCommandHandle->ExecuteCommandL( + EPhoneViewUpdateBubble, aCallId, &callHeaderParam ); + + // Set Hold flag to view + SetHoldFlagL(); + + if ( !FeatureManager::FeatureSupported( KFeatureIdTouchCallHandling ) ) + { + SendGlobalInfoNoteL( EPhoneInformationConferenceOnHold ); + } + + SetTouchPaneButtonDisabled( EPhoneInCallCmdPrivate ); + + UpdateInCallCbaL(); + } + + +// ----------------------------------------------------------- +// CPhoneConference::DefineAndSetHoldFlagL +// ----------------------------------------------------------- +// +void CPhoneConference::DefineAndSetHoldFlagL() + { + // Find out is conference held or not + TPhoneCmdParamCallStateData callStateData; + callStateData.SetCallId( KConferenceCallId ); + iViewCommandHandle->HandleCommandL( EPhoneViewGetCallState, + &callStateData ); + + // Set Hold flag to view + TPhoneCmdParamBoolean holdFlag; + + if( callStateData.CallState() == EPEStateHeld ) + { + holdFlag.SetBoolean( ETrue ); + } + else + { + holdFlag.SetBoolean( EFalse ); + } + iViewCommandHandle->ExecuteCommandL( EPhoneViewSetHoldFlag, &holdFlag ); + + } + +// ----------------------------------------------------------- +// CPhoneConference::SetHoldFlagL +// ----------------------------------------------------------- +// +void CPhoneConference::SetHoldFlagL() + { + // Set Hold flag to view + TPhoneCmdParamBoolean holdFlag; + holdFlag.SetBoolean( ETrue ); + iViewCommandHandle->ExecuteCommandL( EPhoneViewSetHoldFlag, &holdFlag ); + + } + +// ----------------------------------------------------------- +// CPhoneConference::HandleConnectedConferenceL +// ----------------------------------------------------------- +// +void CPhoneConference::HandleConnectedConferenceL() + { + __LOGMETHODSTARTEND( EPhoneUIStates, + "CPhoneConference::HandleConnectedConferenceL()"); + // Update call state + TPhoneCmdParamCallHeaderData callHeaderParam; + callHeaderParam.SetCallState( EPEStateConnected ); + + TBuf conferenceText( KNullDesC ); + TInt callLabelId = CPhoneMainResourceResolver::Instance()-> + ResolveResourceID( EPhoneCLIConferenceCall ); + + StringLoader::Load( + conferenceText, + callLabelId, + CCoeEnv::Static() ); + callHeaderParam.SetLabelText( conferenceText ); + + iViewCommandHandle->ExecuteCommandL( + EPhoneViewUpdateBubble, KConferenceCallId, &callHeaderParam ); + + // Set Hold flag to view + TPhoneCmdParamBoolean holdFlag; + holdFlag.SetBoolean( EFalse ); + iViewCommandHandle->ExecuteCommandL( EPhoneViewSetHoldFlag, &holdFlag ); + + if ( !FeatureManager::FeatureSupported( KFeatureIdTouchCallHandling ) ) + { + SendGlobalInfoNoteL( EPhoneInformationConferenceActiveted ); + } + + SetTouchPaneButtonEnabled( EPhoneInCallCmdPrivate ); + + UpdateInCallCbaL(); + } + +// ----------------------------------------------------------- +// CPhoneConference::OpenDropParticipantSelectionL +// ----------------------------------------------------------- +// +void CPhoneConference::OpenDropParticipantSelectionL() + { + __LOGMETHODSTARTEND( EPhoneUIStates, + "CPhoneConference::OpenDropParticipantSelectionL()"); + TPhoneCmdParamBoolean booleanParam; + booleanParam.SetBoolean( ETrue ); + iViewCommandHandle->ExecuteCommandL( + EPhoneViewOpenConferenceList, &booleanParam ); + + iCbaManager->SetCbaL( EPhoneDropParticipantCBA ); + } + +// ----------------------------------------------------------- +// CPhoneConference::DropSelectedParticipantL +// ----------------------------------------------------------- +// +void CPhoneConference::DropSelectedParticipantL() + { + __LOGMETHODSTARTEND( EPhoneUIStates, + "CPhoneConference::DropSelectedParticipantL()"); + // First fetch the call id matching the selected item + TPhoneViewResponseId response; + TPhoneCmdParamInteger callId; + response = iViewCommandHandle->HandleCommandL( + EPhoneViewSelectedConfMember, &callId ); + + if( response == EPhoneViewResponseSuccess ) + { + // Drop the call from conference + iStateMachine->SetCallId( callId.Integer() ); + iStateMachine->SendPhoneEngineMessage( + CPEPhoneModelIF::EPEMessageDropConferenceMember ); + } + } + +// ----------------------------------------------------------- +// CPhoneConference::OpenPrivateSelectionL +// ----------------------------------------------------------- +// +void CPhoneConference::OpenPrivateSelectionL() + { + __LOGMETHODSTARTEND( EPhoneUIStates, + "CPhoneConference::OpenPrivateSelectionL()"); + TPhoneCmdParamBoolean booleanParam; + booleanParam.SetBoolean( ETrue ); + iViewCommandHandle->ExecuteCommandL( + EPhoneViewOpenConferenceList, &booleanParam ); + + iCbaManager->SetCbaL( EPhonePrivateParticipantCBA ); + } + +// ----------------------------------------------------------- +// CPhoneConference::PrivateSelectedParticipantL +// ----------------------------------------------------------- +// +void CPhoneConference::PrivateSelectedParticipantL() + { + __LOGMETHODSTARTEND( EPhoneUIStates, + "CPhoneConference::PrivateSelectedParticipantL()"); + // First fetch the call id matching the selected item + TPhoneViewResponseId response; + TPhoneCmdParamInteger callId; + response = iViewCommandHandle->HandleCommandL( + EPhoneViewSelectedConfMember, &callId ); + + if( response == EPhoneViewResponseSuccess ) + { + // Drop the call from conference + iStateMachine->SetCallId( callId.Integer() ); + iStateMachine->SendPhoneEngineMessage( + CPEPhoneModelIF::EPEMessageGoOneToOne ); + + // Update call view + BeginUiUpdateLC(); + CloseSelectionListL(); + SetTouchPaneButtons( EPhoneConferenceButtons ); + EndUiUpdate(); + + UpdateCbaL( EPhoneCallHandlingInCallCBA ); + } + } + +// ----------------------------------------------------------- +// CPhoneConference::MakeStateTransitionToIdleL +// ----------------------------------------------------------- +// +void CPhoneConference::MakeStateTransitionToIdleL() + { + __LOGMETHODSTARTEND( EPhoneUIStates, + "CPhoneConference::MakeStateTransitionToIdleL()"); + + SetDefaultFlagsL(); + + if ( IsNumberEntryUsedL() ) + { + // Show the number entry if it exists + SetNumberEntryVisibilityL(ETrue); + + // Close dtmf dialer when call is disconnected. + if ( iOnScreenDialer && IsDTMFEditorVisibleL() ) + { + CloseDTMFEditorL(); + // Display idle screen and update CBAs + DisplayIdleScreenL(); + } + } + else if ( !TopAppIsDisplayedL() ) + { + // Close menu bar, if it is displayed + iViewCommandHandle->ExecuteCommandL( EPhoneViewMenuBarClose ); + + // Continue displaying current app but set up the + // idle screen in the background + SetupIdleScreenInBackgroundL(); + } + else + { + // Close menu bar, if it is displayed + iViewCommandHandle->ExecuteCommandL( EPhoneViewMenuBarClose ); + + // Display idle screen + DisplayIdleScreenL(); + } + + // Display call termination note, if necessary + DisplayCallTerminationNoteL(); + + UpdateCbaL( EPhoneEmptyCBA ); + // Go to idle state + iStateMachine->ChangeState( EPhoneStateIdle ); + } + +// ----------------------------------------------------------- +// CPhoneConference::MakeStateTransitionToSingleL +// ----------------------------------------------------------- +// +void CPhoneConference::MakeStateTransitionToSingleL() + { + __LOGMETHODSTARTEND( EPhoneUIStates, + "CPhoneConference::MakeStateTransitionToSingleL()"); + // Close menu bar, if it is displayed + iViewCommandHandle->ExecuteCommandL( EPhoneViewMenuBarClose ); + + if ( IsNumberEntryUsedL() ) + { + // Show the number entry if it exists + SetNumberEntryVisibilityL(ETrue); + } + SetTouchPaneButtons( EPhoneIncallButtons ); + + // Go to single state + UpdateCbaL( EPhoneCallHandlingInCallCBA ); + iStateMachine->ChangeState( EPhoneStateSingle ); + } + +// ----------------------------------------------------------- +// CPhoneConference::MakeTransitionToTwoSinglesL +// ----------------------------------------------------------- +// +void CPhoneConference::MakeStateTransitionToTwoSinglesL() + { + __LOGMETHODSTARTEND( EPhoneUIStates, + "CPhoneConference::MakeStateTransitionToTwoSinglesL()"); + // Close menu bar, if it is displayed + iViewCommandHandle->ExecuteCommandL( EPhoneViewMenuBarClose ); + + if ( IsNumberEntryUsedL() ) + { + // Show the number entry if it exists + SetNumberEntryVisibilityL(ETrue); + } + + SetTouchPaneButtons( EPhoneTwoSinglesButtons ); + + // Set Two singles softkeys + UpdateCbaL( EPhoneCallHandlingNewCallSwapCBA ); + + // Go to two singles state + iStateMachine->ChangeState( EPhoneStateTwoSingles ); + } + +// ----------------------------------------------------------- +// CPhoneConference::CloseSelectionListL +// ----------------------------------------------------------- +// +void CPhoneConference::CloseSelectionListL() + { + __LOGMETHODSTARTEND( EPhoneUIStates, + "CPhoneConference::CloseSelectionListL()"); + // Close conference list + TPhoneCmdParamBoolean booleanParam; + booleanParam.SetBoolean( EFalse ); + iViewCommandHandle->ExecuteCommandL( + EPhoneViewOpenConferenceList, &booleanParam ); + } + +// ----------------------------------------------------------- +// CPhoneConference::ToggleHold +// ----------------------------------------------------------- +// +void CPhoneConference::ToggleHoldL() + { + __LOGMETHODSTARTEND( EPhoneUIStates, + "CPhoneConference::ToggleHoldL()"); + TPhoneCmdParamBoolean hold; + iViewCommandHandle->ExecuteCommandL( EPhoneViewGetHoldFlag, &hold ); + + if( hold.Boolean() ) + { + iStateMachine->SendPhoneEngineMessage( + CPEPhoneModelIF::EPEMessageResumeConference ); + } + else + { + iStateMachine->SendPhoneEngineMessage( + CPEPhoneModelIF::EPEMessageHoldConference ); + } + } + +// ----------------------------------------------------------- +// CPhoneConference::HandleDiallingL +// ----------------------------------------------------------- +// +void CPhoneConference::HandleDiallingL( TInt aCallId ) + { + __LOGMETHODSTARTEND( EPhoneUIStates, + "CPhoneConference::HandleDiallingL()"); + + BeginTransEffectLC( ENumberEntryClose ); + BeginUiUpdateLC(); + + CloseSelectionListL(); + + SetNumberEntryVisibilityL(EFalse); + + // Display call setup + DisplayCallSetupL( aCallId ); + + // Conference is understood as single call in buttons enumerations. + SetTouchPaneButtons(EPhoneCallSetupAndSingleButtons); + + EndUiUpdate(); + + EndTransEffect(); + + // Set Call Setup CBA + UpdateCbaL( EPhoneCallHandlingCallSetupCBA ); + + // Go to conference and call setup state + iStateMachine->ChangeState( EPhoneStateConferenceAndCallSetup ); + } + +// ----------------------------------------------------------- +// CPhoneConference::DisplayCallSetupL +// ----------------------------------------------------------- +// +void CPhoneConference::DisplayCallSetupL( TInt aCallId ) + { + __LOGMETHODSTARTEND( EPhoneUIStates, + "CPhoneConference::DisplayCallSetupL()"); + // Close menu bar, if it is displayed + iViewCommandHandle->ExecuteCommandL( EPhoneViewMenuBarClose ); + + // Remove dialogs if necessary + iViewCommandHandle->ExecuteCommandL( EPhoneViewRemovePhoneDialogs ); + + // Capture keys when the phone is dialling + CaptureKeysDuringCallNotificationL( ETrue ); + + // Bring Phone app in the foreground + TPhoneCmdParamInteger uidParam; + uidParam.SetInteger( KUidPhoneApplication.iUid ); + iViewCommandHandle->ExecuteCommandL( EPhoneViewBringAppToForeground, + &uidParam ); + + // Display call setup header + DisplayHeaderForOutgoingCallL( aCallId ); + } + +// --------------------------------------------------------- +// CPhoneConference::CallFromNewCallQueryL +// --------------------------------------------------------- +// +void CPhoneConference::CallFromNewCallQueryL() + { + __LOGMETHODSTARTEND( EPhoneUIStates, + "CPhoneConference::CallFromNewCallQueryL()"); + // First get the phone number from the dialog + TPhoneCmdParamString phoneNumberParam; + HBufC *content = HBufC::NewLC( KPhoneNumberEntryBufferSize ); + TPtr ptr( content->Des() ); + phoneNumberParam.SetString( &ptr ); + iViewCommandHandle->ExecuteCommandL( EPhoneViewGetTextQueryContent, + &phoneNumberParam ); + + // Store the phone number + iStateMachine->PhoneEngineInfo()->SetPhoneNumber( ptr ); + + // clean up stack + CleanupStack::PopAndDestroy( content ); + + // Dial number + DialVoiceCallL(); + } + +// ----------------------------------------------------------- +// CPhoneConference::HandleIncomingL +// ----------------------------------------------------------- +// +void CPhoneConference::HandleIncomingL( TInt aCallId ) + { + __LOGMETHODSTARTEND( EPhoneUIStates, + "CPhoneConference::HandleIncomingL()"); + + BeginUiUpdateLC(); + + TPhoneCmdParamBoolean dialerParam; + dialerParam.SetBoolean( ETrue ); + + // Get allow waiting call header param value. + AllowShowingOfWaitingCallHeaderL( dialerParam ); + + CloseSelectionListL(); + + // Close fast swap window if it's displayed + CEikonEnv::Static()->DismissTaskList(); + + // Check if HW Keys or Call UI should be disabled + CheckDisableHWKeysAndCallUIL(); + + SetTouchPaneButtons( EPhoneWaitingCallButtons ); + + // Display incoming call + DisplayIncomingCallL( aCallId, dialerParam ); + + EndUiUpdate(); + + // Go to incoming state + UpdateCbaL( EPhoneCallHandlingCallWaitingCBA ); + iStateMachine->ChangeState( EPhoneStateConferenceAndWaiting ); + } + +// ----------------------------------------------------------- +// CPhoneConference::DisplayIncomingCallL +// ----------------------------------------------------------- +// +void CPhoneConference::DisplayIncomingCallL( + TInt aCallId, + const TPhoneCmdParamBoolean aCommandParam ) + { + __LOGMETHODSTARTEND( EPhoneUIStates, + "CPhoneConference::DisplayIncomingCallL()"); + // Close menu bar, if it is displayed + iViewCommandHandle->ExecuteCommandL( EPhoneViewMenuBarClose ); + + // Cannot delete active note, e.g. New call query, + // but show waiting note with or without caller name + if ( IsAnyQueryActiveL() || + ( !aCommandParam.Boolean() && iOnScreenDialer ) ) + { + CallWaitingNoteL( aCallId ); + } + else + { + // Remove any phone dialogs if they are displayed + iViewCommandHandle->ExecuteCommandL( EPhoneViewRemovePhoneDialogs ); + } + + // Indicate that the Phone needs to be sent to the background if + // an application other than the top application is in the foreground + TPhoneCmdParamBoolean booleanParam; + booleanParam.SetBoolean( !TopAppIsDisplayedL() ); + iViewCommandHandle->ExecuteCommandL( + EPhoneViewSetNeedToSendToBackgroundStatus, + &booleanParam ); + + // Bring Phone app in the foreground + TPhoneCmdParamInteger uidParam; + uidParam.SetInteger( KUidPhoneApplication.iUid ); + iViewCommandHandle->ExecuteCommandL( EPhoneViewBringAppToForeground, + &uidParam ); + + // Set Phone as the top application + iViewCommandHandle->ExecuteCommandL( EPhoneViewSetTopApplication, + &uidParam ); + + DisplayHeaderForCallComingInL( aCallId, ETrue ); // waiting call + } + +// ----------------------------------------------------------- +// CPhoneConference::HandleWentOneToOneL +// ----------------------------------------------------------- +// +void CPhoneConference::HandleWentOneToOneL( TInt aCallId ) + { + __LOGMETHODSTARTEND( EPhoneUIStates, + "CPhoneConference::HandleWentOneToOneL()"); + + BeginUiUpdateLC(); + + // Update conference bubble + iViewCommandHandle->ExecuteCommandL( + EPhoneViewPrivateFromConference, aCallId ); + + // If conference bubble still exists then we have conference and + // single call + TPhoneCmdParamBoolean conferenceBubbleExists; + iViewCommandHandle->ExecuteCommandL( EPhoneViewGetIsConference, + &conferenceBubbleExists ); + if( conferenceBubbleExists.Boolean() ) + { + // Go to Conference And Single state + + UpdateCbaL( EPhoneCallHandlingNewCallSwapCBA ); + iStateMachine->ChangeState( EPhoneStateConferenceAndSingle ); + SetTouchPaneButtons( EPhoneConferenceAndSingleButtons ); + SetTouchPaneButtonDisabled( EPhoneInCallCmdPrivate ); + } + else + { + SetTouchPaneButtons( EPhoneTwoSinglesButtons ); + } + EndUiUpdate(); + } + +// ----------------------------------------------------------- +// CPhoneConference::OpenParticipantsListL +// ----------------------------------------------------------- +// +void CPhoneConference::OpenParticipantsListL() + { + BeginUiUpdateLC(); + + TPhoneCmdParamBoolean booleanParam; + booleanParam.SetBoolean( ETrue ); + + iViewCommandHandle->ExecuteCommandL( EPhoneViewOpenConferenceList, + &booleanParam ); + + SetTouchPaneButtons( EPhoneParticipantListButtons ); + + EndUiUpdate(); + + iCbaManager->SetCbaL( EPhoneParticipantListCBA ); + + // Find out is conference held or not + TPhoneCmdParamCallStateData callStateData; + callStateData.SetCallId( KConferenceCallId ); + iViewCommandHandle->HandleCommandL( EPhoneViewGetCallState, + &callStateData ); + + if( callStateData.CallState() == EPEStateHeld ) + { + //set Private button to Dimmed. + SetTouchPaneButtonDisabled( EPhoneInCallCmdPrivate ); + } + else + { + //set Private button to UnDimmed. + SetTouchPaneButtonEnabled( EPhoneInCallCmdPrivate ); + } + + } + +// ----------------------------------------------------------- +// CPhoneConference::IsConferenceBubbleInSelectionMode +// ----------------------------------------------------------- +// +TBool CPhoneConference::IsConferenceBubbleInSelectionMode() const + { + TPhoneCmdParamBoolean booleanParam; + + iViewCommandHandle->ExecuteCommand( + EPhoneViewGetIsConferenceInSelectionMode, &booleanParam ); + + return booleanParam.Boolean(); + } + +// --------------------------------------------------------- +// CPhoneState::HandleCreateNumberEntryL +// --------------------------------------------------------- +// +void CPhoneConference::HandleCreateNumberEntryL( const TKeyEvent& aKeyEvent, + TEventCode aEventCode ) + { + __LOGMETHODSTARTEND( EPhoneControl, "CPhoneConference::HandleCreateNumberEntryL() "); + if ( !IsConferenceBubbleInSelectionMode() ) + { + CPhoneGsmInCall::HandleCreateNumberEntryL( aKeyEvent,aEventCode ); + } + } + +// ----------------------------------------------------------- +// CPhoneConference::UpdateConferenceSecurityStatusL +// ----------------------------------------------------------- +// +void CPhoneConference::UpdateConferenceSecurityStatusL( TInt aCallId ) + { + __PHONELOG1( EBasic, EPhoneUIStates, + "CPhoneConference::UpdateConferenceSecurityStatusL() - callId = %d", aCallId ); + + if( !iStateMachine->PhoneEngineInfo()->IsSecureCall( aCallId ) && + iStateMachine->PhoneEngineInfo()->IsSecureCall( KPEConferenceCallID ) ) + { + TPhoneCmdParamCallHeaderData callHeaderParam; + + callHeaderParam.SetCiphering( EFalse ); + callHeaderParam.SetCipheringIndicatorAllowed( + iStateMachine->PhoneEngineInfo()->SecureSpecified() ); + + iViewCommandHandle->ExecuteCommandL( + EPhoneViewCipheringInfoChange, + KPEConferenceCallID, + &callHeaderParam ); + } + } + +// End of File