Merge tag 'android-13.0.0_r32' into int/13/fp3

Android 13.0.0 release 32

* tag 'android-13.0.0_r32': (27 commits)
  Import translations. DO NOT MERGE ANYWHERE
  Import translations. DO NOT MERGE ANYWHERE
  Sort profiles by creation time
  Import translations. DO NOT MERGE ANYWHERE
  Keep System UI Bars Opaque
  Refactor volume dialog animations
  Embed a reason to close system dialogs
  Import translations. DO NOT MERGE ANYWHERE
  Update CarKeyguardViewController
  Import translations. DO NOT MERGE ANYWHERE
  Updating HeadsUpManagerPhone call with new parameter
  Fixing minor divergence between master and tm-qpr-dev
  Import translations. DO NOT MERGE ANYWHERE
  Enable CarSystemUI to initialize TaskOrganizer.
  Import translations. DO NOT MERGE ANYWHERE
  CoreStartable is now an Interface
  DO NOT MERGE Update KeyguardViewController
  DO NOT MERGE Update KeyguardViewController
  DO NOT MERGE Update KeyguardViewController
  Import translations. DO NOT MERGE ANYWHERE
  ...

Change-Id: If844c05f32d6d133ed319da3b5f256494dd9cd3b
diff --git a/res/values-en-rCA/strings.xml b/res/values-en-rCA/strings.xml
index 76bf8b0..f404028 100644
--- a/res/values-en-rCA/strings.xml
+++ b/res/values-en-rCA/strings.xml
@@ -25,9 +25,9 @@
     <string name="voice_recognition_toast" msgid="7579725862117020349">"Voice recognition now handled by connected Bluetooth device"</string>
     <string name="car_add_user" msgid="6182764665687382136">"Add a profile"</string>
     <string name="end_session" msgid="2765206020435441421">"End session"</string>
-    <string name="car_new_user" msgid="6766334721724989964">"New profile"</string>
+    <string name="car_new_user" msgid="6766334721724989964">"New Profile"</string>
     <string name="user_add_profile_title" msgid="828371911076521952">"Add new profile?"</string>
-    <string name="user_add_user_message_setup" msgid="6136074867764164790">"After you create a new profile, that person should customise it for themselves."</string>
+    <string name="user_add_user_message_setup" msgid="6136074867764164790">"After you create a new profile, that person should customize it for themselves."</string>
     <string name="user_add_user_message_update" msgid="3310089453006545712">"Apps can be updated from any profile for use by all other profiles."</string>
     <string name="profile_limit_reached_title" msgid="7891779218496729653">"Profile limit reached"</string>
     <string name="profile_limit_reached_message" msgid="1534369584753840606">"{count,plural, =1{Only one profile can be created.}other{You can add up to # profiles.}}"</string>
@@ -56,22 +56,22 @@
     <string name="camera_privacy_chip_dialog_ok" msgid="7285467760928137765">"OK"</string>
     <string name="sensor_privacy_start_use_camera_dialog_title" msgid="4787836783010823885">"Turn on vehicle camera?"</string>
     <string name="sensor_privacy_start_use_camera_dialog_content" msgid="7749639131326657668">"To continue, turn on the infotainment system camera. This will turn on the camera for all apps that have permission."</string>
-    <string name="system_bar_home_label" msgid="8413273833405495948">"Home screen"</string>
+    <string name="system_bar_home_label" msgid="8413273833405495948">"Home Screen"</string>
     <string name="system_bar_phone_label" msgid="5664288201806823777">"Phone"</string>
     <string name="system_bar_applications_label" msgid="7081862804211786227">"Applications"</string>
-    <string name="system_bar_climate_control_label" msgid="4091187805919276017">"Climate control"</string>
+    <string name="system_bar_climate_control_label" msgid="4091187805919276017">"Climate Control"</string>
     <string name="system_bar_notifications_label" msgid="6039158514903928210">"Notifications"</string>
     <string name="system_bar_maps_label" msgid="7883864993280235380">"Maps"</string>
     <string name="system_bar_media_label" msgid="6156112139796274847">"Media"</string>
     <string name="hvac_decrease_button_label" msgid="5628481079099995286">"Lower temperature"</string>
     <string name="hvac_increase_button_label" msgid="2855688290787396792">"Raise temperature"</string>
-    <string name="status_icon_bluetooth_disconnected" msgid="6773447522499007010">"Bluetooth setting: disconnected"</string>
-    <string name="status_icon_bluetooth_connected" msgid="4548446117525711779">"Bluetooth setting: connected"</string>
-    <string name="status_icon_bluetooth_off" msgid="5435041393564635821">"Bluetooth setting: Bluetooth off"</string>
-    <string name="status_icon_signal_mobile" msgid="7264721079060179783">"Signal settings: using mobile data"</string>
-    <string name="status_icon_signal_wifi" msgid="1257569337648058522">"Signal settings: Wi-Fi on"</string>
-    <string name="status_icon_signal_hotspot" msgid="1023039120452006880">"Signal settings: hotspot on"</string>
-    <string name="status_icon_display_status" msgid="2970020923181359144">"Display settings"</string>
+    <string name="status_icon_bluetooth_disconnected" msgid="6773447522499007010">"Bluetooth Setting: Disconnected"</string>
+    <string name="status_icon_bluetooth_connected" msgid="4548446117525711779">"Bluetooth Setting: Connected"</string>
+    <string name="status_icon_bluetooth_off" msgid="5435041393564635821">"Bluetooth Setting: Bluetooth off"</string>
+    <string name="status_icon_signal_mobile" msgid="7264721079060179783">"Signal Settings: Using Mobile Data"</string>
+    <string name="status_icon_signal_wifi" msgid="1257569337648058522">"Signal Settings: Wifi On"</string>
+    <string name="status_icon_signal_hotspot" msgid="1023039120452006880">"Signal Settings: Hotspot On"</string>
+    <string name="status_icon_display_status" msgid="2970020923181359144">"Display Settings"</string>
     <string name="activity_blocked_text" msgid="5353157279548801554">"You can’t use this feature while driving"</string>
     <string name="exit_button_close_application" msgid="112227710467017144">"Close app"</string>
     <string name="exit_button_go_back" msgid="7988866855775300902">"Back"</string>
diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml
index c60dd91..a8c9956 100644
--- a/res/values-es-rUS/strings.xml
+++ b/res/values-es-rUS/strings.xml
@@ -27,8 +27,8 @@
     <string name="end_session" msgid="2765206020435441421">"Finalizar sesión"</string>
     <string name="car_new_user" msgid="6766334721724989964">"Perfil nuevo"</string>
     <string name="user_add_profile_title" msgid="828371911076521952">"¿Agregar un perfil nuevo?"</string>
