Refactor TelephonyConnectionService for Normal call redial.
Bug: 246719275
Test: atest TeleServiceTests:TelephonyConnectionServiceTest#testNormalCallRedialCsDomainSelection
Change-Id: Ib17d445e359d4e01e8a8a5d131e06d187b1b34b3
Depends-On: I0328d97e63d51c0bfdf47f233118c000dc5ad630
diff --git a/src/com/android/services/telephony/TelephonyConnectionService.java b/src/com/android/services/telephony/TelephonyConnectionService.java
index 681b03d..4952596 100644
--- a/src/com/android/services/telephony/TelephonyConnectionService.java
+++ b/src/com/android/services/telephony/TelephonyConnectionService.java
@@ -2243,7 +2243,7 @@
return true;
}
- return false;
+ return maybeReselectDomainForNormalCall(c, callFailCause, reasonInfo);
}
private boolean maybeReselectDomainForEmergencyCall(final TelephonyConnection c,
@@ -2288,6 +2288,42 @@
return false;
}
+ private boolean maybeReselectDomainForNormalCall(
+ final TelephonyConnection c, int callFailCause, ImsReasonInfo reasonInfo) {
+
+ Log.i(LOG_TAG, "maybeReselectDomainForNormalCall " + "csCause:" + callFailCause
+ + ", psCause:" + reasonInfo);
+
+ if (mDomainSelectionConnection != null && c.getOriginalConnection() != null) {
+ Phone phone = c.getPhone();
+ final String number = c.getAddress().getSchemeSpecificPart();
+ int videoState = c.getOriginalConnection().getVideoState();
+ SelectionAttributes selectionAttributes = NormalCallDomainSelectionConnection
+ .getSelectionAttributes(phone.getPhoneId(), phone.getSubId(),
+ c.getTelecomCallId(), number, VideoProfile.isVideo(videoState),
+ callFailCause, reasonInfo);
+
+ Log.d(LOG_TAG, "Reselecting the domain for call");
+ CompletableFuture<Integer> future = mDomainSelectionConnection
+ .reselectDomain(selectionAttributes);
+ if (future != null) {
+ future.thenAcceptAsync((result) -> {
+ onNormalCallRedial(c, result, videoState);
+ }, mDomainSelectionMainExecutor);
+ return true;
+ }
+ }
+
+ c.removeTelephonyConnectionListener(mTelephonyConnectionListener);
+ if (mDomainSelectionConnection != null) {
+ mDomainSelectionConnection.finishSelection();
+ mDomainSelectionConnection = null;
+ }
+ mNormalCallConnection = null;
+ Log.d(LOG_TAG, "Reselecting the domain for call failed");
+ return false;
+ }
+
private void onEmergencyRedialOnDomain(TelephonyConnection connection,
final Phone phone, @NetworkRegistrationInfo.Domain int domain) {
Log.i(this, "onEmergencyRedialOnDomain phoneId=" + phone.getPhoneId()
@@ -2439,6 +2475,51 @@
onEmergencyRedialOnDomain(connection, phone, result);
}
+ private void onNormalCallRedial(TelephonyConnection connection,
+ @NetworkRegistrationInfo.Domain int domain, int videocallState) {
+
+ Log.v(LOG_TAG, "Redialing the call in domain:"
+ + DomainSelectionService.getDomainName(domain));
+
+ String number = connection.getAddress().getSchemeSpecificPart();
+ Phone phone = connection.getPhone();
+
+ Bundle extras = new Bundle();
+ extras.putInt(PhoneConstants.EXTRA_DIAL_DOMAIN, domain);
+
+ com.android.internal.telephony.Connection originalConnection =
+ connection.getOriginalConnection();
+ if (originalConnection instanceof ImsPhoneConnection) {
+ if (((ImsPhoneConnection) originalConnection).isRttEnabledForCall()) {
+ extras.putBoolean(TelecomManager.EXTRA_START_CALL_WITH_RTT, true);
+ }
+ }
+
+ try {
+ if (phone != null) {
+ Log.d(LOG_TAG, "Redialing Call.");
+ originalConnection = phone.dial(number, new ImsPhone.ImsDialArgs.Builder()
+ .setVideoState(videocallState)
+ .setIntentExtras(extras)
+ .setRttTextStream(connection.getRttTextStream())
+ .setIsEmergency(false)
+ .build(),
+ connection::registerForCallEvents);
+ }
+ } catch (Exception e) {
+ Log.e(LOG_TAG, e, "Call redial exception: " + e);
+ }
+ if (originalConnection == null) {
+ Log.e(LOG_TAG, new Exception("Phone is null"),
+ "Call redial failure due to phone.dial returned null");
+ connection.setDisconnected(mDisconnectCauseFactory.toTelecomDisconnectCause(
+ android.telephony.DisconnectCause.OUTGOING_FAILURE, "connection is null"));
+ connection.close();
+ } else {
+ connection.setOriginalConnection(originalConnection);
+ }
+ }
+
protected void onLocalHangup(TelephonyConnection c) {
if (TextUtils.equals(mEmergencyCallId, c.getTelecomCallId())) {
Log.i(this, "onLocalHangup " + mEmergencyCallId);