summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Kholoud Mohamed <kholoudm@google.com> 2023-03-31 13:09:22 +0000
committer Kholoud Mohamed <kholoudm@google.com> 2023-04-04 09:12:10 +0000
commit808497beacf466568988ffc9710f625d9b90cc2c (patch)
tree940afa1492d9ab63189410ad90d3d502125bc96d
parentd9fc7a578557cefd28c9b90eb2ee3de98972e753 (diff)
Migrate setApplicationHidden to the policy engine
Bug: 273496614 Test: btest a.d.c.ApplicationHiddenTest Change-Id: I57d8730e64d970618ae17fae6e77292f49207f0d
-rw-r--r--services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyEngine.java84
-rw-r--r--services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java27
-rw-r--r--services/devicepolicy/java/com/android/server/devicepolicy/PolicyDefinition.java35
-rw-r--r--services/devicepolicy/java/com/android/server/devicepolicy/PolicyEnforcerCallbacks.java24
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);
+ }));
+ }
}