phoneapp/phoneuistates/src/cphonesingleandwaiting.cpp
changeset 0 5f000ab63145
child 4 24062c24fe38
equal deleted inserted replaced
-1:000000000000 0:5f000ab63145
       
     1 /*
       
     2 * Copyright (c) 2005-2008 Nokia Corporation and/or its subsidiary(-ies).
       
     3 * All rights reserved.
       
     4 * This component and the accompanying materials are made available
       
     5 * under the terms of "Eclipse Public License v1.0"
       
     6 * which accompanies this distribution, and is available
       
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 *
       
     9 * Initial Contributors:
       
    10 * Nokia Corporation - initial contribution.
       
    11 *
       
    12 * Contributors:
       
    13 *
       
    14 * Description: Implementation of CPhoneSingleAndWaiting class.
       
    15 *
       
    16 */
       
    17 
       
    18 
       
    19 // INCLUDES
       
    20 #include <eikmenub.h>
       
    21 #include <eikenv.h>
       
    22 #include <StringLoader.h>
       
    23 #include <featmgr.h>
       
    24 #include <pevirtualengine.h>
       
    25 #include <mpeengineinfo.h>
       
    26 #include <telephonyvariant.hrh>
       
    27 #include <cpephonemodelif.h>
       
    28 #include "cphonesingleandwaiting.h"
       
    29 #include "mphonestatemachine.h"
       
    30 #include "phoneviewcommanddefinitions.h"
       
    31 #include "phoneui.hrh"
       
    32 #include "cphonemainresourceresolver.h"
       
    33 #include "phonerssbase.h"
       
    34 #include "cphonegsmincall.h"
       
    35 #include "tphonecmdparaminteger.h"
       
    36 #include "tphonecmdparamboolean.h"
       
    37 #include "tphonecmdparamstring.h"
       
    38 #include "tphonecmdparamcallheaderdata.h"
       
    39 #include "tphonecmdparamglobalnote.h"
       
    40 #include "tphonecmdparamcallstatedata.h"
       
    41 #include "phonestatedefinitionsgsm.h"
       
    42 #include "phonelogger.h"
       
    43 #include "cphonecenrepproxy.h"
       
    44 #include "cphonepubsubproxy.h"
       
    45 #include "mphonestorage.h"
       
    46 
       
    47 // ================= MEMBER FUNCTIONS =======================
       
    48 
       
    49 // C++ default constructor can NOT contain any code, that
       
    50 // might leave.
       
    51 //
       
    52 CPhoneSingleAndWaiting::CPhoneSingleAndWaiting(
       
    53     MPhoneStateMachine* aStateMachine,
       
    54     MPhoneViewCommandHandle* aViewCommandHandle,
       
    55     MPhoneCustomization* aPhoneCustomization ) :
       
    56     CPhoneGsmInCall( aStateMachine, aViewCommandHandle, aPhoneCustomization ),
       
    57     iSingleCallId ( KErrNotFound )
       
    58     {
       
    59     }
       
    60 
       
    61 // -----------------------------------------------------------
       
    62 // CPhoneSingleAndWaiting::~CPhoneSingleAndWaiting()
       
    63 // Destructor
       
    64 // (other items were commented in a header).
       
    65 // -----------------------------------------------------------
       
    66 //
       
    67 CPhoneSingleAndWaiting::~CPhoneSingleAndWaiting()
       
    68     {
       
    69     if( iViewCommandHandle )
       
    70         {
       
    71         TPhoneCmdParamBoolean dtmfSendFlag;
       
    72         dtmfSendFlag.SetBoolean( EFalse );
       
    73         TRAP_IGNORE( iViewCommandHandle->ExecuteCommandL( 
       
    74                         EPhoneViewSetVideoCallDTMFVisibilityFlag,
       
    75                         &dtmfSendFlag ); )
       
    76         }
       
    77     }
       
    78 
       
    79 // -----------------------------------------------------------
       
    80 // CPhoneSingleAndWaiting::ConstructL()
       
    81 // Constructor
       
    82 // (other items were commented in a header).
       
    83 // -----------------------------------------------------------
       
    84 //
       
    85 void CPhoneSingleAndWaiting::ConstructL()
       
    86     {
       
    87     CPhoneGsmInCall::ConstructL();
       
    88 
       
    89     TPhoneCmdParamCallStateData callStateData;
       
    90     callStateData.SetCallState( EPEStateConnected );
       
    91 
       
    92     iViewCommandHandle->HandleCommandL(
       
    93         EPhoneViewGetCallIdByState, &callStateData );
       
    94 
       
    95     if ( callStateData.CallId() == KErrNotFound )
       
    96         {
       
    97         callStateData.SetCallState( EPEStateHeld );
       
    98         iViewCommandHandle->HandleCommandL(
       
    99             EPhoneViewGetCallIdByState, &callStateData );
       
   100         }
       
   101     iSingleCallId = callStateData.CallId();
       
   102 
       
   103     __PHONELOG1( EBasic, EPhoneUIStates,
       
   104         "CPhoneSingleAndWaiting::ConstructL()  (iSingleCallId=%d)", iSingleCallId);
       
   105     }
       
   106 
       
   107 // -----------------------------------------------------------
       
   108 // CPhoneSingleAndWaiting::NewL()
       
   109 // Constructor
       
   110 // (other items were commented in a header).
       
   111 // -----------------------------------------------------------
       
   112 //
       
   113 CPhoneSingleAndWaiting* CPhoneSingleAndWaiting::NewL(
       
   114     MPhoneStateMachine* aStateMachine,
       
   115     MPhoneViewCommandHandle* aViewCommandHandle,
       
   116     MPhoneCustomization* aPhoneCustomization )
       
   117     {
       
   118     CPhoneSingleAndWaiting* self = new( ELeave ) CPhoneSingleAndWaiting(
       
   119         aStateMachine, aViewCommandHandle, aPhoneCustomization );
       
   120 
       
   121     CleanupStack::PushL( self );
       
   122     self->ConstructL();
       
   123     CleanupStack::Pop( self );
       
   124 
       
   125     return self;
       
   126     }
       
   127 
       
   128 // -----------------------------------------------------------
       
   129 // CPhoneSingleAndWaiting::HandlePhoneEngineMessageL
       
   130 // -----------------------------------------------------------
       
   131 //
       
   132 void CPhoneSingleAndWaiting::HandlePhoneEngineMessageL(
       
   133     const TInt aMessage,
       
   134     TInt aCallId )
       
   135     {
       
   136     __LOGMETHODSTARTEND( EPhoneUIStates,
       
   137         "CPhoneSingleAndWaiting::HandlePhoneEngineMessageL() ");
       
   138     switch ( aMessage )
       
   139         {
       
   140         case MEngineMonitor::EPEMessageIdle:
       
   141             HandleIdleL( aCallId );
       
   142             break;
       
   143 
       
   144         case MEngineMonitor::EPEMessageHeld:
       
   145             HandleHeldL( aCallId );
       
   146             break;
       
   147 
       
   148         case MEngineMonitor::EPEMessageConnected:
       
   149             HandleConnectedL( aCallId );
       
   150             break;
       
   151 
       
   152         case MEngineMonitor::EPEMessageDialing:
       
   153             HandleDiallingL( aCallId );
       
   154             break;
       
   155             
       
   156         case MEngineMonitor::EPEMessageDisconnecting:
       
   157             HandleDisconnectingL( aCallId );
       
   158             /* Flow through */
       
   159 
       
   160         default:
       
   161             CPhoneGsmInCall::HandlePhoneEngineMessageL( aMessage, aCallId );
       
   162             break;
       
   163         }
       
   164     }
       
   165 
       
   166 // -----------------------------------------------------------
       
   167 // CPhoneSingleAndWaiting:HandleCommandL
       
   168 // -----------------------------------------------------------
       
   169 //
       
   170 TBool CPhoneSingleAndWaiting::HandleCommandL( TInt aCommand )
       
   171     {
       
   172     __LOGMETHODSTARTEND( EPhoneUIStates,
       
   173         "CPhoneSingleAndWaiting::HandleCommandL() ");
       
   174     TBool commandStatus = ETrue;
       
   175 
       
   176     switch( aCommand )
       
   177         {
       
   178         case EPhoneInCallCmdHold:
       
   179             {
       
   180             iStateMachine->SetCallId( iSingleCallId );
       
   181             iStateMachine->SendPhoneEngineMessage(
       
   182                 CPEPhoneModelIF::EPEMessageHold );
       
   183             break;
       
   184             }
       
   185 
       
   186         case EPhoneInCallCmdUnhold:
       
   187             {
       
   188             iStateMachine->SetCallId( iSingleCallId );
       
   189             iStateMachine->SendPhoneEngineMessage(
       
   190                 CPEPhoneModelIF::EPEMessageResume );
       
   191             break;
       
   192             }
       
   193 
       
   194         case EPhoneInCallCmdNewCall:
       
   195             LaunchNewCallQueryL();
       
   196             break;
       
   197 
       
   198         case EPhoneInCallCmdNewCallCall:
       
   199             CallFromNewCallQueryL();
       
   200             break;
       
   201 
       
   202         case EPhoneCallComingCmdReject: // fall through
       
   203             {
       
   204             // Get waiting callid
       
   205             TPhoneCmdParamCallStateData callStateData;
       
   206             callStateData.SetCallState( EPEStateRinging );
       
   207             iViewCommandHandle->HandleCommandL( EPhoneViewGetCallIdByState,
       
   208                 &callStateData );
       
   209             iStateMachine->SetCallId( callStateData.CallId() );
       
   210             iStateMachine->SendPhoneEngineMessage(
       
   211                 MPEPhoneModel::EPEMessageReject );
       
   212             break;
       
   213             }
       
   214 
       
   215 
       
   216         case EPhoneInCallCmdReject:
       
   217             iStateMachine->SetCallId( iSingleCallId );
       
   218             iStateMachine->SendPhoneEngineMessage(
       
   219                 MPEPhoneModel::EPEMessageReject );
       
   220             break;
       
   221 
       
   222         default:
       
   223             commandStatus = CPhoneGsmInCall::HandleCommandL( aCommand );
       
   224             break;
       
   225         }
       
   226 
       
   227     return commandStatus;
       
   228     }
       
   229 
       
   230 // -----------------------------------------------------------
       
   231 // CPhoneSingleAndWaiting::OpenMenuBarL
       
   232 // -----------------------------------------------------------
       
   233 //
       
   234 void CPhoneSingleAndWaiting::OpenMenuBarL()
       
   235     {
       
   236     __LOGMETHODSTARTEND( EPhoneUIStates,
       
   237         "CPhoneSingleAndWaiting::OpenMenuBarL() ");
       
   238     TInt resourceId ( KErrNone );
       
   239 
       
   240 
       
   241     if ( !IsAutoLockOn() )
       
   242         {
       
   243          if( IsVideoCallActiveL() || IsVideoCallRingingL() )
       
   244             {
       
   245             //DTMF hiding will be set to TRUE
       
   246             if( IsVideoCallActiveL() )
       
   247                 {
       
   248                 TPhoneCmdParamBoolean dtmfSendFlag;
       
   249                 dtmfSendFlag.SetBoolean( ETrue );
       
   250                 iViewCommandHandle->ExecuteCommandL( EPhoneViewSetVideoCallDTMFVisibilityFlag,
       
   251                         &dtmfSendFlag );
       
   252                 }
       
   253             if ( IsNumberEntryVisibleL() )
       
   254                 {
       
   255                 resourceId = EPhoneVideoCallWaitingMenubarWithNumberEntry;
       
   256                 }
       
   257             else
       
   258                 {
       
   259                 resourceId = EPhoneVideoCallWaitingMenubar;
       
   260                 }
       
   261             }
       
   262 
       
   263         else // single voice and waiting voice
       
   264             {
       
   265             if ( IsNumberEntryVisibleL() )
       
   266                 {
       
   267                 resourceId = EPhoneCallWaitingMenubarWithNumberEntry;
       
   268                 }
       
   269             else
       
   270                 {
       
   271                 resourceId = EPhoneCallWaitingMenubar;
       
   272                 }
       
   273             }
       
   274         }
       
   275     else
       
   276         {
       
   277         resourceId = EPhoneCallWaitingLockMenubar;
       
   278         }
       
   279 
       
   280 
       
   281     TPhoneCmdParamInteger integerParam;
       
   282     integerParam.SetInteger(
       
   283         CPhoneMainResourceResolver::Instance()->
       
   284         ResolveResourceID( resourceId ) );
       
   285     iViewCommandHandle->ExecuteCommandL( EPhoneViewMenuBarOpen,
       
   286         &integerParam );
       
   287     }
       
   288 
       
   289 // --------------------------------------------------------------
       
   290 // CPhoneSingleAndWaiting::HandleKeyMessageL
       
   291 // --------------------------------------------------------------
       
   292 //
       
   293 void CPhoneSingleAndWaiting::HandleKeyMessageL(
       
   294     TPhoneKeyEventMessages aMessage,
       
   295     TKeyCode aCode )
       
   296     {
       
   297     __LOGMETHODSTARTEND( EPhoneUIStates,
       
   298         "CPhoneSingleAndWaiting::HandleKeyMessageL() ");
       
   299     switch ( aCode )
       
   300         {
       
   301         // send-key
       
   302         case EKeyYes:
       
   303             {
       
   304             if( IsNumberEntryVisibleL() )
       
   305                 {
       
   306                 // Send a manual control sequence by providing number
       
   307                 // information with Dial command
       
   308                 CallFromNumberEntryL();
       
   309                 }
       
   310              else
       
   311                 {
       
   312                 // Close DTMF sending note if it exists
       
   313                 iViewCommandHandle->ExecuteCommandL( EPhoneViewRemoveNote );
       
   314 
       
   315                 // Number entry is below incoming call bubble so
       
   316                 // answer the call
       
   317                 iStateMachine->SendPhoneEngineMessage(
       
   318                     CPEPhoneModelIF::EPEMessageAnswer );
       
   319                 }
       
   320             break;
       
   321             }
       
   322 
       
   323         default:
       
   324             // do base operation
       
   325             CPhoneGsmInCall::HandleKeyMessageL( aMessage, aCode );
       
   326             break;
       
   327         }
       
   328     }
       
   329 
       
   330 // -----------------------------------------------------------
       
   331 // CPhoneSingleAndWaiting::HandleKeyEventL
       
   332 // -----------------------------------------------------------
       
   333 //
       
   334 void CPhoneSingleAndWaiting::HandleKeyEventL(
       
   335     const TKeyEvent& aKeyEvent,
       
   336     TEventCode aEventCode )
       
   337     {
       
   338     if( EKeyDeviceF == aKeyEvent.iCode )
       
   339         {
       
   340         __PHONELOG( EBasic, EPhoneUIStates,
       
   341             "CPhoneSingleAndWaiting::HandleKeyMessageL-deviceF" );
       
   342         HandleHoldSwitchL();
       
   343         }
       
   344     }
       
   345 
       
   346 // -----------------------------------------------------------
       
   347 // CPhoneSingleAndWaiting::HandleIdleL
       
   348 // -----------------------------------------------------------
       
   349 //
       
   350 void CPhoneSingleAndWaiting::HandleIdleL( TInt aCallId )
       
   351     {
       
   352     __LOGMETHODSTARTEND( EPhoneUIStates,
       
   353         "CPhoneSingleAndWaiting::HandleIdleL() ");
       
   354     // Close menu bar, if it is displayed
       
   355     iViewCommandHandle->ExecuteCommandL( EPhoneViewMenuBarClose );
       
   356 
       
   357     if ( iSingleCallId == KErrNotFound )
       
   358         {
       
   359         TPhoneCmdParamCallStateData callStateData;
       
   360         callStateData.SetCallState( EPEStateDisconnecting );
       
   361 
       
   362         iViewCommandHandle->HandleCommandL(
       
   363             EPhoneViewGetCallIdByState, &callStateData );
       
   364 
       
   365         if ( callStateData.CallId() == KErrNotFound )
       
   366             {
       
   367             callStateData.SetCallState( EPEStateConnected );
       
   368             iViewCommandHandle->HandleCommandL(
       
   369                 EPhoneViewGetCallIdByState, &callStateData );
       
   370 
       
   371             if ( callStateData.CallId() == KErrNotFound )
       
   372                 {
       
   373                 callStateData.SetCallState( EPEStateHeld );
       
   374                 iViewCommandHandle->HandleCommandL(
       
   375                     EPhoneViewGetCallIdByState, &callStateData );
       
   376                 }
       
   377             }
       
   378 
       
   379         iSingleCallId = callStateData.CallId();
       
   380         }
       
   381 
       
   382     __PHONELOG1( EBasic, EPhoneControl, 
       
   383         "CPhoneSingleAndWaiting::HandleIdleL iSingleCallId(%d)",
       
   384         iSingleCallId );
       
   385     __PHONELOG1( EBasic, EPhoneControl, 
       
   386         "CPhoneSingleAndWaiting::HandleIdleL aCallId(%d)",
       
   387         aCallId );
       
   388     
       
   389     if( iSingleCallId == aCallId )
       
   390         {
       
   391         // Idle message came for active call
       
   392         BeginUiUpdateLC();
       
   393 
       
   394         // Remove call
       
   395         iViewCommandHandle->ExecuteCommandL( EPhoneViewRemoveCallHeader, aCallId );
       
   396 
       
   397         // Get waiting callId
       
   398         TPhoneCmdParamCallStateData callStateData;
       
   399         callStateData.SetCallState( EPEStateRinging );
       
   400         iViewCommandHandle->HandleCommandL( EPhoneViewGetCallIdByState,
       
   401             &callStateData );
       
   402         
       
   403         __PHONELOG1( EBasic, EPhoneControl, 
       
   404             "CPhoneSingleAndWaiting::HandleIdleL EPEStateRinging CallId(%d)",
       
   405             callStateData.CallId() );
       
   406         
       
   407         if ( callStateData.CallId() > KErrNotFound )
       
   408             {
       
   409             // Display ringing bubble
       
   410             TPhoneCmdParamCallHeaderData callHeaderParam;
       
   411             callHeaderParam.SetCallState( EPEStateRinging );
       
   412 
       
   413             // Set Hold flag to view
       
   414             TPhoneCmdParamBoolean holdFlag;
       
   415             holdFlag.SetBoolean( EFalse );
       
   416             iViewCommandHandle->ExecuteCommandL( EPhoneViewSetHoldFlag, &holdFlag );
       
   417             
       
   418             SetCallHeaderTextsForCallComingInL( callStateData.CallId(), EFalse, &callHeaderParam );
       
   419             
       
   420             iViewCommandHandle->ExecuteCommandL( EPhoneViewUpdateBubble,
       
   421                 callStateData.CallId(),
       
   422                 &callHeaderParam );
       
   423 
       
   424             // Hide number entry if visible
       
   425             if ( IsNumberEntryVisibleL() )
       
   426                 {
       
   427                 SetNumberEntryVisibilityL(EFalse);
       
   428                 }
       
   429 
       
   430             // Check if HW Keys or Call UI should be disabled
       
   431             CheckDisableHWKeysAndCallUIL();
       
   432             
       
   433             SetTouchPaneButtons( EPhoneIncomingCallButtons );
       
   434             SetTouchPaneButtonEnabled( EPhoneCallComingCmdSilent );
       
   435             
       
   436             // Bring up callhandling view
       
   437             BringIncomingToForegroundL();
       
   438 
       
   439             //Set incoming cba
       
   440             iCbaManager->UpdateIncomingCbaL( callStateData.CallId() );
       
   441             UpdateSilenceButtonDimming();
       
   442             
       
   443             // Play ringtone
       
   444             SetRingingTonePlaybackL( callStateData.CallId() );
       
   445             }
       
   446         EndUiUpdate();
       
   447         SetToolbarDimming( ETrue );
       
   448 
       
   449         iStateMachine->ChangeState( EPhoneStateIncoming );
       
   450         }
       
   451     else
       
   452         {
       
   453         // Effect is shown when dialer exist.
       
   454         TBool effectStarted ( EFalse );
       
   455         if ( !NeedToSendToBackgroundL() )
       
   456             {
       
   457             BeginTransEffectLC( ENumberEntryOpen );
       
   458             effectStarted = ETrue;
       
   459             }
       
   460 
       
   461         BeginUiUpdateLC();
       
   462 
       
   463         // Remove call
       
   464         iViewCommandHandle->ExecuteCommandL( EPhoneViewRemoveCallHeader, aCallId );
       
   465 
       
   466         // Idle message came for waiting call
       
   467         if ( IsNumberEntryUsedL() )
       
   468             {
       
   469             if ( NeedToSendToBackgroundL() )
       
   470                 {
       
   471                 // Return phone to the background if send to background is needed.
       
   472                 iViewCommandHandle->ExecuteCommandL( EPhoneViewSendToBackground );
       
   473 
       
   474                 iViewCommandHandle->ExecuteCommandL( EPhoneViewSetControlAndVisibility );
       
   475 
       
   476                 UpdateCbaL( EPhoneCallHandlingInCallCBA );
       
   477                 }
       
   478             else
       
   479                 {
       
   480                 // Show the number entry if it exists
       
   481                 SetNumberEntryVisibilityL(ETrue);
       
   482                 }
       
   483             }
       
   484         else
       
   485             {
       
   486             UpdateCbaL( EPhoneCallHandlingInCallCBA );
       
   487             // If numberentry is not open just check NeedToSendToBackgroundL and
       
   488             // sendbackround if needed.
       
   489             if ( NeedToSendToBackgroundL() )
       
   490                 {
       
   491                 // Return phone to the background if send to background is needed.
       
   492                 iViewCommandHandle->ExecuteCommandL( EPhoneViewSendToBackground );
       
   493                 }
       
   494             }
       
   495         
       
   496         // Enable call UI
       
   497         if( FeatureManager::FeatureSupported( KFeatureIdFfTouchUnlockStroke ) 
       
   498             && iStateMachine->PhoneStorage()->IsScreenLocked() )
       
   499             {
       
   500             EnableCallUIL();
       
   501             }
       
   502 
       
   503         // Reset blocked keys list
       
   504         iStateMachine->PhoneStorage()->ResetBlockedKeysList();
       
   505 
       
   506         SetTouchPaneButtons( EPhoneIncallButtons );
       
   507         EndUiUpdate();
       
   508         if( effectStarted )
       
   509             {
       
   510             EndTransEffect();
       
   511             }
       
   512         // CBA updates in above if-else conditions
       
   513         iStateMachine->ChangeState( EPhoneStateSingle );
       
   514         }
       
   515 
       
   516     }
       
   517 
       
   518 // -----------------------------------------------------------
       
   519 // CPhoneSingleAndWaiting::HandleHeldL
       
   520 // -----------------------------------------------------------
       
   521 //
       
   522 void CPhoneSingleAndWaiting::HandleHeldL( TInt aCallId )
       
   523     {
       
   524     __LOGMETHODSTARTEND( EPhoneUIStates,
       
   525         "CPhoneSingleAndWaiting::HandleHeldL() ");
       
   526 
       
   527      // Display hold bubble
       
   528     TPhoneCmdParamCallHeaderData callHeaderParam;
       
   529     callHeaderParam.SetCallState( EPEStateHeld );
       
   530 
       
   531     TBuf<KPhoneCallHeaderLabelMaxLength> labelText( KNullDesC );
       
   532     TInt callLabelId = CPhoneMainResourceResolver::Instance()->
       
   533             ResolveResourceID( EPhoneCallOnHold );
       
   534 
       
   535     StringLoader::Load( labelText, callLabelId, CCoeEnv::Static() );
       
   536     callHeaderParam.SetLabelText( labelText );
       
   537 
       
   538     iViewCommandHandle->ExecuteCommandL( EPhoneViewUpdateBubble, aCallId,
       
   539         &callHeaderParam );
       
   540 
       
   541     // Set Hold flag to view
       
   542     TPhoneCmdParamBoolean holdFlag;
       
   543     holdFlag.SetBoolean( ETrue );
       
   544     iViewCommandHandle->ExecuteCommandL( EPhoneViewSetHoldFlag, &holdFlag );
       
   545 
       
   546     if ( !FeatureManager::FeatureSupported( KFeatureIdTouchCallHandling ) )
       
   547         {
       
   548         HandleHoldNoteL( aCallId, ETrue );
       
   549         }
       
   550 
       
   551     UpdateInCallCbaL();
       
   552     }
       
   553 
       
   554 // -----------------------------------------------------------
       
   555 // CPhoneSingleAndWaiting::HandleConnectedL
       
   556 // -----------------------------------------------------------
       
   557 //
       
   558 void CPhoneSingleAndWaiting::HandleConnectedL( TInt aCallId )
       
   559     {
       
   560     __LOGMETHODSTARTEND( EPhoneUIStates,
       
   561         "CPhoneSingleAndWaiting::HandleConnectedL() ");
       
   562 
       
   563     __PHONELOG1( EBasic, EPhoneUIStates,
       
   564         "CPhoneSingleAndWaiting::HandleConnectedL  (CallId=%d)", aCallId);
       
   565 
       
   566     if ( iSingleCallId == aCallId )
       
   567         {
       
   568         // Connected message came for the hold call, we still
       
   569         // have the waiting call also
       
   570         HandleUnholdL( aCallId );
       
   571         }
       
   572     else
       
   573         {
       
   574         // Connected message came for waiting call
       
   575         MakeStateTransitionToTwoSinglesL( aCallId );
       
   576         }
       
   577     }
       
   578 
       
   579 // -----------------------------------------------------------
       
   580 // CPhoneSingleAndWaiting::HandleUnholdL
       
   581 // -----------------------------------------------------------
       
   582 //
       
   583 void CPhoneSingleAndWaiting::HandleUnholdL( TInt aCallId )
       
   584     {
       
   585     __LOGMETHODSTARTEND( EPhoneUIStates,
       
   586         "CPhoneSingleAndWaiting::HandleUnholdL() ");
       
   587     // Close menu if focus is somewhere else than number entry.
       
   588     if ( !IsNumberEntryUsedL() )
       
   589         {
       
   590         // Close menubar
       
   591         iViewCommandHandle->ExecuteCommandL( EPhoneViewMenuBarClose );
       
   592         }
       
   593 
       
   594     // Show bubble
       
   595     TPhoneCmdParamCallHeaderData callHeaderParam;
       
   596     callHeaderParam.SetCallState( EPEStateConnected );
       
   597     iViewCommandHandle->ExecuteCommandL( EPhoneViewUpdateBubble, aCallId,
       
   598         &callHeaderParam );
       
   599 
       
   600     // Set Hold flag to view
       
   601     TPhoneCmdParamBoolean holdFlag;
       
   602     holdFlag.SetBoolean( EFalse );
       
   603     iViewCommandHandle->ExecuteCommandL( EPhoneViewSetHoldFlag, &holdFlag );
       
   604 
       
   605     if ( !FeatureManager::FeatureSupported( KFeatureIdTouchCallHandling ) )
       
   606         {
       
   607         HandleHoldNoteL( aCallId, EFalse );
       
   608         }
       
   609 
       
   610     // Set CBAs
       
   611     UpdateCbaL( EPhoneCallHandlingCallWaitingCBA );
       
   612     }
       
   613 
       
   614 // -----------------------------------------------------------
       
   615 // CPhoneSingleAndWaiting::MakeStateTransitionToTwoSinglesL
       
   616 // -----------------------------------------------------------
       
   617 //
       
   618 void CPhoneSingleAndWaiting::MakeStateTransitionToTwoSinglesL( TInt aCallId )
       
   619     {
       
   620     __LOGMETHODSTARTEND( EPhoneUIStates,
       
   621         "CPhoneSingleAndWaiting::MakeStateTransitionToTwoSinglesL() ");
       
   622 
       
   623     // Effect is shown when dialer exist.
       
   624     TBool effectStarted ( EFalse );
       
   625     if ( !NeedToSendToBackgroundL() )
       
   626         {
       
   627         BeginTransEffectLC( ENumberEntryOpen );
       
   628         effectStarted = ETrue;
       
   629         }
       
   630     
       
   631     // Reset blocked keys list
       
   632     iStateMachine->PhoneStorage()->ResetBlockedKeysList();
       
   633     
       
   634     BeginUiUpdateLC();
       
   635 
       
   636     UpdateRemoteInfoDataL ( aCallId );
       
   637     // Show bubble
       
   638     TPhoneCmdParamCallHeaderData callHeaderParam;
       
   639     callHeaderParam.SetCallState( EPEStateConnected );
       
   640     iViewCommandHandle->ExecuteCommandL( EPhoneViewUpdateBubble, aCallId,
       
   641         &callHeaderParam );
       
   642 
       
   643     // Set Hold flag to view
       
   644     TPhoneCmdParamBoolean holdFlag;
       
   645     holdFlag.SetBoolean( EFalse );
       
   646     iViewCommandHandle->ExecuteCommandL( EPhoneViewSetHoldFlag, &holdFlag );
       
   647 
       
   648     if ( IsNumberEntryUsedL() )
       
   649         {
       
   650         if ( NeedToSendToBackgroundL() )
       
   651             {
       
   652             // Return phone to the background if send to background is needed.
       
   653             iViewCommandHandle->ExecuteCommandL( EPhoneViewSendToBackground );
       
   654 
       
   655             iViewCommandHandle->ExecuteCommandL( EPhoneViewSetControlAndVisibility );
       
   656 
       
   657             UpdateCbaL( EPhoneCallHandlingInCallCBA );
       
   658             }
       
   659         else
       
   660             {
       
   661             // Show the number entry if it exists.
       
   662             SetNumberEntryVisibilityL(ETrue);
       
   663             }
       
   664         }
       
   665     else
       
   666         {
       
   667         // Set Two singles softkeys
       
   668         UpdateCbaL( EPhoneCallHandlingNewCallSwapCBA );
       
   669 
       
   670         // If numberentry is not open just check NeedToSendToBackgroundL and
       
   671         // sendbackround if needed.
       
   672         if ( NeedToSendToBackgroundL() )
       
   673             {
       
   674             // Return phone to the background if send to background is needed.
       
   675             iViewCommandHandle->ExecuteCommandL( EPhoneViewSendToBackground );
       
   676             }
       
   677         }
       
   678 
       
   679     // Close dtmf dialer if exist.
       
   680     if ( iOnScreenDialer && IsDTMFEditorVisibleL() )
       
   681         {
       
   682         CloseDTMFEditorL();
       
   683         }
       
   684     else if ( iOnScreenDialer && IsCustomizedDialerVisibleL() )
       
   685         {
       
   686         CloseCustomizedDialerL();
       
   687         }
       
   688 
       
   689     SetTouchPaneButtons( EPhoneTwoSinglesButtons );
       
   690     EndUiUpdate();
       
   691     if( effectStarted )
       
   692         {
       
   693         EndTransEffect();
       
   694         }
       
   695 
       
   696     // Go to two singles state
       
   697     // CBA updates in above if-else conditions
       
   698     iStateMachine->ChangeState( EPhoneStateTwoSingles );
       
   699     }
       
   700 
       
   701 // ---------------------------------------------------------
       
   702 // CPhoneSingleAndWaiting::CallFromNewCallQueryL
       
   703 // ---------------------------------------------------------
       
   704 //
       
   705 void CPhoneSingleAndWaiting::CallFromNewCallQueryL()
       
   706     {
       
   707     __LOGMETHODSTARTEND( EPhoneUIStates,
       
   708         "CPhoneSingleAndWaiting::CallFromNewCallQueryL() ");
       
   709     // First get the phone number from the dialog
       
   710     TPhoneCmdParamString phoneNumberParam;
       
   711     HBufC *content = HBufC::NewLC( KPhoneNumberEntryBufferSize );
       
   712     TPtr ptr( content->Des() );
       
   713     phoneNumberParam.SetString( &ptr );
       
   714     iViewCommandHandle->ExecuteCommandL( EPhoneViewGetTextQueryContent,
       
   715         &phoneNumberParam );
       
   716 
       
   717     // Store the phone number
       
   718     iStateMachine->PhoneEngineInfo()->SetPhoneNumber( ptr );
       
   719 
       
   720     // clean up stack
       
   721     CleanupStack::PopAndDestroy( content );
       
   722 
       
   723     DialVoiceCallL();
       
   724     }
       
   725 
       
   726 // -----------------------------------------------------------
       
   727 // CPhoneSingleAndWaiting::HandleDiallingL
       
   728 // -----------------------------------------------------------
       
   729 //
       
   730 void CPhoneSingleAndWaiting::HandleDiallingL( TInt aCallId )
       
   731     {
       
   732     __LOGMETHODSTARTEND( EPhoneUIStates,
       
   733         "CPhoneSingleAndWaiting::HandleDiallingL() ");
       
   734 
       
   735     BeginTransEffectLC( ENumberEntryClose );
       
   736     BeginUiUpdateLC();
       
   737 
       
   738     // Hide number entry if it exists
       
   739     SetNumberEntryVisibilityL(EFalse);
       
   740 
       
   741     // Display call setup
       
   742     DisplayCallSetupL( aCallId );
       
   743 
       
   744     // Set Hold flag to view ( DTMF menu label have to present )
       
   745     TPhoneCmdParamBoolean holdFlag;
       
   746     holdFlag.SetBoolean( EFalse );
       
   747     iViewCommandHandle->ExecuteCommandL( EPhoneViewSetHoldFlag, &holdFlag );
       
   748 
       
   749     SetTouchPaneButtons( EPhoneCallSetupButtons );
       
   750 
       
   751     EndUiUpdate();
       
   752     EndTransEffect();
       
   753 
       
   754     // Update call setup CBAs
       
   755     UpdateCbaL( EPhoneCallHandlingCallSetupCBA );
       
   756 
       
   757     // Go to Single And Waiting And Call Setup state
       
   758     iStateMachine->ChangeState( EPhoneStateSingleAndCallSetupAndWaiting );
       
   759     }
       
   760 
       
   761 // -----------------------------------------------------------
       
   762 // CPhoneSingleAndWaiting::DisplayCallSetupL
       
   763 // -----------------------------------------------------------
       
   764 //
       
   765 void CPhoneSingleAndWaiting::DisplayCallSetupL( TInt aCallId )
       
   766     {
       
   767     __LOGMETHODSTARTEND( EPhoneUIStates,
       
   768         "CPhoneSingleAndWaiting::DisplayCallSetupL() ");
       
   769     // Close menu bar, if it is displayed
       
   770     iViewCommandHandle->ExecuteCommandL( EPhoneViewMenuBarClose );
       
   771 
       
   772     // Remove dialogs if necessary
       
   773     iViewCommandHandle->ExecuteCommandL( EPhoneViewRemovePhoneDialogs );
       
   774 
       
   775     // Capture keys when the phone is dialling
       
   776     CaptureKeysDuringCallNotificationL( ETrue );
       
   777 
       
   778     // Force telephony to the foreground
       
   779     TPhoneCmdParamInteger uidParam;
       
   780     uidParam.SetInteger( KUidPhoneApplication.iUid );
       
   781     iViewCommandHandle->ExecuteCommandL( EPhoneViewBringAppToForeground,
       
   782         &uidParam );
       
   783 
       
   784     // Display call setup header
       
   785     DisplayHeaderForOutgoingCallL( aCallId );
       
   786     }
       
   787 
       
   788 // -----------------------------------------------------------
       
   789 // CPhoneSingleAndWaiting::UpdateInCallCbaL
       
   790 // -----------------------------------------------------------
       
   791 //
       
   792 void CPhoneSingleAndWaiting::UpdateInCallCbaL()
       
   793     {
       
   794     __LOGMETHODSTARTEND( EPhoneUIStates,
       
   795         "CPhoneSingleAndWaiting::UpdateInCallCbaL() ");
       
   796      UpdateCbaL( EPhoneCallHandlingCallWaitingCBA );
       
   797     }
       
   798 
       
   799 // -----------------------------------------------------------
       
   800 // CPhoneSingleAndWaiting::HandleErrorL
       
   801 // -----------------------------------------------------------
       
   802 //
       
   803 EXPORT_C void CPhoneSingleAndWaiting::HandleErrorL( const TPEErrorInfo& aErrorInfo )
       
   804     {
       
   805     __LOGMETHODSTARTEND( EPhoneUIStates, "CPhoneSingleAndWaiting::HandleErrorL()");
       
   806 
       
   807     if( aErrorInfo.iErrorCode == ECCPErrorCCUserAlertingNoAnswer )
       
   808         {
       
   809         // Should not shown "Not Allowed" note, if active call.
       
   810         __PHONELOG1( EBasic, EPhoneUIStates,
       
   811             "PhoneUIControl: CPhoneSingleAndWaiting::HandleErrorL - aErrorInfo.iErrorCode =%d ",
       
   812             aErrorInfo.iErrorCode);
       
   813         }
       
   814     else
       
   815         {
       
   816         CPhoneState::HandleErrorL( aErrorInfo );
       
   817         }
       
   818     }
       
   819 
       
   820 // -----------------------------------------------------------
       
   821 // CPhoneSingleAndWaiting::HandleDisconnectingL
       
   822 // -----------------------------------------------------------
       
   823 //
       
   824 void CPhoneSingleAndWaiting::HandleDisconnectingL( TInt aCallId )
       
   825     {
       
   826     __LOGMETHODSTARTEND( EPhoneUIStates, "CPhoneSingleAndWaiting::HandleDisconnectingL( ) ");
       
   827     
       
   828     if( ( iSingleCallId == aCallId ) && IsVideoCall( aCallId ) )
       
   829         {
       
   830         __PHONELOG( EBasic, EPhoneControl, 
       
   831             "CPhoneSingleAndWaiting::HandleDisconnectingL EPhoneViewSetNeedToSendToBackgroundStatus" );
       
   832         
       
   833         // Keep phone on the foreground
       
   834         TPhoneCmdParamBoolean booleanParam;
       
   835         booleanParam.SetBoolean( EFalse );
       
   836         iViewCommandHandle->ExecuteCommandL(
       
   837             EPhoneViewSetNeedToSendToBackgroundStatus,
       
   838             &booleanParam );
       
   839         }
       
   840     }
       
   841 
       
   842 // End of File