diff options
| author | 2023-03-31 13:09:22 +0000 | |
|---|---|---|
| committer | 2023-04-04 09:12:10 +0000 | |
| commit | 808497beacf466568988ffc9710f625d9b90cc2c (patch) | |
| tree | 940afa1492d9ab63189410ad90d3d502125bc96d | |
| parent | d9fc7a578557cefd28c9b90eb2ee3de98972e753 (diff) | |
Migrate setApplicationHidden to the policy engine
Bug: 273496614
Test: btest a.d.c.ApplicationHiddenTest
Change-Id: I57d8730e64d970618ae17fae6e77292f49207f0d
4 files changed, 123 insertions, 47 deletions
diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyEngine.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyEngine.java index 7eeb51c84200..df3815e3734d 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<ResolveInfo> 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<ResolveInfo> 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<ResolveInfo> 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); + Binder.withCleanCallingIdentity(() -> { + List<ResolveInfo> 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; + } - maybeSendIntentToAdminReceivers( - intent, UserHandle.of(admin.getUserId()), receivers); + 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); + }); } 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 39337660c55c..103f7dab0356 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 8812c3d3c557..a15aa53be96c 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<V> { * Passing in {@code null} for {@code packageName} will return * {@link #GENERIC_APPLICATION_RESTRICTIONS}. */ - static PolicyDefinition<Bundle> APPLICATION_RESTRICTIONS( - String packageName) { + static PolicyDefinition<Bundle> APPLICATION_RESTRICTIONS(String packageName) { if (packageName == null) { return GENERIC_APPLICATION_RESTRICTIONS; } @@ -254,6 +253,34 @@ final class PolicyDefinition<V> { (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<Boolean> 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<Boolean> 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<String, PolicyDefinition<?>> POLICY_DEFINITIONS = new HashMap<>(); private static Map<String, Integer> USER_RESTRICTION_FLAGS = new HashMap<>(); @@ -272,6 +299,10 @@ final class PolicyDefinition<V> { 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 fd91249fac62..d65d366e4476 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); + })); + } } |