From 0689a503135a76b06969e70e1f488602f1fde5d9 Mon Sep 17 00:00:00 2001 From: Hunsuk Choi Date: Sun, 13 Feb 2022 06:33:51 +0000 Subject: [PATCH] Add system apis to notify IMS registration state to modem Bug: 219242990 Test: astest ImsServiceTest#testMmTelManagerRegistrationBlock Change-Id: I1c268dcf7b40d274f4b3148a867e603b131b9d1a --- core/api/current.txt | 1 + core/api/system-current.txt | 11 ++++ .../telephony/ims/RegistrationManager.java | 55 ++++++++++++++++++- .../ims/aidl/IImsRegistrationCallback.aidl | 4 +- .../ims/stub/ImsRegistrationImplBase.java | 50 +++++++++++++++-- 5 files changed, 111 insertions(+), 10 deletions(-) diff --git a/core/api/current.txt b/core/api/current.txt index 2049d91acbe38..da9bfb274de2f 100644 --- a/core/api/current.txt +++ b/core/api/current.txt @@ -44957,6 +44957,7 @@ package android.telephony.ims.feature { package android.telephony.ims.stub { public class ImsRegistrationImplBase { + field public static final int REGISTRATION_TECH_3G = 4; // 0x4 field public static final int REGISTRATION_TECH_CROSS_SIM = 2; // 0x2 field public static final int REGISTRATION_TECH_IWLAN = 1; // 0x1 field public static final int REGISTRATION_TECH_LTE = 0; // 0x0 diff --git a/core/api/system-current.txt b/core/api/system-current.txt index fdb5e071c610e..0244043cc6681 100644 --- a/core/api/system-current.txt +++ b/core/api/system-current.txt @@ -15228,6 +15228,16 @@ package android.telephony.ims { method public void onPublishStateChange(int); } + public interface RegistrationManager { + field public static final int SUGGESTED_ACTION_NONE = 0; // 0x0 + field public static final int SUGGESTED_ACTION_TRIGGER_PLMN_BLOCK = 1; // 0x1 + field public static final int SUGGESTED_ACTION_TRIGGER_PLMN_BLOCK_WITH_TIMEOUT = 2; // 0x2 + } + + public static class RegistrationManager.RegistrationCallback { + method public void onUnregistered(@NonNull android.telephony.ims.ImsReasonInfo, int); + } + public final class RtpHeaderExtension implements android.os.Parcelable { ctor public RtpHeaderExtension(@IntRange(from=1, to=14) int, @NonNull byte[]); method public int describeContents(); @@ -15610,6 +15620,7 @@ package android.telephony.ims.stub { ctor public ImsRegistrationImplBase(); ctor public ImsRegistrationImplBase(@NonNull java.util.concurrent.Executor); method public final void onDeregistered(android.telephony.ims.ImsReasonInfo); + method public final void onDeregistered(@Nullable android.telephony.ims.ImsReasonInfo, int); method public final void onRegistered(int); method public final void onRegistered(@NonNull android.telephony.ims.ImsRegistrationAttributes); method public final void onRegistering(int); diff --git a/telephony/java/android/telephony/ims/RegistrationManager.java b/telephony/java/android/telephony/ims/RegistrationManager.java index 090d4136872e6..94aebf103ec2d 100644 --- a/telephony/java/android/telephony/ims/RegistrationManager.java +++ b/telephony/java/android/telephony/ims/RegistrationManager.java @@ -23,6 +23,7 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.RequiresFeature; import android.annotation.RequiresPermission; +import android.annotation.SystemApi; import android.content.pm.PackageManager; import android.net.Uri; import android.os.Binder; @@ -75,6 +76,41 @@ public interface RegistrationManager { */ int REGISTRATION_STATE_REGISTERED = 2; + /** @hide */ + @IntDef(prefix = {"SUGGESTED_ACTION_"}, + value = { + SUGGESTED_ACTION_NONE, + SUGGESTED_ACTION_TRIGGER_PLMN_BLOCK, + SUGGESTED_ACTION_TRIGGER_PLMN_BLOCK_WITH_TIMEOUT + }) + @Retention(RetentionPolicy.SOURCE) + public @interface SuggestedAction {} + + /** + * Default value. No action is suggested when IMS registration fails. + * @hide + */ + @SystemApi + public static final int SUGGESTED_ACTION_NONE = 0; + + /** + * Indicates that the IMS registration is failed with fatal error such as 403 or 404 + * on all P-CSCF addresses. The radio shall block the current PLMN or disable + * the RAT as per the carrier requirements. + * @hide + */ + @SystemApi + public static final int SUGGESTED_ACTION_TRIGGER_PLMN_BLOCK = 1; + + /** + * Indicates that the IMS registration on current PLMN failed multiple times. + * The radio shall block the current PLMN or disable the RAT during EPS or 5GS mobility + * management timer value as per the carrier requirements. + * @hide + */ + @SystemApi + public static final int SUGGESTED_ACTION_TRIGGER_PLMN_BLOCK_WITH_TIMEOUT = 2; + /**@hide*/ // Translate ImsRegistrationImplBase API to new AccessNetworkConstant because WLAN // and WWAN are more accurate constants. @@ -169,12 +205,12 @@ public interface RegistrationManager { } @Override - public void onDeregistered(ImsReasonInfo info) { + public void onDeregistered(ImsReasonInfo info, @SuggestedAction int suggestedAction) { if (mLocalCallback == null) return; final long callingIdentity = Binder.clearCallingIdentity(); try { - mExecutor.execute(() -> mLocalCallback.onUnregistered(info)); + mExecutor.execute(() -> mLocalCallback.onUnregistered(info, suggestedAction)); } finally { restoreCallingIdentity(callingIdentity); } @@ -259,6 +295,21 @@ public interface RegistrationManager { public void onUnregistered(@NonNull ImsReasonInfo info) { } + /** + * Notifies the framework when the IMS Provider is unregistered from the IMS network. + * + * @param info the {@link ImsReasonInfo} associated with why registration was disconnected. + * @param suggestedAction the expected behavior of radio protocol stack. + * + * @hide + */ + @SystemApi + public void onUnregistered(@NonNull ImsReasonInfo info, + @SuggestedAction int suggestedAction) { + // Default impl to keep backwards compatibility with old implementations + onUnregistered(info); + } + /** * A failure has occurred when trying to handover registration to another technology type. * diff --git a/telephony/java/android/telephony/ims/aidl/IImsRegistrationCallback.aidl b/telephony/java/android/telephony/ims/aidl/IImsRegistrationCallback.aidl index 179407c983e5c..069eb469ef115 100644 --- a/telephony/java/android/telephony/ims/aidl/IImsRegistrationCallback.aidl +++ b/telephony/java/android/telephony/ims/aidl/IImsRegistrationCallback.aidl @@ -31,7 +31,7 @@ import android.telephony.ims.ImsRegistrationAttributes; oneway interface IImsRegistrationCallback { void onRegistered(in ImsRegistrationAttributes attr); void onRegistering(in ImsRegistrationAttributes attr); - void onDeregistered(in ImsReasonInfo info); + void onDeregistered(in ImsReasonInfo info, int suggestedAction); void onTechnologyChangeFailed(int imsRadioTech, in ImsReasonInfo info); void onSubscriberAssociatedUriChanged(in Uri[] uris); -} \ No newline at end of file +} diff --git a/telephony/java/android/telephony/ims/stub/ImsRegistrationImplBase.java b/telephony/java/android/telephony/ims/stub/ImsRegistrationImplBase.java index 6fc1cc828a2c8..7564a3d2ea441 100644 --- a/telephony/java/android/telephony/ims/stub/ImsRegistrationImplBase.java +++ b/telephony/java/android/telephony/ims/stub/ImsRegistrationImplBase.java @@ -64,7 +64,8 @@ public class ImsRegistrationImplBase { REGISTRATION_TECH_LTE, REGISTRATION_TECH_IWLAN, REGISTRATION_TECH_CROSS_SIM, - REGISTRATION_TECH_NR + REGISTRATION_TECH_NR, + REGISTRATION_TECH_3G }) @Retention(RetentionPolicy.SOURCE) public @interface ImsRegistrationTech {} @@ -91,11 +92,16 @@ public class ImsRegistrationImplBase { */ public static final int REGISTRATION_TECH_NR = 3; + /** + * This ImsService is registered to IMS via 3G. + */ + public static final int REGISTRATION_TECH_3G = 4; + /** * This is used to check the upper range of registration tech * @hide */ - public static final int REGISTRATION_TECH_MAX = REGISTRATION_TECH_NR + 1; + public static final int REGISTRATION_TECH_MAX = REGISTRATION_TECH_3G + 1; // Registration states, used to notify new ImsRegistrationImplBase#Callbacks of the current // state. @@ -228,6 +234,8 @@ public class ImsRegistrationImplBase { private int mRegistrationState = REGISTRATION_STATE_UNKNOWN; // Locked on mLock, create unspecified disconnect cause. private ImsReasonInfo mLastDisconnectCause = new ImsReasonInfo(); + // Locked on mLock + private int mLastDisconnectSuggestedAction = RegistrationManager.SUGGESTED_ACTION_NONE; // We hold onto the uris each time they change so that we can send it to a callback when its // first added. @@ -381,12 +389,37 @@ public class ImsRegistrationImplBase { */ @SystemApi public final void onDeregistered(ImsReasonInfo info) { - updateToDisconnectedState(info); + // Default impl to keep backwards compatibility with old implementations + onDeregistered(info, RegistrationManager.SUGGESTED_ACTION_NONE); + } + + /** + * Notify the framework that the device is disconnected from the IMS network. + *

