Merge "Update button strings for new design" into main
diff --git a/Android.bp b/Android.bp
index 737c16c..c9a409c 100644
--- a/Android.bp
+++ b/Android.bp
@@ -1,4 +1,5 @@
 package {
+    default_team: "trendy_team_android_settings_app",
     default_applicable_licenses: ["packages_apps_Settings_license"],
 }
 
@@ -57,7 +58,7 @@
         "src/**/*.kt",
     ],
     exclude_srcs: [
-        "src/com/android/settings/biometrics/fingerprint2/shared/**/*.kt",
+        "src/com/android/settings/biometrics/fingerprint2/lib/**/*.kt",
     ],
     use_resource_processor: true,
     resource_dirs: [
diff --git a/aconfig/Android.bp b/aconfig/Android.bp
index d14cc6f..d511d04 100644
--- a/aconfig/Android.bp
+++ b/aconfig/Android.bp
@@ -1,10 +1,12 @@
 package {
+    default_team: "trendy_team_android_settings_app",
     default_applicable_licenses: ["packages_apps_Settings_license"],
 }
 
 aconfig_declarations {
     name: "aconfig_settings_flags",
     package: "com.android.settings.flags",
+    container: "system",
     srcs: [
         "*.aconfig",
     ],
@@ -18,6 +20,7 @@
 aconfig_declarations {
     name: "factory_reset_flags",
     package: "com.android.settings.factory_reset",
+    container: "system",
     srcs: ["factory_reset/*.aconfig"],
 }
 
@@ -29,6 +32,7 @@
 aconfig_declarations {
     name: "media_drm_flags",
     package: "com.android.settings.media_drm",
+    container: "system",
     srcs: ["media_drm/*.aconfig"],
 }
 
@@ -40,6 +44,7 @@
 aconfig_declarations {
     name: "accessibility_flags",
     package: "com.android.settings.accessibility",
+    container: "system",
     srcs: ["accessibility/*.aconfig"],
 }
 
@@ -51,8 +56,9 @@
 aconfig_declarations {
     name: "development_settings_flags",
     package: "com.android.settings.development",
+    container: "system",
     srcs: [
-        "development/**/*.aconfig"
+        "development/**/*.aconfig",
     ],
 }
 
diff --git a/aconfig/accessibility/accessibility_flags.aconfig b/aconfig/accessibility/accessibility_flags.aconfig
index ad770fb..24e108e 100644
--- a/aconfig/accessibility/accessibility_flags.aconfig
+++ b/aconfig/accessibility/accessibility_flags.aconfig
@@ -1,4 +1,5 @@
 package: "com.android.settings.accessibility"
+container: "system"
 
 # NOTE: Keep alphabetized to help limit merge conflicts from multiple simultaneous editors.
 
diff --git a/aconfig/development/settings_core_flag_declarations.aconfig b/aconfig/development/settings_core_flag_declarations.aconfig
index c012263..b73b026 100644
--- a/aconfig/development/settings_core_flag_declarations.aconfig
+++ b/aconfig/development/settings_core_flag_declarations.aconfig
@@ -1,4 +1,5 @@
 package: "com.android.settings.development"
+container: "system"
 
 flag {
   name: "deprecate_list_activity"
diff --git a/aconfig/factory_reset/factory_reset_flag_declarations.aconfig b/aconfig/factory_reset/factory_reset_flag_declarations.aconfig
index 2b1ce72..7feebf5 100644
--- a/aconfig/factory_reset/factory_reset_flag_declarations.aconfig
+++ b/aconfig/factory_reset/factory_reset_flag_declarations.aconfig
@@ -1,4 +1,5 @@
 package: "com.android.settings.factory_reset"
+container: "system"
 
 flag {
   name: "enable_factory_reset_wizard"
diff --git a/aconfig/media_drm/settings_mediadrm_flag_declarations.aconfig b/aconfig/media_drm/settings_mediadrm_flag_declarations.aconfig
index 06d75f1..4697a11 100644
--- a/aconfig/media_drm/settings_mediadrm_flag_declarations.aconfig
+++ b/aconfig/media_drm/settings_mediadrm_flag_declarations.aconfig
@@ -1,4 +1,5 @@
 package: "com.android.settings.media_drm"
+container: "system"
 
 flag {
     name: "force_l3_enabled"
diff --git a/aconfig/settings_accessibility_flag_declarations_legacy.aconfig b/aconfig/settings_accessibility_flag_declarations_legacy.aconfig
index 5a464b5..6e02bfe 100644
--- a/aconfig/settings_accessibility_flag_declarations_legacy.aconfig
+++ b/aconfig/settings_accessibility_flag_declarations_legacy.aconfig
@@ -1,4 +1,5 @@
 package: "com.android.settings.flags"
+container: "system"
 
 # NOTE: Don't add new accessibility flags here, since the package name doesn't follow
 # the best practice for setting's feature flag go/settings-trunk-stable
diff --git a/aconfig/settings_biometrics_framework_flag_declarations.aconfig b/aconfig/settings_biometrics_framework_flag_declarations.aconfig
index 810f2de..e9f19bc 100644
--- a/aconfig/settings_biometrics_framework_flag_declarations.aconfig
+++ b/aconfig/settings_biometrics_framework_flag_declarations.aconfig
@@ -1,4 +1,5 @@
 package: "com.android.settings.flags"
+container: "system"
 
 flag {
   name: "biometric_settings_provider"
diff --git a/aconfig/settings_biometrics_integration_declarations.aconfig b/aconfig/settings_biometrics_integration_declarations.aconfig
index bc437f2..ea3ac19 100644
--- a/aconfig/settings_biometrics_integration_declarations.aconfig
+++ b/aconfig/settings_biometrics_integration_declarations.aconfig
@@ -1,4 +1,5 @@
 package: "com.android.settings.flags"
+container: "system"
 
 flag {
   name: "sfps_enroll_refinement"
diff --git a/aconfig/settings_bluetooth_declarations.aconfig b/aconfig/settings_bluetooth_declarations.aconfig
index 58ddd25..3e771cd 100644
--- a/aconfig/settings_bluetooth_declarations.aconfig
+++ b/aconfig/settings_bluetooth_declarations.aconfig
@@ -1,4 +1,5 @@
 package: "com.android.settings.flags"
+container: "system"
 
 flag {
   name: "enable_offload_bluetooth_operations_to_background_thread"
diff --git a/aconfig/settings_connecteddevice_flag_declarations.aconfig b/aconfig/settings_connecteddevice_flag_declarations.aconfig
index 0fc164e..84bb578 100644
--- a/aconfig/settings_connecteddevice_flag_declarations.aconfig
+++ b/aconfig/settings_connecteddevice_flag_declarations.aconfig
@@ -1,4 +1,5 @@
 package: "com.android.settings.flags"
+container: "system"
 
 flag {
   name: "enable_subsequent_pair_settings_integration"
diff --git a/aconfig/settings_development_flag_declarations.aconfig b/aconfig/settings_development_flag_declarations.aconfig
index e12bccc..318f862 100644
--- a/aconfig/settings_development_flag_declarations.aconfig
+++ b/aconfig/settings_development_flag_declarations.aconfig
@@ -1,4 +1,5 @@
 package: "com.android.settings.flags"
+container: "system"
 
 # NOTE: Keep alphabetized to help limit merge conflicts from multiple simultaneous editors.
 
diff --git a/aconfig/settings_display_flag_declarations.aconfig b/aconfig/settings_display_flag_declarations.aconfig
index 52a326d..9fe587b 100644
--- a/aconfig/settings_display_flag_declarations.aconfig
+++ b/aconfig/settings_display_flag_declarations.aconfig
@@ -1,4 +1,5 @@
 package: "com.android.settings.flags"
+container: "system"
 
 flag {
     name: "protect_screen_timeout_with_auth"
diff --git a/aconfig/settings_experience_flag_declarations.aconfig b/aconfig/settings_experience_flag_declarations.aconfig
index 7642734..e6cb924 100644
--- a/aconfig/settings_experience_flag_declarations.aconfig
+++ b/aconfig/settings_experience_flag_declarations.aconfig
@@ -1,4 +1,5 @@
 package: "com.android.settings.flags"
+container: "system"
 
 flag {
     name: "new_apn_page_enabled"
diff --git a/aconfig/settings_flag_declarations.aconfig b/aconfig/settings_flag_declarations.aconfig
index 36f104c..9c3a7e1 100644
--- a/aconfig/settings_flag_declarations.aconfig
+++ b/aconfig/settings_flag_declarations.aconfig
@@ -1,4 +1,5 @@
 package: "com.android.settings.flags"
+container: "system"
 
 flag {
     name: "show_factory_reset_cancel_button"
diff --git a/aconfig/settings_globalintl_flag_declarations.aconfig b/aconfig/settings_globalintl_flag_declarations.aconfig
index 68662d0..95202d3 100644
--- a/aconfig/settings_globalintl_flag_declarations.aconfig
+++ b/aconfig/settings_globalintl_flag_declarations.aconfig
@@ -1,4 +1,5 @@
 package: "com.android.settings.flags"
+container: "system"
 
 flag {
     name: "terms_of_address_enabled"
diff --git a/aconfig/settings_notification_flag_declarations.aconfig b/aconfig/settings_notification_flag_declarations.aconfig
index f2bf1c8..bdb6573 100644
--- a/aconfig/settings_notification_flag_declarations.aconfig
+++ b/aconfig/settings_notification_flag_declarations.aconfig
@@ -1,4 +1,5 @@
 package: "com.android.settings.flags"
+container: "system"
 
 flag {
   name: "dedupe_dnd_settings_channels"
diff --git a/aconfig/settings_onboarding_experience_flag_declarations.aconfig b/aconfig/settings_onboarding_experience_flag_declarations.aconfig
index 6fb5377..8d58d40 100644
--- a/aconfig/settings_onboarding_experience_flag_declarations.aconfig
+++ b/aconfig/settings_onboarding_experience_flag_declarations.aconfig
@@ -1,4 +1,5 @@
 package: "com.android.settings.flags"
+container: "system"
 
 flag {
   name: "enable_sound_backup"
diff --git a/aconfig/settings_panel_flag_declarations.aconfig b/aconfig/settings_panel_flag_declarations.aconfig
index 10eb655..efab83e 100644
--- a/aconfig/settings_panel_flag_declarations.aconfig
+++ b/aconfig/settings_panel_flag_declarations.aconfig
@@ -1,4 +1,5 @@
 package: "com.android.settings.flags"
+container: "system"
 
 flag {
   name: "enable_volume_plus_quick_settings"
diff --git a/aconfig/settings_security_flag_declarations.aconfig b/aconfig/settings_security_flag_declarations.aconfig
index 42ef4d0..3684212 100644
--- a/aconfig/settings_security_flag_declarations.aconfig
+++ b/aconfig/settings_security_flag_declarations.aconfig
@@ -1,4 +1,5 @@
 package: "com.android.settings.flags"
+container: "system"
 
 flag {
   name: "protect_lock_after_timeout_with_auth"
diff --git a/aconfig/settings_telephony_flag_declarations.aconfig b/aconfig/settings_telephony_flag_declarations.aconfig
index 0999a7b..dab1b45 100644
--- a/aconfig/settings_telephony_flag_declarations.aconfig
+++ b/aconfig/settings_telephony_flag_declarations.aconfig
@@ -1,4 +1,5 @@
 package: "com.android.settings.flags"
+container: "system"
 
 flag {
     name: "remove_key_hide_enable_2g"
diff --git a/aconfig/settings_voice_activation_apps_flag_declarations.aconfig b/aconfig/settings_voice_activation_apps_flag_declarations.aconfig
index d98bc52..a18e8c5 100644
--- a/aconfig/settings_voice_activation_apps_flag_declarations.aconfig
+++ b/aconfig/settings_voice_activation_apps_flag_declarations.aconfig
@@ -1,4 +1,5 @@
 package: "com.android.settings.flags"
+container: "system"
 
 flag {
   name: "enable_voice_activation_apps_in_settings"
diff --git a/protos/Android.bp b/protos/Android.bp
index d546e2d..560851a 100644
--- a/protos/Android.bp
+++ b/protos/Android.bp
@@ -1,4 +1,5 @@
 package {
+    default_team: "trendy_team_android_settings_app",
     // See: http://go/android-license-faq
     // A large-scale-change added 'default_applicable_licenses' to import
     // all of the 'license_kinds' from "packages_apps_Settings_license"
diff --git a/res/drawable/ic_private_space_icon.xml b/res/drawable/ic_private_space_icon.xml
new file mode 100644
index 0000000..fc0894d
--- /dev/null
+++ b/res/drawable/ic_private_space_icon.xml
@@ -0,0 +1,26 @@
+<!--
+  ~ Copyright (C) 2024 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+  -->
+
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:width="24dp"
+        android:height="24dp"
+        android:viewportWidth="24"
+        android:viewportHeight="24">
+<path
+    android:pathData="M5,3H19C20.1,3 21,3.9 21,5V19C21,20.1 20.1,21 19,21H5C3.9,21 3,20.1 3,19V5C3,3.9 3.9,3 5,3ZM13.5,15.501L12.93,12.271C13.57,11.941 14,11.271 14,10.501C14,9.401 13.1,8.501 12,8.501C10.9,8.501 10,9.401 10,10.501C10,11.271 10.43,11.941 11.07,12.271L10.5,15.501H13.5Z"
+    android:fillColor="?android:attr/colorAccent"
+    android:fillType="evenOdd"/>
+</vector>
diff --git a/res/drawable/ic_privatespace_icon.xml b/res/drawable/ic_privatespace_icon.xml
deleted file mode 100644
index b651f52..0000000
--- a/res/drawable/ic_privatespace_icon.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<!--
-  ~ Copyright (C) 2023 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="24dp"
-        android:height="24dp"
-        android:viewportWidth="960"
-        android:viewportHeight="960"
-        android:tint="?attr/colorControlNormal">
-    <path
-        android:fillColor="@android:color/white"
-        android:pathData="M420,600L540,600L517,471Q537,461 548.5,442Q560,423 560,400Q560,367 536.5,343.5Q513,320 480,320Q447,320 423.5,343.5Q400,367 400,400Q400,423 411.5,442Q423,461 443,471L420,600ZM480,880Q341,845 250.5,720.5Q160,596 160,444L160,200L480,80L800,200L800,444Q800,596 709.5,720.5Q619,845 480,880ZM480,796Q584,763 652,664Q720,565 720,444L720,255L480,165L240,255L240,444Q240,565 308,664Q376,763 480,796ZM480,480Q480,480 480,480Q480,480 480,480L480,480L480,480L480,480L480,480Q480,480 480,480Q480,480 480,480Z"/>
-</vector>
-
diff --git a/res/drawable/private_space_choose_lock_illustration.xml b/res/drawable/private_space_choose_lock_illustration.xml
new file mode 100644
index 0000000..f943cb8
--- /dev/null
+++ b/res/drawable/private_space_choose_lock_illustration.xml
@@ -0,0 +1,84 @@
+<!--
+  ~ Copyright (C) 2024 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+  -->
+
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:width="364dp"
+        android:height="266dp"
+        android:viewportWidth="364"
+        android:viewportHeight="266">
+        <group>
+                <clip-path
+                    android:pathData="M0,0.95h364v265.05h-364z"/>
+                <path
+                    android:pathData="M339.42,265.47H24.58C11.07,265.47 0,254.17 0,240.39V26.42C0,12.6 11.07,1.3 24.58,1.3H339.52C352.93,1.3 364,12.6 364,26.38V240.49C364,254.17 352.93,265.47 339.42,265.47Z"
+                    android:fillColor="#000000"/>
+                <path
+                    android:pathData="M300.32,99.22C310.82,106.16 324.97,103.31 331.93,92.85C338.89,82.39 336.03,68.29 325.54,61.35L301.31,45.32C290.82,38.38 276.67,41.24 269.7,51.69C262.74,62.15 265.6,76.26 276.1,83.19L300.32,99.22Z"
+                    android:fillColor="#C7EBD4"/>
+                <path
+                    android:pathData="M323.02,78.05L314.03,79.7C313.56,79.79 313.24,80.25 313.33,80.72L314.98,89.71C315.07,90.19 315.52,90.5 316,90.41L324.99,88.76C325.46,88.68 325.78,88.22 325.69,87.75L324.04,78.76C323.95,78.28 323.5,77.97 323.02,78.05Z"
+                    android:fillColor="#5BB974"/>
+                <path
+                    android:pathData="M310.61,70.73L310.59,70.95C311.1,73.37 309.48,75.68 307.04,76.1L298.41,77.6C295.97,78.01 293.62,76.36 293.19,73.99L293.21,73.77C292.7,71.35 294.32,69.04 296.76,68.63L305.39,67.13C307.83,66.71 310.1,68.31 310.61,70.73Z"
+                    android:fillColor="#5BB974"/>
+                <path
+                    android:pathData="M280.24,67.28C283.75,69.56 288.46,68.56 290.74,65.05C293.02,61.54 292.02,56.84 288.51,54.56C285,52.28 280.29,53.28 278.02,56.79C275.73,60.3 276.73,65 280.24,67.28Z"
+                    android:fillColor="#5BB974"/>
+                <path
+                    android:pathData="M68.38,36.61C69.99,35.55 71.95,35.17 73.84,35.55C75.73,35.92 77.39,37.02 78.48,38.6L78.71,38.97L80.09,41.3C80.7,42.37 81.58,43.26 82.64,43.89C83.7,44.52 84.9,44.87 86.14,44.89L88.76,44.96C90.69,45.04 92.52,45.87 93.84,47.28C95.16,48.69 95.87,50.56 95.82,52.49C95.77,52.62 95.77,52.77 95.83,52.91L95.52,55.59C95.39,56.8 95.58,58.03 96.06,59.15C96.54,60.28 97.3,61.26 98.27,62L100.32,63.72C101.82,64.92 102.8,66.65 103.03,68.56C103.26,70.47 102.73,72.39 101.56,73.91C101.44,73.98 101.39,74.18 101.27,74.26L99.55,76.2C98.72,77.1 98.14,78.2 97.87,79.4C97.59,80.59 97.63,81.84 97.99,83.01L98.66,85.58C99.17,87.44 98.92,89.43 97.97,91.11C97.02,92.78 95.44,94.02 93.58,94.55C93.46,94.63 93.26,94.58 93.13,94.66L90.56,95.23C89.36,95.48 88.24,96.04 87.32,96.84C86.4,97.64 85.69,98.67 85.28,99.82L84.38,102.36C83.69,104.16 82.33,105.61 80.58,106.42C78.83,107.22 76.83,107.31 75.02,106.65C74.88,106.64 74.74,106.57 74.64,106.46L72.32,105.41C71.19,104.94 69.96,104.75 68.74,104.85C67.52,104.96 66.34,105.36 65.31,106.01L63.11,107.43C61.5,108.48 59.54,108.86 57.65,108.49C55.76,108.12 54.1,107.02 53.01,105.44L52.78,105.07L51.4,102.75C50.78,101.68 49.89,100.79 48.81,100.17C47.74,99.55 46.52,99.22 45.28,99.22L42.66,99.15C40.72,99.07 38.9,98.24 37.58,96.83C36.25,95.42 35.54,93.55 35.6,91.62C35.64,91.49 35.64,91.34 35.59,91.2L35.89,88.52C36.02,87.31 35.84,86.08 35.36,84.95C34.88,83.83 34.12,82.84 33.15,82.09L31.08,80.46C30.32,79.87 29.68,79.13 29.21,78.28C28.74,77.44 28.43,76.51 28.32,75.56C28.21,74.6 28.29,73.63 28.55,72.7C28.82,71.77 29.27,70.9 29.87,70.15C29.99,70.07 30.04,69.87 30.16,69.79L31.89,67.77C32.72,66.87 33.3,65.76 33.58,64.57C33.85,63.38 33.81,62.13 33.46,60.96L32.79,58.37C32.29,56.51 32.54,54.53 33.49,52.86C34.44,51.18 36.01,49.95 37.87,49.42C37.99,49.34 38.19,49.39 38.32,49.31L40.89,48.73C42.09,48.48 43.21,47.92 44.13,47.12C45.06,46.31 45.76,45.29 46.17,44.13L47.07,41.6C47.75,39.81 49.12,38.35 50.87,37.55C52.62,36.75 54.62,36.66 56.43,37.31C56.57,37.33 56.71,37.4 56.81,37.5L59.2,38.58C60.33,39.04 61.56,39.23 62.78,39.13C64,39.02 65.18,38.63 66.21,37.97L68.38,36.61Z"
+                    android:fillColor="#CEE3FF"/>
+                <path
+                    android:pathData="M60.5,74.56C59.92,74.56 59.44,74.37 59.05,73.97C58.65,73.58 58.45,73.09 58.45,72.52C58.45,71.95 58.65,71.46 59.05,71.07C59.44,70.67 59.92,70.48 60.5,70.48C61.07,70.48 61.55,70.67 61.95,71.07C62.34,71.46 62.54,71.95 62.54,72.52C62.54,73.09 62.34,73.58 61.95,73.97C61.55,74.37 61.07,74.56 60.5,74.56ZM70.3,74.56C69.73,74.56 69.25,74.37 68.85,73.97C68.46,73.58 68.26,73.09 68.26,72.52C68.26,71.95 68.46,71.46 68.85,71.07C69.25,70.67 69.73,70.48 70.3,70.48C70.88,70.48 71.36,70.67 71.75,71.07C72.15,71.46 72.35,71.95 72.35,72.52C72.35,73.09 72.15,73.58 71.75,73.97C71.36,74.37 70.88,74.56 70.3,74.56ZM65.4,83.96C69.05,83.96 72.14,82.69 74.68,80.16C77.21,77.63 78.48,74.54 78.48,70.89C78.48,70.23 78.43,69.6 78.35,68.99C78.27,68.37 78.12,67.78 77.9,67.21C77.33,67.34 76.76,67.45 76.19,67.51C75.61,67.58 75.02,67.62 74.39,67.62C71.91,67.62 69.57,67.09 67.36,66.02C65.15,64.96 63.27,63.48 61.72,61.57C60.85,63.69 59.6,65.54 57.98,67.11C56.36,68.67 54.48,69.85 52.32,70.64V70.89C52.32,74.54 53.59,77.63 56.12,80.16C58.66,82.69 61.75,83.96 65.4,83.96ZM65.4,87.23C63.14,87.23 61.01,86.8 59.03,85.94C57.04,85.09 55.31,83.92 53.84,82.45C52.36,80.98 51.2,79.25 50.34,77.26C49.48,75.27 49.05,73.15 49.05,70.89C49.05,68.62 49.48,66.5 50.34,64.51C51.2,62.52 52.36,60.79 53.84,59.32C55.31,57.85 57.04,56.69 59.03,55.83C61.01,54.97 63.14,54.54 65.4,54.54C67.66,54.54 69.79,54.97 71.77,55.83C73.76,56.69 75.49,57.85 76.96,59.32C78.43,60.79 79.6,62.52 80.46,64.51C81.32,66.5 81.74,68.62 81.74,70.89C81.74,73.15 81.32,75.27 80.46,77.26C79.6,79.25 78.43,80.98 76.96,82.45C75.49,83.92 73.76,85.09 71.77,85.94C69.79,86.8 67.66,87.23 65.4,87.23ZM63.19,58.01C64.34,59.92 65.89,61.45 67.85,62.61C69.81,63.77 71.99,64.35 74.39,64.35C74.77,64.35 75.14,64.33 75.49,64.29C75.85,64.25 76.21,64.2 76.6,64.14C75.45,62.24 73.9,60.7 71.94,59.55C69.98,58.39 67.8,57.81 65.4,57.81C65.02,57.81 64.65,57.83 64.3,57.87C63.94,57.91 63.57,57.96 63.19,58.01ZM53.02,66.76C54.41,65.97 55.62,64.95 56.66,63.69C57.69,62.44 58.47,61.04 58.98,59.49C57.6,60.28 56.38,61.3 55.35,62.55C54.31,63.8 53.54,65.21 53.02,66.76Z"
+                    android:fillColor="#559DFD"/>
+                <path
+                    android:pathData="M185.48,137.47C186.07,137.47 186.56,137.28 186.94,136.89C187.33,136.51 187.52,136.02 187.52,135.43C187.52,134.84 187.33,134.35 186.94,133.96C186.56,133.58 186.07,133.39 185.48,133.39C184.88,133.39 184.4,133.58 184.01,133.96C183.62,134.35 183.43,134.84 183.43,135.43C183.43,136.02 183.62,136.51 184.01,136.89C184.4,137.28 184.88,137.47 185.48,137.47Z"
+                    android:fillColor="#202124"/>
+                <path
+                    android:pathData="M54.83,176.56L60.78,178.1C63.63,178.83 66.64,178.74 69.45,177.82L75.29,175.92C86.88,172.14 98.07,182.63 94.99,194.4L93.44,200.33C92.69,203.18 92.78,206.18 93.69,208.97L95.6,214.79C99.37,226.35 88.83,237.52 77.03,234.47L71.09,232.93C68.23,232.19 65.22,232.29 62.42,233.2L56.58,235.11C44.98,238.89 33.8,228.4 36.88,216.63L38.43,210.7C39.17,207.85 39.08,204.85 38.17,202.06L36.27,196.23C32.49,184.68 43.03,173.51 54.83,176.56Z"
+                    android:fillColor="#FFF7DD"/>
+                <path
+                    android:pathData="M80.51,190.74m-6.18,0a6.18,6.18 0,1 1,12.37 0a6.18,6.18 0,1 1,-12.37 0"
+                    android:fillColor="#FFC800"/>
+                <path
+                    android:pathData="M50.47,219.9m-6.18,0a6.18,6.18 0,1 1,12.37 0a6.18,6.18 0,1 1,-12.37 0"
+                    android:fillColor="#FFC800"/>
+                <path
+                    android:pathData="M80.51,219.9m-6.18,0a6.18,6.18 0,1 1,12.37 0a6.18,6.18 0,1 1,-12.37 0"
+                    android:fillColor="#FFC800"/>
+                <path
+                    android:pathData="M77.6,193.13L50.21,220.52"
+                    android:strokeWidth="1.76699"
+                    android:fillColor="#00000000"
+                    android:strokeColor="#FFC800"/>
+                <path
+                    android:pathData="M80.07,219.9L50.47,219.9"
+                    android:strokeWidth="1.76699"
+                    android:fillColor="#00000000"
+                    android:strokeColor="#FFC800"/>
+                <path
+                    android:pathData="M311.22,173.59L289.22,173.9C286.98,173.93 284.78,174.55 282.85,175.7C280.92,176.85 279.34,178.48 278.25,180.44L267.53,199.55C266.44,201.5 265.88,203.71 265.91,205.95C265.94,208.18 266.56,210.38 267.72,212.3L278.99,231.12C280.14,233.04 281.78,234.63 283.74,235.72C285.7,236.81 287.91,237.36 290.15,237.33L312.15,237.01C314.39,236.99 316.59,236.37 318.52,235.22C320.45,234.08 322.04,232.45 323.14,230.49L333.84,211.37C334.93,209.41 335.49,207.21 335.45,204.97C335.42,202.73 334.79,200.54 333.64,198.62L322.38,179.8C321.23,177.88 319.59,176.3 317.63,175.21C315.67,174.12 313.46,173.56 311.22,173.59Z"
+                    android:fillColor="#CEE3FF"/>
+                <path
+                    android:pathData="M285.54,202.36C285.35,202.24 285.23,202.07 285.18,201.88C285.14,201.68 285.19,201.47 285.35,201.25C286.94,198.95 288.98,197.13 291.46,195.8C293.93,194.48 296.6,193.77 299.45,193.68C302.3,193.59 305.02,194.11 307.58,195.24C310.15,196.37 312.32,198.05 314.08,200.28C314.28,200.51 314.35,200.72 314.28,200.91C314.22,201.1 314.11,201.26 313.96,201.4C313.8,201.53 313.61,201.6 313.4,201.59C313.18,201.59 312.99,201.48 312.82,201.27C311.28,199.25 309.32,197.72 306.96,196.69C304.6,195.66 302.11,195.19 299.5,195.27C296.89,195.35 294.46,195.98 292.21,197.15C289.95,198.33 288.11,199.97 286.67,202.09C286.51,202.33 286.33,202.47 286.11,202.51C285.9,202.54 285.71,202.49 285.54,202.36ZM304.89,221.4C302.07,220.8 299.73,219.5 297.89,217.5C296.05,215.5 295.09,213.01 294.99,210.04C294.95,208.71 295.4,207.58 296.34,206.65C297.28,205.72 298.44,205.23 299.81,205.18C301.18,205.14 302.37,205.56 303.37,206.43C304.36,207.3 304.88,208.4 304.92,209.73C304.95,210.6 305.31,211.33 306,211.9C306.69,212.48 307.5,212.76 308.41,212.73C309.33,212.7 310.1,212.38 310.73,211.76C311.35,211.14 311.65,210.39 311.62,209.52C311.53,206.44 310.3,203.89 307.95,201.86C305.6,199.84 302.83,198.87 299.66,198.97C296.48,199.07 293.79,200.21 291.56,202.38C289.34,204.54 288.28,207.15 288.37,210.21C288.39,210.84 288.48,211.64 288.63,212.59C288.78,213.54 289.11,214.65 289.6,215.9C289.69,216.14 289.69,216.35 289.6,216.54C289.51,216.73 289.36,216.87 289.15,216.96C288.94,217.04 288.73,217.04 288.52,216.96C288.32,216.87 288.17,216.72 288.09,216.51C287.65,215.49 287.33,214.47 287.12,213.45C286.92,212.44 286.79,211.38 286.76,210.29C286.65,206.77 287.86,203.77 290.38,201.3C292.9,198.83 295.96,197.54 299.57,197.42C303.2,197.31 306.36,198.4 309.05,200.71C311.73,203.02 313.13,205.94 313.24,209.47C313.28,210.79 312.84,211.92 311.91,212.84C310.98,213.76 309.83,214.24 308.46,214.28C307.09,214.32 305.9,213.91 304.89,213.06C303.88,212.2 303.35,211.1 303.31,209.78C303.28,208.9 302.93,208.18 302.25,207.6C301.57,207.02 300.78,206.75 299.86,206.78C298.95,206.81 298.17,207.13 297.53,207.75C296.89,208.37 296.58,209.11 296.61,209.99C296.69,212.56 297.53,214.69 299.13,216.36C300.73,218.04 302.77,219.18 305.24,219.8C305.48,219.87 305.65,220 305.74,220.18C305.82,220.37 305.84,220.56 305.8,220.78C305.75,220.96 305.64,221.13 305.49,221.27C305.33,221.4 305.13,221.45 304.89,221.4ZM290.53,193.88C290.32,194.02 290.1,194.06 289.89,194C289.67,193.94 289.5,193.81 289.39,193.6C289.27,193.39 289.24,193.2 289.29,193.02C289.34,192.85 289.47,192.69 289.68,192.55C291.16,191.71 292.72,191.05 294.35,190.57C295.97,190.1 297.64,189.83 299.33,189.78C301.05,189.73 302.74,189.88 304.39,190.24C306.05,190.6 307.66,191.14 309.21,191.86C309.46,191.99 309.61,192.14 309.65,192.32C309.7,192.51 309.68,192.7 309.61,192.88C309.53,193.07 309.4,193.22 309.22,193.34C309.03,193.45 308.8,193.44 308.53,193.32C307.08,192.65 305.59,192.14 304.06,191.8C302.53,191.47 300.97,191.32 299.38,191.37C297.82,191.42 296.29,191.65 294.8,192.05C293.3,192.46 291.88,193.07 290.53,193.88ZM296.15,221.12C294.51,219.52 293.24,217.88 292.34,216.2C291.44,214.51 290.95,212.5 290.88,210.17C290.8,207.75 291.63,205.69 293.35,203.97C295.07,202.26 297.19,201.36 299.69,201.28C302.19,201.21 304.37,201.97 306.23,203.57C308.08,205.17 309.05,207.18 309.12,209.6C309.13,209.84 309.06,210.03 308.92,210.18C308.77,210.33 308.58,210.41 308.34,210.42C308.12,210.42 307.93,210.36 307.77,210.22C307.6,210.07 307.52,209.88 307.51,209.65C307.45,207.66 306.65,206.01 305.11,204.72C303.58,203.43 301.79,202.81 299.74,202.88C297.7,202.94 295.96,203.66 294.54,205.05C293.11,206.44 292.43,208.13 292.49,210.12C292.56,212.27 292.99,214.08 293.79,215.55C294.59,217.03 295.74,218.5 297.24,219.97C297.41,220.12 297.5,220.31 297.5,220.52C297.51,220.73 297.44,220.92 297.28,221.08C297.12,221.25 296.94,221.33 296.72,221.34C296.51,221.35 296.32,221.27 296.15,221.12ZM308.25,218.03C305.86,218.11 303.76,217.38 301.94,215.84C300.13,214.3 299.19,212.32 299.11,209.91C299.11,209.7 299.17,209.51 299.32,209.35C299.46,209.18 299.65,209.1 299.89,209.09C300.14,209.08 300.33,209.15 300.49,209.31C300.64,209.46 300.72,209.65 300.73,209.86C300.79,211.85 301.57,213.46 303.06,214.69C304.55,215.91 306.27,216.5 308.2,216.44C308.37,216.43 308.59,216.41 308.89,216.38C309.18,216.34 309.49,216.29 309.81,216.23C310.05,216.17 310.26,216.2 310.44,216.31C310.62,216.42 310.74,216.6 310.8,216.84C310.86,217.05 310.83,217.23 310.7,217.4C310.57,217.56 310.4,217.67 310.18,217.73C309.7,217.88 309.28,217.97 308.92,217.99C308.56,218.01 308.33,218.03 308.25,218.03Z"
+                    android:fillColor="#669DF6"/>
+                <path
+                    android:pathData="M214.98,100.49V166.46H149.02V100.49H214.98ZM214.98,91.07H149.02C143.83,91.07 139.59,95.31 139.59,100.49V166.46C139.59,171.64 143.83,175.88 149.02,175.88H214.98C220.17,175.88 224.41,171.64 224.41,166.46V100.49C224.41,95.31 220.17,91.07 214.98,91.07Z"
+                    android:fillColor="#669DF6"/>
+                <path
+                    android:pathData="M186.4,134.74L189.09,149.96H174.95L177.64,134.74C174.62,133.19 172.6,130.03 172.6,126.4C172.6,121.22 176.84,116.98 182.02,116.98C187.2,116.98 191.44,121.22 191.44,126.4C191.44,130.03 189.42,133.19 186.4,134.74Z"
+                    android:fillColor="#669DF6"/>
+        </group>
+</vector>
diff --git a/res/drawable/private_space_illustration.xml b/res/drawable/private_space_illustration.xml
new file mode 100644
index 0000000..7f2dba8
--- /dev/null
+++ b/res/drawable/private_space_illustration.xml
@@ -0,0 +1,82 @@
+<!--
+  ~ Copyright (C) 2024 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+  -->
+
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:width="412dp"
+        android:height="300dp"
+        android:viewportWidth="364"
+        android:viewportHeight="265">
+    <group>
+        <clip-path
+            android:pathData="M0,0h364v265h-364z"/>
+        <group>
+            <clip-path
+                android:pathData="M0,0h364v265.05h-364z"/>
+            <path
+                android:pathData="M339.44,265.05H24.56C11.04,265.05 0,253.74 0,239.87V25.18C0,11.31 11.04,0 24.56,0H339.53C352.96,0 364,11.31 364,25.18V240.05C364,253.74 352.96,265.05 339.44,265.05Z"
+                android:fillColor="#000000"/>
+            <path
+                android:pathData="M85.7,153.29a17.67,18.11 0,1 0,35.34 0a17.67,18.11 0,1 0,-35.34 0z"
+                android:fillColor="#3C4043"/>
+            <path
+                android:pathData="M155.05,153.29m-18.11,0a18.11,18.11 0,1 1,36.22 0a18.11,18.11 0,1 1,-36.22 0"
+                android:fillColor="#3C4043"/>
+            <path
+                android:pathData="M208.95,153.29m-18.11,0a18.11,18.11 0,1 1,36.22 0a18.11,18.11 0,1 1,-36.22 0"
+                android:fillColor="#3C4043"/>
+            <path
+                android:pathData="M75.1,76.86L288.9,76.86A8.83,8.83 0,0 1,297.74 85.7L297.74,236.78A8.83,8.83 0,0 1,288.9 245.61L75.1,245.61A8.83,8.83 0,0 1,66.26 236.78L66.26,85.7A8.83,8.83 0,0 1,75.1 76.86z"
+                android:fillColor="#E8F0FE"/>
+            <path
+                android:pathData="M288.02,104.25C288.02,112.06 281.69,118.39 273.88,118.39C266.08,118.39 259.75,112.06 259.75,104.25C259.75,96.45 266.08,90.12 273.88,90.12C281.69,90.12 288.02,96.45 288.02,104.25Z"
+                android:fillColor="#D2E3FC"/>
+            <path
+                android:pathData="M275.92,98.6C275.92,97.39 276.99,96.37 278.35,96.37C279.71,96.37 280.78,97.39 280.78,98.6V101.88H282.72V98.6C282.72,96.33 280.74,94.53 278.35,94.53C275.96,94.53 273.98,96.33 273.98,98.6V100.96H267.57C266.18,100.96 265.05,102.03 265.05,103.35V110.7C265.05,112.02 266.18,113.09 267.57,113.09H276.7C278.09,113.09 279.22,112.02 279.22,110.7V103.35C279.22,102.03 278.09,100.96 276.7,100.96H275.92V98.6ZM267.57,102.8C267.25,102.8 266.99,103.05 266.99,103.35V110.7C266.99,111 267.25,111.25 267.57,111.25H276.7C277.02,111.25 277.28,111 277.28,110.7V103.35C277.28,103.05 277.02,102.8 276.7,102.8H267.57ZM272.14,108.68C273.1,108.68 273.88,107.94 273.88,107.03C273.88,106.11 273.1,105.37 272.14,105.37C271.17,105.37 270.39,106.11 270.39,107.03C270.39,107.94 271.17,108.68 272.14,108.68Z"
+                android:fillColor="#669DF6"
+                android:fillType="evenOdd"/>
+            <path
+                android:pathData="M102.04,147.1m-19.88,0a19.88,19.88 0,1 1,39.76 0a19.88,19.88 0,1 1,-39.76 0"
+                android:fillColor="#669DF6"/>
+            <path
+                android:pathData="M155.94,147.1m-19.88,0a19.88,19.88 0,1 1,39.76 0a19.88,19.88 0,1 1,-39.76 0"
+                android:fillColor="#669DF6"/>
+            <path
+                android:pathData="M102.04,204.53m-19.88,0a19.88,19.88 0,1 1,39.76 0a19.88,19.88 0,1 1,-39.76 0"
+                android:fillColor="#669DF6"/>
+            <path
+                android:pathData="M155.94,204.53m-19.88,0a19.88,19.88 0,1 1,39.76 0a19.88,19.88 0,1 1,-39.76 0"
+                android:fillColor="#669DF6"/>
+            <path
+                android:pathData="M210.71,203.65m-19.88,0a19.88,19.88 0,1 1,39.76 0a19.88,19.88 0,1 1,-39.76 0"
+                android:fillColor="#669DF6"/>
+            <path
+                android:pathData="M265.49,203.65m-19.88,0a19.88,19.88 0,1 1,39.76 0a19.88,19.88 0,1 1,-39.76 0"
+                android:fillColor="#669DF6"/>
+        </group>
+        <path
+            android:pathData="M86.14,46.38m-19.88,0a19.88,19.88 0,1 1,39.76 0a19.88,19.88 0,1 1,-39.76 0"
+            android:fillColor="#3C4043"/>
+        <path
+            android:pathData="M150.64,46.38m-19.88,0a19.88,19.88 0,1 1,39.76 0a19.88,19.88 0,1 1,-39.76 0"
+            android:fillColor="#3C4043"/>
+        <path
+            android:pathData="M213.36,46.38m-19.88,0a19.88,19.88 0,1 1,39.76 0a19.88,19.88 0,1 1,-39.76 0"
+            android:fillColor="#3C4043"/>
+        <path
+            android:pathData="M277.86,46.38m-19.88,0a19.88,19.88 0,1 1,39.76 0a19.88,19.88 0,1 1,-39.76 0"
+            android:fillColor="#3C4043"/>
+    </group>
+</vector>
diff --git a/res/drawable/private_space_setup_notification_illustration.xml b/res/drawable/private_space_setup_notification_illustration.xml
new file mode 100644
index 0000000..ecdb486
--- /dev/null
+++ b/res/drawable/private_space_setup_notification_illustration.xml
@@ -0,0 +1,65 @@
+<!--
+  ~ Copyright (C) 2024 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+  -->
+
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:width="364dp"
+        android:height="265dp"
+        android:viewportWidth="364"
+        android:viewportHeight="265">
+    <group>
+        <group>
+            <clip-path
+                android:pathData="M0,0.48h364v265.05h-364z"/>
+            <path
+                android:pathData="M339.42,264.99H24.58C11.07,264.99 0,253.7 0,239.92V25.94C0,12.12 11.07,0.83 24.58,0.83H339.52C352.93,0.83 364,12.12 364,25.91V240.01C364,253.7 352.93,264.99 339.42,264.99Z"
+                android:fillColor="#000000"/>
+        </group>
+        <path
+            android:pathData="M200.49,144.8C200.49,139.45 205.07,134.95 210.92,134.95C216.77,134.95 221.36,139.45 221.36,144.8V159.36H229.71V144.8C229.71,134.78 221.21,126.82 210.92,126.82C200.64,126.82 192.14,134.78 192.14,144.8V155.29H164.58C158.59,155.29 153.73,160.02 153.73,165.86V198.4C153.73,204.24 158.59,208.98 164.58,208.98H203.82C209.82,208.98 214.68,204.24 214.68,198.4V165.86C214.68,160.02 209.82,155.29 203.82,155.29H200.49V144.8ZM164.58,163.42C163.2,163.42 162.08,164.52 162.08,165.86V198.4C162.08,199.75 163.2,200.85 164.58,200.85H203.82C205.21,200.85 206.33,199.75 206.33,198.4V165.86C206.33,164.52 205.21,163.42 203.82,163.42H164.58ZM184.2,189.46C188.35,189.46 191.72,186.18 191.72,182.13C191.72,178.09 188.35,174.81 184.2,174.81C180.05,174.81 176.69,178.09 176.69,182.13C176.69,186.18 180.05,189.46 184.2,189.46Z"
+            android:fillColor="#C58AF9"
+            android:fillType="evenOdd"/>
+        <path
+            android:pathData="M163.56,220.47C168.99,220.47 173.39,224.87 173.39,230.3C173.39,235.72 168.99,240.13 163.56,240.13C158.13,240.13 153.73,235.72 153.73,230.3C153.73,224.87 158.13,220.47 163.56,220.47Z"
+            android:fillColor="#5F6368"/>
+        <path
+            android:pathData="M201.15,220.47C206.58,220.47 210.98,224.87 210.98,230.3C210.98,235.72 206.58,240.13 201.15,240.13C195.71,240.13 191.32,235.72 191.32,230.3C191.32,224.87 195.71,220.47 201.15,220.47Z"
+            android:fillColor="#C58AF9"/>
+        <path
+            android:pathData="M89.23,28.75L257.1,28.75A13.25,13.25 0,0 1,270.35 42L270.35,79.99A13.25,13.25 0,0 1,257.1 93.24L89.23,93.24A13.25,13.25 0,0 1,75.98 79.99L75.98,42A13.25,13.25 0,0 1,89.23 28.75z"
+            android:fillColor="#E9D2FD"/>
+        <path
+            android:pathData="M145.78,43.77L241.19,43.77A5.3,5.3 0,0 1,246.49 49.07L246.49,49.07A5.3,5.3 0,0 1,241.19 54.37L145.78,54.37A5.3,5.3 0,0 1,140.48 49.07L140.48,49.07A5.3,5.3 0,0 1,145.78 43.77z"
+            android:fillColor="#C58AF9"/>
+        <path
+            android:pathData="M145.34,64.97L241.64,64.97A4.86,4.86 0,0 1,246.49 69.83L246.49,69.83A4.86,4.86 0,0 1,241.64 74.69L145.34,74.69A4.86,4.86 0,0 1,140.48 69.83L140.48,69.83A4.86,4.86 0,0 1,145.34 64.97z"
+            android:fillColor="#C58AF9"/>
+        <path
+            android:pathData="M108.23,81.76C120.18,81.76 129.87,72.07 129.87,60.11C129.87,48.16 120.18,38.47 108.23,38.47C96.27,38.47 86.58,48.16 86.58,60.11C86.58,72.07 96.27,81.76 108.23,81.76Z"
+            android:fillColor="#C58AF9"/>
+        <path
+            android:pathData="M266.37,112.68C278.33,112.68 288.02,102.99 288.02,91.03C288.02,79.08 278.33,69.39 266.37,69.39C254.42,69.39 244.73,79.08 244.73,91.03C244.73,102.99 254.42,112.68 266.37,112.68Z"
+            android:fillColor="#C58AF9"/>
+        <path
+            android:pathData="M96.3,70.05V66.96H99.39V56.14C99.39,54 100.04,52.1 101.33,50.43C102.61,48.77 104.29,47.68 106.35,47.17V46.09C106.35,45.44 106.58,44.89 107.03,44.44C107.48,43.99 108.03,43.77 108.67,43.77C109.31,43.77 109.86,43.99 110.31,44.44C110.76,44.89 110.99,45.44 110.99,46.09V47.17C113.05,47.68 114.73,48.77 116.01,50.43C117.3,52.1 117.95,54 117.95,56.14V66.96H121.04V70.05H96.3ZM108.67,74.69C107.82,74.69 107.09,74.39 106.49,73.78C105.88,73.18 105.58,72.45 105.58,71.6H111.76C111.76,72.45 111.46,73.18 110.85,73.78C110.25,74.39 109.52,74.69 108.67,74.69ZM102.49,66.96H114.85V56.14C114.85,54.43 114.25,52.98 113.04,51.77C111.83,50.56 110.37,49.95 108.67,49.95C106.97,49.95 105.51,50.56 104.3,51.77C103.09,52.98 102.49,54.43 102.49,56.14V66.96Z"
+            android:fillColor="#E9D2FD"/>
+        <path
+            android:pathData="M276.44,81.86V101.1H257.2V81.86H276.44ZM276.44,79.11H257.2C255.68,79.11 254.45,80.34 254.45,81.86V101.1C254.45,102.61 255.68,103.84 257.2,103.84H276.44C277.95,103.84 279.18,102.61 279.18,101.1V81.86C279.18,80.34 277.95,79.11 276.44,79.11Z"
+            android:fillColor="#E9D2FD"/>
+        <path
+            android:pathData="M268.09,91.85L268.87,96.29H264.75L265.54,91.85C264.65,91.39 264.06,90.47 264.06,89.42C264.06,87.9 265.3,86.67 266.81,86.67C268.33,86.67 269.56,87.9 269.56,89.42C269.56,90.47 268.97,91.39 268.09,91.85Z"
+            android:fillColor="#E9D2FD"/>
+    </group>
+</vector>
diff --git a/res/drawable/private_space_setup_preinstalled_illustration.xml b/res/drawable/private_space_setup_preinstalled_illustration.xml
new file mode 100644
index 0000000..2f01f01
--- /dev/null
+++ b/res/drawable/private_space_setup_preinstalled_illustration.xml
@@ -0,0 +1,77 @@
+<!--
+  ~ Copyright (C) 2024 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+  -->
+
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:width="364dp"
+        android:height="266dp"
+        android:viewportWidth="364"
+        android:viewportHeight="266">
+        <group>
+                <clip-path
+                    android:pathData="M0,0.48h364v265.05h-364z"/>
+                <path
+                    android:pathData="M339.42,264.99H24.58C11.07,264.99 0,253.7 0,239.92V25.94C0,12.13 11.07,0.83 24.58,0.83H339.52C352.93,0.83 364,12.13 364,25.91V240.01C364,253.7 352.93,264.99 339.42,264.99Z"
+                    android:fillColor="#000000"/>
+                <path
+                    android:pathData="M75.92,137.81L50.21,111.72C50.1,111.61 49.96,111.54 49.81,111.5C49.66,111.47 49.51,111.49 49.36,111.54C49.22,111.6 49.1,111.7 49.01,111.83C48.93,111.95 48.88,112.1 48.88,112.26L48.52,162.99C48.52,163.14 48.56,163.29 48.64,163.42C48.73,163.54 48.84,163.64 48.98,163.7C49.12,163.76 49.27,163.78 49.42,163.76C49.57,163.73 49.71,163.66 49.82,163.56L75.92,137.81Z"
+                    android:fillColor="#C58AF9"/>
+                <path
+                    android:pathData="M79.16,134.61L87.37,126.51L54.65,107.44C54.48,107.32 54.27,107.28 54.07,107.31C53.87,107.35 53.69,107.46 53.57,107.62C53.45,107.78 53.39,107.99 53.42,108.19C53.44,108.39 53.55,108.58 53.71,108.71L79.16,134.61Z"
+                    android:fillColor="#C58AF9"/>
+                <path
+                    android:pathData="M53.24,166.57C53.09,166.71 53.01,166.89 52.99,167.08C52.97,167.27 53.02,167.47 53.13,167.63C53.24,167.79 53.41,167.9 53.6,167.95C53.79,167.99 53.99,167.97 54.16,167.88L87.22,149.32L79.13,141.09L53.24,166.57Z"
+                    android:fillColor="#C58AF9"/>
+                <path
+                    android:pathData="M101.4,134.67L91.43,128.87L82.37,137.83L91.35,146.94L101.4,141.28C101.97,140.94 102.45,140.46 102.78,139.88C103.11,139.3 103.29,138.64 103.29,137.97C103.29,137.31 103.11,136.65 102.78,136.07C102.45,135.49 101.97,135.01 101.4,134.67Z"
+                    android:fillColor="#C58AF9"/>
+                <path
+                    android:pathData="M263.42,132.67C263.42,136.04 264.61,138.92 267,141.32C269.39,143.71 272.26,144.91 275.61,144.91C278.96,144.91 281.83,143.71 284.22,141.32C286.61,138.92 287.8,136.04 287.8,132.67C287.8,129.31 286.61,126.43 284.22,124.03C281.83,121.63 278.96,120.43 275.61,120.43C272.26,120.43 269.39,121.63 267,124.03C264.61,126.43 263.42,129.31 263.42,132.67ZM275.61,151.03C276.27,151.03 276.9,151.01 277.51,150.95C278.12,150.9 278.73,150.8 279.34,150.65L272.18,163.04C264.51,162.17 258.08,158.87 252.9,153.13C247.72,147.4 245.13,140.58 245.13,132.67C245.13,130.53 245.33,128.45 245.74,126.44C246.14,124.43 246.75,122.5 247.57,120.66L259.76,141.85C261.33,144.6 263.52,146.82 266.31,148.51C269.11,150.19 272.2,151.03 275.61,151.03ZM275.61,114.32C271.55,114.32 267.94,115.5 264.79,117.87C261.64,120.24 259.45,123.26 258.23,126.94L251.07,114.54C253.87,110.77 257.38,107.75 261.63,105.48C265.87,103.21 270.53,102.08 275.61,102.08C280.64,102.08 285.26,103.19 289.48,105.4C293.69,107.62 297.2,110.59 299.99,114.32H275.61ZM303.5,120.43C304.36,122.32 305.01,124.29 305.44,126.32C305.87,128.36 306.09,130.48 306.09,132.67C306.09,140.58 303.51,147.38 298.36,153.1C293.2,158.81 286.84,162.12 279.27,163.04L291.46,141.85C292.22,140.53 292.82,139.09 293.25,137.53C293.68,135.98 293.9,134.36 293.9,132.67C293.9,130.28 293.48,128.04 292.64,125.98C291.8,123.92 290.65,122.07 289.17,120.43H303.5Z"
+                    android:fillColor="#C58AF9"/>
+                <path
+                    android:pathData="M155.01,119.75h41.52v36.22h-41.52z"
+                    android:fillColor="#E9D2FD"/>
+                <path
+                    android:pathData="M175.77,149.2C179.47,149.2 182.62,147.91 185.21,145.33C187.8,142.76 189.09,139.63 189.09,135.95C189.09,132.26 187.8,129.13 185.21,126.56C182.62,123.98 179.47,122.69 175.77,122.69C172.07,122.69 168.93,123.98 166.34,126.56C163.75,129.13 162.46,132.26 162.46,135.95C162.46,139.63 163.75,142.76 166.34,145.33C168.93,147.91 172.07,149.2 175.77,149.2ZM175.77,143.31C173.7,143.31 171.95,142.6 170.52,141.17C169.09,139.75 168.38,138.01 168.38,135.95C168.38,133.88 169.09,132.14 170.52,130.72C171.95,129.29 173.7,128.58 175.77,128.58C177.85,128.58 179.6,129.29 181.03,130.72C182.46,132.14 183.17,133.88 183.17,135.95C183.17,138.01 182.46,139.75 181.03,141.17C179.6,142.6 177.85,143.31 175.77,143.31ZM152.1,159.51C150.47,159.51 149.07,158.93 147.92,157.77C146.76,156.62 146.18,155.24 146.18,153.62V118.28C146.18,116.65 146.76,115.27 147.92,114.11C149.07,112.96 150.47,112.39 152.1,112.39H161.42L166.9,106.5H184.65L190.13,112.39H199.45C201.08,112.39 202.47,112.96 203.63,114.11C204.79,115.27 205.37,116.65 205.37,118.28V153.62C205.37,155.24 204.79,156.62 203.63,157.77C202.47,158.93 201.08,159.51 199.45,159.51H152.1Z"
+                    android:fillColor="#C58AF9"/>
+                <path
+                    android:pathData="M109.51,182.48C121.47,182.48 131.16,172.78 131.16,160.83C131.16,148.88 121.47,139.18 109.51,139.18C97.56,139.18 87.87,148.88 87.87,160.83C87.87,172.78 97.56,182.48 109.51,182.48Z"
+                    android:fillColor="#E9D2FD"/>
+                <path
+                    android:pathData="M119.57,151.65V170.89H100.33V151.65H119.57ZM119.57,148.9H100.33C98.82,148.9 97.58,150.14 97.58,151.65V170.89C97.58,172.4 98.82,173.64 100.33,173.64H119.57C121.09,173.64 122.32,172.4 122.32,170.89V151.65C122.32,150.14 121.09,148.9 119.57,148.9Z"
+                    android:fillColor="#C58AF9"/>
+                <path
+                    android:pathData="M111.23,161.64L112.01,166.08H107.89L108.67,161.64C107.79,161.19 107.2,160.27 107.2,159.21C107.2,157.7 108.44,156.46 109.95,156.46C111.46,156.46 112.7,157.7 112.7,159.21C112.7,160.27 112.11,161.19 111.23,161.64Z"
+                    android:fillColor="#C58AF9"/>
+                <path
+                    android:pathData="M208.46,182.48C220.42,182.48 230.11,172.78 230.11,160.83C230.11,148.88 220.42,139.18 208.46,139.18C196.51,139.18 186.82,148.88 186.82,160.83C186.82,172.78 196.51,182.48 208.46,182.48Z"
+                    android:fillColor="#E9D2FD"/>
+                <path
+                    android:pathData="M218.52,151.65V170.89H199.29V151.65H218.52ZM218.52,148.9H199.29C197.77,148.9 196.54,150.14 196.54,151.65V170.89C196.54,172.4 197.77,173.64 199.29,173.64H218.52C220.04,173.64 221.27,172.4 221.27,170.89V151.65C221.27,150.14 220.04,148.9 218.52,148.9Z"
+                    android:fillColor="#C58AF9"/>
+                <path
+                    android:pathData="M210.18,161.64L210.96,166.08H206.84L207.62,161.64C206.74,161.19 206.15,160.27 206.15,159.21C206.15,157.7 207.39,156.46 208.9,156.46C210.41,156.46 211.65,157.7 211.65,159.21C211.65,160.27 211.06,161.19 210.18,161.64Z"
+                    android:fillColor="#C58AF9"/>
+                <path
+                    android:pathData="M312.72,182.48C324.67,182.48 334.36,172.78 334.36,160.83C334.36,148.88 324.67,139.18 312.72,139.18C300.76,139.18 291.07,148.88 291.07,160.83C291.07,172.78 300.76,182.48 312.72,182.48Z"
+                    android:fillColor="#E9D2FD"/>
+                <path
+                    android:pathData="M322.78,151.65V170.89H303.54V151.65H322.78ZM322.78,148.9H303.54C302.03,148.9 300.79,150.14 300.79,151.65V170.89C300.79,172.4 302.03,173.64 303.54,173.64H322.78C324.29,173.64 325.53,172.4 325.53,170.89V151.65C325.53,150.14 324.29,148.9 322.78,148.9Z"
+                    android:fillColor="#C58AF9"/>
+                <path
+                    android:pathData="M314.43,161.64L315.22,166.08H311.09L311.88,161.64C311,161.19 310.41,160.27 310.41,159.21C310.41,157.7 311.64,156.46 313.15,156.46C314.67,156.46 315.9,157.7 315.9,159.21C315.9,160.27 315.31,161.19 314.43,161.64Z"
+                    android:fillColor="#C58AF9"/>
+        </group>
+</vector>
diff --git a/res/drawable/private_space_setup_sharing_illustration.xml b/res/drawable/private_space_setup_sharing_illustration.xml
new file mode 100644
index 0000000..8cfa77f
--- /dev/null
+++ b/res/drawable/private_space_setup_sharing_illustration.xml
@@ -0,0 +1,100 @@
+<!--
+  ~ Copyright (C) 2024 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+  -->
+
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:width="364dp"
+        android:height="266dp"
+        android:viewportWidth="364"
+        android:viewportHeight="266">
+    <group>
+        <clip-path
+            android:pathData="M0,0.48h364v265.05h-364z"/>
+        <path
+            android:pathData="M339.42,264.99H24.58C11.07,264.99 0,253.7 0,239.92V25.94C0,12.13 11.07,0.83 24.58,0.83H339.52C352.93,0.83 364,12.13 364,25.91V240.01C364,253.7 352.93,264.99 339.42,264.99Z"
+            android:fillColor="#000000"/>
+        <path
+            android:pathData="M201.15,182.48C195.72,182.48 191.32,186.88 191.32,192.31C191.32,197.73 195.72,202.14 201.15,202.14C206.58,202.14 210.98,197.73 210.98,192.31C210.98,186.88 206.58,182.48 201.15,182.48Z"
+            android:fillColor="#3C4043"/>
+        <path
+            android:pathData="M163.56,182.48C158.13,182.48 153.73,186.88 153.73,192.31C153.73,197.73 158.13,202.14 163.56,202.14C168.99,202.14 173.39,197.73 173.39,192.31C173.39,186.88 168.99,182.48 163.56,182.48Z"
+            android:fillColor="#669DF6"/>
+        <path
+            android:pathData="M185.48,136.99C186.07,136.99 186.56,136.8 186.94,136.41C187.33,136.03 187.52,135.54 187.52,134.95C187.52,134.36 187.33,133.88 186.94,133.49C186.56,133.1 186.07,132.91 185.48,132.91C184.88,132.91 184.4,133.1 184.01,133.49C183.62,133.88 183.43,134.36 183.43,134.95C183.43,135.54 183.62,136.03 184.01,136.41C184.4,136.8 184.88,136.99 185.48,136.99Z"
+            android:fillColor="#202124"/>
+        <path
+            android:pathData="M338.13,145.81L322.74,131.98C319.02,128.64 313.3,128.94 309.97,132.66C306.63,136.37 306.93,142.09 310.65,145.43L326.05,159.26C329.76,162.6 335.48,162.3 338.82,158.58C342.15,154.87 341.85,149.15 338.13,145.81Z"
+            android:fillColor="#AECBFA"/>
+        <path
+            android:pathData="M325.81,64.64L295.79,43.72C293.73,42.28 290.89,42.79 289.45,44.85L268.54,74.87C267.1,76.93 267.6,79.77 269.67,81.21L299.69,102.13C301.75,103.56 304.59,103.06 306.02,100.99L326.94,70.97C328.38,68.91 327.87,66.07 325.81,64.64Z"
+            android:fillColor="#E8F0FE"/>
+        <path
+            android:pathData="M297.96,73.56C299.44,74.63 301.2,75.25 303.04,75.33C304.87,75.41 306.69,74.95 308.25,74.01C309.82,73.06 311.07,71.68 311.85,70.03C312.63,68.38 312.89,66.53 312.61,64.73C312.34,62.93 311.53,61.25 310.29,59.91C309.05,58.56 307.44,57.61 305.66,57.18C303.88,56.75 302,56.85 300.28,57.47C298.56,58.09 297.06,59.21 295.97,60.68C294.52,62.65 293.91,65.11 294.28,67.53C294.65,69.94 295.98,72.11 297.96,73.56Z"
+            android:fillColor="#669DF6"/>
+        <path
+            android:pathData="M295.71,77.78C287.35,71.94 278.5,69.93 272.37,77.85L302.63,98.92C308.76,91 304.07,83.58 295.71,77.78Z"
+            android:fillColor="#669DF6"/>
+        <path
+            android:pathData="M84.13,50.89L47.87,55.78C45.37,56.11 43.63,58.4 43.96,60.89L48.85,97.15C49.18,99.65 51.47,101.39 53.97,101.06L90.23,96.17C92.72,95.84 94.47,93.55 94.13,91.05L89.25,54.79C88.91,52.3 86.62,50.55 84.13,50.89Z"
+            android:fillColor="#E9D2FD"/>
+        <path
+            android:pathData="M69.64,76.29C71.46,76.08 73.18,75.35 74.58,74.17C75.99,72.99 77.01,71.42 77.53,69.66C78.05,67.91 78.03,66.04 77.49,64.3C76.94,62.56 75.89,61.02 74.47,59.88C73.05,58.74 71.32,58.05 69.49,57.9C67.67,57.75 65.84,58.14 64.24,59.02C62.63,59.91 61.32,61.24 60.47,62.87C59.62,64.49 59.27,66.33 59.47,68.15C59.73,70.58 60.94,72.81 62.85,74.33C64.76,75.86 67.2,76.56 69.64,76.29Z"
+            android:fillColor="#C58AF9"/>
+        <path
+            android:pathData="M70.84,80.92C60.73,82.28 52.85,86.78 53.69,96.76L90.23,91.82C89.39,81.84 80.92,79.54 70.84,80.92Z"
+            android:fillColor="#C58AF9"/>
+        <path
+            android:pathData="M39.14,170.33L66.27,160.64A11.49,11.49 115.34,0 1,80.95 167.59L89.91,192.65A11.49,11.49 115.34,0 1,82.96 207.33L55.82,217.03A11.49,11.49 115.34,0 1,41.14 210.07L32.19,185.01A11.49,11.49 115.34,0 1,39.14 170.33z"
+            android:fillColor="#E8F0FE"/>
+        <path
+            android:pathData="M66.57,172.29a4.81,4.58 70.34,1 0,8.63 -3.08a4.81,4.58 70.34,1 0,-8.63 3.08z"
+            android:fillColor="#669DF6"/>
+        <group>
+            <clip-path
+                android:pathData="M39.14,170.33L66.27,160.64A11.49,11.49 115.34,0 1,80.95 167.59L89.91,192.65A11.49,11.49 115.34,0 1,82.96 207.33L55.82,217.03A11.49,11.49 115.34,0 1,41.14 210.07L32.19,185.01A11.49,11.49 115.34,0 1,39.14 170.33z"/>
+            <path
+                android:pathData="M57.86,186.51C53.39,183.04 46.83,185.22 45.32,190.67L39.9,210.23C38.18,216.44 44.17,222.01 50.24,219.85L72.6,211.86C72.78,211.79 72.95,211.72 73.12,211.65C73.31,211.59 73.49,211.54 73.68,211.47L88.87,206.04C95.09,203.82 96.05,195.42 90.49,191.86L79.38,184.73C74.99,181.92 69.13,184.01 67.52,188.97L66.21,193L57.86,186.51Z"
+                android:fillColor="#669DF6"
+                android:fillType="evenOdd"/>
+        </group>
+        <path
+            android:pathData="M297.35,169.44L324.72,178.44A11.49,11.49 63.19,0 1,332.04 192.93L323.74,218.22A11.49,11.49 63.19,0 1,309.24 225.54L281.87,216.55A11.49,11.49 63.19,0 1,274.54 202.05L282.85,176.77A11.49,11.49 63.19,0 1,297.35 169.44z"
+            android:fillColor="#E9D2FD"/>
+        <path
+            android:pathData="M317.81,187.82a4.81,4.58 108.19,1 0,8.71 2.86a4.81,4.58 108.19,1 0,-8.71 -2.86z"
+            android:fillColor="#C58AF9"/>
+        <group>
+            <clip-path
+                android:pathData="M297.35,169.44L324.72,178.44A11.49,11.49 63.19,0 1,332.04 192.93L323.74,218.22A11.49,11.49 63.19,0 1,309.24 225.54L281.87,216.55A11.49,11.49 63.19,0 1,274.54 202.05L282.85,176.77A11.49,11.49 63.19,0 1,297.35 169.44z"/>
+            <path
+                android:pathData="M302.2,193.71C300.8,188.23 294.29,185.92 289.75,189.3L273.46,201.42C268.3,205.27 269.61,213.34 275.73,215.35L298.28,222.76C298.46,222.82 298.64,222.87 298.83,222.92C299.01,222.99 299.19,223.06 299.38,223.12L314.71,228.15C320.98,230.22 326.89,224.17 324.68,217.95L320.28,205.5C318.54,200.59 312.63,198.65 308.32,201.57L304.82,203.95L302.2,193.71Z"
+                android:fillColor="#C58AF9"
+                android:fillType="evenOdd"/>
+        </group>
+    </group>
+    <path
+        android:pathData="M157.77,52.17L131.31,64.89C130.6,65.23 129.79,65.27 129.04,65.01C128.3,64.75 127.69,64.21 127.36,63.5L126.91,62.58C124.89,58.37 124.62,53.52 126.17,49.1C127.72,44.69 130.96,41.07 135.17,39.04C139.39,37.01 144.24,36.74 148.66,38.29C153.07,39.84 156.69,43.08 158.72,47.3L159.16,48.21C159.5,48.92 159.54,49.74 159.28,50.48C159.02,51.22 158.48,51.83 157.77,52.17Z"
+        android:fillColor="#669DF6"/>
+    <path
+        android:pathData="M200.49,106.81C200.49,101.46 205.07,96.96 210.92,96.96C216.77,96.96 221.36,101.46 221.36,106.81V121.37H229.71V106.81C229.71,96.79 221.21,88.83 210.92,88.83C200.64,88.83 192.14,96.79 192.14,106.81V117.3H164.58C158.59,117.3 153.73,122.03 153.73,127.87V160.41C153.73,166.26 158.59,170.99 164.58,170.99H203.82C209.82,170.99 214.68,166.26 214.68,160.41V127.87C214.68,122.03 209.82,117.3 203.82,117.3H200.49V106.81ZM164.58,125.43C163.2,125.43 162.08,126.53 162.08,127.87V160.41C162.08,161.76 163.2,162.85 164.58,162.85H203.82C205.21,162.85 206.33,161.76 206.33,160.41V127.87C206.33,126.53 205.21,125.43 203.82,125.43H164.58ZM184.2,151.47C188.35,151.47 191.72,148.19 191.72,144.14C191.72,140.1 188.35,136.82 184.2,136.82C180.05,136.82 176.69,140.1 176.69,144.14C176.69,148.19 180.05,151.47 184.2,151.47Z"
+        android:fillColor="#C58AF9"
+        android:fillType="evenOdd"/>
+    <path
+        android:pathData="M163.56,182.48C168.99,182.48 173.39,186.88 173.39,192.31C173.39,197.73 168.99,202.14 163.56,202.14C158.13,202.14 153.73,197.73 153.73,192.31C153.73,186.88 158.13,182.48 163.56,182.48Z"
+        android:fillColor="#5F6368"/>
+    <path
+        android:pathData="M201.15,182.48C206.58,182.48 210.98,186.88 210.98,192.31C210.98,197.73 206.58,202.14 201.15,202.14C195.71,202.14 191.32,197.73 191.32,192.31C191.32,186.88 195.71,182.48 201.15,182.48Z"
+        android:fillColor="#C58AF9"/>
+</vector>
diff --git a/res/drawable/privatespace_lock_placeholder.xml b/res/drawable/privatespace_lock_placeholder.xml
deleted file mode 100644
index 815ffd7..0000000
--- a/res/drawable/privatespace_lock_placeholder.xml
+++ /dev/null
@@ -1,78 +0,0 @@
-<!--
-  ~ Copyright (C) 2023 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="380dp"
-        android:height="276dp"
-        android:viewportWidth="380"
-        android:viewportHeight="276">
-    <path
-        android:pathData="M354.34,276H25.66C11.56,276 0,264.2 0,249.8V26.24C0,11.8 11.56,0 25.66,0H354.44C368.44,0 380,11.8 380,26.2V249.9C380,264.2 368.44,276 354.34,276Z"
-        android:fillColor="#000000"/>
-    <path
-        android:pathData="M190,37.72C185.34,37.71 180.72,38.64 176.42,40.45C170.09,43.12 164.69,47.58 160.89,53.3C157.1,59.01 155.09,65.72 155.1,72.57V90.07H155.29V111.34H161.68V72.57C161.67,67.12 163.23,61.79 166.18,57.2L166.04,57.11C166.1,57.01 166.16,56.92 166.23,56.82C169.33,52.16 173.74,48.5 178.91,46.33C185.11,43.73 192.03,43.39 198.45,45.38C204.88,47.37 210.39,51.55 214.02,57.2L214.01,57.2C216.96,61.79 218.52,67.12 218.51,72.57V111.34H224.9V72.57C224.92,65.9 223,59.37 219.4,53.76L215.27,56.4L219.39,53.76C216.24,48.83 211.89,44.78 206.76,41.98C201.62,39.17 195.86,37.71 190,37.72Z"
-        android:fillColor="#669DF6"
-        android:fillType="evenOdd"/>
-    <path
-        android:pathData="M250.08,227.69H129.92C126.53,227.69 123.28,226.35 120.88,223.96C118.48,221.56 117.14,218.32 117.14,214.93V122.24C117.14,118.86 118.48,115.61 120.88,113.22C123.28,110.83 126.53,109.48 129.92,109.48H250.08C253.47,109.48 256.72,110.83 259.12,113.22C261.52,115.61 262.86,118.86 262.86,122.24V214.93C262.86,218.32 261.52,221.56 259.12,223.96C256.72,226.35 253.47,227.69 250.08,227.69ZM129.92,113.13C127.5,113.13 125.18,114.09 123.46,115.8C121.75,117.5 120.79,119.82 120.79,122.24V214.93C120.79,217.35 121.75,219.67 123.46,221.38C125.18,223.09 127.5,224.05 129.92,224.05H250.08C252.5,224.05 254.82,223.09 256.54,221.38C258.25,219.67 259.21,217.35 259.21,214.93V122.24C259.21,119.82 258.25,117.5 256.54,115.8C254.82,114.09 252.5,113.13 250.08,113.13H129.92Z"
-        android:fillColor="#80868B"/>
-    <path
-        android:pathData="M281.77,245.93C303.27,245.93 320.69,228.59 320.69,207.21C320.69,185.83 303.27,168.49 281.77,168.49C260.28,168.49 242.86,185.83 242.86,207.21C242.86,228.59 260.28,245.93 281.77,245.93Z"
-        android:fillColor="#000000"/>
-    <path
-        android:pathData="M281.77,168.36C260.2,168.36 242.57,185.76 242.57,207.37C242.57,228.97 260.06,246.37 281.77,246.37C303.49,246.37 320.97,228.97 320.97,207.37C320.97,185.76 303.35,168.36 281.77,168.36ZM281.77,238.37C264.57,238.37 250.47,224.34 250.47,207.22C250.47,190.11 264.57,176.08 281.77,176.08C298.98,176.08 313.08,190.11 313.08,207.22C313.08,224.48 298.98,238.37 281.77,238.37Z"
-        android:fillColor="#669DF6"/>
-    <path
-        android:pathData="M281.77,170.07C261.13,170.07 244.27,186.71 244.27,207.37C244.27,228.02 260.99,244.66 281.77,244.66C302.55,244.66 319.27,228.02 319.27,207.37C319.27,186.71 302.42,170.07 281.77,170.07ZM281.77,240.07C263.64,240.07 248.77,225.29 248.77,207.22C248.77,189.16 263.64,174.38 281.77,174.38C299.91,174.38 314.78,189.16 314.78,207.22C314.78,225.43 299.9,240.07 281.77,240.07ZM242.57,207.37C242.57,185.76 260.2,168.36 281.77,168.36C303.35,168.36 320.97,185.76 320.97,207.37C320.97,228.97 303.49,246.37 281.77,246.37C260.06,246.37 242.57,228.97 242.57,207.37ZM250.47,207.22C250.47,224.34 264.57,238.37 281.77,238.37C298.98,238.37 313.08,224.48 313.08,207.22C313.08,190.11 298.98,176.08 281.77,176.08C264.57,176.08 250.47,190.11 250.47,207.22Z"
-        android:fillColor="#000000"
-        android:fillType="evenOdd"/>
-    <path
-        android:pathData="M301.48,193.25C301.48,191.56 300.44,190.07 298.85,189.48L283.36,183.85C282.49,183.54 281.54,183.54 280.66,183.85L265.14,189.48C263.56,190.07 262.52,191.56 262.52,193.25V203.97C262.56,205.8 262.68,207.57 262.93,209.4C264.07,217.18 268.46,226.02 280.46,232.19C281.41,232.68 282.56,232.68 283.51,232.19C295.52,225.99 299.9,217.18 301.05,209.4C301.29,207.59 301.43,205.8 301.46,203.97V193.25H301.48Z"
-        android:fillColor="#000000"/>
-    <path
-        android:pathData="M291.62,222.69C291.74,222.13 292.45,218.26 290.38,214.37C289.21,212.19 287.7,210.92 285.63,209.28C284.21,208.18 280.46,205.76 279.52,205.17C279.56,205.19 279.64,205.27 279.68,205.29C279.17,204.97 279.2,204.97 279.52,205.17C278.47,204.46 276.67,203.04 275.3,200.59C273.67,197.68 273.62,194.96 273.62,194.45C273.62,194.4 273.62,194.38 273.62,194.33C273.62,191.05 274.64,188.5 276.27,186.67C277.49,185.3 278.88,184.51 280.05,184.05L265.14,189.48C263.56,190.04 262.52,191.56 262.52,193.25V203.97C262.56,205.8 262.68,207.57 262.93,209.4C264.07,217.18 268.46,226.02 280.46,232.18C281.41,232.68 282.56,232.68 283.51,232.18C284.63,231.62 285.65,231.01 286.63,230.4C288.14,229.27 290.79,226.78 291.6,222.69H291.62Z"
-        android:fillColor="#3957E2"/>
-    <path
-        android:pathData="M279.69,205.29C279.69,205.29 279.57,205.19 279.52,205.17C279.2,204.97 279.17,204.97 279.69,205.29Z"
-        android:fillColor="#000000"/>
-    <path
-        android:pathData="M298.85,189.48L283.36,183.85C282.48,183.54 281.54,183.54 280.66,183.85L280.05,184.07C278.9,184.54 277.49,185.32 276.27,186.69C274.64,188.53 273.62,191.07 273.62,194.35C273.62,194.4 273.62,194.43 273.62,194.48C273.62,194.99 273.69,197.71 275.3,200.62C276.66,203.06 278.44,204.46 279.51,205.19C280.46,205.8 284.21,208.2 285.63,209.3C287.7,210.94 289.23,212.22 290.38,214.4C292.45,218.26 291.72,222.15 291.62,222.71C290.82,226.8 288.16,229.27 286.65,230.42C296.3,224.4 300.02,216.48 301.07,209.43C301.31,207.62 301.46,205.83 301.48,203.99V193.25C301.48,191.56 300.43,190.07 298.85,189.48Z"
-        android:fillColor="#698FF7"/>
-    <path
-        android:pathData="M157.35,137.23C157.97,136.58 158.83,136.2 159.73,136.17C160.63,136.14 161.5,136.47 162.16,137.08L162.31,137.22L163.18,138.14C163.57,138.57 164.07,138.88 164.62,139.06C165.17,139.24 165.76,139.26 166.32,139.15L167.53,138.91C168.42,138.74 169.34,138.93 170.09,139.44C170.84,139.95 171.36,140.73 171.54,141.61C171.54,141.68 171.55,141.74 171.59,141.8L171.73,143.06C171.8,143.62 172.01,144.17 172.35,144.63C172.69,145.09 173.14,145.46 173.66,145.7L174.77,146.27C175.58,146.66 176.21,147.36 176.52,148.2C176.83,149.05 176.79,149.98 176.41,150.8C176.37,150.84 176.37,150.94 176.32,150.99L175.74,152.05C175.45,152.55 175.3,153.11 175.3,153.69C175.3,154.26 175.46,154.82 175.74,155.32L176.32,156.43C176.74,157.22 176.84,158.16 176.58,159.02C176.32,159.89 175.73,160.62 174.94,161.06C174.89,161.1 174.8,161.1 174.75,161.15L173.63,161.68C173.11,161.92 172.66,162.29 172.32,162.76C171.99,163.22 171.77,163.76 171.71,164.33L171.56,165.59C171.44,166.48 170.97,167.28 170.26,167.84C169.54,168.38 168.64,168.63 167.74,168.53C167.68,168.54 167.61,168.52 167.55,168.48L166.38,168.24C165.82,168.15 165.23,168.19 164.69,168.36C164.14,168.54 163.64,168.85 163.24,169.25L162.39,170.13C161.76,170.78 160.91,171.16 160.01,171.19C159.11,171.22 158.23,170.89 157.57,170.28L157.43,170.14L156.55,169.22C156.16,168.8 155.66,168.49 155.1,168.31C154.54,168.14 153.95,168.12 153.39,168.25L152.18,168.49C151.29,168.66 150.37,168.47 149.62,167.96C148.87,167.46 148.35,166.67 148.17,165.79C148.18,165.72 148.16,165.65 148.12,165.6L147.98,164.34C147.91,163.77 147.7,163.23 147.36,162.77C147.02,162.3 146.57,161.93 146.05,161.69L144.94,161.16C144.53,160.97 144.16,160.7 143.85,160.37C143.55,160.03 143.32,159.64 143.16,159.21C143.01,158.78 142.94,158.33 142.96,157.88C142.99,157.43 143.1,156.99 143.3,156.58C143.34,156.53 143.34,156.44 143.39,156.39L143.97,155.28C144.26,154.78 144.4,154.22 144.4,153.65C144.4,153.07 144.26,152.51 143.97,152.01L143.39,150.9C142.97,150.1 142.88,149.17 143.13,148.3C143.39,147.44 143.98,146.71 144.77,146.28C144.82,146.23 144.91,146.23 144.96,146.18L146.08,145.65C146.6,145.41 147.05,145.04 147.39,144.57C147.72,144.11 147.94,143.57 148,143L148.15,141.75C148.27,140.86 148.74,140.05 149.46,139.5C150.17,138.95 151.07,138.7 151.97,138.81C152.04,138.8 152.1,138.82 152.16,138.86L153.37,139.1C153.93,139.19 154.51,139.15 155.06,138.97C155.6,138.8 156.1,138.49 156.5,138.09L157.35,137.24L157.35,137.23Z"
-        android:fillColor="#EE675C"/>
-    <path
-        android:pathData="M165.34,152.63L157.4,148.13C156.85,147.86 156.31,147.99 156.04,148.54C155.9,148.68 155.9,148.81 155.9,149.09V158.08C155.9,158.63 156.31,159.04 156.85,159.04C156.99,159.04 157.27,159.04 157.4,158.9L165.2,154.4C165.75,154.13 165.89,153.58 165.61,153.04C165.61,152.9 165.47,152.77 165.34,152.63Z"
-        android:fillColor="#ffffff"/>
-    <path
-        android:pathData="M236.54,176.53L226.88,171.29C226.21,170.97 225.55,171.13 225.22,171.77C225.05,171.93 225.05,172.09 225.05,172.4V182.89C225.05,183.53 225.55,184.01 226.21,184.01C226.39,184.01 226.72,184.01 226.88,183.85L236.37,178.6C237.04,178.28 237.21,177.65 236.87,177.01C236.87,176.85 236.7,176.7 236.54,176.53Z"
-        android:fillColor="#3C4043"/>
-    <path
-        android:pathData="M148.49,207.01C143.41,207.01 139.27,202.88 139.27,197.81C139.27,192.74 143.41,188.61 148.49,188.61C153.58,188.61 157.72,192.74 157.72,197.81C157.72,202.88 153.58,207.01 148.49,207.01Z"
-        android:fillColor="#3C4043"/>
-    <path
-        android:pathData="M224.65,129.5L213.61,128.09C212.49,127.95 211.34,128.11 210.3,128.56C209.26,129 208.34,129.71 207.66,130.61L200.9,139.5C200.21,140.4 199.78,141.48 199.63,142.61C199.49,143.74 199.65,144.89 200.09,145.93L204.37,156.22C204.81,157.27 205.52,158.18 206.42,158.87C207.33,159.55 208.4,159.99 209.52,160.13L220.56,161.52C221.69,161.67 222.83,161.51 223.88,161.07C224.93,160.63 225.84,159.92 226.53,159.01L233.26,150.14C233.95,149.23 234.39,148.16 234.53,147.03C234.67,145.9 234.52,144.75 234.08,143.7L229.79,133.42C229.35,132.37 228.65,131.45 227.74,130.76C226.84,130.07 225.77,129.64 224.65,129.5Z"
-        android:fillColor="#FCC934"/>
-    <path
-        android:pathData="M210.34,150.41L223.25,151.73L224.57,138.86L211.66,137.54L210.34,150.41ZM210.15,152.25C209.65,152.2 209.23,151.98 208.9,151.58C208.58,151.18 208.45,150.73 208.5,150.23L209.82,137.35C209.87,136.85 210.09,136.43 210.49,136.11C210.89,135.78 211.34,135.65 211.85,135.7L224.76,137.02C225.26,137.07 225.68,137.29 226.01,137.69C226.33,138.09 226.46,138.54 226.41,139.04L225.09,151.92C225.04,152.43 224.82,152.84 224.42,153.16C224.02,153.49 223.57,153.62 223.06,153.57L210.15,152.25ZM211.45,148.67L222.51,149.8L219.53,144.85L216.38,148.24L214.59,145.27L211.45,148.67L211.45,148.67ZM211.66,137.54L210.34,150.41L211.66,137.54Z"
-        android:fillColor="#ffffff"/>
-    <path
-        android:pathData="M178.53,187.68C174.35,181.53 179.88,173.46 187.15,175.11L188.35,175.38C190.56,175.88 192.89,175.44 194.77,174.17L195.79,173.48C201.96,169.32 210.05,174.84 208.4,182.08L208.13,183.28C207.62,185.49 208.06,187.81 209.34,189.69L210.02,190.7C214.2,196.85 208.67,204.93 201.41,203.28L200.21,203.01C197.99,202.5 195.66,202.94 193.78,204.21L192.76,204.9C186.6,209.07 178.5,203.55 180.15,196.3L180.43,195.1C180.93,192.9 180.5,190.57 179.22,188.7L178.53,187.68L178.53,187.68Z"
-        android:fillColor="#5BB974"/>
-    <path
-        android:pathData="M189.5,195.21C190.11,194.34 190.86,193.6 191.77,192.99C192.68,192.39 193.71,191.98 194.85,191.76C196,191.55 197.1,191.55 198.17,191.78C199.24,192.01 200.21,192.42 201.1,193.01L199.08,182.41L187.48,184.61L189.5,195.21ZM194.54,190.11C195.33,189.96 195.97,189.54 196.42,188.87C196.88,188.2 197.04,187.46 196.88,186.67C196.73,185.88 196.32,185.24 195.65,184.79C194.98,184.34 194.23,184.18 193.43,184.33C192.64,184.48 192,184.89 191.55,185.57C191.09,186.24 190.93,186.97 191.09,187.77C191.24,188.56 191.65,189.2 192.33,189.65C192.99,190.1 193.74,190.26 194.54,190.11ZM189.99,197.8C189.54,197.89 189.12,197.8 188.73,197.54C188.34,197.28 188.11,196.92 188.02,196.47L185.82,184.92C185.74,184.46 185.83,184.04 186.09,183.66C186.35,183.27 186.71,183.04 187.16,182.95L198.76,180.76C199.22,180.67 199.64,180.76 200.02,181.02C200.41,181.28 200.65,181.63 200.73,182.09L202.93,193.64C203.02,194.1 202.93,194.51 202.67,194.9C202.4,195.29 202.05,195.52 201.59,195.6L189.99,197.8ZM189.68,196.15L201.28,193.96L201.1,193C200.21,192.41 199.24,192.01 198.17,191.77C197.1,191.55 195.99,191.54 194.85,191.76C193.7,191.97 192.68,192.38 191.77,192.99C190.86,193.59 190.1,194.33 189.5,195.2L189.68,196.15ZM189.5,195.21L187.48,184.61L199.08,182.41L201.1,193.01C200.21,192.42 199.24,192.01 198.17,191.78C197.1,191.55 196,191.55 194.85,191.76C193.71,191.98 192.68,192.39 191.77,192.99C190.86,193.6 190.11,194.34 189.5,195.21Z"
-        android:fillColor="#ffffff"/>
-</vector>
diff --git a/res/drawable/privatespace_setup_flow_placeholder.xml b/res/drawable/privatespace_setup_flow_placeholder.xml
deleted file mode 100644
index a4ff125..0000000
--- a/res/drawable/privatespace_setup_flow_placeholder.xml
+++ /dev/null
@@ -1,48 +0,0 @@
-<!--
-  ~ Copyright (C) 2023 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-
-<vector android:height="265dp" android:viewportHeight="266"
-        android:viewportWidth="364" android:width="362.6316dp" xmlns:android="http://schemas.android.com/apk/res/android">
-    <group>
-        <clip-path android:pathData="M0,0.5h364v265h-364z"/>
-        <path android:fillColor="#000000" android:pathData="M339.42,265.5H24.58C11.07,265.5 0,254.17 0,240.34V25.69C0,11.83 11.07,0.5 24.58,0.5H339.52C352.93,0.5 364,11.83 364,25.66V240.44C364,254.17 352.93,265.5 339.42,265.5Z"/>
-        <path android:fillColor="#80868B" android:pathData="M242.66,86.8V78.4C242.66,77.85 242.44,77.31 242.05,76.92C241.66,76.52 241.12,76.3 240.57,76.3V32.2C240.57,29.42 239.46,26.75 237.49,24.78C235.52,22.81 232.85,21.7 230.06,21.7H133.41C130.62,21.7 127.95,22.81 125.98,24.78C124.01,26.75 122.9,29.42 122.9,32.2V233.8C122.9,236.58 124.01,239.25 125.98,241.22C127.95,243.19 130.62,244.3 133.41,244.3H230.06C232.85,244.3 235.52,243.19 237.49,241.22C239.46,239.25 240.57,236.58 240.57,233.8V130.9C241.12,130.9 241.65,130.68 242.05,130.29C242.44,129.89 242.66,129.36 242.66,128.8V107.8C242.66,107.24 242.44,106.71 242.05,106.32C241.66,105.92 241.12,105.7 240.57,105.7V88.91C240.84,88.91 241.12,88.86 241.37,88.75C241.63,88.64 241.86,88.49 242.05,88.29C242.25,88.1 242.4,87.86 242.5,87.61C242.61,87.35 242.66,87.08 242.66,86.8ZM238.46,233.8C238.46,236.02 237.58,238.16 236,239.74C234.43,241.31 232.29,242.2 230.06,242.2H133.41C131.18,242.2 129.04,241.31 127.47,239.74C125.89,238.16 125.01,236.02 125.01,233.8V32.2C125.01,29.98 125.89,27.84 127.47,26.27C129.04,24.69 131.18,23.8 133.41,23.8H230.06C232.29,23.8 234.43,24.69 236,26.27C237.58,27.84 238.46,29.98 238.46,32.2V233.8Z"/>
-        <path android:fillColor="#669DF6" android:pathData="M234.93,233.8C234.93,235.09 234.42,236.33 233.5,237.24C232.59,238.15 231.35,238.66 230.06,238.66H133.41C132.12,238.66 130.88,238.15 129.97,237.24C129.05,236.33 128.54,235.09 128.54,233.8V129.24H125.01V233.8C125.01,236.02 125.89,238.16 127.47,239.74C129.04,241.31 131.18,242.2 133.41,242.2H230.06C232.29,242.2 234.43,241.31 236,239.74C237.58,238.16 238.46,236.02 238.46,233.8V190.74H234.93V233.8Z"/>
-        <path android:fillColor="#A142F4" android:pathData="M230.06,23.8H133.41C131.18,23.8 129.04,24.69 127.47,26.26C125.89,27.84 125.01,29.97 125.01,32.2V129.24H128.54V32.2C128.54,30.91 129.05,29.67 129.97,28.76C130.88,27.85 132.12,27.34 133.41,27.34H230.06C231.35,27.34 232.59,27.85 233.5,28.76C234.42,29.67 234.93,30.91 234.93,32.2V190.74H238.46V32.2C238.46,29.97 237.58,27.84 236,26.26C234.43,24.69 232.29,23.8 230.06,23.8Z"/>
-        <path android:fillColor="#5BB974" android:pathData="M214.09,181.98H205.99C204.24,181.98 202.53,182.5 201.08,183.47C199.63,184.45 198.51,185.83 197.85,187.45C197.2,189.07 197.04,190.84 197.39,192.55C197.75,194.26 198.61,195.82 199.86,197.04L205.38,202.56L208.4,199.54H214.09C216.42,199.54 218.65,198.62 220.3,196.97C221.95,195.32 222.87,193.09 222.87,190.76C222.87,188.43 221.95,186.2 220.3,184.55C218.65,182.91 216.42,181.98 214.09,181.98Z"/>
-        <path android:fillColor="#000000" android:pathData="M204.83,192.48C205.78,192.48 206.54,191.71 206.54,190.76C206.54,189.82 205.78,189.05 204.83,189.05C203.88,189.05 203.12,189.82 203.12,190.76C203.12,191.71 203.88,192.48 204.83,192.48Z"/>
-        <path android:fillColor="#000000" android:pathData="M210.04,192.48C210.99,192.48 211.76,191.71 211.76,190.76C211.76,189.82 210.99,189.05 210.04,189.05C209.1,189.05 208.33,189.82 208.33,190.76C208.33,191.71 209.1,192.48 210.04,192.48Z"/>
-        <path android:fillColor="#000000" android:pathData="M215.25,192.48C216.19,192.48 216.96,191.71 216.96,190.76C216.96,189.82 216.19,189.05 215.25,189.05C214.3,189.05 213.53,189.82 213.53,190.76C213.53,191.71 214.3,192.48 215.25,192.48Z"/>
-        <path android:fillColor="#FCC934" android:pathData="M165.98,61.94H155.68C155.38,61.94 155.08,62 154.79,62.12C154.51,62.24 154.26,62.41 154.04,62.62C153.83,62.84 153.66,63.09 153.54,63.37C153.43,63.65 153.37,63.95 153.37,64.26V85.11C153.37,85.41 153.43,85.71 153.54,85.99C153.66,86.27 153.83,86.53 154.04,86.74C154.26,86.96 154.51,87.13 154.79,87.24C155.08,87.36 155.38,87.42 155.68,87.42H170C170.61,87.41 171.19,87.16 171.62,86.73C172.04,86.3 172.28,85.71 172.28,85.11V68.32L165.98,61.94Z"/>
-        <path android:fillColor="#000000" android:pathData="M168.63,72.01H157.05V74.33H168.63V72.01Z"/>
-        <path android:fillColor="#000000" android:pathData="M168.63,76.64H157.05V78.96H168.63V76.64Z"/>
-        <path android:fillColor="#000000" android:pathData="M168.63,81.28H157.05V83.6H168.63V81.28Z"/>
-        <path android:fillColor="#FEEFC3" android:pathData="M165.98,61.94V66.43C165.98,66.67 166.03,66.92 166.12,67.14C166.21,67.37 166.35,67.57 166.52,67.74C166.69,67.92 166.9,68.05 167.12,68.15C167.35,68.24 167.59,68.29 167.83,68.29H172.28L165.98,61.94Z"/>
-        <path android:fillColor="#FAD2CF" android:pathData="M206.01,53.5L201.44,61.45C201.29,61.7 201.21,61.99 201.22,62.28C201.22,62.58 201.29,62.86 201.44,63.12C201.59,63.37 201.8,63.58 202.05,63.73C202.31,63.87 202.59,63.95 202.89,63.95H212.04C212.33,63.95 212.62,63.87 212.87,63.73C213.13,63.58 213.34,63.37 213.49,63.12C213.63,62.86 213.71,62.58 213.71,62.28C213.71,61.99 213.63,61.7 213.48,61.45L208.9,53.5C208.76,53.25 208.54,53.04 208.29,52.89C208.04,52.74 207.75,52.67 207.46,52.67C207.16,52.67 206.88,52.74 206.62,52.89C206.37,53.04 206.16,53.25 206.01,53.5Z"/>
-        <path android:fillColor="#3C4043" android:pathData="M201.8,218.33L209.86,210.27C209.96,210.16 210.09,210.08 210.23,210.02C210.37,209.96 210.52,209.93 210.67,209.93C210.82,209.93 210.97,209.96 211.11,210.02C211.25,210.08 211.37,210.16 211.48,210.27L211.76,210.55C213.05,211.84 213.77,213.58 213.77,215.39C213.77,217.21 213.05,218.95 211.76,220.23C210.48,221.52 208.74,222.24 206.92,222.24C205.1,222.24 203.36,221.52 202.08,220.23L201.8,219.95C201.58,219.74 201.46,219.45 201.46,219.14C201.46,218.84 201.58,218.54 201.8,218.33Z"/>
-        <path android:fillColor="#3C4043" android:pathData="M200.11,90.52C202.66,90.52 204.73,88.45 204.73,85.9C204.73,83.35 202.66,81.28 200.11,81.28C197.56,81.28 195.49,83.35 195.49,85.9C195.49,88.45 197.56,90.52 200.11,90.52Z"/>
-        <path android:fillColor="#A142F4" android:pathData="M203.2,134.48C203.2,128.79 200.94,123.34 196.92,119.31C192.89,115.29 187.43,113.03 181.74,113.03V117.32C184.94,117.31 188.08,118.2 190.79,119.88C193.51,121.57 195.71,123.98 197.13,126.84C198.55,129.7 199.14,132.91 198.83,136.09C198.53,139.27 197.34,142.3 195.39,144.85C192.33,141.12 184.88,139.85 181.74,139.85V155.97C184.56,155.96 187.36,155.41 189.96,154.33C192.57,153.25 194.93,151.66 196.93,149.67C198.92,147.68 200.5,145.31 201.58,142.7C202.65,140.1 203.21,137.3 203.2,134.48Z"/>
-        <path android:fillColor="#A142F4" android:pathData="M189.26,129.12C189.26,128.14 189.07,127.16 188.7,126.25C188.32,125.33 187.77,124.51 187.07,123.81C186.37,123.11 185.54,122.56 184.63,122.18C183.72,121.81 182.74,121.61 181.75,121.61V136.63C182.74,136.63 183.72,136.44 184.63,136.06C185.54,135.69 186.37,135.13 187.07,134.44C187.77,133.74 188.32,132.91 188.7,132C189.07,131.09 189.26,130.11 189.26,129.12Z"/>
-        <path android:fillColor="#3C4043" android:pathData="M159.53,166.93H151.85C148.29,166.93 145.41,169.81 145.41,173.37C145.41,176.93 148.29,179.81 151.85,179.81H159.53C163.09,179.81 165.97,176.93 165.97,173.37C165.97,169.81 163.09,166.93 159.53,166.93Z"/>
-        <path android:fillColor="#FAD2CF" android:pathData="M164.93,198.9V197.48H163.16V198.89H152.85V197.48H151.08V198.9C150.56,198.9 150.07,199.11 149.71,199.48C149.35,199.84 149.15,200.34 149.15,200.85V214.61C149.15,214.87 149.2,215.13 149.3,215.36C149.4,215.6 149.54,215.82 149.72,216C149.9,216.19 150.12,216.33 150.36,216.43C150.6,216.53 150.85,216.58 151.11,216.58H164.88C165.4,216.58 165.9,216.37 166.27,216C166.64,215.63 166.85,215.13 166.85,214.61V200.85C166.85,200.34 166.64,199.85 166.29,199.48C165.93,199.12 165.44,198.91 164.93,198.9Z"/>
-        <path android:fillColor="#000000" android:pathData="M164.27,202.78H151.76C151.39,202.78 151.1,203.08 151.1,203.45V213.99C151.1,214.36 151.39,214.65 151.76,214.65H164.27C164.63,214.65 164.93,214.36 164.93,213.99V203.45C164.93,203.08 164.63,202.78 164.27,202.78Z"/>
-        <path android:fillColor="#EE675C" android:pathData="M156.79,205.13H152.85V207.73H156.79V205.13Z"/>
-        <path android:fillColor="#669DF6" android:pathData="M168.62,117.83C168.03,117.83 167.45,117.95 166.9,118.18C166.35,118.4 165.85,118.73 165.44,119.15C165.02,119.57 164.69,120.07 164.47,120.62C164.24,121.17 164.13,121.75 164.14,122.35V147.17C164.13,147.76 164.25,148.35 164.48,148.9C164.7,149.44 165.04,149.94 165.46,150.36C165.88,150.78 166.37,151.11 166.92,151.34C167.47,151.56 168.06,151.68 168.65,151.67H175.97V117.83H168.62Z"/>
-        <path android:fillColor="#80868B" android:pathData="M182.95,259.5C182.95,260.32 182.63,261.11 182.05,261.69C181.47,262.27 180.68,262.59 179.86,262.59C179.04,262.59 178.26,262.27 177.68,261.69C177.1,261.11 176.77,260.32 176.77,259.5V12.75C176.77,11.93 177.1,11.15 177.68,10.57C178.26,9.99 179.04,9.66 179.86,9.66C180.68,9.66 181.47,9.99 182.05,10.57C182.63,11.15 182.95,11.93 182.95,12.75"/>
-        <path android:fillColor="#000000" android:pathData="M179.86,10.99C180.33,10.99 180.78,11.17 181.11,11.5C181.44,11.83 181.63,12.28 181.63,12.75V259.5C181.63,259.97 181.44,260.42 181.11,260.75C180.78,261.08 180.33,261.27 179.86,261.27C179.39,261.27 178.94,261.08 178.61,260.75C178.28,260.42 178.1,259.97 178.1,259.5V12.75C178.1,12.28 178.28,11.83 178.61,11.5C178.94,11.17 179.39,10.99 179.86,10.99ZM179.86,8.34C178.69,8.34 177.57,8.8 176.74,9.63C175.91,10.46 175.44,11.58 175.44,12.75V259.5C175.44,260.67 175.91,261.8 176.74,262.63C177.57,263.45 178.69,263.92 179.86,263.92C181.03,263.92 182.16,263.45 182.99,262.63C183.81,261.8 184.28,260.67 184.28,259.5V12.75C184.28,11.58 183.81,10.46 182.99,9.63C182.16,8.8 181.03,8.34 179.86,8.34Z"/>
-        <path android:fillColor="#ffffff" android:pathData="M70.76,140V124.25H72.63V140H70.76ZM75.78,140V124.25H77.65V140H75.78ZM80.42,140V124.25H82.29V140H80.42ZM89.13,140.35C87.75,140.35 86.71,139.95 86.01,139.15C85.32,138.34 84.97,137.24 84.97,135.85V128.78H86.84V135.56C86.84,136.67 87.1,137.47 87.61,137.96C88.13,138.43 88.76,138.66 89.53,138.66C90.19,138.66 90.76,138.49 91.24,138.15C91.73,137.8 92.1,137.36 92.36,136.81C92.63,136.27 92.76,135.71 92.76,135.12V128.78H94.63V140H92.85V138.38H92.76C92.57,138.73 92.28,139.06 91.9,139.37C91.54,139.66 91.11,139.89 90.63,140.07C90.16,140.26 89.66,140.35 89.13,140.35ZM101.2,140.35C100.36,140.35 99.62,140.22 98.98,139.96C98.35,139.68 97.82,139.31 97.39,138.86C96.98,138.39 96.68,137.88 96.47,137.34L98.14,136.59C98.44,137.27 98.86,137.79 99.42,138.15C99.98,138.52 100.61,138.71 101.33,138.71C102.02,138.71 102.59,138.57 103.05,138.29C103.52,138.01 103.75,137.6 103.75,137.05C103.75,136.72 103.66,136.44 103.47,136.22C103.28,135.98 103,135.79 102.63,135.63C102.26,135.46 101.82,135.32 101.29,135.18L99.92,134.83C99.4,134.69 98.9,134.48 98.43,134.22C97.96,133.95 97.58,133.62 97.28,133.21C97.01,132.78 96.87,132.27 96.87,131.66C96.87,130.99 97.06,130.41 97.46,129.93C97.86,129.44 98.38,129.08 99.02,128.83C99.67,128.56 100.36,128.43 101.09,128.43C101.74,128.43 102.34,128.53 102.89,128.72C103.47,128.89 103.96,129.16 104.39,129.53C104.82,129.88 105.14,130.32 105.36,130.85L103.73,131.6C103.45,131.04 103.08,130.65 102.61,130.43C102.14,130.21 101.62,130.1 101.05,130.1C100.43,130.1 99.9,130.24 99.44,130.52C98.99,130.79 98.76,131.15 98.76,131.62C98.76,132.09 98.94,132.44 99.31,132.68C99.69,132.91 100.15,133.1 100.69,133.25L102.32,133.67C103.42,133.95 104.25,134.36 104.81,134.92C105.37,135.46 105.64,136.13 105.64,136.92C105.64,137.63 105.45,138.24 105.05,138.75C104.65,139.26 104.12,139.66 103.44,139.94C102.77,140.22 102.02,140.35 101.2,140.35ZM106.81,128.78H108.76V125.61H110.63V128.78H113.38V130.48H110.63V136.59C110.63,137.18 110.75,137.63 110.99,137.96C111.24,138.28 111.64,138.44 112.19,138.44C112.44,138.44 112.67,138.4 112.88,138.33C113.08,138.26 113.27,138.17 113.43,138.07V139.89C113.24,139.98 113.02,140.05 112.79,140.09C112.57,140.15 112.27,140.18 111.89,140.18C110.95,140.18 110.19,139.91 109.62,139.37C109.05,138.81 108.76,138.04 108.76,137.05V130.48H106.81V128.78ZM115.61,140V128.78H117.39V130.59H117.48C117.63,130.16 117.87,129.79 118.21,129.49C118.56,129.16 118.96,128.91 119.39,128.74C119.85,128.55 120.3,128.45 120.74,128.45C121.07,128.45 121.34,128.48 121.53,128.52C121.72,128.55 121.89,128.6 122.06,128.67V130.7C121.82,130.58 121.57,130.49 121.29,130.43C121.02,130.37 120.75,130.35 120.47,130.35C119.93,130.35 119.43,130.5 118.98,130.81C118.52,131.12 118.15,131.53 117.88,132.04C117.61,132.55 117.48,133.12 117.48,133.73V140H115.61ZM127.02,140.35C126.18,140.35 125.45,140.19 124.82,139.87C124.19,139.55 123.69,139.11 123.32,138.55C122.97,137.98 122.79,137.33 122.79,136.62C122.79,135.79 123.01,135.1 123.43,134.55C123.86,133.98 124.43,133.55 125.15,133.27C125.87,132.98 126.66,132.83 127.52,132.83C128.02,132.83 128.48,132.88 128.91,132.96C129.33,133.04 129.7,133.13 130.01,133.25C130.33,133.35 130.57,133.45 130.74,133.56V132.88C130.74,132.02 130.43,131.35 129.83,130.85C129.23,130.35 128.5,130.1 127.63,130.1C127.02,130.1 126.44,130.24 125.89,130.52C125.37,130.79 124.95,131.16 124.64,131.64L123.23,130.59C123.53,130.15 123.89,129.77 124.33,129.44C124.77,129.12 125.27,128.87 125.83,128.7C126.4,128.52 127,128.43 127.63,128.43C129.16,128.43 130.35,128.83 131.22,129.64C132.08,130.45 132.52,131.53 132.52,132.9V140H130.74V138.4H130.65C130.46,138.72 130.18,139.04 129.83,139.34C129.48,139.64 129.06,139.88 128.58,140.07C128.11,140.26 127.59,140.35 127.02,140.35ZM127.19,138.71C127.84,138.71 128.43,138.54 128.95,138.22C129.5,137.9 129.93,137.47 130.25,136.92C130.57,136.38 130.74,135.79 130.74,135.14C130.4,134.91 129.97,134.72 129.46,134.57C128.96,134.42 128.41,134.35 127.81,134.35C126.74,134.35 125.95,134.57 125.46,135.01C124.96,135.45 124.71,135.99 124.71,136.64C124.71,137.25 124.94,137.75 125.41,138.13C125.88,138.51 126.47,138.71 127.19,138.71ZM134.13,128.78H136.09V125.61H137.96V128.78H140.71V130.48H137.96V136.59C137.96,137.18 138.08,137.63 138.31,137.96C138.56,138.28 138.97,138.44 139.52,138.44C139.77,138.44 140,138.4 140.21,138.33C140.41,138.26 140.59,138.17 140.76,138.07V139.89C140.57,139.98 140.35,140.05 140.12,140.09C139.9,140.15 139.6,140.18 139.22,140.18C138.28,140.18 137.52,139.91 136.95,139.37C136.38,138.81 136.09,138.04 136.09,137.05V130.48H134.13V128.78ZM143.22,140V128.78H145.09V140H143.22ZM144.15,126.71C143.78,126.71 143.46,126.58 143.2,126.32C142.94,126.06 142.8,125.74 142.8,125.37C142.8,124.99 142.94,124.68 143.2,124.43C143.46,124.16 143.78,124.03 144.15,124.03C144.53,124.03 144.84,124.16 145.09,124.43C145.36,124.68 145.49,124.99 145.49,125.37C145.49,125.74 145.36,126.06 145.09,126.32C144.84,126.58 144.53,126.71 144.15,126.71ZM153.07,140.35C151.94,140.35 150.95,140.09 150.08,139.56C149.21,139.04 148.53,138.32 148.03,137.43C147.55,136.52 147.31,135.51 147.31,134.39C147.31,133.28 147.55,132.27 148.03,131.38C148.53,130.47 149.21,129.75 150.08,129.22C150.95,128.7 151.94,128.43 153.07,128.43C154.2,128.43 155.2,128.7 156.06,129.24C156.93,129.77 157.6,130.49 158.09,131.4C158.59,132.3 158.84,133.29 158.84,134.39C158.84,135.51 158.59,136.52 158.09,137.43C157.6,138.32 156.93,139.04 156.06,139.56C155.2,140.09 154.2,140.35 153.07,140.35ZM153.07,138.66C153.75,138.66 154.38,138.49 154.96,138.15C155.57,137.82 156.05,137.33 156.42,136.7C156.78,136.06 156.97,135.29 156.97,134.39C156.97,133.5 156.78,132.74 156.42,132.1C156.05,131.46 155.57,130.97 154.96,130.63C154.38,130.29 153.75,130.13 153.07,130.13C152.4,130.13 151.76,130.29 151.16,130.63C150.56,130.97 150.07,131.46 149.71,132.1C149.34,132.74 149.16,133.5 149.16,134.39C149.16,135.29 149.34,136.06 149.71,136.7C150.07,137.33 150.56,137.82 151.16,138.15C151.76,138.49 152.4,138.66 153.07,138.66ZM160.79,140V128.78H162.57V130.43H162.66C162.96,129.89 163.43,129.42 164.09,129.02C164.77,128.63 165.5,128.43 166.29,128.43C167.67,128.43 168.71,128.83 169.39,129.64C170.1,130.43 170.45,131.49 170.45,132.81V140H168.58V133.1C168.58,132.01 168.32,131.25 167.79,130.81C167.27,130.35 166.61,130.13 165.79,130.13C165.17,130.13 164.63,130.3 164.16,130.65C163.69,130.99 163.32,131.43 163.06,131.97C162.79,132.52 162.66,133.09 162.66,133.69V140H160.79ZM178.61,140V124.25H183.91C184.79,124.25 185.61,124.45 186.36,124.85C187.1,125.24 187.7,125.79 188.14,126.5C188.59,127.18 188.82,127.99 188.82,128.91C188.82,129.82 188.59,130.63 188.14,131.34C187.7,132.04 187.1,132.59 186.36,132.99C185.61,133.38 184.79,133.58 183.91,133.58H180.48V140H178.61ZM180.48,131.8H183.96C184.57,131.8 185.1,131.66 185.54,131.38C185.98,131.09 186.32,130.72 186.55,130.28C186.8,129.84 186.93,129.38 186.93,128.91C186.93,128.45 186.8,127.99 186.55,127.55C186.32,127.11 185.98,126.75 185.54,126.47C185.1,126.18 184.57,126.03 183.96,126.03H180.48V131.8ZM191.02,140V124.25H192.89V140H191.02ZM199.14,140.35C198.3,140.35 197.57,140.19 196.94,139.87C196.31,139.55 195.81,139.11 195.44,138.55C195.09,137.98 194.92,137.33 194.92,136.62C194.92,135.79 195.13,135.1 195.55,134.55C195.98,133.98 196.55,133.55 197.27,133.27C197.99,132.98 198.78,132.83 199.65,132.83C200.15,132.83 200.61,132.88 201.03,132.96C201.46,133.04 201.82,133.13 202.13,133.25C202.46,133.35 202.7,133.45 202.86,133.56V132.88C202.86,132.02 202.56,131.35 201.96,130.85C201.35,130.35 200.62,130.1 199.76,130.1C199.14,130.1 198.56,130.24 198.02,130.52C197.49,130.79 197.07,131.16 196.76,131.64L195.36,130.59C195.65,130.15 196.02,129.77 196.46,129.44C196.9,129.12 197.4,128.87 197.95,128.7C198.52,128.52 199.13,128.43 199.76,128.43C201.28,128.43 202.48,128.83 203.34,129.64C204.21,130.45 204.64,131.53 204.64,132.9V140H202.86V138.4H202.77C202.58,138.72 202.31,139.04 201.96,139.34C201.6,139.64 201.19,139.88 200.7,140.07C200.23,140.26 199.71,140.35 199.14,140.35ZM199.32,138.71C199.96,138.71 200.55,138.54 201.08,138.22C201.62,137.9 202.05,137.47 202.37,136.92C202.7,136.38 202.86,135.79 202.86,135.14C202.52,134.91 202.1,134.72 201.58,134.57C201.08,134.42 200.53,134.35 199.93,134.35C198.86,134.35 198.08,134.57 197.58,135.01C197.08,135.45 196.83,135.99 196.83,136.64C196.83,137.25 197.07,137.75 197.53,138.13C198,138.51 198.6,138.71 199.32,138.71ZM212.22,140.35C211.12,140.35 210.13,140.1 209.27,139.59C208.42,139.06 207.75,138.35 207.27,137.45C206.78,136.54 206.54,135.52 206.54,134.39C206.54,133.25 206.78,132.23 207.27,131.34C207.75,130.44 208.42,129.74 209.27,129.22C210.13,128.7 211.12,128.43 212.22,128.43C213.48,128.43 214.51,128.72 215.32,129.31C216.14,129.88 216.72,130.62 217.06,131.53L215.36,132.24C215.08,131.55 214.66,131.03 214.11,130.68C213.57,130.31 212.9,130.13 212.13,130.13C211.47,130.13 210.85,130.3 210.28,130.65C209.72,131.01 209.27,131.5 208.92,132.15C208.56,132.78 208.39,133.53 208.39,134.39C208.39,135.24 208.56,135.99 208.92,136.64C209.27,137.28 209.72,137.78 210.28,138.13C210.85,138.49 211.47,138.66 212.13,138.66C212.92,138.66 213.6,138.48 214.17,138.11C214.75,137.74 215.17,137.22 215.45,136.55L217.12,137.25C216.76,138.12 216.16,138.85 215.34,139.45C214.52,140.05 213.48,140.35 212.22,140.35ZM224.03,140.35C222.95,140.35 221.98,140.1 221.13,139.59C220.29,139.07 219.63,138.37 219.15,137.47C218.68,136.58 218.44,135.56 218.44,134.41C218.44,133.34 218.66,132.35 219.1,131.45C219.56,130.54 220.19,129.81 220.99,129.27C221.82,128.71 222.78,128.43 223.88,128.43C224.99,128.43 225.94,128.68 226.74,129.18C227.54,129.66 228.16,130.34 228.58,131.2C229.02,132.07 229.24,133.06 229.24,134.17C229.24,134.28 229.24,134.38 229.22,134.48C229.22,134.58 229.21,134.67 229.2,134.74H220.31C220.36,135.55 220.54,136.23 220.86,136.79C221.23,137.42 221.7,137.89 222.27,138.2C222.86,138.51 223.47,138.66 224.1,138.66C224.92,138.66 225.59,138.47 226.12,138.09C226.66,137.69 227.1,137.21 227.42,136.64L229,137.41C228.56,138.26 227.93,138.96 227.11,139.52C226.29,140.08 225.26,140.35 224.03,140.35ZM220.42,133.21H227.26C227.25,132.9 227.18,132.57 227.04,132.21C226.93,131.85 226.73,131.51 226.45,131.2C226.19,130.88 225.84,130.62 225.42,130.43C225.01,130.23 224.49,130.13 223.88,130.13C223.14,130.13 222.51,130.32 221.96,130.7C221.43,131.06 221.03,131.57 220.75,132.21C220.61,132.52 220.5,132.85 220.42,133.21ZM231.43,140V124.25H233.3V128.89L233.21,130.43H233.3C233.6,129.88 234.07,129.41 234.73,129.02C235.41,128.63 236.15,128.43 236.96,128.43C237.91,128.43 238.69,128.62 239.31,129C239.93,129.38 240.39,129.9 240.7,130.57C241,131.21 241.16,131.96 241.16,132.81V140H239.29V133.1C239.29,132.38 239.15,131.8 238.89,131.38C238.64,130.94 238.3,130.62 237.88,130.43C237.47,130.23 237.01,130.13 236.51,130.13C235.9,130.13 235.35,130.3 234.87,130.65C234.38,131.01 234,131.46 233.72,132.02C233.44,132.57 233.3,133.15 233.3,133.76V140H231.43ZM249.02,140.35C247.89,140.35 246.89,140.09 246.03,139.56C245.16,139.04 244.48,138.32 243.98,137.43C243.5,136.52 243.26,135.51 243.26,134.39C243.26,133.28 243.5,132.27 243.98,131.38C244.48,130.47 245.16,129.75 246.03,129.22C246.89,128.7 247.89,128.43 249.02,128.43C250.15,128.43 251.15,128.7 252.01,129.24C252.88,129.77 253.55,130.49 254.04,131.4C254.54,132.3 254.79,133.29 254.79,134.39C254.79,135.51 254.54,136.52 254.04,137.43C253.55,138.32 252.88,139.04 252.01,139.56C251.15,140.09 250.15,140.35 249.02,140.35ZM249.02,138.66C249.7,138.66 250.33,138.49 250.91,138.15C251.51,137.82 252,137.33 252.37,136.7C252.73,136.06 252.91,135.29 252.91,134.39C252.91,133.5 252.73,132.74 252.37,132.1C252,131.46 251.51,130.97 250.91,130.63C250.33,130.29 249.7,130.13 249.02,130.13C248.35,130.13 247.71,130.29 247.11,130.63C246.51,130.97 246.02,131.46 245.65,132.1C245.29,132.74 245.1,133.5 245.1,134.39C245.1,135.29 245.29,136.06 245.65,136.7C246.02,137.33 246.51,137.82 247.11,138.15C247.71,138.49 248.35,138.66 249.02,138.66ZM256.85,140V124.25H258.72V140H256.85ZM266.16,140.35C265.14,140.35 264.23,140.1 263.41,139.59C262.6,139.07 261.96,138.37 261.49,137.47C261.02,136.58 260.79,135.55 260.79,134.39C260.79,133.23 261.02,132.21 261.49,131.31C261.96,130.42 262.6,129.71 263.41,129.2C264.23,128.69 265.14,128.43 266.16,128.43C266.76,128.43 267.31,128.53 267.81,128.72C268.3,128.91 268.74,129.16 269.1,129.46C269.48,129.77 269.78,130.1 269.98,130.46H270.07L269.98,128.89V124.25H271.85V140H270.07V138.35H269.98C269.78,138.69 269.48,139.01 269.1,139.32C268.74,139.63 268.3,139.88 267.81,140.07C267.31,140.26 266.76,140.35 266.16,140.35ZM266.35,138.66C267,138.66 267.6,138.49 268.16,138.15C268.73,137.8 269.19,137.31 269.54,136.68C269.9,136.04 270.07,135.27 270.07,134.39C270.07,133.51 269.9,132.76 269.54,132.13C269.19,131.48 268.73,130.99 268.16,130.65C267.6,130.3 267,130.13 266.35,130.13C265.71,130.13 265.1,130.3 264.53,130.65C263.97,130.99 263.52,131.48 263.16,132.13C262.81,132.76 262.64,133.51 262.64,134.39C262.64,135.26 262.81,136.01 263.16,136.66C263.52,137.3 263.97,137.8 264.53,138.15C265.1,138.49 265.71,138.66 266.35,138.66ZM279.5,140.35C278.42,140.35 277.45,140.1 276.6,139.59C275.76,139.07 275.1,138.37 274.62,137.47C274.15,136.58 273.92,135.56 273.92,134.41C273.92,133.34 274.14,132.35 274.58,131.45C275.03,130.54 275.66,129.81 276.47,129.27C277.29,128.71 278.25,128.43 279.35,128.43C280.46,128.43 281.42,128.68 282.21,129.18C283.02,129.66 283.63,130.34 284.06,131.2C284.5,132.07 284.72,133.06 284.72,134.17C284.72,134.28 284.71,134.38 284.7,134.48C284.7,134.58 284.69,134.67 284.67,134.74H275.79C275.83,135.55 276.01,136.23 276.33,136.79C276.7,137.42 277.17,137.89 277.74,138.2C278.33,138.51 278.94,138.66 279.57,138.66C280.39,138.66 281.07,138.47 281.59,138.09C282.14,137.69 282.57,137.21 282.89,136.64L284.48,137.41C284.04,138.26 283.4,138.96 282.58,139.52C281.76,140.08 280.73,140.35 279.5,140.35ZM275.89,133.21H282.74C282.72,132.9 282.65,132.57 282.52,132.21C282.4,131.85 282.2,131.51 281.92,131.2C281.66,130.88 281.31,130.62 280.89,130.43C280.48,130.23 279.96,130.13 279.35,130.13C278.62,130.13 277.98,130.32 277.43,130.7C276.91,131.06 276.5,131.57 276.23,132.21C276.08,132.52 275.97,132.85 275.89,133.21ZM286.91,140V128.78H288.69V130.59H288.78C288.92,130.16 289.16,129.79 289.5,129.49C289.85,129.16 290.25,128.91 290.69,128.74C291.14,128.55 291.59,128.45 292.03,128.45C292.37,128.45 292.63,128.48 292.82,128.52C293.01,128.55 293.19,128.6 293.35,128.67V130.7C293.12,130.58 292.86,130.49 292.58,130.43C292.32,130.37 292.05,130.35 291.77,130.35C291.23,130.35 290.73,130.5 290.27,130.81C289.82,131.12 289.45,131.53 289.17,132.04C288.91,132.55 288.78,133.12 288.78,133.73V140H286.91Z"/>
-    </group>
-</vector>
diff --git a/res/layout/privatespace_advancing_screen.xml b/res/layout/private_space_advancing_screen.xml
similarity index 91%
rename from res/layout/privatespace_advancing_screen.xml
rename to res/layout/private_space_advancing_screen.xml
index 3a85b16..35d6462 100644
--- a/res/layout/privatespace_advancing_screen.xml
+++ b/res/layout/private_space_advancing_screen.xml
@@ -20,18 +20,18 @@
     android:id="@+id/private_space_autoadvance_screen"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
-    android:icon="@drawable/ic_privatespace_icon">
+    android:icon="@drawable/ic_private_space_icon">
     <LinearLayout style="@style/SudContentFrame"
                   android:layout_width="match_parent"
                   android:layout_height="match_parent"
                   android:orientation="vertical">
         <ImageView
-            android:id="@+id/placeholder_image"
+            android:id="@+id/setup_advance_image"
             android:layout_width="match_parent"
             android:layout_height="0dp"
             android:layout_weight="1"
             android:contentDescription="@null"
-            android:src="@drawable/privatespace_setup_flow_placeholder"/>
+            android:src="@null"/>
 
         <TextView
             android:id="@+id/createMessage"
diff --git a/res/layout/privatespace_education_screen.xml b/res/layout/private_space_education_screen.xml
similarity index 96%
rename from res/layout/privatespace_education_screen.xml
rename to res/layout/private_space_education_screen.xml
index 350e780..0f57e1e 100644
--- a/res/layout/privatespace_education_screen.xml
+++ b/res/layout/private_space_education_screen.xml
@@ -23,7 +23,7 @@
     android:filterTouchesWhenObscured="true"
     app:sucHeaderText="@string/private_space_setup_title"
     app:sudDescriptionText="@string/private_space_hide_apps_summary"
-    android:icon="@drawable/ic_privatespace_icon">
+    android:icon="@drawable/ic_private_space_icon">
     <ScrollView
         android:id="@+id/main_clear_scrollview"
         android:layout_width="match_parent"
@@ -34,13 +34,13 @@
         android:layout_height="wrap_content"
         android:orientation="vertical">
         <ImageView
-            android:id="@+id/placeholder_image"
+            android:id="@+id/setup_education_image"
             style="@style/SudContentIllustration"
             android:layout_width="match_parent"
             android:layout_marginLeft="24dp"
             android:layout_marginRight="24dp"
             android:layout_height="wrap_content"
-            android:src="@drawable/privatespace_placeholder_image"/>
+            android:src="@drawable/private_space_illustration"/>
         <TextView
             style="@style/PrivateSpaceSetupSubHeaderStyle"
             android:text="@string/private_space_how_title"/>
diff --git a/res/layout/privatespace_setlock_screen.xml b/res/layout/private_space_setlock_screen.xml
similarity index 95%
rename from res/layout/privatespace_setlock_screen.xml
rename to res/layout/private_space_setlock_screen.xml
index 7211948..64a2ff2 100644
--- a/res/layout/privatespace_setlock_screen.xml
+++ b/res/layout/private_space_setlock_screen.xml
@@ -37,7 +37,7 @@
             android:layout_height="match_parent"
             android:scaleType="fitCenter"
             android:contentDescription="@null"
-            android:src="@drawable/privatespace_lock_placeholder"/>
+            android:src="@drawable/private_space_choose_lock_illustration"/>
 
     </com.google.android.setupdesign.view.FillContentLayout>
 </com.google.android.setupdesign.GlifLayout>
\ No newline at end of file
diff --git a/res/layout/privatespace_setup_success.xml b/res/layout/private_space_setup_success.xml
similarity index 79%
rename from res/layout/privatespace_setup_success.xml
rename to res/layout/private_space_setup_success.xml
index e3e6b68..759373f 100644
--- a/res/layout/privatespace_setup_success.xml
+++ b/res/layout/private_space_setup_success.xml
@@ -24,4 +24,13 @@
     app:sucHeaderText="@string/private_space_success_title"
     app:sudDescriptionText="@string/private_space_access_text"
     android:icon="@drawable/ic_privatespace_done">
+
+    <ImageView
+        android:id="@+id/privatespace_success_image"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:layout_marginLeft="24dp"
+        android:layout_marginRight="24dp"
+        android:src="@drawable/private_space_illustration"/>
+
 </com.google.android.setupdesign.GlifLayout>
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index 3e0b8d9..4b96486 100755
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -473,4 +473,8 @@
 
     <!-- An arbitrarily large number to make the max size fit the parent -->
     <dimen name="animation_max_size">1000dp</dimen>
+
+    <!-- Credential Manager settings dimensions -->
+    <dimen name="credman_primary_provider_pref_left_padding">80dp</dimen>
+    <dimen name="credman_primary_provider_pref_left_padding_compact">24dp</dimen>
 </resources>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index f058e30..012ddc3 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -1268,7 +1268,7 @@
     <string name="privatespace_hide_page_summary">To stop other people knowing you have a private space on your device, you can hide it from your apps list</string>
     <!-- Header in hide Private Space settings page to access Private Space when hidden. [CHAR LIMIT=60] -->
     <string name="privatespace_access_header">Access private space when hidden</string>
-    <!-- Text in hide Private Space settings page on how to search Private Space when hidden. [CHAR LIMIT=60] -->
+    <!-- Text in hide Private Space settings page on how to search Private Space when hidden. [CHAR LIMIT=90] -->
     <string name="privatespace_search_description">From your apps list, enter \"private space\" in the search bar</string>
     <!-- Text in hide Private Space settings page to tap on Private Space tile. [CHAR LIMIT=60] -->
     <string name="privatespace_tap_tile_description">Tap the private space tile</string>
@@ -10802,6 +10802,8 @@
     <string name="credman_button_change">Change</string>
     <!-- Button for opening credman service settings. [CHAR LIMIT=40] -->
     <string name="credman_button_open">Open</string>
+    <!-- Label for None item in Credential Manager service selection [CHAR LIMIT=40] -->
+    <string name="credman_app_list_preference_none">None selected</string>
 
     <!-- Message of the warning dialog for setting the auto-fill app. [CHAR_LIMIT=NONE] -->
     <string name="autofill_confirmation_message">
@@ -12010,6 +12012,11 @@
     <!-- Keywords for the media controls setting [CHAR LIMIT=NONE]-->
     <string name="keywords_media_controls">media</string>
 
+    <!-- Title of toggle to enable or disable the media resumption on lockscreen [CHAR LIMIT=NONE]-->
+    <string name="camera_extensions_fallback_title">Allow camera software extensions</string>
+    <!-- Description of toggle to enable or disable the media resumption on lockscreen [CHAR LIMIT=NONE]-->
+    <string name="camera_extensions_fallback_description">Enables the default software implementation of advanced camera features, such as Eyes Free videography.</string>
+
     <!-- Summary for see all preference when bluetooth is disable [CHAR LIMIT=none]-->
     <string name="connected_device_see_all_summary">Bluetooth will turn on</string>
 
diff --git a/res/xml/more_security_privacy_settings.xml b/res/xml/more_security_privacy_settings.xml
index 5cd60f0..92c3fa7 100644
--- a/res/xml/more_security_privacy_settings.xml
+++ b/res/xml/more_security_privacy_settings.xml
@@ -93,6 +93,14 @@
             settings:controller=
                 "com.android.settings.sound.MediaControlsLockScreenPreferenceController" />
 
+        <!-- Allow software fallback for camera extensions -->
+        <SwitchPreference
+            android:key="privacy_camera_extensions_fallback"
+            android:title="@string/camera_extensions_fallback_title"
+            android:summary="@string/camera_extensions_fallback_description"
+            settings:controller=
+                "com.android.settings.privacy.CameraExtensionsFallbackPreferenceController" />
+
         <!-- Content Capture -->
         <!-- NOTE: content capture has a different preference, depending whether or not the
              ContentCaptureService implementations defines a custom settings activitiy on its manifest.
diff --git a/res/xml/private_space_settings.xml b/res/xml/private_space_settings.xml
index a3dfbf2..0ed9c93 100644
--- a/res/xml/private_space_settings.xml
+++ b/res/xml/private_space_settings.xml
@@ -23,9 +23,9 @@
     settings:searchable="false">
 
     <com.android.settingslib.widget.IllustrationPreference
-        android:key="privatespace_hide_video"
+        android:key="private_space_settings"
         settings:searchable="false"
-        settings:lottie_rawRes="@drawable/privatespace_placeholder_image"/>
+        settings:lottie_rawRes="@drawable/private_space_illustration"/>
 
     <Preference
         android:key="private_space_description"
diff --git a/src/com/android/settings/applications/AppStateClonedAppsBridge.java b/src/com/android/settings/applications/AppStateClonedAppsBridge.java
index 719023d1..de0251d 100644
--- a/src/com/android/settings/applications/AppStateClonedAppsBridge.java
+++ b/src/com/android/settings/applications/AppStateClonedAppsBridge.java
@@ -76,7 +76,8 @@
     protected void updateExtraInfo(AppEntry app, String pkg, int uid) {
         // Display package if allowlisted but not yet cloned.
         // Or if the app is present in clone profile alongwith being in allowlist.
-        if (mAllowedApps.contains(pkg) && ((!mCloneProfileApps.contains(pkg) || (app.isCloned)))) {
+        if (mAllowedApps.contains(pkg)
+                && ((!mCloneProfileApps.contains(pkg) || (app.isClonedProfile())))) {
             app.extraInfo = Boolean.TRUE;
         } else {
             app.extraInfo = Boolean.FALSE;
diff --git a/src/com/android/settings/applications/credentials/CredentialManagerPreferenceController.java b/src/com/android/settings/applications/credentials/CredentialManagerPreferenceController.java
index d98bc51..be0658e 100644
--- a/src/com/android/settings/applications/credentials/CredentialManagerPreferenceController.java
+++ b/src/com/android/settings/applications/credentials/CredentialManagerPreferenceController.java
@@ -568,7 +568,7 @@
      */
     @VisibleForTesting
     public boolean togglePackageNameEnabled(String packageName) {
-        if (mEnabledPackageNames.size() >= MAX_SELECTABLE_PROVIDERS) {
+        if (hasProviderLimitBeenReached()) {
             return false;
         } else {
             mEnabledPackageNames.add(packageName);
@@ -623,6 +623,19 @@
         return mIconResizer.createIconThumbnail(providerIcon);
     }
 
+    private boolean hasProviderLimitBeenReached() {
+        return hasProviderLimitBeenReached(mEnabledPackageNames.size());
+    }
+
+    @VisibleForTesting
+    public static boolean hasProviderLimitBeenReached(int enabledAdditionalProviderCount) {
+        // If the number of package names has reached the maximum limit then
+        // we should stop any new packages from being added. We will also
+        // reserve one place for the primary provider so if the max limit is
+        // five providers this will be four additional plus the primary.
+        return (enabledAdditionalProviderCount + 1) >= MAX_SELECTABLE_PROVIDERS;
+    }
+
     private CombiPreference addProviderPreference(
             @NonNull Context prefContext,
             @NonNull CharSequence title,
@@ -648,19 +661,18 @@
         pref.setPreferenceListener(
                 new CombiPreference.OnCombiPreferenceClickListener() {
                     @Override
-                    public void onCheckChanged(CombiPreference p, boolean isChecked) {
+                    public boolean onCheckChanged(CombiPreference p, boolean isChecked) {
                         if (isChecked) {
-                            if (mEnabledPackageNames.size() >= MAX_SELECTABLE_PROVIDERS) {
+                            if (hasProviderLimitBeenReached()) {
                                 // Show the error if too many enabled.
-                                pref.setChecked(false);
                                 final DialogFragment fragment = newErrorDialogFragment();
 
                                 if (fragment == null || mFragmentManager == null) {
-                                    return;
+                                    return false;
                                 }
 
                                 fragment.show(mFragmentManager, ErrorDialogFragment.TAG);
-                                return;
+                                return false;
                             }
 
                             togglePackageNameEnabled(packageName);
@@ -672,6 +684,8 @@
                         } else {
                             togglePackageNameDisabled(packageName);
                         }
+
+                        return true;
                     }
 
                     @Override
@@ -989,8 +1003,13 @@
             @Override
             public void onClick(View buttonView) {
                 // Forward the event.
-                if (mSwitch != null) {
-                    mOnClickListener.onCheckChanged(CombiPreference.this, mSwitch.isChecked());
+                if (mSwitch != null && mOnClickListener != null) {
+                    if (!mOnClickListener.onCheckChanged(CombiPreference.this, mSwitch.isChecked())) {
+                      // The update was not successful since there were too
+                      // many enabled providers to manually reset any state.
+                      mChecked = false;
+                      mSwitch.setChecked(false);
+                    }
                 }
             }
         }
@@ -1004,7 +1023,7 @@
 
         public interface OnCombiPreferenceClickListener {
             /** Called when the check is updated */
-            void onCheckChanged(CombiPreference p, boolean isChecked);
+            boolean onCheckChanged(CombiPreference p, boolean isChecked);
 
             /** Called when the left side is clicked. */
             void onLeftSideClicked();
diff --git a/src/com/android/settings/applications/credentials/DefaultCombinedPreferenceController.java b/src/com/android/settings/applications/credentials/DefaultCombinedPreferenceController.java
index 49dd7cd..032402f 100644
--- a/src/com/android/settings/applications/credentials/DefaultCombinedPreferenceController.java
+++ b/src/com/android/settings/applications/credentials/DefaultCombinedPreferenceController.java
@@ -114,7 +114,7 @@
             @Nullable CharSequence packageName,
             @Nullable CharSequence settingsActivity) {
         if (appName == null) {
-            preference.setTitle(R.string.app_list_preference_none);
+            preference.setTitle(R.string.credman_app_list_preference_none);
         } else {
             preference.setTitle(appName);
         }
@@ -144,7 +144,7 @@
 
             // Hide the open button if there is no defined settings activity.
             primaryPref.setOpenButtonVisible(!TextUtils.isEmpty(settingsActivity));
-            primaryPref.setButtonsVisible(appName != null);
+            primaryPref.setButtonsCompactMode(appName != null);
         }
     }
 
diff --git a/src/com/android/settings/applications/credentials/PrimaryProviderPreference.java b/src/com/android/settings/applications/credentials/PrimaryProviderPreference.java
index b8e2529..84459e0 100644
--- a/src/com/android/settings/applications/credentials/PrimaryProviderPreference.java
+++ b/src/com/android/settings/applications/credentials/PrimaryProviderPreference.java
@@ -46,7 +46,7 @@
     private @Nullable View mButtonFrameView = null;
     private @Nullable View mGearView = null;
     private @Nullable Delegate mDelegate = null;
-    private boolean mButtonsVisible = false;
+    private boolean mButtonsCompactMode = false;
     private boolean mOpenButtonVisible = false;
 
     /** Called to send messages back to the parent controller. */
@@ -141,26 +141,7 @@
                 });
 
         mButtonFrameView = holder.findViewById(R.id.credman_button_frame);
-        mButtonFrameView.setVisibility(mButtonsVisible ? View.VISIBLE : View.GONE);
-
-        // There is a special case where if the provider == none then we should
-        // hide the buttons and when the preference is tapped we can open the
-        // provider selection dialog.
-        setOnPreferenceClickListener(
-                new Preference.OnPreferenceClickListener() {
-                    public boolean onPreferenceClick(@NonNull Preference preference) {
-                        return handlePreferenceClickNewSettingsUi();
-                    }
-                });
-    }
-
-    private boolean handlePreferenceClickNewSettingsUi() {
-        if (mDelegate != null && !mButtonsVisible) {
-            mDelegate.onChangeButtonClicked();
-            return true;
-        }
-
-        return false;
+        updateButtonFramePadding();
     }
 
     public void setOpenButtonVisible(boolean isVisible) {
@@ -172,12 +153,27 @@
         mOpenButtonVisible = isVisible;
     }
 
-    public void setButtonsVisible(boolean isVisible) {
-        if (mButtonFrameView != null) {
-            setVisibility(mButtonFrameView, isVisible);
+    private void updateButtonFramePadding() {
+        if (mButtonFrameView == null) {
+          return;
         }
 
-        mButtonsVisible = isVisible;
+        int paddingLeft = mButtonsCompactMode ?
+            getContext().getResources().getDimensionPixelSize(
+                R.dimen.credman_primary_provider_pref_left_padding) :
+            getContext().getResources().getDimensionPixelSize(
+                R.dimen.credman_primary_provider_pref_left_padding_compact);
+
+        mButtonFrameView.setPadding(
+            paddingLeft,
+            mButtonFrameView.getPaddingTop(),
+            mButtonFrameView.getPaddingRight(),
+            mButtonFrameView.getPaddingBottom());
+    }
+
+    public void setButtonsCompactMode(boolean isCompactMode) {
+        mButtonsCompactMode = isCompactMode;
+        updateButtonFramePadding();
     }
 
     public void setDelegate(@NonNull Delegate delegate) {
diff --git a/src/com/android/settings/applications/manageapplications/ApplicationViewHolder.java b/src/com/android/settings/applications/manageapplications/ApplicationViewHolder.java
index 1d96688..cd3fd6b 100644
--- a/src/com/android/settings/applications/manageapplications/ApplicationViewHolder.java
+++ b/src/com/android/settings/applications/manageapplications/ApplicationViewHolder.java
@@ -231,7 +231,7 @@
     void updateAppCloneWidget(Context context, View.OnClickListener onClickListener,
             AppEntry entry) {
         if (mAddIcon != null) {
-            if (!entry.isCloned) {
+            if (!entry.isClonedProfile()) {
                 mAddIcon.setBackground(context.getDrawable(R.drawable.ic_add_24dp));
             } else {
                 mAddIcon.setBackground(context.getDrawable(R.drawable.ic_trash_can));
@@ -254,7 +254,7 @@
                 String packageName = entry.info.packageName;
 
                 if (mWidgetContainer != null) {
-                    if (!entry.isCloned) {
+                    if (!entry.isClonedProfile()) {
                         metricsFeatureProvider.action(context,
                                 SettingsEnums.ACTION_CREATE_CLONE_APP);
                         mAddIcon.setVisibility(View.INVISIBLE);
@@ -285,7 +285,7 @@
                             }
                         }.execute();
 
-                    } else if (entry.isCloned) {
+                    } else if (entry.isClonedProfile()) {
                         metricsFeatureProvider.action(context,
                                 SettingsEnums.ACTION_DELETE_CLONE_APP);
                         cloneBackend.uninstallClonedApp(packageName, /*allUsers*/ false,
diff --git a/src/com/android/settings/applications/manageapplications/ManageApplications.java b/src/com/android/settings/applications/manageapplications/ManageApplications.java
index e370f3e..c2fabff 100644
--- a/src/com/android/settings/applications/manageapplications/ManageApplications.java
+++ b/src/com/android/settings/applications/manageapplications/ManageApplications.java
@@ -295,6 +295,7 @@
     private String mVolumeUuid;
     private int mStorageType;
     private boolean mIsWorkOnly;
+    private boolean mIsPrivateProfileOnly;
     private int mWorkUserId;
     private boolean mIsPersonalOnly;
     private View mEmptyView;
@@ -378,6 +379,8 @@
                 == ProfileSelectFragment.ProfileType.PERSONAL;
         mIsWorkOnly = args != null && args.getInt(ProfileSelectFragment.EXTRA_PROFILE)
                 == ProfileSelectFragment.ProfileType.WORK;
+        mIsPrivateProfileOnly = args != null && args.getInt(ProfileSelectFragment.EXTRA_PROFILE)
+                == ProfileSelectFragment.ProfileType.PRIVATE;
         mWorkUserId = args != null ? args.getInt(EXTRA_WORK_ID) : UserHandle.myUserId();
         if (mIsWorkOnly && mWorkUserId == UserHandle.myUserId()) {
             mWorkUserId = Utils.getManagedProfileId(mUserManager, UserHandle.myUserId());
@@ -660,6 +663,10 @@
         if (mIsWorkOnly) {
             compositeFilter = new CompoundFilter(compositeFilter, ApplicationsState.FILTER_WORK);
         }
+        if (mIsPrivateProfileOnly) {
+            compositeFilter =
+                    new CompoundFilter(compositeFilter, ApplicationsState.FILTER_PRIVATE_PROFILE);
+        }
         if (mIsPersonalOnly) {
             compositeFilter = new CompoundFilter(compositeFilter,
                     ApplicationsState.FILTER_PERSONAL);
diff --git a/src/com/android/settings/biometrics/fingerprint2/conversion/Util.kt b/src/com/android/settings/biometrics/fingerprint2/conversion/Util.kt
index 58ef509..0ef1d25 100644
--- a/src/com/android/settings/biometrics/fingerprint2/conversion/Util.kt
+++ b/src/com/android/settings/biometrics/fingerprint2/conversion/Util.kt
@@ -20,8 +20,8 @@
 import android.hardware.biometrics.BiometricFingerprintConstants.FINGERPRINT_ERROR_UNABLE_TO_PROCESS
 import android.hardware.fingerprint.FingerprintManager
 import com.android.settings.R
-import com.android.settings.biometrics.fingerprint2.shared.model.EnrollReason
-import com.android.settings.biometrics.fingerprint2.shared.model.FingerEnrollState
+import com.android.settings.biometrics.fingerprint2.lib.model.EnrollReason
+import com.android.settings.biometrics.fingerprint2.lib.model.FingerEnrollState
 
 object Util {
   fun EnrollReason.toOriginalReason(): Int {
@@ -71,6 +71,4 @@
       this == FINGERPRINT_ERROR_CANCELED,
     )
   }
-
 }
-
diff --git a/src/com/android/settings/biometrics/fingerprint2/data/repository/FingerprintSensorRepo.kt b/src/com/android/settings/biometrics/fingerprint2/data/repository/FingerprintSensorRepo.kt
new file mode 100644
index 0000000..c045b0e
--- /dev/null
+++ b/src/com/android/settings/biometrics/fingerprint2/data/repository/FingerprintSensorRepo.kt
@@ -0,0 +1,90 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.biometrics.fingerprint2.data.repository
+
+import android.hardware.biometrics.ComponentInfoInternal
+import android.hardware.biometrics.SensorLocationInternal
+import android.hardware.biometrics.SensorProperties
+import android.hardware.fingerprint.FingerprintManager
+import android.hardware.fingerprint.FingerprintSensorProperties
+import android.hardware.fingerprint.FingerprintSensorPropertiesInternal
+import android.hardware.fingerprint.IFingerprintAuthenticatorsRegisteredCallback
+import com.android.systemui.biometrics.shared.model.FingerprintSensor
+import com.android.systemui.biometrics.shared.model.toFingerprintSensor
+import kotlinx.coroutines.CoroutineDispatcher
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.channels.awaitClose
+import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.SharingStarted
+import kotlinx.coroutines.flow.callbackFlow
+import kotlinx.coroutines.flow.stateIn
+import kotlinx.coroutines.withContext
+
+/**
+ * Provides the [FingerprintSensor]
+ *
+ * TODO(b/313493336): Move this to systemui
+ */
+interface FingerprintSensorRepo {
+  /** Get the [FingerprintSensor] */
+  val fingerprintSensor: Flow<FingerprintSensor>
+}
+
+class FingerprintSensorRepoImpl(
+    fingerprintManager: FingerprintManager,
+    backgroundDispatcher: CoroutineDispatcher,
+    activityScope: CoroutineScope,
+) : FingerprintSensorRepo {
+
+  override val fingerprintSensor: Flow<FingerprintSensor> =
+    callbackFlow {
+        val callback =
+          object : IFingerprintAuthenticatorsRegisteredCallback.Stub() {
+            override fun onAllAuthenticatorsRegistered(
+              sensors: List<FingerprintSensorPropertiesInternal>
+            ) {
+              if (sensors.isEmpty()) {
+                trySend(DEFAULT_PROPS)
+              } else {
+                trySend(sensors[0].toFingerprintSensor())
+              }
+            }
+          }
+        withContext(backgroundDispatcher) {
+          fingerprintManager?.addAuthenticatorsRegisteredCallback(callback)
+        }
+        awaitClose {}
+      }
+      .stateIn(activityScope, started = SharingStarted.Eagerly, initialValue = DEFAULT_PROPS)
+
+    companion object {
+        private const val TAG = "FingerprintSensorRepoImpl"
+
+        private val DEFAULT_PROPS =
+            FingerprintSensorPropertiesInternal(
+                -1 /* sensorId */,
+                SensorProperties.STRENGTH_CONVENIENCE,
+                0 /* maxEnrollmentsPerUser */,
+                listOf<ComponentInfoInternal>(),
+                FingerprintSensorProperties.TYPE_UNKNOWN,
+                false /* halControlsIllumination */,
+                true /* resetLockoutRequiresHardwareAuthToken */,
+                listOf<SensorLocationInternal>(SensorLocationInternal.DEFAULT),
+            )
+                .toFingerprintSensor()
+    }
+}
diff --git a/src/com/android/settings/biometrics/fingerprint2/repository/PressToAuthProviderImpl.kt b/src/com/android/settings/biometrics/fingerprint2/data/repository/PressToAuthRepo.kt
similarity index 67%
rename from src/com/android/settings/biometrics/fingerprint2/repository/PressToAuthProviderImpl.kt
rename to src/com/android/settings/biometrics/fingerprint2/data/repository/PressToAuthRepo.kt
index 38c5335..5909825 100644
--- a/src/com/android/settings/biometrics/fingerprint2/repository/PressToAuthProviderImpl.kt
+++ b/src/com/android/settings/biometrics/fingerprint2/data/repository/PressToAuthRepo.kt
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2023 The Android Open Source Project
+ * Copyright (C) 2024 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,13 +14,24 @@
  * limitations under the License.
  */
 
-package com.android.settings.biometrics.fingerprint2.repository
+package com.android.settings.biometrics.fingerprint2.data.repository
 
 import android.content.Context
 import android.provider.Settings
-import com.android.settings.biometrics.fingerprint2.shared.data.repository.PressToAuthProvider
 
-class PressToAuthProviderImpl(val context: Context) : PressToAuthProvider {
+/** Interface that indicates if press to auth is on or off. */
+interface PressToAuthRepo {
+  /** Indicates true if the PressToAuth feature is enabled, false otherwise. */
+  val isEnabled: Boolean
+}
+
+/** Indicates whether or not the press to auth feature is enabled. */
+class PressToAuthRepoImpl(private val context: Context) : PressToAuthRepo {
+  /**
+   * Gets the status of the press to auth feature.
+   *
+   * Returns whether or not the press to auth feature is enabled.
+   */
   override val isEnabled: Boolean
     get() {
       var toReturn: Int =
@@ -43,7 +54,7 @@
           context.contentResolver,
           Settings.Secure.SFPS_PERFORMANT_AUTH_ENABLED,
           toReturn,
-          context.userId
+          context.userId,
         )
       }
       return (toReturn == 1)
diff --git a/src/com/android/settings/biometrics/fingerprint2/domain/interactor/FingerprintManagerInteractorImpl.kt b/src/com/android/settings/biometrics/fingerprint2/domain/interactor/FingerprintManagerInteractorImpl.kt
index 984d04c..1fbeb44 100644
--- a/src/com/android/settings/biometrics/fingerprint2/domain/interactor/FingerprintManagerInteractorImpl.kt
+++ b/src/com/android/settings/biometrics/fingerprint2/domain/interactor/FingerprintManagerInteractorImpl.kt
@@ -26,16 +26,16 @@
 import com.android.settings.biometrics.GatekeeperPasswordProvider
 import com.android.settings.biometrics.fingerprint2.conversion.Util.toEnrollError
 import com.android.settings.biometrics.fingerprint2.conversion.Util.toOriginalReason
-import com.android.settings.biometrics.fingerprint2.shared.data.repository.PressToAuthProvider
-import com.android.settings.biometrics.fingerprint2.shared.domain.interactor.FingerprintManagerInteractor
-import com.android.settings.biometrics.fingerprint2.shared.model.EnrollReason
-import com.android.settings.biometrics.fingerprint2.shared.model.FingerprintFlow
-import com.android.settings.biometrics.fingerprint2.shared.model.FingerEnrollState
-import com.android.settings.biometrics.fingerprint2.shared.model.FingerprintAuthAttemptModel
-import com.android.settings.biometrics.fingerprint2.shared.model.FingerprintData
-import com.android.settings.biometrics.fingerprint2.shared.model.SetupWizard
+import com.android.settings.biometrics.fingerprint2.data.repository.FingerprintSensorRepo
+import com.android.settings.biometrics.fingerprint2.data.repository.PressToAuthRepo
+import com.android.settings.biometrics.fingerprint2.lib.domain.interactor.FingerprintManagerInteractor
+import com.android.settings.biometrics.fingerprint2.lib.model.EnrollReason
+import com.android.settings.biometrics.fingerprint2.lib.model.FingerEnrollState
+import com.android.settings.biometrics.fingerprint2.lib.model.FingerprintAuthAttemptModel
+import com.android.settings.biometrics.fingerprint2.lib.model.FingerprintData
+import com.android.settings.biometrics.fingerprint2.lib.model.FingerprintFlow
+import com.android.settings.biometrics.fingerprint2.lib.model.SetupWizard
 import com.android.settings.password.ChooseLockSettingsHelper
-import com.android.systemui.biometrics.shared.model.toFingerprintSensor
 import kotlin.coroutines.resume
 import kotlin.coroutines.suspendCoroutine
 import kotlinx.coroutines.CancellableContinuation
@@ -57,8 +57,9 @@
   applicationContext: Context,
   private val backgroundDispatcher: CoroutineDispatcher,
   private val fingerprintManager: FingerprintManager,
+  fingerprintSensorRepo: FingerprintSensorRepo,
   private val gatekeeperPasswordProvider: GatekeeperPasswordProvider,
-  private val pressToAuthProvider: PressToAuthProvider,
+  private val pressToAuthRepo: PressToAuthRepo,
   private val fingerprintFlow: FingerprintFlow,
 ) : FingerprintManagerInteractor {
 
@@ -100,13 +101,7 @@
     )
   }
 
-  override val sensorPropertiesInternal = flow {
-    val sensorPropertiesInternal = fingerprintManager.sensorPropertiesInternal
-    emit(
-      if (sensorPropertiesInternal.isEmpty()) null
-      else sensorPropertiesInternal.first().toFingerprintSensor()
-    )
-  }
+  override val sensorPropertiesInternal = fingerprintSensorRepo.fingerprintSensor
 
   override val maxEnrollableFingerprints = flow { emit(maxFingerprints) }
 
@@ -136,8 +131,7 @@
             totalSteps = remaining + 1
           }
 
-          trySend(FingerEnrollState.EnrollProgress(remaining, totalSteps!!)).onFailure {
-            error ->
+          trySend(FingerEnrollState.EnrollProgress(remaining, totalSteps!!)).onFailure { error ->
             Log.d(TAG, "onEnrollmentProgress($remaining) failed to send, due to $error")
           }
 
@@ -148,13 +142,16 @@
         }
 
         override fun onEnrollmentHelp(helpMsgId: Int, helpString: CharSequence?) {
-          trySend(FingerEnrollState.EnrollHelp(helpMsgId, helpString.toString()))
-            .onFailure { error -> Log.d(TAG, "onEnrollmentHelp failed to send, due to $error") }
+          trySend(FingerEnrollState.EnrollHelp(helpMsgId, helpString.toString())).onFailure { error
+            ->
+            Log.d(TAG, "onEnrollmentHelp failed to send, due to $error")
+          }
         }
 
         override fun onEnrollmentError(errMsgId: Int, errString: CharSequence?) {
-          trySend(errMsgId.toEnrollError(fingerprintFlow == SetupWizard))
-            .onFailure { error -> Log.d(TAG, "onEnrollmentError failed to send, due to $error") }
+          trySend(errMsgId.toEnrollError(fingerprintFlow == SetupWizard)).onFailure { error ->
+            Log.d(TAG, "onEnrollmentError failed to send, due to $error")
+          }
           Log.d(TAG, "onEnrollmentError($errMsgId)")
           streamEnded = true
           enrollRequestOutstanding.update { false }
@@ -185,14 +182,14 @@
         override fun onRemovalError(
           fp: android.hardware.fingerprint.Fingerprint,
           errMsgId: Int,
-          errString: CharSequence
+          errString: CharSequence,
         ) {
           it.resume(false)
         }
 
         override fun onRemovalSucceeded(
           fp: android.hardware.fingerprint.Fingerprint?,
-          remaining: Int
+          remaining: Int,
         ) {
           it.resume(true)
         }
@@ -200,7 +197,7 @@
     fingerprintManager.remove(
       android.hardware.fingerprint.Fingerprint(fp.name, fp.fingerId, fp.deviceId),
       applicationContext.userId,
-      callback
+      callback,
     )
   }
 
@@ -215,7 +212,7 @@
   }
 
   override suspend fun pressToAuthEnabled(): Boolean = suspendCancellableCoroutine {
-    it.resume(pressToAuthProvider.isEnabled)
+    it.resume(pressToAuthRepo.isEnabled)
   }
 
   override suspend fun authenticate(): FingerprintAuthAttemptModel =
@@ -249,7 +246,7 @@
         cancellationSignal,
         authenticationCallback,
         null,
-        applicationContext.userId
+        applicationContext.userId,
       )
     }
 }
diff --git a/src/com/android/settings/biometrics/fingerprint2/shared/Android.bp b/src/com/android/settings/biometrics/fingerprint2/lib/Android.bp
similarity index 64%
rename from src/com/android/settings/biometrics/fingerprint2/shared/Android.bp
rename to src/com/android/settings/biometrics/fingerprint2/lib/Android.bp
index 145f3d6..9f753b2 100644
--- a/src/com/android/settings/biometrics/fingerprint2/shared/Android.bp
+++ b/src/com/android/settings/biometrics/fingerprint2/lib/Android.bp
@@ -2,13 +2,17 @@
 // unit/robo/screenshot etc.
 //
 // This library shouldn't have many dependencies.
+package {
+    default_team: "trendy_team_android_settings_app",
+}
+
 android_library {
     name: "FingerprintManagerInteractor",
     srcs: [
-      "**/*.kt"
+        "**/*.kt",
     ],
     static_libs: [
-      "BiometricsSharedLib",
-      "kotlinx-coroutines-android",
+        "BiometricsSharedLib",
+        "kotlinx-coroutines-android",
     ],
-}
\ No newline at end of file
+}
diff --git a/src/com/android/settings/biometrics/fingerprint2/shared/AndroidManifest.xml b/src/com/android/settings/biometrics/fingerprint2/lib/AndroidManifest.xml
similarity index 91%
rename from src/com/android/settings/biometrics/fingerprint2/shared/AndroidManifest.xml
rename to src/com/android/settings/biometrics/fingerprint2/lib/AndroidManifest.xml
index e2c97fc..250f0af 100644
--- a/src/com/android/settings/biometrics/fingerprint2/shared/AndroidManifest.xml
+++ b/src/com/android/settings/biometrics/fingerprint2/lib/AndroidManifest.xml
@@ -14,5 +14,5 @@
   ~ limitations under the License.
   -->
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
-    package="com.android.settings.biometrics.fingerprint2.shared">
+    package="com.android.settings.biometrics.fingerprint2.lib">
 </manifest>
diff --git a/src/com/android/settings/biometrics/fingerprint2/shared/domain/interactor/FingerprintManagerInteractor.kt b/src/com/android/settings/biometrics/fingerprint2/lib/domain/interactor/FingerprintManagerInteractor.kt
similarity index 82%
rename from src/com/android/settings/biometrics/fingerprint2/shared/domain/interactor/FingerprintManagerInteractor.kt
rename to src/com/android/settings/biometrics/fingerprint2/lib/domain/interactor/FingerprintManagerInteractor.kt
index 94afa49..6e6df23 100644
--- a/src/com/android/settings/biometrics/fingerprint2/shared/domain/interactor/FingerprintManagerInteractor.kt
+++ b/src/com/android/settings/biometrics/fingerprint2/lib/domain/interactor/FingerprintManagerInteractor.kt
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2023 The Android Open Source Project
+ * Copyright (C) 2024 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,12 +14,12 @@
  * limitations under the License.
  */
 
-package com.android.settings.biometrics.fingerprint2.shared.domain.interactor
+package com.android.settings.biometrics.fingerprint2.lib.domain.interactor
 
-import com.android.settings.biometrics.fingerprint2.shared.model.EnrollReason
-import com.android.settings.biometrics.fingerprint2.shared.model.FingerprintAuthAttemptModel
-import com.android.settings.biometrics.fingerprint2.shared.model.FingerprintData
-import com.android.settings.biometrics.fingerprint2.shared.model.FingerEnrollState
+import com.android.settings.biometrics.fingerprint2.lib.model.EnrollReason
+import com.android.settings.biometrics.fingerprint2.lib.model.FingerEnrollState
+import com.android.settings.biometrics.fingerprint2.lib.model.FingerprintAuthAttemptModel
+import com.android.settings.biometrics.fingerprint2.lib.model.FingerprintData
 import com.android.systemui.biometrics.shared.model.FingerprintSensor
 import kotlinx.coroutines.flow.Flow
 
@@ -56,12 +56,12 @@
 
   /**
    * Runs [FingerprintManager.enroll] with the [hardwareAuthToken] and [EnrollReason] for this
-   * enrollment. Returning the [FingerEnrollState] that represents this fingerprint
-   * enrollment state.
+   * enrollment. Returning the [FingerEnrollState] that represents this fingerprint enrollment
+   * state.
    */
   suspend fun enroll(
-      hardwareAuthToken: ByteArray?,
-      enrollReason: EnrollReason,
+    hardwareAuthToken: ByteArray?,
+    enrollReason: EnrollReason,
   ): Flow<FingerEnrollState>
 
   /**
@@ -78,5 +78,4 @@
 
   /** Indicates if the press to auth feature has been enabled */
   suspend fun pressToAuthEnabled(): Boolean
-
 }
diff --git a/src/com/android/settings/biometrics/fingerprint2/shared/model/EnrollReason.kt b/src/com/android/settings/biometrics/fingerprint2/lib/model/EnrollReason.kt
similarity index 93%
rename from src/com/android/settings/biometrics/fingerprint2/shared/model/EnrollReason.kt
rename to src/com/android/settings/biometrics/fingerprint2/lib/model/EnrollReason.kt
index 47a0af0..3cc6497 100644
--- a/src/com/android/settings/biometrics/fingerprint2/shared/model/EnrollReason.kt
+++ b/src/com/android/settings/biometrics/fingerprint2/lib/model/EnrollReason.kt
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.android.settings.biometrics.fingerprint2.shared.model
+package com.android.settings.biometrics.fingerprint2.lib.model
 
 /** The reason for enrollment */
 enum class EnrollReason {
diff --git a/src/com/android/settings/biometrics/fingerprint2/shared/model/FingerEnrollState.kt b/src/com/android/settings/biometrics/fingerprint2/lib/model/FingerEnrollState.kt
similarity index 81%
rename from src/com/android/settings/biometrics/fingerprint2/shared/model/FingerEnrollState.kt
rename to src/com/android/settings/biometrics/fingerprint2/lib/model/FingerEnrollState.kt
index 4766d59..683397f 100644
--- a/src/com/android/settings/biometrics/fingerprint2/shared/model/FingerEnrollState.kt
+++ b/src/com/android/settings/biometrics/fingerprint2/lib/model/FingerEnrollState.kt
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.android.settings.biometrics.fingerprint2.shared.model
+package com.android.settings.biometrics.fingerprint2.lib.model
 
 import android.annotation.StringRes
 
@@ -28,16 +28,12 @@
    *
    * Progress is obtained by (totalStepsRequired - remainingSteps) / totalStepsRequired
    */
-  data class EnrollProgress(
-    val remainingSteps: Int,
-    val totalStepsRequired: Int,
-  ) : FingerEnrollState()
+  data class EnrollProgress(val remainingSteps: Int, val totalStepsRequired: Int) :
+    FingerEnrollState()
 
   /** Represents that recoverable error has been encountered during enrollment. */
-  data class EnrollHelp(
-    @StringRes val helpMsgId: Int,
-    val helpString: String,
-  ) : FingerEnrollState()
+  data class EnrollHelp(@StringRes val helpMsgId: Int, val helpString: String) :
+    FingerEnrollState()
 
   /** Represents that an unrecoverable error has been encountered and the operation is complete. */
   data class EnrollError(
diff --git a/src/com/android/settings/biometrics/fingerprint2/lib/model/FingerprintAuthAttemptModel.kt b/src/com/android/settings/biometrics/fingerprint2/lib/model/FingerprintAuthAttemptModel.kt
new file mode 100644
index 0000000..45259e9
--- /dev/null
+++ b/src/com/android/settings/biometrics/fingerprint2/lib/model/FingerprintAuthAttemptModel.kt
@@ -0,0 +1,26 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.biometrics.fingerprint2.lib.model
+
+/** Information indicating whether an auth was successful or not */
+sealed class FingerprintAuthAttemptModel {
+  /** Indicates a successful auth attempt has occurred for [fingerId] */
+  data class Success(val fingerId: Int) : FingerprintAuthAttemptModel()
+
+  /** Indicates a failed auth attempt has occurred. */
+  data class Error(val error: Int, val message: String) : FingerprintAuthAttemptModel()
+}
diff --git a/src/com/android/settings/biometrics/fingerprint2/shared/data/repository/PressToAuthProvider.kt b/src/com/android/settings/biometrics/fingerprint2/lib/model/FingerprintData.kt
similarity index 67%
rename from src/com/android/settings/biometrics/fingerprint2/shared/data/repository/PressToAuthProvider.kt
rename to src/com/android/settings/biometrics/fingerprint2/lib/model/FingerprintData.kt
index e776b9a..62aa2c7 100644
--- a/src/com/android/settings/biometrics/fingerprint2/shared/data/repository/PressToAuthProvider.kt
+++ b/src/com/android/settings/biometrics/fingerprint2/lib/model/FingerprintData.kt
@@ -14,14 +14,7 @@
  * limitations under the License.
  */
 
-package com.android.settings.biometrics.fingerprint2.shared.data.repository
+package com.android.settings.biometrics.fingerprint2.lib.model
 
-/**
- * Interface that indicates if press to auth is on or off.
- */
-interface PressToAuthProvider {
-    /**
-     * Indicates true if the PressToAuth feature is enabled, false otherwise.
-     */
-    val isEnabled: Boolean
-}
\ No newline at end of file
+/** Basic information about an enrolled fingerprint */
+data class FingerprintData(val name: String, val fingerId: Int, val deviceId: Long)
diff --git a/src/com/android/settings/biometrics/fingerprint2/shared/model/FingerprintFlow.kt b/src/com/android/settings/biometrics/fingerprint2/lib/model/FingerprintFlow.kt
similarity index 83%
rename from src/com/android/settings/biometrics/fingerprint2/shared/model/FingerprintFlow.kt
rename to src/com/android/settings/biometrics/fingerprint2/lib/model/FingerprintFlow.kt
index 93c7577..40d7a03 100644
--- a/src/com/android/settings/biometrics/fingerprint2/shared/model/FingerprintFlow.kt
+++ b/src/com/android/settings/biometrics/fingerprint2/lib/model/FingerprintFlow.kt
@@ -14,10 +14,11 @@
  * limitations under the License.
  */
 
-package com.android.settings.biometrics.fingerprint2.shared.model
+package com.android.settings.biometrics.fingerprint2.lib.model
 
 /**
- * The [FingerprintFlow] for fingerprint enrollment indicates information on how the flow should behave.
+ * The [FingerprintFlow] for fingerprint enrollment indicates information on how the flow should
+ * behave.
  */
 sealed class FingerprintFlow
 
@@ -32,3 +33,6 @@
 
 /** Flow to specify settings type */
 data object Settings : FingerprintFlow()
+
+/** Indicates that the fast enroll experience should occur */
+data object FastEnroll : FingerprintFlow()
diff --git a/src/com/android/settings/biometrics/fingerprint2/shared/model/FingerprintData.kt b/src/com/android/settings/biometrics/fingerprint2/shared/model/FingerprintData.kt
deleted file mode 100644
index b2aa25c..0000000
--- a/src/com/android/settings/biometrics/fingerprint2/shared/model/FingerprintData.kt
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Copyright (C) 2023 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settings.biometrics.fingerprint2.shared.model
-
-data class FingerprintData(
-  val name: String,
-  val fingerId: Int,
-  val deviceId: Long,
-)
-
-sealed class FingerprintAuthAttemptModel {
-  data class Success(
-    val fingerId: Int,
-  ) : FingerprintAuthAttemptModel()
-
-  data class Error(
-    val error: Int,
-    val message: String,
-  ) : FingerprintAuthAttemptModel()
-}
diff --git a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/activity/FingerprintEnrollmentV2Activity.kt b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/activity/FingerprintEnrollmentV2Activity.kt
index 06307a4..f7e6135 100644
--- a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/activity/FingerprintEnrollmentV2Activity.kt
+++ b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/activity/FingerprintEnrollmentV2Activity.kt
@@ -21,7 +21,6 @@
 import android.content.res.Configuration
 import android.hardware.fingerprint.FingerprintManager
 import android.os.Bundle
-import android.provider.Settings
 import android.util.Log
 import android.view.accessibility.AccessibilityManager
 import androidx.activity.result.contract.ActivityResultContracts
@@ -31,16 +30,18 @@
 import androidx.lifecycle.lifecycleScope
 import com.android.internal.widget.LockPatternUtils
 import com.android.settings.R
+import com.android.settings.SettingsApplication
 import com.android.settings.SetupWizardUtils
 import com.android.settings.Utils.SETTINGS_PACKAGE_NAME
 import com.android.settings.biometrics.BiometricEnrollBase
 import com.android.settings.biometrics.BiometricEnrollBase.CONFIRM_REQUEST
 import com.android.settings.biometrics.BiometricEnrollBase.RESULT_FINISHED
 import com.android.settings.biometrics.GatekeeperPasswordProvider
+import com.android.settings.biometrics.fingerprint2.data.repository.FingerprintSensorRepoImpl
+import com.android.settings.biometrics.fingerprint2.data.repository.PressToAuthRepoImpl
 import com.android.settings.biometrics.fingerprint2.domain.interactor.FingerprintManagerInteractorImpl
-import com.android.settings.biometrics.fingerprint2.shared.model.Default
-import com.android.settings.biometrics.fingerprint2.shared.model.SetupWizard
-import com.android.settings.biometrics.fingerprint2.repository.PressToAuthProviderImpl
+import com.android.settings.biometrics.fingerprint2.lib.model.Default
+import com.android.settings.biometrics.fingerprint2.lib.model.SetupWizard
 import com.android.settings.biometrics.fingerprint2.ui.enrollment.fragment.FingerprintEnrollConfirmationV2Fragment
 import com.android.settings.biometrics.fingerprint2.ui.enrollment.fragment.FingerprintEnrollEnrollingV2Fragment
 import com.android.settings.biometrics.fingerprint2.ui.enrollment.fragment.FingerprintEnrollFindSensorV2Fragment
@@ -49,20 +50,24 @@
 import com.android.settings.biometrics.fingerprint2.ui.enrollment.modules.enrolling.rfps.ui.viewmodel.RFPSViewModel
 import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.AccessibilityViewModel
 import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.BackgroundViewModel
-import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.Confirmation
-import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.Education
-import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.Enrollment
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintAction
 import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintEnrollEnrollingViewModel
 import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintEnrollFindSensorViewModel
-import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintEnrollNavigationViewModel
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintEnrollIntroViewModel
 import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintEnrollViewModel
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintFlowViewModel
 import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintGatekeeperViewModel
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintNavigationStep.ConfirmDeviceCredential
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintNavigationStep.Confirmation
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintNavigationStep.Education
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintNavigationStep.Enrollment
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintNavigationStep.Init
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintNavigationStep.Introduction
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintNavigationStep.TransitionStep
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintNavigationViewModel
 import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintScrollViewModel
-import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.Finish
 import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FoldStateViewModel
 import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.GatekeeperInfo
-import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.Intro
-import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.LaunchConfirmDeviceCredential
 import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.OrientationStateViewModel
 import com.android.settings.password.ChooseLockGeneric
 import com.android.settings.password.ChooseLockSettingsHelper
@@ -71,7 +76,6 @@
 import com.google.android.setupcompat.util.WizardManagerHelper
 import com.google.android.setupdesign.util.ThemeHelper
 import kotlinx.coroutines.Dispatchers
-import kotlinx.coroutines.flow.combine
 import kotlinx.coroutines.flow.filterNotNull
 import kotlinx.coroutines.launch
 
@@ -83,7 +87,7 @@
  */
 class FingerprintEnrollmentV2Activity : FragmentActivity() {
   private lateinit var fingerprintEnrollEnrollingViewModel: FingerprintEnrollEnrollingViewModel
-  private lateinit var navigationViewModel: FingerprintEnrollNavigationViewModel
+  private lateinit var navigationViewModel: FingerprintNavigationViewModel
   private lateinit var gatekeeperViewModel: FingerprintGatekeeperViewModel
   private lateinit var fingerprintEnrollViewModel: FingerprintEnrollViewModel
   private lateinit var accessibilityViewModel: AccessibilityViewModel
@@ -91,6 +95,7 @@
   private lateinit var orientationStateViewModel: OrientationStateViewModel
   private lateinit var fingerprintScrollViewModel: FingerprintScrollViewModel
   private lateinit var backgroundViewModel: BackgroundViewModel
+  private lateinit var fingerprintFlowViewModel: FingerprintFlowViewModel
   private val coroutineDispatcher = Dispatchers.Default
 
   /** Result listener for ChooseLock activity flow. */
@@ -119,6 +124,7 @@
     super.onResume()
     backgroundViewModel.inForeground()
   }
+
   override fun onConfigurationChanged(newConfig: Configuration) {
     super.onConfigurationChanged(newConfig)
     foldStateViewModel.onConfigurationChange(newConfig)
@@ -127,8 +133,20 @@
   private fun onConfirmDevice(resultCode: Int, data: Intent?) {
     val wasSuccessful = resultCode == RESULT_FINISHED || resultCode == Activity.RESULT_OK
     val gateKeeperPasswordHandle = data?.getExtra(EXTRA_KEY_GK_PW_HANDLE) as Long?
+
     lifecycleScope.launch {
+      val confirmDeviceResult =
+        if (wasSuccessful) {
+          FingerprintAction.CONFIRM_DEVICE_SUCCESS
+        } else {
+          FingerprintAction.CONFIRM_DEVICE_FAIL
+        }
       gatekeeperViewModel.onConfirmDevice(wasSuccessful, gateKeeperPasswordHandle)
+      navigationViewModel.update(
+        confirmDeviceResult,
+        ConfirmDeviceCredential::class,
+        "$TAG#onConfirmDevice",
+      )
     }
   }
 
@@ -156,14 +174,21 @@
       ViewModelProvider(this, BackgroundViewModel.BackgroundViewModelFactory())[
         BackgroundViewModel::class.java]
 
+    fingerprintFlowViewModel =
+      ViewModelProvider(this, FingerprintFlowViewModel.FingerprintFlowViewModelFactory(enrollType))[
+        FingerprintFlowViewModel::class.java]
 
-    val interactor =
+    val fingerprintSensorRepo =
+      FingerprintSensorRepoImpl(fingerprintManager, backgroundDispatcher, lifecycleScope)
+
+    val fingerprintManagerInteractor =
       FingerprintManagerInteractorImpl(
         context,
         backgroundDispatcher,
         fingerprintManager,
+        fingerprintSensorRepo,
         GatekeeperPasswordProvider(LockPatternUtils(context)),
-        PressToAuthProviderImpl(context),
+        PressToAuthRepoImpl(context),
         enrollType,
       )
 
@@ -171,27 +196,37 @@
     val token = intent.getByteArrayExtra(ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE_TOKEN)
     val gatekeeperInfo = FingerprintGatekeeperViewModel.toGateKeeperInfo(challenge, token)
 
+    val hasConfirmedDeviceCredential = gatekeeperInfo is GatekeeperInfo.GatekeeperPasswordInfo
+
+    navigationViewModel =
+      ViewModelProvider(
+        this,
+        FingerprintNavigationViewModel.FingerprintNavigationViewModelFactory(
+          Init,
+          hasConfirmedDeviceCredential,
+          fingerprintFlowViewModel,
+          fingerprintManagerInteractor,
+        ),
+      )[FingerprintNavigationViewModel::class.java]
+    // Initialize FingerprintEnrollIntroViewModel
+    ViewModelProvider(
+      this,
+      FingerprintEnrollIntroViewModel.FingerprintEnrollIntoViewModelFactory(
+        navigationViewModel,
+        fingerprintFlowViewModel,
+        fingerprintManagerInteractor,
+      ),
+    )[FingerprintEnrollIntroViewModel::class.java]
+
     gatekeeperViewModel =
       ViewModelProvider(
         this,
         FingerprintGatekeeperViewModel.FingerprintGatekeeperViewModelFactory(
           gatekeeperInfo,
-          interactor,
-        )
+          fingerprintManagerInteractor,
+        ),
       )[FingerprintGatekeeperViewModel::class.java]
 
-    navigationViewModel =
-      ViewModelProvider(
-        this,
-        FingerprintEnrollNavigationViewModel.FingerprintEnrollNavigationViewModelFactory(
-          backgroundDispatcher,
-          interactor,
-          gatekeeperViewModel,
-          gatekeeperInfo is GatekeeperInfo.GatekeeperPasswordInfo,
-          enrollType,
-        )
-      )[FingerprintEnrollNavigationViewModel::class.java]
-
     // Initialize FoldStateViewModel
     foldStateViewModel =
       ViewModelProvider(this, FoldStateViewModel.FoldStateViewModelFactory(context))[
@@ -203,10 +238,10 @@
       ViewModelProvider(
         this,
         FingerprintEnrollViewModel.FingerprintEnrollViewModelFactory(
-          interactor,
+          fingerprintManagerInteractor,
           gatekeeperViewModel,
           navigationViewModel,
-        )
+        ),
       )[FingerprintEnrollViewModel::class.java]
 
     // Initialize scroll view model
@@ -220,7 +255,7 @@
         this,
         AccessibilityViewModel.AccessibilityViewModelFactory(
           getSystemService(AccessibilityManager::class.java)!!
-        )
+        ),
       )[AccessibilityViewModel::class.java]
 
     // Initialize OrientationViewModel
@@ -234,8 +269,8 @@
         this,
         FingerprintEnrollEnrollingViewModel.FingerprintEnrollEnrollingViewModelFactory(
           fingerprintEnrollViewModel,
-          backgroundViewModel
-        )
+          backgroundViewModel,
+        ),
       )[FingerprintEnrollEnrollingViewModel::class.java]
 
     // Initialize FingerprintEnrollFindSensorViewModel
@@ -248,36 +283,48 @@
         backgroundViewModel,
         accessibilityViewModel,
         foldStateViewModel,
-        orientationStateViewModel
-      )
+        orientationStateViewModel,
+        fingerprintFlowViewModel,
+      ),
     )[FingerprintEnrollFindSensorViewModel::class.java]
 
     // Initialize RFPS View Model
     ViewModelProvider(
       this,
-      RFPSViewModel.RFPSViewModelFactory(fingerprintEnrollEnrollingViewModel)
+      RFPSViewModel.RFPSViewModelFactory(fingerprintEnrollEnrollingViewModel, navigationViewModel),
     )[RFPSViewModel::class.java]
+    lifecycleScope.launch {
+      navigationViewModel.currentStep.collect { step ->
+        if (step is Init) {
+          Log.d(TAG, "FingerprintNav.init($step)")
+          navigationViewModel.update(FingerprintAction.ACTIVITY_CREATED, Init::class, "$TAG#init")
+        }
+      }
+    }
 
     lifecycleScope.launch {
-      navigationViewModel.navigationViewModel
-        .filterNotNull()
-        .combine(fingerprintEnrollViewModel.sensorType) { nav, sensorType -> Pair(nav, sensorType) }
-        .collect { (nav, sensorType) ->
-          Log.d(TAG, "navigationStep $nav")
-          fingerprintEnrollViewModel.sensorTypeCached = sensorType
-          val isForward = nav.forward
-          val currStep = nav.currStep
-          val theClass: Class<Fragment>? =
-            when (currStep) {
-              Confirmation -> FingerprintEnrollConfirmationV2Fragment::class.java as Class<Fragment>
-              Education -> FingerprintEnrollFindSensorV2Fragment::class.java as Class<Fragment>
+      navigationViewModel.navigateTo.filterNotNull().collect { step ->
+        if (step is ConfirmDeviceCredential) {
+          launchConfirmOrChooseLock(userId)
+          navigationViewModel.update(
+            FingerprintAction.TRANSITION_FINISHED,
+            TransitionStep::class,
+            "$TAG#launchConfirmOrChooseLock",
+          )
+        } else {
+          val theClass: Fragment? =
+            when (step) {
+              Confirmation -> FingerprintEnrollConfirmationV2Fragment()
+              is Education -> {
+                FingerprintEnrollFindSensorV2Fragment(step.sensor.sensorType)
+              }
               is Enrollment -> {
-                when (sensorType) {
-                  FingerprintSensorType.REAR -> RFPSEnrollFragment::class.java as Class<Fragment>
-                  else -> FingerprintEnrollEnrollingV2Fragment::class.java as Class<Fragment>
+                when (step.sensor.sensorType) {
+                  FingerprintSensorType.REAR -> RFPSEnrollFragment()
+                  else -> FingerprintEnrollEnrollingV2Fragment()
                 }
               }
-              Intro -> FingerprintEnrollIntroV2Fragment::class.java as Class<Fragment>
+              Introduction -> FingerprintEnrollIntroV2Fragment()
               else -> null
             }
 
@@ -291,19 +338,31 @@
               .setReorderingAllowed(true)
               .add(R.id.fragment_container_view, theClass, null)
               .commit()
-          } else {
-
-            if (currStep is Finish) {
-              if (currStep.resultCode != null) {
-                finishActivity(currStep.resultCode)
-              } else {
-                finish()
-              }
-            } else if (currStep == LaunchConfirmDeviceCredential) {
-              launchConfirmOrChooseLock(userId)
-            }
+            navigationViewModel.update(
+              FingerprintAction.TRANSITION_FINISHED,
+              TransitionStep::class,
+              "$TAG#fragmentManager.add($theClass)",
+            )
           }
         }
+      }
+    }
+
+    lifecycleScope.launch {
+      navigationViewModel.shouldFinish.filterNotNull().collect {
+        Log.d(TAG, "FingerprintSettingsNav.finishing($it)")
+        if (it.result != null) {
+          finishActivity(it.result as Int)
+        } else {
+          finish()
+        }
+      }
+    }
+
+    lifecycleScope.launch {
+      navigationViewModel.currentScreen.filterNotNull().collect { screen ->
+        Log.d(TAG, "FingerprintSettingsNav.currentScreen($screen)")
+      }
     }
 
     val fromSettingsSummary =
@@ -313,7 +372,7 @@
     ) {
       overridePendingTransition(
         com.google.android.setupdesign.R.anim.sud_slide_next_in,
-        com.google.android.setupdesign.R.anim.sud_slide_next_out
+        com.google.android.setupdesign.R.anim.sud_slide_next_out,
       )
     }
   }
diff --git a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/fragment/FingerprintEnrollConfirmationV2Fragment.kt b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/fragment/FingerprintEnrollConfirmationV2Fragment.kt
index b12491f..fd07a95 100644
--- a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/fragment/FingerprintEnrollConfirmationV2Fragment.kt
+++ b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/fragment/FingerprintEnrollConfirmationV2Fragment.kt
@@ -18,8 +18,6 @@
 
 import android.os.Bundle
 import androidx.fragment.app.Fragment
-import androidx.lifecycle.ViewModelProvider
-import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintEnrollNavigationViewModel
 
 /**
  * A fragment to indicate that fingerprint enrollment has been completed.
@@ -31,9 +29,5 @@
 
   override fun onCreate(savedInstanceState: Bundle?) {
     super.onCreate(savedInstanceState)
-    if (savedInstanceState == null) {
-      val navigationViewModel =
-        ViewModelProvider(requireActivity())[FingerprintEnrollNavigationViewModel::class.java]
-    }
   }
 }
diff --git a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/fragment/FingerprintEnrollEnrollingV2Fragment.kt b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/fragment/FingerprintEnrollEnrollingV2Fragment.kt
index 0140d57..be30346 100644
--- a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/fragment/FingerprintEnrollEnrollingV2Fragment.kt
+++ b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/fragment/FingerprintEnrollEnrollingV2Fragment.kt
@@ -18,18 +18,12 @@
 
 import android.os.Bundle
 import androidx.fragment.app.Fragment
-import androidx.lifecycle.ViewModelProvider
 import com.android.settings.R
-import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintEnrollNavigationViewModel
 
 /** A fragment that is responsible for enrolling a users fingerprint. */
 class FingerprintEnrollEnrollingV2Fragment : Fragment(R.layout.fingerprint_enroll_enrolling) {
 
   override fun onCreate(savedInstanceState: Bundle?) {
     super.onCreate(savedInstanceState)
-    if (savedInstanceState == null) {
-      val navigationViewModel =
-        ViewModelProvider(requireActivity())[FingerprintEnrollNavigationViewModel::class.java]
-    }
   }
 }
diff --git a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/fragment/FingerprintEnrollFindSensorV2Fragment.kt b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/fragment/FingerprintEnrollFindSensorV2Fragment.kt
index bfd4264..9603e6b 100644
--- a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/fragment/FingerprintEnrollFindSensorV2Fragment.kt
+++ b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/fragment/FingerprintEnrollFindSensorV2Fragment.kt
@@ -50,7 +50,7 @@
  * 2. Explain to the user how the enrollment process shown by [FingerprintEnrollEnrollingV2Fragment]
  *    will work.
  */
-class FingerprintEnrollFindSensorV2Fragment : Fragment() {
+class FingerprintEnrollFindSensorV2Fragment(val sensorType: FingerprintSensorType) : Fragment() {
   // This is only for non-udfps or non-sfps sensor. For udfps and sfps, we show lottie.
   private var animation: FingerprintFindSensorAnimation? = null
 
@@ -62,7 +62,7 @@
   override fun onCreateView(
     inflater: LayoutInflater,
     container: ViewGroup?,
-    savedInstanceState: Bundle?
+    savedInstanceState: Bundle?,
   ): View? {
 
     val sensorType =
@@ -104,8 +104,7 @@
       }
       lifecycleScope.launch {
         viewModel.showRfpsAnimation.collect {
-          animation =
-            view.findViewById(R.id.fingerprint_sensor_location_animation)
+          animation = view.findViewById(R.id.fingerprint_sensor_location_animation)
           animation!!.startAnimation()
         }
       }
@@ -128,14 +127,7 @@
     footerBarMixin.secondaryButton =
       FooterButton.Builder(requireActivity())
         .setText(R.string.security_settings_fingerprint_enroll_enrolling_skip)
-        .setListener {
-          run {
-            // TODO: Show the dialog for suw
-            Log.d(TAG, "onSkipClicked")
-            // TODO: Finish activity in the root activity instead.
-            requireActivity().finish()
-          }
-        }
+        .setListener { viewModel.secondaryButtonClicked() }
         .setButtonType(FooterButton.ButtonType.SKIP)
         .setTheme(com.google.android.setupdesign.R.style.SudGlifButton_Secondary)
         .build()
@@ -146,10 +138,8 @@
       FooterButton.Builder(requireActivity())
         .setText(R.string.security_settings_udfps_enroll_find_sensor_start_button)
         .setListener {
-          run {
-            Log.d(TAG, "onStartButtonClick")
-            viewModel.proceedToEnrolling()
-          }
+          Log.d(TAG, "onStartButtonClick")
+          viewModel.proceedToEnrolling()
         }
         .setButtonType(FooterButton.ButtonType.NEXT)
         .setTheme(com.google.android.setupdesign.R.style.SudGlifButton_Primary)
@@ -159,7 +149,7 @@
   private fun setupLottie(
     view: View,
     lottieAnimation: Int,
-    lottieClickListener: View.OnClickListener? = null
+    lottieClickListener: View.OnClickListener? = null,
   ) {
     val illustrationLottie: LottieAnimationView? = view.findViewById(R.id.illustration_lottie)
     illustrationLottie?.setAnimation(lottieAnimation)
diff --git a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/fragment/FingerprintEnrollIntroV2Fragment.kt b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/fragment/FingerprintEnrollIntroV2Fragment.kt
index 32d201d..53d0ddf 100644
--- a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/fragment/FingerprintEnrollIntroV2Fragment.kt
+++ b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/fragment/FingerprintEnrollIntroV2Fragment.kt
@@ -24,7 +24,6 @@
 import android.os.Bundle
 import android.text.Html
 import android.text.method.LinkMovementMethod
-import android.util.Log
 import android.view.LayoutInflater
 import android.view.View
 import android.view.ViewGroup
@@ -36,9 +35,8 @@
 import androidx.lifecycle.ViewModelProvider
 import androidx.lifecycle.lifecycleScope
 import com.android.settings.R
-import com.android.settings.biometrics.fingerprint2.shared.model.Unicorn
-import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintEnrollNavigationViewModel
-import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintEnrollViewModel
+import com.android.settings.biometrics.fingerprint2.lib.model.Unicorn
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintEnrollIntroViewModel
 import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintGatekeeperViewModel
 import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintScrollViewModel
 import com.android.systemui.biometrics.shared.model.FingerprintSensorType
@@ -48,6 +46,7 @@
 import com.google.android.setupdesign.template.RequireScrollMixin
 import com.google.android.setupdesign.util.DynamicColorPalette
 import kotlinx.coroutines.flow.combine
+import kotlinx.coroutines.flow.filterNotNull
 import kotlinx.coroutines.launch
 
 private const val TAG = "FingerprintEnrollmentIntroV2Fragment"
@@ -96,16 +95,14 @@
   private lateinit var footerBarMixin: FooterBarMixin
   private lateinit var textModel: TextModel
 
-  // Note that the ViewModels cannot be requested before the onCreate call
-  private val navigationViewModel: FingerprintEnrollNavigationViewModel by lazy {
-    viewModelProvider[FingerprintEnrollNavigationViewModel::class.java]
+  private val viewModel: FingerprintEnrollIntroViewModel by lazy {
+    viewModelProvider[FingerprintEnrollIntroViewModel::class.java]
   }
-  private val fingerprintViewModel: FingerprintEnrollViewModel by lazy {
-    viewModelProvider[FingerprintEnrollViewModel::class.java]
-  }
+
   private val fingerprintScrollViewModel: FingerprintScrollViewModel by lazy {
     viewModelProvider[FingerprintScrollViewModel::class.java]
   }
+
   private val gateKeeperViewModel: FingerprintGatekeeperViewModel by lazy {
     viewModelProvider[FingerprintGatekeeperViewModel::class.java]
   }
@@ -113,17 +110,16 @@
   override fun onCreateView(
     inflater: LayoutInflater,
     container: ViewGroup?,
-    savedInstanceState: Bundle?
+    savedInstanceState: Bundle?,
   ): View? =
     super.onCreateView(inflater, container, savedInstanceState).also { theView ->
       val view = theView!!
 
       viewLifecycleOwner.lifecycleScope.launch {
-        combine(
-            navigationViewModel.fingerprintFlow,
-            fingerprintViewModel.sensorType,
-          ) { enrollType, sensorType ->
-            Pair(enrollType, sensorType)
+        combine(viewModel.fingerprintFlow, viewModel.sensor.filterNotNull()) {
+            enrollType,
+            sensorType ->
+            Pair(enrollType, sensorType.sensorType)
           }
           .collect { (enrollType, sensorType) ->
             textModel =
@@ -147,7 +143,7 @@
                 R.id.icon_trash_can,
                 R.id.icon_info,
                 R.id.icon_shield,
-                R.id.icon_link
+                R.id.icon_link,
               )
               .forEach { icon ->
                 view.requireViewById<ImageView>(icon).drawable.colorFilter = colorFilter
@@ -186,31 +182,24 @@
       return view
     }
 
-  /**
-   * TODO (b/305269201): This link isn't displaying for screenshot tests.
-   */
+  /** TODO (b/305269201): This link isn't displaying for screenshot tests. */
   private fun setFooterLink(view: View) {
     val footerLink: TextView = view.requireViewById(R.id.footer_learn_more)
     footerLink.movementMethod = LinkMovementMethod.getInstance()
     footerLink.text =
       Html.fromHtml(
         getString(R.string.security_settings_fingerprint_v2_enroll_introduction_message_learn_more),
-        Html.FROM_HTML_MODE_LEGACY
+        Html.FROM_HTML_MODE_LEGACY,
       )
   }
 
-  private fun setupFooterBarAndScrollView(
-    view: View,
-  ) {
+  private fun setupFooterBarAndScrollView(view: View) {
     val scrollView: ScrollView =
       view.requireViewById(com.google.android.setupdesign.R.id.sud_scroll_view)
     scrollView.importantForAccessibility = View.IMPORTANT_FOR_ACCESSIBILITY_YES
     // Next button responsible for starting the next fragment.
     val onNextButtonClick: View.OnClickListener =
-      View.OnClickListener {
-        Log.d(TAG, "OnNextClicked")
-        navigationViewModel.nextStep()
-      }
+      View.OnClickListener { viewModel.primaryButtonClicked() }
 
     val layout: GlifLayout = view.findViewById(R.id.setup_wizard_layout)!!
     footerBarMixin = layout.getMixin(FooterBarMixin::class.java)
@@ -225,11 +214,11 @@
     footerBarMixin.setSecondaryButton(
       FooterButton.Builder(requireContext())
         .setText(textModel.negativeButton)
-        .setListener({ Log.d(TAG, "prevClicked") })
+        .setListener { viewModel.onSecondaryButtonClicked() }
         .setButtonType(FooterButton.ButtonType.NEXT)
         .setTheme(com.google.android.setupdesign.R.style.SudGlifButton_Primary)
         .build(),
-      true /* usePrimaryStyle */
+      true, /* usePrimaryStyle */
     )
 
     val primaryButton = footerBarMixin.primaryButton
@@ -242,7 +231,7 @@
       requireContext(),
       primaryButton,
       R.string.security_settings_face_enroll_introduction_more,
-      onNextButtonClick
+      onNextButtonClick,
     )
 
     requireScrollMixin.setOnRequireScrollStateChangedListener { scrollNeeded: Boolean ->
@@ -257,7 +246,7 @@
         if (consented) {
           primaryButton.setText(
             requireContext(),
-            R.string.security_settings_fingerprint_enroll_introduction_agree
+            R.string.security_settings_fingerprint_enroll_introduction_agree,
           )
           secondaryButton.visibility = View.VISIBLE
         } else {
@@ -309,7 +298,7 @@
   private fun getIconColorFilter(): PorterDuffColorFilter {
     return PorterDuffColorFilter(
       DynamicColorPalette.getColor(context, DynamicColorPalette.ColorType.ACCENT),
-      PorterDuff.Mode.SRC_IN
+      PorterDuff.Mode.SRC_IN,
     )
   }
 }
diff --git a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/modules/enrolling/rfps/ui/fragment/RFPSEnrollFragment.kt b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/modules/enrolling/rfps/ui/fragment/RFPSEnrollFragment.kt
index d8c2f5a..c6e284a 100644
--- a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/modules/enrolling/rfps/ui/fragment/RFPSEnrollFragment.kt
+++ b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/modules/enrolling/rfps/ui/fragment/RFPSEnrollFragment.kt
@@ -32,13 +32,15 @@
 import androidx.lifecycle.lifecycleScope
 import androidx.lifecycle.repeatOnLifecycle
 import com.android.settings.R
-import com.android.settings.biometrics.fingerprint2.shared.model.FingerEnrollState
+import com.android.settings.biometrics.fingerprint2.lib.model.FingerEnrollState
 import com.android.settings.biometrics.fingerprint2.ui.enrollment.modules.enrolling.rfps.ui.viewmodel.RFPSIconTouchViewModel
 import com.android.settings.biometrics.fingerprint2.ui.enrollment.modules.enrolling.rfps.ui.viewmodel.RFPSViewModel
 import com.android.settings.biometrics.fingerprint2.ui.enrollment.modules.enrolling.rfps.ui.widget.FingerprintErrorDialog
 import com.android.settings.biometrics.fingerprint2.ui.enrollment.modules.enrolling.rfps.ui.widget.IconTouchDialog
 import com.android.settings.biometrics.fingerprint2.ui.enrollment.modules.enrolling.rfps.ui.widget.RFPSProgressBar
 import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.BackgroundViewModel
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintNavigationStep
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintNavigationViewModel
 import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.OrientationStateViewModel
 import com.android.settings.core.instrumentation.InstrumentedDialogFragment
 import com.google.android.setupcompat.template.FooterBarMixin
@@ -49,8 +51,6 @@
 import kotlinx.coroutines.flow.filterNotNull
 import kotlinx.coroutines.launch
 
-private const val TAG = "RFPSEnrollFragment"
-
 /** This fragment is responsible for taking care of rear fingerprint enrollment. */
 class RFPSEnrollFragment : Fragment(R.layout.fingerprint_v2_rfps_enroll_enrolling) {
 
@@ -74,11 +74,14 @@
   private val backgroundViewModel: BackgroundViewModel by lazy {
     ViewModelProvider(requireActivity())[BackgroundViewModel::class.java]
   }
+  private val navigationViewModel: FingerprintNavigationViewModel by lazy {
+    ViewModelProvider(requireActivity())[FingerprintNavigationViewModel::class.java]
+  }
 
   override fun onCreateView(
     inflater: LayoutInflater,
     container: ViewGroup?,
-    savedInstanceState: Bundle?
+    savedInstanceState: Bundle?,
   ): View? {
     val view = super.onCreateView(inflater, container, savedInstanceState)!!
     val fragment = this
@@ -99,7 +102,7 @@
     footerBarMixin.secondaryButton =
       FooterButton.Builder(context)
         .setText(R.string.security_settings_fingerprint_enroll_enrolling_skip)
-        .setListener { Log.e(TAG, "skip enrollment!") }
+        .setListener { rfpsViewModel.negativeButtonClicked() }
         .setButtonType(FooterButton.ButtonType.SKIP)
         .setTheme(com.google.android.setupdesign.R.style.SudGlifButton_Secondary)
         .build()
@@ -150,7 +153,7 @@
     viewLifecycleOwner.lifecycleScope.launch {
       backgroundViewModel.background
         .filter { inBackground -> inBackground }
-        .collect { rfpsViewModel.stopEnrollment() }
+        .collect { rfpsViewModel.didGoToBackground() }
     }
 
     viewLifecycleOwner.lifecycleScope.launch {
@@ -171,7 +174,6 @@
           .setDuration(200)
           .setInterpolator(linearOutSlowInInterpolator)
           .start()
-
       }
     }
 
@@ -207,6 +209,12 @@
         dismissDialogs()
       }
     }
+
+    viewLifecycleOwner.lifecycleScope.launch {
+      rfpsViewModel.didCompleteEnrollment
+        .filter { it }
+        .collect { rfpsViewModel.finishedSuccessfully() }
+    }
     return view
   }
 
@@ -215,29 +223,19 @@
     viewLifecycleOwner.lifecycleScope.launch {
       try {
         val shouldRestartEnrollment = FingerprintErrorDialog.showInstance(error, fragment)
+        rfpsViewModel.userClickedStopEnrollDialog()
       } catch (exception: Exception) {
         Log.e(TAG, "Exception occurred $exception")
       }
-      onEnrollmentFailed()
     }
   }
 
-  private fun onEnrollmentFailed() {
-    rfpsViewModel.stopEnrollment()
-  }
-
   private fun handleEnrollProgress(progress: FingerEnrollState.EnrollProgress) {
     progressBar.updateProgress(
       progress.remainingSteps.toFloat() / progress.totalStepsRequired.toFloat()
     )
-
-    if (progress.remainingSteps == 0) {
-      performNextStepSuccess()
-    }
   }
 
-  private fun performNextStepSuccess() {}
-
   private fun dismissDialogs() {
     val transaction = parentFragmentManager.beginTransaction()
     for (frag in parentFragmentManager.fragments) {
@@ -249,4 +247,9 @@
     }
     transaction.commitAllowingStateLoss()
   }
+
+  companion object {
+    private const val TAG = "RFPSEnrollFragment"
+    private val navStep = FingerprintNavigationStep.Enrollment::class
+  }
 }
diff --git a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/modules/enrolling/rfps/ui/viewmodel/RFPSIconTouchViewModel.kt b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/modules/enrolling/rfps/ui/viewmodel/RFPSIconTouchViewModel.kt
index c16e65c..cbcb1d4 100644
--- a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/modules/enrolling/rfps/ui/viewmodel/RFPSIconTouchViewModel.kt
+++ b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/modules/enrolling/rfps/ui/viewmodel/RFPSIconTouchViewModel.kt
@@ -38,9 +38,9 @@
   private val _touches: MutableStateFlow<Int> = MutableStateFlow(0)
 
   /**
-   * Whether or not the UI should be showing the dialog. By making this SharingStarted.Eagerly
-   * the first event 0 % 3 == 0 will fire as soon as this view model is created, so it should
-   * be ignored and work as intended.
+   * Whether or not the UI should be showing the dialog. By making this SharingStarted.Eagerly the
+   * first event 0 % 3 == 0 will fire as soon as this view model is created, so it should be ignored
+   * and work as intended.
    */
   val shouldShowDialog: Flow<Boolean> =
     _touches
diff --git a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/modules/enrolling/rfps/ui/viewmodel/RFPSViewModel.kt b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/modules/enrolling/rfps/ui/viewmodel/RFPSViewModel.kt
index 58d604e..99250e6 100644
--- a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/modules/enrolling/rfps/ui/viewmodel/RFPSViewModel.kt
+++ b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/modules/enrolling/rfps/ui/viewmodel/RFPSViewModel.kt
@@ -19,13 +19,17 @@
 import androidx.lifecycle.ViewModel
 import androidx.lifecycle.ViewModelProvider
 import androidx.lifecycle.viewModelScope
-import com.android.settings.biometrics.fingerprint2.shared.model.FingerEnrollState
+import com.android.settings.biometrics.fingerprint2.lib.model.FingerEnrollState
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintAction
 import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintEnrollEnrollingViewModel
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintNavigationStep.Enrollment
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintNavigationViewModel
 import kotlinx.coroutines.flow.Flow
 import kotlinx.coroutines.flow.MutableStateFlow
 import kotlinx.coroutines.flow.SharingStarted
 import kotlinx.coroutines.flow.asStateFlow
 import kotlinx.coroutines.flow.filterIsInstance
+import kotlinx.coroutines.flow.filterNotNull
 import kotlinx.coroutines.flow.map
 import kotlinx.coroutines.flow.shareIn
 import kotlinx.coroutines.flow.transform
@@ -34,9 +38,10 @@
 /** View Model used by the rear fingerprint enrollment fragment. */
 class RFPSViewModel(
   private val fingerprintEnrollViewModel: FingerprintEnrollEnrollingViewModel,
+  private val navigationViewModel: FingerprintNavigationViewModel,
 ) : ViewModel() {
 
-  /** Value to indicate if the text view is visible or not **/
+  /** Value to indicate if the text view is visible or not */
   private val _textViewIsVisible = MutableStateFlow<Boolean>(false)
   val textViewIsVisible: Flow<Boolean> = _textViewIsVisible.asStateFlow()
 
@@ -61,9 +66,8 @@
   val helpMessage: Flow<FingerEnrollState.EnrollHelp?> =
     enrollFlow
       .filterIsInstance<FingerEnrollState.EnrollHelp>()
-      .shareIn(viewModelScope, SharingStarted.Eagerly, 0).transform {
-        _textViewIsVisible.update { true }
-      }
+      .shareIn(viewModelScope, SharingStarted.Eagerly, 0)
+      .transform { _textViewIsVisible.update { true } }
 
   /**
    * The error message should only be shown once, for scenarios like screen rotations, we don't want
@@ -74,6 +78,8 @@
       .filterIsInstance<FingerEnrollState.EnrollError>()
       .shareIn(viewModelScope, SharingStarted.Eagerly, 0)
 
+  val didCompleteEnrollment: Flow<Boolean> = progress.filterNotNull().map { it.remainingSteps == 0 }
+
   /** Indicates if the consumer is ready for enrollment */
   fun readyForEnrollment() {
     fingerprintEnrollViewModel.canEnroll()
@@ -88,15 +94,51 @@
     _textViewIsVisible.update { isVisible }
   }
 
+  /** Indicates that the user is done with trying to enroll a fingerprint */
+  fun userClickedStopEnrollDialog() {
+    navigationViewModel.update(
+      FingerprintAction.USER_CLICKED_FINISH,
+      navStep,
+      "${TAG}#userClickedStopEnrollingDialog",
+    )
+  }
+
+  /** Indicates that the application went to the background. */
+  fun didGoToBackground() {
+    navigationViewModel.update(
+      FingerprintAction.DID_GO_TO_BACKGROUND,
+      navStep,
+      "${TAG}#didGoToBackground",
+    )
+    stopEnrollment()
+  }
+
+  /** Indicates the negative button has been clicked */
+  fun negativeButtonClicked() {
+    navigationViewModel.update(
+      FingerprintAction.NEGATIVE_BUTTON_PRESSED,
+      navStep,
+      "${TAG}negativeButtonClicked",
+    )
+  }
+
+  fun finishedSuccessfully() {
+    navigationViewModel.update(FingerprintAction.NEXT, navStep, "${TAG}#progressFinished")
+  }
+
   class RFPSViewModelFactory(
     private val fingerprintEnrollEnrollingViewModel: FingerprintEnrollEnrollingViewModel,
+    private val navigationViewModel: FingerprintNavigationViewModel,
   ) : ViewModelProvider.Factory {
 
     @Suppress("UNCHECKED_CAST")
-    override fun <T : ViewModel> create(
-      modelClass: Class<T>,
-    ): T {
-      return RFPSViewModel(fingerprintEnrollEnrollingViewModel) as T
+    override fun <T : ViewModel> create(modelClass: Class<T>): T {
+      return RFPSViewModel(fingerprintEnrollEnrollingViewModel, navigationViewModel) as T
     }
   }
+
+  companion object {
+    private val navStep = Enrollment::class
+    private const val TAG = "RFPSViewModel"
+  }
 }
diff --git a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/modules/enrolling/rfps/ui/widget/FingerprintErrorDialog.kt b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/modules/enrolling/rfps/ui/widget/FingerprintErrorDialog.kt
index b9c628e..9c0040b 100644
--- a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/modules/enrolling/rfps/ui/widget/FingerprintErrorDialog.kt
+++ b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/modules/enrolling/rfps/ui/widget/FingerprintErrorDialog.kt
@@ -24,7 +24,7 @@
 import android.util.Log
 import androidx.fragment.app.Fragment
 import com.android.settings.R
-import com.android.settings.biometrics.fingerprint2.shared.model.FingerEnrollState
+import com.android.settings.biometrics.fingerprint2.lib.model.FingerEnrollState
 import com.android.settings.core.instrumentation.InstrumentedDialogFragment
 import kotlin.coroutines.resume
 import kotlinx.coroutines.suspendCancellableCoroutine
@@ -86,39 +86,28 @@
     private const val KEY_TITLE = "fingerprint_title"
     private const val KEY_SHOULD_TRY_AGAIN = "should_try_again"
 
-    suspend fun showInstance(
-        error: FingerEnrollState.EnrollError,
-        fragment: Fragment,
-    ) = suspendCancellableCoroutine { continuation ->
-      val dialog = FingerprintErrorDialog()
-      dialog.onTryAgain = DialogInterface.OnClickListener { _, _ -> continuation.resume(true) }
+    suspend fun showInstance(error: FingerEnrollState.EnrollError, fragment: Fragment) =
+      suspendCancellableCoroutine { continuation ->
+        val dialog = FingerprintErrorDialog()
+        dialog.onTryAgain = DialogInterface.OnClickListener { _, _ -> continuation.resume(true) }
 
-      dialog.onContinue = DialogInterface.OnClickListener { _, _ -> continuation.resume(false) }
+        dialog.onContinue = DialogInterface.OnClickListener { _, _ -> continuation.resume(false) }
 
-      dialog.onCancelListener =
-        DialogInterface.OnCancelListener {
-          Log.d(TAG, "onCancelListener clicked $dialog")
-          continuation.resume(null)
-        }
+        dialog.onCancelListener =
+          DialogInterface.OnCancelListener {
+            Log.d(TAG, "onCancelListener clicked $dialog")
+            continuation.resume(null)
+          }
 
-      continuation.invokeOnCancellation { Log.d(TAG, "invokeOnCancellation $dialog") }
+        continuation.invokeOnCancellation { Log.d(TAG, "invokeOnCancellation $dialog") }
 
-      val bundle = Bundle()
-      bundle.putInt(
-        KEY_TITLE,
-        error.errTitle,
-      )
-      bundle.putInt(
-        KEY_MESSAGE,
-        error.errString,
-      )
-      bundle.putBoolean(
-        KEY_SHOULD_TRY_AGAIN,
-        error.shouldRetryEnrollment,
-      )
-      dialog.arguments = bundle
-      Log.d(TAG, "showing dialog $dialog")
-      dialog.show(fragment.parentFragmentManager, FingerprintErrorDialog::class.java.toString())
-    }
+        val bundle = Bundle()
+        bundle.putInt(KEY_TITLE, error.errTitle)
+        bundle.putInt(KEY_MESSAGE, error.errString)
+        bundle.putBoolean(KEY_SHOULD_TRY_AGAIN, error.shouldRetryEnrollment)
+        dialog.arguments = bundle
+        Log.d(TAG, "showing dialog $dialog")
+        dialog.show(fragment.parentFragmentManager, FingerprintErrorDialog::class.java.toString())
+      }
   }
 }
diff --git a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/AccessibilityViewModel.kt b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/AccessibilityViewModel.kt
index a86ad5d..608b370 100644
--- a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/AccessibilityViewModel.kt
+++ b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/AccessibilityViewModel.kt
@@ -41,15 +41,13 @@
       .stateIn(
         viewModelScope, // This is going to tied to the view model scope
         SharingStarted.WhileSubscribed(), // When no longer subscribed, we removeTheListener
-        false
+        false,
       )
 
   class AccessibilityViewModelFactory(private val accessibilityManager: AccessibilityManager) :
     ViewModelProvider.Factory {
     @Suppress("UNCHECKED_CAST")
-    override fun <T : ViewModel> create(
-      modelClass: Class<T>,
-    ): T {
+    override fun <T : ViewModel> create(modelClass: Class<T>): T {
       return AccessibilityViewModel(accessibilityManager) as T
     }
   }
diff --git a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/FingerprintEnrollEnrollingViewModel.kt b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/FingerprintEnrollEnrollingViewModel.kt
index 7ab315e..63182bb 100644
--- a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/FingerprintEnrollEnrollingViewModel.kt
+++ b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/FingerprintEnrollEnrollingViewModel.kt
@@ -25,8 +25,8 @@
 import kotlinx.coroutines.flow.update
 
 /**
- * This class is a wrapper around the [FingerprintEnrollViewModel] and decides when
- * the user should or should not be enrolling.
+ * This class is a wrapper around the [FingerprintEnrollViewModel] and decides when the user should
+ * or should not be enrolling.
  */
 class FingerprintEnrollEnrollingViewModel(
   private val fingerprintEnrollViewModel: FingerprintEnrollViewModel,
@@ -72,12 +72,10 @@
 
   class FingerprintEnrollEnrollingViewModelFactory(
     private val fingerprintEnrollViewModel: FingerprintEnrollViewModel,
-    private val backgroundViewModel: BackgroundViewModel
+    private val backgroundViewModel: BackgroundViewModel,
   ) : ViewModelProvider.Factory {
     @Suppress("UNCHECKED_CAST")
-    override fun <T : ViewModel> create(
-      modelClass: Class<T>,
-    ): T {
+    override fun <T : ViewModel> create(modelClass: Class<T>): T {
       return FingerprintEnrollEnrollingViewModel(fingerprintEnrollViewModel, backgroundViewModel)
         as T
     }
diff --git a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/FingerprintEnrollFindSensorViewModel.kt b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/FingerprintEnrollFindSensorViewModel.kt
index 7722a46..92261b1 100644
--- a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/FingerprintEnrollFindSensorViewModel.kt
+++ b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/FingerprintEnrollFindSensorViewModel.kt
@@ -19,8 +19,10 @@
 import androidx.lifecycle.ViewModel
 import androidx.lifecycle.ViewModelProvider
 import androidx.lifecycle.viewModelScope
-import com.android.settings.biometrics.fingerprint2.shared.model.FingerEnrollState
-import com.android.settings.biometrics.fingerprint2.shared.model.SetupWizard
+import com.android.settings.biometrics.fingerprint2.lib.model.FingerEnrollState
+import com.android.settings.biometrics.fingerprint2.lib.model.SetupWizard
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.fragment.FingerprintEnrollFindSensorV2Fragment
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintNavigationStep.Education
 import com.android.systemui.biometrics.shared.model.FingerprintSensorType
 import kotlinx.coroutines.flow.Flow
 import kotlinx.coroutines.flow.MutableStateFlow
@@ -36,20 +38,22 @@
 
 /** Models the UI state for [FingerprintEnrollFindSensorV2Fragment]. */
 class FingerprintEnrollFindSensorViewModel(
-  private val navigationViewModel: FingerprintEnrollNavigationViewModel,
+  private val navigationViewModel: FingerprintNavigationViewModel,
   private val fingerprintEnrollViewModel: FingerprintEnrollViewModel,
   private val gatekeeperViewModel: FingerprintGatekeeperViewModel,
   backgroundViewModel: BackgroundViewModel,
   accessibilityViewModel: AccessibilityViewModel,
   foldStateViewModel: FoldStateViewModel,
-  orientationStateViewModel: OrientationStateViewModel
+  orientationStateViewModel: OrientationStateViewModel,
+  fingerprintFlowViewModel: FingerprintFlowViewModel,
 ) : ViewModel() {
+
   /** Represents the stream of sensor type. */
   val sensorType: Flow<FingerprintSensorType> =
     fingerprintEnrollViewModel.sensorType.shareIn(
       viewModelScope,
       SharingStarted.WhileSubscribed(),
-      1
+      1,
     )
   private val _isUdfps: Flow<Boolean> =
     sensorType.map {
@@ -103,10 +107,10 @@
           fingerprintEnrollViewModel.sensorType,
           gatekeeperViewModel.hasValidGatekeeperInfo,
           gatekeeperViewModel.gatekeeperInfo,
-          navigationViewModel.navigationViewModel
-        ) { sensorType, hasValidGatekeeperInfo, gatekeeperInfo, navigationViewModel ->
+          navigationViewModel.currentScreen,
+        ) { sensorType, hasValidGatekeeperInfo, gatekeeperInfo, currStep ->
           val shouldStartEnroll =
-            navigationViewModel.currStep == Education &&
+            currStep is Education &&
               sensorType != FingerprintSensorType.UDFPS_OPTICAL &&
               sensorType != FingerprintSensorType.UDFPS_ULTRASONIC &&
               hasValidGatekeeperInfo
@@ -128,22 +132,19 @@
         // Only collect the flow when we should be running.
         if (it) {
           combine(
-              navigationViewModel.fingerprintFlow,
               fingerprintEnrollViewModel.educationEnrollFlow.filterNotNull(),
-            ) { enrollType, educationFlow ->
-              Pair(enrollType, educationFlow)
+              fingerprintFlowViewModel.fingerprintFlow,
+            ) { educationFlow, type ->
+              Pair(educationFlow, type)
             }
-            .collect { (enrollType, educationFlow) ->
+            .collect { (educationFlow, type) ->
               when (educationFlow) {
-                // TODO: Cancel the enroll() when EnrollProgress is received instead of proceeding
-                // to
-                // Enrolling page. Otherwise Enrolling page will receive the EnrollError.
                 is FingerEnrollState.EnrollProgress -> proceedToEnrolling()
                 is FingerEnrollState.EnrollError -> {
                   if (educationFlow.isCancelled) {
                     proceedToEnrolling()
                   } else {
-                    _showErrorDialog.update { Pair(educationFlow.errString, enrollType == SetupWizard) }
+                    _showErrorDialog.update { Pair(educationFlow.errString, type == SetupWizard) }
                   }
                 }
                 is FingerEnrollState.EnrollHelp -> {}
@@ -169,17 +170,28 @@
 
   /** Proceed to EnrollEnrolling page. */
   fun proceedToEnrolling() {
-    navigationViewModel.nextStep()
+    stopEducation()
+    navigationViewModel.update(FingerprintAction.NEXT, navStep, "$TAG#proceedToEnrolling")
+  }
+
+  /** Indicates the secondary button has been clicked */
+  fun secondaryButtonClicked() {
+    navigationViewModel.update(
+      FingerprintAction.NEGATIVE_BUTTON_PRESSED,
+      navStep,
+      "${TAG}#secondaryButtonClicked",
+    )
   }
 
   class FingerprintEnrollFindSensorViewModelFactory(
-    private val navigationViewModel: FingerprintEnrollNavigationViewModel,
+    private val navigationViewModel: FingerprintNavigationViewModel,
     private val fingerprintEnrollViewModel: FingerprintEnrollViewModel,
     private val gatekeeperViewModel: FingerprintGatekeeperViewModel,
     private val backgroundViewModel: BackgroundViewModel,
     private val accessibilityViewModel: AccessibilityViewModel,
     private val foldStateViewModel: FoldStateViewModel,
-    private val orientationStateViewModel: OrientationStateViewModel
+    private val orientationStateViewModel: OrientationStateViewModel,
+    private val fingerprintFlowViewModel: FingerprintFlowViewModel,
   ) : ViewModelProvider.Factory {
     @Suppress("UNCHECKED_CAST")
     override fun <T : ViewModel> create(modelClass: Class<T>): T {
@@ -190,9 +202,15 @@
         backgroundViewModel,
         accessibilityViewModel,
         foldStateViewModel,
-        orientationStateViewModel
+        orientationStateViewModel,
+        fingerprintFlowViewModel,
       )
         as T
     }
   }
+
+  companion object {
+    private const val TAG = "FingerprintEnrollFindSensorViewModel"
+    private val navStep = Education::class
+  }
 }
diff --git a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/FingerprintEnrollIntroViewModel.kt b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/FingerprintEnrollIntroViewModel.kt
new file mode 100644
index 0000000..3bf003c
--- /dev/null
+++ b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/FingerprintEnrollIntroViewModel.kt
@@ -0,0 +1,75 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel
+
+import androidx.lifecycle.ViewModel
+import androidx.lifecycle.ViewModelProvider
+import com.android.settings.biometrics.fingerprint2.lib.domain.interactor.FingerprintManagerInteractor
+import com.android.settings.biometrics.fingerprint2.lib.model.FingerprintFlow
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintNavigationStep.Introduction
+import com.android.systemui.biometrics.shared.model.FingerprintSensor
+import kotlinx.coroutines.flow.Flow
+
+/** A view model for fingerprint enroll introduction. */
+class FingerprintEnrollIntroViewModel(
+  val navigationViewModel: FingerprintNavigationViewModel,
+  private val fingerprintFlowViewModel: FingerprintFlowViewModel,
+  private val fingerprintManagerInteractor: FingerprintManagerInteractor,
+) : ViewModel() {
+
+  /** Represents a stream of [FingerprintSensor] */
+  val sensor: Flow<FingerprintSensor?> = fingerprintManagerInteractor.sensorPropertiesInternal
+
+  /** Represents a stream of [FingerprintFlow] */
+  val fingerprintFlow: Flow<FingerprintFlow?> = fingerprintFlowViewModel.fingerprintFlow
+
+  /** Indicates the primary button has been clicked */
+  fun primaryButtonClicked() {
+    navigationViewModel.update(FingerprintAction.NEXT, navStep, "${TAG}#onNextClicked")
+  }
+
+  /** Indicates the secondary button has been clicked */
+  fun onSecondaryButtonClicked() {
+    navigationViewModel.update(
+      FingerprintAction.NEGATIVE_BUTTON_PRESSED,
+      navStep,
+      "${TAG}#negativeButtonClicked",
+    )
+  }
+
+  class FingerprintEnrollIntoViewModelFactory(
+    val navigationViewModel: FingerprintNavigationViewModel,
+    val fingerprintFlowViewModel: FingerprintFlowViewModel,
+    val fingerprintManagerInteractor: FingerprintManagerInteractor,
+  ) : ViewModelProvider.Factory {
+
+    @Suppress("UNCHECKED_CAST")
+    override fun <T : ViewModel> create(modelClass: Class<T>): T {
+      return FingerprintEnrollIntroViewModel(
+        navigationViewModel,
+        fingerprintFlowViewModel,
+        fingerprintManagerInteractor,
+      )
+        as T
+    }
+  }
+
+  companion object {
+    val navStep = Introduction::class
+    private const val TAG = "FingerprintEnrollIntroViewModel"
+  }
+}
diff --git a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/FingerprintEnrollViewModel.kt b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/FingerprintEnrollViewModel.kt
index c7a1071..c2cff5e 100644
--- a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/FingerprintEnrollViewModel.kt
+++ b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/FingerprintEnrollViewModel.kt
@@ -18,9 +18,11 @@
 import androidx.lifecycle.ViewModel
 import androidx.lifecycle.ViewModelProvider
 import androidx.lifecycle.viewModelScope
-import com.android.settings.biometrics.fingerprint2.shared.domain.interactor.FingerprintManagerInteractor
-import com.android.settings.biometrics.fingerprint2.shared.model.EnrollReason
-import com.android.settings.biometrics.fingerprint2.shared.model.FingerEnrollState
+import com.android.settings.biometrics.fingerprint2.lib.domain.interactor.FingerprintManagerInteractor
+import com.android.settings.biometrics.fingerprint2.lib.model.EnrollReason
+import com.android.settings.biometrics.fingerprint2.lib.model.FingerEnrollState
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintNavigationStep.Education
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintNavigationStep.Enrollment
 import com.android.systemui.biometrics.shared.model.FingerprintSensorType
 import kotlinx.coroutines.flow.Flow
 import kotlinx.coroutines.flow.SharingStarted
@@ -34,7 +36,7 @@
 class FingerprintEnrollViewModel(
   private val fingerprintManagerInteractor: FingerprintManagerInteractor,
   gatekeeperViewModel: FingerprintGatekeeperViewModel,
-  navigationViewModel: FingerprintEnrollNavigationViewModel,
+  val navigationViewModel: FingerprintNavigationViewModel,
 ) : ViewModel() {
 
   /**
@@ -45,8 +47,8 @@
    */
   var sensorTypeCached: FingerprintSensorType? = null
   private var _enrollReason: Flow<EnrollReason?> =
-    navigationViewModel.navigationViewModel.map {
-      when (it.currStep) {
+    navigationViewModel.currentScreen.map {
+      when (it) {
         is Enrollment -> EnrollReason.EnrollEnrolling
         is Education -> EnrollReason.FindSensor
         else -> null
@@ -64,8 +66,7 @@
    * This flow should be the only flow which calls enroll().
    */
   val _enrollFlow: Flow<FingerEnrollState> =
-    combine(gatekeeperViewModel.gatekeeperInfo, _enrollReason) { hardwareAuthToken, enrollReason,
-        ->
+    combine(gatekeeperViewModel.gatekeeperInfo, _enrollReason) { hardwareAuthToken, enrollReason ->
         Pair(hardwareAuthToken, enrollReason)
       }
       .transformLatest {
@@ -110,18 +111,11 @@
   class FingerprintEnrollViewModelFactory(
     val interactor: FingerprintManagerInteractor,
     val gatekeeperViewModel: FingerprintGatekeeperViewModel,
-    val navigationViewModel: FingerprintEnrollNavigationViewModel,
+    val navigationViewModel: FingerprintNavigationViewModel,
   ) : ViewModelProvider.Factory {
     @Suppress("UNCHECKED_CAST")
-    override fun <T : ViewModel> create(
-      modelClass: Class<T>,
-    ): T {
-      return FingerprintEnrollViewModel(
-        interactor,
-        gatekeeperViewModel,
-        navigationViewModel,
-      )
-        as T
+    override fun <T : ViewModel> create(modelClass: Class<T>): T {
+      return FingerprintEnrollViewModel(interactor, gatekeeperViewModel, navigationViewModel) as T
     }
   }
 }
diff --git a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/FingerprintEnrolllNavigationViewModel.kt b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/FingerprintEnrolllNavigationViewModel.kt
deleted file mode 100644
index 2e5dce0..0000000
--- a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/FingerprintEnrolllNavigationViewModel.kt
+++ /dev/null
@@ -1,141 +0,0 @@
-/*
- * Copyright (C) 2023 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel
-
-import android.util.Log
-import androidx.lifecycle.ViewModel
-import androidx.lifecycle.ViewModelProvider
-import androidx.lifecycle.viewModelScope
-import com.android.settings.biometrics.fingerprint2.shared.domain.interactor.FingerprintManagerInteractor
-import com.android.settings.biometrics.fingerprint2.shared.model.FingerprintFlow
-import kotlinx.coroutines.CoroutineDispatcher
-import kotlinx.coroutines.flow.Flow
-import kotlinx.coroutines.flow.MutableStateFlow
-import kotlinx.coroutines.flow.SharingStarted
-import kotlinx.coroutines.flow.asStateFlow
-import kotlinx.coroutines.flow.filterNotNull
-import kotlinx.coroutines.flow.shareIn
-import kotlinx.coroutines.flow.update
-import kotlinx.coroutines.launch
-
-private const val TAG = "FingerprintEnrollNavigationViewModel"
-
-/**
- * This class is responsible for sending a [NavigationStep] which indicates where the user is in the
- * Fingerprint Enrollment flow
- */
-class FingerprintEnrollNavigationViewModel(
-  private val dispatcher: CoroutineDispatcher,
-  private val fingerprintManagerInteractor: FingerprintManagerInteractor,
-  private val gatekeeperViewModel: FingerprintGatekeeperViewModel,
-  private val firstStep: NextStepViewModel,
-  private val navState: NavState,
-  private val theFingerprintFlow: FingerprintFlow,
-) : ViewModel() {
-
-  private class InternalNavigationStep(
-    lastStep: NextStepViewModel,
-    nextStep: NextStepViewModel,
-    forward: Boolean,
-    var canNavigate: Boolean,
-  ) : NavigationStep(lastStep, nextStep, forward)
-
-  private var _fingerprintFlow = MutableStateFlow<FingerprintFlow?>(theFingerprintFlow)
-
-  /** A flow that indicates the [FingerprintFlow] */
-  val fingerprintFlow: Flow<FingerprintFlow?> = _fingerprintFlow.asStateFlow()
-
-  private val _navigationStep =
-    MutableStateFlow(
-      InternalNavigationStep(PlaceHolderState, firstStep, forward = false, canNavigate = true)
-    )
-
-  init {
-    viewModelScope.launch {
-      gatekeeperViewModel.credentialConfirmed.filterNotNull().collect {
-        if (_navigationStep.value.currStep is LaunchConfirmDeviceCredential) {
-          if (it) nextStep() else finish()
-        }
-      }
-    }
-  }
-
-  /**
-   * A flow that contains the [NavigationStep] used to indicate where in the enrollment process the
-   * user is.
-   */
-  val navigationViewModel: Flow<NavigationStep> = _navigationStep.asStateFlow()
-
-  /** This action indicates that the UI should actually update the navigation to the given step. */
-  val navigationAction: Flow<NavigationStep?> =
-    _navigationStep.shareIn(viewModelScope, SharingStarted.Lazily, 0)
-
-  /** Used to start the next step of Fingerprint Enrollment. */
-  fun nextStep() {
-    viewModelScope.launch {
-      val currStep = _navigationStep.value.currStep
-      val nextStep = currStep.next(navState)
-      Log.d(TAG, "nextStep(${currStep} -> $nextStep)")
-      _navigationStep.update {
-        InternalNavigationStep(currStep, nextStep, forward = true, canNavigate = false)
-      }
-    }
-  }
-
-  /** Go back a step of fingerprint enrollment. */
-  fun prevStep() {
-    viewModelScope.launch {
-      val currStep = _navigationStep.value.currStep
-      val nextStep = currStep.prev(navState)
-      _navigationStep.update {
-        InternalNavigationStep(currStep, nextStep, forward = false, canNavigate = false)
-      }
-    }
-  }
-
-  private fun finish() {
-    _navigationStep.update {
-      InternalNavigationStep(Finish(null), Finish(null), forward = false, canNavigate = false)
-    }
-  }
-
-  class FingerprintEnrollNavigationViewModelFactory(
-    private val backgroundDispatcher: CoroutineDispatcher,
-    private val fingerprintManagerInteractor: FingerprintManagerInteractor,
-    private val fingerprintGatekeeperViewModel: FingerprintGatekeeperViewModel,
-    private val canSkipConfirm: Boolean,
-    private val fingerprintFlow: FingerprintFlow,
-  ) : ViewModelProvider.Factory {
-
-    @Suppress("UNCHECKED_CAST")
-    override fun <T : ViewModel> create(
-      modelClass: Class<T>,
-    ): T {
-
-      val navState = NavState(canSkipConfirm)
-      return FingerprintEnrollNavigationViewModel(
-        backgroundDispatcher,
-        fingerprintManagerInteractor,
-        fingerprintGatekeeperViewModel,
-        Start.next(navState),
-        navState,
-        fingerprintFlow,
-      )
-        as T
-    }
-  }
-}
diff --git a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/FingerprintFlowViewModel.kt b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/FingerprintFlowViewModel.kt
new file mode 100644
index 0000000..f076524
--- /dev/null
+++ b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/FingerprintFlowViewModel.kt
@@ -0,0 +1,39 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel
+
+import androidx.lifecycle.ViewModel
+import androidx.lifecycle.ViewModelProvider
+import androidx.lifecycle.viewModelScope
+import com.android.settings.biometrics.fingerprint2.lib.model.FingerprintFlow
+import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.SharingStarted
+import kotlinx.coroutines.flow.flowOf
+import kotlinx.coroutines.flow.shareIn
+
+class FingerprintFlowViewModel(private val fingerprintFlowType: FingerprintFlow) : ViewModel() {
+  val fingerprintFlow: Flow<FingerprintFlow> =
+    flowOf(fingerprintFlowType).shareIn(viewModelScope, SharingStarted.Eagerly, 1)
+
+  class FingerprintFlowViewModelFactory(val flowType: FingerprintFlow) : ViewModelProvider.Factory {
+
+    @Suppress("UNCHECKED_CAST")
+    override fun <T : ViewModel> create(modelClass: Class<T>): T {
+      return FingerprintFlowViewModel(flowType) as T
+    }
+  }
+}
diff --git a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/FingerprintGatekeeperViewModel.kt b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/FingerprintGatekeeperViewModel.kt
index db93d02..322be6a 100644
--- a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/FingerprintGatekeeperViewModel.kt
+++ b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/FingerprintGatekeeperViewModel.kt
@@ -21,7 +21,7 @@
 import androidx.lifecycle.ViewModel
 import androidx.lifecycle.ViewModelProvider
 import androidx.lifecycle.viewModelScope
-import com.android.settings.biometrics.fingerprint2.shared.domain.interactor.FingerprintManagerInteractor
+import com.android.settings.biometrics.fingerprint2.lib.domain.interactor.FingerprintManagerInteractor
 import kotlinx.coroutines.flow.Flow
 import kotlinx.coroutines.flow.MutableStateFlow
 import kotlinx.coroutines.flow.asStateFlow
@@ -29,11 +29,11 @@
 import kotlinx.coroutines.flow.update
 import kotlinx.coroutines.launch
 
-private const val TAG = "FingerprintGatekeeperViewModel"
-
 sealed interface GatekeeperInfo {
   object Invalid : GatekeeperInfo
+
   object Timeout : GatekeeperInfo
+
   data class GatekeeperPasswordInfo(val token: ByteArray?, val passwordHandle: Long?) :
     GatekeeperInfo
 }
@@ -97,7 +97,19 @@
       }
   }
 
+  class FingerprintGatekeeperViewModelFactory(
+    private val gatekeeperInfo: GatekeeperInfo?,
+    private val fingerprintManagerInteractor: FingerprintManagerInteractor,
+  ) : ViewModelProvider.Factory {
+
+    @Suppress("UNCHECKED_CAST")
+    override fun <T : ViewModel> create(modelClass: Class<T>): T {
+      return FingerprintGatekeeperViewModel(gatekeeperInfo, fingerprintManagerInteractor) as T
+    }
+  }
+
   companion object {
+    private const val TAG = "FingerprintGatekeeperViewModel"
     /**
      * A function that checks if the challenge and token are valid, in which case a
      * [GatekeeperInfo.GatekeeperPasswordInfo] is provided, else [GatekeeperInfo.Invalid]
@@ -110,17 +122,4 @@
       return GatekeeperInfo.GatekeeperPasswordInfo(token, challenge)
     }
   }
-
-  class FingerprintGatekeeperViewModelFactory(
-    private val gatekeeperInfo: GatekeeperInfo?,
-    private val fingerprintManagerInteractor: FingerprintManagerInteractor,
-  ) : ViewModelProvider.Factory {
-
-    @Suppress("UNCHECKED_CAST")
-    override fun <T : ViewModel> create(
-      modelClass: Class<T>,
-    ): T {
-      return FingerprintGatekeeperViewModel(gatekeeperInfo, fingerprintManagerInteractor) as T
-    }
-  }
 }
diff --git a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/FingerprintNavigationStep.kt b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/FingerprintNavigationStep.kt
new file mode 100644
index 0000000..979f953
--- /dev/null
+++ b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/FingerprintNavigationStep.kt
@@ -0,0 +1,186 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel
+
+import com.android.settings.biometrics.fingerprint2.lib.model.FastEnroll
+import com.android.settings.biometrics.fingerprint2.lib.model.FingerprintFlow
+import com.android.systemui.biometrics.shared.model.FingerprintSensor
+
+/**
+ * A [FingerprintAction] event notifies the current [FingerprintNavigationStep] that an event
+ * occurred. Depending on the type of [FingerprintAction] and the current
+ * [FingerprintNavigationStep], the navstep will potentially produce a new
+ * [FingerprintNavigationStep] indicating either 1). Control flow has changed 2). The activity has
+ * finished 3). A transition is required
+ */
+enum class FingerprintAction {
+  NEXT,
+  PREV,
+  CONFIRM_DEVICE_SUCCESS,
+  CONFIRM_DEVICE_FAIL,
+  TRANSITION_FINISHED,
+  DID_GO_TO_BACKGROUND,
+  ACTIVITY_CREATED,
+  NEGATIVE_BUTTON_PRESSED,
+  USER_CLICKED_FINISH,
+}
+
+/** State that can be used to help a [FingerprintNavigationStep] determine the next step to take. */
+data class NavigationState(
+  val flowType: FingerprintFlow,
+  val hasConfirmedDeviceCredential: Boolean,
+  val fingerprintSensor: FingerprintSensor?,
+)
+
+/**
+ * A generic interface for operating on (state, action) -> state? which will produce either another
+ * FingerprintNavStep if something is required, or nothing.
+ *
+ * Note during the lifetime of the Activity, their should only be one [FingerprintNavigationStep] at
+ * a time.
+ */
+sealed interface FingerprintNavigationStep {
+  fun update(state: NavigationState, action: FingerprintAction): FingerprintNavigationStep?
+
+  /**
+   * This indicates that a transition should occur from one screen to another. This class should
+   * contain all necessary info about the transition.
+   *
+   * A transition step will cause a screen to change ownership from the current screen to the
+   * [nextUiStep], after the transition has been completed and a
+   * [FingerprintAction.TRANSITION_FINISHED] has been sent, the [nextUiStep] will be given control.
+   */
+  class TransitionStep(val nextUiStep: UiStep) : FingerprintNavigationStep {
+    override fun update(
+      state: NavigationState,
+      action: FingerprintAction,
+    ): FingerprintNavigationStep? {
+      return when (action) {
+        FingerprintAction.TRANSITION_FINISHED -> nextUiStep
+        else -> null
+      }
+    }
+
+    override fun toString(): String = "TransitionStep(nextUiStep=$nextUiStep)"
+  }
+
+  /** Indicates we should finish the enrolling activity */
+  data class Finish(val result: Int?) : FingerprintNavigationStep {
+    override fun update(
+      state: NavigationState,
+      action: FingerprintAction,
+    ): FingerprintNavigationStep? = null
+  }
+
+  /** UiSteps should have a 1 to 1 mapping between each screen of FingerprintEnrollment */
+  sealed class UiStep : FingerprintNavigationStep
+
+  /** This is the landing page for enrollment, where no content is shown. */
+  data object Init : UiStep() {
+    override fun update(
+      state: NavigationState,
+      action: FingerprintAction,
+    ): FingerprintNavigationStep? {
+      return when (action) {
+        FingerprintAction.ACTIVITY_CREATED -> {
+          if (!state.hasConfirmedDeviceCredential) {
+            TransitionStep(ConfirmDeviceCredential)
+          } else if (state.flowType is FastEnroll) {
+            TransitionStep(Enrollment(state.fingerprintSensor!!))
+          } else {
+            TransitionStep(Introduction)
+          }
+        }
+        else -> null
+      }
+    }
+  }
+
+  /** Indicates the ConfirmDeviceCredential activity is being presented to the user */
+  data object ConfirmDeviceCredential : UiStep() {
+    override fun update(
+      state: NavigationState,
+      action: FingerprintAction,
+    ): FingerprintNavigationStep? {
+      return when (action) {
+        FingerprintAction.CONFIRM_DEVICE_SUCCESS -> TransitionStep(Introduction)
+        FingerprintAction.CONFIRM_DEVICE_FAIL -> Finish(null)
+        else -> null
+      }
+    }
+  }
+
+  /** Indicates the FingerprintIntroduction screen is being presented to the user */
+  data object Introduction : UiStep() {
+    override fun update(
+      state: NavigationState,
+      action: FingerprintAction,
+    ): FingerprintNavigationStep? {
+      return when (action) {
+        FingerprintAction.NEXT -> TransitionStep(Education(state.fingerprintSensor!!))
+        FingerprintAction.NEGATIVE_BUTTON_PRESSED,
+        FingerprintAction.PREV -> Finish(null)
+        else -> null
+      }
+    }
+  }
+
+  /** Indicates the FingerprintEducation screen is being presented to the user */
+  data class Education(val sensor: FingerprintSensor) : UiStep() {
+    override fun update(
+      state: NavigationState,
+      action: FingerprintAction,
+    ): FingerprintNavigationStep? {
+      return when (action) {
+        FingerprintAction.NEXT -> TransitionStep(Enrollment(state.fingerprintSensor!!))
+        FingerprintAction.NEGATIVE_BUTTON_PRESSED,
+        FingerprintAction.PREV -> TransitionStep(Introduction)
+        else -> null
+      }
+    }
+  }
+
+  /** Indicates the Enrollment screen is being presented to the user */
+  data class Enrollment(val sensor: FingerprintSensor) : UiStep() {
+    override fun update(
+      state: NavigationState,
+      action: FingerprintAction,
+    ): FingerprintNavigationStep? {
+      return when (action) {
+        FingerprintAction.NEXT -> TransitionStep(Confirmation)
+        FingerprintAction.NEGATIVE_BUTTON_PRESSED,
+        FingerprintAction.USER_CLICKED_FINISH,
+        FingerprintAction.DID_GO_TO_BACKGROUND -> Finish(null)
+        else -> null
+      }
+    }
+  }
+
+  /** Indicates the Confirmation screen is being presented to the user */
+  data object Confirmation : UiStep() {
+    override fun update(
+      state: NavigationState,
+      action: FingerprintAction,
+    ): FingerprintNavigationStep? {
+      return when (action) {
+        FingerprintAction.NEXT -> Finish(null)
+        FingerprintAction.PREV -> TransitionStep(Education(state.fingerprintSensor!!))
+        else -> null
+      }
+    }
+  }
+}
diff --git a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/FingerprintNavigationViewModel.kt b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/FingerprintNavigationViewModel.kt
new file mode 100644
index 0000000..26c20cf
--- /dev/null
+++ b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/FingerprintNavigationViewModel.kt
@@ -0,0 +1,147 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel
+
+import android.util.Log
+import androidx.lifecycle.ViewModel
+import androidx.lifecycle.ViewModelProvider
+import androidx.lifecycle.viewModelScope
+import com.android.settings.biometrics.fingerprint2.lib.domain.interactor.FingerprintManagerInteractor
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintNavigationStep.Finish
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintNavigationStep.TransitionStep
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintNavigationStep.UiStep
+import java.lang.NullPointerException
+import kotlin.reflect.KClass
+import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.MutableStateFlow
+import kotlinx.coroutines.flow.asStateFlow
+import kotlinx.coroutines.flow.combineTransform
+import kotlinx.coroutines.flow.filterNotNull
+import kotlinx.coroutines.flow.update
+import kotlinx.coroutines.launch
+
+/**
+ * This class is essentially a wrapper around [FingerprintNavigationStep] that will be used by
+ * fragments/viewmodels that want to consume these events. It should provide no additional
+ * functionality beyond what is available in [FingerprintNavigationStep].
+ */
+class FingerprintNavigationViewModel(
+  step: UiStep,
+  hasConfirmedDeviceCredential: Boolean,
+  flowViewModel: FingerprintFlowViewModel,
+  fingerprintManagerInteractor: FingerprintManagerInteractor,
+) : ViewModel() {
+
+  private var _navStateInternal: MutableStateFlow<NavigationState?> = MutableStateFlow(null)
+
+  init {
+    viewModelScope.launch {
+      flowViewModel.fingerprintFlow
+        .combineTransform(fingerprintManagerInteractor.sensorPropertiesInternal) { flow, props ->
+          if (props?.sensorId != -1) {
+            emit(NavigationState(flow, hasConfirmedDeviceCredential, props))
+          }
+        }
+        .collect { navState -> _navStateInternal.update { navState } }
+    }
+  }
+
+  private var _currentStep = MutableStateFlow<FingerprintNavigationStep?>(step)
+
+  private var _navigateTo: MutableStateFlow<UiStep?> = MutableStateFlow(null)
+  val navigateTo: Flow<UiStep?> = _navigateTo.asStateFlow()
+
+  /**
+   * This indicates a navigation event should occur. Navigation depends on navStateInternal being
+   * present.
+   */
+  val currentStep: Flow<FingerprintNavigationStep> =
+    _currentStep.filterNotNull().combineTransform(_navStateInternal.filterNotNull()) { navigation, _
+      ->
+      emit(navigation)
+    }
+
+  private var _finishState = MutableStateFlow<Finish?>(null)
+
+  /** This indicates the activity should finish. */
+  val shouldFinish: Flow<Finish?> = _finishState.asStateFlow()
+
+  private var _currentScreen = MutableStateFlow<UiStep?>(null)
+
+  /** This indicates what screen should currently be presenting to the user. */
+  val currentScreen: Flow<UiStep?> = _currentScreen.asStateFlow()
+
+  /** See [updateInternal] for more details */
+  fun update(action: FingerprintAction, caller: KClass<*>, debugStr: String) {
+    Log.d(TAG, "$caller.update($action) $debugStr")
+    val currentStep = _currentStep.value
+    val isUiStep = currentStep is UiStep
+    if (currentStep == null) {
+      throw NullPointerException("current step is null")
+    }
+    if (isUiStep && currentStep::class != caller) {
+      throw IllegalAccessError(
+        "Error $currentStep != $caller, $caller should not be sending any events at this time"
+      )
+    }
+    val navState = _navStateInternal.value
+    if (navState == null) {
+      throw NullPointerException("nav state is null")
+    }
+    val nextStep = currentStep.update(navState, action) ?: return
+    Log.d(TAG, "nextStep=$nextStep")
+    // Whenever an state update occurs, everything should be cleared.
+    _currentStep.update { nextStep }
+    _finishState.update { null }
+    _currentScreen.update { null }
+
+    when (nextStep) {
+      is TransitionStep -> {
+        _navigateTo.update { nextStep.nextUiStep }
+      }
+      is Finish -> {
+        _finishState.update { nextStep }
+      }
+      is UiStep -> {
+        _currentScreen.update { nextStep }
+      }
+    }
+  }
+
+  class FingerprintNavigationViewModelFactory(
+    private val step: UiStep,
+    private val hasConfirmedDeviceCredential: Boolean,
+    private val flowViewModel: FingerprintFlowViewModel,
+    private val fingerprintManagerInteractor: FingerprintManagerInteractor,
+  ) : ViewModelProvider.Factory {
+
+    @Suppress("UNCHECKED_CAST")
+    override fun <T : ViewModel> create(modelClass: Class<T>): T {
+      return FingerprintNavigationViewModel(
+        step,
+        hasConfirmedDeviceCredential,
+        flowViewModel,
+        fingerprintManagerInteractor,
+      )
+        as T
+    }
+  }
+
+  companion object {
+    private const val TAG = "FingerprintNavigationViewModel"
+  }
+}
diff --git a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/FingerprintScrollViewModel.kt b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/FingerprintScrollViewModel.kt
index 989d4d3..bc9703d 100644
--- a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/FingerprintScrollViewModel.kt
+++ b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/FingerprintScrollViewModel.kt
@@ -39,9 +39,7 @@
   class FingerprintScrollViewModelFactory : ViewModelProvider.Factory {
 
     @Suppress("UNCHECKED_CAST")
-    override fun <T : ViewModel> create(
-      modelClass: Class<T>,
-    ): T {
+    override fun <T : ViewModel> create(modelClass: Class<T>): T {
       return FingerprintScrollViewModel() as T
     }
   }
diff --git a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/FoldStateViewModel.kt b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/FoldStateViewModel.kt
index a4c7ff2..94a70b0 100644
--- a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/FoldStateViewModel.kt
+++ b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/FoldStateViewModel.kt
@@ -49,9 +49,7 @@
 
   class FoldStateViewModelFactory(private val context: Context) : ViewModelProvider.Factory {
     @Suppress("UNCHECKED_CAST")
-    override fun <T : ViewModel> create(
-      modelClass: Class<T>,
-    ): T {
+    override fun <T : ViewModel> create(modelClass: Class<T>): T {
       return FoldStateViewModel(context) as T
     }
   }
diff --git a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/NextStepViewModel.kt b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/NextStepViewModel.kt
deleted file mode 100644
index b68f6d6..0000000
--- a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/NextStepViewModel.kt
+++ /dev/null
@@ -1,104 +0,0 @@
-/*
- * Copyright (C) 2023 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel
-
-/**
- * A class that represents an action that the consumer should transition between lastStep and
- * currStep and in what direction this transition is occurring (e.g. forward or backwards)
- */
-open class NavigationStep(
-  val lastStep: NextStepViewModel,
-  val currStep: NextStepViewModel,
-  val forward: Boolean
-) {
-  override fun toString(): String {
-    return "lastStep=$lastStep, currStep=$currStep, forward=$forward"
-  }
-}
-
-/** The navigation state used by a [NavStep] to determine what the [NextStepViewModel] should be. */
-class NavState(val confirmedDevice: Boolean)
-
-interface NavStep<T> {
-  fun next(state: NavState): T
-  fun prev(state: NavState): T
-}
-
-/**
- * A class to represent a high level step (I.E. EnrollmentIntroduction) for FingerprintEnrollment.
- */
-sealed class NextStepViewModel : NavStep<NextStepViewModel>
-
-/**
- * This is the initial state for the previous step, used to indicate that there have been no
- * previous states.
- */
-object PlaceHolderState : NextStepViewModel() {
-  override fun next(state: NavState): NextStepViewModel = Finish(null)
-
-  override fun prev(state: NavState): NextStepViewModel = Finish(null)
-}
-
-/**
- * This state is the initial state for the current step, and will be used to determine if the user
- * needs to [LaunchConfirmDeviceCredential] if not, it will go to [Intro]
- */
-data object Start : NextStepViewModel() {
-  override fun next(state: NavState): NextStepViewModel =
-    if (state.confirmedDevice) Intro else LaunchConfirmDeviceCredential
-
-  override fun prev(state: NavState): NextStepViewModel = Finish(null)
-}
-
-/** State indicating enrollment has been completed */
-class Finish(val resultCode: Int?) : NextStepViewModel() {
-  override fun next(state: NavState): NextStepViewModel = Finish(resultCode)
-  override fun prev(state: NavState): NextStepViewModel = Finish(null)
-}
-
-/** State for the FingerprintEnrollment introduction */
-data object Intro : NextStepViewModel() {
-  override fun next(state: NavState): NextStepViewModel = Education
-  override fun prev(state: NavState): NextStepViewModel = Finish(null)
-}
-
-/** State for the FingerprintEnrollment education */
-data object Education : NextStepViewModel() {
-  override fun next(state: NavState): NextStepViewModel = Enrollment
-  override fun prev(state: NavState): NextStepViewModel = Intro
-}
-
-/** State for the FingerprintEnrollment enrollment */
-data object Enrollment : NextStepViewModel() {
-  override fun next(state: NavState): NextStepViewModel = Confirmation
-  override fun prev(state: NavState): NextStepViewModel = Education
-}
-
-/** State for the FingerprintEnrollment confirmation */
-object Confirmation : NextStepViewModel() {
-  override fun next(state: NavState): NextStepViewModel = Finish(0)
-  override fun prev(state: NavState): NextStepViewModel = Intro
-}
-
-/**
- * State used to send the user to the ConfirmDeviceCredential activity. This activity can either
- * confirm a users device credential, or have them create one.
- */
-object LaunchConfirmDeviceCredential : NextStepViewModel() {
-  override fun next(state: NavState): NextStepViewModel = Intro
-  override fun prev(state: NavState): NextStepViewModel = Finish(0)
-}
diff --git a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/OrientationStateViewModel.kt b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/OrientationStateViewModel.kt
index 2e5f734..dd266e1 100644
--- a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/OrientationStateViewModel.kt
+++ b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/OrientationStateViewModel.kt
@@ -58,7 +58,7 @@
       .stateIn(
         viewModelScope, // This is going to tied to the view model scope
         SharingStarted.WhileSubscribed(), // When no longer subscribed, we removeTheListener
-        context.display!!.rotation
+        context.display!!.rotation,
       )
 
   fun getRotationFromDefault(rotation: Int): Int {
@@ -73,9 +73,7 @@
 
   class OrientationViewModelFactory(private val context: Context) : ViewModelProvider.Factory {
     @Suppress("UNCHECKED_CAST")
-    override fun <T : ViewModel> create(
-      modelClass: Class<T>,
-    ): T {
+    override fun <T : ViewModel> create(modelClass: Class<T>): T {
       return OrientationStateViewModel(context) as T
     }
   }
diff --git a/src/com/android/settings/biometrics/fingerprint2/ui/settings/binder/FingerprintSettingsViewBinder.kt b/src/com/android/settings/biometrics/fingerprint2/ui/settings/binder/FingerprintSettingsViewBinder.kt
index debdfb8..540e5ee 100644
--- a/src/com/android/settings/biometrics/fingerprint2/ui/settings/binder/FingerprintSettingsViewBinder.kt
+++ b/src/com/android/settings/biometrics/fingerprint2/ui/settings/binder/FingerprintSettingsViewBinder.kt
@@ -19,8 +19,8 @@
 import android.hardware.fingerprint.FingerprintManager
 import android.util.Log
 import androidx.lifecycle.LifecycleCoroutineScope
-import com.android.settings.biometrics.fingerprint2.shared.model.FingerprintAuthAttemptModel
-import com.android.settings.biometrics.fingerprint2.shared.model.FingerprintData
+import com.android.settings.biometrics.fingerprint2.lib.model.FingerprintAuthAttemptModel
+import com.android.settings.biometrics.fingerprint2.lib.model.FingerprintData
 import com.android.settings.biometrics.fingerprint2.ui.settings.binder.FingerprintSettingsViewBinder.FingerprintView
 import com.android.settings.biometrics.fingerprint2.ui.settings.viewmodel.EnrollAdditionalFingerprint
 import com.android.settings.biometrics.fingerprint2.ui.settings.viewmodel.EnrollFirstFingerprint
@@ -52,7 +52,7 @@
       userId: Int,
       gateKeeperPasswordHandle: Long?,
       challenge: Long?,
-      challengeToken: ByteArray?
+      challengeToken: ByteArray?,
     )
     /** Helper to launch an add fingerprint request */
     fun launchAddFingerprint(userId: Int, challengeToken: ByteArray?)
@@ -158,7 +158,7 @@
               nextStep.userId,
               nextStep.gateKeeperPasswordHandle,
               nextStep.challenge,
-              nextStep.challengeToken
+              nextStep.challengeToken,
             )
           is EnrollAdditionalFingerprint ->
             view.launchAddFingerprint(nextStep.userId, nextStep.challengeToken)
diff --git a/src/com/android/settings/biometrics/fingerprint2/ui/settings/fragment/FingerprintDeletionDialog.kt b/src/com/android/settings/biometrics/fingerprint2/ui/settings/fragment/FingerprintDeletionDialog.kt
index 71a22eb..46f64de 100644
--- a/src/com/android/settings/biometrics/fingerprint2/ui/settings/fragment/FingerprintDeletionDialog.kt
+++ b/src/com/android/settings/biometrics/fingerprint2/ui/settings/fragment/FingerprintDeletionDialog.kt
@@ -26,7 +26,7 @@
 import android.os.UserManager
 import androidx.appcompat.app.AlertDialog
 import com.android.settings.R
-import com.android.settings.biometrics.fingerprint2.shared.model.FingerprintData
+import com.android.settings.biometrics.fingerprint2.lib.model.FingerprintData
 import com.android.settings.core.instrumentation.InstrumentedDialogFragment
 import kotlin.coroutines.resume
 import kotlinx.coroutines.suspendCancellableCoroutine
@@ -75,8 +75,7 @@
       message =
         devicePolicyManager?.resources?.getString(messageId) {
           message + "\n\n" + context.getString(defaultMessageId)
-        }
-          ?: ""
+        } ?: ""
     }
 
     alertDialog =
@@ -85,7 +84,7 @@
         .setMessage(message)
         .setPositiveButton(
           R.string.security_settings_fingerprint_enroll_dialog_delete,
-          onClickListener
+          onClickListener,
         )
         .setNegativeButton(R.string.cancel, onNegativeClickListener)
         .create()
@@ -94,10 +93,11 @@
 
   companion object {
     private const val KEY_FINGERPRINT = "fingerprint"
+
     suspend fun showInstance(
-        fp: FingerprintData,
-        lastFingerprint: Boolean,
-        target: FingerprintSettingsV2Fragment,
+      fp: FingerprintData,
+      lastFingerprint: Boolean,
+      target: FingerprintSettingsV2Fragment,
     ) = suspendCancellableCoroutine { continuation ->
       val dialog = FingerprintDeletionDialog()
       dialog.onClickListener = DialogInterface.OnClickListener { _, _ -> continuation.resume(true) }
@@ -109,7 +109,7 @@
       val bundle = Bundle()
       bundle.putObject(
         KEY_FINGERPRINT,
-        android.hardware.fingerprint.Fingerprint(fp.name, fp.fingerId, fp.deviceId)
+        android.hardware.fingerprint.Fingerprint(fp.name, fp.fingerId, fp.deviceId),
       )
       bundle.putBoolean(KEY_IS_LAST_FINGERPRINT, lastFingerprint)
       dialog.arguments = bundle
diff --git a/src/com/android/settings/biometrics/fingerprint2/ui/settings/fragment/FingerprintSettingsPreference.kt b/src/com/android/settings/biometrics/fingerprint2/ui/settings/fragment/FingerprintSettingsPreference.kt
index ea26946..09dcb81 100644
--- a/src/com/android/settings/biometrics/fingerprint2/ui/settings/fragment/FingerprintSettingsPreference.kt
+++ b/src/com/android/settings/biometrics/fingerprint2/ui/settings/fragment/FingerprintSettingsPreference.kt
@@ -22,7 +22,7 @@
 import androidx.lifecycle.lifecycleScope
 import androidx.preference.PreferenceViewHolder
 import com.android.settings.R
-import com.android.settings.biometrics.fingerprint2.shared.model.FingerprintData
+import com.android.settings.biometrics.fingerprint2.lib.model.FingerprintData
 import com.android.settingslib.widget.TwoTargetPreference
 import kotlinx.coroutines.delay
 import kotlinx.coroutines.launch
@@ -30,10 +30,10 @@
 private const val TAG = "FingerprintSettingsPreference"
 
 class FingerprintSettingsPreference(
-    context: Context,
-    val fingerprintViewModel: FingerprintData,
-    val fragment: FingerprintSettingsV2Fragment,
-    val isLastFingerprint: Boolean
+  context: Context,
+  val fingerprintViewModel: FingerprintData,
+  val fragment: FingerprintSettingsV2Fragment,
+  val isLastFingerprint: Boolean,
 ) : TwoTargetPreference(context) {
   private lateinit var myView: View
 
diff --git a/src/com/android/settings/biometrics/fingerprint2/ui/settings/fragment/FingerprintSettingsRenameDialog.kt b/src/com/android/settings/biometrics/fingerprint2/ui/settings/fragment/FingerprintSettingsRenameDialog.kt
index ff469f1..9fef0c5 100644
--- a/src/com/android/settings/biometrics/fingerprint2/ui/settings/fragment/FingerprintSettingsRenameDialog.kt
+++ b/src/com/android/settings/biometrics/fingerprint2/ui/settings/fragment/FingerprintSettingsRenameDialog.kt
@@ -27,7 +27,7 @@
 import android.widget.ImeAwareEditText
 import androidx.appcompat.app.AlertDialog
 import com.android.settings.R
-import com.android.settings.biometrics.fingerprint2.shared.model.FingerprintData
+import com.android.settings.biometrics.fingerprint2.lib.model.FingerprintData
 import com.android.settings.core.instrumentation.InstrumentedDialogFragment
 import kotlin.coroutines.resume
 import kotlinx.coroutines.suspendCancellableCoroutine
@@ -78,7 +78,7 @@
           end: Int,
           dest: Spanned?,
           dstart: Int,
-          dend: Int
+          dend: Int,
         ): CharSequence? {
           for (index in start until end) {
             val c = source[index]
@@ -133,13 +133,13 @@
         val bundle = Bundle()
         bundle.putObject(
           KEY_FINGERPRINT,
-          android.hardware.fingerprint.Fingerprint(fp.name, fp.fingerId, fp.deviceId)
+          android.hardware.fingerprint.Fingerprint(fp.name, fp.fingerId, fp.deviceId),
         )
         dialog.arguments = bundle
         Log.d(TAG, "showing dialog $dialog")
         dialog.show(
           target.parentFragmentManager,
-          FingerprintSettingsRenameDialog::class.java.toString()
+          FingerprintSettingsRenameDialog::class.java.toString(),
         )
       }
   }
diff --git a/src/com/android/settings/biometrics/fingerprint2/ui/settings/fragment/FingerprintSettingsV2Fragment.kt b/src/com/android/settings/biometrics/fingerprint2/ui/settings/fragment/FingerprintSettingsV2Fragment.kt
index c22a5a7..05bb329 100644
--- a/src/com/android/settings/biometrics/fingerprint2/ui/settings/fragment/FingerprintSettingsV2Fragment.kt
+++ b/src/com/android/settings/biometrics/fingerprint2/ui/settings/fragment/FingerprintSettingsV2Fragment.kt
@@ -45,11 +45,12 @@
 import com.android.settings.biometrics.GatekeeperPasswordProvider
 import com.android.settings.biometrics.fingerprint.FingerprintEnrollEnrolling
 import com.android.settings.biometrics.fingerprint.FingerprintEnrollIntroductionInternal
+import com.android.settings.biometrics.fingerprint2.data.repository.FingerprintSensorRepoImpl
+import com.android.settings.biometrics.fingerprint2.data.repository.PressToAuthRepoImpl
 import com.android.settings.biometrics.fingerprint2.domain.interactor.FingerprintManagerInteractorImpl
-import com.android.settings.biometrics.fingerprint2.repository.PressToAuthProviderImpl
-import com.android.settings.biometrics.fingerprint2.shared.model.FingerprintAuthAttemptModel
-import com.android.settings.biometrics.fingerprint2.shared.model.FingerprintData
-import com.android.settings.biometrics.fingerprint2.shared.model.Settings
+import com.android.settings.biometrics.fingerprint2.lib.model.FingerprintAuthAttemptModel
+import com.android.settings.biometrics.fingerprint2.lib.model.FingerprintData
+import com.android.settings.biometrics.fingerprint2.lib.model.Settings
 import com.android.settings.biometrics.fingerprint2.ui.settings.binder.FingerprintSettingsViewBinder
 import com.android.settings.biometrics.fingerprint2.ui.settings.viewmodel.FingerprintSettingsNavigationViewModel
 import com.android.settings.biometrics.fingerprint2.ui.settings.viewmodel.FingerprintSettingsViewModel
@@ -128,12 +129,12 @@
           if (resultCode == BiometricEnrollBase.RESULT_TIMEOUT) {
             navigationViewModel.onEnrollFirstFailure(
               "Received RESULT_TIMEOUT when enrolling",
-              resultCode
+              resultCode,
             )
           } else {
             navigationViewModel.onEnrollFirstFailure(
               "Incorrect resultCode or data was null",
-              resultCode
+              resultCode,
             )
           }
         } else {
@@ -212,21 +213,24 @@
           context.contentResolver,
           Secure.SFPS_PERFORMANT_AUTH_ENABLED,
           toReturn,
-          userHandle
+          userHandle,
         )
       }
 
       toReturn == 1
     }
+    val fingerprintSensorProvider =
+      FingerprintSensorRepoImpl(fingerprintManager, backgroundDispatcher, lifecycleScope)
 
     val interactor =
       FingerprintManagerInteractorImpl(
         context.applicationContext,
         backgroundDispatcher,
         fingerprintManager,
+        fingerprintSensorProvider,
         GatekeeperPasswordProvider(LockPatternUtils(context.applicationContext)),
-        PressToAuthProviderImpl(context),
-        isAnySuw
+        PressToAuthRepoImpl(context),
+        Settings,
       )
 
     val token = intent.getByteArrayExtra(ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE_TOKEN)
@@ -240,8 +244,8 @@
           interactor,
           backgroundDispatcher,
           token,
-          challenge
-        )
+          challenge,
+        ),
       )[FingerprintSettingsNavigationViewModel::class.java]
 
     settingsViewModel =
@@ -252,15 +256,10 @@
           interactor,
           backgroundDispatcher,
           navigationViewModel,
-        )
+        ),
       )[FingerprintSettingsViewModel::class.java]
 
-    FingerprintSettingsViewBinder.bind(
-      this,
-      settingsViewModel,
-      navigationViewModel,
-      lifecycleScope,
-    )
+    FingerprintSettingsViewBinder.bind(this, settingsViewModel, navigationViewModel, lifecycleScope)
   }
 
   override fun getMetricsCategory(): Int {
@@ -364,7 +363,7 @@
       RestrictedLockUtilsInternal.checkIfKeyguardFeaturesDisabled(
         activity,
         DevicePolicyManager.KEYGUARD_DISABLE_FINGERPRINT,
-        requireActivity().userId
+        requireActivity().userId,
       )
     val activity = requireActivity()
     val helpIntent =
@@ -404,7 +403,7 @@
       column.title =
         getString(
           R.string.security_settings_fingerprint_enroll_introduction_v3_message,
-          DeviceHelper.getDeviceName(requireActivity())
+          DeviceHelper.getDeviceName(requireActivity()),
         )
       column.learnMoreOnClickListener = learnMoreClickListener
       column.learnMoreOverrideText =
@@ -437,13 +436,12 @@
       val willDelete =
         fingerprintPreferences()
           .first { it?.fingerprintViewModel == fingerprintViewModel }
-          ?.askUserToDeleteDialog()
-          ?: false
+          ?.askUserToDeleteDialog() ?: false
       if (willDelete) {
         mMetricsFeatureProvider.action(
           context,
           SettingsEnums.ACTION_FINGERPRINT_DELETE,
-          fingerprintViewModel.fingerId
+          fingerprintViewModel.fingerId,
         )
       }
       return willDelete
@@ -466,7 +464,7 @@
         mMetricsFeatureProvider.action(
           context,
           SettingsEnums.ACTION_FINGERPRINT_RENAME,
-          toReturn.first.fingerId
+          toReturn.first.fingerId,
         )
       }
       return toReturn
@@ -518,12 +516,12 @@
     val intent = Intent()
     intent.setClassName(
       SETTINGS_PACKAGE_NAME,
-      FingerprintEnrollIntroductionInternal::class.java.name
+      FingerprintEnrollIntroductionInternal::class.java.name,
     )
     intent.putExtra(EXTRA_FROM_SETTINGS_SUMMARY, true)
     intent.putExtra(
       SettingsBaseActivity.EXTRA_PAGE_TRANSITION_TYPE,
-      SettingsTransitionHelper.TransitionType.TRANSITION_SLIDE
+      SettingsTransitionHelper.TransitionType.TRANSITION_SLIDE,
     )
 
     intent.putExtra(Intent.EXTRA_USER_ID, userId)
@@ -546,7 +544,7 @@
     val intent = Intent()
     intent.setClassName(
       SETTINGS_PACKAGE_NAME,
-      FingerprintEnrollEnrolling::class.qualifiedName.toString()
+      FingerprintEnrollEnrolling::class.qualifiedName.toString(),
     )
     intent.putExtra(Intent.EXTRA_USER_ID, userId)
     intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE_TOKEN, challengeToken)
@@ -568,8 +566,7 @@
 
     return category?.let { cat ->
       cat.childrenToList().map { it as FingerprintSettingsPreference? }
-    }
-      ?: emptyList()
+    } ?: emptyList()
   }
 
   private fun PreferenceCategory.childrenToList(): List<Preference> {
diff --git a/src/com/android/settings/biometrics/fingerprint2/ui/settings/viewmodel/FingerprintSettingsNavigationViewModel.kt b/src/com/android/settings/biometrics/fingerprint2/ui/settings/viewmodel/FingerprintSettingsNavigationViewModel.kt
index 22a25e1..00b91a8 100644
--- a/src/com/android/settings/biometrics/fingerprint2/ui/settings/viewmodel/FingerprintSettingsNavigationViewModel.kt
+++ b/src/com/android/settings/biometrics/fingerprint2/ui/settings/viewmodel/FingerprintSettingsNavigationViewModel.kt
@@ -21,7 +21,7 @@
 import androidx.lifecycle.ViewModelProvider
 import androidx.lifecycle.viewModelScope
 import com.android.settings.biometrics.BiometricEnrollBase
-import com.android.settings.biometrics.fingerprint2.shared.domain.interactor.FingerprintManagerInteractor
+import com.android.settings.biometrics.fingerprint2.lib.domain.interactor.FingerprintManagerInteractor
 import kotlinx.coroutines.CoroutineDispatcher
 import kotlinx.coroutines.flow.MutableStateFlow
 import kotlinx.coroutines.flow.StateFlow
@@ -32,11 +32,11 @@
 
 /** A Viewmodel that represents the navigation of the FingerprintSettings activity. */
 class FingerprintSettingsNavigationViewModel(
-    private val userId: Int,
-    private val fingerprintManagerInteractor: FingerprintManagerInteractor,
-    private val backgroundDispatcher: CoroutineDispatcher,
-    tokenInit: ByteArray?,
-    challengeInit: Long?,
+  private val userId: Int,
+  private val fingerprintManagerInteractor: FingerprintManagerInteractor,
+  private val backgroundDispatcher: CoroutineDispatcher,
+  tokenInit: ByteArray?,
+  challengeInit: Long?,
 ) : ViewModel() {
 
   private var token = tokenInit
@@ -173,17 +173,15 @@
   }
 
   class FingerprintSettingsNavigationModelFactory(
-      private val userId: Int,
-      private val interactor: FingerprintManagerInteractor,
-      private val backgroundDispatcher: CoroutineDispatcher,
-      private val token: ByteArray?,
-      private val challenge: Long?,
+    private val userId: Int,
+    private val interactor: FingerprintManagerInteractor,
+    private val backgroundDispatcher: CoroutineDispatcher,
+    private val token: ByteArray?,
+    private val challenge: Long?,
   ) : ViewModelProvider.Factory {
 
     @Suppress("UNCHECKED_CAST")
-    override fun <T : ViewModel> create(
-      modelClass: Class<T>,
-    ): T {
+    override fun <T : ViewModel> create(modelClass: Class<T>): T {
 
       return FingerprintSettingsNavigationViewModel(
         userId,
diff --git a/src/com/android/settings/biometrics/fingerprint2/ui/settings/viewmodel/FingerprintSettingsViewModel.kt b/src/com/android/settings/biometrics/fingerprint2/ui/settings/viewmodel/FingerprintSettingsViewModel.kt
index 164f79f..80bbb43 100644
--- a/src/com/android/settings/biometrics/fingerprint2/ui/settings/viewmodel/FingerprintSettingsViewModel.kt
+++ b/src/com/android/settings/biometrics/fingerprint2/ui/settings/viewmodel/FingerprintSettingsViewModel.kt
@@ -21,9 +21,9 @@
 import androidx.lifecycle.ViewModel
 import androidx.lifecycle.ViewModelProvider
 import androidx.lifecycle.viewModelScope
-import com.android.settings.biometrics.fingerprint2.shared.domain.interactor.FingerprintManagerInteractor
-import com.android.settings.biometrics.fingerprint2.shared.model.FingerprintAuthAttemptModel
-import com.android.settings.biometrics.fingerprint2.shared.model.FingerprintData
+import com.android.settings.biometrics.fingerprint2.lib.domain.interactor.FingerprintManagerInteractor
+import com.android.settings.biometrics.fingerprint2.lib.model.FingerprintAuthAttemptModel
+import com.android.settings.biometrics.fingerprint2.lib.model.FingerprintData
 import com.android.systemui.biometrics.shared.model.FingerprintSensorType
 import kotlinx.coroutines.CoroutineDispatcher
 import kotlinx.coroutines.flow.Flow
@@ -66,7 +66,7 @@
       emit(
         Pair(
           fingerprintManagerInteractor.canEnrollFingerprints.first(),
-          fingerprintManagerInteractor.maxEnrollableFingerprints.first()
+          fingerprintManagerInteractor.maxEnrollableFingerprints.first(),
         )
       )
     }
@@ -120,7 +120,7 @@
         _isLockedOut,
         _attemptsSoFar,
         _fingerprintSensorType,
-        _sensorNullOrEmpty
+        _sensorNullOrEmpty,
       ) {
         dialogShowing,
         step,
@@ -140,7 +140,7 @@
               "lockedOut=${isLockedOut}," +
               "attempts=${attempts}," +
               "sensorType=${sensorType}" +
-              "sensorNullOrEmpty=${sensorNullOrEmpty}"
+              "sensorNullOrEmpty=${sensorNullOrEmpty}",
           )
         }
         if (sensorNullOrEmpty) {
@@ -294,9 +294,7 @@
   ) : ViewModelProvider.Factory {
 
     @Suppress("UNCHECKED_CAST")
-    override fun <T : ViewModel> create(
-      modelClass: Class<T>,
-    ): T {
+    override fun <T : ViewModel> create(modelClass: Class<T>): T {
 
       return FingerprintSettingsViewModel(
         userId,
@@ -318,7 +316,7 @@
   flow6: Flow<T6>,
   flow7: Flow<T7>,
   flow8: Flow<T8>,
-  crossinline transform: suspend (T1, T2, T3, T4, T5, T6, T7, T8) -> R
+  crossinline transform: suspend (T1, T2, T3, T4, T5, T6, T7, T8) -> R,
 ): Flow<R> {
   return combine(flow, flow2, flow3, flow4, flow5, flow6, flow7, flow8) { args: Array<*> ->
     @Suppress("UNCHECKED_CAST")
diff --git a/src/com/android/settings/biometrics/fingerprint2/ui/settings/viewmodel/NextStepViewModel.kt b/src/com/android/settings/biometrics/fingerprint2/ui/settings/viewmodel/NextStepViewModel.kt
index d9155b6..3acedb1 100644
--- a/src/com/android/settings/biometrics/fingerprint2/ui/settings/viewmodel/NextStepViewModel.kt
+++ b/src/com/android/settings/biometrics/fingerprint2/ui/settings/viewmodel/NextStepViewModel.kt
@@ -29,10 +29,8 @@
   val challengeToken: ByteArray?,
 ) : NextStepViewModel()
 
-data class EnrollAdditionalFingerprint(
-  val userId: Int,
-  val challengeToken: ByteArray?,
-) : NextStepViewModel()
+data class EnrollAdditionalFingerprint(val userId: Int, val challengeToken: ByteArray?) :
+  NextStepViewModel()
 
 data class FinishSettings(val reason: String) : NextStepViewModel()
 
diff --git a/src/com/android/settings/biometrics/fingerprint2/ui/settings/viewmodel/PreferenceViewModel.kt b/src/com/android/settings/biometrics/fingerprint2/ui/settings/viewmodel/PreferenceViewModel.kt
index 181da4e..2a1d9c6 100644
--- a/src/com/android/settings/biometrics/fingerprint2/ui/settings/viewmodel/PreferenceViewModel.kt
+++ b/src/com/android/settings/biometrics/fingerprint2/ui/settings/viewmodel/PreferenceViewModel.kt
@@ -16,15 +16,11 @@
 
 package com.android.settings.biometrics.fingerprint2.ui.settings.viewmodel
 
-import com.android.settings.biometrics.fingerprint2.shared.model.FingerprintData
+import com.android.settings.biometrics.fingerprint2.lib.model.FingerprintData
 
 /** Classed use to represent a Dialogs state. */
 sealed class PreferenceViewModel {
-  data class RenameDialog(
-      val fingerprintViewModel: FingerprintData,
-  ) : PreferenceViewModel()
+  data class RenameDialog(val fingerprintViewModel: FingerprintData) : PreferenceViewModel()
 
-  data class DeleteDialog(
-      val fingerprintViewModel: FingerprintData,
-  ) : PreferenceViewModel()
+  data class DeleteDialog(val fingerprintViewModel: FingerprintData) : PreferenceViewModel()
 }
diff --git a/src/com/android/settings/development/SensitiveContentProtectionPreferenceController.kt b/src/com/android/settings/development/SensitiveContentProtectionPreferenceController.kt
index 6fe56c8..e627f81 100644
--- a/src/com/android/settings/development/SensitiveContentProtectionPreferenceController.kt
+++ b/src/com/android/settings/development/SensitiveContentProtectionPreferenceController.kt
@@ -16,11 +16,11 @@
 package com.android.settings.development
 
 import android.content.Context
+import android.permission.flags.Flags.sensitiveNotificationAppProtection
 import android.provider.Settings
 import androidx.annotation.VisibleForTesting
 import androidx.preference.Preference
 import androidx.preference.TwoStatePreference
-import com.android.server.notification.Flags.sensitiveNotificationAppProtection
 import com.android.server.notification.Flags.screenshareNotificationHiding
 import com.android.settings.core.PreferenceControllerMixin
 import com.android.settingslib.development.DeveloperOptionsPreferenceController
diff --git a/src/com/android/settings/display/DisplayFeatureProvider.java b/src/com/android/settings/display/DisplayFeatureProvider.java
new file mode 100644
index 0000000..a7c8dbb
--- /dev/null
+++ b/src/com/android/settings/display/DisplayFeatureProvider.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.settings.display;
+
+import android.content.Context;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.preference.PreferenceScreen;
+
+import com.android.settings.core.TogglePreferenceController;
+
+/** Feature provider for display settings */
+public interface DisplayFeatureProvider {
+
+    /** Create toggle preference */
+    @Nullable
+    TogglePreferenceController createAdditionalPreference(@NonNull Context context);
+
+    /** Update toggle preference */
+    void updatePreference(@Nullable TogglePreferenceController togglePreferenceController);
+
+    /** Add toggle preference to PreferenceScreen */
+    void addToScreen(@Nullable TogglePreferenceController togglePreferenceController,
+            @NonNull PreferenceScreen screen);
+}
diff --git a/src/com/android/settings/display/DisplayFeatureProviderImpl.java b/src/com/android/settings/display/DisplayFeatureProviderImpl.java
new file mode 100644
index 0000000..c9ec791
--- /dev/null
+++ b/src/com/android/settings/display/DisplayFeatureProviderImpl.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.settings.display;
+
+import android.content.Context;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.preference.PreferenceScreen;
+
+import com.android.settings.core.TogglePreferenceController;
+
+public class DisplayFeatureProviderImpl implements DisplayFeatureProvider {
+
+    @Override
+    @Nullable
+    public TogglePreferenceController createAdditionalPreference(@NonNull Context context) {
+        return null;
+    }
+
+    @Override
+    public void updatePreference(@Nullable TogglePreferenceController togglePreferenceController) {
+
+    }
+
+    @Override
+    public void addToScreen(@Nullable TogglePreferenceController togglePreferenceController,
+            @NonNull PreferenceScreen screen) {
+
+    }
+}
diff --git a/src/com/android/settings/display/ScreenTimeoutSettings.java b/src/com/android/settings/display/ScreenTimeoutSettings.java
index 1c99d5f..2d229a3 100644
--- a/src/com/android/settings/display/ScreenTimeoutSettings.java
+++ b/src/com/android/settings/display/ScreenTimeoutSettings.java
@@ -34,9 +34,11 @@
 import android.provider.Settings;
 import android.util.Log;
 
+import androidx.annotation.Nullable;
 import androidx.preference.PreferenceScreen;
 
 import com.android.settings.R;
+import com.android.settings.core.TogglePreferenceController;
 import com.android.settings.flags.Flags;
 import com.android.settings.overlay.FeatureFactory;
 import com.android.settings.search.BaseSearchIndexProvider;
@@ -106,6 +108,9 @@
     @VisibleForTesting
     AdaptiveSleepBatterySaverPreferenceController mAdaptiveSleepBatterySaverPreferenceController;
 
+    @Nullable
+    TogglePreferenceController mAdditionalTogglePreferenceController;
+
     public ScreenTimeoutSettings() {
         super();
         mMetricsFeatureProvider = FeatureFactory.getFeatureFactory().getMetricsFeatureProvider();
@@ -133,6 +138,8 @@
                 com.android.settingslib.widget.preference.footer.R.layout.preference_footer);
         mPrivacyManager = SensorPrivacyManager.getInstance(context);
         mPrivacyChangedListener = (sensor, enabled) -> mAdaptiveSleepController.updatePreference();
+        mAdditionalTogglePreferenceController = FeatureFactory.getFeatureFactory()
+                .getDisplayFeatureProvider().createAdditionalPreference(context);
     }
 
     @Override
@@ -164,6 +171,8 @@
                 mReceiver, new IntentFilter(PowerManager.ACTION_POWER_SAVE_MODE_CHANGED));
         mPrivacyManager.addSensorPrivacyListener(CAMERA, mPrivacyChangedListener);
         mIsUserAuthenticated = false;
+        FeatureFactory.getFeatureFactory().getDisplayFeatureProvider().updatePreference(
+                mAdditionalTogglePreferenceController);
     }
 
     @Override
@@ -210,6 +219,9 @@
         mPrivacyPreference.setLayoutResource(
                 com.android.settingslib.widget.preference.footer.R.layout.preference_footer);
 
+        FeatureFactory.getFeatureFactory().getDisplayFeatureProvider()
+                .addToScreen(mAdditionalTogglePreferenceController, screen);
+
         if (isScreenAttentionAvailable(getContext())) {
             mAdaptiveSleepPermissionController.addToScreen(screen);
             mAdaptiveSleepCameraStatePreferenceController.addToScreen(screen);
diff --git a/src/com/android/settings/fuelgauge/protos/Android.bp b/src/com/android/settings/fuelgauge/protos/Android.bp
index 531bdc32..462962b 100644
--- a/src/com/android/settings/fuelgauge/protos/Android.bp
+++ b/src/com/android/settings/fuelgauge/protos/Android.bp
@@ -1,4 +1,5 @@
 package {
+    default_team: "trendy_team_android_settings_app",
     // See: http://go/android-license-faq
     // A large-scale-change added 'default_applicable_licenses' to import
     // all of the 'license_kinds' from "packages_apps_Settings_license"
diff --git a/src/com/android/settings/overlay/FeatureFactory.kt b/src/com/android/settings/overlay/FeatureFactory.kt
index 8a68122..37507a8 100644
--- a/src/com/android/settings/overlay/FeatureFactory.kt
+++ b/src/com/android/settings/overlay/FeatureFactory.kt
@@ -29,6 +29,7 @@
 import com.android.settings.dashboard.DashboardFeatureProvider
 import com.android.settings.dashboard.suggestions.SuggestionFeatureProvider
 import com.android.settings.deviceinfo.hardwareinfo.HardwareInfoFeatureProvider
+import com.android.settings.display.DisplayFeatureProvider
 import com.android.settings.enterprise.EnterprisePrivacyFeatureProvider
 import com.android.settings.fuelgauge.BatterySettingsFeatureProvider
 import com.android.settings.fuelgauge.BatteryStatusFeatureProvider
@@ -176,6 +177,11 @@
      */
     abstract val privateSpaceLoginFeatureProvider: PrivateSpaceLoginFeatureProvider
 
+    /**
+     * Gets implementation for Display feature.
+     */
+    abstract val displayFeatureProvider: DisplayFeatureProvider
+
     companion object {
         private var _factory: FeatureFactory? = null
 
diff --git a/src/com/android/settings/overlay/FeatureFactoryImpl.kt b/src/com/android/settings/overlay/FeatureFactoryImpl.kt
index 28dbb23..e0313b7 100644
--- a/src/com/android/settings/overlay/FeatureFactoryImpl.kt
+++ b/src/com/android/settings/overlay/FeatureFactoryImpl.kt
@@ -45,6 +45,8 @@
 import com.android.settings.dashboard.suggestions.SuggestionFeatureProviderImpl
 import com.android.settings.deviceinfo.hardwareinfo.HardwareInfoFeatureProvider
 import com.android.settings.deviceinfo.hardwareinfo.HardwareInfoFeatureProviderImpl
+import com.android.settings.display.DisplayFeatureProvider
+import com.android.settings.display.DisplayFeatureProviderImpl
 import com.android.settings.enterprise.EnterprisePrivacyFeatureProviderImpl
 import com.android.settings.fuelgauge.BatterySettingsFeatureProviderImpl
 import com.android.settings.fuelgauge.BatteryStatusFeatureProviderImpl
@@ -190,4 +192,7 @@
     override val privateSpaceLoginFeatureProvider: PrivateSpaceLoginFeatureProvider by lazy {
         PrivateSpaceLoginFeatureProviderImpl()
     }
+    override val displayFeatureProvider: DisplayFeatureProvider by lazy {
+        DisplayFeatureProviderImpl()
+    }
 }
diff --git a/src/com/android/settings/privacy/CameraExtensionsFallbackPreferenceController.java b/src/com/android/settings/privacy/CameraExtensionsFallbackPreferenceController.java
new file mode 100644
index 0000000..1d9c354
--- /dev/null
+++ b/src/com/android/settings/privacy/CameraExtensionsFallbackPreferenceController.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.privacy;
+
+import static android.provider.Settings.Secure.CAMERA_EXTENSIONS_FALLBACK;
+
+import android.content.Context;
+import android.provider.Settings;
+
+import com.android.settings.R;
+import com.android.settings.core.TogglePreferenceController;
+
+/**
+ * Toggle for camera extensions software fallback
+ */
+public class CameraExtensionsFallbackPreferenceController extends TogglePreferenceController {
+    public CameraExtensionsFallbackPreferenceController(Context context, String key) {
+        super(context, key);
+    }
+
+    @Override
+    public boolean isChecked() {
+        int val = Settings.Secure.getInt(mContext.getContentResolver(),
+                CAMERA_EXTENSIONS_FALLBACK, 1);
+        return val == 1;
+    }
+
+    @Override
+    public boolean setChecked(boolean isChecked) {
+        int val = isChecked ? 1 : 0;
+        return Settings.Secure.putInt(mContext.getContentResolver(),
+                CAMERA_EXTENSIONS_FALLBACK, val);
+    }
+
+    @Override
+    public int getAvailabilityStatus() {
+        return AVAILABLE;
+    }
+
+    @Override
+    public boolean isSliceable() {
+        return false;
+    }
+
+    @Override
+    public int getSliceHighlightMenuRes() {
+        // not needed since it's not sliceable
+        return NO_RES;
+    }
+}
diff --git a/src/com/android/settings/privatespace/AutoAdvanceSetupFragment.java b/src/com/android/settings/privatespace/AutoAdvanceSetupFragment.java
index 9e905f2..13c0681 100644
--- a/src/com/android/settings/privatespace/AutoAdvanceSetupFragment.java
+++ b/src/com/android/settings/privatespace/AutoAdvanceSetupFragment.java
@@ -59,11 +59,11 @@
     private static final List<Pair<Integer, Integer>> HEADER_IMAGE_PAIRS =
             ImmutableList.of(
                     new Pair(R.string.private_space_notifications_hidden_title,
-                            R.drawable.privatespace_setup_flow_placeholder),
+                            R.drawable.private_space_setup_notification_illustration),
                     new Pair(R.string.private_space_share_photos_title,
-                            R.drawable.privatespace_setup_flow_placeholder),
+                            R.drawable.private_space_setup_sharing_illustration),
                     new Pair(R.string.private_space_apps_installed_title,
-                            R.drawable.privatespace_setup_flow_placeholder));
+                            R.drawable.private_space_setup_preinstalled_illustration));
 
     private Runnable mUpdateScreenResources =
             new Runnable() {
@@ -116,7 +116,7 @@
         }
         mRootView =
                 (GlifLayout)
-                        inflater.inflate(R.layout.privatespace_advancing_screen, container, false);
+                        inflater.inflate(R.layout.private_space_advancing_screen, container, false);
         mRootView.getHeaderTextView().setMaxLines(HEADER_TEXT_MAX_LINES);
         updateHeaderAndImage();
         mHandler = new Handler(Looper.getMainLooper());
@@ -157,7 +157,7 @@
 
     private void updateHeaderAndImage() {
         mRootView.setHeaderText(HEADER_IMAGE_PAIRS.get(mScreenTitleIndex).first);
-        ((ImageView) mRootView.findViewById(R.id.placeholder_image))
+        ((ImageView) mRootView.findViewById(R.id.setup_advance_image))
                 .setImageResource(HEADER_IMAGE_PAIRS.get(mScreenTitleIndex).second);
         startFadeInAnimation();
     }
@@ -166,7 +166,7 @@
         ValueAnimator textView =  ObjectAnimator.ofFloat(
                 mRootView.getHeaderTextView(), View.ALPHA, 0f, 1f);
         ValueAnimator imageView = ObjectAnimator.ofFloat(
-                mRootView.findViewById(R.id.placeholder_image), View.ALPHA, 0, 1f);
+                mRootView.findViewById(R.id.setup_advance_image), View.ALPHA, 0, 1f);
         AnimatorSet fadeIn = new AnimatorSet();
         fadeIn.playTogether(textView, imageView);
         fadeIn.setDuration(ANIMATION_DURATION_MILLIS).start();
@@ -177,7 +177,7 @@
         ValueAnimator textView =  ObjectAnimator.ofFloat(
                 mRootView.getHeaderTextView(), View.ALPHA, 1f, 0f);
         ValueAnimator imageView = ObjectAnimator.ofFloat(
-                mRootView.findViewById(R.id.placeholder_image), View.ALPHA, 1f, 0f);
+                mRootView.findViewById(R.id.setup_advance_image), View.ALPHA, 1f, 0f);
         fadeOut.playTogether(textView, imageView);
         fadeOut.setDuration(ANIMATION_DURATION_MILLIS).start();
         fadeOut.addListener(new AnimatorListenerAdapter() {
diff --git a/src/com/android/settings/privatespace/PrivateSpaceDashboardFragment.java b/src/com/android/settings/privatespace/PrivateSpaceDashboardFragment.java
index e426477..726567e 100644
--- a/src/com/android/settings/privatespace/PrivateSpaceDashboardFragment.java
+++ b/src/com/android/settings/privatespace/PrivateSpaceDashboardFragment.java
@@ -34,7 +34,8 @@
     public void onCreate(Bundle icicle) {
         if (android.os.Flags.allowPrivateProfile()) {
             super.onCreate(icicle);
-            if (getIntent().getBooleanExtra(EXTRA_SHOW_PRIVATE_SPACE_UNLOCKED, false)) {
+            if (icicle == null
+                    && getIntent().getBooleanExtra(EXTRA_SHOW_PRIVATE_SPACE_UNLOCKED, false)) {
                 Log.i(TAG, "Private space unlocked showing toast");
                 Toast.makeText(getContext(), R.string.private_space_unlocked, Toast.LENGTH_SHORT)
                         .show();
diff --git a/src/com/android/settings/privatespace/PrivateSpaceEducation.java b/src/com/android/settings/privatespace/PrivateSpaceEducation.java
index e54982b..7b06f5b 100644
--- a/src/com/android/settings/privatespace/PrivateSpaceEducation.java
+++ b/src/com/android/settings/privatespace/PrivateSpaceEducation.java
@@ -48,7 +48,7 @@
         }
         GlifLayout rootView =
                 (GlifLayout)
-                        inflater.inflate(R.layout.privatespace_education_screen, container, false);
+                        inflater.inflate(R.layout.private_space_education_screen, container, false);
         final FooterBarMixin mixin = rootView.getMixin(FooterBarMixin.class);
         mixin.setPrimaryButton(
                 new FooterButton.Builder(getContext())
diff --git a/src/com/android/settings/privatespace/PrivateSpaceSetLockFragment.java b/src/com/android/settings/privatespace/PrivateSpaceSetLockFragment.java
index 9e2e5cc..56add6d 100644
--- a/src/com/android/settings/privatespace/PrivateSpaceSetLockFragment.java
+++ b/src/com/android/settings/privatespace/PrivateSpaceSetLockFragment.java
@@ -56,7 +56,7 @@
         }
         GlifLayout rootView =
                 (GlifLayout)
-                        inflater.inflate(R.layout.privatespace_setlock_screen, container, false);
+                        inflater.inflate(R.layout.private_space_setlock_screen, container, false);
         final FooterBarMixin mixin = rootView.getMixin(FooterBarMixin.class);
         mixin.setPrimaryButton(
                 new FooterButton.Builder(getContext())
diff --git a/src/com/android/settings/privatespace/SetupSuccessFragment.java b/src/com/android/settings/privatespace/SetupSuccessFragment.java
index b1e0edc..13de1fc 100644
--- a/src/com/android/settings/privatespace/SetupSuccessFragment.java
+++ b/src/com/android/settings/privatespace/SetupSuccessFragment.java
@@ -52,7 +52,7 @@
         }
         GlifLayout rootView =
                 (GlifLayout)
-                        inflater.inflate(R.layout.privatespace_setup_success, container, false);
+                        inflater.inflate(R.layout.private_space_setup_success, container, false);
         final FooterBarMixin mixin = rootView.getMixin(FooterBarMixin.class);
         mixin.setPrimaryButton(
                 new FooterButton.Builder(getContext())
diff --git a/src/com/android/settings/webview/WebViewUpdateServiceWrapper.java b/src/com/android/settings/webview/WebViewUpdateServiceWrapper.java
index 05855e4..546320c 100644
--- a/src/com/android/settings/webview/WebViewUpdateServiceWrapper.java
+++ b/src/com/android/settings/webview/WebViewUpdateServiceWrapper.java
@@ -20,12 +20,12 @@
 import android.content.pm.ApplicationInfo;
 import android.content.pm.PackageInfo;
 import android.content.pm.PackageManager;
-import android.os.RemoteException;
 import android.util.Log;
 import android.webkit.IWebViewUpdateService;
 import android.webkit.UserPackage;
 import android.webkit.WebViewFactory;
 import android.webkit.WebViewProviderInfo;
+import android.webkit.WebViewUpdateManager;
 import android.widget.Toast;
 
 import androidx.annotation.Nullable;
@@ -44,8 +44,12 @@
      */
     public PackageInfo getCurrentWebViewPackage() {
         try {
-            return WebViewFactory.getUpdateService().getCurrentWebViewPackage();
-        } catch (RemoteException e) {
+            if (android.webkit.Flags.updateServiceIpcWrapper()) {
+                return WebViewUpdateManager.getInstance().getCurrentWebViewPackage();
+            } else {
+                return WebViewFactory.getUpdateService().getCurrentWebViewPackage();
+            }
+        } catch (Exception e) {
             Log.e(TAG, e.toString());
         }
         return null;
@@ -59,8 +63,13 @@
     public List<ApplicationInfo> getValidWebViewApplicationInfos(Context context) {
         WebViewProviderInfo[] providers = null;
         try {
-            providers = WebViewFactory.getUpdateService().getValidWebViewPackages();
-        } catch (RemoteException e) {
+            if (android.webkit.Flags.updateServiceIpcWrapper()) {
+                providers = context.getSystemService(WebViewUpdateManager.class)
+                        .getValidWebViewPackages();
+            } else {
+                providers = WebViewFactory.getUpdateService().getValidWebViewPackages();
+            }
+        } catch (Exception e) {
         }
         List<ApplicationInfo> pkgs = new ArrayList<>();
         for (WebViewProviderInfo provider : providers) {
@@ -80,10 +89,15 @@
      */
     public boolean setWebViewProvider(String packageName) {
         try {
-            return packageName.equals(
-                    WebViewFactory.getUpdateService().changeProviderAndSetting(packageName));
-        } catch (RemoteException e) {
-            Log.e(TAG, "RemoteException when trying to change provider to " + packageName, e);
+            if (android.webkit.Flags.updateServiceIpcWrapper()) {
+                return packageName.equals(
+                        WebViewUpdateManager.getInstance().changeProviderAndSetting(packageName));
+            } else {
+                return packageName.equals(
+                        WebViewFactory.getUpdateService().changeProviderAndSetting(packageName));
+            }
+        } catch (Exception e) {
+            Log.e(TAG, "Exception when trying to change provider to " + packageName, e);
         }
         return false;
     }
@@ -112,18 +126,23 @@
      */
     @Nullable
     public String getDefaultWebViewPackageName() {
+        WebViewProviderInfo provider = null;
         try {
-            IWebViewUpdateService service = WebViewFactory.getUpdateService();
-            if (service != null) {
-                WebViewProviderInfo provider = service.getDefaultWebViewPackage();
-                if (provider != null) {
-                    return provider.packageName;
+            if (android.webkit.Flags.updateServiceIpcWrapper()) {
+                WebViewUpdateManager manager = WebViewUpdateManager.getInstance();
+                if (manager != null) {
+                    provider = manager.getDefaultWebViewPackage();
+                }
+            } else {
+                IWebViewUpdateService service = WebViewFactory.getUpdateService();
+                if (service != null) {
+                    provider = service.getDefaultWebViewPackage();
                 }
             }
-        } catch (RemoteException e) {
-            Log.e(TAG, "RemoteException when trying to fetch default WebView package Name", e);
+        } catch (Exception e) {
+            Log.e(TAG, "Exception when trying to fetch default WebView package Name", e);
         }
-        return null;
+        return provider != null ? provider.packageName : null;
     }
 
     static final int PACKAGE_FLAGS = PackageManager.MATCH_ANY_USER;
diff --git a/tests/anomaly-tester/Android.bp b/tests/anomaly-tester/Android.bp
index 0b05e04..d437a6c 100644
--- a/tests/anomaly-tester/Android.bp
+++ b/tests/anomaly-tester/Android.bp
@@ -1,4 +1,5 @@
 package {
+    default_team: "trendy_team_android_settings_app",
     // See: http://go/android-license-faq
     // A large-scale-change added 'default_applicable_licenses' to import
     // all of the 'license_kinds' from "packages_apps_Settings_license"
diff --git a/tests/componenttests/Android.bp b/tests/componenttests/Android.bp
index 300a338..48d3ab0 100644
--- a/tests/componenttests/Android.bp
+++ b/tests/componenttests/Android.bp
@@ -2,6 +2,7 @@
 // Settings Component test target.                           #
 //############################################################
 package {
+    default_team: "trendy_team_android_settings_app",
     // See: http://go/android-license-faq
     // A large-scale-change added 'default_applicable_licenses' to import
     // all of the 'license_kinds' from "packages_apps_Settings_license"
diff --git a/tests/legacy_unit/InstrumentedEntitlementApp/Android.bp b/tests/legacy_unit/InstrumentedEntitlementApp/Android.bp
index 1ec108a..cc0e63d 100644
--- a/tests/legacy_unit/InstrumentedEntitlementApp/Android.bp
+++ b/tests/legacy_unit/InstrumentedEntitlementApp/Android.bp
@@ -13,6 +13,7 @@
 // limitations under the License.
 
 package {
+    default_team: "trendy_team_android_settings_app",
     // See: http://go/android-license-faq
     // A large-scale-change added 'default_applicable_licenses' to import
     // all of the 'license_kinds' from "packages_apps_Settings_license"
diff --git a/tests/perftests/Android.bp b/tests/perftests/Android.bp
index 7d3b75b..7e3a8aa 100644
--- a/tests/perftests/Android.bp
+++ b/tests/perftests/Android.bp
@@ -1,4 +1,5 @@
 package {
+    default_team: "trendy_team_android_settings_app",
     // See: http://go/android-license-faq
     // A large-scale-change added 'default_applicable_licenses' to import
     // all of the 'license_kinds' from "packages_apps_Settings_license"
diff --git a/tests/robotests/Android.bp b/tests/robotests/Android.bp
index d313878..5648290 100644
--- a/tests/robotests/Android.bp
+++ b/tests/robotests/Android.bp
@@ -1,4 +1,5 @@
 package {
+    default_team: "trendy_team_android_settings_app",
     // See: http://go/android-license-faq
     // A large-scale-change added 'default_applicable_licenses' to import
     // all of the 'license_kinds' from "packages_apps_Settings_license"
diff --git a/tests/robotests/src/com/android/settings/biometrics/fingerprint2/fragment/FingerprintEnrollIntroFragmentTest.kt b/tests/robotests/src/com/android/settings/biometrics/fingerprint2/fragment/FingerprintEnrollIntroFragmentTest.kt
index 024f346..cea72aa 100644
--- a/tests/robotests/src/com/android/settings/biometrics/fingerprint2/fragment/FingerprintEnrollIntroFragmentTest.kt
+++ b/tests/robotests/src/com/android/settings/biometrics/fingerprint2/fragment/FingerprintEnrollIntroFragmentTest.kt
@@ -33,16 +33,20 @@
 import androidx.test.espresso.matcher.ViewMatchers.withText
 import androidx.test.runner.AndroidJUnit4
 import com.android.settings.R
-import com.android.settings.biometrics.fingerprint2.shared.model.Default
+import com.android.settings.biometrics.fingerprint2.lib.model.Default
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintNavigationStep.Introduction
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.NavigationState
 import com.android.settings.biometrics.fingerprint2.ui.enrollment.fragment.FingerprintEnrollIntroV2Fragment
-import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintEnrollNavigationViewModel
-import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintEnrollViewModel
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintEnrollIntroViewModel
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintFlowViewModel
 import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintGatekeeperViewModel
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintNavigationViewModel
 import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintScrollViewModel
 import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.GatekeeperInfo
-import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.Intro
-import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.NavState
 import com.android.settings.testutils2.FakeFingerprintManagerInteractor
+import com.android.systemui.biometrics.shared.model.FingerprintSensor
+import com.android.systemui.biometrics.shared.model.FingerprintSensorType
+import com.android.systemui.biometrics.shared.model.SensorStrength
 import com.google.android.setupdesign.GlifLayout
 import com.google.android.setupdesign.template.RequireScrollMixin
 import kotlinx.coroutines.test.StandardTestDispatcher
@@ -62,18 +66,27 @@
     )
   private val backgroundDispatcher = StandardTestDispatcher()
   private lateinit var fragmentScenario: FragmentScenario<FingerprintEnrollIntroV2Fragment>
+  private val fingerprintSensor =
+    FingerprintSensor(1, SensorStrength.STRONG, 5, FingerprintSensorType.POWER_BUTTON)
+
+  var enrollFlow = Default
+  val flowViewModel = FingerprintFlowViewModel(enrollFlow)
 
   private val navigationViewModel =
-    FingerprintEnrollNavigationViewModel(
-      backgroundDispatcher,
-      interactor,
-      gatekeeperViewModel,
-      Intro,
-      NavState(true),
-      Default,
+    FingerprintNavigationViewModel(
+      Introduction,
+      false,
+      flowViewModel,
+      interactor
     )
+
   private var fingerprintViewModel =
-    FingerprintEnrollViewModel(interactor, gatekeeperViewModel, navigationViewModel)
+    FingerprintEnrollIntroViewModel(
+      navigationViewModel,
+      flowViewModel,
+      interactor,
+    )
+
   private var fingerprintScrollViewModel = FingerprintScrollViewModel()
 
   @Before
@@ -85,9 +98,9 @@
           modelClass: Class<T>,
         ): T {
           return when (modelClass) {
-            FingerprintEnrollViewModel::class.java -> fingerprintViewModel
+            FingerprintEnrollIntroViewModel::class.java -> fingerprintViewModel
             FingerprintScrollViewModel::class.java -> fingerprintScrollViewModel
-            FingerprintEnrollNavigationViewModel::class.java -> navigationViewModel
+            FingerprintNavigationViewModel::class.java -> navigationViewModel
             FingerprintGatekeeperViewModel::class.java -> gatekeeperViewModel
             else -> null
           }
diff --git a/tests/robotests/src/com/android/settings/connecteddevice/stylus/StylusDevicesControllerTest.java b/tests/robotests/src/com/android/settings/connecteddevice/stylus/StylusDevicesControllerTest.java
index 135be4b..6c96f85 100644
--- a/tests/robotests/src/com/android/settings/connecteddevice/stylus/StylusDevicesControllerTest.java
+++ b/tests/robotests/src/com/android/settings/connecteddevice/stylus/StylusDevicesControllerTest.java
@@ -108,6 +108,9 @@
         MockitoAnnotations.initMocks(this);
 
         mContext = spy(ApplicationProvider.getApplicationContext());
+        final var spiedResources = spy(mContext.getResources());
+        when(mContext.getResources()).thenReturn(spiedResources);
+
         PreferenceManager preferenceManager = new PreferenceManager(mContext);
         mScreen = preferenceManager.createPreferenceScreen(mContext);
         mPreferenceContainer = new PreferenceCategory(mContext);
@@ -144,6 +147,9 @@
         when(mInputDevice.hasKeys(KEYCODE_STYLUS_BUTTON_TAIL)).thenReturn(
                 new boolean[]{true});
 
+        when(spiedResources.getBoolean(
+                com.android.internal.R.bool.config_enableStylusPointerIcon)).thenReturn(true);
+
         mController = new StylusDevicesController(mContext, mInputDevice, null, mLifecycle);
     }
 
@@ -237,7 +243,7 @@
         Preference handwritingPref = mPreferenceContainer.getPreference(0);
         Preference buttonPref = mPreferenceContainer.getPreference(1);
 
-        assertThat(mPreferenceContainer.getPreferenceCount()).isEqualTo(2);
+        assertThat(mPreferenceContainer.getPreferenceCount()).isEqualTo(3);
         assertThat(handwritingPref.getTitle().toString()).isEqualTo(
                 mContext.getString(R.string.stylus_textfield_handwriting));
         assertThat(handwritingPref.isVisible()).isTrue();
diff --git a/tests/robotests/testutils/com/android/settings/testutils/FakeFeatureFactory.java b/tests/robotests/testutils/com/android/settings/testutils/FakeFeatureFactory.java
index 5a5008c..a11b226 100644
--- a/tests/robotests/testutils/com/android/settings/testutils/FakeFeatureFactory.java
+++ b/tests/robotests/testutils/com/android/settings/testutils/FakeFeatureFactory.java
@@ -33,6 +33,7 @@
 import com.android.settings.dashboard.suggestions.SuggestionFeatureProvider;
 import com.android.settings.deviceinfo.hardwareinfo.HardwareInfoFeatureProvider;
 import com.android.settings.deviceinfo.hardwareinfo.HardwareInfoFeatureProviderImpl;
+import com.android.settings.display.DisplayFeatureProvider;
 import com.android.settings.enterprise.EnterprisePrivacyFeatureProvider;
 import com.android.settings.fuelgauge.BatterySettingsFeatureProvider;
 import com.android.settings.fuelgauge.BatteryStatusFeatureProvider;
@@ -101,6 +102,7 @@
     public OnboardingFeatureProvider mOnboardingFeatureProvider;
     public FastPairFeatureProvider mFastPairFeatureProvider;
     public PrivateSpaceLoginFeatureProvider mPrivateSpaceLoginFeatureProvider;
+    public DisplayFeatureProvider mDisplayFeatureProvider;
 
     /**
      * Call this in {@code @Before} method of the test class to use fake factory.
@@ -149,6 +151,7 @@
         mOnboardingFeatureProvider = mock(OnboardingFeatureProvider.class);
         mFastPairFeatureProvider = mock(FastPairFeatureProvider.class);
         mPrivateSpaceLoginFeatureProvider =  mock(PrivateSpaceLoginFeatureProvider.class);
+        mDisplayFeatureProvider = mock(DisplayFeatureProvider.class);
     }
 
     @Override
@@ -331,5 +334,10 @@
     public PrivateSpaceLoginFeatureProvider getPrivateSpaceLoginFeatureProvider() {
         return mPrivateSpaceLoginFeatureProvider;
     }
+
+    @Override
+    public DisplayFeatureProvider getDisplayFeatureProvider() {
+        return mDisplayFeatureProvider;
+    }
 }
 
diff --git a/tests/screenshot/Android.bp b/tests/screenshot/Android.bp
index 5989381..5130fe5 100644
--- a/tests/screenshot/Android.bp
+++ b/tests/screenshot/Android.bp
@@ -13,6 +13,10 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
+package {
+    default_team: "trendy_team_android_settings_app",
+}
+
 android_app {
     name: "ScreenshotTestStub",
     defaults: [
diff --git a/tests/screenshot/src/com/android/settings/tests/screenshot/BasicScreenshotTest.kt b/tests/screenshot/src/com/android/settings/tests/screenshot/BasicScreenshotTest.kt
index bf28b54..493a669 100644
--- a/tests/screenshot/src/com/android/settings/tests/screenshot/BasicScreenshotTest.kt
+++ b/tests/screenshot/src/com/android/settings/tests/screenshot/BasicScreenshotTest.kt
@@ -30,16 +30,19 @@
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.platform.app.InstrumentationRegistry
 import com.android.settings.R
-import com.android.settings.biometrics.fingerprint2.shared.model.Default
+import com.android.settings.biometrics.fingerprint2.lib.model.Default
 import com.android.settings.biometrics.fingerprint2.ui.enrollment.fragment.FingerprintEnrollIntroV2Fragment
-import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintEnrollNavigationViewModel
-import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintEnrollViewModel
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintEnrollIntroViewModel
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintFlowViewModel
 import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintGatekeeperViewModel
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintNavigationStep
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintNavigationViewModel
 import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintScrollViewModel
 import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.GatekeeperInfo
-import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.NavState
-import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.Start
 import com.android.settings.testutils2.FakeFingerprintManagerInteractor
+import com.android.systemui.biometrics.shared.model.FingerprintSensor
+import com.android.systemui.biometrics.shared.model.FingerprintSensorType
+import com.android.systemui.biometrics.shared.model.SensorStrength
 import kotlinx.coroutines.test.StandardTestDispatcher
 import org.junit.Before
 import org.junit.Rule
@@ -60,7 +63,7 @@
         InstrumentationRegistry.getInstrumentation()
           .getTargetContext()
           .getFilesDir()
-          .getAbsolutePath() + "/settings_screenshots"
+          .getAbsolutePath() + "/settings_screenshots",
       )
     )
 
@@ -70,24 +73,27 @@
   private val gatekeeperViewModel =
     FingerprintGatekeeperViewModel(
       GatekeeperInfo.GatekeeperPasswordInfo(byteArrayOf(1, 2, 3), 100L),
-      interactor
+      interactor,
     )
 
   private val backgroundDispatcher = StandardTestDispatcher()
   private lateinit var fragmentScenario: FragmentScenario<FingerprintEnrollIntroV2Fragment>
-  val navState = NavState(true)
+  private val fingerprintSensor =
+    FingerprintSensor(1, SensorStrength.STRONG, 5, FingerprintSensorType.POWER_BUTTON)
 
-  private val navigationViewModel = FingerprintEnrollNavigationViewModel(
-      backgroundDispatcher,
+  var enrollFlow = Default
+  val flowViewModel = FingerprintFlowViewModel(enrollFlow)
+
+  private val navigationViewModel =
+    FingerprintNavigationViewModel(
+      FingerprintNavigationStep.Introduction,
+      false,
+      flowViewModel,
       interactor,
-      gatekeeperViewModel,
-      Start.next(navState),
-      navState,
-      Default,
     )
-  private var fingerprintViewModel = FingerprintEnrollViewModel(
-      interactor, gatekeeperViewModel, navigationViewModel,
-    )
+
+  private var fingerprintViewModel =
+    FingerprintEnrollIntroViewModel(navigationViewModel, flowViewModel, interactor)
   private var fingerprintScrollViewModel = FingerprintScrollViewModel()
 
   @Before
@@ -95,13 +101,11 @@
     val factory =
       object : ViewModelProvider.Factory {
         @Suppress("UNCHECKED_CAST")
-        override fun <T : ViewModel> create(
-          modelClass: Class<T>,
-        ): T {
+        override fun <T : ViewModel> create(modelClass: Class<T>): T {
           return when (modelClass) {
-            FingerprintEnrollViewModel::class.java -> fingerprintViewModel
+            FingerprintEnrollIntroViewModel::class.java -> fingerprintViewModel
             FingerprintScrollViewModel::class.java -> fingerprintScrollViewModel
-            FingerprintEnrollNavigationViewModel::class.java -> navigationViewModel
+            FingerprintNavigationViewModel::class.java -> navigationViewModel
             FingerprintGatekeeperViewModel::class.java -> gatekeeperViewModel
             else -> null
           }
@@ -118,11 +122,7 @@
   /** Renders a [view] into a [Bitmap]. */
   private fun viewToBitmap(view: View): Bitmap {
     val bitmap =
-      Bitmap.createBitmap(
-        view.measuredWidth,
-        view.measuredHeight,
-        Bitmap.Config.ARGB_8888,
-      )
+      Bitmap.createBitmap(view.measuredWidth, view.measuredHeight, Bitmap.Config.ARGB_8888)
     val canvas = Canvas(bitmap)
     view.draw(canvas)
     return bitmap
@@ -136,12 +136,7 @@
     }
     fragmentScenario.onFragment { fragment ->
       val view = fragment.requireView().findViewById<View>(R.id.enroll_intro_content_view)!!
-      rule.assertBitmapAgainstGolden(
-        viewToBitmap(view),
-        "fp_enroll_intro",
-        MSSIMMatcher()
-      )
+      rule.assertBitmapAgainstGolden(viewToBitmap(view), "fp_enroll_intro", MSSIMMatcher())
     }
-
   }
 }
diff --git a/tests/shared/Android.bp b/tests/shared/Android.bp
index 27573e8..6fd9f64 100644
--- a/tests/shared/Android.bp
+++ b/tests/shared/Android.bp
@@ -1,7 +1,11 @@
+package {
+    default_team: "trendy_team_android_settings_app",
+}
+
 android_library {
     name: "Settings-testutils2",
     srcs: [
-        "src/**/*.kt"
+        "src/**/*.kt",
     ],
     libs: [
         "BiometricsSharedLib",
diff --git a/tests/shared/src/com/android/settings/testutils2/FakeFingerprintManagerInteractor.kt b/tests/shared/src/com/android/settings/testutils2/FakeFingerprintManagerInteractor.kt
index dd8658c..7991ff1 100644
--- a/tests/shared/src/com/android/settings/testutils2/FakeFingerprintManagerInteractor.kt
+++ b/tests/shared/src/com/android/settings/testutils2/FakeFingerprintManagerInteractor.kt
@@ -16,11 +16,11 @@
 
 package com.android.settings.testutils2
 
-import com.android.settings.biometrics.fingerprint2.shared.domain.interactor.FingerprintManagerInteractor
-import com.android.settings.biometrics.fingerprint2.shared.model.EnrollReason
-import com.android.settings.biometrics.fingerprint2.shared.model.FingerEnrollState
-import com.android.settings.biometrics.fingerprint2.shared.model.FingerprintAuthAttemptModel
-import com.android.settings.biometrics.fingerprint2.shared.model.FingerprintData
+import com.android.settings.biometrics.fingerprint2.lib.domain.interactor.FingerprintManagerInteractor
+import com.android.settings.biometrics.fingerprint2.lib.model.EnrollReason
+import com.android.settings.biometrics.fingerprint2.lib.model.FingerEnrollState
+import com.android.settings.biometrics.fingerprint2.lib.model.FingerprintAuthAttemptModel
+import com.android.settings.biometrics.fingerprint2.lib.model.FingerprintData
 import com.android.systemui.biometrics.shared.model.FingerprintSensor
 import com.android.systemui.biometrics.shared.model.FingerprintSensorType
 import com.android.systemui.biometrics.shared.model.SensorStrength
diff --git a/tests/spa_unit/Android.bp b/tests/spa_unit/Android.bp
index 4df6254..d98cf42 100644
--- a/tests/spa_unit/Android.bp
+++ b/tests/spa_unit/Android.bp
@@ -15,6 +15,7 @@
 //
 
 package {
+    default_team: "trendy_team_android_settings_app",
     default_applicable_licenses: ["packages_apps_Settings_license"],
 }
 
diff --git a/tests/spa_unit/src/com/android/settings/development/SensitiveContentProtectionPreferenceControllerTest.kt b/tests/spa_unit/src/com/android/settings/development/SensitiveContentProtectionPreferenceControllerTest.kt
index bb30619..18acbba 100644
--- a/tests/spa_unit/src/com/android/settings/development/SensitiveContentProtectionPreferenceControllerTest.kt
+++ b/tests/spa_unit/src/com/android/settings/development/SensitiveContentProtectionPreferenceControllerTest.kt
@@ -16,6 +16,7 @@
 package com.android.settings.development
 
 import android.content.Context
+import android.permission.flags.Flags.FLAG_SENSITIVE_NOTIFICATION_APP_PROTECTION
 import android.platform.test.annotations.RequiresFlagsDisabled
 import android.platform.test.annotations.RequiresFlagsEnabled
 import android.platform.test.flag.junit.DeviceFlagsValueProvider
@@ -27,7 +28,6 @@
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.platform.app.InstrumentationRegistry
 import com.android.server.notification.Flags.FLAG_SCREENSHARE_NOTIFICATION_HIDING
-import com.android.server.notification.Flags.FLAG_SENSITIVE_NOTIFICATION_APP_PROTECTION
 import com.android.settings.development.SensitiveContentProtectionPreferenceController.Companion.SETTING_VALUE_OFF
 import com.android.settings.development.SensitiveContentProtectionPreferenceController.Companion.SETTING_VALUE_ON
 import org.junit.Assert.assertEquals
diff --git a/tests/spa_unit/src/com/android/settings/testutils/FakeFeatureFactory.kt b/tests/spa_unit/src/com/android/settings/testutils/FakeFeatureFactory.kt
index 9b098a7..4048c24 100644
--- a/tests/spa_unit/src/com/android/settings/testutils/FakeFeatureFactory.kt
+++ b/tests/spa_unit/src/com/android/settings/testutils/FakeFeatureFactory.kt
@@ -30,6 +30,7 @@
 import com.android.settings.dashboard.DashboardFeatureProvider
 import com.android.settings.dashboard.suggestions.SuggestionFeatureProvider
 import com.android.settings.deviceinfo.hardwareinfo.HardwareInfoFeatureProvider
+import com.android.settings.display.DisplayFeatureProvider
 import com.android.settings.enterprise.EnterprisePrivacyFeatureProvider
 import com.android.settings.fuelgauge.BatterySettingsFeatureProvider
 import com.android.settings.fuelgauge.BatteryStatusFeatureProvider
@@ -146,4 +147,6 @@
         get() = TODO("Not yet implemented")
     override val privateSpaceLoginFeatureProvider: PrivateSpaceLoginFeatureProvider
         get() = TODO("Not yet implemented")
+    override val displayFeatureProvider: DisplayFeatureProvider
+        get() = TODO("Not yet implemented")
 }
diff --git a/tests/uitests/Android.bp b/tests/uitests/Android.bp
index f3f5201..d5852b3 100644
--- a/tests/uitests/Android.bp
+++ b/tests/uitests/Android.bp
@@ -13,6 +13,7 @@
 // limitations under the License.
 
 package {
+    default_team: "trendy_team_android_settings_app",
     // See: http://go/android-license-faq
     // A large-scale-change added 'default_applicable_licenses' to import
     // all of the 'license_kinds' from "packages_apps_Settings_license"
diff --git a/tests/unit/Android.bp b/tests/unit/Android.bp
index 9d2d686..0f844d0 100644
--- a/tests/unit/Android.bp
+++ b/tests/unit/Android.bp
@@ -1,4 +1,5 @@
 package {
+    default_team: "trendy_team_android_settings_app",
     // See: http://go/android-license-faq
     // A large-scale-change added 'default_applicable_licenses' to import
     // all of the 'license_kinds' from "packages_apps_Settings_license"
diff --git a/tests/unit/src/com/android/settings/applications/credentials/CredentialManagerPreferenceControllerTest.java b/tests/unit/src/com/android/settings/applications/credentials/CredentialManagerPreferenceControllerTest.java
index b5aeac7..0a04a73 100644
--- a/tests/unit/src/com/android/settings/applications/credentials/CredentialManagerPreferenceControllerTest.java
+++ b/tests/unit/src/com/android/settings/applications/credentials/CredentialManagerPreferenceControllerTest.java
@@ -217,33 +217,33 @@
         assertThat(controller.isHiddenDueToNoProviderSet()).isFalse();
         assertThat(controller.getAvailabilityStatus()).isEqualTo(AVAILABLE);
 
-        // Ensure that we stay under 5 providers.
+        // Ensure that we stay under 5 providers (one is reserved for primary).
         assertThat(controller.togglePackageNameEnabled("com.android.provider1")).isTrue();
         assertThat(controller.togglePackageNameEnabled("com.android.provider2")).isTrue();
         assertThat(controller.togglePackageNameEnabled("com.android.provider3")).isTrue();
         assertThat(controller.togglePackageNameEnabled("com.android.provider4")).isTrue();
-        assertThat(controller.togglePackageNameEnabled("com.android.provider5")).isTrue();
+        assertThat(controller.togglePackageNameEnabled("com.android.provider5")).isFalse();
         assertThat(controller.togglePackageNameEnabled("com.android.provider6")).isFalse();
 
         // Check that they are all actually registered.
         Set<String> enabledProviders = controller.getEnabledProviders();
-        assertThat(enabledProviders.size()).isEqualTo(5);
+        assertThat(enabledProviders.size()).isEqualTo(4);
         assertThat(enabledProviders.contains("com.android.provider1")).isTrue();
         assertThat(enabledProviders.contains("com.android.provider2")).isTrue();
         assertThat(enabledProviders.contains("com.android.provider3")).isTrue();
         assertThat(enabledProviders.contains("com.android.provider4")).isTrue();
-        assertThat(enabledProviders.contains("com.android.provider5")).isTrue();
+        assertThat(enabledProviders.contains("com.android.provider5")).isFalse();
         assertThat(enabledProviders.contains("com.android.provider6")).isFalse();
 
         // Check that the settings string has the right component names.
         List<String> enabledServices = controller.getEnabledSettings();
-        assertThat(enabledServices.size()).isEqualTo(6);
+        assertThat(enabledServices.size()).isEqualTo(5);
         assertThat(enabledServices.contains("com.android.provider1/ClassA")).isTrue();
         assertThat(enabledServices.contains("com.android.provider1/ClassB")).isTrue();
         assertThat(enabledServices.contains("com.android.provider2/ClassA")).isTrue();
         assertThat(enabledServices.contains("com.android.provider3/ClassA")).isTrue();
         assertThat(enabledServices.contains("com.android.provider4/ClassA")).isTrue();
-        assertThat(enabledServices.contains("com.android.provider5/ClassA")).isTrue();
+        assertThat(enabledServices.contains("com.android.provider5/ClassA")).isFalse();
         assertThat(enabledServices.contains("com.android.provider6/ClassA")).isFalse();
 
         // Toggle the provider disabled.
@@ -251,22 +251,22 @@
 
         // Check that the provider was removed from the list of providers.
         Set<String> currentlyEnabledProviders = controller.getEnabledProviders();
-        assertThat(currentlyEnabledProviders.size()).isEqualTo(4);
+        assertThat(currentlyEnabledProviders.size()).isEqualTo(3);
         assertThat(currentlyEnabledProviders.contains("com.android.provider1")).isTrue();
         assertThat(currentlyEnabledProviders.contains("com.android.provider2")).isFalse();
         assertThat(currentlyEnabledProviders.contains("com.android.provider3")).isTrue();
         assertThat(currentlyEnabledProviders.contains("com.android.provider4")).isTrue();
-        assertThat(currentlyEnabledProviders.contains("com.android.provider5")).isTrue();
+        assertThat(currentlyEnabledProviders.contains("com.android.provider5")).isFalse();
         assertThat(currentlyEnabledProviders.contains("com.android.provider6")).isFalse();
 
         // Check that the provider was removed from the list of services stored in the setting.
         List<String> currentlyEnabledServices = controller.getEnabledSettings();
-        assertThat(currentlyEnabledServices.size()).isEqualTo(5);
+        assertThat(currentlyEnabledServices.size()).isEqualTo(4);
         assertThat(currentlyEnabledServices.contains("com.android.provider1/ClassA")).isTrue();
         assertThat(currentlyEnabledServices.contains("com.android.provider1/ClassB")).isTrue();
         assertThat(currentlyEnabledServices.contains("com.android.provider3/ClassA")).isTrue();
         assertThat(currentlyEnabledServices.contains("com.android.provider4/ClassA")).isTrue();
-        assertThat(currentlyEnabledServices.contains("com.android.provider5/ClassA")).isTrue();
+        assertThat(currentlyEnabledServices.contains("com.android.provider5/ClassA")).isFalse();
         assertThat(currentlyEnabledServices.contains("com.android.provider6/ClassA")).isFalse();
     }
 
@@ -528,6 +528,17 @@
         assertThat(thumbnail.getIntrinsicWidth()).isEqualTo(getIconSize());
     }
 
+    @Test
+    public void testProviderLimitReached() {
+        // The limit is 5 with one slot reserved for primary.
+        assertThat(CredentialManagerPreferenceController.hasProviderLimitBeenReached(0)).isFalse();
+        assertThat(CredentialManagerPreferenceController.hasProviderLimitBeenReached(1)).isFalse();
+        assertThat(CredentialManagerPreferenceController.hasProviderLimitBeenReached(2)).isFalse();
+        assertThat(CredentialManagerPreferenceController.hasProviderLimitBeenReached(3)).isFalse();
+        assertThat(CredentialManagerPreferenceController.hasProviderLimitBeenReached(4)).isTrue();
+        assertThat(CredentialManagerPreferenceController.hasProviderLimitBeenReached(5)).isTrue();
+    }
+
     private int getIconSize() {
         final Resources resources = mContext.getResources();
         return (int) resources.getDimension(android.R.dimen.app_icon_size);
diff --git a/tests/unit/src/com/android/settings/applications/credentials/PrimaryProviderPreferenceTest.java b/tests/unit/src/com/android/settings/applications/credentials/PrimaryProviderPreferenceTest.java
index 51a1fc4..9ea16bb 100644
--- a/tests/unit/src/com/android/settings/applications/credentials/PrimaryProviderPreferenceTest.java
+++ b/tests/unit/src/com/android/settings/applications/credentials/PrimaryProviderPreferenceTest.java
@@ -114,50 +114,21 @@
     }
 
     @Test
-    public void ensureButtonsClicksCallDelegate_newDesign_buttonsHidden() {
+    public void ensureButtonsClicksCallDelegate_newDesign_buttonsCompactMode() {
         if (!PrimaryProviderPreference.shouldUseNewSettingsUi()) {
             return;
         }
 
         PrimaryProviderPreference ppp = createTestPreferenceWithNewLayout();
+        int initialPaddingLeft = ppp.getButtonFrameView().getPaddingLeft();
 
-        // Test that the buttons are visible.
-        assertThat(ppp.getButtonFrameView()).isNotNull();
-        assertThat(ppp.getButtonFrameView().getVisibility()).isEqualTo(View.GONE);
-        assertThat(mReceivedChangeButtonClicked).isFalse();
+        // If we show the buttons the left padding should be updated.
+        ppp.setButtonsCompactMode(true);
+        assertThat(ppp.getButtonFrameView().getPaddingLeft()).isNotEqualTo(initialPaddingLeft);
 
-        // If we show the buttons the visiblility should be updated.
-        ppp.setButtonsVisible(true);
-        assertThat(ppp.getButtonFrameView().getVisibility()).isEqualTo(View.VISIBLE);
-
-        // If we hide the buttons the visibility should be updated.
-        ppp.setButtonsVisible(false);
-        assertThat(ppp.getButtonFrameView().getVisibility()).isEqualTo(View.GONE);
-    }
-
-    @Test
-    public void ensureButtonsClicksCallDelegate_oldDesign() {
-        if (PrimaryProviderPreference.shouldUseNewSettingsUi()) {
-            return;
-        }
-
-        PrimaryProviderPreference ppp = createTestPreference("preference_widget_gear");
-
-        // Test that clicking the preference results in the delegate being
-        // called.
-        assertThat(mReceivedOpenButtonClicked).isFalse();
-        ppp.getOnPreferenceClickListener().onPreferenceClick(ppp);
-        assertThat(mReceivedOpenButtonClicked).isTrue();
-
-        // Test that the gear button is present and visible.
-        assertThat(ppp.getGearView()).isNotNull();
-        assertThat(ppp.getGearView().getVisibility()).isEqualTo(View.VISIBLE);
-
-        // Test that clicking the gear button results in the delegate being
-        // called.
-        assertThat(mReceivedChangeButtonClicked).isFalse();
-        ppp.getGearView().performClick();
-        assertThat(mReceivedChangeButtonClicked).isTrue();
+        // If we hide the buttons the left padding should be updated.
+        ppp.setButtonsCompactMode(false);
+        assertThat(ppp.getButtonFrameView().getPaddingLeft()).isEqualTo(initialPaddingLeft);
     }
 
     private PrimaryProviderPreference createTestPreferenceWithNewLayout() {
diff --git a/tests/unit/src/com/android/settings/fingerprint2/domain/interactor/FingerprintManagerInteractorTest.kt b/tests/unit/src/com/android/settings/fingerprint2/domain/interactor/FingerprintManagerInteractorTest.kt
index 3440d2a..f1808e3 100644
--- a/tests/unit/src/com/android/settings/fingerprint2/domain/interactor/FingerprintManagerInteractorTest.kt
+++ b/tests/unit/src/com/android/settings/fingerprint2/domain/interactor/FingerprintManagerInteractorTest.kt
@@ -26,17 +26,23 @@
 import android.os.Handler
 import androidx.test.core.app.ApplicationProvider
 import com.android.settings.biometrics.GatekeeperPasswordProvider
+import com.android.settings.biometrics.fingerprint2.data.repository.FingerprintSensorRepo
 import com.android.settings.biometrics.fingerprint2.domain.interactor.FingerprintManagerInteractorImpl
-import com.android.settings.biometrics.fingerprint2.shared.data.repository.PressToAuthProvider
-import com.android.settings.biometrics.fingerprint2.shared.domain.interactor.FingerprintManagerInteractor
-import com.android.settings.biometrics.fingerprint2.shared.model.Default
-import com.android.settings.biometrics.fingerprint2.shared.model.EnrollReason
-import com.android.settings.biometrics.fingerprint2.shared.model.FingerEnrollState
-import com.android.settings.biometrics.fingerprint2.shared.model.FingerprintAuthAttemptModel
-import com.android.settings.biometrics.fingerprint2.shared.model.FingerprintData
+import com.android.settings.biometrics.fingerprint2.data.repository.PressToAuthRepo
+import com.android.settings.biometrics.fingerprint2.lib.domain.interactor.FingerprintManagerInteractor
+import com.android.settings.biometrics.fingerprint2.lib.model.Default
+import com.android.settings.biometrics.fingerprint2.lib.model.EnrollReason
+import com.android.settings.biometrics.fingerprint2.lib.model.FingerEnrollState
+import com.android.settings.biometrics.fingerprint2.lib.model.FingerprintAuthAttemptModel
+import com.android.settings.biometrics.fingerprint2.lib.model.FingerprintData
 import com.android.settings.password.ChooseLockSettingsHelper
+import com.android.systemui.biometrics.shared.model.FingerprintSensor
+import com.android.systemui.biometrics.shared.model.FingerprintSensorType
+import com.android.systemui.biometrics.shared.model.SensorStrength
 import com.google.common.truth.Truth.assertThat
 import kotlinx.coroutines.cancelAndJoin
+import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.flowOf
 import kotlinx.coroutines.flow.last
 import kotlinx.coroutines.launch
 import kotlinx.coroutines.test.StandardTestDispatcher
@@ -71,21 +77,28 @@
   @Mock private lateinit var gateKeeperPasswordProvider: GatekeeperPasswordProvider
 
   private var testScope = TestScope(backgroundDispatcher)
-  private var pressToAuthProvider =
-    object : PressToAuthProvider {
+  private var pressToAuthRepo =
+    object : PressToAuthRepo {
       override val isEnabled: Boolean
         get() = false
     }
 
   @Before
   fun setup() {
+    val sensor = FingerprintSensor(1, SensorStrength.STRONG, 5, FingerprintSensorType.POWER_BUTTON)
+    val fingerprintSensorRepo =
+      object : FingerprintSensorRepo {
+        override val fingerprintSensor: Flow<FingerprintSensor> = flowOf(sensor)
+      }
+
     underTest =
       FingerprintManagerInteractorImpl(
         context,
         backgroundDispatcher,
         fingerprintManager,
+        fingerprintSensorRepo,
         gateKeeperPasswordProvider,
-        pressToAuthProvider,
+        pressToAuthRepo,
         Default,
       )
   }
diff --git a/tests/unit/src/com/android/settings/fingerprint2/enrollment/viewmodel/FingerprintEnrollFindSensorViewModelV2Test.kt b/tests/unit/src/com/android/settings/fingerprint2/enrollment/viewmodel/FingerprintEnrollFindSensorViewModelV2Test.kt
index bd94cba..3b02d49 100644
--- a/tests/unit/src/com/android/settings/fingerprint2/enrollment/viewmodel/FingerprintEnrollFindSensorViewModelV2Test.kt
+++ b/tests/unit/src/com/android/settings/fingerprint2/enrollment/viewmodel/FingerprintEnrollFindSensorViewModelV2Test.kt
@@ -21,16 +21,17 @@
 import android.view.accessibility.AccessibilityManager
 import androidx.arch.core.executor.testing.InstantTaskExecutorRule
 import androidx.test.core.app.ApplicationProvider
-import com.android.settings.biometrics.fingerprint2.shared.model.Default
+import com.android.settings.biometrics.fingerprint2.lib.model.Default
 import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.AccessibilityViewModel
 import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.BackgroundViewModel
-import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.Education
 import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintEnrollFindSensorViewModel
-import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintEnrollNavigationViewModel
 import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintEnrollViewModel
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintFlowViewModel
 import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintGatekeeperViewModel
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintNavigationStep.Education
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintNavigationViewModel
 import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FoldStateViewModel
-import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.NextStepViewModel
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.NavigationState
 import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.OrientationStateViewModel
 import com.android.settings.testutils2.FakeFingerprintManagerInteractor
 import com.android.systemui.biometrics.shared.model.FingerprintSensor
@@ -38,7 +39,6 @@
 import com.android.systemui.biometrics.shared.model.SensorStrength
 import com.google.common.truth.Truth.assertThat
 import kotlinx.coroutines.Dispatchers
-import kotlinx.coroutines.flow.collectLatest
 import kotlinx.coroutines.launch
 import kotlinx.coroutines.test.StandardTestDispatcher
 import kotlinx.coroutines.test.TestScope
@@ -67,7 +67,7 @@
   private lateinit var fakeFingerprintManagerInteractor: FakeFingerprintManagerInteractor
   private lateinit var gatekeeperViewModel: FingerprintGatekeeperViewModel
   private lateinit var enrollViewModel: FingerprintEnrollViewModel
-  private lateinit var navigationViewModel: FingerprintEnrollNavigationViewModel
+  private lateinit var navigationViewModel: FingerprintNavigationViewModel
   private lateinit var accessibilityViewModel: AccessibilityViewModel
   private lateinit var foldStateViewModel: FoldStateViewModel
   private lateinit var orientationStateViewModel: OrientationStateViewModel
@@ -87,18 +87,19 @@
     gatekeeperViewModel =
       FingerprintGatekeeperViewModel.FingerprintGatekeeperViewModelFactory(
           null,
-          fakeFingerprintManagerInteractor
+          fakeFingerprintManagerInteractor,
         )
         .create(FingerprintGatekeeperViewModel::class.java)
+
+    val sensor = FingerprintSensor(1, SensorStrength.STRONG, 5, FingerprintSensorType.POWER_BUTTON)
+    val fingerprintFlowViewModel = FingerprintFlowViewModel(Default)
     navigationViewModel =
-      FingerprintEnrollNavigationViewModel.FingerprintEnrollNavigationViewModelFactory(
-          backgroundDispatcher,
-          fakeFingerprintManagerInteractor,
-          gatekeeperViewModel,
-          canSkipConfirm = true,
-          Default,
-        )
-        .create(FingerprintEnrollNavigationViewModel::class.java)
+      FingerprintNavigationViewModel(
+        Education(sensor),
+        false,
+        fingerprintFlowViewModel,
+        fakeFingerprintManagerInteractor,
+      )
 
     backgroundViewModel =
       BackgroundViewModel.BackgroundViewModelFactory().create(BackgroundViewModel::class.java)
@@ -126,12 +127,10 @@
           backgroundViewModel,
           accessibilityViewModel,
           foldStateViewModel,
-          orientationStateViewModel
+          orientationStateViewModel,
+          fingerprintFlowViewModel,
         )
         .create(FingerprintEnrollFindSensorViewModel::class.java)
-
-    // Navigate to Education page
-    navigationViewModel.nextStep()
   }
 
   @After
@@ -142,18 +141,6 @@
   // TODO(b/305094585): test enroll() logic
 
   @Test
-  fun currentStepIsEducation() =
-    testScope.runTest {
-      var step: NextStepViewModel? = null
-      val job = launch {
-        navigationViewModel.navigationViewModel.collectLatest { step = it.currStep }
-      }
-      advanceUntilIdle()
-      assertThat(step).isEqualTo(Education)
-      job.cancel()
-    }
-
-  @Test
   fun udfpsLottieInfo() =
     testScope.runTest {
       fakeFingerprintManagerInteractor.sensorProp =
@@ -161,7 +148,7 @@
           0 /* sensorId */,
           SensorStrength.STRONG,
           5,
-          FingerprintSensorType.UDFPS_OPTICAL
+          FingerprintSensorType.UDFPS_OPTICAL,
         )
 
       var udfpsLottieInfo: Boolean? = null
@@ -234,7 +221,7 @@
           0 /* sensorId */,
           SensorStrength.STRONG,
           5,
-          FingerprintSensorType.UDFPS_OPTICAL
+          FingerprintSensorType.UDFPS_OPTICAL,
         )
 
       var showPrimaryButton: Boolean? = null
diff --git a/tests/unit/src/com/android/settings/fingerprint2/ui/enrollment/viewmodel/FingerprintEnrollEnrollingViewModelTest.kt b/tests/unit/src/com/android/settings/fingerprint2/ui/enrollment/viewmodel/FingerprintEnrollEnrollingViewModelTest.kt
index efb4a07..4678da1 100644
--- a/tests/unit/src/com/android/settings/fingerprint2/ui/enrollment/viewmodel/FingerprintEnrollEnrollingViewModelTest.kt
+++ b/tests/unit/src/com/android/settings/fingerprint2/ui/enrollment/viewmodel/FingerprintEnrollEnrollingViewModelTest.kt
@@ -17,16 +17,20 @@
 package com.android.settings.fingerprint2.ui.enrollment.viewmodel
 
 import androidx.arch.core.executor.testing.InstantTaskExecutorRule
-import com.android.settings.biometrics.fingerprint2.shared.model.Default
+import com.android.settings.biometrics.fingerprint2.lib.model.Default
 import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.BackgroundViewModel
-import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.Enrollment
 import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintEnrollEnrollingViewModel
-import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintEnrollNavigationViewModel
 import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintEnrollViewModel
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintFlowViewModel
 import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintGatekeeperViewModel
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintNavigationStep.Enrollment
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintNavigationViewModel
 import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.GatekeeperInfo
-import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.NavState
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.NavigationState
 import com.android.settings.testutils2.FakeFingerprintManagerInteractor
+import com.android.systemui.biometrics.shared.model.FingerprintSensor
+import com.android.systemui.biometrics.shared.model.FingerprintSensorType
+import com.android.systemui.biometrics.shared.model.SensorStrength
 import com.google.common.truth.Truth.assertThat
 import kotlinx.coroutines.Dispatchers
 import kotlinx.coroutines.launch
@@ -54,7 +58,7 @@
   private lateinit var enrollEnrollingViewModel: FingerprintEnrollEnrollingViewModel
   private lateinit var backgroundViewModel: BackgroundViewModel
   private lateinit var gateKeeperViewModel: FingerprintGatekeeperViewModel
-  private lateinit var navigationViewModel: FingerprintEnrollNavigationViewModel
+  private lateinit var navigationViewModel: FingerprintNavigationViewModel
   private val defaultGatekeeperInfo = GatekeeperInfo.GatekeeperPasswordInfo(byteArrayOf(1, 3), 3)
   private var testScope = TestScope(backgroundDispatcher)
 
@@ -65,18 +69,18 @@
     gateKeeperViewModel =
       FingerprintGatekeeperViewModel.FingerprintGatekeeperViewModelFactory(
           gatekeeperInfo,
-          fakeFingerprintManagerInteractor
+          fakeFingerprintManagerInteractor,
         )
         .create(FingerprintGatekeeperViewModel::class.java)
+    val sensor = FingerprintSensor(1, SensorStrength.STRONG, 5, FingerprintSensorType.POWER_BUTTON)
+    val fingerprintFlowViewModel = FingerprintFlowViewModel(Default)
 
     navigationViewModel =
-      FingerprintEnrollNavigationViewModel(
-        backgroundDispatcher,
+      FingerprintNavigationViewModel(
+        Enrollment(sensor),
+        false,
+        fingerprintFlowViewModel,
         fakeFingerprintManagerInteractor,
-        gateKeeperViewModel,
-        Enrollment,
-        NavState(true),
-        Default,
       )
 
     backgroundViewModel =
diff --git a/tests/unit/src/com/android/settings/fingerprint2/ui/settings/FingerprintSettingsNavigationViewModelTest.kt b/tests/unit/src/com/android/settings/fingerprint2/ui/settings/FingerprintSettingsNavigationViewModelTest.kt
index 064e087..201fffa 100644
--- a/tests/unit/src/com/android/settings/fingerprint2/ui/settings/FingerprintSettingsNavigationViewModelTest.kt
+++ b/tests/unit/src/com/android/settings/fingerprint2/ui/settings/FingerprintSettingsNavigationViewModelTest.kt
@@ -18,7 +18,7 @@
 
 import androidx.arch.core.executor.testing.InstantTaskExecutorRule
 import com.android.settings.biometrics.BiometricEnrollBase
-import com.android.settings.biometrics.fingerprint2.shared.model.FingerprintData
+import com.android.settings.biometrics.fingerprint2.lib.model.FingerprintData
 import com.android.settings.biometrics.fingerprint2.ui.settings.viewmodel.EnrollFirstFingerprint
 import com.android.settings.biometrics.fingerprint2.ui.settings.viewmodel.FingerprintSettingsNavigationViewModel
 import com.android.settings.biometrics.fingerprint2.ui.settings.viewmodel.FinishSettings
diff --git a/tests/unit/src/com/android/settings/fingerprint2/ui/settings/FingerprintSettingsViewModelTest.kt b/tests/unit/src/com/android/settings/fingerprint2/ui/settings/FingerprintSettingsViewModelTest.kt
index 4bd9121..6577c95 100644
--- a/tests/unit/src/com/android/settings/fingerprint2/ui/settings/FingerprintSettingsViewModelTest.kt
+++ b/tests/unit/src/com/android/settings/fingerprint2/ui/settings/FingerprintSettingsViewModelTest.kt
@@ -17,8 +17,8 @@
 package com.android.settings.fingerprint2.ui.settings
 
 import androidx.arch.core.executor.testing.InstantTaskExecutorRule
-import com.android.settings.biometrics.fingerprint2.shared.model.FingerprintAuthAttemptModel
-import com.android.settings.biometrics.fingerprint2.shared.model.FingerprintData
+import com.android.settings.biometrics.fingerprint2.lib.model.FingerprintAuthAttemptModel
+import com.android.settings.biometrics.fingerprint2.lib.model.FingerprintData
 import com.android.settings.biometrics.fingerprint2.ui.settings.viewmodel.FingerprintSettingsNavigationViewModel
 import com.android.settings.biometrics.fingerprint2.ui.settings.viewmodel.FingerprintSettingsViewModel
 import com.android.settings.biometrics.fingerprint2.ui.settings.viewmodel.PreferenceViewModel
diff --git a/tests/unit/src/com/android/settings/privacy/CameraExtensionsFallbackPreferenceControllerTest.java b/tests/unit/src/com/android/settings/privacy/CameraExtensionsFallbackPreferenceControllerTest.java
new file mode 100644
index 0000000..8871be9
--- /dev/null
+++ b/tests/unit/src/com/android/settings/privacy/CameraExtensionsFallbackPreferenceControllerTest.java
@@ -0,0 +1,91 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.privacy;
+
+import static com.android.settings.core.BasePreferenceController.AVAILABLE;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.content.ContentResolver;
+import android.content.Context;
+import android.provider.Settings;
+
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import com.android.settings.privacy.CameraExtensionsFallbackPreferenceController;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(AndroidJUnit4.class)
+public class CameraExtensionsFallbackPreferenceControllerTest {
+
+    private static final String KEY = "camera_extensions_fallback";
+    private final Context mContext = ApplicationProvider.getApplicationContext();
+
+    private int mOriginalPreference;
+    private ContentResolver mContentResolver;
+    private CameraExtensionsFallbackPreferenceController mController;
+
+    @Before
+    public void setUp() {
+        mContentResolver = mContext.getContentResolver();
+        mOriginalPreference = Settings.Secure.getInt(mContentResolver,
+                Settings.Secure.CAMERA_EXTENSIONS_FALLBACK, 1);
+        mController = new CameraExtensionsFallbackPreferenceController(mContext, KEY);
+    }
+
+    @After
+    public void tearDown() {
+        Settings.Secure.putInt(mContentResolver, Settings.Secure.CAMERA_EXTENSIONS_FALLBACK,
+                mOriginalPreference);
+    }
+
+    @Test
+    public void getAvailability_returnAvailable() {
+        assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE);
+    }
+
+    @Test
+    public void setChecked_disable_shouldTurnOff() {
+        Settings.Secure.putInt(mContentResolver,
+                Settings.Secure.CAMERA_EXTENSIONS_FALLBACK, 1);
+
+        assertThat(mController.isChecked()).isTrue();
+
+        mController.setChecked(false);
+
+        assertThat(Settings.Secure.getInt(mContentResolver,
+                Settings.Secure.CAMERA_EXTENSIONS_FALLBACK, -1)).isEqualTo(0);
+    }
+
+    @Test
+    public void setChecked_enable_shouldTurnOn() {
+        Settings.Secure.putInt(mContentResolver,
+                Settings.Secure.CAMERA_EXTENSIONS_FALLBACK, 0);
+
+        assertThat(mController.isChecked()).isFalse();
+
+        mController.setChecked(true);
+
+        assertThat(Settings.Secure.getInt(mContentResolver,
+                Settings.Secure.CAMERA_EXTENSIONS_FALLBACK, -1)).isEqualTo(1);
+    }
+}
diff --git a/tests/unit/src/com/android/settings/testutils/FakeFeatureFactory.java b/tests/unit/src/com/android/settings/testutils/FakeFeatureFactory.java
index 6c4c5b4..9e7948c 100644
--- a/tests/unit/src/com/android/settings/testutils/FakeFeatureFactory.java
+++ b/tests/unit/src/com/android/settings/testutils/FakeFeatureFactory.java
@@ -33,6 +33,7 @@
 import com.android.settings.dashboard.suggestions.SuggestionFeatureProvider;
 import com.android.settings.deviceinfo.hardwareinfo.HardwareInfoFeatureProvider;
 import com.android.settings.deviceinfo.hardwareinfo.HardwareInfoFeatureProviderImpl;
+import com.android.settings.display.DisplayFeatureProvider;
 import com.android.settings.enterprise.EnterprisePrivacyFeatureProvider;
 import com.android.settings.fuelgauge.BatterySettingsFeatureProvider;
 import com.android.settings.fuelgauge.BatteryStatusFeatureProvider;
@@ -100,6 +101,7 @@
     public OnboardingFeatureProvider mOnboardingFeatureProvider;
     public FastPairFeatureProvider mFastPairFeatureProvider;
     public PrivateSpaceLoginFeatureProvider mPrivateSpaceLoginFeatureProvider;
+    public DisplayFeatureProvider mDisplayFeatureProvider;
 
     /** Call this in {@code @Before} method of the test class to use fake factory. */
     public static FakeFeatureFactory setupForTest() {
@@ -150,6 +152,7 @@
         mOnboardingFeatureProvider = mock(OnboardingFeatureProvider.class);
         mFastPairFeatureProvider = mock(FastPairFeatureProvider.class);
         mPrivateSpaceLoginFeatureProvider = mock(PrivateSpaceLoginFeatureProvider.class);
+        mDisplayFeatureProvider = mock(DisplayFeatureProvider.class);
     }
 
     @Override
@@ -332,4 +335,9 @@
     public PrivateSpaceLoginFeatureProvider getPrivateSpaceLoginFeatureProvider() {
         return mPrivateSpaceLoginFeatureProvider;
     }
+
+    @Override
+    public DisplayFeatureProvider getDisplayFeatureProvider() {
+        return mDisplayFeatureProvider;
+    }
 }