Fix concurrent calls occurs when E911 redial happens
Makes the active and holding call termimated first to prevent concurrent
calls happening on both SUBs from emergency call redial.
Bug: 222629040
Change-Id: I139fcd3024932ead6858b38ac497aaf67df03b68
diff --git a/src/com/android/services/telephony/TelephonyConnectionService.java b/src/com/android/services/telephony/TelephonyConnectionService.java
index b6f785c..b3b0686 100644
--- a/src/com/android/services/telephony/TelephonyConnectionService.java
+++ b/src/com/android/services/telephony/TelephonyConnectionService.java
@@ -232,6 +232,7 @@
boolean hasIccCard(int slotId);
boolean isCurrentEmergencyNumber(String number);
Map<Integer, List<EmergencyNumber>> getCurrentEmergencyNumberList();
+ boolean isConcurrentCallsPossible();
}
private TelephonyManagerProxy mTelephonyManagerProxy;
@@ -271,6 +272,12 @@
return new HashMap<>();
}
}
+
+ @Override
+ public boolean isConcurrentCallsPossible() {
+ // Under DSDA, need to be determined by voice capabilities
+ return mTelephonyManager.getMaxNumberOfSimultaneouslyActiveSims() > 1;
+ }
}
/**
@@ -1636,7 +1643,13 @@
Bundle connExtras = c.getExtras();
Log.i(this, "retryOutgoingOriginalConnection, redialing on Phone Id: " + newPhoneToUse);
c.clearOriginalConnection();
- if (phoneId != newPhoneToUse.getPhoneId()) updatePhoneAccount(c, newPhoneToUse);
+ if (phoneId != newPhoneToUse.getPhoneId()) {
+ if (!mTelephonyManagerProxy.isConcurrentCallsPossible()) {
+ disconnectAllCallsOnOtherSubs(
+ mPhoneUtilsProxy.makePstnPhoneAccountHandle(newPhoneToUse));
+ }
+ updatePhoneAccount(c, newPhoneToUse);
+ }
placeOutgoingConnection(c, newPhoneToUse, videoState, connExtras);
} else {
// We have run out of Phones to use. Disconnect the call and destroy the connection.
@@ -2645,4 +2658,23 @@
}
});
}
+
+ private void disconnectAllCallsOnOtherSubs (@NonNull PhoneAccountHandle handle) {
+ Collection<Connection>connections = getAllConnections();
+ connections.stream()
+ .filter(c ->
+ (c.getState() == Connection.STATE_ACTIVE
+ || c.getState() == Connection.STATE_HOLDING)
+ // Include any calls not on same sub as current connection.
+ && !Objects.equals(c.getPhoneAccountHandle(), handle))
+ .forEach(c -> {
+ if (c instanceof TelephonyConnection) {
+ TelephonyConnection tc = (TelephonyConnection) c;
+ Log.i(LOG_TAG, "disconnectAllCallsOnOtherSubs: disconnect" +
+ " %s due to redial happened on other sub.",
+ tc.getTelecomCallId());
+ tc.hangup(android.telephony.DisconnectCause.LOCAL);
+ }
+ });
+ }
}