diff options
| author | 2022-09-01 15:38:30 +0000 | |
|---|---|---|
| committer | 2022-09-01 15:38:30 +0000 | |
| commit | 071b58a2da108dc58a658455a13e781ab44682ab (patch) | |
| tree | fd2b2c41c7609aa2f5e1592ab5efa3654f193dfe | |
| parent | 410a9b8fa028763b923a474edc986afabfa488a8 (diff) | |
| parent | 8da870ddf1c12d31a2e0baa92ed67af8bfe0b5c5 (diff) | |
Merge "Added user exist check in SystemService post-completed user event"
| -rw-r--r-- | services/core/java/com/android/server/SystemServiceManager.java | 23 | ||||
| -rw-r--r-- | services/tests/servicestests/src/com/android/server/SystemServiceManagerTest.java | 6 |
2 files changed, 21 insertions, 8 deletions
diff --git a/services/core/java/com/android/server/SystemServiceManager.java b/services/core/java/com/android/server/SystemServiceManager.java index 9455a89232cf..1a8cf0b07cb6 100644 --- a/services/core/java/com/android/server/SystemServiceManager.java +++ b/services/core/java/com/android/server/SystemServiceManager.java @@ -121,7 +121,7 @@ public final class SystemServiceManager implements Dumpable { * {@link #onUserSwitching(int, int)} as the previous user might have been removed already. */ @GuardedBy("mTargetUsers") - private @Nullable TargetUser mCurrentUser; + @Nullable private TargetUser mCurrentUser; SystemServiceManager(Context context) { mContext = context; @@ -335,13 +335,10 @@ public final class SystemServiceManager implements Dumpable { mUserManagerInternal = LocalServices.getService(UserManagerInternal.class); } - private @NonNull TargetUser getTargetUser(@UserIdInt int userId) { - final TargetUser targetUser; + @Nullable private TargetUser getTargetUser(@UserIdInt int userId) { synchronized (mTargetUsers) { - targetUser = mTargetUsers.get(userId); + return mTargetUsers.get(userId); } - Preconditions.checkState(targetUser != null, "No TargetUser for " + userId); - return targetUser; } private @NonNull TargetUser newTargetUser(@UserIdInt int userId) { @@ -400,6 +397,7 @@ public final class SystemServiceManager implements Dumpable { prevUser = mCurrentUser; } curUser = mCurrentUser = getTargetUser(to); + Preconditions.checkState(curUser != null, "No TargetUser for " + to); if (DEBUG) { Slog.d(TAG, "Set mCurrentUser to " + mCurrentUser); } @@ -441,16 +439,25 @@ public final class SystemServiceManager implements Dumpable { if (eventFlags == 0) { return; } + + TargetUser targetUser = getTargetUser(userId); + if (targetUser == null) { + return; + } + onUser(TimingsTraceAndSlog.newAsyncLog(), USER_COMPLETED_EVENT, /* prevUser= */ null, - getTargetUser(userId), + targetUser, new UserCompletedEventType(eventFlags)); } private void onUser(@NonNull String onWhat, @UserIdInt int userId) { + TargetUser targetUser = getTargetUser(userId); + Preconditions.checkState(targetUser != null, "No TargetUser for " + userId); + onUser(TimingsTraceAndSlog.newAsyncLog(), onWhat, /* prevUser= */ null, - getTargetUser(userId)); + targetUser); } private void onUser(@NonNull TimingsTraceAndSlog t, @NonNull String onWhat, diff --git a/services/tests/servicestests/src/com/android/server/SystemServiceManagerTest.java b/services/tests/servicestests/src/com/android/server/SystemServiceManagerTest.java index f92f5ead2c3b..3a592cdeb3b6 100644 --- a/services/tests/servicestests/src/com/android/server/SystemServiceManagerTest.java +++ b/services/tests/servicestests/src/com/android/server/SystemServiceManagerTest.java @@ -81,4 +81,10 @@ public class SystemServiceManagerTest extends AndroidTestCase { assertEquals(1, counter.get()); } + @Test + public void onUserCompletedEventShouldNotThrowExceptionWithStoppedOrUnknownUser() { + mSystemServiceManager.onUserCompletedEvent(99, + SystemService.UserCompletedEventType.EVENT_TYPE_USER_STARTING); + } + } |