diff options
| -rw-r--r-- | services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyEngine.java | 50 | ||||
| -rw-r--r-- | services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java | 4 |
2 files changed, 54 insertions, 0 deletions
diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyEngine.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyEngine.java index e90100a09363..43327f794004 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyEngine.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyEngine.java @@ -32,13 +32,17 @@ import android.app.BroadcastOptions; import android.app.admin.DevicePolicyIdentifiers; import android.app.admin.DevicePolicyManager; import android.app.admin.DevicePolicyState; +import android.app.admin.IntentFilterPolicyKey; import android.app.admin.PolicyKey; import android.app.admin.PolicyUpdateReceiver; import android.app.admin.PolicyValue; import android.app.admin.TargetUser; import android.app.admin.UserRestrictionPolicyKey; +import android.content.ComponentName; import android.content.Context; import android.content.Intent; +import android.content.IntentFilter; +import android.content.pm.IPackageManager; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.content.pm.UserInfo; @@ -1043,10 +1047,56 @@ final class DevicePolicyEngine { } if (updatedPackage != null) { updateDeviceAdminServiceOnPackageChanged(updatedPackage, userId); + removePersistentPreferredActivityPoliciesForPackage(updatedPackage, userId); } }); } + private void removePersistentPreferredActivityPoliciesForPackage( + @NonNull String packageName, int userId) { + Set<PolicyKey> policyKeys = getLocalPolicyKeysSetByAllAdmins( + PolicyDefinition.GENERIC_PERSISTENT_PREFERRED_ACTIVITY, userId); + for (PolicyKey key : policyKeys) { + if (!(key instanceof IntentFilterPolicyKey)) { + throw new IllegalStateException("PolicyKey for " + + "PERSISTENT_PREFERRED_ACTIVITY is not of type " + + "IntentFilterPolicyKey"); + } + IntentFilterPolicyKey parsedKey = + (IntentFilterPolicyKey) key; + IntentFilter intentFilter = Objects.requireNonNull(parsedKey.getIntentFilter()); + PolicyDefinition<ComponentName> policyDefinition = + PolicyDefinition.PERSISTENT_PREFERRED_ACTIVITY(intentFilter); + LinkedHashMap<EnforcingAdmin, PolicyValue<ComponentName>> policies = + getLocalPoliciesSetByAdmins( + policyDefinition, + userId); + IPackageManager packageManager = AppGlobals.getPackageManager(); + for (EnforcingAdmin admin : policies.keySet()) { + if (policies.get(admin).getValue() != null + && policies.get(admin).getValue().getPackageName().equals(packageName)) { + try { + if (packageManager.getPackageInfo( + packageName, 0, userId) == null + || packageManager.getReceiverInfo(policies.get(admin).getValue(), + PackageManager.MATCH_DIRECT_BOOT_AWARE + | PackageManager.MATCH_DIRECT_BOOT_UNAWARE, + userId) == null) { + Slogf.e(TAG, String.format( + "Persistent preferred activity in package %s not found for " + + "user %d, removing policy for admin", + packageName, userId)); + removeLocalPolicy(policyDefinition, admin, userId); + } + } catch (RemoteException re) { + // Shouldn't happen. + Slogf.wtf(TAG, "Error handling package changes", re); + } + } + } + } + } + private boolean isPackageInstalled(String packageName, int userId) { try { return AppGlobals.getPackageManager().getPackageInfo( diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java index a04849323bb6..9594af87e33b 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java @@ -11444,6 +11444,10 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { || isDefaultDeviceOwner(caller) || isFinancedDeviceOwner(caller)); enforcingAdmin = getEnforcingAdminForCaller(who, callerPackageName); } + if (!isPackageInstalledForUser(activity.getPackageName(), userId)) { + // Fail early as packageManager doesn't persist the activity if its not installed. + return; + } mDevicePolicyEngine.setLocalPolicy( PolicyDefinition.PERSISTENT_PREFERRED_ACTIVITY(filter), enforcingAdmin, |