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
This commit is contained in:
Nikhil Kumar
2022-08-31 12:12:27 +01:00
parent 327377b8bc
commit 8da870ddf1
2 changed files with 21 additions and 8 deletions

View File

@@ -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,

View File

@@ -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);
}
}