From 3011f5beb4468fb8e289f17623f01e9afe9f0e1d Mon Sep 17 00:00:00 2001 From: Brad Ebinger Date: Fri, 4 Dec 2020 22:07:44 +0000 Subject: [PATCH] Add SipDelegateConnection#closeDialog Add an API for IMS application to notify the SipDelegate when to close the dialog and release all routing resources associated with it. Bug: 173833985 Test: atest CtsTelephonyTestCases:SipDelegateManagerTest Change-Id: I7638c1d3a8e117f604a83ea241c5ec158f33a186 --- core/api/system-current.txt | 1 + .../telephony/ims/DelegateRegistrationState.java | 14 ++++++++------ .../telephony/ims/SipDelegateConnection.java | 16 ++++++++++++++++ .../android/telephony/ims/aidl/ISipDelegate.aidl | 2 -- .../aidl/SipDelegateConnectionAidlWrapper.java | 13 +++++++++++++ .../android/telephony/ims/stub/SipDelegate.java | 11 ++++++++--- 6 files changed, 46 insertions(+), 11 deletions(-) diff --git a/core/api/system-current.txt b/core/api/system-current.txt index a48ad95ea40e5..373d4bcd02190 100644 --- a/core/api/system-current.txt +++ b/core/api/system-current.txt @@ -11314,6 +11314,7 @@ package android.telephony.ims { } public interface SipDelegateConnection { + method public void closeDialog(@NonNull String); method public void notifyMessageReceiveError(@NonNull String, int); method public void notifyMessageReceived(@NonNull String); method public void sendMessage(@NonNull android.telephony.ims.SipMessage, long); diff --git a/telephony/java/android/telephony/ims/DelegateRegistrationState.java b/telephony/java/android/telephony/ims/DelegateRegistrationState.java index 3558a9b79ce00..66281edc0de15 100644 --- a/telephony/java/android/telephony/ims/DelegateRegistrationState.java +++ b/telephony/java/android/telephony/ims/DelegateRegistrationState.java @@ -62,7 +62,8 @@ public final class DelegateRegistrationState implements Parcelable { /** * This feature tag is being deregistered because the PDN that the IMS registration is on is *changing. - * All open SIP dialogs need to be closed before the PDN change can proceed. + * All open SIP dialogs need to be closed before the PDN change can proceed using + * {@link SipDelegateConnection#closeDialog(String)}. */ public static final int DEREGISTERING_REASON_PDN_CHANGE = 3; @@ -73,7 +74,8 @@ public final class DelegateRegistrationState implements Parcelable { * a user triggered hange, such as data being enabled/disabled. *

