From e652cb17360f7d0aeb6ff53798ae06cdc76f851d Mon Sep 17 00:00:00 2001 From: Jeff Davidson Date: Fri, 23 Feb 2018 15:27:46 -0800 Subject: [PATCH] Allow carrier privileged apps to access Telephony/Subscription APIs. -All public APIs in TelephonyManager which require READ_PHONE_STATE will now also be documented to accept carrier privileged callers as well. (One exception is the change callbacks in each, which will be addressed in a separate CL). -For SubscriptionManager, callers without READ_PHONE_STATE will now be able to access the subscription list; however, the resulting list will be filtered to only include subscriptions for which the caller has carrier privileges. -All @see references to hasCarrierPrivileges have been removed in favor of an inline {@link}. The @see section is set apart from the rest of the Javadoc and thus appears out of context of where it's actually relevant; moreover, it is often placed in the middle of a line which makes it invalid. Using {@link} inlines the reference where it's actually relevant. -@SuppressAutodoc is added to any public method which has a @RequiresPermission declaration that isn't a sufficient description of the allowed callers, i.e. for APIs which accept carrier-privileged callers, or the default dialer app or other exceptional cases. This ensures redundant (but incorrect) requires permission declarations aren't autogenerated. Bug: 70041899 Test: TreeHugger, unit tests in topic Change-Id: Ia5cc145c19d99fe2b87e3425bb95281980edef6f Merged-In: Ia5cc145c19d99fe2b87e3425bb95281980edef6f (cherry picked from commit bc10ce1efec7819d67cbd4b457ef91ce9db062cb) --- .../com/android/server/TelephonyRegistry.java | 12 +- .../telephony/SubscriptionManager.java | 37 +- .../android/telephony/TelephonyManager.java | 344 ++++++++++-------- .../telephony/TelephonyPermissions.java | 83 ++++- 4 files changed, 302 insertions(+), 174 deletions(-) diff --git a/services/core/java/com/android/server/TelephonyRegistry.java b/services/core/java/com/android/server/TelephonyRegistry.java index 3927ebd593bd0..62e82a064db22 100644 --- a/services/core/java/com/android/server/TelephonyRegistry.java +++ b/services/core/java/com/android/server/TelephonyRegistry.java @@ -394,8 +394,10 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub { + " callback.asBinder=" + callback.asBinder()); } + // TODO(b/70041899): Find a way to make this work for carrier-privileged callers. if (!TelephonyPermissions.checkCallingOrSelfReadPhoneState( - mContext, callingPackage, "addOnSubscriptionsChangedListener")) { + mContext, SubscriptionManager.INVALID_SUBSCRIPTION_ID, callingPackage, + "addOnSubscriptionsChangedListener")) { return; } @@ -686,8 +688,9 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub { private boolean canReadPhoneState(String callingPackage, String message) { try { + // TODO(b/70041899): Find a way to make this work for carrier-privileged callers. return TelephonyPermissions.checkCallingOrSelfReadPhoneState( - mContext, callingPackage, message); + mContext, SubscriptionManager.INVALID_SUBSCRIPTION_ID, callingPackage, message); } catch (SecurityException e) { return false; } @@ -1735,8 +1738,9 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub { } if ((events & ENFORCE_PHONE_STATE_PERMISSION_MASK) != 0) { - if (!TelephonyPermissions.checkCallingOrSelfReadPhoneState( - mContext, callingPackage, message)) { + // TODO(b/70041899): Find a way to make this work for carrier-privileged callers. + if (!TelephonyPermissions.checkCallingOrSelfReadPhoneState(mContext, + SubscriptionManager.INVALID_SUBSCRIPTION_ID, callingPackage, message)) { return false; } } diff --git a/telephony/java/android/telephony/SubscriptionManager.java b/telephony/java/android/telephony/SubscriptionManager.java index d09d4263ccc5f..dac96a68f28a2 100644 --- a/telephony/java/android/telephony/SubscriptionManager.java +++ b/telephony/java/android/telephony/SubscriptionManager.java @@ -17,9 +17,11 @@ package android.telephony; import android.annotation.NonNull; +import android.annotation.RequiresPermission; import android.annotation.SdkConstant; -import android.annotation.SystemApi; import android.annotation.SdkConstant.SdkConstantType; +import android.annotation.SuppressAutoDoc; +import android.annotation.SystemApi; import android.annotation.SystemService; import android.content.Context; import android.content.Intent; @@ -47,9 +49,6 @@ import java.util.List; /** * SubscriptionManager is the application interface to SubscriptionController * and provides information about the current Telephony Subscriptions. - *

