Headless fixes for cross profile apps.
Test: btest a.d.c.CrossProfileAppsTest
Bug: 278891585
Change-Id: I6430752702d3b08a6d6c08659e3c7ac40ad5e5c9
diff --git a/core/java/android/app/admin/DevicePolicyManager.java b/core/java/android/app/admin/DevicePolicyManager.java
index 7b68357..27f5545 100644
--- a/core/java/android/app/admin/DevicePolicyManager.java
+++ b/core/java/android/app/admin/DevicePolicyManager.java
@@ -9599,6 +9599,7 @@
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
} catch (IllegalArgumentException ex) {
+ Log.e(TAG, "IllegalArgumentException checking isPackageSuspended", ex);
throw new NameNotFoundException(packageName);
}
}
diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
index 7156f6c..c689b26 100644
--- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
+++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
@@ -7513,6 +7513,7 @@
boolean success = false;
try {
if (getCurrentForegroundUserId() == userId) {
+ // TODO: We need to special case headless here as we can't switch to the system user
mInjector.getIActivityManager().switchUser(UserHandle.USER_SYSTEM);
}
@@ -7520,7 +7521,8 @@
if (!success) {
Slogf.w(LOG_TAG, "Couldn't remove user " + userId);
} else if (isManagedProfile(userId) && !wipeSilently) {
- sendWipeProfileNotification(wipeReasonForUser);
+ sendWipeProfileNotification(wipeReasonForUser,
+ UserHandle.of(getProfileParentId(userId)));
}
} catch (RemoteException re) {
// Shouldn't happen
@@ -7868,7 +7870,7 @@
});
}
- private void sendWipeProfileNotification(String wipeReasonForUser) {
+ private void sendWipeProfileNotification(String wipeReasonForUser, UserHandle user) {
Notification notification =
new Notification.Builder(mContext, SystemNotificationChannels.DEVICE_ADMIN)
.setSmallIcon(android.R.drawable.stat_sys_warning)
@@ -7877,7 +7879,8 @@
.setColor(mContext.getColor(R.color.system_notification_accent_color))
.setStyle(new Notification.BigTextStyle().bigText(wipeReasonForUser))
.build();
- mInjector.getNotificationManager().notify(SystemMessage.NOTE_PROFILE_WIPED, notification);
+ mInjector.getNotificationManager().notifyAsUser(
+ /* tag= */ null, SystemMessage.NOTE_PROFILE_WIPED, notification, user);
}
private String getWorkProfileDeletedTitle() {
@@ -16895,6 +16898,7 @@
} else {
granted = PackageManager.PERMISSION_GRANTED;
}
+
}
}
}
@@ -19998,6 +20002,7 @@
if (!mHasFeature) {
return;
}
+
Objects.requireNonNull(who, "ComponentName is null");
Objects.requireNonNull(packageNames, "Package names is null");
final CallerIdentity caller = getCallerIdentity(who);
@@ -20014,9 +20019,12 @@
saveSettingsLocked(caller.getUserId());
}
logSetCrossProfilePackages(who, packageNames);
- final CrossProfileApps crossProfileApps = mContext.getSystemService(CrossProfileApps.class);
+ final CrossProfileApps crossProfileApps =
+ mContext.createContextAsUser(
+ caller.getUserHandle(), /* flags= */ 0)
+ .getSystemService(CrossProfileApps.class);
mInjector.binderWithCleanCallingIdentity(
- () -> crossProfileApps.resetInteractAcrossProfilesAppOps(
+ () -> crossProfileApps.resetInteractAcrossProfilesAppOps(
previousCrossProfilePackages, new HashSet<>(packageNames)));
}