* All open SIP dialogs associated with the new deprovisioned feature tag need to be closed - * before the IMS registration modification can proceed. + * using {@link SipDelegateConnection#closeDialog(String)} before the IMS registration + * modification can proceed. */ public static final int DEREGISTERING_REASON_PROVISIONING_CHANGE = 4; @@ -81,8 +83,8 @@ public final class DelegateRegistrationState implements Parcelable { * This feature tag is deregistering because the SipDelegate associated with this feature tag * needs to change its supported feature set. *

- * All open SIP Dialogs associated with this feature tag must be closed before this operation - * can proceed. + * All open SIP Dialogs associated with this feature tag must be closed + * using {@link SipDelegateConnection#closeDialog(String)} before this operation can proceed. */ public static final int DEREGISTERING_REASON_FEATURE_TAGS_CHANGING = 5; @@ -90,8 +92,8 @@ public final class DelegateRegistrationState implements Parcelable { * This feature tag is deregistering because the SipDelegate is in the process of being * destroyed. *

- * All open SIP Dialogs associated with this feature tag must be closed before this operation - * can proceed. + * All open SIP Dialogs associated with this feature tag must be closed + * using {@link SipDelegateConnection#closeDialog(String)} before this operation can proceed. */ public static final int DEREGISTERING_REASON_DESTROY_PENDING = 6; diff --git a/telephony/java/android/telephony/ims/SipDelegateConnection.java b/telephony/java/android/telephony/ims/SipDelegateConnection.java index c3cc1edf590b0..04a772cd873d6 100644 --- a/telephony/java/android/telephony/ims/SipDelegateConnection.java +++ b/telephony/java/android/telephony/ims/SipDelegateConnection.java @@ -61,6 +61,22 @@ public interface SipDelegateConnection { */ void notifyMessageReceived(@NonNull String viaTransactionId); + /** + * The SIP Dialog associated with the provided Call-ID is being closed and routing resources + * associated with the SIP dialog are free to be released. + *

+ * Calling this method is also mandatory for situations where the framework IMS stack is waiting + * for pending SIP dialogs to be closed before it can perform a handover or apply a provisioning + * change. See {@link DelegateRegistrationState} for more information about + * the scenarios where this can occur. + *

+ * This method will need to be called for each SIP dialog managed by this application when it is + * closed. + * @param callId The call-ID header value associated with the ongoing SIP Dialog that is + * closing. + */ + void closeDialog(@NonNull String callId); + /** * Notify the SIP delegate that the SIP message has been received from * {@link DelegateMessageCallback#onMessageReceived(SipMessage)}, however there was an error diff --git a/telephony/java/android/telephony/ims/aidl/ISipDelegate.aidl b/telephony/java/android/telephony/ims/aidl/ISipDelegate.aidl index 5d6766a651555..ad75be439da82 100644 --- a/telephony/java/android/telephony/ims/aidl/ISipDelegate.aidl +++ b/telephony/java/android/telephony/ims/aidl/ISipDelegate.aidl @@ -26,7 +26,5 @@ oneway interface ISipDelegate { void sendMessage(in SipMessage sipMessage, long configVersion); void notifyMessageReceived(in String viaTransactionId); void notifyMessageReceiveError(in String viaTransactionId, int reason); - - // only used by SipDelegate. void closeDialog(in String callId); } diff --git a/telephony/java/android/telephony/ims/aidl/SipDelegateConnectionAidlWrapper.java b/telephony/java/android/telephony/ims/aidl/SipDelegateConnectionAidlWrapper.java index 29ba8e2d50c4b..a35039bd7668a 100644 --- a/telephony/java/android/telephony/ims/aidl/SipDelegateConnectionAidlWrapper.java +++ b/telephony/java/android/telephony/ims/aidl/SipDelegateConnectionAidlWrapper.java @@ -199,6 +199,19 @@ public class SipDelegateConnectionAidlWrapper implements SipDelegateConnection, } } + @Override + public void closeDialog(String callId) { + try { + ISipDelegate conn = getSipDelegateBinder(); + if (conn == null) { + return; + } + conn.closeDialog(callId); + } catch (RemoteException e) { + // Nothing to do here, app will eventually get remote death callback. + } + } + // Also called upon IImsRcsController death (telephony process dies). @Override public void binderDied() { diff --git a/telephony/java/android/telephony/ims/stub/SipDelegate.java b/telephony/java/android/telephony/ims/stub/SipDelegate.java index d7e7b62dd5501..b036b5e71125a 100644 --- a/telephony/java/android/telephony/ims/stub/SipDelegate.java +++ b/telephony/java/android/telephony/ims/stub/SipDelegate.java @@ -19,7 +19,9 @@ package android.telephony.ims.stub; import android.annotation.NonNull; import android.annotation.SystemApi; import android.telephony.ims.DelegateMessageCallback; +import android.telephony.ims.DelegateRegistrationState; import android.telephony.ims.ImsService; +import android.telephony.ims.SipDelegateConnection; import android.telephony.ims.SipDelegateImsConfiguration; import android.telephony.ims.SipDelegateManager; import android.telephony.ims.SipMessage; @@ -65,10 +67,13 @@ public interface SipDelegate { * The framework is requesting that routing resources associated with the SIP dialog using the * provided Call-ID to be cleaned up. *

- * Typically a SIP Dialog close event will be signalled by that dialog receiving a BYE or 200 OK - * message, however, in some cases, the framework will request that the ImsService close the + * Typically, a SIP Dialog close event will be signalled by that dialog receiving a BYE or + * 200 OK message, however, the IMS application will still call + * {@link SipDelegateConnection#closeDialog(String)} to signal to the framework that resources + * can be released. In some cases, the framework will request that the ImsService close the * dialog due to the open dialog holding up an event such as applying a provisioning change or - * handing over to another transport type. + * handing over to another transport type. See {@link DelegateRegistrationState}. + * * @param callId The call-ID header value associated with the ongoing SIP Dialog that the * framework is requesting be closed. */