Merge "Minor bug fixes related to package/dpc removal" into udc-dev

This commit is contained in:
Treehugger Robot
2023-05-12 16:52:02 +00:00
committed by Android (Google) Code Review
2 changed files with 47 additions and 14 deletions

View File

@@ -27,6 +27,7 @@ import static android.content.pm.UserProperties.INHERIT_DEVICE_POLICY_FROM_PAREN
import android.Manifest; import android.Manifest;
import android.annotation.NonNull; import android.annotation.NonNull;
import android.annotation.Nullable; import android.annotation.Nullable;
import android.app.AppGlobals;
import android.app.BroadcastOptions; import android.app.BroadcastOptions;
import android.app.admin.DevicePolicyIdentifiers; import android.app.admin.DevicePolicyIdentifiers;
import android.app.admin.DevicePolicyManager; import android.app.admin.DevicePolicyManager;
@@ -45,6 +46,7 @@ import android.content.pm.UserProperties;
import android.os.Binder; import android.os.Binder;
import android.os.Bundle; import android.os.Bundle;
import android.os.Environment; import android.os.Environment;
import android.os.RemoteException;
import android.os.UserHandle; import android.os.UserHandle;
import android.os.UserManager; import android.os.UserManager;
import android.telephony.TelephonyManager; import android.telephony.TelephonyManager;
@@ -1015,20 +1017,44 @@ final class DevicePolicyEngine {
/** /**
* Handles internal state related to packages getting updated. * Handles internal state related to packages getting updated.
*/ */
void handlePackageChanged(@Nullable String updatedPackage, int userId, boolean packageRemoved) { void handlePackageChanged(
if (updatedPackage == null) { @Nullable String updatedPackage, int userId, @Nullable String removedDpcPackage) {
return; Binder.withCleanCallingIdentity(() -> {
}
if (packageRemoved) {
Set<EnforcingAdmin> admins = getEnforcingAdminsOnUser(userId); Set<EnforcingAdmin> admins = getEnforcingAdminsOnUser(userId);
for (EnforcingAdmin admin : admins) { if (removedDpcPackage != null) {
if (admin.getPackageName().equals(updatedPackage)) { for (EnforcingAdmin admin : admins) {
// remove policies for the uninstalled package if (removedDpcPackage.equals(admin.getPackageName())) {
removePoliciesForAdmin(admin); removePoliciesForAdmin(admin);
return;
}
} }
} }
} else { for (EnforcingAdmin admin : admins) {
updateDeviceAdminServiceOnPackageChanged(updatedPackage, userId); 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;
} }
} }

View File

@@ -1384,6 +1384,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub {
private void handlePackagesChanged(@Nullable String packageName, int userHandle) { private void handlePackagesChanged(@Nullable String packageName, int userHandle) {
boolean removedAdmin = false; boolean removedAdmin = false;
String removedAdminPackage = null;
if (VERBOSE_LOG) { if (VERBOSE_LOG) {
Slogf.d(LOG_TAG, "Handling package changes package " + packageName Slogf.d(LOG_TAG, "Handling package changes package " + packageName
+ " for user " + userHandle); + " for user " + userHandle);
@@ -1406,6 +1407,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub {
"Admin package %s not found for user %d, removing active admin", "Admin package %s not found for user %d, removing active admin",
packageName, userHandle)); packageName, userHandle));
removedAdmin = true; removedAdmin = true;
removedAdminPackage = adminPackage;
policy.mAdminList.remove(i); policy.mAdminList.remove(i);
policy.mAdminMap.remove(aa.info.getComponent()); policy.mAdminMap.remove(aa.info.getComponent());
pushActiveAdminPackagesLocked(userHandle); pushActiveAdminPackagesLocked(userHandle);
@@ -1439,7 +1441,8 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub {
startOwnerService(userHandle, "package-broadcast"); startOwnerService(userHandle, "package-broadcast");
} }
if (isPolicyEngineForFinanceFlagEnabled() || isPermissionCheckFlagEnabled()) { if (isPolicyEngineForFinanceFlagEnabled() || isPermissionCheckFlagEnabled()) {
mDevicePolicyEngine.handlePackageChanged(packageName, userHandle, removedAdmin); mDevicePolicyEngine.handlePackageChanged(
packageName, userHandle, removedAdminPackage);
} }
// Persist updates if the removed package was an admin or delegate. // Persist updates if the removed package was an admin or delegate.
if (removedAdmin || removedDelegate) { if (removedAdmin || removedDelegate) {
@@ -3532,7 +3535,9 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub {
deleteTransferOwnershipBundleLocked(metadata.userId); deleteTransferOwnershipBundleLocked(metadata.userId);
} }
updateSystemUpdateFreezePeriodsRecord(/* saveIfChanged */ true); updateSystemUpdateFreezePeriodsRecord(/* saveIfChanged */ true);
pushUserControlDisabledPackagesLocked(metadata.userId); if (!isPolicyEngineForFinanceFlagEnabled()) {
pushUserControlDisabledPackagesLocked(metadata.userId);
}
} }
private void maybeLogStart() { private void maybeLogStart() {
@@ -10104,7 +10109,9 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub {
clearUserPoliciesLocked(userId); clearUserPoliciesLocked(userId);
clearOverrideApnUnchecked(); clearOverrideApnUnchecked();
clearApplicationRestrictions(userId); clearApplicationRestrictions(userId);
mInjector.getPackageManagerInternal().clearBlockUninstallForUser(userId); if (!isPolicyEngineForFinanceFlagEnabled()) {
mInjector.getPackageManagerInternal().clearBlockUninstallForUser(userId);
}
mOwners.clearDeviceOwner(); mOwners.clearDeviceOwner();
mOwners.writeDeviceOwner(); mOwners.writeDeviceOwner();