aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSuresh Kumar Sugguna <sureshk@codeaurora.org>2015-12-10 22:14:10 +0530
committerSteve Kondik <steve@cyngn.com>2016-07-02 10:55:01 -0700
commiteec0d6166faae45bfd574d0887cdcfafe4eeca05 (patch)
tree9bcffd8abccdd0de1c78331a42cba99cd2d67270
parent28678cf38af0dd3d01f6e3df6db6b286ab11807b (diff)
downloadandroid_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.java46
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) {