Merge "Minor bug fixes related to package/dpc removal" into udc-dev
diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyEngine.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyEngine.java
index 1322225..ee80a05 100644
--- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyEngine.java
+++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyEngine.java
@@ -27,6 +27,7 @@
import android.Manifest;
import android.annotation.NonNull;
import android.annotation.Nullable;
+import android.app.AppGlobals;
import android.app.BroadcastOptions;
import android.app.admin.DevicePolicyIdentifiers;
import android.app.admin.DevicePolicyManager;
@@ -45,6 +46,7 @@
import android.os.Binder;
import android.os.Bundle;
import android.os.Environment;
+import android.os.RemoteException;
import android.os.UserHandle;
import android.os.UserManager;
import android.telephony.TelephonyManager;
@@ -1015,20 +1017,44 @@
/**
* Handles internal state related to packages getting updated.
*/
- void handlePackageChanged(@Nullable String updatedPackage, int userId, boolean packageRemoved) {
- if (updatedPackage == null) {
- return;
- }
- if (packageRemoved) {
+ void handlePackageChanged(
+ @Nullable String updatedPackage, int userId, @Nullable String removedDpcPackage) {
+ Binder.withCleanCallingIdentity(() -> {
Set<EnforcingAdmin> admins = getEnforcingAdminsOnUser(userId);
- for (EnforcingAdmin admin : admins) {
- if (admin.getPackageName().equals(updatedPackage)) {
- // remove policies for the uninstalled package
- removePoliciesForAdmin(admin);
+ if (removedDpcPackage != null) {
+ for (EnforcingAdmin admin : admins) {
+ if (removedDpcPackage.equals(admin.getPackageName())) {
+ removePoliciesForAdmin(admin);
+ return;
+ }
}
}
- } else {
- updateDeviceAdminServiceOnPackageChanged(updatedPackage, userId);
+ for (EnforcingAdmin admin : admins) {
+ if (updatedPackage == null || updatedPackage.equals(admin.getPackageName())) {
+ if (!isPackageInstalled(admin.getPackageName(), userId)) {
+ Slogf.i(TAG, String.format(
+ "Admin package %s not found for user %d, removing admin policies",
+ admin.getPackageName(), userId));
+ // remove policies for the uninstalled package
+ removePoliciesForAdmin(admin);
+ return;
+ }
+ }
+ }
+ if (updatedPackage != null) {
+ updateDeviceAdminServiceOnPackageChanged(updatedPackage, userId);
+ }
+ });
+ }
+
+ private boolean isPackageInstalled(String packageName, int userId) {
+ try {
+ return AppGlobals.getPackageManager().getPackageInfo(
+ packageName, 0, userId) != null;
+ } catch (RemoteException re) {
+ // Shouldn't happen.
+ Slogf.wtf(TAG, "Error handling package changes", re);
+ return true;
}
}
diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
index 8e7b00c..8f7e292 100644
--- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
+++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
@@ -1384,6 +1384,7 @@
private void handlePackagesChanged(@Nullable String packageName, int userHandle) {
boolean removedAdmin = false;
+ String removedAdminPackage = null;
if (VERBOSE_LOG) {
Slogf.d(LOG_TAG, "Handling package changes package " + packageName
+ " for user " + userHandle);
@@ -1406,6 +1407,7 @@
"Admin package %s not found for user %d, removing active admin",
packageName, userHandle));
removedAdmin = true;
+ removedAdminPackage = adminPackage;
policy.mAdminList.remove(i);
policy.mAdminMap.remove(aa.info.getComponent());
pushActiveAdminPackagesLocked(userHandle);
@@ -1439,7 +1441,8 @@
startOwnerService(userHandle, "package-broadcast");
}
if (isPolicyEngineForFinanceFlagEnabled() || isPermissionCheckFlagEnabled()) {
- mDevicePolicyEngine.handlePackageChanged(packageName, userHandle, removedAdmin);
+ mDevicePolicyEngine.handlePackageChanged(
+ packageName, userHandle, removedAdminPackage);
}
// Persist updates if the removed package was an admin or delegate.
if (removedAdmin || removedDelegate) {
@@ -3532,7 +3535,9 @@
deleteTransferOwnershipBundleLocked(metadata.userId);
}
updateSystemUpdateFreezePeriodsRecord(/* saveIfChanged */ true);
- pushUserControlDisabledPackagesLocked(metadata.userId);
+ if (!isPolicyEngineForFinanceFlagEnabled()) {
+ pushUserControlDisabledPackagesLocked(metadata.userId);
+ }
}
private void maybeLogStart() {
@@ -10104,7 +10109,9 @@
clearUserPoliciesLocked(userId);
clearOverrideApnUnchecked();
clearApplicationRestrictions(userId);
- mInjector.getPackageManagerInternal().clearBlockUninstallForUser(userId);
+ if (!isPolicyEngineForFinanceFlagEnabled()) {
+ mInjector.getPackageManagerInternal().clearBlockUninstallForUser(userId);
+ }
mOwners.clearDeviceOwner();
mOwners.writeDeviceOwner();