Merge "Support user created lifecycle event in CarServiceHelperService." into tm-qpr-dev
diff --git a/builtInServices/src/com/android/internal/car/CarServiceHelperService.java b/builtInServices/src/com/android/internal/car/CarServiceHelperService.java
index 52e6861..3d9301b 100644
--- a/builtInServices/src/com/android/internal/car/CarServiceHelperService.java
+++ b/builtInServices/src/com/android/internal/car/CarServiceHelperService.java
@@ -15,6 +15,7 @@
  */
 package com.android.internal.car;
 
+import static com.android.car.internal.common.CommonConstants.USER_LIFECYCLE_EVENT_TYPE_CREATED;
 import static com.android.car.internal.common.CommonConstants.USER_LIFECYCLE_EVENT_TYPE_POST_UNLOCKED;
 import static com.android.car.internal.common.CommonConstants.USER_LIFECYCLE_EVENT_TYPE_STARTING;
 import static com.android.car.internal.common.CommonConstants.USER_LIFECYCLE_EVENT_TYPE_STOPPED;
@@ -205,7 +206,11 @@
                 @Override
                 public void onUserCreated(UserInfo user, Object token) {
                     if (DBG) Slogf.d(TAG, "onUserCreated(): %s", user.toFullString());
+                    mCarServiceHelperServiceUpdatable.sendUserLifecycleEvent(
+                            USER_LIFECYCLE_EVENT_TYPE_CREATED, /* userFrom= */ null,
+                            user.getUserHandle());
                 }
+
                 @Override
                 public void onUserRemoved(UserInfo user) {
                     if (DBG) Slogf.d(TAG, "onUserRemoved(): $s", user.toFullString());
diff --git a/updatableServices/src/com/android/internal/car/updatable/CarServiceProxy.java b/updatableServices/src/com/android/internal/car/updatable/CarServiceProxy.java
index 0824755..49ee2b5 100644
--- a/updatableServices/src/com/android/internal/car/updatable/CarServiceProxy.java
+++ b/updatableServices/src/com/android/internal/car/updatable/CarServiceProxy.java
@@ -16,6 +16,7 @@
 
 package com.android.internal.car.updatable;
 
+import static com.android.car.internal.common.CommonConstants.USER_LIFECYCLE_EVENT_TYPE_CREATED;
 import static com.android.car.internal.common.CommonConstants.USER_LIFECYCLE_EVENT_TYPE_STARTING;
 import static com.android.car.internal.common.CommonConstants.USER_LIFECYCLE_EVENT_TYPE_STOPPED;
 import static com.android.car.internal.common.CommonConstants.USER_LIFECYCLE_EVENT_TYPE_STOPPING;
@@ -197,7 +198,7 @@
         boolean user0IsCurrent = lastSwitchedUser == USER_SYSTEM;
         // If user0Lifecycle is 0, then no life-cycle event received yet.
         if (user0Lifecycle != 0) {
-            sendAllLifecyleToUser(USER_SYSTEM, user0Lifecycle,
+            sendAllLifecycleToUser(USER_SYSTEM, user0Lifecycle,
                     user0IsCurrent);
         }
         lastUserLifecycle.delete(USER_SYSTEM);
@@ -207,7 +208,7 @@
             int currentUserLifecycle = lastUserLifecycle.get(lastSwitchedUser);
             // If currentUserLifecycle is 0, then no life-cycle event received yet.
             if (currentUserLifecycle != 0) {
-                sendAllLifecyleToUser(lastSwitchedUser, currentUserLifecycle,
+                sendAllLifecycleToUser(lastSwitchedUser, currentUserLifecycle,
                         /* isCurrentUser= */ true);
             }
         }
@@ -218,15 +219,26 @@
         for (int i = 0; i < lastUserLifecycle.size(); i++) {
             int userId = lastUserLifecycle.keyAt(i);
             int lifecycle = lastUserLifecycle.valueAt(i);
-            sendAllLifecyleToUser(userId, lifecycle, /* isCurrentUser= */ false);
+            sendAllLifecycleToUser(userId, lifecycle, /* isCurrentUser= */ false);
         }
     }
 
-    private void sendAllLifecyleToUser(@UserIdInt int userId, int lifecycle,
+    private void sendAllLifecycleToUser(@UserIdInt int userId, int lifecycle,
             boolean isCurrentUser) {
         if (DBG) {
-            Slogf.d(TAG, "sendAllLifecyleToUser, user:" + userId + " lifecycle:" + lifecycle);
+            Slogf.d(TAG, "sendAllLifecycleToUser, user:" + userId + " lifecycle:" + lifecycle);
         }
+
+        // User created is unrelated to the user switching/unlocking flow.
+        // Return early here to prevent it from going into the following logic
+        // that makes assumptions about the sequence of lifecycle event types
+        // following numerical order.
+        if (lifecycle == USER_LIFECYCLE_EVENT_TYPE_CREATED) {
+            sendUserLifecycleEventInternal(USER_LIFECYCLE_EVENT_TYPE_CREATED,
+                    UserManagerHelper.USER_NULL, userId);
+            return;
+        }
+
         if (lifecycle >= USER_LIFECYCLE_EVENT_TYPE_STARTING) {
             sendUserLifecycleEventInternal(USER_LIFECYCLE_EVENT_TYPE_STARTING,
                     UserManagerHelper.USER_NULL, userId);