-    <string name="user_add_user_message_setup" msgid="6136074867764164790">"Luego de crear un perfil nuevo, deberías personalizarlo."</string>
-    <string name="user_add_user_message_update" msgid="3310089453006545712">"Las apps se pueden actualizar desde cualquier perfil y usarse desde todos los demás perfiles."</string>
+    <string name="user_add_user_message_setup" msgid="6136074867764164790">"Una vez que hayas creado un perfil para alguien, esa persona debería personalizarlo."</string>
+    <string name="user_add_user_message_update" msgid="3310089453006545712">"Las apps se pueden actualizar desde cualquier perfil y se actualizarán para todos los perfiles."</string>
     <string name="profile_limit_reached_title" msgid="7891779218496729653">"Se alcanzó el límite de perfiles"</string>
     <string name="profile_limit_reached_message" msgid="1534369584753840606">"{count,plural, =1{Solo se puede crear un perfil.}other{Puedes agregar hasta # perfiles.}}"</string>
     <string name="car_loading_profile" msgid="458961191993686065">"Cargando"</string>
diff --git a/res/values-eu/strings.xml b/res/values-eu/strings.xml
index 9d1d4c4..958d42a 100644
--- a/res/values-eu/strings.xml
+++ b/res/values-eu/strings.xml
@@ -65,9 +65,9 @@
     <string name="system_bar_media_label" msgid="6156112139796274847">"Multimedia-edukia"</string>
     <string name="hvac_decrease_button_label" msgid="5628481079099995286">"Jaitsi tenperatura"</string>
     <string name="hvac_increase_button_label" msgid="2855688290787396792">"Igo tenperatura"</string>
-    <string name="status_icon_bluetooth_disconnected" msgid="6773447522499007010">"Bluetooth-aren ezarpena: deskonektatuta"</string>
-    <string name="status_icon_bluetooth_connected" msgid="4548446117525711779">"Bluetooth-aren ezarpena: konektatuta"</string>
-    <string name="status_icon_bluetooth_off" msgid="5435041393564635821">"Bluetooth-aren ezarpena: Bluetooth-a desaktibatuta"</string>
+    <string name="status_icon_bluetooth_disconnected" msgid="6773447522499007010">"Bluetootharen ezarpena: deskonektatuta"</string>
+    <string name="status_icon_bluetooth_connected" msgid="4548446117525711779">"Bluetootharen ezarpena: konektatuta"</string>
+    <string name="status_icon_bluetooth_off" msgid="5435041393564635821">"Bluetootharen ezarpena: Bluetootha desaktibatuta"</string>
     <string name="status_icon_signal_mobile" msgid="7264721079060179783">"Seinalearen ezarpenak: datu-konexioa erabiltzen"</string>
     <string name="status_icon_signal_wifi" msgid="1257569337648058522">"Seinalearen ezarpenak: wifia aktibatuta"</string>
     <string name="status_icon_signal_hotspot" msgid="1023039120452006880">"Seinalearen ezarpenak: wifi-gunea aktibatuta"</string>
@@ -76,7 +76,7 @@
     <string name="exit_button_close_application" msgid="112227710467017144">"Itxi aplikazioa"</string>
     <string name="exit_button_go_back" msgid="7988866855775300902">"Atzera"</string>
     <string name="qc_footer_settings" msgid="5471523941092316743">"Ezarpenak"</string>
-    <string name="qc_footer_bluetooth_settings" msgid="2870204430643762847">"Bluetooth-aren ezarpenak"</string>
+    <string name="qc_footer_bluetooth_settings" msgid="2870204430643762847">"Bluetootharen ezarpenak"</string>
     <string name="qc_footer_network_internet_settings" msgid="2480582764252681575">"Sareen eta Interneten ezarpenak"</string>
     <string name="qc_footer_display_settings" msgid="2950539240110437704">"Bistaratze-aukerak"</string>
     <string name="qc_footer_network_sound_settings" msgid="5117011034908775097">"Soinuaren ezarpenak"</string>
diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml
index d67872e..ddeb519 100644
--- a/res/values-it/strings.xml
+++ b/res/values-it/strings.xml
@@ -26,7 +26,7 @@
     <string name="car_add_user" msgid="6182764665687382136">"Aggiungi un profilo"</string>
     <string name="end_session" msgid="2765206020435441421">"Termina sessione"</string>
     <string name="car_new_user" msgid="6766334721724989964">"Nuovo profilo"</string>
-    <string name="user_add_profile_title" msgid="828371911076521952">"Vuoi aggiungere nuovo profilo?"</string>
+    <string name="user_add_profile_title" msgid="828371911076521952">"Aggiungere un nuovo profilo?"</string>
     <string name="user_add_user_message_setup" msgid="6136074867764164790">"I nuovi profili dovrebbero essere personalizzati dalle persone per cui sono stati creati."</string>
     <string name="user_add_user_message_update" msgid="3310089453006545712">"Qualsiasi profilo può aggiornare le app che verranno usate da tutti gli altri profili."</string>
     <string name="profile_limit_reached_title" msgid="7891779218496729653">"Limite di profili raggiunto"</string>
diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml
index 8446c91..91b9466 100644
--- a/res/values-iw/strings.xml
+++ b/res/values-iw/strings.xml
@@ -30,7 +30,7 @@
     <string name="user_add_user_message_setup" msgid="6136074867764164790">"לאחר יצירה של פרופיל חדש, המשתמש של הפרופיל הזה צריך להתאים אותו אישית בעצמו."</string>
     <string name="user_add_user_message_update" msgid="3310089453006545712">"עדכון אפליקציות מפרופיל כלשהו יחיל את העדכונים בכל יתר הפרופילים."</string>
     <string name="profile_limit_reached_title" msgid="7891779218496729653">"הגעת למספר הפרופילים המרבי"</string>
-    <string name="profile_limit_reached_message" msgid="1534369584753840606">"{count,plural, =1{ניתן ליצור רק פרופיל אחד.}two{ניתן להוסיף עד # פרופילים.}many{ניתן להוסיף עד # פרופילים.}other{ניתן להוסיף עד # פרופילים.}}"</string>
+    <string name="profile_limit_reached_message" msgid="1534369584753840606">"{count,plural, =1{ניתן ליצור רק פרופיל אחד.}one{ניתן להוסיף עד # פרופילים.}two{ניתן להוסיף עד # פרופילים.}other{ניתן להוסיף עד # פרופילים.}}"</string>
     <string name="car_loading_profile" msgid="458961191993686065">"בטעינה"</string>
     <string name="car_loading_profile_developer_message" msgid="737810794567935702">"המשתמש בטעינה (מהמשתמש <xliff:g id="FROM_USER">%1$d</xliff:g> אל <xliff:g id="TO_USER">%2$d</xliff:g>)"</string>
     <string name="privacy_chip_off_content" msgid="8406415098507955316">"ה<xliff:g id="SENSOR">%1$s</xliff:g> במצב כבוי."</string>
diff --git a/res/values-night/colors.xml b/res/values-night/colors.xml
index af5b7ab..7d752c7 100644
--- a/res/values-night/colors.xml
+++ b/res/values-night/colors.xml
@@ -16,7 +16,6 @@
   -->
 <resources xmlns:android="http://schemas.android.com/apk/res/android">
     <color name="car_accent">#356FE5</color>
