From 5e08b377866c9ec33fcf6c399cb06cdfc1a55b1d Mon Sep 17 00:00:00 2001 From: Jonggeon Kim Date: Thu, 25 Nov 2021 10:16:57 +0000 Subject: [PATCH 1/4] ImsService Subscription Notifications Provide a new API in ImsService that creates a new version of each ImsFeature and dependencies when a new subId is loaded. The ImsService handles ImsFeature setup and teardown procedures to happen on a per-subscription basis instead of on a per-slot basis. Provide the compatibility behavior for older devices that are not upgrading to using the new API. Bug: 197991451 Test: atest FrameworksTelephonyTests:ImsServiceTest, atest CtsTelephonyTestCases:ImsServiceTest Merged-In: I231da2f4479d4a4fb272edbf27e49f46833a082a Change-Id: I231da2f4479d4a4fb272edbf27e49f46833a082a --- core/api/system-current.txt | 19 +- .../android/telephony/ims/ImsService.java | 236 ++++++++++++++++-- .../ims/aidl/IImsServiceController.aidl | 15 +- .../internal/IImsServiceFeatureCallback.aidl | 4 +- 4 files changed, 232 insertions(+), 42 deletions(-) diff --git a/core/api/system-current.txt b/core/api/system-current.txt index 7fe3703fac0d..a97eb25861b5 100644 --- a/core/api/system-current.txt +++ b/core/api/system-current.txt @@ -12921,14 +12921,21 @@ package android.telephony.ims { public class ImsService extends android.app.Service { ctor public ImsService(); - method public android.telephony.ims.feature.MmTelFeature createMmTelFeature(int); - method public android.telephony.ims.feature.RcsFeature createRcsFeature(int); - method public void disableIms(int); - method public void enableIms(int); - method public android.telephony.ims.stub.ImsConfigImplBase getConfig(int); + method @Nullable public android.telephony.ims.feature.MmTelFeature createEmergencyOnlyMmTelFeature(int); + method @Deprecated public android.telephony.ims.feature.MmTelFeature createMmTelFeature(int); + method @Nullable public android.telephony.ims.feature.MmTelFeature createMmTelFeatureForSubscription(int, int); + method @Deprecated public android.telephony.ims.feature.RcsFeature createRcsFeature(int); + method @Nullable public android.telephony.ims.feature.RcsFeature createRcsFeatureForSubscription(int, int); + method @Deprecated public void disableIms(int); + method public void disableImsForSubscription(int, int); + method @Deprecated public void enableIms(int); + method public void enableImsForSubscription(int, int); + method @Deprecated public android.telephony.ims.stub.ImsConfigImplBase getConfig(int); + method @NonNull public android.telephony.ims.stub.ImsConfigImplBase getConfigForSubscription(int, int); method @NonNull public java.util.concurrent.Executor getExecutor(); method public long getImsServiceCapabilities(); - method public android.telephony.ims.stub.ImsRegistrationImplBase getRegistration(int); + method @Deprecated public android.telephony.ims.stub.ImsRegistrationImplBase getRegistration(int); + method @NonNull public android.telephony.ims.stub.ImsRegistrationImplBase getRegistrationForSubscription(int, int); method @Nullable public android.telephony.ims.stub.SipTransportImplBase getSipTransport(int); method public final void onUpdateSupportedImsFeatures(android.telephony.ims.stub.ImsFeatureConfiguration) throws android.os.RemoteException; method public android.telephony.ims.stub.ImsFeatureConfiguration querySupportedImsFeatures(); diff --git a/telephony/java/android/telephony/ims/ImsService.java b/telephony/java/android/telephony/ims/ImsService.java index 53dff545b0ce..be233b82c426 100644 --- a/telephony/java/android/telephony/ims/ImsService.java +++ b/telephony/java/android/telephony/ims/ImsService.java @@ -42,6 +42,7 @@ import android.telephony.ims.stub.ImsRegistrationImplBase; import android.telephony.ims.stub.SipTransportImplBase; import android.util.Log; import android.util.SparseArray; +import android.util.SparseBooleanArray; import com.android.ims.internal.IImsFeatureStatusCallback; import com.android.internal.annotations.VisibleForTesting; @@ -180,6 +181,12 @@ public class ImsService extends Service { // call ImsFeature#onFeatureRemoved. private final SparseArray> mFeaturesBySlot = new SparseArray<>(); + // A map of slot id -> boolean array, where each entry in the boolean array corresponds to an + // ImsFeature that was created for a slot id and not a sub id for backwards compatibility + // purposes. + private final SparseArray mCreateImsFeatureWithSlotIdFlagMap = + new SparseArray<>(); + private IImsServiceControllerListener mListener; private Executor mExecutor; @@ -222,15 +229,36 @@ public class ImsService extends Service { } @Override - public IImsMmTelFeature createMmTelFeature(int slotId) { - return executeMethodAsyncForResult(() -> createMmTelFeatureInternal(slotId), - "createMmTelFeature"); + public IImsMmTelFeature createMmTelFeature(int slotId, int subId) { + MmTelFeature f = (MmTelFeature) getImsFeature(slotId, ImsFeature.FEATURE_MMTEL); + if (f == null) { + return executeMethodAsyncForResult(() -> createMmTelFeatureInternal(slotId, subId), + "createMmTelFeature"); + } else { + return f.getBinder(); + } } @Override - public IImsRcsFeature createRcsFeature(int slotId) { - return executeMethodAsyncForResult(() -> createRcsFeatureInternal(slotId), - "createRcsFeature"); + public IImsMmTelFeature createEmergencyOnlyMmTelFeature(int slotId) { + MmTelFeature f = (MmTelFeature) getImsFeature(slotId, ImsFeature.FEATURE_MMTEL); + if (f == null) { + return executeMethodAsyncForResult(() -> createEmergencyOnlyMmTelFeatureInternal( + slotId), "createEmergencyOnlyMmTelFeature"); + } else { + return f.getBinder(); + } + } + + @Override + public IImsRcsFeature createRcsFeature(int slotId, int subId) { + RcsFeature f = (RcsFeature) getImsFeature(slotId, ImsFeature.FEATURE_RCS); + if (f == null) { + return executeMethodAsyncForResult(() -> + createRcsFeatureInternal(slotId, subId), "createRcsFeature"); + } else { + return f.getBinder(); + } } @Override @@ -248,9 +276,14 @@ public class ImsService extends Service { } @Override - public void removeImsFeature(int slotId, int featureType) { + public void removeImsFeature(int slotId, int featureType, boolean changeSubId) { + if (changeSubId && isImsFeatureCreatedForSlot(slotId, featureType)) { + Log.w(LOG_TAG, "Do not remove Ims feature for compatibility"); + return; + } executeMethodAsync(() -> ImsService.this.removeImsFeature(slotId, featureType), "removeImsFeature"); + setImsFeatureCreatedForSlot(slotId, featureType, false); } @Override @@ -279,9 +312,10 @@ public class ImsService extends Service { } @Override - public IImsConfig getConfig(int slotId) { + public IImsConfig getConfig(int slotId, int subId) { return executeMethodAsyncForResult(() -> { - ImsConfigImplBase c = ImsService.this.getConfig(slotId); + ImsConfigImplBase c = + ImsService.this.getConfigForSubscription(slotId, subId); if (c != null) { c.setDefaultExecutor(mExecutor); return c.getIImsConfig(); @@ -292,9 +326,10 @@ public class ImsService extends Service { } @Override - public IImsRegistration getRegistration(int slotId) { + public IImsRegistration getRegistration(int slotId, int subId) { return executeMethodAsyncForResult(() -> { - ImsRegistrationImplBase r = ImsService.this.getRegistration(slotId); + ImsRegistrationImplBase r = + ImsService.this.getRegistrationForSubscription(slotId, subId); if (r != null) { r.setDefaultExecutor(mExecutor); return r.getBinder(); @@ -318,13 +353,15 @@ public class ImsService extends Service { } @Override - public void enableIms(int slotId) { - executeMethodAsync(() -> ImsService.this.enableIms(slotId), "enableIms"); + public void enableIms(int slotId, int subId) { + executeMethodAsync(() -> + ImsService.this.enableImsForSubscription(slotId, subId), "enableIms"); } @Override - public void disableIms(int slotId) { - executeMethodAsync(() -> ImsService.this.disableIms(slotId), "disableIms"); + public void disableIms(int slotId, int subId) { + executeMethodAsync(() -> + ImsService.this.disableImsForSubscription(slotId, subId), "disableIms"); } // Call the methods with a clean calling identity on the executor and wait indefinitely for @@ -364,16 +401,8 @@ public class ImsService extends Service { return null; } - /** - * @hide - */ - @VisibleForTesting - public SparseArray getFeatures(int slotId) { - return mFeaturesBySlot.get(slotId); - } - - private IImsMmTelFeature createMmTelFeatureInternal(int slotId) { - MmTelFeature f = createMmTelFeature(slotId); + private IImsMmTelFeature createMmTelFeatureInternal(int slotId, int subscriptionId) { + MmTelFeature f = createMmTelFeatureForSubscription(slotId, subscriptionId); if (f != null) { setupFeature(f, slotId, ImsFeature.FEATURE_MMTEL); f.setDefaultExecutor(mExecutor); @@ -384,8 +413,20 @@ public class ImsService extends Service { } } - private IImsRcsFeature createRcsFeatureInternal(int slotId) { - RcsFeature f = createRcsFeature(slotId); + private IImsMmTelFeature createEmergencyOnlyMmTelFeatureInternal(int slotId) { + MmTelFeature f = createEmergencyOnlyMmTelFeature(slotId); + if (f != null) { + setupFeature(f, slotId, ImsFeature.FEATURE_MMTEL); + f.setDefaultExecutor(mExecutor); + return f.getBinder(); + } else { + Log.e(LOG_TAG, "createEmergencyOnlyMmTelFeatureInternal: null feature returned."); + return null; + } + } + + private IImsRcsFeature createRcsFeatureInternal(int slotId, int subI) { + RcsFeature f = createRcsFeatureForSubscription(slotId, subI); if (f != null) { f.setDefaultExecutor(mExecutor); setupFeature(f, slotId, ImsFeature.FEATURE_RCS); @@ -466,6 +507,49 @@ public class ImsService extends Service { f.onFeatureRemoved(); features.remove(featureType); } + + } + + /** + * @hide + */ + @VisibleForTesting + public ImsFeature getImsFeature(int slotId, int featureType) { + synchronized (mFeaturesBySlot) { + // Get SparseArray for Features, by querying slot Id + SparseArray features = mFeaturesBySlot.get(slotId); + if (features == null) { + return null; + } + return features.get(featureType); + } + } + + private void setImsFeatureCreatedForSlot(int slotId, + @ImsFeature.FeatureType int featureType, boolean createdForSlot) { + synchronized (mCreateImsFeatureWithSlotIdFlagMap) { + getImsFeatureCreatedForSlot(slotId).put(featureType, createdForSlot); + } + } + + /** + * @hide + */ + @VisibleForTesting + public boolean isImsFeatureCreatedForSlot(int slotId, + @ImsFeature.FeatureType int featureType) { + synchronized (mCreateImsFeatureWithSlotIdFlagMap) { + return getImsFeatureCreatedForSlot(slotId).get(featureType); + } + } + + private SparseBooleanArray getImsFeatureCreatedForSlot(int slotId) { + SparseBooleanArray createFlag = mCreateImsFeatureWithSlotIdFlagMap.get(slotId); + if (createFlag == null) { + createFlag = new SparseBooleanArray(); + mCreateImsFeatureWithSlotIdFlagMap.put(slotId, createFlag); + } + return createFlag; } /** @@ -523,28 +607,96 @@ public class ImsService extends Service { public void readyForFeatureCreation() { } + /** + * The framework has enabled IMS for the subscription specified, the ImsService should register + * for IMS and perform all appropriate initialization to bring up all ImsFeatures. + * + * @param slotId The slot ID that IMS will be enabled for. + * @param subscriptionId The subscription ID that IMS will be enabled for. + */ + public void enableImsForSubscription(int slotId, int subscriptionId) { + enableIms(slotId); + } + + /** + * The framework has disabled IMS for the subscription specified. The ImsService must deregister + * for IMS and set capability status to false for all ImsFeatures. + * @param slotId The slot ID that IMS will be disabled for. + * @param subscriptionId The subscription ID that IMS will be disabled for. + */ + public void disableImsForSubscription(int slotId, int subscriptionId) { + disableIms(slotId); + } + /** * The framework has enabled IMS for the slot specified, the ImsService should register for IMS * and perform all appropriate initialization to bring up all ImsFeatures. + * @deprecated Use {@link #enableImsForSubscription} instead. */ + @Deprecated public void enableIms(int slotId) { } /** * The framework has disabled IMS for the slot specified. The ImsService must deregister for IMS * and set capability status to false for all ImsFeatures. + * @deprecated Use {@link #disableImsForSubscription} instead. */ + @Deprecated public void disableIms(int slotId) { } + /** + * When called, the framework is requesting that a new {@link MmTelFeature} is created for the + * specified subscription. + * + * @param subscriptionId The subscription ID that the MMTEL Feature is being created for. + * @return The newly created {@link MmTelFeature} associated with the subscription or null if + * the feature is not supported. + */ + public @Nullable MmTelFeature createMmTelFeatureForSubscription(int slotId, + int subscriptionId) { + setImsFeatureCreatedForSlot(slotId, ImsFeature.FEATURE_MMTEL, true); + return createMmTelFeature(slotId); + } + + /** + * When called, the framework is requesting that a new {@link RcsFeature} is created for the + * specified subscription. + * + * @param subscriptionId The subscription ID that the RCS Feature is being created for. + * @return The newly created {@link RcsFeature} associated with the subscription or null if the + * feature is not supported. + */ + public @Nullable RcsFeature createRcsFeatureForSubscription(int slotId, int subscriptionId) { + setImsFeatureCreatedForSlot(slotId, ImsFeature.FEATURE_RCS, true); + return createRcsFeature(slotId); + } + + /** + * When called, the framework is requesting that a new emergency-only {@link MmTelFeature} is + * created for the specified slot. For emergency calls, there is no known Subscription Id. + * + * @param slotId The slot ID that the MMTEL Feature is being created for. + * @return An MmTelFeature instance to be used for the slot ID when there is not + * subscription inserted. Only requested when there is no subscription active on + * the specified slot. + */ + public @Nullable MmTelFeature createEmergencyOnlyMmTelFeature(int slotId) { + setImsFeatureCreatedForSlot(slotId, ImsFeature.FEATURE_MMTEL, true); + return createMmTelFeature(slotId); + } + /** * When called, the framework is requesting that a new {@link MmTelFeature} is created for the * specified slot. + * @deprecated Use {@link #createMmTelFeatureForSubscription} instead * * @param slotId The slot ID that the MMTEL Feature is being created for. * @return The newly created {@link MmTelFeature} associated with the slot or null if the * feature is not supported. */ + @Deprecated public MmTelFeature createMmTelFeature(int slotId) { return null; } @@ -552,32 +704,62 @@ public class ImsService extends Service { /** * When called, the framework is requesting that a new {@link RcsFeature} is created for the * specified slot. + * @deprecated Use {@link #createRcsFeatureForSubscription} instead * * @param slotId The slot ID that the RCS Feature is being created for. * @return The newly created {@link RcsFeature} associated with the slot or null if the feature * is not supported. */ + @Deprecated public RcsFeature createRcsFeature(int slotId) { return null; } + /** + * Return the {@link ImsConfigImplBase} implementation associated with the provided + * subscription. This will be used by the platform to get/set specific IMS related + * configurations. + * + * @param subscriptionId The subscription ID that the IMS configuration is associated with. + * @return ImsConfig implementation that is associated with the specified subscription. + */ + public @NonNull ImsConfigImplBase getConfigForSubscription(int slotId, int subscriptionId) { + return getConfig(slotId); + } + + /** + * Return the {@link ImsRegistrationImplBase} implementation associated with the provided + * subscription. + * + * @param subscriptionId The subscription ID that is associated with the IMS Registration. + * @return the ImsRegistration implementation associated with the subscription. + */ + public @NonNull ImsRegistrationImplBase getRegistrationForSubscription(int slotId, + int subscriptionId) { + return getRegistration(slotId); + } + /** * Return the {@link ImsConfigImplBase} implementation associated with the provided slot. This * will be used by the platform to get/set specific IMS related configurations. + * @deprecated use {@link #getConfigForSubscription} instead. * * @param slotId The slot that the IMS configuration is associated with. * @return ImsConfig implementation that is associated with the specified slot. */ + @Deprecated public ImsConfigImplBase getConfig(int slotId) { return new ImsConfigImplBase(); } /** * Return the {@link ImsRegistrationImplBase} implementation associated with the provided slot. + * @deprecated use {@link #getRegistrationForSubscription} instead. * * @param slotId The slot that is associated with the IMS Registration. * @return the ImsRegistration implementation associated with the slot. */ + @Deprecated public ImsRegistrationImplBase getRegistration(int slotId) { return new ImsRegistrationImplBase(); } diff --git a/telephony/java/android/telephony/ims/aidl/IImsServiceController.aidl b/telephony/java/android/telephony/ims/aidl/IImsServiceController.aidl index c6966b3cf53e..ae6166fea02a 100644 --- a/telephony/java/android/telephony/ims/aidl/IImsServiceController.aidl +++ b/telephony/java/android/telephony/ims/aidl/IImsServiceController.aidl @@ -32,18 +32,19 @@ import com.android.ims.internal.IImsFeatureStatusCallback; */ interface IImsServiceController { void setListener(IImsServiceControllerListener l); - IImsMmTelFeature createMmTelFeature(int slotId); - IImsRcsFeature createRcsFeature(int slotId); + IImsMmTelFeature createMmTelFeature(int slotId, int subId); + IImsMmTelFeature createEmergencyOnlyMmTelFeature(int slotId); + IImsRcsFeature createRcsFeature(int slotId, int subId); ImsFeatureConfiguration querySupportedImsFeatures(); long getImsServiceCapabilities(); void addFeatureStatusCallback(int slotId, int featureType, in IImsFeatureStatusCallback c); void removeFeatureStatusCallback(int slotId, int featureType, in IImsFeatureStatusCallback c); // Synchronous call to ensure the ImsService is ready before continuing with feature creation. void notifyImsServiceReadyForFeatureCreation(); - void removeImsFeature(int slotId, int featureType); - IImsConfig getConfig(int slotId); - IImsRegistration getRegistration(int slotId); + void removeImsFeature(int slotId, int featureType, boolean changeSubId); + IImsConfig getConfig(int slotId, int subId); + IImsRegistration getRegistration(int slotId, int subId); ISipTransport getSipTransport(int slotId); - oneway void enableIms(int slotId); - oneway void disableIms(int slotId); + oneway void enableIms(int slotId, int subId); + oneway void disableIms(int slotId, int subId); } diff --git a/telephony/java/com/android/ims/internal/IImsServiceFeatureCallback.aidl b/telephony/java/com/android/ims/internal/IImsServiceFeatureCallback.aidl index f5f67bd36ec3..416096b1f6ec 100644 --- a/telephony/java/com/android/ims/internal/IImsServiceFeatureCallback.aidl +++ b/telephony/java/com/android/ims/internal/IImsServiceFeatureCallback.aidl @@ -23,11 +23,11 @@ import com.android.ims.ImsFeatureContainer; * {@hide} */ oneway interface IImsServiceFeatureCallback { - void imsFeatureCreated(in ImsFeatureContainer feature); + void imsFeatureCreated(in ImsFeatureContainer feature, int subId); // Reason defined in FeatureConnector.UnavailableReason void imsFeatureRemoved(int reason); // Status defined in ImsFeature.ImsState. - void imsStatusChanged(int status); + void imsStatusChanged(int status, int subId); //Capabilities defined in ImsService.ImsServiceCapability void updateCapabilities(long capabilities); } \ No newline at end of file From 893cc9403678fb8cd916cf0548ef650dd1fdfe2f Mon Sep 17 00:00:00 2001 From: Hakjun Choi Date: Fri, 26 Nov 2021 03:12:52 +0000 Subject: [PATCH 2/4] Add public API to ProvisioningManager for IMS/RCS provisioning by updatable provisioning app Bug: 197992603 Test: CTS ImsServiceTest#testProvisioningManagerWhen(Mmtel/Rcs)ProvisionIs(Not)Required Change-Id: I4fc0759111d15cec01a49a78cda5065bfb7e6c65 Merged-In: I4fc0759111d15cec01a49a78cda5065bfb7e6c65 --- core/api/current.txt | 39 ++ core/api/system-current.txt | 14 +- .../telephony/CarrierConfigManager.java | 32 ++ .../java/android/telephony/ImsManager.java | 20 + .../telephony/ims/ProvisioningManager.java | 456 ++++++++++++++++-- .../aidl/IFeatureProvisioningCallback.aidl | 28 ++ .../telephony/ims/feature/MmTelFeature.java | 13 + .../telephony/ims/feature/RcsFeature.java | 60 ++- .../ims/stub/ImsRegistrationImplBase.java | 33 +- .../internal/telephony/ITelephony.aidl | 38 +- 10 files changed, 659 insertions(+), 74 deletions(-) create mode 100644 telephony/java/android/telephony/ims/aidl/IFeatureProvisioningCallback.aidl diff --git a/core/api/current.txt b/core/api/current.txt index a5b1d1f064c8..4ce25b827a88 100644 --- a/core/api/current.txt +++ b/core/api/current.txt @@ -42424,6 +42424,7 @@ package android.telephony.ims { public class ImsManager { method @NonNull public android.telephony.ims.ImsMmTelManager getImsMmTelManager(int); method @NonNull public android.telephony.ims.ImsRcsManager getImsRcsManager(int); + method @NonNull public android.telephony.ims.ProvisioningManager getProvisioningManager(int); field public static final String ACTION_WFC_IMS_REGISTRATION_ERROR = "android.telephony.ims.action.WFC_IMS_REGISTRATION_ERROR"; field public static final String EXTRA_WFC_REGISTRATION_FAILURE_MESSAGE = "android.telephony.ims.extra.WFC_REGISTRATION_FAILURE_MESSAGE"; field public static final String EXTRA_WFC_REGISTRATION_FAILURE_TITLE = "android.telephony.ims.extra.WFC_REGISTRATION_FAILURE_TITLE"; @@ -42674,6 +42675,23 @@ package android.telephony.ims { field public static final int REASON_UNKNOWN_TEMPORARY_ERROR = 1; // 0x1 } + public class ProvisioningManager { + method @RequiresPermission(android.Manifest.permission.READ_PRECISE_PHONE_STATE) @WorkerThread public boolean getProvisioningStatusForCapability(int, int); + method @RequiresPermission(android.Manifest.permission.READ_PRECISE_PHONE_STATE) @WorkerThread public boolean getRcsProvisioningStatusForCapability(int, int); + method @RequiresPermission(android.Manifest.permission.READ_PRECISE_PHONE_STATE) public boolean isProvisioningRequiredForCapability(int, int); + method @RequiresPermission(android.Manifest.permission.READ_PRECISE_PHONE_STATE) public boolean isRcsProvisioningRequiredForCapability(int, int); + method @RequiresPermission(android.Manifest.permission.READ_PRECISE_PHONE_STATE) public void registerFeatureProvisioningChangedCallback(@NonNull java.util.concurrent.Executor, @NonNull android.telephony.ims.ProvisioningManager.FeatureProvisioningCallback) throws android.telephony.ims.ImsException; + method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) @WorkerThread public void setProvisioningStatusForCapability(int, int, boolean); + method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) @WorkerThread public void setRcsProvisioningStatusForCapability(int, int, boolean); + method public void unregisterFeatureProvisioningChangedCallback(@NonNull android.telephony.ims.ProvisioningManager.FeatureProvisioningCallback); + } + + public static class ProvisioningManager.FeatureProvisioningCallback { + ctor public ProvisioningManager.FeatureProvisioningCallback(); + method public void onFeatureProvisioningChanged(int, int, boolean); + method public void onRcsFeatureProvisioningChanged(int, int, boolean); + } + public class RcsUceAdapter { method @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) public boolean isUceSettingEnabled() throws android.telephony.ims.ImsException; } @@ -42714,6 +42732,27 @@ package android.telephony.ims.feature { field public static final int CAPABILITY_TYPE_VOICE = 1; // 0x1 } + public class RcsFeature { + } + + public static class RcsFeature.RcsImsCapabilities { + field public static final int CAPABILITY_TYPE_NONE = 0; // 0x0 + field public static final int CAPABILITY_TYPE_OPTIONS_UCE = 1; // 0x1 + field public static final int CAPABILITY_TYPE_PRESENCE_UCE = 2; // 0x2 + } + +} + +package android.telephony.ims.stub { + + public class ImsRegistrationImplBase { + 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 + field public static final int REGISTRATION_TECH_NONE = -1; // 0xffffffff + field public static final int REGISTRATION_TECH_NR = 3; // 0x3 + } + } package android.telephony.mbms { diff --git a/core/api/system-current.txt b/core/api/system-current.txt index a97eb25861b5..ce5794014ad7 100644 --- a/core/api/system-current.txt +++ b/core/api/system-current.txt @@ -13159,18 +13159,16 @@ package android.telephony.ims { public class ProvisioningManager { method @NonNull public static android.telephony.ims.ProvisioningManager createForSubscriptionId(int); method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) @WorkerThread public int getProvisioningIntValue(int); - method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) @WorkerThread public boolean getProvisioningStatusForCapability(int, int); method @Nullable @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) @WorkerThread public String getProvisioningStringValue(int); - method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) @WorkerThread public boolean getRcsProvisioningStatusForCapability(int); + method @Deprecated @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) @WorkerThread public boolean getRcsProvisioningStatusForCapability(int); method @RequiresPermission(anyOf={android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE, android.Manifest.permission.PERFORM_IMS_SINGLE_REGISTRATION}) public boolean isRcsVolteSingleRegistrationCapable() throws android.telephony.ims.ImsException; method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void notifyRcsAutoConfigurationReceived(@NonNull byte[], boolean); method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public void registerProvisioningChangedCallback(@NonNull java.util.concurrent.Executor, @NonNull android.telephony.ims.ProvisioningManager.Callback) throws android.telephony.ims.ImsException; method @RequiresPermission(anyOf={android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE, android.Manifest.permission.PERFORM_IMS_SINGLE_REGISTRATION}) public void registerRcsProvisioningCallback(@NonNull java.util.concurrent.Executor, @NonNull android.telephony.ims.ProvisioningManager.RcsProvisioningCallback) throws android.telephony.ims.ImsException; method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) @WorkerThread public int setProvisioningIntValue(int, int); - method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) @WorkerThread public void setProvisioningStatusForCapability(int, int, boolean); method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) @WorkerThread public int setProvisioningStringValue(int, @NonNull String); method @RequiresPermission(android.Manifest.permission.PERFORM_IMS_SINGLE_REGISTRATION) public void setRcsClientConfiguration(@NonNull android.telephony.ims.RcsClientConfiguration) throws android.telephony.ims.ImsException; - method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) @WorkerThread public void setRcsProvisioningStatusForCapability(int, boolean); + method @Deprecated @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) @WorkerThread public void setRcsProvisioningStatusForCapability(int, boolean); method @RequiresPermission(android.Manifest.permission.PERFORM_IMS_SINGLE_REGISTRATION) public void triggerRcsReconfiguration(); method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public void unregisterProvisioningChangedCallback(@NonNull android.telephony.ims.ProvisioningManager.Callback); method @RequiresPermission(anyOf={android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE, android.Manifest.permission.PERFORM_IMS_SINGLE_REGISTRATION}) public void unregisterRcsProvisioningCallback(@NonNull android.telephony.ims.ProvisioningManager.RcsProvisioningCallback); @@ -13605,9 +13603,6 @@ package android.telephony.ims.feature { method public void addCapabilities(int); method public boolean isCapable(int); method public void removeCapabilities(int); - field public static final int CAPABILITY_TYPE_NONE = 0; // 0x0 - field public static final int CAPABILITY_TYPE_OPTIONS_UCE = 1; // 0x1 - field public static final int CAPABILITY_TYPE_PRESENCE_UCE = 2; // 0x2 } } @@ -13757,11 +13752,6 @@ package android.telephony.ims.stub { method public void triggerFullNetworkRegistration(@IntRange(from=100, to=699) int, @Nullable String); method public void triggerSipDelegateDeregistration(); method public void updateSipDelegateRegistration(); - 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 - field public static final int REGISTRATION_TECH_NONE = -1; // 0xffffffff - field public static final int REGISTRATION_TECH_NR = 3; // 0x3 } public class ImsSmsImplBase { diff --git a/telephony/java/android/telephony/CarrierConfigManager.java b/telephony/java/android/telephony/CarrierConfigManager.java index 43d07b962a59..f8a0ca927545 100644 --- a/telephony/java/android/telephony/CarrierConfigManager.java +++ b/telephony/java/android/telephony/CarrierConfigManager.java @@ -4631,6 +4631,36 @@ public class CarrierConfigManager { public static final String KEY_RCS_REQUEST_RETRY_INTERVAL_MILLIS_LONG = KEY_PREFIX + "rcs_request_retry_interval_millis_long"; + /** + * An array of strings, each entry contains a MMTEL capability and registration + * technology tuple that requires provisioning. If a tuple is not present, the + * framework will not require that the tuple requires provisioning before + * enabling the capability. + *

+ * Format for each tuple is two integers separated by a comma. The first + * integer is an integer defined in + * {@link MmTelFeature.MmTelCapabilities.MmTelCapability} and the second integer is + * {@link android.telephony.ims.stub.ImsRegistrationImplBase.ImsRegistrationTech} + * @hide + */ + public static final String KEY_MMTEL_REQUIRES_PROVISIONING_STRING_ARRAY = + KEY_PREFIX + "mmtel_requires_provisioning_string_array"; + + /** + * An array of strings, each entry contains a RCS capability and registration + * technology tuple that requires provisioning. If a tuple is not present, the + * framework will not require that the tuple requires provisioning before + * enabling the capability. + *

+ * Format for each tuple is two integers separated by a comma. The first + * integer is an integer defined in + * {@link RcsFeature.RcsImsCapabilities.RcsImsCapabilityFlag} and the second integer is + * {@link android.telephony.ims.stub.ImsRegistrationImplBase.ImsRegistrationTech} + * @hide + */ + public static final String KEY_RCS_REQUIRES_PROVISIONING_STRING_ARRAY = + KEY_PREFIX + "rcs_requires_provisioning_string_array"; + private Ims() {} private static PersistableBundle getDefaults() { @@ -4666,6 +4696,8 @@ public class CarrierConfigManager { "+g.3gpp.iari-ref=\"urn%3Aurn-7%3A3gpp-application.ims.iari.rcs.chatbot.sa\"", "+g.gsma.rcs.botversion=\"#=1,#=2\"", "+g.gsma.rcs.cpimext"}); + defaults.putStringArray(KEY_MMTEL_REQUIRES_PROVISIONING_STRING_ARRAY, new String[] {}); + defaults.putStringArray(KEY_RCS_REQUIRES_PROVISIONING_STRING_ARRAY, new String[] {}); return defaults; } diff --git a/telephony/java/android/telephony/ImsManager.java b/telephony/java/android/telephony/ImsManager.java index fc76f99cf074..6b9871c3f5d7 100644 --- a/telephony/java/android/telephony/ImsManager.java +++ b/telephony/java/android/telephony/ImsManager.java @@ -160,6 +160,26 @@ public class ImsManager { return new SipDelegateManager(mContext, subscriptionId, sRcsCache, sTelephonyCache); } + + /** + * Create an instance of {@link ProvisioningManager} for the subscription id specified. + *

+ * Provides a ProvisioningManager instance to carrier apps to update carrier provisioning + * information, as well as provides a callback so that apps can listen for changes + * in MMTEL/RCS provisioning + * @param subscriptionId The ID of the subscription that this ProvisioningManager will use. + * @throws IllegalArgumentException if the subscription is invalid. + * @return a ProvisioningManager instance with the specific subscription ID. + */ + @NonNull + public ProvisioningManager getProvisioningManager(int subscriptionId) { + if (!SubscriptionManager.isValidSubscriptionId(subscriptionId)) { + throw new IllegalArgumentException("Invalid subscription ID: " + subscriptionId); + } + + return new ProvisioningManager(subscriptionId); + } + private static IImsRcsController getIImsRcsControllerInterface() { return IImsRcsController.Stub.asInterface( TelephonyFrameworkInitializer diff --git a/telephony/java/android/telephony/ims/ProvisioningManager.java b/telephony/java/android/telephony/ims/ProvisioningManager.java index abc5606e6743..79af344cadd3 100644 --- a/telephony/java/android/telephony/ims/ProvisioningManager.java +++ b/telephony/java/android/telephony/ims/ProvisioningManager.java @@ -33,6 +33,7 @@ import android.telephony.CarrierConfigManager; import android.telephony.SubscriptionManager; import android.telephony.TelephonyFrameworkInitializer; import android.telephony.TelephonyManager; +import android.telephony.ims.aidl.IFeatureProvisioningCallback; import android.telephony.ims.aidl.IImsConfigCallback; import android.telephony.ims.aidl.IRcsConfigCallback; import android.telephony.ims.feature.MmTelFeature; @@ -53,17 +54,11 @@ import java.util.concurrent.Executor; * IMS provisioning keys are defined per carrier or OEM using OMA-DM or other provisioning * applications and may vary. It is up to the carrier and OEM applications to ensure that the * correct provisioning keys are being used when integrating with a vendor's ImsService. - * - * Note: For compatibility purposes, the integer values [0 - 99] used in - * {@link #setProvisioningIntValue(int, int)} have been reserved for existing provisioning keys - * previously defined in the Android framework. Please do not redefine new provisioning keys in this - * range or it may generate collisions with existing keys. Some common constants have also been - * defined in this class to make integrating with other system apps easier. - * @hide */ -@SystemApi public class ProvisioningManager { + private static final String TAG = "ProvisioningManager"; + /**@hide*/ @StringDef(prefix = "STRING_QUERY_RESULT_ERROR_", value = { STRING_QUERY_RESULT_ERROR_GENERIC, @@ -74,14 +69,18 @@ public class ProvisioningManager { /** * The query from {@link #getProvisioningStringValue(int)} has resulted in an unspecified error. + * @hide */ + @SystemApi public static final String STRING_QUERY_RESULT_ERROR_GENERIC = "STRING_QUERY_RESULT_ERROR_GENERIC"; /** * The query from {@link #getProvisioningStringValue(int)} has resulted in an error because the * ImsService implementation was not ready for provisioning queries. + * @hide */ + @SystemApi public static final String STRING_QUERY_RESULT_ERROR_NOT_READY = "STRING_QUERY_RESULT_ERROR_NOT_READY"; @@ -93,12 +92,16 @@ public class ProvisioningManager { /** * The integer result of provisioning for the queried key is disabled. + * @hide */ + @SystemApi public static final int PROVISIONING_VALUE_DISABLED = 0; /** * The integer result of provisioning for the queried key is enabled. + * @hide */ + @SystemApi public static final int PROVISIONING_VALUE_ENABLED = 1; @@ -443,27 +446,31 @@ public class ProvisioningManager { /** * Override the user-defined WiFi Roaming enabled setting for this subscription, defined in - * {@link SubscriptionManager#WFC_ROAMING_ENABLED_CONTENT_URI}, for the purposes of provisioning - * the subscription for WiFi Calling. + * {@link android.telephony.SubscriptionManager#WFC_ROAMING_ENABLED_CONTENT_URI}, + * for the purposes of provisioning the subscription for WiFi Calling. * - * @see #getProvisioningIntValue(int) * @see #setProvisioningIntValue(int, int) + * @see #getProvisioningIntValue(int) + * @hide */ + @SystemApi public static final int KEY_VOICE_OVER_WIFI_ROAMING_ENABLED_OVERRIDE = 26; /** * Override the user-defined WiFi mode for this subscription, defined in - * {@link SubscriptionManager#WFC_MODE_CONTENT_URI}, for the purposes of provisioning - * this subscription for WiFi Calling. + * {@link android.telephony.SubscriptionManager#WFC_MODE_CONTENT_URI}, + * for the purposes of provisioning this subscription for WiFi Calling. * * Valid values for this key are: * {@link ImsMmTelManager#WIFI_MODE_WIFI_ONLY}, * {@link ImsMmTelManager#WIFI_MODE_CELLULAR_PREFERRED}, or * {@link ImsMmTelManager#WIFI_MODE_WIFI_PREFERRED}. * - * @see #getProvisioningIntValue(int) * @see #setProvisioningIntValue(int, int) + * @see #getProvisioningIntValue(int) + * @hide */ + @SystemApi public static final int KEY_VOICE_OVER_WIFI_MODE_OVERRIDE = 27; /** @@ -862,7 +869,9 @@ public class ProvisioningManager { *

Value is in String format. * @see #setProvisioningStringValue(int, String) * @see #getProvisioningStringValue(int) + * @hide */ + @SystemApi public static final int KEY_VOICE_OVER_WIFI_ENTITLEMENT_ID = 67; /** @@ -884,7 +893,9 @@ public class ProvisioningManager { /** * Callback for IMS provisioning changes. + * @hide */ + @SystemApi public static class Callback { private static class CallbackBinder extends IImsConfigCallback.Stub { @@ -954,11 +965,105 @@ public class ProvisioningManager { } } + /** + * Callback for IMS provisioning feature changes. + */ + public static class FeatureProvisioningCallback { + + private static class CallbackBinder extends IFeatureProvisioningCallback.Stub { + + private final FeatureProvisioningCallback mFeatureProvisioningCallback; + private Executor mExecutor; + + private CallbackBinder(FeatureProvisioningCallback featureProvisioningCallback) { + mFeatureProvisioningCallback = featureProvisioningCallback; + } + + @Override + public final void onFeatureProvisioningChanged( + int capability, int tech, boolean isProvisioned) { + final long callingIdentity = Binder.clearCallingIdentity(); + try { + mExecutor.execute(() -> + mFeatureProvisioningCallback.onFeatureProvisioningChanged( + capability, tech, isProvisioned)); + } finally { + restoreCallingIdentity(callingIdentity); + } + } + + @Override + public final void onRcsFeatureProvisioningChanged( + int capability, int tech, boolean isProvisioned) { + final long callingIdentity = Binder.clearCallingIdentity(); + try { + mExecutor.execute(() -> + mFeatureProvisioningCallback.onRcsFeatureProvisioningChanged( + capability, tech, isProvisioned)); + } finally { + restoreCallingIdentity(callingIdentity); + } + } + + private void setExecutor(Executor executor) { + mExecutor = executor; + } + } + + private final CallbackBinder mBinder = new CallbackBinder(this); + + /** + * The IMS MMTEL provisioning has changed for a specific capability and IMS + * registration technology. + * @param capability The MMTEL capability that provisioning has changed for. + * @param tech The IMS registration technology associated with the MMTEL capability that + * provisioning has changed for. + * @param isProvisioned {@code true} if the capability is provisioned for the technology + * specified, or {@code false} if the capability is not provisioned for the technology + * specified. + */ + public void onFeatureProvisioningChanged( + @MmTelFeature.MmTelCapabilities.MmTelCapability int capability, + @ImsRegistrationImplBase.ImsRegistrationTech int tech, + boolean isProvisioned) { + // Base Implementation + } + + /** + * The IMS RCS provisioning has changed for a specific capability and IMS + * registration technology. + * @param capability The RCS capability that provisioning has changed for. + * @param tech The IMS registration technology associated with the RCS capability that + * provisioning has changed for. + * @param isProvisioned {@code true} if the capability is provisioned for the technology + * specified, or {@code false} if the capability is not provisioned for the technology + * specified. + */ + public void onRcsFeatureProvisioningChanged( + @RcsFeature.RcsImsCapabilities.RcsImsCapabilityFlag int capability, + @ImsRegistrationImplBase.ImsRegistrationTech int tech, + boolean isProvisioned) { + // Base Implementation + } + + /**@hide*/ + public final IFeatureProvisioningCallback getBinder() { + return mBinder; + } + + /**@hide*/ + public void setExecutor(Executor executor) { + mBinder.setExecutor(executor); + } + } + private int mSubId; /** * The callback for RCS provisioning changes. + * @hide */ + @SystemApi public static class RcsProvisioningCallback { private static class CallbackBinder extends IRcsConfigCallback.Stub { @@ -1096,7 +1201,9 @@ public class ProvisioningManager { * @param subId The ID of the subscription that this ProvisioningManager will use. * @see android.telephony.SubscriptionManager#getActiveSubscriptionInfoList() * @throws IllegalArgumentException if the subscription is invalid. + * @hide */ + @SystemApi public static @NonNull ProvisioningManager createForSubscriptionId(int subId) { if (!SubscriptionManager.isValidSubscriptionId(subId)) { throw new IllegalArgumentException("Invalid subscription ID"); @@ -1105,7 +1212,9 @@ public class ProvisioningManager { return new ProvisioningManager(subId); } - private ProvisioningManager(int subId) { + /**@hide*/ + //@SystemApi + public ProvisioningManager(int subId) { mSubId = subId; } @@ -1114,6 +1223,12 @@ public class ProvisioningManager { * * When the subscription associated with this callback is removed (SIM removed, ESIM swap, * etc...), this callback will automatically be removed. + * + *

Requires Permission: + *

    + *
  • {@link android.Manifest.permission#READ_PRIVILEGED_PHONE_STATE},
  • + *
+ * * @param executor The {@link Executor} to call the callback methods on * @param callback The provisioning callbackto be registered. * @see #unregisterProvisioningChangedCallback(Callback) @@ -1124,7 +1239,9 @@ public class ProvisioningManager { * the {@link ImsService} associated with the subscription is not available. This can happen if * the service crashed, for example. See {@link ImsException#getCode()} for a more detailed * reason. + * @hide */ + @SystemApi @RequiresPermission(Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public void registerProvisioningChangedCallback(@NonNull @CallbackExecutor Executor executor, @NonNull Callback callback) throws ImsException { @@ -1142,12 +1259,20 @@ public class ProvisioningManager { * Unregister an existing {@link Callback}. When the subscription associated with this * callback is removed (SIM removed, ESIM swap, etc...), this callback will automatically be * removed. If this method is called for an inactive subscription, it will result in a no-op. + * + *

Requires Permission: + *

    + *
  • {@link android.Manifest.permission#READ_PRIVILEGED_PHONE_STATE},
  • + *
+ * * @param callback The existing {@link Callback} to be removed. * @see #registerProvisioningChangedCallback(Executor, Callback) * * @throws IllegalArgumentException if the subscription associated with this callback is * invalid. + * @hide */ + @SystemApi @RequiresPermission(Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public void unregisterProvisioningChangedCallback(@NonNull Callback callback) { try { @@ -1157,6 +1282,62 @@ public class ProvisioningManager { } } + /** + * Register a new {@link FeatureProvisioningCallback}, which is used to listen for + * IMS feature provisioning updates. + *

+ * When the subscription associated with this callback is removed (SIM removed, + * ESIM swap,etc...), this callback will automatically be removed. + * + *

Requires Permission: + *

    + *
  • android.Manifest.permission#READ_PRIVILEGED_PHONE_STATE,
  • + *
  • {@link android.Manifest.permission#READ_PRECISE_PHONE_STATE},
  • + *
  • or that the caller has carrier privileges (see + * {@link TelephonyManager#hasCarrierPrivileges()}).
  • + *
+ * + * @param executor The executor that the callback methods will be called on. + * @param callback The callback instance being registered. + * @throws ImsException if the subscription associated with this callback is + * valid, but the {@link ImsService the service crashed, for example. See + * {@link ImsException#getCode()} for a more detailed reason. + */ + @RequiresPermission(Manifest.permission.READ_PRECISE_PHONE_STATE) + public void registerFeatureProvisioningChangedCallback( + @NonNull @CallbackExecutor Executor executor, + @NonNull FeatureProvisioningCallback callback) throws ImsException { + callback.setExecutor(executor); + try { + getITelephony().registerFeatureProvisioningChangedCallback(mSubId, + callback.getBinder()); + } catch (ServiceSpecificException e) { + throw new ImsException(e.getMessage(), e.errorCode); + } catch (RemoteException | IllegalStateException e) { + throw new ImsException(e.getMessage(), ImsException.CODE_ERROR_SERVICE_UNAVAILABLE); + } + } + + /** + * Unregisters a previously registered {@link FeatureProvisioningCallback} + * instance. When the subscription associated with this + * callback is removed (SIM removed, ESIM swap, etc...), this callback will + * automatically be removed. If this method is called for an inactive + * subscription, it will result in a no-op. + * + * @param callback The existing {@link FeatureProvisioningCallback} to be removed. + * @see #registerFeatureProvisioningChangedCallback(Executor, FeatureProvisioningCallback) + */ + public void unregisterFeatureProvisioningChangedCallback( + @NonNull FeatureProvisioningCallback callback) { + try { + getITelephony().unregisterFeatureProvisioningChangedCallback(mSubId, + callback.getBinder()); + } catch (RemoteException e) { + throw e.rethrowAsRuntimeException(); + } + } + /** * Query for the integer value associated with the provided key. * @@ -1166,7 +1347,9 @@ public class ProvisioningManager { * @return an integer value for the provided key, or * {@link ImsConfigImplBase#CONFIG_RESULT_UNKNOWN} if the key doesn't exist. * @throws IllegalArgumentException if the key provided was invalid. + * @hide */ + @SystemApi @WorkerThread @RequiresPermission(Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public int getProvisioningIntValue(int key) { @@ -1186,7 +1369,9 @@ public class ProvisioningManager { * @return a String value for the provided key, {@code null} if the key doesn't exist, or * {@link StringResultError} if there was an error getting the value for the provided key. * @throws IllegalArgumentException if the key provided was invalid. + * @hide */ + @SystemApi @WorkerThread @RequiresPermission(Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public @Nullable @StringResultError String getProvisioningStringValue(int key) { @@ -1207,7 +1392,15 @@ public class ProvisioningManager { * @param key An integer that represents the provisioning key, which is defined by the OEM. * @param value a integer value for the provided key. * @return the result of setting the configuration value. + * @hide + * + * Note: For compatibility purposes, the integer values [0 - 99] used in + * {@link #setProvisioningIntValue(int, int)} have been reserved for existing provisioning keys + * previously defined in the Android framework. Please do not redefine new provisioning keys + * in this range or it may generate collisions with existing keys. Some common constants have + * also been defined in this class to make integrating with other system apps easier. */ + @SystemApi @WorkerThread @RequiresPermission(Manifest.permission.MODIFY_PHONE_STATE) public @ImsConfigImplBase.SetConfigResult int setProvisioningIntValue(int key, int value) { @@ -1227,7 +1420,9 @@ public class ProvisioningManager { * should be appropriately namespaced to avoid collision. * @param value a String value for the provided key. * @return the result of setting the configuration value. + * @hide */ + @SystemApi @WorkerThread @RequiresPermission(Manifest.permission.MODIFY_PHONE_STATE) public @ImsConfigImplBase.SetConfigResult int setProvisioningStringValue(int key, @@ -1247,6 +1442,13 @@ public class ProvisioningManager { * does not support the capability/technology combination specified, this operation will be a * no-op. * + *

Requires Permission: + *

    + *
  • {@link android.Manifest.permission#MODIFY_PHONE_STATE},
  • + *
  • or that the calling app has carrier privileges (see
  • + *
  • {@link TelephonyManager#hasCarrierPrivileges}).
  • + *
+ * * @see CarrierConfigManager#KEY_CARRIER_UT_PROVISIONING_REQUIRED_BOOL * @see CarrierConfigManager#KEY_CARRIER_VOLTE_PROVISIONING_REQUIRED_BOOL * @param isProvisioned true if the device is provisioned for UT over IMS, false otherwise. @@ -1256,9 +1458,10 @@ public class ProvisioningManager { public void setProvisioningStatusForCapability( @MmTelFeature.MmTelCapabilities.MmTelCapability int capability, @ImsRegistrationImplBase.ImsRegistrationTech int tech, boolean isProvisioned) { + try { getITelephony().setImsProvisioningStatusForCapability(mSubId, capability, tech, - isProvisioned); + isProvisioned); } catch (RemoteException e) { throw e.rethrowAsRuntimeException(); } @@ -1272,6 +1475,14 @@ public class ProvisioningManager { * {@link ImsRegistrationImplBase.ImsRegistrationTech} combination specified, this method will * always return {@code true}. * + *

Requires Permission: + *

    + *
  • android.Manifest.permission#READ_PRIVILEGED_PHONE_STATE,
  • + *
  • {@link android.Manifest.permission#READ_PRECISE_PHONE_STATE},
  • + *
  • or that the caller has carrier privileges (see + * {@link TelephonyManager#hasCarrierPrivileges()}).
  • + *
+ * * @see CarrierConfigManager#KEY_CARRIER_UT_PROVISIONING_REQUIRED_BOOL * @see CarrierConfigManager#KEY_CARRIER_VOLTE_PROVISIONING_REQUIRED_BOOL * @return true if the device is provisioned for the capability or does not require @@ -1279,7 +1490,7 @@ public class ProvisioningManager { * provisioned yet. */ @WorkerThread - @RequiresPermission(Manifest.permission.READ_PRIVILEGED_PHONE_STATE) + @RequiresPermission(Manifest.permission.READ_PRECISE_PHONE_STATE) public boolean getProvisioningStatusForCapability( @MmTelFeature.MmTelCapabilities.MmTelCapability int capability, @ImsRegistrationImplBase.ImsRegistrationTech int tech) { @@ -1297,17 +1508,92 @@ public class ProvisioningManager { * {@link RcsFeature.RcsImsCapabilities.RcsImsCapabilityFlag} this method will always return * {@code true}. * - * @see CarrierConfigManager#KEY_CARRIER_RCS_PROVISIONING_REQUIRED_BOOL + * @see CarrierConfigManager.Ims#KEY_CARRIER_RCS_PROVISIONING_REQUIRED_BOOL * @return true if the device is provisioned for the capability or does not require * provisioning, false if the capability does require provisioning and has not been * provisioned yet. + * @deprecated Use {@link #getRcsProvisioningStatusForCapability(int, int)} instead, + * as this only retrieves provisioning information for + * {@link ImsRegistrationImplBase#REGISTRATION_TECH_LTE} + * @hide */ + @Deprecated + @SystemApi @WorkerThread @RequiresPermission(Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public boolean getRcsProvisioningStatusForCapability( @RcsFeature.RcsImsCapabilities.RcsImsCapabilityFlag int capability) { try { - return getITelephony().getRcsProvisioningStatusForCapability(mSubId, capability); + return getITelephony().getRcsProvisioningStatusForCapability(mSubId, capability, + ImsRegistrationImplBase.REGISTRATION_TECH_LTE); + } catch (RemoteException e) { + throw e.rethrowAsRuntimeException(); + } + } + + /** + * Get the provisioning status for the IMS RCS capability specified. + * + * If provisioning is not required for the queried + * {@link RcsFeature.RcsImsCapabilities.RcsImsCapabilityFlag} this method + * will always return {@code true}. + * + *

Requires Permission: + *

    + *
  • {@link android.Manifest.permission#READ_PRECISE_PHONE_STATE},
  • + *
  • or that the caller has carrier privileges (see + * {@link TelephonyManager#hasCarrierPrivileges()}).
  • + *
+ * + * @return true if the device is provisioned for the capability or does not require + * provisioning, false if the capability does require provisioning and has not been + * provisioned yet. + */ + @WorkerThread + @RequiresPermission(Manifest.permission.READ_PRECISE_PHONE_STATE) + public boolean getRcsProvisioningStatusForCapability( + @RcsFeature.RcsImsCapabilities.RcsImsCapabilityFlag int capability, + @ImsRegistrationImplBase.ImsRegistrationTech int tech) { + try { + return getITelephony().getRcsProvisioningStatusForCapability(mSubId, capability, tech); + } catch (RemoteException e) { + throw e.rethrowAsRuntimeException(); + } + } + + /** + * Set the provisioning status for the IMS RCS capability using the specified subscription. + * + *

Requires Permission: + *

    + *
  • {@link android.Manifest.permission#MODIFY_PHONE_STATE}
  • + *
  • or that the caller has carrier privileges (see + * {@link TelephonyManager#hasCarrierPrivileges()}).
  • + *
+ + * Provisioning may or may not be required, depending on the carrier configuration. If + * provisioning is not required for the carrier associated with this subscription or the device + * does not support the capability/technology combination specified, this operation will be a + * no-op. + * + * @see CarrierConfigManager#KEY_CARRIER_RCS_PROVISIONING_REQUIRED_BOOL + * @param isProvisioned true if the device is provisioned for the RCS capability specified, + * false otherwise. + * @deprecated Use {@link #setRcsProvisioningStatusForCapability(int, int, boolean)} instead, + * as this method only sets provisioning information for + * {@link ImsRegistrationImplBase#REGISTRATION_TECH_LTE} + * @hide + */ + @Deprecated + @SystemApi + @WorkerThread + @RequiresPermission(Manifest.permission.MODIFY_PHONE_STATE) + public void setRcsProvisioningStatusForCapability( + @RcsFeature.RcsImsCapabilities.RcsImsCapabilityFlag int capability, + boolean isProvisioned) { + try { + getITelephony().setRcsProvisioningStatusForCapability(mSubId, capability, + ImsRegistrationImplBase.REGISTRATION_TECH_LTE, isProvisioned); } catch (RemoteException e) { throw e.rethrowAsRuntimeException(); } @@ -1321,7 +1607,13 @@ public class ProvisioningManager { * does not support the capability/technology combination specified, this operation will be a * no-op. * - * @see CarrierConfigManager#KEY_CARRIER_RCS_PROVISIONING_REQUIRED_BOOL + *

Requires Permission: + *

    + *
  • {@link android.Manifest.permission#MODIFY_PHONE_STATE},
  • + *
  • or that the caller has carrier privileges (see + * {@link TelephonyManager#hasCarrierPrivileges()}).
  • + *
+ * * @param isProvisioned true if the device is provisioned for the RCS capability specified, * false otherwise. */ @@ -1329,31 +1621,92 @@ public class ProvisioningManager { @RequiresPermission(Manifest.permission.MODIFY_PHONE_STATE) public void setRcsProvisioningStatusForCapability( @RcsFeature.RcsImsCapabilities.RcsImsCapabilityFlag int capability, - boolean isProvisioned) { + @ImsRegistrationImplBase.ImsRegistrationTech int tech, boolean isProvisioned) { try { getITelephony().setRcsProvisioningStatusForCapability(mSubId, capability, - isProvisioned); + tech, isProvisioned); } catch (RemoteException e) { throw e.rethrowAsRuntimeException(); } } + /** + * Indicates whether provisioning for the MMTEL capability and IMS registration technology + * specified is required or not + * + *

Requires Permission: + *

    + *
  • android.Manifest.permission#READ_PRIVILEGED_PHONE_STATE,
  • + *
  • {@link android.Manifest.permission#READ_PRECISE_PHONE_STATE},
  • + *
  • or that the caller has carrier privileges (see + * {@link TelephonyManager#hasCarrierPrivileges()}).
  • + *
+ * + * @return true if provisioning is required for the MMTEL capability and IMS + * registration technology specified, false if it is not required. + */ + @RequiresPermission(Manifest.permission.READ_PRECISE_PHONE_STATE) + public boolean isProvisioningRequiredForCapability( + @MmTelFeature.MmTelCapabilities.MmTelCapability int capability, + @ImsRegistrationImplBase.ImsRegistrationTech int tech) { + try { + return getITelephony().isProvisioningRequiredForCapability(mSubId, capability, tech); + } catch (RemoteException e) { + throw e.rethrowAsRuntimeException(); + } + } + + + /** + * Indicates whether provisioning for the RCS capability and IMS registration technology + * specified is required or not + * + *

Requires Permission: + *

    + *
  • android.Manifest.permission#READ_PRIVILEGED_PHONE_STATE,
  • + *
  • {@link android.Manifest.permission#READ_PRECISE_PHONE_STATE},
  • + *
  • or that the caller has carrier privileges (see + * {@link TelephonyManager#hasCarrierPrivileges()}).
  • + *
+ * + * @return true if provisioning is required for the RCS capability and IMS + * registration technology specified, false if it is not required. + */ + @RequiresPermission(Manifest.permission.READ_PRECISE_PHONE_STATE) + public boolean isRcsProvisioningRequiredForCapability( + @RcsFeature.RcsImsCapabilities.RcsImsCapabilityFlag int capability, + @ImsRegistrationImplBase.ImsRegistrationTech int tech) { + try { + return getITelephony().isRcsProvisioningRequiredForCapability(mSubId, capability, tech); + } catch (RemoteException e) { + throw e.rethrowAsRuntimeException(); + } + } + + /** * Notify the framework that an RCS autoconfiguration XML file has been received for * provisioning. - *

- * Requires Permission: Manifest.permission.MODIFY_PHONE_STATE or that the calling app has - * carrier privileges (see {@link TelephonyManager#hasCarrierPrivileges}). + * + *

Requires Permission: + *

    + *
  • {@link Manifest.permission#MODIFY_PHONE_STATE},
  • + *
  • or that the calling app has carrier privileges (see + * {@link TelephonyManager#hasCarrierPrivileges()}).
  • + *
+ * * @param config The XML file to be read. ASCII/UTF8 encoded text if not compressed. * @param isCompressed The XML file is compressed in gzip format and must be decompressed * before being read. - * + * @hide */ + @SystemApi @RequiresPermission(Manifest.permission.MODIFY_PHONE_STATE) public void notifyRcsAutoConfigurationReceived(@NonNull byte[] config, boolean isCompressed) { if (config == null) { throw new IllegalArgumentException("Must include a non-null config XML file."); } + try { getITelephony().notifyRcsAutoConfigurationReceived(mSubId, config, isCompressed); } catch (RemoteException e) { @@ -1372,7 +1725,9 @@ public class ProvisioningManager { *

Contains {@link #EXTRA_SUBSCRIPTION_ID} to specify the subscription index for which * the intent is valid. and {@link #EXTRA_STATUS} to specify RCS VoLTE single registration * status. + * @hide */ + @SystemApi @RequiresPermission(Manifest.permission.PERFORM_IMS_SINGLE_REGISTRATION) @SdkConstant(SdkConstant.SdkConstantType.BROADCAST_INTENT_ACTION) public static final String ACTION_RCS_SINGLE_REGISTRATION_CAPABILITY_UPDATE = @@ -1380,7 +1735,9 @@ public class ProvisioningManager { /** * Integer extra to specify subscription index. + * @hide */ + @SystemApi public static final String EXTRA_SUBSCRIPTION_ID = "android.telephony.ims.extra.SUBSCRIPTION_ID"; @@ -1390,22 +1747,30 @@ public class ProvisioningManager { *

The value can be {@link #STATUS_CAPABLE}, {@link #STATUS_DEVICE_NOT_CAPABLE}, * {@link #STATUS_CARRIER_NOT_CAPABLE}, or bitwise OR of * {@link #STATUS_DEVICE_NOT_CAPABLE} and {@link #STATUS_CARRIER_NOT_CAPABLE}. + * @hide */ + @SystemApi public static final String EXTRA_STATUS = "android.telephony.ims.extra.STATUS"; /** * RCS VoLTE single registration is supported by the device and carrier. + * @hide */ + @SystemApi public static final int STATUS_CAPABLE = 0; /** * RCS VoLTE single registration is not supported by the device. + * @hide */ + @SystemApi public static final int STATUS_DEVICE_NOT_CAPABLE = 0x01; /** * RCS VoLTE single registration is not supported by the carrier + * @hide */ + @SystemApi public static final int STATUS_CARRIER_NOT_CAPABLE = 0x01 << 1; /** @@ -1415,11 +1780,14 @@ public class ProvisioningManager { * provisioning is done using autoconfiguration, then these parameters shall be * sent in the HTTP get request to fetch the RCS provisioning. RCS client * configuration must be provided by the application before registering for the - * provisioning status events {@link #registerRcsProvisioningCallback()} + * provisioning status events + * {@link #registerRcsProvisioningCallback(Executor, RcsProvisioningCallback)} * When the IMS/RCS service receives the RCS client configuration, it will detect * the change in the configuration, and trigger the auto-configuration as needed. * @param rcc RCS client configuration {@link RcsClientConfiguration} + * @hide */ + @SystemApi @RequiresPermission(Manifest.permission.PERFORM_IMS_SINGLE_REGISTRATION) public void setRcsClientConfiguration( @NonNull RcsClientConfiguration rcc) throws ImsException { @@ -1440,18 +1808,21 @@ public class ProvisioningManager { *

    *
  • {@link android.Manifest.permission#READ_PRIVILEGED_PHONE_STATE},
  • *
  • {@link android.Manifest.permission#PERFORM_IMS_SINGLE_REGISTRATION},
  • - *
  • or that the caller has carrier privileges (see + *
  • or that the calling app has carrier privileges (see * {@link TelephonyManager#hasCarrierPrivileges()}).
  • *
+ * * @return true if IMS single registration is capable at this time, or false otherwise - * @throws ImsException If the remote ImsService is not available for - * any reason or the subscription associated with this instance is no - * longer active. See {@link ImsException#getCode()} for more - * information. + * @throws ImsException If the remote ImsService is not available for any reason or + * the subscription associated with this instance is no longer active. + * See {@link ImsException#getCode()} for more information. * @see PackageManager#FEATURE_TELEPHONY_IMS_SINGLE_REGISTRATION for whether or not this * device supports IMS single registration. + * @hide */ - @RequiresPermission(anyOf = {Manifest.permission.READ_PRIVILEGED_PHONE_STATE, + @SystemApi + @RequiresPermission(anyOf = { + Manifest.permission.READ_PRIVILEGED_PHONE_STATE, Manifest.permission.PERFORM_IMS_SINGLE_REGISTRATION}) public boolean isRcsVolteSingleRegistrationCapable() throws ImsException { try { @@ -1478,8 +1849,6 @@ public class ProvisioningManager { *
    *
  • {@link android.Manifest.permission#READ_PRIVILEGED_PHONE_STATE},
  • *
  • {@link android.Manifest.permission#PERFORM_IMS_SINGLE_REGISTRATION},
  • - *
  • or that the caller has carrier privileges (see - * {@link TelephonyManager#hasCarrierPrivileges()}).
  • *
* * @param executor The {@link Executor} to call the callback methods on @@ -1497,8 +1866,11 @@ public class ProvisioningManager { * params (See {@link #setRcsClientConfiguration}) and re register the * callback. * See {@link ImsException#getCode()} for a more detailed reason. + * @hide */ - @RequiresPermission(anyOf = {Manifest.permission.READ_PRIVILEGED_PHONE_STATE, + @SystemApi + @RequiresPermission(anyOf = { + Manifest.permission.READ_PRIVILEGED_PHONE_STATE, Manifest.permission.PERFORM_IMS_SINGLE_REGISTRATION}) public void registerRcsProvisioningCallback( @NonNull @CallbackExecutor Executor executor, @@ -1525,8 +1897,6 @@ public class ProvisioningManager { *
    *
  • {@link android.Manifest.permission#READ_PRIVILEGED_PHONE_STATE},
  • *
  • {@link android.Manifest.permission#PERFORM_IMS_SINGLE_REGISTRATION},
  • - *
  • or that the caller has carrier privileges (see - * {@link TelephonyManager#hasCarrierPrivileges()}).
  • *
* * @param callback The existing {@link RcsProvisioningCallback} to be @@ -1534,8 +1904,11 @@ public class ProvisioningManager { * @see #registerRcsProvisioningCallback(Executor, RcsProvisioningCallback) * @throws IllegalArgumentException if the subscription associated with * this callback is invalid. + * @hide */ - @RequiresPermission(anyOf = {Manifest.permission.READ_PRIVILEGED_PHONE_STATE, + @SystemApi + @RequiresPermission(anyOf = { + Manifest.permission.READ_PRIVILEGED_PHONE_STATE, Manifest.permission.PERFORM_IMS_SINGLE_REGISTRATION}) public void unregisterRcsProvisioningCallback( @NonNull RcsProvisioningCallback callback) { @@ -1556,9 +1929,10 @@ public class ProvisioningManager { * {@link RcsProvisioningCallback} may expect to receive * {@link RcsProvisioningCallback#onConfigurationReset}, then * {@link RcsProvisioningCallback#onConfigurationChanged} when the new - * RCS configuration is received and notified by - * {@link #notifyRcsAutoConfigurationReceived} + * RCS configuration is received and notified by {@link #notifyRcsAutoConfigurationReceived} + * @hide */ + @SystemApi @RequiresPermission(Manifest.permission.PERFORM_IMS_SINGLE_REGISTRATION) public void triggerRcsReconfiguration() { try { diff --git a/telephony/java/android/telephony/ims/aidl/IFeatureProvisioningCallback.aidl b/telephony/java/android/telephony/ims/aidl/IFeatureProvisioningCallback.aidl new file mode 100644 index 000000000000..63ec4aaf1f48 --- /dev/null +++ b/telephony/java/android/telephony/ims/aidl/IFeatureProvisioningCallback.aidl @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +package android.telephony.ims.aidl; + +/** + * Provides callback interface for FeatureProvisioning when a value has changed. + * + * {@hide} + */ +oneway interface IFeatureProvisioningCallback { + void onFeatureProvisioningChanged(int capability, int tech, boolean isProvisioned); + void onRcsFeatureProvisioningChanged(int capability, int tech, boolean isProvisioned); +} diff --git a/telephony/java/android/telephony/ims/feature/MmTelFeature.java b/telephony/java/android/telephony/ims/feature/MmTelFeature.java index 7fdf21b3e5ff..ad2e9e133a11 100644 --- a/telephony/java/android/telephony/ims/feature/MmTelFeature.java +++ b/telephony/java/android/telephony/ims/feature/MmTelFeature.java @@ -393,6 +393,13 @@ public class MmTelFeature extends ImsFeature { @Retention(RetentionPolicy.SOURCE) public @interface MmTelCapability {} + /** + * Undefined capability type for initialization + * This is used to check the upper range of MmTel capability + * {@hide} + */ + public static final int CAPABILITY_TYPE_NONE = 0; + /** * This MmTelFeature supports Voice calling (IR.92) */ @@ -418,6 +425,12 @@ public class MmTelFeature extends ImsFeature { */ public static final int CAPABILITY_TYPE_CALL_COMPOSER = 1 << 4; + /** + * This is used to check the upper range of MmTel capability + * {@hide} + */ + public static final int CAPABILITY_TYPE_MAX = CAPABILITY_TYPE_CALL_COMPOSER + 1; + /** * @hide */ diff --git a/telephony/java/android/telephony/ims/feature/RcsFeature.java b/telephony/java/android/telephony/ims/feature/RcsFeature.java index 11cf0e3f7855..af7373b376d5 100644 --- a/telephony/java/android/telephony/ims/feature/RcsFeature.java +++ b/telephony/java/android/telephony/ims/feature/RcsFeature.java @@ -59,9 +59,7 @@ import java.util.function.Supplier; /** * Base implementation of the RcsFeature APIs. Any ImsService wishing to support RCS should extend * this class and provide implementations of the RcsFeature methods that they support. - * @hide */ -@SystemApi public class RcsFeature extends ImsFeature { private static final String LOG_TAG = "RcsFeature"; @@ -186,14 +184,14 @@ public class RcsFeature extends ImsFeature { * Contains the capabilities defined and supported by a {@link RcsFeature} in the * form of a bitmask. The capabilities that are used in the RcsFeature are * defined as: - * {@link RcsUceAdatper.RcsImsCapabilityFlag#CAPABILITY_TYPE_OPTIONS_UCE} - * {@link RceUceAdapter.RcsImsCapabilityFlag#CAPABILITY_TYPE_PRESENCE_UCE} + * {RcsUceAdapter.RcsImsCapabilityFlag#CAPABILITY_TYPE_OPTIONS_UCE} + * {RcsUceAdapter.RcsImsCapabilityFlag#CAPABILITY_TYPE_PRESENCE_UCE} * * The enabled capabilities of this RcsFeature will be set by the framework - * using {@link #changeEnabledCapabilities(CapabilityChangeRequest, CapabilityCallbackProxy)}. + * using {#changeEnabledCapabilities(CapabilityChangeRequest, CapabilityCallbackProxy)}. * After the capabilities have been set, the RcsFeature may then perform the necessary bring up * of the capability and notify the capability status as true using - * {@link #notifyCapabilitiesStatusChanged(RcsImsCapabilities)}. This will signal to the + * {#notifyCapabilitiesStatusChanged(RcsImsCapabilities)}. This will signal to the * framework that the capability is available for usage. */ public static class RcsImsCapabilities extends Capabilities { @@ -226,11 +224,19 @@ public class RcsFeature extends ImsFeature { */ public static final int CAPABILITY_TYPE_PRESENCE_UCE = 1 << 1; + /** + * This is used to check the upper range of RCS capability + * {@hide} + */ + public static final int CAPABILITY_TYPE_MAX = CAPABILITY_TYPE_PRESENCE_UCE + 1; + /** * Create a new {@link RcsImsCapabilities} instance with the provided capabilities. * @param capabilities The capabilities that are supported for RCS in the form of a * bitfield. + * @hide */ + @SystemApi public RcsImsCapabilities(@RcsUceAdapter.RcsImsCapabilityFlag int capabilities) { super(capabilities); } @@ -243,17 +249,29 @@ public class RcsFeature extends ImsFeature { super(capabilities.getMask()); } + /** + * @hide + */ @Override + @SystemApi public void addCapabilities(@RcsUceAdapter.RcsImsCapabilityFlag int capabilities) { super.addCapabilities(capabilities); } + /** + * @hide + */ @Override + @SystemApi public void removeCapabilities(@RcsUceAdapter.RcsImsCapabilityFlag int capabilities) { super.removeCapabilities(capabilities); } + /** + * @hide + */ @Override + @SystemApi public boolean isCapable(@RcsUceAdapter.RcsImsCapabilityFlag int capabilities) { return super.isCapable(capabilities); } @@ -270,7 +288,9 @@ public class RcsFeature extends ImsFeature { * Method stubs called from the framework will be called asynchronously. To specify the * {@link Executor} that the methods stubs will be called, use * {@link RcsFeature#RcsFeature(Executor)} instead. + * @hide */ + @SystemApi public RcsFeature() { super(); // Run on the Binder threads that call them. @@ -282,7 +302,9 @@ public class RcsFeature extends ImsFeature { * framework. * @param executor The executor for the framework to use when executing the methods overridden * by the implementation of RcsFeature. + * @hide */ + @SystemApi public RcsFeature(@NonNull Executor executor) { super(); if (executor == null) { @@ -301,7 +323,7 @@ public class RcsFeature extends ImsFeature { * @hide */ @Override - public void initialize(Context context, int slotId) { + public void initialize(@NonNull Context context, @NonNull int slotId) { super.initialize(context, slotId); // Notify that the RcsFeature is ready. mExecutor.execute(() -> onFeatureReady()); @@ -313,8 +335,10 @@ public class RcsFeature extends ImsFeature { * requests. To change the status of the capabilities * {@link #notifyCapabilitiesStatusChanged(RcsImsCapabilities)} should be called. * @return A copy of the current RcsFeature capability status. + * @hide */ @Override + @SystemApi public @NonNull final RcsImsCapabilities queryCapabilityStatus() { return new RcsImsCapabilities(super.queryCapabilityStatus()); } @@ -324,7 +348,9 @@ public class RcsFeature extends ImsFeature { * this signals to the framework that the capability has been initialized and is ready. * Call {@link #queryCapabilityStatus()} to return the current capability status. * @param capabilities The current capability status of the RcsFeature. + * @hide */ + @SystemApi public final void notifyCapabilitiesStatusChanged(@NonNull RcsImsCapabilities capabilities) { if (capabilities == null) { throw new IllegalArgumentException("RcsImsCapabilities must be non-null!"); @@ -341,7 +367,9 @@ public class RcsFeature extends ImsFeature { * @param capability The capability that we are querying the configuration for. * @param radioTech The radio technology type that we are querying. * @return true if the capability is enabled, false otherwise. + * @hide */ + @SystemApi public boolean queryCapabilityConfiguration( @RcsUceAdapter.RcsImsCapabilityFlag int capability, @ImsRegistrationImplBase.ImsRegistrationTech int radioTech) { @@ -364,8 +392,10 @@ public class RcsFeature extends ImsFeature { * be called for each capability change that resulted in an error. * @param request The request to change the capability. * @param callback To notify the framework that the result of the capability changes. + * @hide */ @Override + @SystemApi public void changeEnabledCapabilities(@NonNull CapabilityChangeRequest request, @NonNull CapabilityCallbackProxy callback) { // Base Implementation - Override to provide functionality @@ -385,7 +415,9 @@ public class RcsFeature extends ImsFeature { * event to the framework. * @return An instance of {@link RcsCapabilityExchangeImplBase} that implements capability * exchange if it is supported by the device. + * @hide */ + @SystemApi public @NonNull RcsCapabilityExchangeImplBase createCapabilityExchangeImpl( @NonNull CapabilityExchangeEventListener listener) { // Base Implementation, override to implement functionality @@ -395,20 +427,28 @@ public class RcsFeature extends ImsFeature { /** * Remove the given CapabilityExchangeImplBase instance. * @param capExchangeImpl The {@link RcsCapabilityExchangeImplBase} instance to be destroyed. + * @hide */ + @SystemApi public void destroyCapabilityExchangeImpl( @NonNull RcsCapabilityExchangeImplBase capExchangeImpl) { // Override to implement the process of destroying RcsCapabilityExchangeImplBase instance. } - /**{@inheritDoc}*/ + /**{@inheritDoc} + * @hide + */ @Override + @SystemApi public void onFeatureRemoved() { } - /**{@inheritDoc}*/ + /**{@inheritDoc} + * @hide + */ @Override + @SystemApi public void onFeatureReady() { } @@ -448,7 +488,9 @@ public class RcsFeature extends ImsFeature { * has already been created in the framework. * @param listener A {@link CapabilityExchangeEventListener} to send the capability exchange * event to the framework. + * @hide */ + @SystemApi private void initRcsCapabilityExchangeImplBase( @NonNull CapabilityExchangeEventListener listener) { synchronized (mLock) { diff --git a/telephony/java/android/telephony/ims/stub/ImsRegistrationImplBase.java b/telephony/java/android/telephony/ims/stub/ImsRegistrationImplBase.java index 3b151a422b57..ac5565bea810 100644 --- a/telephony/java/android/telephony/ims/stub/ImsRegistrationImplBase.java +++ b/telephony/java/android/telephony/ims/stub/ImsRegistrationImplBase.java @@ -34,7 +34,6 @@ import com.android.internal.telephony.util.RemoteCallbackListExt; import com.android.internal.telephony.util.TelephonyUtils; import com.android.internal.util.ArrayUtils; - import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.util.concurrent.CancellationException; @@ -51,9 +50,7 @@ import java.util.function.Supplier; *

* Note: There is no guarantee on the thread that the calls from the framework will be called on. It * is the implementors responsibility to handle moving the calls to a working thread if required. - * @hide */ -@SystemApi public class ImsRegistrationImplBase { private static final String LOG_TAG = "ImsRegistrationImplBase"; @@ -94,6 +91,12 @@ public class ImsRegistrationImplBase { */ public static final int REGISTRATION_TECH_NR = 3; + /** + * This is used to check the upper range of registration tech + * {@hide} + */ + public static final int REGISTRATION_TECH_MAX = REGISTRATION_TECH_NR + 1; + // Registration states, used to notify new ImsRegistrationImplBase#Callbacks of the current // state. // The unknown state is set as the initialization state. This is so that we do not call back @@ -109,7 +112,9 @@ public class ImsRegistrationImplBase { * Method stubs called from the framework will be called asynchronously. To specify the * {@link Executor} that the methods stubs will be called, use * {@link ImsRegistrationImplBase#ImsRegistrationImplBase(Executor)} instead. + * @hide This API is not part of the Android public SDK API */ + @SystemApi public ImsRegistrationImplBase() { super(); } @@ -119,7 +124,9 @@ public class ImsRegistrationImplBase { * framework. * @param executor The executor for the framework to use when executing the methods overridden * by the implementation of ImsRegistration. + * @hide This API is not part of the Android public SDK API */ + @SystemApi public ImsRegistrationImplBase(@NonNull Executor executor) { super(); mExecutor = executor; @@ -250,7 +257,9 @@ public class ImsRegistrationImplBase { * If the SIP delegate feature tag configuration has changed, then this method will be * called in order to let the ImsService know that it can pick up these changes in the IMS * registration. + * @hide This API is not part of the Android public SDK API */ + @SystemApi public void updateSipDelegateRegistration() { // Stub implementation, ImsService should implement this } @@ -266,7 +275,9 @@ public class ImsRegistrationImplBase { *

* This should not affect the registration of features managed by the ImsService itself, such as * feature tags related to MMTEL registration. + * @hide This API is not part of the Android public SDK API */ + @SystemApi public void triggerSipDelegateDeregistration() { // Stub implementation, ImsService should implement this } @@ -284,7 +295,9 @@ public class ImsRegistrationImplBase { * be carrier specific. * @param sipReason The reason associated with the SIP error code. {@code null} if there was no * reason associated with the error. + * @hide This API is not part of the Android public SDK API */ + @SystemApi public void triggerFullNetworkRegistration(@IntRange(from = 100, to = 699) int sipCode, @Nullable String sipReason) { // Stub implementation, ImsService should implement this @@ -295,7 +308,9 @@ public class ImsRegistrationImplBase { * Notify the framework that the device is connected to the IMS network. * * @param imsRadioTech the radio access technology. + * @hide This API is not part of the Android public SDK API */ + @SystemApi public final void onRegistered(@ImsRegistrationTech int imsRadioTech) { onRegistered(new ImsRegistrationAttributes.Builder(imsRadioTech).build()); } @@ -304,7 +319,9 @@ public class ImsRegistrationImplBase { * Notify the framework that the device is connected to the IMS network. * * @param attributes The attributes associated with the IMS registration. + * @hide This API is not part of the Android public SDK API */ + @SystemApi public final void onRegistered(@NonNull ImsRegistrationAttributes attributes) { updateToState(attributes, RegistrationManager.REGISTRATION_STATE_REGISTERED); mCallbacks.broadcastAction((c) -> { @@ -320,7 +337,9 @@ public class ImsRegistrationImplBase { * Notify the framework that the device is trying to connect the IMS network. * * @param imsRadioTech the radio access technology. + * @hide This API is not part of the Android public SDK API */ + @SystemApi public final void onRegistering(@ImsRegistrationTech int imsRadioTech) { onRegistering(new ImsRegistrationAttributes.Builder(imsRadioTech).build()); } @@ -329,7 +348,9 @@ public class ImsRegistrationImplBase { * Notify the framework that the device is trying to connect the IMS network. * * @param attributes The attributes associated with the IMS registration. + * @hide This API is not part of the Android public SDK API */ + @SystemApi public final void onRegistering(@NonNull ImsRegistrationAttributes attributes) { updateToState(attributes, RegistrationManager.REGISTRATION_STATE_REGISTERING); mCallbacks.broadcastAction((c) -> { @@ -356,7 +377,9 @@ public class ImsRegistrationImplBase { * result. * * @param info the {@link ImsReasonInfo} associated with why registration was disconnected. + * @hide This API is not part of the Android public SDK API */ + @SystemApi public final void onDeregistered(ImsReasonInfo info) { updateToDisconnectedState(info); // ImsReasonInfo should never be null. @@ -377,7 +400,9 @@ public class ImsRegistrationImplBase { * {@link #REGISTRATION_TECH_LTE}, {@link #REGISTRATION_TECH_IWLAN} and * {@link #REGISTRATION_TECH_CROSS_SIM}. * @param info The {@link ImsReasonInfo} for the failure to change technology. + * @hide This API is not part of the Android public SDK API */ + @SystemApi public final void onTechnologyChangeFailed(@ImsRegistrationTech int imsRadioTech, ImsReasonInfo info) { final ImsReasonInfo reasonInfo = (info != null) ? info : new ImsReasonInfo(); @@ -396,7 +421,9 @@ public class ImsRegistrationImplBase { * * The {@link Uri}s are not guaranteed to be different between subsequent calls. * @param uris changed uris + * @hide This API is not part of the Android public SDK API */ + @SystemApi public final void onSubscriberAssociatedUriChanged(Uri[] uris) { synchronized (mLock) { mUris = ArrayUtils.cloneOrNull(uris); diff --git a/telephony/java/com/android/internal/telephony/ITelephony.aidl b/telephony/java/com/android/internal/telephony/ITelephony.aidl index 167aa07f3ac2..0ac7cf957ecf 100644 --- a/telephony/java/com/android/internal/telephony/ITelephony.aidl +++ b/telephony/java/com/android/internal/telephony/ITelephony.aidl @@ -55,6 +55,7 @@ import android.telephony.VisualVoicemailSmsFilterSettings; import android.telephony.emergency.EmergencyNumber; import android.telephony.ims.RcsClientConfiguration; import android.telephony.ims.RcsContactUceCapability; +import android.telephony.ims.aidl.IFeatureProvisioningCallback; import android.telephony.ims.aidl.IImsCapabilityCallback; import android.telephony.ims.aidl.IImsConfig; import android.telephony.ims.aidl.IImsConfigCallback; @@ -2026,6 +2027,18 @@ interface ITelephony { */ void unregisterImsProvisioningChangedCallback(int subId, IImsConfigCallback callback); + /** + * Register an IMS provisioning change callback with Telephony. + */ + void registerFeatureProvisioningChangedCallback(int subId, + IFeatureProvisioningCallback callback); + + /** + * unregister an existing IMS provisioning change callback. + */ + void unregisterFeatureProvisioningChangedCallback(int subId, + IFeatureProvisioningCallback callback); + /** * Set the provisioning status for the IMS MmTel capability using the specified subscription. */ @@ -2040,19 +2053,12 @@ interface ITelephony { /** * Get the provisioning status for the IMS Rcs capability specified. */ - boolean getRcsProvisioningStatusForCapability(int subId, int capability); + boolean getRcsProvisioningStatusForCapability(int subId, int capability, int tech); /** * Set the provisioning status for the IMS Rcs capability using the specified subscription. */ - void setRcsProvisioningStatusForCapability(int subId, int capability, - boolean isProvisioned); - - /** Is the capability and tech flagged as provisioned in the cache */ - boolean isMmTelCapabilityProvisionedInCache(int subId, int capability, int tech); - - /** Set the provisioning for the capability and tech in the cache */ - void cacheMmTelCapabilityProvisioning(int subId, int capability, int tech, + void setRcsProvisioningStatusForCapability(int subId, int capability, int tech, boolean isProvisioned); /** @@ -2555,4 +2561,18 @@ interface ITelephony { * @return the service name of the modem service which bind to. */ String getModemService(); + + /** + * Is Provisioning required for capability + * @return true if provisioning is required for the MMTEL capability and IMS + * registration technology specified, false if it is not required. + */ + boolean isProvisioningRequiredForCapability(int subId, int capability, int tech); + + /** + * Is RCS Provisioning required for capability + * @return true if provisioning is required for the RCS capability and IMS + * registration technology specified, false if it is not required. + */ + boolean isRcsProvisioningRequiredForCapability(int subId, int capability, int tech); } From 0860f1b1b9944ab7f410f06b0b6da24376f8eb08 Mon Sep 17 00:00:00 2001 From: Hakjun Choi Date: Mon, 17 Jan 2022 09:49:53 +0000 Subject: [PATCH 3/4] Add Provisioning bundle for indicating if MMTEL/RCS provisioning is required Bug: 214885306 Test: CTS ImsServiceTest#testProvisioningManagerWhen(Mmtel/Rcs)ProvisionIs(Not)Required Change-Id: I9e0eff60dde4a9f4ea254fa5f8efedd9f5881632 Merged-In: I9e0eff60dde4a9f4ea254fa5f8efedd9f5881632 --- core/api/current.txt | 15 ++- .../telephony/CarrierConfigManager.java | 123 +++++++++++++++--- .../telephony/ims/ProvisioningManager.java | 8 +- 3 files changed, 119 insertions(+), 27 deletions(-) diff --git a/core/api/current.txt b/core/api/current.txt index 4ce25b827a88..d40fac9807f9 100644 --- a/core/api/current.txt +++ b/core/api/current.txt @@ -39769,11 +39769,11 @@ package android.telephony { field public static final String KEY_CARRIER_SUPPORTS_SS_OVER_UT_BOOL = "carrier_supports_ss_over_ut_bool"; field public static final String KEY_CARRIER_USE_IMS_FIRST_FOR_EMERGENCY_BOOL = "carrier_use_ims_first_for_emergency_bool"; field public static final String KEY_CARRIER_USSD_METHOD_INT = "carrier_ussd_method_int"; - field public static final String KEY_CARRIER_UT_PROVISIONING_REQUIRED_BOOL = "carrier_ut_provisioning_required_bool"; + field @Deprecated public static final String KEY_CARRIER_UT_PROVISIONING_REQUIRED_BOOL = "carrier_ut_provisioning_required_bool"; field public static final String KEY_CARRIER_VOLTE_AVAILABLE_BOOL = "carrier_volte_available_bool"; field public static final String KEY_CARRIER_VOLTE_OVERRIDE_WFC_PROVISIONING_BOOL = "carrier_volte_override_wfc_provisioning_bool"; - field public static final String KEY_CARRIER_VOLTE_PROVISIONED_BOOL = "carrier_volte_provisioned_bool"; - field public static final String KEY_CARRIER_VOLTE_PROVISIONING_REQUIRED_BOOL = "carrier_volte_provisioning_required_bool"; + field @Deprecated public static final String KEY_CARRIER_VOLTE_PROVISIONED_BOOL = "carrier_volte_provisioned_bool"; + field @Deprecated public static final String KEY_CARRIER_VOLTE_PROVISIONING_REQUIRED_BOOL = "carrier_volte_provisioning_required_bool"; field public static final String KEY_CARRIER_VOLTE_TTY_SUPPORTED_BOOL = "carrier_volte_tty_supported_bool"; field public static final String KEY_CARRIER_VT_AVAILABLE_BOOL = "carrier_vt_available_bool"; field @Deprecated public static final String KEY_CARRIER_VVM_PACKAGE_NAME_STRING = "carrier_vvm_package_name_string"; @@ -40002,14 +40002,23 @@ package android.telephony { } public static final class CarrierConfigManager.Ims { + field public static final String KEY_CAPABILITY_CALL_COMPOSER_INT_ARRAY = "ims.key_capability_type_call_composer_int_array"; + field public static final String KEY_CAPABILITY_TYPE_OPTIONS_UCE_INT_ARRAY = "ims.key_capability_type_options_uce_int_array"; + field public static final String KEY_CAPABILITY_TYPE_PRESENCE_UCE_INT_ARRAY = "ims.key_capability_type_presence_uce_int_array"; + field public static final String KEY_CAPABILITY_TYPE_SMS_INT_ARRAY = "ims.key_capability_type_sms_int_array"; + field public static final String KEY_CAPABILITY_TYPE_UT_INT_ARRAY = "ims.key_capability_type_ut_int_array"; + field public static final String KEY_CAPABILITY_TYPE_VIDEO_INT_ARRAY = "ims.key_capability_type_video_int_array"; + field public static final String KEY_CAPABILITY_TYPE_VOICE_INT_ARRAY = "ims.key_capability_type_voice_int_array"; field public static final String KEY_ENABLE_PRESENCE_CAPABILITY_EXCHANGE_BOOL = "ims.enable_presence_capability_exchange_bool"; field public static final String KEY_ENABLE_PRESENCE_GROUP_SUBSCRIBE_BOOL = "ims.enable_presence_group_subscribe_bool"; field public static final String KEY_ENABLE_PRESENCE_PUBLISH_BOOL = "ims.enable_presence_publish_bool"; field public static final String KEY_IMS_SINGLE_REGISTRATION_REQUIRED_BOOL = "ims.ims_single_registration_required_bool"; + field public static final String KEY_MMTEL_REQUIRES_PROVISIONING_BUNDLE = "ims.mmtel_requires_provisioning_bundle"; field public static final String KEY_NON_RCS_CAPABILITIES_CACHE_EXPIRATION_SEC_INT = "ims.non_rcs_capabilities_cache_expiration_sec_int"; field public static final String KEY_PREFIX = "ims."; field public static final String KEY_RCS_BULK_CAPABILITY_EXCHANGE_BOOL = "ims.rcs_bulk_capability_exchange_bool"; field public static final String KEY_RCS_FEATURE_TAG_ALLOWED_STRING_ARRAY = "ims.rcs_feature_tag_allowed_string_array"; + field public static final String KEY_RCS_REQUIRES_PROVISIONING_BUNDLE = "ims.rcs_requires_provisioning_bundle"; field public static final String KEY_WIFI_OFF_DEFERRING_TIME_MILLIS_INT = "ims.wifi_off_deferring_time_millis_int"; } diff --git a/telephony/java/android/telephony/CarrierConfigManager.java b/telephony/java/android/telephony/CarrierConfigManager.java index f8a0ca927545..e6fbc52c5b29 100644 --- a/telephony/java/android/telephony/CarrierConfigManager.java +++ b/telephony/java/android/telephony/CarrierConfigManager.java @@ -168,7 +168,10 @@ public class CarrierConfigManager { /** * This flag specifies whether VoLTE availability is based on provisioning. By default this is * false. + * Used for UCE to determine if EAB provisioning checks should be based on provisioning. + * @deprecated Use {@link Ims#KEY_MMTEL_REQUIRES_PROVISIONING_BUNDLE} instead. */ + @Deprecated public static final String KEY_CARRIER_VOLTE_PROVISIONED_BOOL = "carrier_volte_provisioned_bool"; @@ -858,7 +861,12 @@ public class CarrierConfigManager { /** * Flag specifying whether provisioning is required for VoLTE, Video Telephony, and WiFi * Calling. + + * Combines VoLTE, VT, VoWiFI calling provisioning into one parameter. + * @deprecated Use {@link Ims#KEY_MMTEL_REQUIRES_PROVISIONING_BUNDLE} instead for + * finer-grained control. */ + @Deprecated public static final String KEY_CARRIER_VOLTE_PROVISIONING_REQUIRED_BOOL = "carrier_volte_provisioning_required_bool"; @@ -872,7 +880,11 @@ public class CarrierConfigManager { * and enable the UT over IMS capability for the subscription when the subscription is loaded. * * The default value for this key is {@code false}. + * + * @deprecated Use {@link Ims#KEY_MMTEL_REQUIRES_PROVISIONING_BUNDLE} instead for + * determining if UT requires provisioning. */ + @Deprecated public static final String KEY_CARRIER_UT_PROVISIONING_REQUIRED_BOOL = "carrier_ut_provisioning_required_bool"; @@ -4632,34 +4644,93 @@ public class CarrierConfigManager { KEY_PREFIX + "rcs_request_retry_interval_millis_long"; /** - * An array of strings, each entry contains a MMTEL capability and registration - * technology tuple that requires provisioning. If a tuple is not present, the + * A bundle which specifies the MMTEL capability and registration technology + * that requires provisioning. If a tuple is not present, the * framework will not require that the tuple requires provisioning before * enabling the capability. - *

- * Format for each tuple is two integers separated by a comma. The first - * integer is an integer defined in - * {@link MmTelFeature.MmTelCapabilities.MmTelCapability} and the second integer is + *

Possible keys in this bundle are + *

    + *
  • {@link #KEY_CAPABILITY_TYPE_VOICE_INT_ARRAY}
  • + *
  • {@link #KEY_CAPABILITY_TYPE_VIDEO_INT_ARRAY}
  • + *
  • {@link #KEY_CAPABILITY_TYPE_UT_INT_ARRAY}
  • + *
  • {@link #KEY_CAPABILITY_TYPE_SMS_INT_ARRAY}
  • + *
  • {@link #KEY_CAPABILITY_CALL_COMPOSER_INT_ARRAY}
  • + *
+ *

The values are defined in * {@link android.telephony.ims.stub.ImsRegistrationImplBase.ImsRegistrationTech} - * @hide */ - public static final String KEY_MMTEL_REQUIRES_PROVISIONING_STRING_ARRAY = - KEY_PREFIX + "mmtel_requires_provisioning_string_array"; + public static final String KEY_MMTEL_REQUIRES_PROVISIONING_BUNDLE = + KEY_PREFIX + "mmtel_requires_provisioning_bundle"; /** - * An array of strings, each entry contains a RCS capability and registration - * technology tuple that requires provisioning. If a tuple is not present, the + * This MmTelFeature supports Voice calling (IR.92) + * @see MmTelFeature.MmTelCapabilities#CAPABILITY_TYPE_VOICE + */ + public static final String KEY_CAPABILITY_TYPE_VOICE_INT_ARRAY = + KEY_PREFIX + "key_capability_type_voice_int_array"; + + /** + * This MmTelFeature supports Video (IR.94) + * @see MmTelFeature.MmTelCapabilities#CAPABILITY_TYPE_VIDEO + */ + public static final String KEY_CAPABILITY_TYPE_VIDEO_INT_ARRAY = + KEY_PREFIX + "key_capability_type_video_int_array"; + + /** + * This MmTelFeature supports XCAP over Ut for supplementary services. (IR.92) + * @see MmTelFeature.MmTelCapabilities#CAPABILITY_TYPE_UT + */ + public static final String KEY_CAPABILITY_TYPE_UT_INT_ARRAY = + KEY_PREFIX + "key_capability_type_ut_int_array"; + + /** + * This MmTelFeature supports SMS (IR.92) + * @see MmTelFeature.MmTelCapabilities#CAPABILITY_TYPE_SMS + */ + public static final String KEY_CAPABILITY_TYPE_SMS_INT_ARRAY = + KEY_PREFIX + "key_capability_type_sms_int_array"; + + /** + * This MmTelFeature supports Call Composer (section 2.4 of RCC.20) + * @see MmTelFeature.MmTelCapabilities#CAPABILITY_TYPE_CALL_COMPOSER + */ + public static final String KEY_CAPABILITY_CALL_COMPOSER_INT_ARRAY = + KEY_PREFIX + "key_capability_type_call_composer_int_array"; + + /** + * A bundle which specifies the RCS capability and registration technology + * that requires provisioning. If a tuple is not present, the * framework will not require that the tuple requires provisioning before * enabling the capability. - *

- * Format for each tuple is two integers separated by a comma. The first - * integer is an integer defined in - * {@link RcsFeature.RcsImsCapabilities.RcsImsCapabilityFlag} and the second integer is + *

Possible keys in this bundle are + *

    + *
  • {@link #KEY_CAPABILITY_TYPE_OPTIONS_UCE_INT_ARRAY}
  • + *
  • {@link #KEY_CAPABILITY_TYPE_PRESENCE_UCE_INT_ARRAY}
  • + *
+ *

The values are defined in * {@link android.telephony.ims.stub.ImsRegistrationImplBase.ImsRegistrationTech} - * @hide */ - public static final String KEY_RCS_REQUIRES_PROVISIONING_STRING_ARRAY = - KEY_PREFIX + "rcs_requires_provisioning_string_array"; + public static final String KEY_RCS_REQUIRES_PROVISIONING_BUNDLE = + KEY_PREFIX + "rcs_requires_provisioning_bundle"; + + /** + * This carrier supports User Capability Exchange using SIP OPTIONS as defined by the + * framework. If set, the RcsFeature should support capability exchange using SIP OPTIONS. + * If not set, this RcsFeature should not service capability requests. + * @see RcsFeature.RcsImsCapabilities#CAPABILITY_TYPE_OPTIONS_UCE + */ + public static final String KEY_CAPABILITY_TYPE_OPTIONS_UCE_INT_ARRAY = + KEY_PREFIX + "key_capability_type_options_uce_int_array"; + + /** + * This carrier supports User Capability Exchange using a presence server as defined by the + * framework. If set, the RcsFeature should support capability exchange using a presence + * server. If not set, this RcsFeature should not publish capabilities or service capability + * requests using presence. + * @see RcsFeature.RcsImsCapabilities#CAPABILITY_TYPE_PRESENCE_UCE + */ + public static final String KEY_CAPABILITY_TYPE_PRESENCE_UCE_INT_ARRAY = + KEY_PREFIX + "key_capability_type_presence_uce_int_array"; private Ims() {} @@ -4696,8 +4767,20 @@ public class CarrierConfigManager { "+g.3gpp.iari-ref=\"urn%3Aurn-7%3A3gpp-application.ims.iari.rcs.chatbot.sa\"", "+g.gsma.rcs.botversion=\"#=1,#=2\"", "+g.gsma.rcs.cpimext"}); - defaults.putStringArray(KEY_MMTEL_REQUIRES_PROVISIONING_STRING_ARRAY, new String[] {}); - defaults.putStringArray(KEY_RCS_REQUIRES_PROVISIONING_STRING_ARRAY, new String[] {}); + + /** + * @see #KEY_MMTEL_REQUIRES_PROVISIONING_BUNDLE + */ + PersistableBundle mmtel_requires_provisioning_int_array = new PersistableBundle(); + defaults.putPersistableBundle( + KEY_MMTEL_REQUIRES_PROVISIONING_BUNDLE, mmtel_requires_provisioning_int_array); + + /** + * @see #KEY_RCS_REQUIRES_PROVISIONING_BUNDLE + */ + PersistableBundle rcs_requires_provisioning_int_array = new PersistableBundle(); + defaults.putPersistableBundle( + KEY_RCS_REQUIRES_PROVISIONING_BUNDLE, rcs_requires_provisioning_int_array); return defaults; } diff --git a/telephony/java/android/telephony/ims/ProvisioningManager.java b/telephony/java/android/telephony/ims/ProvisioningManager.java index 79af344cadd3..5aef8a6638ac 100644 --- a/telephony/java/android/telephony/ims/ProvisioningManager.java +++ b/telephony/java/android/telephony/ims/ProvisioningManager.java @@ -1449,8 +1449,7 @@ public class ProvisioningManager { *

  • {@link TelephonyManager#hasCarrierPrivileges}).
  • * * - * @see CarrierConfigManager#KEY_CARRIER_UT_PROVISIONING_REQUIRED_BOOL - * @see CarrierConfigManager#KEY_CARRIER_VOLTE_PROVISIONING_REQUIRED_BOOL + * @see CarrierConfigManager.Ims#KEY_MMTEL_REQUIRES_PROVISIONING_BUNDLE * @param isProvisioned true if the device is provisioned for UT over IMS, false otherwise. */ @WorkerThread @@ -1483,8 +1482,7 @@ public class ProvisioningManager { * {@link TelephonyManager#hasCarrierPrivileges()}). * * - * @see CarrierConfigManager#KEY_CARRIER_UT_PROVISIONING_REQUIRED_BOOL - * @see CarrierConfigManager#KEY_CARRIER_VOLTE_PROVISIONING_REQUIRED_BOOL + * @see CarrierConfigManager.Ims#KEY_MMTEL_REQUIRES_PROVISIONING_BUNDLE * @return true if the device is provisioned for the capability or does not require * provisioning, false if the capability does require provisioning and has not been * provisioned yet. @@ -1545,6 +1543,7 @@ public class ProvisioningManager { * {@link TelephonyManager#hasCarrierPrivileges()}). * * + * @see CarrierConfigManager.Ims#KEY_RCS_REQUIRES_PROVISIONING_BUNDLE * @return true if the device is provisioned for the capability or does not require * provisioning, false if the capability does require provisioning and has not been * provisioned yet. @@ -1614,6 +1613,7 @@ public class ProvisioningManager { * {@link TelephonyManager#hasCarrierPrivileges()}). * * + * @see CarrierConfigManager.Ims#KEY_RCS_REQUIRES_PROVISIONING_BUNDLE * @param isProvisioned true if the device is provisioned for the RCS capability specified, * false otherwise. */ From 433468ed0bbbdcf836783a2fae84fd8c4f595047 Mon Sep 17 00:00:00 2001 From: Shubham Dubey Date: Mon, 24 Jan 2022 06:47:41 +0000 Subject: [PATCH 4/4] Fix CTS failure caused by ag/16284012 BUG:216049141 Test: CTS ImsServiceTest#testProvisioningManagerWhen(Mmtel/Rcs)ProvisionIs(Not)Required Change-Id: I5265485feac8c5d718288702025c6276f20bb1f0 Merged-In: I5265485feac8c5d718288702025c6276f20bb1f0 --- telephony/java/android/telephony/ims/feature/RcsFeature.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/telephony/java/android/telephony/ims/feature/RcsFeature.java b/telephony/java/android/telephony/ims/feature/RcsFeature.java index af7373b376d5..70e4ef1f1a3a 100644 --- a/telephony/java/android/telephony/ims/feature/RcsFeature.java +++ b/telephony/java/android/telephony/ims/feature/RcsFeature.java @@ -488,9 +488,7 @@ public class RcsFeature extends ImsFeature { * has already been created in the framework. * @param listener A {@link CapabilityExchangeEventListener} to send the capability exchange * event to the framework. - * @hide */ - @SystemApi private void initRcsCapabilityExchangeImplBase( @NonNull CapabilityExchangeEventListener listener) { synchronized (mLock) {