From 808497beacf466568988ffc9710f625d9b90cc2c Mon Sep 17 00:00:00 2001 From: Kholoud Mohamed Date: Fri, 31 Mar 2023 13:09:22 +0000 Subject: [PATCH] Migrate setApplicationHidden to the policy engine Bug: 273496614 Test: btest a.d.c.ApplicationHiddenTest Change-Id: I57d8730e64d970618ae17fae6e77292f49207f0d --- .../devicepolicy/DevicePolicyEngine.java | 82 ++++++++++--------- .../DevicePolicyManagerService.java | 27 +++++- .../server/devicepolicy/PolicyDefinition.java | 35 +++++++- .../devicepolicy/PolicyEnforcerCallbacks.java | 24 +++++- 4 files changed, 122 insertions(+), 46 deletions(-) diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyEngine.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyEngine.java index 7eeb51c842003..df3815e3734d2 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyEngine.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyEngine.java @@ -771,28 +771,31 @@ final class DevicePolicyEngine { Intent intent = new Intent(PolicyUpdateReceiver.ACTION_DEVICE_POLICY_SET_RESULT); intent.setPackage(admin.getPackageName()); - List receivers = mContext.getPackageManager().queryBroadcastReceiversAsUser( - intent, - PackageManager.ResolveInfoFlags.of(PackageManager.GET_RECEIVERS), - admin.getUserId()); - if (receivers.isEmpty()) { - Log.i(TAG, "Couldn't find any receivers that handle ACTION_DEVICE_POLICY_SET_RESULT" - + "in package " + admin.getPackageName()); - return; - } + Binder.withCleanCallingIdentity(() -> { + List receivers = + mContext.getPackageManager().queryBroadcastReceiversAsUser( + intent, + PackageManager.ResolveInfoFlags.of(PackageManager.GET_RECEIVERS), + admin.getUserId()); + if (receivers.isEmpty()) { + Log.i(TAG, "Couldn't find any receivers that handle ACTION_DEVICE_POLICY_SET_RESULT" + + "in package " + admin.getPackageName()); + return; + } - Bundle extras = new Bundle(); - policyDefinition.getPolicyKey().writeToBundle(extras); - extras.putInt( - EXTRA_POLICY_TARGET_USER_ID, - getTargetUser(admin.getUserId(), userId)); - extras.putInt( - EXTRA_POLICY_UPDATE_RESULT_KEY, - result); + Bundle extras = new Bundle(); + policyDefinition.getPolicyKey().writeToBundle(extras); + extras.putInt( + EXTRA_POLICY_TARGET_USER_ID, + getTargetUser(admin.getUserId(), userId)); + extras.putInt( + EXTRA_POLICY_UPDATE_RESULT_KEY, + result); - intent.putExtras(extras); + intent.putExtras(extras); - maybeSendIntentToAdminReceivers(intent, UserHandle.of(admin.getUserId()), receivers); + maybeSendIntentToAdminReceivers(intent, UserHandle.of(admin.getUserId()), receivers); + }); } // TODO(b/261430877): Finalise the decision on which admins to send the updates to. @@ -821,27 +824,30 @@ final class DevicePolicyEngine { Intent intent = new Intent(PolicyUpdateReceiver.ACTION_DEVICE_POLICY_CHANGED); intent.setPackage(admin.getPackageName()); - List receivers = mContext.getPackageManager().queryBroadcastReceiversAsUser( - intent, - PackageManager.ResolveInfoFlags.of(PackageManager.GET_RECEIVERS), - admin.getUserId()); - if (receivers.isEmpty()) { - Log.i(TAG, "Couldn't find any receivers that handle ACTION_DEVICE_POLICY_CHANGED" - + "in package " + admin.getPackageName()); - return; - } + Binder.withCleanCallingIdentity(() -> { + List receivers = + mContext.getPackageManager().queryBroadcastReceiversAsUser( + intent, + PackageManager.ResolveInfoFlags.of(PackageManager.GET_RECEIVERS), + admin.getUserId()); + if (receivers.isEmpty()) { + Log.i(TAG, "Couldn't find any receivers that handle ACTION_DEVICE_POLICY_CHANGED" + + "in package " + admin.getPackageName()); + return; + } - Bundle extras = new Bundle(); - policyDefinition.getPolicyKey().writeToBundle(extras); - extras.putInt( - EXTRA_POLICY_TARGET_USER_ID, - getTargetUser(admin.getUserId(), userId)); - extras.putInt(EXTRA_POLICY_UPDATE_RESULT_KEY, reason); - intent.putExtras(extras); - intent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND); + Bundle extras = new Bundle(); + policyDefinition.getPolicyKey().writeToBundle(extras); + extras.putInt( + EXTRA_POLICY_TARGET_USER_ID, + getTargetUser(admin.getUserId(), userId)); + extras.putInt(EXTRA_POLICY_UPDATE_RESULT_KEY, reason); + intent.putExtras(extras); + intent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND); - maybeSendIntentToAdminReceivers( - intent, UserHandle.of(admin.getUserId()), receivers); + maybeSendIntentToAdminReceivers( + intent, UserHandle.of(admin.getUserId()), receivers); + }); } private void maybeSendIntentToAdminReceivers( diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java index 39337660c55c1..103f7dab03563 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java @@ -13544,8 +13544,31 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { Slogf.v(LOG_TAG, "calling pm.setApplicationHiddenSettingAsUser(%s, %b, %d)", packageName, hidden, userId); } - result = mInjector.binderWithCleanCallingIdentity(() -> mIPackageManager - .setApplicationHiddenSettingAsUser(packageName, hidden, userId)); + if (isDevicePolicyEngineEnabled()) { + EnforcingAdmin admin = getEnforcingAdminForCaller(who, callerPackage); + mDevicePolicyEngine.setLocalPolicy( + PolicyDefinition.APPLICATION_HIDDEN(packageName), + admin, + new BooleanPolicyValue(hidden), + userId); + Boolean resolvedPolicy = mDevicePolicyEngine.getResolvedPolicy( + PolicyDefinition.APPLICATION_HIDDEN(packageName), userId); + result = mInjector.binderWithCleanCallingIdentity(() -> { + try { + // This is a best effort to continue returning the same value that was + // returned before the policy engine migration. + return mInjector.getIPackageManager().getPackageInfo( + packageName, MATCH_UNINSTALLED_PACKAGES, userId) != null + && (mIPackageManager.getApplicationHiddenSettingAsUser( + packageName, userId) == hidden); + } catch (RemoteException e) { + return false; + } + }); + } else { + result = mInjector.binderWithCleanCallingIdentity(() -> mIPackageManager + .setApplicationHiddenSettingAsUser(packageName, hidden, userId)); + } } DevicePolicyEventLogger .createEvent(DevicePolicyEnums.SET_APPLICATION_HIDDEN) diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/PolicyDefinition.java b/services/devicepolicy/java/com/android/server/devicepolicy/PolicyDefinition.java index 8812c3d3c5576..a15aa53be96ca 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/PolicyDefinition.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/PolicyDefinition.java @@ -226,8 +226,7 @@ final class PolicyDefinition { * Passing in {@code null} for {@code packageName} will return * {@link #GENERIC_APPLICATION_RESTRICTIONS}. */ - static PolicyDefinition APPLICATION_RESTRICTIONS( - String packageName) { + static PolicyDefinition APPLICATION_RESTRICTIONS(String packageName) { if (packageName == null) { return GENERIC_APPLICATION_RESTRICTIONS; } @@ -254,6 +253,34 @@ final class PolicyDefinition { (Integer value, Context context, Integer userId, PolicyKey policyKey) -> true, new IntegerPolicySerializer()); + // This is saved in the static map sPolicyDefinitions so that we're able to reconstruct the + // actual policy with the correct arguments (i.e. packageName) when reading the policies from + // xml. + static PolicyDefinition GENERIC_APPLICATION_HIDDEN = + new PolicyDefinition<>( + new PackagePolicyKey( + DevicePolicyIdentifiers.APPLICATION_HIDDEN_POLICY), + // TODO(b/276713779): Don't need to take in a resolution mechanism since its + // never used, but might need some refactoring to not always assume a non-null + // mechanism. + TRUE_MORE_RESTRICTIVE, + POLICY_FLAG_LOCAL_ONLY_POLICY, + PolicyEnforcerCallbacks::setApplicationHidden, + new BooleanPolicySerializer()); + + /** + * Passing in {@code null} for {@code packageName} will return + * {@link #GENERIC_APPLICATION_HIDDEN}. + */ + static PolicyDefinition APPLICATION_HIDDEN(String packageName) { + if (packageName == null) { + return GENERIC_APPLICATION_HIDDEN; + } + return GENERIC_APPLICATION_HIDDEN.createPolicyDefinition( + new PackagePolicyKey( + DevicePolicyIdentifiers.APPLICATION_HIDDEN_POLICY, packageName)); + } + private static final Map> POLICY_DEFINITIONS = new HashMap<>(); private static Map USER_RESTRICTION_FLAGS = new HashMap<>(); @@ -272,6 +299,10 @@ final class PolicyDefinition { GENERIC_APPLICATION_RESTRICTIONS); POLICY_DEFINITIONS.put(DevicePolicyIdentifiers.RESET_PASSWORD_TOKEN_POLICY, RESET_PASSWORD_TOKEN); + POLICY_DEFINITIONS.put(DevicePolicyIdentifiers.KEYGUARD_DISABLED_FEATURES_POLICY, + KEYGUARD_DISABLED_FEATURES); + POLICY_DEFINITIONS.put(DevicePolicyIdentifiers.APPLICATION_HIDDEN_POLICY, + GENERIC_APPLICATION_HIDDEN); // User Restriction Policies USER_RESTRICTION_FLAGS.put(UserManager.DISALLOW_MODIFY_ACCOUNTS, /* flags= */ 0); diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/PolicyEnforcerCallbacks.java b/services/devicepolicy/java/com/android/server/devicepolicy/PolicyEnforcerCallbacks.java index fd91249fac627..d65d366e4476f 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/PolicyEnforcerCallbacks.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/PolicyEnforcerCallbacks.java @@ -73,7 +73,7 @@ final class PolicyEnforcerCallbacks { return Boolean.TRUE.equals(Binder.withCleanCallingIdentity(() -> { if (!(policyKey instanceof PackagePermissionPolicyKey)) { throw new IllegalArgumentException("policyKey is not of type " - + "PermissionGrantStatePolicyKey"); + + "PermissionGrantStatePolicyKey, passed in policyKey is: " + policyKey); } PackagePermissionPolicyKey parsedKey = (PackagePermissionPolicyKey) policyKey; Objects.requireNonNull(parsedKey.getPermissionName()); @@ -165,7 +165,7 @@ final class PolicyEnforcerCallbacks { try { if (!(policyKey instanceof IntentFilterPolicyKey)) { throw new IllegalArgumentException("policyKey is not of type " - + "IntentFilterPolicyKey"); + + "IntentFilterPolicyKey, passed in policyKey is: " + policyKey); } IntentFilterPolicyKey parsedKey = (IntentFilterPolicyKey) policyKey; @@ -193,7 +193,7 @@ final class PolicyEnforcerCallbacks { return Boolean.TRUE.equals(Binder.withCleanCallingIdentity(() -> { if (!(policyKey instanceof PackagePolicyKey)) { throw new IllegalArgumentException("policyKey is not of type " - + "PackagePolicyKey"); + + "PackagePolicyKey, passed in policyKey is: " + policyKey); } PackagePolicyKey parsedKey = (PackagePolicyKey) policyKey; String packageName = Objects.requireNonNull(parsedKey.getPackageName()); @@ -211,7 +211,7 @@ final class PolicyEnforcerCallbacks { return Boolean.TRUE.equals(Binder.withCleanCallingIdentity(() -> { if (!(policyKey instanceof UserRestrictionPolicyKey)) { throw new IllegalArgumentException("policyKey is not of type " - + "UserRestrictionPolicyKey"); + + "UserRestrictionPolicyKey, passed in policyKey is: " + policyKey); } UserRestrictionPolicyKey parsedKey = (UserRestrictionPolicyKey) policyKey; @@ -221,4 +221,20 @@ final class PolicyEnforcerCallbacks { return true; })); } + + static boolean setApplicationHidden( + @Nullable Boolean hide, @NonNull Context context, int userId, + @NonNull PolicyKey policyKey) { + return Boolean.TRUE.equals(Binder.withCleanCallingIdentity(() -> { + if (!(policyKey instanceof PackagePolicyKey)) { + throw new IllegalArgumentException("policyKey is not of type " + + "PackagePolicyKey, passed in policyKey is: " + policyKey); + } + PackagePolicyKey parsedKey = (PackagePolicyKey) policyKey; + String packageName = Objects.requireNonNull(parsedKey.getPackageName()); + IPackageManager packageManager = AppGlobals.getPackageManager(); + return packageManager.setApplicationHiddenSettingAsUser( + packageName, hide != null && hide, userId); + })); + } }