-    <color name="status_bar_background_color">#ff000000</color>
     <color name="system_bar_background_opaque">#ff0c1013</color>
 
     <!-- The background color of the notification shade -->
diff --git a/res/values-or/strings.xml b/res/values-or/strings.xml
index 9a15ebc..b265b6b 100644
--- a/res/values-or/strings.xml
+++ b/res/values-or/strings.xml
@@ -32,7 +32,7 @@
     <string name="profile_limit_reached_title" msgid="7891779218496729653">"ଅଧିକ ପ୍ରୋଫାଇଲ ପାଇଁ ଅନୁମତି ନାହିଁ"</string>
     <string name="profile_limit_reached_message" msgid="1534369584753840606">"{count,plural, =1{କେବଳ ଗୋଟିଏ ପ୍ରୋଫାଇଲ ତିଆରି କରାଯାଇପାରିବ।}other{ଆପଣ #ଟି ପର୍ଯ୍ୟନ୍ତ ପ୍ରୋଫାଇଲ ଯୋଗ କରିପାରିବେ।}}"</string>
     <string name="car_loading_profile" msgid="458961191993686065">"ଲୋଡ୍ କରାଯାଉଛି"</string>
-    <string name="car_loading_profile_developer_message" msgid="737810794567935702">"ଉପଯୋଗକର୍ତ୍ତାଙ୍କୁ ଲୋଡ୍ କରାଯାଉଛି (<xliff:g id="FROM_USER">%1$d</xliff:g>ଙ୍କ ଠାରୁ <xliff:g id="TO_USER">%2$d</xliff:g> ପର୍ଯ୍ୟନ୍ତ)"</string>
+    <string name="car_loading_profile_developer_message" msgid="737810794567935702">"ୟୁଜର ଲୋଡ କରାଯାଉଛି (<xliff:g id="FROM_USER">%1$d</xliff:g>ଙ୍କ ଠାରୁ <xliff:g id="TO_USER">%2$d</xliff:g> ପର୍ଯ୍ୟନ୍ତ)"</string>
     <string name="privacy_chip_off_content" msgid="8406415098507955316">"<xliff:g id="SENSOR">%1$s</xliff:g> ବନ୍ଦ ଅଛି।"</string>
     <string name="privacy_chip_use_sensor" msgid="7688230720803089653">"<xliff:g id="SENSOR">%1$s</xliff:g> ବ୍ୟବହାର କରନ୍ତୁ"</string>
     <string name="privacy_chip_use_sensor_subtext" msgid="5655148288310815742">"ଅନୁମତି ଥିବା ଆପ୍ସ ପାଇଁ"</string>
diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml
index 21dfc37..4c003f4 100644
--- a/res/values-pt-rPT/strings.xml
+++ b/res/values-pt-rPT/strings.xml
@@ -26,7 +26,7 @@
     <string name="car_add_user" msgid="6182764665687382136">"Adicionar perfil"</string>
     <string name="end_session" msgid="2765206020435441421">"Terminar sessão"</string>
     <string name="car_new_user" msgid="6766334721724989964">"Novo perfil"</string>
-    <string name="user_add_profile_title" msgid="828371911076521952">"Quer adicionar o novo perfil?"</string>
+    <string name="user_add_profile_title" msgid="828371911076521952">"Adicionar o novo perfil?"</string>
     <string name="user_add_user_message_setup" msgid="6136074867764164790">"Depois de criar um novo perfil, deve ser a pessoa em questão a personalizá-lo."</string>
     <string name="user_add_user_message_update" msgid="3310089453006545712">"As apps podem ser atualizadas a partir de qualquer perfil para utilização por todos os perfis."</string>
     <string name="profile_limit_reached_title" msgid="7891779218496729653">"Limite de perfis atingido"</string>
diff --git a/res/values/colors.xml b/res/values/colors.xml
index af70691..125fd00 100644
--- a/res/values/colors.xml
+++ b/res/values/colors.xml
@@ -43,8 +43,7 @@
     <color name="system_bar_text_color">#FFFFFF</color>
     <color name="system_bar_text_selected_color">#000000</color>
     <color name="system_bar_text_unavailable_color">#B0B0B0</color>
-    <color name="status_bar_background_color">#33000000</color>
-    <drawable name="system_bar_background">@color/status_bar_background_color</drawable>
+    <drawable name="system_bar_background">#000000</drawable>
 
     <!-- colors for quick controls entry points icon   -->
     <color name="car_quick_controls_icon_drawable_color">#FFFFFF</color>
diff --git a/res/values/config.xml b/res/values/config.xml
index 10a3ae0..eb5a9a4 100644
--- a/res/values/config.xml
+++ b/res/values/config.xml
@@ -186,5 +186,6 @@
     <!-- Determines whether the shell task organizer be registered automatiacly or not.
          It needs to be disabled for CarSystemUI as CarLauncher already registers one. With 2
          organizers there can be recovery problems if either of the process crashes. -->
-    <bool name="config_registerShellTaskOrganizerOnInit">false</bool>
+    <!-- TODO(b/228598071): Enabled this to fix b/250675259. -->
+    <bool name="config_registerShellTaskOrganizerOnInit">true</bool>
 </resources>
diff --git a/res/values/overlayable.xml b/res/values/overlayable.xml
index dcd8b00..196d1f6 100644
--- a/res/values/overlayable.xml
+++ b/res/values/overlayable.xml
@@ -150,7 +150,6 @@
       <item type="color" name="privacy_chip_indicator_color"/>
       <item type="color" name="privacy_chip_indicator_outside_stroke_color"/>
       <item type="color" name="privacy_chip_light_icon_color"/>
-      <item type="color" name="status_bar_background_color"/>
       <item type="color" name="status_icon_highlighted_color"/>
       <item type="color" name="status_icon_not_highlighted_color"/>
       <item type="color" name="status_icon_panel_bg_color"/>
diff --git a/src/com/android/systemui/CarSystemUIModule.java b/src/com/android/systemui/CarSystemUIModule.java
index dfb5a19..31a2d62 100644
--- a/src/com/android/systemui/CarSystemUIModule.java
+++ b/src/com/android/systemui/CarSystemUIModule.java
@@ -22,12 +22,10 @@
 import android.content.Context;
 import android.hardware.SensorPrivacyManager;
 import android.os.Handler;
-import android.os.PowerManager;
 import android.window.DisplayAreaOrganizer;
 
 import com.android.internal.logging.UiEventLogger;
 import com.android.keyguard.KeyguardViewController;
-import com.android.systemui.broadcast.BroadcastDispatcher;
 import com.android.systemui.car.CarDeviceProvisionedController;
 import com.android.systemui.car.CarDeviceProvisionedControllerImpl;
 import com.android.systemui.car.keyguard.CarKeyguardViewController;
@@ -36,17 +34,13 @@
 import com.android.systemui.car.volume.CarVolumeModule;
 import com.android.systemui.dagger.GlobalRootComponent;
 import com.android.systemui.dagger.SysUISingleton;