- * All SDK public methods require android.Manifest.permission.READ_PHONE_STATE unless otherwise - * specified. */ @SystemService(Context.TELEPHONY_SUBSCRIPTION_SERVICE) public class SubscriptionManager { @@ -542,6 +541,8 @@ public class SubscriptionManager { * @param listener an instance of {@link OnSubscriptionsChangedListener} with * onSubscriptionsChanged overridden. */ + // TODO(b/70041899): Find a way to extend this to carrier-privileged apps. + @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) public void addOnSubscriptionsChangedListener(OnSubscriptionsChangedListener listener) { String pkgName = mContext != null ? mContext.getOpPackageName() : ""; if (DBG) { @@ -590,9 +591,15 @@ public class SubscriptionManager { /** * Get the active SubscriptionInfo with the input subId. * + *

Requires Permission: {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE} + * or that the calling app has carrier privileges (see + * {@link TelephonyManager#hasCarrierPrivileges}). + * * @param subId The unique SubscriptionInfo key in database. * @return SubscriptionInfo, maybe null if its not active. */ + @SuppressAutoDoc // Blocked by b/72967236 - no support for carrier privileges + @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) public SubscriptionInfo getActiveSubscriptionInfo(int subId) { if (VDBG) logd("[getActiveSubscriptionInfo]+ subId=" + subId); if (!isValidSubscriptionId(subId)) { @@ -646,9 +653,16 @@ public class SubscriptionManager { /** * Get the active SubscriptionInfo associated with the slotIndex + * + *

Requires Permission: {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE} + * or that the calling app has carrier privileges (see + * {@link TelephonyManager#hasCarrierPrivileges}). + * * @param slotIndex the slot which the subscription is inserted * @return SubscriptionInfo, maybe null if its not active */ + @SuppressAutoDoc // Blocked by b/72967236 - no support for carrier privileges + @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) public SubscriptionInfo getActiveSubscriptionInfoForSimSlotIndex(int slotIndex) { if (VDBG) logd("[getActiveSubscriptionInfoForSimSlotIndex]+ slotIndex=" + slotIndex); if (!isValidSlotIndex(slotIndex)) { @@ -700,6 +714,11 @@ public class SubscriptionManager { * Get the SubscriptionInfo(s) of the currently inserted SIM(s). The records will be sorted * by {@link SubscriptionInfo#getSimSlotIndex} then by {@link SubscriptionInfo#getSubscriptionId}. * + *

Requires Permission: {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE} + * or that the calling app has carrier privileges (see + * {@link TelephonyManager#hasCarrierPrivileges}). In the latter case, only records accessible + * to the calling app are returned. + * * @return Sorted list of the currently {@link SubscriptionInfo} records available on the device. *

*/ + @SuppressAutoDoc // Blocked by b/72967236 - no support for carrier privileges + @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) public List getActiveSubscriptionInfoList() { List result = null; @@ -858,10 +879,18 @@ public class SubscriptionManager { } /** + * + * Requires Permission: {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE} + * or that the calling app has carrier privileges (see + * {@link TelephonyManager#hasCarrierPrivileges}). In the latter case, the count will include + * only those subscriptions accessible to the caller. + * * @return the current number of active subscriptions. There is no guarantee the value * returned by this method will be the same as the length of the list returned by * {@link #getActiveSubscriptionInfoList}. */ + @SuppressAutoDoc // Blocked by b/72967236 - no support for carrier privileges + @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) public int getActiveSubscriptionInfoCount() { int result = 0; diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java index 1c9f371405d8d..ddf6500e0148a 100644 --- a/telephony/java/android/telephony/TelephonyManager.java +++ b/telephony/java/android/telephony/TelephonyManager.java @@ -23,6 +23,7 @@ import android.annotation.Nullable; import android.annotation.RequiresPermission; import android.annotation.SdkConstant; import android.annotation.SdkConstant.SdkConstantType; +import android.annotation.SuppressAutoDoc; import android.annotation.SuppressLint; import android.annotation.SystemApi; import android.annotation.SystemService; @@ -52,7 +53,6 @@ import android.telephony.ims.aidl.IImsConfig; import android.telephony.ims.aidl.IImsMmTelFeature; import android.telephony.ims.aidl.IImsRcsFeature; import android.telephony.ims.aidl.IImsRegistration; -import android.telephony.ims.feature.ImsFeature; import android.telephony.ims.stub.ImsRegistrationImplBase; import android.util.Log; @@ -1082,7 +1082,11 @@ public class TelephonyManager { * Returns the software version number for the device, for example, * the IMEI/SV for GSM phones. Return null if the software version is * not available. + * + *

Requires Permission: {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE} + * or that the calling app has carrier privileges (see {@link #hasCarrierPrivileges}). */ + @SuppressAutoDoc // Blocked by b/72967236 - no support for carrier privileges @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) public String getDeviceSoftwareVersion() { return getDeviceSoftwareVersion(getSlotIndex()); @@ -1114,10 +1118,14 @@ public class TelephonyManager { * Returns the unique device ID, for example, the IMEI for GSM and the MEID * or ESN for CDMA phones. Return null if device ID is not available. * + *

Requires Permission: {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE} + * or that the calling app has carrier privileges (see {@link #hasCarrierPrivileges}). + * * @deprecated Use (@link getImei} which returns IMEI for GSM or (@link getMeid} which returns * MEID for CDMA. */ @Deprecated + @SuppressAutoDoc // Blocked by b/72967236 - no support for carrier privileges @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) public String getDeviceId() { try { @@ -1136,12 +1144,16 @@ public class TelephonyManager { * Returns the unique device ID of a subscription, for example, the IMEI for * GSM and the MEID for CDMA phones. Return null if device ID is not available. * + *

Requires Permission: {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE} + * or that the calling app has carrier privileges (see {@link #hasCarrierPrivileges}). + * * @param slotIndex of which deviceID is returned * * @deprecated Use (@link getImei} which returns IMEI for GSM or (@link getMeid} which returns * MEID for CDMA. */ @Deprecated + @SuppressAutoDoc // Blocked by b/72967236 - no support for carrier privileges @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) public String getDeviceId(int slotIndex) { // FIXME this assumes phoneId == slotIndex @@ -1160,7 +1172,11 @@ public class TelephonyManager { /** * Returns the IMEI (International Mobile Equipment Identity). Return null if IMEI is not * available. + * + *

Requires Permission: {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE} + * or that the calling app has carrier privileges (see {@link #hasCarrierPrivileges}). */ + @SuppressAutoDoc // Blocked by b/72967236 - no support for carrier privileges @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) public String getImei() { return getImei(getSlotIndex()); @@ -1170,8 +1186,12 @@ public class TelephonyManager { * Returns the IMEI (International Mobile Equipment Identity). Return null if IMEI is not * available. * + *

Requires Permission: {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE} + * or that the calling app has carrier privileges (see {@link #hasCarrierPrivileges}). + * * @param slotIndex of which IMEI is returned */ + @SuppressAutoDoc // Blocked by b/72967236 - no support for carrier privileges @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) public String getImei(int slotIndex) { ITelephony telephony = getITelephony(); @@ -1188,7 +1208,11 @@ public class TelephonyManager { /** * Returns the MEID (Mobile Equipment Identifier). Return null if MEID is not available. + * + *

Requires Permission: {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE} + * or that the calling app has carrier privileges (see {@link #hasCarrierPrivileges}). */ + @SuppressAutoDoc // Blocked by b/72967236 - no support for carrier privileges @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) public String getMeid() { return getMeid(getSlotIndex()); @@ -1197,8 +1221,12 @@ public class TelephonyManager { /** * Returns the MEID (Mobile Equipment Identifier). Return null if MEID is not available. * + *

Requires Permission: {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE} + * or that the calling app has carrier privileges (see {@link #hasCarrierPrivileges}). + * * @param slotIndex of which MEID is returned */ + @SuppressAutoDoc // Blocked by b/72967236 - no support for carrier privileges @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) public String getMeid(int slotIndex) { ITelephony telephony = getITelephony(); @@ -1215,10 +1243,11 @@ public class TelephonyManager { /** * Returns the Network Access Identifier (NAI). Return null if NAI is not available. - *

- * Requires Permission: - * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE} + * + *

Requires Permission: {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE} + * or that the calling app has carrier privileges (see {@link #hasCarrierPrivileges}). */ + @SuppressAutoDoc // Blocked by b/72967236 - no support for carrier privileges @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) public String getNai() { return getNaiBySubscriberId(getSubId()); @@ -1719,6 +1748,7 @@ public class TelephonyManager { * @see #createForSubscriptionId(int) * @see #createForPhoneAccountHandle(PhoneAccountHandle) */ + // TODO(b/73136824, b/70041899): Permit carrier-privileged callers as well. @WorkerThread @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) public PersistableBundle getCarrierConfig() { @@ -1918,6 +1948,9 @@ public class TelephonyManager { * If this object has been created with {@link #createForSubscriptionId}, applies to the given * subId. Otherwise, applies to {@link SubscriptionManager#getDefaultDataSubscriptionId()} * + *

Requires Permission: {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE} + * or that the calling app has carrier privileges (see {@link #hasCarrierPrivileges}). + * * @return the network type * * @see #NETWORK_TYPE_UNKNOWN @@ -1937,6 +1970,7 @@ public class TelephonyManager { * @see #NETWORK_TYPE_EHRPD * @see #NETWORK_TYPE_HSPAP */ + @SuppressAutoDoc // Blocked by b/72967236 - no support for carrier privileges @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) public int getDataNetworkType() { return getDataNetworkType(getSubId(SubscriptionManager.getDefaultDataSubscriptionId())); @@ -1971,7 +2005,11 @@ public class TelephonyManager { /** * Returns the NETWORK_TYPE_xxxx for voice + * + *

Requires Permission: {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE} + * or that the calling app has carrier privileges (see {@link #hasCarrierPrivileges}). */ + @SuppressAutoDoc // Blocked by b/72967236 - no support for carrier privileges @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) public int getVoiceNetworkType() { return getVoiceNetworkType(getSubId()); @@ -2557,7 +2595,11 @@ public class TelephonyManager { /** * Returns the serial number of the SIM, if applicable. Return null if it is * unavailable. + * + *

Requires Permission: {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE} + * or that the calling app has carrier privileges (see {@link #hasCarrierPrivileges}). */ + @SuppressAutoDoc // Blocked by b/72967236 - no support for carrier privileges @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) public String getSimSerialNumber() { return getSimSerialNumber(getSubId()); @@ -2682,7 +2724,11 @@ public class TelephonyManager { /** * Returns the unique subscriber ID, for example, the IMSI for a GSM phone. * Return null if it is unavailable. + * + *

Requires Permission: {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE} + * or that the calling app has carrier privileges (see {@link #hasCarrierPrivileges}). */ + @SuppressAutoDoc // Blocked by b/72967236 - no support for carrier privileges @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) public String getSubscriberId() { return getSubscriberId(getSubId()); @@ -2823,7 +2869,11 @@ public class TelephonyManager { /** * Returns the Group Identifier Level1 for a GSM phone. * Return null if it is unavailable. + * + *

Requires Permission: {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE} + * or that the calling app has carrier privileges (see {@link #hasCarrierPrivileges}). */ + @SuppressAutoDoc // Blocked by b/72967236 - no support for carrier privileges @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) public String getGroupIdLevel1() { try { @@ -2864,9 +2914,15 @@ public class TelephonyManager { /** * Returns the phone number string for line 1, for example, the MSISDN * for a GSM phone. Return null if it is unavailable. - *

- * The default SMS app can also use this. + * + *

Requires Permission: + * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE}, + * {@link android.Manifest.permission#READ_SMS READ_SMS}, + * {@link android.Manifest.permission#READ_PHONE_NUMBERS READ_PHONE_NUMBERS}, + * that the caller is the default SMS app, + * or that the caller has carrier privileges (see {@link #hasCarrierPrivileges}). */ + @SuppressAutoDoc // Blocked by b/72967236 - no support for carrier privileges or default SMS app @RequiresPermission(anyOf = { android.Manifest.permission.READ_PHONE_STATE, android.Manifest.permission.READ_SMS, @@ -2921,8 +2977,7 @@ public class TelephonyManager { * change the actual MSISDN/MDN. To unset alphatag or number, pass in a null * value. * - *

Requires that the calling app has carrier privileges. - * @see #hasCarrierPrivileges + *

Requires that the calling app has carrier privileges (see {@link #hasCarrierPrivileges}). * * @param alphaTag alpha-tagging of the dailing nubmer * @param number The dialing number @@ -2938,8 +2993,7 @@ public class TelephonyManager { * change the actual MSISDN/MDN. To unset alphatag or number, pass in a null * value. * - *

Requires that the calling app has carrier privileges. - * @see #hasCarrierPrivileges + *

Requires that the calling app has carrier privileges (see {@link #hasCarrierPrivileges}). * * @param subId the subscriber that the alphatag and dialing number belongs to. * @param alphaTag alpha-tagging of the dailing nubmer @@ -3058,7 +3112,11 @@ public class TelephonyManager { /** * Returns the voice mail number. Return null if it is unavailable. + * + *

Requires Permission: {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE} + * or that the calling app has carrier privileges (see {@link #hasCarrierPrivileges}). */ + @SuppressAutoDoc // Blocked by b/72967236 - no support for carrier privileges @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) public String getVoiceMailNumber() { return getVoiceMailNumber(getSubId()); @@ -3119,8 +3177,7 @@ public class TelephonyManager { /** * Sets the voice mail number. * - *

Requires that the calling app has carrier privileges. - * @see #hasCarrierPrivileges + *

Requires that the calling app has carrier privileges (see {@link #hasCarrierPrivileges}). * * @param alphaTag The alpha tag to display. * @param number The voicemail number. @@ -3132,8 +3189,7 @@ public class TelephonyManager { /** * Sets the voicemail number for the given subscriber. * - *

Requires that the calling app has carrier privileges. - * @see #hasCarrierPrivileges + *

Requires that the calling app has carrier privileges (see {@link #hasCarrierPrivileges}). * * @param subId The subscription id. * @param alphaTag The alpha tag to display. @@ -3154,9 +3210,9 @@ public class TelephonyManager { /** * Enables or disables the visual voicemail client for a phone account. * - *

Requires that the calling app is the default dialer, or has carrier privileges, or - * has permission {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE}. - * @see #hasCarrierPrivileges + *

Requires that the calling app is the default dialer, or has carrier privileges (see + * {@link #hasCarrierPrivileges}), or has permission + * {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE}. * * @param phoneAccountHandle the phone account to change the client state * @param enabled the new state of the client @@ -3219,11 +3275,15 @@ public class TelephonyManager { * to the TelephonyManager. Returns {@code null} when there is no package responsible for * processing visual voicemail for the subscription. * + *

Requires Permission: {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE} + * or that the calling app has carrier privileges (see {@link #hasCarrierPrivileges}). + * * @see #createForSubscriptionId(int) * @see #createForPhoneAccountHandle(PhoneAccountHandle) * @see VisualVoicemailService */ @Nullable + @SuppressAutoDoc // Blocked by b/72967236 - no support for carrier privileges @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) public String getVisualVoicemailPackageName() { try { @@ -3466,15 +3526,14 @@ public class TelephonyManager { * Sets the voice activation state * *

Requires Permission: - * {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE} - * Or the calling app has carrier privileges. + * {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE} or that the + * calling app has carrier privileges (see {@link #hasCarrierPrivileges}). * * @param activationState The voice activation state * @see #SIM_ACTIVATION_STATE_UNKNOWN * @see #SIM_ACTIVATION_STATE_ACTIVATING * @see #SIM_ACTIVATION_STATE_ACTIVATED * @see #SIM_ACTIVATION_STATE_DEACTIVATED - * @see #hasCarrierPrivileges * @hide */ @SystemApi @@ -3487,8 +3546,8 @@ public class TelephonyManager { * Sets the voice activation state for the given subscriber. * *

Requires Permission: - * {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE} - * Or the calling app has carrier privileges. + * {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE} or that the + * calling app has carrier privileges (see {@link #hasCarrierPrivileges}). * * @param subId The subscription id. * @param activationState The voice activation state of the given subscriber. @@ -3496,7 +3555,6 @@ public class TelephonyManager { * @see #SIM_ACTIVATION_STATE_ACTIVATING * @see #SIM_ACTIVATION_STATE_ACTIVATED * @see #SIM_ACTIVATION_STATE_DEACTIVATED - * @see #hasCarrierPrivileges * @hide */ @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) @@ -3514,8 +3572,8 @@ public class TelephonyManager { * Sets the data activation state * *

Requires Permission: - * {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE} - * Or the calling app has carrier privileges. + * {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE} or that the + * calling app has carrier privileges (see {@link #hasCarrierPrivileges}). * * @param activationState The data activation state * @see #SIM_ACTIVATION_STATE_UNKNOWN @@ -3523,7 +3581,6 @@ public class TelephonyManager { * @see #SIM_ACTIVATION_STATE_ACTIVATED * @see #SIM_ACTIVATION_STATE_DEACTIVATED * @see #SIM_ACTIVATION_STATE_RESTRICTED - * @see #hasCarrierPrivileges * @hide */ @SystemApi @@ -3536,8 +3593,8 @@ public class TelephonyManager { * Sets the data activation state for the given subscriber. * *

Requires Permission: - * {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE} - * Or the calling app has carrier privileges. + * {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE} or that the + * calling app has carrier privileges (see {@link #hasCarrierPrivileges}). * * @param subId The subscription id. * @param activationState The data activation state of the given subscriber. @@ -3546,7 +3603,6 @@ public class TelephonyManager { * @see #SIM_ACTIVATION_STATE_ACTIVATED * @see #SIM_ACTIVATION_STATE_DEACTIVATED * @see #SIM_ACTIVATION_STATE_RESTRICTED - * @see #hasCarrierPrivileges * @hide */ @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) @@ -3564,15 +3620,14 @@ public class TelephonyManager { * Returns the voice activation state * *

Requires Permission: - * {@link android.Manifest.permission#READ_PRIVILEGED_PHONE_STATE READ_PRIVILEGED_PHONE_STATE} - * Or the calling app has carrier privileges. + * {@link android.Manifest.permission#READ_PRIVILEGED_PHONE_STATE READ_PRIVILEGED_PHONE_STATE} + * or that the calling app has carrier privileges (see {@link #hasCarrierPrivileges}). * * @return voiceActivationState * @see #SIM_ACTIVATION_STATE_UNKNOWN * @see #SIM_ACTIVATION_STATE_ACTIVATING * @see #SIM_ACTIVATION_STATE_ACTIVATED * @see #SIM_ACTIVATION_STATE_DEACTIVATED - * @see #hasCarrierPrivileges * @hide */ @SystemApi @@ -3585,8 +3640,8 @@ public class TelephonyManager { * Returns the voice activation state for the given subscriber. * *

Requires Permission: - * {@link android.Manifest.permission#READ_PRIVILEGED_PHONE_STATE READ_PRIVILEGED_PHONE_STATE} - * Or the calling app has carrier privileges. + * {@link android.Manifest.permission#READ_PRIVILEGED_PHONE_STATE READ_PRIVILEGED_PHONE_STATE} + * or that the calling app has carrier privileges (see {@link #hasCarrierPrivileges}). * * @param subId The subscription id. * @@ -3595,7 +3650,6 @@ public class TelephonyManager { * @see #SIM_ACTIVATION_STATE_ACTIVATING * @see #SIM_ACTIVATION_STATE_ACTIVATED * @see #SIM_ACTIVATION_STATE_DEACTIVATED - * @see #hasCarrierPrivileges * @hide */ @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) @@ -3614,8 +3668,8 @@ public class TelephonyManager { * Returns the data activation state * *

Requires Permission: - * {@link android.Manifest.permission#READ_PRIVILEGED_PHONE_STATE READ_PRIVILEGED_PHONE_STATE} - * Or the calling app has carrier privileges. + * {@link android.Manifest.permission#READ_PRIVILEGED_PHONE_STATE READ_PRIVILEGED_PHONE_STATE} + * or that the calling app has carrier privileges (see {@link #hasCarrierPrivileges}). * * @return dataActivationState for the given subscriber * @see #SIM_ACTIVATION_STATE_UNKNOWN @@ -3623,7 +3677,6 @@ public class TelephonyManager { * @see #SIM_ACTIVATION_STATE_ACTIVATED * @see #SIM_ACTIVATION_STATE_DEACTIVATED * @see #SIM_ACTIVATION_STATE_RESTRICTED - * @see #hasCarrierPrivileges * @hide */ @SystemApi @@ -3636,8 +3689,8 @@ public class TelephonyManager { * Returns the data activation state for the given subscriber. * *

Requires Permission: - * {@link android.Manifest.permission#READ_PRIVILEGED_PHONE_STATE READ_PRIVILEGED_PHONE_STATE} - * Or the calling app has carrier privileges. + * {@link android.Manifest.permission#READ_PRIVILEGED_PHONE_STATE READ_PRIVILEGED_PHONE_STATE} + * or that the calling app has carrier privileges (see {@link #hasCarrierPrivileges}). * * @param subId The subscription id. * @@ -3647,7 +3700,6 @@ public class TelephonyManager { * @see #SIM_ACTIVATION_STATE_ACTIVATED * @see #SIM_ACTIVATION_STATE_DEACTIVATED * @see #SIM_ACTIVATION_STATE_RESTRICTED - * @see #hasCarrierPrivileges * @hide */ @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) @@ -3695,7 +3747,11 @@ public class TelephonyManager { /** * Retrieves the alphabetic identifier associated with the voice * mail number. + * + *

Requires Permission: {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE} + * or that the calling app has carrier privileges (see {@link #hasCarrierPrivileges}). */ + @SuppressAutoDoc // Blocked by b/72967236 - no support for carrier privileges @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) public String getVoiceMailAlphaTag() { return getVoiceMailAlphaTag(getSubId()); @@ -3724,9 +3780,8 @@ public class TelephonyManager { } /** - * Send the special dialer code. The IPC caller must be the current default dialer or has - * carrier privileges. - * @see #hasCarrierPrivileges + * Send the special dialer code. The IPC caller must be the current default dialer or have + * carrier privileges (see {@link #hasCarrierPrivileges}). * * @param inputCode The special dialer code to send * @@ -4254,8 +4309,8 @@ public class TelephonyManager { * Input parameters equivalent to TS 27.007 AT+CCHO command. * *

Requires Permission: - * {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE} - * Or the calling app has carrier privileges. @see #hasCarrierPrivileges + * {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE} or that the calling + * app has carrier privileges (see {@link #hasCarrierPrivileges}). * * @param AID Application id. See ETSI 102.221 and 101.220. * @return an IccOpenLogicalChannelResponse object. @@ -4272,8 +4327,8 @@ public class TelephonyManager { * Input parameters equivalent to TS 27.007 AT+CCHO command. * *

Requires Permission: - * {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE} - * Or the calling app has carrier privileges. @see #hasCarrierPrivileges + * {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE} or that the calling + * app has carrier privileges (see {@link #hasCarrierPrivileges}). * * @param AID Application id. See ETSI 102.221 and 101.220. * @param p2 P2 parameter (described in ISO 7816-4). @@ -4289,8 +4344,8 @@ public class TelephonyManager { * Input parameters equivalent to TS 27.007 AT+CCHO command. * *

Requires Permission: - * {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE} - * Or the calling app has carrier privileges. @see #hasCarrierPrivileges + * {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE} or that the calling + * app has carrier privileges (see {@link #hasCarrierPrivileges}). * * @param subId The subscription to use. * @param AID Application id. See ETSI 102.221 and 101.220. @@ -4315,8 +4370,8 @@ public class TelephonyManager { * Input parameters equivalent to TS 27.007 AT+CCHC command. * *

Requires Permission: - * {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE} - * Or the calling app has carrier privileges. @see #hasCarrierPrivileges + * {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE} or that the calling + * app has carrier privileges (see {@link #hasCarrierPrivileges}). * * @param channel is the channel id to be closed as retruned by a successful * iccOpenLogicalChannel. @@ -4332,8 +4387,8 @@ public class TelephonyManager { * Input parameters equivalent to TS 27.007 AT+CCHC command. * *

Requires Permission: - * {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE} - * Or the calling app has carrier privileges. @see #hasCarrierPrivileges + * {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE} or that the calling + * app has carrier privileges (see {@link #hasCarrierPrivileges}). * * @param subId The subscription to use. * @param channel is the channel id to be closed as retruned by a successful @@ -4358,8 +4413,8 @@ public class TelephonyManager { * Input parameters equivalent to TS 27.007 AT+CGLA command. * *

Requires Permission: - * {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE} - * Or the calling app has carrier privileges. @see #hasCarrierPrivileges + * {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE} or that the calling + * app has carrier privileges (see {@link #hasCarrierPrivileges}). * * @param channel is the channel id to be closed as returned by a successful * iccOpenLogicalChannel. @@ -4385,8 +4440,8 @@ public class TelephonyManager { * Input parameters equivalent to TS 27.007 AT+CGLA command. * *

Requires Permission: - * {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE} - * Or the calling app has carrier privileges. @see #hasCarrierPrivileges + * {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE} or that the calling + * app has carrier privileges (see {@link #hasCarrierPrivileges}). * * @param subId The subscription to use. * @param channel is the channel id to be closed as returned by a successful @@ -4421,8 +4476,8 @@ public class TelephonyManager { * Input parameters equivalent to TS 27.007 AT+CSIM command. * *

Requires Permission: - * {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE} - * Or the calling app has carrier privileges. @see #hasCarrierPrivileges + * {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE} or that the calling + * app has carrier privileges (see {@link #hasCarrierPrivileges}). * * @param cla Class of the APDU command. * @param instruction Instruction of the APDU command. @@ -4446,8 +4501,8 @@ public class TelephonyManager { * Input parameters equivalent to TS 27.007 AT+CSIM command. * *

Requires Permission: - * {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE} - * Or the calling app has carrier privileges. @see #hasCarrierPrivileges + * {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE} or that the calling + * app has carrier privileges (see {@link #hasCarrierPrivileges}). * * @param subId The subscription to use. * @param cla Class of the APDU command. @@ -4478,8 +4533,8 @@ public class TelephonyManager { * Returns the response APDU for a command APDU sent through SIM_IO. * *

Requires Permission: - * {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE} - * Or the calling app has carrier privileges. @see #hasCarrierPrivileges + * {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE} or that the calling + * app has carrier privileges (see {@link #hasCarrierPrivileges}). * * @param fileID * @param command @@ -4498,8 +4553,8 @@ public class TelephonyManager { * Returns the response APDU for a command APDU sent through SIM_IO. * *

Requires Permission: - * {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE} - * Or the calling app has carrier privileges. @see #hasCarrierPrivileges + * {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE} or that the calling + * app has carrier privileges (see {@link #hasCarrierPrivileges}). * * @param subId The subscription to use. * @param fileID @@ -4527,8 +4582,8 @@ public class TelephonyManager { * Send ENVELOPE to the SIM and return the response. * *

Requires Permission: - * {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE} - * Or the calling app has carrier privileges. @see #hasCarrierPrivileges + * {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE} or that the calling + * app has carrier privileges (see {@link #hasCarrierPrivileges}). * * @param content String containing SAT/USAT response in hexadecimal * format starting with command tag. See TS 102 223 for @@ -4545,8 +4600,8 @@ public class TelephonyManager { * Send ENVELOPE to the SIM and return the response. * *

Requires Permission: - * {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE} - * Or the calling app has carrier privileges. @see #hasCarrierPrivileges + * {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE} or that the calling + * app has carrier privileges (see {@link #hasCarrierPrivileges}). * * @param subId The subscription to use. * @param content String containing SAT/USAT response in hexadecimal @@ -4571,10 +4626,10 @@ public class TelephonyManager { /** * Read one of the NV items defined in com.android.internal.telephony.RadioNVItems. * Used for device configuration by some CDMA operators. - *

- * Requires Permission: - * {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE} - * Or the calling app has carrier privileges. @see #hasCarrierPrivileges + * + *

Requires Permission: + * {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE} or that the calling + * app has carrier privileges (see {@link #hasCarrierPrivileges}). * * @param itemID the ID of the item to read. * @return the NV item as a String, or null on any failure. @@ -4597,10 +4652,10 @@ public class TelephonyManager { /** * Write one of the NV items defined in com.android.internal.telephony.RadioNVItems. * Used for device configuration by some CDMA operators. - *

- * Requires Permission: - * {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE} - * Or the calling app has carrier privileges. @see #hasCarrierPrivileges + * + *

Requires Permission: + * {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE} or that the calling + * app has carrier privileges (see {@link #hasCarrierPrivileges}). * * @param itemID the ID of the item to read. * @param itemValue the value to write, as a String. @@ -4624,10 +4679,10 @@ public class TelephonyManager { /** * Update the CDMA Preferred Roaming List (PRL) in the radio NV storage. * Used for device configuration by some CDMA operators. - *

- * Requires Permission: - * {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE} - * Or the calling app has carrier privileges. @see #hasCarrierPrivileges + * + *

Requires Permission: + * {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE} or that the calling + * app has carrier privileges (see {@link #hasCarrierPrivileges}). * * @param preferredRoamingList byte array containing the new PRL. * @return true on success; false on any failure. @@ -4651,10 +4706,10 @@ public class TelephonyManager { * Perform the specified type of NV config reset. The radio will be taken offline * and the device must be rebooted after the operation. Used for device * configuration by some CDMA operators. - *

- * Requires Permission: - * {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE} - * Or the calling app has carrier privileges. @see #hasCarrierPrivileges + * + *

Requires Permission: + * {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE} or that the calling + * app has carrier privileges (see {@link #hasCarrierPrivileges}). * * @param resetType reset type: 1: reload NV reset, 2: erase NV reset, 3: factory NV reset * @return true on success; false on any failure. @@ -5002,8 +5057,8 @@ public class TelephonyManager { * Returns the response of authentication for the default subscription. * Returns null if the authentication hasn't been successful * - *

Requires that the calling app has carrier privileges or READ_PRIVILEGED_PHONE_STATE - * permission. + *

Requires Permission: READ_PRIVILEGED_PHONE_STATE or that the calling + * app has carrier privileges (see {@link #hasCarrierPrivileges}). * * @param appType the icc application type, like {@link #APPTYPE_USIM} * @param authType the authentication type, {@link #AUTHTYPE_EAP_AKA} or @@ -5011,9 +5066,10 @@ public class TelephonyManager { * @param data authentication challenge data, base64 encoded. * See 3GPP TS 31.102 7.1.2 for more details. * @return the response of authentication, or null if not available - * - * @see #hasCarrierPrivileges */ + // TODO(b/73660190): This should probably require MODIFY_PHONE_STATE, not + // READ_PRIVILEGED_PHONE_STATE. It certainly shouldn't reference the permission in Javadoc since + // it's not public API. public String getIccAuthentication(int appType, int authType, String data) { return getIccAuthentication(getSubId(), appType, authType, data); } @@ -5022,7 +5078,7 @@ public class TelephonyManager { * Returns the response of USIM Authentication for specified subId. * Returns null if the authentication hasn't been successful * - *

Requires that the calling app has carrier privileges. + *

Requires that the calling app has carrier privileges (see {@link #hasCarrierPrivileges}). * * @param subId subscription ID used for authentication * @param appType the icc application type, like {@link #APPTYPE_USIM} @@ -5031,8 +5087,6 @@ public class TelephonyManager { * @param data authentication challenge data, base64 encoded. * See 3GPP TS 31.102 7.1.2 for more details. * @return the response of authentication, or null if not available - * - * @see #hasCarrierPrivileges * @hide */ public String getIccAuthentication(int subId, int appType, int authType, String data) { @@ -5053,8 +5107,12 @@ public class TelephonyManager { * Returns an array of Forbidden PLMNs from the USIM App * Returns null if the query fails. * + *

Requires Permission: {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE} + * or that the calling app has carrier privileges (see {@link #hasCarrierPrivileges}). + * * @return an array of forbidden PLMNs or null if not available */ + @SuppressAutoDoc // Blocked by b/72967236 - no support for carrier privileges @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) public String[] getForbiddenPlmns() { return getForbiddenPlmns(getSubId(), APPTYPE_USIM); @@ -5260,10 +5318,10 @@ public class TelephonyManager { /** * Get the preferred network type. * Used for device configuration by some CDMA operators. - *

- * Requires Permission: - * {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE} - * Or the calling app has carrier privileges. @see #hasCarrierPrivileges + * + *

Requires Permission: + * {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE} or that the calling + * app has carrier privileges (see {@link #hasCarrierPrivileges}). * * @return the preferred network type, defined in RILConstants.java. * @hide @@ -5283,11 +5341,12 @@ public class TelephonyManager { /** * Sets the network selection mode to automatic. - *

- * Requires Permission: - * {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE} - * Or the calling app has carrier privileges. @see #hasCarrierPrivileges + * + *

Requires Permission: + * {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE} or that the calling + * app has carrier privileges (see {@link #hasCarrierPrivileges}). */ + @SuppressAutoDoc // Blocked by b/72967236 - no support for carrier privileges @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setNetworkSelectionModeAutomatic() { try { @@ -5303,15 +5362,14 @@ public class TelephonyManager { } /** - * Perform a radio scan and return the list of avialble networks. + * Perform a radio scan and return the list of available networks. * * The return value is a list of the OperatorInfo of the networks found. Note that this * scan can take a long time (sometimes minutes) to happen. * - *

- * Requires Permission: - * {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE} - * Or the calling app has carrier privileges. @see #hasCarrierPrivileges + *

Requires Permission: + * {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE} or that the calling + * app has carrier privileges (see {@link #hasCarrierPrivileges}). * * @hide * TODO: Add an overload that takes no args. @@ -5335,17 +5393,16 @@ public class TelephonyManager { * This method is asynchronous, so the network scan results will be returned by callback. * The returned NetworkScan will contain a callback method which can be used to stop the scan. * - *

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

Requires Permission: + * {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE} or that the calling + * app has carrier privileges (see {@link #hasCarrierPrivileges}). * * @param request Contains all the RAT with bands/channels that need to be scanned. * @param executor The executor through which the callback should be invoked. * @param callback Returns network scan results or errors. * @return A NetworkScan obj which contains a callback which can be used to stop the scan. */ + @SuppressAutoDoc // Blocked by b/72967236 - no support for carrier privileges @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public NetworkScan requestNetworkScan( NetworkScanRequest request, Executor executor, @@ -5373,10 +5430,9 @@ public class TelephonyManager { /** * Ask the radio to connect to the input network and change selection mode to manual. * - *

- * Requires Permission: - * {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE} - * Or the calling app has carrier privileges. @see #hasCarrierPrivileges + *

Requires Permission: + * {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE} or that the calling + * app has carrier privileges (see {@link #hasCarrierPrivileges}). * * @param operatorNumeric the PLMN ID of the network to select. * @param persistSelection whether the selection will persist until reboot. If true, only allows @@ -5384,6 +5440,7 @@ public class TelephonyManager { * normal network selection next time. * @return true on success; false on any failure. */ + @SuppressAutoDoc // Blocked by b/72967236 - no support for carrier privileges @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public boolean setNetworkSelectionModeManual(String operatorNumeric, boolean persistSelection) { try { @@ -5403,10 +5460,10 @@ public class TelephonyManager { /** * Set the preferred network type. * Used for device configuration by some CDMA operators. - *

- * Requires Permission: - * {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE} - * Or the calling app has carrier privileges. @see #hasCarrierPrivileges + * + *

Requires Permission: + * {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE} or that the calling + * app has carrier privileges (see {@link #hasCarrierPrivileges}). * * @param subId the id of the subscription to set the preferred network type for. * @param networkType the preferred network type, defined in RILConstants.java. @@ -5430,9 +5487,7 @@ public class TelephonyManager { /** * Set the preferred network type to global mode which includes LTE, CDMA, EvDo and GSM/WCDMA. * - *

- * Requires that the calling app has carrier privileges. - * @see #hasCarrierPrivileges + *

Requires that the calling app has carrier privileges (see {@link #hasCarrierPrivileges}). * * @return true on success; false on any failure. */ @@ -5443,9 +5498,7 @@ public class TelephonyManager { /** * Set the preferred network type to global mode which includes LTE, CDMA, EvDo and GSM/WCDMA. * - *

- * Requires that the calling app has carrier privileges. - * @see #hasCarrierPrivileges + *

Requires that the calling app has carrier privileges (see {@link #hasCarrierPrivileges}). * * @return true on success; false on any failure. * @hide @@ -5535,8 +5588,7 @@ public class TelephonyManager { * brand value input. To unset the value, the same function should be * called with a null brand value. * - *

Requires that the calling app has carrier privileges. - * @see #hasCarrierPrivileges + *

Requires that the calling app has carrier privileges (see {@link #hasCarrierPrivileges}). * * @param brand The brand name to display/set. * @return true if the operation was executed correctly. @@ -5553,8 +5605,7 @@ public class TelephonyManager { * brand value input. To unset the value, the same function should be * called with a null brand value. * - *

Requires that the calling app has carrier privileges. - * @see #hasCarrierPrivileges + *

Requires that the calling app has carrier privileges (see {@link #hasCarrierPrivileges}). * * @param subId The subscription to use. * @param brand The brand name to display/set. @@ -6208,15 +6259,15 @@ public class TelephonyManager { * subId. Otherwise, applies to {@link SubscriptionManager#getDefaultDataSubscriptionId()} * *

Requires Permission: - * {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE} or that the - * calling app has carrier privileges. + * {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE} or that the calling + * app has carrier privileges (see {@link #hasCarrierPrivileges}). * * @param enable Whether to enable mobile data. * - * @see #hasCarrierPrivileges * @deprecated use {@link #setUserMobileDataEnabled(boolean)} instead. */ @Deprecated + @SuppressAutoDoc // Blocked by b/72967236 - no support for carrier privileges @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setDataEnabled(boolean enable) { setUserMobileDataEnabled(enable); @@ -6253,7 +6304,7 @@ public class TelephonyManager { *

Requires one of the following permissions: * {@link android.Manifest.permission#ACCESS_NETWORK_STATE ACCESS_NETWORK_STATE}, * {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE}, or that the - * calling app has carrier privileges. + * calling app has carrier privileges (see {@link #hasCarrierPrivileges}). * *

Note that this does not take into account any data restrictions that may be present on the * calling app. Such restrictions may be inspected with @@ -6261,7 +6312,6 @@ public class TelephonyManager { * * @return true if mobile data is enabled. * - * @see #hasCarrierPrivileges * @deprecated use {@link #isUserMobileDataEnabled()} instead. */ @Deprecated @@ -6991,7 +7041,11 @@ public class TelephonyManager { /** * Returns the current {@link ServiceState} information. + * + *

Requires Permission: {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE} + * or that the calling app has carrier privileges (see {@link #hasCarrierPrivileges}). */ + @SuppressAutoDoc // Blocked by b/72967236 - no support for carrier privileges @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) public ServiceState getServiceState() { return getServiceStateForSubscriber(getSubId()); @@ -7037,14 +7091,14 @@ public class TelephonyManager { /** * Sets the per-account voicemail ringtone. * - *

Requires that the calling app is the default dialer, or has carrier privileges, or has - * permission {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE}. + *

Requires that the calling app is the default dialer, or has carrier privileges (see + * {@link #hasCarrierPrivileges}, or has permission + * {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE}. * * @param phoneAccountHandle The handle for the {@link PhoneAccount} for which to set the * voicemail ringtone. * @param uri The URI for the ringtone to play when receiving a voicemail from a specific * PhoneAccount. - * @see #hasCarrierPrivileges * * @deprecated Use {@link android.provider.Settings#ACTION_CHANNEL_NOTIFICATION_SETTINGS} * instead. @@ -7082,14 +7136,14 @@ public class TelephonyManager { /** * Sets the per-account preference whether vibration is enabled for voicemail notifications. * - *

Requires that the calling app is the default dialer, or has carrier privileges, or has - * permission {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE}. + *

Requires that the calling app is the default dialer, or has carrier privileges (see + * {@link #hasCarrierPrivileges}, or has permission + * {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE}. * * @param phoneAccountHandle The handle for the {@link PhoneAccount} for which to set the * voicemail vibration setting. * @param enabled Whether to enable or disable vibration for voicemail notifications from a * specific PhoneAccount. - * @see #hasCarrierPrivileges * * @deprecated Use {@link android.provider.Settings#ACTION_CHANNEL_NOTIFICATION_SETTINGS} * instead. @@ -7509,12 +7563,10 @@ public class TelephonyManager { * Otherwise, it applies to {@link SubscriptionManager#getDefaultDataSubscriptionId()} * *

Requires Permission: - * {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE} or that the - * calling app has carrier privileges. + * {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE} or that the calling + * app has carrier privileges (see {@link #hasCarrierPrivileges}. * * @param enable Whether to enable mobile data. - * - * @see #hasCarrierPrivileges */ @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setUserMobileDataEnabled(boolean enable) { @@ -7532,15 +7584,13 @@ public class TelephonyManager { *

Requires one of the following permissions: * {@link android.Manifest.permission#ACCESS_NETWORK_STATE ACCESS_NETWORK_STATE}, * {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE}, or that the - * calling app has carrier privileges. + * calling app has carrier privileges (see {@link #hasCarrierPrivileges}. * *

Note that this does not take into account any data restrictions that may be present on the * calling app. Such restrictions may be inspected with * {@link ConnectivityManager#getRestrictBackgroundStatus}. * * @return true if mobile data is enabled. - * - * @see #hasCarrierPrivileges */ @RequiresPermission(anyOf = { android.Manifest.permission.ACCESS_NETWORK_STATE, diff --git a/telephony/java/com/android/internal/telephony/TelephonyPermissions.java b/telephony/java/com/android/internal/telephony/TelephonyPermissions.java index da8471fa19eda..a182f2be421fc 100644 --- a/telephony/java/com/android/internal/telephony/TelephonyPermissions.java +++ b/telephony/java/com/android/internal/telephony/TelephonyPermissions.java @@ -26,7 +26,8 @@ import android.telephony.SubscriptionManager; import android.telephony.TelephonyManager; import com.android.internal.annotations.VisibleForTesting; -import com.android.internal.telephony.ITelephony; + +import java.util.function.Supplier; /** Utility class for Telephony permission enforcement. */ public final class TelephonyPermissions { @@ -34,6 +35,9 @@ public final class TelephonyPermissions { private static final boolean DBG = false; + private static final Supplier TELEPHONY_SUPPLIER = () -> + ITelephony.Stub.asInterface(ServiceManager.getService(Context.TELEPHONY_SERVICE)); + private TelephonyPermissions() {} /** @@ -41,8 +45,8 @@ public final class TelephonyPermissions { * *

This method behaves in one of the following ways: *

    - *
  • return true: if the caller has either the READ_PRIVILEGED_PHONE_STATE permission or the - * READ_PHONE_STATE runtime permission. + *
  • return true: if the caller has the READ_PRIVILEGED_PHONE_STATE permission, the + * READ_PHONE_STATE runtime permission, or carrier privileges on the given subId. *
  • throw SecurityException: if the caller didn't declare any of these permissions, or, for * apps which support runtime permissions, if the caller does not currently have any of * these permissions. @@ -51,20 +55,30 @@ public final class TelephonyPermissions { * manually (via AppOps). In this case we can't throw as it would break app compatibility, * so we return false to indicate that the calling function should return dummy data. *
+ * + *

Note: for simplicity, this method always returns false for callers using legacy + * permissions and who have had READ_PHONE_STATE revoked, even if they are carrier-privileged. + * Such apps should migrate to runtime permissions or stop requiring READ_PHONE_STATE on P+ + * devices. + * + * @param subId the subId of the relevant subscription; used to check carrier privileges. May be + * {@link SubscriptionManager#INVALID_SUBSCRIPTION_ID} to skip this check for cases + * where it isn't relevant (hidden APIs, or APIs which are otherwise okay to leave + * inaccesible to carrier-privileged apps). */ public static boolean checkCallingOrSelfReadPhoneState( - Context context, String callingPackage, String message) { - return checkReadPhoneState(context, Binder.getCallingPid(), Binder.getCallingUid(), + Context context, int subId, String callingPackage, String message) { + return checkReadPhoneState(context, subId, Binder.getCallingPid(), Binder.getCallingUid(), callingPackage, message); } /** * Check whether the app with the given pid/uid can read phone state. * - *

This method behaves in one of the following ways: + *

This method behaves in one of the following ways: *

    - *
  • return true: if the caller has either the READ_PRIVILEGED_PHONE_STATE permission or the - * READ_PHONE_STATE runtime permission. + *
  • return true: if the caller has the READ_PRIVILEGED_PHONE_STATE permission, the + * READ_PHONE_STATE runtime permission, or carrier privileges on the given subId. *
  • throw SecurityException: if the caller didn't declare any of these permissions, or, for * apps which support runtime permissions, if the caller does not currently have any of * these permissions. @@ -73,9 +87,22 @@ public final class TelephonyPermissions { * manually (via AppOps). In this case we can't throw as it would break app compatibility, * so we return false to indicate that the calling function should return dummy data. *
+ * + *

Note: for simplicity, this method always returns false for callers using legacy + * permissions and who have had READ_PHONE_STATE revoked, even if they are carrier-privileged. + * Such apps should migrate to runtime permissions or stop requiring READ_PHONE_STATE on P+ + * devices. */ public static boolean checkReadPhoneState( - Context context, int pid, int uid, String callingPackage, String message) { + Context context, int subId, int pid, int uid, String callingPackage, String message) { + return checkReadPhoneState( + context, TELEPHONY_SUPPLIER, subId, pid, uid, callingPackage, message); + } + + @VisibleForTesting + public static boolean checkReadPhoneState( + Context context, Supplier telephonySupplier, int subId, int pid, int uid, + String callingPackage, String message) { try { context.enforcePermission( android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE, pid, uid, message); @@ -83,8 +110,18 @@ public final class TelephonyPermissions { // SKIP checking for run-time permission since caller has PRIVILEGED permission return true; } catch (SecurityException privilegedPhoneStateException) { - context.enforcePermission( - android.Manifest.permission.READ_PHONE_STATE, pid, uid, message); + try { + context.enforcePermission( + android.Manifest.permission.READ_PHONE_STATE, pid, uid, message); + } catch (SecurityException phoneStateException) { + // If we don't have the runtime permission, but do have carrier privileges, that + // suffices for reading phone state. + if (SubscriptionManager.isValidSubscriptionId(subId)) { + enforceCarrierPrivilege(telephonySupplier, subId, uid, message); + return true; + } + throw phoneStateException; + } } // We have READ_PHONE_STATE permission, so return true as long as the AppOps bit hasn't been @@ -101,14 +138,16 @@ public final class TelephonyPermissions { * default SMS app and apps with READ_SMS or READ_PHONE_NUMBERS can also read phone numbers. */ public static boolean checkCallingOrSelfReadPhoneNumber( - Context context, String callingPackage, String message) { + Context context, int subId, String callingPackage, String message) { return checkReadPhoneNumber( - context, Binder.getCallingPid(), Binder.getCallingUid(), callingPackage, message); + context, TELEPHONY_SUPPLIER, subId, Binder.getCallingPid(), Binder.getCallingUid(), + callingPackage, message); } @VisibleForTesting public static boolean checkReadPhoneNumber( - Context context, int pid, int uid, String callingPackage, String message) { + Context context, Supplier telephonySupplier, int subId, int pid, int uid, + String callingPackage, String message) { // Default SMS app can always read it. AppOpsManager appOps = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE); if (appOps.noteOp(AppOpsManager.OP_WRITE_SMS, uid, callingPackage) == @@ -121,7 +160,8 @@ public final class TelephonyPermissions { // First, check if we can read the phone state. try { - return checkReadPhoneState(context, pid, uid, callingPackage, message); + return checkReadPhoneState( + context, telephonySupplier, subId, pid, uid, callingPackage, message); } catch (SecurityException readPhoneStateSecurityException) { } // Can be read with READ_SMS too. @@ -186,16 +226,21 @@ public final class TelephonyPermissions { } private static void enforceCarrierPrivilege(int subId, int uid, String message) { - if (getCarrierPrivilegeStatus(subId, uid) != + enforceCarrierPrivilege(TELEPHONY_SUPPLIER, subId, uid, message); + } + + private static void enforceCarrierPrivilege( + Supplier telephonySupplier, int subId, int uid, String message) { + if (getCarrierPrivilegeStatus(telephonySupplier, subId, uid) != TelephonyManager.CARRIER_PRIVILEGE_STATUS_HAS_ACCESS) { if (DBG) Rlog.e(LOG_TAG, "No Carrier Privilege."); throw new SecurityException(message); } } - private static int getCarrierPrivilegeStatus(int subId, int uid) { - ITelephony telephony = - ITelephony.Stub.asInterface(ServiceManager.getService(Context.TELEPHONY_SERVICE)); + private static int getCarrierPrivilegeStatus( + Supplier telephonySupplier, int subId, int uid) { + ITelephony telephony = telephonySupplier.get(); try { if (telephony != null) { return telephony.getCarrierPrivilegeStatusForUid(subId, uid);