From 1219c924bdf98fd5342fe5bb7cd09da1012d2e1a Mon Sep 17 00:00:00 2001 From: Nicolas Prevot Date: Mon, 20 Jun 2016 17:25:12 +0100 Subject: [PATCH] Don't allow showing an activity if user is stopping or shutting down. BUG:29264996 Change-Id: I9fc97c5dc37e6d5656b82b277954b5963eb345c4 --- .../core/java/com/android/server/am/ActivityStackSupervisor.java | 5 +++-- services/core/java/com/android/server/am/UserController.java | 9 +++++++++ services/core/java/com/android/server/pm/UserManagerService.java | 2 +- 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/services/core/java/com/android/server/am/ActivityStackSupervisor.java b/services/core/java/com/android/server/am/ActivityStackSupervisor.java index 738622fd923b..108cabbd3528 100644 --- a/services/core/java/com/android/server/am/ActivityStackSupervisor.java +++ b/services/core/java/com/android/server/am/ActivityStackSupervisor.java @@ -3023,8 +3023,9 @@ public final class ActivityStackSupervisor implements DisplayListener { /** Checks whether the activity should be shown for current user. */ boolean okToShowLocked(ActivityRecord r) { - return r != null && (isCurrentProfileLocked(r.userId) - || (r.info.flags & FLAG_SHOW_FOR_ALL_USERS) != 0); + return r != null && ((r.info.flags & FLAG_SHOW_FOR_ALL_USERS) != 0 + || (isCurrentProfileLocked(r.userId) + && !mService.mUserController.isUserStoppingOrShuttingDownLocked(r.userId))); } final ArrayList processStoppingActivitiesLocked(boolean remove) { diff --git a/services/core/java/com/android/server/am/UserController.java b/services/core/java/com/android/server/am/UserController.java index 4380af335581..b685dd3f6771 100644 --- a/services/core/java/com/android/server/am/UserController.java +++ b/services/core/java/com/android/server/am/UserController.java @@ -1335,6 +1335,15 @@ final class UserController { return mStartedUserArray; } + boolean isUserStoppingOrShuttingDownLocked(int userId) { + UserState state = getStartedUserStateLocked(userId); + if (state == null) { + return false; + } + return state.state == UserState.STATE_STOPPING + || state.state == UserState.STATE_SHUTDOWN; + } + boolean isUserRunningLocked(int userId, int flags) { UserState state = getStartedUserStateLocked(userId); if (state == null) { diff --git a/services/core/java/com/android/server/pm/UserManagerService.java b/services/core/java/com/android/server/pm/UserManagerService.java index 4c515f0fc87e..d8a1c779f77e 100644 --- a/services/core/java/com/android/server/pm/UserManagerService.java +++ b/services/core/java/com/android/server/pm/UserManagerService.java @@ -732,9 +732,9 @@ public class UserManagerService extends IUserManager.Stub { long identity = Binder.clearCallingIdentity(); try { if (enableQuietMode) { + ActivityManagerNative.getDefault().stopUser(userHandle, /* force */true, null); LocalServices.getService(ActivityManagerInternal.class) .killForegroundAppsForUser(userHandle); - ActivityManagerNative.getDefault().stopUser(userHandle, /* force */true, null); } else { ActivityManagerNative.getDefault().startUserInBackground(userHandle); } -- 2.11.0