-import com.android.systemui.dagger.qualifiers.Background;
 import com.android.systemui.dagger.qualifiers.Main;
-import com.android.systemui.demomode.DemoModeController;
 import com.android.systemui.dock.DockManager;
 import com.android.systemui.dock.DockManagerImpl;
 import com.android.systemui.doze.DozeHost;
-import com.android.systemui.dump.DumpManager;
 import com.android.systemui.navigationbar.gestural.GestureModule;
 import com.android.systemui.plugins.qs.QSFactory;
 import com.android.systemui.plugins.statusbar.StatusBarStateController;
-import com.android.systemui.power.EnhancedEstimates;
 import com.android.systemui.power.dagger.PowerModule;
 import com.android.systemui.qs.dagger.QSModule;
 import com.android.systemui.qs.tileimpl.QSFactoryImpl;
@@ -55,6 +49,7 @@
 import com.android.systemui.screenshot.ReferenceScreenshotModule;
 import com.android.systemui.shade.ShadeController;
 import com.android.systemui.shade.ShadeControllerImpl;
+import com.android.systemui.shade.ShadeExpansionStateManager;
 import com.android.systemui.statusbar.CommandQueue;
 import com.android.systemui.statusbar.NotificationLockscreenUserManager;
 import com.android.systemui.statusbar.NotificationLockscreenUserManagerImpl;
@@ -64,8 +59,7 @@
 import com.android.systemui.statusbar.phone.HeadsUpManagerPhone;
 import com.android.systemui.statusbar.phone.KeyguardBypassController;
 import com.android.systemui.statusbar.policy.AccessibilityManagerWrapper;
-import com.android.systemui.statusbar.policy.BatteryController;
-import com.android.systemui.statusbar.policy.BatteryControllerImpl;
+import com.android.systemui.statusbar.policy.AospPolicyModule;
 import com.android.systemui.statusbar.policy.ConfigurationController;
 import com.android.systemui.statusbar.policy.DeviceProvisionedController;
 import com.android.systemui.statusbar.policy.HeadsUpManager;
@@ -85,12 +79,14 @@
 
 @Module(
         includes = {
+                AospPolicyModule.class,
                 CarVolumeModule.class,
                 GestureModule.class,
                 PowerModule.class,
                 QSModule.class,
                 ReferenceScreenshotModule.class
-        })
+        }
+        )
 abstract class CarSystemUIModule {
 
     @SysUISingleton
@@ -112,18 +108,20 @@
             ConfigurationController configurationController,
             @Main Handler handler,
             AccessibilityManagerWrapper accessibilityManagerWrapper,
-            UiEventLogger uiEventLogger) {
+            UiEventLogger uiEventLogger,
+            ShadeExpansionStateManager shadeExpansionStateManager) {
         return new HeadsUpManagerPhone(
-            context,
-            headsUpManagerLogger,
-            statusBarStateController,
-            bypassController,
-            groupManager,
-            visualStabilityProvider,
-            configurationController,
-            handler,
-            accessibilityManagerWrapper,
-            uiEventLogger
+                context,
+                headsUpManagerLogger,
+                statusBarStateController,
+                bypassController,
+                groupManager,
+                visualStabilityProvider,
+                configurationController,
+                handler,
+                accessibilityManagerWrapper,
+                uiEventLogger,
+                shadeExpansionStateManager
         );
     }
 
@@ -156,20 +154,6 @@
 
     @Provides
     @SysUISingleton
