diff options
| author | Suresh Kumar Sugguna <sureshk@codeaurora.org> | 2015-12-10 22:14:10 +0530 |
|---|---|---|
| committer | Steve Kondik <steve@cyngn.com> | 2016-07-02 10:55:01 -0700 |
| commit | eec0d6166faae45bfd574d0887cdcfafe4eeca05 (patch) | |
| tree | 9bcffd8abccdd0de1c78331a42cba99cd2d67270 | |
| parent | 28678cf38af0dd3d01f6e3df6db6b286ab11807b (diff) | |
| download | android_frameworks_opt_telephony-eec0d6166faae45bfd574d0887cdcfafe4eeca05.tar.gz android_frameworks_opt_telephony-eec0d6166faae45bfd574d0887cdcfafe4eeca05.tar.bz2 android_frameworks_opt_telephony-eec0d6166faae45bfd574d0887cdcfafe4eeca05.zip | |
IMS: Exit ECBM before dialing a pending non-emergency MO call
When the device is in Emergency CallBack Mode, then exit the
ECBM before dialing a pending non-emergency mobile originating call.
Change-Id: I7f24b9cadb83351965b00cf17be0fb061197ac43
CRs-Fixed: 948702
| -rw-r--r-- | src/java/com/android/internal/telephony/imsphone/ImsPhoneCallTracker.java | 46 |
1 files changed, 42 insertions, 4 deletions
diff --git a/src/java/com/android/internal/telephony/imsphone/ImsPhoneCallTracker.java b/src/java/com/android/internal/telephony/imsphone/ImsPhoneCallTracker.java index 854c9d3c0..962f8ad6a 100644 --- a/src/java/com/android/internal/telephony/imsphone/ImsPhoneCallTracker.java +++ b/src/java/com/android/internal/telephony/imsphone/ImsPhoneCallTracker.java @@ -161,6 +161,7 @@ public final class ImsPhoneCallTracker extends CallTracker { private static final int EVENT_HANGUP_PENDINGMO = 18; private static final int EVENT_RESUME_BACKGROUND = 19; private static final int EVENT_DIAL_PENDINGMO = 20; + private static final int EVENT_EXIT_ECBM_BEFORE_PENDINGMO = 21; private static final int TIMEOUT_HANGUP_PENDINGMO = 500; @@ -310,8 +311,7 @@ public final class ImsPhoneCallTracker extends CallTracker { synchronized Connection dial(String dialString, int clirMode, int videoState, Bundle intentExtras) throws CallStateException { - boolean isPhoneInEcmMode = SystemProperties.getBoolean( - TelephonyProperties.PROPERTY_INECM_MODE, false); + boolean isPhoneInEcmMode = isPhoneInEcbMode(); boolean isEmergencyNumber = PhoneNumberUtils.isEmergencyNumber(dialString); if (DBG) log("dial clirMode=" + clirMode); @@ -1148,6 +1148,28 @@ public final class ImsPhoneCallTracker extends CallTracker { } /** + * @return true if the phone is in Emergency Callback mode, otherwise false + */ + private boolean isPhoneInEcbMode() { + return SystemProperties.getBoolean(TelephonyProperties.PROPERTY_INECM_MODE, false); + } + + /** + * Before dialing pending MO request, check for the Emergency Callback mode. + * If device is in Emergency callback mode, then exit the mode before dialing pending MO. + */ + private void dialPendingMO() { + boolean isPhoneInEcmMode = isPhoneInEcbMode(); + boolean isEmergencyNumber = PhoneNumberUtils.isEmergencyNumber( + mPendingMO.getOrigDialString()); + if ((!isPhoneInEcmMode) || (isPhoneInEcmMode && isEmergencyNumber)) { + sendEmptyMessage(EVENT_DIAL_PENDINGMO); + } else { + sendEmptyMessage(EVENT_EXIT_ECBM_BEFORE_PENDINGMO); + } + } + + /** * Listen to the IMS call state change */ private ImsCall.Listener mImsCallListener = new ImsCall.Listener() { @@ -1279,7 +1301,7 @@ public final class ImsPhoneCallTracker extends CallTracker { //only the first callback reaches here //otherwise the oldState is already HOLDING if (mPendingMO != null) { - sendEmptyMessage(EVENT_DIAL_PENDINGMO); + dialPendingMO(); } // In this case there will be no call resumed, so we can assume that we @@ -1301,7 +1323,7 @@ public final class ImsPhoneCallTracker extends CallTracker { if (reasonInfo.getCode() == ImsReasonInfo.CODE_LOCAL_CALL_TERMINATED) { // disconnected while processing hold if (mPendingMO != null) { - sendEmptyMessage(EVENT_DIAL_PENDINGMO); + dialPendingMO(); } } else if (bgState == ImsPhoneCall.State.ACTIVE) { mForegroundCall.switchWith(mBackgroundCall); @@ -1768,6 +1790,22 @@ public final class ImsPhoneCallTracker extends CallTracker { mPendingIntentExtras = null; break; + case EVENT_EXIT_ECBM_BEFORE_PENDINGMO: + if (mPendingMO != null) { + //Send ECBM exit request + try { + getEcbmInterface().exitEmergencyCallbackMode(); + mPhone.setOnEcbModeExitResponse(this, EVENT_EXIT_ECM_RESPONSE_CDMA, null); + pendingCallClirMode = mClirMode; + pendingCallInEcm = true; + } catch (ImsException e) { + e.printStackTrace(); + mPendingMO.setDisconnectCause(DisconnectCause.ERROR_UNSPECIFIED); + sendEmptyMessageDelayed(EVENT_HANGUP_PENDINGMO, TIMEOUT_HANGUP_PENDINGMO); + } + } + break; + case EVENT_EXIT_ECM_RESPONSE_CDMA: // no matter the result, we still do the same here if (pendingCallInEcm) { |
