summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Junho Yoon <jhyoon@google.com> 2024-10-31 02:46:55 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2024-10-31 02:46:55 +0000
commit63473a231d1877a204f15f2d1fe968981f374214 (patch)
tree4d6b7e01ff0fbecc85bb8dac034856eb7c13245b
parentb1d490dd6dd3db16457528fa05f0cd1f5ba2a98a (diff)
parent27070e9705d0f0dae9ad888b2ec17074cbeb5b98 (diff)
Merge "Add interface to get the value loaded from ISIM record" into main
-rw-r--r--core/api/system-current.txt4
-rw-r--r--telephony/common/com/android/internal/telephony/TelephonyPermissions.java23
-rw-r--r--telephony/java/android/telephony/TelephonyManager.java111
-rw-r--r--telephony/java/com/android/internal/telephony/IPhoneSubInfo.aidl21
4 files changed, 124 insertions, 35 deletions
diff --git a/core/api/system-current.txt b/core/api/system-current.txt
index bda4eec40e92..c21d07752cbf 100644
--- a/core/api/system-current.txt
+++ b/core/api/system-current.txt
@@ -15702,6 +15702,9 @@ package android.telephony {
method @FlaggedApi("android.permission.flags.get_emergency_role_holder_api_enabled") @Nullable @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public String getEmergencyAssistancePackageName();
method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public boolean getEmergencyCallbackMode();
method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public int getEmergencyNumberDbVersion();
+ method @FlaggedApi("com.android.internal.telephony.flags.support_isim_record") @NonNull @RequiresPermission(value=android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE, conditional=true) public java.util.List<java.lang.String> getImsPcscfAddresses();
+ method @FlaggedApi("com.android.internal.telephony.flags.support_isim_record") @Nullable @RequiresPermission(android.Manifest.permission.USE_ICC_AUTH_WITH_DEVICE_IDENTIFIER) public String getImsPrivateUserIdentity();
+ method @FlaggedApi("com.android.internal.telephony.flags.support_isim_record") @NonNull @RequiresPermission(value=android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE, conditional=true) public java.util.List<android.net.Uri> getImsPublicUserIdentities();
method @Nullable @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public String getIsimDomain();
method @Nullable @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public String getIsimIst();
method @FlaggedApi("com.android.server.telecom.flags.get_last_known_cell_identity") @Nullable @RequiresPermission(allOf={android.Manifest.permission.ACCESS_FINE_LOCATION, android.Manifest.permission.ACCESS_LAST_KNOWN_CELL_ID}) public android.telephony.CellIdentity getLastKnownCellIdentity();
@@ -15720,6 +15723,7 @@ package android.telephony {
method @Deprecated @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public int getSimCardState(int);
method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public int getSimCardState(int, int);
method @Nullable @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public java.util.Locale getSimLocale();
+ method @FlaggedApi("com.android.internal.telephony.flags.support_isim_record") @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public void getSimServiceTable(int, @NonNull java.util.concurrent.Executor, @NonNull android.os.OutcomeReceiver<byte[],java.lang.Exception>);
method @NonNull @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public java.util.Collection<android.telephony.UiccSlotMapping> getSimSlotMapping();
method @NonNull @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public java.util.List<android.telephony.RadioAccessSpecifier> getSystemSelectionChannels();
method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public java.util.List<android.telephony.TelephonyHistogram> getTelephonyHistograms();
diff --git a/telephony/common/com/android/internal/telephony/TelephonyPermissions.java b/telephony/common/com/android/internal/telephony/TelephonyPermissions.java
index 4ccbc32c4b54..66d75f780fbe 100644
--- a/telephony/common/com/android/internal/telephony/TelephonyPermissions.java
+++ b/telephony/common/com/android/internal/telephony/TelephonyPermissions.java
@@ -907,29 +907,6 @@ public final class TelephonyPermissions {
}
/**
- * Ensure the caller (or self, if not processing an IPC) has
- * {@link android.Manifest.permission#READ_PRIVILEGED_PHONE_STATE} or
- * {@link android.Manifest.permission#READ_PHONE_NUMBERS}.
- *
- * @throws SecurityException if the caller does not have the required permission/privileges
- */
- @RequiresPermission(anyOf = {
- android.Manifest.permission.READ_PHONE_NUMBERS,
- android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE
- })
- public static boolean checkCallingOrSelfReadPrivilegedPhoneStatePermissionOrReadPhoneNumber(
- Context context, int subId, String callingPackage, @Nullable String callingFeatureId,
- String message) {
- if (!SubscriptionManager.isValidSubscriptionId(subId)) {
- return false;
- }
- return (context.checkCallingOrSelfPermission(
- Manifest.permission.READ_PRIVILEGED_PHONE_STATE) == PERMISSION_GRANTED
- || checkCallingOrSelfReadPhoneNumber(context, subId, callingPackage,
- callingFeatureId, message));
- }
-
- /**
* @return true if the specified {@code uid} is for a system or phone process, no matter if runs
* as system user or not.
*/
diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java
index fad59f8bb37b..6f2c8623fd71 100644
--- a/telephony/java/android/telephony/TelephonyManager.java
+++ b/telephony/java/android/telephony/TelephonyManager.java
@@ -133,6 +133,7 @@ import com.android.internal.telephony.OperatorInfo;
import com.android.internal.telephony.PhoneConstants;
import com.android.internal.telephony.RILConstants;
import com.android.internal.telephony.flags.Flags;
+import com.android.internal.telephony.uicc.IccUtils;
import com.android.internal.telephony.util.TelephonyUtils;
import com.android.telephony.Rlog;
@@ -6282,14 +6283,17 @@ public class TelephonyManager {
* The contents of the file is a <b>Ip Multimedia Service Private User Identity</b> of the user
* as defined in the section 4.2.2 of 3GPP TS 131 103.
*
- * @return IMPI (IMS private user identity) of type string.
+ * @return IMPI (IMS private user identity) of type string or null if the IMPI isn't present
+ * on the ISIM.
* @throws IllegalStateException in case the ISIM has’t been loaded
* @throws SecurityException if the caller does not have the required permission/privileges
* @hide
*/
- @NonNull
+ @FlaggedApi(Flags.FLAG_SUPPORT_ISIM_RECORD)
+ @SystemApi
@RequiresPermission(android.Manifest.permission.USE_ICC_AUTH_WITH_DEVICE_IDENTIFIER)
@RequiresFeature(PackageManager.FEATURE_TELEPHONY_SUBSCRIPTION)
+ @Nullable
public String getImsPrivateUserIdentity() {
try {
IPhoneSubInfo info = getSubscriberInfoService();
@@ -6370,6 +6374,9 @@ public class TelephonyManager {
* The contents of the file are <b>Ip Multimedia Service Public User Identities</b> of the user
* as defined in the section 4.2.4 of 3GPP TS 131 103. It contains one or more records.
*
+ * Requires that the calling app has READ_PRIVILEGED_PHONE_STATE permission or carrier
+ * privileges.
+ *
* @return List of public user identities of type android.net.Uri or empty list if
* EF_IMPU is not available.
* @throws IllegalStateException in case the ISIM hasn’t been loaded
@@ -6378,18 +6385,18 @@ public class TelephonyManager {
* {@link PackageManager#FEATURE_TELEPHONY_SUBSCRIPTION}.
* @hide
*/
- @NonNull
- @RequiresPermission(anyOf = {android.Manifest.permission.READ_PHONE_NUMBERS,
- android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE})
+ @FlaggedApi(Flags.FLAG_SUPPORT_ISIM_RECORD)
+ @SystemApi
+ @RequiresPermission(value = Manifest.permission.READ_PRIVILEGED_PHONE_STATE, conditional = true)
@RequiresFeature(PackageManager.FEATURE_TELEPHONY_SUBSCRIPTION)
+ @NonNull
public List<Uri> getImsPublicUserIdentities() {
try {
IPhoneSubInfo info = getSubscriberInfoService();
if (info == null) {
throw new RuntimeException("IMPU error: Subscriber Info is null");
}
- return info.getImsPublicUserIdentities(getSubId(), getOpPackageName(),
- getAttributionTag());
+ return info.getImsPublicUserIdentities(getSubId(), getOpPackageName());
} catch (IllegalArgumentException | NullPointerException ex) {
Rlog.e(TAG, "getImsPublicUserIdentities Exception = " + ex);
} catch (RemoteException ex) {
@@ -8684,7 +8691,10 @@ public class TelephonyManager {
* @return an array of PCSCF strings with one PCSCF per string, or null if
* not present or not loaded
* @hide
+ * @deprecated use {@link #getImsPcscfAddresses()} instead.
*/
+ @Deprecated
+ @FlaggedApi(Flags.FLAG_SUPPORT_ISIM_RECORD)
@UnsupportedAppUsage
public String[] getIsimPcscf() {
try {
@@ -8701,6 +8711,40 @@ public class TelephonyManager {
}
}
+ /**
+ * Returns the IMS Proxy Call Session Control Function(P-CSCF) that were loaded from the ISIM.
+ *
+ * Requires that the calling app has READ_PRIVILEGED_PHONE_STATE permission or carrier
+ * privileges.
+ *
+ * @return List of P-CSCF address strings or empty list if not available.
+ * @throws IllegalStateException in case the ISIM hasn’t been loaded
+ * @throws SecurityException if the caller does not have the required permission/privilege
+ * @throws UnsupportedOperationException If the device does not have
+ * {@link PackageManager#FEATURE_TELEPHONY_SUBSCRIPTION}.
+ * @hide
+ */
+ @FlaggedApi(Flags.FLAG_SUPPORT_ISIM_RECORD)
+ @SystemApi
+ @RequiresPermission(value = Manifest.permission.READ_PRIVILEGED_PHONE_STATE, conditional = true)
+ @RequiresFeature(PackageManager.FEATURE_TELEPHONY_SUBSCRIPTION)
+ @NonNull
+ public List<String> getImsPcscfAddresses() {
+ try {
+ IPhoneSubInfo info = getSubscriberInfoService();
+ if (info == null) {
+ throw new RuntimeException("P-CSCF error: Subscriber Info is null");
+ }
+ return info.getImsPcscfAddresses(getSubId(), getOpPackageName());
+ } catch (IllegalArgumentException | NullPointerException ex) {
+ Rlog.e(TAG, "getImsPcscfAddresses Exception = " + ex);
+ } catch (RemoteException ex) {
+ Rlog.e(TAG, "getImsPcscfAddresses Exception = " + ex);
+ ex.rethrowAsRuntimeException();
+ }
+ return Collections.EMPTY_LIST;
+ }
+
/** UICC application type is unknown or not specified */
public static final int APPTYPE_UNKNOWN = PhoneConstants.APPTYPE_UNKNOWN;
/** UICC application type is SIM */
@@ -8934,8 +8978,10 @@ public class TelephonyManager {
* @throws UnsupportedOperationException If the device does not have
* {@link PackageManager#FEATURE_TELEPHONY_SUBSCRIPTION}.
* @hide
+ * @deprecated Use {@link #getSimServiceTable(int, Executor, OutcomeReceiver)} instead.
*/
-
+ @Deprecated
+ @FlaggedApi(Flags.FLAG_SUPPORT_ISIM_RECORD)
@Nullable
@RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE)
@RequiresFeature(PackageManager.FEATURE_TELEPHONY_SUBSCRIPTION)
@@ -8963,6 +9009,55 @@ public class TelephonyManager {
}
/**
+ * Fetches the sim service table from the EFUST/EFIST based on the application type
+ * {@link #APPTYPE_USIM} or {@link #APPTYPE_ISIM}.
+ * The USIM service table EF is described in as per Section 4.2.8 of 3GPP TS 31.102.
+ * The ISIM service table EF is described in as per Section 4.2.7 of 3GPP TS 31.103.
+ *
+ * @param appType of type int of either {@link #APPTYPE_USIM} or {@link #APPTYPE_ISIM}.
+ * @param executor executor to run the callback on.
+ * @param callback callback object to which the result will be delivered.
+ * @hide
+ */
+ @FlaggedApi(Flags.FLAG_SUPPORT_ISIM_RECORD)
+ @SystemApi
+ @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE)
+ @RequiresFeature(PackageManager.FEATURE_TELEPHONY_SUBSCRIPTION)
+ public void getSimServiceTable(@UiccAppType int appType,
+ @NonNull @CallbackExecutor Executor executor,
+ @NonNull OutcomeReceiver<byte[], Exception> callback) {
+ Objects.requireNonNull(executor);
+ Objects.requireNonNull(callback);
+
+ IPhoneSubInfo info = getSubscriberInfoService();
+ if (info == null) {
+ executor.execute(() -> callback.onError(
+ new RuntimeException("getSimServiceTable: Subscriber Info is null")));
+ return;
+ }
+
+ try {
+ String serviceTable;
+ if (appType == APPTYPE_ISIM) {
+ serviceTable = info.getIsimIst(getSubId());
+ } else if ((appType == APPTYPE_USIM)) {
+ serviceTable = info.getSimServiceTable(getSubId(), APPTYPE_USIM);
+ } else {
+ serviceTable = null;
+ }
+
+ if (serviceTable == null) {
+ executor.execute(() -> callback.onResult(new byte[0]));
+ } else {
+ byte[] simServiceTable = IccUtils.hexStringToBytes(serviceTable);
+ executor.execute(() -> callback.onResult(simServiceTable));
+ }
+ } catch (Exception ex) {
+ executor.execute(() -> callback.onError(ex));
+ }
+ }
+
+ /**
* Resets the {@link android.telephony.ims.ImsService} associated with the specified sim slot.
* Used by diagnostic apps to force the IMS stack to be disabled and re-enabled in an effort to
* recover from scenarios where the {@link android.telephony.ims.ImsService} gets in to a bad
diff --git a/telephony/java/com/android/internal/telephony/IPhoneSubInfo.aidl b/telephony/java/com/android/internal/telephony/IPhoneSubInfo.aidl
index b4d93fddd7aa..974cc14ae444 100644
--- a/telephony/java/com/android/internal/telephony/IPhoneSubInfo.aidl
+++ b/telephony/java/com/android/internal/telephony/IPhoneSubInfo.aidl
@@ -208,10 +208,9 @@ interface IPhoneSubInfo {
/**
* Fetches the ISIM public user identities (EF_IMPU) from UICC based on subId
*/
- @JavaPassthrough(annotation="@android.annotation.RequiresPermission(" +
- "anyOf={android.Manifest.permission.READ_PHONE_NUMBERS, android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE})")
- List<Uri> getImsPublicUserIdentities(int subId, String callingPackage,
- String callingFeatureId);
+ @JavaPassthrough(annotation="@android.annotation.RequiresPermission("
+ + "android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE)")
+ List<Uri> getImsPublicUserIdentities(int subId, String callingPackage);
/**
* Returns the IMS Service Table (IST) that was loaded from the ISIM.
@@ -227,6 +226,20 @@ interface IPhoneSubInfo {
String[] getIsimPcscf(int subId);
/**
+ * Fetches IMS Proxy Call Session Control Function(P-CSCF) based on the subscription.
+ *
+ * @param subId subscriptionId
+ * @param callingPackage package name of the caller
+ * @return List of IMS Proxy Call Session Control Function strings.
+ * @throws IllegalArgumentException if the subscriptionId is not valid
+ * @throws IllegalStateException in case the ISIM hasn’t been loaded.
+ * @throws SecurityException if the caller does not have the required permission
+ */
+ @JavaPassthrough(annotation="@android.annotation.RequiresPermission("
+ + "android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE)")
+ List<String> getImsPcscfAddresses(int subId, String callingPackage);
+
+ /**
* Returns the response of the SIM application on the UICC to authentication
* challenge/response algorithm. The data string and challenge response are
* Base64 encoded Strings.