Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8da870dd authored by Nikhil Kumar's avatar Nikhil Kumar
Browse files

Added user exist check in SystemService post-completed user event

Added an additional check to verify if the userId exists,
In case userId does not exist the method will return
without sending any post-completed user events.

Test: atest UserControllerTest
Test: atest SystemServiceManagerTest

Bug: 242226766
Change-Id: If5bb7420a91a60a7907aede4e140f47ea0ab10d6
parent 327377b8
Loading
Loading
Loading
Loading
+15 −8
Original line number Diff line number Diff line
@@ -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,
+6 −0
Original line number Diff line number Diff line
@@ -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);
    }

}