diff options
author | Zhao Fan <quic_zhaof@quicinc.com> | 2022-01-15 18:55:14 +0800 |
---|---|---|
committer | Zhao Fan <quic_zhaof@quicinc.com> | 2022-02-17 13:36:34 +0800 |
commit | c5e97a4057104890148c4730db333d45f9ab032c (patch) | |
tree | 98cfd90501ea52af0d9b0c858426b3cf64b1797f | |
parent | ac09b54fb1c345f5ce2a9c0539249ad71b0a5714 (diff) |
IMS: Fix the crashes in MT conference call
1)mOriginalConnection in TelephonyConnection can be null
once clearOriginalConnection() is called as the Connection
is disconnected because of (IMS_MERGED_SUCCESSFULLY).
2)mTelephonyConnectionService in TelephonyConnection which hosting
the ImsConference can be null once ImsConference is created
before mTelephonyConnectionService is set on the Connection
which passed in.
Change-Id: I47e3dd7966e9f788bc29f576938e09049eb63c2d
CRs-Fixed: 3016834 3101698
4 files changed, 28 insertions, 9 deletions
diff --git a/src/com/android/phone/PhoneUtils.java b/src/com/android/phone/PhoneUtils.java index 98090ab14f..e4d0af4c51 100644 --- a/src/com/android/phone/PhoneUtils.java +++ b/src/com/android/phone/PhoneUtils.java @@ -771,7 +771,7 @@ public class PhoneUtils { // TODO: Should use some sort of special hidden flag to decorate this account as // an emergency-only account String id = isEmergency ? EMERGENCY_ACCOUNT_HANDLE_ID : prefix + - String.valueOf(phone.getFullIccSerialNumber()); + String.valueOf((phone != null) ? phone.getFullIccSerialNumber() : null); return makePstnPhoneAccountHandleWithPrefix(id, prefix, isEmergency); } diff --git a/src/com/android/services/telephony/ImsConference.java b/src/com/android/services/telephony/ImsConference.java index 98b0840e3f..1e39fb0335 100755 --- a/src/com/android/services/telephony/ImsConference.java +++ b/src/com/android/services/telephony/ImsConference.java @@ -488,8 +488,17 @@ public class ImsConference extends TelephonyConferenceBase implements Holdable { // Specify the connection time of the conference to be the connection time of the original // connection. - long connectTime = conferenceHost.getOriginalConnection().getConnectTime(); - long connectElapsedTime = conferenceHost.getOriginalConnection().getConnectTimeReal(); + com.android.internal.telephony.Connection originalConnection = + conferenceHost.getOriginalConnection(); + //In MT IMS conference call, it will cleanup TelephonyConnection which backed the original + //connection and remove from telecom, originalConnection will become null, so initialize + //'connectTime' and 'connectElapsedTime' when new ImsConference. + long connectTime = 0; + long connectElapsedTime = 0; + if (originalConnection != null ) { + connectTime = originalConnection.getConnectTime(); + connectElapsedTime = originalConnection.getConnectTimeReal(); + } setConnectionTime(connectTime); setConnectionStartElapsedRealtimeMillis(connectElapsedTime); // Set the connectTime in the connection as well. @@ -1533,13 +1542,19 @@ public class ImsConference extends TelephonyConferenceBase implements Holdable { if (mConferenceHost == null) { disconnectCause = new DisconnectCause(DisconnectCause.CANCELED); } else { + com.android.internal.telephony.Connection originalConnection = + mConferenceHost.getOriginalConnection(); if (mConferenceHost.getPhone() != null) { - disconnectCause = DisconnectCauseUtil.toTelecomDisconnectCause( - mConferenceHost.getOriginalConnection().getDisconnectCause(), - null, mConferenceHost.getPhone().getPhoneId()); + disconnectCause = originalConnection != null ? + DisconnectCauseUtil.toTelecomDisconnectCause( + originalConnection.getDisconnectCause(), + null, mConferenceHost.getPhone().getPhoneId()) + : new DisconnectCause(DisconnectCause.UNKNOWN); } else { - disconnectCause = DisconnectCauseUtil.toTelecomDisconnectCause( - mConferenceHost.getOriginalConnection().getDisconnectCause()); + disconnectCause = originalConnection != null ? + DisconnectCauseUtil.toTelecomDisconnectCause( + originalConnection.getDisconnectCause()) + : new DisconnectCause(DisconnectCause.UNKNOWN); } } setDisconnected(disconnectCause); diff --git a/src/com/android/services/telephony/ImsConferenceController.java b/src/com/android/services/telephony/ImsConferenceController.java index 4631ab5d83..b4b572d203 100644 --- a/src/com/android/services/telephony/ImsConferenceController.java +++ b/src/com/android/services/telephony/ImsConferenceController.java @@ -438,6 +438,8 @@ public class ImsConferenceController { conferenceHostConnection.setVideoPauseSupported(connection.getVideoPauseSupported()); conferenceHostConnection.setManageImsConferenceCallSupported( connection.isManageImsConferenceCallSupported()); + conferenceHostConnection.setTelephonyConnectionService( + connection.getTelephonyConnectionService()); // WARNING: do not try to copy the video provider from connection to // conferenceHostConnection here. In connection.cloneConnection, part of the clone // process is to set the original connection so it's already set: diff --git a/src/com/android/services/telephony/TelephonyConnectionService.java b/src/com/android/services/telephony/TelephonyConnectionService.java index 6feb706ab3..1e1e15abb6 100644 --- a/src/com/android/services/telephony/TelephonyConnectionService.java +++ b/src/com/android/services/telephony/TelephonyConnectionService.java @@ -672,7 +672,6 @@ public class TelephonyConnectionService extends ConnectionService { } TelephonyConnection connection = (TelephonyConnection)conn; - ImsConference conference = new ImsConference(TelecomAccountRegistry.getInstance(this), mTelephonyConnectionServiceProxy, connection, phoneAccountHandle, () -> true, @@ -2827,6 +2826,9 @@ public class TelephonyConnectionService extends ConnectionService { // when we go between CDMA and GSM we should replace the TelephonyConnection. if (connection.isImsConnection()) { Log.d(this, "Adding IMS connection to conference controller: " + connection); + if (connection.getTelephonyConnectionService() == null) { + connection.setTelephonyConnectionService(this); + } mImsConferenceController.add(connection); mTelephonyConferenceController.remove(connection); if (connection instanceof CdmaConnection) { |