+ * Note: Prior to calling {@link #onDeregistered(ImsReasonInfo,int)}, you should ensure that any + * changes to {@link android.telephony.ims.feature.ImsFeature} capability availability is sent + * to the framework. For example, + * {@link android.telephony.ims.feature.MmTelFeature.MmTelCapabilities#CAPABILITY_TYPE_VIDEO} + * and + * {@link android.telephony.ims.feature.MmTelFeature.MmTelCapabilities#CAPABILITY_TYPE_VOICE} + * may be set to unavailable to ensure the framework knows these services are no longer + * available due to de-registration. If you do not report capability changes impacted by + * de-registration, the framework will not know which features are no longer available as a + * result. + * + * @param info the {@link ImsReasonInfo} associated with why registration was disconnected. + * @param suggestedAction the expected behavior of radio protocol stack. + * @hide This API is not part of the Android public SDK API + */ + @SystemApi + public final void onDeregistered(@Nullable ImsReasonInfo info, + @RegistrationManager.SuggestedAction int suggestedAction) { + updateToDisconnectedState(info, suggestedAction); // ImsReasonInfo should never be null. final ImsReasonInfo reasonInfo = (info != null) ? info : new ImsReasonInfo(); mCallbacks.broadcastAction((c) -> { try { - c.onDeregistered(reasonInfo); + c.onDeregistered(reasonInfo, suggestedAction); } catch (RemoteException e) { Log.w(LOG_TAG, e + "onDeregistered() - Skipping callback."); } @@ -445,10 +478,12 @@ public class ImsRegistrationImplBase { mRegistrationAttributes = attributes; mRegistrationState = newState; mLastDisconnectCause = null; + mLastDisconnectSuggestedAction = RegistrationManager.SUGGESTED_ACTION_NONE; } } - private void updateToDisconnectedState(ImsReasonInfo info) { + private void updateToDisconnectedState(ImsReasonInfo info, + @RegistrationManager.SuggestedAction int suggestedAction) { synchronized (mLock) { //We don't want to send this info over if we are disconnected mUrisSet = false; @@ -458,6 +493,7 @@ public class ImsRegistrationImplBase { RegistrationManager.REGISTRATION_STATE_NOT_REGISTERED); if (info != null) { mLastDisconnectCause = info; + mLastDisconnectSuggestedAction = suggestedAction; } else { Log.w(LOG_TAG, "updateToDisconnectedState: no ImsReasonInfo provided."); mLastDisconnectCause = new ImsReasonInfo(); @@ -474,18 +510,20 @@ public class ImsRegistrationImplBase { int state; ImsRegistrationAttributes attributes; ImsReasonInfo disconnectInfo; + int suggestedAction; boolean urisSet; Uri[] uris; synchronized (mLock) { state = mRegistrationState; attributes = mRegistrationAttributes; disconnectInfo = mLastDisconnectCause; + suggestedAction = mLastDisconnectSuggestedAction; urisSet = mUrisSet; uris = mUris; } switch (state) { case RegistrationManager.REGISTRATION_STATE_NOT_REGISTERED: { - c.onDeregistered(disconnectInfo); + c.onDeregistered(disconnectInfo, suggestedAction); break; } case RegistrationManager.REGISTRATION_STATE_REGISTERING: {