Merge "Add FeatureProvider for onboarding related settings" into main
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 79a7171..a8adf7c 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -33,6 +33,7 @@
     <uses-permission android:name="android.permission.HARDWARE_TEST" />
     <uses-permission android:name="android.permission.CALL_PHONE" />
     <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
+    <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS_PRIVILEGED" />
     <uses-permission android:name="android.permission.QUERY_AUDIO_STATE" />
     <uses-permission android:name="android.permission.MASTER_CLEAR" />
     <uses-permission android:name="com.google.android.googleapps.permission.GOOGLE_AUTH" />
@@ -4681,6 +4682,16 @@
         </activity>
 
         <activity
+            android:name=".wifi.dpp.WifiDppConfiguratorAuthActivity"
+            android:theme="@style/Transparent"
+            android:exported="true">
+            <intent-filter>
+                <action android:name="android.settings.WIFI_DPP_CONFIGURATOR_AUTH_QR_CODE_GENERATOR"/>
+                <category android:name="android.intent.category.DEFAULT"/>
+            </intent-filter>
+        </activity>
+
+        <activity
             android:name=".wifi.dpp.WifiDppEnrolleeActivity"
             android:exported="true">
             <intent-filter>
diff --git a/res/drawable-night/ic_app_aspect_ratio_16_9.xml b/res/drawable-night/ic_app_aspect_ratio_16_9.xml
new file mode 100644
index 0000000..069003e
--- /dev/null
+++ b/res/drawable-night/ic_app_aspect_ratio_16_9.xml
@@ -0,0 +1,66 @@
+<!--
+  ~ 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="412dp"
+    android:height="300dp"
+    android:viewportWidth="412"
+    android:viewportHeight="300">
+  <group>
+    <clip-path
+        android:pathData="M0,0h412v300h-412z"/>
+    <path
+        android:pathData="M384.18,300H27.82C12.53,300 0,287.17 0,271.52V28.48C0,12.83 12.53,0 27.82,0H384.29C399.47,0 412,12.83 412,28.48V271.63C412,287.17 399.47,300 384.18,300Z"
+        android:fillColor="#000000"/>
+    <path
+        android:pathData="M321.83,134.76V134C322.96,133.96 323.87,132.78 323.87,131.32V116.86C323.87,115.4 322.96,114.22 321.83,114.18V58.55C321.83,52.85 317.2,48.22 311.49,48.22H213.79C211.62,48.22 209.49,48.77 207.6,49.82C206.71,50.18 205.73,50.18 204.85,49.83L204.81,49.82C202.92,48.77 200.79,48.22 198.62,48.22H101.22C95.51,48.22 90.88,52.85 90.88,58.55V242.05C90.88,247.76 95.51,252.38 101.22,252.38H198.84C201,252.38 203.13,251.83 205.03,250.78C205.86,250.45 206.78,250.44 207.63,250.73L207.73,250.78C209.62,251.83 213.04,252.38 215.2,252.38H311.49C317.2,252.38 321.83,247.76 321.83,242.05V181.69C322.96,181.65 323.87,180.47 323.87,179.01V152.1C323.87,150.65 322.96,149.46 321.83,149.43V134.76ZM319.45,242.43C319.45,246.61 315.67,250.01 311.49,250.01H101.22C97.04,250.01 93.26,246.61 93.26,242.43V58.55C93.26,54.38 97.04,50.6 101.22,50.6H311.49C315.67,50.6 319.45,54.38 319.45,58.55V242.43Z"
+        android:fillColor="#80868B"/>
+    <path
+        android:pathData="M155,53L259,53A4,4 0,0 1,263 57L263,243A4,4 0,0 1,259 247L155,247A4,4 0,0 1,151 243L151,57A4,4 0,0 1,155 53z"
+        android:fillColor="#669DF6"/>
+    <path
+        android:pathData="M157,57L257,57A2,2 0,0 1,259 59L259,241A2,2 0,0 1,257 243L157,243A2,2 0,0 1,155 241L155,59A2,2 0,0 1,157 57z"
+        android:fillColor="#000000"/>
+    <path
+        android:pathData="M171.48,237H161V226.42"
+        android:strokeLineJoin="round"
+        android:strokeWidth="4"
+        android:fillColor="#00000000"
+        android:strokeColor="#669DF6"
+        android:strokeLineCap="round"/>
+    <path
+        android:pathData="M161,237L176,222"
+        android:strokeLineJoin="round"
+        android:strokeWidth="4"
+        android:fillColor="#00000000"
+        android:strokeColor="#669DF6"
+        android:strokeLineCap="round"/>
+    <path
+        android:pathData="M242.52,63L253,63L253,73.58"
+        android:strokeLineJoin="round"
+        android:strokeWidth="4"
+        android:fillColor="#00000000"
+        android:strokeColor="#669DF6"
+        android:strokeLineCap="round"/>
+    <path
+        android:pathData="M253,63L238,78"
+        android:strokeLineJoin="round"
+        android:strokeWidth="4"
+        android:fillColor="#00000000"
+        android:strokeColor="#669DF6"
+        android:strokeLineCap="round"/>
+  </group>
+</vector>
diff --git a/res/drawable-night/ic_app_aspect_ratio_3_2.xml b/res/drawable-night/ic_app_aspect_ratio_3_2.xml
new file mode 100644
index 0000000..22c0969
--- /dev/null
+++ b/res/drawable-night/ic_app_aspect_ratio_3_2.xml
@@ -0,0 +1,66 @@
+<!--
+  ~ 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="412dp"
+    android:height="300dp"
+    android:viewportWidth="412"
+    android:viewportHeight="300">
+  <group>
+    <clip-path
+        android:pathData="M0,0h412v300h-412z"/>
+    <path
+        android:pathData="M384.18,300H27.82C12.53,300 0,287.17 0,271.52V28.48C0,12.83 12.53,0 27.82,0H384.29C399.47,0 412,12.83 412,28.48V271.63C412,287.17 399.47,300 384.18,300Z"
+        android:fillColor="#000000"/>
+    <path
+        android:pathData="M321.83,134.76V134C322.96,133.96 323.87,132.78 323.87,131.32V116.86C323.87,115.4 322.96,114.22 321.83,114.18V58.55C321.83,52.85 317.2,48.22 311.49,48.22H213.79C211.62,48.22 209.49,48.77 207.6,49.82C206.71,50.18 205.73,50.18 204.85,49.83L204.81,49.82C202.92,48.77 200.79,48.22 198.62,48.22H101.22C95.51,48.22 90.88,52.85 90.88,58.55V242.05C90.88,247.76 95.51,252.38 101.22,252.38H198.84C201,252.38 203.13,251.83 205.03,250.78C205.86,250.45 206.78,250.44 207.63,250.73L207.73,250.78C209.62,251.83 213.04,252.38 215.2,252.38H311.49C317.2,252.38 321.83,247.76 321.83,242.05V181.69C322.96,181.65 323.87,180.47 323.87,179.01V152.1C323.87,150.65 322.96,149.46 321.83,149.43V134.76ZM319.45,242.43C319.45,246.61 315.67,250.01 311.49,250.01H101.22C97.04,250.01 93.26,246.61 93.26,242.43V58.55C93.26,54.38 97.04,50.6 101.22,50.6H311.49C315.67,50.6 319.45,54.38 319.45,58.55V242.43Z"
+        android:fillColor="#80868B"/>
+    <path
+        android:pathData="M144,53L268,53A4,4 0,0 1,272 57L272,243A4,4 0,0 1,268 247L144,247A4,4 0,0 1,140 243L140,57A4,4 0,0 1,144 53z"
+        android:fillColor="#669DF6"/>
+    <path
+        android:pathData="M146,57L266,57A2,2 0,0 1,268 59L268,241A2,2 0,0 1,266 243L146,243A2,2 0,0 1,144 241L144,59A2,2 0,0 1,146 57z"
+        android:fillColor="#000000"/>
+    <path
+        android:pathData="M160.48,237H150V226.42"
+        android:strokeLineJoin="round"
+        android:strokeWidth="4"
+        android:fillColor="#00000000"
+        android:strokeColor="#669DF6"
+        android:strokeLineCap="round"/>
+    <path
+        android:pathData="M150,237L165,222"
+        android:strokeLineJoin="round"
+        android:strokeWidth="4"
+        android:fillColor="#00000000"
+        android:strokeColor="#669DF6"
+        android:strokeLineCap="round"/>
+    <path
+        android:pathData="M251.52,63L262,63L262,73.58"
+        android:strokeLineJoin="round"
+        android:strokeWidth="4"
+        android:fillColor="#00000000"
+        android:strokeColor="#669DF6"
+        android:strokeLineCap="round"/>
+    <path
+        android:pathData="M262,63L247,78"
+        android:strokeLineJoin="round"
+        android:strokeWidth="4"
+        android:fillColor="#00000000"
+        android:strokeColor="#669DF6"
+        android:strokeLineCap="round"/>
+  </group>
+</vector>
diff --git a/res/drawable-night/ic_app_aspect_ratio_4_3.xml b/res/drawable-night/ic_app_aspect_ratio_4_3.xml
new file mode 100644
index 0000000..0238311
--- /dev/null
+++ b/res/drawable-night/ic_app_aspect_ratio_4_3.xml
@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ 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="412dp"
+    android:height="300dp"
+    android:viewportWidth="412"
+    android:viewportHeight="300">
+  <group>
+    <clip-path
+        android:pathData="M0,0h412v300h-412z"/>
+    <path
+        android:pathData="M384.18,300H27.82C12.53,300 0,287.17 0,271.52V28.48C0,12.83 12.53,0 27.82,0H384.29C399.47,0 412,12.83 412,28.48V271.63C412,287.17 399.47,300 384.18,300Z"
+        android:fillColor="#000000"/>
+    <path
+        android:pathData="M321.83,134.76V134C322.96,133.96 323.87,132.78 323.87,131.32V116.86C323.87,115.4 322.96,114.22 321.83,114.18V58.55C321.83,52.85 317.2,48.22 311.49,48.22H213.79C211.62,48.22 209.49,48.77 207.6,49.82C206.71,50.18 205.73,50.18 204.85,49.83L204.81,49.82C202.92,48.77 200.79,48.22 198.62,48.22H101.22C95.51,48.22 90.88,52.85 90.88,58.55V242.05C90.88,247.76 95.51,252.38 101.22,252.38H198.84C201,252.38 203.13,251.83 205.03,250.78C205.86,250.45 206.78,250.44 207.63,250.73L207.73,250.78C209.62,251.83 213.04,252.38 215.2,252.38H311.49C317.2,252.38 321.83,247.76 321.83,242.05V181.69C322.96,181.65 323.87,180.47 323.87,179.01V152.1C323.87,150.65 322.96,149.46 321.83,149.43V134.76ZM319.45,242.43C319.45,246.61 315.67,250.01 311.49,250.01H101.22C97.04,250.01 93.26,246.61 93.26,242.43V58.55C93.26,54.38 97.04,50.6 101.22,50.6H311.49C315.67,50.6 319.45,54.38 319.45,58.55V242.43Z"
+        android:fillColor="#80868B"/>
+    <path
+        android:pathData="M136,53L276,53A4,4 0,0 1,280 57L280,243A4,4 0,0 1,276 247L136,247A4,4 0,0 1,132 243L132,57A4,4 0,0 1,136 53z"
+        android:fillColor="#669DF6"/>
+    <path
+        android:pathData="M138,57L274,57A2,2 0,0 1,276 59L276,241A2,2 0,0 1,274 243L138,243A2,2 0,0 1,136 241L136,59A2,2 0,0 1,138 57z"
+        android:fillColor="#000000"/>
+    <path
+        android:pathData="M152.48,237H142V226.42"
+        android:strokeLineJoin="round"
+        android:strokeWidth="4"
+        android:fillColor="#00000000"
+        android:strokeColor="#669DF6"
+        android:strokeLineCap="round"/>
+    <path
+        android:pathData="M142,237L157,222"
+        android:strokeLineJoin="round"
+        android:strokeWidth="4"
+        android:fillColor="#00000000"
+        android:strokeColor="#669DF6"
+        android:strokeLineCap="round"/>
+    <path
+        android:pathData="M259.52,63L270,63L270,73.58"
+        android:strokeLineJoin="round"
+        android:strokeWidth="4"
+        android:fillColor="#00000000"
+        android:strokeColor="#669DF6"
+        android:strokeLineCap="round"/>
+    <path
+        android:pathData="M270,63L255,78"
+        android:strokeLineJoin="round"
+        android:strokeWidth="4"
+        android:fillColor="#00000000"
+        android:strokeColor="#669DF6"
+        android:strokeLineCap="round"/>
+  </group>
+</vector>
diff --git a/res/drawable-night/ic_app_aspect_ratio_display_size.xml b/res/drawable-night/ic_app_aspect_ratio_display_size.xml
new file mode 100644
index 0000000..91626d7
--- /dev/null
+++ b/res/drawable-night/ic_app_aspect_ratio_display_size.xml
@@ -0,0 +1,66 @@
+<!--
+  ~ 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="412dp"
+    android:height="300dp"
+    android:viewportWidth="412"
+    android:viewportHeight="300">
+  <group>
+    <clip-path
+        android:pathData="M0,0h412v300h-412z"/>
+    <path
+        android:pathData="M384.18,300H27.82C12.53,300 0,287.17 0,271.52V28.48C0,12.83 12.53,0 27.82,0H384.29C399.47,0 412,12.83 412,28.48V271.63C412,287.17 399.47,300 384.18,300Z"
+        android:fillColor="#000000"/>
+    <path
+        android:pathData="M321.83,134.76V134C322.96,133.96 323.87,132.78 323.87,131.32V116.86C323.87,115.4 322.96,114.22 321.83,114.18V58.55C321.83,52.85 317.2,48.22 311.49,48.22H213.79C211.62,48.22 209.49,48.77 207.6,49.82C206.71,50.18 205.73,50.18 204.85,49.83L204.81,49.82C202.92,48.77 200.79,48.22 198.62,48.22H101.22C95.51,48.22 90.88,52.85 90.88,58.55V242.05C90.88,247.76 95.51,252.38 101.22,252.38H198.84C201,252.38 203.13,251.83 205.03,250.78C205.86,250.45 206.78,250.44 207.63,250.73L207.73,250.78C209.62,251.83 213.04,252.38 215.2,252.38H311.49C317.2,252.38 321.83,247.76 321.83,242.05V181.69C322.96,181.65 323.87,180.47 323.87,179.01V152.1C323.87,150.65 322.96,149.46 321.83,149.43V134.76ZM319.45,242.43C319.45,246.61 315.67,250.01 311.49,250.01H101.22C97.04,250.01 93.26,246.61 93.26,242.43V58.55C93.26,54.38 97.04,50.6 101.22,50.6H311.49C315.67,50.6 319.45,54.38 319.45,58.55V242.43Z"
+        android:fillColor="#80868B"/>
+    <path
+        android:pathData="M128,53L284,53A4,4 0,0 1,288 57L288,243A4,4 0,0 1,284 247L128,247A4,4 0,0 1,124 243L124,57A4,4 0,0 1,128 53z"
+        android:fillColor="#669DF6"/>
+    <path
+        android:pathData="M130,57L282,57A2,2 0,0 1,284 59L284,241A2,2 0,0 1,282 243L130,243A2,2 0,0 1,128 241L128,59A2,2 0,0 1,130 57z"
+        android:fillColor="#000000"/>
+    <path
+        android:pathData="M144.48,237H134V226.42"
+        android:strokeLineJoin="round"
+        android:strokeWidth="4"
+        android:fillColor="#00000000"
+        android:strokeColor="#669DF6"
+        android:strokeLineCap="round"/>
+    <path
+        android:pathData="M134,237L149,222"
+        android:strokeLineJoin="round"
+        android:strokeWidth="4"
+        android:fillColor="#00000000"
+        android:strokeColor="#669DF6"
+        android:strokeLineCap="round"/>
+    <path
+        android:pathData="M267.52,63L278,63L278,73.58"
+        android:strokeLineJoin="round"
+        android:strokeWidth="4"
+        android:fillColor="#00000000"
+        android:strokeColor="#669DF6"
+        android:strokeLineCap="round"/>
+    <path
+        android:pathData="M278,63L263,78"
+        android:strokeLineJoin="round"
+        android:strokeWidth="4"
+        android:fillColor="#00000000"
+        android:strokeColor="#669DF6"
+        android:strokeLineCap="round"/>
+  </group>
+</vector>
diff --git a/res/drawable-night/ic_app_aspect_ratio_fullscreen.xml b/res/drawable-night/ic_app_aspect_ratio_fullscreen.xml
new file mode 100644
index 0000000..aecc8f0
--- /dev/null
+++ b/res/drawable-night/ic_app_aspect_ratio_fullscreen.xml
@@ -0,0 +1,66 @@
+<!--
+  ~ 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="412dp"
+    android:height="300dp"
+    android:viewportWidth="412"
+    android:viewportHeight="300">
+  <group>
+    <clip-path
+        android:pathData="M0,0h412v300h-412z"/>
+    <path
+        android:pathData="M384.18,300H27.82C12.53,300 0,287.17 0,271.52V28.48C0,12.83 12.53,0 27.82,0H384.29C399.47,0 412,12.83 412,28.48V271.63C412,287.17 399.47,300 384.18,300Z"
+        android:fillColor="#000000"/>
+    <path
+        android:pathData="M321.83,134.76V134C322.96,133.96 323.87,132.78 323.87,131.32V116.86C323.87,115.4 322.96,114.22 321.83,114.18V58.55C321.83,52.85 317.2,48.22 311.49,48.22H213.79C211.62,48.22 209.49,48.77 207.6,49.82C206.71,50.18 205.73,50.18 204.85,49.83L204.81,49.82C202.92,48.77 200.79,48.22 198.62,48.22H101.22C95.51,48.22 90.88,52.85 90.88,58.55V242.05C90.88,247.76 95.51,252.38 101.22,252.38H198.84C201,252.38 203.13,251.83 205.03,250.78C205.86,250.45 206.78,250.44 207.63,250.73L207.73,250.78C209.62,251.83 213.04,252.38 215.2,252.38H311.49C317.2,252.38 321.83,247.76 321.83,242.05V181.69C322.96,181.65 323.87,180.47 323.87,179.01V152.1C323.87,150.65 322.96,149.46 321.83,149.43V134.76ZM319.45,242.43C319.45,246.61 315.67,250.01 311.49,250.01H101.22C97.04,250.01 93.26,246.61 93.26,242.43V58.55C93.26,54.38 97.04,50.6 101.22,50.6H311.49C315.67,50.6 319.45,54.38 319.45,58.55V242.43Z"
+        android:fillColor="#80868B"/>
+    <path
+        android:pathData="M100,53L312,53A4,4 0,0 1,316 57L316,243A4,4 0,0 1,312 247L100,247A4,4 0,0 1,96 243L96,57A4,4 0,0 1,100 53z"
+        android:fillColor="#669DF6"/>
+    <path
+        android:pathData="M102,57L310,57A2,2 0,0 1,312 59L312,241A2,2 0,0 1,310 243L102,243A2,2 0,0 1,100 241L100,59A2,2 0,0 1,102 57z"
+        android:fillColor="#000000"/>
+    <path
+        android:pathData="M116.48,237H106V226.42"
+        android:strokeLineJoin="round"
+        android:strokeWidth="4"
+        android:fillColor="#00000000"
+        android:strokeColor="#669DF6"
+        android:strokeLineCap="round"/>
+    <path
+        android:pathData="M106,237L121,222"
+        android:strokeLineJoin="round"
+        android:strokeWidth="4"
+        android:fillColor="#00000000"
+        android:strokeColor="#669DF6"
+        android:strokeLineCap="round"/>
+    <path
+        android:pathData="M295.52,63L306,63L306,73.58"
+        android:strokeLineJoin="round"
+        android:strokeWidth="4"
+        android:fillColor="#00000000"
+        android:strokeColor="#669DF6"
+        android:strokeLineCap="round"/>
+    <path
+        android:pathData="M306,63L291,78"
+        android:strokeLineJoin="round"
+        android:strokeWidth="4"
+        android:fillColor="#00000000"
+        android:strokeColor="#669DF6"
+        android:strokeLineCap="round"/>
+  </group>
+</vector>
diff --git a/res/drawable-night/ic_app_aspect_ratio_half_screen.xml b/res/drawable-night/ic_app_aspect_ratio_half_screen.xml
new file mode 100644
index 0000000..af533ea
--- /dev/null
+++ b/res/drawable-night/ic_app_aspect_ratio_half_screen.xml
@@ -0,0 +1,66 @@
+<!--
+  ~ 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="412dp"
+    android:height="300dp"
+    android:viewportWidth="412"
+    android:viewportHeight="300">
+  <group>
+    <clip-path
+        android:pathData="M0,0h412v300h-412z"/>
+    <path
+        android:pathData="M384.18,300H27.82C12.53,300 0,287.17 0,271.52V28.48C0,12.83 12.53,0 27.82,0H384.29C399.47,0 412,12.83 412,28.48V271.63C412,287.17 399.47,300 384.18,300Z"
+        android:fillColor="#000000"/>
+    <path
+        android:pathData="M321.83,134.76V134C322.96,133.96 323.87,132.78 323.87,131.32V116.86C323.87,115.4 322.96,114.22 321.83,114.18V58.55C321.83,52.85 317.2,48.22 311.49,48.22H213.79C211.62,48.22 209.49,48.77 207.6,49.82C206.71,50.18 205.73,50.18 204.85,49.83L204.81,49.82C202.92,48.77 200.79,48.22 198.62,48.22H101.22C95.51,48.22 90.88,52.85 90.88,58.55V242.05C90.88,247.76 95.51,252.38 101.22,252.38H198.84C201,252.38 203.13,251.83 205.03,250.78C205.86,250.45 206.78,250.44 207.63,250.73L207.73,250.78C209.62,251.83 213.04,252.38 215.2,252.38H311.49C317.2,252.38 321.83,247.76 321.83,242.05V181.69C322.96,181.65 323.87,180.47 323.87,179.01V152.1C323.87,150.65 322.96,149.46 321.83,149.43V134.76ZM319.45,242.43C319.45,246.61 315.67,250.01 311.49,250.01H101.22C97.04,250.01 93.26,246.61 93.26,242.43V58.55C93.26,54.38 97.04,50.6 101.22,50.6H311.49C315.67,50.6 319.45,54.38 319.45,58.55V242.43Z"
+        android:fillColor="#80868B"/>
+    <path
+        android:pathData="M148,53L264,53A4,4 0,0 1,268 57L268,243A4,4 0,0 1,264 247L148,247A4,4 0,0 1,144 243L144,57A4,4 0,0 1,148 53z"
+        android:fillColor="#669DF6"/>
+    <path
+        android:pathData="M150,57L262,57A2,2 0,0 1,264 59L264,241A2,2 0,0 1,262 243L150,243A2,2 0,0 1,148 241L148,59A2,2 0,0 1,150 57z"
+        android:fillColor="#000000"/>
+    <path
+        android:pathData="M164.48,237H154V226.42"
+        android:strokeLineJoin="round"
+        android:strokeWidth="4"
+        android:fillColor="#00000000"
+        android:strokeColor="#669DF6"
+        android:strokeLineCap="round"/>
+    <path
+        android:pathData="M154,237L169,222"
+        android:strokeLineJoin="round"
+        android:strokeWidth="4"
+        android:fillColor="#00000000"
+        android:strokeColor="#669DF6"
+        android:strokeLineCap="round"/>
+    <path
+        android:pathData="M247.52,63L258,63L258,73.58"
+        android:strokeLineJoin="round"
+        android:strokeWidth="4"
+        android:fillColor="#00000000"
+        android:strokeColor="#669DF6"
+        android:strokeLineCap="round"/>
+    <path
+        android:pathData="M258,63L243,78"
+        android:strokeLineJoin="round"
+        android:strokeWidth="4"
+        android:fillColor="#00000000"
+        android:strokeColor="#669DF6"
+        android:strokeLineCap="round"/>
+  </group>
+</vector>
diff --git a/res/drawable/battery_tips_all_rounded_bg_ripple.xml b/res/drawable/battery_tips_all_rounded_bg_ripple.xml
new file mode 100644
index 0000000..3180570
--- /dev/null
+++ b/res/drawable/battery_tips_all_rounded_bg_ripple.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  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.
+  -->
+
+<ripple xmlns:android="http://schemas.android.com/apk/res/android"
+    android:color="?android:attr/colorControlHighlight">
+    <item android:drawable="@drawable/battery_tips_all_rounded_bg"/>
+</ripple>
\ No newline at end of file
diff --git a/res/drawable/ic_app_aspect_ratio_16_9.xml b/res/drawable/ic_app_aspect_ratio_16_9.xml
new file mode 100644
index 0000000..2300f3d
--- /dev/null
+++ b/res/drawable/ic_app_aspect_ratio_16_9.xml
@@ -0,0 +1,66 @@
+<!--
+  ~ 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="412dp"
+    android:height="300dp"
+    android:viewportWidth="412"
+    android:viewportHeight="300">
+  <group>
+    <clip-path
+        android:pathData="M0,0h412v300h-412z"/>
+    <path
+        android:pathData="M384.18,300H27.82C12.53,300 0,287.17 0,271.52V28.48C0,12.83 12.53,0 27.82,0H384.29C399.47,0 412,12.83 412,28.48V271.63C412,287.17 399.47,300 384.18,300Z"
+        android:fillColor="#ffffff"/>
+    <path
+        android:pathData="M321.83,134.76V134C322.96,133.96 323.87,132.78 323.87,131.32V116.86C323.87,115.4 322.96,114.22 321.83,114.18V58.55C321.83,52.85 317.2,48.22 311.49,48.22H213.79C211.62,48.22 209.49,48.77 207.6,49.82C206.71,50.18 205.73,50.18 204.84,49.83L204.81,49.82C202.92,48.77 200.79,48.22 198.62,48.22H101.22C95.51,48.22 90.88,52.85 90.88,58.55V242.05C90.88,247.76 95.51,252.38 101.22,252.38H198.84C201,252.38 203.13,251.83 205.03,250.78C205.86,250.45 206.78,250.44 207.63,250.73L207.73,250.78C209.62,251.83 213.04,252.38 215.2,252.38H311.49C317.2,252.38 321.83,247.76 321.83,242.05V181.69C322.96,181.65 323.87,180.47 323.87,179.01V152.1C323.87,150.65 322.96,149.46 321.83,149.43V134.76ZM319.45,242.43C319.45,246.61 315.67,250.01 311.49,250.01H101.21C97.04,250.01 93.26,246.61 93.26,242.43V58.55C93.26,54.38 97.04,50.6 101.21,50.6H311.49C315.67,50.6 319.45,54.38 319.45,58.55V242.43Z"
+        android:fillColor="#DADCE0"/>
+    <path
+        android:pathData="M155,53L259,53A4,4 0,0 1,263 57L263,243A4,4 0,0 1,259 247L155,247A4,4 0,0 1,151 243L151,57A4,4 0,0 1,155 53z"
+        android:fillColor="#1A73E8"/>
+    <path
+        android:pathData="M157,57L257,57A2,2 0,0 1,259 59L259,241A2,2 0,0 1,257 243L157,243A2,2 0,0 1,155 241L155,59A2,2 0,0 1,157 57z"
+        android:fillColor="#ffffff"/>
+    <path
+        android:pathData="M171.48,237H161V226.42"
+        android:strokeLineJoin="round"
+        android:strokeWidth="4"
+        android:fillColor="#00000000"
+        android:strokeColor="#1A73E8"
+        android:strokeLineCap="round"/>
+    <path
+        android:pathData="M161,237L176,222"
+        android:strokeLineJoin="round"
+        android:strokeWidth="4"
+        android:fillColor="#00000000"
+        android:strokeColor="#1A73E8"
+        android:strokeLineCap="round"/>
+    <path
+        android:pathData="M242.52,63L253,63L253,73.58"
+        android:strokeLineJoin="round"
+        android:strokeWidth="4"
+        android:fillColor="#00000000"
+        android:strokeColor="#1A73E8"
+        android:strokeLineCap="round"/>
+    <path
+        android:pathData="M253,63L238,78"
+        android:strokeLineJoin="round"
+        android:strokeWidth="4"
+        android:fillColor="#00000000"
+        android:strokeColor="#1A73E8"
+        android:strokeLineCap="round"/>
+  </group>
+</vector>
diff --git a/res/drawable/ic_app_aspect_ratio_3_2.xml b/res/drawable/ic_app_aspect_ratio_3_2.xml
new file mode 100644
index 0000000..b28bdd4
--- /dev/null
+++ b/res/drawable/ic_app_aspect_ratio_3_2.xml
@@ -0,0 +1,66 @@
+<!--
+  ~ 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="412dp"
+    android:height="300dp"
+    android:viewportWidth="412"
+    android:viewportHeight="300">
+  <group>
+    <clip-path
+        android:pathData="M0,0h412v300h-412z"/>
+    <path
+        android:pathData="M384.18,300H27.82C12.53,300 0,287.17 0,271.52V28.48C0,12.83 12.53,0 27.82,0H384.29C399.47,0 412,12.83 412,28.48V271.63C412,287.17 399.47,300 384.18,300Z"
+        android:fillColor="#ffffff"/>
+    <path
+        android:pathData="M321.83,134.76V134C322.96,133.96 323.87,132.78 323.87,131.32V116.86C323.87,115.4 322.96,114.22 321.83,114.18V58.55C321.83,52.85 317.2,48.22 311.49,48.22H213.79C211.62,48.22 209.49,48.77 207.6,49.82C206.71,50.18 205.73,50.18 204.84,49.83L204.81,49.82C202.92,48.77 200.79,48.22 198.62,48.22H101.22C95.51,48.22 90.88,52.85 90.88,58.55V242.05C90.88,247.76 95.51,252.38 101.22,252.38H198.84C201,252.38 203.13,251.83 205.03,250.78C205.86,250.45 206.78,250.44 207.63,250.73L207.73,250.78C209.62,251.83 213.04,252.38 215.2,252.38H311.49C317.2,252.38 321.83,247.76 321.83,242.05V181.69C322.96,181.65 323.87,180.47 323.87,179.01V152.1C323.87,150.65 322.96,149.46 321.83,149.43V134.76ZM319.45,242.43C319.45,246.61 315.67,250.01 311.49,250.01H101.21C97.04,250.01 93.26,246.61 93.26,242.43V58.55C93.26,54.38 97.04,50.6 101.21,50.6H311.49C315.67,50.6 319.45,54.38 319.45,58.55V242.43Z"
+        android:fillColor="#DADCE0"/>
+    <path
+        android:pathData="M144,53L268,53A4,4 0,0 1,272 57L272,243A4,4 0,0 1,268 247L144,247A4,4 0,0 1,140 243L140,57A4,4 0,0 1,144 53z"
+        android:fillColor="#1A73E8"/>
+    <path
+        android:pathData="M146,57L266,57A2,2 0,0 1,268 59L268,241A2,2 0,0 1,266 243L146,243A2,2 0,0 1,144 241L144,59A2,2 0,0 1,146 57z"
+        android:fillColor="#ffffff"/>
+    <path
+        android:pathData="M160.48,237H150V226.42"
+        android:strokeLineJoin="round"
+        android:strokeWidth="4"
+        android:fillColor="#00000000"
+        android:strokeColor="#1A73E8"
+        android:strokeLineCap="round"/>
+    <path
+        android:pathData="M150,237L165,222"
+        android:strokeLineJoin="round"
+        android:strokeWidth="4"
+        android:fillColor="#00000000"
+        android:strokeColor="#1A73E8"
+        android:strokeLineCap="round"/>
+    <path
+        android:pathData="M251.52,63L262,63L262,73.58"
+        android:strokeLineJoin="round"
+        android:strokeWidth="4"
+        android:fillColor="#00000000"
+        android:strokeColor="#1A73E8"
+        android:strokeLineCap="round"/>
+    <path
+        android:pathData="M262,63L247,78"
+        android:strokeLineJoin="round"
+        android:strokeWidth="4"
+        android:fillColor="#00000000"
+        android:strokeColor="#1A73E8"
+        android:strokeLineCap="round"/>
+  </group>
+</vector>
diff --git a/res/drawable/ic_app_aspect_ratio_4_3.xml b/res/drawable/ic_app_aspect_ratio_4_3.xml
new file mode 100644
index 0000000..ba875e9
--- /dev/null
+++ b/res/drawable/ic_app_aspect_ratio_4_3.xml
@@ -0,0 +1,66 @@
+<!--
+  ~ 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="412dp"
+    android:height="300dp"
+    android:viewportWidth="412"
+    android:viewportHeight="300">
+  <group>
+    <clip-path
+        android:pathData="M0,0h412v300h-412z"/>
+    <path
+        android:pathData="M384.18,300H27.82C12.53,300 0,287.17 0,271.52V28.48C0,12.83 12.53,0 27.82,0H384.29C399.47,0 412,12.83 412,28.48V271.63C412,287.17 399.47,300 384.18,300Z"
+        android:fillColor="#ffffff"/>
+    <path
+        android:pathData="M321.83,134.76V134C322.96,133.96 323.87,132.78 323.87,131.32V116.86C323.87,115.4 322.96,114.22 321.83,114.18V58.55C321.83,52.85 317.2,48.22 311.49,48.22H213.79C211.62,48.22 209.49,48.77 207.6,49.82C206.71,50.18 205.73,50.18 204.84,49.83L204.81,49.82C202.92,48.77 200.79,48.22 198.62,48.22H101.22C95.51,48.22 90.88,52.85 90.88,58.55V242.05C90.88,247.76 95.51,252.38 101.22,252.38H198.84C201,252.38 203.13,251.83 205.03,250.78C205.86,250.45 206.78,250.44 207.63,250.73L207.73,250.78C209.62,251.83 213.04,252.38 215.2,252.38H311.49C317.2,252.38 321.83,247.76 321.83,242.05V181.69C322.96,181.65 323.87,180.47 323.87,179.01V152.1C323.87,150.65 322.96,149.46 321.83,149.43V134.76ZM319.45,242.43C319.45,246.61 315.67,250.01 311.49,250.01H101.21C97.04,250.01 93.26,246.61 93.26,242.43V58.55C93.26,54.38 97.04,50.6 101.21,50.6H311.49C315.67,50.6 319.45,54.38 319.45,58.55V242.43Z"
+        android:fillColor="#DADCE0"/>
+    <path
+        android:pathData="M136,53L276,53A4,4 0,0 1,280 57L280,243A4,4 0,0 1,276 247L136,247A4,4 0,0 1,132 243L132,57A4,4 0,0 1,136 53z"
+        android:fillColor="#1A73E8"/>
+    <path
+        android:pathData="M138,57L274,57A2,2 0,0 1,276 59L276,241A2,2 0,0 1,274 243L138,243A2,2 0,0 1,136 241L136,59A2,2 0,0 1,138 57z"
+        android:fillColor="#ffffff"/>
+    <path
+        android:pathData="M152.48,237H142V226.42"
+        android:strokeLineJoin="round"
+        android:strokeWidth="4"
+        android:fillColor="#00000000"
+        android:strokeColor="#1A73E8"
+        android:strokeLineCap="round"/>
+    <path
+        android:pathData="M142,237L157,222"
+        android:strokeLineJoin="round"
+        android:strokeWidth="4"
+        android:fillColor="#00000000"
+        android:strokeColor="#1A73E8"
+        android:strokeLineCap="round"/>
+    <path
+        android:pathData="M259.52,63L270,63L270,73.58"
+        android:strokeLineJoin="round"
+        android:strokeWidth="4"
+        android:fillColor="#00000000"
+        android:strokeColor="#1A73E8"
+        android:strokeLineCap="round"/>
+    <path
+        android:pathData="M270,63L255,78"
+        android:strokeLineJoin="round"
+        android:strokeWidth="4"
+        android:fillColor="#00000000"
+        android:strokeColor="#1A73E8"
+        android:strokeLineCap="round"/>
+  </group>
+</vector>
diff --git a/res/drawable/ic_app_aspect_ratio_display_size.xml b/res/drawable/ic_app_aspect_ratio_display_size.xml
new file mode 100644
index 0000000..1122395
--- /dev/null
+++ b/res/drawable/ic_app_aspect_ratio_display_size.xml
@@ -0,0 +1,66 @@
+<!--
+  ~ 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="412dp"
+    android:height="300dp"
+    android:viewportWidth="412"
+    android:viewportHeight="300">
+  <group>
+    <clip-path
+        android:pathData="M0,0h412v300h-412z"/>
+    <path
+        android:pathData="M384.18,300H27.82C12.53,300 0,287.17 0,271.52V28.48C0,12.83 12.53,0 27.82,0H384.29C399.47,0 412,12.83 412,28.48V271.63C412,287.17 399.47,300 384.18,300Z"
+        android:fillColor="#ffffff"/>
+    <path
+        android:pathData="M321.83,134.76V134C322.96,133.96 323.87,132.78 323.87,131.32V116.86C323.87,115.4 322.96,114.22 321.83,114.18V58.55C321.83,52.85 317.2,48.22 311.49,48.22H213.79C211.62,48.22 209.49,48.77 207.6,49.82C206.71,50.18 205.73,50.18 204.84,49.83L204.81,49.82C202.92,48.77 200.79,48.22 198.62,48.22H101.22C95.51,48.22 90.88,52.85 90.88,58.55V242.05C90.88,247.76 95.51,252.38 101.22,252.38H198.84C201,252.38 203.13,251.83 205.03,250.78C205.86,250.45 206.78,250.44 207.63,250.73L207.73,250.78C209.62,251.83 213.04,252.38 215.2,252.38H311.49C317.2,252.38 321.83,247.76 321.83,242.05V181.69C322.96,181.65 323.87,180.47 323.87,179.01V152.1C323.87,150.65 322.96,149.46 321.83,149.43V134.76ZM319.45,242.43C319.45,246.61 315.67,250.01 311.49,250.01H101.21C97.04,250.01 93.26,246.61 93.26,242.43V58.55C93.26,54.38 97.04,50.6 101.21,50.6H311.49C315.67,50.6 319.45,54.38 319.45,58.55V242.43Z"
+        android:fillColor="#DADCE0"/>
+    <path
+        android:pathData="M128,53L284,53A4,4 0,0 1,288 57L288,243A4,4 0,0 1,284 247L128,247A4,4 0,0 1,124 243L124,57A4,4 0,0 1,128 53z"
+        android:fillColor="#1A73E8"/>
+    <path
+        android:pathData="M130,57L282,57A2,2 0,0 1,284 59L284,241A2,2 0,0 1,282 243L130,243A2,2 0,0 1,128 241L128,59A2,2 0,0 1,130 57z"
+        android:fillColor="#ffffff"/>
+    <path
+        android:pathData="M144.48,237H134V226.42"
+        android:strokeLineJoin="round"
+        android:strokeWidth="4"
+        android:fillColor="#00000000"
+        android:strokeColor="#1A73E8"
+        android:strokeLineCap="round"/>
+    <path
+        android:pathData="M134,237L149,222"
+        android:strokeLineJoin="round"
+        android:strokeWidth="4"
+        android:fillColor="#00000000"
+        android:strokeColor="#1A73E8"
+        android:strokeLineCap="round"/>
+    <path
+        android:pathData="M267.52,63L278,63L278,73.58"
+        android:strokeLineJoin="round"
+        android:strokeWidth="4"
+        android:fillColor="#00000000"
+        android:strokeColor="#1A73E8"
+        android:strokeLineCap="round"/>
+    <path
+        android:pathData="M278,63L263,78"
+        android:strokeLineJoin="round"
+        android:strokeWidth="4"
+        android:fillColor="#00000000"
+        android:strokeColor="#1A73E8"
+        android:strokeLineCap="round"/>
+  </group>
+</vector>
diff --git a/res/drawable/ic_app_aspect_ratio_fullscreen.xml b/res/drawable/ic_app_aspect_ratio_fullscreen.xml
new file mode 100644
index 0000000..0e62fe5
--- /dev/null
+++ b/res/drawable/ic_app_aspect_ratio_fullscreen.xml
@@ -0,0 +1,66 @@
+<!--
+  ~ 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="412dp"
+    android:height="300dp"
+    android:viewportWidth="412"
+    android:viewportHeight="300">
+  <group>
+    <clip-path
+        android:pathData="M0,0h412v300h-412z"/>
+    <path
+        android:pathData="M384.18,300H27.82C12.53,300 0,287.17 0,271.52V28.48C0,12.83 12.53,0 27.82,0H384.29C399.47,0 412,12.83 412,28.48V271.63C412,287.17 399.47,300 384.18,300Z"
+        android:fillColor="#ffffff"/>
+    <path
+        android:pathData="M321.83,134.76V134C322.96,133.96 323.87,132.78 323.87,131.32V116.86C323.87,115.4 322.96,114.22 321.83,114.18V58.55C321.83,52.85 317.2,48.22 311.49,48.22H213.79C211.62,48.22 209.49,48.77 207.6,49.82C206.71,50.18 205.73,50.18 204.84,49.83L204.81,49.82C202.92,48.77 200.79,48.22 198.62,48.22H101.22C95.51,48.22 90.88,52.85 90.88,58.55V242.05C90.88,247.76 95.51,252.38 101.22,252.38H198.84C201,252.38 203.13,251.83 205.03,250.78C205.86,250.45 206.78,250.44 207.63,250.73L207.73,250.78C209.62,251.83 213.04,252.38 215.2,252.38H311.49C317.2,252.38 321.83,247.76 321.83,242.05V181.69C322.96,181.65 323.87,180.47 323.87,179.01V152.1C323.87,150.65 322.96,149.46 321.83,149.43V134.76ZM319.45,242.43C319.45,246.61 315.67,250.01 311.49,250.01H101.21C97.04,250.01 93.26,246.61 93.26,242.43V58.55C93.26,54.38 97.04,50.6 101.21,50.6H311.49C315.67,50.6 319.45,54.38 319.45,58.55V242.43Z"
+        android:fillColor="#DADCE0"/>
+    <path
+        android:pathData="M100,53L312,53A4,4 0,0 1,316 57L316,243A4,4 0,0 1,312 247L100,247A4,4 0,0 1,96 243L96,57A4,4 0,0 1,100 53z"
+        android:fillColor="#1A73E8"/>
+    <path
+        android:pathData="M102,57L310,57A2,2 0,0 1,312 59L312,241A2,2 0,0 1,310 243L102,243A2,2 0,0 1,100 241L100,59A2,2 0,0 1,102 57z"
+        android:fillColor="#ffffff"/>
+    <path
+        android:pathData="M116.48,237H106V226.42"
+        android:strokeLineJoin="round"
+        android:strokeWidth="4"
+        android:fillColor="#00000000"
+        android:strokeColor="#1A73E8"
+        android:strokeLineCap="round"/>
+    <path
+        android:pathData="M106,237L121,222"
+        android:strokeLineJoin="round"
+        android:strokeWidth="4"
+        android:fillColor="#00000000"
+        android:strokeColor="#1A73E8"
+        android:strokeLineCap="round"/>
+    <path
+        android:pathData="M295.52,63L306,63L306,73.58"
+        android:strokeLineJoin="round"
+        android:strokeWidth="4"
+        android:fillColor="#00000000"
+        android:strokeColor="#1A73E8"
+        android:strokeLineCap="round"/>
+    <path
+        android:pathData="M306,63L291,78"
+        android:strokeLineJoin="round"
+        android:strokeWidth="4"
+        android:fillColor="#00000000"
+        android:strokeColor="#1A73E8"
+        android:strokeLineCap="round"/>
+  </group>
+</vector>
diff --git a/res/drawable/ic_app_aspect_ratio_half_screen.xml b/res/drawable/ic_app_aspect_ratio_half_screen.xml
new file mode 100644
index 0000000..43afce1
--- /dev/null
+++ b/res/drawable/ic_app_aspect_ratio_half_screen.xml
@@ -0,0 +1,66 @@
+<!--
+  ~ 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="412dp"
+    android:height="300dp"
+    android:viewportWidth="412"
+    android:viewportHeight="300">
+  <group>
+    <clip-path
+        android:pathData="M0,0h412v300h-412z"/>
+    <path
+        android:pathData="M384.18,300H27.82C12.53,300 0,287.17 0,271.52V28.48C0,12.83 12.53,0 27.82,0H384.29C399.47,0 412,12.83 412,28.48V271.63C412,287.17 399.47,300 384.18,300Z"
+        android:fillColor="#ffffff"/>
+    <path
+        android:pathData="M321.83,134.76V134C322.96,133.96 323.87,132.78 323.87,131.32V116.86C323.87,115.4 322.96,114.22 321.83,114.18V58.55C321.83,52.85 317.2,48.22 311.49,48.22H213.79C211.62,48.22 209.49,48.77 207.6,49.82C206.71,50.18 205.73,50.18 204.84,49.83L204.81,49.82C202.92,48.77 200.79,48.22 198.62,48.22H101.22C95.51,48.22 90.88,52.85 90.88,58.55V242.05C90.88,247.76 95.51,252.38 101.22,252.38H198.84C201,252.38 203.13,251.83 205.03,250.78C205.86,250.45 206.78,250.44 207.63,250.73L207.73,250.78C209.62,251.83 213.04,252.38 215.2,252.38H311.49C317.2,252.38 321.83,247.76 321.83,242.05V181.69C322.96,181.65 323.87,180.47 323.87,179.01V152.1C323.87,150.65 322.96,149.46 321.83,149.43V134.76ZM319.45,242.43C319.45,246.61 315.67,250.01 311.49,250.01H101.21C97.04,250.01 93.26,246.61 93.26,242.43V58.55C93.26,54.38 97.04,50.6 101.21,50.6H311.49C315.67,50.6 319.45,54.38 319.45,58.55V242.43Z"
+        android:fillColor="#DADCE0"/>
+    <path
+        android:pathData="M148,53L264,53A4,4 0,0 1,268 57L268,243A4,4 0,0 1,264 247L148,247A4,4 0,0 1,144 243L144,57A4,4 0,0 1,148 53z"
+        android:fillColor="#1A73E8"/>
+    <path
+        android:pathData="M150,57L262,57A2,2 0,0 1,264 59L264,241A2,2 0,0 1,262 243L150,243A2,2 0,0 1,148 241L148,59A2,2 0,0 1,150 57z"
+        android:fillColor="#ffffff"/>
+    <path
+        android:pathData="M164.48,237H154V226.42"
+        android:strokeLineJoin="round"
+        android:strokeWidth="4"
+        android:fillColor="#00000000"
+        android:strokeColor="#1A73E8"
+        android:strokeLineCap="round"/>
+    <path
+        android:pathData="M154,237L169,222"
+        android:strokeLineJoin="round"
+        android:strokeWidth="4"
+        android:fillColor="#00000000"
+        android:strokeColor="#1A73E8"
+        android:strokeLineCap="round"/>
+    <path
+        android:pathData="M247.52,63L258,63L258,73.58"
+        android:strokeLineJoin="round"
+        android:strokeWidth="4"
+        android:fillColor="#00000000"
+        android:strokeColor="#1A73E8"
+        android:strokeLineCap="round"/>
+    <path
+        android:pathData="M258,63L243,78"
+        android:strokeLineJoin="round"
+        android:strokeWidth="4"
+        android:fillColor="#00000000"
+        android:strokeColor="#1A73E8"
+        android:strokeLineCap="round"/>
+  </group>
+</vector>
diff --git a/res/drawable/ic_lock_open_24dp.xml b/res/drawable/ic_lock_open_24dp.xml
new file mode 100644
index 0000000..ba80956
--- /dev/null
+++ b/res/drawable/ic_lock_open_24dp.xml
@@ -0,0 +1,10 @@
+<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="M240,320h360v-80q0,-50 -35,-85t-85,-35q-50,0 -85,35t-35,85h-80q0,-83 58.5,-141.5T480,40q83,0 141.5,58.5T680,240v80h40q33,0 56.5,23.5T800,400v400q0,33 -23.5,56.5T720,880L240,880q-33,0 -56.5,-23.5T160,800v-400q0,-33 23.5,-56.5T240,320ZM240,800h480v-400L240,400v400ZM480,680q33,0 56.5,-23.5T560,600q0,-33 -23.5,-56.5T480,520q-33,0 -56.5,23.5T400,600q0,33 23.5,56.5T480,680ZM240,800v-400,400Z"/>
+</vector>
\ No newline at end of file
diff --git a/res/layout/battery_tips_card.xml b/res/layout/battery_tips_card.xml
index d2edb51..2fa5bf2 100644
--- a/res/layout/battery_tips_card.xml
+++ b/res/layout/battery_tips_card.xml
@@ -12,36 +12,16 @@
         android:id="@+id/tips_card"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
-        android:background="@drawable/battery_tips_all_rounded_bg"
+        android:background="@drawable/battery_tips_all_rounded_bg_ripple"
         android:orientation="vertical"
         android:padding="24dp">
 
-        <LinearLayout
-            android:layout_width="match_parent"
+        <ImageView
+            android:id="@+id/icon"
+            android:layout_width="wrap_content"
             android:layout_height="wrap_content"
-            android:orientation="horizontal">
-
-            <ImageView
-                android:id="@+id/icon"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:layout_gravity="center_vertical|start"
-                android:src="@drawable/ic_battery_tips_lightbulb" />
-
-            <Space
-                android:layout_width="0dp"
-                android:layout_height="0dp"
-                android:layout_weight="1" />
-
-            <ImageButton
-                android:id="@+id/dismiss_button"
-                style="@style/Banner.Dismiss.SettingsLib"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:layout_gravity="center_vertical|end"
-                android:layout_marginEnd="0dp"
-                android:src="@drawable/ic_battery_tips_close_icon" />
-        </LinearLayout>
+            android:layout_gravity="center_vertical|start"
+            android:src="@drawable/ic_battery_tips_lightbulb" />
 
         <TextView
             android:id="@+id/title"
@@ -53,30 +33,40 @@
             android:textAppearance="?android:attr/textAppearanceLarge"
             android:textColor="?android:attr/textColorPrimary" />
 
-        <TextView
-            android:id="@+id/summary"
+        <LinearLayout
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
+            android:orientation="horizontal"
             android:layout_marginTop="8dp"
-            android:gravity="start"
-            android:maxLines="10"
-            android:textAlignment="viewStart"
-            android:textAppearance="?android:attr/textAppearanceSmall"
-            android:textColor="?android:attr/textColorSecondary" />
+            android:gravity="end">
 
-        <com.google.android.material.button.MaterialButton
-            android:id="@+id/action_button"
-            style="@style/Widget.Material3.Button.OutlinedButton"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_gravity="end"
-            android:layout_marginTop="8dp"
-            android:text="@string/battery_tips_card_action_button"
-            android:textAppearance="?android:attr/textAppearanceSmall"
-            android:textColor="?android:attr/textColorPrimary"
-            android:textStyle="bold"
-            app:strokeColor="?android:attr/colorAccent"
-            app:strokeWidth="1dp" />
+            <com.google.android.material.button.MaterialButton
+                android:id="@+id/dismiss_button"
+                style="@style/Widget.Material3.Button.TextButton"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_gravity="end"
+                android:paddingHorizontal="16dp"
+                android:layout_marginEnd="8dp"
+                android:text="@string/battery_tips_card_dismiss_button"
+                android:textAppearance="?android:attr/textAppearanceSmall"
+                android:textColor="?android:attr/colorAccent"
+                android:textStyle="bold" />
+
+            <com.google.android.material.button.MaterialButton
+                android:id="@+id/main_button"
+                style="@style/Widget.Material3.Button.OutlinedButton"
+                android:paddingHorizontal="16dp"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_gravity="end"
+                android:text="@string/battery_tips_card_action_button"
+                android:textAppearance="?android:attr/textAppearanceSmall"
+                android:textColor="?android:attr/textColorPrimary"
+                android:textStyle="bold"
+                app:strokeColor="?android:attr/colorAccent"
+                app:strokeWidth="1dp" />
+        </LinearLayout>
     </LinearLayout>
 
     <Space
diff --git a/res/layout/bluetooth_pin_confirm.xml b/res/layout/bluetooth_pin_confirm.xml
index 7b5b046..bcc47ad 100644
--- a/res/layout/bluetooth_pin_confirm.xml
+++ b/res/layout/bluetooth_pin_confirm.xml
@@ -76,15 +76,37 @@
             android:textAppearance="@*android:style/TextAppearance.DeviceDefault.Body1"
             android:visibility="gone" />
 
-        <CheckBox
-            android:id="@+id/phonebook_sharing_message_confirm_pin"
-            android:layout_width="wrap_content"
+        <LinearLayout
+            android:id="@+id/phonebook_sharing"
             android:layout_height="wrap_content"
-            android:minHeight="@dimen/min_tap_target_size"
+            android:layout_width="match_parent"
             android:layout_marginStart="@dimen/bluetooth_dialog_padding"
             android:layout_marginEnd="@dimen/bluetooth_dialog_padding"
-            android:textAppearance="@*android:style/TextAppearance.DeviceDefault.Body1" />
-
+            android:orientation="horizontal">
+            <LinearLayout
+                android:layout_height="wrap_content"
+                android:layout_width="wrap_content"
+                android:layout_weight="1"
+                android:layout_marginEnd="10dp"
+                android:orientation="vertical">
+                <TextView
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:text="@string/bluetooth_pairing_phonebook_toggle_text"
+                    android:textAppearance="@*android:style/TextAppearance.DeviceDefault.Body1" />
+                <TextView
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:text="@string/bluetooth_pairing_phonebook_toggle_details"
+                    android:textAppearance="@*android:style/TextAppearance.DeviceDefault.Caption" />
+            </LinearLayout>
+            <Switch
+                android:id="@+id/phonebook_sharing_message_confirm_pin"
+                android:layout_width="wrap_content"
+                android:layout_height="match_parent"
+                android:layout_weight="0"
+                android:gravity="center_vertical" />
+        </LinearLayout>
     </LinearLayout>
 
 </ScrollView>
diff --git a/res/layout/radio_with_image_preference.xml b/res/layout/radio_with_image_preference.xml
new file mode 100644
index 0000000..fcd0e26
--- /dev/null
+++ b/res/layout/radio_with_image_preference.xml
@@ -0,0 +1,75 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ 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.
+  -->
+
+<LinearLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:background="?android:attr/selectableItemBackground"
+    android:gravity="center_vertical"
+    android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
+    android:paddingTop="16dp"
+    android:paddingBottom="16dp">
+
+    <LinearLayout
+        android:id="@android:id/widget_frame"
+        android:layout_width="wrap_content"
+        android:layout_height="match_parent"
+        android:paddingHorizontal="20dp"
+        android:gravity="center_horizontal"
+        android:minWidth="56dp"
+        android:orientation="vertical"/>
+
+    <LinearLayout
+        android:layout_width="0dp"
+        android:layout_height="wrap_content"
+        android:layout_weight="1"
+        android:orientation="vertical"
+        android:paddingEnd="?android:attr/listPreferredItemPaddingEnd">
+
+        <TextView
+            android:id="@android:id/title"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:maxLines="2"
+            android:textAppearance="?android:attr/textAppearanceListItem"/>
+
+        <LinearLayout
+            android:id="@+id/summary_container"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:visibility="gone">
+            <TextView
+                android:id="@android:id/summary"
+                android:layout_width="0dp"
+                android:layout_height="wrap_content"
+                android:layout_weight="1"
+                android:textAppearance="?android:attr/textAppearanceSmall"
+                android:textAlignment="viewStart"
+                android:textColor="?android:attr/textColorSecondary"/>
+        </LinearLayout>
+
+        <ImageView
+            android:id="@android:id/icon"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:paddingTop="@dimen/settingslib_illustration_padding"
+            android:adjustViewBounds="true"
+            android:maxWidth="@dimen/settingslib_illustration_width"
+            android:maxHeight="@dimen/settingslib_illustration_height" />
+    </LinearLayout>
+</LinearLayout>
\ No newline at end of file
diff --git a/res/layout/remote_auth_enroll_introduction.xml b/res/layout/remote_auth_enroll_introduction.xml
new file mode 100644
index 0000000..e55d0b2
--- /dev/null
+++ b/res/layout/remote_auth_enroll_introduction.xml
@@ -0,0 +1,142 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    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.
+-->
+
+<com.google.android.setupdesign.GlifLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:id="@+id/setup_wizard_layout"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:icon="@drawable/ic_lock"
+    app:sucUsePartnerResource="false"
+    app:sucHeaderText="@string/security_settings_remoteauth_enroll_introduction_title"
+    app:sudDescriptionText="@string/security_settings_remoteauth_enroll_introduction_message">
+
+    <androidx.constraintlayout.widget.ConstraintLayout
+        style="@style/SudContentFrame"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:paddingHorizontal="@dimen/remoteauth_fragment_padding_horizontal"
+        app:layout_optimizationLevel="barrier">
+
+        <com.android.settings.remoteauth.introduction.IntroductionImageCarousel
+            android:id="@+id/image_carousel_view"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintTop_toTopOf="parent"  />
+
+        <!-- How it works -->
+        <TextView
+            android:id="@+id/explanation_subheading_how_it_works"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            style="@style/BiometricEnrollIntroTitle"
+            android:text="@string/security_settings_remoteauth_enroll_introduction_how_title"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toBottomOf="@id/image_carousel_view" />
+
+        <ImageView
+            android:id="@+id/explanation_icon_lock_open"
+            android:layout_width="@dimen/remoteauth_icon_small_size"
+            android:layout_height="@dimen/remoteauth_icon_small_size"
+            android:importantForAccessibility="no"
+            android:background="@drawable/ic_lock_open_24dp"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toBottomOf="@id/explanation_subheading_how_it_works" />
+
+        <TextView
+            android:id="@+id/explanation_lock_open_description"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginStart="@dimen/remoteauth_introduction_description_start_margin"
+            style="@style/BiometricEnrollIntroMessage"
+            android:text="@string/security_settings_remoteauth_enroll_introduction_info_lock_open"
+            app:layout_constrainedWidth="true"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintStart_toEndOf="@id/explanation_icon_lock_open"
+            app:layout_constraintTop_toTopOf="@id/explanation_icon_lock_open" />
+
+        <androidx.constraintlayout.widget.Barrier
+            android:id="@+id/explanation_lock_open_description_barrier"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            app:barrierDirection="bottom"
+            app:constraint_referenced_ids="explanation_icon_lock_open, explanation_lock_open_description" />
+
+        <ImageView
+            android:id="@+id/explanation_icon_notifications"
+            android:layout_width="@dimen/remoteauth_icon_small_size"
+            android:layout_height="@dimen/remoteauth_icon_small_size"
+            android:importantForAccessibility="no"
+            android:background="@drawable/ic_notifications"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toBottomOf="@id/explanation_lock_open_description_barrier"/>
+
+        <TextView
+            android:id="@+id/explanation_notifications_description"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginStart="@dimen/remoteauth_introduction_description_start_margin"
+            style="@style/BiometricEnrollIntroMessage"
+            android:text="@string/security_settings_remoteauth_enroll_introduction_info_notifications"
+            app:layout_constrainedWidth="true"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintStart_toEndOf="@id/explanation_icon_notifications"
+            app:layout_constraintTop_toTopOf="@id/explanation_icon_notifications" />
+
+        <androidx.constraintlayout.widget.Barrier
+            android:id="@+id/explanation_notifications_description_barrier"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            app:barrierDirection="bottom"
+            app:constraint_referenced_ids="explanation_icon_notifications,explanation_notifications_description" />
+
+        <!-- You're in control -->
+        <TextView
+            android:id="@+id/explanation_subheading_youre_in_control"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            style="@style/BiometricEnrollIntroTitle"
+            android:text="@string/security_settings_remoteauth_enroll_introduction_youre_in_control_title"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toBottomOf="@id/explanation_notifications_description_barrier" />
+
+        <ImageView
+            android:id="@+id/explanation_icon_remove_watch"
+            android:layout_width="@dimen/remoteauth_icon_small_size"
+            android:layout_height="@dimen/remoteauth_icon_small_size"
+            android:importantForAccessibility="no"
+            android:background="@drawable/ic_delete"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toBottomOf="@id/explanation_subheading_youre_in_control" />
+
+        <TextView
+            android:id="@+id/explanation_remove_watch_description"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginStart="@dimen/remoteauth_introduction_description_start_margin"
+            style="@style/BiometricEnrollIntroMessage"
+            android:text="@string/security_settings_remoteauth_enroll_introduction_info_remove_watch"
+            app:layout_constrainedWidth="true"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintStart_toEndOf="@id/explanation_icon_remove_watch"
+            app:layout_constraintTop_toTopOf="@id/explanation_icon_remove_watch" />
+    </androidx.constraintlayout.widget.ConstraintLayout>
+
+</com.google.android.setupdesign.GlifLayout>
\ No newline at end of file
diff --git a/res/layout/remote_auth_introduction_image_carousel.xml b/res/layout/remote_auth_introduction_image_carousel.xml
new file mode 100644
index 0000000..feb8e6a
--- /dev/null
+++ b/res/layout/remote_auth_introduction_image_carousel.xml
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    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.
+-->
+
+<androidx.constraintlayout.widget.ConstraintLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:paddingHorizontal="@dimen/remoteauth_introduction_fragment_padding_horizontal"
+    app:layout_optimizationLevel="barrier">
+
+    <androidx.viewpager2.widget.ViewPager2
+        android:id="@+id/image_carousel"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintTop_toTopOf="parent" />
+
+    <ImageView
+        android:id="@+id/carousel_back_arrow"
+        app:layout_constraintStart_toStartOf="parent"
+        android:contentDescription="@string/wizard_back"
+        android:layout_width="@dimen/remoteauth_touchable_area_minimum_span"
+        android:layout_height="@dimen/remoteauth_touchable_area_minimum_span"
+        android:scaleType="center"
+        android:tintMode="src_in"
+        app:layout_constraintEnd_toStartOf="@id/carousel_progress_indicator"
+        app:layout_constraintHorizontal_chainStyle="spread_inside"
+        app:layout_constraintTop_toTopOf="@id/carousel_progress_indicator"
+        app:layout_constraintBottom_toBottomOf="@id/carousel_progress_indicator"
+        android:background="@drawable/ic_arrow_back" />
+
+    <androidx.recyclerview.widget.RecyclerView
+        android:id="@+id/carousel_progress_indicator"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:importantForAccessibility="no"
+        app:layout_constraintStart_toEndOf="@id/carousel_back_arrow"
+        app:layout_constraintEnd_toStartOf="@id/carousel_forward_arrow"
+        app:layout_constraintTop_toBottomOf="@id/image_carousel"
+        android:layout_marginTop="@dimen/remoteauth_carousel_progress_margin" />
+
+    <ImageView
+        android:id="@+id/carousel_forward_arrow"
+        android:contentDescription="@string/wizard_next"
+        android:layout_width="@dimen/remoteauth_touchable_area_minimum_span"
+        android:layout_height="@dimen/remoteauth_touchable_area_minimum_span"
+        android:scaleType="center"
+        android:tintMode="src_in"
+        app:layout_constraintStart_toEndOf="@id/carousel_progress_indicator"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintTop_toTopOf="@id/carousel_progress_indicator"
+        app:layout_constraintBottom_toBottomOf="@id/carousel_progress_indicator"
+        android:background="@drawable/ic_arrow_forward" />
+
+    <androidx.constraintlayout.widget.Barrier
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        app:barrierMargin="@dimen/remoteauth_carousel_progress_margin"
+        app:barrierDirection="bottom"
+        app:constraint_referenced_ids="carousel_back_arrow,carousel_forward_arrow" />
+
+</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
diff --git a/res/layout/remote_auth_introduction_image_carousel_item.xml b/res/layout/remote_auth_introduction_image_carousel_item.xml
new file mode 100644
index 0000000..4b599e2
--- /dev/null
+++ b/res/layout/remote_auth_introduction_image_carousel_item.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    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.
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+              xmlns:app="http://schemas.android.com/apk/res-auto"
+              android:id="@+id/explanation_animation_container"
+              android:layout_width="match_parent"
+              android:layout_height="match_parent"
+              android:orientation="vertical"
+              android:gravity="center_horizontal">
+
+    <com.airbnb.lottie.LottieAnimationView
+        android:id="@+id/explanation_animation"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:importantForAccessibility="no"
+        app:lottie_loop="true"
+        app:lottie_autoPlay="true" />
+
+    <TextView
+        android:id="@+id/carousel_text"
+        android:textSize="@dimen/remoteauth_introduction_subheading_text_size"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content" />
+
+</LinearLayout>
\ No newline at end of file
diff --git a/res/layout/remote_auth_introduction_image_carousel_progress_icon.xml b/res/layout/remote_auth_introduction_image_carousel_progress_icon.xml
new file mode 100644
index 0000000..b9ee39a
--- /dev/null
+++ b/res/layout/remote_auth_introduction_image_carousel_progress_icon.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    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.
+-->
+
+<ImageView xmlns:android="http://schemas.android.com/apk/res/android"
+           xmlns:app="http://schemas.android.com/apk/res-auto"
+           android:layout_width="@dimen/remoteauth_carousel_progress_circle_diameter"
+           android:layout_height="@dimen/remoteauth_carousel_progress_circle_diameter"
+           android:layout_marginHorizontal="@dimen/remoteauth_carousel_progress_circle_margin"
+           android:background="@drawable/ring_progress" />
\ No newline at end of file
diff --git a/res/raw/remoteauth_explanation_notification_animation.json b/res/raw/remoteauth_explanation_notification_animation.json
new file mode 100644
index 0000000..21298a7
--- /dev/null
+++ b/res/raw/remoteauth_explanation_notification_animation.json
@@ -0,0 +1 @@
+{"v":"5.9.4","fr":60,"ip":0,"op":301,"w":412,"h":300,"nm":"WatchUnlock_Swipe_V02","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":3,"nm":"ARM_MOVEIN","sr":1,"ks":{"o":{"a":0,"k":0,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":70,"s":[-36]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":98,"s":[1]},{"t":123,"s":[0]}],"ix":10},"p":{"s":true,"x":{"a":1,"k":[{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":70,"s":[-109]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":98,"s":[-29]},{"t":123,"s":[-29]}],"ix":3},"y":{"a":1,"k":[{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":70,"s":[278.5]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":98,"s":[288.5]},{"t":123,"s":[288.5]}],"ix":4}},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"ip":0,"op":1800,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":3,"nm":"Null 69","parent":1,"sr":1,"ks":{"o":{"a":0,"k":0,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.05],"y":[1]},"o":{"x":[0.4],"y":[0.016]},"t":142,"s":[-41]},{"t":172,"s":[180]}],"ix":10},"p":{"a":0,"k":[111.832,-121.374,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"ip":0,"op":1800,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":".blue400","cl":"blue400","parent":2,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.05,"y":1},"o":{"x":0.4,"y":0.01},"t":142,"s":[0.873,0.253,0],"to":[0,0,0],"ti":[0,0,0]},{"t":172,"s":[3.123,8.128,0]}],"ix":2,"l":2},"a":{"a":0,"k":[-1.7,5.7,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.05,"y":1},"o":{"x":0.4,"y":0.01},"t":142,"s":[{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[12.517,5.049],[-2.516,5.511],[-15.017,14.239]],"c":false}]},{"t":172,"s":[{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[7.341,-2.523],[0.246,-9.791],[-15.652,5.505]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.40000000596,0.615686297417,0.964705884457,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":1,"k":[{"i":{"x":[0.05],"y":[1]},"o":{"x":[0.4],"y":[0.01]},"t":142,"s":[2.768]},{"t":172,"s":[4]}],"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Vector","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":1800,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":".blue400","cl":"blue400","parent":1,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.68],"y":[0]},"t":114,"s":[100]},{"t":137,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[111.401,-121.376,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0,0,0],"y":[1,1,1]},"o":{"x":[0.68,0.68,0.68],"y":[0,0,0]},"t":114,"s":[70,70,100]},{"t":154,"s":[165,165,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-21.155,0],[0,21.155],[21.155,0],[0,-21.155]],"o":[[21.155,0],[0,-21.155],[-21.155,0],[0,21.155]],"v":[[0,38.304],[38.304,0],[0,-38.304],[-38.304,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.40000000596,0.615686297417,0.964705884457,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Vector","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":1800,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":".blue400","cl":"blue400","parent":1,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.68],"y":[0]},"t":109,"s":[100]},{"t":132,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[111.401,-121.376,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0,0,0],"y":[1,1,1]},"o":{"x":[0.68,0.68,0.68],"y":[0,0,0]},"t":109,"s":[70,70,100]},{"t":149,"s":[165,165,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-21.155,0],[0,21.155],[21.155,0],[0,-21.155]],"o":[[21.155,0],[0,-21.155],[-21.155,0],[0,21.155]],"v":[[0,38.304],[38.304,0],[0,-38.304],[-38.304,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.40000000596,0.615686297417,0.964705884457,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Vector","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":1800,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":".blue400","cl":"blue400","parent":1,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.68],"y":[0]},"t":104,"s":[100]},{"t":127,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[111.401,-121.376,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0,0,0],"y":[1,1,1]},"o":{"x":[0.68,0.68,0.68],"y":[0,0,0]},"t":104,"s":[70,70,100]},{"t":144,"s":[165,165,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-21.155,0],[0,21.155],[21.155,0],[0,-21.155]],"o":[[21.155,0],[0,-21.155],[-21.155,0],[0,21.155]],"v":[[0,38.304],[38.304,0],[0,-38.304],[-38.304,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.40000000596,0.615686297417,0.964705884457,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Vector","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":1800,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":".blue400","cl":"blue400","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[111.832,-121.374,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-10.594,-9.096],[0,0],[-0.6,-0.662],[0,0],[0.662,-0.6],[0,0],[10.309,-9.354],[10.42,11.484],[-11.484,10.42]],"o":[[0,0],[0.662,-0.6],[0,0],[0.6,0.662],[0,0],[7.288,11.344],[-11.484,10.42],[-10.42,-11.484],[10.603,-9.621]],"v":[[18.303,-21.346],[18.509,-21.533],[20.794,-21.422],[24.106,-17.771],[23.995,-15.486],[23.666,-15.188],[18.899,20.825],[-20.825,18.895],[-18.895,-20.829]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[-9.811,-10.813],[-10.813,9.811],[9.811,10.813],[10.813,-9.811]],"o":[[9.811,10.813],[10.813,-9.811],[-9.811,-10.813],[-10.813,9.811]],"v":[[-19.607,17.79],[17.794,19.608],[19.611,-17.794],[-17.79,-19.611]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.40000000596,0.615686297417,0.964705884457,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Vector","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":1800,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":".black","cl":"black","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[111.834,-121.376,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-15.077,0],[0,15.077],[15.077,0],[0,-15.077]],"o":[[15.077,0],[0,-15.077],[-15.077,0],[0,15.077]],"v":[[0,27.3],[27.3,0],[0,-27.3],[-27.3,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Vector","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":1800,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":".grey600","cl":"grey600","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[111.779,-121.054,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[3.708,0],[0,0],[0,-3.708],[0,0],[-3.708,0],[0,0],[0,3.708],[0,0]],"o":[[0,0],[-3.708,0],[0,0],[0,3.708],[0,0],[3.708,0],[0,0],[0,-3.708]],"v":[[7.89,-43.955],[-7.89,-43.955],[-14.604,-37.241],[-14.604,37.241],[-7.89,43.955],[7.89,43.955],[14.604,37.241],[14.604,-37.241]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.501960813999,0.525490224361,0.54509806633,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":-45.085,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Vector","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":1800,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":"ARM_MATTE","td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[206,150,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-15.291,0],[0,0],[0,15.544],[0,0],[15.185,0],[0,0],[0,-15.652],[0,0]],"o":[[0,0],[15.291,0],[0,0],[0,-15.652],[0,0],[-15.291,0],[0,0],[0,15.652]],"v":[[-178.179,150],[178.179,150],[206,121.63],[206,-121.522],[178.286,-150],[-178.179,-150],[-206,-121.522],[-206,121.522]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Vector","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":1800,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":12,"ty":4,"nm":".ARM","cl":"ARM","parent":1,"tt":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[99.741,-103.962,0],"ix":2,"l":2},"a":{"a":0,"k":[70.741,184.538,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-1.655,-2.066],[-3.456,3.089],[-0.727,2.001],[6.57,-2.938],[1.123,-0.781]],"o":[[3.09,3.858],[1.562,-1.396],[-1.59,-3.044],[-0.621,0.278],[-1.445,2.431]],"v":[[-7.102,3.861],[5.015,3.281],[8.462,-2.035],[-4.657,-4.993],[-7.478,-3.205]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760784327984,0.478431373835,0.40000000596,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Vector","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[179.859,51.354],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"NAIL02","np":1,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-2.789,-3.482],[-3.664,3.275],[-0.776,1.898],[0.965,1.317],[3.65,-0.938],[0.629,-0.271]],"o":[[3.275,4.09],[1.497,-1.338],[-0.114,-1.715],[-1.943,-2.652],[-0.576,0.148],[-5.718,3.453]],"v":[[-7.41,5.19],[5.435,4.575],[8.852,-0.454],[7.201,-5.191],[-1.476,-7.214],[-3.288,-6.57]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760784327984,0.478431373835,0.40000000596,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Vector","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[193.112,61.459],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"NAIL03","np":1,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-2.785,-3.297],[-3.598,2.935],[-0.359,2.597],[1.361,1.315],[3.021,-1.351],[0.459,-0.402]],"o":[[2.726,3.227],[2.715,-2.215],[-0.34,-1.711],[-2.006,-1.939],[-0.64,0.361],[-4.343,3.807]],"v":[[-7.079,6.003],[3.759,5.398],[8.503,-1.933],[5.848,-6.523],[-2.397,-7.083],[-4.066,-5.926]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760784327984,0.478431373835,0.40000000596,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Vector","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[200.839,77.801],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"NAIL04","np":1,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.054,0.069],[3.134,-3.216],[-3.656,-0.921],[-2.12,1.21],[2.5,3.492]],"o":[[-3.115,0.692],[-3.74,3.838],[2.277,-1.784],[5.445,-3.108],[-0.051,-0.072]],"v":[[5.47,-8.52],[-4.469,-2.73],[-4.24,8.52],[2.352,3.972],[5.636,-8.315]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760784327984,0.478431373835,0.40000000596,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Vector","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[197.006,138.999],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"NAIL05","np":1,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-1.218,-1.793],[-2.951,2.16],[-0.735,1.587],[3.737,-0.592],[1.715,-0.583]],"o":[[2.081,3.065],[1.426,-1.044],[-1.139,-2.009],[-1.553,0.246],[-1.704,1.884]],"v":[[-5.994,2.581],[3.488,2.745],[6.766,-1.405],[-0.383,-4.508],[-5.294,-3.253]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760784327984,0.478431373835,0.40000000596,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Vector","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[161.194,48.38],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"NAIL01","np":1,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[181.885,95.635],"ix":2},"a":{"a":0,"k":[181.885,95.635],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"**NAILS_ALL","np":5,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[19.626,-23.614],[0,0]],"v":[[-22.789,21.283],[22.789,-21.283]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.596078455448,0.321568638086,0.239215686917,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.678431391716,0.403921574354,0.305882364511,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Vector","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[162.285,79.254],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"HAND_LINE02","np":1,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[17.08,-19.479],[0,0]],"v":[[-20.252,19.975],[20.252,-19.975]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.596078455448,0.321568638086,0.239215686917,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.678431391716,0.403921574354,0.305882364511,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Vector","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[174.516,92.317],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"HAND_LINE03","np":1,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-4.46,5.397]],"o":[[0,0],[0,0]],"v":[[-2.244,4.895],[2.244,-4.895]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.596078455448,0.321568638086,0.239215686917,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Vector","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[151.152,152.075],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"HAND_LINE04","np":1,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[-23.247,14.788],[0,0]],"v":[[21.471,-19.895],[-21.471,19.895]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.596078455448,0.321568638086,0.239215686917,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.678431391716,0.403921574354,0.305882364511,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Vector","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[146.926,70.198],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"HAND_LINE01","np":1,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[160.112,103.636],"ix":2},"a":{"a":0,"k":[160.112,103.636],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"**HANDLINES","np":4,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.419,-0.748],[5.969,-0.945],[10.255,-24.939],[-36.35,-2.06],[-17.34,9.896],[2.5,3.492],[3.993,-1.291],[7.157,-4.738],[6.054,-3.157],[0,0],[-14.285,16.96],[-6.401,8.234],[3.021,2.921],[3.564,-2.542],[7.775,-6.976],[-1.695,1.94],[2.084,2.844],[3.65,-0.938],[1.658,-0.984],[0.655,2.35],[7.279,-3.256]],"o":[[0.159,-2.71],[-24.069,3.813],[-11.885,28.904],[32.782,1.857],[5.445,-3.108],[-2.429,-3.393],[-2.891,0.935],[-6.302,4.173],[-6.053,3.158],[0,0],[9.729,-11.551],[3.338,-4.294],[-2.537,-2.453],[-1.787,1.274],[9.925,-9.708],[2.32,-2.655],[-1.943,-2.652],[-1.357,0.349],[0.878,-1.227],[-0.933,-3.346],[-1.364,0.61]],"v":[[25.212,-63.227],[17.166,-69.856],[-62.543,5.248],[-16.676,69.9],[55.713,29.243],[58.997,16.956],[47.025,14.009],[36.082,19.299],[20.024,30.081],[9.751,33.451],[36.325,0.072],[63.773,-31.101],[63.042,-42.45],[52.466,-41.676],[36.191,-27.576],[56.718,-47.307],[56.668,-57.46],[47.992,-59.484],[43.473,-57.441],[45.072,-63.423],[31.556,-67.367]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.678431391716,0.403921574354,0.305882364511,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Vector","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[143.645,113.728],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"HAND_MAIN","np":1,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[-21.556,20.677],[0,0],[0,0],[0,0],[0,0]],"v":[[27.077,-29.148],[-27.077,29.148],[-14.87,27.435],[6.884,12.719],[18.881,-4.638]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.678431391716,0.403921574354,0.305882364511,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Vector","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[94.789,96.955],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"HAND_PATCH","np":1,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-105.823,62.116],[-50.508,114.467],[105.823,-53.888],[57.346,-114.467]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.678431391716,0.403921574354,0.305882364511,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Vector","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[37.822,210.857],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"ARM","np":1,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.088,0.077],[3.356,-3.614],[0,0],[0,0],[0,0],[3.196,-0.137]],"o":[[-4.92,-0.347],[0,0],[0,0],[0,0],[0,0],[-0.776,0.033]],"v":[[10.868,5.348],[-2.224,10.502],[-14.819,0],[-7.352,-10.502],[11.989,-4.804],[13.744,5.43]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.678431391716,0.403921574354,0.305882364511,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Vector","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[116.337,178.271],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"HAND","np":1,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[70.741,184.538],"ix":2},"a":{"a":0,"k":[70.741,184.538],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"**ARM_MAIN","np":4,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":1800,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":13,"ty":3,"nm":"PHONE_REPO","sr":1,"ks":{"o":{"a":0,"k":0,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"s":true,"x":{"a":1,"k":[{"i":{"x":[0.8],"y":[0.15]},"o":{"x":[0.3],"y":[0]},"t":70,"s":[206]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.05],"y":[0.536]},"t":76.834,"s":[244]},{"t":103,"s":[301]}],"ix":3},"y":{"a":0,"k":150,"ix":4}},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"ip":0,"op":1800,"st":0,"bm":0},{"ddd":0,"ind":14,"ty":3,"nm":"Launcher_ScaleIN","parent":13,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":144,"s":[0]},{"t":154,"s":[100]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"s":true,"x":{"a":0,"k":1.25,"ix":3},"y":{"a":0,"k":22.5,"ix":4}},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.8,0.8,0.8],"y":[0.15,0.15,1]},"o":{"x":[0.3,0.3,0.3],"y":[0,0,0]},"t":144,"s":[80,80,100]},{"i":{"x":[0.1,0.1,0.1],"y":[1,1,1]},"o":{"x":[0.05,0.05,0.05],"y":[0.7,0.7,0]},"t":152.334,"s":[88,88,100]},{"t":194,"s":[100,100,100]}],"ix":6,"l":2}},"ao":0,"ip":0,"op":1800,"st":0,"bm":0},{"ddd":0,"ind":15,"ty":4,"nm":"Launcher_01","parent":14,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":144,"s":[0]},{"t":154,"s":[100]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-37.512,40.271,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-3.112,0],[0,3.112],[3.112,0],[0,-3.112]],"o":[[3.112,0],[0,-3.112],[-3.112,0],[0,3.112]],"v":[[0,5.635],[5.635,0],[0,-5.635],[-5.635,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.807843148708,0.917647063732,0.839215695858,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Vector","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":1800,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":16,"ty":4,"nm":"Launcher_02","parent":14,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":144,"s":[0]},{"t":154,"s":[100]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-13.623,40.271,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-3.112,0],[0,3.112],[3.112,0],[0,-3.112]],"o":[[3.112,0],[0,-3.112],[-3.112,0],[0,3.112]],"v":[[0,5.635],[5.635,0],[0,-5.635],[-5.635,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.996078431606,0.937254905701,0.764705896378,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Vector","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":1800,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":17,"ty":4,"nm":"Launcher_03","parent":14,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":144,"s":[0]},{"t":154,"s":[100]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[10.266,40.121,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-3.112,0],[0,3.112],[3.112,0],[0,-3.112]],"o":[[3.112,0],[0,-3.112],[-3.112,0],[0,3.112]],"v":[[0,5.635],[5.635,0],[0,-5.635],[-5.635,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.980392158031,0.823529422283,0.811764717102,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Vector","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":1800,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":18,"ty":4,"nm":"Launcher_04","parent":14,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":144,"s":[0]},{"t":154,"s":[100]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[34.155,40.271,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-3.112,0],[0,3.112],[3.112,0],[0,-3.112]],"o":[[3.112,0],[0,-3.112],[-3.112,0],[0,3.112]],"v":[[0,5.635],[5.635,0],[0,-5.635],[-5.635,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.823529422283,0.890196084976,0.988235294819,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Vector","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":1800,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":19,"ty":4,"nm":".grey800","cl":"grey800","parent":14,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":144,"s":[0]},{"t":154,"s":[100]}],"ix":11,"x":"var $bm_rt;\n$bm_rt = thisComp.layer('Launcher_ScaleIN').transform.opacity;"},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-1.803,57.487,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[3.134,0],[0,0],[0,-3.134],[0,0],[-3.134,0],[0,0],[0,3.134],[0,0]],"o":[[0,0],[-3.134,0],[0,0],[0,3.134],[0,0],[3.134,0],[0,0],[0,-3.134]],"v":[[36.718,-5.872],[-36.718,-5.872],[-42.393,-0.197],[-42.393,0.197],[-36.718,5.872],[36.718,5.872],[42.393,0.197],[42.393,-0.197]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.235294118524,0.250980407,0.262745112181,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Vector","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":1800,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":20,"ty":3,"nm":"SWIPE_MOVE","parent":13,"sr":1,"ks":{"o":{"a":0,"k":0,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"s":true,"x":{"a":0,"k":0,"ix":3},"y":{"a":1,"k":[{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.8],"y":[0]},"t":40,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.8],"y":[0]},"t":70,"s":[-35]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":130,"s":[-35]},{"t":160,"s":[-65]}],"ix":4}},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"ip":0,"op":1800,"st":0,"bm":0},{"ddd":0,"ind":21,"ty":4,"nm":"SWIPE","parent":20,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":55,"s":[100]},{"t":65,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.05,"y":1},"o":{"x":0.45,"y":0},"t":0,"s":[-19.564,102.3,0],"to":[0,0,0],"ti":[-0.936,17.2,0]},{"t":30,"s":[0.436,77.3,0]}],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.8,"y":0},"t":40,"s":[{"i":[[6.432,0],[0,0],[0,-6.432],[0,0],[-6.432,0],[0,0],[0,6.432],[0,0]],"o":[[0,0],[-6.432,0],[0,0],[0,6.432],[0,0],[6.432,0],[0,0],[0,-6.432]],"v":[[0,-3.467],[0,-3.467],[-11.645,8.179],[-11.645,9.321],[0,20.967],[0,20.967],[11.645,9.321],[11.645,8.179]],"c":true}]},{"t":60,"s":[{"i":[[6.432,0],[0,0],[0,-6.432],[0,0],[-6.432,0],[0,0],[0,6.432],[0,0]],"o":[[0,0],[-6.432,0],[0,0],[0,6.432],[0,0],[6.432,0],[0,0],[0,-6.432]],"v":[[0,-20.967],[0,-20.967],[-11.645,-9.321],[-11.645,9.321],[0,20.967],[0,20.967],[11.645,9.321],[11.645,-9.321]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"gf","o":{"a":0,"k":100,"ix":10},"r":1,"bm":0,"g":{"p":15,"k":{"a":0,"k":[0.079,0.4,0.616,0.965,0.089,0.396,0.612,0.963,0.1,0.392,0.608,0.961,0.154,0.375,0.596,0.959,0.208,0.357,0.584,0.957,0.262,0.341,0.573,0.955,0.316,0.325,0.561,0.953,0.368,0.314,0.553,0.953,0.421,0.302,0.545,0.953,0.471,0.292,0.537,0.951,0.522,0.282,0.529,0.949,0.57,0.275,0.525,0.949,0.618,0.267,0.522,0.949,0.663,0.263,0.518,0.949,0.708,0.259,0.514,0.949,0.079,0,0.089,0.026,0.1,0.052,0.154,0.176,0.208,0.3,0.262,0.407,0.316,0.514,0.368,0.601,0.421,0.689,0.471,0.756,0.522,0.824,0.57,0.873,0.618,0.921,0.663,0.951,0.708,0.98],"ix":9}},"s":{"a":0,"k":[0,20.967],"ix":5},"e":{"a":0,"k":[0,-20.967],"ix":6},"t":1,"nm":"Gradient Fill 1","mn":"ADBE Vector Graphic - G-Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Vector","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":1800,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":24,"ty":4,"nm":"SCREEN_MASK","parent":20,"td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-0.547,-1.2,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.8,"y":0},"t":40,"s":[{"i":[[4.341,0],[0,0],[0,-4.341],[0,0],[-4.341,0],[0,0],[0,4.341],[0,0]],"o":[[0,0],[-4.341,0],[0,0],[0,4.341],[0,0],[4.341,0],[0,0],[0,-4.341]],"v":[[45.224,-102.248],[-45.225,-102.248],[-53.09,-94.383],[-53.09,94.383],[-45.225,102.248],[45.224,102.248],[53.09,94.382],[53.09,-94.382]],"c":true}]},{"t":70,"s":[{"i":[[4.341,0],[0,0],[0,-4.341],[0,0],[-4.341,0],[0,0],[0,4.341],[0,0]],"o":[[0,0],[-4.341,0],[0,0],[0,4.341],[0,0],[4.341,0],[0,0],[0,-4.341]],"v":[[45.224,-68.498],[-45.225,-68.498],[-53.09,-60.633],[-53.09,94.383],[-45.225,102.248],[45.224,102.248],[53.09,94.382],[53.09,-60.632]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Vector","np":1,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":1800,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":25,"ty":4,"nm":".notif_01","cl":"notif_01","parent":20,"tt":1,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":48,"s":[20]},{"t":58,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-0.547,-19.366,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[2.058,0],[0,0],[0,-2.058],[0,0],[-2.058,0],[0,0],[0,2.058],[0,0]],"o":[[0,0],[-2.058,0],[0,0],[0,2.058],[0,0],[2.058,0],[0,0],[0,-2.058]],"v":[[41.08,-10.024],[-41.08,-10.024],[-44.805,-6.298],[-44.805,6.298],[-41.08,10.024],[41.08,10.024],[44.805,6.298],[44.805,-6.298]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Vector","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":1800,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":26,"ty":4,"nm":"SCREEN_MASK 5","parent":20,"td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-0.547,-1.2,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.8,"y":0},"t":40,"s":[{"i":[[4.341,0],[0,0],[0,-4.341],[0,0],[-4.341,0],[0,0],[0,4.341],[0,0]],"o":[[0,0],[-4.341,0],[0,0],[0,4.341],[0,0],[4.341,0],[0,0],[0,-4.341]],"v":[[45.224,-102.248],[-45.225,-102.248],[-53.09,-94.383],[-53.09,94.383],[-45.225,102.248],[45.224,102.248],[53.09,94.382],[53.09,-94.382]],"c":true}]},{"t":70,"s":[{"i":[[4.341,0],[0,0],[0,-4.341],[0,0],[-4.341,0],[0,0],[0,4.341],[0,0]],"o":[[0,0],[-4.341,0],[0,0],[0,4.341],[0,0],[4.341,0],[0,0],[0,-4.341]],"v":[[45.224,-68.498],[-45.225,-68.498],[-53.09,-60.633],[-53.09,94.383],[-45.225,102.248],[45.224,102.248],[53.09,94.382],[53.09,-60.632]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Vector","np":1,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":1800,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":27,"ty":4,"nm":".notif_02","cl":"notif_02","parent":20,"tt":1,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":48,"s":[20]},{"t":58,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-0.547,5.366,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[2.058,0],[0,0],[0,-2.058],[0,0],[-2.058,0],[0,0],[0,2.058],[0,0]],"o":[[0,0],[-2.058,0],[0,0],[0,2.058],[0,0],[2.058,0],[0,0],[0,-2.058]],"v":[[41.08,-10.024],[-41.08,-10.024],[-44.805,-6.298],[-44.805,6.298],[-41.08,10.024],[41.08,10.024],[44.805,6.298],[44.805,-6.298]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Vector","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":1800,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":28,"ty":4,"nm":"SCREEN_MASK 4","parent":20,"td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-0.547,-1.2,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.8,"y":0},"t":40,"s":[{"i":[[4.341,0],[0,0],[0,-4.341],[0,0],[-4.341,0],[0,0],[0,4.341],[0,0]],"o":[[0,0],[-4.341,0],[0,0],[0,4.341],[0,0],[4.341,0],[0,0],[0,-4.341]],"v":[[45.224,-102.248],[-45.225,-102.248],[-53.09,-94.383],[-53.09,94.383],[-45.225,102.248],[45.224,102.248],[53.09,94.382],[53.09,-94.382]],"c":true}]},{"t":70,"s":[{"i":[[4.341,0],[0,0],[0,-4.341],[0,0],[-4.341,0],[0,0],[0,4.341],[0,0]],"o":[[0,0],[-4.341,0],[0,0],[0,4.341],[0,0],[4.341,0],[0,0],[0,-4.341]],"v":[[45.224,-68.498],[-45.225,-68.498],[-53.09,-60.633],[-53.09,94.383],[-45.225,102.248],[45.224,102.248],[53.09,94.382],[53.09,-60.632]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Vector","np":1,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":1800,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":29,"ty":4,"nm":".white_LOCK","cl":"white_LOCK","parent":20,"tt":1,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":48,"s":[100]},{"t":58,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-0.547,58.668,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.367,-0.367],[-0.515,0],[0,0],[-0.367,0.367],[0,0.515],[0,0],[0.367,0.367],[0.515,0],[0,0],[0,0],[1.155,1.157],[1.642,0],[1.157,-1.157],[0,-1.641],[0,0],[0,0],[0.367,-0.367],[0,-0.515],[0,0]],"o":[[0.367,0.367],[0,0],[0.515,0],[0.367,-0.367],[0,0],[0,-0.515],[-0.367,-0.367],[0,0],[0,0],[0,-1.641],[-1.155,-1.157],[-1.642,0],[-1.157,1.157],[0,0],[0,0],[-0.515,0],[-0.367,0.367],[0,0],[0,0.515]],"v":[[-9.441,12.564],[-8.118,13.114],[8.118,13.114],[9.441,12.564],[9.991,11.24],[9.991,-2.311],[9.441,-3.634],[8.118,-4.184],[5.932,-4.184],[5.932,-7.181],[4.2,-11.379],[0.003,-13.114],[-4.196,-11.379],[-5.932,-7.181],[-5.932,-4.184],[-8.118,-4.184],[-9.441,-3.634],[-9.991,-2.311],[-9.991,11.24]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[8.118,11.24],[-8.118,11.24],[-8.118,-2.311],[8.118,-2.311]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ind":2,"ty":"sh","ix":3,"ks":{"a":0,"k":{"i":[[0.468,-0.459],[0.663,0],[0.472,0.458],[0,0.635],[-0.468,0.51],[-0.663,0],[-0.472,-0.51],[0,-0.624]],"o":[[-0.468,0.459],[-0.663,0],[-0.472,-0.458],[0,-0.635],[0.468,-0.51],[0.663,0],[0.472,0.51],[0,0.644]],"v":[[1.702,6.181],[0.005,6.869],[-1.696,6.182],[-2.404,4.543],[-1.702,2.826],[-0.005,2.061],[1.696,2.826],[2.404,4.527]],"c":true},"ix":2},"nm":"Path 3","mn":"ADBE Vector Shape - Group","hd":false},{"ind":3,"ty":"sh","ix":4,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[-0.791,0.789],[-1.126,0],[-0.789,-0.789],[0,-1.128]],"o":[[0,0],[0,0],[0,-1.128],[0.791,-0.789],[1.126,0],[0.789,0.789],[0,0]],"v":[[4.059,-4.184],[-4.059,-4.184],[-4.059,-7.181],[-2.873,-10.057],[0.004,-11.24],[2.876,-10.057],[4.059,-7.181]],"c":true},"ix":2},"nm":"Path 4","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Vector","np":6,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":1800,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":30,"ty":4,"nm":"SCREEN_MASK 3","parent":20,"td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-0.547,-1.2,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.8,"y":0},"t":40,"s":[{"i":[[4.341,0],[0,0],[0,-4.341],[0,0],[-4.341,0],[0,0],[0,4.341],[0,0]],"o":[[0,0],[-4.341,0],[0,0],[0,4.341],[0,0],[4.341,0],[0,0],[0,-4.341]],"v":[[45.224,-102.248],[-45.225,-102.248],[-53.09,-94.383],[-53.09,94.383],[-45.225,102.248],[45.224,102.248],[53.09,94.382],[53.09,-94.382]],"c":true}]},{"t":70,"s":[{"i":[[4.341,0],[0,0],[0,-4.341],[0,0],[-4.341,0],[0,0],[0,4.341],[0,0]],"o":[[0,0],[-4.341,0],[0,0],[0,4.341],[0,0],[4.341,0],[0,0],[0,-4.341]],"v":[[45.224,-68.498],[-45.225,-68.498],[-53.09,-60.633],[-53.09,94.383],[-45.225,102.248],[45.224,102.248],[53.09,94.382],[53.09,-60.632]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Vector","np":1,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":1800,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":31,"ty":4,"nm":".white_TIME","cl":"white_TIME","parent":20,"tt":1,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":48,"s":[100]},{"t":58,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0.436,-54.05,0],"ix":2,"l":2},"a":{"a":0,"k":[301.436,95.95,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.657,-0.758],[-0.859,-0.375],[-0.878,0],[-0.977,0.557],[-0.558,0.959],[0,1.169],[0.549,0.95],[0.923,0.53],[1.077,0],[0.969,-0.822],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-0.585,0.302],[-0.658,0],[-0.767,-0.776],[0,-1.187],[0.776,-0.749],[1.223,0],[0.731,0.667],[0.292,1.114],[0,0]],"o":[[0.658,0.759],[0.859,0.374],[1.223,0],[0.978,-0.557],[0.557,-0.959],[0,-1.169],[-0.549,-0.949],[-0.922,-0.529],[-1.408,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0.365,-0.53],[0.585,-0.301],[1.205,0],[0.768,0.777],[0,1.205],[-0.776,0.749],[-1.024,0],[-0.731,-0.667],[0,0],[0.273,1.114]],"v":[[-4.96,7.33],[-2.685,9.029],[-0.082,9.59],[3.219,8.755],[5.522,6.48],[6.356,3.289],[5.535,0.11],[3.329,-2.11],[0.329,-2.904],[-3.234,-1.671],[-3.343,-1.699],[-2.604,-7.371],[5.179,-7.371],[5.179,-9.59],[-4.521,-9.59],[-5.726,-0.136],[-3.37,0.904],[-1.945,-0.343],[-0.082,-0.794],[2.877,0.37],[4.028,3.316],[2.863,6.247],[-0.136,7.371],[-2.768,6.371],[-4.301,3.699],[-6.356,4.522]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Vector","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[317.59,96.169],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Vector","np":1,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-2.206,-3.754],[1.083,-6.11],[1.083,9.371],[3.411,9.371],[3.411,-9.371],[1.932,-9.371],[-3.411,-5.535]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Vector","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[303.957,95.95],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Vector","np":1,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-0.493],[-0.339,-0.338],[-0.493,0],[-0.339,0.338],[0,0.493],[0.338,0.339],[0.494,0],[0.338,-0.338]],"o":[[0,0.493],[0.338,0.338],[0.494,0],[0.338,-0.338],[0,-0.493],[-0.339,-0.338],[-0.493,0],[-0.339,0.339]],"v":[[-1.754,-5.316],[-1.247,-4.069],[0,-3.562],[1.247,-4.069],[1.754,-5.316],[1.247,-6.563],[0,-7.069],[-1.247,-6.563]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,-0.475],[-0.339,-0.338],[-0.493,0],[-0.339,0.339],[0,0.493],[0.338,0.338],[0.494,0],[0.338,-0.338]],"o":[[0,0.493],[0.338,0.339],[0.494,0],[0.338,-0.338],[0,-0.475],[-0.339,-0.338],[-0.493,0],[-0.339,0.338]],"v":[[-1.754,5.316],[-1.247,6.562],[0,7.069],[1.247,6.562],[1.754,5.316],[1.247,4.096],[0,3.589],[-1.247,4.096]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Vector","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[296.053,98.251],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Vector","np":1,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.548,-0.85],[-0.969,-0.493],[-1.187,0],[-0.968,0.494],[-0.557,0.85],[0,1.041],[0.576,0.795],[0.932,0.457],[0,0],[-0.466,0.722],[0,0.786],[0.484,0.804],[0.868,0.457],[1.078,0],[0.867,-0.456],[0.484,-0.803],[0,-0.986],[-0.466,-0.722],[-0.731,-0.438],[0,0],[0.576,-0.795],[0,-1.06]],"o":[[0.548,0.85],[0.968,0.494],[1.169,0],[0.968,-0.493],[0.557,-0.85],[0,-1.06],[-0.575,-0.795],[0,0],[0.712,-0.438],[0.466,-0.722],[0,-0.986],[-0.484,-0.803],[-0.868,-0.456],[-1.096,0],[-0.868,0.457],[-0.484,0.804],[0,0.786],[0.466,0.722],[0,0],[-0.932,0.457],[-0.575,0.795],[0,1.041]],"v":[[-5.508,7.056],[-3.233,9.069],[0,9.809],[3.206,9.069],[5.494,7.056],[6.33,4.22],[5.466,1.439],[3.206,-0.439],[3.206,-0.548],[4.973,-2.288],[5.672,-4.549],[4.946,-7.234],[2.918,-9.124],[0,-9.809],[-2.945,-9.124],[-4.973,-7.234],[-5.7,-4.549],[-5.001,-2.288],[-3.206,-0.548],[-3.206,-0.439],[-5.467,1.439],[-6.33,4.22]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,-1.005],[0.758,-0.648],[1.114,0],[0.767,0.648],[0,1.041],[-0.767,0.648],[-1.114,0],[-0.758,-0.648]],"o":[[0,1.041],[-0.758,0.648],[-1.114,0],[-0.767,-0.648],[0,-1.005],[0.767,-0.648],[1.114,0],[0.758,0.648]],"v":[[3.946,4.083],[2.808,6.618],[0,7.59],[-2.822,6.618],[-3.973,4.083],[-2.822,1.603],[0,0.63],[2.808,1.603]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ind":2,"ty":"sh","ix":3,"ks":{"a":0,"k":{"i":[[0,-0.913],[0.621,-0.566],[0.968,0],[0.63,0.567],[0,0.914],[-0.63,0.539],[-0.969,0],[-0.63,-0.539]],"o":[[0,0.914],[-0.621,0.567],[-0.969,0],[-0.63,-0.566],[0,-0.913],[0.63,-0.539],[0.949,0],[0.63,0.539]],"v":[[3.315,-4.603],[2.384,-2.384],[0,-1.534],[-2.398,-2.384],[-3.343,-4.603],[-2.398,-6.782],[0,-7.59],[2.37,-6.782]],"c":true},"ix":2},"nm":"Path 3","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Vector","np":5,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[285.257,95.95],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Vector","np":1,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":1800,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":32,"ty":4,"nm":".grey600","cl":"grey600","parent":13,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0.436,-1.2,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-1.086],[0,0],[1.086,0],[0,0],[0,-1.086],[0,0],[1.086,0],[0,0],[5.421,0],[0,0],[0,5.421],[0,0],[-5.421,0],[0,0],[0,-5.421],[0,0]],"o":[[0,0],[0,1.086],[0,0],[1.086,0],[0,0],[0,1.086],[0,0],[0,5.421],[0,0],[-5.421,0],[0,0],[0,-5.421],[0,0],[5.421,0],[0,0],[1.086,0]],"v":[[56.04,-51.124],[56.04,-43.259],[54.073,-41.292],[54.073,-25.562],[56.04,-23.596],[56.04,-3.933],[54.073,-1.966],[54.073,94.382],[44.242,104.214],[-46.208,104.214],[-56.04,94.382],[-56.04,-94.382],[-46.208,-104.214],[44.242,-104.214],[54.073,-94.382],[54.073,-53.09]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,4.337],[0,0],[4.337,0],[0,0],[0,-4.337],[0,0],[-4.337,0]],"o":[[4.337,0],[0,0],[0,-4.337],[0,0],[-4.337,0],[0,0],[0,4.337],[0,0]],"v":[[44.242,102.248],[52.107,94.382],[52.107,-94.382],[44.242,-102.248],[-46.208,-102.248],[-54.073,-94.382],[-54.073,94.382],[-46.208,102.248]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.501960813999,0.525490224361,0.54509806633,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Vector","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":1800,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":33,"ty":4,"nm":"SCREEN_MASK 2","parent":20,"td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-0.547,-1.2,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.8,"y":0},"t":40,"s":[{"i":[[4.341,0],[0,0],[0,-4.341],[0,0],[-4.341,0],[0,0],[0,4.341],[0,0]],"o":[[0,0],[-4.341,0],[0,0],[0,4.341],[0,0],[4.341,0],[0,0],[0,-4.341]],"v":[[45.224,-102.248],[-45.225,-102.248],[-53.09,-94.383],[-53.09,94.383],[-45.225,102.248],[45.224,102.248],[53.09,94.382],[53.09,-94.382]],"c":true}]},{"t":70,"s":[{"i":[[4.341,0],[0,0],[0,-4.341],[0,0],[-4.341,0],[0,0],[0,4.341],[0,0]],"o":[[0,0],[-4.341,0],[0,0],[0,4.341],[0,0],[4.341,0],[0,0],[0,-4.341]],"v":[[45.224,-68.498],[-45.225,-68.498],[-53.09,-60.633],[-53.09,94.383],[-45.225,102.248],[45.224,102.248],[53.09,94.382],[53.09,-60.632]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Vector","np":1,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":1800,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":34,"ty":4,"nm":"Gradient","parent":20,"tt":1,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":48,"s":[100]},{"t":58,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-0.464,-1.411,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[101,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[4.35,0],[0,0],[0,-4.35],[0,0],[-4.35,0],[0,0],[0,4.35],[0,0]],"o":[[0,0],[-4.35,0],[0,0],[0,4.35],[0,0],[4.35,0],[0,0],[0,-4.35]],"v":[[45.319,-102.459],[-45.318,-102.459],[-53.2,-94.577],[-53.2,94.578],[-45.319,102.459],[45.319,102.459],[53.2,94.578],[53.2,-94.578]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"gf","o":{"a":0,"k":100,"ix":10},"r":1,"bm":0,"g":{"p":13,"k":{"a":0,"k":[0.079,0.929,0.8,0.816,0.158,0.837,0.761,0.833,0.236,0.745,0.722,0.851,0.324,0.659,0.684,0.869,0.411,0.573,0.647,0.886,0.496,0.504,0.618,0.898,0.58,0.435,0.588,0.91,0.659,0.386,0.567,0.92,0.738,0.337,0.545,0.929,0.811,0.308,0.533,0.935,0.883,0.278,0.522,0.941,0.941,0.269,0.518,0.945,1,0.259,0.514,0.949],"ix":9}},"s":{"a":0,"k":[-80.036,123.908],"ix":5},"e":{"a":0,"k":[121.911,123.908],"ix":6},"t":2,"h":{"a":0,"k":0,"ix":7},"a":{"a":0,"k":0,"ix":8},"nm":"Gradient Fill_1","mn":"ADBE Vector Graphic - G-Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Vector","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":1800,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":35,"ty":4,"nm":".black","cl":"black","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[206,150,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-15.291,0],[0,0],[0,15.544],[0,0],[15.185,0],[0,0],[0,-15.652],[0,0]],"o":[[0,0],[15.291,0],[0,0],[0,-15.652],[0,0],[-15.291,0],[0,0],[0,15.652]],"v":[[-178.179,150],[178.179,150],[206,121.63],[206,-121.522],[178.286,-150],[-178.179,-150],[-206,-121.522],[-206,121.522]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Vector","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":1800,"st":0,"ct":1,"bm":0}],"markers":[]}
\ No newline at end of file
diff --git a/res/raw/remoteauth_explanation_swipe_animation.json b/res/raw/remoteauth_explanation_swipe_animation.json
new file mode 100644
index 0000000..a06ae37
--- /dev/null
+++ b/res/raw/remoteauth_explanation_swipe_animation.json
@@ -0,0 +1 @@
+{"v":"5.9.0","fr":60,"ip":0,"op":248,"w":412,"h":300,"nm":"Active_Unlock_PT2_V05","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":".blue400","cl":"blue400","parent":24,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.7],"y":[0]},"t":62,"s":[0]},{"i":{"x":[0.3],"y":[1]},"o":{"x":[0.7],"y":[0]},"t":92,"s":[360]},{"i":{"x":[0.3],"y":[1]},"o":{"x":[0.8],"y":[0]},"t":187,"s":[360]},{"t":237,"s":[0]}],"ix":10},"p":{"a":0,"k":[85.699,151.401,0],"ix":2,"l":2},"a":{"a":0,"k":[84.949,150.651,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.7,"y":0},"t":62,"s":[{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[-9.6,-20.75],[-9.6,4.35],[9.6,20.75]],"c":false}]},{"i":{"x":0.3,"y":1},"o":{"x":0.7,"y":0},"t":92,"s":[{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[-23.725,4.75],[-11.85,14.35],[7.725,-9.125]],"c":false}]},{"i":{"x":0.3,"y":1},"o":{"x":0.8,"y":0},"t":187,"s":[{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[-23.725,4.75],[-11.85,14.35],[7.725,-9.125]],"c":false}]},{"t":237,"s":[{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[-9.6,-20.75],[-9.6,4.35],[9.6,20.75]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.4,0.61568627451,0.964705882353,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":1,"k":[{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.7],"y":[0]},"t":62,"s":[2.768]},{"i":{"x":[0.3],"y":[1]},"o":{"x":[0.7],"y":[0]},"t":92,"s":[4.568]},{"i":{"x":[0.3],"y":[1]},"o":{"x":[0.8],"y":[0]},"t":187,"s":[4.568]},{"t":237,"s":[2.768]}],"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[94.549,146.301],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 7","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":1800,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":".blue400","cl":"blue400","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.7,"y":0},"t":0,"s":[171.326,149.999,0],"to":[2.5,0,0],"ti":[-2.5,0,0]},{"i":{"x":0.3,"y":0.3},"o":{"x":0.7,"y":0.7},"t":50,"s":[186.326,149.999,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.3,"y":1},"o":{"x":0.8,"y":0},"t":187,"s":[186.326,149.999,0],"to":[-2.5,0,0],"ti":[2.5,0,0]},{"t":237,"s":[171.326,149.999,0]}],"ix":2,"l":2},"a":{"a":0,"k":[211.701,150.999,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.1,0.1,0.563],"y":[1,1,1]},"o":{"x":[0.3,0.3,0.186],"y":[0,0,0]},"t":0,"s":[100,100,100]},{"i":{"x":[0.1,0.1,0.669],"y":[1,1,1]},"o":{"x":[0.3,0.3,0.318],"y":[0,0,0]},"t":20,"s":[130,130,100]},{"i":{"x":[0.1,0.1,0.833],"y":[1,1,1]},"o":{"x":[0.3,0.3,0.432],"y":[0,0,0]},"t":40,"s":[100,100,100]},{"i":{"x":[0.1,0.1,0.563],"y":[1,1,1]},"o":{"x":[0.3,0.3,0.186],"y":[0,0,0]},"t":83,"s":[100,100,100]},{"i":{"x":[0.1,0.1,0.669],"y":[1,1,1]},"o":{"x":[0.3,0.3,0.318],"y":[0,0,0]},"t":103,"s":[130,130,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.3,0.3,0.432],"y":[0,0,0]},"t":123,"s":[100,100,100]},{"i":{"x":[0.1,0.1,0.563],"y":[1,1,1]},"o":{"x":[0.3,0.3,0.186],"y":[0,0,0]},"t":125,"s":[100,100,100]},{"i":{"x":[0.1,0.1,0.669],"y":[1,1,1]},"o":{"x":[0.3,0.3,0.318],"y":[0,0,0]},"t":145,"s":[130,130,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.3,0.3,0.432],"y":[0,0,0]},"t":165,"s":[100,100,100]},{"i":{"x":[0.1,0.1,0.563],"y":[1,1,1]},"o":{"x":[0.3,0.3,0.186],"y":[0,0,0]},"t":208,"s":[100,100,100]},{"i":{"x":[0.1,0.1,0.669],"y":[1,1,1]},"o":{"x":[0.3,0.3,0.318],"y":[0,0,0]},"t":228,"s":[130,130,100]},{"i":{"x":[0.3,0.3,0.833],"y":[1,1,1]},"o":{"x":[0.3,0.3,0.432],"y":[0,0,0]},"t":248,"s":[100,100,100]},{"i":{"x":[0.3,0.3,0.833],"y":[1,1,1]},"o":{"x":[0.8,0.8,0.167],"y":[0,0,0]},"t":263,"s":[100,100,100]},{"t":283,"s":[0,0,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[2.1,0],[0,-2.2],[-2.2,0],[0,2.2]],"o":[[-2.101,0],[0,2.2],[2.1,0],[0,-2.2]],"v":[[0.001,-3.9],[-3.899,0],[0.001,3.9],[3.9,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.400000029919,0.61568627451,0.964705942191,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[211.701,150.999],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 4","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":1800,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":".blue400","cl":"blue400","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.7,"y":0},"t":0,"s":[191.201,149.999,0],"to":[2.5,0,0],"ti":[-2.5,0,0]},{"i":{"x":0.3,"y":0.3},"o":{"x":0.7,"y":0.7},"t":50,"s":[206.201,149.999,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.3,"y":1},"o":{"x":0.8,"y":0},"t":187,"s":[206.201,149.999,0],"to":[-2.5,0,0],"ti":[2.5,0,0]},{"t":237,"s":[191.201,149.999,0]}],"ix":2,"l":2},"a":{"a":0,"k":[211.701,150.999,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.1,0.1,0.563],"y":[1,1,1]},"o":{"x":[0.3,0.3,0.186],"y":[0,0,0]},"t":7,"s":[100,100,100]},{"i":{"x":[0.1,0.1,0.669],"y":[1,1,1]},"o":{"x":[0.3,0.3,0.318],"y":[0,0,0]},"t":27,"s":[130,130,100]},{"i":{"x":[0.1,0.1,0.833],"y":[1,1,1]},"o":{"x":[0.3,0.3,0.432],"y":[0,0,0]},"t":47,"s":[100,100,100]},{"i":{"x":[0.1,0.1,0.563],"y":[1,1,1]},"o":{"x":[0.3,0.3,0.186],"y":[0,0,0]},"t":76,"s":[100,100,100]},{"i":{"x":[0.1,0.1,0.669],"y":[1,1,1]},"o":{"x":[0.3,0.3,0.318],"y":[0,0,0]},"t":96,"s":[130,130,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.3,0.3,0.432],"y":[0,0,0]},"t":116,"s":[100,100,100]},{"i":{"x":[0.1,0.1,0.563],"y":[1,1,1]},"o":{"x":[0.3,0.3,0.186],"y":[0,0,0]},"t":132,"s":[100,100,100]},{"i":{"x":[0.1,0.1,0.669],"y":[1,1,1]},"o":{"x":[0.3,0.3,0.318],"y":[0,0,0]},"t":152,"s":[130,130,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.3,0.3,0.432],"y":[0,0,0]},"t":172,"s":[100,100,100]},{"i":{"x":[0.1,0.1,0.563],"y":[1,1,1]},"o":{"x":[0.3,0.3,0.186],"y":[0,0,0]},"t":201,"s":[100,100,100]},{"i":{"x":[0.1,0.1,0.669],"y":[1,1,1]},"o":{"x":[0.3,0.3,0.318],"y":[0,0,0]},"t":221,"s":[130,130,100]},{"i":{"x":[0.3,0.3,0.833],"y":[1,1,1]},"o":{"x":[0.3,0.3,0.432],"y":[0,0,0]},"t":241,"s":[100,100,100]},{"i":{"x":[0.3,0.3,0.833],"y":[1,1,1]},"o":{"x":[0.8,0.8,0.167],"y":[0,0,0]},"t":263,"s":[100,100,100]},{"t":283,"s":[0,0,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[2.1,0],[0,-2.2],[-2.2,0],[0,2.2]],"o":[[-2.101,0],[0,2.2],[2.1,0],[0,-2.2]],"v":[[0.001,-3.9],[-3.899,0],[0.001,3.9],[3.9,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.400000029919,0.61568627451,0.964705942191,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[211.701,150.999],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 4","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":1800,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":".blue400","cl":"blue400","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.7,"y":0},"t":0,"s":[210.701,149.999,0],"to":[2.5,0,0],"ti":[-2.5,0,0]},{"i":{"x":0.3,"y":0.3},"o":{"x":0.7,"y":0.7},"t":50,"s":[225.701,149.999,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.3,"y":1},"o":{"x":0.8,"y":0},"t":187,"s":[225.701,149.999,0],"to":[-2.5,0,0],"ti":[2.5,0,0]},{"t":237,"s":[210.701,149.999,0]}],"ix":2,"l":2},"a":{"a":0,"k":[211.701,150.999,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.1,0.1,0.563],"y":[1,1,1]},"o":{"x":[0.3,0.3,0.186],"y":[0,0,0]},"t":14,"s":[100,100,100]},{"i":{"x":[0.1,0.1,0.669],"y":[1,1,1]},"o":{"x":[0.3,0.3,0.318],"y":[0,0,0]},"t":34,"s":[130,130,100]},{"i":{"x":[0.1,0.1,0.833],"y":[1,1,1]},"o":{"x":[0.3,0.3,0.432],"y":[0,0,0]},"t":54,"s":[100,100,100]},{"i":{"x":[0.1,0.1,0.563],"y":[1,1,1]},"o":{"x":[0.3,0.3,0.186],"y":[0,0,0]},"t":69,"s":[100,100,100]},{"i":{"x":[0.1,0.1,0.669],"y":[1,1,1]},"o":{"x":[0.3,0.3,0.318],"y":[0,0,0]},"t":89,"s":[130,130,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.3,0.3,0.432],"y":[0,0,0]},"t":109,"s":[100,100,100]},{"i":{"x":[0.1,0.1,0.563],"y":[1,1,1]},"o":{"x":[0.3,0.3,0.186],"y":[0,0,0]},"t":139,"s":[100,100,100]},{"i":{"x":[0.1,0.1,0.669],"y":[1,1,1]},"o":{"x":[0.3,0.3,0.318],"y":[0,0,0]},"t":159,"s":[130,130,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.3,0.3,0.432],"y":[0,0,0]},"t":179,"s":[100,100,100]},{"i":{"x":[0.1,0.1,0.563],"y":[1,1,1]},"o":{"x":[0.3,0.3,0.186],"y":[0,0,0]},"t":194,"s":[100,100,100]},{"i":{"x":[0.1,0.1,0.669],"y":[1,1,1]},"o":{"x":[0.3,0.3,0.318],"y":[0,0,0]},"t":214,"s":[130,130,100]},{"i":{"x":[0.3,0.3,0.833],"y":[1,1,1]},"o":{"x":[0.3,0.3,0.432],"y":[0,0,0]},"t":234,"s":[100,100,100]},{"i":{"x":[0.3,0.3,0.833],"y":[1,1,1]},"o":{"x":[0.8,0.8,0.167],"y":[0,0,0]},"t":263,"s":[100,100,100]},{"t":283,"s":[0,0,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[2.1,0],[0,-2.2],[-2.2,0],[0,2.2]],"o":[[-2.101,0],[0,2.2],[2.1,0],[0,-2.2]],"v":[[0.001,-3.9],[-3.899,0],[0.001,3.9],[3.9,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.400000029919,0.61568627451,0.964705942191,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[211.701,150.999],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 4","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":1800,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":".blue400","cl":"blue400","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.7,"y":0},"t":0,"s":[230.076,149.999,0],"to":[2.5,0,0],"ti":[-2.5,0,0]},{"i":{"x":0.3,"y":0.3},"o":{"x":0.7,"y":0.7},"t":50,"s":[245.076,149.999,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.3,"y":1},"o":{"x":0.8,"y":0},"t":187,"s":[245.076,149.999,0],"to":[-2.5,0,0],"ti":[2.5,0,0]},{"t":237,"s":[230.076,149.999,0]}],"ix":2,"l":2},"a":{"a":0,"k":[211.701,150.999,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.1,0.1,0.563],"y":[1,1,1]},"o":{"x":[0.3,0.3,0.186],"y":[0,0,0]},"t":21,"s":[100,100,100]},{"i":{"x":[0.1,0.1,0.669],"y":[1,1,1]},"o":{"x":[0.3,0.3,0.318],"y":[0,0,0]},"t":41,"s":[130,130,100]},{"i":{"x":[0.1,0.1,0.833],"y":[1,1,1]},"o":{"x":[0.3,0.3,0.432],"y":[0,0,0]},"t":61,"s":[100,100,100]},{"i":{"x":[0.1,0.1,0.563],"y":[1,1,1]},"o":{"x":[0.3,0.3,0.186],"y":[0,0,0]},"t":62,"s":[100,100,100]},{"i":{"x":[0.1,0.1,0.669],"y":[1,1,1]},"o":{"x":[0.3,0.3,0.318],"y":[0,0,0]},"t":82,"s":[130,130,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.3,0.3,0.432],"y":[0,0,0]},"t":102,"s":[100,100,100]},{"i":{"x":[0.1,0.1,0.563],"y":[1,1,1]},"o":{"x":[0.3,0.3,0.186],"y":[0,0,0]},"t":146,"s":[100,100,100]},{"i":{"x":[0.1,0.1,0.669],"y":[1,1,1]},"o":{"x":[0.3,0.3,0.318],"y":[0,0,0]},"t":166,"s":[130,130,100]},{"i":{"x":[0.1,0.1,0.833],"y":[1,1,1]},"o":{"x":[0.3,0.3,0.432],"y":[0,0,0]},"t":186,"s":[100,100,100]},{"i":{"x":[0.1,0.1,0.563],"y":[1,1,1]},"o":{"x":[0.3,0.3,0.186],"y":[0,0,0]},"t":187,"s":[100,100,100]},{"i":{"x":[0.1,0.1,0.669],"y":[1,1,1]},"o":{"x":[0.3,0.3,0.318],"y":[0,0,0]},"t":207,"s":[130,130,100]},{"i":{"x":[0.3,0.3,0.833],"y":[1,1,1]},"o":{"x":[0.3,0.3,0.432],"y":[0,0,0]},"t":227,"s":[100,100,100]},{"i":{"x":[0.3,0.3,0.833],"y":[1,1,1]},"o":{"x":[0.8,0.8,0.167],"y":[0,0,0]},"t":263,"s":[100,100,100]},{"t":283,"s":[0,0,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[2.1,0],[0,-2.2],[-2.2,0],[0,2.2]],"o":[[-2.101,0],[0,2.2],[2.1,0],[0,-2.2]],"v":[[0.001,-3.9],[-3.899,0],[0.001,3.9],[3.9,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.400000029919,0.61568627451,0.964705942191,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[211.701,150.999],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 4","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":1800,"st":0,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":".blue400","cl":"blue400","parent":11,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[9.431,10.775,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0.167},"t":58,"s":[{"i":[[0,0],[0,3.938],[-0.938,0],[0,-4.188],[0,0]],"o":[[0,0],[0,-3.938],[0.938,0],[0,4.188],[0,0]],"v":[[-4.562,-0.031],[-4.562,-4.719],[0.25,-9.656],[5.375,-4.781],[5.375,-0.281]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"t":88,"s":[{"i":[[0,0],[0,3.938],[0.896,0],[0,-4.188],[0,0]],"o":[[0,0],[0,-3.938],[-0.896,0],[0,4.188],[0,0]],"v":[[14.875,-2.531],[14.875,-7.219],[10.274,-12.156],[5.375,-7.281],[5.375,-0.281]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":207,"s":[{"i":[[0,0],[0,3.938],[0.896,0],[0,-4.188],[0,0]],"o":[[0,0],[0,-3.938],[-0.896,0],[0,4.188],[0,0]],"v":[[14.875,-2.531],[14.875,-7.219],[10.274,-12.156],[5.375,-7.281],[5.375,-0.281]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":217,"s":[{"i":[[0,0],[0,3.938],[-0.932,0],[0,-4.188],[0,0]],"o":[[0,0],[0,-3.938],[0.932,0],[0,4.188],[0,0]],"v":[[-4.5,-2.531],[-4.5,-7.219],[0.282,-12.156],[5.375,-7.281],[5.375,-0.281]],"c":false}]},{"i":{"x":0,"y":1},"o":{"x":0.333,"y":0},"t":227,"s":[{"i":[[0,0],[0,3.938],[-0.932,0],[0,-4.188],[0,0]],"o":[[0,0],[0,-3.938],[0.932,0],[0,4.188],[0,0]],"v":[[-4.5,-2.531],[-4.5,-7.219],[0.282,-12.156],[5.375,-7.281],[5.375,-0.281]],"c":false}]},{"t":247,"s":[{"i":[[0,0],[0,3.938],[-0.938,0],[0,-4.188],[0,0]],"o":[[0,0],[0,-3.938],[0.938,0],[0,4.188],[0,0]],"v":[[-4.562,-0.031],[-4.562,-4.719],[0.25,-9.656],[5.375,-4.781],[5.375,-0.281]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.4,0.61568627451,0.964705882353,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":".blue400","cl":"blue400","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[315.859,148.919,0],"ix":2,"l":2},"a":{"a":0,"k":[9.912,13.777,0],"ix":1,"l":2},"s":{"a":0,"k":[147,147,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-1.067,0],[0,1.067],[1.067,0],[0,-1.068]],"o":[[1.067,0],[0,-1.068],[-1.067,0],[0,1.067]],"v":[[0,6.764],[1.932,4.831],[0,2.898],[-1.932,4.831]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,-0.533],[0,0],[-0.534,0],[0,0],[0,0.533],[0,0],[0.534,0]],"o":[[-0.534,0],[0,0],[0,0.533],[0,0],[0.534,0],[0,0],[0,-0.533],[0,0]],"v":[[-6.763,-1.932],[-7.73,-0.966],[-7.73,10.629],[-6.763,11.594],[6.763,11.594],[7.73,10.629],[7.73,-0.966],[6.763,-1.932]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ind":2,"ty":"sh","ix":3,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,-1.601],[0,0],[1.601,0],[0,0],[0,1.601],[0,0],[-1.601,0]],"o":[[0,0],[0,0],[1.601,0],[0,0],[0,1.601],[0,0],[-1.601,0],[0,0],[0,-1.601],[0,0]],"v":[[-5.797,-3.865],[5.797,-3.865],[6.763,-3.865],[9.662,-0.966],[9.662,10.629],[6.763,13.527],[-6.763,13.527],[-9.662,10.629],[-9.662,-0.966],[-6.763,-3.865]],"c":true},"ix":2},"nm":"Path 3","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"mm","mm":4,"nm":"Merge Paths 2","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.4,0.61568627451,0.964705882353,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[9.912,13.777],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":6,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":14,"ty":4,"nm":"MATTE","td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[316.981,150,0],"ix":2,"l":2},"a":{"a":0,"k":[56.29,104.464,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[4.337,0],[0,0],[0,4.337],[0,0],[-4.337,0],[0,0],[0,-4.337]],"o":[[0,4.337],[0,0],[-4.337,0],[0,0],[0,-4.337],[0,0],[4.337,0],[0,0]],"v":[[52.107,94.382],[44.242,102.248],[-46.208,102.248],[-54.074,94.382],[-54.074,-94.382],[-46.208,-102.248],[44.242,-102.248],[52.107,-94.382]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"gr","it":[{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":0,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"mm","mm":4,"nm":"Merge Paths 2","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.498039245605,0.525490196078,0.545098039216,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[56.29,104.464],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":5,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":15,"ty":4,"nm":".blue400","cl":"blue400","tt":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[316.981,152.207,0],"ix":2,"l":2},"a":{"a":0,"k":[74.06,74.06,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[3.72,-30.74],[30.74,3.72],[-3.719,30.741],[-30.74,-3.719]],"o":[[-3.72,30.74],[-30.74,-3.719],[3.72,-30.74],[30.74,3.72]],"v":[[55.66,6.735],[-6.735,55.66],[-55.66,-6.735],[6.735,-55.66]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.4,0.61568627451,0.964705882353,1],"ix":4},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":60,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":73,"s":[33]},{"t":120,"s":[0]}],"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[74.06,74.06],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667],"y":[1,1]},"o":{"x":[0.333,0.333],"y":[0,0]},"t":60,"s":[0,0]},{"t":120,"s":[610,610]}],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":16,"ty":4,"nm":".blue300matte","cl":"blue300matte","td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[316.85,150.9,0],"ix":2,"l":2},"a":{"a":0,"k":[317.85,151.9,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[4.4,0],[0,0],[0,4.399],[0,0],[-4.4,0],[0,0],[0,-4.4]],"o":[[0,4.3],[0,0],[-4.3,0],[0,0],[0,-4.3],[0,0],[4.3,0],[0,0]],"v":[[52.15,94.3],[44.25,102.199],[-46.25,102.199],[-54.15,94.3],[-54.15,-94.4],[-46.25,-102.3],[44.25,-102.3],[52.15,-94.4]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,1.1],[0,0],[1.1,0],[0,0],[5.4,0],[0,0],[0,-5.4],[0,0],[-5.4,0],[0,0],[0,5.4],[0,0],[0,1.1],[0,0],[1.1,0],[0,0]],"o":[[0,0],[0,-1.1],[0,0],[0,-5.4],[0,0],[-5.4,0],[0,0],[0,5.4],[0,0],[5.4,0],[0,0],[1.1,0],[0,0],[0,-1.1],[0,0],[1.1,0]],"v":[[56.05,-43.3],[56.05,-51.2],[54.05,-53.2],[54.05,-94.4],[44.25,-104.2],[-46.25,-104.2],[-56.05,-94.4],[-56.05,94.4],[-46.25,104.199],[44.25,104.199],[54.05,94.4],[54.05,-1.9],[56.05,-3.9],[56.05,-23.6],[54.05,-25.6],[54.05,-41.3]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.541176470588,0.705882352941,0.972549019608,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[317.85,151.9],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 7","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":1800,"st":0,"bm":0},{"ddd":0,"ind":17,"ty":4,"nm":".blue600","cl":"blue600","tt":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[314.647,152.796,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,3.941],[0,0],[3.941,0],[0,0],[0,-3.941],[0,0],[-3.941,0]],"o":[[3.941,0],[0,0],[0,-3.941],[0,0],[-3.941,0],[0,0],[0,3.941],[0,0]],"v":[[48.189,101.203],[55.325,94.067],[55.283,-97.818],[48.147,-104.954],[-45.468,-104.954],[-52.605,-97.818],[-52.563,94.067],[-45.426,101.203]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":0,"k":25,"ix":2},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[225]},{"t":248,"s":[585]}],"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[0.101960784314,0.450980392157,0.909803921569,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":7,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,3.941],[0,0],[3.941,0],[0,0],[0,-3.941],[0,0],[-3.941,0]],"o":[[3.941,0],[0,0],[0,-3.941],[0,0],[-3.941,0],[0,0],[0,3.941],[0,0]],"v":[[48.189,101.203],[55.325,94.067],[55.283,-97.818],[48.147,-104.954],[-45.468,-104.954],[-52.605,-97.818],[-52.563,94.067],[-45.426,101.203]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":0,"k":25,"ix":2},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[45]},{"t":248,"s":[405]}],"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[0.101960784314,0.450980392157,0.909803921569,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":7,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":3,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":18,"ty":4,"nm":".blue300","cl":"blue300","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[316.85,150.9,0],"ix":2,"l":2},"a":{"a":0,"k":[317.85,151.9,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[4.4,0],[0,0],[0,4.399],[0,0],[-4.4,0],[0,0],[0,-4.4]],"o":[[0,4.3],[0,0],[-4.3,0],[0,0],[0,-4.3],[0,0],[4.3,0],[0,0]],"v":[[52.15,94.3],[44.25,102.199],[-46.25,102.199],[-54.15,94.3],[-54.15,-94.4],[-46.25,-102.3],[44.25,-102.3],[52.15,-94.4]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,1.1],[0,0],[1.1,0],[0,0],[5.4,0],[0,0],[0,-5.4],[0,0],[-5.4,0],[0,0],[0,5.4],[0,0],[0,1.1],[0,0],[1.1,0],[0,0]],"o":[[0,0],[0,-1.1],[0,0],[0,-5.4],[0,0],[-5.4,0],[0,0],[0,5.4],[0,0],[5.4,0],[0,0],[1.1,0],[0,0],[0,-1.1],[0,0],[1.1,0]],"v":[[56.05,-43.3],[56.05,-51.2],[54.05,-53.2],[54.05,-94.4],[44.25,-104.2],[-46.25,-104.2],[-56.05,-94.4],[-56.05,94.4],[-46.25,104.199],[44.25,104.199],[54.05,94.4],[54.05,-1.9],[56.05,-3.9],[56.05,-23.6],[54.05,-25.6],[54.05,-41.3]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.541176470588,0.705882352941,0.972549019608,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[317.85,151.9],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 7","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":1800,"st":0,"bm":0},{"ddd":0,"ind":19,"ty":4,"nm":".blue400","cl":"blue400","parent":24,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[88.803,150.5,0],"ix":2,"l":2},"a":{"a":0,"k":[88.803,150.5,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[24.601,0],[0,24.6],[-24.6,0],[0,-24.6]],"o":[[-24.6,0],[0,-24.6],[24.601,0],[0,24.6]],"v":[[-1.45,44.6],[-46.05,-0.001],[-1.45,-44.6],[43.151,-0.001]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[1.5,0],[0,0],[24.101,0],[0,-26.1],[-26.1,0],[-3.8,22.401],[0,0],[0,1.5],[0,0]],"o":[[0,0],[-2.9,-23.299],[-26.1,0],[0,26.1],[23.4,0],[0,0],[1.5,0],[0,0],[0.099,-1.5]],"v":[[46.051,-5.9],[45.551,-5.9],[-1.45,-47.299],[-48.75,-0.001],[-1.45,47.299],[45.25,7.799],[45.95,7.799],[48.651,5.1],[48.651,-3.199]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.400000029919,0.61568627451,0.964705942191,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[88.849,150.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 8","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":1800,"st":0,"bm":0},{"ddd":0,"ind":23,"ty":4,"nm":"ClockFace_Mask","parent":24,"td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[87.399,150.5,0],"ix":2,"l":2},"a":{"a":0,"k":[87.399,150.5,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-25.405,0],[0,25.405],[25.404,0],[0,-25.405]],"o":[[25.404,0],[0,-25.405],[-25.405,0],[0,25.405]],"v":[[0,46],[46,0],[0,-46],[-46,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[87.399,150.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 9","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":1800,"st":0,"bm":0},{"ddd":0,"ind":24,"ty":4,"nm":".grey300","cl":"grey300","tt":2,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.7],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.7],"y":[0]},"t":50,"s":[6]},{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.7],"y":[0]},"t":187,"s":[6]},{"t":237,"s":[0]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.7,"y":0},"t":0,"s":[86.4,150.05,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.2,"y":0.2},"o":{"x":0.7,"y":0.7},"t":50,"s":[121.4,150.05,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.2,"y":1},"o":{"x":0.7,"y":0},"t":187,"s":[121.4,150.05,0],"to":[0,0,0],"ti":[0,0,0]},{"t":237,"s":[86.4,150.05,0]}],"ix":2,"l":2},"a":{"a":0,"k":[87.4,151.05,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[5.1,0],[0,0],[0.5,-4.3],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-5.1,0],[0,0],[-0.5,4.3],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[-0.5,-4.3],[0,0],[-5.1,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0.5,4.301],[0,0],[5.1,0],[0,0],[0,0],[0,0]],"v":[[29.3,-7.85],[29.4,-9.35],[29.1,-9.35],[22.699,-68.05],[12.8,-75.65],[-12,-75.65],[-21.9,-68.15],[-29,-9.35],[-29.4,-9.35],[-29.301,-7.65],[-29.4,-6.45],[-29.2,-6.45],[-22.801,68.049],[-12.9,75.65],[11.9,75.65],[21.8,68.15],[29,-6.45],[29.3,-6.45]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.501960784314,0.525490196078,0.545098039216,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[87.4,151.05],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 10","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":1800,"st":0,"bm":0}],"markers":[]}
diff --git a/res/raw/user_aspect_ratio_education.json b/res/raw/user_aspect_ratio_education.json
new file mode 100644
index 0000000..ab74b45
--- /dev/null
+++ b/res/raw/user_aspect_ratio_education.json
@@ -0,0 +1 @@
+{"v":"5.12.0","fr":60,"ip":0,"op":226,"w":412,"h":300,"nm":"AppCompat_Felix_DT","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":".blue400","cl":"blue400","parent":3,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"k":[{"s":[38.5,-79.5,0],"t":15,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[38.661,-79.5,0],"t":16,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[39.181,-79.5,0],"t":17,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[40.183,-79.5,0],"t":18,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[41.974,-79.5,0],"t":19,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[45.7,-79.5,0],"t":20,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[49.943,-79.5,0],"t":21,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[51.81,-79.5,0],"t":22,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[52.893,-79.5,0],"t":23,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[53.628,-79.5,0],"t":24,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[54.171,-79.5,0],"t":25,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[54.59,-79.5,0],"t":26,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[54.925,-79.5,0],"t":27,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[55.197,-79.5,0],"t":28,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[55.423,-79.5,0],"t":29,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[55.611,-79.5,0],"t":30,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[55.77,-79.5,0],"t":31,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[55.904,-79.5,0],"t":32,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[56.017,-79.5,0],"t":33,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[56.113,-79.5,0],"t":34,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[56.195,-79.5,0],"t":35,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[56.263,-79.5,0],"t":36,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[56.32,-79.5,0],"t":37,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[56.368,-79.5,0],"t":38,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[56.406,-79.5,0],"t":39,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[56.461,-79.5,0],"t":41,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[56.5,-79.5,0],"t":60,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[56.823,-79.5,0],"t":61,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[57.861,-79.5,0],"t":62,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[59.865,-79.5,0],"t":63,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[63.449,-79.5,0],"t":64,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[70.9,-79.5,0],"t":65,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[79.385,-79.5,0],"t":66,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[83.121,-79.5,0],"t":67,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[85.286,-79.5,0],"t":68,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[86.757,-79.5,0],"t":69,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[87.841,-79.5,0],"t":70,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[88.68,-79.5,0],"t":71,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[89.349,-79.5,0],"t":72,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[89.894,-79.5,0],"t":73,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[90.345,-79.5,0],"t":74,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[90.722,-79.5,0],"t":75,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[91.039,-79.5,0],"t":76,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[91.307,-79.5,0],"t":77,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[91.534,-79.5,0],"t":78,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[91.727,-79.5,0],"t":79,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[91.889,-79.5,0],"t":80,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[92.026,-79.5,0],"t":81,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[92.141,-79.5,0],"t":82,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[92.236,-79.5,0],"t":83,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[92.313,-79.5,0],"t":84,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[92.375,-79.5,0],"t":85,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[92.458,-79.5,0],"t":87,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[92.5,-79.5,0],"t":105,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[92.177,-79.5,0],"t":106,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[91.139,-79.5,0],"t":107,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[89.135,-79.5,0],"t":108,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[85.551,-79.5,0],"t":109,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[78.1,-79.5,0],"t":110,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[69.615,-79.5,0],"t":111,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[65.879,-79.5,0],"t":112,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[63.714,-79.5,0],"t":113,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[62.243,-79.5,0],"t":114,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[61.159,-79.5,0],"t":115,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[60.32,-79.5,0],"t":116,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[59.651,-79.5,0],"t":117,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[59.106,-79.5,0],"t":118,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[58.655,-79.5,0],"t":119,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[58.278,-79.5,0],"t":120,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[57.961,-79.5,0],"t":121,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[57.693,-79.5,0],"t":122,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[57.466,-79.5,0],"t":123,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[57.273,-79.5,0],"t":124,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[57.111,-79.5,0],"t":125,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[56.974,-79.5,0],"t":126,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[56.859,-79.5,0],"t":127,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[56.764,-79.5,0],"t":128,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[56.687,-79.5,0],"t":129,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[56.625,-79.5,0],"t":130,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[56.577,-79.5,0],"t":131,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[56.542,-79.5,0],"t":132,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[56.5,-79.5,0],"t":150,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[56.339,-79.5,0],"t":151,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[55.819,-79.5,0],"t":152,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[54.817,-79.5,0],"t":153,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[53.026,-79.5,0],"t":154,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[49.3,-79.5,0],"t":155,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[45.057,-79.5,0],"t":156,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[43.19,-79.5,0],"t":157,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[42.107,-79.5,0],"t":158,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[41.372,-79.5,0],"t":159,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[40.829,-79.5,0],"t":160,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[40.41,-79.5,0],"t":161,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[40.075,-79.5,0],"t":162,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[39.803,-79.5,0],"t":163,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[39.577,-79.5,0],"t":164,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[39.389,-79.5,0],"t":165,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[39.23,-79.5,0],"t":166,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[39.096,-79.5,0],"t":167,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[38.983,-79.5,0],"t":168,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[38.887,-79.5,0],"t":169,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[38.805,-79.5,0],"t":170,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[38.737,-79.5,0],"t":171,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[38.68,-79.5,0],"t":172,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[38.632,-79.5,0],"t":173,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[38.594,-79.5,0],"t":174,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[38.563,-79.5,0],"t":175,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[38.539,-79.5,0],"t":176,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[38.502,-79.5,0],"t":179,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}],"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[7.5,3.077],[7.5,-7.5],[-2.981,-7.5]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-7.5,7.5],[7.5,-7.5]],"c":false},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"st","c":{"a":0,"k":[0.40000000596,0.615686297417,0.964705884457,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Vector","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":2916,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":".blue400","cl":"blue400","parent":3,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"k":[{"s":[-38.5,79.5,0],"t":15,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-38.661,79.5,0],"t":16,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-39.181,79.5,0],"t":17,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-40.183,79.5,0],"t":18,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-41.974,79.5,0],"t":19,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-45.7,79.5,0],"t":20,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-49.943,79.5,0],"t":21,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-51.81,79.5,0],"t":22,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-52.893,79.5,0],"t":23,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-53.628,79.5,0],"t":24,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-54.171,79.5,0],"t":25,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-54.59,79.5,0],"t":26,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-54.925,79.5,0],"t":27,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-55.197,79.5,0],"t":28,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-55.423,79.5,0],"t":29,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-55.611,79.5,0],"t":30,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-55.77,79.5,0],"t":31,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-55.904,79.5,0],"t":32,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-56.017,79.5,0],"t":33,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-56.113,79.5,0],"t":34,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-56.195,79.5,0],"t":35,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-56.263,79.5,0],"t":36,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-56.32,79.5,0],"t":37,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-56.368,79.5,0],"t":38,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-56.406,79.5,0],"t":39,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-56.461,79.5,0],"t":41,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-56.5,79.5,0],"t":60,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-56.823,79.5,0],"t":61,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-57.861,79.5,0],"t":62,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-59.865,79.5,0],"t":63,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-63.449,79.5,0],"t":64,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-70.9,79.5,0],"t":65,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-79.385,79.5,0],"t":66,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-83.121,79.5,0],"t":67,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-85.286,79.5,0],"t":68,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-86.757,79.5,0],"t":69,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-87.841,79.5,0],"t":70,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-88.68,79.5,0],"t":71,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-89.349,79.5,0],"t":72,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-89.894,79.5,0],"t":73,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-90.345,79.5,0],"t":74,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-90.722,79.5,0],"t":75,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-91.039,79.5,0],"t":76,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-91.307,79.5,0],"t":77,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-91.534,79.5,0],"t":78,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-91.727,79.5,0],"t":79,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-91.889,79.5,0],"t":80,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-92.026,79.5,0],"t":81,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-92.141,79.5,0],"t":82,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-92.236,79.5,0],"t":83,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-92.313,79.5,0],"t":84,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-92.375,79.5,0],"t":85,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-92.458,79.5,0],"t":87,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-92.5,79.5,0],"t":105,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-92.177,79.5,0],"t":106,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-91.139,79.5,0],"t":107,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-89.135,79.5,0],"t":108,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-85.551,79.5,0],"t":109,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-78.1,79.5,0],"t":110,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-69.615,79.5,0],"t":111,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-65.879,79.5,0],"t":112,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-63.714,79.5,0],"t":113,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-62.243,79.5,0],"t":114,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-61.159,79.5,0],"t":115,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-60.32,79.5,0],"t":116,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-59.651,79.5,0],"t":117,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-59.106,79.5,0],"t":118,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-58.655,79.5,0],"t":119,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-58.278,79.5,0],"t":120,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-57.961,79.5,0],"t":121,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-57.693,79.5,0],"t":122,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-57.466,79.5,0],"t":123,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-57.273,79.5,0],"t":124,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-57.111,79.5,0],"t":125,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-56.974,79.5,0],"t":126,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-56.859,79.5,0],"t":127,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-56.764,79.5,0],"t":128,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-56.687,79.5,0],"t":129,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-56.625,79.5,0],"t":130,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-56.577,79.5,0],"t":131,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-56.542,79.5,0],"t":132,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-56.5,79.5,0],"t":150,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-56.339,79.5,0],"t":151,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-55.819,79.5,0],"t":152,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-54.817,79.5,0],"t":153,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-53.026,79.5,0],"t":154,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-49.3,79.5,0],"t":155,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-45.057,79.5,0],"t":156,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-43.19,79.5,0],"t":157,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-42.107,79.5,0],"t":158,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-41.372,79.5,0],"t":159,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-40.829,79.5,0],"t":160,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-40.41,79.5,0],"t":161,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-40.075,79.5,0],"t":162,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-39.803,79.5,0],"t":163,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-39.577,79.5,0],"t":164,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-39.389,79.5,0],"t":165,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-39.23,79.5,0],"t":166,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-39.096,79.5,0],"t":167,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-38.983,79.5,0],"t":168,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-38.887,79.5,0],"t":169,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-38.805,79.5,0],"t":170,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-38.737,79.5,0],"t":171,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-38.68,79.5,0],"t":172,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-38.632,79.5,0],"t":173,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-38.594,79.5,0],"t":174,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-38.563,79.5,0],"t":175,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-38.539,79.5,0],"t":176,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-38.502,79.5,0],"t":179,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}],"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[-7.5,-3.077],[-7.5,7.5],[2.981,7.5]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[7.5,-7.5],[-7.5,7.5]],"c":false},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"st","c":{"a":0,"k":[0.40000000596,0.615686297417,0.964705884457,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Vector","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":2916,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":".black","cl":"black","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[206,150,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":1,"k":[{"i":{"x":[0.8,0.8],"y":[0.15,1]},"o":{"x":[0.3,0.3],"y":[0,0]},"t":15,"s":[104,186]},{"i":{"x":[0.1,0.1],"y":[1,1]},"o":{"x":[0.05,0.05],"y":[0.7,0]},"t":20,"s":[118.4,186]},{"i":{"x":[0.1,0.1],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":45,"s":[140,186]},{"i":{"x":[0.8,0.8],"y":[0.15,1]},"o":{"x":[0.3,0.3],"y":[0,0]},"t":60,"s":[140,186]},{"i":{"x":[0.1,0.1],"y":[1,1]},"o":{"x":[0.05,0.05],"y":[0.7,0]},"t":65,"s":[168.8,186]},{"i":{"x":[0.1,0.1],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":90,"s":[212,186]},{"i":{"x":[0.8,0.8],"y":[0.15,1]},"o":{"x":[0.3,0.3],"y":[0,0]},"t":105,"s":[212,186]},{"i":{"x":[0.1,0.1],"y":[1,1]},"o":{"x":[0.05,0.05],"y":[0.7,0]},"t":110,"s":[183.2,186]},{"i":{"x":[0.1,0.1],"y":[1,1]},"o":{"x":[0.3,0.3],"y":[0,0]},"t":135,"s":[140,186]},{"i":{"x":[0.8,0.8],"y":[0.15,1]},"o":{"x":[0.3,0.3],"y":[0,0]},"t":150,"s":[140,186]},{"i":{"x":[0.1,0.1],"y":[1,1]},"o":{"x":[0.05,0.05],"y":[0.7,0]},"t":155,"s":[125.6,186]},{"t":180,"s":[104,186]}],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":2,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"inside","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":2916,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":".blue400","cl":"blue400","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[206,150,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":1,"k":[{"i":{"x":[0.8,0.8],"y":[0.15,1]},"o":{"x":[0.3,0.3],"y":[0,0]},"t":15,"s":[112,194]},{"i":{"x":[0.1,0.1],"y":[1,1]},"o":{"x":[0.05,0.05],"y":[0.7,0]},"t":20,"s":[126.4,194]},{"i":{"x":[0.1,0.1],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":45,"s":[148,194]},{"i":{"x":[0.8,0.8],"y":[0.15,1]},"o":{"x":[0.3,0.3],"y":[0,0]},"t":60,"s":[148,194]},{"i":{"x":[0.1,0.1],"y":[1,1]},"o":{"x":[0.05,0.05],"y":[0.7,0]},"t":65,"s":[176.8,194]},{"i":{"x":[0.1,0.1],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":90,"s":[220,194]},{"i":{"x":[0.8,0.8],"y":[0.15,1]},"o":{"x":[0.3,0.3],"y":[0,0]},"t":105,"s":[220,194]},{"i":{"x":[0.1,0.1],"y":[1,1]},"o":{"x":[0.05,0.05],"y":[0.7,0]},"t":110,"s":[191.2,194]},{"i":{"x":[0.1,0.1],"y":[1,1]},"o":{"x":[0.3,0.3],"y":[0,0]},"t":135,"s":[148,194]},{"i":{"x":[0.8,0.8],"y":[0.15,1]},"o":{"x":[0.3,0.3],"y":[0,0]},"t":150,"s":[148,194]},{"i":{"x":[0.1,0.1],"y":[1,1]},"o":{"x":[0.05,0.05],"y":[0.7,0]},"t":155,"s":[133.6,194]},{"t":180,"s":[112,194]}],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":4,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.40000000596,0.615686297417,0.964705884457,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"outside","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":2916,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":".grey600","cl":"grey600","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[207.5,150.303,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.133,-0.038],[0,0],[0,0],[0,-1.46],[0,0],[1.133,-0.038],[0,0],[5.707,0],[0,0],[1.894,1.051],[0,0],[0.833,-0.334],[2.166,0],[0,0],[0,5.707],[0,0],[-5.707,0],[0,0],[-1.894,-1.05],[0,0],[-0.883,0.354],[-2.166,0],[0,0],[0,-5.707],[0,0],[0,-1.46],[0,0]],"o":[[0,0],[0,0],[1.133,0.038],[0,0],[0,1.46],[0,0],[0,5.706],[0,0],[-2.166,0],[0,0],[-0.846,-0.289],[-1.894,1.051],[0,0],[-5.707,0],[0,0],[0,-5.707],[0,0],[2.166,0],[0,0],[0.886,0.346],[1.894,-1.05],[0,0],[5.707,0],[0,0],[1.133,0.038],[0,0],[0,1.46]],"v":[[114.45,-16.3],[114.45,-15.539],[114.45,-0.877],[116.494,1.802],[116.494,28.704],[114.45,31.383],[114.45,91.749],[104.117,102.082],[7.828,102.082],[0.351,100.48],[0.25,100.424],[-2.349,100.48],[-8.539,102.082],[-106.16,102.082],[-116.494,91.748],[-116.494,-91.748],[-106.16,-102.082],[-8.754,-102.082],[-2.563,-100.48],[-2.532,-100.468],[0.221,-100.48],[6.411,-102.082],[104.116,-102.082],[114.45,-91.748],[114.45,-36.119],[116.494,-33.44],[116.494,-18.979]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,4.177],[0,0],[4.177,0],[0,0],[0,-4.177],[0,0],[-4.177,0]],"o":[[4.177,0],[0,0],[0,-4.177],[0,0],[-4.177,0],[0,0],[0,4.177],[0,0]],"v":[[104.117,99.704],[112.072,92.128],[112.072,-91.748],[104.117,-99.704],[-106.161,-99.704],[-114.116,-91.748],[-114.116,92.128],[-106.161,99.704]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.501960813999,0.525490224361,0.54509806633,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"felix","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":2916,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":".black","cl":"black","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[206,150,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-15.291,0],[0,0],[0,15.544],[0,0],[15.185,0],[0,0],[0,-15.652],[0,0]],"o":[[0,0],[15.291,0],[0,0],[0,-15.652],[0,0],[-15.291,0],[0,0],[0,15.652]],"v":[[-178.179,150],[178.179,150],[206,121.63],[206,-121.522],[178.286,-150],[-178.179,-150],[-206,-121.522],[-206,121.522]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":".white","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false,"cl":"white"}],"ip":0,"op":2916,"st":0,"ct":1,"bm":0}],"markers":[{"tm":195,"cm":"Plus .5s hold for loop","dr":30}],"props":{}}
\ No newline at end of file
diff --git a/res/values/arrays.xml b/res/values/arrays.xml
index 787163e..906d4ee 100644
--- a/res/values/arrays.xml
+++ b/res/values/arrays.xml
@@ -1409,4 +1409,25 @@
     <integer-array name="network_mode_3g_deprecated_carrier_id" translatable="false">
     </integer-array>
 
+    <!-- The following 4 arrays are for power anomaly tips card. Please keep them the same size. -->
+    <string-array name="power_anomaly_keys" translatable="false">
+        <item>adaptive_brightness</item>
+        <item>screen_timeout</item>
+    </string-array>
+
+    <string-array name="power_anomaly_titles">
+        <item>Turn on adaptive brightness to extend battery life</item>
+        <item>Reduce screen timeout to extend battery life</item>
+    </string-array>
+
+    <string-array name="power_anomaly_main_btn_strings">
+        <item>@string/battery_tips_card_action_button</item>
+        <item>@string/battery_tips_card_action_button</item>
+    </string-array>
+
+    <string-array name="power_anomaly_dismiss_btn_strings">
+        <item>@string/battery_tips_card_dismiss_button</item>
+        <item>@string/battery_tips_card_dismiss_button</item>
+    </string-array>
+
 </resources>
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index 127ee7b..30892a3 100755
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -171,6 +171,15 @@
 
     <!-- RemoteAuth-->
     <dimen name="remoteauth_fragment_padding_horizontal">40dp</dimen>
+    <dimen name="remoteauth_icon_small_size">24dp</dimen>
+    <dimen name="remoteauth_touchable_area_minimum_span">48dp</dimen>
+    <dimen name="remoteauth_introduction_fragment_padding_horizontal">30dp</dimen>
+    <dimen name="remoteauth_introduction_description_start_margin">8dp</dimen>
+    <dimen name="remoteauth_introduction_subheading_text_size">18sp</dimen>
+    <dimen name="remoteauth_carousel_progress_margin">28dp</dimen>
+    <dimen name="remoteauth_carousel_progress_circle_diameter">8dp</dimen>
+    <dimen name="remoteauth_carousel_progress_circle_margin">4dp</dimen>
+
 
     <!-- Lock pattern view size, align sysui biometric_auth_pattern_view_size -->
     <dimen name="biometric_auth_pattern_view_size">348dp</dimen>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index d00fc67..180d401 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -885,19 +885,39 @@
     <string name="security_settings_fingerprint_multiple_face_watch_preference_summary">Face, fingerprints, and <xliff:g id="watch" example="Dani's Watch">%s</xliff:g> added</string>
 
     <!-- RemoteAuth unlock enrollment and settings --><skip />
+    <!-- Strings for RemoteAuth enroll introduction page -->
+    <!-- Introduction title shown in remote enrollment to introduce the remote feature [CHAR LIMIT=29] -->
+    <string name="security_settings_remoteauth_enroll_introduction_title">Set up your watch</string>
+    <!-- Summary of the Watch Unlock feature that allows users to unlock the phone with paired watches [CHAR_LIMIT=NONE]-->
+    <string name="security_settings_remoteauth_enroll_introduction_message">Watch Unlock is another convenient way to unlock this phone, for example, when your fingers are wet or face isn\u2019t recognized.\n\nYou can use your watch to unlock this phone when you:</string>
+    <!-- Button text to cancel enrollment [CHAR LIMIT=30] -->
+    <string name="security_settings_remoteauth_enroll_introduction_disagree">Not now</string>
+    <!-- Button text to start enrollment [CHAR LIMIT=30] -->
+    <string name="security_settings_remoteauth_enroll_introduction_agree">Continue</string>
+    <!-- Button text to scroll to the end of a scrollview. [CHAR LIMIT=30] -->
+    <string name="security_settings_remoteauth_enroll_introduction_more">More</string>
+    <!-- Heading of the paragraph that explains how the Watch Unlock feature works [CHAR_LIMIT=NONE] -->
+    <string name="security_settings_remoteauth_enroll_introduction_how_title">How it works</string>
+    <!-- Explains that paired watches must be unlocked, on-body, and nearby, in order to unlock the phone [CHAR_LIMIT=NONE] -->
+    <string name="security_settings_remoteauth_enroll_introduction_info_lock_open">Your watch must be unlocked, on your wrist, and within reach of this phone. You won\u2019t need to unlock your watch again while it\u2019s on your wrist.</string>
+    <!-- Explains that users will be notified on the watch when the phone is unlocked by the watch, and they can tap on the notification to lock the phone from the watch [CHAR_LIMIT=NONE] -->
+    <string name="security_settings_remoteauth_enroll_introduction_info_notifications">When this phone is unlocked, you\u2019ll get notified on your watch. If it was unlocked when you didn’t intend to, tap the notification to lock the phone again.</string>
+    <!-- Heading of the paragraph that explains how to opt out of the Watch Unlock feature [CHAR_LIMIT=NONE] -->
+    <string name="security_settings_remoteauth_enroll_introduction_youre_in_control_title">You\u2019re in control</string>
+    <!-- Explains that users can prevent their watches from unlocking their phone by removing them in the Watch Unlock settings [CHAR_LIMIT=NONE] -->
+    <string name="security_settings_remoteauth_enroll_introduction_info_remove_watch">You can remove your watch from Watch Unlock at any time in Settings</string>
+    <!-- Subtitle for animation that explains users can unlock by tapping a notification [CHAR_LIMIT=NONE] -->
+    <string name="security_settings_remoteauth_enroll_introduction_animation_tap_notification">Tap a notification</string>
+    <!-- Subtitle for animation that explains users can unlock by swiping up on the lock screen [CHAR_LIMIT=NONE] -->
+    <string name="security_settings_remoteauth_enroll_introduction_animation_swipe_up">Swipe up on the lock screen</string>
     <!-- Strings for RemoteAuth enroll finish page -->
     <!-- Title of the dialog that shows when a paired watch has been set up successfully and can be used to unlock the phone [CHAR_LIMIT=45] -->
-    <string name="security_settings_remoteauth_enroll_finish_title">
-        You\'re all set!
-    </string>
+    <string name="security_settings_remoteauth_enroll_finish_title">You\u2019re all set!</string>
     <!-- Explains when a paired watch can be used to unlock the phone after it has been set up successfully [CHAR_LIMIT=NONE] -->
-    <string name="security_settings_remoteauth_enroll_finish_description">
-        You can now use your watch to unlock this phone when you swipe up on the lock screen or tap a notification
-    </string>
+    <string name="security_settings_remoteauth_enroll_finish_description">You can now use your watch to unlock this phone when you swipe up on the lock screen or tap a notification</string>
     <!-- Button text to finish enrollment [CHAR LIMIT=30] -->
     <string name="security_settings_remoteauth_enroll_finish_btn_next">Done</string>
 
-
     <!-- Biometric settings --><skip />
     <!-- Title shown for menu item that launches biometric settings. [CHAR LIMIT=66] -->
     <string name="security_settings_biometric_preference_title">Fingerprint &amp; Face Unlock</string>
@@ -1518,6 +1538,12 @@
     <!-- Checkbox message in pairing dialogs.  [CHAR LIMIT=NONE] -->
     <string name="bluetooth_pairing_shares_phonebook">Allow access to your contacts and call history</string>
 
+    <!-- Phonebook sharing toggle message in pairing dialogs.  [CHAR LIMIT=NONE] -->
+    <string name="bluetooth_pairing_phonebook_toggle_text">Also allow access to contacts and call history</string>
+
+    <!-- Phonebook sharing toggle detailed message in pairing dialogs.  [CHAR LIMIT=NONE] -->
+    <string name="bluetooth_pairing_phonebook_toggle_details">Info will be used for call announcements and more</string>
+
     <!-- Title for BT error dialogs. -->
     <string name="bluetooth_error_title"></string>
 
@@ -4816,7 +4842,7 @@
     <!-- List of synonyms used in the settings search bar to find the "Audio Description. [CHAR LIMIT=NONE] -->
     <string name="keywords_audio_description">audio description, audio, description, low vision,</string>
 
-    <!-- Preference's shortcut when enabled. [CHAR LIMIT=NONE] -->
+    <!-- Shows when the shortcut of an accessibility feature is turned on. The accessibility feature could refer to any accessibility feature installed on the device. [CHAR LIMIT=NONE] -->
     <string name="accessibility_summary_shortcut_enabled">Shortcut on</string>
     <!-- Preference's shortcut when disabled. [CHAR LIMIT=NONE] -->
     <string name="accessibility_summary_shortcut_disabled">Off</string>
@@ -9702,23 +9728,14 @@
     <string name="app_battery_usage_summary">Set battery usage for apps</string>
 
     <!-- Label of action button in battery tips card [CHAR LIMIT=NONE] -->
-    <string name="battery_tips_card_action_button" translatable="false">Optimize</string>
+    <string name="battery_tips_card_action_button" translatable="false">View Settings</string>
+
+    <!-- Label of dismiss button in battery tips card [CHAR LIMIT=NONE] -->
+    <string name="battery_tips_card_dismiss_button" translatable="false">Got it</string>
 
     <!-- Feedback card message in battery tips card [CHAR LIMIT=NONE] -->
     <string name="battery_tips_card_feedback_info" translatable="false">Is this message helpful?</string>
 
-    <!-- Title of battery tips: adaptive brightness [CHAR LIMIT=NONE] -->
-    <string name="battery_tips_adaptive_brightness_title" translatable="false">Turn on adaptive brightness to extend battery life</string>
-
-    <!-- Summary of battery tips: adaptive brightness [CHAR LIMIT=NONE] -->
-    <string name="battery_tips_adaptive_brightness_summary" translatable="false">It will help reduce your daily battery drain by 10%</string>
-
-    <!-- Title of battery tips: reduce screen timeout [CHAR LIMIT=NONE] -->
-    <string name="battery_tips_screen_timeout_title" translatable="false">Reduce screen timeout to extend battery life</string>
-
-    <!-- Summary of battery tips: reduce screen timeout [CHAR LIMIT=NONE] -->
-    <string name="battery_tips_screen_timeout_summary" translatable="false">It will help reduce your daily battery drain by 10%</string>
-
     <!-- Filter title for battery unrestricted[CHAR_LIMIT=50]-->
     <string name="filter_battery_unrestricted_title">Unrestricted</string>
 
@@ -12055,6 +12072,19 @@
     <!-- The summary of the head tracking [CHAR LIMIT=none] -->
     <string name="bluetooth_details_head_tracking_summary">Audio changes as you move your head to sound more natural</string>
 
+    <!-- The title of the bluetooth audio device type selection [CHAR LIMIT=none] -->
+    <string name="bluetooth_details_audio_device_types_title">Audio Device Type</string>
+    <!-- The audio device type corresponding to unknown selected [CHAR LIMIT=none] -->
+    <string name="bluetooth_details_audio_device_type_unknown">Unknown</string>
+    <!-- The audio device type corresponding to none selected [CHAR LIMIT=none] -->
+    <string name="bluetooth_details_audio_device_type_speaker">Speaker</string>
+    <!-- The audio device type corresponding to speakers [CHAR LIMIT=none] -->
+    <string name="bluetooth_details_audio_device_type_headphones">Headphones</string>
+    <!-- The audio device type corresponding to car kit [CHAR LIMIT=none] -->
+    <string name="bluetooth_details_audio_device_type_carkit">Car Kit</string>
+    <!-- The audio device type corresponding to other device type [CHAR LIMIT=none] -->
+    <string name="bluetooth_details_audio_device_type_other">Other</string>
+
     <!-- Developer Settings: Title for network bandwidth ingress rate limit [CHAR LIMIT=none] -->
     <string name="ingress_rate_limit_title">Network download rate limit</string>
     <!-- Developer Settings: Summary for network bandwidth ingress rate limit [CHAR LIMIT=none] -->
@@ -12246,15 +12276,18 @@
     <!-- Warning message when we try to dock an app not supporting multiple instances split into multiple sides [CHAR LIMIT=NONE] -->
     <string name="dock_multi_instances_not_supported_text">"This app can only be opened in 1 window"</string>
 
-    <!-- The accessibility features state summary, indicating whether the service is turned on, whether the shortcut is turned on. The last part of the summary is the short summary of the feature. -->
-    <string name="accessibility_feature_full_state_summary"><xliff:g example="Service on" id="state">%1$s</xliff:g> / <xliff:g example="Shortcut on" id="shortcut_state">%2$s</xliff:g> / <xliff:g example="Speak items on screen" id="service_summary">%3$s</xliff:g></string>
-    <!-- Label representing that a generic Accessibility Service is turned on. -->
-    <string name="generic_accessibility_service_on">Service on</string>
-    <!-- Label representing that a generic Accessibility Service is turned off. -->
-    <string name="generic_accessibility_service_off">Service off</string>
-    <!-- Label representing that an accessibility feature's shortcut is turned off -->
-    <string name="generic_accessibility_feature_shortcut_off">Shortcut off</string>
-    <!-- Summary for the disabled state of the accessibility shortcut. This is shown as a summary for "[Service] shortcut", where "off" refers to the state of "shortcut". -->
+    <!-- Shown when an accessibility feature is turned on. Note: for gendered languages, suggest to translate as "Feature on" because the accessibility feature it refers to can be in any gender. [CHAR LIMIT=NONE] -->
+    <string name="generic_accessibility_service_on">On</string>
+    <!-- Shown when an accessibility feature is turned off. Note: for gendered languages, suggest to translate as "Feature off" because the accessibility feature it refers to can be in any gender. [CHAR LIMIT=NONE] -->
+    <string name="generic_accessibility_service_off">Off</string>
+    <!-- Shows when the shortcut of an accessibility feature is turned off. The "off" refers to the state of "shortcut". Note: for gendered languages, suggest to translate as "Shortcut off". [CHAR LIMIT=NONE] -->
+    <string name="generic_accessibility_feature_shortcut_off">Off</string>
+    <!--
+        Summary for the disabled state of the accessibility shortcut.
+        This is shown as a summary for "[Service] shortcut" from the string resource accessibility_shortcut_title,
+        where "off" refers to the state of "shortcut" and
+        should match the same gender as the noun used in the string accessibility_shortcut_title.
+    -->
     <string name="accessibility_shortcut_state_off">Off</string>
 
     <!-- Representing daltonizer (color filter) feature is turned on -->
diff --git a/res/xml/accessibility_system_controls.xml b/res/xml/accessibility_system_controls.xml
index 3821f93..37c4d67 100644
--- a/res/xml/accessibility_system_controls.xml
+++ b/res/xml/accessibility_system_controls.xml
@@ -34,7 +34,7 @@
         android:persistent="false"
         android:title="@string/one_handed_title"
         settings:searchable="false"
-        settings:controller="com.android.settings.accessibility.OneHandedPreferenceController"/>
+        settings:controller="com.android.settings.gestures.OneHandedEnablePreferenceController"/>
 
     <SwitchPreference
         android:key="toggle_power_button_ends_call_preference"
diff --git a/res/xml/bluetooth_device_details_fragment.xml b/res/xml/bluetooth_device_details_fragment.xml
index 35359f7..8f309a4 100644
--- a/res/xml/bluetooth_device_details_fragment.xml
+++ b/res/xml/bluetooth_device_details_fragment.xml
@@ -72,6 +72,9 @@
         android:key="device_controls_general" />
 
     <PreferenceCategory
+        android:key="bluetooth_audio_device_type_group"/>
+
+    <PreferenceCategory
         android:key="spatial_audio_group"/>
 
     <PreferenceCategory
diff --git a/res/xml/user_aspect_ratio_details.xml b/res/xml/user_aspect_ratio_details.xml
index fc921dd..07c8b6f 100644
--- a/res/xml/user_aspect_ratio_details.xml
+++ b/res/xml/user_aspect_ratio_details.xml
@@ -18,42 +18,49 @@
 <PreferenceScreen
     xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:settings="http://schemas.android.com/apk/res-auto"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
     android:title="@string/aspect_ratio_title">
 
     <com.android.settingslib.widget.ActionButtonsPreference
         android:key="header_view" />
 
-    <com.android.settingslib.widget.SelectorWithWidgetPreference
+    <com.android.settings.applications.appcompat.RadioWithImagePreference
         android:key="app_default_pref"
         android:title="@string/user_aspect_ratio_app_default"/>
 
-    <com.android.settingslib.widget.SelectorWithWidgetPreference
+    <com.android.settings.applications.appcompat.RadioWithImagePreference
         android:key="fullscreen_pref"
-        android:title="@string/user_aspect_ratio_fullscreen"/>
+        android:title="@string/user_aspect_ratio_fullscreen"
+        android:icon="@drawable/ic_app_aspect_ratio_fullscreen"/>
 
-    <com.android.settingslib.widget.SelectorWithWidgetPreference
+    <com.android.settings.applications.appcompat.RadioWithImagePreference
         android:key="half_screen_pref"
-        android:title="@string/user_aspect_ratio_half_screen"/>
+        android:title="@string/user_aspect_ratio_half_screen"
+        android:icon="@drawable/ic_app_aspect_ratio_half_screen"/>
 
-    <com.android.settingslib.widget.SelectorWithWidgetPreference
+    <com.android.settings.applications.appcompat.RadioWithImagePreference
         android:key="display_size_pref"
-        android:title="@string/user_aspect_ratio_device_size"/>
+        android:title="@string/user_aspect_ratio_device_size"
+        android:icon="@drawable/ic_app_aspect_ratio_display_size"/>
 
-    <com.android.settingslib.widget.SelectorWithWidgetPreference
+    <com.android.settings.applications.appcompat.RadioWithImagePreference
         android:key="16_9_pref"
-        android:title="@string/user_aspect_ratio_16_9"/>
+        android:title="@string/user_aspect_ratio_16_9"
+        android:icon="@drawable/ic_app_aspect_ratio_16_9"/>
 
-    <com.android.settingslib.widget.SelectorWithWidgetPreference
+    <com.android.settings.applications.appcompat.RadioWithImagePreference
         android:key="4_3_pref"
-        android:title="@string/user_aspect_ratio_4_3"/>
+        android:title="@string/user_aspect_ratio_4_3"
+        android:icon="@drawable/ic_app_aspect_ratio_4_3"/>
 
-    <com.android.settingslib.widget.SelectorWithWidgetPreference
+    <com.android.settings.applications.appcompat.RadioWithImagePreference
         android:key="3_2_pref"
-        android:title="@string/user_aspect_ratio_3_2"/>
+        android:title="@string/user_aspect_ratio_3_2"
+        android:icon="@drawable/ic_app_aspect_ratio_3_2"/>
 
     <com.android.settingslib.widget.FooterPreference
         android:title="@string/app_aspect_ratio_footer"
         android:selectable="false"
         settings:searchable="false"/>
 
-</PreferenceScreen>
\ No newline at end of file
+</PreferenceScreen>
diff --git a/src/com/android/settings/accessibility/AccessibilityGestureNavigationTutorial.java b/src/com/android/settings/accessibility/AccessibilityGestureNavigationTutorial.java
index 528801f..ee2dc05 100644
--- a/src/com/android/settings/accessibility/AccessibilityGestureNavigationTutorial.java
+++ b/src/com/android/settings/accessibility/AccessibilityGestureNavigationTutorial.java
@@ -170,13 +170,6 @@
     static AlertDialog createAccessibilityTutorialDialogForSetupWizard(Context context,
             int shortcutTypes, @Nullable DialogInterface.OnClickListener actionButtonListener) {
 
-        final int category = SettingsEnums.SWITCH_SHORTCUT_DIALOG_ACCESSIBILITY_BUTTON_SETTINGS;
-        final DialogInterface.OnClickListener linkButtonListener =
-                (dialog, which) -> new SubSettingLauncher(context)
-                        .setDestination(AccessibilityButtonFragment.class.getName())
-                        .setSourceMetricsCategory(category)
-                        .launch();
-
         final AlertDialog alertDialog = new AlertDialog.Builder(context)
                 .setPositiveButton(R.string.accessibility_tutorial_dialog_button,
                         actionButtonListener)
diff --git a/src/com/android/settings/accessibility/AccessibilitySettings.java b/src/com/android/settings/accessibility/AccessibilitySettings.java
index f94be10..16414f8 100644
--- a/src/com/android/settings/accessibility/AccessibilitySettings.java
+++ b/src/com/android/settings/accessibility/AccessibilitySettings.java
@@ -251,69 +251,29 @@
             return context.getText(R.string.accessibility_summary_state_stopped);
         }
 
+        final CharSequence serviceState;
         final int fragmentType = AccessibilityUtil.getAccessibilityServiceFragmentType(info);
-        final ComponentName componentName = new ComponentName(
-                info.getResolveInfo().serviceInfo.packageName,
-                info.getResolveInfo().serviceInfo.name);
-        final boolean shortcutEnabled = AccessibilityUtil.getUserShortcutTypesFromSettings(
-                context, componentName) != AccessibilityUtil.UserShortcutType.EMPTY;
-
-        // Example shortcutState: "Shortcut on"
-        CharSequence shortcutState = shortcutEnabled
-                ? context.getText(R.string.accessibility_summary_shortcut_enabled)
-                : context.getText(R.string.generic_accessibility_feature_shortcut_off);
-
-        // Example serviceSummary: "Control device via large menu"
-        final CharSequence serviceSummary = info.loadSummary(context.getPackageManager());
-
         if (fragmentType == AccessibilityServiceFragmentType.INVISIBLE_TOGGLE) {
-            // Example result: "Shortcut on / Control device via large menu"
-            return TextUtils.isEmpty(serviceSummary)
-                    ? shortcutState
-                    : context.getString(
-                            R.string.preference_summary_default_combination, shortcutState,
-                            serviceSummary);
+            final ComponentName componentName = new ComponentName(
+                    info.getResolveInfo().serviceInfo.packageName,
+                    info.getResolveInfo().serviceInfo.name);
+            final boolean shortcutEnabled = AccessibilityUtil.getUserShortcutTypesFromSettings(
+                    context, componentName) != AccessibilityUtil.UserShortcutType.EMPTY;
+            serviceState = shortcutEnabled
+                    ? context.getText(R.string.accessibility_summary_shortcut_enabled)
+                    : context.getText(R.string.generic_accessibility_feature_shortcut_off);
         } else {
-            // Example serviceState: "Service on"
-            CharSequence serviceState = serviceEnabled
+            serviceState = serviceEnabled
                     ? context.getText(R.string.generic_accessibility_service_on)
                     : context.getText(R.string.generic_accessibility_service_off);
-
-            // Example result: "Service on / Shortcut on / Speak items on screen"
-            return TextUtils.isEmpty(serviceSummary)
-                    ? context.getString(
-                            R.string.preference_summary_default_combination,
-                            serviceState, shortcutState)
-                    : context.getString(
-                            R.string.accessibility_feature_full_state_summary, serviceState,
-                            shortcutState, serviceSummary);
         }
-    }
 
-    /**
-     * Returns the summary for the current shortcut state of the accessibility app
-     * captured in the {@link AccessibilityShortcutInfo}
-     */
-    public static CharSequence getA11yShortcutInfoPreferenceSummary(
-            Context context, AccessibilityShortcutInfo info) {
-
-        boolean shortcutEnabled = AccessibilityUtil.getUserShortcutTypesFromSettings(
-                context, info.getComponentName()) != AccessibilityUtil.UserShortcutType.EMPTY;
-
-        // Example shortcutState: "Shortcut on"
-        CharSequence shortcutState = shortcutEnabled
-                ? context.getText(R.string.accessibility_summary_shortcut_enabled)
-                : context.getText(R.string.generic_accessibility_feature_shortcut_off);
-
-        // Example serviceSummary: "Convert speech to text"
-        CharSequence serviceSummary = info.loadSummary(context.getPackageManager());
-
-        // Example result: "Shortcut on / Convert speech to text"
-        return TextUtils.isEmpty(serviceSummary)
-                ? shortcutState
-                : context.getString(
+        final CharSequence serviceSummary = info.loadSummary(context.getPackageManager());
+        final String stateSummaryCombo = context.getString(
                 R.string.preference_summary_default_combination,
-                shortcutState, serviceSummary);
+                serviceState, serviceSummary);
+
+        return TextUtils.isEmpty(serviceSummary) ? serviceState : stateSummaryCombo;
     }
 
     /**
diff --git a/src/com/android/settings/accessibility/AccessibilityUtil.java b/src/com/android/settings/accessibility/AccessibilityUtil.java
index 16b74ea3..36c99f1 100644
--- a/src/com/android/settings/accessibility/AccessibilityUtil.java
+++ b/src/com/android/settings/accessibility/AccessibilityUtil.java
@@ -40,8 +40,6 @@
 import androidx.annotation.StringRes;
 import androidx.annotation.VisibleForTesting;
 
-import com.android.settings.R;
-
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 import java.util.StringJoiner;
@@ -291,41 +289,6 @@
     }
 
     /**
-     * Returns the full status with a feature summary.
-     * For example, "$(feature on) / Shortcut on / Speak items on screen".
-     *
-     * @param context           The current context.
-     * @param componentName     The component name in Settings to query
-     *                          if the shortcut turned on.
-     * @param settingsSecureKey One of the key defined in
-     *                          {@link Settings.Secure}.
-     * @param featureOnTextId   The string resource id representing the feature is turned on.
-     * @param featureOffTextId  The string resource id representing the feature is turned off.
-     * @param featureSummaryId  The string resource id of the feature summary.
-     */
-    static CharSequence getFeatureFullStateSummary(
-            Context context, @NonNull ComponentName componentName,
-            String settingsSecureKey,
-            @StringRes int featureOnTextId, @StringRes int featureOffTextId,
-            @StringRes int featureSummaryId) {
-        boolean shortcutEnabled = getUserShortcutTypesFromSettings(context, componentName)
-                != AccessibilityUtil.UserShortcutType.EMPTY;
-        boolean featureEnabled = Settings.Secure.getInt(context.getContentResolver(),
-                settingsSecureKey, AccessibilityUtil.State.OFF) == AccessibilityUtil.State.ON;
-
-        return context.getString(
-                R.string.accessibility_feature_full_state_summary,
-                featureEnabled
-                        ? context.getString(featureOnTextId)
-                        : context.getString(featureOffTextId),
-                shortcutEnabled
-                        ? context.getString(R.string.accessibility_summary_shortcut_enabled)
-                        : context.getString(R.string.generic_accessibility_feature_shortcut_off),
-                context.getString(featureSummaryId)
-        );
-    }
-
-    /**
      * Returns if component name existed in one of {@code shortcutTypes} string in Settings.
      *
      * @param context The current context.
diff --git a/src/com/android/settings/accessibility/ColorInversionPreferenceController.java b/src/com/android/settings/accessibility/ColorInversionPreferenceController.java
index 83a7edd..5b20714 100644
--- a/src/com/android/settings/accessibility/ColorInversionPreferenceController.java
+++ b/src/com/android/settings/accessibility/ColorInversionPreferenceController.java
@@ -16,8 +16,6 @@
 
 package com.android.settings.accessibility;
 
-import static com.android.internal.accessibility.AccessibilityShortcutController.COLOR_INVERSION_COMPONENT_NAME;
-
 import android.content.Context;
 import android.provider.Settings;
 
@@ -36,11 +34,10 @@
 
     @Override
     public CharSequence getSummary() {
-        return AccessibilityUtil.getFeatureFullStateSummary(
-                mContext, COLOR_INVERSION_COMPONENT_NAME,
+        return AccessibilityUtil.getSummary(
+                mContext,
                 DISPLAY_INVERSION_ENABLED,
-                R.string.color_inversion_state_on, R.string.color_inversion_state_off,
-                R.string.color_inversion_feature_summary);
+                R.string.color_inversion_state_on, R.string.color_inversion_state_off);
     }
 
     @Override
diff --git a/src/com/android/settings/accessibility/DaltonizerPreferenceController.java b/src/com/android/settings/accessibility/DaltonizerPreferenceController.java
index 14206d5..f89cb54 100644
--- a/src/com/android/settings/accessibility/DaltonizerPreferenceController.java
+++ b/src/com/android/settings/accessibility/DaltonizerPreferenceController.java
@@ -16,8 +16,6 @@
 
 package com.android.settings.accessibility;
 
-import static com.android.internal.accessibility.AccessibilityShortcutController.DALTONIZER_COMPONENT_NAME;
-
 import android.content.Context;
 import android.provider.Settings;
 
@@ -40,10 +38,9 @@
 
     @Override
     public CharSequence getSummary() {
-        return AccessibilityUtil.getFeatureFullStateSummary(
-                mContext, DALTONIZER_COMPONENT_NAME,
+        return AccessibilityUtil.getSummary(
+                mContext,
                 DALTONIZER_ENABLED,
-                R.string.daltonizer_state_on, R.string.daltonizer_state_off,
-                R.string.daltonizer_feature_summary);
+                R.string.daltonizer_state_on, R.string.daltonizer_state_off);
     }
 }
diff --git a/src/com/android/settings/accessibility/LiveCaptionPreferenceController.java b/src/com/android/settings/accessibility/LiveCaptionPreferenceController.java
index 5067b56..2d12f67 100644
--- a/src/com/android/settings/accessibility/LiveCaptionPreferenceController.java
+++ b/src/com/android/settings/accessibility/LiveCaptionPreferenceController.java
@@ -20,12 +20,10 @@
 import android.content.Intent;
 import android.content.pm.PackageManager;
 import android.content.pm.ResolveInfo;
-import android.provider.Settings;
 
 import androidx.annotation.VisibleForTesting;
 import androidx.preference.Preference;
 
-import com.android.settings.R;
 import com.android.settings.core.BasePreferenceController;
 
 import java.util.List;
@@ -56,16 +54,5 @@
     public void updateState(Preference preference) {
         super.updateState(preference);
         preference.setIntent(LIVE_CAPTION_INTENT);
-        boolean enabled = Settings.Secure.getInt(
-                mContext.getContentResolver(),
-                Settings.Secure.ODI_CAPTIONS_ENABLED, AccessibilityUtil.State.OFF)
-                == AccessibilityUtil.State.ON;
-        CharSequence serviceState = mContext.getText(enabled
-                ? R.string.live_caption_enabled : R.string.live_caption_disabled);
-
-        preference.setSummary(
-                mContext.getString(
-                        R.string.preference_summary_default_combination,
-                        serviceState, mContext.getText(R.string.live_caption_summary)));
     }
 }
\ No newline at end of file
diff --git a/src/com/android/settings/accessibility/OneHandedPreferenceController.java b/src/com/android/settings/accessibility/OneHandedPreferenceController.java
deleted file mode 100644
index a71f777..0000000
--- a/src/com/android/settings/accessibility/OneHandedPreferenceController.java
+++ /dev/null
@@ -1,44 +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.accessibility;
-
-import android.content.Context;
-
-import com.android.settings.R;
-import com.android.settings.gestures.OneHandedEnablePreferenceController;
-import com.android.settings.gestures.OneHandedSettingsUtils;
-
-/**
- * OneHandedPreferenceController is the same as {@link OneHandedEnablePreferenceController} excepts
- * that the summary shown on the preference item would include the short description of One-handed
- * mode, so that the UI representation is consistent with other items on Accessibility Settings
- */
-public final class OneHandedPreferenceController extends OneHandedEnablePreferenceController {
-
-    public OneHandedPreferenceController(Context context, String preferenceKey) {
-        super(context, preferenceKey);
-    }
-
-    @Override
-    public CharSequence getSummary() {
-        return mContext.getString(
-                R.string.preference_summary_default_combination,
-                mContext.getText(OneHandedSettingsUtils.isOneHandedModeEnabled(mContext)
-                        ? R.string.gesture_setting_on : R.string.gesture_setting_off),
-                mContext.getText(R.string.one_handed_mode_intro_text));
-    }
-}
diff --git a/src/com/android/settings/accessibility/RestrictedPreferenceHelper.java b/src/com/android/settings/accessibility/RestrictedPreferenceHelper.java
index 17d2ac7..dfa2f33 100644
--- a/src/com/android/settings/accessibility/RestrictedPreferenceHelper.java
+++ b/src/com/android/settings/accessibility/RestrictedPreferenceHelper.java
@@ -159,8 +159,7 @@
 
             final String key = componentName.flattenToString();
             final CharSequence title = activityInfo.loadLabel(mPm);
-            final CharSequence summary =
-                    AccessibilitySettings.getA11yShortcutInfoPreferenceSummary(mContext, info);
+            final String summary = info.loadSummary(mPm);
             final String fragment =
                     LaunchAccessibilityActivityPreferenceFragment.class.getName();
 
diff --git a/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragment.java b/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragment.java
index a485b49..b096467 100644
--- a/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragment.java
+++ b/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragment.java
@@ -762,12 +762,9 @@
      */
     public static CharSequence getServiceSummary(Context context) {
         // Get the user shortcut type from settings provider.
-        int shortcutType = getUserShortcutTypeFromSettings(context);
-        return context.getString(
-                R.string.preference_summary_default_combination,
-                shortcutType != AccessibilityUtil.UserShortcutType.EMPTY
-                        ? context.getString(R.string.accessibility_summary_shortcut_enabled)
-                        : context.getString(R.string.generic_accessibility_feature_shortcut_off),
-                context.getText(R.string.magnification_feature_summary));
+        final int uerShortcutType = getUserShortcutTypeFromSettings(context);
+        return (uerShortcutType != AccessibilityUtil.UserShortcutType.EMPTY)
+                ? context.getText(R.string.accessibility_summary_shortcut_enabled)
+                : context.getText(R.string.generic_accessibility_feature_shortcut_off);
     }
 }
diff --git a/src/com/android/settings/applications/appcompat/RadioWithImagePreference.java b/src/com/android/settings/applications/appcompat/RadioWithImagePreference.java
new file mode 100644
index 0000000..77cd86c
--- /dev/null
+++ b/src/com/android/settings/applications/appcompat/RadioWithImagePreference.java
@@ -0,0 +1,134 @@
+/*
+ * 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.applications.appcompat;
+
+import android.content.Context;
+import android.text.TextUtils;
+import android.util.AttributeSet;
+import android.view.View;
+
+import androidx.preference.CheckBoxPreference;
+import androidx.preference.PreferenceViewHolder;
+
+import com.android.settings.R;
+
+/**
+ * Radio button preference with image at the bottom.
+ *
+ * <p>Layout should stay the same as
+ * {@link com.android.settingslib.widget.SelectorWithWidgetPreference} for consistency.
+ */
+public class RadioWithImagePreference extends CheckBoxPreference {
+
+    /**
+     * Interface definition for a callback to be invoked when the preference is clicked.
+     */
+    public interface OnClickListener {
+        /**
+         * Called when a preference has been clicked.
+         *
+         * @param emiter The clicked preference
+         */
+        void onRadioButtonClicked(RadioWithImagePreference emiter);
+    }
+
+    private OnClickListener mListener = null;
+
+    /**
+     * Performs inflation from XML and apply a class-specific base style.
+     *
+     * @param context  The {@link Context} this is associated with, through which it can
+     *                 access the current theme, resources, {@link SharedPreferences}, etc.
+     * @param attrs    The attributes of the XML tag that is inflating the preference
+     * @param defStyle An attribute in the current theme that contains a reference to a style
+     *                 resource that supplies default values for the view. Can be 0 to not
+     *                 look for defaults.
+     */
+    public RadioWithImagePreference(Context context, AttributeSet attrs, int defStyle) {
+        super(context, attrs, defStyle);
+        init();
+    }
+
+    /**
+     * Performs inflation from XML and apply a class-specific base style.
+     *
+     * @param context The {@link Context} this is associated with, through which it can
+     *                access the current theme, resources, {@link SharedPreferences}, etc.
+     * @param attrs   The attributes of the XML tag that is inflating the preference
+     */
+    public RadioWithImagePreference(Context context, AttributeSet attrs) {
+        super(context, attrs);
+        init();
+    }
+
+    /**
+     * Constructor to create a preference.
+     *
+     * @param context The Context this is associated with.
+     */
+    public RadioWithImagePreference(Context context) {
+        this(context, null);
+    }
+
+    /**
+     * Sets the callback to be invoked when this preference is clicked by the user.
+     *
+     * @param listener The callback to be invoked
+     */
+    public void setOnClickListener(OnClickListener listener) {
+        mListener = listener;
+    }
+
+    /**
+     * Processes a click on the preference.
+     */
+    @Override
+    public void onClick() {
+        if (mListener != null) {
+            mListener.onRadioButtonClicked(this);
+        }
+    }
+
+    /**
+     * Binds the created View to the data for this preference.
+     *
+     * <p>This is a good place to grab references to custom Views in the layout and set
+     * properties on them.
+     *
+     * <p>Make sure to call through to the superclass's implementation.
+     *
+     * @param holder The ViewHolder that provides references to the views to fill in. These views
+     *               will be recycled, so you should not hold a reference to them after this method
+     *               returns.
+     */
+    @Override
+    public void onBindViewHolder(PreferenceViewHolder holder) {
+        super.onBindViewHolder(holder);
+
+        View summaryContainer = holder.findViewById(R.id.summary_container);
+        if (summaryContainer != null) {
+            summaryContainer.setVisibility(
+                    TextUtils.isEmpty(getSummary()) ? View.GONE : View.VISIBLE);
+        }
+    }
+
+    private void init() {
+        setWidgetLayoutResource(com.android.settingslib.R.layout.preference_widget_radiobutton);
+        setLayoutResource(R.layout.radio_with_image_preference);
+        setIconSpaceReserved(false);
+    }
+}
diff --git a/src/com/android/settings/applications/appcompat/UserAspectRatioDetails.java b/src/com/android/settings/applications/appcompat/UserAspectRatioDetails.java
index f8406f9..e01f28a 100644
--- a/src/com/android/settings/applications/appcompat/UserAspectRatioDetails.java
+++ b/src/com/android/settings/applications/appcompat/UserAspectRatioDetails.java
@@ -42,7 +42,6 @@
 import com.android.settings.R;
 import com.android.settings.applications.AppInfoWithHeader;
 import com.android.settingslib.widget.ActionButtonsPreference;
-import com.android.settingslib.widget.SelectorWithWidgetPreference;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -51,7 +50,7 @@
  * App specific activity to show aspect ratio overrides
  */
 public class UserAspectRatioDetails extends AppInfoWithHeader implements
-        SelectorWithWidgetPreference.OnClickListener {
+        RadioWithImagePreference.OnClickListener {
     private static final String TAG = UserAspectRatioDetails.class.getSimpleName();
 
     private static final String KEY_HEADER_BUTTONS = "header_view";
@@ -65,7 +64,7 @@
     @VisibleForTesting
     static final String KEY_PREF_3_2 = "3_2_pref";
 
-    private final List<SelectorWithWidgetPreference> mAspectRatioPreferences = new ArrayList<>();
+    private final List<RadioWithImagePreference> mAspectRatioPreferences = new ArrayList<>();
 
     @NonNull private UserAspectRatioManager mUserAspectRatioManager;
     @NonNull private String mSelectedKey = KEY_PREF_DEFAULT;
@@ -87,7 +86,7 @@
     }
 
     @Override
-    public void onRadioButtonClicked(@NonNull SelectorWithWidgetPreference selected) {
+    public void onRadioButtonClicked(@NonNull RadioWithImagePreference selected) {
         final String selectedKey = selected.getKey();
         if (mSelectedKey.equals(selectedKey)) {
             return;
@@ -198,7 +197,7 @@
 
     private void addPreference(@NonNull String key,
             @PackageManager.UserMinAspectRatio int aspectRatio) {
-        final SelectorWithWidgetPreference pref = findPreference(key);
+        final RadioWithImagePreference pref = findPreference(key);
         if (pref == null) {
             return;
         }
@@ -212,7 +211,7 @@
     }
 
     private void updateAllPreferences(@NonNull String selectedKey) {
-        for (SelectorWithWidgetPreference pref : mAspectRatioPreferences) {
+        for (RadioWithImagePreference pref : mAspectRatioPreferences) {
             pref.setChecked(selectedKey.equals(pref.getKey()));
         }
     }
diff --git a/src/com/android/settings/biometrics/combination/BiometricsSettingsBase.java b/src/com/android/settings/biometrics/combination/BiometricsSettingsBase.java
index 587a0b2..d8d3484 100644
--- a/src/com/android/settings/biometrics/combination/BiometricsSettingsBase.java
+++ b/src/com/android/settings/biometrics/combination/BiometricsSettingsBase.java
@@ -21,6 +21,7 @@
 
 import static com.android.settings.password.ChooseLockPattern.RESULT_FINISHED;
 
+import android.app.Activity;
 import android.content.Context;
 import android.content.Intent;
 import android.hardware.biometrics.SensorProperties;
@@ -179,6 +180,12 @@
             }
 
             mFaceManager.generateChallenge(mUserId, (sensorId, userId, challenge) -> {
+                final Activity activity = getActivity();
+                if (activity == null || activity.isFinishing()) {
+                    Log.e(getLogTag(), "Stop during generating face unlock challenge"
+                            + " because activity is null or finishing");
+                    return;
+                }
                 try {
                     final byte[] token = requestGatekeeperHat(context, mGkPwHandle, mUserId,
                             challenge);
@@ -215,6 +222,12 @@
             }
 
             mFingerprintManager.generateChallenge(mUserId, (sensorId, userId, challenge) -> {
+                final Activity activity = getActivity();
+                if (activity == null || activity.isFinishing()) {
+                    Log.e(getLogTag(), "Stop during generating fingerprint challenge"
+                            + " because activity is null or finishing");
+                    return;
+                }
                 try {
                     final byte[] token = requestGatekeeperHat(context, mGkPwHandle, mUserId,
                             challenge);
diff --git a/src/com/android/settings/biometrics2/ui/view/FingerprintEnrollmentActivity.kt b/src/com/android/settings/biometrics2/ui/view/FingerprintEnrollmentActivity.kt
index 012978d..ec96597 100644
--- a/src/com/android/settings/biometrics2/ui/view/FingerprintEnrollmentActivity.kt
+++ b/src/com/android/settings/biometrics2/ui/view/FingerprintEnrollmentActivity.kt
@@ -126,21 +126,21 @@
 
     private var isFirstFragmentAdded = false
 
-    private val findSensorActionObserver: Observer<Int> = Observer<Int> { action ->
+    private val findSensorActionObserver = Observer<Int?> { action ->
         if (DEBUG) {
             Log.d(TAG, "findSensorActionObserver($action)")
         }
         action?.let { onFindSensorAction(it) }
     }
 
-    private val enrollingActionObserver: Observer<Int> = Observer<Int> { action ->
+    private val enrollingActionObserver = Observer<Int?> { action ->
         if (DEBUG) {
             Log.d(TAG, "enrollingActionObserver($action)")
         }
         action?.let { onEnrollingAction(it) }
     }
 
-    private val finishActionObserver: Observer<Int> = Observer<Int> { action ->
+    private val finishActionObserver = Observer<Int?> { action ->
         if (DEBUG) {
             Log.d(TAG, "finishActionObserver($action)")
         }
diff --git a/src/com/android/settings/biometrics2/ui/viewmodel/AutoCredentialViewModel.kt b/src/com/android/settings/biometrics2/ui/viewmodel/AutoCredentialViewModel.kt
index 3fd4d51..95aee4b 100644
--- a/src/com/android/settings/biometrics2/ui/viewmodel/AutoCredentialViewModel.kt
+++ b/src/com/android/settings/biometrics2/ui/viewmodel/AutoCredentialViewModel.kt
@@ -64,11 +64,8 @@
      */
     interface ChallengeGenerator {
 
-        /** Get callback that will be called later after challenge generated */
-        fun getCallback(): GenerateChallengeCallback?
-
-        /** Set callback that will be called later after challenge generated */
-        fun setCallback(callback: GenerateChallengeCallback?)
+        /** Callback that will be called later after challenge generated */
+        var callback: GenerateChallengeCallback?
 
         /** Method for generating challenge from FingerprintManager or FaceManager */
         fun generateChallenge(userId: Int)
@@ -79,30 +76,16 @@
         private val fingerprintRepository: FingerprintRepository
     ) : ChallengeGenerator {
 
-        private var mCallback: GenerateChallengeCallback? = null
-
-        override fun getCallback(): GenerateChallengeCallback? {
-            return mCallback
-        }
-
-        override fun setCallback(callback: GenerateChallengeCallback?) {
-            mCallback = callback
-        }
+        override var callback: GenerateChallengeCallback? = null
 
         override fun generateChallenge(userId: Int) {
-            val callback = mCallback
-            if (callback == null) {
+            callback?.let {
+                fingerprintRepository.generateChallenge(userId) {
+                        sensorId: Int, uid: Int, challenge: Long ->
+                    it.onChallengeGenerated(sensorId, uid, challenge)
+                }
+            } ?:run {
                 Log.e(TAG, "generateChallenge, null callback")
-                return
-            }
-
-            fingerprintRepository.generateChallenge(userId) {
-                sensorId: Int, uid: Int, challenge: Long ->
-                callback.onChallengeGenerated(
-                    sensorId,
-                    uid,
-                    challenge
-                )
             }
         }
 
@@ -160,7 +143,7 @@
         revokeGkPwHandle: Boolean,
         scope: CoroutineScope
     ) {
-        challengeGenerator.setCallback(object : GenerateChallengeCallback {
+        challengeGenerator.callback = object : GenerateChallengeCallback {
             override fun onChallengeGenerated(sensorId: Int, userId: Int, challenge: Long) {
                 var illegalStateExceptionCaught = false
                 try {
@@ -188,7 +171,7 @@
                     }
                 }
             }
-        })
+        }
         challengeGenerator.generateChallenge(userId)
     }
 
diff --git a/src/com/android/settings/bluetooth/BluetoothDetailsAudioDeviceTypeController.java b/src/com/android/settings/bluetooth/BluetoothDetailsAudioDeviceTypeController.java
new file mode 100644
index 0000000..ba5f465
--- /dev/null
+++ b/src/com/android/settings/bluetooth/BluetoothDetailsAudioDeviceTypeController.java
@@ -0,0 +1,180 @@
+/*
+ * Copyright (C) 2022 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.bluetooth;
+
+import static android.bluetooth.BluetoothDevice.DEVICE_TYPE_LE;
+import static android.media.AudioManager.AUDIO_DEVICE_CATEGORY_CARKIT;
+import static android.media.AudioManager.AUDIO_DEVICE_CATEGORY_HEADPHONES;
+import static android.media.AudioManager.AUDIO_DEVICE_CATEGORY_OTHER;
+import static android.media.AudioManager.AUDIO_DEVICE_CATEGORY_SPEAKER;
+import static android.media.AudioManager.AUDIO_DEVICE_CATEGORY_UNKNOWN;
+
+import android.content.Context;
+import android.media.AudioManager;
+import android.media.AudioManager.AudioDeviceCategory;
+import android.util.Log;
+
+import androidx.annotation.VisibleForTesting;
+import androidx.preference.ListPreference;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceCategory;
+import androidx.preference.PreferenceFragmentCompat;
+import androidx.preference.PreferenceScreen;
+
+import com.android.settings.R;
+import com.android.settingslib.bluetooth.A2dpProfile;
+import com.android.settingslib.bluetooth.CachedBluetoothDevice;
+import com.android.settingslib.bluetooth.LeAudioProfile;
+import com.android.settingslib.bluetooth.LocalBluetoothManager;
+import com.android.settingslib.bluetooth.LocalBluetoothProfileManager;
+import com.android.settingslib.core.lifecycle.Lifecycle;
+
+/**
+ * Controller responsible for the bluetooth audio device type selection
+ */
+public class BluetoothDetailsAudioDeviceTypeController extends BluetoothDetailsController
+        implements Preference.OnPreferenceChangeListener {
+    private static final String TAG = "BluetoothDetailsAudioDeviceTypeController";
+
+    private static final boolean DEBUG = false;
+
+    private static final String KEY_BT_AUDIO_DEVICE_TYPE_GROUP =
+            "bluetooth_audio_device_type_group";
+    private static final String KEY_BT_AUDIO_DEVICE_TYPE = "bluetooth_audio_device_type";
+
+    private final AudioManager mAudioManager;
+
+    private ListPreference mAudioDeviceTypePreference;
+
+    private final LocalBluetoothProfileManager mProfileManager;
+
+    @VisibleForTesting
+    PreferenceCategory mProfilesContainer;
+
+    public BluetoothDetailsAudioDeviceTypeController(
+            Context context,
+            PreferenceFragmentCompat fragment,
+            LocalBluetoothManager manager,
+            CachedBluetoothDevice device,
+            Lifecycle lifecycle) {
+        super(context, fragment, device, lifecycle);
+        mAudioManager = context.getSystemService(AudioManager.class);
+        mProfileManager = manager.getProfileManager();
+    }
+
+    @Override
+    public boolean isAvailable() {
+        // Available only for A2DP and BLE devices.
+        A2dpProfile a2dpProfile = mProfileManager.getA2dpProfile();
+        boolean a2dpProfileEnabled = false;
+        if (a2dpProfile != null) {
+            a2dpProfileEnabled = a2dpProfile.isEnabled(mCachedDevice.getDevice());
+        }
+
+        LeAudioProfile leAudioProfile = mProfileManager.getLeAudioProfile();
+        boolean leAudioProfileEnabled = false;
+        if (leAudioProfile != null) {
+            leAudioProfileEnabled = leAudioProfile.isEnabled(mCachedDevice.getDevice());
+        }
+
+        return a2dpProfileEnabled || leAudioProfileEnabled;
+    }
+
+    @Override
+    public boolean onPreferenceChange(Preference preference, Object newValue) {
+        if (preference instanceof ListPreference) {
+            final ListPreference pref = (ListPreference) preference;
+            final String key = pref.getKey();
+            if (key.equals(KEY_BT_AUDIO_DEVICE_TYPE)) {
+                if (newValue instanceof String) {
+                    final String value = (String) newValue;
+                    final int index = pref.findIndexOfValue(value);
+                    if (index >= 0) {
+                        pref.setSummary(pref.getEntries()[index]);
+                        mAudioManager.setBluetoothAudioDeviceCategory(mCachedDevice.getAddress(),
+                                mCachedDevice.getDevice().getType() == DEVICE_TYPE_LE,
+                                Integer.parseInt(value));
+                    }
+                }
+                return true;
+            }
+        }
+
+        return false;
+    }
+
+    @Override
+    public String getPreferenceKey() {
+        return KEY_BT_AUDIO_DEVICE_TYPE_GROUP;
+    }
+
+    @Override
+    protected void init(PreferenceScreen screen) {
+        mProfilesContainer = screen.findPreference(getPreferenceKey());
+        refresh();
+    }
+
+    @Override
+    protected void refresh() {
+        mAudioDeviceTypePreference = mProfilesContainer.findPreference(
+                KEY_BT_AUDIO_DEVICE_TYPE);
+        if (mAudioDeviceTypePreference == null) {
+            createAudioDeviceTypePreference(mProfilesContainer.getContext());
+            mProfilesContainer.addPreference(mAudioDeviceTypePreference);
+        }
+    }
+
+    @VisibleForTesting
+    void createAudioDeviceTypePreference(Context context) {
+        mAudioDeviceTypePreference = new ListPreference(context);
+        mAudioDeviceTypePreference.setKey(KEY_BT_AUDIO_DEVICE_TYPE);
+        mAudioDeviceTypePreference.setTitle(
+                mContext.getString(R.string.bluetooth_details_audio_device_types_title));
+        mAudioDeviceTypePreference.setEntries(new CharSequence[]{
+                mContext.getString(R.string.bluetooth_details_audio_device_type_unknown),
+                mContext.getString(R.string.bluetooth_details_audio_device_type_speaker),
+                mContext.getString(R.string.bluetooth_details_audio_device_type_headphones),
+                mContext.getString(R.string.bluetooth_details_audio_device_type_carkit),
+                mContext.getString(R.string.bluetooth_details_audio_device_type_other),
+        });
+        mAudioDeviceTypePreference.setEntryValues(new CharSequence[]{
+                Integer.toString(AUDIO_DEVICE_CATEGORY_UNKNOWN),
+                Integer.toString(AUDIO_DEVICE_CATEGORY_SPEAKER),
+                Integer.toString(AUDIO_DEVICE_CATEGORY_HEADPHONES),
+                Integer.toString(AUDIO_DEVICE_CATEGORY_CARKIT),
+                Integer.toString(AUDIO_DEVICE_CATEGORY_OTHER),
+        });
+
+        @AudioDeviceCategory final int deviceCategory =
+                mAudioManager.getBluetoothAudioDeviceCategory(mCachedDevice.getAddress(),
+                        mCachedDevice.getDevice().getType() == DEVICE_TYPE_LE);
+        if (DEBUG) {
+            Log.v(TAG, "getBluetoothAudioDeviceCategory() device: "
+                    + mCachedDevice.getDevice().getAnonymizedAddress()
+                    + ", has audio device category: " + deviceCategory);
+        }
+        mAudioDeviceTypePreference.setValue(Integer.toString(deviceCategory));
+
+        mAudioDeviceTypePreference.setSummary(mAudioDeviceTypePreference.getEntry());
+        mAudioDeviceTypePreference.setOnPreferenceChangeListener(this);
+    }
+
+    @VisibleForTesting
+    ListPreference getAudioDeviceTypePreference() {
+        return mAudioDeviceTypePreference;
+    }
+}
diff --git a/src/com/android/settings/bluetooth/BluetoothDetailsMacAddressController.java b/src/com/android/settings/bluetooth/BluetoothDetailsMacAddressController.java
index d80512e..9943013 100644
--- a/src/com/android/settings/bluetooth/BluetoothDetailsMacAddressController.java
+++ b/src/com/android/settings/bluetooth/BluetoothDetailsMacAddressController.java
@@ -59,6 +59,12 @@
                 title.append("\n").append(member.getIdentityAddress());
             }
             mFooterPreference.setTitle(title);
+        } else if (mCachedDevice.getSubDevice() != null) {
+            StringBuilder title = new StringBuilder(mContext.getString(
+                    R.string.bluetooth_multuple_devices_mac_address,
+                    mCachedDevice.getIdentityAddress()));
+            title.append("\n").append(mCachedDevice.getSubDevice().getIdentityAddress());
+            mFooterPreference.setTitle(title);
         } else {
             mFooterPreference.setTitle(mContext.getString(
                     R.string.bluetooth_device_mac_address, mCachedDevice.getIdentityAddress()));
diff --git a/src/com/android/settings/bluetooth/BluetoothDetailsProfilesController.java b/src/com/android/settings/bluetooth/BluetoothDetailsProfilesController.java
index 1fd09a3..555868b 100644
--- a/src/com/android/settings/bluetooth/BluetoothDetailsProfilesController.java
+++ b/src/com/android/settings/bluetooth/BluetoothDetailsProfilesController.java
@@ -156,6 +156,7 @@
         } else if (profile instanceof PbapServerProfile) {
             profilePref.setChecked(device.getPhonebookAccessPermission()
                     == BluetoothDevice.ACCESS_ALLOWED);
+            profilePref.setSummary(profile.getSummaryResourceForDevice(mCachedDevice.getDevice()));
         } else if (profile instanceof PanProfile) {
             profilePref.setChecked(profile.getConnectionStatus(device) ==
                     BluetoothProfile.STATE_CONNECTED);
diff --git a/src/com/android/settings/bluetooth/BluetoothDeviceDetailsFragment.java b/src/com/android/settings/bluetooth/BluetoothDeviceDetailsFragment.java
index 534cc61..f9afa5b 100644
--- a/src/com/android/settings/bluetooth/BluetoothDeviceDetailsFragment.java
+++ b/src/com/android/settings/bluetooth/BluetoothDeviceDetailsFragment.java
@@ -300,6 +300,8 @@
                     lifecycle));
             controllers.add(new BluetoothDetailsCompanionAppsController(context, this,
                     mCachedDevice, lifecycle));
+            controllers.add(new BluetoothDetailsAudioDeviceTypeController(context, this, mManager,
+                    mCachedDevice, lifecycle));
             controllers.add(new BluetoothDetailsSpatialAudioController(context, this, mCachedDevice,
                     lifecycle));
             controllers.add(new BluetoothDetailsProfilesController(context, this, mManager,
diff --git a/src/com/android/settings/bluetooth/BluetoothPairingDialogFragment.java b/src/com/android/settings/bluetooth/BluetoothPairingDialogFragment.java
index 8df4666..a3f9bd4 100644
--- a/src/com/android/settings/bluetooth/BluetoothPairingDialogFragment.java
+++ b/src/com/android/settings/bluetooth/BluetoothPairingDialogFragment.java
@@ -33,6 +33,7 @@
 import android.widget.Button;
 import android.widget.CheckBox;
 import android.widget.EditText;
+import android.widget.Switch;
 import android.widget.TextView;
 
 import androidx.annotation.VisibleForTesting;
@@ -341,11 +342,9 @@
         TextView pairingViewCaption = (TextView) view.findViewById(R.id.pairing_caption);
         TextView pairingViewContent = (TextView) view.findViewById(R.id.pairing_subhead);
         TextView messagePairing = (TextView) view.findViewById(R.id.pairing_code_message);
-        CheckBox contactSharing = (CheckBox) view.findViewById(
+        Switch contactSharing = (Switch) view.findViewById(
                 R.id.phonebook_sharing_message_confirm_pin);
-        contactSharing.setText(getString(R.string.bluetooth_pairing_shares_phonebook));
-
-        contactSharing.setVisibility(
+        view.findViewById(R.id.phonebook_sharing).setVisibility(
                 mPairingController.isContactSharingVisible() ? View.VISIBLE : View.GONE);
         mPairingController.setContactSharingState();
         contactSharing.setChecked(mPairingController.getContactSharingState());
diff --git a/src/com/android/settings/connecteddevice/stylus/StylusDevicesController.java b/src/com/android/settings/connecteddevice/stylus/StylusDevicesController.java
index 0a0e208..985c8b7 100644
--- a/src/com/android/settings/connecteddevice/stylus/StylusDevicesController.java
+++ b/src/com/android/settings/connecteddevice/stylus/StylusDevicesController.java
@@ -45,6 +45,7 @@
 import com.android.settings.R;
 import com.android.settings.dashboard.profileselector.ProfileSelectDialog;
 import com.android.settings.dashboard.profileselector.UserAdapter;
+import com.android.settingslib.PrimarySwitchPreference;
 import com.android.settingslib.bluetooth.BluetoothUtils;
 import com.android.settingslib.bluetooth.CachedBluetoothDevice;
 import com.android.settingslib.core.AbstractPreferenceController;
@@ -59,7 +60,8 @@
  * This class adds stylus preferences.
  */
 public class StylusDevicesController extends AbstractPreferenceController implements
-        Preference.OnPreferenceClickListener, LifecycleObserver, OnResume {
+        Preference.OnPreferenceClickListener, Preference.OnPreferenceChangeListener,
+        LifecycleObserver, OnResume {
 
     @VisibleForTesting
     static final String KEY_STYLUS = "device_stylus";
@@ -138,11 +140,15 @@
         return pref;
     }
 
-    private SwitchPreference createOrUpdateHandwritingPreference(SwitchPreference preference) {
-        SwitchPreference pref = preference == null ? new SwitchPreference(mContext) : preference;
+    private PrimarySwitchPreference createOrUpdateHandwritingPreference(
+            PrimarySwitchPreference preference) {
+        PrimarySwitchPreference pref = preference == null ? new PrimarySwitchPreference(mContext)
+                : preference;
         pref.setKey(KEY_HANDWRITING);
         pref.setTitle(mContext.getString(R.string.stylus_textfield_handwriting));
         pref.setIcon(R.drawable.ic_text_fields_alt);
+        // Using a two-target preference, clicking will send an intent and change will toggle.
+        pref.setOnPreferenceChangeListener(this);
         pref.setOnPreferenceClickListener(this);
         pref.setChecked(Settings.Secure.getInt(mContext.getContentResolver(),
                 Settings.Secure.STYLUS_HANDWRITING_ENABLED,
@@ -165,7 +171,6 @@
     @Override
     public boolean onPreferenceClick(Preference preference) {
         String key = preference.getKey();
-
         switch (key) {
             case KEY_DEFAULT_NOTES:
                 PackageManager pm = mContext.getPackageManager();
@@ -181,20 +186,13 @@
                 }
                 break;
             case KEY_HANDWRITING:
-                Settings.Secure.putInt(mContext.getContentResolver(),
-                        Settings.Secure.STYLUS_HANDWRITING_ENABLED,
-                        ((SwitchPreference) preference).isChecked() ? 1 : 0);
-
-                if (((SwitchPreference) preference).isChecked()) {
-                    InputMethodManager imm = mContext.getSystemService(InputMethodManager.class);
-                    InputMethodInfo inputMethod = imm.getCurrentInputMethodInfo();
-                    if (inputMethod == null) break;
-
-                    Intent handwritingIntent =
-                            inputMethod.createStylusHandwritingSettingsActivityIntent();
-                    if (handwritingIntent != null) {
-                        mContext.startActivity(handwritingIntent);
-                    }
+                InputMethodManager imm = mContext.getSystemService(InputMethodManager.class);
+                InputMethodInfo inputMethod = imm.getCurrentInputMethodInfo();
+                if (inputMethod == null) break;
+                Intent handwritingIntent =
+                        inputMethod.createStylusHandwritingSettingsActivityIntent();
+                if (handwritingIntent != null) {
+                    mContext.startActivity(handwritingIntent);
                 }
                 break;
             case KEY_IGNORE_BUTTON:
@@ -207,6 +205,19 @@
     }
 
     @Override
+    public boolean onPreferenceChange(Preference preference, Object newValue) {
+        String key = preference.getKey();
+        switch (key) {
+            case KEY_HANDWRITING:
+                Settings.Secure.putInt(mContext.getContentResolver(),
+                        Settings.Secure.STYLUS_HANDWRITING_ENABLED,
+                        (boolean) newValue ? 1 : 0);
+                break;
+        }
+        return true;
+    }
+
+    @Override
     public final void displayPreference(PreferenceScreen screen) {
         mPreferencesContainer = (PreferenceCategory) screen.findPreference(getPreferenceKey());
         super.displayPreference(screen);
@@ -233,7 +244,7 @@
             mPreferencesContainer.addPreference(notesPref);
         }
 
-        SwitchPreference currHandwritingPref = mPreferencesContainer.findPreference(
+        PrimarySwitchPreference currHandwritingPref = mPreferencesContainer.findPreference(
                 KEY_HANDWRITING);
         Preference handwritingPref = createOrUpdateHandwritingPreference(currHandwritingPref);
         if (currHandwritingPref == null) {
@@ -328,5 +339,4 @@
 
         return false;
     }
-
 }
diff --git a/src/com/android/settings/fuelgauge/PowerUsageFeatureProvider.java b/src/com/android/settings/fuelgauge/PowerUsageFeatureProvider.java
index 258ded1..30eabfa 100644
--- a/src/com/android/settings/fuelgauge/PowerUsageFeatureProvider.java
+++ b/src/com/android/settings/fuelgauge/PowerUsageFeatureProvider.java
@@ -22,6 +22,7 @@
 import android.util.ArrayMap;
 import android.util.SparseIntArray;
 
+import com.android.settings.fuelgauge.batteryusage.PowerAnomalyEventList;
 import com.android.settingslib.fuelgauge.Estimate;
 
 import java.util.List;
@@ -147,7 +148,7 @@
     /**
      * Returns {@link Bundle} for settings anomaly detection result
      */
-    Bundle detectSettingsAnomaly(Context context, double displayDrain);
+    PowerAnomalyEventList detectSettingsAnomaly(Context context, double displayDrain);
 
     /**
      * Gets an intent for one time bypass charge limited to resume charging.
diff --git a/src/com/android/settings/fuelgauge/PowerUsageFeatureProviderImpl.java b/src/com/android/settings/fuelgauge/PowerUsageFeatureProviderImpl.java
index 9b5bb5e..127178a 100644
--- a/src/com/android/settings/fuelgauge/PowerUsageFeatureProviderImpl.java
+++ b/src/com/android/settings/fuelgauge/PowerUsageFeatureProviderImpl.java
@@ -21,13 +21,13 @@
 import android.content.Context;
 import android.content.Intent;
 import android.content.pm.PackageManager;
-import android.os.Bundle;
 import android.os.Process;
 import android.util.ArrayMap;
 import android.util.ArraySet;
 import android.util.SparseIntArray;
 
 import com.android.internal.util.ArrayUtils;
+import com.android.settings.fuelgauge.batteryusage.PowerAnomalyEventList;
 import com.android.settingslib.fuelgauge.Estimate;
 
 import java.util.ArrayList;
@@ -82,7 +82,7 @@
 
     @Override
     public boolean isBatteryTipsFeedbackEnabled() {
-        return true;
+        return false;
     }
 
     @Override
@@ -175,7 +175,7 @@
     public void insertSettingsData(Context context, double displayDrain) {}
 
     @Override
-    public Bundle detectSettingsAnomaly(Context context, double displayDrain) {
+    public PowerAnomalyEventList detectSettingsAnomaly(Context context, double displayDrain) {
         return null;
     }
 
diff --git a/src/com/android/settings/fuelgauge/batteryusage/BatteryChartPreferenceController.java b/src/com/android/settings/fuelgauge/batteryusage/BatteryChartPreferenceController.java
index 6652043..e52c465 100644
--- a/src/com/android/settings/fuelgauge/batteryusage/BatteryChartPreferenceController.java
+++ b/src/com/android/settings/fuelgauge/batteryusage/BatteryChartPreferenceController.java
@@ -105,10 +105,9 @@
     public interface OnBatteryTipsUpdatedListener {
         /**
          * The callback function for the battery tips card is updated.
-         * @param title the title of the battery tip card
-         * @param summary the summary of the battery tip card
+         * @param powerAnomalyEvent the power anomaly event with highest score
          */
-        void onBatteryTipsUpdated(String title, String summary);
+        void onBatteryTipsUpdated(PowerAnomalyEvent powerAnomalyEvent);
     }
 
 
@@ -365,7 +364,8 @@
                     slotUsageData, getSlotInformation(), isBatteryUsageMapNullOrEmpty());
 
             if (mOnBatteryTipsUpdatedListener != null) {
-                mOnBatteryTipsUpdatedListener.onBatteryTipsUpdated(null, null);
+                // TODO: replace with a selected powerAnomalyEvent with highest score
+                mOnBatteryTipsUpdatedListener.onBatteryTipsUpdated(null);
             }
         }
         return true;
diff --git a/src/com/android/settings/fuelgauge/batteryusage/BatteryTipsCardPreference.java b/src/com/android/settings/fuelgauge/batteryusage/BatteryTipsCardPreference.java
index 89e2ce9..976897f 100644
--- a/src/com/android/settings/fuelgauge/batteryusage/BatteryTipsCardPreference.java
+++ b/src/com/android/settings/fuelgauge/batteryusage/BatteryTipsCardPreference.java
@@ -17,15 +17,19 @@
 package com.android.settings.fuelgauge.batteryusage;
 
 import android.content.Context;
+import android.text.TextUtils;
 import android.util.AttributeSet;
 import android.view.View;
 import android.widget.ImageButton;
+import android.widget.LinearLayout;
 import android.widget.TextView;
 
+import androidx.annotation.VisibleForTesting;
 import androidx.preference.Preference;
 import androidx.preference.PreferenceViewHolder;
 
 import com.android.settings.R;
+import com.android.settings.core.SubSettingLauncher;
 import com.android.settings.fuelgauge.PowerUsageFeatureProvider;
 import com.android.settings.overlay.FeatureFactory;
 
@@ -40,12 +44,14 @@
 
     private final PowerUsageFeatureProvider mPowerUsageFeatureProvider;
 
-    private MaterialButton mActionButton;
-    private ImageButton mDismissButton;
-    private ImageButton mThumbUpButton;
-    private ImageButton mThumbDownButton;
-    private CharSequence mTitle;
-    private CharSequence mSummary;
+    @VisibleForTesting
+    CharSequence mMainButtonLabel;
+    @VisibleForTesting
+    CharSequence mDismissButtonLabel;
+    @VisibleForTesting
+    String mDestinationComponentName;
+    @VisibleForTesting
+    int mSourceMetricsCategory;
 
     public BatteryTipsCardPreference(Context context, AttributeSet attrs) {
         super(context, attrs);
@@ -55,34 +61,65 @@
             .getPowerUsageFeatureProvider();
     }
 
-    @Override
-    public void setTitle(CharSequence title) {
-        mTitle = title;
-        notifyChanged();
+    /**
+     * Update the label of main button in tips card.
+     */
+    public void setMainButtonLabel(CharSequence label) {
+        if (!TextUtils.equals(mMainButtonLabel, label)) {
+            mMainButtonLabel = label;
+            notifyChanged();
+        }
     }
 
-    @Override
-    public void setSummary(CharSequence summary) {
-        mSummary = summary;
-        notifyChanged();
+    /**
+     * Update the label of dismiss button in tips card.
+     */
+    public void setDismissButtonLabel(CharSequence label) {
+        if (!TextUtils.equals(mDismissButtonLabel, label)) {
+            mDismissButtonLabel = label;
+            notifyChanged();
+        }
+    }
+
+    /**
+     * Update the info of target fragment launched by main button.
+     */
+    public void setMainButtonLauncherInfo(final String destinationClassName,
+            final Integer sourceMetricsCategory) {
+        mDestinationComponentName = destinationClassName;
+        mSourceMetricsCategory = sourceMetricsCategory;
     }
 
     @Override
     public void onClick(View view) {
-        // TODO: replace with the settings anomaly obtained from detectSettingsAnomaly();
+        final int viewId = view.getId();
+        if (viewId == R.id.main_button || viewId == R.id.tips_card) {
+            if (TextUtils.isEmpty(mDestinationComponentName)) {
+                return;
+            }
+            new SubSettingLauncher(getContext())
+                    .setDestination(mDestinationComponentName)
+                    .setSourceMetricsCategory(mSourceMetricsCategory)
+                    .launch();
+        } else if (viewId == R.id.dismiss_button) {
+            setVisible(false);
+        }
     }
 
     @Override
     public void onBindViewHolder(PreferenceViewHolder view) {
         super.onBindViewHolder(view);
 
-        ((TextView) view.findViewById(R.id.title)).setText(mTitle);
-        ((TextView) view.findViewById(R.id.summary)).setText(mSummary);
+        ((TextView) view.findViewById(R.id.title)).setText(getTitle());
 
-        mActionButton = (MaterialButton) view.findViewById(R.id.action_button);
-        mActionButton.setOnClickListener(this);
-        mDismissButton = (ImageButton) view.findViewById(R.id.dismiss_button);
-        mDismissButton.setOnClickListener(this);
+        LinearLayout tipsCard = (LinearLayout) view.findViewById(R.id.tips_card);
+        tipsCard.setOnClickListener(this);
+        MaterialButton mainButton = (MaterialButton) view.findViewById(R.id.main_button);
+        mainButton.setOnClickListener(this);
+        mainButton.setText(mMainButtonLabel);
+        MaterialButton dismissButton = (MaterialButton) view.findViewById(R.id.dismiss_button);
+        dismissButton.setOnClickListener(this);
+        dismissButton.setText(mDismissButtonLabel);
 
         if (!mPowerUsageFeatureProvider.isBatteryTipsFeedbackEnabled()) {
             return;
@@ -91,9 +128,9 @@
                 .setBackgroundResource(R.drawable.battery_tips_half_rounded_top_bg);
         view.findViewById(R.id.feedback_card).setVisibility(View.VISIBLE);
 
-        mThumbUpButton = (ImageButton) view.findViewById(R.id.thumb_up);
-        mThumbUpButton.setOnClickListener(this);
-        mThumbDownButton = (ImageButton) view.findViewById(R.id.thumb_down);
-        mThumbDownButton.setOnClickListener(this);
+        ImageButton thumbUpButton = (ImageButton) view.findViewById(R.id.thumb_up);
+        thumbUpButton.setOnClickListener(this);
+        ImageButton thumbDownButton = (ImageButton) view.findViewById(R.id.thumb_down);
+        thumbDownButton.setOnClickListener(this);
     }
 }
diff --git a/src/com/android/settings/fuelgauge/batteryusage/BatteryTipsController.java b/src/com/android/settings/fuelgauge/batteryusage/BatteryTipsController.java
index 87c43a1..91fe59c 100644
--- a/src/com/android/settings/fuelgauge/batteryusage/BatteryTipsController.java
+++ b/src/com/android/settings/fuelgauge/batteryusage/BatteryTipsController.java
@@ -17,13 +17,18 @@
 package com.android.settings.fuelgauge.batteryusage;
 
 import android.content.Context;
+import android.text.TextUtils;
 
 import androidx.preference.PreferenceScreen;
 
+import com.android.internal.annotations.VisibleForTesting;
+import com.android.settings.R;
 import com.android.settings.core.BasePreferenceController;
 import com.android.settings.fuelgauge.PowerUsageFeatureProvider;
 import com.android.settings.overlay.FeatureFactory;
 
+import java.util.function.Function;
+
 /** Controls the update for battery tips card */
 public class BatteryTipsController extends BasePreferenceController {
 
@@ -31,15 +36,23 @@
     private static final String ROOT_PREFERENCE_KEY = "battery_tips_category";
     private static final String CARD_PREFERENCE_KEY = "battery_tips_card";
 
-    private final PowerUsageFeatureProvider mPowerUsageFeatureProvider;
+    private final String[] mPowerAnomalyKeys;
 
-    private Context mPrefContext;
-    private BatteryTipsCardPreference mCardPreference;
+    @VisibleForTesting
+    BatteryTipsCardPreference mCardPreference;
+    @VisibleForTesting
+    PowerUsageFeatureProvider mPowerUsageFeatureProvider;
 
     public BatteryTipsController(Context context) {
         super(context, ROOT_PREFERENCE_KEY);
         mPowerUsageFeatureProvider = FeatureFactory.getFeatureFactory()
             .getPowerUsageFeatureProvider();
+        mPowerAnomalyKeys = context.getResources().getStringArray(R.array.power_anomaly_keys);
+    }
+
+    private boolean isTipsCardVisible() {
+        // TODO: compared with the timestamp of last user dismiss action in sharedPreference.
+        return mPowerUsageFeatureProvider.isBatteryTipsEnabled();
     }
 
     @Override
@@ -50,28 +63,89 @@
     @Override
     public void displayPreference(PreferenceScreen screen) {
         super.displayPreference(screen);
-        mPrefContext = screen.getContext();
         mCardPreference = screen.findPreference(CARD_PREFERENCE_KEY);
     }
 
-    /**
-     * Update the card visibility and contents.
-     * @param title a string not extend 2 lines.
-     * @param summary a string not extend 10 lines.
-     */
-    // TODO: replace parameters with SettingsAnomaly Data Proto
-    public void handleBatteryTipsCardUpdated(String title, String summary) {
-        if (!mPowerUsageFeatureProvider.isBatteryTipsEnabled()) {
-            mCardPreference.setVisible(false);
-            return;
+    @VisibleForTesting
+    int getPowerAnomalyEventIndex(String powerAnomalyKey) {
+        for (int index = 0; index < mPowerAnomalyKeys.length; index++) {
+            if (mPowerAnomalyKeys[index].equals(powerAnomalyKey)) {
+                return index;
+            }
         }
-        if (title == null || summary == null) {
-            mCardPreference.setVisible(false);
-            return;
-        }
-        mCardPreference.setTitle(title);
-        mCardPreference.setSummary(summary);
-        mCardPreference.setVisible(true);
+        return -1;
     }
 
+    private <T> T getInfo(PowerAnomalyEvent powerAnomalyEvent,
+                          Function<WarningBannerInfo, T> warningBannerInfoSupplier,
+                          Function<WarningItemInfo, T> warningItemInfoSupplier) {
+        if (powerAnomalyEvent.hasWarningBannerInfo() && warningBannerInfoSupplier != null) {
+            return warningBannerInfoSupplier.apply(powerAnomalyEvent.getWarningBannerInfo());
+        } else if (powerAnomalyEvent.hasWarningItemInfo() && warningItemInfoSupplier != null) {
+            return warningItemInfoSupplier.apply(powerAnomalyEvent.getWarningItemInfo());
+        }
+        return null;
+    }
+
+    private String getString(PowerAnomalyEvent powerAnomalyEvent,
+                             Function<WarningBannerInfo, String> warningBannerInfoSupplier,
+                             Function<WarningItemInfo, String> warningItemInfoSupplier,
+                             int resourceId, int resourceIndex) {
+        String string =
+                getInfo(powerAnomalyEvent, warningBannerInfoSupplier, warningItemInfoSupplier);
+
+        if (!TextUtils.isEmpty(string) || resourceId < 0) {
+            return string;
+        }
+
+        if (resourceIndex >= 0) {
+            string = mContext.getResources().getStringArray(resourceId)[resourceIndex];
+        }
+
+        return string;
+    }
+
+    @VisibleForTesting
+    void handleBatteryTipsCardUpdated(PowerAnomalyEvent powerAnomalyEvent) {
+        if (!isTipsCardVisible()) {
+            mCardPreference.setVisible(false);
+            return;
+        }
+        if (powerAnomalyEvent == null) {
+            mCardPreference.setVisible(false);
+            return;
+        }
+
+        // Get card preference strings and navigate fragment info
+        final int index = getPowerAnomalyEventIndex(powerAnomalyEvent.getKey());
+
+        String titleString = getString(powerAnomalyEvent, WarningBannerInfo::getTitleString,
+                WarningItemInfo::getTitleString, R.array.power_anomaly_titles, index);
+        if (titleString.isEmpty()) {
+            mCardPreference.setVisible(false);
+            return;
+        }
+
+        String mainBtnString = getString(powerAnomalyEvent,
+                WarningBannerInfo::getMainButtonString, WarningItemInfo::getMainButtonString,
+                R.array.power_anomaly_main_btn_strings, index);
+        String dismissBtnString = getString(powerAnomalyEvent,
+                WarningBannerInfo::getCancelButtonString, WarningItemInfo::getCancelButtonString,
+                R.array.power_anomaly_dismiss_btn_strings, index);
+
+        String destinationClassName = getString(powerAnomalyEvent,
+                WarningBannerInfo::getMainButtonDestination,
+                WarningItemInfo::getMainButtonDestination,
+                -1, -1);
+        Integer sourceMetricsCategory = getInfo(powerAnomalyEvent,
+                WarningBannerInfo::getMainButtonSourceMetricsCategory,
+                WarningItemInfo::getMainButtonSourceMetricsCategory);
+
+        // Updated card preference and main button fragment launcher
+        mCardPreference.setTitle(titleString);
+        mCardPreference.setMainButtonLabel(mainBtnString);
+        mCardPreference.setDismissButtonLabel(dismissBtnString);
+        mCardPreference.setMainButtonLauncherInfo(destinationClassName, sourceMetricsCategory);
+        mCardPreference.setVisible(true);
+    }
 }
diff --git a/src/com/android/settings/fuelgauge/batteryusage/ConvertUtils.java b/src/com/android/settings/fuelgauge/batteryusage/ConvertUtils.java
index 3fc44cc..5fc4ad5 100644
--- a/src/com/android/settings/fuelgauge/batteryusage/ConvertUtils.java
+++ b/src/com/android/settings/fuelgauge/batteryusage/ConvertUtils.java
@@ -17,6 +17,7 @@
 
 import android.annotation.IntDef;
 import android.annotation.Nullable;
+import android.app.usage.IUsageStatsManager;
 import android.app.usage.UsageEvents.Event;
 import android.app.usage.UsageStatsManager;
 import android.content.ContentValues;
@@ -185,7 +186,8 @@
     /** Converts to {@link AppUsageEvent} from {@link Event} */
     @Nullable
     public static AppUsageEvent convertToAppUsageEvent(
-            Context context, final Event event, final long userId) {
+            Context context, IUsageStatsManager usageStatsManager, final Event event,
+            final long userId) {
         final String packageName = event.getPackageName();
         if (packageName == null) {
             // See b/190609174: Event package names should never be null, but sometimes they are.
@@ -210,7 +212,8 @@
         }
 
         final String effectivePackageName =
-                getEffectivePackageName(context, packageName, taskRootPackageName);
+                getEffectivePackageName(
+                        context, usageStatsManager, packageName, taskRootPackageName);
         try {
             final long uid = context
                     .getPackageManager()
@@ -326,8 +329,9 @@
      */
     @VisibleForTesting
     static String getEffectivePackageName(
-            Context context, final String packageName, final String taskRootPackageName) {
-        final int usageSource = getUsageSource(context);
+            Context context, IUsageStatsManager usageStatsManager, final String packageName,
+            final String taskRootPackageName) {
+        final int usageSource = getUsageSource(context, usageStatsManager);
         switch (usageSource) {
             case UsageStatsManager.USAGE_SOURCE_TASK_ROOT_ACTIVITY:
                 return !TextUtils.isEmpty(taskRootPackageName)
@@ -372,9 +376,9 @@
         }
     }
 
-    private static int getUsageSource(Context context) {
+    private static int getUsageSource(Context context, IUsageStatsManager usageStatsManager) {
         if (sUsageSource == EMPTY_USAGE_SOURCE) {
-            sUsageSource = DatabaseUtils.getUsageSource(context);
+            sUsageSource = DatabaseUtils.getUsageSource(context, usageStatsManager);
         }
         return sUsageSource;
     }
diff --git a/src/com/android/settings/fuelgauge/batteryusage/DataProcessor.java b/src/com/android/settings/fuelgauge/batteryusage/DataProcessor.java
index f1a8063..71ed46f 100644
--- a/src/com/android/settings/fuelgauge/batteryusage/DataProcessor.java
+++ b/src/com/android/settings/fuelgauge/batteryusage/DataProcessor.java
@@ -32,6 +32,7 @@
 import android.os.BatteryUsageStatsQuery;
 import android.os.Process;
 import android.os.RemoteException;
+import android.os.ServiceManager;
 import android.os.UidBatteryConsumer;
 import android.os.UserBatteryConsumer;
 import android.os.UserHandle;
@@ -108,6 +109,11 @@
     @VisibleForTesting
     static Set<String> sTestSystemAppsPackageNames;
 
+    @VisibleForTesting
+    static IUsageStatsManager sUsageStatsManager =
+            IUsageStatsManager.Stub.asInterface(
+                    ServiceManager.getService(Context.USAGE_STATS_SERVICE));
+
     public static final String CURRENT_TIME_BATTERY_HISTORY_PLACEHOLDER =
             "CURRENT_TIME_BATTERY_HISTORY_PLACEHOLDER";
 
@@ -338,7 +344,8 @@
                             break;
                         }
                         final AppUsageEvent appUsageEvent =
-                                ConvertUtils.convertToAppUsageEvent(context, event, userId);
+                                ConvertUtils.convertToAppUsageEvent(
+                                        context, sUsageStatsManager, event, userId);
                         if (appUsageEvent != null) {
                             numEventsFetched++;
                             appUsageEventList.add(appUsageEvent);
@@ -694,6 +701,7 @@
             final long eventUserId = firstEvent.getUserId();
             final String packageName = getEffectivePackageName(
                     context,
+                    sUsageStatsManager,
                     firstEvent.getPackageName(),
                     firstEvent.getTaskRootPackageName());
             usageEvents.addAll(deviceEvents);
@@ -966,7 +974,7 @@
         final long startTime = DatabaseUtils.getAppUsageStartTimestampOfUser(
                 context, userID, earliestTimestamp);
         return loadAppUsageEventsForUserFromService(
-                DatabaseUtils.sUsageStatsManager, startTime, now, userID, callingPackage);
+                sUsageStatsManager, startTime, now, userID, callingPackage);
     }
 
     @Nullable
diff --git a/src/com/android/settings/fuelgauge/batteryusage/DatabaseUtils.java b/src/com/android/settings/fuelgauge/batteryusage/DatabaseUtils.java
index ea1f3ed..b54563b 100644
--- a/src/com/android/settings/fuelgauge/batteryusage/DatabaseUtils.java
+++ b/src/com/android/settings/fuelgauge/batteryusage/DatabaseUtils.java
@@ -31,7 +31,6 @@
 import android.os.Handler;
 import android.os.Looper;
 import android.os.RemoteException;
-import android.os.ServiceManager;
 import android.os.SystemClock;
 import android.os.UserManager;
 import android.util.Log;
@@ -117,11 +116,6 @@
     @VisibleForTesting
     static Supplier<Cursor> sFakeSupplier;
 
-    @VisibleForTesting
-    static IUsageStatsManager sUsageStatsManager =
-            IUsageStatsManager.Stub.asInterface(
-                    ServiceManager.getService(Context.USAGE_STATS_SERVICE));
-
     private DatabaseUtils() {
     }
 
@@ -488,7 +482,7 @@
      *
      * @see UsageStatsManager#getUsageSource()
      */
-    static int getUsageSource(Context context) {
+    static int getUsageSource(Context context, IUsageStatsManager usageStatsManager) {
         final SharedPreferences sharedPreferences = getSharedPreferences(context);
         if (sharedPreferences != null && sharedPreferences.contains(KEY_LAST_USAGE_SOURCE)) {
             return sharedPreferences
@@ -497,7 +491,7 @@
         int usageSource = ConvertUtils.DEFAULT_USAGE_SOURCE;
 
         try {
-            usageSource = sUsageStatsManager.getUsageSource();
+            usageSource = usageStatsManager.getUsageSource();
         } catch (RemoteException e) {
             Log.e(TAG, "Failed to getUsageSource", e);
         }
diff --git a/src/com/android/settings/fuelgauge/batteryusage/SpinnerPreference.java b/src/com/android/settings/fuelgauge/batteryusage/SpinnerPreference.java
index ac3e26d..f57c85a 100644
--- a/src/com/android/settings/fuelgauge/batteryusage/SpinnerPreference.java
+++ b/src/com/android/settings/fuelgauge/batteryusage/SpinnerPreference.java
@@ -84,6 +84,7 @@
             return;
         }
         if (!(state instanceof SavedState)) {
+            super.onRestoreInstanceState(state);
             return;
         }
         SavedState savedState = (SavedState) state;
diff --git a/src/com/android/settings/fuelgauge/protos/power_anomaly_event.proto b/src/com/android/settings/fuelgauge/protos/power_anomaly_event.proto
index b4277c4..380c786 100644
--- a/src/com/android/settings/fuelgauge/protos/power_anomaly_event.proto
+++ b/src/com/android/settings/fuelgauge/protos/power_anomaly_event.proto
@@ -4,14 +4,19 @@
 option java_package = "com.android.settings.fuelgauge.batteryusage";
 option java_outer_classname = "PowerAnomalyEventProto";
 
+message PowerAnomalyEventList {
+  repeated PowerAnomalyEvent power_anomaly_events = 1;
+}
+
 message PowerAnomalyEvent {
-  optional int64 timestamp = 1;
-  optional string type = 2;  // e.g. settings, apps
-  optional string key = 3;  // e.g. brightness, significant_increase
-  optional float score = 4;
+  optional string event_id = 1;
+  optional int64 timestamp = 2;
+  optional string type = 3;  // e.g. settings, apps
+  optional string key = 4;  // e.g. brightness, significant_increase
+  optional float score = 5;
   oneof info {
-    WarningBannerInfo warning_banner_info = 5;
-    WarningItemInfo warning_item_info = 6;
+    WarningBannerInfo warning_banner_info = 6;
+    WarningItemInfo warning_item_info = 7;
   }
 }
 
@@ -19,9 +24,11 @@
   optional string title_string = 1;
   optional string description_string = 2;
   optional string main_button_string = 3;
-  optional string main_button_action = 4;
-  optional string cancel_button_string = 5;
-  optional string cancel_button_action = 6;
+  // Used in the SubSettingLauncher.setDestination().
+  optional string main_button_destination = 4;
+  // Used in the SubSettingLauncher.setSourceMetricsCategory().
+  optional int32 main_button_source_metrics_category = 5;
+  optional string cancel_button_string = 6;
 }
 
 message WarningItemInfo {
@@ -31,7 +38,9 @@
   optional string title_string = 4;
   optional string description_string = 5;
   optional string main_button_string = 6;
-  optional string main_button_action = 7;
-  optional string cancel_button_string = 8;
-  optional string cancel_button_action = 9;
+  // Used in the SubSettingLauncher.setDestination().
+  optional string main_button_destination = 7;
+  // Used in the SubSettingLauncher.setSourceMetricsCategory().
+  optional int32 main_button_source_metrics_category = 8;
+  optional string cancel_button_string = 9;
 }
diff --git a/src/com/android/settings/inputmethod/AvailableVirtualKeyboardFragment.java b/src/com/android/settings/inputmethod/AvailableVirtualKeyboardFragment.java
index 3ec879c..6efbc6d 100644
--- a/src/com/android/settings/inputmethod/AvailableVirtualKeyboardFragment.java
+++ b/src/com/android/settings/inputmethod/AvailableVirtualKeyboardFragment.java
@@ -155,7 +155,7 @@
         final Context prefContext = getPrefContext();
         final List<InputMethodInfo> imis = mInputMethodSettingValues.getInputMethodList();
         final List<InputMethodInfo> enabledImis = getContext().getSystemService(
-                InputMethodManager.class).getEnabledInputMethodListAsUser(mUserId);
+                InputMethodManager.class).getEnabledInputMethodListAsUser(UserHandle.of(mUserId));
         final int numImis = (imis == null ? 0 : imis.size());
         for (int i = 0; i < numImis; ++i) {
             final InputMethodInfo imi = imis.get(i);
diff --git a/src/com/android/settings/inputmethod/NewKeyboardLayoutEnabledLocalesFragment.java b/src/com/android/settings/inputmethod/NewKeyboardLayoutEnabledLocalesFragment.java
index 08b8fd0..f007bc8 100644
--- a/src/com/android/settings/inputmethod/NewKeyboardLayoutEnabledLocalesFragment.java
+++ b/src/com/android/settings/inputmethod/NewKeyboardLayoutEnabledLocalesFragment.java
@@ -145,7 +145,8 @@
 
         PreferenceScreen preferenceScreen = getPreferenceScreen();
         preferenceScreen.removeAll();
-        List<InputMethodInfo> infoList = mImm.getEnabledInputMethodListAsUser(mUserId);
+        List<InputMethodInfo> infoList =
+                mImm.getEnabledInputMethodListAsUser(UserHandle.of(mUserId));
         Collections.sort(infoList, new Comparator<InputMethodInfo>() {
             public int compare(InputMethodInfo o1, InputMethodInfo o2) {
                 String s1 = o1.loadLabel(mContext.getPackageManager()).toString();
@@ -157,7 +158,8 @@
         for (InputMethodInfo info : infoList) {
             mKeyboardInfoList.clear();
             List<InputMethodSubtype> subtypes =
-                    mImm.getEnabledInputMethodSubtypeListAsUser(info.getId(), true, mUserId);
+                    mImm.getEnabledInputMethodSubtypeListAsUser(info.getId(), true,
+                            UserHandle.of(mUserId));
             for (InputMethodSubtype subtype : subtypes) {
                 if (subtype.isSuitableForPhysicalKeyboardLayoutMapping()) {
                     mapLanguageWithLayout(info, subtype);
diff --git a/src/com/android/settings/inputmethod/NewKeyboardSettingsUtils.java b/src/com/android/settings/inputmethod/NewKeyboardSettingsUtils.java
index ad68c43..bdbbbbc 100644
--- a/src/com/android/settings/inputmethod/NewKeyboardSettingsUtils.java
+++ b/src/com/android/settings/inputmethod/NewKeyboardSettingsUtils.java
@@ -20,6 +20,7 @@
 import android.hardware.input.InputDeviceIdentifier;
 import android.hardware.input.InputManager;
 import android.hardware.input.KeyboardLayout;
+import android.os.UserHandle;
 import android.view.InputDevice;
 import android.view.inputmethod.InputMethodInfo;
 import android.view.inputmethod.InputMethodManager;
@@ -55,7 +56,7 @@
 
     static List<String> getSuitableImeLabels(Context context, InputMethodManager imm, int userId) {
         List<String> suitableInputMethodInfoLabels = new ArrayList<>();
-        List<InputMethodInfo> infoList = imm.getEnabledInputMethodListAsUser(userId);
+        List<InputMethodInfo> infoList = imm.getEnabledInputMethodListAsUser(UserHandle.of(userId));
         for (InputMethodInfo info : infoList) {
             List<InputMethodSubtype> subtypes =
                     imm.getEnabledInputMethodSubtypeList(info, true);
diff --git a/src/com/android/settings/localepicker/LocaleListEditor.java b/src/com/android/settings/localepicker/LocaleListEditor.java
index 934a048..d9109c3 100644
--- a/src/com/android/settings/localepicker/LocaleListEditor.java
+++ b/src/com/android/settings/localepicker/LocaleListEditor.java
@@ -364,6 +364,7 @@
                                 }
                             });
             mSuggestionDialog = dialogBuilder.create();
+            mSuggestionDialog.setCanceledOnTouchOutside(false);
             mSuggestionDialog.show();
         } else {
             Log.d(TAG, "Invalid parameter, dialogType:" + dialogType);
diff --git a/src/com/android/settings/media/MediaOutputIndicatorWorker.java b/src/com/android/settings/media/MediaOutputIndicatorWorker.java
index bf1e06e..7c299c6 100644
--- a/src/com/android/settings/media/MediaOutputIndicatorWorker.java
+++ b/src/com/android/settings/media/MediaOutputIndicatorWorker.java
@@ -157,7 +157,11 @@
         return mMediaDevices;
     }
 
+    @Nullable
     public MediaDevice getCurrentConnectedMediaDevice() {
+        if (mLocalMediaManager == null) {
+            return null;
+        }
         return mLocalMediaManager.getCurrentConnectedDevice();
     }
 
diff --git a/src/com/android/settings/network/telephony/Enable2gPreferenceController.java b/src/com/android/settings/network/telephony/Enable2gPreferenceController.java
index 765df51..9d9958f 100644
--- a/src/com/android/settings/network/telephony/Enable2gPreferenceController.java
+++ b/src/com/android/settings/network/telephony/Enable2gPreferenceController.java
@@ -119,20 +119,21 @@
         String summary;
         if (isDisabledByCarrier) {
             summary = mContext.getString(R.string.enable_2g_summary_disabled_carrier,
-                    getCarrierName());
+                    getSimCardName());
         } else {
             summary = mContext.getString(R.string.enable_2g_summary);
         }
         preference.setSummary(summary);
     }
 
-    private String getCarrierName() {
+    private String getSimCardName() {
         SubscriptionInfo subInfo = SubscriptionUtil.getSubById(mSubscriptionManager, mSubId);
         if (subInfo == null) {
             return "";
         }
-        CharSequence carrierName = subInfo.getCarrierName();
-        return TextUtils.isEmpty(carrierName) ? "" : carrierName.toString();
+        // It is the sim card name, and it should be the same name as the sim page.
+        CharSequence simCardName = subInfo.getDisplayName();
+        return TextUtils.isEmpty(simCardName) ? "" : simCardName.toString();
     }
 
     /**
diff --git a/src/com/android/settings/print/PrintServiceSettingsFragment.java b/src/com/android/settings/print/PrintServiceSettingsFragment.java
index 39b5ab9..c5316e6 100644
--- a/src/com/android/settings/print/PrintServiceSettingsFragment.java
+++ b/src/com/android/settings/print/PrintServiceSettingsFragment.java
@@ -17,6 +17,7 @@
 package com.android.settings.print;
 
 import android.app.Activity;
+import android.app.ActivityOptions;
 import android.app.settings.SettingsEnums;
 import android.content.ComponentName;
 import android.content.Context;
@@ -547,8 +548,13 @@
                     @Override
                     public void onClick(View v) {
                         try {
+                            Bundle options = ActivityOptions.makeBasic()
+                                    .setPendingIntentBackgroundActivityStartMode(
+                                            ActivityOptions.MODE_BACKGROUND_ACTIVITY_START_ALLOWED)
+                                    .toBundle();
                             getActivity().startIntentSender(
-                                    printer.getInfoIntent().getIntentSender(), null, 0, 0, 0);
+                                    printer.getInfoIntent().getIntentSender(), null, 0, 0, 0,
+                                    options);
                         } catch (SendIntentException e) {
                             Log.e(LOG_TAG, "Could not execute pending info intent: %s", e);
                         }
diff --git a/src/com/android/settings/remoteauth/introduction/IntroductionImageCarousel.kt b/src/com/android/settings/remoteauth/introduction/IntroductionImageCarousel.kt
new file mode 100644
index 0000000..ffc683e
--- /dev/null
+++ b/src/com/android/settings/remoteauth/introduction/IntroductionImageCarousel.kt
@@ -0,0 +1,159 @@
+/*
+ * 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.remoteauth.introduction
+
+import android.content.Context
+import android.util.AttributeSet
+import android.util.Log
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.ImageView
+import android.widget.TextView
+
+import androidx.annotation.VisibleForTesting
+import androidx.constraintlayout.widget.ConstraintLayout
+import androidx.recyclerview.widget.LinearLayoutManager
+import androidx.recyclerview.widget.RecyclerView
+import androidx.viewpager2.widget.MarginPageTransformer
+import androidx.viewpager2.widget.ViewPager2
+
+import com.airbnb.lottie.LottieAnimationView
+
+import com.android.settings.R
+import com.android.settingslib.widget.LottieColorUtils
+
+class IntroductionImageCarousel : ConstraintLayout {
+    private val carousel: ViewPager2 by lazy { findViewById<ViewPager2>(R.id.image_carousel) }
+    private val progressIndicator: RecyclerView by lazy {
+        findViewById<RecyclerView>(R.id.carousel_progress_indicator)
+    }
+    private val backArrow: ImageView by lazy { findViewById<ImageView>(R.id.carousel_back_arrow) }
+    private val forwardArrow: ImageView by lazy {
+        findViewById<ImageView>(R.id.carousel_forward_arrow)
+    }
+    private val progressIndicatorAdapter = ProgressIndicatorAdapter()
+    // The index of the current animation we are on
+    private var currentPage = 0
+        set(value) {
+            val pageRange = 0..(ANIMATION_LIST.size - 1)
+            field = value.coerceIn(pageRange)
+            backArrow.isEnabled = field > pageRange.start
+            forwardArrow.isEnabled = field < pageRange.endInclusive
+            carousel.setCurrentItem(field)
+            progressIndicatorAdapter.currentIndex = field
+        }
+
+    private val onPageChangeCallback =
+        object : ViewPager2.OnPageChangeCallback() {
+            override fun onPageSelected(position: Int) {
+                currentPage = position
+            }
+        }
+    constructor(context: Context) : super(context)
+    constructor(context: Context, attrSet: AttributeSet?) : super(context, attrSet)
+
+    init {
+        LayoutInflater.from(context).inflate(R.layout.remote_auth_introduction_image_carousel, this)
+
+        with(carousel) {
+            setPageTransformer(
+                MarginPageTransformer(
+                    context.resources.getDimension(R.dimen.remoteauth_introduction_fragment_padding_horizontal).toInt()
+                )
+            )
+            adapter = ImageCarouselAdapter()
+            registerOnPageChangeCallback(onPageChangeCallback)
+        }
+
+        with(progressIndicator) {
+            layoutManager = LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false)
+            adapter = progressIndicatorAdapter
+        }
+
+        backArrow.setOnClickListener { currentPage-- }
+        forwardArrow.setOnClickListener { currentPage++ }
+    }
+
+    fun unregister() {
+        carousel.unregisterOnPageChangeCallback(onPageChangeCallback)
+    }
+
+    private class AnimationViewHolder(val context: Context, itemView: View) : RecyclerView.ViewHolder(itemView) {
+        val animationView = itemView.requireViewById<LottieAnimationView>(R.id.explanation_animation)
+        val descriptionText = itemView.requireViewById<TextView>(R.id.carousel_text)
+    }
+
+    /** Adapter for the onboarding animations. */
+    private class ImageCarouselAdapter : RecyclerView.Adapter<AnimationViewHolder>() {
+
+        override fun getItemCount() = ANIMATION_LIST.size
+
+        override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) =
+            AnimationViewHolder(parent.context, LayoutInflater.from(parent.context).inflate(R.layout.remote_auth_introduction_image_carousel_item, parent, false))
+
+        override fun onBindViewHolder(holder: AnimationViewHolder, position: Int) {
+            with(holder.animationView) {
+                setAnimation(ANIMATION_LIST[position].first)
+                LottieColorUtils.applyDynamicColors(holder.context, this)
+            }
+            holder.descriptionText.setText(ANIMATION_LIST[position].second)
+            with(holder.itemView) {
+                // This makes sure that the proper description text instead of a generic "Page" label is
+                // verbalized by Talkback when switching to a new page on the ViewPager2.
+                contentDescription = context.getString(ANIMATION_LIST[position].second)
+            }
+        }
+    }
+
+    /** Adapter for icons indicating carousel progress. */
+    private class ProgressIndicatorAdapter : RecyclerView.Adapter<RecyclerView.ViewHolder>() {
+
+        var currentIndex: Int = 0
+            set(value) {
+                val previousIndex = field
+                field = value.coerceIn(0, getItemCount() - 1)
+                notifyItemChanged(previousIndex)
+                notifyItemChanged(field)
+            }
+
+        override fun getItemCount() = ANIMATION_LIST.size
+
+        override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) =
+            object :
+                RecyclerView.ViewHolder(LayoutInflater.from(parent.context).inflate(R.layout.remote_auth_introduction_image_carousel_progress_icon, parent, false)) {}
+
+        override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
+            holder.itemView.isSelected = position == currentIndex
+        }
+    }
+    companion object {
+        @VisibleForTesting
+        val ANIMATION_LIST =
+            listOf(
+                Pair(
+                    R.raw.remoteauth_explanation_swipe_animation,
+                    R.string.security_settings_remoteauth_enroll_introduction_animation_swipe_up
+                ),
+                Pair(
+                    R.raw.remoteauth_explanation_notification_animation,
+                    R.string.security_settings_remoteauth_enroll_introduction_animation_tap_notification
+                ),
+            )
+        const val TAG = "RemoteAuthCarousel"
+    }
+}
\ No newline at end of file
diff --git a/src/com/android/settings/remoteauth/introduction/RemoteAuthEnrollIntroduction.kt b/src/com/android/settings/remoteauth/introduction/RemoteAuthEnrollIntroduction.kt
new file mode 100644
index 0000000..21b8af2
--- /dev/null
+++ b/src/com/android/settings/remoteauth/introduction/RemoteAuthEnrollIntroduction.kt
@@ -0,0 +1,92 @@
+/*
+ * 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.remoteauth.introduction
+
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import com.android.settings.R
+import com.android.settings.remoteauth.RemoteAuthEnrollBase
+import com.google.android.setupcompat.template.FooterButton
+import com.google.android.setupdesign.template.RequireScrollMixin
+
+/**
+ * Provides introductory info about remote authenticator unlock.
+ */
+class RemoteAuthEnrollIntroduction :
+    RemoteAuthEnrollBase(
+        layoutResId = R.layout.remote_auth_enroll_introduction,
+        glifLayoutId = R.id.setup_wizard_layout,
+    ) {
+
+    override fun onCreateView(
+        inflater: LayoutInflater,
+        viewGroup: ViewGroup?,
+        savedInstanceArgs: Bundle?
+    ) =
+        super.onCreateView(inflater, viewGroup, savedInstanceArgs).also {
+            initializeRequireScrollMixin(it)
+        }
+
+
+    override fun initializePrimaryFooterButton() : FooterButton {
+        return FooterButton.Builder(context!!)
+            .setText(R.string.security_settings_remoteauth_enroll_introduction_agree)
+            .setListener(::onPrimaryFooterButtonClick)
+            .setButtonType(FooterButton.ButtonType.OPT_IN)
+            .setTheme(R.style.SudGlifButton_Primary)
+            .build()
+    }
+
+    override fun initializeSecondaryFooterButton() : FooterButton {
+        return FooterButton.Builder(context!!)
+            .setText(R.string.security_settings_remoteauth_enroll_introduction_disagree)
+            .setListener(::onSecondaryFooterButtonClick)
+            .setButtonType(FooterButton.ButtonType.NEXT)
+            .setTheme(R.style.SudGlifButton_Primary)
+            .build()
+    }
+
+    private fun onPrimaryFooterButtonClick(view: View) {
+        // TODO(b/293906345): Wire up navigation
+    }
+
+    private fun onSecondaryFooterButtonClick(view: View) {
+        // TODO(b/293906345): Wire up navigation
+    }
+
+    private fun initializeRequireScrollMixin(view: View) {
+        val layout = getGlifLayout(view)
+        secondaryFooterButton?.visibility = View.INVISIBLE
+        val requireScrollMixin = layout.getMixin(RequireScrollMixin::class.java)
+        requireScrollMixin.requireScrollWithButton(requireContext(), primaryFooterButton,
+            R.string.security_settings_remoteauth_enroll_introduction_more, ::onPrimaryFooterButtonClick)
+        requireScrollMixin.setOnRequireScrollStateChangedListener { scrollNeeded ->
+            if (scrollNeeded) {
+                primaryFooterButton.setText(requireContext(), R.string.security_settings_remoteauth_enroll_introduction_more)
+            } else {
+                primaryFooterButton.setText(requireContext(), R.string.security_settings_remoteauth_enroll_introduction_agree)
+                secondaryFooterButton?.visibility = View.VISIBLE
+            }
+        }
+    }
+
+    private companion object {
+        const val TAG = "RemoteAuthEnrollIntro"
+    }
+}
\ No newline at end of file
diff --git a/src/com/android/settings/safetycenter/BiometricsSafetySource.java b/src/com/android/settings/safetycenter/BiometricsSafetySource.java
index 9dc5b4e..94db71f 100644
--- a/src/com/android/settings/safetycenter/BiometricsSafetySource.java
+++ b/src/com/android/settings/safetycenter/BiometricsSafetySource.java
@@ -164,7 +164,12 @@
                     disablingAdmin == null /* enabled */,
                     fingerprintStatusUtils.hasEnrolled(),
                     safetyEvent);
+            return;
         }
+
+        SafetyCenterManagerWrapper.get()
+                .setSafetySourceData(
+                        context, SAFETY_SOURCE_ID, /* safetySourceData= */ null, safetyEvent);
     }
 
     /** Notifies Safety Center of a change in biometrics settings. */
diff --git a/src/com/android/settings/search/actionbar/SearchMenuController.java b/src/com/android/settings/search/actionbar/SearchMenuController.java
index a2613e1..98c9c1f 100644
--- a/src/com/android/settings/search/actionbar/SearchMenuController.java
+++ b/src/com/android/settings/search/actionbar/SearchMenuController.java
@@ -86,8 +86,8 @@
             return;
         }
         final MenuItem searchItem = menu.add(Menu.NONE, MENU_SEARCH, 0 /* order */,
-                com.android.settingslib.widget.R.string.search_menu);
-        searchItem.setIcon(com.android.settingslib.widget.R.drawable.ic_search_24dp);
+                R.string.search_menu);
+        searchItem.setIcon(R.drawable.ic_search_24dp);
         searchItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
 
         searchItem.setOnMenuItemClickListener(target -> {
diff --git a/src/com/android/settings/security/screenlock/PinPrivacyPreferenceController.kt b/src/com/android/settings/security/screenlock/PinPrivacyPreferenceController.kt
index 176183e..78656e8 100644
--- a/src/com/android/settings/security/screenlock/PinPrivacyPreferenceController.kt
+++ b/src/com/android/settings/security/screenlock/PinPrivacyPreferenceController.kt
@@ -45,7 +45,7 @@
         return PREF_KEY
     }
 
-    override fun onPreferenceChange(preference: Preference?, value: Any?): Boolean {
+    override fun onPreferenceChange(preference: Preference, value: Any): Boolean {
         lockPatternUtils.setPinEnhancedPrivacyEnabled((value as Boolean), userId)
         return true
     }
diff --git a/src/com/android/settings/spa/app/appcompat/UserAspectRatioAppsPageProvider.kt b/src/com/android/settings/spa/app/appcompat/UserAspectRatioAppsPageProvider.kt
index 12f5b09..34cf3ee 100644
--- a/src/com/android/settings/spa/app/appcompat/UserAspectRatioAppsPageProvider.kt
+++ b/src/com/android/settings/spa/app/appcompat/UserAspectRatioAppsPageProvider.kt
@@ -47,6 +47,9 @@
 import com.android.settingslib.spa.framework.util.filterItem
 import com.android.settingslib.spa.widget.preference.Preference
 import com.android.settingslib.spa.widget.preference.PreferenceModel
+import com.android.settingslib.spa.widget.illustration.Illustration
+import com.android.settingslib.spa.widget.illustration.IllustrationModel
+import com.android.settingslib.spa.widget.illustration.ResourceType
 import com.android.settingslib.spa.widget.ui.SettingsBody
 import com.android.settingslib.spa.widget.ui.SpinnerOption
 import com.android.settingslib.spaprivileged.model.app.AppListModel
@@ -108,6 +111,10 @@
             Box(Modifier.padding(SettingsDimension.itemPadding)) {
                 SettingsBody(UserAspectRatioAppsPageProvider.getSummary())
             }
+            Illustration(object : IllustrationModel {
+                override val resId = R.raw.user_aspect_ratio_education
+                override val resourceType = ResourceType.LOTTIE
+            })
         }
     )
 }
diff --git a/src/com/android/settings/wifi/dpp/WifiDppConfiguratorAuthActivity.java b/src/com/android/settings/wifi/dpp/WifiDppConfiguratorAuthActivity.java
new file mode 100644
index 0000000..aa77dc1
--- /dev/null
+++ b/src/com/android/settings/wifi/dpp/WifiDppConfiguratorAuthActivity.java
@@ -0,0 +1,82 @@
+/*
+ * 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.wifi.dpp;
+
+import static android.content.Intent.ACTION_CLOSE_SYSTEM_DIALOGS;
+import static android.content.Intent.FLAG_RECEIVER_FOREGROUND;
+
+import android.app.Activity;
+import android.app.KeyguardManager;
+import android.app.settings.SettingsEnums;
+import android.content.Intent;
+import android.os.Bundle;
+import android.view.WindowManager;
+
+import androidx.activity.result.ActivityResult;
+import androidx.activity.result.contract.ActivityResultContracts;
+
+import com.android.internal.annotations.VisibleForTesting;
+import com.android.settings.R;
+import com.android.settings.core.InstrumentedActivity;
+
+/**
+ * Sharing a Wi-Fi network by QR code after unlocking. Used by {@code InternetDialog} in QS.
+ */
+public class WifiDppConfiguratorAuthActivity extends InstrumentedActivity {
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        // This is a transparent activity, disable the dim.
+        getWindow().clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
+        Intent authIntent = getSystemService(KeyguardManager.class)
+                .createConfirmDeviceCredentialIntent(
+                        getText(R.string.wifi_dpp_lockscreen_title), null, getUserId());
+        if (authIntent == null) {
+            startQrCodeActivity();
+            finish();
+        } else {
+            registerForActivityResult(
+                    new ActivityResultContracts.StartActivityForResult(),
+                    this::onAuthResult).launch(authIntent);
+        }
+    }
+
+    @VisibleForTesting
+    void onAuthResult(ActivityResult result) {
+        if (result.getResultCode() == Activity.RESULT_OK) {
+            startQrCodeActivity();
+        }
+        finish();
+    }
+
+    private void startQrCodeActivity() {
+        // Close quick settings shade
+        sendBroadcast(
+                new Intent(ACTION_CLOSE_SYSTEM_DIALOGS).setFlags(FLAG_RECEIVER_FOREGROUND));
+        Intent qrCodeIntent = new Intent();
+        qrCodeIntent.setAction(
+                WifiDppConfiguratorActivity.ACTION_CONFIGURATOR_QR_CODE_GENERATOR);
+        qrCodeIntent.putExtras(getIntent());
+        startActivity(qrCodeIntent);
+    }
+
+    @Override
+    public int getMetricsCategory() {
+        return SettingsEnums.SETTINGS_WIFI_DPP_CONFIGURATOR;
+    }
+}
diff --git a/tests/componenttests/src/com/android/settings/wifi/dpp/WifiDppConfiguratorAuthActivityTest.java b/tests/componenttests/src/com/android/settings/wifi/dpp/WifiDppConfiguratorAuthActivityTest.java
new file mode 100644
index 0000000..94b9369
--- /dev/null
+++ b/tests/componenttests/src/com/android/settings/wifi/dpp/WifiDppConfiguratorAuthActivityTest.java
@@ -0,0 +1,79 @@
+/*
+ * 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.wifi.dpp;
+
+import static android.app.Activity.RESULT_OK;
+
+import static androidx.test.espresso.intent.Intents.intended;
+import static androidx.test.espresso.intent.matcher.IntentMatchers.hasAction;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.hamcrest.Matchers.equalTo;
+
+import android.app.KeyguardManager;
+
+import androidx.activity.result.ActivityResult;
+import androidx.test.core.app.ActivityScenario;
+import androidx.test.espresso.intent.Intents;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.filters.SmallTest;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(AndroidJUnit4.class)
+@SmallTest
+public class WifiDppConfiguratorAuthActivityTest {
+
+    @Before
+    public void setup() {
+        Intents.init();
+    }
+
+    @After
+    public void teardown() throws Exception {
+        Intents.release();
+    }
+
+    @Test
+    public void launchActivity_sendAuthIntent() {
+        ActivityScenario<WifiDppConfiguratorAuthActivity> activityScenario =
+                ActivityScenario.launch(WifiDppConfiguratorAuthActivity.class);
+        assertThat(activityScenario).isNotNull();
+        intended(hasAction(equalTo(KeyguardManager.ACTION_CONFIRM_DEVICE_CREDENTIAL_WITH_USER)));
+    }
+
+    @Test
+    public void launchActivity_sendQrCodeIntent() {
+        ActivityScenario.launch(WifiDppConfiguratorAuthActivity.class).onActivity(activity ->
+                activity.onAuthResult(new ActivityResult(RESULT_OK, /* data= */ null))
+        );
+        intended(hasAction(
+                equalTo(WifiDppConfiguratorActivity.ACTION_CONFIGURATOR_QR_CODE_GENERATOR)));
+    }
+
+    @Test
+    public void launchActivity_shouldFinish() {
+        ActivityScenario.launch(WifiDppConfiguratorAuthActivity.class).onActivity(activity -> {
+            activity.onAuthResult(new ActivityResult(RESULT_OK, /* data= */ null));
+            assertThat(activity.isFinishing()).isTrue();
+        });
+    }
+}
diff --git a/tests/robotests/src/com/android/settings/accessibility/AccessibilitySettingsTest.java b/tests/robotests/src/com/android/settings/accessibility/AccessibilitySettingsTest.java
index 6dd1f11..30b8302 100644
--- a/tests/robotests/src/com/android/settings/accessibility/AccessibilitySettingsTest.java
+++ b/tests/robotests/src/com/android/settings/accessibility/AccessibilitySettingsTest.java
@@ -200,7 +200,7 @@
     }
 
     @Test
-    public void getServiceSummary_enableServiceShortcutOn_showsServiceEnabledShortcutOn() {
+    public void getServiceSummary_enableServiceShortcutOnWithEmptyDescription_showsServiceEnabled() {
         doReturn(EMPTY_STRING).when(mServiceInfo).loadSummary(any());
         setShortcutEnabled(mServiceInfo.getComponentName(), true);
 
@@ -208,27 +208,23 @@
                 mServiceInfo, SERVICE_ENABLED).toString();
 
         assertThat(summary).isEqualTo(
-                mContext.getString(R.string.preference_summary_default_combination,
-                        mContext.getString(R.string.generic_accessibility_service_on),
-                        mContext.getString(R.string.accessibility_summary_shortcut_enabled)));
+                mContext.getString(R.string.generic_accessibility_service_on));
     }
 
     @Test
-    public void getServiceSummary_enableServiceShortcutOff_showsServiceEnabledShortcutOff() {
+    public void getServiceSummary_enableServiceShortcutOffWithEmptyDescription_showsServiceEnabled() {
         doReturn(EMPTY_STRING).when(mServiceInfo).loadSummary(any());
         setShortcutEnabled(mServiceInfo.getComponentName(), false);
 
-        String summary = AccessibilitySettings.getServiceSummary(mContext,
-                mServiceInfo, SERVICE_ENABLED).toString();
+        String summary = AccessibilitySettings.getServiceSummary(
+                mContext, mServiceInfo, SERVICE_ENABLED).toString();
 
         assertThat(summary).isEqualTo(
-                mContext.getString(R.string.preference_summary_default_combination,
-                        mContext.getString(R.string.generic_accessibility_service_on),
-                        mContext.getString(R.string.generic_accessibility_feature_shortcut_off)));
+                mContext.getString(R.string.generic_accessibility_service_on));
     }
 
     @Test
-    public void getServiceSummary_disableServiceShortcutOff_showsDisabledShortcutOff() {
+    public void getServiceSummary_disableServiceShortcutOffWithEmptyDescription_showsServiceDisabled() {
         doReturn(EMPTY_STRING).when(mServiceInfo).loadSummary(any());
         setShortcutEnabled(mServiceInfo.getComponentName(), false);
 
@@ -236,13 +232,11 @@
                 mServiceInfo, SERVICE_DISABLED).toString();
 
         assertThat(summary).isEqualTo(
-                mContext.getString(R.string.preference_summary_default_combination,
-                        mContext.getString(R.string.generic_accessibility_service_off),
-                        mContext.getString(R.string.generic_accessibility_feature_shortcut_off)));
+                mContext.getString(R.string.generic_accessibility_service_off));
     }
 
     @Test
-    public void getServiceSummary_disableServiceShortcutOn_showsDisabledShortcutOn() {
+    public void getServiceSummary_disableServiceShortcutOnWithEmptyDescription_showsServiceDisabled() {
         doReturn(EMPTY_STRING).when(mServiceInfo).loadSummary(any());
         setShortcutEnabled(mServiceInfo.getComponentName(), true);
 
@@ -250,13 +244,11 @@
                 mServiceInfo, SERVICE_DISABLED).toString();
 
         assertThat(summary).isEqualTo(
-                mContext.getString(R.string.preference_summary_default_combination,
-                        mContext.getString(R.string.generic_accessibility_service_off),
-                        mContext.getString(R.string.accessibility_summary_shortcut_enabled)));
+                mContext.getString(R.string.generic_accessibility_service_off));
     }
 
     @Test
-    public void getServiceSummary_enableServiceShortcutOffAndHasSummary_showsEnabledShortcutOffSummary() {
+    public void getServiceSummary_enableServiceShortcutOffAndHasSummary_showsEnabledSummary() {
         setShortcutEnabled(mServiceInfo.getComponentName(), false);
         doReturn(DEFAULT_SUMMARY).when(mServiceInfo).loadSummary(any());
 
@@ -264,14 +256,13 @@
                 mServiceInfo, SERVICE_ENABLED).toString();
 
         assertThat(summary).isEqualTo(
-                mContext.getString(R.string.accessibility_feature_full_state_summary,
+                mContext.getString(R.string.preference_summary_default_combination,
                         mContext.getString(R.string.generic_accessibility_service_on),
-                        mContext.getString(R.string.generic_accessibility_feature_shortcut_off),
                         DEFAULT_SUMMARY));
     }
 
     @Test
-    public void getServiceSummary_enableServiceShortcutOnAndHasSummary_showsEnabledShortcutOnSummary() {
+    public void getServiceSummary_enableServiceShortcutOnAndHasSummary_showsEnabledSummary() {
         doReturn(DEFAULT_SUMMARY).when(mServiceInfo).loadSummary(any());
         setShortcutEnabled(mServiceInfo.getComponentName(), true);
 
@@ -279,14 +270,13 @@
                 mServiceInfo, SERVICE_ENABLED).toString();
 
         assertThat(summary).isEqualTo(
-                mContext.getString(R.string.accessibility_feature_full_state_summary,
+                mContext.getString(R.string.preference_summary_default_combination,
                         mContext.getString(R.string.generic_accessibility_service_on),
-                        mContext.getString(R.string.accessibility_summary_shortcut_enabled),
                         DEFAULT_SUMMARY));
     }
 
     @Test
-    public void getServiceSummary_disableServiceShortcutOnAndHasSummary_showsDisabledShortcutOnSummary() {
+    public void getServiceSummary_disableServiceShortcutOnAndHasSummary_showsDisabledSummary() {
         doReturn(DEFAULT_SUMMARY).when(mServiceInfo).loadSummary(any());
         setShortcutEnabled(mServiceInfo.getComponentName(), true);
 
@@ -294,14 +284,13 @@
                 mServiceInfo, SERVICE_DISABLED).toString();
 
         assertThat(summary).isEqualTo(
-                mContext.getString(R.string.accessibility_feature_full_state_summary,
+                mContext.getString(R.string.preference_summary_default_combination,
                         mContext.getString(R.string.generic_accessibility_service_off),
-                        mContext.getString(R.string.accessibility_summary_shortcut_enabled),
                         DEFAULT_SUMMARY));
     }
 
     @Test
-    public void getServiceSummary_disableServiceShortcutOffAndHasSummary_showsDisabledShortcutOffSummary() {
+    public void getServiceSummary_disableServiceShortcutOffAndHasSummary_showsDisabledSummary() {
         setShortcutEnabled(mServiceInfo.getComponentName(), false);
         doReturn(DEFAULT_SUMMARY).when(mServiceInfo).loadSummary(any());
 
@@ -309,9 +298,8 @@
                 mServiceInfo, SERVICE_DISABLED).toString();
 
         assertThat(summary).isEqualTo(
-                mContext.getString(R.string.accessibility_feature_full_state_summary,
+                mContext.getString(R.string.preference_summary_default_combination,
                         mContext.getString(R.string.generic_accessibility_service_off),
-                        mContext.getString(R.string.generic_accessibility_feature_shortcut_off),
                         DEFAULT_SUMMARY));
     }
 
@@ -337,36 +325,6 @@
     }
 
     @Test
-    public void getA11yShortcutInfoPreferenceSummary_shortcutOn_showsShortcutOnSummary() {
-        doReturn(DEFAULT_SUMMARY).when(mShortcutInfo).loadSummary(any());
-        setShortcutEnabled(COMPONENT_NAME, true);
-
-        String summary = AccessibilitySettings.getA11yShortcutInfoPreferenceSummary(
-                mContext,
-                mShortcutInfo).toString();
-
-        assertThat(summary).isEqualTo(
-                mContext.getString(R.string.preference_summary_default_combination,
-                        mContext.getString(R.string.accessibility_summary_shortcut_enabled),
-                        DEFAULT_SUMMARY));
-    }
-
-    @Test
-    public void getA11yShortcutInfoPreferenceSummary_shortcutOff_showsShortcutOffSummary() {
-        doReturn(DEFAULT_SUMMARY).when(mShortcutInfo).loadSummary(any());
-        setShortcutEnabled(COMPONENT_NAME, false);
-
-        String summary = AccessibilitySettings.getA11yShortcutInfoPreferenceSummary(
-                mContext,
-                mShortcutInfo).toString();
-
-        assertThat(summary).isEqualTo(
-                mContext.getString(R.string.preference_summary_default_combination,
-                        mContext.getString(R.string.generic_accessibility_feature_shortcut_off),
-                        DEFAULT_SUMMARY));
-    }
-
-    @Test
     @Config(shadows = {ShadowFragment.class, ShadowUserManager.class})
     public void onCreate_haveRegisterToSpecificUrisAndActions() {
         mFragment.onAttach(mContext);
diff --git a/tests/robotests/src/com/android/settings/accessibility/AccessibilityUtilTest.java b/tests/robotests/src/com/android/settings/accessibility/AccessibilityUtilTest.java
index 60b1ee1..7825677 100644
--- a/tests/robotests/src/com/android/settings/accessibility/AccessibilityUtilTest.java
+++ b/tests/robotests/src/com/android/settings/accessibility/AccessibilityUtilTest.java
@@ -248,82 +248,6 @@
                 MOCK_COMPONENT_NAME.flattenToString());
     }
 
-    @Test
-    public void getFeatureFullStateSummary_featureOffShortcutOff_showsOffShortcutOffAndSummary() {
-        setSettingsFeatureEnabled(PLACEHOLDER_SETTING_FEATURE, false);
-        clearShortcuts();
-        String expectedText = mContext.getString(
-                R.string.accessibility_feature_full_state_summary,
-                mContext.getString(R.string.color_inversion_state_off),
-                mContext.getString(R.string.generic_accessibility_feature_shortcut_off),
-                mContext.getString(R.string.color_inversion_feature_summary));
-
-        String observerText = AccessibilityUtil.getFeatureFullStateSummary(
-                mContext, MOCK_COMPONENT_NAME,
-                PLACEHOLDER_SETTING_FEATURE,
-                R.string.color_inversion_state_on, R.string.color_inversion_state_off,
-                R.string.color_inversion_feature_summary).toString();
-
-        assertThat(observerText).isEqualTo(expectedText);
-    }
-
-    @Test
-    public void getFeatureFullStateSummary_featureOnShortcutOff_showsOnShortcutOffAndSummary() {
-        setSettingsFeatureEnabled(PLACEHOLDER_SETTING_FEATURE, true);
-        clearShortcuts();
-        String expectedText = mContext.getString(
-                R.string.accessibility_feature_full_state_summary,
-                mContext.getString(R.string.color_inversion_state_on),
-                mContext.getString(R.string.generic_accessibility_feature_shortcut_off),
-                mContext.getString(R.string.color_inversion_feature_summary));
-
-        String observerText = AccessibilityUtil.getFeatureFullStateSummary(
-                mContext, MOCK_COMPONENT_NAME,
-                PLACEHOLDER_SETTING_FEATURE,
-                R.string.color_inversion_state_on, R.string.color_inversion_state_off,
-                R.string.color_inversion_feature_summary).toString();
-
-        assertThat(observerText).isEqualTo(expectedText);
-    }
-
-    @Test
-    public void getFeatureFullStateSummary_featureOffShortcutOn_showsOffShortcutOnAndSummary() {
-        setSettingsFeatureEnabled(PLACEHOLDER_SETTING_FEATURE, false);
-        setShortcut(UserShortcutType.SOFTWARE, MOCK_COMPONENT_NAME.flattenToString());
-        String expectedText = mContext.getString(
-                R.string.accessibility_feature_full_state_summary,
-                mContext.getString(R.string.color_inversion_state_off),
-                mContext.getString(R.string.accessibility_summary_shortcut_enabled),
-                mContext.getString(R.string.color_inversion_feature_summary));
-
-        String observerText = AccessibilityUtil.getFeatureFullStateSummary(
-                mContext, MOCK_COMPONENT_NAME,
-                PLACEHOLDER_SETTING_FEATURE,
-                R.string.color_inversion_state_on, R.string.color_inversion_state_off,
-                R.string.color_inversion_feature_summary).toString();
-
-        assertThat(observerText).isEqualTo(expectedText);
-    }
-
-    @Test
-    public void getFeatureFullStateSummary_featureOnShortcutOn_showsOnShortcutOnAndSummary() {
-        setSettingsFeatureEnabled(PLACEHOLDER_SETTING_FEATURE, true);
-        setShortcut(UserShortcutType.SOFTWARE, MOCK_COMPONENT_NAME.flattenToString());
-        String expectedText = mContext.getString(
-                R.string.accessibility_feature_full_state_summary,
-                mContext.getString(R.string.color_inversion_state_on),
-                mContext.getString(R.string.accessibility_summary_shortcut_enabled),
-                mContext.getString(R.string.color_inversion_feature_summary));
-
-        String observerText = AccessibilityUtil.getFeatureFullStateSummary(
-                mContext, MOCK_COMPONENT_NAME,
-                PLACEHOLDER_SETTING_FEATURE,
-                R.string.color_inversion_state_on, R.string.color_inversion_state_off,
-                R.string.color_inversion_feature_summary).toString();
-
-        assertThat(observerText).isEqualTo(expectedText);
-    }
-
     private AccessibilityServiceInfo getMockAccessibilityServiceInfo() {
         final ApplicationInfo applicationInfo = new ApplicationInfo();
         final ServiceInfo serviceInfo = new ServiceInfo();
diff --git a/tests/robotests/src/com/android/settings/accessibility/ColorInversionPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/accessibility/ColorInversionPreferenceControllerTest.java
index 9ed3749..52905fc 100644
--- a/tests/robotests/src/com/android/settings/accessibility/ColorInversionPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/accessibility/ColorInversionPreferenceControllerTest.java
@@ -52,51 +52,39 @@
     }
 
     @Test
-    public void getSummary_enabledColorInversionShortcutOff_shouldReturnOnShortcutOffSummary() {
+    public void getSummary_enabledColorInversionShortcutOff_shouldReturnOnSummary() {
         setColorInversionEnabled(true);
         setColorInversionShortcutEnabled(false);
 
         assertThat(mController.getSummary().toString()).isEqualTo(
-                mContext.getString(R.string.accessibility_feature_full_state_summary,
-                        mContext.getString(R.string.color_inversion_state_on),
-                        mContext.getString(R.string.generic_accessibility_feature_shortcut_off),
-                        mColorInversionSummary));
+                mContext.getString(R.string.color_inversion_state_on));
     }
 
     @Test
-    public void getSummary_enabledColorInversionShortcutOn_shouldReturnOnShortcutOnSummary() {
+    public void getSummary_enabledColorInversionShortcutOn_shouldReturnOnSummary() {
         setColorInversionEnabled(true);
         setColorInversionShortcutEnabled(true);
 
         assertThat(mController.getSummary().toString()).isEqualTo(
-                mContext.getString(R.string.accessibility_feature_full_state_summary,
-                        mContext.getString(R.string.color_inversion_state_on),
-                        mContext.getString(R.string.accessibility_summary_shortcut_enabled),
-                        mColorInversionSummary));
+                mContext.getString(R.string.color_inversion_state_on));
     }
 
     @Test
-    public void getSummary_disabledColorInversionShortcutOff_shouldReturnOffShortcutOffSummary() {
+    public void getSummary_disabledColorInversionShortcutOff_shouldReturnOffSummary() {
         setColorInversionEnabled(false);
         setColorInversionShortcutEnabled(false);
 
         assertThat(mController.getSummary().toString()).isEqualTo(
-                mContext.getString(R.string.accessibility_feature_full_state_summary,
-                        mContext.getString(R.string.color_inversion_state_off),
-                        mContext.getString(R.string.generic_accessibility_feature_shortcut_off),
-                        mColorInversionSummary));
+                mContext.getString(R.string.color_inversion_state_off));
     }
 
     @Test
-    public void getSummary_disabledColorInversionShortcutOn_shouldReturnOffShortcutOnSummary() {
+    public void getSummary_disabledColorInversionShortcutOn_shouldReturnOffSummary() {
         setColorInversionEnabled(false);
         setColorInversionShortcutEnabled(true);
 
         assertThat(mController.getSummary().toString()).isEqualTo(
-                mContext.getString(R.string.accessibility_feature_full_state_summary,
-                        mContext.getString(R.string.color_inversion_state_off),
-                        mContext.getString(R.string.accessibility_summary_shortcut_enabled),
-                        mColorInversionSummary));
+                mContext.getString(R.string.color_inversion_state_off));
     }
 
     private void setColorInversionShortcutEnabled(boolean enabled) {
diff --git a/tests/robotests/src/com/android/settings/accessibility/DaltonizerPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/accessibility/DaltonizerPreferenceControllerTest.java
index 96796a0..d41f295 100644
--- a/tests/robotests/src/com/android/settings/accessibility/DaltonizerPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/accessibility/DaltonizerPreferenceControllerTest.java
@@ -50,51 +50,39 @@
     }
 
     @Test
-    public void getSummary_enabledColorCorrectionShortcutOff_shouldReturnOnShortcutOffSummary() {
+    public void getSummary_enabledColorCorrectionShortcutOff_shouldReturnOnSummary() {
         setColorCorrectionEnabled(true);
         setColorCorrectionShortcutEnabled(false);
 
         assertThat(mController.getSummary().toString()).isEqualTo(
-                mContext.getString(R.string.accessibility_feature_full_state_summary,
-                        mContext.getString(R.string.daltonizer_state_on),
-                        mContext.getString(R.string.generic_accessibility_feature_shortcut_off),
-                        mDaltonizerSummary));
+                mContext.getString(R.string.daltonizer_state_on));
     }
 
     @Test
-    public void getSummary_enabledColorCorrectionShortcutOn_shouldReturnOnShortcutOnSummary() {
+    public void getSummary_enabledColorCorrectionShortcutOn_shouldReturnOnSummary() {
         setColorCorrectionEnabled(true);
         setColorCorrectionShortcutEnabled(true);
 
         assertThat(mController.getSummary().toString()).isEqualTo(
-                mContext.getString(R.string.accessibility_feature_full_state_summary,
-                        mContext.getString(R.string.daltonizer_state_on),
-                        mContext.getString(R.string.accessibility_summary_shortcut_enabled),
-                        mDaltonizerSummary));
+                mContext.getString(R.string.daltonizer_state_on));
     }
 
     @Test
-    public void getSummary_disabledColorCorrectionShortcutOff_shouldReturnOffShortcutOffSummary() {
+    public void getSummary_disabledColorCorrectionShortcutOff_shouldReturnOffSummary() {
         setColorCorrectionEnabled(false);
         setColorCorrectionShortcutEnabled(false);
 
         assertThat(mController.getSummary().toString()).isEqualTo(
-                mContext.getString(R.string.accessibility_feature_full_state_summary,
-                        mContext.getString(R.string.daltonizer_state_off),
-                        mContext.getString(R.string.generic_accessibility_feature_shortcut_off),
-                        mDaltonizerSummary));
+                mContext.getString(R.string.daltonizer_state_off));
     }
 
     @Test
-    public void getSummary_disabledColorCorrectionShortcutOn_shouldReturnOffShortcutOnSummary() {
+    public void getSummary_disabledColorCorrectionShortcutOn_shouldReturnOffSummary() {
         setColorCorrectionEnabled(false);
         setColorCorrectionShortcutEnabled(true);
 
         assertThat(mController.getSummary().toString()).isEqualTo(
-                mContext.getString(R.string.accessibility_feature_full_state_summary,
-                        mContext.getString(R.string.daltonizer_state_off),
-                        mContext.getString(R.string.accessibility_summary_shortcut_enabled),
-                        mDaltonizerSummary));
+                mContext.getString(R.string.daltonizer_state_off));
     }
 
     private void setColorCorrectionEnabled(boolean enabled) {
diff --git a/tests/robotests/src/com/android/settings/accessibility/LiveCaptionPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/accessibility/LiveCaptionPreferenceControllerTest.java
index 2633a2c..a7a7f8f 100644
--- a/tests/robotests/src/com/android/settings/accessibility/LiveCaptionPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/accessibility/LiveCaptionPreferenceControllerTest.java
@@ -51,6 +51,7 @@
         mContext = ApplicationProvider.getApplicationContext();
         mController = new LiveCaptionPreferenceController(mContext, "test_key");
         mLiveCaptionPreference = new Preference(mContext);
+        mLiveCaptionPreference.setSummary(R.string.live_caption_summary);
     }
 
     @Test
@@ -78,10 +79,7 @@
         mController.updateState(mLiveCaptionPreference);
 
         assertThat(mLiveCaptionPreference.getSummary().toString()).isEqualTo(
-                mContext.getString(
-                        R.string.preference_summary_default_combination,
-                        mContext.getString(R.string.live_caption_enabled),
-                        mContext.getText(R.string.live_caption_summary))
+                mContext.getString(R.string.live_caption_summary)
         );
     }
 
@@ -92,10 +90,7 @@
         mController.updateState(mLiveCaptionPreference);
 
         assertThat(mLiveCaptionPreference.getSummary()).isEqualTo(
-                mContext.getString(
-                        R.string.preference_summary_default_combination,
-                        mContext.getString(R.string.live_caption_disabled),
-                        mContext.getText(R.string.live_caption_summary))
+                mContext.getString(R.string.live_caption_summary)
         );
     }
 
diff --git a/tests/robotests/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragmentTest.java b/tests/robotests/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragmentTest.java
index fe925df..fb1b8b9 100644
--- a/tests/robotests/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragmentTest.java
@@ -494,28 +494,23 @@
     }
 
     @Test
-    public void getSummary_magnificationEnabled_returnShortcutOnWithSummary() {
+    public void getSummary_magnificationEnabled_returnShortcutOn() {
         setMagnificationTripleTapEnabled(true);
 
         assertThat(
                 ToggleScreenMagnificationPreferenceFragment.getServiceSummary(mContext).toString())
                 .isEqualTo(
-                        mContext.getString(R.string.preference_summary_default_combination,
-                                mContext.getString(R.string.accessibility_summary_shortcut_enabled),
-                                mContext.getText(R.string.magnification_feature_summary)));
+                        mContext.getString(R.string.accessibility_summary_shortcut_enabled));
     }
 
     @Test
-    public void getSummary_magnificationDisabled_returnShortcutOffWithSummary() {
+    public void getSummary_magnificationDisabled_returnShortcutOff() {
         setMagnificationTripleTapEnabled(false);
 
         assertThat(
                 ToggleScreenMagnificationPreferenceFragment.getServiceSummary(mContext).toString())
                 .isEqualTo(
-                        mContext.getString(R.string.preference_summary_default_combination,
-                                mContext.getString(
-                                        R.string.generic_accessibility_feature_shortcut_off),
-                                mContext.getText(R.string.magnification_feature_summary)));
+                        mContext.getString(R.string.generic_accessibility_feature_shortcut_off));
     }
 
     private void putStringIntoSettings(String key, String componentName) {
diff --git a/tests/robotests/src/com/android/settings/applications/appcompat/UserAspectRatioDetailsTest.java b/tests/robotests/src/com/android/settings/applications/appcompat/UserAspectRatioDetailsTest.java
index 31ff76c..d98b0e7 100644
--- a/tests/robotests/src/com/android/settings/applications/appcompat/UserAspectRatioDetailsTest.java
+++ b/tests/robotests/src/com/android/settings/applications/appcompat/UserAspectRatioDetailsTest.java
@@ -32,7 +32,6 @@
 import androidx.test.core.app.ApplicationProvider;
 
 import com.android.settings.testutils.shadow.ShadowActivityManager;
-import com.android.settingslib.widget.SelectorWithWidgetPreference;
 
 import org.junit.Before;
 import org.junit.Test;
@@ -54,7 +53,7 @@
     @Mock
     private IActivityManager mAm;
 
-    private SelectorWithWidgetPreference mRadioButtonPref;
+    private RadioWithImagePreference mRadioButtonPref;
     private Context mContext;
     private UserAspectRatioDetails mFragment;
 
@@ -67,7 +66,7 @@
         when(mFragment.getContext()).thenReturn(mContext);
         when(mFragment.getAspectRatioManager()).thenReturn(mUserAspectRatioManager);
         ShadowActivityManager.setService(mAm);
-        mRadioButtonPref = new SelectorWithWidgetPreference(mContext);
+        mRadioButtonPref = new RadioWithImagePreference(mContext);
     }
 
     @Test
diff --git a/tests/robotests/src/com/android/settings/biometrics/combination/CombinedBiometricProfileSettingsTest.java b/tests/robotests/src/com/android/settings/biometrics/combination/CombinedBiometricProfileSettingsTest.java
index 2ce0757..4781f56 100644
--- a/tests/robotests/src/com/android/settings/biometrics/combination/CombinedBiometricProfileSettingsTest.java
+++ b/tests/robotests/src/com/android/settings/biometrics/combination/CombinedBiometricProfileSettingsTest.java
@@ -43,6 +43,7 @@
 import android.hardware.fingerprint.FingerprintManager;
 import android.hardware.fingerprint.FingerprintSensorPropertiesInternal;
 import android.os.Bundle;
+import android.util.AndroidRuntimeException;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
@@ -58,7 +59,10 @@
 import androidx.test.core.app.ApplicationProvider;
 
 import com.android.settings.R;
+import com.android.settings.biometrics.BiometricStatusPreferenceController;
 import com.android.settings.biometrics.BiometricsSplitScreenDialog;
+import com.android.settings.biometrics.face.FaceStatusPreferenceController;
+import com.android.settings.biometrics.fingerprint.FingerprintStatusPreferenceController;
 import com.android.settings.password.ChooseLockSettingsHelper;
 import com.android.settings.testutils.FakeFeatureFactory;
 import com.android.settings.testutils.shadow.ShadowFragment;
@@ -68,7 +72,6 @@
 
 import org.junit.After;
 import org.junit.Before;
-import org.junit.Ignore;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -86,7 +89,6 @@
 import java.util.List;
 import java.util.Map;
 
-@Ignore
 @RunWith(RobolectricTestRunner.class)
 @Config(shadows = {ShadowSettingsPreferenceFragment.class, ShadowUtils.class, ShadowFragment.class})
 public class CombinedBiometricProfileSettingsTest {
@@ -104,6 +106,10 @@
     @Mock
     private BiometricSettingsAppPreferenceController mBiometricSettingsAppPreferenceController;
     @Mock
+    private FingerprintStatusPreferenceController mFingerprintStatusPreferenceController;
+    @Mock
+    private FaceStatusPreferenceController mFaceStatusPreferenceController;
+    @Mock
     private FaceManager mFaceManager;
     @Mock
     private FragmentTransaction mFragmentTransaction;
@@ -128,6 +134,29 @@
         List<AbstractPreferenceController> controllerList = new ArrayList<>();
         controllerList.add(mBiometricSettingsAppPreferenceController);
         preferenceControllers.put(BiometricSettingsAppPreferenceController.class, controllerList);
+        controllerList.add(mFingerprintStatusPreferenceController);
+        preferenceControllers.put(FingerprintStatusPreferenceController.class, controllerList);
+        controllerList.add(mFaceStatusPreferenceController);
+        preferenceControllers.put(FaceStatusPreferenceController.class, controllerList);
+
+        doAnswer(invocation -> {
+            final Preference preference = invocation.getArgument(0);
+            return preference.getKey().equals(mFragment.getFingerprintPreferenceKey());
+        }).when(mFingerprintStatusPreferenceController)
+                .setPreferenceTreeClickLauncher(any(), any());
+        doAnswer(invocation -> {
+            final Preference preference = invocation.getArgument(0);
+            return preference.getKey().equals(mFragment.getFingerprintPreferenceKey());
+        }).when(mFingerprintStatusPreferenceController).handlePreferenceTreeClick(any());
+        doAnswer(invocation -> {
+            final Preference preference = invocation.getArgument(0);
+            return preference.getKey().equals(mFragment.getFacePreferenceKey());
+        }).when(mFaceStatusPreferenceController)
+                .setPreferenceTreeClickLauncher(any(), any());
+        doAnswer(invocation -> {
+            final Preference preference = invocation.getArgument(0);
+            return preference.getKey().equals(mFragment.getFacePreferenceKey());
+        }).when(mFaceStatusPreferenceController).handlePreferenceTreeClick(any());
 
         doAnswer(invocation -> {
             final CharSequence key = invocation.getArgument(0);
@@ -164,7 +193,7 @@
         preference.setKey(mFragment.getFingerprintPreferenceKey());
         mFragment.onPreferenceTreeClick(preference);
 
-        verify(mBiometricSettingsAppPreferenceController).handlePreferenceTreeClick(
+        verify(mFingerprintStatusPreferenceController).handlePreferenceTreeClick(
                 mPreferenceCaptor.capture());
         List<Preference> capturedPreferences = mPreferenceCaptor.getAllValues();
 
@@ -224,7 +253,7 @@
         mFragment.onActivityResult(CONFIRM_REQUEST, RESULT_FINISHED,
                 new Intent().putExtra(ChooseLockSettingsHelper.EXTRA_KEY_GK_PW_HANDLE, 1L));
 
-        verify(mBiometricSettingsAppPreferenceController).handlePreferenceTreeClick(
+        verify(mFingerprintStatusPreferenceController).handlePreferenceTreeClick(
                 mPreferenceCaptor.capture());
         List<Preference> capturedPreferences = mPreferenceCaptor.getAllValues();
         assertThat(capturedPreferences.size()).isEqualTo(1);
@@ -254,7 +283,7 @@
         preference.setKey(mFragment.getFacePreferenceKey());
         mFragment.onPreferenceTreeClick(preference);
 
-        verify(mBiometricSettingsAppPreferenceController).handlePreferenceTreeClick(
+        verify(mFaceStatusPreferenceController).handlePreferenceTreeClick(
                 mPreferenceCaptor.capture());
         List<Preference> capturedPreferences = mPreferenceCaptor.getAllValues();
         assertThat(capturedPreferences.size()).isEqualTo(1);
@@ -313,7 +342,7 @@
         preference.setKey(mFragment.getFacePreferenceKey());
         mFragment.onPreferenceTreeClick(preference);
 
-        verify(mBiometricSettingsAppPreferenceController).handlePreferenceTreeClick(
+        verify(mFaceStatusPreferenceController).handlePreferenceTreeClick(
                 mPreferenceCaptor.capture());
         List<Preference> capturedPreferences = mPreferenceCaptor.getAllValues();
         assertThat(capturedPreferences.size()).isEqualTo(1);
@@ -323,7 +352,7 @@
     @Test
     public void testClickFingerprintUnlock_inMultiWindow_withoutEnrolledFp_showsDialog() {
         testClickFingerprintUnlock(true /* isInMultiWindow */, false /* hasEnrolledFingerprint */);
-        verifyShowsDialogAfterClickingUnlock();
+        verifyShowsDialogAfterClickingUnlock(mFragment.getFingerprintPreferenceKey());
     }
 
     @Test
@@ -380,7 +409,7 @@
     @Test
     public void testClickFaceUnlock_inMultiWindow_withoutEnrolledFp_showsDialog() {
         testClickFaceUnlock(true /* isInMultiWindow */, false /*hasEnrolledFace*/);
-        verifyShowsDialogAfterClickingUnlock();
+        verifyShowsDialogAfterClickingUnlock(mFragment.getFacePreferenceKey());
     }
 
     @Test
@@ -424,8 +453,11 @@
     }
 
     private void verifyNoDialogAfterClickingUnlock(String preferenceKey) {
-        verify(mBiometricSettingsAppPreferenceController).handlePreferenceTreeClick(
-                mPreferenceCaptor.capture());
+        final BiometricStatusPreferenceController controller =
+                preferenceKey.equals(mFragment.getFacePreferenceKey())
+                        ? mFaceStatusPreferenceController
+                        : mFingerprintStatusPreferenceController;
+        verify(controller).handlePreferenceTreeClick(mPreferenceCaptor.capture());
         List<Preference> capturedPreferences = mPreferenceCaptor.getAllValues();
         assertThat(capturedPreferences).hasSize(1);
         assertThat(capturedPreferences.get(0).getKey()).isEqualTo(preferenceKey);
@@ -433,12 +465,77 @@
                 eq(BiometricsSplitScreenDialog.class.getName()));
     }
 
-    private void verifyShowsDialogAfterClickingUnlock() {
-        verify(mBiometricSettingsAppPreferenceController, never()).handlePreferenceTreeClick(any());
+    private void verifyShowsDialogAfterClickingUnlock(String preferenceKey) {
+        final BiometricStatusPreferenceController controller =
+                preferenceKey.equals(mFragment.getFacePreferenceKey())
+                        ? mFaceStatusPreferenceController
+                        : mFingerprintStatusPreferenceController;
+        verify(controller, never()).handlePreferenceTreeClick(any());
         verify(mFragmentTransaction).add(any(),
                 eq(BiometricsSplitScreenDialog.class.getName()));
     }
 
+    @Test
+    public void testNoCrashIfDetachActivityDuringGeneratingChallengeThroughFaceManager() {
+        doAnswer(invocation -> {
+            final FaceManager.GenerateChallengeCallback callback =
+                    invocation.getArgument(1);
+            mFragment.onPause();
+            mFragment.onStop();
+            mFragment.onDestroy();
+            mFragment.onDetach();
+            doReturn(null).when(mFragment).getActivity();
+            callback.onGenerateChallengeResult(0, 0, 1L);
+            return null;
+        }).when(mFaceManager).generateChallenge(anyInt(), any());
+        doThrow(new IllegalStateException("Test")).when(mFragment).requestGatekeeperHat(
+                any(), anyLong(), anyInt(), anyLong());
+        FragmentManager fragmentManager = mock(FragmentManager.class);
+
+        // Start fragment
+        mFragment.onAttach(mContext);
+        mFragment.onCreate(null);
+        mFragment.onCreateView(LayoutInflater.from(mContext), mock(ViewGroup.class), Bundle.EMPTY);
+        mFragment.onResume();
+
+        // User clicks on "Face Unlock"
+        final Preference preference = new Preference(mContext);
+        preference.setKey(mFragment.getFacePreferenceKey());
+        mFragment.onPreferenceTreeClick(preference);
+
+        verify(mFragment, never()).launchChooseOrConfirmLock();
+    }
+
+    @Test
+    public void testNoCrashIfDetachActivityDuringGeneratingChallengeThroughFingerprintManager() {
+        doAnswer(invocation -> {
+            final FingerprintManager.GenerateChallengeCallback callback =
+                    invocation.getArgument(1);
+            mFragment.onPause();
+            mFragment.onStop();
+            mFragment.onDestroy();
+            mFragment.onDetach();
+            doReturn(null).when(mFragment).getActivity();
+            callback.onChallengeGenerated(0, 0, 1L);
+            return null;
+        }).when(mFingerprintManager).generateChallenge(anyInt(), any());
+        doThrow(new IllegalStateException("Test")).when(mFragment).requestGatekeeperHat(
+                any(), anyLong(), anyInt(), anyLong());
+
+        // Start fragment
+        mFragment.onAttach(mContext);
+        mFragment.onCreate(null);
+        mFragment.onCreateView(LayoutInflater.from(mContext), mock(ViewGroup.class), Bundle.EMPTY);
+        mFragment.onResume();
+
+        // User clicks on "Fingerprint Unlock"
+        final Preference preference = new Preference(mContext);
+        preference.setKey(mFragment.getFingerprintPreferenceKey());
+        mFragment.onPreferenceTreeClick(preference);
+
+        verify(mFragment, never()).launchChooseOrConfirmLock();
+    }
+
     /**
      * a test fragment that initializes PreferenceScreen for testing.
      */
@@ -492,7 +589,9 @@
 
         @Override
         protected void launchChooseOrConfirmLock() {
-            // do nothing
+            if (getActivity() == null) {
+                throw new AndroidRuntimeException("TestFailed");
+            }
         }
     }
 }
diff --git a/tests/robotests/src/com/android/settings/bluetooth/BluetoothDetailsAudioDeviceTypeControllerTest.java b/tests/robotests/src/com/android/settings/bluetooth/BluetoothDetailsAudioDeviceTypeControllerTest.java
new file mode 100644
index 0000000..0fc0647
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/bluetooth/BluetoothDetailsAudioDeviceTypeControllerTest.java
@@ -0,0 +1,119 @@
+/*
+ * Copyright (C) 2022 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.bluetooth;
+
+import static android.bluetooth.BluetoothDevice.DEVICE_TYPE_LE;
+import static android.media.AudioManager.AUDIO_DEVICE_CATEGORY_SPEAKER;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.bluetooth.BluetoothDevice;
+import android.media.AudioManager;
+
+import androidx.preference.ListPreference;
+import androidx.preference.PreferenceCategory;
+
+import com.android.settingslib.bluetooth.LeAudioProfile;
+import com.android.settingslib.bluetooth.LocalBluetoothManager;
+import com.android.settingslib.bluetooth.LocalBluetoothProfileManager;
+import com.android.settingslib.core.lifecycle.Lifecycle;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
+import org.robolectric.RuntimeEnvironment;
+
+@RunWith(RobolectricTestRunner.class)
+public class BluetoothDetailsAudioDeviceTypeControllerTest extends
+        BluetoothDetailsControllerTestBase {
+
+    private static final String MAC_ADDRESS = "04:52:C7:0B:D8:3C";
+    private static final String KEY_BT_AUDIO_DEVICE_TYPE = "bluetooth_audio_device_type";
+
+    @Mock
+    private AudioManager mAudioManager;
+    @Mock
+    private Lifecycle mAudioDeviceTypeLifecycle;
+    @Mock
+    private PreferenceCategory mProfilesContainer;
+    @Mock
+    private BluetoothDevice mBluetoothDevice;
+    @Mock
+    private LocalBluetoothManager mManager;
+    @Mock
+    private LocalBluetoothProfileManager mProfileManager;
+    @Mock
+    private LeAudioProfile mLeAudioProfile;
+    private BluetoothDetailsAudioDeviceTypeController mController;
+    private ListPreference mAudioDeviceTypePref;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+
+        mContext = spy(RuntimeEnvironment.application);
+        when(mContext.getSystemService(AudioManager.class)).thenReturn(mAudioManager);
+        when(mCachedDevice.getAddress()).thenReturn(MAC_ADDRESS);
+        when(mCachedDevice.getDevice()).thenReturn(mBluetoothDevice);
+        when(mBluetoothDevice.getAnonymizedAddress()).thenReturn(MAC_ADDRESS);
+        when(mBluetoothDevice.getType()).thenReturn(DEVICE_TYPE_LE);
+        when(mManager.getProfileManager()).thenReturn(mProfileManager);
+        when(mProfileManager.getLeAudioProfile()).thenReturn(mLeAudioProfile);
+        when(mLeAudioProfile.isEnabled(mCachedDevice.getDevice())).thenReturn(true);
+
+        mController = new BluetoothDetailsAudioDeviceTypeController(mContext, mFragment, mManager,
+                mCachedDevice, mAudioDeviceTypeLifecycle);
+        mController.mProfilesContainer = mProfilesContainer;
+
+        mController.createAudioDeviceTypePreference(mContext);
+        mAudioDeviceTypePref = mController.getAudioDeviceTypePreference();
+
+        when(mProfilesContainer.findPreference(KEY_BT_AUDIO_DEVICE_TYPE)).thenReturn(
+                mAudioDeviceTypePref);
+    }
+
+    @Test
+    public void createAudioDeviceTypePreference_btDeviceIsCategorized_checkSelection() {
+        int deviceType = AUDIO_DEVICE_CATEGORY_SPEAKER;
+        when(mAudioManager.getBluetoothAudioDeviceCategory(MAC_ADDRESS, /*isBle=*/true)).thenReturn(
+                deviceType);
+
+        mController.createAudioDeviceTypePreference(mContext);
+        mAudioDeviceTypePref = mController.getAudioDeviceTypePreference();
+
+        assertThat(mAudioDeviceTypePref.getValue()).isEqualTo(Integer.toString(deviceType));
+    }
+
+    @Test
+    public void selectDeviceTypeSpeaker_invokeSetBluetoothAudioDeviceType() {
+        int deviceType = AUDIO_DEVICE_CATEGORY_SPEAKER;
+        mAudioDeviceTypePref.setValue(Integer.toString(deviceType));
+
+        mController.onPreferenceChange(mAudioDeviceTypePref, Integer.toString(deviceType));
+
+        verify(mAudioManager).setBluetoothAudioDeviceCategory(eq(MAC_ADDRESS), eq(true),
+                eq(AUDIO_DEVICE_CATEGORY_SPEAKER));
+    }
+}
diff --git a/tests/robotests/src/com/android/settings/bluetooth/BluetoothDetailsCompanionAppsControllerTest.java b/tests/robotests/src/com/android/settings/bluetooth/BluetoothDetailsCompanionAppsControllerTest.java
index e27f43c..120274d 100644
--- a/tests/robotests/src/com/android/settings/bluetooth/BluetoothDetailsCompanionAppsControllerTest.java
+++ b/tests/robotests/src/com/android/settings/bluetooth/BluetoothDetailsCompanionAppsControllerTest.java
@@ -104,6 +104,7 @@
                 associationId,
                 /* userId */ 0,
                 packageName,
+                /* tag */ null,
                 MacAddress.fromString(mCachedDevice.getAddress()),
                 /* displayName */ null,
                 /* deviceProfile */ "",
diff --git a/tests/robotests/src/com/android/settings/bluetooth/BluetoothPairingDialogTest.java b/tests/robotests/src/com/android/settings/bluetooth/BluetoothPairingDialogTest.java
index 517b435..2044881 100644
--- a/tests/robotests/src/com/android/settings/bluetooth/BluetoothPairingDialogTest.java
+++ b/tests/robotests/src/com/android/settings/bluetooth/BluetoothPairingDialogTest.java
@@ -33,7 +33,6 @@
 import android.text.TextUtils;
 import android.view.View;
 import android.view.inputmethod.InputMethodManager;
-import android.widget.CheckBox;
 import android.widget.TextView;
 
 import androidx.appcompat.app.AlertDialog;
@@ -276,7 +275,7 @@
     }
 
     @Test
-    public void contactSharingCheckbox_conditionIsReady_showsUi() {
+    public void contactSharingToggle_conditionIsReady_showsUi() {
         // set the dialog variant to confirmation/consent
         when(controller.getDialogType()).thenReturn(BluetoothPairingController.CONFIRMATION_DIALOG);
         // set a fake device name and pretend the profile has not been set up for it
@@ -286,14 +285,14 @@
         // build the fragment
         BluetoothPairingDialogFragment frag = makeFragment();
 
-        // verify that the checkbox is visible and that the device name is correct
-        CheckBox sharingCheckbox =
-                frag.getmDialog().findViewById(R.id.phonebook_sharing_message_confirm_pin);
-        assertThat(sharingCheckbox.getVisibility()).isEqualTo(View.VISIBLE);
+        // verify that the toggle is visible
+        View sharingToggle =
+                frag.getmDialog().findViewById(R.id.phonebook_sharing);
+        assertThat(sharingToggle.getVisibility()).isEqualTo(View.VISIBLE);
     }
 
     @Test
-    public void contactSharingCheckbox_conditionIsNotReady_doesNotShowUi() {
+    public void contactSharingToggle_conditionIsNotReady_doesNotShowUi() {
         // set the dialog variant to confirmation/consent
         when(controller.getDialogType()).thenReturn(BluetoothPairingController.CONFIRMATION_DIALOG);
         // set a fake device name and pretend the profile has been set up for it
@@ -303,10 +302,10 @@
         // build the fragment
         BluetoothPairingDialogFragment frag = makeFragment();
 
-        // verify that the checkbox is gone
-        CheckBox sharingCheckbox =
-                frag.getmDialog().findViewById(R.id.phonebook_sharing_message_confirm_pin);
-        assertThat(sharingCheckbox.getVisibility()).isEqualTo(View.GONE);
+        // verify that the toggle is gone
+        View sharingToggle =
+                frag.getmDialog().findViewById(R.id.phonebook_sharing);
+        assertThat(sharingToggle.getVisibility()).isEqualTo(View.GONE);
     }
 
     @Test
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 a3ec66f..b521be1 100644
--- a/tests/robotests/src/com/android/settings/connecteddevice/stylus/StylusDevicesControllerTest.java
+++ b/tests/robotests/src/com/android/settings/connecteddevice/stylus/StylusDevicesControllerTest.java
@@ -57,6 +57,7 @@
 
 import com.android.settings.R;
 import com.android.settings.dashboard.profileselector.UserAdapter;
+import com.android.settingslib.PrimarySwitchPreference;
 import com.android.settingslib.bluetooth.CachedBluetoothDevice;
 import com.android.settingslib.core.lifecycle.Lifecycle;
 
@@ -403,9 +404,10 @@
                 Settings.Secure.STYLUS_HANDWRITING_ENABLED, 1);
 
         showScreen(mController);
-        SwitchPreference handwritingPref = (SwitchPreference) mPreferenceContainer.getPreference(1);
+        PrimarySwitchPreference handwritingPref =
+                (PrimarySwitchPreference) mPreferenceContainer.getPreference(1);
 
-        assertThat(handwritingPref.isChecked()).isEqualTo(true);
+        assertThat(handwritingPref.getCheckedState()).isEqualTo(true);
     }
 
     @Test
@@ -414,9 +416,10 @@
                 Settings.Secure.STYLUS_HANDWRITING_ENABLED, 0);
 
         showScreen(mController);
-        SwitchPreference handwritingPref = (SwitchPreference) mPreferenceContainer.getPreference(1);
+        PrimarySwitchPreference handwritingPref =
+                (PrimarySwitchPreference) mPreferenceContainer.getPreference(1);
 
-        assertThat(handwritingPref.isChecked()).isEqualTo(false);
+        assertThat(handwritingPref.getCheckedState()).isEqualTo(false);
     }
 
     @Test
@@ -424,21 +427,20 @@
         Settings.Secure.putInt(mContext.getContentResolver(),
                 Settings.Secure.STYLUS_HANDWRITING_ENABLED, 0);
         showScreen(mController);
-        SwitchPreference handwritingPref = (SwitchPreference) mPreferenceContainer.getPreference(1);
+        PrimarySwitchPreference handwritingPref =
+                (PrimarySwitchPreference) mPreferenceContainer.getPreference(1);
 
-        handwritingPref.performClick();
+        handwritingPref.callChangeListener(true);
 
-        assertThat(handwritingPref.isChecked()).isEqualTo(true);
         assertThat(Settings.Secure.getInt(mContext.getContentResolver(),
                 Settings.Secure.STYLUS_HANDWRITING_ENABLED, -1)).isEqualTo(1);
     }
 
     @Test
-    public void handwritingPreference_startsHandwritingSettingsOnClickIfChecked() {
-        Settings.Secure.putInt(mContext.getContentResolver(),
-                Settings.Secure.STYLUS_HANDWRITING_ENABLED, 0);
+    public void handwritingPreference_startsHandwritingSettingsOnClick() {
         showScreen(mController);
-        SwitchPreference handwritingPref = (SwitchPreference) mPreferenceContainer.getPreference(1);
+        PrimarySwitchPreference handwritingPref =
+                (PrimarySwitchPreference) mPreferenceContainer.getPreference(1);
 
         handwritingPref.performClick();
 
@@ -447,11 +449,23 @@
     }
 
     @Test
-    public void handwritingPreference_doesNotStartHandwritingSettingsOnClickIfNotChecked() {
-        Settings.Secure.putInt(mContext.getContentResolver(),
-                Settings.Secure.STYLUS_HANDWRITING_ENABLED, 1);
+    public void handwritingPreference_doesNotStartHandwritingSettingsOnChange() {
         showScreen(mController);
-        SwitchPreference handwritingPref = (SwitchPreference) mPreferenceContainer.getPreference(1);
+        PrimarySwitchPreference handwritingPref =
+                (PrimarySwitchPreference) mPreferenceContainer.getPreference(1);
+
+        handwritingPref.callChangeListener(true);
+
+        verify(mInputMethodInfo, times(0)).createStylusHandwritingSettingsActivityIntent();
+        verify(mContext, times(0)).startActivity(any());
+    }
+
+    @Test
+    public void handwritingPreference_doesNotCreateIntentIfNoInputMethod() {
+        when(mImm.getCurrentInputMethodInfo()).thenReturn(null);
+        showScreen(mController);
+        PrimarySwitchPreference handwritingPref =
+                (PrimarySwitchPreference) mPreferenceContainer.getPreference(1);
 
         handwritingPref.performClick();
 
@@ -463,14 +477,12 @@
     public void handwritingPreference_doesNotStartHandwritingSettingsIfNoIntent() {
         when(mInputMethodInfo.createStylusHandwritingSettingsActivityIntent())
                 .thenReturn(null);
-        Settings.Secure.putInt(mContext.getContentResolver(),
-                Settings.Secure.STYLUS_HANDWRITING_ENABLED, 1);
         showScreen(mController);
-        SwitchPreference handwritingPref = (SwitchPreference) mPreferenceContainer.getPreference(1);
+        PrimarySwitchPreference handwritingPref =
+                (PrimarySwitchPreference) mPreferenceContainer.getPreference(1);
 
         handwritingPref.performClick();
 
-        verify(mInputMethodInfo, times(0)).createStylusHandwritingSettingsActivityIntent();
         verify(mContext, times(0)).startActivity(any());
     }
 
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageFeatureProviderImplTest.java b/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageFeatureProviderImplTest.java
index c9591a5..bf4e893 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageFeatureProviderImplTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageFeatureProviderImplTest.java
@@ -73,8 +73,8 @@
     }
 
     @Test
-    public void testIsBatteryTipsFeedbackEnabled_returnTrue() {
-        assertThat(mPowerFeatureProvider.isBatteryTipsFeedbackEnabled()).isTrue();
+    public void testIsBatteryTipsFeedbackEnabled_returnFalse() {
+        assertThat(mPowerFeatureProvider.isBatteryTipsFeedbackEnabled()).isFalse();
     }
     @Test
     public void testGetBatteryUsageListConsumePowerThreshold_return0() {
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryTipsCardPreferenceTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryTipsCardPreferenceTest.java
index 6f9a474..bc787f1 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryTipsCardPreferenceTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryTipsCardPreferenceTest.java
@@ -35,11 +35,14 @@
 
     private Context mContext;
     private BatteryTipsCardPreference mBatteryTipsCardPreference;
+    private BatteryTipsController mBatteryTipsController;
 
     @Before
     public void setUp() {
         mContext = spy(RuntimeEnvironment.application);
         mBatteryTipsCardPreference = new BatteryTipsCardPreference(mContext, /*attrs=*/ null);
+        mBatteryTipsController = new BatteryTipsController(mContext);
+        mBatteryTipsController.mCardPreference = mBatteryTipsCardPreference;
     }
 
     @Test
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryTipsControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryTipsControllerTest.java
new file mode 100644
index 0000000..0c9a0b0
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryTipsControllerTest.java
@@ -0,0 +1,149 @@
+/*
+ * 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.fuelgauge.batteryusage;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.content.res.Resources;
+import android.os.LocaleList;
+
+import com.android.settings.fuelgauge.PowerUsageFeatureProvider;
+import com.android.settings.testutils.BatteryTestUtils;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
+import org.robolectric.RuntimeEnvironment;
+
+import java.util.Locale;
+import java.util.TimeZone;
+
+@RunWith(RobolectricTestRunner.class)
+public final class BatteryTipsControllerTest {
+
+    private Context mContext;
+    private BatteryTipsController mBatteryTipsController;
+
+    @Mock
+    private BatteryTipsCardPreference mBatteryTipsCardPreference;
+
+    @Mock
+    private PowerUsageFeatureProvider mPowerUsageFeatureProvider;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        Locale.setDefault(new Locale("en_US"));
+        org.robolectric.shadows.ShadowSettings.set24HourTimeFormat(false);
+        TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
+        mContext = spy(RuntimeEnvironment.application);
+        final Resources resources = spy(mContext.getResources());
+        resources.getConfiguration().setLocales(new LocaleList(new Locale("en_US")));
+        doReturn(resources).when(mContext).getResources();
+        mBatteryTipsController = new BatteryTipsController(mContext);
+        mBatteryTipsController.mCardPreference = mBatteryTipsCardPreference;
+        mBatteryTipsController.mPowerUsageFeatureProvider = mPowerUsageFeatureProvider;
+    }
+
+    @Test
+    public void parsePowerAnomalyKey_preDefinedKeys_returnTrue() {
+        final String[] keys = {"adaptive_brightness", "screen_timeout"};
+        for (int index = 0; index < keys.length; index++) {
+            assertThat(mBatteryTipsController.getPowerAnomalyEventIndex(keys[index]))
+                    .isEqualTo(index);
+        }
+    }
+
+    @Test
+    public void parsePowerAnomalyKey_unknownKey_returnTrue() {
+        final String key = "unknown_key_for_test";
+        assertThat(mBatteryTipsController.getPowerAnomalyEventIndex(key)).isEqualTo(-1);
+    }
+
+    @Test
+    public void handleBatteryTipsCardUpdated_null_hidePreference() {
+        mBatteryTipsController.handleBatteryTipsCardUpdated(/* powerAnomalyEvents= */ null);
+
+        verify(mBatteryTipsCardPreference).setVisible(false);
+    }
+
+    @Test
+    public void handleBatteryTipsCardUpdated_adaptiveBrightnessAnomaly_showAnomaly() {
+        PowerAnomalyEvent event = BatteryTestUtils.createAdaptiveBrightnessAnomalyEvent();
+        when(mPowerUsageFeatureProvider.isBatteryTipsEnabled()).thenReturn(true);
+
+        mBatteryTipsController.handleBatteryTipsCardUpdated(event);
+
+        // Check pre-defined string
+        verify(mBatteryTipsCardPreference).setTitle(
+                "Turn on adaptive brightness to extend battery life");
+        verify(mBatteryTipsCardPreference).setMainButtonLabel("View Settings");
+        verify(mBatteryTipsCardPreference).setDismissButtonLabel("Got it");
+        // Check proto info
+        verify(mBatteryTipsCardPreference).setMainButtonLauncherInfo(
+                "com.android.settings.display.AutoBrightnessSettings",
+                1381);
+        verify(mBatteryTipsCardPreference).setVisible(true);
+    }
+
+    @Test
+    public void handleBatteryTipsCardUpdated_screenTimeoutAnomaly_showAnomaly() {
+        PowerAnomalyEvent event = BatteryTestUtils.createScreenTimeoutAnomalyEvent();
+        when(mPowerUsageFeatureProvider.isBatteryTipsEnabled()).thenReturn(true);
+
+        mBatteryTipsController.handleBatteryTipsCardUpdated(event);
+
+        verify(mBatteryTipsCardPreference).setTitle("Reduce screen timeout to extend battery life");
+        verify(mBatteryTipsCardPreference).setMainButtonLabel("View Settings");
+        verify(mBatteryTipsCardPreference).setDismissButtonLabel("Got it");
+        verify(mBatteryTipsCardPreference).setMainButtonLauncherInfo(
+                "com.android.settings.display.ScreenTimeoutSettings",
+                1852);
+        verify(mBatteryTipsCardPreference).setVisible(true);
+    }
+    @Test
+    public void handleBatteryTipsCardUpdated_screenTimeoutAnomalyHasTitle_showAnomaly() {
+        PowerAnomalyEvent event = BatteryTestUtils.createScreenTimeoutAnomalyEvent();
+        String testTitle = "TestTitle";
+        event = event.toBuilder()
+                .setWarningBannerInfo(
+                        event.getWarningBannerInfo().toBuilder()
+                                .setTitleString(testTitle)
+                                .build())
+                .build();
+        when(mPowerUsageFeatureProvider.isBatteryTipsEnabled()).thenReturn(true);
+
+        mBatteryTipsController.handleBatteryTipsCardUpdated(event);
+
+        verify(mBatteryTipsCardPreference).setTitle(testTitle);
+        verify(mBatteryTipsCardPreference).setMainButtonLabel("View Settings");
+        verify(mBatteryTipsCardPreference).setDismissButtonLabel("Got it");
+        verify(mBatteryTipsCardPreference).setMainButtonLauncherInfo(
+                "com.android.settings.display.ScreenTimeoutSettings",
+                1852);
+        verify(mBatteryTipsCardPreference).setVisible(true);
+    }
+}
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/ConvertUtilsTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/ConvertUtilsTest.java
index 3cbe8a4..e9108bc 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/ConvertUtilsTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/ConvertUtilsTest.java
@@ -25,6 +25,7 @@
 import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.when;
 
+import android.app.usage.IUsageStatsManager;
 import android.app.usage.UsageEvents;
 import android.app.usage.UsageEvents.Event;
 import android.content.ContentValues;
@@ -61,6 +62,8 @@
     private BatteryUsageStats mBatteryUsageStats;
     @Mock
     private BatteryEntry mMockBatteryEntry;
+    @Mock
+    private IUsageStatsManager mUsageStatsManager;
 
     @Before
     public void setUp() {
@@ -68,6 +71,7 @@
         mContext = spy(RuntimeEnvironment.application);
         ConvertUtils.sUsageSource = ConvertUtils.EMPTY_USAGE_SOURCE;
         when(mContext.getPackageManager()).thenReturn(mMockPackageManager);
+        DataProcessor.sUsageStatsManager = mUsageStatsManager;
     }
 
     @Test
@@ -299,7 +303,7 @@
 
         final long userId = 2;
         final AppUsageEvent appUsageEvent = ConvertUtils.convertToAppUsageEvent(
-                mContext, event, userId);
+                mContext, mUsageStatsManager, event, userId);
         assertThat(appUsageEvent.getTimestamp()).isEqualTo(101L);
         assertThat(appUsageEvent.getType()).isEqualTo(AppUsageEventType.ACTIVITY_RESUMED);
         assertThat(appUsageEvent.getPackageName()).isEqualTo("com.android.settings1");
@@ -320,7 +324,7 @@
 
         final long userId = 1;
         final AppUsageEvent appUsageEvent =
-                ConvertUtils.convertToAppUsageEvent(mContext, event, userId);
+                ConvertUtils.convertToAppUsageEvent(mContext, mUsageStatsManager, event, userId);
         assertThat(appUsageEvent.getTimestamp()).isEqualTo(101L);
         assertThat(appUsageEvent.getType()).isEqualTo(AppUsageEventType.DEVICE_SHUTDOWN);
         assertThat(appUsageEvent.getPackageName()).isEqualTo("com.android.settings1");
@@ -336,7 +340,8 @@
         event.mPackage = null;
 
         final AppUsageEvent appUsageEvent =
-                ConvertUtils.convertToAppUsageEvent(mContext, event, /*userId=*/ 0);
+                ConvertUtils.convertToAppUsageEvent(
+                        mContext, mUsageStatsManager, event, /*userId=*/ 0);
 
         assertThat(appUsageEvent).isNull();
     }
@@ -352,7 +357,7 @@
 
         final long userId = 1;
         final AppUsageEvent appUsageEvent =
-                ConvertUtils.convertToAppUsageEvent(mContext, event, userId);
+                ConvertUtils.convertToAppUsageEvent(mContext, mUsageStatsManager, event, userId);
 
         assertThat(appUsageEvent).isNull();
     }
@@ -453,7 +458,7 @@
         final String taskRootPackageName = "com.android.settings2";
 
         assertThat(ConvertUtils.getEffectivePackageName(
-                mContext, packageName, taskRootPackageName))
+                mContext, mUsageStatsManager, packageName, taskRootPackageName))
                 .isEqualTo(packageName);
     }
 
@@ -463,7 +468,7 @@
         final String taskRootPackageName = "com.android.settings2";
 
         assertThat(ConvertUtils.getEffectivePackageName(
-                mContext, packageName, taskRootPackageName))
+                mContext, mUsageStatsManager, packageName, taskRootPackageName))
                 .isEqualTo(packageName);
     }
 
@@ -474,7 +479,7 @@
         final String taskRootPackageName = "com.android.settings2";
 
         assertThat(ConvertUtils.getEffectivePackageName(
-                mContext, packageName, taskRootPackageName))
+                mContext, mUsageStatsManager, packageName, taskRootPackageName))
                 .isEqualTo(taskRootPackageName);
     }
 
@@ -484,10 +489,10 @@
         final String packageName = "com.android.settings1";
 
         assertThat(ConvertUtils.getEffectivePackageName(
-                mContext, packageName, /*taskRootPackageName=*/ null))
+                mContext, mUsageStatsManager, packageName, /*taskRootPackageName=*/ null))
                 .isEqualTo(packageName);
         assertThat(ConvertUtils.getEffectivePackageName(
-                mContext, packageName, /*taskRootPackageName=*/ ""))
+                mContext, mUsageStatsManager, packageName, /*taskRootPackageName=*/ ""))
                 .isEqualTo(packageName);
     }
 }
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/DataProcessManagerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/DataProcessManagerTest.java
index 7f7fe43..b610cfb 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/DataProcessManagerTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/DataProcessManagerTest.java
@@ -72,7 +72,7 @@
         MockitoAnnotations.initMocks(this);
 
         mContext = spy(RuntimeEnvironment.application);
-        DatabaseUtils.sUsageStatsManager = mUsageStatsManager;
+        DataProcessor.sUsageStatsManager = mUsageStatsManager;
         doReturn(mContext).when(mContext).getApplicationContext();
         doReturn(mUserManager)
                 .when(mContext)
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/DataProcessorTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/DataProcessorTest.java
index 8bed054..c9b635e 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/DataProcessorTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/DataProcessorTest.java
@@ -93,7 +93,7 @@
         mPowerUsageFeatureProvider = mFeatureFactory.powerUsageFeatureProvider;
 
         DataProcessor.sTestSystemAppsPackageNames = Set.of();
-        DatabaseUtils.sUsageStatsManager = mUsageStatsManager;
+        DataProcessor.sUsageStatsManager = mUsageStatsManager;
         doReturn(mIntent).when(mContext).registerReceiver(
                 isA(BroadcastReceiver.class), isA(IntentFilter.class));
         doReturn(100).when(mIntent).getIntExtra(eq(BatteryManager.EXTRA_SCALE), anyInt());
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/DatabaseUtilsTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/DatabaseUtilsTest.java
index 24be769..8a1ba13 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/DatabaseUtilsTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/DatabaseUtilsTest.java
@@ -85,7 +85,7 @@
         doReturn(mPackageManager).when(mMockContext).getPackageManager();
         doReturn(mPackageManager).when(mContext).getPackageManager();
         DatabaseUtils.getSharedPreferences(mContext).edit().clear().apply();
-        DatabaseUtils.sUsageStatsManager = mUsageStatsManager;
+        DataProcessor.sUsageStatsManager = mUsageStatsManager;
     }
 
     @Test
@@ -466,7 +466,7 @@
                 .putInt(DatabaseUtils.KEY_LAST_USAGE_SOURCE, USAGE_SOURCE_TASK_ROOT_ACTIVITY)
                 .apply();
 
-        assertThat(DatabaseUtils.getUsageSource(mContext))
+        assertThat(DatabaseUtils.getUsageSource(mContext, mUsageStatsManager))
                 .isEqualTo(USAGE_SOURCE_TASK_ROOT_ACTIVITY);
     }
 
@@ -474,7 +474,7 @@
     public void getUsageSource_notHasData_writeLoadedData() throws RemoteException {
         when(mUsageStatsManager.getUsageSource()).thenReturn(USAGE_SOURCE_TASK_ROOT_ACTIVITY);
 
-        assertThat(DatabaseUtils.getUsageSource(mContext))
+        assertThat(DatabaseUtils.getUsageSource(mContext, mUsageStatsManager))
                 .isEqualTo(USAGE_SOURCE_TASK_ROOT_ACTIVITY);
         assertThat(
                 DatabaseUtils
@@ -487,7 +487,7 @@
     public void getUsageSource_throwException_writeDefaultData() throws RemoteException {
         when(mUsageStatsManager.getUsageSource()).thenThrow(new RemoteException());
 
-        assertThat(DatabaseUtils.getUsageSource(mContext))
+        assertThat(DatabaseUtils.getUsageSource(mContext, mUsageStatsManager))
                 .isEqualTo(USAGE_SOURCE_CURRENT_ACTIVITY);
         assertThat(
                 DatabaseUtils
diff --git a/tests/robotests/src/com/android/settings/inputmethod/AvailableVirtualKeyboardFragmentTest.java b/tests/robotests/src/com/android/settings/inputmethod/AvailableVirtualKeyboardFragmentTest.java
index 98ecc05..c6a5d64 100644
--- a/tests/robotests/src/com/android/settings/inputmethod/AvailableVirtualKeyboardFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/inputmethod/AvailableVirtualKeyboardFragmentTest.java
@@ -23,11 +23,11 @@
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.anyInt;
 import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
-import static org.mockito.Mockito.mock;
 
 import android.content.Context;
 import android.content.pm.ApplicationInfo;
@@ -159,7 +159,7 @@
         mFragment.updateInputMethodPreferenceViews();
 
         verify(mValuesWrapper).getInputMethodList();
-        verify(mInputMethodManager).getEnabledInputMethodListAsUser(anyInt());
+        verify(mInputMethodManager).getEnabledInputMethodListAsUser(any(UserHandle.class));
     }
 
     @Test
diff --git a/tests/robotests/src/com/android/settings/remoteauth/introduction/RemoteAuthEnrollIntroductionTest.kt b/tests/robotests/src/com/android/settings/remoteauth/introduction/RemoteAuthEnrollIntroductionTest.kt
new file mode 100644
index 0000000..a271184
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/remoteauth/introduction/RemoteAuthEnrollIntroductionTest.kt
@@ -0,0 +1,52 @@
+/*
+ * 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.remoteauth.introduction
+
+import android.content.Context
+import android.os.Bundle
+import androidx.fragment.app.testing.launchFragmentInContainer
+import androidx.test.core.app.ApplicationProvider
+import com.android.settings.R
+import com.google.android.setupdesign.GlifLayout
+import com.google.common.truth.Truth.assertThat
+
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.robolectric.RobolectricTestRunner
+
+@RunWith(RobolectricTestRunner::class)
+class RemoteAuthEnrollIntroductionTest {
+    private var mContext : Context = ApplicationProvider.getApplicationContext()
+
+    @Test
+    fun testRemoteAuthenticatorEnrollIntroduction_hasHeader() {
+        launchFragmentInContainer<RemoteAuthEnrollIntroduction>(Bundle(), R.style.SudThemeGlif)
+            .onFragment {
+                assertThat((it.view as GlifLayout).headerText)
+                    .isEqualTo(mContext.getString(R.string.security_settings_remoteauth_enroll_introduction_title))
+            }
+    }
+
+    @Test
+    fun testRemoteAuthenticatorEnrollIntroduction_hasDescription() {
+        launchFragmentInContainer<RemoteAuthEnrollIntroduction>(Bundle(), R.style.SudThemeGlif)
+            .onFragment {
+                assertThat((it.view as GlifLayout).descriptionText)
+                    .isEqualTo(mContext.getString(R.string.security_settings_remoteauth_enroll_introduction_message))
+            }
+    }
+}
\ No newline at end of file
diff --git a/tests/robotests/src/com/android/settings/search/actionbar/SearchMenuControllerTest.java b/tests/robotests/src/com/android/settings/search/actionbar/SearchMenuControllerTest.java
index b899e3a..eb6ad0c 100644
--- a/tests/robotests/src/com/android/settings/search/actionbar/SearchMenuControllerTest.java
+++ b/tests/robotests/src/com/android/settings/search/actionbar/SearchMenuControllerTest.java
@@ -33,6 +33,7 @@
 
 import androidx.fragment.app.FragmentActivity;
 
+import com.android.settings.R;
 import com.android.settings.core.InstrumentedFragment;
 import com.android.settings.testutils.shadow.ShadowUtils;
 
@@ -71,7 +72,7 @@
 
         when(mHost.getActivity()).thenReturn(mActivity);
         when(mMenu.add(Menu.NONE, MENU_SEARCH, 0 /* order */,
-                com.android.settingslib.widget.R.string.search_menu))
+                R.string.search_menu))
                 .thenReturn(mock(MenuItem.class));
     }
 
@@ -81,7 +82,7 @@
         mHost.getSettingsLifecycle().onCreateOptionsMenu(mMenu, null /* inflater */);
 
         verify(mMenu).add(Menu.NONE, MENU_SEARCH, 0 /* order */,
-                com.android.settingslib.widget.R.string.search_menu);
+                R.string.search_menu);
     }
 
     @Test
diff --git a/tests/robotests/src/com/android/settings/testutils/BatteryTestUtils.java b/tests/robotests/src/com/android/settings/testutils/BatteryTestUtils.java
index c54b750..e99b17f 100644
--- a/tests/robotests/src/com/android/settings/testutils/BatteryTestUtils.java
+++ b/tests/robotests/src/com/android/settings/testutils/BatteryTestUtils.java
@@ -18,6 +18,7 @@
 
 import static org.mockito.Mockito.when;
 
+import android.app.settings.SettingsEnums;
 import android.content.Context;
 import android.content.Intent;
 import android.hardware.usb.UsbManager;
@@ -25,11 +26,17 @@
 import android.hardware.usb.UsbPortStatus;
 import android.os.BatteryManager;
 import android.os.UserManager;
+
 import androidx.room.Room;
 
+import com.android.settings.display.AutoBrightnessSettings;
+import com.android.settings.display.ScreenTimeoutSettings;
 import com.android.settings.fuelgauge.batteryusage.BatteryInformation;
 import com.android.settings.fuelgauge.batteryusage.ConvertUtils;
 import com.android.settings.fuelgauge.batteryusage.DeviceBatteryState;
+import com.android.settings.fuelgauge.batteryusage.PowerAnomalyEvent;
+import com.android.settings.fuelgauge.batteryusage.PowerAnomalyEventList;
+import com.android.settings.fuelgauge.batteryusage.WarningBannerInfo;
 import com.android.settings.fuelgauge.batteryusage.db.AppUsageEventDao;
 import com.android.settings.fuelgauge.batteryusage.db.AppUsageEventEntity;
 import com.android.settings.fuelgauge.batteryusage.db.BatteryState;
@@ -193,4 +200,33 @@
         when(mockUsbPortStatus.getComplianceWarnings())
                 .thenReturn(new int[]{UsbPortStatus.COMPLIANCE_WARNING_OTHER});
     }
+
+    /** Create an empty power anomaly event list proto. */
+    public static PowerAnomalyEventList createEmptyPowerAnomalyEventList() {
+        return PowerAnomalyEventList.getDefaultInstance();
+    }
+
+    /** Create a power anomaly event proto of adaptive brightness. */
+    public static PowerAnomalyEvent createAdaptiveBrightnessAnomalyEvent() {
+        return PowerAnomalyEvent.newBuilder()
+                .setType("settings banner")
+                .setKey("adaptive_brightness")
+                .setWarningBannerInfo(WarningBannerInfo.newBuilder()
+                        .setMainButtonDestination(AutoBrightnessSettings.class.getName())
+                        .setMainButtonSourceMetricsCategory(SettingsEnums.SETTINGS_AUTO_BRIGHTNESS)
+                        .build())
+                .build();
+    }
+
+    /** Create a power anomaly event proto of screen timeout. */
+    public static PowerAnomalyEvent createScreenTimeoutAnomalyEvent() {
+        return PowerAnomalyEvent.newBuilder()
+                .setType("settings banner")
+                .setKey("screen_timeout")
+                .setWarningBannerInfo(WarningBannerInfo.newBuilder()
+                        .setMainButtonDestination(ScreenTimeoutSettings.class.getName())
+                        .setMainButtonSourceMetricsCategory(SettingsEnums.SCREEN_TIMEOUT)
+                        .build())
+                .build();
+    }
 }
diff --git a/tests/spa_unit/src/com/android/settings/applications/specialaccess/DataSaverControllerTest.kt b/tests/spa_unit/src/com/android/settings/applications/specialaccess/DataSaverControllerTest.kt
index c2413af..5d3c1c0 100644
--- a/tests/spa_unit/src/com/android/settings/applications/specialaccess/DataSaverControllerTest.kt
+++ b/tests/spa_unit/src/com/android/settings/applications/specialaccess/DataSaverControllerTest.kt
@@ -29,7 +29,6 @@
 import com.android.settings.core.BasePreferenceController.UNSUPPORTED_ON_DEVICE
 import com.android.settingslib.spaprivileged.model.app.AppListRepository
 import com.google.common.truth.Truth.assertThat
-import kotlinx.coroutines.ExperimentalCoroutinesApi
 import kotlinx.coroutines.flow.Flow
 import kotlinx.coroutines.flow.flowOf
 import kotlinx.coroutines.test.runTest
@@ -43,7 +42,6 @@
 import org.mockito.junit.MockitoRule
 import org.mockito.Mockito.`when` as whenever
 
-@OptIn(ExperimentalCoroutinesApi::class)
 @RunWith(AndroidJUnit4::class)
 class DataSaverControllerTest {
     @get:Rule
diff --git a/tests/spa_unit/src/com/android/settings/network/telephony/DataUsagePreferenceControllerTest.kt b/tests/spa_unit/src/com/android/settings/network/telephony/DataUsagePreferenceControllerTest.kt
index 342ebeb..a6d1531 100644
--- a/tests/spa_unit/src/com/android/settings/network/telephony/DataUsagePreferenceControllerTest.kt
+++ b/tests/spa_unit/src/com/android/settings/network/telephony/DataUsagePreferenceControllerTest.kt
@@ -37,7 +37,6 @@
 import com.android.settingslib.net.DataUsageController.DataUsageInfo
 import com.android.settingslib.spa.testutils.waitUntil
 import com.google.common.truth.Truth.assertThat
-import kotlinx.coroutines.ExperimentalCoroutinesApi
 import kotlinx.coroutines.test.runTest
 import org.junit.After
 import org.junit.Before
@@ -53,7 +52,6 @@
 import org.mockito.quality.Strictness
 import org.mockito.Mockito.`when` as whenever
 
-@OptIn(ExperimentalCoroutinesApi::class)
 @RunWith(AndroidJUnit4::class)
 class DataUsagePreferenceControllerTest {
 
diff --git a/tests/spa_unit/src/com/android/settings/network/telephony/TelephonyStatusControlSessionTest.kt b/tests/spa_unit/src/com/android/settings/network/telephony/TelephonyStatusControlSessionTest.kt
index 7e6a91b..cf6b919 100644
--- a/tests/spa_unit/src/com/android/settings/network/telephony/TelephonyStatusControlSessionTest.kt
+++ b/tests/spa_unit/src/com/android/settings/network/telephony/TelephonyStatusControlSessionTest.kt
@@ -23,12 +23,10 @@
 import com.android.settings.core.BasePreferenceController
 import com.android.settingslib.spa.testutils.waitUntil
 import com.google.common.truth.Truth.assertThat
-import kotlinx.coroutines.ExperimentalCoroutinesApi
 import kotlinx.coroutines.test.runTest
 import org.junit.Test
 import org.junit.runner.RunWith
 
-@OptIn(ExperimentalCoroutinesApi::class)
 @RunWith(AndroidJUnit4::class)
 class TelephonyStatusControlSessionTest {
     private val context: Context = ApplicationProvider.getApplicationContext()
diff --git a/tests/spa_unit/src/com/android/settings/spa/app/AllAppListTest.kt b/tests/spa_unit/src/com/android/settings/spa/app/AllAppListTest.kt
index 2e7752e..97a5a81 100644
--- a/tests/spa_unit/src/com/android/settings/spa/app/AllAppListTest.kt
+++ b/tests/spa_unit/src/com/android/settings/spa/app/AllAppListTest.kt
@@ -33,7 +33,6 @@
 import com.android.settingslib.spaprivileged.template.app.AppListInput
 import com.android.settingslib.spaprivileged.template.app.AppListItemModel
 import com.google.common.truth.Truth.assertThat
-import kotlinx.coroutines.ExperimentalCoroutinesApi
 import kotlinx.coroutines.flow.flowOf
 import kotlinx.coroutines.test.runTest
 import org.junit.Rule
@@ -118,7 +117,6 @@
             .isEqualTo("AppInfoSettings/package.name/0")
     }
 
-    @OptIn(ExperimentalCoroutinesApi::class)
     @Test
     fun allAppListModel_transform() = runTest {
         val listModel = AllAppListModel(context) { stateOf(SUMMARY) }
diff --git a/tests/spa_unit/src/com/android/settings/spa/app/appcompat/UserAspectRatioAppsPageProviderTest.kt b/tests/spa_unit/src/com/android/settings/spa/app/appcompat/UserAspectRatioAppsPageProviderTest.kt
index 0d2869c..19176f8 100644
--- a/tests/spa_unit/src/com/android/settings/spa/app/appcompat/UserAspectRatioAppsPageProviderTest.kt
+++ b/tests/spa_unit/src/com/android/settings/spa/app/appcompat/UserAspectRatioAppsPageProviderTest.kt
@@ -34,7 +34,6 @@
 import com.android.settingslib.spa.testutils.firstWithTimeoutOrNull
 import com.android.settingslib.spaprivileged.template.app.AppListItemModel
 import com.google.common.truth.Truth.assertThat
-import kotlinx.coroutines.ExperimentalCoroutinesApi
 import kotlinx.coroutines.flow.flowOf
 import kotlinx.coroutines.test.runTest
 import org.junit.Rule
@@ -67,14 +66,16 @@
     @Test
     fun injectEntry_summary() {
         setInjectEntry()
-        composeTestRule.onNodeWithText(context.getString(R.string.aspect_ratio_summary, Build.MODEL))
+        composeTestRule
+            .onNodeWithText(context.getString(R.string.aspect_ratio_summary, Build.MODEL))
             .assertIsDisplayed()
     }
 
     @Test
     fun injectEntry_onClick_navigate() {
         setInjectEntry()
-        composeTestRule.onNodeWithText(context.getString(R.string.aspect_ratio_title)).performClick()
+        composeTestRule.onNodeWithText(context.getString(R.string.aspect_ratio_title))
+            .performClick()
         assertThat(fakeNavControllerWrapper.navigateCalledWith).isEqualTo("UserAspectRatioAppsPage")
     }
 
@@ -103,7 +104,6 @@
         composeTestRule.onNodeWithText(LABEL).assertIsDisplayed()
     }
 
-    @OptIn(ExperimentalCoroutinesApi::class)
     @Test
     fun aspectRatioAppListModel_transform() = runTest {
         val listModel = UserAspectRatioAppListModel(context)
@@ -114,7 +114,6 @@
         assertThat(recordList[0].app).isSameInstanceAs(APP)
     }
 
-    @OptIn(ExperimentalCoroutinesApi::class)
     @Test
     fun aspectRatioAppListModel_filter() = runTest {
         val listModel = UserAspectRatioAppListModel(context)
diff --git a/tests/spa_unit/src/com/android/settings/spa/app/appinfo/PackageInfoPresenterTest.kt b/tests/spa_unit/src/com/android/settings/spa/app/appinfo/PackageInfoPresenterTest.kt
index 3bfa90e..2648e08 100644
--- a/tests/spa_unit/src/com/android/settings/spa/app/appinfo/PackageInfoPresenterTest.kt
+++ b/tests/spa_unit/src/com/android/settings/spa/app/appinfo/PackageInfoPresenterTest.kt
@@ -28,7 +28,6 @@
 import com.android.settingslib.spaprivileged.framework.common.activityManager
 import com.android.settingslib.spaprivileged.model.app.IPackageManagers
 import com.google.common.truth.Truth.assertThat
-import kotlinx.coroutines.ExperimentalCoroutinesApi
 import kotlinx.coroutines.coroutineScope
 import kotlinx.coroutines.test.runTest
 import org.junit.Before
@@ -45,7 +44,6 @@
 import org.mockito.junit.MockitoRule
 import org.mockito.Mockito.`when` as whenever
 
-@OptIn(ExperimentalCoroutinesApi::class)
 @RunWith(AndroidJUnit4::class)
 class PackageInfoPresenterTest {
     @get:Rule
diff --git a/tests/spa_unit/src/com/android/settings/spa/app/backgroundinstall/BackgroundInstalledAppsPageProviderTest.kt b/tests/spa_unit/src/com/android/settings/spa/app/backgroundinstall/BackgroundInstalledAppsPageProviderTest.kt
index b3e29af..68ad065 100644
--- a/tests/spa_unit/src/com/android/settings/spa/app/backgroundinstall/BackgroundInstalledAppsPageProviderTest.kt
+++ b/tests/spa_unit/src/com/android/settings/spa/app/backgroundinstall/BackgroundInstalledAppsPageProviderTest.kt
@@ -34,7 +34,6 @@
 import com.android.settingslib.spa.testutils.any
 import com.android.settingslib.spaprivileged.template.app.AppListItemModel
 import com.google.common.truth.Truth
-import kotlinx.coroutines.ExperimentalCoroutinesApi
 import kotlinx.coroutines.flow.first
 import kotlinx.coroutines.flow.flowOf
 import kotlinx.coroutines.test.runTest
@@ -171,7 +170,6 @@
             .isEqualTo("AppInfoSettings/package.name/0")
     }
 
-    @OptIn(ExperimentalCoroutinesApi::class)
     @Test
     fun backgroundInstalledAppsWithGroupingListModel_getGroupTitleOne() = runTest {
         val listModel = BackgroundInstalledAppsWithGroupingListModel(context)
@@ -186,7 +184,6 @@
         Truth.assertThat(actualGroupTitle).isEqualTo("Apps installed in the last 6 months")
     }
 
-    @OptIn(ExperimentalCoroutinesApi::class)
     @Test
     fun backgroundInstalledAppsWithGroupingListModel_getGroupTitleTwo() = runTest {
         val listModel = BackgroundInstalledAppsWithGroupingListModel(context)
@@ -201,7 +198,6 @@
         Truth.assertThat(actualGroupTitle).isEqualTo("Apps installed more than 6 months ago")
     }
 
-    @OptIn(ExperimentalCoroutinesApi::class)
     @Test
     fun backgroundInstalledAppsWithGroupingListModel_transform() = runTest {
         val listModel = BackgroundInstalledAppsWithGroupingListModel(mockContext)
@@ -220,7 +216,6 @@
         Truth.assertThat(packageInfoFlagsCaptor.value.value).isEqualTo(EXPECTED_PACKAGE_INFO_FLAG)
     }
 
-    @OptIn(ExperimentalCoroutinesApi::class)
     @Test
     fun backgroundInstalledAppsWithGroupingListModel_filter() = runTest {
         val listModel = BackgroundInstalledAppsWithGroupingListModel(mockContext)
diff --git a/tests/spa_unit/src/com/android/settings/spa/app/specialaccess/PictureInPictureTest.kt b/tests/spa_unit/src/com/android/settings/spa/app/specialaccess/PictureInPictureTest.kt
index fb0fb69..6054bb5 100644
--- a/tests/spa_unit/src/com/android/settings/spa/app/specialaccess/PictureInPictureTest.kt
+++ b/tests/spa_unit/src/com/android/settings/spa/app/specialaccess/PictureInPictureTest.kt
@@ -29,7 +29,6 @@
 import com.android.settings.R
 import com.android.settingslib.spaprivileged.model.app.AppOpsController
 import com.google.common.truth.Truth.assertThat
-import kotlinx.coroutines.ExperimentalCoroutinesApi
 import kotlinx.coroutines.flow.first
 import kotlinx.coroutines.flow.flowOf
 import kotlinx.coroutines.test.runTest
@@ -46,7 +45,6 @@
 import org.mockito.junit.MockitoRule
 import org.mockito.Mockito.`when` as whenever
 
-@OptIn(ExperimentalCoroutinesApi::class)
 @RunWith(AndroidJUnit4::class)
 class PictureInPictureTest {
     @get:Rule
diff --git a/tests/spa_unit/src/com/android/settings/spa/development/compat/PlatformCompatAppListModelTest.kt b/tests/spa_unit/src/com/android/settings/spa/development/compat/PlatformCompatAppListModelTest.kt
index 78aca85..0cfdc7d 100644
--- a/tests/spa_unit/src/com/android/settings/spa/development/compat/PlatformCompatAppListModelTest.kt
+++ b/tests/spa_unit/src/com/android/settings/spa/development/compat/PlatformCompatAppListModelTest.kt
@@ -25,7 +25,6 @@
 import androidx.test.core.app.ApplicationProvider
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import com.google.common.truth.Truth.assertThat
-import kotlinx.coroutines.ExperimentalCoroutinesApi
 import kotlinx.coroutines.flow.first
 import kotlinx.coroutines.flow.flowOf
 import kotlinx.coroutines.test.runTest
@@ -41,7 +40,6 @@
 import org.mockito.junit.MockitoRule
 import org.mockito.Mockito.`when` as whenever
 
-@OptIn(ExperimentalCoroutinesApi::class)
 @RunWith(AndroidJUnit4::class)
 class PlatformCompatAppListModelTest {
     @get:Rule
diff --git a/tests/spa_unit/src/com/android/settings/spa/notification/AppNotificationRepositoryTest.kt b/tests/spa_unit/src/com/android/settings/spa/notification/AppNotificationRepositoryTest.kt
index 12fdc23..87ff9ba 100644
--- a/tests/spa_unit/src/com/android/settings/spa/notification/AppNotificationRepositoryTest.kt
+++ b/tests/spa_unit/src/com/android/settings/spa/notification/AppNotificationRepositoryTest.kt
@@ -34,7 +34,6 @@
 import com.android.settingslib.spaprivileged.model.app.IPackageManagers
 import com.android.settingslib.spaprivileged.model.app.userId
 import com.google.common.truth.Truth.assertThat
-import kotlinx.coroutines.ExperimentalCoroutinesApi
 import kotlinx.coroutines.flow.first
 import kotlinx.coroutines.flow.flowOf
 import kotlinx.coroutines.test.runTest
@@ -49,7 +48,6 @@
 import org.mockito.junit.MockitoRule
 import org.mockito.Mockito.`when` as whenever
 
-@OptIn(ExperimentalCoroutinesApi::class)
 @RunWith(AndroidJUnit4::class)
 class AppNotificationRepositoryTest {
     @get:Rule
diff --git a/tests/unit/src/com/android/settings/accessibility/OneHandedPreferenceControllerTest.java b/tests/unit/src/com/android/settings/accessibility/OneHandedPreferenceControllerTest.java
deleted file mode 100644
index dc5a7d5..0000000
--- a/tests/unit/src/com/android/settings/accessibility/OneHandedPreferenceControllerTest.java
+++ /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.
- */
-
-package com.android.settings.accessibility;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import android.content.Context;
-
-import androidx.test.core.app.ApplicationProvider;
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-
-import com.android.settings.gestures.OneHandedSettingsUtils;
-import com.android.settings.testutils.ResourcesUtils;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-@RunWith(AndroidJUnit4.class)
-public final class OneHandedPreferenceControllerTest {
-    private Context mContext;
-    private OneHandedPreferenceController mController;
-
-    @Before
-    public void setUp() {
-        mContext = ApplicationProvider.getApplicationContext();
-        mController = new OneHandedPreferenceController(mContext, "one_handed");
-    }
-
-    @Test
-    public void getSummary_oneHandedEnabled_showsOnWithSummary() {
-        OneHandedSettingsUtils.setOneHandedModeEnabled(mContext, true);
-        // R.string.gesture_setting_on
-        String gestureSettingOn = ResourcesUtils.getResourcesString(mContext, "gesture_setting_on");
-        // R.string.one_handed_mode_intro_text
-        String oneHandedModeIntroText = ResourcesUtils.getResourcesString(mContext,
-                "one_handed_mode_intro_text");
-
-        // expect: On / $(summary)
-        assertThat(mController.getSummary().toString()).isEqualTo(
-                // R.string.preference_summary_default_combination
-                ResourcesUtils.getResourcesString(mContext,
-                        "preference_summary_default_combination", gestureSettingOn,
-                        oneHandedModeIntroText));
-    }
-
-    @Test
-    public void getSummary_oneHandedDisabled_showsOffWithSummary() {
-        OneHandedSettingsUtils.setOneHandedModeEnabled(mContext, false);
-        // R.string.gesture_setting_off
-        String gestureSettingOff = ResourcesUtils.getResourcesString(mContext,
-                "gesture_setting_off");
-        // R.string.one_handed_mode_intro_text
-        String oneHandedModeIntroText = ResourcesUtils.getResourcesString(mContext,
-                "one_handed_mode_intro_text");
-
-        // expect: Off / $(summary)
-        assertThat(mController.getSummary().toString()).isEqualTo(
-                // R.string.preference_summary_default_combination
-                ResourcesUtils.getResourcesString(mContext,
-                        "preference_summary_default_combination", gestureSettingOff,
-                        oneHandedModeIntroText));
-    }
-}
diff --git a/tests/unit/src/com/android/settings/biometrics2/ui/viewmodel/AutoCredentialViewModelTest.kt b/tests/unit/src/com/android/settings/biometrics2/ui/viewmodel/AutoCredentialViewModelTest.kt
index 3ae4951..e708f3b 100644
--- a/tests/unit/src/com/android/settings/biometrics2/ui/viewmodel/AutoCredentialViewModelTest.kt
+++ b/tests/unit/src/com/android/settings/biometrics2/ui/viewmodel/AutoCredentialViewModelTest.kt
@@ -35,7 +35,7 @@
 import com.android.settings.password.ChooseLockPattern
 import com.android.settings.password.ChooseLockSettingsHelper
 import com.google.common.truth.Truth.assertThat
-import kotlinx.coroutines.ExperimentalCoroutinesApi
+import java.util.concurrent.atomic.AtomicBoolean
 import kotlinx.coroutines.flow.toList
 import kotlinx.coroutines.launch
 import kotlinx.coroutines.test.TestScope
@@ -50,7 +50,6 @@
 import org.mockito.Mockito
 import org.mockito.junit.MockitoJUnit
 import org.mockito.junit.MockitoRule
-import java.util.concurrent.atomic.AtomicBoolean
 import org.mockito.Mockito.`when` as whenever
 
 @RunWith(AndroidJUnit4::class)
@@ -86,7 +85,6 @@
         challengeGenerator.challenge = newChallenge
     }
 
-    @OptIn(ExperimentalCoroutinesApi::class)
     @Test
     fun testCheckCredential_validCredentialCase() = runTest {
         val userId = 99
@@ -109,7 +107,6 @@
         assertThat(viewModel.createGeneratingChallengeExtras()).isNull()
     }
 
-    @OptIn(ExperimentalCoroutinesApi::class)
     @Test
     fun testCheckCredential_needToChooseLock() = runTest {
         val userId = 100
@@ -132,7 +129,6 @@
         assertThat(viewModel.createGeneratingChallengeExtras()).isNull()
     }
 
-    @OptIn(ExperimentalCoroutinesApi::class)
     @Test
     fun testCheckCredential_needToConfirmLockForSomething() = runTest {
         val userId = 101
@@ -156,7 +152,6 @@
         assertThat(viewModel.createGeneratingChallengeExtras()).isNull()
     }
 
-    @OptIn(ExperimentalCoroutinesApi::class)
     @Test
     fun testCheckCredential_needToConfirmLockForNumeric() = runTest {
         val userId = 102
@@ -180,7 +175,6 @@
         assertThat(viewModel.createGeneratingChallengeExtras()).isNull()
     }
 
-    @OptIn(ExperimentalCoroutinesApi::class)
     @Test
     fun testCheckCredential_needToConfirmLockForAlphabetic() = runTest {
         val userId = 103
@@ -204,7 +198,6 @@
         assertThat(viewModel.createGeneratingChallengeExtras()).isNull()
     }
 
-    @OptIn(ExperimentalCoroutinesApi::class)
     @Test
     fun testCheckCredential_generateChallenge() = runTest {
         val userId = 104
@@ -258,7 +251,6 @@
         assertThat(tokens[0]).isEqualTo(1)
     }
 
-    @OptIn(ExperimentalCoroutinesApi::class)
     @Test
     fun testCheckCredential_generateChallengeFail() = runTest {
         backgroundScope.launch {
@@ -306,7 +298,6 @@
         assertThat(viewModel.userId).isEqualTo(userId)
     }
 
-    @OptIn(ExperimentalCoroutinesApi::class)
     @Test
     fun testGenerateChallengeAsCredentialActivityResult_invalidChooseLock() = runTest {
         backgroundScope.launch {
@@ -332,7 +323,6 @@
         }
     }
 
-    @OptIn(ExperimentalCoroutinesApi::class)
     @Test
     fun testGenerateChallengeAsCredentialActivityResult_invalidConfirmLock() = runTest {
         backgroundScope.launch {
@@ -358,7 +348,6 @@
         }
     }
 
-    @OptIn(ExperimentalCoroutinesApi::class)
     @Test
     fun testGenerateChallengeAsCredentialActivityResult_nullDataChooseLock() = runTest {
         val userId = 108
@@ -380,7 +369,6 @@
         assertThat(generateFails.size).isEqualTo(0)
     }
 
-    @OptIn(ExperimentalCoroutinesApi::class)
     @Test
     fun testGenerateChallengeAsCredentialActivityResult_nullDataConfirmLock() = runTest {
         val userId = 109
@@ -401,7 +389,6 @@
         assertThat(generateFails.size).isEqualTo(0)
     }
 
-    @OptIn(ExperimentalCoroutinesApi::class)
     @Test
     fun testGenerateChallengeAsCredentialActivityResult_validChooseLock() = runTest {
         val userId = 108
@@ -447,7 +434,6 @@
         assertThat(hasCalledRemoveGkPwHandle.get()).isTrue()
     }
 
-    @OptIn(ExperimentalCoroutinesApi::class)
     @Test
     fun testGenerateChallengeAsCredentialActivityResult_validConfirmLock() = runTest {
         val userId = 109
@@ -493,7 +479,6 @@
         assertThat(hasCalledRemoveGkPwHandle.get()).isTrue()
     }
 
-    @OptIn(ExperimentalCoroutinesApi::class)
     private fun TestScope.listOfGenerateChallengeFailedFlow(): List<Boolean> =
         mutableListOf<Boolean>().also {
             backgroundScope.launch(UnconfinedTestDispatcher(testScheduler)) {
@@ -507,20 +492,13 @@
         var challenge = CredentialModel.INVALID_CHALLENGE
         var callbackRunCount = 0
 
-        private var _callback: AutoCredentialViewModel.GenerateChallengeCallback? = null
-
-        override fun getCallback(): AutoCredentialViewModel.GenerateChallengeCallback? {
-            return _callback
-        }
-
-        override fun setCallback(callback: AutoCredentialViewModel.GenerateChallengeCallback?) {
-            _callback = callback
-        }
+        override var callback: AutoCredentialViewModel.GenerateChallengeCallback? = null
 
         override fun generateChallenge(userId: Int) {
-            val callback = _callback ?: return
-            callback.onChallengeGenerated(sensorId, this.userId, challenge)
-            ++callbackRunCount
+            callback?.let {
+                it.onChallengeGenerated(sensorId, this.userId, challenge)
+                ++callbackRunCount
+            }
         }
     }
 
diff --git a/tests/unit/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollErrorDialogViewModelTest.kt b/tests/unit/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollErrorDialogViewModelTest.kt
index 3679dd2..379a5c1 100644
--- a/tests/unit/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollErrorDialogViewModelTest.kt
+++ b/tests/unit/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollErrorDialogViewModelTest.kt
@@ -19,12 +19,9 @@
 import androidx.test.core.app.ApplicationProvider
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import com.android.settings.biometrics2.ui.viewmodel.FingerprintErrorDialogSetResultAction.FINGERPRINT_ERROR_DIALOG_ACTION_SET_RESULT_FINISH
-import com.android.settings.biometrics2.ui.viewmodel.FingerprintErrorDialogSetResultAction.FINGERPRINT_ERROR_DIALOG_ACTION_SET_RESULT_TIMEOUT
 import com.google.common.truth.Truth.assertThat
-import kotlinx.coroutines.ExperimentalCoroutinesApi
 import kotlinx.coroutines.flow.toList
 import kotlinx.coroutines.launch
-import kotlinx.coroutines.test.TestScope
 import kotlinx.coroutines.test.UnconfinedTestDispatcher
 import kotlinx.coroutines.test.runCurrent
 import kotlinx.coroutines.test.runTest
@@ -56,7 +53,6 @@
         assertThat(FingerprintEnrollErrorDialogViewModel(application, true).isSuw).isTrue()
     }
 
-    @OptIn(ExperimentalCoroutinesApi::class)
     @Test
     fun testNewDialog() = runTest {
         val newDialogs: List<Int> = mutableListOf<Int>().also {
@@ -81,7 +77,6 @@
         assertThat(newDialogs[0]).isEqualTo(testErrorMsgId)
     }
 
-    @OptIn(ExperimentalCoroutinesApi::class)
     @Test
     fun testTriggerRetry() = runTest {
         val triggerRetries: List<Any> = mutableListOf<Any>().also {
@@ -102,7 +97,6 @@
         assertThat(triggerRetries.size).isEqualTo(1)
     }
 
-    @OptIn(ExperimentalCoroutinesApi::class)
     @Test
     fun testSetResultFinish() = runTest {
         val setResults: List<FingerprintErrorDialogSetResultAction> =
diff --git a/tests/unit/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollIntroViewModelTest.kt b/tests/unit/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollIntroViewModelTest.kt
index 08e5ac3..7494aef 100644
--- a/tests/unit/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollIntroViewModelTest.kt
+++ b/tests/unit/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollIntroViewModelTest.kt
@@ -38,7 +38,6 @@
 import com.android.settings.biometrics2.utils.FingerprintRepositoryUtils.setupFingerprintEnrolledFingerprints
 import com.android.settings.biometrics2.utils.FingerprintRepositoryUtils.setupSuwMaxFingerprintsEnrollable
 import com.google.common.truth.Truth.assertThat
-import kotlinx.coroutines.ExperimentalCoroutinesApi
 import kotlinx.coroutines.flow.toList
 import kotlinx.coroutines.launch
 import kotlinx.coroutines.test.TestScope
@@ -78,7 +77,6 @@
         application = ApplicationProvider.getApplicationContext()
     }
 
-    @OptIn(ExperimentalCoroutinesApi::class)
     @Test
     fun testPageStatusFlowDefaultAndUpdate() = runTest {
         val viewModel = newFingerprintEnrollIntroViewModel(
@@ -105,7 +103,6 @@
         assertThat(statusList[1].enrollableStatus).isEqualTo(FINGERPRINT_ENROLLABLE_ERROR_REACH_MAX)
     }
 
-    @OptIn(ExperimentalCoroutinesApi::class)
     fun testOnStartToUpdateEnrollableStatusOk_isSuw() = runTest {
         setupFingerprintEnrolledFingerprints(fingerprintManager, TEST_USER_ID, 0)
         setupSuwMaxFingerprintsEnrollable(application, resources, 1)
@@ -122,7 +119,6 @@
         assertThat(statusList[0].enrollableStatus).isEqualTo(FINGERPRINT_ENROLLABLE_OK)
     }
 
-    @OptIn(ExperimentalCoroutinesApi::class)
     @Test
     fun testOnStartToUpdateEnrollableStatusReachMax_isSuw() = runTest {
         setupFingerprintEnrolledFingerprints(fingerprintManager, TEST_USER_ID, 1)
@@ -140,49 +136,41 @@
         assertThat(statusList[0].enrollableStatus).isEqualTo(FINGERPRINT_ENROLLABLE_ERROR_REACH_MAX)
     }
 
-    @OptIn(ExperimentalCoroutinesApi::class)
     @Test
     fun testOnStartToUpdateEnrollableStatusOk_isNotSuw() = runTest {
         testOnStartToUpdateEnrollableStatusOk(newAllFalseRequest(application))
     }
 
-    @OptIn(ExperimentalCoroutinesApi::class)
     @Test
     fun testOnStartToUpdateEnrollableStatusReachMax_isNotSuw() = runTest {
         testOnStartToUpdateEnrollableStatusReachMax(newAllFalseRequest(application))
     }
 
-    @OptIn(ExperimentalCoroutinesApi::class)
     @Test
     fun testOnStartToUpdateEnrollableStatusOk_isSuwDeferred() = runTest {
         testOnStartToUpdateEnrollableStatusOk(newIsSuwDeferredRequest(application))
     }
 
-    @OptIn(ExperimentalCoroutinesApi::class)
     @Test
     fun testOnStartToUpdateEnrollableStatusReachMax_isSuwDeferred() = runTest {
         testOnStartToUpdateEnrollableStatusReachMax(newIsSuwDeferredRequest(application))
     }
 
-    @OptIn(ExperimentalCoroutinesApi::class)
     @Test
     fun testOnStartToUpdateEnrollableStatusOk_isSuwPortal() = runTest {
         testOnStartToUpdateEnrollableStatusOk(newIsSuwPortalRequest(application))
     }
 
-    @OptIn(ExperimentalCoroutinesApi::class)
     @Test
     fun testOnStartToUpdateEnrollableStatusReachMax_isSuwPortal() = runTest {
         testOnStartToUpdateEnrollableStatusReachMax(newIsSuwPortalRequest(application))
     }
 
-    @OptIn(ExperimentalCoroutinesApi::class)
     @Test
     fun testOnStartToUpdateEnrollableStatusOk_isSuwSuggestedActionFlow() = runTest {
         testOnStartToUpdateEnrollableStatusOk(newIsSuwSuggestedActionFlowRequest(application))
     }
 
-    @OptIn(ExperimentalCoroutinesApi::class)
     @Test
     fun testOnStartToUpdateEnrollableStatusReachMax_isSuwSuggestedActionFlow() = runTest {
         testOnStartToUpdateEnrollableStatusReachMax(
@@ -190,7 +178,6 @@
         )
     }
 
-    @OptIn(ExperimentalCoroutinesApi::class)
     private fun TestScope.testOnStartToUpdateEnrollableStatusOk(request: EnrollmentRequest) {
         setupFingerprintEnrolledFingerprints(fingerprintManager, TEST_USER_ID, 0)
         val viewModel = newFingerprintEnrollIntroViewModel(
@@ -206,7 +193,6 @@
         assertThat(statusList[0].enrollableStatus).isEqualTo(FINGERPRINT_ENROLLABLE_OK)
     }
 
-    @OptIn(ExperimentalCoroutinesApi::class)
     private fun TestScope.testOnStartToUpdateEnrollableStatusReachMax(request: EnrollmentRequest) {
         setupFingerprintEnrolledFingerprints(fingerprintManager, TEST_USER_ID, 5)
         val viewModel = newFingerprintEnrollIntroViewModel(
@@ -268,7 +254,6 @@
         assertThat(viewModel.isBiometricUnlockDisabledByAdmin).isEqualTo(false)
     }
 
-    @OptIn(ExperimentalCoroutinesApi::class)
     @Test
     fun testSetHasScrolledToBottom() = runTest {
         val viewModel = newFingerprintEnrollIntroViewModel(
@@ -284,7 +269,6 @@
         assertThat(pageStatusList[pageStatusList.size-1].hasScrollToBottom()).isEqualTo(true)
     }
 
-    @OptIn(ExperimentalCoroutinesApi::class)
     @Test
     fun testOnNextButtonClick_enrollNext() = runTest {
         // Set latest status to FINGERPRINT_ENROLLABLE_OK
@@ -305,7 +289,6 @@
         assertThat(actions[0]).isEqualTo(CONTINUE_ENROLL)
     }
 
-    @OptIn(ExperimentalCoroutinesApi::class)
     @Test
     fun testOnNextButtonClick_doneAndFinish() = runTest {
         // Set latest status to FINGERPRINT_ENROLLABLE_ERROR_REACH_MAX
@@ -334,7 +317,6 @@
         assertThat(actionList[0]).isEqualTo(DONE_AND_FINISH)
     }
 
-    @OptIn(ExperimentalCoroutinesApi::class)
     @Test
     fun testOnSkipOrCancelButtonClick() = runTest {
         val viewModel = newFingerprintEnrollIntroViewModel(
@@ -351,7 +333,6 @@
         assertThat(actions[0]).isEqualTo(SKIP_OR_CANCEL)
     }
 
-    @OptIn(ExperimentalCoroutinesApi::class)
     private fun TestScope.listOfActionFlow(
         viewModel: FingerprintEnrollIntroViewModel
     ): List<FingerprintEnrollIntroAction> =
@@ -361,7 +342,6 @@
             }
         }
 
-    @OptIn(ExperimentalCoroutinesApi::class)
     private fun TestScope.listOfPageStatusFlow(
         viewModel: FingerprintEnrollIntroViewModel
     ): List<FingerprintEnrollIntroStatus> =
diff --git a/tests/unit/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollmentViewModelTest.kt b/tests/unit/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollmentViewModelTest.kt
index bee91c9..6d04f35 100644
--- a/tests/unit/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollmentViewModelTest.kt
+++ b/tests/unit/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollmentViewModelTest.kt
@@ -30,7 +30,6 @@
 import com.android.settings.biometrics2.utils.FingerprintRepositoryUtils.newFingerprintRepository
 import com.android.settings.biometrics2.utils.FingerprintRepositoryUtils.setupFingerprintEnrolledFingerprints
 import com.google.common.truth.Truth.assertThat
-import kotlinx.coroutines.ExperimentalCoroutinesApi
 import kotlinx.coroutines.flow.toList
 import kotlinx.coroutines.launch
 import kotlinx.coroutines.test.TestScope
@@ -226,7 +225,6 @@
         assertThat(viewModel.isMaxEnrolledReached(uid)).isTrue()
     }
 
-    @OptIn(ExperimentalCoroutinesApi::class)
     @Test
     fun testSetResultFlow_defaultEmpty() = runTest {
         val activityResults = listOfSetResultFlow()
@@ -236,7 +234,6 @@
         assertThat(activityResults.size).isEqualTo(0)
     }
 
-    @OptIn(ExperimentalCoroutinesApi::class)
     @Test
     fun testCheckFinishActivityDuringOnPause_doNothingIfIsSuw() = runTest {
         viewModel = FingerprintEnrollmentViewModel(
@@ -257,7 +254,6 @@
         assertThat(activityResults.size).isEqualTo(0)
     }
 
-    @OptIn(ExperimentalCoroutinesApi::class)
     @Test
     fun testCheckFinishActivityDuringOnPause_doNothingIfIsWaitingActivity() = runTest {
         val activityResults = listOfSetResultFlow()
@@ -273,7 +269,6 @@
         assertThat(activityResults.size).isEqualTo(0)
     }
 
-    @OptIn(ExperimentalCoroutinesApi::class)
     @Test
     fun testCheckFinishActivityDuringOnPause_doNothingIfIsActivityFinishing() = runTest {
         val activityResults = listOfSetResultFlow()
@@ -288,7 +283,6 @@
         assertThat(activityResults.size).isEqualTo(0)
     }
 
-    @OptIn(ExperimentalCoroutinesApi::class)
     @Test
     fun testCheckFinishActivityDuringOnPause_doNothingIfIsChangingConfigurations() = runTest {
         val activityResults = listOfSetResultFlow()
@@ -303,7 +297,6 @@
         assertThat(activityResults.size).isEqualTo(0)
     }
 
-    @OptIn(ExperimentalCoroutinesApi::class)
     @Test
     fun testCheckFinishActivityDuringOnPause_defaultFinishSelf() = runTest {
         val activityResults = listOfSetResultFlow()
@@ -320,7 +313,6 @@
         assertThat(activityResults[0].data).isEqualTo(null)
     }
 
-    @OptIn(ExperimentalCoroutinesApi::class)
     private fun TestScope.listOfSetResultFlow(): List<ActivityResult> =
         mutableListOf<ActivityResult>().also {
             backgroundScope.launch(UnconfinedTestDispatcher(testScheduler)) {
diff --git a/tests/unit/src/com/android/settings/safetycenter/BiometricsSafetySourceTest.java b/tests/unit/src/com/android/settings/safetycenter/BiometricsSafetySourceTest.java
index 01c2143..f6356bc 100644
--- a/tests/unit/src/com/android/settings/safetycenter/BiometricsSafetySourceTest.java
+++ b/tests/unit/src/com/android/settings/safetycenter/BiometricsSafetySourceTest.java
@@ -67,24 +67,18 @@
 @RunWith(AndroidJUnit4.class)
 public class BiometricsSafetySourceTest {
 
-    private static final ComponentName COMPONENT_NAME =
-            new ComponentName("package", "class");
+    private static final ComponentName COMPONENT_NAME = new ComponentName("package", "class");
     private static final UserHandle USER_HANDLE = new UserHandle(UserHandle.myUserId());
     private static final SafetyEvent EVENT_SOURCE_STATE_CHANGED =
             new SafetyEvent.Builder(SAFETY_EVENT_TYPE_SOURCE_STATE_CHANGED).build();
 
     private Context mApplicationContext;
 
-    @Mock
-    private PackageManager mPackageManager;
-    @Mock
-    private DevicePolicyManager mDevicePolicyManager;
-    @Mock
-    private FingerprintManager mFingerprintManager;
-    @Mock
-    private FaceManager mFaceManager;
-    @Mock
-    private SafetyCenterManagerWrapper mSafetyCenterManagerWrapper;
+    @Mock private PackageManager mPackageManager;
+    @Mock private DevicePolicyManager mDevicePolicyManager;
+    @Mock private FingerprintManager mFingerprintManager;
+    @Mock private FaceManager mFaceManager;
+    @Mock private SafetyCenterManagerWrapper mSafetyCenterManagerWrapper;
 
     @Before
     public void setUp() {
@@ -119,15 +113,16 @@
     }
 
     @Test
-    public void setSafetySourceData_whenSafetyCenterIsEnabled_withoutBiometrics_doesNotSetData() {
+    public void setSafetySourceData_whenSafetyCenterIsEnabled_withoutBiometrics_setsNullData() {
         when(mSafetyCenterManagerWrapper.isEnabled(mApplicationContext)).thenReturn(false);
         when(mFingerprintManager.isHardwareDetected()).thenReturn(false);
         when(mFaceManager.isHardwareDetected()).thenReturn(false);
 
         BiometricsSafetySource.setSafetySourceData(mApplicationContext, EVENT_SOURCE_STATE_CHANGED);
 
-        verify(mSafetyCenterManagerWrapper, never())
-                .setSafetySourceData(any(), any(), any(), any());
+        verify(mSafetyCenterManagerWrapper)
+                .setSafetySourceData(
+                        any(), eq(BiometricsSafetySource.SAFETY_SOURCE_ID), eq(null), any());
     }
 
     @Test
@@ -140,8 +135,9 @@
 
         BiometricsSafetySource.setSafetySourceData(mApplicationContext, EVENT_SOURCE_STATE_CHANGED);
 
-        verify(mSafetyCenterManagerWrapper).setSafetySourceData(
-                any(), eq(BiometricsSafetySource.SAFETY_SOURCE_ID), any(), any());
+        verify(mSafetyCenterManagerWrapper)
+                .setSafetySourceData(
+                        any(), eq(BiometricsSafetySource.SAFETY_SOURCE_ID), any(), any());
     }
 
     @Test
@@ -225,7 +221,8 @@
 
         assertSafetySourceEnabledDataSetWithPluralSummary(
                 "security_settings_fingerprint_preference_title",
-                "security_settings_fingerprint_preference_summary", enrolledFingerprintsCount,
+                "security_settings_fingerprint_preference_summary",
+                enrolledFingerprintsCount,
                 FingerprintSettings.class.getName());
     }
 
@@ -346,8 +343,9 @@
         when(mFingerprintManager.isHardwareDetected()).thenReturn(true);
         when(mFaceManager.isHardwareDetected()).thenReturn(true);
         when(mDevicePolicyManager.getKeyguardDisabledFeatures(COMPONENT_NAME))
-                .thenReturn(DevicePolicyManager.KEYGUARD_DISABLE_FACE
-                        | DevicePolicyManager.KEYGUARD_DISABLE_FINGERPRINT);
+                .thenReturn(
+                        DevicePolicyManager.KEYGUARD_DISABLE_FACE
+                                | DevicePolicyManager.KEYGUARD_DISABLE_FINGERPRINT);
 
         BiometricsSafetySource.setSafetySourceData(mApplicationContext, EVENT_SOURCE_STATE_CHANGED);
 
@@ -363,8 +361,8 @@
         when(mFingerprintManager.isHardwareDetected()).thenReturn(true);
         when(mFaceManager.isHardwareDetected()).thenReturn(true);
         when(mFaceManager.hasEnrolledTemplates(anyInt())).thenReturn(true);
-        when(mFingerprintManager.getEnrolledFingerprints(anyInt())).thenReturn(
-                createFingerprintList(enrolledFingerprintsCount));
+        when(mFingerprintManager.getEnrolledFingerprints(anyInt()))
+                .thenReturn(createFingerprintList(enrolledFingerprintsCount));
 
         BiometricsSafetySource.setSafetySourceData(mApplicationContext, EVENT_SOURCE_STATE_CHANGED);
 
@@ -381,8 +379,8 @@
         when(mFingerprintManager.isHardwareDetected()).thenReturn(true);
         when(mFaceManager.isHardwareDetected()).thenReturn(true);
         when(mFaceManager.hasEnrolledTemplates(anyInt())).thenReturn(true);
-        when(mFingerprintManager.getEnrolledFingerprints(anyInt())).thenReturn(
-                createFingerprintList(enrolledFingerprintsCount));
+        when(mFingerprintManager.getEnrolledFingerprints(anyInt()))
+                .thenReturn(createFingerprintList(enrolledFingerprintsCount));
 
         BiometricsSafetySource.setSafetySourceData(mApplicationContext, EVENT_SOURCE_STATE_CHANGED);
 
@@ -398,8 +396,8 @@
         when(mFingerprintManager.isHardwareDetected()).thenReturn(true);
         when(mFaceManager.isHardwareDetected()).thenReturn(true);
         when(mFaceManager.hasEnrolledTemplates(anyInt())).thenReturn(true);
-        when(mFingerprintManager.getEnrolledFingerprints(anyInt())).thenReturn(
-                Collections.emptyList());
+        when(mFingerprintManager.getEnrolledFingerprints(anyInt()))
+                .thenReturn(Collections.emptyList());
 
         BiometricsSafetySource.setSafetySourceData(mApplicationContext, EVENT_SOURCE_STATE_CHANGED);
 
@@ -415,8 +413,8 @@
         when(mSafetyCenterManagerWrapper.isEnabled(mApplicationContext)).thenReturn(true);
         when(mFingerprintManager.isHardwareDetected()).thenReturn(true);
         when(mFaceManager.isHardwareDetected()).thenReturn(false);
-        when(mFingerprintManager.getEnrolledFingerprints(anyInt())).thenReturn(
-                createFingerprintList(enrolledFingerprintsCount));
+        when(mFingerprintManager.getEnrolledFingerprints(anyInt()))
+                .thenReturn(createFingerprintList(enrolledFingerprintsCount));
 
         ActiveUnlockTestUtils.enable(mApplicationContext);
 
@@ -452,8 +450,8 @@
         when(mFingerprintManager.isHardwareDetected()).thenReturn(true);
         when(mFaceManager.isHardwareDetected()).thenReturn(true);
         when(mFaceManager.hasEnrolledTemplates(anyInt())).thenReturn(true);
-        when(mFingerprintManager.getEnrolledFingerprints(anyInt())).thenReturn(
-                createFingerprintList(enrolledFingerprintsCount));
+        when(mFingerprintManager.getEnrolledFingerprints(anyInt()))
+                .thenReturn(createFingerprintList(enrolledFingerprintsCount));
         ActiveUnlockTestUtils.enable(mApplicationContext);
 
         BiometricsSafetySource.setSafetySourceData(mApplicationContext, EVENT_SOURCE_STATE_CHANGED);
@@ -462,7 +460,6 @@
                 "security_settings_biometric_preference_title",
                 "security_settings_biometric_preference_summary_both_fp_single",
                 Settings.CombinedBiometricSettingsActivity.class.getName());
-
     }
 
     @Test
@@ -472,14 +469,15 @@
         when(mFingerprintManager.isHardwareDetected()).thenReturn(true);
         when(mFaceManager.isHardwareDetected()).thenReturn(true);
         when(mFaceManager.hasEnrolledTemplates(anyInt())).thenReturn(false);
-        when(mFingerprintManager.getEnrolledFingerprints(anyInt())).thenReturn(
-                createFingerprintList(enrolledFingerprintsCount));
+        when(mFingerprintManager.getEnrolledFingerprints(anyInt()))
+                .thenReturn(createFingerprintList(enrolledFingerprintsCount));
 
         BiometricsSafetySource.setSafetySourceData(mApplicationContext, EVENT_SOURCE_STATE_CHANGED);
 
         assertSafetySourceEnabledDataSetWithPluralSummary(
                 "security_settings_biometric_preference_title",
-                "security_settings_fingerprint_preference_summary", enrolledFingerprintsCount,
+                "security_settings_fingerprint_preference_summary",
+                enrolledFingerprintsCount,
                 Settings.CombinedBiometricSettingsActivity.class.getName());
     }
 
@@ -494,8 +492,12 @@
         BiometricsSafetySource.setSafetySourceData(mApplicationContext, EVENT_SOURCE_STATE_CHANGED);
 
         ArgumentCaptor<SafetySourceData> captor = ArgumentCaptor.forClass(SafetySourceData.class);
-        verify(mSafetyCenterManagerWrapper).setSafetySourceData(
-                any(), eq(BiometricsSafetySource.SAFETY_SOURCE_ID), captor.capture(), any());
+        verify(mSafetyCenterManagerWrapper)
+                .setSafetySourceData(
+                        any(),
+                        eq(BiometricsSafetySource.SAFETY_SOURCE_ID),
+                        captor.capture(),
+                        any());
         SafetySourceStatus safetySourceStatus = captor.getValue().getStatus();
         assertThat(safetySourceStatus.getSeverityLevel())
                 .isEqualTo(SafetySourceData.SEVERITY_LEVEL_INFORMATION);
@@ -512,8 +514,12 @@
         BiometricsSafetySource.setSafetySourceData(mApplicationContext, EVENT_SOURCE_STATE_CHANGED);
 
         ArgumentCaptor<SafetySourceData> captor = ArgumentCaptor.forClass(SafetySourceData.class);
-        verify(mSafetyCenterManagerWrapper).setSafetySourceData(
-                any(), eq(BiometricsSafetySource.SAFETY_SOURCE_ID), captor.capture(), any());
+        verify(mSafetyCenterManagerWrapper)
+                .setSafetySourceData(
+                        any(),
+                        eq(BiometricsSafetySource.SAFETY_SOURCE_ID),
+                        captor.capture(),
+                        any());
         SafetySourceStatus safetySourceStatus = captor.getValue().getStatus();
         assertThat(safetySourceStatus.getSeverityLevel())
                 .isEqualTo(SafetySourceData.SEVERITY_LEVEL_INFORMATION);
@@ -530,8 +536,12 @@
         BiometricsSafetySource.setSafetySourceData(mApplicationContext, EVENT_SOURCE_STATE_CHANGED);
 
         ArgumentCaptor<SafetySourceData> captor = ArgumentCaptor.forClass(SafetySourceData.class);
-        verify(mSafetyCenterManagerWrapper).setSafetySourceData(
-                any(), eq(BiometricsSafetySource.SAFETY_SOURCE_ID), captor.capture(), any());
+        verify(mSafetyCenterManagerWrapper)
+                .setSafetySourceData(
+                        any(),
+                        eq(BiometricsSafetySource.SAFETY_SOURCE_ID),
+                        captor.capture(),
+                        any());
         SafetySourceStatus safetySourceStatus = captor.getValue().getStatus();
         assertThat(safetySourceStatus.getSeverityLevel())
                 .isEqualTo(SafetySourceData.SEVERITY_LEVEL_UNSPECIFIED);
@@ -547,8 +557,12 @@
         BiometricsSafetySource.setSafetySourceData(mApplicationContext, EVENT_SOURCE_STATE_CHANGED);
 
         ArgumentCaptor<SafetySourceData> captor = ArgumentCaptor.forClass(SafetySourceData.class);
-        verify(mSafetyCenterManagerWrapper).setSafetySourceData(
-                any(), eq(BiometricsSafetySource.SAFETY_SOURCE_ID), captor.capture(), any());
+        verify(mSafetyCenterManagerWrapper)
+                .setSafetySourceData(
+                        any(),
+                        eq(BiometricsSafetySource.SAFETY_SOURCE_ID),
+                        captor.capture(),
+                        any());
         SafetySourceStatus safetySourceStatus = captor.getValue().getStatus();
         assertThat(safetySourceStatus.getSeverityLevel())
                 .isEqualTo(SafetySourceData.SEVERITY_LEVEL_INFORMATION);
@@ -564,8 +578,12 @@
         BiometricsSafetySource.setSafetySourceData(mApplicationContext, EVENT_SOURCE_STATE_CHANGED);
 
         ArgumentCaptor<SafetySourceData> captor = ArgumentCaptor.forClass(SafetySourceData.class);
-        verify(mSafetyCenterManagerWrapper).setSafetySourceData(
-                any(), eq(BiometricsSafetySource.SAFETY_SOURCE_ID), captor.capture(), any());
+        verify(mSafetyCenterManagerWrapper)
+                .setSafetySourceData(
+                        any(),
+                        eq(BiometricsSafetySource.SAFETY_SOURCE_ID),
+                        captor.capture(),
+                        any());
         SafetySourceStatus safetySourceStatus = captor.getValue().getStatus();
         assertThat(safetySourceStatus.getSeverityLevel())
                 .isEqualTo(SafetySourceData.SEVERITY_LEVEL_UNSPECIFIED);
@@ -581,8 +599,12 @@
         BiometricsSafetySource.setSafetySourceData(mApplicationContext, EVENT_SOURCE_STATE_CHANGED);
 
         ArgumentCaptor<SafetySourceData> captor = ArgumentCaptor.forClass(SafetySourceData.class);
-        verify(mSafetyCenterManagerWrapper).setSafetySourceData(
-                any(), eq(BiometricsSafetySource.SAFETY_SOURCE_ID), captor.capture(), any());
+        verify(mSafetyCenterManagerWrapper)
+                .setSafetySourceData(
+                        any(),
+                        eq(BiometricsSafetySource.SAFETY_SOURCE_ID),
+                        captor.capture(),
+                        any());
         SafetySourceStatus safetySourceStatus = captor.getValue().getStatus();
         assertThat(safetySourceStatus.getSeverityLevel())
                 .isEqualTo(SafetySourceData.SEVERITY_LEVEL_INFORMATION);
@@ -598,61 +620,74 @@
         BiometricsSafetySource.setSafetySourceData(mApplicationContext, EVENT_SOURCE_STATE_CHANGED);
 
         ArgumentCaptor<SafetySourceData> captor = ArgumentCaptor.forClass(SafetySourceData.class);
-        verify(mSafetyCenterManagerWrapper).setSafetySourceData(
-                any(), eq(BiometricsSafetySource.SAFETY_SOURCE_ID), captor.capture(), any());
+        verify(mSafetyCenterManagerWrapper)
+                .setSafetySourceData(
+                        any(),
+                        eq(BiometricsSafetySource.SAFETY_SOURCE_ID),
+                        captor.capture(),
+                        any());
         SafetySourceStatus safetySourceStatus = captor.getValue().getStatus();
         assertThat(safetySourceStatus.getSeverityLevel())
                 .isEqualTo(SafetySourceData.SEVERITY_LEVEL_UNSPECIFIED);
     }
 
-    private void assertSafetySourceDisabledDataSetWithSingularSummary(String expectedTitleResName,
-            String expectedSummaryResName) {
+    private void assertSafetySourceDisabledDataSetWithSingularSummary(
+            String expectedTitleResName, String expectedSummaryResName) {
         assertSafetySourceDisabledDataSet(
                 ResourcesUtils.getResourcesString(mApplicationContext, expectedTitleResName),
-                ResourcesUtils.getResourcesString(mApplicationContext, expectedSummaryResName)
-        );
+                ResourcesUtils.getResourcesString(mApplicationContext, expectedSummaryResName));
     }
 
-    private void assertSafetySourceEnabledDataSetWithSingularSummary(String expectedTitleResName,
+    private void assertSafetySourceEnabledDataSetWithSingularSummary(
+            String expectedTitleResName,
             String expectedSummaryResName,
             String expectedSettingsClassName) {
         assertSafetySourceEnabledDataSet(
                 ResourcesUtils.getResourcesString(mApplicationContext, expectedTitleResName),
                 ResourcesUtils.getResourcesString(mApplicationContext, expectedSummaryResName),
-                expectedSettingsClassName
-        );
+                expectedSettingsClassName);
     }
 
-    private void assertSafetySourceDisabledDataSetWithPluralSummary(String expectedTitleResName,
-            String expectedSummaryResName, int expectedSummaryQuantity) {
-        final int stringResId = ResourcesUtils.getResourcesId(
-                ApplicationProvider.getApplicationContext(), "string",
-                expectedSummaryResName);
+    private void assertSafetySourceDisabledDataSetWithPluralSummary(
+            String expectedTitleResName,
+            String expectedSummaryResName,
+            int expectedSummaryQuantity) {
+        final int stringResId =
+                ResourcesUtils.getResourcesId(
+                        ApplicationProvider.getApplicationContext(),
+                        "string",
+                        expectedSummaryResName);
         assertSafetySourceDisabledDataSet(
                 ResourcesUtils.getResourcesString(mApplicationContext, expectedTitleResName),
-                StringUtil.getIcuPluralsString(mApplicationContext,
-                        expectedSummaryQuantity, stringResId)
-        );
+                StringUtil.getIcuPluralsString(
+                        mApplicationContext, expectedSummaryQuantity, stringResId));
     }
 
-    private void assertSafetySourceEnabledDataSetWithPluralSummary(String expectedTitleResName,
-            String expectedSummaryResName, int expectedSummaryQuantity,
+    private void assertSafetySourceEnabledDataSetWithPluralSummary(
+            String expectedTitleResName,
+            String expectedSummaryResName,
+            int expectedSummaryQuantity,
             String expectedSettingsClassName) {
-        final int stringResId = ResourcesUtils.getResourcesId(
-                ApplicationProvider.getApplicationContext(), "string",
-                expectedSummaryResName);
+        final int stringResId =
+                ResourcesUtils.getResourcesId(
+                        ApplicationProvider.getApplicationContext(),
+                        "string",
+                        expectedSummaryResName);
         assertSafetySourceEnabledDataSet(
                 ResourcesUtils.getResourcesString(mApplicationContext, expectedTitleResName),
-                StringUtil.getIcuPluralsString(mApplicationContext,
-                        expectedSummaryQuantity, stringResId),
-                expectedSettingsClassName
-        );
+                StringUtil.getIcuPluralsString(
+                        mApplicationContext, expectedSummaryQuantity, stringResId),
+                expectedSettingsClassName);
     }
 
     private void assertSafetySourceDisabledDataSet(String expectedTitle, String expectedSummary) {
         ArgumentCaptor<SafetySourceData> captor = ArgumentCaptor.forClass(SafetySourceData.class);
-        verify(mSafetyCenterManagerWrapper).setSafetySourceData(
-                any(), eq(BiometricsSafetySource.SAFETY_SOURCE_ID), captor.capture(), any());
+        verify(mSafetyCenterManagerWrapper)
+                .setSafetySourceData(
+                        any(),
+                        eq(BiometricsSafetySource.SAFETY_SOURCE_ID),
+                        captor.capture(),
+                        any());
         SafetySourceData safetySourceData = captor.getValue();
         SafetySourceStatus safetySourceStatus = safetySourceData.getStatus();
 
@@ -667,11 +702,15 @@
         assertThat(clickIntent.getAction()).isEqualTo(ACTION_SHOW_ADMIN_SUPPORT_DETAILS);
     }
 
-    private void assertSafetySourceEnabledDataSet(String expectedTitle, String expectedSummary,
-            String expectedSettingsClassName) {
+    private void assertSafetySourceEnabledDataSet(
+            String expectedTitle, String expectedSummary, String expectedSettingsClassName) {
         ArgumentCaptor<SafetySourceData> captor = ArgumentCaptor.forClass(SafetySourceData.class);
-        verify(mSafetyCenterManagerWrapper).setSafetySourceData(
-                any(), eq(BiometricsSafetySource.SAFETY_SOURCE_ID), captor.capture(), any());
+        verify(mSafetyCenterManagerWrapper)
+                .setSafetySourceData(
+                        any(),
+                        eq(BiometricsSafetySource.SAFETY_SOURCE_ID),
+                        captor.capture(),
+                        any());
         SafetySourceData safetySourceData = captor.getValue();
         SafetySourceStatus safetySourceStatus = safetySourceData.getStatus();
 
@@ -680,10 +719,8 @@
         assertThat(safetySourceStatus.isEnabled()).isTrue();
         final Intent clickIntent = safetySourceStatus.getPendingIntent().getIntent();
         assertThat(clickIntent).isNotNull();
-        assertThat(clickIntent.getComponent().getPackageName())
-                .isEqualTo("com.android.settings");
-        assertThat(clickIntent.getComponent().getClassName())
-                .isEqualTo(expectedSettingsClassName);
+        assertThat(clickIntent.getComponent().getPackageName()).isEqualTo("com.android.settings");
+        assertThat(clickIntent.getComponent().getClassName()).isEqualTo(expectedSettingsClassName);
     }
 
     private List<Fingerprint> createFingerprintList(int size) {
diff --git a/tests/unit/src/com/android/settings/slices/SliceTestUtils.java b/tests/unit/src/com/android/settings/slices/SliceTestUtils.java
deleted file mode 100644
index 020bde2..0000000
--- a/tests/unit/src/com/android/settings/slices/SliceTestUtils.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * Copyright (C) 2020 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.slices;
-
-import android.content.ContentResolver;
-import android.content.ContentValues;
-import android.content.Context;
-import android.database.sqlite.SQLiteDatabase;
-import android.net.Uri;
-import android.provider.SettingsSlicesContract;
-
-import com.android.settings.testutils.FakeIndexProvider;
-import com.android.settings.testutils.FakeToggleController;
-
-class SliceTestUtils {
-
-    public static final String FAKE_TITLE = "title";
-    public static final String FAKE_SUMMARY = "summary";
-    public static final String FAKE_SCREEN_TITLE = "screen_title";
-    public static final String FAKE_KEYWORDS = "a, b, c";
-    public static final int FAKE_ICON = 1234;
-    public static final String FAKE_FRAGMENT_NAME = FakeIndexProvider.class.getName();
-    public static final String FAKE_CONTROLLER_NAME = FakeToggleController.class.getName();
-    public static final int FAKE_HIGHLIGHT_MENU_RES = FakeToggleController.HIGHLIGHT_MENU_RES;
-
-
-    public static void insertSliceToDb(Context context, String key) {
-        insertSliceToDb(context, key, true /* isPlatformSlice */);
-    }
-
-    public static void insertSliceToDb(Context context, String key, boolean isPlatformSlice) {
-        insertSliceToDb(context, key, isPlatformSlice, null /*customizedUnavailableSliceSubtitle*/);
-    }
-
-    public static void insertSliceToDb(Context context, String key, boolean isPlatformSlice,
-            String customizedUnavailableSliceSubtitle) {
-        insertSliceToDb(context, key, isPlatformSlice, customizedUnavailableSliceSubtitle, false);
-    }
-
-    public static void insertSliceToDb(Context context, String key, boolean isPlatformSlice,
-            String customizedUnavailableSliceSubtitle, boolean isPublicSlice) {
-        final SQLiteDatabase db = SlicesDatabaseHelper.getInstance(context).getWritableDatabase();
-        ContentValues values = new ContentValues();
-        values.put(SlicesDatabaseHelper.IndexColumns.KEY, key);
-        values.put(SlicesDatabaseHelper.IndexColumns.SLICE_URI,
-                new Uri.Builder()
-                        .scheme(ContentResolver.SCHEME_CONTENT)
-                        .authority(isPlatformSlice
-                                ? SettingsSlicesContract.AUTHORITY
-                                : SettingsSliceProvider.SLICE_AUTHORITY)
-                        .appendPath(SettingsSlicesContract.PATH_SETTING_ACTION)
-                        .appendPath(key)
-                        .build().toString());
-        values.put(SlicesDatabaseHelper.IndexColumns.TITLE, FAKE_TITLE);
-        values.put(SlicesDatabaseHelper.IndexColumns.SUMMARY, FAKE_SUMMARY);
-        values.put(SlicesDatabaseHelper.IndexColumns.SCREENTITLE, FAKE_SCREEN_TITLE);
-        values.put(SlicesDatabaseHelper.IndexColumns.KEYWORDS, FAKE_KEYWORDS);
-        values.put(SlicesDatabaseHelper.IndexColumns.ICON_RESOURCE, FAKE_ICON);
-        values.put(SlicesDatabaseHelper.IndexColumns.FRAGMENT, FAKE_FRAGMENT_NAME);
-        values.put(SlicesDatabaseHelper.IndexColumns.CONTROLLER, FAKE_CONTROLLER_NAME);
-        values.put(SlicesDatabaseHelper.IndexColumns.SLICE_TYPE, SliceData.SliceType.INTENT);
-        values.put(SlicesDatabaseHelper.IndexColumns.UNAVAILABLE_SLICE_SUBTITLE,
-                customizedUnavailableSliceSubtitle);
-        values.put(SlicesDatabaseHelper.IndexColumns.PUBLIC_SLICE, isPublicSlice);
-        values.put(SlicesDatabaseHelper.IndexColumns.HIGHLIGHT_MENU_RESOURCE,
-                FAKE_HIGHLIGHT_MENU_RES);
-
-        db.replaceOrThrow(SlicesDatabaseHelper.Tables.TABLE_SLICES_INDEX, null, values);
-        db.close();
-    }
-}
diff --git a/tests/unit/src/com/android/settings/testutils/AirplaneModeRule.java b/tests/unit/src/com/android/settings/testutils/AirplaneModeRule.java
deleted file mode 100644
index 459ac15..0000000
--- a/tests/unit/src/com/android/settings/testutils/AirplaneModeRule.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Copyright (C) 2020 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.testutils;
-
-import android.content.ContentResolver;
-import android.content.Context;
-import android.provider.Settings;
-import android.util.Log;
-
-import androidx.test.core.app.ApplicationProvider;
-
-import org.junit.rules.ExternalResource;
-
-/** A test rule that is used to manager the Airplane Mode resource for testing. */
-public final class AirplaneModeRule extends ExternalResource {
-
-    private static final String TAG = "AirplaneModeRule";
-
-    private Context mContext;
-    private ContentResolver mContentResolver;
-    private boolean mBackupValue;
-    private boolean mShouldRestore;
-
-    @Override
-    protected void before() throws Throwable {
-        mContext = ApplicationProvider.getApplicationContext();
-        mContentResolver = mContext.getContentResolver();
-    }
-
-    @Override
-    protected void after() {
-        if (!mShouldRestore) {
-            return;
-        }
-        Log.d(TAG, "Restore Airplane Mode value:" + mBackupValue);
-        Settings.Global.putInt(mContentResolver, Settings.Global.AIRPLANE_MODE_ON,
-                mBackupValue ? 1 : 0);
-    }
-
-    public void setAirplaneMode(boolean enable) {
-        if (enable == isAirplaneModeOn()) {
-            return;
-        }
-        if (!mShouldRestore) {
-            mShouldRestore = true;
-            mBackupValue = !enable;
-            Log.d(TAG, "Backup Airplane Mode value:" + mBackupValue);
-        }
-        Log.d(TAG, "Set Airplane Mode enable:" + enable);
-        Settings.Global.putInt(mContentResolver, Settings.Global.AIRPLANE_MODE_ON, enable ? 1 : 0);
-    }
-
-    public boolean isAirplaneModeOn() {
-        return Settings.Global.getInt(mContext.getContentResolver(),
-            Settings.Global.AIRPLANE_MODE_ON, 0) != 0;
-    }
-}
diff --git a/tests/unit/src/com/android/settings/testutils/FakeIndexProvider.java b/tests/unit/src/com/android/settings/testutils/FakeIndexProvider.java
deleted file mode 100644
index 5cbfb54..0000000
--- a/tests/unit/src/com/android/settings/testutils/FakeIndexProvider.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Copyright (C) 2020 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.testutils;
-
-import android.content.Context;
-
-import com.android.settings.R;
-import com.android.settings.search.BaseSearchIndexProvider;
-import com.android.settingslib.search.Indexable;
-
-import java.util.List;
-
-public class FakeIndexProvider implements Indexable {
-
-    public static final String KEY = "TestKey";
-
-    /**
-     * The fake SearchIndexProvider. Note that the use of location_settings below implies that tests
-     * using this should be using the res/xml-mcc999/location_settings.xml or
-     * res/xml-mcc998/location_settings.xml. Annotate tests with
-     * {@code @Config(qualifiers = "mcc999")}.
-     */
-    public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
-            new BaseSearchIndexProvider(R.xml.location_settings) {
-
-                @Override
-                public List<String> getNonIndexableKeys(Context context) {
-                    List<String> result = super.getNonIndexableKeys(context);
-                    result.add(KEY);
-                    return result;
-                }
-            };
-}
diff --git a/tests/unit/src/com/android/settings/testutils/FakeUnavailablePreferenceController.java b/tests/unit/src/com/android/settings/testutils/FakeUnavailablePreferenceController.java
deleted file mode 100644
index 97379e3..0000000
--- a/tests/unit/src/com/android/settings/testutils/FakeUnavailablePreferenceController.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Copyright (C) 2020 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.testutils;
-
-import android.content.Context;
-import android.provider.Settings;
-
-import com.android.settings.core.BasePreferenceController;
-
-public class FakeUnavailablePreferenceController extends BasePreferenceController {
-
-    public static final String AVAILABILITY_KEY = "fake_availability_key";
-
-    public FakeUnavailablePreferenceController(Context context) {
-        super(context, "key");
-    }
-
-    @Override
-    public int getAvailabilityStatus() {
-        return Settings.Global.getInt(mContext.getContentResolver(), AVAILABILITY_KEY, 0);
-    }
-
-    @Override
-    public boolean isSliceable() {
-        return true;
-    }
-}
diff --git a/tests/unit/src/com/android/settings/testutils/ResolveInfoBuilder.java b/tests/unit/src/com/android/settings/testutils/ResolveInfoBuilder.java
deleted file mode 100644
index 5eaf2a4..0000000
--- a/tests/unit/src/com/android/settings/testutils/ResolveInfoBuilder.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Copyright (C) 2020 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.testutils;
-
-import android.content.pm.ActivityInfo;
-import android.content.pm.ApplicationInfo;
-import android.content.pm.PackageInfo;
-import android.content.pm.ProviderInfo;
-import android.content.pm.ResolveInfo;
-
-import com.google.common.base.Preconditions;
-
-/**
- * Helper for building {@link ResolveInfo}s to be used in Robolectric tests.
- *
- * <p>The resulting {@link PackageInfo}s should typically be added to {@link
- * org.robolectric.shadows.ShadowPackageManager#addResolveInfoForIntent(Intent, ResolveInfo)}.
- */
-public final class ResolveInfoBuilder {
-
-    private final String mPackageName;
-    private ActivityInfo mActivityInfo;
-    private ProviderInfo mProviderInfo;
-
-    public ResolveInfoBuilder(String packageName) {
-        this.mPackageName = Preconditions.checkNotNull(packageName);
-    }
-
-    public ResolveInfoBuilder setActivity(String packageName, String className) {
-        mActivityInfo = new ActivityInfo();
-        mActivityInfo.packageName = packageName;
-        mActivityInfo.name = className;
-        return this;
-    }
-
-    public ResolveInfoBuilder setProvider(
-            String packageName, String className, String authority, boolean isSystemApp) {
-        mProviderInfo = new ProviderInfo();
-        mProviderInfo.authority = authority;
-        mProviderInfo.applicationInfo = new ApplicationInfo();
-        if (isSystemApp) {
-            mProviderInfo.applicationInfo.flags |= ApplicationInfo.FLAG_SYSTEM;
-        }
-        mProviderInfo.packageName = mPackageName;
-        mProviderInfo.applicationInfo.packageName  = mPackageName;
-        mProviderInfo.name = className;
-        return this;
-    }
-
-    public ResolveInfo build() {
-        ResolveInfo info = new ResolveInfo();
-        info.activityInfo = mActivityInfo;
-        info.resolvePackageName = mPackageName;
-        info.providerInfo = mProviderInfo;
-        return info;
-    }
-}
diff --git a/tests/unit/src/com/android/settings/testutils/SliceTester.java b/tests/unit/src/com/android/settings/testutils/SliceTester.java
deleted file mode 100644
index be13e13..0000000
--- a/tests/unit/src/com/android/settings/testutils/SliceTester.java
+++ /dev/null
@@ -1,324 +0,0 @@
-/*
- * Copyright (C) 2020 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.testutils;
-
-import static android.app.slice.Slice.HINT_TITLE;
-import static android.app.slice.Slice.SUBTYPE_COLOR;
-import static android.app.slice.SliceItem.FORMAT_IMAGE;
-import static android.app.slice.SliceItem.FORMAT_INT;
-import static android.app.slice.SliceItem.FORMAT_TEXT;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import android.app.PendingIntent;
-import android.content.Context;
-import android.text.TextUtils;
-
-import androidx.core.graphics.drawable.IconCompat;
-import androidx.slice.Slice;
-import androidx.slice.SliceItem;
-import androidx.slice.SliceMetadata;
-import androidx.slice.builders.ListBuilder;
-import androidx.slice.core.SliceAction;
-import androidx.slice.core.SliceQuery;
-import androidx.slice.widget.EventInfo;
-
-import com.android.settings.Utils;
-import com.android.settings.slices.SettingsSliceProvider;
-import com.android.settings.slices.SliceBuilderUtils;
-import com.android.settings.slices.SliceData;
-
-import java.util.Arrays;
-import java.util.List;
-import java.util.Set;
-import java.util.stream.Collectors;
-
-/**
- * Testing utility class to verify the contents of the different Settings Slices.
- *
- * TODO (77712944) check Summary, range (metadata.getRange()), toggle icons.
- */
-public class SliceTester {
-
-    /**
-     * Test the contents of an intent based slice, including:
-     * - No toggles
-     * - Correct intent
-     * - Correct title
-     * - Correct keywords
-     * - TTL
-     * - Color
-     */
-    public static void testSettingsIntentSlice(Context context, Slice slice, SliceData sliceData) {
-        final SliceMetadata metadata = SliceMetadata.from(context, slice);
-
-        final long sliceTTL = metadata.getExpiry();
-        assertThat(sliceTTL).isEqualTo(ListBuilder.INFINITY);
-
-        final SliceItem colorItem = SliceQuery.findSubtype(slice, FORMAT_INT, SUBTYPE_COLOR);
-        final int color = colorItem.getInt();
-        assertThat(color).isEqualTo(Utils.getColorAccentDefaultColor(context));
-
-        final List<SliceAction> toggles = metadata.getToggles();
-        assertThat(toggles).isEmpty();
-
-        final PendingIntent primaryPendingIntent = metadata.getPrimaryAction().getAction();
-        assertThat(primaryPendingIntent).isEqualTo(
-                SliceBuilderUtils.getContentPendingIntent(context, sliceData));
-
-        assertThat(metadata.getTitle()).isEqualTo(sliceData.getTitle());
-
-        assertKeywords(metadata, sliceData);
-    }
-
-    /**
-     * Test the contents of an toggle based slice, including:
-     * - Contains one toggle
-     * - Correct toggle intent
-     * - Correct content intent
-     * - Correct title
-     * - Correct keywords
-     * - TTL
-     * - Color
-     */
-    public static void testSettingsToggleSlice(Context context, Slice slice, SliceData sliceData) {
-        final SliceMetadata metadata = SliceMetadata.from(context, slice);
-
-        final SliceItem colorItem = SliceQuery.findSubtype(slice, FORMAT_INT, SUBTYPE_COLOR);
-        final int color = colorItem.getInt();
-        assertThat(color).isEqualTo(Utils.getColorAccentDefaultColor(context));
-
-        final List<SliceAction> toggles = metadata.getToggles();
-        assertThat(toggles).hasSize(1);
-
-        final long sliceTTL = metadata.getExpiry();
-        assertThat(sliceTTL).isEqualTo(ListBuilder.INFINITY);
-
-        final SliceAction mainToggleAction = toggles.get(0);
-
-        assertThat(mainToggleAction.getIcon()).isNull();
-
-        // Check intent in Toggle Action
-        final PendingIntent togglePendingIntent = mainToggleAction.getAction();
-        assertThat(togglePendingIntent).isEqualTo(SliceBuilderUtils.getActionIntent(context,
-                SettingsSliceProvider.ACTION_TOGGLE_CHANGED, sliceData));
-
-        // Check primary intent
-        final PendingIntent primaryPendingIntent = metadata.getPrimaryAction().getAction();
-        assertThat(primaryPendingIntent).isEqualTo(
-                SliceBuilderUtils.getContentPendingIntent(context, sliceData));
-
-        assertThat(metadata.getTitle()).isEqualTo(sliceData.getTitle());
-
-        assertKeywords(metadata, sliceData);
-    }
-
-    /**
-     * Test the contents of an slider based slice, including:
-     * - No intent
-     * - Correct title
-     * - Correct keywords
-     * - TTL
-     * - Color
-     */
-    public static void testSettingsSliderSlice(Context context, Slice slice, SliceData sliceData) {
-        final SliceMetadata metadata = SliceMetadata.from(context, slice);
-        final SliceAction primaryAction = metadata.getPrimaryAction();
-
-        final IconCompat icon = primaryAction.getIcon();
-        if (icon == null) {
-            final SliceItem colorItem = SliceQuery.findSubtype(slice, FORMAT_INT, SUBTYPE_COLOR);
-            final int color = colorItem.getInt();
-            assertThat(color).isEqualTo(Utils.getColorAccentDefaultColor(context));
-
-        } else {
-            final IconCompat expectedIcon = IconCompat.createWithResource(context,
-                    sliceData.getIconResource());
-            assertThat(expectedIcon.toString()).isEqualTo(icon.toString());
-        }
-
-        final long sliceTTL = metadata.getExpiry();
-        assertThat(sliceTTL).isEqualTo(ListBuilder.INFINITY);
-
-        final int headerType = metadata.getHeaderType();
-        assertThat(headerType).isEqualTo(EventInfo.ROW_TYPE_SLIDER);
-
-        // Check primary intent
-        final PendingIntent primaryPendingIntent = primaryAction.getAction();
-        assertThat(primaryPendingIntent).isEqualTo(
-                SliceBuilderUtils.getContentPendingIntent(context, sliceData));
-
-        assertThat(metadata.getTitle()).isEqualTo(sliceData.getTitle());
-
-        assertKeywords(metadata, sliceData);
-    }
-
-    /**
-     * Test the copyable slice, including:
-     * - No intent
-     * - Correct title
-     * - Correct intent
-     * - Correct keywords
-     * - TTL
-     * - Color
-     */
-    public static void testSettingsCopyableSlice(Context context, Slice slice,
-            SliceData sliceData) {
-        final SliceMetadata metadata = SliceMetadata.from(context, slice);
-
-        final SliceItem colorItem = SliceQuery.findSubtype(slice, FORMAT_INT, SUBTYPE_COLOR);
-        final int color = colorItem.getInt();
-        assertThat(color).isEqualTo(Utils.getColorAccentDefaultColor(context));
-
-        final SliceAction primaryAction = metadata.getPrimaryAction();
-
-        final IconCompat expectedIcon = IconCompat.createWithResource(context,
-                sliceData.getIconResource());
-        assertThat(expectedIcon.toString()).isEqualTo(primaryAction.getIcon().toString());
-
-        final long sliceTTL = metadata.getExpiry();
-        assertThat(sliceTTL).isEqualTo(ListBuilder.INFINITY);
-
-        // Check primary intent
-        final PendingIntent primaryPendingIntent = primaryAction.getAction();
-        assertThat(primaryPendingIntent).isEqualTo(
-                SliceBuilderUtils.getContentPendingIntent(context, sliceData));
-
-        assertThat(metadata.getTitle()).isEqualTo(sliceData.getTitle());
-
-        assertKeywords(metadata, sliceData);
-    }
-
-    /**
-     * Test the contents of an unavailable slice, including:
-     * - No toggles
-     * - Correct title
-     * - Correct intent
-     * - Correct keywords
-     * - Color
-     * - TTL
-     */
-    public static void testSettingsUnavailableSlice(Context context, Slice slice,
-            SliceData sliceData) {
-        final SliceMetadata metadata = SliceMetadata.from(context, slice);
-
-        final long sliceTTL = metadata.getExpiry();
-        assertThat(sliceTTL).isEqualTo(ListBuilder.INFINITY);
-
-        final SliceItem colorItem = SliceQuery.findSubtype(slice, FORMAT_INT, SUBTYPE_COLOR);
-        final int color = colorItem.getInt();
-        assertThat(color).isEqualTo(Utils.getColorAccentDefaultColor(context));
-
-        final List<SliceAction> toggles = metadata.getToggles();
-        assertThat(toggles).isEmpty();
-
-        final PendingIntent primaryPendingIntent = metadata.getPrimaryAction().getAction();
-        assertThat(primaryPendingIntent).isEqualTo(SliceBuilderUtils.getContentPendingIntent(
-                context, sliceData));
-
-        assertThat(metadata.getTitle()).isEqualTo(sliceData.getTitle());
-
-        assertKeywords(metadata, sliceData);
-    }
-
-    /**
-     * Assert any slice item contains title.
-     *
-     * @param sliceItems All slice items of a Slice.
-     * @param title Title for asserting.
-     */
-    public static void assertAnySliceItemContainsTitle(List<SliceItem> sliceItems, String title) {
-        assertThat(hasText(sliceItems, title, HINT_TITLE)).isTrue();
-    }
-
-    /**
-     * Assert any slice item contains subtitle.
-     *
-     * @param sliceItems All slice items of a Slice.
-     * @param subtitle Subtitle for asserting.
-     */
-    public static void assertAnySliceItemContainsSubtitle(List<SliceItem> sliceItems,
-            String subtitle) {
-        // Subtitle has no hints
-        assertThat(hasText(sliceItems, subtitle, null /* hints */)).isTrue();
-    }
-
-    /**
-     * Assert no slice item contains subtitle.
-     *
-     * @param sliceItems All slice items of a Slice.
-     * @param subtitle Subtitle for asserting.
-     */
-    public static void assertNoSliceItemContainsSubtitle(List<SliceItem> sliceItems,
-            String subtitle) {
-        // Subtitle has no hints
-        assertThat(hasText(sliceItems, subtitle, null /* hints */)).isFalse();
-    }
-
-    private static boolean hasText(List<SliceItem> sliceItems, String text, String hints) {
-        boolean hasText = false;
-        for (SliceItem item : sliceItems) {
-            List<SliceItem> textItems = SliceQuery.findAll(item, FORMAT_TEXT, hints,
-                    null /* non-hints */);
-            if (textItems == null) {
-                continue;
-            }
-
-            for (SliceItem textItem : textItems) {
-                if (TextUtils.equals(textItem.getText(), text)) {
-                    hasText = true;
-                    break;
-                }
-            }
-        }
-        return hasText;
-    }
-
-    /**
-     * Assert any slice item contains icon.
-     *
-     * @param sliceItems All slice items of a Slice.
-     * @param icon Icon for asserting.
-     */
-    public static void assertAnySliceItemContainsIcon(List<SliceItem> sliceItems, IconCompat icon) {
-        boolean hasIcon = false;
-        for (SliceItem item : sliceItems) {
-            List<SliceItem> iconItems = SliceQuery.findAll(item, FORMAT_IMAGE,
-                    (String) null /* hints */, null /* non-hints */);
-            if (iconItems == null) {
-                continue;
-            }
-
-            for (SliceItem iconItem : iconItems) {
-                if (icon.toString().equals(iconItem.getIcon().toString())) {
-                    hasIcon = true;
-                    break;
-                }
-            }
-        }
-        assertThat(hasIcon).isTrue();
-    }
-
-    private static void assertKeywords(SliceMetadata metadata, SliceData data) {
-        final List<String> keywords = metadata.getSliceKeywords();
-        final Set<String> expectedKeywords = Arrays.stream(data.getKeywords().split(","))
-                .map(s -> s = s.trim())
-                .collect(Collectors.toSet());
-        expectedKeywords.add(data.getTitle());
-        expectedKeywords.add(data.getScreenTitle().toString());
-        assertThat(keywords).containsExactlyElementsIn(expectedKeywords);
-    }
-}