Merge "Add getPhoneNumber/setPhoneNumber API"

This commit is contained in:
Meng Wang 2022-01-05 23:04:27 +00:00 committed by Gerrit Code Review
commit 692533e342
3 changed files with 189 additions and 0 deletions

View File

@ -42613,6 +42613,8 @@ package android.telephony {
method @NonNull public java.util.List<android.net.Uri> getDeviceToDeviceStatusSharingContacts(int);
method public int getDeviceToDeviceStatusSharingPreference(int);
method @NonNull @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) public java.util.List<android.telephony.SubscriptionInfo> getOpportunisticSubscriptions();
method @NonNull @RequiresPermission(anyOf={android.Manifest.permission.READ_PHONE_NUMBERS, "android.permission.READ_PRIVILEGED_PHONE_STATE"}) public String getPhoneNumber(int, int);
method @NonNull @RequiresPermission(anyOf={android.Manifest.permission.READ_PHONE_NUMBERS, "android.permission.READ_PRIVILEGED_PHONE_STATE"}) public String getPhoneNumber(int);
method public static int getSlotIndex(int);
method @Nullable public int[] getSubscriptionIds(int);
method @NonNull public java.util.List<android.telephony.SubscriptionPlan> getSubscriptionPlans(int);
@ -42624,6 +42626,7 @@ package android.telephony {
method public void removeOnOpportunisticSubscriptionsChangedListener(@NonNull android.telephony.SubscriptionManager.OnOpportunisticSubscriptionsChangedListener);
method public void removeOnSubscriptionsChangedListener(android.telephony.SubscriptionManager.OnSubscriptionsChangedListener);
method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void removeSubscriptionsFromGroup(@NonNull java.util.List<java.lang.Integer>, @NonNull android.os.ParcelUuid);
method public void setCarrierPhoneNumber(int, @NonNull String);
method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setDeviceToDeviceStatusSharingContacts(int, @NonNull java.util.List<android.net.Uri>);
method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setDeviceToDeviceStatusSharingPreference(int, int);
method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public boolean setOpportunistic(boolean, int);
@ -42650,6 +42653,9 @@ package android.telephony {
field public static final String EXTRA_SUBSCRIPTION_INDEX = "android.telephony.extra.SUBSCRIPTION_INDEX";
field public static final int INVALID_SIM_SLOT_INDEX = -1; // 0xffffffff
field public static final int INVALID_SUBSCRIPTION_ID = -1; // 0xffffffff
field public static final int PHONE_NUMBER_SOURCE_CARRIER = 2; // 0x2
field public static final int PHONE_NUMBER_SOURCE_IMS = 3; // 0x3
field public static final int PHONE_NUMBER_SOURCE_UICC = 1; // 0x1
field public static final int SUBSCRIPTION_TYPE_LOCAL_SIM = 0; // 0x0
field public static final int SUBSCRIPTION_TYPE_REMOTE_SIM = 1; // 0x1
}

View File

@ -1128,6 +1128,52 @@ public class SubscriptionManager {
*/
public static final String EXTRA_SLOT_INDEX = "android.telephony.extra.SLOT_INDEX";
/**
* A source of phone number: the EF-MSISDN (see 3GPP TS 31.102),
* or EF-MDN for CDMA (see 3GPP2 C.P0065-B), from UICC application.
*
* <p>The availability and a of the number depends on the carrier.
* The number may be updated by over-the-air update to UICC applications
* from the carrier, or by other means with physical access to the SIM.
*/
public static final int PHONE_NUMBER_SOURCE_UICC = 1;
/**
* A source of phone number: provided by an app that has carrier privilege.
*
* <p>The number is intended to be set by a carrier app knowing the correct number
* which is, for example, different from the number in {@link #PHONE_NUMBER_SOURCE_UICC UICC}
* for some reason.
* The number is not available until a carrier app sets one via
* {@link #setCarrierPhoneNumber(int, String)}.
* The app can update the number with the same API should the number change.
*/
public static final int PHONE_NUMBER_SOURCE_CARRIER = 2;
/**
* A source of phone number: provided by IMS (IP Multimedia Subsystem) implementation.
* When IMS service is registered (as indicated by
* {@link android.telephony.ims.RegistrationManager.RegistrationCallback#onRegistered(int)})
* the IMS implementation may return P-Associated-Uri SIP headers (RFC 3455). The URIs
* are the users public user identities known to the network (see 3GPP TS 24.229 5.4.1.2),
* and the phone number is typically one of them (see global number in 3GPP TS 23.003 13.4).
*
* <p>This source provides the phone number from the last IMS registration.
* IMS registration may happen on every device reboot or other network condition changes.
* The number will be updated should the associated URI change after an IMS registration.
*/
public static final int PHONE_NUMBER_SOURCE_IMS = 3;
/** @hide */
@Retention(RetentionPolicy.SOURCE)
@IntDef(prefix = {"PHONE_NUMBER_SOURCE"},
value = {
PHONE_NUMBER_SOURCE_UICC,
PHONE_NUMBER_SOURCE_CARRIER,
PHONE_NUMBER_SOURCE_IMS,
})
public @interface PhoneNumberSource {}
private final Context mContext;
// Cache of Resource that has been created in getResourcesForSubId. Key is a Pair containing
@ -3763,4 +3809,132 @@ public class SubscriptionManager {
RESTORE_SIM_SPECIFIC_SETTINGS_METHOD_NAME,
null, bundle);
}
/**
* Returns the phone number for the given {@code subId} and {@code source},
* or an empty string if not available.
*
* <p>Requires Permission:
* {@link android.Manifest.permission#READ_PHONE_NUMBERS READ_PHONE_NUMBERS}, or
* READ_PRIVILEGED_PHONE_STATE permission (can only be granted to apps preloaded on device),
* or that the calling app has carrier privileges
* (see {@link TelephonyManager#hasCarrierPrivileges}).
*
* @param subscriptionId the subscription ID, or {@link #DEFAULT_SUBSCRIPTION_ID}
* for the default one.
* @param source the source of the phone number, one of the PHONE_NUMBER_SOURCE_* constants.
* @return the phone number, or an empty string if not available.
* @throws IllegalArgumentException if {@code source} is invalid.
* @throws IllegalStateException if the telephony process is not currently available.
* @throws SecurityException if the caller doesn't have permissions required.
* @see #PHONE_NUMBER_SOURCE_UICC
* @see #PHONE_NUMBER_SOURCE_CARRIER
* @see #PHONE_NUMBER_SOURCE_IMS
*/
@SuppressAutoDoc // No support for carrier privileges (b/72967236)
@RequiresPermission(anyOf = {
android.Manifest.permission.READ_PHONE_NUMBERS,
android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE,
})
@NonNull
public String getPhoneNumber(int subscriptionId, @PhoneNumberSource int source) {
if (subscriptionId == DEFAULT_SUBSCRIPTION_ID) {
subscriptionId = getDefaultSubscriptionId();
}
if (source != PHONE_NUMBER_SOURCE_UICC
&& source != PHONE_NUMBER_SOURCE_CARRIER
&& source != PHONE_NUMBER_SOURCE_IMS) {
throw new IllegalArgumentException("invalid source " + source);
}
try {
ISub iSub = TelephonyManager.getSubscriptionService();
if (iSub != null) {
return iSub.getPhoneNumber(subscriptionId, source,
mContext.getOpPackageName(), mContext.getAttributionTag());
} else {
throw new IllegalStateException("subscription service unavailable.");
}
} catch (RemoteException ex) {
throw ex.rethrowAsRuntimeException();
}
}
/**
* Returns the phone number for the given {@code subId}, or an empty string if
* not available.
*
* <p>This API is built up on {@link #getPhoneNumber(int, int)}, but picks
* from available sources in the following order: {@link #PHONE_NUMBER_SOURCE_CARRIER}
* > {@link #PHONE_NUMBER_SOURCE_UICC} > {@link #PHONE_NUMBER_SOURCE_IMS}.
*
* <p>Requires Permission:
* {@link android.Manifest.permission#READ_PHONE_NUMBERS READ_PHONE_NUMBERS}, or
* READ_PRIVILEGED_PHONE_STATE permission (can only be granted to apps preloaded on device),
* or that the calling app has carrier privileges
* (see {@link TelephonyManager#hasCarrierPrivileges}).
*
* @param subscriptionId the subscription ID, or {@link #DEFAULT_SUBSCRIPTION_ID}
* for the default one.
* @return the phone number, or an empty string if not available.
* @throws IllegalStateException if the telephony process is not currently available.
* @throws SecurityException if the caller doesn't have permissions required.
* @see #getPhoneNumber(int, int)
*/
@SuppressAutoDoc // No support for carrier privileges (b/72967236)
@RequiresPermission(anyOf = {
android.Manifest.permission.READ_PHONE_NUMBERS,
android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE,
})
@NonNull
public String getPhoneNumber(int subscriptionId) {
if (subscriptionId == DEFAULT_SUBSCRIPTION_ID) {
subscriptionId = getDefaultSubscriptionId();
}
try {
ISub iSub = TelephonyManager.getSubscriptionService();
if (iSub != null) {
return iSub.getPhoneNumberFromFirstAvailableSource(subscriptionId,
mContext.getOpPackageName(), mContext.getAttributionTag());
} else {
throw new IllegalStateException("subscription service unavailable.");
}
} catch (RemoteException ex) {
throw ex.rethrowAsRuntimeException();
}
}
/**
* Sets the phone number for the given {@code subId} for source
* {@link #PHONE_NUMBER_SOURCE_CARRIER carrier}.
* Sets an empty string to remove the previously set phone number.
*
* <p>Requires Permission: the calling app has carrier privileges
* (see {@link TelephonyManager#hasCarrierPrivileges}).
*
* @param subscriptionId the subscription ID, or {@link #DEFAULT_SUBSCRIPTION_ID}
* for the default one.
* @param number the phone number, or an empty string to remove the previously set number.
* @throws IllegalStateException if the telephony process is not currently available.
* @throws NullPointerException if {@code number} is {@code null}.
* @throws SecurityException if the caller doesn't have permissions required.
*/
public void setCarrierPhoneNumber(int subscriptionId, @NonNull String number) {
if (subscriptionId == DEFAULT_SUBSCRIPTION_ID) {
subscriptionId = getDefaultSubscriptionId();
}
if (number == null) {
throw new NullPointerException("invalid number null");
}
try {
ISub iSub = TelephonyManager.getSubscriptionService();
if (iSub != null) {
iSub.setPhoneNumber(subscriptionId, PHONE_NUMBER_SOURCE_CARRIER, number,
mContext.getOpPackageName(), mContext.getAttributionTag());
} else {
throw new IllegalStateException("subscription service unavailable.");
}
} catch (RemoteException ex) {
throw ex.rethrowAsRuntimeException();
}
}
}

View File

@ -304,4 +304,13 @@ interface ISub {
int setDeviceToDeviceStatusSharing(int sharing, int subId);
int setDeviceToDeviceStatusSharingContacts(String contacts, int subscriptionId);
String getPhoneNumber(int subId, int source,
String callingPackage, String callingFeatureId);
String getPhoneNumberFromFirstAvailableSource(int subId,
String callingPackage, String callingFeatureId);
void setPhoneNumber(int subId, int source, String number,
String callingPackage, String callingFeatureId);
}