Merge "Disconnect ongoing calls for emergency based on CarrierConfig"
diff --git a/src/com/android/services/telephony/DisconnectCauseUtil.java b/src/com/android/services/telephony/DisconnectCauseUtil.java
index 4a5fb4a..9e32f00 100644
--- a/src/com/android/services/telephony/DisconnectCauseUtil.java
+++ b/src/com/android/services/telephony/DisconnectCauseUtil.java
@@ -117,6 +117,8 @@
private static int toTelecomDisconnectCauseCode(int telephonyDisconnectCause) {
switch (telephonyDisconnectCause) {
case android.telephony.DisconnectCause.LOCAL:
+ // The call was still disconnected locally, so this is not an error condition.
+ case android.telephony.DisconnectCause.OUTGOING_EMERGENCY_CALL_PLACED:
return DisconnectCause.LOCAL;
case android.telephony.DisconnectCause.NORMAL:
@@ -797,6 +799,8 @@
break;
case android.telephony.DisconnectCause.IMS_ACCESS_BLOCKED:
return DisconnectCause.REASON_IMS_ACCESS_BLOCKED;
+ case android.telephony.DisconnectCause.OUTGOING_EMERGENCY_CALL_PLACED:
+ return DisconnectCause.REASON_EMERGENCY_CALL_PLACED;
}
// If no specific code-mapping found, then fall back to using the reason.
diff --git a/src/com/android/services/telephony/TelephonyConnection.java b/src/com/android/services/telephony/TelephonyConnection.java
index 3282d06..d8e9c32 100644
--- a/src/com/android/services/telephony/TelephonyConnection.java
+++ b/src/com/android/services/telephony/TelephonyConnection.java
@@ -762,6 +762,11 @@
private boolean mShowPreciseFailedCause;
/**
+ * Provides a DisconnectCause associated with a hang up request.
+ */
+ private int mHangupDisconnectCause = DisconnectCause.NOT_VALID;
+
+ /**
* Listeners to our TelephonyConnection specific callbacks
*/
private final Set<TelephonyConnectionListener> mTelephonyListeners = Collections.newSetFromMap(
@@ -1480,6 +1485,7 @@
protected void hangup(int telephonyDisconnectCode) {
if (mOriginalConnection != null) {
+ mHangupDisconnectCause = telephonyDisconnectCode;
try {
// Hanging up a ringing call requires that we invoke call.hangup() as opposed to
// connection.hangup(). Without this change, the party originating the call
@@ -1732,9 +1738,16 @@
preciseDisconnectCause =
mOriginalConnection.getPreciseDisconnectCause();
}
+ int disconnectCause = mOriginalConnection.getDisconnectCause();
+ if ((mHangupDisconnectCause != DisconnectCause.NOT_VALID)
+ && (mHangupDisconnectCause != disconnectCause)) {
+ Log.i(LOG_TAG, "setDisconnected: override cause: " + disconnectCause
+ + " -> " + mHangupDisconnectCause);
+ disconnectCause = mHangupDisconnectCause;
+ }
setTelephonyConnectionDisconnected(
DisconnectCauseUtil.toTelecomDisconnectCause(
- mOriginalConnection.getDisconnectCause(),
+ disconnectCause,
preciseDisconnectCause,
mOriginalConnection.getVendorDisconnectCause(),
getPhone().getPhoneId()));
diff --git a/src/com/android/services/telephony/TelephonyConnectionService.java b/src/com/android/services/telephony/TelephonyConnectionService.java
index daab79f..61e06e9 100644
--- a/src/com/android/services/telephony/TelephonyConnectionService.java
+++ b/src/com/android/services/telephony/TelephonyConnectionService.java
@@ -1289,6 +1289,19 @@
phone.getEmergencyNumberTracker().getEmergencyNumber(number);
if (emergencyNumber != null) {
phone.notifyOutgoingEmergencyCall(emergencyNumber);
+ // If we do not support holding ongoing calls for an outgoing emergency call,
+ // disconnect the ongoing calls.
+ if (!shouldHoldForEmergencyCall(phone) && !getAllConnections().isEmpty()) {
+ for (Connection c : getAllConnections()) {
+ if (!c.equals(connection)
+ && c.getState() != Connection.STATE_DISCONNECTED
+ && c instanceof TelephonyConnection) {
+ ((TelephonyConnection) c).hangup(
+ android.telephony.DisconnectCause
+ .OUTGOING_EMERGENCY_CALL_PLACED);
+ }
+ }
+ }
}
originalConnection = phone.dial(number, new ImsPhone.ImsDialArgs.Builder()
.setVideoState(videoState)
@@ -1355,6 +1368,18 @@
}
}
+ private boolean shouldHoldForEmergencyCall(Phone phone) {
+ CarrierConfigManager cfgManager = (CarrierConfigManager)
+ phone.getContext().getSystemService(Context.CARRIER_CONFIG_SERVICE);
+ if (cfgManager == null) {
+ // For some reason CarrierConfigManager is unavailable, return default
+ Log.w(this, "shouldHoldForEmergencyCall: couldn't get CarrierConfigManager");
+ return true;
+ }
+ return cfgManager.getConfigForSubId(phone.getSubId()).getBoolean(
+ CarrierConfigManager.KEY_ALLOW_HOLD_CALL_DURING_EMERGENCY_BOOL, true);
+ }
+
private TelephonyConnection createConnectionFor(
Phone phone,
com.android.internal.telephony.Connection originalConnection,