Add public API to ProvisioningManager for IMS/RCS provisioning by am: 893cc94036 am: 14d4fd610b

Original change: https://android-review.googlesource.com/c/platform/frameworks/base/+/1959039

Change-Id: Ifbfbefa6e37dea6d0888b4766fdf15fab6640596
This commit is contained in:
Hakjun Choi
2022-02-09 03:09:30 +00:00
committed by Automerger Merge Worker
10 changed files with 659 additions and 74 deletions

View File

@@ -42451,6 +42451,7 @@ package android.telephony.ims {
public class ImsManager { public class ImsManager {
method @NonNull public android.telephony.ims.ImsMmTelManager getImsMmTelManager(int); method @NonNull public android.telephony.ims.ImsMmTelManager getImsMmTelManager(int);
method @NonNull public android.telephony.ims.ImsRcsManager getImsRcsManager(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 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_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"; field public static final String EXTRA_WFC_REGISTRATION_FAILURE_TITLE = "android.telephony.ims.extra.WFC_REGISTRATION_FAILURE_TITLE";
@@ -42701,6 +42702,23 @@ package android.telephony.ims {
field public static final int REASON_UNKNOWN_TEMPORARY_ERROR = 1; // 0x1 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 { public class RcsUceAdapter {
method @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) public boolean isUceSettingEnabled() throws android.telephony.ims.ImsException; method @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) public boolean isUceSettingEnabled() throws android.telephony.ims.ImsException;
} }
@@ -42741,6 +42759,27 @@ package android.telephony.ims.feature {
field public static final int CAPABILITY_TYPE_VOICE = 1; // 0x1 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 { package android.telephony.mbms {

View File

@@ -13134,18 +13134,16 @@ package android.telephony.ims {
public class ProvisioningManager { public class ProvisioningManager {
method @NonNull public static android.telephony.ims.ProvisioningManager createForSubscriptionId(int); 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 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 @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(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.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(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(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 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.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.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.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(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); 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);
@@ -13580,9 +13578,6 @@ package android.telephony.ims.feature {
method public void addCapabilities(int); method public void addCapabilities(int);
method public boolean isCapable(int); method public boolean isCapable(int);
method public void removeCapabilities(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
} }
} }
@@ -13732,11 +13727,6 @@ package android.telephony.ims.stub {
method public void triggerFullNetworkRegistration(@IntRange(from=100, to=699) int, @Nullable String); method public void triggerFullNetworkRegistration(@IntRange(from=100, to=699) int, @Nullable String);
method public void triggerSipDelegateDeregistration(); method public void triggerSipDelegateDeregistration();
method public void updateSipDelegateRegistration(); 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 { public class ImsSmsImplBase {

View File

@@ -4637,6 +4637,36 @@ public class CarrierConfigManager {
public static final String KEY_RCS_REQUEST_RETRY_INTERVAL_MILLIS_LONG = public static final String KEY_RCS_REQUEST_RETRY_INTERVAL_MILLIS_LONG =
KEY_PREFIX + "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.
* <p>
* 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.
* <p>
* 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 Ims() {}
private static PersistableBundle getDefaults() { private static PersistableBundle getDefaults() {
@@ -4672,6 +4702,8 @@ public class CarrierConfigManager {
"+g.3gpp.iari-ref=\"urn%3Aurn-7%3A3gpp-application.ims.iari.rcs.chatbot.sa\"", "+g.3gpp.iari-ref=\"urn%3Aurn-7%3A3gpp-application.ims.iari.rcs.chatbot.sa\"",
"+g.gsma.rcs.botversion=\"#=1,#=2\"", "+g.gsma.rcs.botversion=\"#=1,#=2\"",
"+g.gsma.rcs.cpimext"}); "+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; return defaults;
} }

View File

@@ -160,6 +160,26 @@ public class ImsManager {
return new SipDelegateManager(mContext, subscriptionId, sRcsCache, sTelephonyCache); return new SipDelegateManager(mContext, subscriptionId, sRcsCache, sTelephonyCache);
} }
/**
* Create an instance of {@link ProvisioningManager} for the subscription id specified.
* <p>
* 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() { private static IImsRcsController getIImsRcsControllerInterface() {
return IImsRcsController.Stub.asInterface( return IImsRcsController.Stub.asInterface(
TelephonyFrameworkInitializer TelephonyFrameworkInitializer

View File

@@ -33,6 +33,7 @@ import android.telephony.CarrierConfigManager;
import android.telephony.SubscriptionManager; import android.telephony.SubscriptionManager;
import android.telephony.TelephonyFrameworkInitializer; import android.telephony.TelephonyFrameworkInitializer;
import android.telephony.TelephonyManager; import android.telephony.TelephonyManager;
import android.telephony.ims.aidl.IFeatureProvisioningCallback;
import android.telephony.ims.aidl.IImsConfigCallback; import android.telephony.ims.aidl.IImsConfigCallback;
import android.telephony.ims.aidl.IRcsConfigCallback; import android.telephony.ims.aidl.IRcsConfigCallback;
import android.telephony.ims.feature.MmTelFeature; 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 * 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 * 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. * 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 { public class ProvisioningManager {
private static final String TAG = "ProvisioningManager";
/**@hide*/ /**@hide*/
@StringDef(prefix = "STRING_QUERY_RESULT_ERROR_", value = { @StringDef(prefix = "STRING_QUERY_RESULT_ERROR_", value = {
STRING_QUERY_RESULT_ERROR_GENERIC, STRING_QUERY_RESULT_ERROR_GENERIC,
@@ -74,14 +69,18 @@ public class ProvisioningManager {
/** /**
* The query from {@link #getProvisioningStringValue(int)} has resulted in an unspecified error. * The query from {@link #getProvisioningStringValue(int)} has resulted in an unspecified error.
* @hide
*/ */
@SystemApi
public static final String STRING_QUERY_RESULT_ERROR_GENERIC = public static final String STRING_QUERY_RESULT_ERROR_GENERIC =
"STRING_QUERY_RESULT_ERROR_GENERIC"; "STRING_QUERY_RESULT_ERROR_GENERIC";
/** /**
* The query from {@link #getProvisioningStringValue(int)} has resulted in an error because the * The query from {@link #getProvisioningStringValue(int)} has resulted in an error because the
* ImsService implementation was not ready for provisioning queries. * ImsService implementation was not ready for provisioning queries.
* @hide
*/ */
@SystemApi
public static final String STRING_QUERY_RESULT_ERROR_NOT_READY = public static final String STRING_QUERY_RESULT_ERROR_NOT_READY =
"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. * The integer result of provisioning for the queried key is disabled.
* @hide
*/ */
@SystemApi
public static final int PROVISIONING_VALUE_DISABLED = 0; public static final int PROVISIONING_VALUE_DISABLED = 0;
/** /**
* The integer result of provisioning for the queried key is enabled. * The integer result of provisioning for the queried key is enabled.
* @hide
*/ */
@SystemApi
public static final int PROVISIONING_VALUE_ENABLED = 1; 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 * 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 * {@link android.telephony.SubscriptionManager#WFC_ROAMING_ENABLED_CONTENT_URI},
* the subscription for WiFi Calling. * for the purposes of provisioning the subscription for WiFi Calling.
* *
* @see #getProvisioningIntValue(int)
* @see #setProvisioningIntValue(int, int) * @see #setProvisioningIntValue(int, int)
* @see #getProvisioningIntValue(int)
* @hide
*/ */
@SystemApi
public static final int KEY_VOICE_OVER_WIFI_ROAMING_ENABLED_OVERRIDE = 26; public static final int KEY_VOICE_OVER_WIFI_ROAMING_ENABLED_OVERRIDE = 26;
/** /**
* Override the user-defined WiFi mode for this subscription, defined in * Override the user-defined WiFi mode for this subscription, defined in
* {@link SubscriptionManager#WFC_MODE_CONTENT_URI}, for the purposes of provisioning * {@link android.telephony.SubscriptionManager#WFC_MODE_CONTENT_URI},
* this subscription for WiFi Calling. * for the purposes of provisioning this subscription for WiFi Calling.
* *
* Valid values for this key are: * Valid values for this key are:
* {@link ImsMmTelManager#WIFI_MODE_WIFI_ONLY}, * {@link ImsMmTelManager#WIFI_MODE_WIFI_ONLY},
* {@link ImsMmTelManager#WIFI_MODE_CELLULAR_PREFERRED}, or * {@link ImsMmTelManager#WIFI_MODE_CELLULAR_PREFERRED}, or
* {@link ImsMmTelManager#WIFI_MODE_WIFI_PREFERRED}. * {@link ImsMmTelManager#WIFI_MODE_WIFI_PREFERRED}.
* *
* @see #getProvisioningIntValue(int)
* @see #setProvisioningIntValue(int, int) * @see #setProvisioningIntValue(int, int)
* @see #getProvisioningIntValue(int)
* @hide
*/ */
@SystemApi
public static final int KEY_VOICE_OVER_WIFI_MODE_OVERRIDE = 27; public static final int KEY_VOICE_OVER_WIFI_MODE_OVERRIDE = 27;
/** /**
@@ -862,7 +869,9 @@ public class ProvisioningManager {
* <p>Value is in String format. * <p>Value is in String format.
* @see #setProvisioningStringValue(int, String) * @see #setProvisioningStringValue(int, String)
* @see #getProvisioningStringValue(int) * @see #getProvisioningStringValue(int)
* @hide
*/ */
@SystemApi
public static final int KEY_VOICE_OVER_WIFI_ENTITLEMENT_ID = 67; public static final int KEY_VOICE_OVER_WIFI_ENTITLEMENT_ID = 67;
/** /**
@@ -884,7 +893,9 @@ public class ProvisioningManager {
/** /**
* Callback for IMS provisioning changes. * Callback for IMS provisioning changes.
* @hide
*/ */
@SystemApi
public static class Callback { public static class Callback {
private static class CallbackBinder extends IImsConfigCallback.Stub { 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; private int mSubId;
/** /**
* The callback for RCS provisioning changes. * The callback for RCS provisioning changes.
* @hide
*/ */
@SystemApi
public static class RcsProvisioningCallback { public static class RcsProvisioningCallback {
private static class CallbackBinder extends IRcsConfigCallback.Stub { 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. * @param subId The ID of the subscription that this ProvisioningManager will use.
* @see android.telephony.SubscriptionManager#getActiveSubscriptionInfoList() * @see android.telephony.SubscriptionManager#getActiveSubscriptionInfoList()
* @throws IllegalArgumentException if the subscription is invalid. * @throws IllegalArgumentException if the subscription is invalid.
* @hide
*/ */
@SystemApi
public static @NonNull ProvisioningManager createForSubscriptionId(int subId) { public static @NonNull ProvisioningManager createForSubscriptionId(int subId) {
if (!SubscriptionManager.isValidSubscriptionId(subId)) { if (!SubscriptionManager.isValidSubscriptionId(subId)) {
throw new IllegalArgumentException("Invalid subscription ID"); throw new IllegalArgumentException("Invalid subscription ID");
@@ -1105,7 +1212,9 @@ public class ProvisioningManager {
return new ProvisioningManager(subId); return new ProvisioningManager(subId);
} }
private ProvisioningManager(int subId) { /**@hide*/
//@SystemApi
public ProvisioningManager(int subId) {
mSubId = subId; mSubId = subId;
} }
@@ -1114,6 +1223,12 @@ public class ProvisioningManager {
* *
* When the subscription associated with this callback is removed (SIM removed, ESIM swap, * When the subscription associated with this callback is removed (SIM removed, ESIM swap,
* etc...), this callback will automatically be removed. * etc...), this callback will automatically be removed.
*
* <p> Requires Permission:
* <ul>
* <li>{@link android.Manifest.permission#READ_PRIVILEGED_PHONE_STATE},</li>
* </ul>
*
* @param executor The {@link Executor} to call the callback methods on * @param executor The {@link Executor} to call the callback methods on
* @param callback The provisioning callbackto be registered. * @param callback The provisioning callbackto be registered.
* @see #unregisterProvisioningChangedCallback(Callback) * @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 {@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 * the service crashed, for example. See {@link ImsException#getCode()} for a more detailed
* reason. * reason.
* @hide
*/ */
@SystemApi
@RequiresPermission(Manifest.permission.READ_PRIVILEGED_PHONE_STATE) @RequiresPermission(Manifest.permission.READ_PRIVILEGED_PHONE_STATE)
public void registerProvisioningChangedCallback(@NonNull @CallbackExecutor Executor executor, public void registerProvisioningChangedCallback(@NonNull @CallbackExecutor Executor executor,
@NonNull Callback callback) throws ImsException { @NonNull Callback callback) throws ImsException {
@@ -1142,12 +1259,20 @@ public class ProvisioningManager {
* Unregister an existing {@link Callback}. When the subscription associated with this * Unregister an existing {@link Callback}. When the subscription associated with this
* callback is removed (SIM removed, ESIM swap, etc...), this callback will automatically be * 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. * removed. If this method is called for an inactive subscription, it will result in a no-op.
*
* <p> Requires Permission:
* <ul>
* <li>{@link android.Manifest.permission#READ_PRIVILEGED_PHONE_STATE},</li>
* </ul>
*
* @param callback The existing {@link Callback} to be removed. * @param callback The existing {@link Callback} to be removed.
* @see #registerProvisioningChangedCallback(Executor, Callback) * @see #registerProvisioningChangedCallback(Executor, Callback)
* *
* @throws IllegalArgumentException if the subscription associated with this callback is * @throws IllegalArgumentException if the subscription associated with this callback is
* invalid. * invalid.
* @hide
*/ */
@SystemApi
@RequiresPermission(Manifest.permission.READ_PRIVILEGED_PHONE_STATE) @RequiresPermission(Manifest.permission.READ_PRIVILEGED_PHONE_STATE)
public void unregisterProvisioningChangedCallback(@NonNull Callback callback) { public void unregisterProvisioningChangedCallback(@NonNull Callback callback) {
try { try {
@@ -1157,6 +1282,62 @@ public class ProvisioningManager {
} }
} }
/**
* Register a new {@link FeatureProvisioningCallback}, which is used to listen for
* IMS feature provisioning updates.
* <p>
* When the subscription associated with this callback is removed (SIM removed,
* ESIM swap,etc...), this callback will automatically be removed.
*
* <p> Requires Permission:
* <ul>
* <li> android.Manifest.permission#READ_PRIVILEGED_PHONE_STATE,</li>
* <li>{@link android.Manifest.permission#READ_PRECISE_PHONE_STATE},</li>
* <li>or that the caller has carrier privileges (see
* {@link TelephonyManager#hasCarrierPrivileges()}).</li>
* </ul>
*
* @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. * 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 * @return an integer value for the provided key, or
* {@link ImsConfigImplBase#CONFIG_RESULT_UNKNOWN} if the key doesn't exist. * {@link ImsConfigImplBase#CONFIG_RESULT_UNKNOWN} if the key doesn't exist.
* @throws IllegalArgumentException if the key provided was invalid. * @throws IllegalArgumentException if the key provided was invalid.
* @hide
*/ */
@SystemApi
@WorkerThread @WorkerThread
@RequiresPermission(Manifest.permission.READ_PRIVILEGED_PHONE_STATE) @RequiresPermission(Manifest.permission.READ_PRIVILEGED_PHONE_STATE)
public int getProvisioningIntValue(int key) { 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 * @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. * {@link StringResultError} if there was an error getting the value for the provided key.
* @throws IllegalArgumentException if the key provided was invalid. * @throws IllegalArgumentException if the key provided was invalid.
* @hide
*/ */
@SystemApi
@WorkerThread @WorkerThread
@RequiresPermission(Manifest.permission.READ_PRIVILEGED_PHONE_STATE) @RequiresPermission(Manifest.permission.READ_PRIVILEGED_PHONE_STATE)
public @Nullable @StringResultError String getProvisioningStringValue(int key) { 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 key An integer that represents the provisioning key, which is defined by the OEM.
* @param value a integer value for the provided key. * @param value a integer value for the provided key.
* @return the result of setting the configuration value. * @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 @WorkerThread
@RequiresPermission(Manifest.permission.MODIFY_PHONE_STATE) @RequiresPermission(Manifest.permission.MODIFY_PHONE_STATE)
public @ImsConfigImplBase.SetConfigResult int setProvisioningIntValue(int key, int value) { public @ImsConfigImplBase.SetConfigResult int setProvisioningIntValue(int key, int value) {
@@ -1227,7 +1420,9 @@ public class ProvisioningManager {
* should be appropriately namespaced to avoid collision. * should be appropriately namespaced to avoid collision.
* @param value a String value for the provided key. * @param value a String value for the provided key.
* @return the result of setting the configuration value. * @return the result of setting the configuration value.
* @hide
*/ */
@SystemApi
@WorkerThread @WorkerThread
@RequiresPermission(Manifest.permission.MODIFY_PHONE_STATE) @RequiresPermission(Manifest.permission.MODIFY_PHONE_STATE)
public @ImsConfigImplBase.SetConfigResult int setProvisioningStringValue(int key, 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 * does not support the capability/technology combination specified, this operation will be a
* no-op. * no-op.
* *
* <p>Requires Permission:
* <ul>
* <li>{@link android.Manifest.permission#MODIFY_PHONE_STATE},</li>
* <li>or that the calling app has carrier privileges (see</li>
* <li>{@link TelephonyManager#hasCarrierPrivileges}).</li>
* </ul>
*
* @see CarrierConfigManager#KEY_CARRIER_UT_PROVISIONING_REQUIRED_BOOL * @see CarrierConfigManager#KEY_CARRIER_UT_PROVISIONING_REQUIRED_BOOL
* @see CarrierConfigManager#KEY_CARRIER_VOLTE_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. * @param isProvisioned true if the device is provisioned for UT over IMS, false otherwise.
@@ -1256,9 +1458,10 @@ public class ProvisioningManager {
public void setProvisioningStatusForCapability( public void setProvisioningStatusForCapability(
@MmTelFeature.MmTelCapabilities.MmTelCapability int capability, @MmTelFeature.MmTelCapabilities.MmTelCapability int capability,
@ImsRegistrationImplBase.ImsRegistrationTech int tech, boolean isProvisioned) { @ImsRegistrationImplBase.ImsRegistrationTech int tech, boolean isProvisioned) {
try { try {
getITelephony().setImsProvisioningStatusForCapability(mSubId, capability, tech, getITelephony().setImsProvisioningStatusForCapability(mSubId, capability, tech,
isProvisioned); isProvisioned);
} catch (RemoteException e) { } catch (RemoteException e) {
throw e.rethrowAsRuntimeException(); throw e.rethrowAsRuntimeException();
} }
@@ -1272,6 +1475,14 @@ public class ProvisioningManager {
* {@link ImsRegistrationImplBase.ImsRegistrationTech} combination specified, this method will * {@link ImsRegistrationImplBase.ImsRegistrationTech} combination specified, this method will
* always return {@code true}. * always return {@code true}.
* *
* <p> Requires Permission:
* <ul>
* <li>android.Manifest.permission#READ_PRIVILEGED_PHONE_STATE,</li>
* <li>{@link android.Manifest.permission#READ_PRECISE_PHONE_STATE},</li>
* <li>or that the caller has carrier privileges (see
* {@link TelephonyManager#hasCarrierPrivileges()}).</li>
* </ul>
*
* @see CarrierConfigManager#KEY_CARRIER_UT_PROVISIONING_REQUIRED_BOOL * @see CarrierConfigManager#KEY_CARRIER_UT_PROVISIONING_REQUIRED_BOOL
* @see CarrierConfigManager#KEY_CARRIER_VOLTE_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 * @return true if the device is provisioned for the capability or does not require
@@ -1279,7 +1490,7 @@ public class ProvisioningManager {
* provisioned yet. * provisioned yet.
*/ */
@WorkerThread @WorkerThread
@RequiresPermission(Manifest.permission.READ_PRIVILEGED_PHONE_STATE) @RequiresPermission(Manifest.permission.READ_PRECISE_PHONE_STATE)
public boolean getProvisioningStatusForCapability( public boolean getProvisioningStatusForCapability(
@MmTelFeature.MmTelCapabilities.MmTelCapability int capability, @MmTelFeature.MmTelCapabilities.MmTelCapability int capability,
@ImsRegistrationImplBase.ImsRegistrationTech int tech) { @ImsRegistrationImplBase.ImsRegistrationTech int tech) {
@@ -1297,17 +1508,92 @@ public class ProvisioningManager {
* {@link RcsFeature.RcsImsCapabilities.RcsImsCapabilityFlag} this method will always return * {@link RcsFeature.RcsImsCapabilities.RcsImsCapabilityFlag} this method will always return
* {@code true}. * {@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 * @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 * provisioning, false if the capability does require provisioning and has not been
* provisioned yet. * 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 @WorkerThread
@RequiresPermission(Manifest.permission.READ_PRIVILEGED_PHONE_STATE) @RequiresPermission(Manifest.permission.READ_PRIVILEGED_PHONE_STATE)
public boolean getRcsProvisioningStatusForCapability( public boolean getRcsProvisioningStatusForCapability(
@RcsFeature.RcsImsCapabilities.RcsImsCapabilityFlag int capability) { @RcsFeature.RcsImsCapabilities.RcsImsCapabilityFlag int capability) {
try { 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}.
*
* <p> Requires Permission:
* <ul>
* <li>{@link android.Manifest.permission#READ_PRECISE_PHONE_STATE},</li>
* <li>or that the caller has carrier privileges (see
* {@link TelephonyManager#hasCarrierPrivileges()}).</li>
* </ul>
*
* @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.
*
* <p> Requires Permission:
* <ul>
* <li>{@link android.Manifest.permission#MODIFY_PHONE_STATE}</li>
* <li>or that the caller has carrier privileges (see
* {@link TelephonyManager#hasCarrierPrivileges()}).</li>
* </ul>
* 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) { } catch (RemoteException e) {
throw e.rethrowAsRuntimeException(); throw e.rethrowAsRuntimeException();
} }
@@ -1321,7 +1607,13 @@ public class ProvisioningManager {
* does not support the capability/technology combination specified, this operation will be a * does not support the capability/technology combination specified, this operation will be a
* no-op. * no-op.
* *
* @see CarrierConfigManager#KEY_CARRIER_RCS_PROVISIONING_REQUIRED_BOOL * <p> Requires Permission:
* <ul>
* <li>{@link android.Manifest.permission#MODIFY_PHONE_STATE},</li>
* <li>or that the caller has carrier privileges (see
* {@link TelephonyManager#hasCarrierPrivileges()}).</li>
* </ul>
*
* @param isProvisioned true if the device is provisioned for the RCS capability specified, * @param isProvisioned true if the device is provisioned for the RCS capability specified,
* false otherwise. * false otherwise.
*/ */
@@ -1329,31 +1621,92 @@ public class ProvisioningManager {
@RequiresPermission(Manifest.permission.MODIFY_PHONE_STATE) @RequiresPermission(Manifest.permission.MODIFY_PHONE_STATE)
public void setRcsProvisioningStatusForCapability( public void setRcsProvisioningStatusForCapability(
@RcsFeature.RcsImsCapabilities.RcsImsCapabilityFlag int capability, @RcsFeature.RcsImsCapabilities.RcsImsCapabilityFlag int capability,
boolean isProvisioned) { @ImsRegistrationImplBase.ImsRegistrationTech int tech, boolean isProvisioned) {
try { try {
getITelephony().setRcsProvisioningStatusForCapability(mSubId, capability, getITelephony().setRcsProvisioningStatusForCapability(mSubId, capability,
isProvisioned); tech, isProvisioned);
} catch (RemoteException e) { } catch (RemoteException e) {
throw e.rethrowAsRuntimeException(); throw e.rethrowAsRuntimeException();
} }
} }
/**
* Indicates whether provisioning for the MMTEL capability and IMS registration technology
* specified is required or not
*
* <p> Requires Permission:
* <ul>
* <li> android.Manifest.permission#READ_PRIVILEGED_PHONE_STATE,</li>
* <li>{@link android.Manifest.permission#READ_PRECISE_PHONE_STATE},</li>
* <li> or that the caller has carrier privileges (see
* {@link TelephonyManager#hasCarrierPrivileges()}).</li>
* </ul>
*
* @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
*
* <p> Requires Permission:
* <ul>
* <li> android.Manifest.permission#READ_PRIVILEGED_PHONE_STATE,</li>
* <li>{@link android.Manifest.permission#READ_PRECISE_PHONE_STATE},</li>
* <li> or that the caller has carrier privileges (see
* {@link TelephonyManager#hasCarrierPrivileges()}).</li>
* </ul>
*
* @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 * Notify the framework that an RCS autoconfiguration XML file has been received for
* provisioning. * provisioning.
* <p> *
* Requires Permission: Manifest.permission.MODIFY_PHONE_STATE or that the calling app has * <p>Requires Permission:
* carrier privileges (see {@link TelephonyManager#hasCarrierPrivileges}). * <ul>
* <li>{@link Manifest.permission#MODIFY_PHONE_STATE},</li>
* <li>or that the calling app has carrier privileges (see
* {@link TelephonyManager#hasCarrierPrivileges()}).</li>
* </ul>
*
* @param config The XML file to be read. ASCII/UTF8 encoded text if not compressed. * @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 * @param isCompressed The XML file is compressed in gzip format and must be decompressed
* before being read. * before being read.
* * @hide
*/ */
@SystemApi
@RequiresPermission(Manifest.permission.MODIFY_PHONE_STATE) @RequiresPermission(Manifest.permission.MODIFY_PHONE_STATE)
public void notifyRcsAutoConfigurationReceived(@NonNull byte[] config, boolean isCompressed) { public void notifyRcsAutoConfigurationReceived(@NonNull byte[] config, boolean isCompressed) {
if (config == null) { if (config == null) {
throw new IllegalArgumentException("Must include a non-null config XML file."); throw new IllegalArgumentException("Must include a non-null config XML file.");
} }
try { try {
getITelephony().notifyRcsAutoConfigurationReceived(mSubId, config, isCompressed); getITelephony().notifyRcsAutoConfigurationReceived(mSubId, config, isCompressed);
} catch (RemoteException e) { } catch (RemoteException e) {
@@ -1372,7 +1725,9 @@ public class ProvisioningManager {
* <p>Contains {@link #EXTRA_SUBSCRIPTION_ID} to specify the subscription index for which * <p>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 * the intent is valid. and {@link #EXTRA_STATUS} to specify RCS VoLTE single registration
* status. * status.
* @hide
*/ */
@SystemApi
@RequiresPermission(Manifest.permission.PERFORM_IMS_SINGLE_REGISTRATION) @RequiresPermission(Manifest.permission.PERFORM_IMS_SINGLE_REGISTRATION)
@SdkConstant(SdkConstant.SdkConstantType.BROADCAST_INTENT_ACTION) @SdkConstant(SdkConstant.SdkConstantType.BROADCAST_INTENT_ACTION)
public static final String ACTION_RCS_SINGLE_REGISTRATION_CAPABILITY_UPDATE = public static final String ACTION_RCS_SINGLE_REGISTRATION_CAPABILITY_UPDATE =
@@ -1380,7 +1735,9 @@ public class ProvisioningManager {
/** /**
* Integer extra to specify subscription index. * Integer extra to specify subscription index.
* @hide
*/ */
@SystemApi
public static final String EXTRA_SUBSCRIPTION_ID = public static final String EXTRA_SUBSCRIPTION_ID =
"android.telephony.ims.extra.SUBSCRIPTION_ID"; "android.telephony.ims.extra.SUBSCRIPTION_ID";
@@ -1390,22 +1747,30 @@ public class ProvisioningManager {
* <p>The value can be {@link #STATUS_CAPABLE}, {@link #STATUS_DEVICE_NOT_CAPABLE}, * <p>The value can be {@link #STATUS_CAPABLE}, {@link #STATUS_DEVICE_NOT_CAPABLE},
* {@link #STATUS_CARRIER_NOT_CAPABLE}, or bitwise OR of * {@link #STATUS_CARRIER_NOT_CAPABLE}, or bitwise OR of
* {@link #STATUS_DEVICE_NOT_CAPABLE} and {@link #STATUS_CARRIER_NOT_CAPABLE}. * {@link #STATUS_DEVICE_NOT_CAPABLE} and {@link #STATUS_CARRIER_NOT_CAPABLE}.
* @hide
*/ */
@SystemApi
public static final String EXTRA_STATUS = "android.telephony.ims.extra.STATUS"; public static final String EXTRA_STATUS = "android.telephony.ims.extra.STATUS";
/** /**
* RCS VoLTE single registration is supported by the device and carrier. * RCS VoLTE single registration is supported by the device and carrier.
* @hide
*/ */
@SystemApi
public static final int STATUS_CAPABLE = 0; public static final int STATUS_CAPABLE = 0;
/** /**
* RCS VoLTE single registration is not supported by the device. * RCS VoLTE single registration is not supported by the device.
* @hide
*/ */
@SystemApi
public static final int STATUS_DEVICE_NOT_CAPABLE = 0x01; public static final int STATUS_DEVICE_NOT_CAPABLE = 0x01;
/** /**
* RCS VoLTE single registration is not supported by the carrier * RCS VoLTE single registration is not supported by the carrier
* @hide
*/ */
@SystemApi
public static final int STATUS_CARRIER_NOT_CAPABLE = 0x01 << 1; 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 * provisioning is done using autoconfiguration, then these parameters shall be
* sent in the HTTP get request to fetch the RCS provisioning. RCS client * sent in the HTTP get request to fetch the RCS provisioning. RCS client
* configuration must be provided by the application before registering for the * 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 * 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. * the change in the configuration, and trigger the auto-configuration as needed.
* @param rcc RCS client configuration {@link RcsClientConfiguration} * @param rcc RCS client configuration {@link RcsClientConfiguration}
* @hide
*/ */
@SystemApi
@RequiresPermission(Manifest.permission.PERFORM_IMS_SINGLE_REGISTRATION) @RequiresPermission(Manifest.permission.PERFORM_IMS_SINGLE_REGISTRATION)
public void setRcsClientConfiguration( public void setRcsClientConfiguration(
@NonNull RcsClientConfiguration rcc) throws ImsException { @NonNull RcsClientConfiguration rcc) throws ImsException {
@@ -1440,18 +1808,21 @@ public class ProvisioningManager {
* <ul> * <ul>
* <li>{@link android.Manifest.permission#READ_PRIVILEGED_PHONE_STATE},</li> * <li>{@link android.Manifest.permission#READ_PRIVILEGED_PHONE_STATE},</li>
* <li>{@link android.Manifest.permission#PERFORM_IMS_SINGLE_REGISTRATION},</li> * <li>{@link android.Manifest.permission#PERFORM_IMS_SINGLE_REGISTRATION},</li>
* <li>or that the caller has carrier privileges (see * <li>or that the calling app has carrier privileges (see
* {@link TelephonyManager#hasCarrierPrivileges()}).</li> * {@link TelephonyManager#hasCarrierPrivileges()}).</li>
* </ul> * </ul>
*
* @return true if IMS single registration is capable at this time, or false otherwise * @return true if IMS single registration is capable at this time, or false otherwise
* @throws ImsException If the remote ImsService is not available for * @throws ImsException If the remote ImsService is not available for any reason or
* any reason or the subscription associated with this instance is no * the subscription associated with this instance is no longer active.
* longer active. See {@link ImsException#getCode()} for more * See {@link ImsException#getCode()} for more information.
* information.
* @see PackageManager#FEATURE_TELEPHONY_IMS_SINGLE_REGISTRATION for whether or not this * @see PackageManager#FEATURE_TELEPHONY_IMS_SINGLE_REGISTRATION for whether or not this
* device supports IMS single registration. * 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}) Manifest.permission.PERFORM_IMS_SINGLE_REGISTRATION})
public boolean isRcsVolteSingleRegistrationCapable() throws ImsException { public boolean isRcsVolteSingleRegistrationCapable() throws ImsException {
try { try {
@@ -1478,8 +1849,6 @@ public class ProvisioningManager {
* <ul> * <ul>
* <li>{@link android.Manifest.permission#READ_PRIVILEGED_PHONE_STATE},</li> * <li>{@link android.Manifest.permission#READ_PRIVILEGED_PHONE_STATE},</li>
* <li>{@link android.Manifest.permission#PERFORM_IMS_SINGLE_REGISTRATION},</li> * <li>{@link android.Manifest.permission#PERFORM_IMS_SINGLE_REGISTRATION},</li>
* <li>or that the caller has carrier privileges (see
* {@link TelephonyManager#hasCarrierPrivileges()}).</li>
* </ul> * </ul>
* *
* @param executor The {@link Executor} to call the callback methods on * @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 * params (See {@link #setRcsClientConfiguration}) and re register the
* callback. * callback.
* See {@link ImsException#getCode()} for a more detailed reason. * 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}) Manifest.permission.PERFORM_IMS_SINGLE_REGISTRATION})
public void registerRcsProvisioningCallback( public void registerRcsProvisioningCallback(
@NonNull @CallbackExecutor Executor executor, @NonNull @CallbackExecutor Executor executor,
@@ -1525,8 +1897,6 @@ public class ProvisioningManager {
* <ul> * <ul>
* <li>{@link android.Manifest.permission#READ_PRIVILEGED_PHONE_STATE},</li> * <li>{@link android.Manifest.permission#READ_PRIVILEGED_PHONE_STATE},</li>
* <li>{@link android.Manifest.permission#PERFORM_IMS_SINGLE_REGISTRATION},</li> * <li>{@link android.Manifest.permission#PERFORM_IMS_SINGLE_REGISTRATION},</li>
* <li>or that the caller has carrier privileges (see
* {@link TelephonyManager#hasCarrierPrivileges()}).</li>
* </ul> * </ul>
* *
* @param callback The existing {@link RcsProvisioningCallback} to be * @param callback The existing {@link RcsProvisioningCallback} to be
@@ -1534,8 +1904,11 @@ public class ProvisioningManager {
* @see #registerRcsProvisioningCallback(Executor, RcsProvisioningCallback) * @see #registerRcsProvisioningCallback(Executor, RcsProvisioningCallback)
* @throws IllegalArgumentException if the subscription associated with * @throws IllegalArgumentException if the subscription associated with
* this callback is invalid. * 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}) Manifest.permission.PERFORM_IMS_SINGLE_REGISTRATION})
public void unregisterRcsProvisioningCallback( public void unregisterRcsProvisioningCallback(
@NonNull RcsProvisioningCallback callback) { @NonNull RcsProvisioningCallback callback) {
@@ -1556,9 +1929,10 @@ public class ProvisioningManager {
* {@link RcsProvisioningCallback} may expect to receive * {@link RcsProvisioningCallback} may expect to receive
* {@link RcsProvisioningCallback#onConfigurationReset}, then * {@link RcsProvisioningCallback#onConfigurationReset}, then
* {@link RcsProvisioningCallback#onConfigurationChanged} when the new * {@link RcsProvisioningCallback#onConfigurationChanged} when the new
* RCS configuration is received and notified by * RCS configuration is received and notified by {@link #notifyRcsAutoConfigurationReceived}
* {@link #notifyRcsAutoConfigurationReceived} * @hide
*/ */
@SystemApi
@RequiresPermission(Manifest.permission.PERFORM_IMS_SINGLE_REGISTRATION) @RequiresPermission(Manifest.permission.PERFORM_IMS_SINGLE_REGISTRATION)
public void triggerRcsReconfiguration() { public void triggerRcsReconfiguration() {
try { try {

View File

@@ -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);
}

View File

@@ -393,6 +393,13 @@ public class MmTelFeature extends ImsFeature {
@Retention(RetentionPolicy.SOURCE) @Retention(RetentionPolicy.SOURCE)
public @interface MmTelCapability {} 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) * 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; 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 * @hide
*/ */

View File

@@ -59,9 +59,7 @@ import java.util.function.Supplier;
/** /**
* Base implementation of the RcsFeature APIs. Any ImsService wishing to support RCS should extend * 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. * this class and provide implementations of the RcsFeature methods that they support.
* @hide
*/ */
@SystemApi
public class RcsFeature extends ImsFeature { public class RcsFeature extends ImsFeature {
private static final String LOG_TAG = "RcsFeature"; 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 * 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 * form of a bitmask. The capabilities that are used in the RcsFeature are
* defined as: * defined as:
* {@link RcsUceAdatper.RcsImsCapabilityFlag#CAPABILITY_TYPE_OPTIONS_UCE} * {RcsUceAdapter.RcsImsCapabilityFlag#CAPABILITY_TYPE_OPTIONS_UCE}
* {@link RceUceAdapter.RcsImsCapabilityFlag#CAPABILITY_TYPE_PRESENCE_UCE} * {RcsUceAdapter.RcsImsCapabilityFlag#CAPABILITY_TYPE_PRESENCE_UCE}
* *
* The enabled capabilities of this RcsFeature will be set by the framework * 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 * 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 * 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. * framework that the capability is available for usage.
*/ */
public static class RcsImsCapabilities extends Capabilities { 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; 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. * Create a new {@link RcsImsCapabilities} instance with the provided capabilities.
* @param capabilities The capabilities that are supported for RCS in the form of a * @param capabilities The capabilities that are supported for RCS in the form of a
* bitfield. * bitfield.
* @hide
*/ */
@SystemApi
public RcsImsCapabilities(@RcsUceAdapter.RcsImsCapabilityFlag int capabilities) { public RcsImsCapabilities(@RcsUceAdapter.RcsImsCapabilityFlag int capabilities) {
super(capabilities); super(capabilities);
} }
@@ -243,17 +249,29 @@ public class RcsFeature extends ImsFeature {
super(capabilities.getMask()); super(capabilities.getMask());
} }
/**
* @hide
*/
@Override @Override
@SystemApi
public void addCapabilities(@RcsUceAdapter.RcsImsCapabilityFlag int capabilities) { public void addCapabilities(@RcsUceAdapter.RcsImsCapabilityFlag int capabilities) {
super.addCapabilities(capabilities); super.addCapabilities(capabilities);
} }
/**
* @hide
*/
@Override @Override
@SystemApi
public void removeCapabilities(@RcsUceAdapter.RcsImsCapabilityFlag int capabilities) { public void removeCapabilities(@RcsUceAdapter.RcsImsCapabilityFlag int capabilities) {
super.removeCapabilities(capabilities); super.removeCapabilities(capabilities);
} }
/**
* @hide
*/
@Override @Override
@SystemApi
public boolean isCapable(@RcsUceAdapter.RcsImsCapabilityFlag int capabilities) { public boolean isCapable(@RcsUceAdapter.RcsImsCapabilityFlag int capabilities) {
return super.isCapable(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 * Method stubs called from the framework will be called asynchronously. To specify the
* {@link Executor} that the methods stubs will be called, use * {@link Executor} that the methods stubs will be called, use
* {@link RcsFeature#RcsFeature(Executor)} instead. * {@link RcsFeature#RcsFeature(Executor)} instead.
* @hide
*/ */
@SystemApi
public RcsFeature() { public RcsFeature() {
super(); super();
// Run on the Binder threads that call them. // Run on the Binder threads that call them.
@@ -282,7 +302,9 @@ public class RcsFeature extends ImsFeature {
* framework. * framework.
* @param executor The executor for the framework to use when executing the methods overridden * @param executor The executor for the framework to use when executing the methods overridden
* by the implementation of RcsFeature. * by the implementation of RcsFeature.
* @hide
*/ */
@SystemApi
public RcsFeature(@NonNull Executor executor) { public RcsFeature(@NonNull Executor executor) {
super(); super();
if (executor == null) { if (executor == null) {
@@ -301,7 +323,7 @@ public class RcsFeature extends ImsFeature {
* @hide * @hide
*/ */
@Override @Override
public void initialize(Context context, int slotId) { public void initialize(@NonNull Context context, @NonNull int slotId) {
super.initialize(context, slotId); super.initialize(context, slotId);
// Notify that the RcsFeature is ready. // Notify that the RcsFeature is ready.
mExecutor.execute(() -> onFeatureReady()); mExecutor.execute(() -> onFeatureReady());
@@ -313,8 +335,10 @@ public class RcsFeature extends ImsFeature {
* requests. To change the status of the capabilities * requests. To change the status of the capabilities
* {@link #notifyCapabilitiesStatusChanged(RcsImsCapabilities)} should be called. * {@link #notifyCapabilitiesStatusChanged(RcsImsCapabilities)} should be called.
* @return A copy of the current RcsFeature capability status. * @return A copy of the current RcsFeature capability status.
* @hide
*/ */
@Override @Override
@SystemApi
public @NonNull final RcsImsCapabilities queryCapabilityStatus() { public @NonNull final RcsImsCapabilities queryCapabilityStatus() {
return new RcsImsCapabilities(super.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. * this signals to the framework that the capability has been initialized and is ready.
* Call {@link #queryCapabilityStatus()} to return the current capability status. * Call {@link #queryCapabilityStatus()} to return the current capability status.
* @param capabilities The current capability status of the RcsFeature. * @param capabilities The current capability status of the RcsFeature.
* @hide
*/ */
@SystemApi
public final void notifyCapabilitiesStatusChanged(@NonNull RcsImsCapabilities capabilities) { public final void notifyCapabilitiesStatusChanged(@NonNull RcsImsCapabilities capabilities) {
if (capabilities == null) { if (capabilities == null) {
throw new IllegalArgumentException("RcsImsCapabilities must be non-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 capability The capability that we are querying the configuration for.
* @param radioTech The radio technology type that we are querying. * @param radioTech The radio technology type that we are querying.
* @return true if the capability is enabled, false otherwise. * @return true if the capability is enabled, false otherwise.
* @hide
*/ */
@SystemApi
public boolean queryCapabilityConfiguration( public boolean queryCapabilityConfiguration(
@RcsUceAdapter.RcsImsCapabilityFlag int capability, @RcsUceAdapter.RcsImsCapabilityFlag int capability,
@ImsRegistrationImplBase.ImsRegistrationTech int radioTech) { @ImsRegistrationImplBase.ImsRegistrationTech int radioTech) {
@@ -364,8 +392,10 @@ public class RcsFeature extends ImsFeature {
* be called for each capability change that resulted in an error. * be called for each capability change that resulted in an error.
* @param request The request to change the capability. * @param request The request to change the capability.
* @param callback To notify the framework that the result of the capability changes. * @param callback To notify the framework that the result of the capability changes.
* @hide
*/ */
@Override @Override
@SystemApi
public void changeEnabledCapabilities(@NonNull CapabilityChangeRequest request, public void changeEnabledCapabilities(@NonNull CapabilityChangeRequest request,
@NonNull CapabilityCallbackProxy callback) { @NonNull CapabilityCallbackProxy callback) {
// Base Implementation - Override to provide functionality // Base Implementation - Override to provide functionality
@@ -385,7 +415,9 @@ public class RcsFeature extends ImsFeature {
* event to the framework. * event to the framework.
* @return An instance of {@link RcsCapabilityExchangeImplBase} that implements capability * @return An instance of {@link RcsCapabilityExchangeImplBase} that implements capability
* exchange if it is supported by the device. * exchange if it is supported by the device.
* @hide
*/ */
@SystemApi
public @NonNull RcsCapabilityExchangeImplBase createCapabilityExchangeImpl( public @NonNull RcsCapabilityExchangeImplBase createCapabilityExchangeImpl(
@NonNull CapabilityExchangeEventListener listener) { @NonNull CapabilityExchangeEventListener listener) {
// Base Implementation, override to implement functionality // Base Implementation, override to implement functionality
@@ -395,20 +427,28 @@ public class RcsFeature extends ImsFeature {
/** /**
* Remove the given CapabilityExchangeImplBase instance. * Remove the given CapabilityExchangeImplBase instance.
* @param capExchangeImpl The {@link RcsCapabilityExchangeImplBase} instance to be destroyed. * @param capExchangeImpl The {@link RcsCapabilityExchangeImplBase} instance to be destroyed.
* @hide
*/ */
@SystemApi
public void destroyCapabilityExchangeImpl( public void destroyCapabilityExchangeImpl(
@NonNull RcsCapabilityExchangeImplBase capExchangeImpl) { @NonNull RcsCapabilityExchangeImplBase capExchangeImpl) {
// Override to implement the process of destroying RcsCapabilityExchangeImplBase instance. // Override to implement the process of destroying RcsCapabilityExchangeImplBase instance.
} }
/**{@inheritDoc}*/ /**{@inheritDoc}
* @hide
*/
@Override @Override
@SystemApi
public void onFeatureRemoved() { public void onFeatureRemoved() {
} }
/**{@inheritDoc}*/ /**{@inheritDoc}
* @hide
*/
@Override @Override
@SystemApi
public void onFeatureReady() { public void onFeatureReady() {
} }
@@ -448,7 +488,9 @@ public class RcsFeature extends ImsFeature {
* has already been created in the framework. * has already been created in the framework.
* @param listener A {@link CapabilityExchangeEventListener} to send the capability exchange * @param listener A {@link CapabilityExchangeEventListener} to send the capability exchange
* event to the framework. * event to the framework.
* @hide
*/ */
@SystemApi
private void initRcsCapabilityExchangeImplBase( private void initRcsCapabilityExchangeImplBase(
@NonNull CapabilityExchangeEventListener listener) { @NonNull CapabilityExchangeEventListener listener) {
synchronized (mLock) { synchronized (mLock) {

View File

@@ -34,7 +34,6 @@ import com.android.internal.telephony.util.RemoteCallbackListExt;
import com.android.internal.telephony.util.TelephonyUtils; import com.android.internal.telephony.util.TelephonyUtils;
import com.android.internal.util.ArrayUtils; import com.android.internal.util.ArrayUtils;
import java.lang.annotation.Retention; import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy; import java.lang.annotation.RetentionPolicy;
import java.util.concurrent.CancellationException; import java.util.concurrent.CancellationException;
@@ -51,9 +50,7 @@ import java.util.function.Supplier;
* <p> * <p>
* Note: There is no guarantee on the thread that the calls from the framework will be called on. It * 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. * is the implementors responsibility to handle moving the calls to a working thread if required.
* @hide
*/ */
@SystemApi
public class ImsRegistrationImplBase { public class ImsRegistrationImplBase {
private static final String LOG_TAG = "ImsRegistrationImplBase"; private static final String LOG_TAG = "ImsRegistrationImplBase";
@@ -94,6 +91,12 @@ public class ImsRegistrationImplBase {
*/ */
public static final int REGISTRATION_TECH_NR = 3; 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 // Registration states, used to notify new ImsRegistrationImplBase#Callbacks of the current
// state. // state.
// The unknown state is set as the initialization state. This is so that we do not call back // 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 * Method stubs called from the framework will be called asynchronously. To specify the
* {@link Executor} that the methods stubs will be called, use * {@link Executor} that the methods stubs will be called, use
* {@link ImsRegistrationImplBase#ImsRegistrationImplBase(Executor)} instead. * {@link ImsRegistrationImplBase#ImsRegistrationImplBase(Executor)} instead.
* @hide This API is not part of the Android public SDK API
*/ */
@SystemApi
public ImsRegistrationImplBase() { public ImsRegistrationImplBase() {
super(); super();
} }
@@ -119,7 +124,9 @@ public class ImsRegistrationImplBase {
* framework. * framework.
* @param executor The executor for the framework to use when executing the methods overridden * @param executor The executor for the framework to use when executing the methods overridden
* by the implementation of ImsRegistration. * by the implementation of ImsRegistration.
* @hide This API is not part of the Android public SDK API
*/ */
@SystemApi
public ImsRegistrationImplBase(@NonNull Executor executor) { public ImsRegistrationImplBase(@NonNull Executor executor) {
super(); super();
mExecutor = executor; mExecutor = executor;
@@ -250,7 +257,9 @@ public class ImsRegistrationImplBase {
* If the SIP delegate feature tag configuration has changed, then this method will be * 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 * called in order to let the ImsService know that it can pick up these changes in the IMS
* registration. * registration.
* @hide This API is not part of the Android public SDK API
*/ */
@SystemApi
public void updateSipDelegateRegistration() { public void updateSipDelegateRegistration() {
// Stub implementation, ImsService should implement this // Stub implementation, ImsService should implement this
} }
@@ -266,7 +275,9 @@ public class ImsRegistrationImplBase {
* <p> * <p>
* This should not affect the registration of features managed by the ImsService itself, such as * This should not affect the registration of features managed by the ImsService itself, such as
* feature tags related to MMTEL registration. * feature tags related to MMTEL registration.
* @hide This API is not part of the Android public SDK API
*/ */
@SystemApi
public void triggerSipDelegateDeregistration() { public void triggerSipDelegateDeregistration() {
// Stub implementation, ImsService should implement this // Stub implementation, ImsService should implement this
} }
@@ -284,7 +295,9 @@ public class ImsRegistrationImplBase {
* be carrier specific. * be carrier specific.
* @param sipReason The reason associated with the SIP error code. {@code null} if there was no * @param sipReason The reason associated with the SIP error code. {@code null} if there was no
* reason associated with the error. * 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, public void triggerFullNetworkRegistration(@IntRange(from = 100, to = 699) int sipCode,
@Nullable String sipReason) { @Nullable String sipReason) {
// Stub implementation, ImsService should implement this // 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. * Notify the framework that the device is connected to the IMS network.
* *
* @param imsRadioTech the radio access technology. * @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) { public final void onRegistered(@ImsRegistrationTech int imsRadioTech) {
onRegistered(new ImsRegistrationAttributes.Builder(imsRadioTech).build()); 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. * Notify the framework that the device is connected to the IMS network.
* *
* @param attributes The attributes associated with the IMS registration. * @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) { public final void onRegistered(@NonNull ImsRegistrationAttributes attributes) {
updateToState(attributes, RegistrationManager.REGISTRATION_STATE_REGISTERED); updateToState(attributes, RegistrationManager.REGISTRATION_STATE_REGISTERED);
mCallbacks.broadcastAction((c) -> { mCallbacks.broadcastAction((c) -> {
@@ -320,7 +337,9 @@ public class ImsRegistrationImplBase {
* Notify the framework that the device is trying to connect the IMS network. * Notify the framework that the device is trying to connect the IMS network.
* *
* @param imsRadioTech the radio access technology. * @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) { public final void onRegistering(@ImsRegistrationTech int imsRadioTech) {
onRegistering(new ImsRegistrationAttributes.Builder(imsRadioTech).build()); 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. * Notify the framework that the device is trying to connect the IMS network.
* *
* @param attributes The attributes associated with the IMS registration. * @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) { public final void onRegistering(@NonNull ImsRegistrationAttributes attributes) {
updateToState(attributes, RegistrationManager.REGISTRATION_STATE_REGISTERING); updateToState(attributes, RegistrationManager.REGISTRATION_STATE_REGISTERING);
mCallbacks.broadcastAction((c) -> { mCallbacks.broadcastAction((c) -> {
@@ -356,7 +377,9 @@ public class ImsRegistrationImplBase {
* result. * result.
* *
* @param info the {@link ImsReasonInfo} associated with why registration was disconnected. * @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) { public final void onDeregistered(ImsReasonInfo info) {
updateToDisconnectedState(info); updateToDisconnectedState(info);
// ImsReasonInfo should never be null. // ImsReasonInfo should never be null.
@@ -377,7 +400,9 @@ public class ImsRegistrationImplBase {
* {@link #REGISTRATION_TECH_LTE}, {@link #REGISTRATION_TECH_IWLAN} and * {@link #REGISTRATION_TECH_LTE}, {@link #REGISTRATION_TECH_IWLAN} and
* {@link #REGISTRATION_TECH_CROSS_SIM}. * {@link #REGISTRATION_TECH_CROSS_SIM}.
* @param info The {@link ImsReasonInfo} for the failure to change technology. * @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, public final void onTechnologyChangeFailed(@ImsRegistrationTech int imsRadioTech,
ImsReasonInfo info) { ImsReasonInfo info) {
final ImsReasonInfo reasonInfo = (info != null) ? info : new ImsReasonInfo(); 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. * The {@link Uri}s are not guaranteed to be different between subsequent calls.
* @param uris changed uris * @param uris changed uris
* @hide This API is not part of the Android public SDK API
*/ */
@SystemApi
public final void onSubscriberAssociatedUriChanged(Uri[] uris) { public final void onSubscriberAssociatedUriChanged(Uri[] uris) {
synchronized (mLock) { synchronized (mLock) {
mUris = ArrayUtils.cloneOrNull(uris); mUris = ArrayUtils.cloneOrNull(uris);

View File

@@ -55,6 +55,7 @@ import android.telephony.VisualVoicemailSmsFilterSettings;
import android.telephony.emergency.EmergencyNumber; import android.telephony.emergency.EmergencyNumber;
import android.telephony.ims.RcsClientConfiguration; import android.telephony.ims.RcsClientConfiguration;
import android.telephony.ims.RcsContactUceCapability; import android.telephony.ims.RcsContactUceCapability;
import android.telephony.ims.aidl.IFeatureProvisioningCallback;
import android.telephony.ims.aidl.IImsCapabilityCallback; import android.telephony.ims.aidl.IImsCapabilityCallback;
import android.telephony.ims.aidl.IImsConfig; import android.telephony.ims.aidl.IImsConfig;
import android.telephony.ims.aidl.IImsConfigCallback; import android.telephony.ims.aidl.IImsConfigCallback;
@@ -2026,6 +2027,18 @@ interface ITelephony {
*/ */
void unregisterImsProvisioningChangedCallback(int subId, IImsConfigCallback callback); 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. * 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. * 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. * Set the provisioning status for the IMS Rcs capability using the specified subscription.
*/ */
void setRcsProvisioningStatusForCapability(int subId, int capability, void setRcsProvisioningStatusForCapability(int subId, int capability, int tech,
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,
boolean isProvisioned); boolean isProvisioned);
/** /**
@@ -2555,4 +2561,18 @@ interface ITelephony {
* @return the service name of the modem service which bind to. * @return the service name of the modem service which bind to.
*/ */
String getModemService(); 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);
} }