diff options
| author | 2024-10-11 14:16:49 -0500 | |
|---|---|---|
| committer | 2024-10-11 14:16:49 -0500 | |
| commit | 29a6bb7fdb3e4cc32ef9931317e06b07c3047dd1 (patch) | |
| tree | 3df2b3d8c76aac954c600e97f674387847ef4578 | |
| parent | e8b7d81f1e292d1c1595be80df693083238b161c (diff) | |
Introduce utility method SubscripitonManager.canManageSubscriptionAsUser
SubscriptionManager.canManageSubscription always uses the user context
created from SubscriptionManager to query packages. It is usually the
system user in phone process services. When the carrier app is installed
on secondary users (e.g. main user in HSUM) only, the query will fail.
The new utility method allows phone process components to query packages
as designed user and avoid duplicated logic in services side.
Bug: 371452139
Test: FrameworksTelephonyTests
Flag: com.android.internal.telephony.flags.hsum_package_manager
Change-Id: Icc1376744de356e2bb3dcf2e7bf68d89b97c16ad
| -rw-r--r-- | telephony/java/android/telephony/SubscriptionManager.java | 54 |
1 files changed, 51 insertions, 3 deletions
diff --git a/telephony/java/android/telephony/SubscriptionManager.java b/telephony/java/android/telephony/SubscriptionManager.java index 6faef7ecfa1b..d12a4d90b236 100644 --- a/telephony/java/android/telephony/SubscriptionManager.java +++ b/telephony/java/android/telephony/SubscriptionManager.java @@ -3474,14 +3474,62 @@ public class SubscriptionManager { @SystemApi public boolean canManageSubscription(@NonNull SubscriptionInfo info, @NonNull String packageName) { + if (Flags.hsumPackageManager()) { + return canManageSubscriptionAsUser(info, packageName, mContext.getUser()); + } else { + if (info == null || info.getAccessRules() == null || packageName == null) { + return false; + } + PackageManager packageManager = mContext.getPackageManager(); + PackageInfo packageInfo; + try { + packageInfo = packageManager.getPackageInfo(packageName, + PackageManager.GET_SIGNING_CERTIFICATES); + } catch (PackageManager.NameNotFoundException e) { + logd("Unknown package: " + packageName); + return false; + } + for (UiccAccessRule rule : info.getAccessRules()) { + if (rule.getCarrierPrivilegeStatus(packageInfo) + == TelephonyManager.CARRIER_PRIVILEGE_STATUS_HAS_ACCESS) { + return true; + } + } + return false; + } + } + + /** + * Checks whether the given app is authorized to manage the given subscription for given user. + * + * <p>An app can only be authorized if it is available to the given user and included in the + * {@link android.telephony.UiccAccessRule} of the {@link android.telephony.SubscriptionInfo} + * with the access status. + * + * <p>Only supported for embedded subscriptions (if {@link SubscriptionInfo#isEmbedded} returns + * true). To check for permissions for non-embedded subscription as well, + * see {@link android.telephony.TelephonyManager#hasCarrierPrivileges}. + * + * @param info The subscription to check. + * @param packageName Package name of the app to check. + * @param user UserHandle to check + * @return whether the app is authorized to manage this subscription per its access rules. + * + * @see android.telephony.TelephonyManager#hasCarrierPrivileges + * @hide + */ + public boolean canManageSubscriptionAsUser(@NonNull SubscriptionInfo info, + @NonNull String packageName, @NonNull UserHandle user) { if (info == null || info.getAccessRules() == null || packageName == null) { return false; } - PackageManager packageManager = mContext.getPackageManager(); + PackageManager pm = mContext.getUser().equals(user) + ? mContext.getPackageManager() + : mContext.createContextAsUser(user, 0).getPackageManager(); PackageInfo packageInfo; try { - packageInfo = packageManager.getPackageInfo(packageName, - PackageManager.GET_SIGNING_CERTIFICATES); + packageInfo = pm.getPackageInfo(packageName, + PackageManager.GET_SIGNING_CERTIFICATES); } catch (PackageManager.NameNotFoundException e) { logd("Unknown package: " + packageName); return false; |