Launch user picker on occupant zone user changes

By listening to occupant zone changes for users as well as displays, we
can ensure that the user picker is launched whenever a user is not
assigned to a particular display.

Bug: 279073946
Test: manual (standard logout CUJs, running user deletion),
atest CarUserServiceTest

Change-Id: I751ba81f2700ac53d67ede0f2f7c6d8468953ec8
diff --git a/service/src/com/android/car/user/CarUserService.java b/service/src/com/android/car/user/CarUserService.java
index 2613b0f..abb25fc 100644
--- a/service/src/com/android/car/user/CarUserService.java
+++ b/service/src/com/android/car/user/CarUserService.java
@@ -415,12 +415,16 @@
             new ICarOccupantZoneCallback.Stub() {
                 @Override
                 public void onOccupantZoneConfigChanged(int flags) throws RemoteException {
-                    if ((flags & CarOccupantZoneManager.ZONE_CONFIG_CHANGE_FLAG_DISPLAY) != 0) {
+                    // Listen for changes to displays and user->display assignments and launch
+                    // user picker when there is no user assigned to a display. This may be a no-op
+                    // for certain cases, such as a user getting assigned to a display.
+                    if ((flags & (CarOccupantZoneManager.ZONE_CONFIG_CHANGE_FLAG_DISPLAY
+                            | CarOccupantZoneManager.ZONE_CONFIG_CHANGE_FLAG_USER)) != 0) {
                         if (DBG) {
                             String flagString = DebugUtils.flagsToString(
                                     CarOccupantZoneManager.class, "ZONE_CONFIG_CHANGE_FLAG_",
                                     flags);
-                            Slogf.d(TAG, "onOccupantZoneConfigChanged: display zone change flag=%s",
+                            Slogf.d(TAG, "onOccupantZoneConfigChanged: zone change flag=%s",
                                     flagString);
                         }
                         startUserPicker();