phoneapp/phoneuicontrol/src/cphonebtaadisconnecthandler.cpp
changeset 37 ba76fc04e6c2
child 51 f39ed5e045e0
child 78 baacf668fe89
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phoneapp/phoneuicontrol/src/cphonebtaadisconnecthandler.cpp	Fri Jun 04 10:19:18 2010 +0100
@@ -0,0 +1,333 @@
+/*
+* Copyright (c) 2006 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:  Bluetooth audio disconnection handler.
+*
+*/
+
+
+// INCLUDE FILES
+#include    <featmgr.h>
+#include    <StringLoader.h>
+#include    <mpeengineinfo.h>
+
+#include    "phoneui.hrh"
+#include    "mphonestatemachine.h"
+#include    "mphoneviewcommandhandle.h"
+#include    "phoneconstants.h"
+#include    "cphonebtaadisconnecthandler.h"
+#include    "cphonemainresourceresolver.h"
+#include    "cphonetimer.h"
+#include    "phonelogger.h"
+#include    "phonerssbase.h"
+#include    "tphonecmdparamquery.h"
+#include    "tphonecmdparamcallstatedata.h"
+#include    "telinternalsingletonuids.h"
+#include    "cphonestatehandle.h"
+
+// CONSTANTS
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CPhoneBtaaDisconnectHandler::InstanceL
+// -----------------------------------------------------------------------------
+//
+CPhoneBtaaDisconnectHandler* CPhoneBtaaDisconnectHandler::InstanceL()
+    {
+    CPhoneBtaaDisconnectHandler* self = 
+        static_cast<CPhoneBtaaDisconnectHandler*>( CCoeEnv::Static( KUidBtaaDisconnectHandlerSingleton ) );
+
+    if ( !self )
+        {
+        self = new ( ELeave ) CPhoneBtaaDisconnectHandler;
+        }
+    
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+// CPhoneBtaaDisconnectHandler::CPhoneBtaaDisconnectHandler
+// -----------------------------------------------------------------------------
+//
+CPhoneBtaaDisconnectHandler::CPhoneBtaaDisconnectHandler()
+    : CCoeStatic( KUidBtaaDisconnectHandlerSingleton ), iState( EIdle )
+    {
+    CPhoneStateHandle* stateHandle = CPhoneStateHandle::Instance();
+    
+    iViewCommandHandle = stateHandle->ViewCommandHandle();
+    iStateMachine = stateHandle->StateMachine();
+    }
+
+// -----------------------------------------------------------------------------
+// CPhoneBtaaDisconnectHandler::~CPhoneBtaaDisconnectHandler
+// -----------------------------------------------------------------------------
+//
+CPhoneBtaaDisconnectHandler::~CPhoneBtaaDisconnectHandler()
+    {
+    delete iTimer;
+    }
+ 
+// -----------------------------------------------------------------------------
+// CPhoneBtaaDisconnectHandler::HandleTimeOutL
+// -----------------------------------------------------------------------------
+//
+void CPhoneBtaaDisconnectHandler::HandleTimeOutL()
+    {
+    __LOGMETHODSTARTEND(EPhoneControl, "CPhoneBtaaDisconnectHandler::HandleTimeOutL()");
+    Cancel();
+    TerminateAllCallsL();
+    }
+ 
+// -----------------------------------------------------------------------------
+// CPhoneBtaaDisconnectHandler::Cancel
+// -----------------------------------------------------------------------------
+//
+void CPhoneBtaaDisconnectHandler::Cancel()
+    {
+    __LOGMETHODSTARTEND(EPhoneControl, "CPhoneBtaaDisconnectHandler::Cancel()");
+    TRAP_IGNORE( iViewCommandHandle->ExecuteCommandL( EPhoneViewRemoveQuery ) );
+    DeleteAll();
+    if ( !iOldMuted && iStateMachine->PhoneEngineInfo()->AudioMute() )
+        {
+        TRAP_IGNORE ( SetMuteL( EFalse ) );
+        }
+    iOldMuted = EFalse;
+    }
+
+// -----------------------------------------------------------------------------
+// CPhoneBtaaDisconnectHandler::LaunchQueryL
+// -----------------------------------------------------------------------------
+//
+void CPhoneBtaaDisconnectHandler::LaunchQueryL()
+    {
+    __LOGMETHODSTARTEND(EPhoneControl, "CPhoneBtaaDisconnectHandler::LaunchQueryL()");
+ 
+    if ( iState == ELaunchQuery )
+        {
+        // Query already available.
+        __PHONELOG( EBasic,EPhoneControl,"CPhoneBtaaDisconnectHandler::LaunchQueryL.nok");
+        return;
+        }
+   
+    if ( !iTimer )
+        {
+        iTimer = CPhoneTimer::NewL();
+        }
+
+    // Start timer.
+    iTimer->After( KPhoneBtaaConnectionLostQueryTimeout, this );
+    
+    // Mute the phone if needed.
+    iOldMuted = iStateMachine->PhoneEngineInfo()->AudioMute() ;
+    
+    if ( !iOldMuted )
+        {
+        SetMuteL( ETrue );
+        }
+        
+    iState = ELaunchQuery;
+    
+    if ( iVideoCallStatus )
+        {
+        ShowQueryL( EPhoneContinueInLoudspeakerConfirmationQuery );
+        }
+    else
+        {
+        ShowQueryL( EPhoneContinueInHandsetConfirmationQuery ); 
+        }        
+    }
+
+// -----------------------------------------------------------------------------
+// CPhoneBtaaDisconnectHandler::HandleConnectionLostL
+// -----------------------------------------------------------------------------
+//
+void CPhoneBtaaDisconnectHandler::HandleConnectionLostL()
+    {
+    __LOGMETHODSTARTEND(EPhoneControl, "CPhoneBtaaDisconnectHandler::HandleConnectionLostL()"); 
+    iVideoCallStatus = EFalse;
+           
+    if ( FeatureManager::FeatureSupported( KFeatureIdCsVideoTelephony ) )
+        {
+        // Fetch active call's id from view
+        TPhoneCmdParamCallStateData callStateData;
+        callStateData.SetCallState( EPEStateConnected );
+        iViewCommandHandle->HandleCommandL( 
+            EPhoneViewGetCallIdByState, &callStateData );
+        TInt call = callStateData.CallId();
+        if ( call != KErrNotFound &&
+            iStateMachine->PhoneEngineInfo()->CallType( call ) == EPECallTypeVideo )
+            {
+            iVideoCallStatus = ETrue;
+            }
+        __PHONELOG1( EBasic, EPhoneControl, 
+                "CPhoneBtaaDisconnectHandler::HandleConnectionLostL callType: %d",
+                call != KErrNotFound ? 
+                iStateMachine->PhoneEngineInfo()->CallType( call ) : KErrNotFound );            
+        }
+ 
+    if ( iState == EIdle )
+        {
+        LaunchQueryL();
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CPhoneBtaaDisconnectHandler::HandleQueryDismissL
+// -----------------------------------------------------------------------------
+//
+void CPhoneBtaaDisconnectHandler::HandleQueryDismissL( 
+        TInt aCommand )
+    {
+    __LOGMETHODSTARTEND(EPhoneControl,"CPhoneBtaaDisconnectHandler::HandleQueryDismissL()");
+                                   
+    if ( aCommand == EPhoneCmdYesBtDisconnectQuery )
+        {
+     
+        // If phone was muted only for the duration of the note, unmute.
+        if ( !iOldMuted )
+            {
+            SetMuteL( EFalse );
+            }
+
+        // Activate loudspeaker when required.
+        if ( iVideoCallStatus )
+            {
+            iStateMachine->PhoneEngineInfo()->SetAudioOutputCommand( 
+                EPELoudspeaker, ETrue);
+            iStateMachine->SendPhoneEngineMessage( 
+                MPEPhoneModel::EPEMessageSetAudioOutput );
+            }
+         }
+    else
+        {
+        TerminateAllCallsL();
+        //Unmute, for robustness      
+        SetMuteL( EFalse );        
+        }
+    
+    DeleteAll();
+    iOldMuted = EFalse;
+    }
+
+// -----------------------------------------------------------------------------
+// CPhoneBtaaDisconnectHandler::DeleteAll
+// -----------------------------------------------------------------------------
+//
+void CPhoneBtaaDisconnectHandler::DeleteAll()
+    {
+    __LOGMETHODSTARTEND(EPhoneControl,"CPhoneBtaaDisconnectHandler::DeleteAll()");
+    
+    if ( iTimer ) 
+        {
+        if ( iTimer->IsActive() )
+            {
+            iTimer->Cancel();
+            }
+        delete iTimer;
+        iTimer = NULL;
+        }
+ 
+    iState = EIdle;
+    }
+
+// -----------------------------------------------------------------------------
+// CPhoneBtaaDisconnectHandler::TerminateAllCallsL
+// -----------------------------------------------------------------------------
+//
+void CPhoneBtaaDisconnectHandler::TerminateAllCallsL()
+    {
+    __LOGMETHODSTARTEND(EPhoneControl,"CPhoneBtaaDisconnectHandler::TerminateAllCallsL()");
+    
+    if( iVideoCallStatus )
+        {
+        // Fetch active call's id from view
+        TPhoneCmdParamCallStateData callStateData;
+        callStateData.SetCallState( EPEStateConnected );
+        iViewCommandHandle->HandleCommandL(
+            EPhoneViewGetCallIdByState, &callStateData );
+            
+        if ( callStateData.CallId() != KErrNotFound )
+            {
+            iStateMachine->SetCallId( callStateData.CallId() );
+            iStateMachine->SendPhoneEngineMessage( 
+                MPEPhoneModel::EPEMessageRelease );        
+            }
+        else
+            {
+            iStateMachine->SendPhoneEngineMessage( 
+                MPEPhoneModel::EPEMessageReleaseAll );        
+            }        
+        }
+    else
+        {
+        iStateMachine->SendPhoneEngineMessage( 
+            MPEPhoneModel::EPEMessageReleaseAll );        
+        }        
+    }
+ 
+// -----------------------------------------------------------------------------
+// CPhoneBtaaDisconnectHandler::ShowQueryL
+// -----------------------------------------------------------------------------
+//
+void CPhoneBtaaDisconnectHandler::ShowQueryL( TInt aResourceId )
+    {
+    __LOGMETHODSTARTEND(EPhoneControl, "CPhoneBtaaDisconnectHandler::ShowQueryL( ) ");
+    //__ASSERT_DEBUG( aResourceId, Panic( EPhoneCtrlParameterNotInitialized ) );
+    TPhoneCmdParamQuery queryParam;
+    queryParam.SetQueryType( EPhoneGlobalQueryDialog );
+  
+    HBufC* queryPrompt = StringLoader::LoadLC( 
+            CPhoneMainResourceResolver::Instance()->ResolveResourceID( 
+                aResourceId ));
+   
+    queryParam.SetQueryPrompt( *queryPrompt );
+    queryParam.SetDefaultCba(             
+        CPhoneMainResourceResolver::Instance()->
+        ResolveResourceID( EPhoneDisconnectingQueryCBA ) );
+  
+    iViewCommandHandle->ExecuteCommandL( EPhoneViewShowQuery, &queryParam );
+    
+    CleanupStack::PopAndDestroy( queryPrompt );
+    }
+
+// -----------------------------------------------------------------------------
+// CPhoneBtaaDisconnectHandler::SetMuteL
+// -----------------------------------------------------------------------------
+//
+void CPhoneBtaaDisconnectHandler::SetMuteL( TBool aStatus )
+    {
+    __LOGMETHODSTARTEND(EPhoneControl, "CPhoneBtaaDisconnectHandler::SetMuteL( ) ");
+    
+    iStateMachine->PhoneEngineInfo()->SetAudioMuteCommand( aStatus );
+    iStateMachine->SendPhoneEngineMessage( 
+        MPEPhoneModel::EPEMessageSetAudioMute );    
+    }
+
+// -----------------------------------------------------------------------------
+// CPhoneBtaaDisconnectHandler::IsQuery 
+// -----------------------------------------------------------------------------
+//
+TBool CPhoneBtaaDisconnectHandler::IsQuery()
+    {
+    TBool ret = EFalse;
+    if ( iState == ELaunchQuery )
+        {
+        ret = ETrue;
+        __PHONELOG1( EBasic, EPhoneControl, 
+                     "CPhoneBtaaDisconnectHandler::IsQuery: %d", ret );
+        }
+    return ret;
+    }
+
+//  End of File