Turn off profile by stopping the user.
Bug: 22541941
Change-Id: I713ab9b87f3dd1b7bd6206af137562d20a44d76d
diff --git a/services/core/java/com/android/server/pm/UserManagerService.java b/services/core/java/com/android/server/pm/UserManagerService.java
index 1e057aa..637feaa 100644
--- a/services/core/java/com/android/server/pm/UserManagerService.java
+++ b/services/core/java/com/android/server/pm/UserManagerService.java
@@ -552,22 +552,13 @@
}
private void broadcastProfileAvailabilityChanges(UserHandle profileHandle,
- UserHandle parentHandle, Bundle extras) {
- // Send intent to profile
- Intent intent = new Intent(Intent.ACTION_AVAILABILITY_CHANGED);
+ UserHandle parentHandle, boolean inQuietMode) {
+ Intent intent = new Intent(Intent.ACTION_MANAGED_PROFILE_AVAILABILITY_CHANGED);
+ intent.putExtra(Intent.EXTRA_QUIET_MODE, inQuietMode);
+ intent.putExtra(Intent.EXTRA_USER, profileHandle);
+ intent.putExtra(Intent.EXTRA_USER_HANDLE, profileHandle.getIdentifier());
intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY);
- intent.putExtras(extras);
- mContext.sendBroadcastAsUser(intent, profileHandle);
-
- // Send intent to parent
- if (parentHandle != null) {
- intent = new Intent(Intent.ACTION_MANAGED_PROFILE_AVAILABILITY_CHANGED);
- intent.putExtra(Intent.EXTRA_USER, profileHandle);
- intent.putExtra(Intent.EXTRA_USER_HANDLE, profileHandle.getIdentifier());
- intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY);
- intent.putExtras(extras);
- mContext.sendBroadcastAsUser(intent, parentHandle);
- }
+ mContext.sendBroadcastAsUser(intent, parentHandle);
}
@Override
@@ -591,10 +582,21 @@
}
}
if (changed) {
- Bundle extras = new Bundle();
- extras.putBoolean(Intent.EXTRA_QUIET_MODE, enableQuietMode);
- broadcastProfileAvailabilityChanges(profile.getUserHandle(),
- parent != null ? parent.getUserHandle() : null, extras);
+ long identity = Binder.clearCallingIdentity();
+ try {
+ if (enableQuietMode) {
+ ActivityManagerNative.getDefault().stopUser(userHandle, /* force */true, null);
+ } else {
+ ActivityManagerNative.getDefault().startUserInBackground(userHandle);
+ }
+ } catch (RemoteException e) {
+ Slog.e(LOG_TAG, "fail to start/stop user for quiet mode", e);
+ } finally {
+ Binder.restoreCallingIdentity(identity);
+ }
+
+ broadcastProfileAvailabilityChanges(profile.getUserHandle(), parent.getUserHandle(),
+ enableQuietMode);
}
}
@@ -606,7 +608,7 @@
info = getUserInfoLU(userHandle);
}
if (info == null || !info.isManagedProfile()) {
- throw new IllegalArgumentException("User " + userHandle + " is not a profile");
+ return false;
}
return info.isQuietModeEnabled();
}