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
diff --git a/services/core/java/com/android/server/SystemServiceManager.java b/services/core/java/com/android/server/SystemServiceManager.java
index 9455a89..1a8cf0b 100644
--- a/services/core/java/com/android/server/SystemServiceManager.java
+++ b/services/core/java/com/android/server/SystemServiceManager.java
@@ -121,7 +121,7 @@
      * {@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 @@
         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 @@
                 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 @@
         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 f92f5ea..3a592cd 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 @@
         assertEquals(1, counter.get());
     }
 
+    @Test
+    public void onUserCompletedEventShouldNotThrowExceptionWithStoppedOrUnknownUser() {
+        mSystemServiceManager.onUserCompletedEvent(99,
+                SystemService.UserCompletedEventType.EVENT_TYPE_USER_STARTING);
+    }
+
 }