Loading services/core/java/com/android/server/SystemServiceManager.java +15 −8 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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) { Loading Loading @@ -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); } Loading Loading @@ -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, Loading services/tests/servicestests/src/com/android/server/SystemServiceManagerTest.java +6 −0 Original line number Diff line number Diff line Loading @@ -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); } } Loading
services/core/java/com/android/server/SystemServiceManager.java +15 −8 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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) { Loading Loading @@ -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); } Loading Loading @@ -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, Loading
services/tests/servicestests/src/com/android/server/SystemServiceManagerTest.java +6 −0 Original line number Diff line number Diff line Loading @@ -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); } }