diff -r 41a7f70b3818 -r 5266b1f337bd phoneapp/phoneuistates/src/cphoneconferenceandsingle.cpp --- a/phoneapp/phoneuistates/src/cphoneconferenceandsingle.cpp Tue Aug 31 15:14:29 2010 +0300 +++ b/phoneapp/phoneuistates/src/cphoneconferenceandsingle.cpp Wed Sep 01 12:30:10 2010 +0100 @@ -57,6 +57,16 @@ // CPhoneConferenceAndSingle::~CPhoneConferenceAndSingle() { + // Need to check iViewCommandHandle validity here to not + // trigger a high/can panic error in a Codescanner run. + // coverity[var_compare_op] + if ( iViewCommandHandle ) + { + TPhoneCmdParamBoolean dtmfSendFlag; + dtmfSendFlag.SetBoolean( EFalse ); + TRAP_IGNORE( iViewCommandHandle->ExecuteCommandL( EPhoneViewSetDtmfOptionsFlag, + &dtmfSendFlag ) ); + } } // ----------------------------------------------------------- @@ -68,6 +78,7 @@ void CPhoneConferenceAndSingle::ConstructL() { CPhoneConference::ConstructL(); + iViewCommandHandle->ExecuteCommandL( EPhoneViewUpdateMaxConfMemberFlag ); } // ----------------------------------------------------------- @@ -118,13 +129,13 @@ HandleHeldL( aCallId ); break; - case MEngineMonitor::EPEMessageInValidEmergencyNumber: - SendGlobalErrorNoteL( EPhoneNoteTextNotAllowed, ETrue ); + case MEngineMonitor::EPEMessageInValidEmergencyNumber: + SendGlobalErrorNoteL( EPhoneNoteTextNotAllowed ); break; case MEngineMonitor::EPEMessageValidEmergencyNumber: DialVoiceCallL(); - break; + break; case MEngineMonitor::EPEMessageAddedConferenceMember: HandleAddedConferenceMemberL( aCallId ); @@ -155,6 +166,7 @@ case EAknSoftkeyCancel: commandStatus = CPhoneConference::HandleCommandL( aCommand ); + iViewCommandHandle->ExecuteCommandL( EPhoneViewUpdateMaxConfMemberFlag ); SetTouchPaneButtons( EPhoneConferenceAndHeldSingleButtons ); break; @@ -164,6 +176,8 @@ break; case EPhoneInCallCmdParticipants: + commandStatus = CPhoneConference::HandleCommandL( aCommand ); + SetTouchPaneButtonDisabled( EPhoneInCallCmdPrivate ); break; default: @@ -175,6 +189,116 @@ } // ----------------------------------------------------------- +// CPhoneConferenceAndSingle::OpenMenuBarL +// ----------------------------------------------------------- +// +void CPhoneConferenceAndSingle::OpenMenuBarL() + { + __LOGMETHODSTARTEND( EPhoneUIStates, "CPhoneConferenceAndSingle::OpenMenuBarL"); + + // Set Conference And Single specific flag to view + TPhoneCmdParamBoolean conferenceAndSingleFlag; + conferenceAndSingleFlag.SetBoolean( ETrue ); + iViewCommandHandle->ExecuteCommandL( EPhoneViewSetConferenceAndSingleFlag, + &conferenceAndSingleFlag ); + + // Set specific flag to view so that DTMF menu item available + TPhoneCmdParamBoolean dtmfSendFlag; + dtmfSendFlag.SetBoolean( ETrue ); + iViewCommandHandle->ExecuteCommandL( EPhoneViewSetDtmfOptionsFlag, + &dtmfSendFlag ); + + TPhoneViewResponseId response; + TPhoneCmdParamCallStateData callStateData; + TPhoneCmdParamBoolean booleaParam; + TInt heldCallId( KErrNotFound ); + TInt connectedCallId( KErrNotFound ); + + // Fetch active call's id from view + callStateData.SetCallState( EPEStateConnected ); + response = iViewCommandHandle->HandleCommandL( + EPhoneViewGetCallIdByState, &callStateData ); + if( response != EPhoneViewResponseSuccess ) + { + // Unsuccesfull fetch - do nothing + return; + } + connectedCallId = callStateData.CallId(); + + // Fetch held call's id from view + callStateData.SetCallState( EPEStateHeld ); + response = iViewCommandHandle->HandleCommandL( + EPhoneViewGetCallIdByState, &callStateData ); + if( response != EPhoneViewResponseSuccess ) + { + // Unsuccesfull fetch - do nothing + return; + } + heldCallId = callStateData.CallId(); + + // Open the correct menubar according which call is active + TInt resourceId; + if( connectedCallId == KConferenceCallId ) + { + if ( IsNumberEntryVisibleL() ) + { + resourceId = EPhoneConfAndHeldCallMenubarWithNumberEntry; + } + else if ( IsConferenceBubbleInSelectionMode() ) + { + resourceId = EPhoneConfCallParticipantsDropMenubar; + } + else + { + resourceId = EPhoneConfAndHeldCallMenubar; + } + } + else + { + if ( IsNumberEntryVisibleL() ) + { + resourceId = EPhoneActiveAndHeldConfMenubarWithNumberEntry; + } + else if ( IsConferenceBubbleInSelectionMode() ) + { + resourceId = EPhoneConfCallParticipantsDropMenubar; + } + else + { + resourceId = EPhoneActiveAndHeldConfMenubar; + } + } + + iViewCommandHandle->ExecuteCommandL( EPhoneViewUpdateMaxConfMemberFlag ); + + // Check that calls are the same type (f.ex. both are CS calls) + booleaParam.SetBoolean( + heldCallId != KErrNotFound && connectedCallId != KErrNotFound && + iStateMachine->PhoneEngineInfo()->CallType( heldCallId ) != + iStateMachine->PhoneEngineInfo()->CallType( connectedCallId )); + + iViewCommandHandle->ExecuteCommandL( EPhoneViewSetConfrenceOptionsFlag, + &booleaParam ); + + if ( iOnScreenDialer && IsDTMFEditorVisibleL() ) + { + resourceId = EPhoneDtmfDialerMenubar; + } + else if ( iOnScreenDialer && IsCustomizedDialerVisibleL() ) + { + resourceId = CustomizedDialerMenuResourceIdL(); + } + + TPhoneCmdParamInteger integerParam; + integerParam.SetInteger( + CPhoneMainResourceResolver::Instance()-> + ResolveResourceID( resourceId ) ); + + iViewCommandHandle->ExecuteCommandL( EPhoneViewMenuBarOpen, + &integerParam ); + } + +// ----------------------------------------------------------- // CPhoneConferenceAndSingle::HandleConnectedConferenceL // ----------------------------------------------------------- // @@ -183,7 +307,7 @@ __LOGMETHODSTARTEND( EPhoneUIStates, "CPhoneConferenceAndSingle::HandleConnectedConferenceL"); // Update call state TPhoneCmdParamCallHeaderData callHeaderParam; - callHeaderParam.SetCallState( EPEStateConnectedConference ); + callHeaderParam.SetCallState( EPEStateConnected ); TBuf conferenceText( KNullDesC ); TInt callLabelId = CPhoneMainResourceResolver::Instance()-> @@ -205,7 +329,7 @@ EPhoneViewUpdateBubble, KConferenceCallId, &callHeaderParam ); SetTouchPaneButtons( EPhoneConferenceAndHeldSingleButtons ); - UpdateInCallCbaL(); + EndUiUpdate(); } @@ -220,7 +344,7 @@ { __LOGMETHODSTARTEND( EPhoneUIStates, "CPhoneConferenceAndSingle::HandleHeldConferenceL"); TPhoneCmdParamCallHeaderData callHeaderParam; - callHeaderParam.SetCallState( EPEStateHeldConference ); + callHeaderParam.SetCallState( EPEStateHeld ); TInt callLabelId; TBuf labelText( KNullDesC ); @@ -232,6 +356,8 @@ callLabelId, CCoeEnv::Static() ); callHeaderParam.SetLabelText( labelText ); + + iViewCommandHandle->ExecuteCommandL( EPhoneViewUpdateMaxConfMemberFlag ); BeginUiUpdateLC(); @@ -250,14 +376,15 @@ { __LOGMETHODSTARTEND( EPhoneUIStates, "CPhoneConferenceAndSingle::HandleConnectedL"); + UpdateInCallCbaL(); + + // Display connected bubble TPhoneCmdParamCallHeaderData callHeaderParam; callHeaderParam.SetCallState( EPEStateConnected ); iViewCommandHandle->ExecuteCommandL( EPhoneViewUpdateBubble, aCallId, &callHeaderParam ); - - UpdateInCallCbaL(); - SetTouchPaneButtons( EPhoneConferenceButtons ); + } // ----------------------------------------------------------- @@ -282,9 +409,7 @@ callHeaderParam.SetLabelText( labelText ); iViewCommandHandle->ExecuteCommandL( EPhoneViewUpdateBubble, aCallId, - &callHeaderParam ); - - SetTouchPaneButtons( EPhoneConferenceButtons ); + &callHeaderParam ); } // ----------------------------------------------------------- @@ -303,9 +428,15 @@ UpdateConferenceSecurityStatusL( aCallId ); SetTouchPaneButtons( EPhoneConferenceButtons ); + SetTouchPaneButtonEnabled( EPhoneInCallCmdPrivate ); EndUiUpdate(); + TPhoneCmdParamBoolean conferenceAndSingleFlag; + conferenceAndSingleFlag.SetBoolean( EFalse ); + iViewCommandHandle->ExecuteCommandL( EPhoneViewSetConferenceAndSingleFlag, + &conferenceAndSingleFlag ); + UpdateCbaL( EPhoneCallHandlingInCallCBA ); iStateMachine->ChangeState( EPhoneStateConference ); } @@ -328,9 +459,17 @@ void CPhoneConferenceAndSingle::HandleIncomingL( TInt aCallId ) { __LOGMETHODSTARTEND( EPhoneUIStates, - "CPhoneConferenceAndSingle::HandleIncomingL"); + "CPhoneConferenceAndSingle::HandleIncomingL"); + IsNumberEntryUsedL() ? + BeginTransEffectLC( ECallUiAppear ) : + BeginTransEffectLC( ENumberEntryOpen ); + BeginUiUpdateLC(); - BeginUiUpdateLC(); + // Hide the number entry if it exists + if ( IsNumberEntryUsedL() ) + { + SetNumberEntryVisibilityL( EFalse ); + } TPhoneCmdParamBoolean dialerParam; dialerParam.SetBoolean( ETrue ); @@ -338,21 +477,31 @@ // Get allow waiting call header param value. AllowShowingOfWaitingCallHeaderL( dialerParam ); + // Close conference list + TPhoneCmdParamBoolean booleanParam; + booleanParam.SetBoolean( EFalse ); + iViewCommandHandle->ExecuteCommandL( + EPhoneViewOpenConferenceList, &booleanParam ); + iViewCommandHandle->ExecuteCommandL( EPhoneViewCloseFSW ); - // Check if HW Keys or Call UI should be disabled - CheckDisableHWKeysAndCallUIL(); - + // Set touch controls + SetTouchPaneButtonDisabled( EPhoneCallComingCmdAnswer ); + + SetTouchPaneButtons( EPhoneWaitingCallButtons ); + // Display incoming call DisplayIncomingCallL( aCallId, dialerParam ); - // Set touch controls - SetTouchPaneButtons( EPhoneWaitingCallButtons ); - EndUiUpdate(); + EndTransEffect(); + TPhoneCmdParamBoolean conferenceAndSingleFlag; + conferenceAndSingleFlag.SetBoolean( EFalse ); + iViewCommandHandle->ExecuteCommandL( EPhoneViewSetConferenceAndSingleFlag, + &conferenceAndSingleFlag ); // Go to Conference And Single And Waiting state - UpdateCbaL( EPhoneCallHandlingIncomingRejectCBA ); + UpdateCbaL( EPhoneCallHandlingCallWaitingCBA ); iStateMachine->ChangeState( EPhoneStateConferenceAndSingleAndWaiting ); } @@ -363,7 +512,13 @@ void CPhoneConferenceAndSingle::HandleIdleL( TInt aCallId ) { __LOGMETHODSTARTEND( EPhoneUIStates, - "CPhoneConferenceAndSingle::HandleIdleL"); + "CPhoneConferenceAndSingle::HandleIdleL"); + + // If dialler is not open then close menu bar. + if ( !IsNumberEntryUsedL() ) + { + iViewCommandHandle->ExecuteCommandL( EPhoneViewMenuBarClose ); + } TPhoneCmdParamBoolean conferenceExistsForCallId; iViewCommandHandle->ExecuteCommandL( EPhoneViewGetCallExistsInConference, @@ -374,6 +529,8 @@ // Remove conference member from conference bubble iViewCommandHandle->ExecuteCommandL( EPhoneViewRemoveFromConference, aCallId ); + + iViewCommandHandle->ExecuteCommandL( EPhoneViewUpdateMaxConfMemberFlag ); } else { @@ -381,9 +538,24 @@ BeginUiUpdateLC(); iViewCommandHandle->ExecuteCommandL( EPhoneViewRemoveCallHeader, aCallId ); - SetTouchPaneButtons( EPhoneConferenceButtons ); + TPhoneCmdParamBoolean conferenceAndSingleFlag; + conferenceAndSingleFlag.SetBoolean( EFalse ); + iViewCommandHandle->ExecuteCommandL( EPhoneViewSetConferenceAndSingleFlag, + &conferenceAndSingleFlag ); - UpdateCbaL( EPhoneCallHandlingInCallCBA ); + TPhoneCmdParamBoolean participantsVisibleFlag; + iViewCommandHandle->ExecuteCommandL( EPhoneViewGetConferenceListVisibleFlag, + &participantsVisibleFlag ); + + // if participants list is visible - do not change buttons or cba + if( !participantsVisibleFlag.Boolean() ) + { + // Go to Conference state + SetTouchPaneButtons( EPhoneConferenceButtons ); + SetTouchPaneButtonEnabled( EPhoneInCallCmdPrivate ); + + UpdateCbaL( EPhoneCallHandlingInCallCBA ); + } EndUiUpdate(); @@ -405,19 +577,19 @@ TPhoneCmdParamInteger intParam; iViewCommandHandle->ExecuteCommandL( EPhoneViewGetCountOfActiveCalls, - &intParam ); - + &intParam ); + switch( intParam.Integer() ) - { - case EOneActiveCall: - MakeStateTransitionToSingleL(); - break; - - case ETwoActiveCalls: // Fall through - default: - MakeStateTransitionToTwoSinglesL(); - break; - } + { + case EOneActiveCall: + MakeStateTransitionToSingleL(); + break; + + case ETwoActiveCalls: // Fall through + default: + MakeStateTransitionToTwoSinglesL(); + break; + } } // -------------------------------------------------------------- @@ -435,15 +607,15 @@ // send-key case EKeyYes: if( IsNumberEntryVisibleL() ) - { + { HandleSendL(); } - else - { + else + { // Number entry is below so swap the call iStateMachine->SendPhoneEngineMessage( - CPEPhoneModelIF::EPEMessageSwap ); - } + CPEPhoneModelIF::EPEMessageSwap ); + } break; default: @@ -484,8 +656,32 @@ { iStateMachine->SendPhoneEngineMessage( MPEPhoneModel::EPEMessageCheckEmergencyNumber ); - } + } CleanupStack::PopAndDestroy( phoneNumber ); } +// ----------------------------------------------------------- +// CPhoneConferenceAndSingle::DisconnectCallL +// ----------------------------------------------------------- +// +void CPhoneConferenceAndSingle::DisconnectCallL() + { + __LOGMETHODSTARTEND(EPhoneControl, "CPhoneConferenceAndSingle::DisconnectCallL( ) "); + // Fetch active call's id from view + TPhoneCmdParamCallStateData callStateData; + callStateData.SetCallState( EPEStateConnected ); + iViewCommandHandle->HandleCommandL( + EPhoneViewGetCallIdByState, &callStateData ); + + if( callStateData.CallId() > KErrNotFound && callStateData.CallId() == KConferenceCallId ) + { + iStateMachine->SendPhoneEngineMessage( + CPEPhoneModelIF::EPEMessageHangUpConference ); + } + else + { + CPhoneState::DisconnectCallL(); + } + } + // End of File