diff -r 000000000000 -r 5f000ab63145 phoneapp/phoneuicontrol/src/cphonecbamanager.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phoneapp/phoneuicontrol/src/cphonecbamanager.cpp Mon Jan 18 20:18:27 2010 +0200 @@ -0,0 +1,491 @@ +/* +* Copyright (c) 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: Class takes care of CBA's. +* +*/ + +#include "cphonecbamanager.h" + +#include "mpeengineinfo.h" +#include "mphoneviewcommandhandle.h" +#include "mphonestatemachine.h" + +#include +#include + +#include "phonerssbase.h" +#include "phoneui.pan" +#include "phonelogger.h" + +#include "cphonestate.h" +#include "cphonecenrepproxy.h" +#include "cphonemainresourceresolver.h" + +#include "telephonyvariant.hrh" +#include "phoneui.hrh" + +#include "tphonecmdparamboolean.h" +#include "tphonecmdparaminteger.h" +#include "tphonecmdparamcallstatedata.h" + + +// ======== MEMBER FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// CPhoneCbaManager::CPhoneCbaManager +// --------------------------------------------------------------------------- +// +CPhoneCbaManager::CPhoneCbaManager( + CPhoneState* aState, + MPhoneViewCommandHandle& aViewCommandHandle, + MPhoneStateMachine& aStateMachine ) + : iState ( aState ), + iViewCommandHandle ( aViewCommandHandle ), + iStateMachine ( aStateMachine ) + { + __LOGMETHODSTARTEND( EPhoneControl, "CPhoneCbaManager::CPhoneCbaManager() "); + } + + // --------------------------------------------------------------------------- + // CPhoneCbaManager::NewL + // --------------------------------------------------------------------------- + // +CPhoneCbaManager* CPhoneCbaManager::NewL( + CPhoneState* aState, + MPhoneViewCommandHandle& aViewCommandHandle, + MPhoneStateMachine& aStateMachine ) + { + __LOGMETHODSTARTEND( EPhoneControl, "CPhoneCbaManager::NewL() "); + return new (ELeave) CPhoneCbaManager( aState, aViewCommandHandle, aStateMachine ); + } + +// --------------------------------------------------------------------------- +// CPhoneCbaManager::~CPhoneCbaManager +// --------------------------------------------------------------------------- +// +CPhoneCbaManager::~CPhoneCbaManager() + { + __LOGMETHODSTARTEND( EPhoneControl, "CPhoneCbaManager::~CPhoneCbaManager() "); + } + +// ======== LOCAL FUNCTIONS ======== + +// ----------------------------------------------------------- +// CPhoneCbaManager::UpdateInCallCbaL +// ----------------------------------------------------------- +// +void CPhoneCbaManager::UpdateInCallCbaL() + { + __LOGMETHODSTARTEND(EPhoneControl, "CPhoneCbaManager::UpdateInCallCbaL() "); + UpdateCbaL( EPhoneCallHandlingInCallCBA ); + } + +// ----------------------------------------------------------- +// CPhoneCbaManager::UpdateCbaL +// ----------------------------------------------------------- +// +EXPORT_C void CPhoneCbaManager::UpdateCbaL( TInt aResource ) + { + __LOGMETHODSTARTEND(EPhoneControl, "CPhoneCbaManager::UpdateCbaL() "); + __ASSERT_DEBUG( iStateMachine.PhoneEngineInfo(), + Panic( EPhoneCtrlInvariant ) ); + TInt resourceId = aResource; + TPhoneCmdParamBoolean hold; + iViewCommandHandle.ExecuteCommandL( EPhoneViewGetHoldFlag, &hold ); + + const TBool coverHideSendEndKey = + CPhoneCenRepProxy::Instance()->IsTelephonyFeatureSupported( + KTelephonyLVFlagCoverHideSendEndKey ); + + const TPEAudioOutput audioOutput = + iStateMachine.PhoneEngineInfo()->AudioOutput(); + + TBool btAvailable = iStateMachine.PhoneEngineInfo()->AudioOutputAvailable( + EPEBTAudioAccessory ); + + // Call setup cases + if ( EPhoneCallHandlingCallSetupCBA == aResource ) + { + if ( !FeatureManager::FeatureSupported( KFeatureIdTouchCallHandling) ) + { + if ( audioOutput == EPELoudspeaker ) + { + resourceId = EPhoneCallHandlingCallSetupToHandsetCBA; + } + else if ( audioOutput == EPEHandset ) + { + resourceId = EPhoneCallHandlingCallSetupToIhfCBA; + } + } + } + + // Is numberentry visible + else if ( iState->IsNumberEntryUsedL() ) + { + if ( iState->IsAutoLockOn() || !(iState->IsSimOk()) ) + { + resourceId = EPhoneEmptyBackCBA; + } + else + { + TBool dtmfEditorVisible = iViewCommandHandle.HandleCommandL( + EPhoneViewIsDTMFEditorVisible ) == + EPhoneViewResponseSuccess; + TPhoneCmdParamInteger activeCallCount; + iViewCommandHandle.ExecuteCommandL( + EPhoneViewGetCountOfActiveCalls, &activeCallCount ); + + TPhoneCmdParamCallStateData callStateData; + callStateData.SetCallState( EPEStateRinging ); + iViewCommandHandle.HandleCommandL( + EPhoneViewGetCallIdByState, &callStateData ); + + TInt incomingCall = callStateData.CallId(); + + if( dtmfEditorVisible ) + { + resourceId = EPhoneDtmfDialerCBA; + } + else if( activeCallCount.Integer() == ENoActiveCalls ) + { + resourceId = EPhoneNumberAcqCBA; + } + else if ( activeCallCount.Integer() > ENoActiveCalls && + incomingCall > KErrNotFound ) + { + resourceId = EPhoneCallHandlingCallWaitingCBA; + } + else + { + resourceId = EPhoneInCallNumberAcqCBA; + } + } + } + + // Check is Audio muted + else if ( iStateMachine.PhoneEngineInfo()->AudioMute() ) + { + resourceId = EPhoneCallHandlingInCallUnmuteCBA; + } + + // Multicall swap + else if ( EPhoneCallHandlingNewCallSwapCBA == aResource ) + { + resourceId = EPhoneCallHandlingNewCallSwapCBA; + } + + // Call waiting cases + else if ( EPhoneCallHandlingCallWaitingCBA == aResource ) + { + resourceId = EPhoneCallHandlingCallWaitingCBA; + if ( iState->IsSwivelClosed() ) + { + TPhoneCmdParamInteger activeCallCount; + iViewCommandHandle.ExecuteCommandL( + EPhoneViewGetCountOfActiveCalls, &activeCallCount ); + if( activeCallCount.Integer() == EOneActiveCall ) + { + resourceId = EPhoneCallHandlingWaitingAnswerSwivelClosedCBA; + } + else if( activeCallCount.Integer() == ETwoActiveCalls ) + { + resourceId = EPhoneCallHandlingWaitingReplaceSwivelClosedCBA; + } + } + } + + // Check is call in hold + else if ( hold.Boolean() ) + { + resourceId = EPhoneCallHandlingInCallUnholdCBA; + } + + // Is BT accessory connected + else if ( audioOutput == EPEBTAudioAccessory && + IsVoiceCallAlertingOrActiveL() && + !coverHideSendEndKey ) + { + resourceId = EPhoneCallHandlingInCallHandsetCBA; + } + + else if ( audioOutput == EPEWiredAudioAccessory || + coverHideSendEndKey || iState->IsSwivelClosed() ) + { + resourceId = EPhoneCallHandlingInCallNoIhfCBA; + } + + // Check BT availability + else if ( audioOutput == EPELoudspeaker ) + { + if ( btAvailable ) + { + resourceId = EPhoneCallHandlingInCallBtaaCBA; + } + else + { + resourceId = EPhoneCallHandlingInCallHandsetCBA; + } + } + else if ( audioOutput == EPEHandset && btAvailable ) + { + resourceId = EPhoneCallHandlingInCallBtaaCBA; + } + + SetCbaL( resourceId ); + } + +// ----------------------------------------------------------- +// CPhoneCbaManager::UpdateIncomingCbaL +// ----------------------------------------------------------- +// +EXPORT_C void CPhoneCbaManager::UpdateIncomingCbaL( TInt aCallId ) + { + __LOGMETHODSTARTEND(EPhoneControl,"CPhoneCbaManager::UpdateIncomingCbaL()" ); + + const TBool coverHideSendEndKey = + CPhoneCenRepProxy::Instance()->IsTelephonyFeatureSupported( + KTelephonyLVFlagCoverHideSendEndKey ); + + const TProfileRingingType ringingType = + iStateMachine.PhoneEngineInfo()->RingingType(); + + const TBool callIsAlerting = + !(( ringingType == EProfileRingingTypeSilent ) || + ( ringingType == EProfileRingingTypeBeepOnce )); + + // Update soft reject flag + TBool softRejectActivated( ETrue ); + // VoIP calls do not support sms sending + if ( iStateMachine.PhoneEngineInfo()->CallType( aCallId ) == EPECallTypeVoIP + || iStateMachine.PhoneEngineInfo()->RemotePhoneNumber( aCallId ).Length() == 0 ) + { + softRejectActivated = EFalse; + } + TPhoneCmdParamBoolean softRejectParam; + softRejectParam.SetBoolean( softRejectActivated ); + iViewCommandHandle.ExecuteCommandL( EPhoneViewSetSoftRejectFlag, + &softRejectParam ); + + TInt incomingCbaResourceId; + + if ( iState->IsSwivelClosed() ) + { + if ( !callIsAlerting || iRingtoneSilenced ) + { + incomingCbaResourceId = EPhoneCallHandlingIncomingSilentSwivelClosedCBA; + } + else + { + incomingCbaResourceId = EPhoneCallHandlingIncomingSwivelClosedCBA; + } + } + + else if ( coverHideSendEndKey ) + { + if ( callIsAlerting ) + { + // Set CBA to Options..Silence + incomingCbaResourceId = EPhoneCallHandlingIncomingSliderCBA; + } + else if ( softRejectActivated ) + { + // Set CBA for soft reject + incomingCbaResourceId = EPhoneCallHandlingIncomingSoftRejectSliderCBA; + } + else + { + // Set CBA to Options..Reject + incomingCbaResourceId = EPhoneCallHandlingIncomingSilentSliderCBA; + } + } + + else + { + if ( callIsAlerting ) + { + incomingCbaResourceId = GetIncomingCallSilenceCBA( softRejectActivated ); + } + else if ( softRejectActivated ) + { + // Set CBA for soft reject + incomingCbaResourceId = EPhoneCallHandlingIncomingSoftRejectCBA; + } + else + { + incomingCbaResourceId = EPhoneCallHandlingIncomingRejectCBA; + } + } + + SetCbaL( incomingCbaResourceId ); + } + +// ----------------------------------------------------------- +// CPhoneCbaManager::SetCbaL +// ----------------------------------------------------------- +// +EXPORT_C void CPhoneCbaManager::SetCbaL( TInt aResource ) + { + __LOGMETHODSTARTEND(EPhoneControl,"CPhoneCbaManager::SetCbaL()" ); + + __PHONELOG1( EBasic, EPhoneControl, + "CPhoneCbaManager::SetCbaL : %d",aResource ); + + TPhoneCmdParamInteger integerParam; + integerParam.SetInteger( + CPhoneMainResourceResolver::Instance()->ResolveResourceID( + aResource ) ); + iViewCommandHandle.ExecuteCommandL( EPhoneViewUpdateCba, + &integerParam ); + } + +// ----------------------------------------------------------- +// CPhoneCbaManager::UpdateCbaSwivelStateChangedL +// ----------------------------------------------------------- +// +void CPhoneCbaManager::UpdateCbaSwivelStateChangedL() + { + __LOGMETHODSTARTEND(EPhoneControl,"CPhoneCbaManager::UpdateCbaSwivelStateChangedL()" ); + + TPhoneCmdParamCallStateData callStateData; + callStateData.SetCallState( EPEStateRinging ); + iViewCommandHandle.HandleCommandL( + EPhoneViewGetCallIdByState, &callStateData ); + TInt incomingCall = callStateData.CallId(); + + TPhoneCmdParamInteger activeCallCount; + iViewCommandHandle.ExecuteCommandL( + EPhoneViewGetCountOfActiveCalls, &activeCallCount ); + + if ( incomingCall > KErrNotFound ) + { + if( activeCallCount.Integer() == ENoActiveCalls ) + { + UpdateIncomingCbaL( incomingCall ); + } + else + { + UpdateCbaL( EPhoneCallHandlingCallWaitingCBA ); + } + } + else if ( activeCallCount.Integer() != ENoActiveCalls ) + { + UpdateInCallCbaL(); + } + } + +// ----------------------------------------------------------- +// CPhoneCbaManager::IsVoiceCallAlertingOrActiveL +// ----------------------------------------------------------- +// +TBool CPhoneCbaManager::IsVoiceCallAlertingOrActiveL() + { + __LOGMETHODSTARTEND( EPhoneControl, + "CPhoneCbaManager::IsVoiceCallAlertingOrActiveL()" ); + TBool retVal = EFalse; + + // Fetch alerting call's id from view + TPhoneCmdParamCallStateData callStateData; + callStateData.SetCallState( EPEStateConnecting ); + iViewCommandHandle.HandleCommandL( + EPhoneViewGetCallIdByState, &callStateData ); + + if ( callStateData.CallId() > KErrNotFound ) + { + TPECallType type = iStateMachine.PhoneEngineInfo()->CallType( + callStateData.CallId() ); + + if ( EPECallTypeCSVoice == type || EPECallTypeVoIP == type ) + { + retVal = ETrue; + } + } + else + { + // Fetch active call's id from view + TPhoneCmdParamCallStateData callStateData; + callStateData.SetCallState( EPEStateConnected ); + iViewCommandHandle.HandleCommandL( + EPhoneViewGetCallIdByState, &callStateData ); + + if ( callStateData.CallId() > KErrNotFound ) + { + TPECallType type = iStateMachine.PhoneEngineInfo()->CallType( + callStateData.CallId() ); + + if ( EPECallTypeCSVoice == type || EPECallTypeVoIP == type ) + { + retVal = ETrue; + } + } + } + return retVal; + } + +// ----------------------------------------------------------- +// CPhoneCbaManager::SetRingtoneSilencedStatus +// ----------------------------------------------------------- +// +void CPhoneCbaManager::SetRingtoneSilencedStatus( const TBool aSilencedStatus ) + { + __LOGMETHODSTARTEND(EPhoneControl, "CPhoneCbaManager::SetRingtoneSilencedStatus ()" ); + // Set the internal TBool variable + iRingtoneSilenced = aSilencedStatus; + __PHONELOG1( + EBasic, + EPhoneControl, + "CPhoneCbaManager::SetRingtoneSilencedStatus - iRingtoneSilenced =%d", + iRingtoneSilenced ); + } + +// ----------------------------------------------------------- +// CPhoneCbaManager::GetIncomingCallSilenceCBA +// ----------------------------------------------------------- +// +TInt CPhoneCbaManager::GetIncomingCallSilenceCBA( + const TBool aSoftRejectActivated ) + { + __LOGMETHODSTARTEND(EPhoneControl, "CPhoneCbaManager::GetIncomingCallSilenceCBA ()" ); + TInt ret = EPhoneCallHandlingIncomingSoftRejectCBA; + + //Get incoming call touchpane button set + TPhoneCmdParamInteger touchpaneButtonsParam; + touchpaneButtonsParam.SetInteger( CPhoneMainResourceResolver::Instance()-> + ResolveResourceID( EPhoneIncomingCallButtons ) ); + + if ( touchpaneButtonsParam.Integer() + == R_PHONEUI_INCOMING_CALL_SILENCE_BUTTONS ) + { + aSoftRejectActivated ? + ret = EPhoneCallHandlingIncomingSoftRejectCBA: + ret = EPhoneCallHandlingIncomingRejectCBA; + } + else + { + // Check if the ringtone has been silenced. If it is, then show + // "Send Message" in RSK, else show "Silence". + iRingtoneSilenced ? + ret = EPhoneCallHandlingIncomingSoftRejectCBA : + ret = EPhoneCallHandlingIncomingCBA; + } + + // reset the iRingtoneSilence so it won't cause any problems with + // next calls. + SetRingtoneSilencedStatus( EFalse ); + + return ret; + } + +// ======== LOCAL FUNCTIONS ======== + +