-    static BatteryController provideBatteryController(Context context,
-            EnhancedEstimates enhancedEstimates, PowerManager powerManager,
-            BroadcastDispatcher broadcastDispatcher, DemoModeController demoModeController,
-            DumpManager dumpManager,
-            @Main Handler mainHandler,
-            @Background Handler bgHandler) {
-        BatteryController bC = new BatteryControllerImpl(context, enhancedEstimates, powerManager,
-                broadcastDispatcher, demoModeController, dumpManager, mainHandler, bgHandler);
-        bC.init();
-        return bC;
-    }
-
-    @Provides
-    @SysUISingleton
     static SensorPrivacyController provideSensorPrivacyController(
             SensorPrivacyManager sensorPrivacyManager) {
         SensorPrivacyController spC = new SensorPrivacyControllerImpl(sensorPrivacyManager);
@@ -214,7 +198,7 @@
             CarDeviceProvisionedControllerImpl deviceProvisionedController) {
         deviceProvisionedController.init();
         return deviceProvisionedController;
-    };
+    }
 
     @Binds
     abstract CarDeviceProvisionedController bindCarDeviceProvisionedController(
diff --git a/src/com/android/systemui/car/cluster/ClusterDisplayController.java b/src/com/android/systemui/car/cluster/ClusterDisplayController.java
index 1ad284b..f06036a 100644
--- a/src/com/android/systemui/car/cluster/ClusterDisplayController.java
+++ b/src/com/android/systemui/car/cluster/ClusterDisplayController.java
@@ -22,7 +22,6 @@
 import android.car.Car;
 import android.car.cluster.ClusterHomeManager;
 import android.car.cluster.ClusterState;
-import android.content.Context;
 import android.graphics.Rect;
 import android.util.Slog;
 import android.view.Display;
@@ -46,7 +45,7 @@
  * Controls the RootTDA of cluster display per CLUSTER_DISPLAY_STATE message.
  */
 @SysUISingleton
-public class ClusterDisplayController extends CoreStartable {
+public class ClusterDisplayController implements CoreStartable {
     private static final String TAG = ClusterDisplayController.class.getSimpleName();
     private static final boolean DBG = false;
 
@@ -59,10 +58,9 @@
     private ClusterState mClusterState;
 
     @Inject
-    public ClusterDisplayController(Context context,
+    public ClusterDisplayController(
             Optional<RootTaskDisplayAreaOrganizer> rootTDAOrganizer,
             CarServiceProvider carServiceProvider, @Main Executor mainExecutor) {
-        super(context);
         mRootTDAOrganizer = rootTDAOrganizer.orElse(null);
         mCarServiceProvider = carServiceProvider;
         mMainExecutor = mainExecutor;
diff --git a/src/com/android/systemui/car/keyguard/CarKeyguardViewController.java b/src/com/android/systemui/car/keyguard/CarKeyguardViewController.java
index 1cf6359..9307e30 100644
--- a/src/com/android/systemui/car/keyguard/CarKeyguardViewController.java
+++ b/src/com/android/systemui/car/keyguard/CarKeyguardViewController.java
@@ -45,12 +45,12 @@
 import com.android.systemui.dagger.SysUISingleton;
 import com.android.systemui.dagger.qualifiers.Main;
 import com.android.systemui.shade.NotificationPanelViewController;
+import com.android.systemui.shade.ShadeExpansionStateManager;
 import com.android.systemui.statusbar.phone.BiometricUnlockController;
 import com.android.systemui.statusbar.phone.CentralSurfaces;
 import com.android.systemui.statusbar.phone.KeyguardBouncer;
 import com.android.systemui.statusbar.phone.KeyguardBouncer.Factory;
 import com.android.systemui.statusbar.phone.KeyguardBypassController;
-import com.android.systemui.statusbar.phone.panelstate.PanelExpansionStateManager;
 import com.android.systemui.statusbar.policy.KeyguardStateController;
 import com.android.systemui.toast.SystemUIToast;
 import com.android.systemui.toast.ToastFactory;
@@ -84,8 +84,8 @@
     private final CarSystemBarController mCarSystemBarController;
     private final Factory mKeyguardBouncerFactory;
     // Needed to instantiate mBouncer.
-    private final KeyguardBouncer.BouncerExpansionCallback mExpansionCallback =
-            new KeyguardBouncer.BouncerExpansionCallback() {
+    private final KeyguardBouncer.PrimaryBouncerExpansionCallback mExpansionCallback =
+            new KeyguardBouncer.PrimaryBouncerExpansionCallback() {
                 @Override
                 public void onFullyShown() {
                     LockPatternView patternView = getLayout().findViewById(R.id.lockPatternView);
@@ -182,7 +182,7 @@
 
     @Override
     @MainThread
-    public void showBouncer(boolean scrimmed) {
+    public void showPrimaryBouncer(boolean scrimmed) {
         if (mShowing && !mBouncer.isShowing()) {
             mBouncer.show(/* resetSecuritySelection= */ false);
         }
@@ -241,7 +241,7 @@
     }
 
     @Override
-    public void resetAlternateAuth(boolean forceUpdateScrim) {
+    public void hideAlternateBouncer(boolean forceUpdateScrim) {
         // no-op
     }
 
@@ -281,11 +281,6 @@
     }
 
     @Override
-    public boolean isShowing() {
-        return mShowing;
-    }
-
-    @Override
     @MainThread
     public void dismissAndCollapse() {
         // If dismissing and collapsing Keyguard is requested (e.g. by a Keyguard-dismissing
@@ -352,7 +347,7 @@
 
     @Override
     @MainThread
-    public boolean bouncerIsOrWillBeShowing() {
+    public boolean primaryBouncerIsOrWillBeShowing() {
         return mBouncer != null && (mBouncer.isShowing() || mBouncer.inTransit());
     }
 
@@ -397,7 +392,7 @@
     public void registerCentralSurfaces(
             CentralSurfaces centralSurfaces,
             NotificationPanelViewController notificationPanelViewController,
-            PanelExpansionStateManager panelExpansionStateManager,
+            ShadeExpansionStateManager shadeExpansionStateManager,
             BiometricUnlockController biometricUnlockController,
             View notificationContainer,
             KeyguardBypassController bypassController) {
@@ -446,10 +441,9 @@
     }
 
     private void notifyKeyguardUpdateMonitor() {
-        mKeyguardUpdateMonitor.onKeyguardVisibilityChanged(mShowing);
         if (mBouncer != null) {
-            mKeyguardUpdateMonitor.sendKeyguardBouncerChanged(
-                    bouncerIsOrWillBeShowing(), isBouncerShowing());
+            mKeyguardUpdateMonitor.sendPrimaryBouncerChanged(
+                    primaryBouncerIsOrWillBeShowing(), isBouncerShowing());
         }
     }
 
diff --git a/src/com/android/systemui/car/qc/ProfileSwitcher.java b/src/com/android/systemui/car/qc/ProfileSwitcher.java
index 900cad6..3b19e51 100644
--- a/src/com/android/systemui/car/qc/ProfileSwitcher.java
+++ b/src/com/android/systemui/car/qc/ProfileSwitcher.java
@@ -148,6 +148,7 @@
         return mUserManager.getAliveUsers()
                 .stream()
                 .filter(userInfo -> userInfo.supportsSwitchToByUser() && !userInfo.isGuest())
+                .sorted((u1, u2) -> Long.signum(u1.creationTime - u2.creationTime))
                 .collect(Collectors.toList());
     }
 
diff --git a/src/com/android/systemui/car/sideloaded/SideLoadedAppController.java b/src/com/android/systemui/car/sideloaded/SideLoadedAppController.java
index df996ec..fd52515 100644
--- a/src/com/android/systemui/car/sideloaded/SideLoadedAppController.java
+++ b/src/com/android/systemui/car/sideloaded/SideLoadedAppController.java
@@ -17,7 +17,6 @@
 package com.android.systemui.car.sideloaded;
 
 import android.app.IActivityTaskManager;
-import android.content.Context;
 import android.os.RemoteException;
 import android.util.Log;
 
@@ -30,7 +29,7 @@
  * Controller responsible for detecting unsafe apps.
  */
 @SysUISingleton
-public class SideLoadedAppController extends CoreStartable {
+public class SideLoadedAppController implements CoreStartable {
     private static final String TAG = SideLoadedAppController.class.getSimpleName();
 
     private IActivityTaskManager mActivityTaskManager;
@@ -39,13 +38,11 @@
     private SideLoadedAppStateController mSideLoadedAppStateController;
 
     @Inject
-    public SideLoadedAppController(Context context,
+    public SideLoadedAppController(
             IActivityTaskManager activityTaskManager,
             SideLoadedAppDetector sideLoadedAppDetector,
             SideLoadedAppListener sideLoadedAppListener,
             SideLoadedAppStateController sideLoadedAppStateController) {
-        super(context);
-
         mSideLoadedAppDetector = sideLoadedAppDetector;
         mActivityTaskManager = activityTaskManager;
         mSideLoadedAppListener = sideLoadedAppListener;
@@ -57,7 +54,7 @@
     }
 
     @Override
-    protected void onBootCompleted() {
+    public void onBootCompleted() {
         Log.i(TAG, "OnBootCompleted");
 
         try {
diff --git a/src/com/android/systemui/car/statusbar/DozeServiceHost.java b/src/com/android/systemui/car/statusbar/DozeServiceHost.java
index 10774b3..d477fe5 100644
--- a/src/com/android/systemui/car/statusbar/DozeServiceHost.java
+++ b/src/com/android/systemui/car/statusbar/DozeServiceHost.java
@@ -73,6 +73,17 @@
         return false;
     }
 
+
+    @Override
+    public boolean isPulsePending() {
+        return false;
+    }
+
+    @Override
+    public void setPulsePending(boolean isPulsePending) {
+        // No op.
+    }
+
     @Override
     public void extendPulse(int reason) {
         // No op.
diff --git a/src/com/android/systemui/car/systembar/CarSystemBar.java b/src/com/android/systemui/car/systembar/CarSystemBar.java
index 3c98d52..9c6ee64 100644
--- a/src/com/android/systemui/car/systembar/CarSystemBar.java
+++ b/src/com/android/systemui/car/systembar/CarSystemBar.java
@@ -77,8 +77,9 @@
 import dagger.Lazy;
 
 /** Navigation bars customized for the automotive use case. */
-public class CarSystemBar extends CoreStartable implements CommandQueue.Callbacks,
+public class CarSystemBar implements CoreStartable, CommandQueue.Callbacks,
         ConfigurationController.ConfigurationListener {
+    private final Context mContext;
     private final CarSystemBarController mCarSystemBarController;
     private final SysuiDarkIconDispatcher mStatusBarIconController;
     private final WindowManager mWindowManager;
@@ -154,7 +155,7 @@
             SystemBarConfigs systemBarConfigs,
             ConfigurationController configurationController
     ) {
-        super(context);
+        mContext = context;
         mCarSystemBarController = carSystemBarController;
         mStatusBarIconController = (SysuiDarkIconDispatcher) darkIconDispatcher;
         mWindowManager = windowManager;
diff --git a/src/com/android/systemui/car/systembar/CarSystemBarButton.java b/src/com/android/systemui/car/systembar/CarSystemBarButton.java
index 79f1011..8f828a6 100644
--- a/src/com/android/systemui/car/systembar/CarSystemBarButton.java
+++ b/src/com/android/systemui/car/systembar/CarSystemBarButton.java
@@ -56,6 +56,8 @@
     private static final String BUTTON_FILTER_DELIMITER = ";";
     private static final String EXTRA_BUTTON_CATEGORIES = "categories";
     private static final String EXTRA_BUTTON_PACKAGES = "packages";
+    private static final String EXTRA_DIALOG_CLOSE_REASON = "reason";
+    private static final String DIALOG_CLOSE_REASON_CAR_SYSTEMBAR_BUTTON = "carsystembarbutton";
     private static final float DEFAULT_SELECTED_ALPHA = 1f;
     private static final float DEFAULT_UNSELECTED_ALPHA = 0.75f;
     private static final float DISABLED_ALPHA = 0.25f;
@@ -315,8 +317,9 @@
                 return;
             }
             boolean startState = mSelected;
-            mContext.sendBroadcastAsUser(new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS),
-                    UserHandle.CURRENT);
+            Intent intent = new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
+            intent.putExtra(EXTRA_DIALOG_CLOSE_REASON, DIALOG_CLOSE_REASON_CAR_SYSTEMBAR_BUTTON);
+            mContext.sendBroadcastAsUser(intent, UserHandle.CURRENT);
 
             boolean intentLaunched = false;
             try {
@@ -357,8 +360,9 @@
     /** Defines the behavior of a long click. */
     protected OnLongClickListener getButtonLongClickListener(Intent toSend) {
         return v -> {
-            mContext.sendBroadcastAsUser(new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS),
-                    UserHandle.CURRENT);
+            Intent intent = new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
+            intent.putExtra(EXTRA_DIALOG_CLOSE_REASON, DIALOG_CLOSE_REASON_CAR_SYSTEMBAR_BUTTON);
+            mContext.sendBroadcastAsUser(intent, UserHandle.CURRENT);
             try {
                 ActivityOptions options = ActivityOptions.makeBasic();
                 options.setLaunchDisplayId(mContext.getDisplayId());
diff --git a/src/com/android/systemui/car/userswitcher/UserGridRecyclerView.java b/src/com/android/systemui/car/userswitcher/UserGridRecyclerView.java
index 0b94386..1bd67a0 100644
--- a/src/com/android/systemui/car/userswitcher/UserGridRecyclerView.java
+++ b/src/com/android/systemui/car/userswitcher/UserGridRecyclerView.java
@@ -136,6 +136,7 @@
         return mUserManager.getAliveUsers()
                 .stream()
                 .filter(UserInfo::supportsSwitchToByUser)
+                .sorted((u1, u2) -> Long.signum(u1.creationTime - u2.creationTime))
                 .collect(Collectors.toList());
     }
 
diff --git a/src/com/android/systemui/car/voicerecognition/ConnectedDeviceVoiceRecognitionNotifier.java b/src/com/android/systemui/car/voicerecognition/ConnectedDeviceVoiceRecognitionNotifier.java
index 2657c4f..6dff1bd 100644
--- a/src/com/android/systemui/car/voicerecognition/ConnectedDeviceVoiceRecognitionNotifier.java
+++ b/src/com/android/systemui/car/voicerecognition/ConnectedDeviceVoiceRecognitionNotifier.java
@@ -37,7 +37,7 @@
  * Controller responsible for showing toast message when voice recognition over bluetooth device
  * getting activated.
  */
-public class ConnectedDeviceVoiceRecognitionNotifier extends CoreStartable {
+public class ConnectedDeviceVoiceRecognitionNotifier implements CoreStartable {
 
     private static final String TAG = "CarVoiceRecognition";
     @VisibleForTesting
@@ -52,6 +52,7 @@
     private static final String HEADSET_CLIENT_EXTRA_VOICE_RECOGNITION =
             "android.bluetooth.headsetclient.extra.VOICE_RECOGNITION";
 
+    private final Context mContext;
     private final DelayableExecutor mExecutor;
 
     private final BroadcastReceiver mVoiceRecognitionReceiver = new BroadcastReceiver() {
@@ -86,7 +87,7 @@
             Context context,
             @Main DelayableExecutor mainExecutor
     ) {
-        super(context);
+        mContext = context;
         mExecutor = mainExecutor;
     }
 
@@ -95,7 +96,7 @@
     }
 
     @Override
-    protected void onBootCompleted() {
+    public void onBootCompleted() {
         IntentFilter filter = new IntentFilter();
         filter.addAction(HEADSET_CLIENT_ACTION_AG_EVENT);
         mContext.registerReceiverAsUser(mVoiceRecognitionReceiver, UserHandle.ALL, filter,
diff --git a/src/com/android/systemui/car/volume/CarVolumeDialogImpl.java b/src/com/android/systemui/car/volume/CarVolumeDialogImpl.java
index 6c064ee..f306824 100644
--- a/src/com/android/systemui/car/volume/CarVolumeDialogImpl.java
+++ b/src/com/android/systemui/car/volume/CarVolumeDialogImpl.java
@@ -22,6 +22,8 @@
 import android.animation.Animator;
 import android.animation.AnimatorInflater;
 import android.animation.AnimatorSet;
+import android.animation.ObjectAnimator;
+import android.animation.PropertyValuesHolder;
 import android.annotation.DrawableRes;
 import android.annotation.Nullable;
 import android.app.Dialog;
@@ -65,6 +67,7 @@
 import com.android.systemui.R;
 import com.android.systemui.car.CarServiceProvider;
 import com.android.systemui.plugins.VolumeDialog;
+import com.android.systemui.statusbar.policy.ConfigurationController;
 import com.android.systemui.volume.Events;
 import com.android.systemui.volume.SystemUIInterpolators;
 import com.android.systemui.volume.VolumeDialogImpl;
@@ -80,7 +83,8 @@
  *
  * Methods ending in "H" must be called on the (ui) handler.
  */
-public class CarVolumeDialogImpl implements VolumeDialog {
+public class CarVolumeDialogImpl
+        implements VolumeDialog, ConfigurationController.ConfigurationListener {
 
     private static final String TAG = "CarVolumeDialog";
     private static final boolean DEBUG = Build.IS_USERDEBUG || Build.IS_ENG;
@@ -105,6 +109,7 @@
     private final int mExpNormalTimeout;
     private final int mExpHoveringTimeout;
     private final CarServiceProvider mCarServiceProvider;
+    private final ConfigurationController mConfigurationController;
 
     private Window mWindow;
     private CustomDialog mDialog;
@@ -194,7 +199,10 @@
         }
     };
 
-    public CarVolumeDialogImpl(Context context, CarServiceProvider carServiceProvider) {
+    public CarVolumeDialogImpl(
+            Context context,
+            CarServiceProvider carServiceProvider,
+            ConfigurationController configurationController) {
         mContext = context;
         mCarServiceProvider = carServiceProvider;
         mKeyguard = (KeyguardManager) mContext.getSystemService(Context.KEYGUARD_SERVICE);
@@ -206,6 +214,7 @@
                 R.integer.car_volume_dialog_display_expanded_normal_timeout);
         mExpHoveringTimeout = mContext.getResources().getInteger(
                 R.integer.car_volume_dialog_display_expanded_hovering_timeout);
+        mConfigurationController = configurationController;
     }
 
     private static int getSeekbarValue(CarAudioManager carAudioManager, int volumeGroupId) {
@@ -235,6 +244,7 @@
         mContext.registerReceiverAsUser(mHomeButtonPressedBroadcastReceiver, UserHandle.CURRENT,
                 new IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS), /* broadcastPermission= */
                 null, /* scheduler= */ null, Context.RECEIVER_EXPORTED);
+        mConfigurationController.addCallback(this);
     }
 
     @Override
@@ -244,6 +254,15 @@
         mContext.unregisterReceiver(mHomeButtonPressedBroadcastReceiver);
 
         cleanupAudioManager();
+        mConfigurationController.removeCallback(this);
+    }
+
+    @Override
+    public void onLayoutDirectionChanged(boolean isLayoutRtl) {
+        if (mListView != null) {
+            mListView.setLayoutDirection(
+                    isLayoutRtl ? View.LAYOUT_DIRECTION_RTL : View.LAYOUT_DIRECTION_LTR);
+        }
     }
 
     /**
@@ -295,12 +314,13 @@
         mDialog.setOnShowListener(dialog -> {
             mListView.setTranslationY(-mListView.getHeight());
             mListView.setAlpha(0);
-            mListView.animate()
-                    .alpha(1)
-                    .translationY(0)
-                    .setDuration(LISTVIEW_ANIMATION_DURATION_IN_MILLIS)
-                    .setInterpolator(new SystemUIInterpolators.LogDecelerateInterpolator())
-                    .start();
+            PropertyValuesHolder pvhAlpha = PropertyValuesHolder.ofFloat(View.ALPHA, 1f);
+            PropertyValuesHolder pvhY = PropertyValuesHolder.ofFloat(View.TRANSLATION_Y, 0f);
+            ObjectAnimator showAnimator = ObjectAnimator.ofPropertyValuesHolder(mListView, pvhAlpha,
+                    pvhY);
+            showAnimator.setDuration(LISTVIEW_ANIMATION_DURATION_IN_MILLIS);
+            showAnimator.setInterpolator(new SystemUIInterpolators.LogDecelerateInterpolator());
+            showAnimator.start();
         });
         mListView = mWindow.findViewById(R.id.volume_list);
         mListView.setOnHoverListener((v, event) -> {
@@ -383,26 +403,15 @@
             return;
         }
 
-        mDismissing = true;
-        mListView.animate()
-                .alpha(0)
-                .translationY(-mListView.getHeight())
-                .setDuration(LISTVIEW_ANIMATION_DURATION_IN_MILLIS)
-                .setInterpolator(new SystemUIInterpolators.LogAccelerateInterpolator())
-                .withEndAction(() -> mHandler.postDelayed(() -> {
-                    if (DEBUG) {
-                        Log.d(TAG, "mDialog.dismiss()");
-                    }
-                    mDialog.dismiss();
-                    mDismissing = false;
-                    // if mExpandIcon is null that means user never clicked on the expanded arrow
-                    // which implies that the dialog is still not expanded. In that case we do
-                    // not want to reset the state
-                    if (mExpandIcon != null && mExpanded) {
-                        toggleDialogExpansion(/* isClicked = */ false);
-                    }
-                }, DISMISS_DELAY_IN_MILLIS))
-                .start();
+        PropertyValuesHolder pvhAlpha = PropertyValuesHolder.ofFloat(View.ALPHA, 0f);
+        PropertyValuesHolder pvhY = PropertyValuesHolder.ofFloat(View.TRANSLATION_Y,
+                (float) -mListView.getHeight());
+        ObjectAnimator dismissAnimator = ObjectAnimator.ofPropertyValuesHolder(mListView, pvhAlpha,
+                pvhY);
+        dismissAnimator.setDuration(LISTVIEW_ANIMATION_DURATION_IN_MILLIS);
+        dismissAnimator.setInterpolator(new SystemUIInterpolators.LogAccelerateInterpolator());
+        dismissAnimator.addListener(new DismissAnimationListener());
+        dismissAnimator.start();
 
         Events.writeEvent(Events.EVENT_DISMISS_DIALOG, reason);
     }
@@ -605,6 +614,44 @@
         }
     }
 
+    private final class DismissAnimationListener implements Animator.AnimatorListener {
+        @Override
+        public void onAnimationStart(Animator animation) {
+            mDismissing = true;
+        }
+
+        @Override
+        public void onAnimationEnd(Animator animation) {
+            mHandler.postDelayed(() -> {
+                if (DEBUG) {
+                    Log.d(TAG, "mDialog.dismiss()");
+                }
+                mDialog.dismiss();
+                mDismissing = false;
+                // if mExpandIcon is null that means user never clicked on the expanded arrow
+                // which implies that the dialog is still not expanded. In that case we do
+                // not want to reset the state
+                if (mExpandIcon != null && mExpanded) {
+                    toggleDialogExpansion(/* isClicked = */ false);
+                }
+            }, DISMISS_DELAY_IN_MILLIS);
+        }
+
+        @Override
+        public void onAnimationCancel(Animator animation) {
+            // A canceled animation will also call onAnimationEnd so any necessary cleanup will
+            // already happen there
+            if (DEBUG) {
+                Log.d(TAG, "dismiss animation canceled");
+            }
+        }
+
+        @Override
+        public void onAnimationRepeat(Animator animation) {
+            // no-op
+        }
+    }
+
     private final class ExpandIconListener implements View.OnClickListener {
         @Override
         public void onClick(final View v) {
diff --git a/src/com/android/systemui/car/volume/CarVolumeModule.java b/src/com/android/systemui/car/volume/CarVolumeModule.java
index c51dff1..ee35b16 100644
--- a/src/com/android/systemui/car/volume/CarVolumeModule.java
+++ b/src/com/android/systemui/car/volume/CarVolumeModule.java
@@ -22,6 +22,7 @@
 
 import com.android.systemui.car.CarServiceProvider;
 import com.android.systemui.plugins.VolumeDialog;
+import com.android.systemui.statusbar.policy.ConfigurationController;
 import com.android.systemui.volume.VolumeComponent;
 import com.android.systemui.volume.VolumeDialogComponent;
 
@@ -40,7 +41,8 @@
     /** */
     @Provides
     static VolumeDialog provideVolumeDialog(Context context,
-            CarServiceProvider carServiceProvider) {
-        return new CarVolumeDialogImpl(context, carServiceProvider);
+            CarServiceProvider carServiceProvider,
+            ConfigurationController configurationController) {
+        return new CarVolumeDialogImpl(context, carServiceProvider, configurationController);
     }
 }
diff --git a/src/com/android/systemui/car/volume/VolumeUI.java b/src/com/android/systemui/car/volume/VolumeUI.java
index 46341da..05dd065 100644
--- a/src/com/android/systemui/car/volume/VolumeUI.java
+++ b/src/com/android/systemui/car/volume/VolumeUI.java
@@ -18,7 +18,6 @@
 
 import android.car.Car;
 import android.car.media.CarAudioManager;
-import android.content.Context;
 import android.content.res.Configuration;
 import android.content.res.Resources;
 import android.os.Handler;
@@ -39,7 +38,7 @@
 
 /** The entry point for controlling the volume ui in cars. */
 @SysUISingleton
-public class VolumeUI extends CoreStartable {
+public class VolumeUI implements CoreStartable {
 
     private static final String TAG = "VolumeUI";
     private final Resources mResources;
@@ -76,13 +75,11 @@
 
     @Inject
     public VolumeUI(
-            Context context,
             @Main Resources resources,
             @Main Handler mainHandler,
             CarServiceProvider carServiceProvider,
             Lazy<VolumeDialogComponent> volumeDialogComponentLazy
     ) {
-        super(context);
         mResources = resources;
         mMainHandler = mainHandler;
         mCarServiceProvider = carServiceProvider;
@@ -109,8 +106,7 @@
     }
 
     @Override
-    protected void onConfigurationChanged(Configuration newConfig) {
-        super.onConfigurationChanged(newConfig);
+    public void onConfigurationChanged(Configuration newConfig) {
         if (!mEnabled) return;
         if (mVolumeDialogComponent != null) {
             mVolumeDialogComponent.onConfigurationChanged(newConfig);
diff --git a/src/com/android/systemui/car/window/SystemUIOverlayWindowManager.java b/src/com/android/systemui/car/window/SystemUIOverlayWindowManager.java
index 2f06f76..40fd28b 100644
--- a/src/com/android/systemui/car/window/SystemUIOverlayWindowManager.java
+++ b/src/com/android/systemui/car/window/SystemUIOverlayWindowManager.java
@@ -35,8 +35,9 @@
  * OverlayViewController}(s) to allow for the correct visibility of system bars.
  */
 @SysUISingleton
-public class SystemUIOverlayWindowManager extends CoreStartable {
+public class SystemUIOverlayWindowManager implements CoreStartable {
     private static final String TAG = "SystemUIOverlayWM";
+    private final Context mContext;
     private final Map<Class<?>, Provider<OverlayViewMediator>>
             mContentMediatorCreators;
     private final OverlayViewGlobalStateController mOverlayViewGlobalStateController;
@@ -46,7 +47,7 @@
             Context context,
             Map<Class<?>, Provider<OverlayViewMediator>> contentMediatorCreators,
             OverlayViewGlobalStateController overlayViewGlobalStateController) {
-        super(context);
+        mContext = context;
         mContentMediatorCreators = contentMediatorCreators;
         mOverlayViewGlobalStateController = overlayViewGlobalStateController;
     }
diff --git a/tests/src/com/android/systemui/car/keyguard/CarKeyguardViewControllerTest.java b/tests/src/com/android/systemui/car/keyguard/CarKeyguardViewControllerTest.java
index 0479882..3d49259 100644
--- a/tests/src/com/android/systemui/car/keyguard/CarKeyguardViewControllerTest.java
+++ b/tests/src/com/android/systemui/car/keyguard/CarKeyguardViewControllerTest.java
@@ -85,7 +85,7 @@
 
         when(mKeyguardBouncerFactory.create(
                 any(ViewGroup.class),
-                any(KeyguardBouncer.BouncerExpansionCallback.class)))
+                any(KeyguardBouncer.PrimaryBouncerExpansionCallback.class)))
                 .thenReturn(mBouncer);
         when(mSystemUIOverlayWindowController.getBaseLayout()).thenReturn(mockBaseLayout);
         mExecutor = new FakeExecutor(new FakeSystemClock());
diff --git a/tests/src/com/android/systemui/car/qc/ProfileSwitcherTest.java b/tests/src/com/android/systemui/car/qc/ProfileSwitcherTest.java
index 145ad58..8d754cd 100644
--- a/tests/src/com/android/systemui/car/qc/ProfileSwitcherTest.java
+++ b/tests/src/com/android/systemui/car/qc/ProfileSwitcherTest.java
@@ -37,8 +37,8 @@
 import android.car.util.concurrent.AsyncFuture;
 import android.content.Intent;
 import android.content.pm.UserInfo;
-import android.os.UserManager;
 import android.os.UserHandle;
+import android.os.UserManager;
 import android.testing.AndroidTestingRunner;
 import android.testing.TestableLooper;
 
@@ -177,6 +177,25 @@
     }
 
     @Test
+    public void switchAllowed_orderUsersByCreationTime() {
+        UserInfo user1 = generateUser(1001, "User2", /* supportsSwitch= */ true,
+                /* isGuest= */ false);
+        UserInfo user2 = generateUser(1000, "User1", /* supportsSwitch= */ true,
+                /* isGuest= */ false);
+        mAliveUsers.add(user1);
+        mAliveUsers.add(user2);
+        List<QCRow> rows = getProfileRows();
+        // Expect four rows - one for each user, one for the guest user, and one for add user
+        assertThat(rows).hasSize(4);
+        assertThat(rows.get(0).getTitle()).isEqualTo("User2");
+        assertThat(rows.get(1).getTitle()).isEqualTo("User1");
+        assertThat(rows.get(2).getTitle()).isEqualTo(
+                mContext.getString(com.android.internal.R.string.guest_name));
+        assertThat(rows.get(3).getTitle()).isEqualTo(
+                mContext.getString(R.string.car_add_user));
+    }
+
+    @Test
     public void switchAllowed_userNotSwitchable_returnsValidRows() {
         UserInfo user1 = generateUser(1000, "User1", /* supportsSwitch= */ true,
                 /* isGuest= */ false);
@@ -304,6 +323,7 @@
         UserInfo info = mock(UserInfo.class);
         info.id = id;
         info.name = name;
+        info.creationTime = System.currentTimeMillis();
         when(info.supportsSwitchToByUser()).thenReturn(supportsSwitch);
         when(info.isGuest()).thenReturn(isGuest);
         return info;