phoneapp/phoneuistates/src/cphoneconferenceandwaitingandcallsetup.cpp
changeset 0 5f000ab63145
child 1 838b0a10d15b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phoneapp/phoneuistates/src/cphoneconferenceandwaitingandcallsetup.cpp	Mon Jan 18 20:18:27 2010 +0200
@@ -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 <StringLoader.h>
+#include <cpephonemodelif.h>
+#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->ExecuteCommandL( 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