Merge "Fixes resource file exemption." am: 888759dd9f am: b6050b438d
Original change: https://android-review.googlesource.com/c/platform/packages/apps/Settings/+/2395652
Change-Id: Idf4f02ff98d516d42e48e372bac9455386247906
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 6d2c636..f81a97f 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -2973,7 +2973,6 @@
<activity android:name=".FallbackHome"
android:excludeFromRecents="true"
android:label=""
- android:screenOrientation="nosensor"
android:taskAffinity="com.android.settings.FallbackHome"
android:exported="true"
android:theme="@style/FallbackHome"
@@ -3409,7 +3408,7 @@
android:label="@string/notification_channel_title"
android:theme="@style/Theme.Panel"
android:excludeFromRecents="true"
- android:configChanges="orientation|keyboardHidden|screenSize"
+ android:configChanges="keyboardHidden|screenSize"
android:exported="true">
<intent-filter android:priority="1">
<action android:name="android.settings.CHANNEL_NOTIFICATION_SETTINGS" />
diff --git a/res/drawable-sw600dp-night/accessibility_button_preview_base.xml b/res/drawable-sw600dp-night/accessibility_button_preview_base.xml
new file mode 100644
index 0000000..633ce68
--- /dev/null
+++ b/res/drawable-sw600dp-night/accessibility_button_preview_base.xml
@@ -0,0 +1,18 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="412dp"
+ android:height="300dp"
+ android:viewportWidth="412"
+ android:viewportHeight="300">
+ <path
+ android:fillColor="#FF000000"
+ android:pathData="M384.18,300H27.82C12.53,300 0,287.17 0,271.52V28.48C0,12.83 12.53,0 27.82,0H384.29c15.18,0 27.71,12.83 27.71,28.48v243.15c0,15.54 -12.53,28.37 -27.82,28.37Z"/>
+ <path
+ android:pathData="M368.24,143.47L368.24,60.55c0,-5.67 -4.59,-10.26 -10.26,-10.26L54.02,50.29c-5.67,0 -10.26,4.59 -10.26,10.26L43.76,242.76c0,5.67 4.59,10.26 10.26,10.26L357.98,253.02c5.67,0 10.26,-4.59 10.26,-10.26v-99.29ZM365.88,243.14c0,4.15 -3.75,7.52 -7.9,7.52L54.02,250.66c-4.15,0 -7.9,-3.37 -7.9,-7.52L46.12,60.55c0,-4.15 3.75,-7.9 7.9,-7.9L357.98,52.65c4.15,0 7.9,3.75 7.9,7.9L365.88,243.14Z"
+ android:fillColor="#80868b"/>
+ <path
+ android:pathData="M319.83,50.29c-0,-1.28 -1.04,-2.31 -2.31,-2.31h-23.11c-1.28,0 -2.31,1.03 -2.31,2.31h27.74Z"
+ android:fillColor="#80868b"/>
+ <path
+ android:pathData="M344.42,50.29c-0,-1.28 -1.03,-2.31 -2.31,-2.31h-9.25c-1.28,0 -2.31,1.03 -2.31,2.31h13.87Z"
+ android:fillColor="#80868b"/>
+</vector>
diff --git a/res/drawable-sw600dp-night/accessibility_button_preview_large_floating_menu.xml b/res/drawable-sw600dp-night/accessibility_button_preview_large_floating_menu.xml
new file mode 100644
index 0000000..426403f
--- /dev/null
+++ b/res/drawable-sw600dp-night/accessibility_button_preview_large_floating_menu.xml
@@ -0,0 +1,12 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="412dp"
+ android:height="300dp"
+ android:viewportWidth="412"
+ android:viewportHeight="300">
+ <path
+ android:pathData="M365.76,226.17h-27.68c-14.95,0 -27.07,-12.18 -27.07,-27.07s12.18,-27.07 27.07,-27.07h27.68v1.76h-27.68c-14.01,0 -25.37,11.37 -25.37,25.37s11.37,25.37 25.37,25.37h27.68v1.62Z"
+ android:fillColor="#80868b"/>
+ <path
+ android:pathData="M337.95,178.94c-11.16,0 -20.16,9.07 -20.16,20.16 0,11.16 9.07,20.16 20.16,20.16s20.16,-9.07 20.16,-20.16c0.07,-11.16 -8.93,-20.16 -20.16,-20.16ZM337.95,188.62c1.15,0 2.1,0.95 2.1,2.1 0,1.15 -0.95,2.1 -2.1,2.1s-2.1,-0.95 -2.1,-2.1c0,-1.15 1.02,-2.1 2.1,-2.1ZM341.2,196.06v13.74h-2.1v-6.36h-2.1v6.36h-2.17v-13.74c-2.1,-0.2 -4.4,-0.54 -6.36,-1.01l0.54,-2.1c2.77,0.68 6.02,1.01 9,1.01s6.23,-0.34 9,-1.01l0.54,2.1c-1.96,0.47 -4.26,0.81 -6.36,1.01Z"
+ android:fillColor="#d9dbdf"/>
+</vector>
diff --git a/res/drawable-sw600dp-night/accessibility_button_preview_small_floating_menu.xml b/res/drawable-sw600dp-night/accessibility_button_preview_small_floating_menu.xml
new file mode 100644
index 0000000..b738d8f
--- /dev/null
+++ b/res/drawable-sw600dp-night/accessibility_button_preview_small_floating_menu.xml
@@ -0,0 +1,12 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="412dp"
+ android:height="300dp"
+ android:viewportWidth="412"
+ android:viewportHeight="300">
+ <path
+ android:pathData="M365.88,219.24h-20.7c-5.38,0 -10.43,-2.09 -14.23,-5.9s-5.9,-8.86 -5.9,-14.23c0,-5.38 2.09,-10.43 5.9,-14.24 3.8,-3.8 8.86,-5.9 14.23,-5.9h20.7v1h-20.7c-5.11,0 -9.91,1.99 -13.53,5.6s-5.6,8.42 -5.6,13.53c0,5.11 1.99,9.91 5.6,13.53s8.42,5.6 13.53,5.6h20.7v1Z"
+ android:fillColor="#80868b"/>
+ <path
+ android:pathData="M345.19,184c-2.99,-0 -5.91,0.88 -8.4,2.54 -2.49,1.66 -4.43,4.02 -5.57,6.78s-1.45,5.8 -0.86,8.73c0.58,2.93 2.02,5.63 4.13,7.74 2.11,2.11 4.81,3.55 7.74,4.14 2.93,0.58 5.97,0.29 8.73,-0.86 2.76,-1.14 5.12,-3.08 6.78,-5.57 1.66,-2.49 2.55,-5.41 2.55,-8.4 0,-4.01 -1.59,-7.85 -4.42,-10.68 -2.83,-2.83 -6.67,-4.43 -10.68,-4.43ZM345.19,191.28c0.4,0.03 0.77,0.21 1.04,0.51 0.27,0.29 0.42,0.68 0.42,1.08 0,0.4 -0.15,0.79 -0.42,1.08 -0.27,0.29 -0.64,0.47 -1.04,0.51 -0.22,0.02 -0.44,-0.01 -0.65,-0.08 -0.21,-0.07 -0.4,-0.19 -0.56,-0.33 -0.16,-0.15 -0.29,-0.33 -0.38,-0.53 -0.09,-0.2 -0.13,-0.42 -0.13,-0.64 0,-0.22 0.05,-0.44 0.13,-0.64 0.09,-0.2 0.22,-0.38 0.38,-0.53 0.16,-0.15 0.35,-0.26 0.56,-0.33 0.21,-0.07 0.43,-0.1 0.65,-0.08ZM347.56,196.82v10.29h-1.58v-4.76h-1.59v4.75h-1.58v-10.28c-1.6,-0.12 -3.19,-0.39 -4.75,-0.79l0.4,-1.58c4.42,1.05 9.04,1.05 13.46,0l0.39,1.58c-1.57,0.41 -3.17,0.67 -4.79,0.79h0.04Z"
+ android:fillColor="#dadce0"/>
+</vector>
diff --git a/res/drawable-sw600dp-night/accessibility_button_preview_three_finger.xml b/res/drawable-sw600dp-night/accessibility_button_preview_three_finger.xml
new file mode 100644
index 0000000..5a0925c
--- /dev/null
+++ b/res/drawable-sw600dp-night/accessibility_button_preview_three_finger.xml
@@ -0,0 +1,33 @@
+<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="M263.59,50.35C263.59,48.98 264.7,47.86 266.06,47.86L287.85,47.86C289.22,47.86 290.33,48.98 290.33,50.35L277.45,51.34L263.59,50.35Z"
+ android:fillColor="#80868B"/>
+ <path
+ android:pathData="M364.52,66.19L364.52,236.14A14.75,14.75 0,0 1,349.77 250.89L62.23,250.89A14.75,14.75 0,0 1,47.48 236.14L47.48,66.19A14.75,14.75 0,0 1,62.23 51.44L349.77,51.44A14.75,14.75 0,0 1,364.52 66.19z"
+ android:strokeWidth="2.5"
+ android:fillColor="#000000"
+ android:strokeColor="#80868B"/>
+ <path
+ android:pathData="M311.45,50.35C311.45,48.98 312.56,47.86 313.92,47.86L322.84,47.86C324.2,47.86 325.32,48.98 325.32,50.35L319.37,51.34L311.45,50.35Z"
+ android:fillColor="#80868B"/>
+ <path
+ android:pathData="M170.9,232.14L241.9,232.14A2,2 0,0 1,243.9 234.14L243.9,234.14A2,2 0,0 1,241.9 236.14L170.9,236.14A2,2 0,0 1,168.9 234.14L168.9,234.14A2,2 0,0 1,170.9 232.14z"
+ android:fillColor="#80868B"/>
+ <path
+ android:pathData="M188.7,229.14V217.74H193.6L186.7,205.54L179.8,217.74H184.7V229.14C182.8,229.94 181.5,231.74 181.5,233.94C181.5,236.84 183.8,239.14 186.7,239.14C189.6,239.14 191.9,236.84 191.9,233.94C191.9,231.84 190.5,229.94 188.7,229.14Z"
+ android:fillColor="#669DF6"/>
+ <path
+ android:pathData="M208,229.14V217.74H212.9L206,205.54L199.1,217.74H204V229.14C202.1,229.94 200.8,231.74 200.8,233.94C200.8,236.84 203.1,239.14 206,239.14C208.9,239.14 211.2,236.84 211.2,233.94C211.2,231.84 209.9,229.94 208,229.14Z"
+ android:fillColor="#669DF6"/>
+ <path
+ android:pathData="M227.29,229.14V217.74H232.2L225.29,205.54L218.4,217.74H223.29V229.14C221.4,229.94 220.1,231.74 220.1,233.94C220.1,236.84 222.4,239.14 225.29,239.14C228.2,239.14 230.49,236.84 230.49,233.94C230.49,231.84 229.2,229.94 227.29,229.14Z"
+ android:fillColor="#669DF6"/>
+ </group>
+</vector>
diff --git a/res/drawable-sw600dp-night/accessibility_button_preview_two_finger.xml b/res/drawable-sw600dp-night/accessibility_button_preview_two_finger.xml
new file mode 100644
index 0000000..ba9c771
--- /dev/null
+++ b/res/drawable-sw600dp-night/accessibility_button_preview_two_finger.xml
@@ -0,0 +1,30 @@
+<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="M263.59,50.35C263.59,48.98 264.7,47.86 266.06,47.86L287.85,47.86C289.22,47.86 290.33,48.98 290.33,50.35L277.45,51.34L263.59,50.35Z"
+ android:fillColor="#80868B"/>
+ <path
+ android:pathData="M364.52,66.19L364.52,236.14A14.75,14.75 0,0 1,349.77 250.89L62.23,250.89A14.75,14.75 0,0 1,47.48 236.14L47.48,66.19A14.75,14.75 0,0 1,62.23 51.44L349.77,51.44A14.75,14.75 0,0 1,364.52 66.19z"
+ android:strokeWidth="2.5"
+ android:fillColor="#000000"
+ android:strokeColor="#80868B"/>
+ <path
+ android:pathData="M311.45,50.35C311.45,48.98 312.56,47.86 313.92,47.86L322.84,47.86C324.2,47.86 325.32,48.98 325.32,50.35L319.37,51.34L311.45,50.35Z"
+ android:fillColor="#80868B"/>
+ <path
+ android:pathData="M170.9,232.14L241.9,232.14A2,2 0,0 1,243.9 234.14L243.9,234.14A2,2 0,0 1,241.9 236.14L170.9,236.14A2,2 0,0 1,168.9 234.14L168.9,234.14A2,2 0,0 1,170.9 232.14z"
+ android:fillColor="#80868B"/>
+ <path
+ android:pathData="M198.35,229.14V217.74H203.25L196.35,205.54L189.45,217.74H194.35V229.14C192.45,229.94 191.15,231.74 191.15,233.94C191.15,236.84 193.45,239.14 196.35,239.14C199.25,239.14 201.55,236.84 201.55,233.94C201.55,231.84 200.15,229.94 198.35,229.14Z"
+ android:fillColor="#669DF6"/>
+ <path
+ android:pathData="M217.65,229.14V217.74H222.55L215.65,205.54L208.75,217.74H213.65V229.14C211.75,229.94 210.45,231.74 210.45,233.94C210.45,236.84 212.75,239.14 215.65,239.14C218.55,239.14 220.85,236.84 220.85,233.94C220.85,231.84 219.55,229.94 217.65,229.14Z"
+ android:fillColor="#669DF6"/>
+ </group>
+</vector>
diff --git a/res/drawable-sw600dp-night/accessibility_captioning_banner.xml b/res/drawable-sw600dp-night/accessibility_captioning_banner.xml
new file mode 100644
index 0000000..3bd8af9
--- /dev/null
+++ b/res/drawable-sw600dp-night/accessibility_captioning_banner.xml
@@ -0,0 +1,45 @@
+<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="M369.5,63.4L369.5,239.96A14.5,14.5 0,0 1,355 254.46L57,254.46A14.5,14.5 0,0 1,42.5 239.96L42.5,63.4A14.5,14.5 0,0 1,57 48.9L355,48.9A14.5,14.5 0,0 1,369.5 63.4z"
+ android:strokeWidth="3"
+ android:fillColor="#000000"
+ android:strokeColor="#80868B"/>
+ <path
+ android:pathData="M265.48,47.57C265.48,46.15 266.62,45 268.03,45L290.53,45C291.95,45 293.09,46.15 293.09,47.57L279.79,48.59L265.48,47.57Z"
+ android:fillColor="#80868B"/>
+ <path
+ android:pathData="M314.9,47.57C314.9,46.15 316.05,45 317.46,45L326.67,45C328.08,45 329.22,46.15 329.22,47.57L323.08,48.59L314.9,47.57Z"
+ android:fillColor="#80868B"/>
+ <path
+ android:pathData="M132.8,202H79.2V210.5H132.8V202Z"
+ android:fillColor="#669DF6"/>
+ <path
+ android:pathData="M172.9,202H142.5V210.5H172.9V202Z"
+ android:fillColor="#669DF6"/>
+ <path
+ android:pathData="M158.4,217.9H79.2V226.4H158.4V217.9Z"
+ android:fillColor="#669DF6"/>
+ <path
+ android:pathData="M202.2,217.9H168.1V226.4H202.2V217.9Z"
+ android:fillColor="#669DF6"/>
+ <path
+ android:pathData="M246,217.9H211.9V226.4H246V217.9Z"
+ android:fillColor="#669DF6"/>
+ <path
+ android:pathData="M255.8,202H182.7V210.5H255.8V202Z"
+ android:fillColor="#669DF6"/>
+ <path
+ android:pathData="M292.3,202H265.5V210.5H292.3V202Z"
+ android:fillColor="#669DF6"/>
+ <path
+ android:pathData="M328.9,202H302.1V210.5H328.9V202Z"
+ android:fillColor="#669DF6"/>
+ </group>
+</vector>
diff --git a/res/drawable-sw600dp-night/accessibility_shortcut_type_hardware.xml b/res/drawable-sw600dp-night/accessibility_shortcut_type_hardware.xml
new file mode 100644
index 0000000..1040d05
--- /dev/null
+++ b/res/drawable-sw600dp-night/accessibility_shortcut_type_hardware.xml
@@ -0,0 +1,44 @@
+<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="M255.38,94.3C255.38,93.14 256.32,92.21 257.47,92.21L275.86,92.21C277.01,92.21 277.95,93.14 277.95,94.3L267.08,95.14L255.38,94.3Z"
+ android:fillColor="#669DF6"/>
+ <path
+ android:pathData="M340.09,110.17L340.09,248.55A14.5,14.5 0,0 1,325.59 263.05L88,263.05A14.5,14.5 0,0 1,73.5 248.55L73.5,110.17A14.5,14.5 0,0 1,88 95.67L325.59,95.67A14.5,14.5 0,0 1,340.09 110.17z"
+ android:strokeWidth="3"
+ android:fillColor="#000000"
+ android:strokeColor="#80868B"/>
+ <path
+ android:pathData="M295.77,94.3C295.77,93.14 296.7,92.21 297.86,92.21L305.38,92.21C306.53,92.21 307.46,93.14 307.46,94.3L302.45,95.14L295.77,94.3Z"
+ android:fillColor="#80868B"/>
+ <group>
+ <clip-path
+ android:pathData="M274,30L274,30A93,93 0,0 1,367 123L367,123A93,93 0,0 1,274 216L274,216A93,93 0,0 1,181 123L181,123A93,93 0,0 1,274 30z"/>
+ <path
+ android:pathData="M274,30L274,30A93,93 0,0 1,367 123L367,123A93,93 0,0 1,274 216L274,216A93,93 0,0 1,181 123L181,123A93,93 0,0 1,274 30z"
+ android:fillColor="#000000"/>
+ <path
+ android:pathData="M206.07,85.49C206.07,83.45 207.72,81.79 209.75,81.79L242.17,81.79C244.21,81.79 245.86,83.45 245.86,85.49L226.7,86.97L206.07,85.49Z"
+ android:fillColor="#669DF6"/>
+ <path
+ android:pathData="M345.84,101.25L345.84,369.73A14.25,14.25 0,0 1,331.59 383.98L-111.85,383.98A14.25,14.25 0,0 1,-126.1 369.73L-126.1,101.25A14.25,14.25 0,0 1,-111.85 87L331.59,87A14.25,14.25 0,0 1,345.84 101.25z"
+ android:strokeWidth="3.5"
+ android:fillColor="#000000"
+ android:strokeColor="#80868B"/>
+ <path
+ android:pathData="M266.77,85.49C266.77,83.45 268.42,81.79 270.46,81.79L283.72,81.79C285.75,81.79 287.4,83.45 287.4,85.49L278.56,86.97L266.77,85.49Z"
+ android:fillColor="#80868B"/>
+ </group>
+ <path
+ android:strokeWidth="1"
+ android:pathData="M274,30.5L274,30.5A92.5,92.5 0,0 1,366.5 123L366.5,123A92.5,92.5 0,0 1,274 215.5L274,215.5A92.5,92.5 0,0 1,181.5 123L181.5,123A92.5,92.5 0,0 1,274 30.5z"
+ android:fillColor="#00000000"
+ android:strokeColor="#80868B"/>
+ </group>
+</vector>
diff --git a/res/drawable-sw600dp-night/accessibility_shortcut_type_software.xml b/res/drawable-sw600dp-night/accessibility_shortcut_type_software.xml
new file mode 100644
index 0000000..49a2661
--- /dev/null
+++ b/res/drawable-sw600dp-night/accessibility_shortcut_type_software.xml
@@ -0,0 +1,36 @@
+<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="M62.23,50.19L349.77,50.19A16,16 0,0 1,365.77 66.19L365.77,236.14A16,16 0,0 1,349.77 252.14L62.23,252.14A16,16 0,0 1,46.23 236.14L46.23,66.19A16,16 0,0 1,62.23 50.19z"/>
+ <path
+ android:pathData="M46.23,204.14h320v48h-320z"
+ android:fillColor="#3D4043"/>
+ <path
+ android:pathData="M268.93,214.14C270.43,214.14 271.63,215.34 271.63,216.84C271.63,218.34 270.43,219.54 268.93,219.54C267.43,219.54 266.23,218.34 266.23,216.84C266.23,215.34 267.43,214.14 268.93,214.14ZM273.03,223.64V241.24H270.23V233.14H267.53V241.24H264.83V223.64C262.13,223.44 259.23,222.94 256.73,222.24L257.43,219.54C260.93,220.44 265.13,220.94 268.93,220.94C272.73,220.94 276.93,220.54 280.43,219.54L281.13,222.24C278.63,222.94 275.73,223.44 273.03,223.64Z"
+ android:fillColor="#ffffff"/>
+ <path
+ android:pathData="M206.23,238.04C211.42,238.04 215.63,233.83 215.63,228.64C215.63,223.45 211.42,219.24 206.23,219.24C201.04,219.24 196.83,223.45 196.83,228.64C196.83,233.83 201.04,238.04 206.23,238.04Z"
+ android:fillColor="#808589"/>
+ <path
+ android:pathData="M131.33,228.64L147.33,237.84V219.34L131.33,228.64Z"
+ android:fillColor="#808589"/>
+ </group>
+ <path
+ android:pathData="M62.23,51.69L349.77,51.69A14.5,14.5 0,0 1,364.27 66.19L364.27,236.14A14.5,14.5 0,0 1,349.77 250.64L62.23,250.64A14.5,14.5 0,0 1,47.73 236.14L47.73,66.19A14.5,14.5 0,0 1,62.23 51.69z"
+ android:strokeWidth="3"
+ android:fillColor="#00000000"
+ android:strokeColor="#80868B"/>
+ <path
+ android:pathData="M311.45,50.35C311.45,48.98 312.56,47.87 313.92,47.87L322.84,47.87C324.2,47.87 325.32,48.98 325.32,50.35L319.37,51.34L311.45,50.35Z"
+ android:fillColor="#80868B"/>
+ <path
+ android:pathData="M263.59,50.35C263.59,48.98 264.7,47.87 266.06,47.87L287.85,47.87C289.22,47.87 290.33,48.98 290.33,50.35L277.45,51.34L263.59,50.35Z"
+ android:fillColor="#80868B"/>
+ <path
+ android:pathData="M268.93,259.69C251.31,259.69 236.93,245.3 236.93,227.69C236.93,210.07 251.31,195.69 268.93,195.69C286.55,195.69 300.93,210.07 300.93,227.69C300.93,245.3 286.55,259.69 268.93,259.69ZM268.93,198.38C252.84,198.38 239.72,211.51 239.72,227.6C239.72,243.69 252.84,256.81 268.93,256.81C285.02,256.81 298.14,243.69 298.14,227.6C298.14,211.51 285.02,198.38 268.93,198.38Z"
+ android:fillColor="#729CEE"/>
+</vector>
diff --git a/res/drawable-sw600dp-night/accessibility_shortcut_type_software_floating.xml b/res/drawable-sw600dp-night/accessibility_shortcut_type_software_floating.xml
new file mode 100644
index 0000000..c0b562e
--- /dev/null
+++ b/res/drawable-sw600dp-night/accessibility_shortcut_type_software_floating.xml
@@ -0,0 +1,29 @@
+<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="M263.59,50.35C263.59,48.98 264.7,47.86 266.06,47.86L287.85,47.86C289.22,47.86 290.33,48.98 290.33,50.35L277.45,51.34L263.59,50.35Z"
+ android:fillColor="#80868B"/>
+ <path
+ android:pathData="M364.52,66.19L364.52,236.14A14.75,14.75 0,0 1,349.77 250.89L62.23,250.89A14.75,14.75 0,0 1,47.48 236.14L47.48,66.19A14.75,14.75 0,0 1,62.23 51.44L349.77,51.44A14.75,14.75 0,0 1,364.52 66.19z"
+ android:strokeWidth="2.5"
+ android:fillColor="#000000"
+ android:strokeColor="#80868B"/>
+ <path
+ android:pathData="M311.45,50.35C311.45,48.98 312.56,47.86 313.92,47.86L322.84,47.86C324.2,47.86 325.32,48.98 325.32,50.35L319.37,51.34L311.45,50.35Z"
+ android:fillColor="#80868B"/>
+ </group>
+ <path
+ android:strokeWidth="1"
+ android:pathData="M365.64,179.48H344.94C339.74,179.48 334.74,181.54 331.06,185.23C327.38,188.91 325.31,193.9 325.31,199.11C325.31,204.31 327.38,209.3 331.06,212.99C334.74,216.67 339.74,218.74 344.94,218.74H365.64"
+ android:fillColor="#00000000"
+ android:strokeColor="#80868B"/>
+ <path
+ android:pathData="M344.95,184C341.96,183.99 339.04,184.88 336.55,186.54C334.06,188.2 332.12,190.56 330.98,193.32C329.83,196.08 329.53,199.12 330.11,202.05C330.7,204.98 332.14,207.67 334.25,209.79C336.36,211.9 339.05,213.34 341.98,213.93C344.92,214.51 347.95,214.21 350.72,213.07C353.48,211.92 355.84,209.99 357.5,207.5C359.16,205.02 360.05,202.1 360.05,199.11C360.05,195.1 358.46,191.26 355.62,188.43C352.79,185.59 348.95,184 344.95,184ZM344.95,191.28C345.35,191.31 345.72,191.49 345.99,191.78C346.26,192.08 346.41,192.46 346.41,192.86C346.41,193.26 346.26,193.65 345.99,193.94C345.72,194.23 345.35,194.41 344.95,194.45C344.73,194.46 344.51,194.43 344.3,194.36C344.09,194.29 343.9,194.18 343.74,194.03C343.58,193.88 343.45,193.7 343.36,193.5C343.28,193.3 343.23,193.08 343.23,192.86C343.23,192.64 343.28,192.43 343.36,192.22C343.45,192.02 343.58,191.84 343.74,191.69C343.9,191.54 344.09,191.43 344.3,191.36C344.51,191.29 344.73,191.26 344.95,191.28ZM347.32,196.82V207.11H345.74V202.35H344.15V207.1H342.57V196.82C340.96,196.69 339.37,196.43 337.82,196.03L338.22,194.45C342.64,195.5 347.25,195.5 351.68,194.45L352.07,196.03C350.5,196.43 348.89,196.7 347.28,196.82H347.32Z"
+ android:fillColor="#DADCE0"/>
+</vector>
diff --git a/res/drawable-sw600dp-night/accessibility_shortcut_type_software_gesture.xml b/res/drawable-sw600dp-night/accessibility_shortcut_type_software_gesture.xml
new file mode 100644
index 0000000..51d4ba7
--- /dev/null
+++ b/res/drawable-sw600dp-night/accessibility_shortcut_type_software_gesture.xml
@@ -0,0 +1,50 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:aapt="http://schemas.android.com/aapt"
+ android:width="412dp"
+ android:height="300dp"
+ android:viewportWidth="412"
+ android:viewportHeight="300">
+ <group>
+ <clip-path
+ android:pathData="M0,0h412v300h-412z"/>
+ <path
+ android:pathData="M263.59,50.35C263.59,48.98 264.7,47.86 266.06,47.86L287.85,47.86C289.22,47.86 290.33,48.98 290.33,50.35L277.45,51.34L263.59,50.35Z"
+ android:fillColor="#80868B"/>
+ <path
+ android:pathData="M364.52,66.19L364.52,236.14A14.75,14.75 0,0 1,349.77 250.89L62.23,250.89A14.75,14.75 0,0 1,47.48 236.14L47.48,66.19A14.75,14.75 0,0 1,62.23 51.44L349.77,51.44A14.75,14.75 0,0 1,364.52 66.19z"
+ android:strokeWidth="2.5"
+ android:fillColor="#000000"
+ android:strokeColor="#80868B"/>
+ <path
+ android:pathData="M311.45,50.35C311.45,48.98 312.56,47.86 313.92,47.86L322.84,47.86C324.2,47.86 325.32,48.98 325.32,50.35L319.37,51.34L311.45,50.35Z"
+ android:fillColor="#80868B"/>
+ <path
+ android:pathData="M188.15,188.94C184.45,188.94 181.55,191.94 181.55,195.54V220.14H194.85V195.54C194.85,191.94 191.85,188.94 188.15,188.94Z">
+ <aapt:attr name="android:fillColor">
+ <gradient
+ android:startX="188.2"
+ android:startY="220.23"
+ android:endX="188.2"
+ android:endY="188.97"
+ android:type="linear">
+ <item android:offset="0" android:color="#00669DF6"/>
+ <item android:offset="0.69" android:color="#FF669DF6"/>
+ </gradient>
+ </aapt:attr>
+ </path>
+ <path
+ android:pathData="M222.95,188.94C219.25,188.94 216.35,191.94 216.35,195.54V220.14H229.55V195.54C229.55,191.94 226.65,188.94 222.95,188.94Z">
+ <aapt:attr name="android:fillColor">
+ <gradient
+ android:startX="222.95"
+ android:startY="220.23"
+ android:endX="222.95"
+ android:endY="188.97"
+ android:type="linear">
+ <item android:offset="0" android:color="#00669DF6"/>
+ <item android:offset="0.69" android:color="#FF669DF6"/>
+ </gradient>
+ </aapt:attr>
+ </path>
+ </group>
+</vector>
diff --git a/res/drawable-sw600dp-night/accessibility_shortcut_type_software_gesture_talkback.xml b/res/drawable-sw600dp-night/accessibility_shortcut_type_software_gesture_talkback.xml
new file mode 100644
index 0000000..c02d8a7
--- /dev/null
+++ b/res/drawable-sw600dp-night/accessibility_shortcut_type_software_gesture_talkback.xml
@@ -0,0 +1,64 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:aapt="http://schemas.android.com/aapt"
+ android:width="412dp"
+ android:height="300dp"
+ android:viewportWidth="412"
+ android:viewportHeight="300">
+ <group>
+ <clip-path
+ android:pathData="M0,0h412v300h-412z"/>
+ <path
+ android:pathData="M263.59,50.35C263.59,48.98 264.7,47.86 266.06,47.86L287.85,47.86C289.22,47.86 290.33,48.98 290.33,50.35L277.45,51.34L263.59,50.35Z"
+ android:fillColor="#80868B"/>
+ <path
+ android:pathData="M364.52,66.19L364.52,236.14A14.75,14.75 0,0 1,349.77 250.89L62.23,250.89A14.75,14.75 0,0 1,47.48 236.14L47.48,66.19A14.75,14.75 0,0 1,62.23 51.44L349.77,51.44A14.75,14.75 0,0 1,364.52 66.19z"
+ android:strokeWidth="2.5"
+ android:fillColor="#000000"
+ android:strokeColor="#80868B"/>
+ <path
+ android:pathData="M311.45,50.35C311.45,48.98 312.56,47.86 313.92,47.86L322.84,47.86C324.2,47.86 325.32,48.98 325.32,50.35L319.37,51.34L311.45,50.35Z"
+ android:fillColor="#80868B"/>
+ <path
+ android:pathData="M176.84,188.94C173.14,188.94 170.24,191.94 170.24,195.54V220.14H183.54V195.54C183.54,191.94 180.54,188.94 176.84,188.94Z">
+ <aapt:attr name="android:fillColor">
+ <gradient
+ android:startX="176.89"
+ android:startY="220.23"
+ android:endX="176.89"
+ android:endY="188.97"
+ android:type="linear">
+ <item android:offset="0" android:color="#00669DF6"/>
+ <item android:offset="0.69" android:color="#FF669DF6"/>
+ </gradient>
+ </aapt:attr>
+ </path>
+ <path
+ android:pathData="M206.14,188.94C202.44,188.94 199.54,191.94 199.54,195.54V220.14H212.84V195.54C212.74,191.94 209.84,188.94 206.14,188.94Z">
+ <aapt:attr name="android:fillColor">
+ <gradient
+ android:startX="206.19"
+ android:startY="220.23"
+ android:endX="206.19"
+ android:endY="188.97"
+ android:type="linear">
+ <item android:offset="0" android:color="#00669DF6"/>
+ <item android:offset="0.69" android:color="#FF669DF6"/>
+ </gradient>
+ </aapt:attr>
+ </path>
+ <path
+ android:pathData="M235.44,188.94C231.74,188.94 228.84,191.94 228.84,195.54V220.14H242.14V195.54C242.04,191.94 239.14,188.94 235.44,188.94Z">
+ <aapt:attr name="android:fillColor">
+ <gradient
+ android:startX="235.49"
+ android:startY="220.23"
+ android:endX="235.49"
+ android:endY="188.97"
+ android:type="linear">
+ <item android:offset="0" android:color="#00669DF6"/>
+ <item android:offset="0.69" android:color="#FF669DF6"/>
+ </gradient>
+ </aapt:attr>
+ </path>
+ </group>
+</vector>
diff --git a/res/drawable-sw600dp-night/ic_illustration_fullscreen.xml b/res/drawable-sw600dp-night/ic_illustration_fullscreen.xml
new file mode 100644
index 0000000..b7e2395
--- /dev/null
+++ b/res/drawable-sw600dp-night/ic_illustration_fullscreen.xml
@@ -0,0 +1,70 @@
+<?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">
+ <path
+ android:pathData="M384.2,300H27.8C12.5,300 0,287.2 0,271.5V28.5C0,12.8 12.5,0 27.8,0H384.3C399.5,0 412,12.8 412,28.5V271.7C412,287.2 399.5,300 384.2,300Z"
+ android:fillColor="#000000"/>
+ <path
+ android:pathData="M262,272H152C139.67,272 130.84,263.15 130.84,249.44V50.03C130.71,35.39 140.87,27.4 153.2,27.4H260.81C273.14,27.4 283.04,33.94 283.17,50.03V249.44C283.04,263.15 272.28,272.69 262,272V272ZM153.07,31.67C142.67,31.67 134.2,40.24 134.2,50.76V250.17C134.2,260.7 142.66,269.26 153.07,269.26H260.68C271.08,269.26 279.55,260.69 279.55,250.17V50.76C279.55,40.23 271.09,31.67 260.68,31.67H153.07V31.67Z"
+ android:strokeLineJoin="round"
+ android:strokeWidth="5.8"
+ android:fillColor="#00000000"
+ android:strokeColor="#FCC934"
+ android:strokeLineCap="round"/>
+ <path
+ android:pathData="M262.86,26.21H151.04C139.21,26.21 129.62,35.8 129.62,47.63V252.39C129.62,264.22 139.21,273.81 151.04,273.81H262.86C274.69,273.81 284.28,264.22 284.28,252.39V47.63C284.28,35.8 274.69,26.21 262.86,26.21Z"
+ android:strokeWidth="3.63"
+ android:fillColor="#00000000"
+ android:strokeColor="#80868B"/>
+ <path
+ android:pathData="M128.42,100.83C127.28,100.83 126.36,99.91 126.36,98.78V80.7C126.36,79.57 127.28,78.65 128.42,78.65L129.24,89.34L128.42,100.85V100.83Z"
+ android:fillColor="#80868B"/>
+ <path
+ android:pathData="M128.42,69.59C127.28,69.59 126.36,68.67 126.36,67.54V60.14C126.36,59.01 127.28,58.09 128.42,58.09L129.24,63.02L128.42,69.6V69.59Z"
+ android:fillColor="#80868B"/>
+ <path
+ android:pathData="M248.01,47.37H263.97V63.33"
+ android:strokeLineJoin="round"
+ android:strokeWidth="5.8"
+ android:fillColor="#00000000"
+ android:strokeColor="#FCC934"
+ android:strokeLineCap="round"/>
+ <path
+ android:pathData="M263.96,47.37L241.33,70"
+ android:strokeLineJoin="round"
+ android:strokeWidth="5.8"
+ android:fillColor="#00000000"
+ android:strokeColor="#FCC934"
+ android:strokeLineCap="round"/>
+ <path
+ android:pathData="M166.04,252.5H150.23V236.54"
+ android:strokeLineJoin="round"
+ android:strokeWidth="5.8"
+ android:fillColor="#00000000"
+ android:strokeColor="#FCC934"
+ android:strokeLineCap="round"/>
+ <path
+ android:pathData="M150.23,252.5L172.86,229.87"
+ android:strokeLineJoin="round"
+ android:strokeWidth="5.8"
+ android:fillColor="#00000000"
+ android:strokeColor="#FCC934"
+ android:strokeLineCap="round"/>
+</vector>
diff --git a/res/drawable-sw600dp-night/ic_illustration_switch.xml b/res/drawable-sw600dp-night/ic_illustration_switch.xml
new file mode 100644
index 0000000..8c009e3
--- /dev/null
+++ b/res/drawable-sw600dp-night/ic_illustration_switch.xml
@@ -0,0 +1,51 @@
+<?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">
+ <path
+ android:pathData="M384.2,300H27.8C12.5,300 0,287.2 0,271.5V28.5C0,12.8 12.5,0 27.8,0H384.3C399.5,0 412,12.8 412,28.5V271.7C412,287.2 399.5,300 384.2,300Z"
+ android:fillColor="#000000"/>
+ <path
+ android:pathData="M261,272L153,272.07C140.67,272.07 130.84,263.16 130.84,249.44V50.03C130.71,35.39 140.87,27.4 153.2,27.4H260.81C273.14,27.4 283.04,33.94 283.17,50.03V249.44C283.04,263.15 272.61,272 261,272V272ZM153.07,31.67C142.67,31.67 134.2,40.24 134.2,50.76V250.17C134.2,260.7 142.66,269.26 153.07,269.26H260.68C271.08,269.26 279.55,260.69 279.55,250.17V50.76C279.55,40.23 271.09,31.67 260.68,31.67H153.07V31.67Z"
+ android:strokeLineJoin="round"
+ android:strokeWidth="5.8"
+ android:fillColor="#00000000"
+ android:strokeColor="#FCC934"
+ android:strokeLineCap="round"/>
+ <path
+ android:pathData="M262.86,26.21H151.04C139.21,26.21 129.62,35.8 129.62,47.63V252.39C129.62,264.22 139.21,273.81 151.04,273.81H262.86C274.69,273.81 284.28,264.22 284.28,252.39V47.63C284.28,35.8 274.69,26.21 262.86,26.21Z"
+ android:strokeWidth="3.63"
+ android:fillColor="#00000000"
+ android:strokeColor="#80868B"/>
+ <path
+ android:pathData="M128.42,100.83C127.28,100.83 126.36,99.91 126.36,98.78V80.7C126.36,79.57 127.28,78.65 128.42,78.65L129.24,89.34L128.42,100.85V100.83Z"
+ android:fillColor="#80868B"/>
+ <path
+ android:pathData="M128.42,69.59C127.28,69.59 126.36,68.67 126.36,67.54V60.14C126.36,59.01 127.28,58.09 128.42,58.09L129.24,63.02L128.42,69.6V69.59Z"
+ android:fillColor="#80868B"/>
+ <path
+ android:pathData="M233.1,239.5V257H268V222.1H250.5V225.6H264.5V253.5H236.6V239.5H233.1Z"
+ android:fillColor="#DADCE0"/>
+ <path
+ android:pathData="M247.1,222H233.1V236H247.1V222Z"
+ android:fillColor="#DADCE0"/>
+ <path
+ android:pathData="M261.1,237.8V241.3H254.8L262.7,249.2L260.2,251.7L252.3,243.8V250.1H248.8V237.9H261.1V237.8Z"
+ android:fillColor="#DADCE0"/>
+</vector>
diff --git a/res/drawable-sw600dp-night/ic_illustration_window.xml b/res/drawable-sw600dp-night/ic_illustration_window.xml
new file mode 100644
index 0000000..8f52e44
--- /dev/null
+++ b/res/drawable-sw600dp-night/ic_illustration_window.xml
@@ -0,0 +1,66 @@
+<?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">
+ <path
+ android:pathData="M384.2,300H27.8C12.5,300 0,287.2 0,271.5V28.5C0,12.8 12.5,0 27.8,0H384.3C399.5,0 412,12.8 412,28.5V271.7C412,287.2 399.5,300 384.2,300Z"
+ android:fillColor="#000000"/>
+ <path
+ android:pathData="M269.54,25.84H143.54C135.39,25.84 128.79,32.44 128.79,40.59V258.59C128.79,266.74 135.39,273.34 143.54,273.34H269.54C277.68,273.34 284.29,266.74 284.29,258.59V40.59C284.29,32.44 277.68,25.84 269.54,25.84Z"
+ android:strokeWidth="2.5"
+ android:fillColor="#000000"
+ android:strokeColor="#80868B"/>
+ <path
+ android:pathData="M128.05,100.73C126.92,100.73 126,99.81 126,98.68V80.67C126,79.54 126.92,78.62 128.05,78.62L128.87,89.26L128.05,100.72V100.73Z"
+ android:fillColor="#80868B"/>
+ <path
+ android:pathData="M128.05,69.62C126.92,69.62 126,68.7 126,67.57V60.2C126,59.07 126.92,58.15 128.05,58.15L128.87,63.06L128.05,69.61V69.62Z"
+ android:fillColor="#80868B"/>
+ <path
+ android:pathData="M271.71,103.67C274.64,103.67 277.13,106.16 277.13,109.09V189.4C277.13,192.33 274.64,194.82 271.71,194.82H142.01C139.08,194.82 136.59,192.33 136.59,189.4V109.09C136.59,106.16 139.08,103.67 142.01,103.67H271.72H271.71ZM271.63,97.81H141.06C134.86,97.81 129.7,102.97 129.7,109.17V190.02C129.7,196.22 134.86,201.38 141.06,201.38H271.64C277.84,201.38 283,196.22 283,190.02V109.16C283,102.96 277.98,97.8 271.64,97.8L271.63,97.81Z"
+ android:fillColor="#FCC934"/>
+ <path
+ android:pathData="M251.78,113.49H267.9V129.61"
+ android:strokeLineJoin="round"
+ android:strokeWidth="5.86"
+ android:fillColor="#00000000"
+ android:strokeColor="#FCC934"
+ android:strokeLineCap="round"/>
+ <path
+ android:pathData="M267.9,113.49L245.04,136.35"
+ android:strokeLineJoin="round"
+ android:strokeWidth="5.86"
+ android:fillColor="#00000000"
+ android:strokeColor="#FCC934"
+ android:strokeLineCap="round"/>
+ <path
+ android:pathData="M161.36,186.03H145.39V169.91"
+ android:strokeLineJoin="round"
+ android:strokeWidth="5.86"
+ android:fillColor="#00000000"
+ android:strokeColor="#FCC934"
+ android:strokeLineCap="round"/>
+ <path
+ android:pathData="M145.38,186.03L168.24,163.17"
+ android:strokeLineJoin="round"
+ android:strokeWidth="5.86"
+ android:fillColor="#00000000"
+ android:strokeColor="#FCC934"
+ android:strokeLineCap="round"/>
+</vector>
diff --git a/res/drawable-sw600dp/accessibility_button_preview_base.xml b/res/drawable-sw600dp/accessibility_button_preview_base.xml
new file mode 100644
index 0000000..1b6a2f7
--- /dev/null
+++ b/res/drawable-sw600dp/accessibility_button_preview_base.xml
@@ -0,0 +1,18 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="412dp"
+ android:height="300dp"
+ android:viewportWidth="412"
+ android:viewportHeight="300">
+ <path
+ android:pathData="M384.18,300H27.82C12.53,300 0,287.17 0,271.52V28.48C0,12.83 12.53,0 27.82,0H384.29c15.18,0 27.71,12.83 27.71,28.48v243.15c0,15.54 -12.53,28.37 -27.82,28.37Z"
+ android:fillColor="#fff"/>
+ <path
+ android:pathData="M368.24,143.47L368.24,60.55c0,-5.67 -4.59,-10.26 -10.26,-10.26L54.02,50.29c-5.67,0 -10.26,4.59 -10.26,10.26L43.76,242.76c0,5.67 4.59,10.26 10.26,10.26L357.98,253.02c5.67,0 10.26,-4.59 10.26,-10.26v-99.29ZM365.88,243.14c0,4.15 -3.75,7.52 -7.9,7.52L54.02,250.66c-4.15,0 -7.9,-3.37 -7.9,-7.52L46.12,60.55c0,-4.15 3.75,-7.9 7.9,-7.9L357.98,52.65c4.15,0 7.9,3.75 7.9,7.9L365.88,243.14Z"
+ android:fillColor="#dadce0"/>
+ <path
+ android:pathData="M319.83,50.29c-0,-1.28 -1.04,-2.31 -2.31,-2.31h-23.11c-1.28,0 -2.31,1.03 -2.31,2.31h27.74Z"
+ android:fillColor="#dadce0"/>
+ <path
+ android:pathData="M344.42,50.29c-0,-1.28 -1.03,-2.31 -2.31,-2.31h-9.25c-1.28,0 -2.31,1.03 -2.31,2.31h13.87Z"
+ android:fillColor="#dadce0"/>
+</vector>
diff --git a/res/drawable-sw600dp/accessibility_button_preview_large_floating_menu.xml b/res/drawable-sw600dp/accessibility_button_preview_large_floating_menu.xml
new file mode 100644
index 0000000..99798d5
--- /dev/null
+++ b/res/drawable-sw600dp/accessibility_button_preview_large_floating_menu.xml
@@ -0,0 +1,12 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="412dp"
+ android:height="300dp"
+ android:viewportWidth="412"
+ android:viewportHeight="300">
+ <path
+ android:pathData="M365.76,226.17h-27.68c-14.95,0 -27.07,-12.18 -27.07,-27.07s12.18,-27.07 27.07,-27.07h27.68v1.76h-27.68c-14.01,0 -25.37,11.37 -25.37,25.37s11.37,25.37 25.37,25.37h27.68v1.62Z"
+ android:fillColor="#dadce0"/>
+ <path
+ android:pathData="M337.95,178.94c-11.16,0 -20.16,9.07 -20.16,20.16 0,11.16 9.07,20.16 20.16,20.16s20.16,-9.07 20.16,-20.16c0.07,-11.16 -8.93,-20.16 -20.16,-20.16ZM337.95,188.62c1.15,0 2.1,0.95 2.1,2.1 0,1.15 -0.95,2.1 -2.1,2.1s-2.1,-0.95 -2.1,-2.1c0,-1.15 1.02,-2.1 2.1,-2.1ZM341.2,196.06v13.74h-2.1v-6.36h-2.1v6.36h-2.17v-13.74c-2.1,-0.2 -4.4,-0.54 -6.36,-1.01l0.54,-2.1c2.77,0.68 6.02,1.01 9,1.01s6.23,-0.34 9,-1.01l0.54,2.1c-1.96,0.47 -4.26,0.81 -6.36,1.01Z"
+ android:fillColor="#5f6368"/>
+</vector>
diff --git a/res/drawable-sw600dp/accessibility_button_preview_small_floating_menu.xml b/res/drawable-sw600dp/accessibility_button_preview_small_floating_menu.xml
new file mode 100644
index 0000000..e31265c
--- /dev/null
+++ b/res/drawable-sw600dp/accessibility_button_preview_small_floating_menu.xml
@@ -0,0 +1,12 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="412dp"
+ android:height="300dp"
+ android:viewportWidth="412"
+ android:viewportHeight="300">
+ <path
+ android:pathData="M365.88,219.24h-20.7c-5.38,0 -10.43,-2.09 -14.23,-5.9s-5.9,-8.86 -5.9,-14.23c0,-5.38 2.09,-10.43 5.9,-14.24 3.8,-3.8 8.86,-5.9 14.23,-5.9h20.7v1h-20.7c-5.11,0 -9.91,1.99 -13.53,5.6s-5.6,8.42 -5.6,13.53c0,5.11 1.99,9.91 5.6,13.53s8.42,5.6 13.53,5.6h20.7v1Z"
+ android:fillColor="#dadce0"/>
+ <path
+ android:pathData="M345.19,184c-2.99,-0 -5.91,0.88 -8.4,2.54 -2.49,1.66 -4.43,4.02 -5.57,6.78s-1.45,5.8 -0.86,8.73c0.58,2.93 2.02,5.63 4.13,7.74 2.11,2.11 4.81,3.55 7.74,4.14 2.93,0.58 5.97,0.29 8.73,-0.86 2.76,-1.14 5.12,-3.08 6.78,-5.57 1.66,-2.49 2.55,-5.41 2.55,-8.4 0,-4.01 -1.59,-7.85 -4.42,-10.68 -2.83,-2.83 -6.67,-4.43 -10.68,-4.43ZM345.19,191.28c0.4,0.03 0.77,0.21 1.04,0.51 0.27,0.29 0.42,0.68 0.42,1.08 0,0.4 -0.15,0.79 -0.42,1.08 -0.27,0.29 -0.64,0.47 -1.04,0.51 -0.22,0.02 -0.44,-0.01 -0.65,-0.08 -0.21,-0.07 -0.4,-0.19 -0.56,-0.33 -0.16,-0.15 -0.29,-0.33 -0.38,-0.53 -0.09,-0.2 -0.13,-0.42 -0.13,-0.64 0,-0.22 0.05,-0.44 0.13,-0.64 0.09,-0.2 0.22,-0.38 0.38,-0.53 0.16,-0.15 0.35,-0.26 0.56,-0.33 0.21,-0.07 0.43,-0.1 0.65,-0.08ZM347.56,196.82v10.29h-1.58v-4.76h-1.59v4.75h-1.58v-10.28c-1.6,-0.12 -3.19,-0.39 -4.75,-0.79l0.4,-1.58c4.42,1.05 9.04,1.05 13.46,0l0.39,1.58c-1.57,0.41 -3.17,0.67 -4.79,0.79h0.04Z"
+ android:fillColor="#5f6368"/>
+</vector>
diff --git a/res/drawable-sw600dp/accessibility_button_preview_three_finger.xml b/res/drawable-sw600dp/accessibility_button_preview_three_finger.xml
new file mode 100644
index 0000000..a5590c4
--- /dev/null
+++ b/res/drawable-sw600dp/accessibility_button_preview_three_finger.xml
@@ -0,0 +1,33 @@
+<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="M263.59,50.35C263.59,48.98 264.7,47.86 266.06,47.86L287.85,47.86C289.22,47.86 290.33,48.98 290.33,50.35L277.45,51.34L263.59,50.35Z"
+ android:fillColor="#DADCE0"/>
+ <path
+ android:pathData="M364.52,66.19L364.52,236.14A14.75,14.75 0,0 1,349.77 250.89L62.23,250.89A14.75,14.75 0,0 1,47.48 236.14L47.48,66.19A14.75,14.75 0,0 1,62.23 51.44L349.77,51.44A14.75,14.75 0,0 1,364.52 66.19z"
+ android:strokeWidth="2.5"
+ android:fillColor="#ffffff"
+ android:strokeColor="#DADCE0"/>
+ <path
+ android:pathData="M311.45,50.35C311.45,48.98 312.56,47.86 313.92,47.86L322.84,47.86C324.2,47.86 325.32,48.98 325.32,50.35L319.37,51.34L311.45,50.35Z"
+ android:fillColor="#DADCE0"/>
+ <path
+ android:pathData="M170.9,232.14L241.9,232.14A2,2 0,0 1,243.9 234.14L243.9,234.14A2,2 0,0 1,241.9 236.14L170.9,236.14A2,2 0,0 1,168.9 234.14L168.9,234.14A2,2 0,0 1,170.9 232.14z"
+ android:fillColor="#DADCE0"/>
+ <path
+ android:pathData="M188.7,229.14V217.74H193.6L186.7,205.54L179.8,217.74H184.7V229.14C182.8,229.94 181.5,231.74 181.5,233.94C181.5,236.84 183.8,239.14 186.7,239.14C189.6,239.14 191.9,236.84 191.9,233.94C191.9,231.84 190.5,229.94 188.7,229.14Z"
+ android:fillColor="#1A73E8"/>
+ <path
+ android:pathData="M208,229.14V217.74H212.9L206,205.54L199.1,217.74H204V229.14C202.1,229.94 200.8,231.74 200.8,233.94C200.8,236.84 203.1,239.14 206,239.14C208.9,239.14 211.2,236.84 211.2,233.94C211.2,231.84 209.9,229.94 208,229.14Z"
+ android:fillColor="#1A73E8"/>
+ <path
+ android:pathData="M227.29,229.14V217.74H232.2L225.29,205.54L218.4,217.74H223.29V229.14C221.4,229.94 220.1,231.74 220.1,233.94C220.1,236.84 222.4,239.14 225.29,239.14C228.2,239.14 230.49,236.84 230.49,233.94C230.49,231.84 229.2,229.94 227.29,229.14Z"
+ android:fillColor="#1A73E8"/>
+ </group>
+</vector>
diff --git a/res/drawable-sw600dp/accessibility_button_preview_two_finger.xml b/res/drawable-sw600dp/accessibility_button_preview_two_finger.xml
new file mode 100644
index 0000000..dbc5ad4
--- /dev/null
+++ b/res/drawable-sw600dp/accessibility_button_preview_two_finger.xml
@@ -0,0 +1,30 @@
+<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="M263.59,50.35C263.59,48.98 264.7,47.86 266.06,47.86L287.85,47.86C289.22,47.86 290.33,48.98 290.33,50.35L277.45,51.34L263.59,50.35Z"
+ android:fillColor="#DADCE0"/>
+ <path
+ android:pathData="M364.52,66.19L364.52,236.14A14.75,14.75 0,0 1,349.77 250.89L62.23,250.89A14.75,14.75 0,0 1,47.48 236.14L47.48,66.19A14.75,14.75 0,0 1,62.23 51.44L349.77,51.44A14.75,14.75 0,0 1,364.52 66.19z"
+ android:strokeWidth="2.5"
+ android:fillColor="#ffffff"
+ android:strokeColor="#DADCE0"/>
+ <path
+ android:pathData="M311.45,50.35C311.45,48.98 312.56,47.86 313.92,47.86L322.84,47.86C324.2,47.86 325.32,48.98 325.32,50.35L319.37,51.34L311.45,50.35Z"
+ android:fillColor="#DADCE0"/>
+ <path
+ android:pathData="M170.9,232.14L241.9,232.14A2,2 0,0 1,243.9 234.14L243.9,234.14A2,2 0,0 1,241.9 236.14L170.9,236.14A2,2 0,0 1,168.9 234.14L168.9,234.14A2,2 0,0 1,170.9 232.14z"
+ android:fillColor="#DADCE0"/>
+ <path
+ android:pathData="M198.35,229.14V217.74H203.25L196.35,205.54L189.45,217.74H194.35V229.14C192.45,229.94 191.15,231.74 191.15,233.94C191.15,236.84 193.45,239.14 196.35,239.14C199.25,239.14 201.55,236.84 201.55,233.94C201.55,231.84 200.15,229.94 198.35,229.14Z"
+ android:fillColor="#1A73E8"/>
+ <path
+ android:pathData="M217.65,229.14V217.74H222.55L215.65,205.54L208.75,217.74H213.65V229.14C211.75,229.94 210.45,231.74 210.45,233.94C210.45,236.84 212.75,239.14 215.65,239.14C218.55,239.14 220.85,236.84 220.85,233.94C220.85,231.84 219.55,229.94 217.65,229.14Z"
+ android:fillColor="#1A73E8"/>
+ </group>
+</vector>
diff --git a/res/drawable-sw600dp/accessibility_captioning_banner.xml b/res/drawable-sw600dp/accessibility_captioning_banner.xml
new file mode 100644
index 0000000..f1f8dcd
--- /dev/null
+++ b/res/drawable-sw600dp/accessibility_captioning_banner.xml
@@ -0,0 +1,45 @@
+<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="M369.5,63.4L369.5,239.96A14.5,14.5 0,0 1,355 254.46L57,254.46A14.5,14.5 0,0 1,42.5 239.96L42.5,63.4A14.5,14.5 0,0 1,57 48.9L355,48.9A14.5,14.5 0,0 1,369.5 63.4z"
+ android:strokeWidth="3"
+ android:fillColor="#ffffff"
+ android:strokeColor="#DADCE0"/>
+ <path
+ android:pathData="M265.48,47.57C265.48,46.15 266.62,45 268.03,45L290.53,45C291.95,45 293.09,46.15 293.09,47.57L279.79,48.59L265.48,47.57Z"
+ android:fillColor="#DADCE0"/>
+ <path
+ android:pathData="M314.9,47.57C314.9,46.15 316.05,45 317.46,45L326.67,45C328.08,45 329.22,46.15 329.22,47.57L323.08,48.59L314.9,47.57Z"
+ android:fillColor="#DADCE0"/>
+ <path
+ android:pathData="M132.8,202H79.2V210.5H132.8V202Z"
+ android:fillColor="#1A73E8"/>
+ <path
+ android:pathData="M172.9,202H142.5V210.5H172.9V202Z"
+ android:fillColor="#1A73E8"/>
+ <path
+ android:pathData="M158.4,217.9H79.2V226.4H158.4V217.9Z"
+ android:fillColor="#1A73E8"/>
+ <path
+ android:pathData="M202.2,217.9H168.1V226.4H202.2V217.9Z"
+ android:fillColor="#1A73E8"/>
+ <path
+ android:pathData="M246,217.9H211.9V226.4H246V217.9Z"
+ android:fillColor="#1A73E8"/>
+ <path
+ android:pathData="M255.8,202H182.7V210.5H255.8V202Z"
+ android:fillColor="#1A73E8"/>
+ <path
+ android:pathData="M292.3,202H265.5V210.5H292.3V202Z"
+ android:fillColor="#1A73E8"/>
+ <path
+ android:pathData="M328.9,202H302.1V210.5H328.9V202Z"
+ android:fillColor="#1A73E8"/>
+ </group>
+</vector>
diff --git a/res/drawable-sw600dp/accessibility_shortcut_type_hardware.xml b/res/drawable-sw600dp/accessibility_shortcut_type_hardware.xml
new file mode 100644
index 0000000..db0906e
--- /dev/null
+++ b/res/drawable-sw600dp/accessibility_shortcut_type_hardware.xml
@@ -0,0 +1,44 @@
+<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="M255.38,94.3C255.38,93.14 256.32,92.21 257.47,92.21L275.86,92.21C277.01,92.21 277.95,93.14 277.95,94.3L267.08,95.14L255.38,94.3Z"
+ android:fillColor="#669DF6"/>
+ <path
+ android:pathData="M340.09,110.17L340.09,248.55A14.5,14.5 0,0 1,325.59 263.05L88,263.05A14.5,14.5 0,0 1,73.5 248.55L73.5,110.17A14.5,14.5 0,0 1,88 95.67L325.59,95.67A14.5,14.5 0,0 1,340.09 110.17z"
+ android:strokeWidth="3"
+ android:fillColor="#ffffff"
+ android:strokeColor="#DADCE0"/>
+ <path
+ android:pathData="M295.77,94.3C295.77,93.14 296.7,92.21 297.86,92.21L305.38,92.21C306.53,92.21 307.46,93.14 307.46,94.3L302.45,95.14L295.77,94.3Z"
+ android:fillColor="#DADCE0"/>
+ <group>
+ <clip-path
+ android:pathData="M274,30L274,30A93,93 0,0 1,367 123L367,123A93,93 0,0 1,274 216L274,216A93,93 0,0 1,181 123L181,123A93,93 0,0 1,274 30z"/>
+ <path
+ android:pathData="M274,30L274,30A93,93 0,0 1,367 123L367,123A93,93 0,0 1,274 216L274,216A93,93 0,0 1,181 123L181,123A93,93 0,0 1,274 30z"
+ android:fillColor="#ffffff"/>
+ <path
+ android:pathData="M206.07,85.49C206.07,83.45 207.72,81.79 209.75,81.79L242.17,81.79C244.21,81.79 245.86,83.45 245.86,85.49L226.7,86.97L206.07,85.49Z"
+ android:fillColor="#669DF6"/>
+ <path
+ android:pathData="M331.59,87C339.46,87 345.84,93.38 345.84,101.25L345.84,369.73C345.84,377.6 339.46,383.98 331.59,383.98L-111.85,383.98C-119.72,383.98 -126.1,377.6 -126.1,369.73L-126.1,101.25C-126.1,93.38 -119.72,87 -111.85,87L331.59,87Z"
+ android:strokeWidth="3.5"
+ android:fillColor="#ffffff"
+ android:strokeColor="#DADCE0"/>
+ <path
+ android:pathData="M266.77,85.49C266.77,83.45 268.42,81.79 270.46,81.79L283.72,81.79C285.75,81.79 287.4,83.45 287.4,85.49L278.56,86.97L266.77,85.49Z"
+ android:fillColor="#DADCE0"/>
+ </group>
+ <path
+ android:strokeWidth="1"
+ android:pathData="M274,30.5L274,30.5A92.5,92.5 0,0 1,366.5 123L366.5,123A92.5,92.5 0,0 1,274 215.5L274,215.5A92.5,92.5 0,0 1,181.5 123L181.5,123A92.5,92.5 0,0 1,274 30.5z"
+ android:fillColor="#00000000"
+ android:strokeColor="#DADCE0"/>
+ </group>
+</vector>
diff --git a/res/drawable-sw600dp/accessibility_shortcut_type_software.xml b/res/drawable-sw600dp/accessibility_shortcut_type_software.xml
new file mode 100644
index 0000000..334344d
--- /dev/null
+++ b/res/drawable-sw600dp/accessibility_shortcut_type_software.xml
@@ -0,0 +1,36 @@
+<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="M62.23,50.19L349.77,50.19A16,16 0,0 1,365.77 66.19L365.77,236.14A16,16 0,0 1,349.77 252.14L62.23,252.14A16,16 0,0 1,46.23 236.14L46.23,66.19A16,16 0,0 1,62.23 50.19z"/>
+ <path
+ android:pathData="M46.23,204.14h320v48h-320z"
+ android:fillColor="#000000"/>
+ <path
+ android:pathData="M268.93,214.14C270.43,214.14 271.63,215.34 271.63,216.84C271.63,218.34 270.43,219.54 268.93,219.54C267.43,219.54 266.23,218.34 266.23,216.84C266.23,215.34 267.43,214.14 268.93,214.14ZM273.03,223.64V241.24H270.23V233.14H267.53V241.24H264.83V223.64C262.13,223.44 259.23,222.94 256.73,222.24L257.43,219.54C260.93,220.44 265.13,220.94 268.93,220.94C272.73,220.94 276.93,220.54 280.43,219.54L281.13,222.24C278.63,222.94 275.73,223.44 273.03,223.64Z"
+ android:fillColor="#ffffff"/>
+ <path
+ android:pathData="M206.23,238.04C211.42,238.04 215.63,233.83 215.63,228.64C215.63,223.45 211.42,219.24 206.23,219.24C201.04,219.24 196.83,223.45 196.83,228.64C196.83,233.83 201.04,238.04 206.23,238.04Z"
+ android:fillColor="#BDC0C4"/>
+ <path
+ android:pathData="M131.33,228.64L147.33,237.84V219.34L131.33,228.64Z"
+ android:fillColor="#BDC0C4"/>
+ </group>
+ <path
+ android:pathData="M62.23,51.69L349.77,51.69A14.5,14.5 0,0 1,364.27 66.19L364.27,236.14A14.5,14.5 0,0 1,349.77 250.64L62.23,250.64A14.5,14.5 0,0 1,47.73 236.14L47.73,66.19A14.5,14.5 0,0 1,62.23 51.69z"
+ android:strokeWidth="3"
+ android:fillColor="#00000000"
+ android:strokeColor="#DADCE0"/>
+ <path
+ android:pathData="M311.45,50.35C311.45,48.98 312.56,47.87 313.92,47.87L322.84,47.87C324.2,47.87 325.32,48.98 325.32,50.35L319.37,51.34L311.45,50.35Z"
+ android:fillColor="#DADCE0"/>
+ <path
+ android:pathData="M263.59,50.35C263.59,48.98 264.7,47.87 266.06,47.87L287.85,47.87C289.22,47.87 290.33,48.98 290.33,50.35L277.45,51.34L263.59,50.35Z"
+ android:fillColor="#DADCE0"/>
+ <path
+ android:pathData="M268.93,259.69C251.31,259.69 236.93,245.3 236.93,227.69C236.93,210.07 251.31,195.69 268.93,195.69C286.55,195.69 300.93,210.07 300.93,227.69C300.93,245.3 286.55,259.69 268.93,259.69ZM268.93,198.38C252.84,198.38 239.72,211.51 239.72,227.6C239.72,243.69 252.84,256.81 268.93,256.81C285.02,256.81 298.14,243.69 298.14,227.6C298.14,211.51 285.02,198.38 268.93,198.38Z"
+ android:fillColor="#729CEE"/>
+</vector>
diff --git a/res/drawable-sw600dp/accessibility_shortcut_type_software_floating.xml b/res/drawable-sw600dp/accessibility_shortcut_type_software_floating.xml
new file mode 100644
index 0000000..4b04704
--- /dev/null
+++ b/res/drawable-sw600dp/accessibility_shortcut_type_software_floating.xml
@@ -0,0 +1,29 @@
+<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="M263.59,50.35C263.59,48.98 264.7,47.86 266.06,47.86L287.85,47.86C289.22,47.86 290.33,48.98 290.33,50.35L277.45,51.34L263.59,50.35Z"
+ android:fillColor="#DADCE0"/>
+ <path
+ android:pathData="M364.52,66.19L364.52,236.14A14.75,14.75 0,0 1,349.77 250.89L62.23,250.89A14.75,14.75 0,0 1,47.48 236.14L47.48,66.19A14.75,14.75 0,0 1,62.23 51.44L349.77,51.44A14.75,14.75 0,0 1,364.52 66.19z"
+ android:strokeWidth="2.5"
+ android:fillColor="#ffffff"
+ android:strokeColor="#DADCE0"/>
+ <path
+ android:pathData="M311.45,50.35C311.45,48.98 312.56,47.86 313.92,47.86L322.84,47.86C324.2,47.86 325.32,48.98 325.32,50.35L319.37,51.34L311.45,50.35Z"
+ android:fillColor="#DADCE0"/>
+ </group>
+ <path
+ android:strokeWidth="1"
+ android:pathData="M365.64,179.48H344.94C339.74,179.48 334.74,181.54 331.06,185.23C327.38,188.91 325.31,193.9 325.31,199.11C325.31,204.31 327.38,209.3 331.06,212.99C334.74,216.67 339.74,218.74 344.94,218.74H365.64"
+ android:fillColor="#00000000"
+ android:strokeColor="#DADCE0"/>
+ <path
+ android:pathData="M344.95,184C341.96,183.99 339.04,184.88 336.55,186.54C334.06,188.2 332.12,190.56 330.98,193.32C329.83,196.08 329.53,199.12 330.11,202.05C330.7,204.98 332.14,207.67 334.25,209.79C336.36,211.9 339.05,213.34 341.98,213.93C344.92,214.51 347.95,214.21 350.72,213.07C353.48,211.92 355.84,209.99 357.5,207.5C359.16,205.02 360.05,202.1 360.05,199.11C360.05,195.1 358.46,191.26 355.62,188.43C352.79,185.59 348.95,184 344.95,184ZM344.95,191.28C345.35,191.31 345.72,191.49 345.99,191.78C346.26,192.08 346.41,192.46 346.41,192.86C346.41,193.26 346.26,193.65 345.99,193.94C345.72,194.23 345.35,194.41 344.95,194.45C344.73,194.46 344.51,194.43 344.3,194.36C344.09,194.29 343.9,194.18 343.74,194.03C343.58,193.88 343.45,193.7 343.36,193.5C343.28,193.3 343.23,193.08 343.23,192.86C343.23,192.64 343.28,192.43 343.36,192.22C343.45,192.02 343.58,191.84 343.74,191.69C343.9,191.54 344.09,191.43 344.3,191.36C344.51,191.29 344.73,191.26 344.95,191.28ZM347.32,196.82V207.11H345.74V202.35H344.15V207.1H342.57V196.82C340.96,196.69 339.37,196.43 337.82,196.03L338.22,194.45C342.64,195.5 347.25,195.5 351.68,194.45L352.07,196.03C350.5,196.43 348.89,196.7 347.28,196.82H347.32Z"
+ android:fillColor="#5F6368"/>
+</vector>
diff --git a/res/drawable-sw600dp/accessibility_shortcut_type_software_gesture.xml b/res/drawable-sw600dp/accessibility_shortcut_type_software_gesture.xml
new file mode 100644
index 0000000..927c0e5
--- /dev/null
+++ b/res/drawable-sw600dp/accessibility_shortcut_type_software_gesture.xml
@@ -0,0 +1,50 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:aapt="http://schemas.android.com/aapt"
+ android:width="412dp"
+ android:height="300dp"
+ android:viewportWidth="412"
+ android:viewportHeight="300">
+ <group>
+ <clip-path
+ android:pathData="M0,0h412v300h-412z"/>
+ <path
+ android:pathData="M263.59,50.35C263.59,48.98 264.7,47.86 266.06,47.86L287.85,47.86C289.22,47.86 290.33,48.98 290.33,50.35L277.45,51.34L263.59,50.35Z"
+ android:fillColor="#DADCE0"/>
+ <path
+ android:pathData="M364.52,66.19L364.52,236.14A14.75,14.75 0,0 1,349.77 250.89L62.23,250.89A14.75,14.75 0,0 1,47.48 236.14L47.48,66.19A14.75,14.75 0,0 1,62.23 51.44L349.77,51.44A14.75,14.75 0,0 1,364.52 66.19z"
+ android:strokeWidth="2.5"
+ android:fillColor="#ffffff"
+ android:strokeColor="#DADCE0"/>
+ <path
+ android:pathData="M311.45,50.35C311.45,48.98 312.56,47.86 313.92,47.86L322.84,47.86C324.2,47.86 325.32,48.98 325.32,50.35L319.37,51.34L311.45,50.35Z"
+ android:fillColor="#DADCE0"/>
+ <path
+ android:pathData="M188.15,188.94C184.45,188.94 181.55,191.94 181.55,195.54V220.14H194.85V195.54C194.85,191.94 191.85,188.94 188.15,188.94Z">
+ <aapt:attr name="android:fillColor">
+ <gradient
+ android:startX="188.2"
+ android:startY="220.23"
+ android:endX="188.2"
+ android:endY="188.97"
+ android:type="linear">
+ <item android:offset="0" android:color="#001A73E8"/>
+ <item android:offset="0.69" android:color="#FF1A73E8"/>
+ </gradient>
+ </aapt:attr>
+ </path>
+ <path
+ android:pathData="M222.95,188.94C219.25,188.94 216.35,191.94 216.35,195.54V220.14H229.55V195.54C229.55,191.94 226.65,188.94 222.95,188.94Z">
+ <aapt:attr name="android:fillColor">
+ <gradient
+ android:startX="222.95"
+ android:startY="220.23"
+ android:endX="222.95"
+ android:endY="188.97"
+ android:type="linear">
+ <item android:offset="0" android:color="#001A73E8"/>
+ <item android:offset="0.69" android:color="#FF1A73E8"/>
+ </gradient>
+ </aapt:attr>
+ </path>
+ </group>
+</vector>
diff --git a/res/drawable-sw600dp/accessibility_shortcut_type_software_gesture_talkback.xml b/res/drawable-sw600dp/accessibility_shortcut_type_software_gesture_talkback.xml
new file mode 100644
index 0000000..abd2eb6
--- /dev/null
+++ b/res/drawable-sw600dp/accessibility_shortcut_type_software_gesture_talkback.xml
@@ -0,0 +1,64 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:aapt="http://schemas.android.com/aapt"
+ android:width="412dp"
+ android:height="300dp"
+ android:viewportWidth="412"
+ android:viewportHeight="300">
+ <group>
+ <clip-path
+ android:pathData="M0,0h412v300h-412z"/>
+ <path
+ android:pathData="M263.59,50.35C263.59,48.98 264.7,47.86 266.06,47.86L287.85,47.86C289.22,47.86 290.33,48.98 290.33,50.35L277.45,51.34L263.59,50.35Z"
+ android:fillColor="#DADCE0"/>
+ <path
+ android:pathData="M364.52,66.19L364.52,236.14A14.75,14.75 0,0 1,349.77 250.89L62.23,250.89A14.75,14.75 0,0 1,47.48 236.14L47.48,66.19A14.75,14.75 0,0 1,62.23 51.44L349.77,51.44A14.75,14.75 0,0 1,364.52 66.19z"
+ android:strokeWidth="2.5"
+ android:fillColor="#ffffff"
+ android:strokeColor="#DADCE0"/>
+ <path
+ android:pathData="M311.45,50.35C311.45,48.98 312.56,47.86 313.92,47.86L322.84,47.86C324.2,47.86 325.32,48.98 325.32,50.35L319.37,51.34L311.45,50.35Z"
+ android:fillColor="#DADCE0"/>
+ <path
+ android:pathData="M176.84,188.94C173.14,188.94 170.24,191.94 170.24,195.54V220.14H183.54V195.54C183.54,191.94 180.54,188.94 176.84,188.94Z">
+ <aapt:attr name="android:fillColor">
+ <gradient
+ android:startX="176.89"
+ android:startY="220.23"
+ android:endX="176.89"
+ android:endY="188.97"
+ android:type="linear">
+ <item android:offset="0" android:color="#001A73E8"/>
+ <item android:offset="0.69" android:color="#FF1A73E8"/>
+ </gradient>
+ </aapt:attr>
+ </path>
+ <path
+ android:pathData="M206.14,188.94C202.44,188.94 199.54,191.94 199.54,195.54V220.14H212.84V195.54C212.74,191.94 209.84,188.94 206.14,188.94Z">
+ <aapt:attr name="android:fillColor">
+ <gradient
+ android:startX="206.19"
+ android:startY="220.23"
+ android:endX="206.19"
+ android:endY="188.97"
+ android:type="linear">
+ <item android:offset="0" android:color="#001A73E8"/>
+ <item android:offset="0.69" android:color="#FF1A73E8"/>
+ </gradient>
+ </aapt:attr>
+ </path>
+ <path
+ android:pathData="M235.44,188.94C231.74,188.94 228.84,191.94 228.84,195.54V220.14H242.14V195.54C242.04,191.94 239.14,188.94 235.44,188.94Z">
+ <aapt:attr name="android:fillColor">
+ <gradient
+ android:startX="235.49"
+ android:startY="220.23"
+ android:endX="235.49"
+ android:endY="188.97"
+ android:type="linear">
+ <item android:offset="0" android:color="#001A73E8"/>
+ <item android:offset="0.69" android:color="#FF1A73E8"/>
+ </gradient>
+ </aapt:attr>
+ </path>
+ </group>
+</vector>
diff --git a/res/drawable-sw600dp/ic_illustration_fullscreen.xml b/res/drawable-sw600dp/ic_illustration_fullscreen.xml
new file mode 100644
index 0000000..389a05e
--- /dev/null
+++ b/res/drawable-sw600dp/ic_illustration_fullscreen.xml
@@ -0,0 +1,70 @@
+<?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">
+ <path
+ android:pathData="M384.2,300H27.8C12.5,300 0,287.2 0,271.5V28.5C0,12.8 12.5,0 27.8,0H384.3C399.5,0 412,12.8 412,28.5V271.7C412,287.2 399.5,300 384.2,300Z"
+ android:fillColor="#ffffff"/>
+ <path
+ android:pathData="M262,272H152C139.67,272 130.84,263.15 130.84,249.44V50.03C130.71,35.39 140.87,27.4 153.2,27.4H260.81C273.14,27.4 283.04,33.94 283.17,50.03V249.44C283.04,263.15 272.28,272.69 262,272V272ZM153.07,31.67C142.67,31.67 134.2,40.24 134.2,50.76V250.17C134.2,260.7 142.66,269.26 153.07,269.26H260.68C271.08,269.26 279.55,260.69 279.55,250.17V50.76C279.55,40.23 271.09,31.67 260.68,31.67H153.07V31.67Z"
+ android:strokeLineJoin="round"
+ android:strokeWidth="5.8"
+ android:fillColor="#00000000"
+ android:strokeColor="#F9AB00"
+ android:strokeLineCap="round"/>
+ <path
+ android:pathData="M262.86,26.21H151.04C139.21,26.21 129.62,35.8 129.62,47.63V252.39C129.62,264.22 139.21,273.81 151.04,273.81H262.86C274.69,273.81 284.28,264.22 284.28,252.39V47.63C284.28,35.8 274.69,26.21 262.86,26.21Z"
+ android:strokeWidth="3.63"
+ android:fillColor="#00000000"
+ android:strokeColor="#DADCE0"/>
+ <path
+ android:pathData="M128.42,100.83C127.28,100.83 126.36,99.91 126.36,98.78V80.7C126.36,79.57 127.28,78.65 128.42,78.65L129.24,89.34L128.42,100.85V100.83Z"
+ android:fillColor="#DADCE0"/>
+ <path
+ android:pathData="M128.42,69.59C127.28,69.59 126.36,68.67 126.36,67.54V60.14C126.36,59.01 127.28,58.09 128.42,58.09L129.24,63.02L128.42,69.6V69.59Z"
+ android:fillColor="#DADCE0"/>
+ <path
+ android:pathData="M248.01,47.37H263.97V63.33"
+ android:strokeLineJoin="round"
+ android:strokeWidth="5.8"
+ android:fillColor="#00000000"
+ android:strokeColor="#F9AB00"
+ android:strokeLineCap="round"/>
+ <path
+ android:pathData="M263.96,47.37L241.33,70"
+ android:strokeLineJoin="round"
+ android:strokeWidth="5.8"
+ android:fillColor="#00000000"
+ android:strokeColor="#F9AB00"
+ android:strokeLineCap="round"/>
+ <path
+ android:pathData="M166.04,252.5H150.23V236.54"
+ android:strokeLineJoin="round"
+ android:strokeWidth="5.8"
+ android:fillColor="#00000000"
+ android:strokeColor="#F9AB00"
+ android:strokeLineCap="round"/>
+ <path
+ android:pathData="M150.23,252.5L172.86,229.87"
+ android:strokeLineJoin="round"
+ android:strokeWidth="5.8"
+ android:fillColor="#00000000"
+ android:strokeColor="#F9AB00"
+ android:strokeLineCap="round"/>
+</vector>
diff --git a/res/drawable-sw600dp/ic_illustration_switch.xml b/res/drawable-sw600dp/ic_illustration_switch.xml
new file mode 100644
index 0000000..7c1a9f4
--- /dev/null
+++ b/res/drawable-sw600dp/ic_illustration_switch.xml
@@ -0,0 +1,51 @@
+<?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">
+ <path
+ android:pathData="M384.2,300H27.8C12.5,300 0,287.2 0,271.5V28.5C0,12.8 12.5,0 27.8,0H384.3C399.5,0 412,12.8 412,28.5V271.7C412,287.2 399.5,300 384.2,300Z"
+ android:fillColor="#ffffff"/>
+ <path
+ android:pathData="M261,272L153,272.07C140.67,272.07 130.84,263.16 130.84,249.44V50.03C130.71,35.39 140.87,27.4 153.2,27.4H260.81C273.14,27.4 283.04,33.94 283.17,50.03V249.44C283.04,263.15 272.61,272 261,272V272ZM153.07,31.67C142.67,31.67 134.2,40.24 134.2,50.76V250.17C134.2,260.7 142.66,269.26 153.07,269.26H260.68C271.08,269.26 279.55,260.69 279.55,250.17V50.76C279.55,40.23 271.09,31.67 260.68,31.67H153.07V31.67Z"
+ android:strokeLineJoin="round"
+ android:strokeWidth="5.8"
+ android:fillColor="#00000000"
+ android:strokeColor="#F9AB00"
+ android:strokeLineCap="round"/>
+ <path
+ android:pathData="M262.86,26.21H151.04C139.21,26.21 129.62,35.8 129.62,47.63V252.39C129.62,264.22 139.21,273.81 151.04,273.81H262.86C274.69,273.81 284.28,264.22 284.28,252.39V47.63C284.28,35.8 274.69,26.21 262.86,26.21Z"
+ android:strokeWidth="3.63"
+ android:fillColor="#00000000"
+ android:strokeColor="#DADCE0"/>
+ <path
+ android:pathData="M128.42,100.83C127.28,100.83 126.36,99.91 126.36,98.78V80.7C126.36,79.57 127.28,78.65 128.42,78.65L129.24,89.34L128.42,100.85V100.83Z"
+ android:fillColor="#DADCE0"/>
+ <path
+ android:pathData="M128.42,69.59C127.28,69.59 126.36,68.67 126.36,67.54V60.14C126.36,59.01 127.28,58.09 128.42,58.09L129.24,63.02L128.42,69.6V69.59Z"
+ android:fillColor="#DADCE0"/>
+ <path
+ android:pathData="M233.1,239.5V257H268V222.1H250.5V225.6H264.5V253.5H236.6V239.5H233.1Z"
+ android:fillColor="#5F6368"/>
+ <path
+ android:pathData="M247.1,222H233.1V236H247.1V222Z"
+ android:fillColor="#5F6368"/>
+ <path
+ android:pathData="M261.1,237.8V241.3H254.8L262.7,249.2L260.2,251.7L252.3,243.8V250.1H248.8V237.9H261.1V237.8Z"
+ android:fillColor="#5F6368"/>
+</vector>
diff --git a/res/drawable-sw600dp/ic_illustration_window.xml b/res/drawable-sw600dp/ic_illustration_window.xml
new file mode 100644
index 0000000..f5bb7e0
--- /dev/null
+++ b/res/drawable-sw600dp/ic_illustration_window.xml
@@ -0,0 +1,66 @@
+<?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">
+ <path
+ android:pathData="M384.2,300H27.8C12.5,300 0,287.2 0,271.5V28.5C0,12.8 12.5,0 27.8,0H384.3C399.5,0 412,12.8 412,28.5V271.7C412,287.2 399.5,300 384.2,300Z"
+ android:fillColor="#ffffff"/>
+ <path
+ android:pathData="M269.54,25.84H143.54C135.39,25.84 128.79,32.44 128.79,40.59V258.59C128.79,266.74 135.39,273.34 143.54,273.34H269.54C277.68,273.34 284.29,266.74 284.29,258.59V40.59C284.29,32.44 277.68,25.84 269.54,25.84Z"
+ android:strokeWidth="2.5"
+ android:fillColor="#ffffff"
+ android:strokeColor="#DADCE0"/>
+ <path
+ android:pathData="M128.05,100.73C126.92,100.73 126,99.81 126,98.68V80.67C126,79.54 126.92,78.62 128.05,78.62L128.87,89.26L128.05,100.72V100.73Z"
+ android:fillColor="#DADCE0"/>
+ <path
+ android:pathData="M128.05,69.62C126.92,69.62 126,68.7 126,67.57V60.2C126,59.07 126.92,58.15 128.05,58.15L128.87,63.06L128.05,69.61V69.62Z"
+ android:fillColor="#DADCE0"/>
+ <path
+ android:pathData="M271.71,103.67C274.64,103.67 277.13,106.16 277.13,109.09V189.4C277.13,192.33 274.64,194.82 271.71,194.82H142.01C139.08,194.82 136.59,192.33 136.59,189.4V109.09C136.59,106.16 139.08,103.67 142.01,103.67H271.72H271.71ZM271.63,97.81H141.06C134.86,97.81 129.7,102.97 129.7,109.17V190.02C129.7,196.22 134.86,201.38 141.06,201.38H271.64C277.84,201.38 283,196.22 283,190.02V109.16C283,102.96 277.98,97.8 271.64,97.8L271.63,97.81Z"
+ android:fillColor="#F9AB00"/>
+ <path
+ android:pathData="M251.78,113.49H267.9V129.61"
+ android:strokeLineJoin="round"
+ android:strokeWidth="5.86"
+ android:fillColor="#00000000"
+ android:strokeColor="#F9AB00"
+ android:strokeLineCap="round"/>
+ <path
+ android:pathData="M267.9,113.49L245.04,136.35"
+ android:strokeLineJoin="round"
+ android:strokeWidth="5.86"
+ android:fillColor="#00000000"
+ android:strokeColor="#F9AB00"
+ android:strokeLineCap="round"/>
+ <path
+ android:pathData="M161.36,186.03H145.39V169.91"
+ android:strokeLineJoin="round"
+ android:strokeWidth="5.86"
+ android:fillColor="#00000000"
+ android:strokeColor="#F9AB00"
+ android:strokeLineCap="round"/>
+ <path
+ android:pathData="M145.38,186.03L168.24,163.17"
+ android:strokeLineJoin="round"
+ android:strokeWidth="5.86"
+ android:fillColor="#00000000"
+ android:strokeColor="#F9AB00"
+ android:strokeLineCap="round"/>
+</vector>
diff --git a/res/drawable-sw600dp/ic_settings_about_device.xml b/res/drawable-sw600dp/ic_settings_about_device.xml
new file mode 100644
index 0000000..a716482
--- /dev/null
+++ b/res/drawable-sw600dp/ic_settings_about_device.xml
@@ -0,0 +1,25 @@
+<!--
+ Copyright (C) 2023 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="48"
+ android:viewportHeight="48">
+ <path
+ android:pathData="M9,46q-1.25,0 -2.125,-0.875T6,43L6,5q0,-1.25 0.875,-2.125T9,2h30q1.25,0 2.125,0.875T42,5v38q0,1.25 -0.875,2.125T39,46ZM9,38.5L9,43h30v-4.5ZM19.9,41.75h8.2v-2h-8.2ZM9,35.5h30v-26L9,9.5ZM9,6.5h30L39,5L9,5ZM9,6.5L9,5v1.5ZM9,38.5L9,43Z"
+ android:fillType="evenOdd"
+ android:fillColor="?android:attr/colorPrimary"/>
+</vector>
diff --git a/res/drawable/face_enroll_icon_large.xml b/res/drawable/face_enroll_icon_large.xml
index 578a4a9..6d9b155e 100644
--- a/res/drawable/face_enroll_icon_large.xml
+++ b/res/drawable/face_enroll_icon_large.xml
@@ -16,8 +16,8 @@
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="300dp"
- android:height="300dp"
+ android:width="@dimen/face_enroll_icon_large_width"
+ android:height="@dimen/face_enroll_icon_large_height"
android:viewportWidth="300"
android:viewportHeight="300"
android:tint="@color/face_enroll_icon_color">
diff --git a/res/drawable/ic_homepage_about.xml b/res/drawable/ic_homepage_about.xml
index ef2136e..459ec93 100644
--- a/res/drawable/ic_homepage_about.xml
+++ b/res/drawable/ic_homepage_about.xml
@@ -29,5 +29,5 @@
android:height="@dimen/dashboard_tile_foreground_image_size"
android:start="@dimen/dashboard_tile_foreground_image_inset"
android:top="@dimen/dashboard_tile_foreground_image_inset"
- android:drawable="@drawable/ic_phone_info" />
+ android:drawable="@drawable/ic_settings_about_device" />
</layer-list>
diff --git a/res/drawable/ic_phone_info.xml b/res/drawable/ic_settings_about_device.xml
similarity index 100%
rename from res/drawable/ic_phone_info.xml
rename to res/drawable/ic_settings_about_device.xml
diff --git a/res/layout-land/choose_lock_pattern_common.xml b/res/layout-land/choose_lock_pattern_common.xml
new file mode 100644
index 0000000..cb51703
--- /dev/null
+++ b/res/layout-land/choose_lock_pattern_common.xml
@@ -0,0 +1,73 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ 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.
+-->
+
+<!-- Used in phone portrait and tablet, as referenced in alias.xml. -->
+<com.google.android.setupdesign.GlifLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/setup_wizard_layout"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:icon="@drawable/ic_lock">
+
+ <!-- takes up all space above button bar at bottom -->
+ <com.android.internal.widget.LinearLayoutWithDefaultTouchRecepient
+ android:id="@+id/topLayout"
+ style="@style/SudContentFrame"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:gravity="center"
+ android:clipChildren="false"
+ android:clipToPadding="false"
+ android:orientation="vertical"
+ android:paddingTop="0dp"
+ android:paddingLeft="0dp"
+ android:paddingRight="0dp"
+ android:paddingBottom="0dp">
+
+ <!-- TODO b/249974175 Move into Glif header mixin -->
+ <Button
+ android:id="@+id/screen_lock_options"
+ style="@style/SudGlifButton.Tertiary"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/setup_lock_settings_options_button_label"
+ android:visibility="gone"/>
+
+ <com.google.android.setupdesign.view.FillContentLayout
+ style="@style/LockPatternContainerStyle"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content">
+
+ <com.android.internal.widget.LockPatternView
+ android:id="@+id/lockPattern"
+ android:layout_width="@dimen/biometric_auth_pattern_view_size"
+ android:layout_height="@dimen/biometric_auth_pattern_view_size"
+ android:layout_gravity="center"/>
+
+ </com.google.android.setupdesign.view.FillContentLayout>
+
+ <TextView android:id="@+id/footerText"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center_horizontal"
+ android:minHeight="24dp"
+ android:textSize="14sp"
+ android:visibility="gone"/>
+
+ </com.android.internal.widget.LinearLayoutWithDefaultTouchRecepient>
+
+</com.google.android.setupdesign.GlifLayout>
diff --git a/res/layout-land/confirm_lock_pattern_base.xml b/res/layout-land/confirm_lock_pattern_base.xml
new file mode 100644
index 0000000..4ae5de3
--- /dev/null
+++ b/res/layout-land/confirm_lock_pattern_base.xml
@@ -0,0 +1,95 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- 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.
+-->
+<com.google.android.setupdesign.GlifLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/setup_wizard_layout"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:icon="@drawable/ic_enterprise">
+
+ <com.android.internal.widget.LinearLayoutWithDefaultTouchRecepient
+ android:id="@+id/topLayout"
+ android:orientation="vertical"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="vertical"
+ android:paddingBottom="24dp">
+
+ <Button
+ android:id="@+id/cancelButton"
+ style="@style/SudGlifButton.Secondary"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginStart="?attr/sudMarginStart"
+ android:layout_marginEnd="?attr/sudMarginEnd"
+ android:layout_marginBottom="80dp"
+ android:text="@string/cancel" />
+
+ <Button
+ android:id="@+id/forgotButton"
+ style="@style/SudGlifButton.Secondary"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginStart="?attr/sudMarginStart"
+ android:layout_marginEnd="?attr/sudMarginEnd"
+ android:layout_gravity="center"
+ android:visibility="gone" />
+
+ </LinearLayout>
+
+ <LinearLayout
+ style="@style/SudContentFrame"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="vertical"
+ android:gravity="center"
+ android:paddingLeft="0dp"
+ android:paddingRight="0dp">
+
+ <com.google.android.setupdesign.view.FillContentLayout
+ style="@style/LockPatternContainerStyle"
+ android:layout_width="wrap_content"
+ android:layout_height="0dp"
+ android:layout_weight="1">
+
+ <com.android.internal.widget.LockPatternView
+ android:id="@+id/lockPattern"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:layout_gravity="center" />
+
+ </com.google.android.setupdesign.view.FillContentLayout>
+
+ <TextView
+ style="@style/TextAppearance.ErrorText"
+ android:accessibilityLiveRegion="polite"
+ android:id="@+id/errorText"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center_horizontal"
+ android:paddingStart="?attr/sudMarginStart"
+ android:paddingEnd="?attr/sudMarginEnd"
+ android:layout_marginTop="12dp"
+ android:gravity="center_vertical"/>
+
+ </LinearLayout>
+
+ </com.android.internal.widget.LinearLayoutWithDefaultTouchRecepient>
+</com.google.android.setupdesign.GlifLayout>
diff --git a/res/layout-land/confirm_lock_pattern_normal_base.xml b/res/layout-land/confirm_lock_pattern_normal_base.xml
new file mode 100644
index 0000000..1e26912
--- /dev/null
+++ b/res/layout-land/confirm_lock_pattern_normal_base.xml
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- 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.
+-->
+<com.google.android.setupdesign.GlifLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/setup_wizard_layout"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:icon="@drawable/ic_lock">
+
+ <com.android.internal.widget.LinearLayoutWithDefaultTouchRecepient
+ android:id="@+id/topLayout"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:orientation="vertical">
+
+ <LinearLayout
+ style="@style/SudContentFrame"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="vertical"
+ android:gravity="center"
+ android:paddingLeft="0dp"
+ android:paddingRight="0dp">
+
+ <com.google.android.setupdesign.view.FillContentLayout
+ style="@style/LockPatternContainerStyle"
+ android:layout_width="wrap_content"
+ android:layout_height="0dp"
+ android:layout_weight="1">
+
+ <com.android.internal.widget.LockPatternView
+ android:id="@+id/lockPattern"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:layout_gravity="center" />
+
+ </com.google.android.setupdesign.view.FillContentLayout>
+
+ <TextView
+ style="@style/TextAppearance.ErrorText"
+ android:accessibilityLiveRegion="polite"
+ android:id="@+id/errorText"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center_horizontal"
+ android:layout_marginStart="?attr/sudMarginStart"
+ android:layout_marginEnd="?attr/sudMarginEnd"
+ android:gravity="center_vertical"/>
+
+ <Button
+ android:id="@+id/cancelButton"
+ style="@style/SudGlifButton.Secondary"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginStart="?attr/sudMarginStart"
+ android:layout_marginEnd="?attr/sudMarginEnd"
+ android:layout_marginBottom="80dp"
+ android:text="@string/cancel" />
+
+ </LinearLayout>
+
+ </com.android.internal.widget.LinearLayoutWithDefaultTouchRecepient>
+
+</com.google.android.setupdesign.GlifLayout>
diff --git a/res/layout-sw600dp/confirm_lock_password.xml b/res/layout-sw600dp/confirm_lock_password.xml
index 3925a69..7489d10 100644
--- a/res/layout-sw600dp/confirm_lock_password.xml
+++ b/res/layout-sw600dp/confirm_lock_password.xml
@@ -14,16 +14,14 @@
~ See the License for the specific language governing permissions and
~ limitations under the License
-->
-<com.google.android.setupdesign.GlifLayout
+<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/setup_wizard_layout"
android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:layout="@layout/sud_glif_blank_template">
+ android:layout_height="match_parent">
<include
layout="@layout/confirm_lock_password_base"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center_horizontal" />
-</com.google.android.setupdesign.GlifLayout>
+</FrameLayout>
diff --git a/res/layout-sw600dp/confirm_lock_pattern.xml b/res/layout-sw600dp/confirm_lock_pattern.xml
index 51af1f3..1551517 100644
--- a/res/layout-sw600dp/confirm_lock_pattern.xml
+++ b/res/layout-sw600dp/confirm_lock_pattern.xml
@@ -13,16 +13,14 @@
See the License for the specific language governing permissions and
limitations under the License.
-->
-<com.google.android.setupdesign.GlifLayout
+<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/setup_wizard_layout"
android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:layout="@layout/sud_glif_blank_template">
+ android:layout_height="match_parent">
<include
layout="@layout/confirm_lock_pattern_base"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center_horizontal" />
-</com.google.android.setupdesign.GlifLayout>
+</FrameLayout>
diff --git a/res/layout/choose_lock_pattern_common.xml b/res/layout/choose_lock_pattern_common.xml
index 2dd8cd5..774f5cd 100644
--- a/res/layout/choose_lock_pattern_common.xml
+++ b/res/layout/choose_lock_pattern_common.xml
@@ -36,28 +36,24 @@
android:paddingLeft="0dp"
android:paddingRight="0dp">
- <TextView
- android:id="@+id/headerText"
- style="@style/SudDescription.Glif"
- android:layout_width="match_parent"
+ <Button
+ android:id="@+id/screen_lock_options"
+ style="@style/LockPatternButtonStyle"
+ android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:minLines="2"
- android:gravity="center"
- android:paddingStart="?attr/sudMarginStart"
- android:paddingEnd="?attr/sudMarginEnd"
- android:fontFamily="@*android:string/config_headlineFontFamily" />
+ android:text="@string/setup_lock_settings_options_button_label"
+ android:visibility="gone"/>
<com.google.android.setupdesign.view.FillContentLayout
style="@style/LockPatternContainerStyle"
android:layout_width="wrap_content"
android:layout_height="0dp"
- android:minHeight="@dimen/choose_lockscreen_min_height"
android:layout_weight="1">
<com.android.internal.widget.LockPatternView
android:id="@+id/lockPattern"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
+ android:layout_width="@dimen/biometric_auth_pattern_view_size"
+ android:layout_height="@dimen/biometric_auth_pattern_view_size"
android:layout_gravity="center"/>
</com.google.android.setupdesign.view.FillContentLayout>
@@ -66,17 +62,10 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
- android:minHeight="50dip"
+ android:minHeight="24dp"
android:textSize="14sp"
android:visibility="gone"/>
- <Button
- android:id="@+id/screen_lock_options"
- style="@style/SudGlifButton.Tertiary"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="@string/setup_lock_settings_options_button_label"
- android:visibility="gone"/>
</com.android.internal.widget.LinearLayoutWithDefaultTouchRecepient>
</com.google.android.setupdesign.GlifLayout>
diff --git a/res/layout/confirm_lock_pattern_base.xml b/res/layout/confirm_lock_pattern_base.xml
index 15c6121..5b19105 100644
--- a/res/layout/confirm_lock_pattern_base.xml
+++ b/res/layout/confirm_lock_pattern_base.xml
@@ -67,13 +67,12 @@
style="@style/LockPatternContainerStyle"
android:layout_width="wrap_content"
android:layout_height="0dp"
- android:minHeight="@dimen/choose_lockscreen_min_height"
android:layout_weight="1">
<com.android.internal.widget.LockPatternView
android:id="@+id/lockPattern"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
+ android:layout_width="@dimen/biometric_auth_pattern_view_size"
+ android:layout_height="@dimen/biometric_auth_pattern_view_size"
android:layout_gravity="center" />
</com.google.android.setupdesign.view.FillContentLayout>
diff --git a/res/layout/confirm_lock_pattern_normal_base.xml b/res/layout/confirm_lock_pattern_normal_base.xml
index 7fd6172..5d1ca7c 100644
--- a/res/layout/confirm_lock_pattern_normal_base.xml
+++ b/res/layout/confirm_lock_pattern_normal_base.xml
@@ -39,13 +39,12 @@
style="@style/LockPatternContainerStyle"
android:layout_width="wrap_content"
android:layout_height="0dp"
- android:minHeight="@dimen/choose_lockscreen_min_height"
android:layout_weight="1">
<com.android.internal.widget.LockPatternView
android:id="@+id/lockPattern"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
+ android:layout_width="@dimen/biometric_auth_pattern_view_size"
+ android:layout_height="@dimen/biometric_auth_pattern_view_size"
android:layout_gravity="center" />
</com.google.android.setupdesign.view.FillContentLayout>
diff --git a/res/layout/face_enroll_education.xml b/res/layout/face_enroll_education.xml
index fec6d53..908dae4 100644
--- a/res/layout/face_enroll_education.xml
+++ b/res/layout/face_enroll_education.xml
@@ -39,7 +39,7 @@
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:layout_marginTop="-24dp">
+ android:layout_marginTop="@dimen/face_enroll_education_lottie_frame_margin_top">
<com.google.android.setupdesign.view.IllustrationVideoView
android:id="@+id/illustration_default"
@@ -52,8 +52,8 @@
<com.airbnb.lottie.LottieAnimationView
android:id="@+id/illustration_lottie"
android:layout_width="match_parent"
- android:layout_height="440dp"
- android:layout_marginTop="-52dp"
+ android:layout_height="@dimen/illustration_lottie_height"
+ android:layout_marginTop="@dimen/lottie_animation_view_margin_top"
android:scaleType="centerInside"
android:visibility="gone"
app:lottie_autoPlay="true"
@@ -66,6 +66,7 @@
android:layout_height="wrap_content"
android:layout_gravity="center"
android:visibility="invisible"
+ android:layout_marginTop="@dimen/illustration_accessibility_margin_top"
android:src="@drawable/face_enroll_icon_large"/>
</FrameLayout>
@@ -84,7 +85,7 @@
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:layout_marginTop="-24dp">
+ android:layout_marginTop="@dimen/limited_vision_button_frame_margin_top">
<Button
android:id="@+id/accessibility_button"
@@ -92,12 +93,15 @@
android:layout_gravity="center"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
+ android:layout_marginTop="@dimen/limited_vision_button_margin_top"
+ android:layout_marginBottom="@dimen/limited_vision_button_margin_bottom"
android:text="@string/security_settings_face_enroll_introduction_accessibility"/>
<com.android.settings.biometrics.face.FaceEnrollAccessibilityToggle
android:id="@+id/toggle_diversity"
android:layout_width="match_parent"
android:layout_height="wrap_content"
+ android:layout_marginTop="@dimen/limited_vision_button_toggle_margin_top"
android:visibility="gone"
app:messageText="@string/security_settings_face_enroll_introduction_accessibility"/>
diff --git a/res/layout/notification_channel_panel.xml b/res/layout/notification_channel_panel.xml
index 49cd95c..18e6342 100644
--- a/res/layout/notification_channel_panel.xml
+++ b/res/layout/notification_channel_panel.xml
@@ -17,6 +17,7 @@
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/main_content"
android:layout_height="@dimen/output_switcher_slice_max_height"
+ android:maxHeight="@dimen/output_switcher_slice_max_height"
android:background="@drawable/settings_panel_background"
android:orientation="vertical"
android:layout_width="match_parent">
diff --git a/res/layout/sfps_enroll_find_sensor_layout.xml b/res/layout/sfps_enroll_find_sensor_layout.xml
index f08986e..b8a656e 100644
--- a/res/layout/sfps_enroll_find_sensor_layout.xml
+++ b/res/layout/sfps_enroll_find_sensor_layout.xml
@@ -29,7 +29,8 @@
android:gravity="center_vertical"
android:orientation="vertical"
android:clipToPadding="false"
- android:clipChildren="false">
+ android:clipChildren="false"
+ android:layout_marginTop="@dimen/sfps_enroll_find_sensor_lottie_margin">
<!-- Animation res MUST be set in code because asset is dependent on device orientation -->
<com.airbnb.lottie.LottieAnimationView
diff --git a/res/raw-sw600dp/accessibility_color_inversion_banner.json b/res/raw-sw600dp/accessibility_color_inversion_banner.json
new file mode 100644
index 0000000..2d237f0
--- /dev/null
+++ b/res/raw-sw600dp/accessibility_color_inversion_banner.json
@@ -0,0 +1 @@
+{"v":"5.10.0","fr":60,"ip":0,"op":300,"w":412,"h":300,"nm":"Color_Inversion_Tablet_DT","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":".blue600","cl":"blue600","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":29,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":49,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":218,"s":[0]},{"t":238,"s":[100]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[341,223,0],"ix":2,"l":2},"a":{"a":0,"k":[36.869,96.869,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[24.738,24.738],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.101960784314,0.450980392157,0.909803921569,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":[36.869,96.869],"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":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":305,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":".grey600","cl":"grey600","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":29,"s":[40]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":49,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":218,"s":[0]},{"t":238,"s":[40]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[286,102,0],"ix":2,"l":2},"a":{"a":0,"k":[286,102,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":"rc","d":1,"s":{"a":0,"k":[144,26],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":10,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","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":"Rectangle 12322","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[286,81],"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":"top right rect","np":1,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[144,37],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":10,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","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":"Rectangle 12323","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[286,117.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":"bottom right rect","np":1,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":300,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":".grey700","cl":"grey700","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":29,"s":[70]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":49,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":218,"s":[0]},{"t":238,"s":[70]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129,177,0],"ix":2,"l":2},"a":{"a":0,"k":[129,177,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":"rc","d":1,"s":{"a":0,"k":[144,37],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":10,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.372549027205,0.388235300779,0.407843142748,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":"Rectangle 12321","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[129,192.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":"bottom left rect","np":1,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[144,26],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":10,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.372549027205,0.388235300779,0.407843142748,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":"Rectangle 12320","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[129,156],"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":"top left rect","np":1,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":300,"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":[341,223,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":[[-6.627,0],[0,6.627],[6.627,0],[0,-6.627]],"o":[[6.627,0],[0,-6.627],[-6.627,0],[0,6.627]],"v":[[0,12],[12,0],[0,-12],[-12,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","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":"circle","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":300,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":".grey900","cl":"grey900","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":29,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":49,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":218,"s":[100]},{"t":238,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[286,102,0],"ix":2,"l":2},"a":{"a":0,"k":[286,102,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":"rc","d":1,"s":{"a":0,"k":[144,26],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":10,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.1254902035,0.129411771894,0.141176477075,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":"Rectangle 12322","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[286,81],"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":"top right rect","np":1,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[144,37],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":10,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.1254902035,0.129411771894,0.141176477075,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":"Rectangle 12323","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[286,117.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":"bottom right rect","np":1,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":300,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":".grey900","cl":"grey900","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":29,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":49,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":218,"s":[100]},{"t":238,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129,177,0],"ix":2,"l":2},"a":{"a":0,"k":[129,177,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":"rc","d":1,"s":{"a":0,"k":[144,37],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":10,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","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":"Rectangle 12321","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[129,192.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":"bottom left rect","np":1,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[144,26],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":10,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","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":"Rectangle 12320","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[129,156],"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":"top left rect","np":1,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":300,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":".grey300","cl":"grey300","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[206,149.71,0],"ix":2,"l":2},"a":{"a":0,"k":[206,149.71,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,0],[0,-1.417],[0,0],[0,0],[1.411,0]],"o":[[-1.411,0],[0,0],[0,0],[0,-1.417],[0,0]],"v":[[-4.603,-1.797],[-7.16,0.77],[1.023,1.797],[7.16,0.77],[4.603,-1.797]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.854901969433,0.86274510622,0.878431379795,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":[322.062,46.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":"button 1","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,-1.417],[0,0],[0,0],[1.411,0]],"o":[[-1.411,0],[0,0],[0,0],[0,-1.417],[0,0]],"v":[[-11.251,-1.797],[-13.808,0.77],[0.511,1.797],[13.808,0.77],[11.251,-1.797]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.854901969433,0.86274510622,0.878431379795,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":[279.283,46.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":"button 2","np":1,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[208.56,330],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":16,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"op","nm":"Offset Paths 1","a":{"a":0,"k":-1.5,"ix":1},"lj":1,"ml":{"a":0,"k":4,"ix":3},"ix":2,"mn":"ADBE Vector Filter - Offset","hd":false},{"ty":"st","c":{"a":0,"k":[0.854901969433,0.86274510622,0.878431379795,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"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":-90,"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":"Rectangle 2","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[206,151.661],"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":"Frame","np":1,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":300,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"ScreenBlack","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":29,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":49,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":218,"s":[100]},{"t":238,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[206,151.661,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":0,"k":[208.56,330],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":16,"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":-90,"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":"Rectangle 2","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":300,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"Screen","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[206,151.661,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":0,"k":[208.56,330],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":16,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","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":-90,"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":"Rectangle 2","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":300,"st":0,"ct":1,"bm":0}],"markers":[]}
\ No newline at end of file
diff --git a/res/raw-sw600dp/accessibility_magnification_banner.json b/res/raw-sw600dp/accessibility_magnification_banner.json
new file mode 100644
index 0000000..49996a4
--- /dev/null
+++ b/res/raw-sw600dp/accessibility_magnification_banner.json
@@ -0,0 +1 @@
+{"v":"5.10.0","fr":60,"ip":0,"op":540,"w":412,"h":300,"nm":"Magnification_Tablet_DT_V03","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":2,"ty":3,"nm":"MoveA+Dots","sr":1,"ks":{"o":{"a":0,"k":0,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.351,"y":1},"o":{"x":0.167,"y":0.167},"t":170,"s":[206,150,0],"to":[4.167,-0.833,0],"ti":[-4.167,0.833,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.333,"y":0.333},"t":207,"s":[231,145,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.423,"y":1},"o":{"x":0.488,"y":0},"t":214,"s":[231,145,0],"to":[-0.833,5,0],"ti":[0.833,-5,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.333,"y":0.333},"t":247,"s":[226,175,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.735,"y":0.034},"t":438,"s":[226,175,0],"to":[-3.333,-4.167,0],"ti":[3.333,4.167,0]},{"t":478,"s":[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,"ip":0,"op":540,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":".yellow600","cl":"yellow600","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":146,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":155,"s":[85]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":270,"s":[85]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":279,"s":[50]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":325,"s":[50]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":334,"s":[85]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":465,"s":[85]},{"t":472,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":298,"s":[226,175,0],"to":[-0.5,-1.667,0],"ti":[0.5,1.667,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.167,"y":0.167},"t":305,"s":[223,165,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.257,"y":1},"o":{"x":0.333,"y":0},"t":352,"s":[223,165,0],"to":[1.667,-1.667,0],"ti":[-1.667,1.667,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.167,"y":0.167},"t":393,"s":[233,155,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.568,"y":0.036},"t":438,"s":[233,155,0],"to":[-3.833,0,0],"ti":[3.833,0,0]},{"t":478,"s":[210,155,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":[{"d":1,"ty":"el","s":{"a":1,"k":[{"i":{"x":[0.667,0.667],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":146,"s":[13,13]},{"i":{"x":[0.667,0.667],"y":[1,1]},"o":{"x":[0.333,0.333],"y":[0,0]},"t":163,"s":[19,19]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.333,0.333],"y":[0,0]},"t":270,"s":[19,19]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":279,"s":[13,13]},{"i":{"x":[0.667,0.667],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":325,"s":[13,13]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.333,0.333],"y":[0,0]},"t":334,"s":[19,19]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":445,"s":[19,19]},{"t":474,"s":[13,13]}],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.976470588235,0.670588235294,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":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":438,"op":540,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":".yellow600","cl":"yellow600","parent":2,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":146,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":155,"s":[85]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":270,"s":[85]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":279,"s":[50]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":325,"s":[50]},{"t":334,"s":[85]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":298,"s":[0,0,0],"to":[-0.5,-1.667,0],"ti":[0.5,1.667,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.167,"y":0.167},"t":305,"s":[-3,-10,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.257,"y":1},"o":{"x":0.333,"y":0},"t":352,"s":[-3,-10,0],"to":[1.667,-1.667,0],"ti":[-1.667,1.667,0]},{"t":393,"s":[7,-20,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":[{"d":1,"ty":"el","s":{"a":1,"k":[{"i":{"x":[0.667,0.667],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":146,"s":[13,13]},{"i":{"x":[0.667,0.667],"y":[1,1]},"o":{"x":[0.333,0.333],"y":[0,0]},"t":163,"s":[19,19]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.333,0.333],"y":[0,0]},"t":270,"s":[19,19]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":279,"s":[13,13]},{"i":{"x":[0.667,0.667],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":325,"s":[13,13]},{"t":334,"s":[19,19]}],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.976470588235,0.670588235294,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":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":438,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":".yellow600","cl":"yellow600","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":40,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":49,"s":[85]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":67,"s":[50]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":143,"s":[50]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":157,"s":[85]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":270,"s":[85]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":279,"s":[50]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":325,"s":[50]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":334,"s":[85]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":465,"s":[85]},{"t":472,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":114,"s":[226,175,0],"to":[-5.333,0,0],"ti":[5.333,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":135,"s":[194,175,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":298,"s":[194,175,0],"to":[0.5,1.667,0],"ti":[-0.5,-1.667,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.167,"y":0.167},"t":305,"s":[197,185,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.257,"y":1},"o":{"x":0.333,"y":0},"t":352,"s":[197,185,0],"to":[-1.667,1.667,0],"ti":[1.667,-1.667,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.167,"y":0.167},"t":393,"s":[187,195,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.568,"y":0.019},"t":438,"s":[187,195,0],"to":[2.833,-6.667,0],"ti":[-2.833,6.667,0]},{"t":478,"s":[204,155,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":[{"d":1,"ty":"el","s":{"a":1,"k":[{"i":{"x":[0.667,0.667],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":40,"s":[13,13]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.333,0.333],"y":[0,0]},"t":57,"s":[19,19]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":69,"s":[13,13]},{"i":{"x":[0.667,0.667],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":143,"s":[13,13]},{"i":{"x":[0.667,0.667],"y":[1,1]},"o":{"x":[0.333,0.333],"y":[0,0]},"t":157,"s":[19,19]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":270,"s":[19,19]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":279,"s":[13,13]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":325,"s":[13,13]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":334,"s":[19,19]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":445,"s":[19,19]},{"t":474,"s":[13,13]}],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.976470588235,0.670588235294,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":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":438,"op":540,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":".yellow600","cl":"yellow600","parent":2,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":40,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":49,"s":[85]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":67,"s":[50]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":143,"s":[50]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":157,"s":[85]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":270,"s":[85]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":279,"s":[50]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":325,"s":[50]},{"t":334,"s":[85]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":114,"s":[0,0,0],"to":[-5.333,0,0],"ti":[5.333,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":135,"s":[-32,0,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":298,"s":[-32,0,0],"to":[0.5,1.667,0],"ti":[-0.5,-1.667,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.167,"y":0.167},"t":305,"s":[-29,10,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.257,"y":1},"o":{"x":0.333,"y":0},"t":352,"s":[-29,10,0],"to":[-1.667,1.667,0],"ti":[1.667,-1.667,0]},{"t":393,"s":[-39,20,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":[{"d":1,"ty":"el","s":{"a":1,"k":[{"i":{"x":[0.667,0.667],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":40,"s":[13,13]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.333,0.333],"y":[0,0]},"t":57,"s":[19,19]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":69,"s":[13,13]},{"i":{"x":[0.667,0.667],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":143,"s":[13,13]},{"i":{"x":[0.667,0.667],"y":[1,1]},"o":{"x":[0.333,0.333],"y":[0,0]},"t":157,"s":[19,19]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":270,"s":[19,19]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":279,"s":[13,13]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":325,"s":[13,13]},{"t":334,"s":[19,19]}],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.976470588235,0.670588235294,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":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":438,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":7,"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":[205.999,150,0],"ix":2,"l":2},"a":{"a":0,"k":[205.999,150,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":"rc","d":1,"s":{"a":0,"k":[201.948,319.538],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":16,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[0.501960784314,0.525490196078,0.545098039216,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2.5,"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":-90,"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":"frame","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[205.999,151.162],"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":"frame","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,-1.372],[0,0],[0,0],[1.367,0]],"o":[[-1.367,0],[0,0],[0,0],[0,-1.372],[0,0]],"v":[[-4.457,-1.74],[-6.933,0.746],[0.99,0.746],[6.933,0.746],[4.457,-1.74]],"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":[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":"button2","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[318.382,49.604],"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":"button2","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,-1.372],[0,0],[0,0],[1.367,0]],"o":[[-1.367,0],[0,0],[0,0],[0,-1.372],[0,0]],"v":[[-10.894,-1.74],[-13.37,0.746],[0.495,0.746],[13.37,0.746],[10.894,-1.74]],"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":[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":"button1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[276.958,49.604],"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":"button1","np":1,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":540,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"Yellow Matte","td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[205.998,151.162,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":0,"k":[190,308],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":10,"ix":4},"nm":"Rectangle Path 2","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"mm","mm":3,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","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":-90,"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":"Highlight","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":540,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":".yellow600","cl":"yellow600","tt":2,"tp":8,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[205.998,151.162,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":0,"k":[201.948,319.538],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":16,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"mm","mm":3,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.976470589638,0.670588254929,0,1],"ix":4},"o":{"a":1,"k":[{"i":{"x":[0.67],"y":[1]},"o":{"x":[0.17],"y":[0.17]},"t":0,"s":[0]},{"i":{"x":[0.776],"y":[1]},"o":{"x":[0.165],"y":[0]},"t":23,"s":[100]},{"i":{"x":[0.83],"y":[0.83]},"o":{"x":[0.33],"y":[0]},"t":460,"s":[100]},{"t":475,"s":[0]}],"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":-90,"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":"Highlight","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":540,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"screenMatte","td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[205.999,151.162,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":0,"k":[201.948,319.538],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":16,"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":-90,"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":"BG","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":540,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":".grey100","cl":"grey100","parent":2,"tt":1,"tp":10,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0,0,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.18,0.18,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":76,"s":[30,30,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":95,"s":[119,119,100]},{"i":{"x":[0.257,0.257,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":352,"s":[119,119,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":393,"s":[161,161,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.735,0.735,0.333],"y":[-0.008,-0.008,0]},"t":438,"s":[161,161,100]},{"t":478,"s":[30,30,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],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[13.974,5.25],[4.524,-21.75],[0.624,-34.65],[-0.576,-34.65],[-4.476,-21.75],[-14.076,5.25]],"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],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-11.676,-57.9],[11.574,-57.9],[51.924,49.5],[29.574,49.5],[20.574,23.85],[-20.526,23.85],[-29.526,49.5],[-51.876,49.5]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.945098039216,0.952941176471,0.956862745098,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,8],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[155,155],"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":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":540,"st":0,"ct":1,"bm":0}],"markers":[]}
\ No newline at end of file
diff --git a/res/raw-sw600dp/accessibility_shortcut_type_triple_tap.json b/res/raw-sw600dp/accessibility_shortcut_type_triple_tap.json
new file mode 100644
index 0000000..b6a9b14
--- /dev/null
+++ b/res/raw-sw600dp/accessibility_shortcut_type_triple_tap.json
@@ -0,0 +1 @@
+{"v":"5.10.0","fr":60,"ip":0,"op":180,"w":412,"h":300,"nm":"Triple_Tap_Screen_Tablet-DT","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"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":[205.999,149.375,0],"ix":2,"l":2},"a":{"a":0,"k":[205.999,149.375,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,0],[-1.367,0],[0,0],[0,-1.372],[0,0]],"o":[[0,-1.372],[0,0],[1.366,0],[0,0],[0,0]],"v":[[-6.933,0.746],[-4.457,-1.74],[4.457,-1.74],[6.933,0.746],[0.99,1.74]],"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":[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":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[318.382,49.604],"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":"Layer 3","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],[-1.367,0],[0,0],[0,-1.372],[0,0]],"o":[[0,-1.372],[0,0],[1.367,0],[0,0],[0,0]],"v":[[-13.37,0.746],[-10.894,-1.74],[10.894,-1.74],[13.37,0.746],[0.495,1.74]],"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":[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":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[276.958,49.604],"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":"Layer 2","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,-8.146],[0,0],[8.146,0],[0,0],[0,8.146],[0,0],[-8.146,0],[0,0]],"o":[[0,0],[0,8.146],[0,0],[-8.146,0],[0,0],[0,-8.146],[0,0],[8.146,0]],"v":[[158.519,-84.974],[158.519,84.974],[143.769,99.724],[-143.769,99.724],[-158.519,84.974],[-158.519,-84.974],[-143.769,-99.724],[143.769,-99.724]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.501960784314,0.525490196078,0.545098039216,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2.5,"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":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[205.999,151.162],"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":"Layer 1","np":1,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":180,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":".blue400","cl":"blue400","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":36,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":39.582,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":44.953,"s":[100]},{"t":55.697265625,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[207.641,154.48,0],"ix":2,"l":2},"a":{"a":0,"k":[-180.5,-165.5,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0,0,0],"y":[1,1,1]},"o":{"x":[0.45,0.45,0.45],"y":[0,0,0]},"t":37.791,"s":[27.252,27.252,100]},{"t":59,"s":[56.661,56.661,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[63.109,63.109],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","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":3,"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":[-180.5,-165.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":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":36,"op":59,"st":-1,"ct":1,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":".blue800","cl":"blue800","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":36,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":39.582,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":44.953,"s":[100]},{"t":55.697265625,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[207.641,154.48,0],"ix":2,"l":2},"a":{"a":0,"k":[-180.5,-165.5,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0,0,0],"y":[1,1,1]},"o":{"x":[0.45,0.45,0.45],"y":[0,0,0]},"t":37.791,"s":[27.252,27.252,100]},{"t":59,"s":[56.661,56.661,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[63.109,63.109],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.094117647059,0.352941176471,0.737254901961,1],"ix":4},"o":{"a":0,"k":50,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-180.5,-165.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":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":36,"op":59,"st":-1,"ct":1,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":".blue400","cl":"blue400","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":22,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":25.58,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":30.953,"s":[100]},{"t":41.697265625,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[207.641,154.48,0],"ix":2,"l":2},"a":{"a":0,"k":[-180.5,-165.5,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0,0,0],"y":[1,1,1]},"o":{"x":[0.45,0.45,0.45],"y":[0,0,0]},"t":23.789,"s":[27.252,27.252,100]},{"t":45,"s":[56.661,56.661,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[63.109,63.109],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","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":3,"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":[-180.5,-165.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":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":22,"op":45,"st":-3,"ct":1,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":".blue800","cl":"blue800","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":22,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":25.58,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":30.953,"s":[100]},{"t":41.697265625,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[207.641,154.48,0],"ix":2,"l":2},"a":{"a":0,"k":[-180.5,-165.5,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0,0,0],"y":[1,1,1]},"o":{"x":[0.45,0.45,0.45],"y":[0,0,0]},"t":23.789,"s":[27.252,27.252,100]},{"t":45,"s":[56.661,56.661,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[63.109,63.109],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.094117647059,0.352941176471,0.737254901961,1],"ix":4},"o":{"a":0,"k":50,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-180.5,-165.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":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":22,"op":45,"st":-3,"ct":1,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":".blue400","cl":"blue400","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":8,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":11.582,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":16.953,"s":[100]},{"t":27.697265625,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[207.641,154.48,0],"ix":2,"l":2},"a":{"a":0,"k":[-180.5,-165.5,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0,0,0],"y":[1,1,1]},"o":{"x":[0.45,0.45,0.45],"y":[0,0,0]},"t":9.791,"s":[27.252,27.252,100]},{"t":31,"s":[56.661,56.661,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[63.109,63.109],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","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":3,"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":[-180.5,-165.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":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":8,"op":31,"st":-5,"ct":1,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":".blue800","cl":"blue800","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":8,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":11.582,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":16.953,"s":[100]},{"t":27.697265625,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[207.641,154.48,0],"ix":2,"l":2},"a":{"a":0,"k":[-180.5,-165.5,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0,0,0],"y":[1,1,1]},"o":{"x":[0.45,0.45,0.45],"y":[0,0,0]},"t":9.791,"s":[27.252,27.252,100]},{"t":31,"s":[56.661,56.661,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[63.109,63.109],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.094117647059,0.352941176471,0.737254901961,1],"ix":4},"o":{"a":0,"k":50,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-180.5,-165.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":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":8,"op":31,"st":-5,"ct":1,"bm":0},{"ddd":0,"ind":8,"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.4,0],[0,0],[0,15.4],[0,0],[-15.4,0],[0,0],[0,-15.4],[0,0]],"o":[[0,0],[-15.4,0],[0,0],[0,-15.4],[0,0],[15.4,0],[0,0],[0,15.4]],"v":[[178,150],[-178,150],[-206,122],[-206,-122],[-178,-150],[178,-150],[206,-122],[206,122]],"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":"Group 1","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-sw600dp/accessibility_timeout_banner.json b/res/raw-sw600dp/accessibility_timeout_banner.json
new file mode 100644
index 0000000..90dc106
--- /dev/null
+++ b/res/raw-sw600dp/accessibility_timeout_banner.json
@@ -0,0 +1 @@
+{"v":"5.9.0","fr":60,"ip":0,"op":420,"w":412,"h":300,"nm":"Time_To_Take_Action_Tablet","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":".blue600","cl":"blue600","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":204,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":215,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":396,"s":[100]},{"t":413,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[151.263,97.6,0],"ix":2,"l":2},"a":{"a":0,"k":[44.25,18.25,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.2,0.2,0.2],"y":[1,1,1]},"o":{"x":[0.4,0.4,0.4],"y":[0,0,0]},"t":204,"s":[115.2,115.2,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.4,0.4,0.4],"y":[0,0,0]},"t":215,"s":[120,120,100]},{"i":{"x":[0.2,0.2,0.2],"y":[1,1,1]},"o":{"x":[0.4,0.4,0.4],"y":[0,0,0]},"t":396,"s":[120,120,100]},{"t":413,"s":[115.2,115.2,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,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[-5,7.5],[5,0],[-5,-7.5]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":4,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.101960784314,0.450980392157,0.909803921569,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":[45.25,18.25],"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":1,"mn":"ADBE Vector Group","hd":false},{"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":[[-2.26,3.389],[-3.389,3.389],[-3.389,-3.389],[-2.26,-3.389]],"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]],"o":[[0,0],[0,0],[0,0]],"v":[[3.389,-3.389],[-1.413,0],[3.389,3.389]],"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":"mm","mm":4,"nm":"Merge Paths 2","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.101960784314,0.450980392157,0.909803921569,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":[16.862,18.485],"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":5,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"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":[[2.26,-3.389],[3.389,-3.389],[3.389,3.389],[2.26,3.389]],"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]],"o":[[0,0],[0,0],[0,0]],"v":[[-3.389,3.389],[1.413,0],[-3.389,-3.389]],"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":"mm","mm":4,"nm":"Merge Paths 2","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.101960784314,0.450980392157,0.909803921569,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":[71.638,18.485],"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 3","np":5,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[44.25,18.25],"ix":2},"a":{"a":0,"k":[44.25,18.25],"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 5","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":420,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":".blue100","cl":"blue100","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":204,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":215,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":396,"s":[100]},{"t":413,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[151.263,97.6,0],"ix":2,"l":2},"a":{"a":0,"k":[44.25,18.25,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.2,0.2,0.2],"y":[1,1,1]},"o":{"x":[0.4,0.4,0.4],"y":[0,0,0]},"t":204,"s":[115.2,115.2,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.4,0.4,0.4],"y":[0,0,0]},"t":215,"s":[120,120,100]},{"i":{"x":[0.2,0.2,0.2],"y":[1,1,1]},"o":{"x":[0.4,0.4,0.4],"y":[0,0,0]},"t":396,"s":[120,120,100]},{"t":413,"s":[115.2,115.2,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[9.941,0],[0,0],[0,9.941],[-9.941,0],[0,0],[0,-9.941]],"o":[[0,0],[-9.941,0],[0,-9.941],[0,0],[9.941,0],[0,9.941]],"v":[[26,18],[-26,18],[-44,0],[-26,-18],[26,-18],[44,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":4,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.823529411765,0.890196078431,0.988235294118,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":[44.25,18.25],"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":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":420,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"BoxMatte","td":1,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":191,"s":[100]},{"t":208,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.001,"y":0},"t":9,"s":[151.281,95.014,0],"to":[0,1.833,0],"ti":[0,-1.833,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.001,"y":0.001},"t":29,"s":[151.281,106.014,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":191,"s":[151.281,106.014,0],"to":[0,-1.833,0],"ti":[0,1.833,0]},{"t":208,"s":[151.281,95.014,0]}],"ix":2,"l":2},"a":{"a":0,"k":[-54.844,-43.986,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.2,0.2],"y":[1,1]},"o":{"x":[0.001,0.001],"y":[0,0]},"t":9,"s":[173.312,0]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.001,0.001],"y":[0,0]},"t":29,"s":[173.312,60.027]},{"i":{"x":[0.2,0.2],"y":[1,1]},"o":{"x":[0.4,0.4],"y":[0,0]},"t":191,"s":[173.312,60.027]},{"t":208,"s":[173.312,0]}],"ix":2},"p":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.001,"y":0},"t":9,"s":[0,-30],"to":[0,5],"ti":[0,-5]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.001,"y":0.001},"t":29,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":191,"s":[0,0],"to":[0,-5],"ti":[0,5]},{"t":208,"s":[0,-30]}],"ix":3},"r":{"a":0,"k":5,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.101960784314,0.450980392157,0.909803921569,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":[-54.844,-43.986],"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":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":420,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":".blue300","cl":"blue300","tt":1,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":9,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":29,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":191,"s":[100]},{"t":208,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[81.063,95.405,0],"ix":2,"l":2},"a":{"a":0,"k":[7.75,7.75,0],"ix":1,"l":2},"s":{"a":0,"k":[120,120,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-4.142],[4.142,0],[0,4.142],[-4.143,0]],"o":[[0,4.142],[-4.143,0],[0,-4.142],[4.142,0]],"v":[[7.5,0],[0,7.5],[-7.5,0],[0,-7.5]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":4,"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":[7.75,7.75],"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":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":420,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"BoxMatte 2","td":1,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":191,"s":[100]},{"t":208,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.001,"y":0},"t":9,"s":[151.281,95.014,0],"to":[0,1.833,0],"ti":[0,-1.833,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.001,"y":0.001},"t":29,"s":[151.281,106.014,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":191,"s":[151.281,106.014,0],"to":[0,-1.833,0],"ti":[0,1.833,0]},{"t":208,"s":[151.281,95.014,0]}],"ix":2,"l":2},"a":{"a":0,"k":[-54.844,-43.986,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.2,0.2],"y":[1,1]},"o":{"x":[0.001,0.001],"y":[0,0]},"t":9,"s":[173.312,0]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.001,0.001],"y":[0,0]},"t":29,"s":[173.312,60.027]},{"i":{"x":[0.2,0.2],"y":[1,1]},"o":{"x":[0.4,0.4],"y":[0,0]},"t":191,"s":[173.312,60.027]},{"t":208,"s":[173.312,0]}],"ix":2},"p":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.001,"y":0},"t":9,"s":[0,-30],"to":[0,5],"ti":[0,-5]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.001,"y":0.001},"t":29,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":191,"s":[0,0],"to":[0,-5],"ti":[0,5]},{"t":208,"s":[0,-30]}],"ix":3},"r":{"a":0,"k":5,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.101960784314,0.450980392157,0.909803921569,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":[-54.844,-43.986],"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":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":420,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":".blue300","cl":"blue300","tt":1,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":9,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":29,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":191,"s":[100]},{"t":208,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[97.212,90.005,0],"ix":2,"l":2},"a":{"a":0,"k":[0.207,3.25,0],"ix":1,"l":2},"s":{"a":0,"k":[120,120,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]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[20.27,3],[-20.27,3],[-20.27,-3],[20.27,-3]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.541176470588,0.705882352941,0.972549079446,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":[20.52,3.25],"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":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":420,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"BoxMatte 3","td":1,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":191,"s":[100]},{"t":208,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.001,"y":0},"t":9,"s":[151.281,95.014,0],"to":[0,1.833,0],"ti":[0,-1.833,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.001,"y":0.001},"t":29,"s":[151.281,106.014,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":191,"s":[151.281,106.014,0],"to":[0,-1.833,0],"ti":[0,1.833,0]},{"t":208,"s":[151.281,95.014,0]}],"ix":2,"l":2},"a":{"a":0,"k":[-54.844,-43.986,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.2,0.2],"y":[1,1]},"o":{"x":[0.001,0.001],"y":[0,0]},"t":9,"s":[173.312,0]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.001,0.001],"y":[0,0]},"t":29,"s":[173.312,60.027]},{"i":{"x":[0.2,0.2],"y":[1,1]},"o":{"x":[0.4,0.4],"y":[0,0]},"t":191,"s":[173.312,60.027]},{"t":208,"s":[173.312,0]}],"ix":2},"p":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.001,"y":0},"t":9,"s":[0,-30],"to":[0,5],"ti":[0,-5]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.001,"y":0.001},"t":29,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":191,"s":[0,0],"to":[0,-5],"ti":[0,5]},{"t":208,"s":[0,-30]}],"ix":3},"r":{"a":0,"k":5,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.101960784314,0.450980392157,0.909803921569,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":[-54.844,-43.986],"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":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":420,"st":0,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":".blue300","cl":"blue300","tt":1,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":9,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":29,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":191,"s":[100]},{"t":208,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[97.188,100.805,0],"ix":2,"l":2},"a":{"a":0,"k":[0.188,3.25,0],"ix":1,"l":2},"s":{"a":0,"k":[120,120,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]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[31.5,3],[-31.5,3],[-31.5,-3],[31.5,-3]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.541176470588,0.705882352941,0.972549079446,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":[31.75,3.25],"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":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":420,"st":0,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"BoxMatte 4","td":1,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":191,"s":[100]},{"t":208,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.001,"y":0},"t":9,"s":[151.281,95.014,0],"to":[0,1.833,0],"ti":[0,-1.833,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.001,"y":0.001},"t":29,"s":[151.281,106.014,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":191,"s":[151.281,106.014,0],"to":[0,-1.833,0],"ti":[0,1.833,0]},{"t":208,"s":[151.281,95.014,0]}],"ix":2,"l":2},"a":{"a":0,"k":[-54.844,-43.986,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.2,0.2],"y":[1,1]},"o":{"x":[0.001,0.001],"y":[0,0]},"t":9,"s":[173.312,0]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.001,0.001],"y":[0,0]},"t":29,"s":[173.312,60.027]},{"i":{"x":[0.2,0.2],"y":[1,1]},"o":{"x":[0.4,0.4],"y":[0,0]},"t":191,"s":[173.312,60.027]},{"t":208,"s":[173.312,0]}],"ix":2},"p":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.001,"y":0},"t":9,"s":[0,-30],"to":[0,5],"ti":[0,-5]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.001,"y":0.001},"t":29,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":191,"s":[0,0],"to":[0,-5],"ti":[0,5]},{"t":208,"s":[0,-30]}],"ix":3},"r":{"a":0,"k":5,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","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":[-54.844,-43.986],"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":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":420,"st":0,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":".blue600","cl":"blue600","tt":1,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":9,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":29,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":191,"s":[100]},{"t":208,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[109.263,120.576,0],"ix":2,"l":2},"a":{"a":0,"k":[10.25,4.25,0],"ix":1,"l":2},"s":{"a":0,"k":[120,120,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.104,0],[0,0],[0,1.104],[0,0],[-1.105,0],[0,0],[0,-1.104],[0,0]],"o":[[0,0],[-1.105,0],[0,0],[0,-1.104],[0,0],[1.104,0],[0,0],[0,1.104]],"v":[[8,4],[-8,4],[-10,2],[-10,-2],[-8,-4],[8,-4],[10,-2],[10,2]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":4,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.101960784314,0.450980392157,0.909803921569,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":[10.25,4.25],"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":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":420,"st":0,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":"BoxMatte 5","td":1,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":191,"s":[100]},{"t":208,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.001,"y":0},"t":9,"s":[151.281,95.014,0],"to":[0,1.833,0],"ti":[0,-1.833,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.001,"y":0.001},"t":29,"s":[151.281,106.014,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":191,"s":[151.281,106.014,0],"to":[0,-1.833,0],"ti":[0,1.833,0]},{"t":208,"s":[151.281,95.014,0]}],"ix":2,"l":2},"a":{"a":0,"k":[-54.844,-43.986,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.2,0.2],"y":[1,1]},"o":{"x":[0.001,0.001],"y":[0,0]},"t":9,"s":[173.312,0]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.001,0.001],"y":[0,0]},"t":29,"s":[173.312,60.027]},{"i":{"x":[0.2,0.2],"y":[1,1]},"o":{"x":[0.4,0.4],"y":[0,0]},"t":191,"s":[173.312,60.027]},{"t":208,"s":[173.312,0]}],"ix":2},"p":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.001,"y":0},"t":9,"s":[0,-30],"to":[0,5],"ti":[0,-5]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.001,"y":0.001},"t":29,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":191,"s":[0,0],"to":[0,-5],"ti":[0,5]},{"t":208,"s":[0,-30]}],"ix":3},"r":{"a":0,"k":5,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.101960784314,0.450980392157,0.909803921569,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":[-54.844,-43.986],"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":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":420,"st":0,"bm":0},{"ddd":0,"ind":12,"ty":4,"nm":".blue600","cl":"blue600","tt":1,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":9,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":29,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":191,"s":[100]},{"t":208,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[142.863,120.576,0],"ix":2,"l":2},"a":{"a":0,"k":[10.25,4.25,0],"ix":1,"l":2},"s":{"a":0,"k":[120,120,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.104,0],[0,0],[0,1.104],[0,0],[-1.105,0],[0,0],[0,-1.104],[0,0]],"o":[[0,0],[-1.105,0],[0,0],[0,-1.104],[0,0],[1.104,0],[0,0],[0,1.104]],"v":[[8,4],[-8,4],[-10,2],[-10,-2],[-8,-4],[8,-4],[10,-2],[10,2]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":4,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.101960784314,0.450980392157,0.909803921569,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":[10.25,4.25],"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":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":420,"st":0,"bm":0},{"ddd":0,"ind":13,"ty":4,"nm":".blue100","cl":"blue100","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":191,"s":[100]},{"t":208,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.001,"y":0},"t":9,"s":[151.281,95.014,0],"to":[0,1.833,0],"ti":[0,-1.833,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.001,"y":0.001},"t":29,"s":[151.281,106.014,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":191,"s":[151.281,106.014,0],"to":[0,-1.833,0],"ti":[0,1.833,0]},{"t":208,"s":[151.281,95.014,0]}],"ix":2,"l":2},"a":{"a":0,"k":[-54.844,-43.986,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.2,0.2],"y":[1,1]},"o":{"x":[0.001,0.001],"y":[0,0]},"t":9,"s":[173.312,0]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.001,0.001],"y":[0,0]},"t":29,"s":[173.312,60.027]},{"i":{"x":[0.2,0.2],"y":[1,1]},"o":{"x":[0.4,0.4],"y":[0,0]},"t":191,"s":[173.312,60.027]},{"t":208,"s":[173.312,0]}],"ix":2},"p":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.001,"y":0},"t":9,"s":[0,-30],"to":[0,5],"ti":[0,-5]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.001,"y":0.001},"t":29,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":191,"s":[0,0],"to":[0,-5],"ti":[0,5]},{"t":208,"s":[0,-30]}],"ix":3},"r":{"a":0,"k":5,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.823529411765,0.890196078431,0.988235294118,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":[-54.844,-43.986],"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":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":420,"st":0,"bm":0},{"ddd":0,"ind":14,"ty":3,"nm":"Null 2","sr":1,"ks":{"o":{"a":0,"k":0,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[193,142,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":420,"st":0,"bm":0},{"ddd":0,"ind":15,"ty":4,"nm":".blue600","cl":"blue600","parent":14,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":20,"s":[0]},{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.4],"y":[0]},"t":191.408,"s":[-135]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":218.072,"s":[0]},{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.4],"y":[0]},"t":391.385,"s":[-135]},{"t":419,"s":[0]}],"ix":10},"p":{"a":0,"k":[143.118,-25.213,0],"ix":2,"l":2},"a":{"a":0,"k":[6.272,5.403,0],"ix":1,"l":2},"s":{"a":0,"k":[120,120,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-1.055,0],[-0.805,-0.804],[0,0],[0,0],[0.768,-0.768],[0.522,0],[0.388,0.336],[6.225,5.393],[0.071,0.072],[-1.609,1.608]],"o":[[1.054,0],[0.071,0.071],[5.394,6.225],[0.7,0.809],[-0.4,0.401],[-0.483,0],[0,0],[0,0],[-1.609,-1.608],[0.804,-0.804]],"v":[[-9.06,-13.279],[-6.148,-12.072],[-5.948,-11.856],[12.874,9.883],[12.78,12.68],[11.336,13.279],[9.983,12.773],[-11.758,-6.048],[-11.973,-6.248],[-11.973,-12.072]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.101960784314,0.450980392157,0.909803921569,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":[16.022,15.528],"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":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":420,"st":0,"bm":0},{"ddd":0,"ind":16,"ty":4,"nm":".white","cl":"white","parent":14,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":20,"s":[0]},{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.4],"y":[0]},"t":191.408,"s":[-135]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":218.072,"s":[0]},{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.4],"y":[0]},"t":391.385,"s":[-135]},{"t":419,"s":[0]}],"ix":10},"p":{"a":0,"k":[143.118,-25.213,0],"ix":2,"l":2},"a":{"a":0,"k":[6.272,5.403,0],"ix":1,"l":2},"s":{"a":0,"k":[120,120,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.634,0],[1.155,-1.156],[-2.386,-2.386],[0,0],[0,0],[-0.977,0],[-0.764,0.763],[1.388,1.602],[5.394,6.225],[0.098,0.098]],"o":[[-1.635,0],[-2.386,2.386],[0.097,0.097],[6.251,5.416],[0.74,0.64],[1.08,0],[1.494,-1.495],[0.001,0.001],[-0.023,-0.026],[-1.155,-1.156]],"v":[[-9.06,-15.279],[-13.387,-13.486],[-13.387,-4.833],[-13.092,-4.559],[8.672,14.286],[11.336,15.279],[14.194,14.096],[14.384,8.574],[-4.436,-13.166],[-4.734,-13.486]],"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":[16.022,15.528],"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":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":420,"st":0,"bm":0},{"ddd":0,"ind":17,"ty":4,"nm":".grey600","cl":"grey600","parent":14,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[123.6,-20.352,0],"ix":2,"l":2},"a":{"a":0,"k":[17.5,28.46,0],"ix":1,"l":2},"s":{"a":0,"k":[120,120,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]],"o":[[0,0],[0,0]],"v":[[2.121,2.122],[-2.121,-2.122]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.501960784314,0.525490196078,0.545098039216,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":2,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[13.201,4.121],"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":2,"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,0]],"o":[[0,0],[0,0]],"v":[[2.121,-2.122],[-2.121,2.122]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.501960784314,0.525490196078,0.545098039216,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":2,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[13.201,43.72],"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":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[8,23.921],[2,23.921]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.501960784314,0.525490196078,0.545098039216,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":2,"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 3","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[33,48.921],[33,54.921]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.501960784314,0.525490196078,0.545098039216,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":2,"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 4","np":2,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":420,"st":0,"bm":0},{"ddd":0,"ind":18,"ty":4,"nm":".blue600","cl":"blue600","parent":14,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[142.2,-59.4,0],"ix":2,"l":2},"a":{"a":0,"k":[2,5,0],"ix":1,"l":2},"s":{"a":0,"k":[120,120,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]],"o":[[0,0],[0,0]],"v":[[2,2],[2,8]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.101960791794,0.450980422076,0.909803981407,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":2,"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":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":420,"st":0,"bm":0},{"ddd":0,"ind":19,"ty":4,"nm":".grey600","cl":"grey600","parent":14,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":150,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":160,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":197,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":200,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":337,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":347,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":399,"s":[100]},{"t":402,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[165.959,-49.559,0],"ix":2,"l":2},"a":{"a":0,"k":[4.121,4.121,0],"ix":1,"l":2},"s":{"a":0,"k":[120,120,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]],"o":[[0,0],[0,0]],"v":[[2.121,-2.122],[-2.121,2.122]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.501960784314,0.525490196078,0.545098039216,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":2,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[4.121,4.122],"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":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":420,"st":0,"bm":0},{"ddd":0,"ind":20,"ty":4,"nm":".blue600","cl":"blue600","parent":14,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[165.959,-49.559,0],"ix":2,"l":2},"a":{"a":0,"k":[4.121,4.121,0],"ix":1,"l":2},"s":{"a":0,"k":[120,120,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]],"o":[[0,0],[0,0]],"v":[[2.121,-2.122],[-2.121,2.122]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.101960791794,0.450980422076,0.909803981407,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":2,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[4.121,4.122],"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":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":420,"st":0,"bm":0},{"ddd":0,"ind":21,"ty":4,"nm":".grey600","cl":"grey600","parent":14,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":90,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":100,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":203,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":206,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":282,"s":[0]},{"t":292,"s":[100]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[175.8,-25.8,0],"ix":2,"l":2},"a":{"a":0,"k":[5,2,0],"ix":1,"l":2},"s":{"a":0,"k":[120,120,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]],"o":[[0,0],[0,0]],"v":[[8,2],[2,2]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.501960784314,0.525490196078,0.545098039216,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":2,"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":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":420,"st":0,"bm":0},{"ddd":0,"ind":22,"ty":4,"nm":".blue600","cl":"blue600","parent":14,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[175.8,-25.8,0],"ix":2,"l":2},"a":{"a":0,"k":[5,2,0],"ix":1,"l":2},"s":{"a":0,"k":[120,120,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]],"o":[[0,0],[0,0]],"v":[[8,2],[2,2]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.101960793138,0.450980424881,0.909803986549,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":2,"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":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":420,"st":0,"bm":0},{"ddd":0,"ind":23,"ty":4,"nm":".grey600","cl":"grey600","parent":14,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":33,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":43,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":211,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":214,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":229,"s":[0]},{"t":239,"s":[100]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[165.959,-2.041,0],"ix":2,"l":2},"a":{"a":0,"k":[4.121,4.121,0],"ix":1,"l":2},"s":{"a":0,"k":[120,120,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]],"o":[[0,0],[0,0]],"v":[[2.121,2.122],[-2.121,-2.122]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.501960784314,0.525490196078,0.545098039216,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":2,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[4.121,4.122],"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":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":420,"st":0,"bm":0},{"ddd":0,"ind":24,"ty":4,"nm":".blue600","cl":"blue600","parent":14,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[165.959,-2.041,0],"ix":2,"l":2},"a":{"a":0,"k":[4.121,4.121,0],"ix":1,"l":2},"s":{"a":0,"k":[120,120,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]],"o":[[0,0],[0,0]],"v":[[2.121,2.122],[-2.121,-2.122]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.101960791794,0.450980422076,0.909803981407,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":2,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[4.121,4.122],"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":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":420,"st":0,"bm":0},{"ddd":0,"ind":25,"ty":4,"nm":".blue100","cl":"blue100","parent":14,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[140.279,-25.921,0],"ix":2,"l":2},"a":{"a":0,"k":[116.899,-21.601,0],"ix":1,"l":2},"s":{"a":0,"k":[120,120,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[57.799,57.799],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0.823529471603,0.89019613827,0.988235353956,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"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":[118.399,-21.101],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[96.668,96.166],"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":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":20,"s":[37]},{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.4],"y":[0]},"t":191.408,"s":[2]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":218.072,"s":[37]},{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.4],"y":[0]},"t":391.385,"s":[2]},{"t":419,"s":[37]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":420,"st":0,"bm":0},{"ddd":0,"ind":26,"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":[89.729,155.25,0],"ix":2,"l":2},"a":{"a":0,"k":[89.729,155.25,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,0],[-1.412,0],[0,0],[0,-1.417],[0,0]],"o":[[0,-1.417],[0,0],[1.412,0],[0,0],[0,0]],"v":[[-7.16,0.77],[-4.602,-1.797],[4.603,-1.797],[7.16,0.77],[1.023,1.797]],"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":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},{"ty":"tr","p":{"a":0,"k":[205.79,52.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":"Layer 4","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],[-1.411,0],[0,0],[0,-1.417],[0,0]],"o":[[0,-1.417],[0,0],[1.412,0],[0,0],[0,0]],"v":[[-13.808,0.77],[-11.251,-1.797],[11.251,-1.797],[13.808,0.77],[0.512,1.797]],"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":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},{"ty":"tr","p":{"a":0,"k":[163.011,52.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":"Layer 3","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,-8.008],[0,0],[8.008,0],[0,0],[0,8.008],[0,0],[-8.008,0],[0,0]],"o":[[0,0],[0,8.008],[0,0],[-8.008,0],[0,0],[0,-8.008],[0,0],[8.008,0]],"v":[[163.5,-88.28],[163.5,88.28],[149,102.78],[-149,102.78],[-163.5,88.28],[-163.5,-88.28],[-149,-102.78],[149,-102.78]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.501960784314,0.525490196078,0.545098039216,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"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":"Group 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[89.729,157.2],"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":"Layer 2","np":1,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":420,"st":0,"bm":0},{"ddd":0,"ind":27,"ty":4,"nm":".grey800","cl":"grey800","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[89.729,157.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,-8.008],[0,0],[8.008,0],[0,0],[0,8.008],[0,0],[-8.008,0],[0,0]],"o":[[0,0],[0,8.008],[0,0],[-8.008,0],[0,0],[0,-8.008],[0,0],[8.008,0]],"v":[[163.5,-88.28],[163.5,88.28],[149,102.78],[-149,102.78],[-163.5,88.28],[-163.5,-88.28],[-149,-102.78],[149,-102.78]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.235294117647,0.250980392157,0.262745098039,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":"Group 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":420,"st":0,"bm":0}],"markers":[]}
\ No newline at end of file
diff --git a/res/raw-sw600dp/extra_dim_banner.json b/res/raw-sw600dp/extra_dim_banner.json
new file mode 100644
index 0000000..0d150ae
--- /dev/null
+++ b/res/raw-sw600dp/extra_dim_banner.json
@@ -0,0 +1 @@
+{"v":"5.10.0","fr":60,"ip":0,"op":300,"w":412,"h":300,"nm":"Extra_Dim_Tablet_DT","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"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":[206,149.71,0],"ix":2,"l":2},"a":{"a":0,"k":[206,149.71,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,0],[0,-1.417],[0,0],[0,0],[1.411,0]],"o":[[-1.411,0],[0,0],[0,0],[0,-1.417],[0,0]],"v":[[-4.603,-1.797],[-7.16,0.77],[1.023,1.797],[7.16,0.77],[4.603,-1.797]],"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":[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":[322.062,46.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":"button2","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,-1.417],[0,0],[0,0],[1.411,0]],"o":[[-1.411,0],[0,0],[0,0],[0,-1.417],[0,0]],"v":[[-11.251,-1.797],[-13.808,0.77],[0.511,1.797],[13.808,0.77],[11.251,-1.797]],"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":[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":[279.283,46.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":"button1","np":1,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[208.56,330],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":16,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"op","nm":"Offset Paths 1","a":{"a":0,"k":-1.5,"ix":1},"lj":1,"ml":{"a":0,"k":4,"ix":3},"ix":2,"mn":"ADBE Vector Filter - Offset","hd":false},{"ty":"st","c":{"a":0,"k":[0.501960784314,0.525490196078,0.545098039216,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"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":-90,"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":"Frame","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[206,151.661],"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":"frame","np":1,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":300,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":".black","cl":"black","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":52,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":72,"s":[60]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":252,"s":[60]},{"t":272,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[205.5,152,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.5,9.5],[0,0],[21.342,-2.5],[0,0],[0,-4.354],[0,0],[-14.842,0]],"o":[[13.324,0],[0,0],[0,-4.354],[0,0],[-17.842,-1.5],[0,0],[0,4.354],[0,0]],"v":[[140.908,103.168],[163.75,88.168],[163.75,-88.832],[140.908,-102.832],[-139.408,-102.832],[-163.75,-90.832],[-163.75,91.168],[-141.25,103.168]],"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":"dim","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":300,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":3,"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":[128.75,177.168,0],"ix":2,"l":2},"a":{"a":0,"k":[128.75,177.168,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":"rc","d":1,"s":{"a":0,"k":[144,37],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":10,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","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":"Rectangle 12321","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[128.75,192.668],"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":"left rect - 1","np":1,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[144,26],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":10,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","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":"Rectangle 12320","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[128.75,156.168],"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":"left rect - 2","np":1,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":300,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":".grey400","cl":"grey400","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[285.75,102.168,0],"ix":2,"l":2},"a":{"a":0,"k":[285.75,102.168,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":"rc","d":1,"s":{"a":0,"k":[144,37],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":10,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.741176486015,0.75686275959,0.776470601559,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":"Rectangle 12323","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[285.75,117.668],"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":"right rect - 1","np":1,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[144,26],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":10,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.741176486015,0.75686275959,0.776470601559,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":"Rectangle 12322","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[285.75,81.168],"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":"right rect - 2","np":1,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":300,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":".blue600","cl":"blue600","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[340.75,223.168,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":[[-6.627,0],[0,6.627],[6.627,0],[0,-6.627]],"o":[[6.627,0],[0,-6.627],[-6.627,0],[0,6.627]],"v":[[0,12],[12,0],[0,-12],[-12,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.101960785687,0.450980395079,0.909803926945,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":300,"st":0,"ct":1,"bm":0}],"markers":[]}
\ No newline at end of file
diff --git a/res/raw-sw600dp/lottie_bubbles.json b/res/raw-sw600dp/lottie_bubbles.json
new file mode 100644
index 0000000..75b8e49
--- /dev/null
+++ b/res/raw-sw600dp/lottie_bubbles.json
@@ -0,0 +1 @@
+{"v":"5.9.0","fr":60,"ip":15,"op":303,"w":412,"h":300,"nm":"Bubbles_Tablet_DT","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"press 2","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":178,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":188,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":223,"s":[100]},{"t":233,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[78.4,88,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.5,0.5,0.667],"y":[1,1,1]},"o":{"x":[0.5,0.5,0.333],"y":[0,0,0]},"t":203,"s":[30,30,100]},{"i":{"x":[0.5,0.5,0.667],"y":[1,1,1]},"o":{"x":[0.5,0.5,0.333],"y":[0,0,0]},"t":213,"s":[20,20,100]},{"t":223,"s":[30,30,100]}],"ix":6,"l":2}},"ao":0,"ef":[{"ty":25,"nm":"Drop Shadow","np":8,"mn":"ADBE Drop Shadow","ix":1,"en":1,"ef":[{"ty":2,"nm":"Shadow Color","mn":"ADBE Drop Shadow-0001","ix":1,"v":{"a":0,"k":[0,0,0,1],"ix":1}},{"ty":0,"nm":"Opacity","mn":"ADBE Drop Shadow-0002","ix":2,"v":{"a":0,"k":63.75,"ix":2}},{"ty":0,"nm":"Direction","mn":"ADBE Drop Shadow-0003","ix":3,"v":{"a":0,"k":180,"ix":3}},{"ty":0,"nm":"Distance","mn":"ADBE Drop Shadow-0004","ix":4,"v":{"a":0,"k":8,"ix":4}},{"ty":0,"nm":"Softness","mn":"ADBE Drop Shadow-0005","ix":5,"v":{"a":0,"k":30,"ix":5}},{"ty":7,"nm":"Shadow Only","mn":"ADBE Drop Shadow-0006","ix":6,"v":{"a":0,"k":0,"ix":6}}]},{"ty":25,"nm":"Drop Shadow 2","np":8,"mn":"ADBE Drop Shadow","ix":2,"en":1,"ef":[{"ty":2,"nm":"Shadow Color","mn":"ADBE Drop Shadow-0001","ix":1,"v":{"a":0,"k":[0,0,0,1],"ix":1}},{"ty":0,"nm":"Opacity","mn":"ADBE Drop Shadow-0002","ix":2,"v":{"a":0,"k":10.2,"ix":2}},{"ty":0,"nm":"Direction","mn":"ADBE Drop Shadow-0003","ix":3,"v":{"a":0,"k":180,"ix":3}},{"ty":0,"nm":"Distance","mn":"ADBE Drop Shadow-0004","ix":4,"v":{"a":0,"k":0,"ix":4}},{"ty":0,"nm":"Softness","mn":"ADBE Drop Shadow-0005","ix":5,"v":{"a":0,"k":40,"ix":5}},{"ty":7,"nm":"Shadow Only","mn":"ADBE Drop Shadow-0006","ix":6,"v":{"a":0,"k":0,"ix":6}}]}],"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[56,56],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":67,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":50,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.186},"t":178,"s":[-37,67],"to":[15,-7],"ti":[7,20]},{"t":203,"s":[0,0],"h":1}],"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":"Touch","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":178,"op":234,"st":-27,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"press","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":58,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":68,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":103,"s":[100]},{"t":113,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[81.6,123,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.5,0.5,0.667],"y":[1,1,1]},"o":{"x":[0.5,0.5,0.333],"y":[0,0,0]},"t":83,"s":[30,30,100]},{"i":{"x":[0.5,0.5,0.667],"y":[1,1,1]},"o":{"x":[0.5,0.5,0.333],"y":[0,0,0]},"t":93,"s":[20,20,100]},{"t":103,"s":[30,30,100]}],"ix":6,"l":2}},"ao":0,"ef":[{"ty":25,"nm":"Drop Shadow","np":8,"mn":"ADBE Drop Shadow","ix":1,"en":1,"ef":[{"ty":2,"nm":"Shadow Color","mn":"ADBE Drop Shadow-0001","ix":1,"v":{"a":0,"k":[0,0,0,1],"ix":1}},{"ty":0,"nm":"Opacity","mn":"ADBE Drop Shadow-0002","ix":2,"v":{"a":0,"k":63.75,"ix":2}},{"ty":0,"nm":"Direction","mn":"ADBE Drop Shadow-0003","ix":3,"v":{"a":0,"k":180,"ix":3}},{"ty":0,"nm":"Distance","mn":"ADBE Drop Shadow-0004","ix":4,"v":{"a":0,"k":8,"ix":4}},{"ty":0,"nm":"Softness","mn":"ADBE Drop Shadow-0005","ix":5,"v":{"a":0,"k":30,"ix":5}},{"ty":7,"nm":"Shadow Only","mn":"ADBE Drop Shadow-0006","ix":6,"v":{"a":0,"k":0,"ix":6}}]},{"ty":25,"nm":"Drop Shadow 2","np":8,"mn":"ADBE Drop Shadow","ix":2,"en":1,"ef":[{"ty":2,"nm":"Shadow Color","mn":"ADBE Drop Shadow-0001","ix":1,"v":{"a":0,"k":[0,0,0,1],"ix":1}},{"ty":0,"nm":"Opacity","mn":"ADBE Drop Shadow-0002","ix":2,"v":{"a":0,"k":10.2,"ix":2}},{"ty":0,"nm":"Direction","mn":"ADBE Drop Shadow-0003","ix":3,"v":{"a":0,"k":180,"ix":3}},{"ty":0,"nm":"Distance","mn":"ADBE Drop Shadow-0004","ix":4,"v":{"a":0,"k":0,"ix":4}},{"ty":0,"nm":"Softness","mn":"ADBE Drop Shadow-0005","ix":5,"v":{"a":0,"k":40,"ix":5}},{"ty":7,"nm":"Shadow Only","mn":"ADBE Drop Shadow-0006","ix":6,"v":{"a":0,"k":0,"ix":6}}]}],"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[56,56],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":67,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":50,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.186},"t":58,"s":[-37,67],"to":[15,-7],"ti":[7,20]},{"t":83,"s":[0,0],"h":1}],"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":"Touch","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":58,"op":114,"st":-147,"bm":0},{"ddd":0,"ind":7,"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":[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":[[5.52,0],[0,0],[0,-5.52],[0,0],[-5.52,0],[0,0],[0,5.52],[0,0]],"o":[[0,0],[-5.52,0],[0,0],[0,5.52],[0,0],[5.52,0],[0,0],[0,-5.52]],"v":[[152,-102],[-152,-102],[-162,-92],[-162,92],[-152,102],[152,102],[162,92],[162,-92]],"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.14],[0,0],[4.14,0],[0,0],[0,4.14],[0,0],[-4.14,0]],"o":[[4.14,0],[0,0],[0,4.14],[0,0],[-4.14,0],[0,0],[0,-4.14],[0,0]],"v":[[152,-99.5],[159.5,-92],[159.5,92],[152,99.5],[-152,99.5],[-159.5,92],[-159.5,-92],[-152,-99.5]],"c":true},"ix":2},"nm":"Path 2","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":[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":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":630,"st":30,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"dialogue","parent":18,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[142.3,75.25,0],"ix":2,"l":2},"a":{"a":0,"k":[142.3,75.25,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,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-6.5,0],[6.5,0]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.909803926945,0.917647063732,0.929411768913,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":2,"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":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[136.5,77.2],"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":"Layer 41","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":[[0,0],[0,0]],"v":[[-12.3,0],[12.3,0]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.909803926945,0.917647063732,0.929411768913,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":2,"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":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[142.3,73.3],"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":"Layer 40","np":1,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":93,"op":693,"st":93,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"dialogue_2","parent":18,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[119,75.6,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.59,0],[0,3.59],[3.59,0],[0,-3.59]],"o":[[3.59,0],[0,-3.59],[-3.59,0],[0,3.59]],"v":[[0,6.5],[6.5,0],[0,-6.5],[-6.5,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.909803981407,0.941176530427,0.996078491211,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":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":93,"op":693,"st":93,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"dialogue_3","parent":18,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[203.05,75.6,0],"ix":2,"l":2},"a":{"a":0,"k":[203.05,75.6,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":[[-2.04,0],[0,2.04],[2.04,0],[0,-2.04]],"o":[[2.04,0],[0,-2.04],[-2.04,0],[0,2.04]],"v":[[0,3.7],[3.7,0],[0,-3.7],[-3.7,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.909803981407,0.941176530427,0.996078491211,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":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[213.8,75.6],"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":"Layer 38","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.04,0],[0,2.04],[2.04,0],[0,-2.04]],"o":[[2.04,0],[0,-2.04],[-2.04,0],[0,2.04]],"v":[[0,3.7],[3.7,0],[0,-3.7],[-3.7,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.909803981407,0.941176530427,0.996078491211,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":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[203.2,75.6],"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":"Layer 37","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.04,0],[0,2.04],[2.04,0],[0,-2.04]],"o":[[2.04,0],[0,-2.04],[-2.04,0],[0,2.04]],"v":[[0,3.7],[3.7,0],[0,-3.7],[-3.7,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.909803981407,0.941176530427,0.996078491211,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":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[192.3,75.6],"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":"Layer 36","np":1,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false}],"ip":93,"op":693,"st":93,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":".grey300","cl":"grey300","parent":18,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[164.7,86.5,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,0]],"o":[[0,0],[0,0]],"v":[[-56.7,0],[56.7,0]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.854901960784,0.862745098039,0.878431372549,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0.49,"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":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":93,"op":693,"st":93,"bm":0},{"ddd":0,"ind":12,"ty":4,"nm":".blue100","cl":"blue100","parent":18,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[127.4,220.3,0],"ix":2,"l":2},"a":{"a":0,"k":[127.4,220.3,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":[[-1.99,0],[0,1.99],[1.99,0],[0,-1.99]],"o":[[1.99,0],[0,-1.99],[-1.99,0],[0,1.99]],"v":[[0,3.6],[3.6,0],[0,-3.6],[-3.6,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.909803981407,0.941176530427,0.996078491211,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":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[137.9,220.3],"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":"Layer 34","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":[[-1.99,0],[0,1.99],[1.99,0],[0,-1.99]],"o":[[1.99,0],[0,-1.99],[-1.99,0],[0,1.99]],"v":[[0,3.6],[3.6,0],[0,-3.6],[-3.6,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.909803981407,0.941176530427,0.996078491211,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":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[127.4,220.3],"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":"Layer 33","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":[[-1.99,0],[0,1.99],[1.99,0],[0,-1.99]],"o":[[1.99,0],[0,-1.99],[-1.99,0],[0,1.99]],"v":[[0,3.6],[3.6,0],[0,-3.6],[-3.6,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.909803981407,0.941176530427,0.996078491211,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":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[116.9,220.3],"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":"Layer 32","np":1,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false}],"ip":93,"op":693,"st":93,"bm":0},{"ddd":0,"ind":13,"ty":4,"nm":".grey200","cl":"grey200","parent":18,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[147.55,138.55,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.1,"y":1},"o":{"x":0.3,"y":0},"t":93,"s":[{"i":[[3.5,0],[0,0],[0,3.5],[0,0],[-3.5,0],[0,0],[0,-3.5],[0,0]],"o":[[0,0],[-3.5,0],[0,0],[0,-3.5],[0,0],[3.5,0],[0,0],[-0.1,3.5]],"v":[[-27.616,6.525],[-27.65,6.55],[-34.05,0.15],[-34.05,-0.15],[-27.65,-6.55],[-27.616,-6.575],[-21.216,-0.175],[-21.216,0.125]],"c":true}]},{"t":143,"s":[{"i":[[3.5,0],[0,0],[0,3.5],[0,0],[-3.5,0],[0,0],[0,-3.5],[0,0]],"o":[[0,0],[-3.5,0],[0,0],[0,-3.5],[0,0],[3.5,0],[0,0],[-0.1,3.5]],"v":[[27.65,6.55],[-27.65,6.55],[-34.05,0.15],[-34.05,-0.15],[-27.65,-6.55],[27.65,-6.55],[34.05,-0.15],[34.05,0.15]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.909803921569,0.917647058824,0.929411764706,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":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":93,"op":693,"st":93,"bm":0},{"ddd":0,"ind":14,"ty":4,"nm":".blue100","cl":"blue100","parent":18,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[181.55,155.65,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.1,"y":1},"o":{"x":0.3,"y":0},"t":93,"s":[{"i":[[3.5,0],[0,0],[0,3.5],[0,0],[-3.5,0],[0,0],[0,-3.5],[0,0]],"o":[[0,0],[-3.5,0],[0,0],[0,-3.5],[0,0],[3.5,0],[0,0],[0,3.5]],"v":[[27.65,6.55],[27.803,6.525],[21.403,0.125],[21.403,-0.175],[27.803,-6.575],[27.65,-6.55],[34.05,-0.15],[34.05,0.15]],"c":true}]},{"t":143,"s":[{"i":[[3.5,0],[0,0],[0,3.5],[0,0],[-3.5,0],[0,0],[0,-3.5],[0,0]],"o":[[0,0],[-3.5,0],[0,0],[0,-3.5],[0,0],[3.5,0],[0,0],[0,3.5]],"v":[[27.65,6.55],[-27.65,6.55],[-34.05,0.15],[-34.05,-0.15],[-27.65,-6.55],[27.65,-6.55],[34.05,-0.15],[34.05,0.15]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.909803981407,0.941176530427,0.996078491211,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":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":93,"op":693,"st":93,"bm":0},{"ddd":0,"ind":15,"ty":4,"nm":".blue100","cl":"blue100","parent":18,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[181.55,175.1,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.1,"y":1},"o":{"x":0.3,"y":0},"t":93,"s":[{"i":[[4.9,0],[0,0],[0,4.9],[-4.9,0],[0,0],[0,-4.9]],"o":[[0,0],[-4.9,0],[0,-4.9],[0,0],[4.9,0],[0,4.9]],"v":[[25.15,8.9],[25.225,8.85],[16.325,-0.05],[25.225,-8.95],[25.15,-8.9],[34.05,0]],"c":true}]},{"t":143,"s":[{"i":[[4.9,0],[0,0],[0,4.9],[-4.9,0],[0,0],[0,-4.9]],"o":[[0,0],[-4.9,0],[0,-4.9],[0,0],[4.9,0],[0,4.9]],"v":[[25.15,8.9],[-25.15,8.9],[-34.05,0],[-25.15,-8.9],[25.15,-8.9],[34.05,0]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.909803981407,0.941176530427,0.996078491211,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":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":93,"op":693,"st":93,"bm":0},{"ddd":0,"ind":16,"ty":4,"nm":"pill_2","parent":18,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[147.35,195.05,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.1,"y":1},"o":{"x":0.3,"y":0},"t":93,"s":[{"i":[[3.5,0],[0,0],[0,3.5],[0,0],[-3.5,0],[0,0],[0,-3.5],[0,0]],"o":[[0,0],[-3.5,0],[0,0],[0,-3.5],[0,0],[3.5,0],[0,0],[-0.1,3.5]],"v":[[-27.475,6.525],[-27.65,6.55],[-34.05,0.15],[-34.05,-0.15],[-27.65,-6.55],[-27.475,-6.575],[-21.075,-0.175],[-21.075,0.125]],"c":true}]},{"t":143,"s":[{"i":[[3.5,0],[0,0],[0,3.5],[0,0],[-3.5,0],[0,0],[0,-3.5],[0,0]],"o":[[0,0],[-3.5,0],[0,0],[0,-3.5],[0,0],[3.5,0],[0,0],[-0.1,3.5]],"v":[[27.65,6.55],[-27.65,6.55],[-34.05,0.15],[-34.05,-0.15],[-27.65,-6.55],[27.65,-6.55],[34.05,-0.15],[34.05,0.15]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.909803926945,0.917647063732,0.929411768913,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":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":93,"op":693,"st":93,"bm":0},{"ddd":0,"ind":17,"ty":4,"nm":"pill_3","parent":18,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[180.2,220.5,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.1,"y":1},"o":{"x":0.3,"y":0},"t":93,"s":[{"i":[[3.6,0],[0,0],[0,3.6],[-3.6,0],[0,0],[0,-3.6]],"o":[[0,0],[-3.6,0],[0,-3.6],[0,0],[3.6,0],[0,3.6]],"v":[[28.9,6.5],[29.1,6.5],[22.6,0],[29.1,-6.5],[28.9,-6.5],[35.4,0]],"c":true}]},{"t":143,"s":[{"i":[[3.6,0],[0,0],[0,3.6],[-3.6,0],[0,0],[0,-3.6]],"o":[[0,0],[-3.6,0],[0,-3.6],[0,0],[3.6,0],[0,3.6]],"v":[[28.9,6.5],[-28.9,6.5],[-35.4,0],[-28.9,-6.5],[28.9,-6.5],[35.4,0]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.909803926945,0.917647063732,0.929411768913,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":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":93,"op":693,"st":93,"bm":0},{"ddd":0,"ind":18,"ty":4,"nm":"dialogue box","parent":24,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[23.991,0.004,0],"ix":2,"l":2},"a":{"a":0,"k":[99.991,88.004,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.1,0.1,0.833],"y":[1,1,1]},"o":{"x":[0.3,0.3,0.167],"y":[0,0,0]},"t":93,"s":[0,0,100]},{"i":{"x":[0.1,0.1,0.833],"y":[1,1,1]},"o":{"x":[0.3,0.3,0.167],"y":[0,0,0]},"t":143,"s":[100,100,100]},{"i":{"x":[0.1,0.1,0.833],"y":[1,1,1]},"o":{"x":[0.3,0.3,0.167],"y":[0,0,0]},"t":213,"s":[100,100,100]},{"t":255,"s":[0,0,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":[[2.6,0],[0,0],[0,2.6],[0,0],[-2.6,0],[0,0],[0,-2.6],[0,0]],"o":[[0,0],[-2.6,0],[0,0],[0,-2.6],[0,0],[2.6,0],[0,0],[0,2.6]],"v":[[51.95,86.4],[-51.95,86.4],[-56.65,81.7],[-56.65,-81.7],[-51.95,-86.4],[51.95,-86.4],[56.65,-81.7],[56.65,81.7]],"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":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[164.75,150.4],"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":"Layer 26","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]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[0,-7.997],[-7.997,0],[0,7.997],[7.997,0]],"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":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[107.989,88.004],"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":"Layer 25","np":1,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":93,"op":693,"st":9,"bm":0},{"ddd":0,"ind":19,"ty":4,"nm":"matte 2","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":[[4.42,0],[0,0],[0,4.42],[0,0],[-4.42,0],[0,0],[0,-4.42],[0,0]],"o":[[0,0],[-4.42,0],[0,0],[0,-4.42],[0,0],[4.42,0],[0,0],[0,4.42]],"v":[[152,100.5],[-152,100.5],[-160,92.5],[-160,-92.5],[-152,-100.5],[152,-100.5],[160,-92.5],[160,92.5]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.235294117647,0.250980392157,0.262745098039,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":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":630,"st":30,"bm":0},{"ddd":0,"ind":20,"ty":4,"nm":".blue600","cl":"blue600","parent":24,"tt":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[7,5,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.209,0],[0,2.209],[2.209,0],[0,-2.209]],"o":[[2.209,0],[0,-2.209],[-2.209,0],[0,2.209]],"v":[[0,4],[4,0],[0,-4],[-4,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","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":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":630,"st":30,"bm":0},{"ddd":0,"ind":21,"ty":4,"nm":"matte 3","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":[[4.42,0],[0,0],[0,4.42],[0,0],[-4.42,0],[0,0],[0,-4.42],[0,0]],"o":[[0,0],[-4.42,0],[0,0],[0,-4.42],[0,0],[4.42,0],[0,0],[0,4.42]],"v":[[152,100.5],[-152,100.5],[-160,92.5],[-160,-92.5],[-152,-100.5],[152,-100.5],[160,-92.5],[160,92.5]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.235294117647,0.250980392157,0.262745098039,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":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":630,"st":30,"bm":0},{"ddd":0,"ind":22,"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":1,"k":[{"i":{"x":0.1,"y":1},"o":{"x":0.9,"y":0},"t":0,"s":[28,120,0],"to":[8,0,0],"ti":[-8,0,0]},{"i":{"x":0.1,"y":0.1},"o":{"x":0.9,"y":0.9},"t":80,"s":[76,120,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.1,"y":1},"o":{"x":0.3,"y":0},"t":93,"s":[76,120,0],"to":[0,-5.333,0],"ti":[0,5.333,0]},{"i":{"x":0.1,"y":0.1},"o":{"x":0.3,"y":0.3},"t":143,"s":[76,88,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.3,"y":1},"o":{"x":0.3,"y":0},"t":213,"s":[76,88,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.3,"y":1},"o":{"x":0.8,"y":0},"t":263,"s":[76,120,0],"to":[0,0,0],"ti":[0,0,0]},{"t":303,"s":[28,120,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":[[-4.418,0],[0,4.418],[4.418,0],[0,-4.418]],"o":[[4.418,0],[0,-4.418],[-4.418,0],[0,4.418]],"v":[[0,8],[8,0],[0,-8],[-8,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","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":1,"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":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":630,"st":30,"bm":0},{"ddd":0,"ind":23,"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":[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":[[4.42,0],[0,0],[0,4.42],[0,0],[-4.42,0],[0,0],[0,-4.42],[0,0]],"o":[[0,0],[-4.42,0],[0,0],[0,-4.42],[0,0],[4.42,0],[0,0],[0,4.42]],"v":[[152,100.5],[-152,100.5],[-160,92.5],[-160,-92.5],[-152,-100.5],[152,-100.5],[160,-92.5],[160,92.5]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.235294117647,0.250980392157,0.262745098039,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":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":630,"st":30,"bm":0},{"ddd":0,"ind":24,"ty":4,"nm":".blue200","cl":"blue200","tt":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.1,"y":1},"o":{"x":0.9,"y":0},"t":0,"s":[28,120,0],"to":[8,0,0],"ti":[-8,0,0]},{"i":{"x":0.1,"y":0.1},"o":{"x":0.9,"y":0.9},"t":80,"s":[76,120,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.1,"y":1},"o":{"x":0.3,"y":0},"t":93,"s":[76,120,0],"to":[0,-5.333,0],"ti":[0,5.333,0]},{"i":{"x":0.1,"y":0.1},"o":{"x":0.3,"y":0.3},"t":143,"s":[76,88,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.3,"y":1},"o":{"x":0.3,"y":0},"t":213,"s":[76,88,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.3,"y":1},"o":{"x":0.8,"y":0},"t":263,"s":[76,120,0],"to":[0,0,0],"ti":[0,0,0]},{"t":303,"s":[28,120,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":[[-4.418,0],[0,4.418],[4.418,0],[0,-4.418]],"o":[[4.418,0],[0,-4.418],[-4.418,0],[0,4.418]],"v":[[0,8],[8,0],[0,-8],[-8,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.682352941176,0.796078431373,0.980392156863,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":"Group 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":630,"st":30,"bm":0},{"ddd":0,"ind":25,"ty":4,"nm":".blue50","cl":"blue50","parent":24,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[23.994,0,0],"ix":2,"l":2},"a":{"a":0,"k":[99.994,120,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.1,0.1,0.833],"y":[1,1,1]},"o":{"x":[0.9,0.9,0.167],"y":[0,0,0]},"t":10,"s":[0,0,100]},{"i":{"x":[0.1,0.1,0.833],"y":[1,1,1]},"o":{"x":[0.9,0.9,0.167],"y":[0,0,0]},"t":80,"s":[100,100,100]},{"i":{"x":[0.1,0.1,0.833],"y":[1,1,1]},"o":{"x":[0.3,0.3,0.167],"y":[0,0,0]},"t":93,"s":[100,100,100]},{"t":125,"s":[0,0,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,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-0.001,-7.997],[-7.997,0],[-0.001,7.997],[7.997,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.909803921569,0.941176470588,0.996078431373,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":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[107.992,120],"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":"Layer 12","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.21,0],[0,0],[0,2.21],[0,0],[-2.21,0],[0,0],[0,-2.21],[0,0]],"o":[[0,0],[-2.21,0],[0,0],[0,-2.21],[0,0],[2.21,0],[0,0],[0,2.21]],"v":[[33,15],[-33,15],[-37,11],[-37,-11],[-33,-15],[33,-15],[37,-11],[37,11]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.909803921569,0.941176470588,0.996078431373,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":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[145,120],"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":"Layer 11","np":1,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":136,"st":30,"bm":0},{"ddd":0,"ind":26,"ty":4,"nm":".red600","cl":"red600","parent":27,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.9],"y":[0]},"t":93,"s":[0]},{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.9],"y":[0]},"t":143,"s":[100]},{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.7],"y":[0]},"t":213,"s":[100]},{"t":263,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[7,5,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.209,0],[0,2.209],[2.209,0],[0,-2.209]],"o":[[2.209,0],[0,-2.209],[-2.209,0],[0,2.209]],"v":[[0,4],[4,0],[0,-4],[-4,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.850980392157,0.188235294118,0.145098039216,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":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":93,"op":279,"st":93,"bm":0},{"ddd":0,"ind":27,"ty":4,"nm":".red200","cl":"red200","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.9],"y":[0]},"t":93,"s":[0]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.9],"y":[0]},"t":143,"s":[100]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":213,"s":[100]},{"t":263,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.1,"y":1},"o":{"x":0.3,"y":0},"t":93,"s":[76,120,0],"to":[0,-2,0],"ti":[0,2,0]},{"i":{"x":0.1,"y":0.1},"o":{"x":0.3,"y":0.3},"t":143,"s":[76,108,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.1,"y":1},"o":{"x":0.3,"y":0},"t":213,"s":[76,108,0],"to":[0,2,0],"ti":[0,-2,0]},{"t":263,"s":[76,120,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":[[-4.418,0],[0,4.418],[4.418,0],[0,-4.418]],"o":[[4.418,0],[0,-4.418],[-4.418,0],[0,4.418]],"v":[[0,8],[8,0],[0,-8],[-8,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.964705882353,0.682352941176,0.662745098039,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":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":93,"op":279,"st":93,"bm":0},{"ddd":0,"ind":28,"ty":4,"nm":".yellow600","cl":"yellow600","parent":29,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.9],"y":[0]},"t":93,"s":[0]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.9],"y":[0]},"t":143,"s":[100]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":213,"s":[100]},{"t":263,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[7,5,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.209,0],[0,2.209],[2.209,0],[0,-2.209]],"o":[[2.209,0],[0,-2.209],[-2.209,0],[0,2.209]],"v":[[0,4],[4,0],[0,-4],[-4,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.976470588235,0.670588235294,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":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":93,"op":279,"st":93,"bm":0},{"ddd":0,"ind":29,"ty":4,"nm":".yellow200","cl":"yellow200","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.9],"y":[0]},"t":93,"s":[0]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.9],"y":[0]},"t":143,"s":[100]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":213,"s":[100]},{"t":263,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.1,"y":1},"o":{"x":0.3,"y":0},"t":93,"s":[76,120,0],"to":[0,1.333,0],"ti":[0,-1.333,0]},{"i":{"x":0.1,"y":0.1},"o":{"x":0.3,"y":0.3},"t":143,"s":[76,128,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.1,"y":1},"o":{"x":0.3,"y":0},"t":213,"s":[76,128,0],"to":[0,-1.333,0],"ti":[0,1.333,0]},{"t":263,"s":[76,120,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":[[-4.418,0],[0,4.418],[4.418,0],[0,-4.418]],"o":[[4.418,0],[0,-4.418],[-4.418,0],[0,4.418]],"v":[[0,8],[8,0],[0,-8],[-8,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.992156862745,0.886274509804,0.576470588235,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":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":93,"op":279,"st":93,"bm":0},{"ddd":0,"ind":30,"ty":4,"nm":".green600","cl":"green600","parent":31,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.9],"y":[0]},"t":93,"s":[0]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.9],"y":[0]},"t":143,"s":[100]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":213,"s":[100]},{"t":263,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[7,5,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.209,0],[0,2.209],[2.209,0],[0,-2.209]],"o":[[2.209,0],[0,-2.209],[-2.209,0],[0,2.209]],"v":[[0,4],[4,0],[0,-4],[-4,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.117647058824,0.556862745098,0.243137254902,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":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":93,"op":279,"st":93,"bm":0},{"ddd":0,"ind":31,"ty":4,"nm":".green200","cl":"green200","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.9],"y":[0]},"t":93,"s":[0]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.9],"y":[0]},"t":143,"s":[100]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":213,"s":[100]},{"t":263,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.1,"y":1},"o":{"x":0.3,"y":0},"t":93,"s":[76,120,0],"to":[0,4.667,0],"ti":[0,-4.667,0]},{"i":{"x":0.1,"y":0.1},"o":{"x":0.3,"y":0.3},"t":143,"s":[76,148,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.1,"y":1},"o":{"x":0.3,"y":0},"t":213,"s":[76,148,0],"to":[0,-4.667,0],"ti":[0,4.667,0]},{"t":263,"s":[76,120,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":[[-4.418,0],[0,4.418],[4.418,0],[0,-4.418]],"o":[[4.418,0],[0,-4.418],[-4.418,0],[0,4.418]],"v":[[0,8],[8,0],[0,-8],[-8,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.658823529412,0.854901960784,0.709803921569,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":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":93,"op":279,"st":93,"bm":0},{"ddd":0,"ind":32,"ty":4,"nm":".blue600","cl":"blue600","parent":33,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.9],"y":[0]},"t":93,"s":[0]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.9],"y":[0]},"t":143,"s":[100]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":213,"s":[100]},{"t":263,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[7,5,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.209,0],[0,2.209],[2.209,0],[0,-2.209]],"o":[[2.209,0],[0,-2.209],[-2.209,0],[0,2.209]],"v":[[0,4],[4,0],[0,-4],[-4,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.101960784314,0.450980392157,0.909803921569,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":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":93,"op":279,"st":93,"bm":0},{"ddd":0,"ind":33,"ty":4,"nm":".blue200","cl":"blue200","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.9],"y":[0]},"t":93,"s":[0]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.9],"y":[0]},"t":143,"s":[100]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":213,"s":[100]},{"t":263,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.1,"y":1},"o":{"x":0.3,"y":0},"t":93,"s":[76,120,0],"to":[0,8,0],"ti":[0,-8,0]},{"i":{"x":0.1,"y":0.1},"o":{"x":0.3,"y":0.3},"t":143,"s":[76,168,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.1,"y":1},"o":{"x":0.3,"y":0},"t":213,"s":[76,168,0],"to":[0,-8,0],"ti":[0,8,0]},{"t":263,"s":[76,120,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":[[-4.418,0],[0,4.418],[4.418,0],[0,-4.418]],"o":[[4.418,0],[0,-4.418],[-4.418,0],[0,4.418]],"v":[[0,8],[8,0],[0,-8],[-8,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.682352941176,0.796078431373,0.980392156863,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":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":93,"op":279,"st":93,"bm":0},{"ddd":0,"ind":34,"ty":4,"nm":"plus","parent":35,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.9],"y":[0]},"t":93,"s":[0]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.9],"y":[0]},"t":143,"s":[100]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":213,"s":[100]},{"t":263,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0,0,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,0]],"o":[[0,0],[0,0]],"v":[[-3,0],[3,0]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","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":1,"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":2,"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,0]],"o":[[0,0],[0,0]],"v":[[0,-3],[0,3]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","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":1,"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":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":93,"op":279,"st":93,"bm":0},{"ddd":0,"ind":35,"ty":4,"nm":"plus circle","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.9],"y":[0]},"t":93,"s":[0]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.9],"y":[0]},"t":143,"s":[100]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":213,"s":[100]},{"t":263,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.1,"y":1},"o":{"x":0.3,"y":0},"t":93,"s":[76,120,0],"to":[0,11.333,0],"ti":[0,-11.333,0]},{"i":{"x":0.1,"y":0.1},"o":{"x":0.3,"y":0.3},"t":143,"s":[76,188,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.1,"y":1},"o":{"x":0.3,"y":0},"t":213,"s":[76,188,0],"to":[0,-11.333,0],"ti":[0,11.333,0]},{"t":263,"s":[76,120,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":[[-4.418,0],[0,4.418],[4.418,0],[0,-4.418]],"o":[[4.418,0],[0,-4.418],[-4.418,0],[0,4.418]],"v":[[0,8],[8,0],[0,-8],[-8,0]],"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":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":93,"op":279,"st":93,"bm":0},{"ddd":0,"ind":36,"ty":4,"nm":".grey700","cl":"grey700","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":93,"s":[0]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":143,"s":[100]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":213,"s":[100]},{"t":263,"s":[0]}],"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":[[4.42,0],[0,0],[0,4.42],[0,0],[-4.42,0],[0,0],[0,-4.42],[0,0]],"o":[[0,0],[-4.42,0],[0,0],[0,-4.42],[0,0],[4.42,0],[0,0],[0,4.42]],"v":[[152,100.5],[-152,100.5],[-160,92.5],[-160,-92.5],[-152,-100.5],[152,-100.5],[160,-92.5],[160,92.5]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.372549019608,0.388235294118,0.407843137255,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":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":93,"op":693,"st":93,"bm":0},{"ddd":0,"ind":37,"ty":4,"nm":".white","cl":"white","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":[[4.42,0],[0,0],[0,4.42],[0,0],[-4.42,0],[0,0],[0,-4.42],[0,0]],"o":[[0,0],[-4.42,0],[0,0],[0,-4.42],[0,0],[4.42,0],[0,0],[0,4.42]],"v":[[152,100.5],[-152,100.5],[-160,92.5],[-160,-92.5],[-152,-100.5],[152,-100.5],[160,-92.5],[160,92.5]],"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":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":15,"op":693,"st":93,"bm":0},{"ddd":0,"ind":38,"ty":4,"nm":"bottom nav button","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[206,227,0],"ix":2,"l":2},"a":{"a":0,"k":[206,227,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":[[3.5,0],[0,0],[0,3.5],[0,0],[-3.5,0],[0,0],[0,-3.5],[0,0]],"o":[[0,0],[-3.5,0],[0,0],[0,-3.5],[0,0],[3.5,0],[0,0],[-0.1,3.5]],"v":[[27.65,6.55],[-27.65,6.55],[-34.05,0.15],[-34.05,-0.15],[-27.65,-6.55],[27.65,-6.55],[34.05,-0.15],[34.05,0.15]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.854901960784,0.862745098039,0.878431372549,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":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[146.05,227],"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":".grey100","np":1,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false,"cl":"grey100"},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-4.418,0],[0,4.418],[4.418,0],[0,-4.418]],"o":[[4.418,0],[0,-4.418],[-4.418,0],[0,4.418]],"v":[[0,8],[8,0],[0,-8],[-8,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.854901960784,0.862745098039,0.878431372549,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":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[292,227],"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":"Layer 9","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":[[-4.418,0],[0,4.418],[4.418,0],[0,-4.418]],"o":[[4.418,0],[0,-4.418],[-4.418,0],[0,4.418]],"v":[[0,8],[8,0],[0,-8],[-8,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.854901960784,0.862745098039,0.878431372549,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":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[268,227],"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":"Layer 8","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":[[-4.418,0],[0,4.418],[4.418,0],[0,-4.418]],"o":[[4.418,0],[0,-4.418],[-4.418,0],[0,4.418]],"v":[[0,8],[8,0],[0,-8],[-8,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.854901960784,0.862745098039,0.878431372549,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":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[244,227],"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":"Layer 7","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":[[-4.418,0],[0,4.418],[4.418,0],[0,-4.418]],"o":[[4.418,0],[0,-4.418],[-4.418,0],[0,4.418]],"v":[[0,8],[8,0],[0,-8],[-8,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.854901960784,0.862745098039,0.878431372549,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":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[220,227],"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":"Layer 6","np":1,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-4.418,0],[0,4.418],[4.418,0],[0,-4.418]],"o":[[4.418,0],[0,-4.418],[-4.418,0],[0,4.418]],"v":[[0,8],[8,0],[0,-8],[-8,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.854901960784,0.862745098039,0.878431372549,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":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[196,227],"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":"Layer 5","np":1,"cix":2,"bm":0,"ix":6,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":630,"st":0,"bm":0},{"ddd":0,"ind":39,"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":[318,47.25,0],"ix":2,"l":2},"a":{"a":0,"k":[318,47.25,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,0],[-1.38,0],[0,0],[0,-1.38],[0,0]],"o":[[0,-1.38],[0,0],[1.38,0],[0,0],[0,0]],"v":[[-7,0.75],[-4.5,-1.75],[4.5,-1.75],[7,0.75],[1,1.75]],"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":[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":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[337,47.25],"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":"Layer 3","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],[-1.38,0],[0,0],[0,-1.38],[0,0]],"o":[[0,-1.38],[0,0],[1.38,0],[0,0],[0,0]],"v":[[-13.5,0.75],[-11,-1.75],[11,-1.75],[13.5,0.75],[0.5,1.75]],"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":[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":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[305.5,47.25],"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":"Layer 2","np":1,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":630,"st":0,"bm":0},{"ddd":0,"ind":40,"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.46,0],[0,0],[0,15.46],[0,0],[-15.46,0],[0,0],[0,-15.46],[0,0]],"o":[[0,0],[-15.46,0],[0,0],[0,-15.46],[0,0],[15.46,0],[0,0],[0,15.46]],"v":[[178,150],[-178,150],[-206,122],[-206,-122],[-178,-150],[178,-150],[206,-122],[206,122]],"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":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":630,"st":30,"bm":0}],"markers":[]}
\ No newline at end of file
diff --git a/res/raw/face_posture_guidance_lottie.json b/res/raw/face_posture_guidance_lottie.json
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/res/raw/face_posture_guidance_lottie.json
diff --git a/res/values-land/dimens.xml b/res/values-land/dimens.xml
old mode 100755
new mode 100644
index 5248da6..dbf61ac
--- a/res/values-land/dimens.xml
+++ b/res/values-land/dimens.xml
@@ -28,4 +28,9 @@
<!-- Display, Screen zoom -->
<dimen name="screen_zoom_preview_height">160dp</dimen>
+ <!-- Lock pattern view size, align sysui biometric_auth_pattern_view_size -->
+ <dimen name="biometric_auth_pattern_view_size">248dp</dimen>
+ <dimen name="biometric_auth_pattern_view_max_size">348dp</dimen>
+
+ <dimen name="output_switcher_slice_max_height">300dp</dimen>
</resources>
diff --git a/res/values-land/styles.xml b/res/values-land/styles.xml
new file mode 100644
index 0000000..df6ef48
--- /dev/null
+++ b/res/values-land/styles.xml
@@ -0,0 +1,29 @@
+<!--
+ ~ 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.
+ -->
+
+<resources>
+ <style name="LockPatternContainerStyle">
+ <item name="android:maxHeight">@dimen/biometric_auth_pattern_view_max_size</item>
+ <item name="android:maxWidth">@dimen/biometric_auth_pattern_view_max_size</item>
+ <item name="android:minHeight">@dimen/biometric_auth_pattern_view_size</item>
+ <item name="android:minWidth">@dimen/biometric_auth_pattern_view_size</item>
+ <item name="android:gravity">center</item>
+ <item name="android:layout_gravity">bottom</item>
+ <item name="android:paddingBottom">0dp</item>
+ <item name="android:paddingHorizontal">0dp</item>
+ <item name="android:paddingTop">0dp</item>
+ </style>
+</resources>
\ No newline at end of file
diff --git a/res/values-sw360dp/dimens.xml b/res/values-sw360dp/dimens.xml
index 23a1176..07a7bb7 100755
--- a/res/values-sw360dp/dimens.xml
+++ b/res/values-sw360dp/dimens.xml
@@ -25,4 +25,7 @@
<!-- Suggestion cards-->
<dimen name="suggestion_card_padding_bottom_one_card">22dp</dimen>
+ <!-- Lock pattern view size, align sysui biometric_auth_pattern_view_size -->
+ <dimen name="biometric_auth_pattern_view_size">298dp</dimen>
+
</resources>
diff --git a/res/values-sw392dp-land/dimens.xml b/res/values-sw392dp-land/dimens.xml
new file mode 100755
index 0000000..920a0ec
--- /dev/null
+++ b/res/values-sw392dp-land/dimens.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- 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.
+-->
+
+<resources>
+ <!-- Lock pattern view size, align sysui biometric_auth_pattern_view_size -->
+ <dimen name="biometric_auth_pattern_view_size">248dp</dimen>
+ <dimen name="biometric_auth_pattern_view_max_size">248dp</dimen>
+
+</resources>
diff --git a/res/values-sw392dp/dimens.xml b/res/values-sw392dp/dimens.xml
new file mode 100755
index 0000000..f90d4ee
--- /dev/null
+++ b/res/values-sw392dp/dimens.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- 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.
+-->
+
+<resources>
+ <!-- Lock pattern view size, align sysui biometric_auth_pattern_view_size -->
+ <dimen name="biometric_auth_pattern_view_size">298dp</dimen>
+
+</resources>
diff --git a/res/values-sw410dp-land/dimens.xml b/res/values-sw410dp-land/dimens.xml
new file mode 100755
index 0000000..644486d
--- /dev/null
+++ b/res/values-sw410dp-land/dimens.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- 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.
+-->
+
+<resources>
+ <!-- Lock pattern view size, align sysui biometric_auth_pattern_view_size -->
+ <dimen name="biometric_auth_pattern_view_size">248dp</dimen>
+ <dimen name="biometric_auth_pattern_view_max_size">348dp</dimen>
+
+</resources>
diff --git a/res/values-sw410dp/dimens.xml b/res/values-sw410dp/dimens.xml
new file mode 100755
index 0000000..5120e4a
--- /dev/null
+++ b/res/values-sw410dp/dimens.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- 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.
+-->
+
+<resources>
+ <!-- Lock pattern view size, align sysui biometric_auth_pattern_view_size -->
+ <dimen name="biometric_auth_pattern_view_size">348dp</dimen>
+
+</resources>
diff --git a/res/values-sw600dp-land/dimens.xml b/res/values-sw600dp-land/dimens.xml
index 015a6af..2016650 100755
--- a/res/values-sw600dp-land/dimens.xml
+++ b/res/values-sw600dp-land/dimens.xml
@@ -25,4 +25,8 @@
<!-- Padding for screen pinning -->
<dimen name="screen_pinning_padding_start">128dp</dimen>
<dimen name="screen_pinning_padding_end">128dp</dimen>
+
+ <!-- Lock pattern view size, align sysui biometric_auth_pattern_view_size -->
+ <dimen name="biometric_auth_pattern_view_size">298dp</dimen>
+
</resources>
diff --git a/res/values-sw600dp/dimens.xml b/res/values-sw600dp/dimens.xml
index 2e821e0..02ff494 100755
--- a/res/values-sw600dp/dimens.xml
+++ b/res/values-sw600dp/dimens.xml
@@ -55,4 +55,7 @@
<dimen name="screen_pinning_padding_end">40dp</dimen>
<dimen name="settings_panel_width">560dp</dimen>
+
+ <!-- Lock pattern view size, align sysui biometric_auth_pattern_view_size -->
+ <dimen name="biometric_auth_pattern_view_size">348dp</dimen>
</resources>
diff --git a/res/values-sw720dp/dimens.xml b/res/values-sw720dp/dimens.xml
index c701044..6f5bddf 100644
--- a/res/values-sw720dp/dimens.xml
+++ b/res/values-sw720dp/dimens.xml
@@ -38,4 +38,8 @@
<dimen name="wifi_assistant_padding_start_end">24dp</dimen>
<dimen name="wifi_assistant_padding">25dp</dimen>
<dimen name="wifi_assistant_text_padding">24dp</dimen>
+
+ <!-- Lock pattern view size, align sysui biometric_auth_pattern_view_size -->
+ <dimen name="biometric_auth_pattern_view_size">348dp</dimen>
+
</resources>
diff --git a/res/values-sw800dp/dimens.xml b/res/values-sw800dp/dimens.xml
new file mode 100644
index 0000000..48392ef
--- /dev/null
+++ b/res/values-sw800dp/dimens.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- 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.
+-->
+
+<resources>
+
+ <!-- Lock pattern view size, align sysui biometric_auth_pattern_view_size -->
+ <dimen name="biometric_auth_pattern_view_size">348dp</dimen>
+</resources>
diff --git a/res/values/config.xml b/res/values/config.xml
index 0b0361a..5cfa188 100755
--- a/res/values/config.xml
+++ b/res/values/config.xml
@@ -283,6 +283,19 @@
<!-- ComponentName to launch a vendor-specific enrollment activity if available -->
<string name="config_face_enroll" translatable="false"></string>
+ <!-- ComponentName to launch a vendor-specific posture guidance activity if available -->
+ <string name="config_face_enroll_guidance_page" translatable="false"></string>
+
+ <!-- Whether to support posture listening for face auth, default is 0(DEVICE_POSTURE_UNKNOWN)
+ means setting will try listening on device posture changes.
+ 0 : DEVICE_POSTURE_UNKNOWN
+ 1 : DEVICE_POSTURE_CLOSED
+ 2 : DEVICE_POSTURE_HALF_OPENED
+ 3 : DEVICE_POSTURE_OPENED
+ 4 : DEVICE_POSTURE_FLIPPED
+ -->
+ <integer name="config_face_enroll_supported_posture">0</integer>
+
<!-- Whether to show the "less secure" info section on the face enroll intro screen -->
<bool name="config_face_intro_show_less_secure">false</bool>
@@ -292,6 +305,9 @@
<!-- Whether to use the Lottie animation for the face education enrollment screen -->
<bool name="config_face_education_use_lottie">false</bool>
+ <!-- Whether to support enrollment during setup wizard flow -->
+ <bool name="config_suw_support_face_enroll">true</bool>
+
<!-- App intent -->
<string name="config_account_intent_uri" translatable="false"></string>
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index afb6f68..5992a61 100755
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -242,6 +242,10 @@
<item name="face_preview_scale" format="float" type="dimen">1.0</item>
<dimen name="face_enroll_intro_illustration_margin_bottom">0dp</dimen>
+ <!-- Lock pattern view size, align sysui biometric_auth_pattern_view_size -->
+ <dimen name="biometric_auth_pattern_view_size">348dp</dimen>
+ <dimen name="biometric_auth_pattern_view_max_size">@dimen/biometric_auth_pattern_view_size</dimen>
+
<!-- Confirm device credentials -->
<dimen name="confirm_credentials_security_method_margin">48dp</dimen>
<dimen name="confirm_credentials_layout_width">@dimen/match_parent</dimen>
@@ -513,4 +517,19 @@
<dimen name="qrcode_icon_size">27dp</dimen>
<!-- Margin for SD card setup completion Image -->
<dimen name="setup_completion_margin_top">88dp</dimen>
+
+ <!-- Biometrics Face enroll education dimensions-->
+ <dimen name="face_enroll_icon_large_width">300dp</dimen>
+ <dimen name="face_enroll_icon_large_height">300dp</dimen>
+ <dimen name="illustration_lottie_height">440dp</dimen>
+ <dimen name="illustration_accessibility_margin_top">0dp</dimen>
+ <dimen name="face_enroll_education_lottie_frame_margin_top">-24dp</dimen>
+ <dimen name="lottie_animation_view_margin_top">-52dp</dimen>
+ <dimen name="limited_vision_button_frame_margin_top">-24dp</dimen>
+ <dimen name="limited_vision_button_margin_top">0dp</dimen>
+ <dimen name="limited_vision_button_margin_bottom">0dp</dimen>
+ <dimen name="limited_vision_button_toggle_margin_top">0dp</dimen>
+
+ <!-- Default margin for side fps enroll find sensor lottie -->
+ <dimen name="sfps_enroll_find_sensor_lottie_margin">0dp</dimen>
</resources>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index a76cfe8..a5ffb8d 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -1217,11 +1217,11 @@
<!-- Message shown in fingerprint enrollment dialog to locate the sensor -->
<string name="security_settings_fingerprint_enroll_find_sensor_message">It\u2019s on the back of your phone. Use your index finger.</string>
<!-- Message shown in SFPS enrollment dialog to locate the sensor (tablet) [CHAR LIMIT=NONE]-->
- <string name="security_settings_sfps_enroll_find_sensor_message" product="tablet">The fingerprint sensor is on the power button. It’s the flat button next to the raised volume button on the edge of the tablet.\n\nPressing the power button turns off the screen.</string>
+ <string name="security_settings_sfps_enroll_find_sensor_message" product="tablet">The fingerprint sensor is on the power button. It’s the flat button next to the raised volume button on the edge of the tablet.</string>
<!-- Message shown in SFPS enrollment dialog to locate the sensor (device) [CHAR LIMIT=NONE]-->
- <string name="security_settings_sfps_enroll_find_sensor_message" product="device">The fingerprint sensor is on the power button. It’s the flat button next to the raised volume button on the edge of the device.\n\nPressing the power button turns off the screen.</string>
+ <string name="security_settings_sfps_enroll_find_sensor_message" product="device">The fingerprint sensor is on the power button. It’s the flat button next to the raised volume button on the edge of the device.</string>
<!-- Message shown in SFPS enrollment dialog to locate the sensor (default) [CHAR LIMIT=NONE]-->
- <string name="security_settings_sfps_enroll_find_sensor_message" product="default">The fingerprint sensor is on the power button. It’s the flat button next to the raised volume button on the edge of the phone.\n\nPressing the power button turns off the screen.</string>
+ <string name="security_settings_sfps_enroll_find_sensor_message" product="default">The fingerprint sensor is on the power button. It’s the flat button next to the raised volume button on the edge of the phone.</string>
<!-- Message shown in UDFPS enrollment dialog to locate the sensor [CHAR LIMIT=NONE]-->
<string name="security_settings_udfps_enroll_find_sensor_message">The fingerprint sensor is on your screen. You\u2019ll capture your fingerprint on the next screen.</string>
<!-- Button for starting fingerprint enrollment. [CHAR LIMIT=10]-->
@@ -1290,10 +1290,16 @@
<string name="security_settings_fingerprint_enroll_finish_v2_message" product="device">Now you can use your fingerprint to unlock your device or verify it\u2019s you, like when you sign in to apps or approve a purchase</string>
<!-- Message shown in fingerprint enrollment dialog once enrollment is completed (default) [CHAR LIMIT=NONE] -->
<string name="security_settings_fingerprint_enroll_finish_v2_message" product="default">Now you can use your fingerprint to unlock your phone or verify it\u2019s you, like when you sign in to apps or approve a purchase</string>
+ <!-- Message shown in fingerprint enrollment dialog once enrollment is completed (tablet) [CHAR LIMIT=NONE] -->
+ <string name="security_settings_fingerprint_enroll_finish_v2_add_fingerprint_message" product="tablet">Now you can use your fingerprint to unlock your tablet or verify it\u2019s you, like when you sign in to apps or approve a purchase. \n\nAdd another fingerprint so it\u2019s easier to unlock when you hold your tablet in different ways.</string>
+ <!-- Message shown in fingerprint enrollment dialog once enrollment is completed (device) [CHAR LIMIT=NONE] -->
+ <string name="security_settings_fingerprint_enroll_finish_v2_add_fingerprint_message" product="device">Now you can use your fingerprint to unlock your device or verify it\u2019s you, like when you sign in to apps or approve a purchase.\n\nAdd another fingerprint so it\u2019s easier to unlock when you hold your device in different ways.</string>
+ <!-- Message shown in fingerprint enrollment dialog once enrollment is completed (default) [CHAR LIMIT=NONE] -->
+ <string name="security_settings_fingerprint_enroll_finish_v2_add_fingerprint_message" product="default">Now you can use your fingerprint to unlock your phone or verify it\u2019s you, like when you sign in to apps or approve a purchase.\n\nAdd another fingerprint so it\u2019s easier to unlock when you hold your phone in different ways.</string>
<!-- Title for require screen on to auth toggle shown in fingerprint enrollment dialog once enrollment is completed. [CHAR LIMIT=NONE] -->
- <string name="security_settings_require_screen_on_to_auth_title">Unlock only when screen is on</string>
+ <string name="security_settings_require_screen_on_to_auth_title">Touch to unlock anytime</string>
<!-- Description for require screen on to auth toggle shown in fingerprint enrollment dialog once enrollment is completed. [CHAR LIMIT=NONE] -->
- <string name="security_settings_require_screen_on_to_auth_description">The screen must be on before you can unlock with your fingerprint. This makes accidental unlocking less likely.</string>
+ <string name="security_settings_require_screen_on_to_auth_description">Touch the sensor to unlock, even when the screen is off. This makes accidental unlocking more likely.</string>
<!-- Description for require screen on to auth toggle shown in fingerprint enrollment dialog once enrollment is completed. [CHAR LIMIT=NONE] -->
<string name="security_settings_require_screen_on_to_auth_keywords">Screen, Unlock</string>
<!-- Button text to skip enrollment of fingerprint [CHAR LIMIT=40] -->
@@ -1411,6 +1417,8 @@
<string name="security_settings_fingerprint_enroll_touch_dialog_title">Whoops, that\u2019s not the sensor</string>
<!-- Dialog message for dialog which shows when user touches the icon on the screen, instead of the sensor at the back [CHAR LIMIT=NONE] -->
<string name="security_settings_fingerprint_enroll_touch_dialog_message">Touch the sensor on the back of your phone. Use your index finger.</string>
+ <!-- Dialog message for dialog which shows when finger cannot be processed in enrollment. [CHAR LIMIT=45] -->
+ <string name="security_settings_fingerprint_enroll_error_unable_to_process_dialog_title">Enrollment was not completed</string>
<!-- Dialog message for dialog which shows when finger cannot be enrolled. [CHAR LIMIT=45] -->
<string name="security_settings_fingerprint_enroll_error_dialog_title">Fingerprint setup timed out</string>
<!-- Dialog message for dialog which shows when finger cannot be enrolled due to being idle too long. -->
@@ -8971,7 +8979,7 @@
<!-- Do not disturb: Hide notifications summary [CHAR LIMIT=NONE] -->
<string name="zen_mode_restrict_notifications_hide_summary">You won\u2019t see or hear notifications</string>
<!-- Do not disturb: Hide notifications footer [CHAR LIMIT=NONE] -->
- <string name="zen_mode_restrict_notifications_hide_footer">Your phone won\u2019t show, vibrate or make sound for new or existing notifications. Keep in mind, critical notifications for phone activity and status will still appear.\n\nWhen you turn off Do Not Disturb, find missed notifications by swiping down from the top of your screen.</string>
+ <string name="zen_mode_restrict_notifications_hide_footer">Your phone won\u2019t show, vibrate or make sound for new or existing notifications. Keep in mind, critical notifications for device activity and status will still appear.\n\nWhen you turn off Do Not Disturb, find missed notifications by swiping down from the top of your screen.</string>
<!-- Do not disturb: Custom settings option [CHAR LIMIT=60] -->
<string name="zen_mode_restrict_notifications_custom">Custom</string>
<!-- Do not disturb: restrict notifications page, menu option [CHAR LIMIT=60] -->
@@ -9021,7 +9029,7 @@
<!-- Do not disturb: what to block summary, all effects -->
<string name="zen_mode_block_effect_summary_all">Sound, vibration, and visual signs of notifications</string>
- <string name="zen_mode_blocked_effects_footer">Notifications needed for basic phone activity and status will never be hidden.</string>
+ <string name="zen_mode_blocked_effects_footer">Notifications needed for basic device activity and status will never be hidden.</string>
<!-- Do not disturb: Zen mode no sounds are exceptions to bypass do not disturb-->
<string name="zen_mode_no_exceptions">None</string>
@@ -9418,6 +9426,12 @@
<!-- Configure Notifications: Title for the option controlling notifications for work profile. [CHAR LIMIT=30] -->
<string name="locked_work_profile_notification_title">When work profile is locked</string>
+ <!-- Configure notifications: Title for the option controlling whether only new notifications are displayed to the user
+ on the lock screen [CHAR LIMIT=60] -->
+ <string name="unseen_notifs_lock_screen">Show only new notifications on lock screen</string>
+
+ <!-- Configure notifications: Summary for option of showing only new notifications on the lock screen. [CHAR LIMIT=100] -->
+ <string name="unseen_notifs_lock_screen_summary">After each unlock, remove existing notifications from the lock screen</string>
<!-- Configure notifications: Title for determining which notifications appear on the lock screen [CHAR LIMIT=60] -->
<string name="lock_screen_notifs_title">Notifications on lock screen</string>
@@ -9929,7 +9943,7 @@
<string name="loading_notification_apps">Loading apps\u2026</string>
<!-- [CHAR LIMIT=NONE] Text appearing when app notifications are off -->
- <string name="app_notifications_off_desc">At your request, Android is blocking this app\'s notifications from appearing on this device</string>
+ <string name="app_notifications_off_desc">You haven\'t allowed notifications from this app</string>
<!-- [CHAR LIMIT=NONE] Text appearing when channel notifications are off -->
<string name="channel_notifications_off_desc">At your request, Android is blocking this category of notifications from appearing on this device</string>
diff --git a/res/values/styles.xml b/res/values/styles.xml
index 4fc6e9f..d270da1 100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -432,10 +432,11 @@
</style>
<style name="LockPatternContainerStyle">
- <item name="android:maxHeight">620dp</item>
- <item name="android:maxWidth">620dp</item>
- <item name="android:minHeight">0dp</item>
- <item name="android:minWidth">0dp</item>
+ <item name="android:gravity">center</item>
+ <item name="android:maxHeight">@dimen/biometric_auth_pattern_view_max_size</item>
+ <item name="android:maxWidth">@dimen/biometric_auth_pattern_view_max_size</item>
+ <item name="android:minHeight">@dimen/biometric_auth_pattern_view_size</item>
+ <item name="android:minWidth">@dimen/biometric_auth_pattern_view_size</item>
<item name="android:paddingBottom">0dp</item>
<item name="android:paddingHorizontal">0dp</item>
<item name="android:paddingTop">0dp</item>
@@ -448,6 +449,12 @@
<item name="*android:dotColor">?android:attr/textColorSecondary</item>
</style>
+ <style name="LockPatternButtonStyle" parent="@style/SudGlifButton.Tertiary">
+ <item name="android:layout_marginStart">@dimen/sud_glif_button_margin_start</item>
+ <item name="android:layout_marginEnd">@dimen/sud_glif_button_margin_end</item>
+ <item name="android:layout_gravity">start|top</item>
+ </style>
+
<style name="device_info_dialog_label">
<item name="android:textAlignment">viewStart</item>
<item name="android:fontFamily">@*android:string/config_headlineFontFamily</item>
diff --git a/res/xml/bubble_notification_settings.xml b/res/xml/bubble_notification_settings.xml
index 82a89a3..651781b 100644
--- a/res/xml/bubble_notification_settings.xml
+++ b/res/xml/bubble_notification_settings.xml
@@ -26,7 +26,8 @@
<com.android.settingslib.widget.IllustrationPreference
android:key="bubbles_illustration"
settings:searchable="false"
- app:lottie_rawRes="@raw/lottie_bubbles"/>
+ app:lottie_rawRes="@raw/lottie_bubbles"
+ settings:controller="com.android.settings.notification.BubbleNotificationIllustrationPreferenceController"/>
<com.android.settingslib.widget.MainSwitchPreference
android:key="global_notification_bubbles"
diff --git a/res/xml/configure_notification_settings.xml b/res/xml/configure_notification_settings.xml
index 96a3f85..27d5760 100644
--- a/res/xml/configure_notification_settings.xml
+++ b/res/xml/configure_notification_settings.xml
@@ -119,9 +119,16 @@
android:fragment="com.android.settings.notification.zen.ZenModeSettings"
settings:controller="com.android.settings.notification.zen.ZenModePreferenceController"
/>
+ <SwitchPreference
+ android:key="lock_screen_show_only_unseen_notifs"
+ android:order="18"
+ android:title="@string/unseen_notifs_lock_screen"
+ android:summary="@string/unseen_notifs_lock_screen_summary"
+ settings:controller="com.android.settings.notification.ShowOnlyUnseenNotificationsOnLockscreenPreferenceController"
+ />
<com.android.settingslib.RestrictedPreference
android:key="app_and_notif_cell_broadcast_settings"
- android:order="18"
+ android:order="19"
android:title="@string/cell_broadcast_settings"
settings:useAdminDisabledSummary="true">
<intent
@@ -132,33 +139,33 @@
<SwitchPreference
android:key="silent_icons"
- android:order="19"
+ android:order="20"
android:title="@string/silent_notifications_status_bar"
settings:controller="com.android.settings.notification.SilentStatusBarPreferenceController"/>
<SwitchPreference
android:key="show_snooze_options"
- android:order="20"
+ android:order="21"
android:title="@string/snooze_options_title"
settings:controller="com.android.settings.notification.SnoozeNotificationPreferenceController" />
<!-- Notification badging -->
<SwitchPreference
android:key="notification_badging"
- android:order="21"
+ android:order="22"
android:title="@string/notification_badging_title"
settings:controller="com.android.settings.notification.BadgingNotificationPreferenceController"/>
<!-- Pulse notification light, on devices that support it -->
<SwitchPreference
android:key="notification_pulse"
- android:order="22"
+ android:order="23"
android:title="@string/notification_pulse_title"
settings:controller="com.android.settings.notification.PulseNotificationPreferenceController"/>
<com.android.settingslib.PrimarySwitchPreference
android:key="notification_assistant"
- android:order="23"
+ android:order="24"
android:title="@string/notification_assistant_title"
android:summary="@string/notification_assistant_summary"
settings:controller="com.android.settings.notification.NotificationAssistantPreferenceController"/>
diff --git a/res/xml/network_provider_internet.xml b/res/xml/network_provider_internet.xml
index 9669cf0..e5a9fca 100644
--- a/res/xml/network_provider_internet.xml
+++ b/res/xml/network_provider_internet.xml
@@ -50,7 +50,8 @@
settings:keywords="@string/keywords_more_mobile_networks"
settings:userRestriction="no_config_mobile_networks"
settings:allowDividerAbove="true"
- settings:useAdminDisabledSummary="true" />
+ settings:useAdminDisabledSummary="true"
+ settings:searchable="@bool/config_show_sim_info"/>
<com.android.settingslib.RestrictedSwitchPreference
android:key="airplane_mode"
diff --git a/res/xml/sound_settings.xml b/res/xml/sound_settings.xml
index 914ce72..a84b0ae 100644
--- a/res/xml/sound_settings.xml
+++ b/res/xml/sound_settings.xml
@@ -72,6 +72,14 @@
android:order="-160"
settings:controller="com.android.settings.notification.RingVolumePreferenceController"/>
+ <!-- Separate Ring volume -->
+ <com.android.settings.notification.VolumeSeekBarPreference
+ android:key="separate_ring_volume"
+ android:icon="@drawable/ic_ring_volume"
+ android:title="@string/separate_ring_volume_option_title"
+ android:order="-155"
+ settings:controller="com.android.settings.notification.SeparateRingVolumePreferenceController"/>
+
<!-- Notification volume -->
<com.android.settings.notification.VolumeSeekBarPreference
android:key="notification_volume"
@@ -88,7 +96,7 @@
android:title="@string/alarm_volume_option_title"
android:order="-140"
settings:controller="com.android.settings.notification.AlarmVolumePreferenceController"/>
-x
+
<!-- TODO(b/174964721): make this a PrimarySwitchPreference -->
<!-- Interruptions -->
<com.android.settingslib.RestrictedPreference
diff --git a/res/xml/top_level_settings.xml b/res/xml/top_level_settings.xml
index 8c82b67..d050a1f 100644
--- a/res/xml/top_level_settings.xml
+++ b/res/xml/top_level_settings.xml
@@ -196,7 +196,7 @@
<com.android.settings.widget.HomepagePreference
android:fragment="com.android.settings.deviceinfo.aboutphone.MyDeviceInfoFragment"
- android:icon="@drawable/ic_phone_info"
+ android:icon="@drawable/ic_settings_about_device"
android:key="top_level_about_device"
android:order="20"
android:title="@string/about_settings"
diff --git a/src/com/android/settings/accessibility/AccessibilityDialogUtils.java b/src/com/android/settings/accessibility/AccessibilityDialogUtils.java
index a0cc77e..1f73759 100644
--- a/src/com/android/settings/accessibility/AccessibilityDialogUtils.java
+++ b/src/com/android/settings/accessibility/AccessibilityDialogUtils.java
@@ -55,6 +55,7 @@
import com.android.settings.R;
import com.android.settings.core.SubSettingLauncher;
import com.android.settings.utils.AnnotationSpan;
+import com.android.settingslib.widget.LottieColorUtils;
import com.airbnb.lottie.LottieAnimationView;
import com.airbnb.lottie.LottieDrawable;
@@ -269,10 +270,11 @@
setupShortcutWidgetWithImageResource(view, imageResId);
}
- private static void setupShortcutWidgetWithImageRawResource(View view, CharSequence titleText,
+ private static void setupShortcutWidgetWithImageRawResource(Context context,
+ View view, CharSequence titleText,
CharSequence summaryText, @RawRes int imageRawResId) {
setupShortcutWidgetWithTitleAndSummary(view, titleText, summaryText);
- setupShortcutWidgetWithImageRawResource(view, imageRawResId);
+ setupShortcutWidgetWithImageRawResource(context, view, imageRawResId);
}
private static void setupShortcutWidgetWithTitleAndSummary(View view, CharSequence titleText,
@@ -296,7 +298,7 @@
imageView.setImageResource(imageResId);
}
- private static void setupShortcutWidgetWithImageRawResource(View view,
+ private static void setupShortcutWidgetWithImageRawResource(Context context, View view,
@RawRes int imageRawResId) {
final LottieAnimationView lottieView = view.findViewById(R.id.image);
lottieView.setFailureListener(
@@ -304,6 +306,7 @@
result));
lottieView.setAnimation(imageRawResId);
lottieView.setRepeatCount(LottieDrawable.INFINITE);
+ LottieColorUtils.applyDynamicColors(context, lottieView);
lottieView.playAnimation();
}
@@ -350,7 +353,7 @@
final Object[] arguments = {3};
summary = MessageFormat.format(summary, arguments);
- setupShortcutWidgetWithImageRawResource(dialogView, title, summary,
+ setupShortcutWidgetWithImageRawResource(context, dialogView, title, summary,
R.raw.accessibility_shortcut_type_triple_tap);
}
diff --git a/src/com/android/settings/accessibility/AccessibilityGestureNavigationTutorial.java b/src/com/android/settings/accessibility/AccessibilityGestureNavigationTutorial.java
index 773c987..6dfa324 100644
--- a/src/com/android/settings/accessibility/AccessibilityGestureNavigationTutorial.java
+++ b/src/com/android/settings/accessibility/AccessibilityGestureNavigationTutorial.java
@@ -57,6 +57,7 @@
import androidx.viewpager.widget.ViewPager;
import com.android.settings.R;
+import com.android.settingslib.widget.LottieColorUtils;
import com.airbnb.lottie.LottieAnimationView;
import com.airbnb.lottie.LottieDrawable;
@@ -300,6 +301,7 @@
result));
lottieView.setAnimation(imageRawRes);
lottieView.setRepeatCount(LottieDrawable.INFINITE);
+ LottieColorUtils.applyDynamicColors(context, lottieView);
lottieView.playAnimation();
return illustrationFrame;
diff --git a/src/com/android/settings/accessibility/DisplaySizeData.java b/src/com/android/settings/accessibility/DisplaySizeData.java
index 42a8c46..77ae897 100644
--- a/src/com/android/settings/accessibility/DisplaySizeData.java
+++ b/src/com/android/settings/accessibility/DisplaySizeData.java
@@ -18,9 +18,7 @@
import android.content.Context;
import android.content.res.Resources;
-import android.view.Display;
-import com.android.settingslib.display.DisplayDensityConfiguration;
import com.android.settingslib.display.DisplayDensityUtils;
import java.util.Arrays;
@@ -31,11 +29,13 @@
* Data class for storing the configurations related to the display size.
*/
class DisplaySizeData extends PreviewSizeData<Integer> {
+ private final DisplayDensityUtils mDensity;
+
DisplaySizeData(Context context) {
super(context);
- final DisplayDensityUtils density = new DisplayDensityUtils(getContext());
- final int initialIndex = density.getCurrentIndex();
+ mDensity = new DisplayDensityUtils(getContext());
+ final int initialIndex = mDensity.getCurrentIndexForDefaultDisplay();
if (initialIndex < 0) {
// Failed to obtain default density, which means we failed to
// connect to the window manager service. Just use the current
@@ -46,9 +46,10 @@
setInitialIndex(0);
setValues(Collections.singletonList(densityDpi));
} else {
- setDefaultValue(density.getDefaultDensity());
+ setDefaultValue(mDensity.getDefaultDensityForDefaultDisplay());
setInitialIndex(initialIndex);
- setValues(Arrays.stream(density.getValues()).boxed().collect(Collectors.toList()));
+ setValues(Arrays.stream(mDensity.getDefaultDisplayDensityValues()).boxed()
+ .collect(Collectors.toList()));
}
}
@@ -56,10 +57,9 @@
void commit(int currentProgress) {
final int densityDpi = getValues().get(currentProgress);
if (densityDpi == getDefaultValue()) {
- DisplayDensityConfiguration.clearForcedDisplayDensity(Display.DEFAULT_DISPLAY);
+ mDensity.clearForcedDisplayDensity();
} else {
- DisplayDensityConfiguration.setForcedDisplayDensity(Display.DEFAULT_DISPLAY,
- densityDpi);
+ mDensity.setForcedDisplayDensity(currentProgress);
}
}
}
diff --git a/src/com/android/settings/activityembedding/ActivityEmbeddingRulesController.java b/src/com/android/settings/activityembedding/ActivityEmbeddingRulesController.java
index 03bff7b..803133b 100644
--- a/src/com/android/settings/activityembedding/ActivityEmbeddingRulesController.java
+++ b/src/com/android/settings/activityembedding/ActivityEmbeddingRulesController.java
@@ -36,6 +36,7 @@
import com.android.settings.Settings;
import com.android.settings.SettingsActivity;
import com.android.settings.SubSettings;
+import com.android.settings.biometrics.face.FaceEnrollIntroductionInternal;
import com.android.settings.biometrics.fingerprint.FingerprintEnrollEnrolling;
import com.android.settings.biometrics.fingerprint.FingerprintEnrollIntroduction;
import com.android.settings.biometrics.fingerprint.FingerprintEnrollIntroductionInternal;
@@ -44,6 +45,7 @@
import com.android.settings.homepage.DeepLinkHomepageActivityInternal;
import com.android.settings.homepage.SettingsHomepageActivity;
import com.android.settings.overlay.FeatureFactory;
+import com.android.settings.password.ChooseLockPattern;
import com.android.settingslib.users.AvatarPickerActivity;
import java.util.HashSet;
@@ -228,7 +230,10 @@
addActivityFilter(activityFilters, FingerprintEnrollIntroduction.class);
addActivityFilter(activityFilters, FingerprintEnrollIntroductionInternal.class);
addActivityFilter(activityFilters, FingerprintEnrollEnrolling.class);
+ addActivityFilter(activityFilters, FaceEnrollIntroductionInternal.class);
+ addActivityFilter(activityFilters, Settings.FaceSettingsInternalActivity.class);
addActivityFilter(activityFilters, AvatarPickerActivity.class);
+ addActivityFilter(activityFilters, ChooseLockPattern.class);
mSplitController.registerRule(new ActivityRule(activityFilters, true /* alwaysExpand */));
}
diff --git a/src/com/android/settings/applications/defaultapps/DefaultAutofillPicker.java b/src/com/android/settings/applications/defaultapps/DefaultAutofillPicker.java
index f1e7ac0..d96aa6b 100644
--- a/src/com/android/settings/applications/defaultapps/DefaultAutofillPicker.java
+++ b/src/com/android/settings/applications/defaultapps/DefaultAutofillPicker.java
@@ -243,7 +243,7 @@
}
final CharSequence appName = appInfo.loadLabel();
final String message = getContext().getString(
- R.string.autofill_confirmation_message, appName);
+ R.string.autofill_confirmation_message, Html.escapeHtml(appName));
return Html.fromHtml(message);
}
diff --git a/src/com/android/settings/applications/specialaccess/notificationaccess/NotificationAccessDetails.java b/src/com/android/settings/applications/specialaccess/notificationaccess/NotificationAccessDetails.java
index e6feebb..2094890 100644
--- a/src/com/android/settings/applications/specialaccess/notificationaccess/NotificationAccessDetails.java
+++ b/src/com/android/settings/applications/specialaccess/notificationaccess/NotificationAccessDetails.java
@@ -16,14 +16,14 @@
package com.android.settings.applications.specialaccess.notificationaccess;
+import static android.content.pm.PackageManager.PERMISSION_GRANTED;
+
import static com.android.settings.applications.AppInfoBase.ARG_PACKAGE_NAME;
-import android.app.Activity;
+import android.Manifest;
import android.app.NotificationManager;
import android.app.settings.SettingsEnums;
import android.companion.ICompanionDeviceManager;
-import android.compat.annotation.ChangeId;
-import android.compat.annotation.EnabledAfter;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
@@ -37,8 +37,8 @@
import android.os.UserHandle;
import android.os.UserManager;
import android.provider.Settings;
-import android.service.notification.NotificationListenerFilter;
import android.service.notification.NotificationListenerService;
+import android.text.TextUtils;
import android.util.Log;
import android.util.Slog;
@@ -48,7 +48,6 @@
import com.android.settings.R;
import com.android.settings.SettingsActivity;
import com.android.settings.applications.AppInfoBase;
-import com.android.settings.applications.manageapplications.ManageApplications;
import com.android.settings.bluetooth.Utils;
import com.android.settings.core.SubSettingLauncher;
import com.android.settings.dashboard.DashboardFragment;
@@ -208,8 +207,12 @@
}
}
if (intent != null && intent.hasExtra(Intent.EXTRA_USER_HANDLE)) {
- mUserId = ((UserHandle) intent.getParcelableExtra(
- Intent.EXTRA_USER_HANDLE)).getIdentifier();
+ if (hasInteractAcrossUsersPermission()) {
+ mUserId = ((UserHandle) intent.getParcelableExtra(
+ Intent.EXTRA_USER_HANDLE)).getIdentifier();
+ } else {
+ finish();
+ }
} else {
mUserId = UserHandle.myUserId();
}
@@ -224,6 +227,26 @@
}
}
+ private boolean hasInteractAcrossUsersPermission() {
+ final String callingPackageName =
+ ((SettingsActivity) getActivity()).getInitialCallingPackage();
+
+ if (TextUtils.isEmpty(callingPackageName)) {
+ Log.w(TAG, "Not able to get calling package name for permission check");
+ return false;
+ }
+
+ if (getContext().getPackageManager().checkPermission(
+ Manifest.permission.INTERACT_ACROSS_USERS_FULL, callingPackageName)
+ != PERMISSION_GRANTED) {
+ Log.w(TAG, "Package " + callingPackageName + " does not have required permission "
+ + Manifest.permission.INTERACT_ACROSS_USERS_FULL);
+ return false;
+ }
+
+ return true;
+ }
+
// Dialogs only have access to the parent fragment, not the controller, so pass the information
// along to keep business logic out of this file
public void disable(final ComponentName cn) {
diff --git a/src/com/android/settings/biometrics/BiometricEnrollActivity.java b/src/com/android/settings/biometrics/BiometricEnrollActivity.java
index 932c410..bb16f0b 100644
--- a/src/com/android/settings/biometrics/BiometricEnrollActivity.java
+++ b/src/com/android/settings/biometrics/BiometricEnrollActivity.java
@@ -48,6 +48,7 @@
import com.android.settings.R;
import com.android.settings.SetupWizardUtils;
import com.android.settings.core.InstrumentedActivity;
+import com.android.settings.overlay.FeatureFactory;
import com.android.settings.password.ChooseLockGeneric;
import com.android.settings.password.ChooseLockPattern;
import com.android.settings.password.ChooseLockSettingsHelper;
@@ -215,11 +216,16 @@
mIsFaceEnrollable =
faceManager.getEnrolledFaces(mUserId).size() < maxEnrolls;
- // exclude face enrollment from setup wizard if configured as a convenience
- // isSetupWizard is always false for unicorn enrollment, so if consent is
- // required check if setup has completed instead.
- final boolean isSettingUp = isSetupWizard || (mParentalOptionsRequired
+ final boolean parentalConsent = isSetupWizard || (mParentalOptionsRequired
&& !WizardManagerHelper.isUserSetupComplete(this));
+ if (parentalConsent && isMultiSensor && mIsFaceEnrollable) {
+ // Exclude face enrollment from setup wizard if feature config not supported
+ // in setup wizard flow, we still allow user enroll faces through settings.
+ mIsFaceEnrollable = FeatureFactory.getFactory(getApplicationContext())
+ .getFaceFeatureProvider()
+ .isSetupWizardSupported(getApplicationContext());
+ Log.d(TAG, "config_suw_support_face_enroll: " + mIsFaceEnrollable);
+ }
}
}
if (mHasFeatureFingerprint) {
diff --git a/src/com/android/settings/biometrics/BiometricEnrollBase.java b/src/com/android/settings/biometrics/BiometricEnrollBase.java
index eea1bad..2f852f0 100644
--- a/src/com/android/settings/biometrics/BiometricEnrollBase.java
+++ b/src/com/android/settings/biometrics/BiometricEnrollBase.java
@@ -38,7 +38,10 @@
import com.android.settings.Utils;
import com.android.settings.biometrics.fingerprint.FingerprintEnrollEnrolling;
import com.android.settings.core.InstrumentedActivity;
+import com.android.settings.overlay.FeatureFactory;
import com.android.settings.password.ChooseLockSettingsHelper;
+import com.android.systemui.unfold.compat.ScreenSizeFoldProvider;
+import com.android.systemui.unfold.updates.FoldProvider;
import com.google.android.setupcompat.template.FooterBarMixin;
import com.google.android.setupcompat.template.FooterButton;
@@ -60,8 +63,10 @@
public static final String EXTRA_KEY_SENSOR_ID = "sensor_id";
public static final String EXTRA_KEY_CHALLENGE = "challenge";
public static final String EXTRA_KEY_MODALITY = "sensor_modality";
+ public static final String EXTRA_KEY_NEXT_LAUNCHED = "next_launched";
public static final String EXTRA_FINISHED_ENROLL_FACE = "finished_enrolling_face";
public static final String EXTRA_FINISHED_ENROLL_FINGERPRINT = "finished_enrolling_fingerprint";
+ public static final String EXTRA_LAUNCHED_POSTURE_GUIDANCE = "launched_posture_guidance";
/**
* Used by the choose fingerprint wizard to indicate the wizard is
@@ -115,14 +120,25 @@
* example, when starting fingerprint enroll after face enroll.
*/
public static final int ENROLL_NEXT_BIOMETRIC_REQUEST = 6;
+ public static final int REQUEST_POSTURE_GUIDANCE = 7;
protected boolean mLaunchedConfirmLock;
+ protected boolean mLaunchedPostureGuidance;
+ protected boolean mNextLaunched;
protected byte[] mToken;
protected int mUserId;
protected int mSensorId;
+ @BiometricUtils.DevicePostureInt
+ protected int mDevicePostureState;
protected long mChallenge;
protected boolean mFromSettingsSummary;
protected FooterBarMixin mFooterBarMixin;
+ @Nullable
+ protected ScreenSizeFoldProvider mScreenSizeFoldProvider;
+ @Nullable
+ protected Intent mPostureGuidanceIntent = null;
+ @Nullable
+ protected FoldProvider.FoldCallback mFoldCallback = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
@@ -139,16 +155,23 @@
ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE_TOKEN);
}
mFromSettingsSummary = getIntent().getBooleanExtra(EXTRA_FROM_SETTINGS_SUMMARY, false);
- if (savedInstanceState != null && mToken == null) {
- mLaunchedConfirmLock = savedInstanceState.getBoolean(EXTRA_KEY_LAUNCHED_CONFIRM);
- mToken = savedInstanceState.getByteArray(
- ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE_TOKEN);
- mFromSettingsSummary =
- savedInstanceState.getBoolean(EXTRA_FROM_SETTINGS_SUMMARY, false);
- mChallenge = savedInstanceState.getLong(EXTRA_KEY_CHALLENGE);
- mSensorId = savedInstanceState.getInt(EXTRA_KEY_SENSOR_ID);
+ if (savedInstanceState != null) {
+ if (mToken == null) {
+ mLaunchedConfirmLock = savedInstanceState.getBoolean(EXTRA_KEY_LAUNCHED_CONFIRM);
+ mToken = savedInstanceState.getByteArray(
+ ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE_TOKEN);
+ mFromSettingsSummary =
+ savedInstanceState.getBoolean(EXTRA_FROM_SETTINGS_SUMMARY, false);
+ mChallenge = savedInstanceState.getLong(EXTRA_KEY_CHALLENGE);
+ mSensorId = savedInstanceState.getInt(EXTRA_KEY_SENSOR_ID);
+ }
+ mLaunchedPostureGuidance = savedInstanceState.getBoolean(
+ EXTRA_LAUNCHED_POSTURE_GUIDANCE);
+ mNextLaunched = savedInstanceState.getBoolean(EXTRA_KEY_NEXT_LAUNCHED);
}
mUserId = getIntent().getIntExtra(Intent.EXTRA_USER_ID, UserHandle.myUserId());
+ mPostureGuidanceIntent = FeatureFactory.getFactory(getApplicationContext())
+ .getFaceFeatureProvider().getPostureGuidanceIntent(getApplicationContext());
}
@Override
@@ -159,6 +182,8 @@
outState.putBoolean(EXTRA_FROM_SETTINGS_SUMMARY, mFromSettingsSummary);
outState.putLong(EXTRA_KEY_CHALLENGE, mChallenge);
outState.putInt(EXTRA_KEY_SENSOR_ID, mSensorId);
+ outState.putBoolean(EXTRA_LAUNCHED_POSTURE_GUIDANCE, mLaunchedPostureGuidance);
+ outState.putBoolean(EXTRA_KEY_NEXT_LAUNCHED, mNextLaunched);
}
@Override
@@ -184,6 +209,12 @@
@Override
protected void onStop() {
super.onStop();
+ if (mScreenSizeFoldProvider != null && mFoldCallback != null) {
+ mScreenSizeFoldProvider.unregisterCallback(mFoldCallback);
+ }
+ mScreenSizeFoldProvider = null;
+ mFoldCallback = null;
+
if (!isChangingConfigurations() && shouldFinishWhenBackgrounded()
&& !BiometricUtils.isAnyMultiBiometricFlow(this)) {
setResult(RESULT_TIMEOUT);
@@ -191,6 +222,17 @@
}
}
+ protected boolean launchPostureGuidance() {
+ if (mPostureGuidanceIntent == null || mLaunchedPostureGuidance) {
+ return false;
+ }
+ BiometricUtils.copyMultiBiometricExtras(getIntent(), mPostureGuidanceIntent);
+ startActivityForResult(mPostureGuidanceIntent, REQUEST_POSTURE_GUIDANCE);
+ mLaunchedPostureGuidance = true;
+ overridePendingTransition(0 /* no enter anim */, 0 /* no exit anim */);
+ return mLaunchedPostureGuidance;
+ }
+
protected boolean shouldFinishWhenBackgrounded() {
return !WizardManagerHelper.isAnySetupWizard(getIntent());
}
diff --git a/src/com/android/settings/biometrics/BiometricEnrollIntroduction.java b/src/com/android/settings/biometrics/BiometricEnrollIntroduction.java
index acfe5a1..730e049 100644
--- a/src/com/android/settings/biometrics/BiometricEnrollIntroduction.java
+++ b/src/com/android/settings/biometrics/BiometricEnrollIntroduction.java
@@ -155,6 +155,8 @@
if (savedInstanceState != null) {
mConfirmingCredentials = savedInstanceState.getBoolean(KEY_CONFIRMING_CREDENTIALS);
mHasScrolledToBottom = savedInstanceState.getBoolean(KEY_SCROLLED_TO_BOTTOM);
+ mLaunchedPostureGuidance = savedInstanceState.getBoolean(
+ EXTRA_LAUNCHED_POSTURE_GUIDANCE);
}
Intent intent = getIntent();
@@ -273,6 +275,7 @@
finish();
}
}
+ mNextLaunched = true;
}
private void launchChooseLock() {
diff --git a/src/com/android/settings/biometrics/BiometricUtils.java b/src/com/android/settings/biometrics/BiometricUtils.java
index 4cd2f790..7333083 100644
--- a/src/com/android/settings/biometrics/BiometricUtils.java
+++ b/src/com/android/settings/biometrics/BiometricUtils.java
@@ -16,6 +16,7 @@
package com.android.settings.biometrics;
+import android.annotation.IntDef;
import android.app.Activity;
import android.app.PendingIntent;
import android.app.admin.DevicePolicyManager;
@@ -39,6 +40,7 @@
import com.android.settings.biometrics.face.FaceEnrollIntroduction;
import com.android.settings.biometrics.fingerprint.FingerprintEnrollFindSensor;
import com.android.settings.biometrics.fingerprint.FingerprintEnrollIntroduction;
+import com.android.settings.biometrics.fingerprint.SetupFingerprintEnrollFindSensor;
import com.android.settings.biometrics.fingerprint.SetupFingerprintEnrollIntroduction;
import com.android.settings.password.ChooseLockGeneric;
import com.android.settings.password.ChooseLockSettingsHelper;
@@ -46,17 +48,53 @@
import com.google.android.setupcompat.util.WizardManagerHelper;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
/**
* Common biometric utilities.
*/
public class BiometricUtils {
private static final String TAG = "BiometricUtils";
+ // Note: Theis IntDef must align SystemUI DevicePostureInt
+ @IntDef(prefix = {"DEVICE_POSTURE_"}, value = {
+ DEVICE_POSTURE_UNKNOWN,
+ DEVICE_POSTURE_CLOSED,
+ DEVICE_POSTURE_HALF_OPENED,
+ DEVICE_POSTURE_OPENED,
+ DEVICE_POSTURE_FLIPPED
+ })
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface DevicePostureInt {}
+
+ // NOTE: These constants **must** match those defined for Jetpack Sidecar. This is because we
+ // use the Device State -> Jetpack Posture map in DevicePostureControllerImpl to translate
+ // between the two.
+ public static final int DEVICE_POSTURE_UNKNOWN = 0;
+ public static final int DEVICE_POSTURE_CLOSED = 1;
+ public static final int DEVICE_POSTURE_HALF_OPENED = 2;
+ public static final int DEVICE_POSTURE_OPENED = 3;
+ public static final int DEVICE_POSTURE_FLIPPED = 4;
+
+ public static int sAllowEnrollPosture = DEVICE_POSTURE_UNKNOWN;
+
/**
* Request was sent for starting another enrollment of a previously
* enrolled biometric of the same type.
*/
public static int REQUEST_ADD_ANOTHER = 7;
+
+ /**
+ * Gatekeeper credential not match exception, it throws if VerifyCredentialResponse is not
+ * matched in requestGatekeeperHat().
+ */
+ public static class GatekeeperCredentialNotMatchException extends IllegalStateException {
+ public GatekeeperCredentialNotMatchException(String s) {
+ super(s);
+ }
+ };
+
/**
* Given the result from confirming or choosing a credential, request Gatekeeper to generate
* a HardwareAuthToken with the Gatekeeper Password together with a biometric challenge.
@@ -66,6 +104,8 @@
* @param userId User ID that the credential/biometric operation applies to
* @param challenge Unique biometric challenge from FingerprintManager/FaceManager
* @return
+ * @throws GatekeeperCredentialNotMatchException if Gatekeeper response is not match
+ * @throws IllegalStateException if Gatekeeper Password is missing
*/
public static byte[] requestGatekeeperHat(@NonNull Context context, @NonNull Intent result,
int userId, long challenge) {
@@ -83,7 +123,7 @@
final VerifyCredentialResponse response = utils.verifyGatekeeperPasswordHandle(gkPwHandle,
challenge, userId);
if (!response.isMatched()) {
- throw new IllegalStateException("Unable to request Gatekeeper HAT");
+ throw new GatekeeperCredentialNotMatchException("Unable to request Gatekeeper HAT");
}
return response.getGatekeeperHAT();
}
@@ -152,9 +192,13 @@
*/
public static Intent getFingerprintFindSensorIntent(@NonNull Context context,
@NonNull Intent activityIntent) {
- Intent intent = new Intent(context, FingerprintEnrollFindSensor.class);
- SetupWizardUtils.copySetupExtras(activityIntent, intent);
- return intent;
+ if (WizardManagerHelper.isAnySetupWizard(activityIntent)) {
+ Intent intent = new Intent(context, SetupFingerprintEnrollFindSensor.class);
+ SetupWizardUtils.copySetupExtras(activityIntent, intent);
+ return intent;
+ } else {
+ return new Intent(context, FingerprintEnrollFindSensor.class);
+ }
}
/**
@@ -265,6 +309,51 @@
|| isMultiBiometricFingerprintEnrollmentFlow(activity);
}
+ /**
+ * Used to check if the activity is showing a posture guidance to user.
+ *
+ * @param devicePosture the device posture state
+ * @param isLaunchedPostureGuidance True launching a posture guidance to user
+ * @return True if the activity is showing posture guidance to user
+ */
+ public static boolean isPostureGuidanceShowing(@DevicePostureInt int devicePosture,
+ boolean isLaunchedPostureGuidance) {
+ return !isPostureAllowEnrollment(devicePosture) && isLaunchedPostureGuidance;
+ }
+
+ /**
+ * Used to check if current device posture state is allow to enroll biometrics.
+ * For compatibility, we don't restrict enrollment if device do not config.
+ *
+ * @param devicePosture True if current device posture allow enrollment
+ * @return True if current device posture state allow enrollment
+ */
+ public static boolean isPostureAllowEnrollment(@DevicePostureInt int devicePosture) {
+ return (sAllowEnrollPosture == DEVICE_POSTURE_UNKNOWN)
+ || (devicePosture == sAllowEnrollPosture);
+ }
+
+ /**
+ * Used to check if the activity should show a posture guidance to user.
+ *
+ * @param devicePosture the device posture state
+ * @param isLaunchedPostureGuidance True launching a posture guidance to user
+ * @return True if posture disallow enroll and posture guidance not showing, false otherwise.
+ */
+ public static boolean shouldShowPostureGuidance(@DevicePostureInt int devicePosture,
+ boolean isLaunchedPostureGuidance) {
+ return !isPostureAllowEnrollment(devicePosture) && !isLaunchedPostureGuidance;
+ }
+
+ /**
+ * Sets allowed device posture for face enrollment.
+ *
+ * @param devicePosture the allowed posture state {@link DevicePostureInt} for enrollment
+ */
+ public static void setDevicePosturesAllowEnroll(@DevicePostureInt int devicePosture) {
+ sAllowEnrollPosture = devicePosture;
+ }
+
public static void copyMultiBiometricExtras(@NonNull Intent fromIntent,
@NonNull Intent toIntent) {
PendingIntent pendingIntent = (PendingIntent) fromIntent.getExtra(
diff --git a/src/com/android/settings/biometrics/face/FaceEnrollEducation.java b/src/com/android/settings/biometrics/face/FaceEnrollEducation.java
index d2d356b..4ef4752 100644
--- a/src/com/android/settings/biometrics/face/FaceEnrollEducation.java
+++ b/src/com/android/settings/biometrics/face/FaceEnrollEducation.java
@@ -16,24 +16,35 @@
package com.android.settings.biometrics.face;
+import static com.android.settings.biometrics.BiometricUtils.isPostureAllowEnrollment;
+import static com.android.settings.biometrics.BiometricUtils.isPostureGuidanceShowing;
+
import android.app.settings.SettingsEnums;
import android.content.ComponentName;
import android.content.Intent;
+import android.content.res.Configuration;
import android.hardware.face.FaceManager;
import android.os.Bundle;
import android.os.UserHandle;
import android.text.TextUtils;
+import android.util.Log;
import android.view.View;
import android.view.accessibility.AccessibilityManager;
import android.widget.Button;
import android.widget.CompoundButton;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.annotation.VisibleForTesting;
+
import com.android.settings.R;
import com.android.settings.Utils;
import com.android.settings.biometrics.BiometricEnrollBase;
import com.android.settings.biometrics.BiometricUtils;
import com.android.settings.password.ChooseLockSettingsHelper;
import com.android.settings.password.SetupSkipDialog;
+import com.android.systemui.unfold.compat.ScreenSizeFoldProvider;
+import com.android.systemui.unfold.updates.FoldProvider;
import com.airbnb.lottie.LottieAnimationView;
import com.google.android.setupcompat.template.FooterBarMixin;
@@ -41,18 +52,19 @@
import com.google.android.setupcompat.util.WizardManagerHelper;
import com.google.android.setupdesign.view.IllustrationVideoView;
+/**
+ * Provides animated education for users to know how to enroll a face with appropriate posture.
+ */
public class FaceEnrollEducation extends BiometricEnrollBase {
private static final String TAG = "FaceEducation";
private FaceManager mFaceManager;
private FaceEnrollAccessibilityToggle mSwitchDiversity;
-
private boolean mIsUsingLottie;
private IllustrationVideoView mIllustrationDefault;
private LottieAnimationView mIllustrationLottie;
private View mIllustrationAccessibility;
private Intent mResultIntent;
- private boolean mNextClicked;
private boolean mAccessibilityEnabled;
private final CompoundButton.OnCheckedChangeListener mSwitchDiversityListener =
@@ -155,6 +167,34 @@
}
@Override
+ protected void onStart() {
+ super.onStart();
+ if (getPostureGuidanceIntent() == null) {
+ Log.d(TAG, "Device do not support posture guidance");
+ return;
+ }
+
+ BiometricUtils.setDevicePosturesAllowEnroll(
+ getResources().getInteger(R.integer.config_face_enroll_supported_posture));
+
+ if (getPostureCallback() == null) {
+ mFoldCallback = isFolded -> {
+ mDevicePostureState = isFolded ? BiometricUtils.DEVICE_POSTURE_CLOSED
+ : BiometricUtils.DEVICE_POSTURE_OPENED;
+ if (BiometricUtils.shouldShowPostureGuidance(mDevicePostureState,
+ mLaunchedPostureGuidance) && !mNextLaunched) {
+ launchPostureGuidance();
+ }
+ };
+ }
+
+ if (mScreenSizeFoldProvider == null) {
+ mScreenSizeFoldProvider = new ScreenSizeFoldProvider(getApplicationContext());
+ mScreenSizeFoldProvider.registerCallback(mFoldCallback, getMainExecutor());
+ }
+ }
+
+ @Override
protected void onResume() {
super.onResume();
mSwitchDiversityListener.onCheckedChanged(mSwitchDiversity.getSwitch(),
@@ -172,7 +212,8 @@
@Override
protected boolean shouldFinishWhenBackgrounded() {
- return super.shouldFinishWhenBackgrounded() && !mNextClicked;
+ return super.shouldFinishWhenBackgrounded() && !mNextLaunched
+ && !isPostureGuidanceShowing(mDevicePostureState, mLaunchedPostureGuidance);
}
@Override
@@ -206,13 +247,14 @@
FaceEnrollAccessibilityDialog dialog = FaceEnrollAccessibilityDialog.newInstance();
dialog.setPositiveButtonListener((dialog1, which) -> {
startActivityForResult(intent, BIOMETRIC_FIND_SENSOR_REQUEST);
- mNextClicked = true;
+ mNextLaunched = true;
});
dialog.show(getSupportFragmentManager(), FaceEnrollAccessibilityDialog.class.getName());
} else {
startActivityForResult(intent, BIOMETRIC_FIND_SENSOR_REQUEST);
- mNextClicked = true;
+ mNextLaunched = true;
}
+
}
protected void onSkipButtonClick(View view) {
@@ -224,14 +266,28 @@
}
@Override
+ public void onConfigurationChanged(@NonNull Configuration newConfig) {
+ super.onConfigurationChanged(newConfig);
+ if (mScreenSizeFoldProvider != null && getPostureCallback() != null) {
+ mScreenSizeFoldProvider.onConfigurationChange(newConfig);
+ }
+ }
+
+ @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
- super.onActivityResult(requestCode, resultCode, data);
+ if (requestCode == REQUEST_POSTURE_GUIDANCE) {
+ mLaunchedPostureGuidance = false;
+ if (resultCode == RESULT_CANCELED || resultCode == RESULT_SKIP) {
+ onSkipButtonClick(getCurrentFocus());
+ }
+ return;
+ }
mResultIntent = data;
boolean hasEnrolledFace = false;
if (data != null) {
hasEnrolledFace = data.getBooleanExtra(EXTRA_FINISHED_ENROLL_FACE, false);
}
- if (resultCode == RESULT_TIMEOUT) {
+ if (resultCode == RESULT_TIMEOUT || !isPostureAllowEnrollment(mDevicePostureState)) {
setResult(resultCode, data);
finish();
} else if (requestCode == BIOMETRIC_FIND_SENSOR_REQUEST
@@ -243,6 +299,26 @@
finish();
}
}
+ mNextLaunched = false;
+ super.onActivityResult(requestCode, resultCode, data);
+ }
+
+ @VisibleForTesting
+ @Nullable
+ protected Intent getPostureGuidanceIntent() {
+ return mPostureGuidanceIntent;
+ }
+
+ @VisibleForTesting
+ @Nullable
+ protected FoldProvider.FoldCallback getPostureCallback() {
+ return mFoldCallback;
+ }
+
+ @VisibleForTesting
+ @BiometricUtils.DevicePostureInt
+ protected int getDevicePostureState() {
+ return mDevicePostureState;
}
@Override
@@ -262,8 +338,10 @@
private void showDefaultIllustration() {
if (mIsUsingLottie) {
+ mIllustrationLottie.setAnimation(R.raw.face_education_lottie);
mIllustrationLottie.setVisibility(View.VISIBLE);
mIllustrationLottie.playAnimation();
+ mIllustrationLottie.setProgress(0f);
} else {
mIllustrationDefault.setVisibility(View.VISIBLE);
mIllustrationDefault.start();
diff --git a/src/com/android/settings/biometrics/face/FaceEnrollIntroduction.java b/src/com/android/settings/biometrics/face/FaceEnrollIntroduction.java
index ed74d2a..a123308 100644
--- a/src/com/android/settings/biometrics/face/FaceEnrollIntroduction.java
+++ b/src/com/android/settings/biometrics/face/FaceEnrollIntroduction.java
@@ -18,9 +18,12 @@
import static android.app.admin.DevicePolicyResources.Strings.Settings.FACE_UNLOCK_DISABLED;
+import static com.android.settings.biometrics.BiometricUtils.GatekeeperCredentialNotMatchException;
+
import android.app.admin.DevicePolicyManager;
import android.app.settings.SettingsEnums;
import android.content.Intent;
+import android.content.res.Configuration;
import android.hardware.SensorPrivacyManager;
import android.hardware.biometrics.BiometricAuthenticator;
import android.hardware.face.FaceManager;
@@ -36,6 +39,7 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.StringRes;
+import androidx.annotation.VisibleForTesting;
import com.android.settings.R;
import com.android.settings.Utils;
@@ -43,11 +47,12 @@
import com.android.settings.biometrics.BiometricEnrollIntroduction;
import com.android.settings.biometrics.BiometricUtils;
import com.android.settings.biometrics.MultiBiometricEnrollHelper;
-import com.android.settings.overlay.FeatureFactory;
import com.android.settings.password.ChooseLockSettingsHelper;
import com.android.settings.password.SetupSkipDialog;
import com.android.settings.utils.SensorPrivacyManagerHelper;
import com.android.settingslib.RestrictedLockUtilsInternal;
+import com.android.systemui.unfold.compat.ScreenSizeFoldProvider;
+import com.android.systemui.unfold.updates.FoldProvider;
import com.google.android.setupcompat.template.FooterButton;
import com.google.android.setupcompat.util.WizardManagerHelper;
@@ -61,7 +66,6 @@
private static final String TAG = "FaceEnrollIntroduction";
private FaceManager mFaceManager;
- private FaceFeatureProvider mFaceFeatureProvider;
@Nullable private FooterButton mPrimaryFooterButton;
@Nullable private FooterButton mSecondaryFooterButton;
@Nullable private SensorPrivacyManager mSensorPrivacyManager;
@@ -99,6 +103,12 @@
}
@Override
+ protected boolean shouldFinishWhenBackgrounded() {
+ return super.shouldFinishWhenBackgrounded() && !BiometricUtils.isPostureGuidanceShowing(
+ mDevicePostureState, mLaunchedPostureGuidance);
+ }
+
+ @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
@@ -142,9 +152,7 @@
infoMessageRequireEyes.setText(getInfoMessageRequireEyes());
}
- mFaceManager = Utils.getFaceManagerOrNull(this);
- mFaceFeatureProvider = FeatureFactory.getFactory(getApplicationContext())
- .getFaceFeatureProvider();
+ mFaceManager = getFaceManager();
// This path is an entry point for SetNewPasswordController, e.g.
// adb shell am start -a android.app.action.SET_NEW_PASSWORD
@@ -154,11 +162,22 @@
// We either block on generateChallenge, or need to gray out the "next" button until
// the challenge is ready. Let's just do this for now.
mFaceManager.generateChallenge(mUserId, (sensorId, userId, challenge) -> {
- mToken = BiometricUtils.requestGatekeeperHat(this, getIntent(), mUserId,
- challenge);
- mSensorId = sensorId;
- mChallenge = challenge;
- mFooterBarMixin.getPrimaryButton().setEnabled(true);
+ if (isFinishing()) {
+ // Do nothing if activity is finishing
+ Log.w(TAG, "activity finished before challenge callback launched.");
+ return;
+ }
+
+ try {
+ mToken = requestGatekeeperHat(challenge);
+ mSensorId = sensorId;
+ mChallenge = challenge;
+ mFooterBarMixin.getPrimaryButton().setEnabled(true);
+ } catch (GatekeeperCredentialNotMatchException e) {
+ // Let BiometricEnrollBase#onCreate() to trigger confirmLock()
+ getIntent().removeExtra(ChooseLockSettingsHelper.EXTRA_KEY_GK_PW_HANDLE);
+ recreate();
+ }
});
}
}
@@ -172,8 +191,82 @@
Log.v(TAG, "cameraPrivacyEnabled : " + cameraPrivacyEnabled);
}
+ @VisibleForTesting
+ @Nullable
+ protected FaceManager getFaceManager() {
+ return Utils.getFaceManagerOrNull(this);
+ }
+
+ @VisibleForTesting
+ @Nullable
+ protected Intent getPostureGuidanceIntent() {
+ return mPostureGuidanceIntent;
+ }
+
+ @VisibleForTesting
+ @Nullable
+ protected FoldProvider.FoldCallback getPostureCallback() {
+ return mFoldCallback;
+ }
+
+ @VisibleForTesting
+ @BiometricUtils.DevicePostureInt
+ protected int getDevicePostureState() {
+ return mDevicePostureState;
+ }
+
+ @VisibleForTesting
+ @Nullable
+ protected byte[] requestGatekeeperHat(long challenge) {
+ return BiometricUtils.requestGatekeeperHat(this, getIntent(), mUserId, challenge);
+ }
+
+ @Override
+ public void onConfigurationChanged(@NonNull Configuration newConfig) {
+ super.onConfigurationChanged(newConfig);
+ if (mScreenSizeFoldProvider != null && getPostureCallback() != null) {
+ mScreenSizeFoldProvider.onConfigurationChange(newConfig);
+ }
+ }
+
+ @Override
+ protected void onStart() {
+ super.onStart();
+ if (getPostureGuidanceIntent() == null) {
+ Log.d(TAG, "Device do not support posture guidance");
+ return;
+ }
+
+ BiometricUtils.setDevicePosturesAllowEnroll(
+ getResources().getInteger(R.integer.config_face_enroll_supported_posture));
+
+ if (getPostureCallback() == null) {
+ mFoldCallback = isFolded -> {
+ mDevicePostureState = isFolded ? BiometricUtils.DEVICE_POSTURE_CLOSED
+ : BiometricUtils.DEVICE_POSTURE_OPENED;
+ if (BiometricUtils.shouldShowPostureGuidance(mDevicePostureState,
+ mLaunchedPostureGuidance) && !mNextLaunched) {
+ launchPostureGuidance();
+ }
+ };
+ }
+
+ if (mScreenSizeFoldProvider == null) {
+ mScreenSizeFoldProvider = new ScreenSizeFoldProvider(getApplicationContext());
+ mScreenSizeFoldProvider.registerCallback(mFoldCallback, getMainExecutor());
+ }
+ }
+
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
+ if (requestCode == REQUEST_POSTURE_GUIDANCE) {
+ mLaunchedPostureGuidance = false;
+ if (resultCode == RESULT_CANCELED || resultCode == RESULT_SKIP) {
+ onSkipButtonClick(getCurrentFocus());
+ }
+ return;
+ }
+
// If user has skipped or finished enrolling, don't restart enrollment.
final boolean isEnrollRequest = requestCode == BIOMETRIC_FIND_SENSOR_REQUEST
|| requestCode == ENROLL_NEXT_BIOMETRIC_REQUEST;
@@ -184,10 +277,12 @@
hasEnrolledFace = data.getBooleanExtra(EXTRA_FINISHED_ENROLL_FACE, false);
}
- if (resultCode == RESULT_CANCELED && hasEnrolledFace) {
- setResult(resultCode, data);
- finish();
- return;
+ if (resultCode == RESULT_CANCELED) {
+ if (hasEnrolledFace || !BiometricUtils.isPostureAllowEnrollment(mDevicePostureState)) {
+ setResult(resultCode, data);
+ finish();
+ return;
+ }
}
if (isEnrollRequest && isResultSkipOrFinished || hasEnrolledFace) {
diff --git a/src/com/android/settings/biometrics/face/FaceFeatureProvider.java b/src/com/android/settings/biometrics/face/FaceFeatureProvider.java
index 26ea261..1a4fd90 100644
--- a/src/com/android/settings/biometrics/face/FaceFeatureProvider.java
+++ b/src/com/android/settings/biometrics/face/FaceFeatureProvider.java
@@ -17,9 +17,19 @@
package com.android.settings.biometrics.face;
import android.content.Context;
+import android.content.Intent;
+
+import androidx.annotation.Nullable;
/** Feature provider for face unlock */
public interface FaceFeatureProvider {
+ /** Returns specified intent config by resource R.string.config_face_enroll_guidance_page. */
+ @Nullable
+ Intent getPostureGuidanceIntent(Context context);
+
/** Returns true if attention checking is supported. */
boolean isAttentionSupported(Context context);
+
+ /** Returns true if setup wizard supported face enrollment. */
+ boolean isSetupWizardSupported(Context context);
}
diff --git a/src/com/android/settings/biometrics/face/FaceFeatureProviderImpl.java b/src/com/android/settings/biometrics/face/FaceFeatureProviderImpl.java
index e508600..8b7edce 100644
--- a/src/com/android/settings/biometrics/face/FaceFeatureProviderImpl.java
+++ b/src/com/android/settings/biometrics/face/FaceFeatureProviderImpl.java
@@ -16,13 +16,48 @@
package com.android.settings.biometrics.face;
+import android.content.ComponentName;
import android.content.Context;
-import android.provider.Settings;
+import android.content.Intent;
+import android.text.TextUtils;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+
+import com.android.settings.R;
public class FaceFeatureProviderImpl implements FaceFeatureProvider {
+ /**
+ * Returns the guidance page intent if device support {@link FoldingFeature}, and we want to
+ * guide user enrolling faces with specific device posture.
+ *
+ * @param context the application context
+ * @return the posture guidance intent, otherwise null if device not support
+ */
+ @Nullable
+ @Override
+ public Intent getPostureGuidanceIntent(Context context) {
+ final String flattenedString = context.getString(R.string.config_face_enroll_guidance_page);
+ final Intent intent;
+ if (!TextUtils.isEmpty(flattenedString)) {
+ ComponentName componentName = ComponentName.unflattenFromString(flattenedString);
+ if (componentName != null) {
+ intent = new Intent();
+ intent.setComponent(componentName);
+ return intent;
+ }
+ }
+ return null;
+ }
+
@Override
public boolean isAttentionSupported(Context context) {
return true;
}
+
+ @Override
+ public boolean isSetupWizardSupported(@NonNull Context context) {
+ return true;
+ }
}
diff --git a/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrolling.java b/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrolling.java
index 61e98e5..843e42a 100644
--- a/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrolling.java
+++ b/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrolling.java
@@ -71,6 +71,7 @@
import com.android.settingslib.display.DisplayDensityUtils;
import com.airbnb.lottie.LottieAnimationView;
+import com.airbnb.lottie.LottieCompositionFactory;
import com.airbnb.lottie.LottieProperty;
import com.airbnb.lottie.model.KeyPath;
import com.google.android.setupcompat.template.FooterBarMixin;
@@ -191,9 +192,10 @@
@VisibleForTesting
protected boolean shouldShowLottie() {
DisplayDensityUtils displayDensity = new DisplayDensityUtils(getApplicationContext());
- int currentDensityIndex = displayDensity.getCurrentIndex();
- final int currentDensity = displayDensity.getValues()[currentDensityIndex];
- final int defaultDensity = displayDensity.getDefaultDensity();
+ int currentDensityIndex = displayDensity.getCurrentIndexForDefaultDisplay();
+ final int currentDensity = displayDensity.getDefaultDisplayDensityValues()
+ [currentDensityIndex];
+ final int defaultDensity = displayDensity.getDefaultDensityForDefaultDisplay();
return defaultDensity == currentDensity;
}
@@ -668,9 +670,12 @@
private void configureEnrollmentStage(CharSequence description, @RawRes int lottie) {
setDescriptionText(description);
- mIllustrationLottie.setAnimation(lottie);
- mIllustrationLottie.setVisibility(View.VISIBLE);
- mIllustrationLottie.playAnimation();
+ LottieCompositionFactory.fromRawRes(this, lottie)
+ .addListener((c) -> {
+ mIllustrationLottie.setComposition(c);
+ mIllustrationLottie.setVisibility(View.VISIBLE);
+ mIllustrationLottie.playAnimation();
+ });
}
@EnrollStage
diff --git a/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollFinish.java b/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollFinish.java
index 2125d52..bbaa3c7 100644
--- a/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollFinish.java
+++ b/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollFinish.java
@@ -70,6 +70,9 @@
}
setHeaderText(R.string.security_settings_fingerprint_enroll_finish_title);
setDescriptionText(R.string.security_settings_fingerprint_enroll_finish_v2_message);
+ if (mCanAssumeSfps) {
+ setDescriptionForSfps();
+ }
mFooterBarMixin = getLayout().getMixin(FooterBarMixin.class);
mFooterBarMixin.setSecondaryButton(
@@ -90,6 +93,20 @@
);
}
+ private void setDescriptionForSfps() {
+ final FingerprintManager fpm = Utils.getFingerprintManagerOrNull(this);
+ if (fpm != null) {
+ final List<FingerprintSensorPropertiesInternal> props =
+ fpm.getSensorPropertiesInternal();
+ final int maxEnrollments = props.get(0).maxEnrollmentsPerUser;
+ final int enrolled = fpm.getEnrolledFingerprints(mUserId).size();
+ if (enrolled < maxEnrollments) {
+ setDescriptionText(R.string
+ .security_settings_fingerprint_enroll_finish_v2_add_fingerprint_message);
+ }
+ }
+ }
+
@Override
public void onBackPressed() {
updateFingerprintSuggestionEnableState();
diff --git a/src/com/android/settings/biometrics/fingerprint/FingerprintErrorDialog.java b/src/com/android/settings/biometrics/fingerprint/FingerprintErrorDialog.java
index dc1189c..870e1bb 100644
--- a/src/com/android/settings/biometrics/fingerprint/FingerprintErrorDialog.java
+++ b/src/com/android/settings/biometrics/fingerprint/FingerprintErrorDialog.java
@@ -40,18 +40,20 @@
public class FingerprintErrorDialog extends InstrumentedDialogFragment {
public static final String KEY_ERROR_MSG = "error_msg";
+ public static final String KEY_ERROR_TITLE = "error_title";
public static final String KEY_ERROR_ID = "error_id";
public static final String KEY_UDFPS = "is_udfps";
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
- AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
- CharSequence errorString = getArguments().getCharSequence(KEY_ERROR_MSG);
+ final AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
+ final CharSequence errorString = getArguments().getCharSequence(KEY_ERROR_MSG);
+ final CharSequence errorTitle = getArguments().getCharSequence(KEY_ERROR_TITLE);
final int errMsgId = getArguments().getInt(KEY_ERROR_ID);
final boolean canAssumeUdfps = getArguments().getBoolean(KEY_UDFPS, false);
- boolean wasTimeout = errMsgId == BiometricConstants.BIOMETRIC_ERROR_TIMEOUT;
+ final boolean wasTimeout = errMsgId == BiometricConstants.BIOMETRIC_ERROR_TIMEOUT;
- builder.setTitle(R.string.security_settings_fingerprint_enroll_error_dialog_title)
+ builder.setTitle(errorTitle)
.setMessage(errorString)
.setCancelable(false)
.setPositiveButton(
@@ -60,7 +62,7 @@
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
- Activity activity = getActivity();
+ final Activity activity = getActivity();
if (wasTimeout && !canAssumeUdfps) {
activity.setResult(RESULT_TIMEOUT);
} else {
@@ -76,8 +78,8 @@
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
- Activity activity = getActivity();
- Intent intent = activity.getIntent();
+ final Activity activity = getActivity();
+ final Intent intent = activity.getIntent();
intent.addFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT);
intent.putExtra(KEY_STATE_CANCELED, false);
activity.startActivity(intent);
@@ -90,13 +92,13 @@
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
- Activity activity = getActivity();
+ final Activity activity = getActivity();
activity.setResult(RESULT_TIMEOUT);
activity.finish();
}
});
}
- AlertDialog dialog = builder.create();
+ final AlertDialog dialog = builder.create();
dialog.setCanceledOnTouchOutside(false);
return dialog;
}
@@ -111,11 +113,13 @@
return;
}
CharSequence errMsg = host.getText(getErrorMessage(errMsgId));
+ final CharSequence errTitle = host.getText(getErrorTitle(errMsgId));
if (!canAssumeUdfps
&& errMsgId == BiometricConstants.BIOMETRIC_ERROR_TIMEOUT) {
errMsg = host.getText(getErrorMessage(BiometricConstants.BIOMETRIC_ERROR_CANCELED));
}
- final FingerprintErrorDialog dialog = newInstance(errMsg, errMsgId, canAssumeUdfps);
+ final FingerprintErrorDialog dialog = newInstance(errMsg, errTitle,
+ errMsgId, canAssumeUdfps);
dialog.show(fragmentManager, FingerprintErrorDialog.class.getName());
}
@@ -133,11 +137,22 @@
}
}
- private static FingerprintErrorDialog newInstance(CharSequence msg, int msgId,
- boolean canAssumeUdfps) {
- FingerprintErrorDialog dialog = new FingerprintErrorDialog();
- Bundle args = new Bundle();
+ private static int getErrorTitle(int errMsgId) {
+ switch (errMsgId) {
+ case FingerprintManager.FINGERPRINT_ERROR_UNABLE_TO_PROCESS:
+ return R.string
+ .security_settings_fingerprint_enroll_error_unable_to_process_dialog_title;
+ default:
+ return R.string.security_settings_fingerprint_enroll_error_dialog_title;
+ }
+ }
+
+ private static FingerprintErrorDialog newInstance(CharSequence msg, CharSequence title,
+ int msgId, boolean canAssumeUdfps) {
+ final FingerprintErrorDialog dialog = new FingerprintErrorDialog();
+ final Bundle args = new Bundle();
args.putCharSequence(KEY_ERROR_MSG, msg);
+ args.putCharSequence(KEY_ERROR_TITLE, title);
args.putInt(KEY_ERROR_ID, msgId);
args.putBoolean(KEY_UDFPS, canAssumeUdfps);
dialog.setArguments(args);
diff --git a/src/com/android/settings/biometrics/fingerprint/FingerprintSettings.java b/src/com/android/settings/biometrics/fingerprint/FingerprintSettings.java
index 81eecd6..9e5f70c 100644
--- a/src/com/android/settings/biometrics/fingerprint/FingerprintSettings.java
+++ b/src/com/android/settings/biometrics/fingerprint/FingerprintSettings.java
@@ -494,8 +494,10 @@
if (root != null) {
root.removeAll();
}
- root = getPreferenceScreen();
- addFingerprintItemPreferences(root);
+ final String fpPrefKey = addFingerprintItemPreferences(root);
+ if (isSfps()) {
+ scrollToPreference(fpPrefKey);
+ }
addPreferencesFromResource(getPreferenceScreenResId());
mRequireScreenOnToAuthPreference = findPreference(KEY_REQUIRE_SCREEN_ON_TO_AUTH);
mFingerprintUnlockCategory = findPreference(KEY_FINGERPRINT_UNLOCK_CATEGORY);
@@ -529,15 +531,20 @@
}
}
- private void addFingerprintItemPreferences(PreferenceGroup root) {
+ private String addFingerprintItemPreferences(PreferenceGroup root) {
root.removeAll();
+ String keyToReturn = KEY_FINGERPRINT_ADD;
final List<Fingerprint> items = mFingerprintManager.getEnrolledFingerprints(mUserId);
final int fingerprintCount = items.size();
for (int i = 0; i < fingerprintCount; i++) {
final Fingerprint item = items.get(i);
FingerprintPreference pref = new FingerprintPreference(root.getContext(),
this /* onDeleteClickListener */);
- pref.setKey(genKey(item.getBiometricId()));
+ String key = genKey(item.getBiometricId());
+ if (i == 0) {
+ keyToReturn = key;
+ }
+ pref.setKey(key);
pref.setTitle(item.getName());
pref.setFingerprint(item);
pref.setPersistent(false);
@@ -560,6 +567,8 @@
addPreference.setOnPreferenceChangeListener(this);
updateAddPreference();
createFooterPreference(root);
+
+ return keyToReturn;
}
private void updateAddPreference() {
@@ -632,6 +641,7 @@
if (mAuthenticateSidecar != null) {
mAuthenticateSidecar.setListener(null);
mAuthenticateSidecar.stopAuthentication();
+ mHandler.removeCallbacks(mFingerprintLockoutReset);
}
}
diff --git a/src/com/android/settings/biometrics/fingerprint/FingerprintSettingsRequireScreenOnToAuthPreferenceController.java b/src/com/android/settings/biometrics/fingerprint/FingerprintSettingsRequireScreenOnToAuthPreferenceController.java
index 5b183c1..52e6d13 100644
--- a/src/com/android/settings/biometrics/fingerprint/FingerprintSettingsRequireScreenOnToAuthPreferenceController.java
+++ b/src/com/android/settings/biometrics/fingerprint/FingerprintSettingsRequireScreenOnToAuthPreferenceController.java
@@ -51,21 +51,26 @@
} else if (getRestrictingAdmin() != null) {
return false;
}
- int defaultValue = mContext.getResources().getBoolean(
- com.android.internal.R.bool.config_requireScreenOnToAuthEnabled) ? 1 : 0;
-
- return Settings.Secure.getIntForUser(
+ int toReturn = Settings.Secure.getIntForUser(
mContext.getContentResolver(),
- Settings.Secure.SFPS_REQUIRE_SCREEN_ON_TO_AUTH_ENABLED,
- defaultValue,
- getUserHandle()) != 0;
+ Settings.Secure.SFPS_PERFORMANT_AUTH_ENABLED,
+ -1,
+ getUserHandle());
+ if (toReturn == -1) {
+ toReturn = mContext.getResources().getBoolean(
+ com.android.internal.R.bool.config_performantAuthDefault) ? 1 : 0;
+ Settings.Secure.putIntForUser(mContext.getContentResolver(),
+ Settings.Secure.SFPS_PERFORMANT_AUTH_ENABLED, toReturn, getUserHandle());
+ }
+
+ return toReturn == 1;
}
@Override
public boolean setChecked(boolean isChecked) {
Settings.Secure.putIntForUser(
mContext.getContentResolver(),
- Settings.Secure.SFPS_REQUIRE_SCREEN_ON_TO_AUTH_ENABLED,
+ Settings.Secure.SFPS_PERFORMANT_AUTH_ENABLED,
isChecked ? 1 : 0,
getUserHandle());
return true;
diff --git a/src/com/android/settings/communal/CommunalPreferenceController.java b/src/com/android/settings/communal/CommunalPreferenceController.java
index e16dcc3..5cfedc4 100644
--- a/src/com/android/settings/communal/CommunalPreferenceController.java
+++ b/src/com/android/settings/communal/CommunalPreferenceController.java
@@ -17,6 +17,7 @@
package com.android.settings.communal;
import android.content.Context;
+import android.os.UserManager;
import com.android.settings.R;
import com.android.settings.core.BasePreferenceController;
@@ -31,7 +32,14 @@
@Override
public int getAvailabilityStatus() {
- return mContext.getResources().getBoolean(R.bool.config_show_communal_settings)
+ // TODO(b/257333623): Allow the communal user to be non-SystemUser user in HSUM.
+ return (mContext.getResources().getBoolean(R.bool.config_show_communal_settings)
+ && isSystemUser())
? AVAILABLE : UNSUPPORTED_ON_DEVICE;
}
+
+ private boolean isSystemUser() {
+ final UserManager userManager = mContext.getSystemService(UserManager.class);
+ return userManager != null && userManager.isSystemUser();
+ }
}
diff --git a/src/com/android/settings/development/qstile/DevelopmentTiles.java b/src/com/android/settings/development/qstile/DevelopmentTiles.java
index bb5216c..3b6c646 100644
--- a/src/com/android/settings/development/qstile/DevelopmentTiles.java
+++ b/src/com/android/settings/development/qstile/DevelopmentTiles.java
@@ -212,6 +212,7 @@
static final int SURFACE_FLINGER_LAYER_TRACE_CONTROL_CODE = 1025;
@VisibleForTesting
static final int SURFACE_FLINGER_LAYER_TRACE_STATUS_CODE = 1026;
+ private static final String VIEW_CAPTURE_ENABLED = "view_capture_enabled";
private IBinder mSurfaceFlinger;
private IWindowManager mWindowManager;
private ImeTracing mImeTracing;
@@ -279,10 +280,19 @@
return mImeTracing.isEnabled();
}
+ private boolean isViewCaptureEnabled() {
+ // Add null checking to avoid test case failure.
+ if (getApplicationContext() != null) {
+ return Settings.Global.getInt(getApplicationContext().getContentResolver(),
+ VIEW_CAPTURE_ENABLED, 0) != 0;
+ }
+ return false;
+ }
+
@Override
protected boolean isEnabled() {
return isWindowTraceEnabled() || isLayerTraceEnabled() || isSystemUiTracingEnabled()
- || isImeTraceEnabled();
+ || isImeTraceEnabled() || isViewCaptureEnabled();
}
private void setWindowTraceEnabled(boolean isEnabled) {
@@ -340,12 +350,21 @@
}
}
+ private void setViewCaptureEnabled(boolean isEnabled) {
+ // Add null checking to avoid test case failure.
+ if (getApplicationContext() != null) {
+ Settings.Global.putInt(getApplicationContext()
+ .getContentResolver(), VIEW_CAPTURE_ENABLED, isEnabled ? 1 : 0);
+ }
+ }
+
@Override
protected void setIsEnabled(boolean isEnabled) {
setWindowTraceEnabled(isEnabled);
setLayerTraceEnabled(isEnabled);
setSystemUiTracing(isEnabled);
setImeTraceEnabled(isEnabled);
+ setViewCaptureEnabled(isEnabled);
if (!isEnabled) {
mToast.show();
}
diff --git a/src/com/android/settings/display/ScreenResolutionFragment.java b/src/com/android/settings/display/ScreenResolutionFragment.java
index 7c4b3ae..9a61595 100644
--- a/src/com/android/settings/display/ScreenResolutionFragment.java
+++ b/src/com/android/settings/display/ScreenResolutionFragment.java
@@ -307,10 +307,11 @@
}
final DisplayDensityUtils density = new DisplayDensityUtils(mContext);
- final int currentIndex = density.getCurrentIndex();
- final int defaultDensity = density.getDefaultDensity();
+ final int currentIndex = density.getCurrentIndexForDefaultDisplay();
+ final int defaultDensity = density.getDefaultDensityForDefaultDisplay();
- if (density.getValues()[mCurrentIndex] == density.getDefaultDensity()) {
+ if (density.getDefaultDisplayDensityValues()[mCurrentIndex]
+ == density.getDefaultDensityForDefaultDisplay()) {
return;
}
@@ -351,17 +352,17 @@
private void restoreDensity() {
final DisplayDensityUtils density = new DisplayDensityUtils(mContext);
- if (density.getValues()[mCurrentIndex] != density.getDefaultDensity()) {
- DisplayDensityUtils.setForcedDisplayDensity(
- Display.DEFAULT_DISPLAY, density.getValues()[mCurrentIndex]);
+ if (density.getDefaultDisplayDensityValues()[mCurrentIndex]
+ != density.getDefaultDensityForDefaultDisplay()) {
+ density.setForcedDisplayDensity(mCurrentIndex);
}
- mDefaultDensity = density.getDefaultDensity();
+ mDefaultDensity = density.getDefaultDensityForDefaultDisplay();
}
private boolean isDensityChanged() {
final DisplayDensityUtils density = new DisplayDensityUtils(mContext);
- if (density.getDefaultDensity() == mDefaultDensity) {
+ if (density.getDefaultDensityForDefaultDisplay() == mDefaultDensity) {
return false;
}
diff --git a/src/com/android/settings/display/ScreenZoomPreference.java b/src/com/android/settings/display/ScreenZoomPreference.java
index f47d7da..af77a0e 100644
--- a/src/com/android/settings/display/ScreenZoomPreference.java
+++ b/src/com/android/settings/display/ScreenZoomPreference.java
@@ -36,13 +36,13 @@
android.R.attr.preferenceStyle));
final DisplayDensityUtils density = new DisplayDensityUtils(context);
- final int defaultIndex = density.getCurrentIndex();
+ final int defaultIndex = density.getCurrentIndexForDefaultDisplay();
if (defaultIndex < 0) {
setVisible(false);
setEnabled(false);
} else if (TextUtils.isEmpty(getSummary())) {
- final String[] entries = density.getEntries();
- final int currentIndex = density.getCurrentIndex();
+ final String[] entries = density.getDefaultDisplayDensityEntries();
+ final int currentIndex = density.getCurrentIndexForDefaultDisplay();
setSummary(entries[currentIndex]);
}
}
diff --git a/src/com/android/settings/display/ScreenZoomSettings.java b/src/com/android/settings/display/ScreenZoomSettings.java
index 4c46f01..ac10664 100644
--- a/src/com/android/settings/display/ScreenZoomSettings.java
+++ b/src/com/android/settings/display/ScreenZoomSettings.java
@@ -21,11 +21,9 @@
import android.content.Context;
import android.content.res.Configuration;
import android.os.Bundle;
-import android.view.Display;
import com.android.settings.R;
import com.android.settings.search.BaseSearchIndexProvider;
-import com.android.settingslib.display.DisplayDensityConfiguration;
import com.android.settingslib.display.DisplayDensityUtils;
import com.android.settingslib.search.SearchIndexable;
@@ -37,6 +35,7 @@
private int mDefaultDensity;
private int[] mValues;
+ private DisplayDensityUtils mDensity;
@Override
protected int getActivityLayoutResId() {
@@ -58,9 +57,9 @@
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
- final DisplayDensityUtils density = new DisplayDensityUtils(getContext());
+ mDensity = new DisplayDensityUtils(getContext());
- final int initialIndex = density.getCurrentIndex();
+ final int initialIndex = mDensity.getCurrentIndexForDefaultDisplay();
if (initialIndex < 0) {
// Failed to obtain default density, which means we failed to
// connect to the window manager service. Just use the current
@@ -71,10 +70,10 @@
mInitialIndex = 0;
mDefaultDensity = densityDpi;
} else {
- mValues = density.getValues();
- mEntries = density.getEntries();
+ mValues = mDensity.getDefaultDisplayDensityValues();
+ mEntries = mDensity.getDefaultDisplayDensityEntries();
mInitialIndex = initialIndex;
- mDefaultDensity = density.getDefaultDensity();
+ mDefaultDensity = mDensity.getDefaultDensityForDefaultDisplay();
}
getActivity().setTitle(R.string.screen_zoom_title);
@@ -95,9 +94,9 @@
protected void commit() {
final int densityDpi = mValues[mCurrentIndex];
if (densityDpi == mDefaultDensity) {
- DisplayDensityConfiguration.clearForcedDisplayDensity(Display.DEFAULT_DISPLAY);
+ mDensity.clearForcedDisplayDensity();
} else {
- DisplayDensityConfiguration.setForcedDisplayDensity(Display.DEFAULT_DISPLAY, densityDpi);
+ mDensity.setForcedDisplayDensity(densityDpi);
}
}
diff --git a/src/com/android/settings/display/WalletPrivacyPreferenceController.java b/src/com/android/settings/display/WalletPrivacyPreferenceController.java
index fe14a40..f40e838 100644
--- a/src/com/android/settings/display/WalletPrivacyPreferenceController.java
+++ b/src/com/android/settings/display/WalletPrivacyPreferenceController.java
@@ -64,15 +64,18 @@
public int getAvailabilityStatus() {
if (CustomizableLockScreenUtils.isFeatureEnabled(mContext)) {
return UNSUPPORTED_ON_DEVICE;
+ } else if (!isEnabled()) {
+ return UNSUPPORTED_ON_DEVICE;
+ } else if (!isSecure()) {
+ return DISABLED_DEPENDENT_SETTING;
}
-
- return isEnabled() && isSecure() ? AVAILABLE : DISABLED_DEPENDENT_SETTING;
+ return AVAILABLE;
}
@Override
public void updateState(Preference preference) {
super.updateState(preference);
- preference.setEnabled(getAvailabilityStatus() != DISABLED_DEPENDENT_SETTING);
+ preference.setEnabled(getAvailabilityStatus() == AVAILABLE);
refreshSummary(preference);
}
diff --git a/src/com/android/settings/network/CarrierConfigChangedReceiver.java b/src/com/android/settings/network/CarrierConfigChangedReceiver.java
index d9ff03e..8a6d47d 100644
--- a/src/com/android/settings/network/CarrierConfigChangedReceiver.java
+++ b/src/com/android/settings/network/CarrierConfigChangedReceiver.java
@@ -32,20 +32,9 @@
CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED;
private final CountDownLatch mLatch;
- private final boolean mIsWaitingForValidSubId;
- /**
- * This is the CarrierConfigChanged receiver. If it receives the carrier config changed, then it
- * call the CountDownLatch.countDown().
- * If the "isWaitingForValidSubId" is true, then the receiver skip the carrier config changed
- * with the subId = -1. The receiver executes the countDown when the CarrierConfigChanged
- * with valid subId.
- * If the "isWaitingForValidSubId" is false, then the receiver executes the countDown when
- * receiving any CarrierConfigChanged.
- */
- public CarrierConfigChangedReceiver(CountDownLatch latch, boolean isWaitingForValidSubId) {
+ public CarrierConfigChangedReceiver(CountDownLatch latch) {
mLatch = latch;
- mIsWaitingForValidSubId = isWaitingForValidSubId;
}
public void registerOn(Context context) {
@@ -64,8 +53,7 @@
}
private void checkSubscriptionIndex(Intent intent) {
- if (intent.hasExtra(CarrierConfigManager.EXTRA_SUBSCRIPTION_INDEX)
- || !mIsWaitingForValidSubId) {
+ if (intent.hasExtra(CarrierConfigManager.EXTRA_SUBSCRIPTION_INDEX)) {
int subId = intent.getIntExtra(CarrierConfigManager.EXTRA_SUBSCRIPTION_INDEX, -1);
Log.i(TAG, "subId from config changed: " + subId);
mLatch.countDown();
diff --git a/src/com/android/settings/network/UiccSlotUtil.java b/src/com/android/settings/network/UiccSlotUtil.java
index 4c26995..95a0e4d 100644
--- a/src/com/android/settings/network/UiccSlotUtil.java
+++ b/src/com/android/settings/network/UiccSlotUtil.java
@@ -140,8 +140,7 @@
inactiveRemovableSlot,
/*removable sim's port Id*/ TelephonyManager.DEFAULT_PORT_INDEX,
excludedLogicalSlotIndex),
- context,
- /*isWaitingForValidSubId=*/ true);
+ context);
}
/**
@@ -179,8 +178,7 @@
performSwitchToSlot(telMgr,
prepareUiccSlotMappings(uiccSlotMappings, /*slot is not psim*/ false,
physicalSlotId, port, excludedLogicalSlotIndex),
- context,
- /*isWaitingForValidSubId=*/ false);
+ context);
}
/**
@@ -232,8 +230,7 @@
}
private static void performSwitchToSlot(TelephonyManager telMgr,
- Collection<UiccSlotMapping> uiccSlotMappings, Context context,
- boolean isWaitingForValidSubId)
+ Collection<UiccSlotMapping> uiccSlotMappings, Context context)
throws UiccSlotsException {
CarrierConfigChangedReceiver receiver = null;
long waitingTimeMillis =
@@ -243,7 +240,7 @@
DEFAULT_WAIT_AFTER_SWITCH_TIMEOUT_MILLIS);
try {
CountDownLatch latch = new CountDownLatch(1);
- receiver = new CarrierConfigChangedReceiver(latch, isWaitingForValidSubId);
+ receiver = new CarrierConfigChangedReceiver(latch);
receiver.registerOn(context);
telMgr.setSimSlotMapping(uiccSlotMappings);
latch.await(waitingTimeMillis, TimeUnit.MILLISECONDS);
diff --git a/src/com/android/settings/network/telephony/cdma/CdmaSystemSelectPreferenceController.java b/src/com/android/settings/network/telephony/cdma/CdmaSystemSelectPreferenceController.java
index 5dd4453..4f4c35d 100644
--- a/src/com/android/settings/network/telephony/cdma/CdmaSystemSelectPreferenceController.java
+++ b/src/com/android/settings/network/telephony/cdma/CdmaSystemSelectPreferenceController.java
@@ -18,10 +18,12 @@
import static com.android.settings.network.telephony.TelephonyConstants.TelephonyManagerConstants.NETWORK_MODE_LTE_GSM_WCDMA;
import static com.android.settings.network.telephony.TelephonyConstants.TelephonyManagerConstants.NETWORK_MODE_NR_LTE_GSM_WCDMA;
+import static com.android.settings.network.telephony.TelephonyConstants.TelephonyManagerConstants.NETWORK_MODE_UNKNOWN;
import android.content.Context;
import android.provider.Settings;
import android.telephony.TelephonyManager;
+import android.util.Log;
import androidx.preference.ListPreference;
import androidx.preference.Preference;
@@ -33,6 +35,7 @@
*/
public class CdmaSystemSelectPreferenceController extends CdmaBasePreferenceController
implements ListPreference.OnPreferenceChangeListener {
+ private static final String TAG = "CdmaSystemSelectPreferenceController";
public CdmaSystemSelectPreferenceController(Context context, String key) {
super(context, key);
@@ -42,23 +45,36 @@
public void updateState(Preference preference) {
super.updateState(preference);
final ListPreference listPreference = (ListPreference) preference;
- listPreference.setVisible(getAvailabilityStatus() == AVAILABLE);
- final int mode = mTelephonyManager.getCdmaRoamingMode();
- if (mode != TelephonyManager.CDMA_ROAMING_MODE_RADIO_DEFAULT) {
- if (mode == TelephonyManager.CDMA_ROAMING_MODE_HOME
- || mode == TelephonyManager.CDMA_ROAMING_MODE_ANY) {
- listPreference.setValue(Integer.toString(mode));
- } else {
- resetCdmaRoamingModeToDefault();
- }
+ boolean isVisible = (getAvailabilityStatus() == AVAILABLE);
+ listPreference.setVisible(isVisible);
+ if (!isVisible) {
+ return;
}
+ boolean hasTelephonyMgr = mTelephonyManager != null;
+ try {
+ final int mode =
+ hasTelephonyMgr ? mTelephonyManager.getCdmaRoamingMode()
+ : TelephonyManager.CDMA_ROAMING_MODE_RADIO_DEFAULT;
+ if (mode != TelephonyManager.CDMA_ROAMING_MODE_RADIO_DEFAULT) {
+ if (mode == TelephonyManager.CDMA_ROAMING_MODE_HOME
+ || mode == TelephonyManager.CDMA_ROAMING_MODE_ANY) {
+ listPreference.setValue(Integer.toString(mode));
+ } else {
+ resetCdmaRoamingModeToDefault();
+ }
+ }
- final int settingsNetworkMode = MobileNetworkUtils.getNetworkTypeFromRaf(
- (int) mTelephonyManager.getAllowedNetworkTypesForReason(
- TelephonyManager.ALLOWED_NETWORK_TYPES_REASON_USER));
- final boolean enableList = settingsNetworkMode != NETWORK_MODE_LTE_GSM_WCDMA
- && settingsNetworkMode != NETWORK_MODE_NR_LTE_GSM_WCDMA;
- listPreference.setEnabled(enableList);
+ final int settingsNetworkMode =
+ hasTelephonyMgr ? MobileNetworkUtils.getNetworkTypeFromRaf(
+ (int) mTelephonyManager.getAllowedNetworkTypesForReason(
+ TelephonyManager.ALLOWED_NETWORK_TYPES_REASON_USER))
+ : NETWORK_MODE_UNKNOWN;
+ final boolean enableList = settingsNetworkMode != NETWORK_MODE_LTE_GSM_WCDMA
+ && settingsNetworkMode != NETWORK_MODE_NR_LTE_GSM_WCDMA;
+ listPreference.setEnabled(enableList);
+ } catch (Exception exception) {
+ Log.e(TAG, "Fail to access framework API", exception);
+ }
}
@Override
diff --git a/src/com/android/settings/notification/BubbleNotificationIllustrationPreferenceController.java b/src/com/android/settings/notification/BubbleNotificationIllustrationPreferenceController.java
new file mode 100644
index 0000000..fad83d8
--- /dev/null
+++ b/src/com/android/settings/notification/BubbleNotificationIllustrationPreferenceController.java
@@ -0,0 +1,49 @@
+/*
+ * 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.notification;
+
+import android.content.Context;
+
+import androidx.preference.PreferenceScreen;
+
+import com.android.settings.core.BasePreferenceController;
+import com.android.settingslib.widget.IllustrationPreference;
+import com.android.settingslib.widget.LottieColorUtils;
+
+/**
+ * Controller for the illustration shown for the feature level settings screen for bubbles.
+ */
+public class BubbleNotificationIllustrationPreferenceController extends BasePreferenceController {
+
+ public BubbleNotificationIllustrationPreferenceController(Context context, String key) {
+ super(context, key);
+ }
+
+ @Override
+ public int getAvailabilityStatus() {
+ return AVAILABLE;
+ }
+
+ @Override
+ public void displayPreference(PreferenceScreen screen) {
+ super.displayPreference(screen);
+ IllustrationPreference illustrationPreference = screen.findPreference(getPreferenceKey());
+ illustrationPreference.setOnBindListener(animationView -> {
+ LottieColorUtils.applyDynamicColors(mContext, animationView);
+ });
+ }
+}
diff --git a/src/com/android/settings/notification/NotificationVolumePreferenceController.java b/src/com/android/settings/notification/NotificationVolumePreferenceController.java
index 112debc..4fd2341 100644
--- a/src/com/android/settings/notification/NotificationVolumePreferenceController.java
+++ b/src/com/android/settings/notification/NotificationVolumePreferenceController.java
@@ -17,68 +17,51 @@
package com.android.settings.notification;
import android.app.ActivityThread;
-import android.app.INotificationManager;
import android.app.NotificationManager;
import android.content.BroadcastReceiver;
-import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.media.AudioManager;
+import android.os.Binder;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
-import android.os.ServiceManager;
-import android.os.Vibrator;
import android.provider.DeviceConfig;
import android.service.notification.NotificationListenerService;
-import android.text.TextUtils;
-import android.util.Log;
import androidx.lifecycle.OnLifecycleEvent;
import androidx.preference.PreferenceScreen;
-import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.config.sysui.SystemUiDeviceConfigFlags;
import com.android.settings.R;
-import com.android.settings.Utils;
import com.android.settingslib.core.lifecycle.Lifecycle;
-import java.util.Objects;
import java.util.Set;
/**
* Update notification volume icon in Settings in response to user adjusting volume.
*/
-public class NotificationVolumePreferenceController extends VolumeSeekBarPreferenceController {
+public class NotificationVolumePreferenceController extends
+ RingerModeAffectedVolumePreferenceController {
- private static final String TAG = "NotificationVolumePreferenceController";
private static final String KEY_NOTIFICATION_VOLUME = "notification_volume";
- private static final boolean CONFIG_DEFAULT_VAL = false;
- private boolean mSeparateNotification;
+ private static final String TAG = "NotificationVolumePreferenceController";
- private Vibrator mVibrator;
- private int mRingerMode = AudioManager.RINGER_MODE_NORMAL;
- private ComponentName mSuppressor;
private final RingReceiver mReceiver = new RingReceiver();
private final H mHandler = new H();
- private INotificationManager mNoMan;
- private int mMuteIcon;
- private final int mNormalIconId = R.drawable.ic_notifications;
- private final int mVibrateIconId = R.drawable.ic_volume_ringer_vibrate;
- private final int mSilentIconId = R.drawable.ic_notifications_off_24dp;
+
public NotificationVolumePreferenceController(Context context) {
this(context, KEY_NOTIFICATION_VOLUME);
}
public NotificationVolumePreferenceController(Context context, String key) {
- super(context, key);
+ super(context, key, TAG);
- mVibrator = (Vibrator) mContext.getSystemService(Context.VIBRATOR_SERVICE);
- if (mVibrator != null && !mVibrator.hasVibrator()) {
- mVibrator = null;
- }
+ mNormalIconId = R.drawable.ic_notifications;
+ mVibrateIconId = R.drawable.ic_volume_ringer_vibrate;
+ mSilentIconId = R.drawable.ic_notifications_off_24dp;
updateRingerMode();
}
@@ -94,13 +77,12 @@
if (mPreference == null) {
setupVolPreference(screen);
}
- mSeparateNotification = DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_SYSTEMUI,
- SystemUiDeviceConfigFlags.VOLUME_SEPARATE_NOTIFICATION, CONFIG_DEFAULT_VAL);
+ mSeparateNotification = isSeparateNotificationConfigEnabled();
if (mPreference != null) {
mPreference.setVisible(getAvailabilityStatus() == AVAILABLE);
}
updateEffectsSuppressor();
- updatePreferenceIconAndSliderState();
+ selectPreferenceIconState();
}
/**
@@ -110,8 +92,7 @@
Set<String> changeSet = properties.getKeyset();
if (changeSet.contains(SystemUiDeviceConfigFlags.VOLUME_SEPARATE_NOTIFICATION)) {
- boolean newVal = properties.getBoolean(
- SystemUiDeviceConfigFlags.VOLUME_SEPARATE_NOTIFICATION, CONFIG_DEFAULT_VAL);
+ boolean newVal = isSeparateNotificationConfigEnabled();
if (newVal != mSeparateNotification) {
mSeparateNotification = newVal;
// manually hiding the preference because being unavailable does not do the job
@@ -128,9 +109,9 @@
public void onResume() {
super.onResume();
mReceiver.register(true);
- DeviceConfig.addOnPropertiesChangedListener(DeviceConfig.NAMESPACE_SYSTEMUI,
- ActivityThread.currentApplication().getMainExecutor(),
- this::onDeviceConfigChange);
+ Binder.withCleanCallingIdentity(()
+ -> DeviceConfig.addOnPropertiesChangedListener(DeviceConfig.NAMESPACE_SYSTEMUI,
+ ActivityThread.currentApplication().getMainExecutor(), this::onDeviceConfigChange));
}
@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
@@ -138,86 +119,31 @@
public void onPause() {
super.onPause();
mReceiver.register(false);
- DeviceConfig.removeOnPropertiesChangedListener(this::onDeviceConfigChange);
+ Binder.withCleanCallingIdentity(() ->
+ DeviceConfig.removeOnPropertiesChangedListener(this::onDeviceConfigChange));
}
@Override
public int getAvailabilityStatus() {
- boolean separateNotification = DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_SYSTEMUI,
- SystemUiDeviceConfigFlags.VOLUME_SEPARATE_NOTIFICATION, false);
+ boolean separateNotification = isSeparateNotificationConfigEnabled();
return mContext.getResources().getBoolean(R.bool.config_show_notification_volume)
- && !mHelper.isSingleVolume()
- && (separateNotification || !Utils.isVoiceCapable(mContext))
+ && !mHelper.isSingleVolume() && separateNotification
? AVAILABLE : UNSUPPORTED_ON_DEVICE;
}
@Override
- public boolean isSliceable() {
- return TextUtils.equals(getPreferenceKey(), KEY_NOTIFICATION_VOLUME);
- }
-
- @Override
- public boolean isPublicSlice() {
- return true;
- }
-
- @Override
public String getPreferenceKey() {
return KEY_NOTIFICATION_VOLUME;
}
@Override
- public boolean useDynamicSliceSummary() {
- return true;
- }
-
- @Override
public int getAudioStream() {
return AudioManager.STREAM_NOTIFICATION;
}
@Override
- public int getMuteIcon() {
- return mMuteIcon;
- }
-
- private void updateRingerMode() {
- final int ringerMode = mHelper.getRingerModeInternal();
- if (mRingerMode == ringerMode) return;
- mRingerMode = ringerMode;
- updatePreferenceIconAndSliderState();
- }
-
- private void updateEffectsSuppressor() {
- final ComponentName suppressor = NotificationManager.from(mContext).getEffectsSuppressor();
- if (Objects.equals(suppressor, mSuppressor)) return;
-
- if (mNoMan == null) {
- mNoMan = INotificationManager.Stub.asInterface(
- ServiceManager.getService(Context.NOTIFICATION_SERVICE));
- }
-
- final int hints;
- try {
- hints = mNoMan.getHintsFromListenerNoToken();
- } catch (android.os.RemoteException exception) {
- Log.w(TAG, "updateEffectsSuppressor: " + exception.getLocalizedMessage());
- return;
- }
-
- if (hintsMatch(hints)) {
-
- mSuppressor = suppressor;
- if (mPreference != null) {
- final String text = SuppressorHelper.getSuppressionText(mContext, suppressor);
- mPreference.setSuppressionText(text);
- }
- }
- }
-
- @VisibleForTesting
- boolean hintsMatch(int hints) {
+ protected boolean hintsMatch(int hints) {
boolean allEffectsDisabled =
(hints & NotificationListenerService.HINT_HOST_DISABLE_EFFECTS) != 0;
boolean notificationEffectsDisabled =
@@ -226,20 +152,18 @@
return allEffectsDisabled || notificationEffectsDisabled;
}
- private void updatePreferenceIconAndSliderState() {
+ @Override
+ protected void selectPreferenceIconState() {
if (mPreference != null) {
if (mVibrator != null && mRingerMode == AudioManager.RINGER_MODE_VIBRATE) {
mMuteIcon = mVibrateIconId;
mPreference.showIcon(mVibrateIconId);
- mPreference.setEnabled(false);
} else if (mRingerMode == AudioManager.RINGER_MODE_SILENT
|| mVibrator == null && mRingerMode == AudioManager.RINGER_MODE_VIBRATE) {
mMuteIcon = mSilentIconId;
mPreference.showIcon(mSilentIconId);
- mPreference.setEnabled(false);
} else { // ringmode normal: could be that we are still silent
- mPreference.setEnabled(true);
if (mHelper.getStreamVolume(AudioManager.STREAM_NOTIFICATION) == 0) {
// ring is in normal, but notification is in silent
mMuteIcon = mSilentIconId;
@@ -270,7 +194,7 @@
updateRingerMode();
break;
case NOTIFICATION_VOLUME_CHANGED:
- updatePreferenceIconAndSliderState();
+ selectPreferenceIconState();
break;
}
}
diff --git a/src/com/android/settings/notification/RingVolumePreferenceController.java b/src/com/android/settings/notification/RingVolumePreferenceController.java
index 7fdb1e1..a8118c6 100644
--- a/src/com/android/settings/notification/RingVolumePreferenceController.java
+++ b/src/com/android/settings/notification/RingVolumePreferenceController.java
@@ -17,140 +17,83 @@
package com.android.settings.notification;
import android.app.ActivityThread;
-import android.app.INotificationManager;
import android.app.NotificationManager;
import android.content.BroadcastReceiver;
-import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.media.AudioManager;
+import android.os.Binder;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
-import android.os.ServiceManager;
-import android.os.Vibrator;
import android.provider.DeviceConfig;
import android.service.notification.NotificationListenerService;
-import android.text.TextUtils;
-import android.util.Log;
import androidx.lifecycle.OnLifecycleEvent;
-import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.config.sysui.SystemUiDeviceConfigFlags;
import com.android.settings.R;
-import com.android.settings.Utils;
import com.android.settingslib.core.lifecycle.Lifecycle;
-import java.util.Objects;
import java.util.Set;
/**
- * This slider can represent both ring and notification, if the corresponding streams are aliased,
- * and only ring if the streams are not aliased.
+ * This slider represents both ring and notification
*/
-public class RingVolumePreferenceController extends VolumeSeekBarPreferenceController {
+public class RingVolumePreferenceController extends
+ RingerModeAffectedVolumePreferenceController {
- private static final String TAG = "RingVolumePreferenceController";
private static final String KEY_RING_VOLUME = "ring_volume";
+ private static final String TAG = "RingVolumePreferenceController";
- private Vibrator mVibrator;
- private int mRingerMode = AudioManager.RINGER_MODE_NORMAL;
- private ComponentName mSuppressor;
private final RingReceiver mReceiver = new RingReceiver();
private final H mHandler = new H();
- private int mMuteIcon;
-
- private int mNormalIconId;
- @VisibleForTesting
- int mVibrateIconId;
- @VisibleForTesting
- int mSilentIconId;
-
- @VisibleForTesting
- int mTitleId;
-
- private boolean mSeparateNotification;
-
- private INotificationManager mNoMan;
-
- private static final boolean CONFIG_DEFAULT_VAL = false;
-
public RingVolumePreferenceController(Context context) {
this(context, KEY_RING_VOLUME);
}
public RingVolumePreferenceController(Context context, String key) {
- super(context, key);
- mVibrator = (Vibrator) mContext.getSystemService(Context.VIBRATOR_SERVICE);
- if (mVibrator != null && !mVibrator.hasVibrator()) {
- mVibrator = null;
- }
- mSeparateNotification = DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_SYSTEMUI,
- SystemUiDeviceConfigFlags.VOLUME_SEPARATE_NOTIFICATION, CONFIG_DEFAULT_VAL);
- loadPreferenceIconResources(mSeparateNotification);
- updateRingerMode();
- }
+ super(context, key, TAG);
- private void loadPreferenceIconResources(boolean separateNotification) {
- if (separateNotification) {
- mTitleId = R.string.separate_ring_volume_option_title;
- mNormalIconId = R.drawable.ic_ring_volume;
- mSilentIconId = R.drawable.ic_ring_volume_off;
- } else {
- mTitleId = R.string.ring_volume_option_title;
- mNormalIconId = R.drawable.ic_notifications;
- mSilentIconId = R.drawable.ic_notifications_off_24dp;
- }
- // todo: set a distinct vibrate icon for ring vs notification
+ mNormalIconId = R.drawable.ic_notifications;
mVibrateIconId = R.drawable.ic_volume_ringer_vibrate;
+ mSilentIconId = R.drawable.ic_notifications_off_24dp;
+
+ mSeparateNotification = isSeparateNotificationConfigEnabled();
+ updateRingerMode();
}
/**
* As the responsibility of this slider changes, so should its title & icon
*/
- public void onDeviceConfigChange(DeviceConfig.Properties properties) {
+ private void onDeviceConfigChange(DeviceConfig.Properties properties) {
Set<String> changeSet = properties.getKeyset();
if (changeSet.contains(SystemUiDeviceConfigFlags.VOLUME_SEPARATE_NOTIFICATION)) {
boolean valueUpdated = readSeparateNotificationVolumeConfig();
if (valueUpdated) {
updateEffectsSuppressor();
selectPreferenceIconState();
- setPreferenceTitle();
}
}
}
- /**
- * side effect: updates the cached value of the config, and also the icon
- * @return has the config changed?
- */
- private boolean readSeparateNotificationVolumeConfig() {
- boolean newVal = DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_SYSTEMUI,
- SystemUiDeviceConfigFlags.VOLUME_SEPARATE_NOTIFICATION, CONFIG_DEFAULT_VAL);
-
- boolean valueUpdated = newVal != mSeparateNotification;
- if (valueUpdated) {
- mSeparateNotification = newVal;
- loadPreferenceIconResources(newVal);
- }
-
- return valueUpdated;
- }
-
@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
@Override
public void onResume() {
super.onResume();
mReceiver.register(true);
readSeparateNotificationVolumeConfig();
- DeviceConfig.addOnPropertiesChangedListener(DeviceConfig.NAMESPACE_SYSTEMUI,
- ActivityThread.currentApplication().getMainExecutor(), this::onDeviceConfigChange);
+ Binder.withCleanCallingIdentity(()
+ -> DeviceConfig.addOnPropertiesChangedListener(DeviceConfig.NAMESPACE_SYSTEMUI,
+ ActivityThread.currentApplication().getMainExecutor(), this::onDeviceConfigChange));
updateEffectsSuppressor();
selectPreferenceIconState();
- setPreferenceTitle();
+
+ if (mPreference != null) {
+ mPreference.setVisible(getAvailabilityStatus() == AVAILABLE);
+ }
}
@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
@@ -158,7 +101,8 @@
public void onPause() {
super.onPause();
mReceiver.register(false);
- DeviceConfig.removeOnPropertiesChangedListener(this::onDeviceConfigChange);
+ Binder.withCleanCallingIdentity(() ->
+ DeviceConfig.removeOnPropertiesChangedListener(this::onDeviceConfigChange));
}
@Override
@@ -168,113 +112,25 @@
@Override
public int getAvailabilityStatus() {
- return Utils.isVoiceCapable(mContext) && !mHelper.isSingleVolume()
+ boolean separateNotification = isSeparateNotificationConfigEnabled();
+ return !separateNotification && !mHelper.isSingleVolume()
? AVAILABLE : UNSUPPORTED_ON_DEVICE;
}
@Override
- public boolean isSliceable() {
- return TextUtils.equals(getPreferenceKey(), KEY_RING_VOLUME);
- }
-
- @Override
- public boolean isPublicSlice() {
- return true;
- }
-
- @Override
- public boolean useDynamicSliceSummary() {
- return true;
- }
-
- @Override
public int getAudioStream() {
return AudioManager.STREAM_RING;
}
@Override
- public int getMuteIcon() {
- return mMuteIcon;
- }
-
- @VisibleForTesting
- void updateRingerMode() {
- final int ringerMode = mHelper.getRingerModeInternal();
- if (mRingerMode == ringerMode) return;
- mRingerMode = ringerMode;
- selectPreferenceIconState();
- }
-
- private void updateEffectsSuppressor() {
- final ComponentName suppressor = NotificationManager.from(mContext).getEffectsSuppressor();
- if (Objects.equals(suppressor, mSuppressor)) return;
-
- if (mNoMan == null) {
- mNoMan = INotificationManager.Stub.asInterface(
- ServiceManager.getService(Context.NOTIFICATION_SERVICE));
- }
-
- final int hints;
- try {
- hints = mNoMan.getHintsFromListenerNoToken();
- } catch (android.os.RemoteException ex) {
- Log.w(TAG, "updateEffectsSuppressor: " + ex.getMessage());
- return;
- }
-
- if (hintsMatch(hints, DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_SYSTEMUI,
- SystemUiDeviceConfigFlags.VOLUME_SEPARATE_NOTIFICATION, false))) {
- mSuppressor = suppressor;
- if (mPreference != null) {
- final String text = SuppressorHelper.getSuppressionText(mContext, suppressor);
- mPreference.setSuppressionText(text);
- }
- }
- }
-
- @VisibleForTesting
- boolean hintsMatch(int hints, boolean notificationSeparated) {
+ protected boolean hintsMatch(int hints) {
+ boolean notificationSeparated = isSeparateNotificationConfigEnabled();
return (hints & NotificationListenerService.HINT_HOST_DISABLE_CALL_EFFECTS) != 0
|| (hints & NotificationListenerService.HINT_HOST_DISABLE_EFFECTS) != 0
|| ((hints & NotificationListenerService.HINT_HOST_DISABLE_NOTIFICATION_EFFECTS)
!= 0 && !notificationSeparated);
}
- @VisibleForTesting
- void setPreference(VolumeSeekBarPreference volumeSeekBarPreference) {
- mPreference = volumeSeekBarPreference;
- }
-
- @VisibleForTesting
- void setVibrator(Vibrator vibrator) {
- mVibrator = vibrator;
- }
-
- private void selectPreferenceIconState() {
- if (mPreference != null) {
- if (mRingerMode == AudioManager.RINGER_MODE_NORMAL) {
- mPreference.showIcon(mNormalIconId);
- } else {
- if (mRingerMode == AudioManager.RINGER_MODE_VIBRATE && mVibrator != null) {
- mMuteIcon = mVibrateIconId;
- } else {
- mMuteIcon = mSilentIconId;
- }
- mPreference.showIcon(mMuteIcon);
- }
- }
- }
-
- /**
- * This slider can represent both ring and notification, or only ring.
- * Note: This cannot be used in the constructor, as the reference to preference object would
- * still be null.
- */
- private void setPreferenceTitle() {
- if (mPreference != null) {
- mPreference.setTitle(mTitleId);
- }
- }
private final class H extends Handler {
private static final int UPDATE_EFFECTS_SUPPRESSOR = 1;
diff --git a/src/com/android/settings/notification/RingerModeAffectedVolumePreferenceController.java b/src/com/android/settings/notification/RingerModeAffectedVolumePreferenceController.java
new file mode 100644
index 0000000..255fe2f
--- /dev/null
+++ b/src/com/android/settings/notification/RingerModeAffectedVolumePreferenceController.java
@@ -0,0 +1,170 @@
+/*
+ * 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.notification;
+
+import android.app.INotificationManager;
+import android.app.NotificationManager;
+import android.content.ComponentName;
+import android.content.Context;
+import android.media.AudioManager;
+import android.os.Binder;
+import android.os.ServiceManager;
+import android.os.Vibrator;
+import android.provider.DeviceConfig;
+import android.util.Log;
+
+import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.config.sysui.SystemUiDeviceConfigFlags;
+
+import java.util.Objects;
+
+/**
+ * Shared functionality and interfaces for volume controllers whose state can change by ringer mode
+ */
+public abstract class RingerModeAffectedVolumePreferenceController extends
+ VolumeSeekBarPreferenceController {
+
+ private final String mTag;
+
+ protected int mNormalIconId;
+ protected int mVibrateIconId;
+ protected int mSilentIconId;
+ protected int mMuteIcon;
+
+ protected Vibrator mVibrator;
+ protected int mRingerMode = AudioManager.RINGER_MODE_NORMAL;
+ protected ComponentName mSuppressor;
+ protected boolean mSeparateNotification;
+ protected INotificationManager mNoMan;
+
+ private static final boolean CONFIG_SEPARATE_NOTIFICATION_DEFAULT_VAL = false;
+
+ public RingerModeAffectedVolumePreferenceController(Context context, String key, String tag) {
+ super(context, key);
+ mTag = tag;
+ mVibrator = mContext.getSystemService(Vibrator.class);
+ if (mVibrator != null && !mVibrator.hasVibrator()) {
+ mVibrator = null;
+ }
+ }
+
+ protected void updateEffectsSuppressor() {
+ final ComponentName suppressor = NotificationManager.from(mContext).getEffectsSuppressor();
+ if (Objects.equals(suppressor, mSuppressor)) return;
+
+ if (mNoMan == null) {
+ mNoMan = INotificationManager.Stub.asInterface(
+ ServiceManager.getService(Context.NOTIFICATION_SERVICE));
+ }
+
+ final int hints;
+ try {
+ hints = mNoMan.getHintsFromListenerNoToken();
+ } catch (android.os.RemoteException ex) {
+ Log.w(mTag, "updateEffectsSuppressor: " + ex.getMessage());
+ return;
+ }
+
+ if (hintsMatch(hints)) {
+ mSuppressor = suppressor;
+ if (mPreference != null) {
+ final String text = SuppressorHelper.getSuppressionText(mContext, suppressor);
+ mPreference.setSuppressionText(text);
+ }
+ }
+ }
+
+ @VisibleForTesting
+ void setPreference(VolumeSeekBarPreference volumeSeekBarPreference) {
+ mPreference = volumeSeekBarPreference;
+ }
+
+ @VisibleForTesting
+ void setVibrator(Vibrator vibrator) {
+ mVibrator = vibrator;
+ }
+
+ @Override
+ public boolean isSliceable() {
+ return true;
+ }
+
+ @Override
+ public boolean isPublicSlice() {
+ return true;
+ }
+
+ @Override
+ public boolean useDynamicSliceSummary() {
+ return true;
+ }
+
+ @Override
+ public int getMuteIcon() {
+ return mMuteIcon;
+ }
+
+ protected boolean isSeparateNotificationConfigEnabled() {
+ return Binder.withCleanCallingIdentity(()
+ -> DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_SYSTEMUI,
+ SystemUiDeviceConfigFlags.VOLUME_SEPARATE_NOTIFICATION,
+ CONFIG_SEPARATE_NOTIFICATION_DEFAULT_VAL));
+ }
+
+ /**
+ * side effect: updates the cached value of the config
+ * @return has the config changed?
+ */
+ protected boolean readSeparateNotificationVolumeConfig() {
+ boolean newVal = isSeparateNotificationConfigEnabled();
+
+ boolean valueUpdated = newVal != mSeparateNotification;
+ if (valueUpdated) {
+ mSeparateNotification = newVal;
+ }
+
+ return valueUpdated;
+ }
+
+ protected void updateRingerMode() {
+ final int ringerMode = mHelper.getRingerModeInternal();
+ if (mRingerMode == ringerMode) return;
+ mRingerMode = ringerMode;
+ selectPreferenceIconState();
+ }
+
+ /**
+ * Switching among normal/mute/vibrate
+ */
+ protected void selectPreferenceIconState() {
+ if (mPreference != null) {
+ if (mRingerMode == AudioManager.RINGER_MODE_NORMAL) {
+ mPreference.showIcon(mNormalIconId);
+ } else {
+ if (mRingerMode == AudioManager.RINGER_MODE_VIBRATE && mVibrator != null) {
+ mMuteIcon = mVibrateIconId;
+ } else {
+ mMuteIcon = mSilentIconId;
+ }
+ mPreference.showIcon(getMuteIcon());
+ }
+ }
+ }
+
+ protected abstract boolean hintsMatch(int hints);
+
+}
diff --git a/src/com/android/settings/notification/SeparateRingVolumePreferenceController.java b/src/com/android/settings/notification/SeparateRingVolumePreferenceController.java
new file mode 100644
index 0000000..e23dd38
--- /dev/null
+++ b/src/com/android/settings/notification/SeparateRingVolumePreferenceController.java
@@ -0,0 +1,178 @@
+/*
+ * 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.notification;
+
+import android.app.ActivityThread;
+import android.app.NotificationManager;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.media.AudioManager;
+import android.os.Handler;
+import android.os.Looper;
+import android.os.Message;
+import android.provider.DeviceConfig;
+import android.service.notification.NotificationListenerService;
+
+import androidx.lifecycle.OnLifecycleEvent;
+
+import com.android.internal.config.sysui.SystemUiDeviceConfigFlags;
+import com.android.settings.R;
+import com.android.settingslib.core.lifecycle.Lifecycle;
+
+import java.util.Set;
+
+/**
+ * This slider is used to represent ring volume when ring is separated from notification
+ */
+public class SeparateRingVolumePreferenceController extends
+ RingerModeAffectedVolumePreferenceController {
+
+ private static final String KEY_SEPARATE_RING_VOLUME = "separate_ring_volume";
+ private static final String TAG = "SeparateRingVolumePreferenceController";
+
+ private final RingReceiver mReceiver = new RingReceiver();
+ private final H mHandler = new H();
+
+ public SeparateRingVolumePreferenceController(Context context) {
+ this(context, KEY_SEPARATE_RING_VOLUME);
+ }
+
+ public SeparateRingVolumePreferenceController(Context context, String key) {
+ super(context, key, TAG);
+
+ mNormalIconId = R.drawable.ic_ring_volume;
+ mVibrateIconId = R.drawable.ic_volume_ringer_vibrate;
+ mSilentIconId = R.drawable.ic_ring_volume_off;
+
+ mSeparateNotification = isSeparateNotificationConfigEnabled();
+ updateRingerMode();
+ }
+
+ /**
+ * Show/hide settings
+ */
+ private void onDeviceConfigChange(DeviceConfig.Properties properties) {
+ Set<String> changeSet = properties.getKeyset();
+ if (changeSet.contains(SystemUiDeviceConfigFlags.VOLUME_SEPARATE_NOTIFICATION)) {
+ boolean valueUpdated = readSeparateNotificationVolumeConfig();
+ if (valueUpdated) {
+ updateEffectsSuppressor();
+ selectPreferenceIconState();
+ }
+ }
+ }
+
+ @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
+ @Override
+ public void onResume() {
+ super.onResume();
+ mReceiver.register(true);
+ readSeparateNotificationVolumeConfig();
+ DeviceConfig.addOnPropertiesChangedListener(DeviceConfig.NAMESPACE_SYSTEMUI,
+ ActivityThread.currentApplication().getMainExecutor(), this::onDeviceConfigChange);
+ updateEffectsSuppressor();
+ selectPreferenceIconState();
+
+ if (mPreference != null) {
+ mPreference.setVisible(getAvailabilityStatus() == AVAILABLE);
+ }
+ }
+
+ @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
+ @Override
+ public void onPause() {
+ super.onPause();
+ mReceiver.register(false);
+ DeviceConfig.removeOnPropertiesChangedListener(this::onDeviceConfigChange);
+ }
+
+ @Override
+ public String getPreferenceKey() {
+ return KEY_SEPARATE_RING_VOLUME;
+ }
+
+ @Override
+ public int getAvailabilityStatus() {
+ boolean separateNotification = isSeparateNotificationConfigEnabled();
+ return separateNotification && !mHelper.isSingleVolume()
+ ? AVAILABLE : UNSUPPORTED_ON_DEVICE;
+ }
+
+ @Override
+ public int getAudioStream() {
+ return AudioManager.STREAM_RING;
+ }
+
+ @Override
+ protected boolean hintsMatch(int hints) {
+ return (hints & NotificationListenerService.HINT_HOST_DISABLE_CALL_EFFECTS) != 0
+ || (hints & NotificationListenerService.HINT_HOST_DISABLE_EFFECTS) != 0;
+ }
+
+
+
+ private final class H extends Handler {
+ private static final int UPDATE_EFFECTS_SUPPRESSOR = 1;
+ private static final int UPDATE_RINGER_MODE = 2;
+
+ private H() {
+ super(Looper.getMainLooper());
+ }
+
+ @Override
+ public void handleMessage(Message msg) {
+ switch (msg.what) {
+ case UPDATE_EFFECTS_SUPPRESSOR:
+ updateEffectsSuppressor();
+ break;
+ case UPDATE_RINGER_MODE:
+ updateRingerMode();
+ break;
+ }
+ }
+ }
+
+ private class RingReceiver extends BroadcastReceiver {
+ private boolean mRegistered;
+
+ public void register(boolean register) {
+ if (mRegistered == register) return;
+ if (register) {
+ final IntentFilter filter = new IntentFilter();
+ filter.addAction(NotificationManager.ACTION_EFFECTS_SUPPRESSOR_CHANGED);
+ filter.addAction(AudioManager.INTERNAL_RINGER_MODE_CHANGED_ACTION);
+ mContext.registerReceiver(this, filter);
+ } else {
+ mContext.unregisterReceiver(this);
+ }
+ mRegistered = register;
+ }
+
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ final String action = intent.getAction();
+ if (NotificationManager.ACTION_EFFECTS_SUPPRESSOR_CHANGED.equals(action)) {
+ mHandler.sendEmptyMessage(H.UPDATE_EFFECTS_SUPPRESSOR);
+ } else if (AudioManager.INTERNAL_RINGER_MODE_CHANGED_ACTION.equals(action)) {
+ mHandler.sendEmptyMessage(H.UPDATE_RINGER_MODE);
+ }
+ }
+ }
+
+}
diff --git a/src/com/android/settings/notification/ShowOnlyUnseenNotificationsOnLockscreenPreferenceController.java b/src/com/android/settings/notification/ShowOnlyUnseenNotificationsOnLockscreenPreferenceController.java
new file mode 100644
index 0000000..a37e29d
--- /dev/null
+++ b/src/com/android/settings/notification/ShowOnlyUnseenNotificationsOnLockscreenPreferenceController.java
@@ -0,0 +1,71 @@
+/*
+ * 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.notification;
+
+import static android.provider.Settings.Secure.LOCK_SCREEN_SHOW_ONLY_UNSEEN_NOTIFICATIONS;
+
+import android.content.Context;
+import android.provider.Settings;
+
+import androidx.annotation.VisibleForTesting;
+
+import com.android.settings.R;
+import com.android.settings.core.TogglePreferenceController;
+
+public class ShowOnlyUnseenNotificationsOnLockscreenPreferenceController
+ extends TogglePreferenceController {
+
+ private static final int UNSET = 0;
+ @VisibleForTesting
+ static final int ON = 1;
+ @VisibleForTesting
+ static final int OFF = 2;
+
+ public ShowOnlyUnseenNotificationsOnLockscreenPreferenceController(
+ Context context,
+ String preferenceKey) {
+ super(context, preferenceKey);
+ }
+
+ @Override
+ public boolean isChecked() {
+ return Settings.Secure.getInt(mContext.getContentResolver(),
+ LOCK_SCREEN_SHOW_ONLY_UNSEEN_NOTIFICATIONS, UNSET) == ON;
+ }
+
+ @Override
+ public boolean setChecked(boolean isChecked) {
+ return Settings.Secure.putInt(mContext.getContentResolver(),
+ LOCK_SCREEN_SHOW_ONLY_UNSEEN_NOTIFICATIONS, isChecked ? ON : OFF);
+ }
+
+ @Override
+ public int getAvailabilityStatus() {
+ int setting = Settings.Secure.getInt(mContext.getContentResolver(),
+ LOCK_SCREEN_SHOW_ONLY_UNSEEN_NOTIFICATIONS, UNSET);
+ if (setting == UNSET) {
+ return CONDITIONALLY_UNAVAILABLE;
+ } else {
+ return AVAILABLE;
+ }
+ }
+
+ @Override
+ public int getSliceHighlightMenuRes() {
+ return R.string.menu_key_notifications;
+ }
+}
diff --git a/src/com/android/settings/notification/SoundSettings.java b/src/com/android/settings/notification/SoundSettings.java
index 2d6f377..2cc1b1c 100644
--- a/src/com/android/settings/notification/SoundSettings.java
+++ b/src/com/android/settings/notification/SoundSettings.java
@@ -188,6 +188,7 @@
volumeControllers.add(use(AlarmVolumePreferenceController.class));
volumeControllers.add(use(MediaVolumePreferenceController.class));
volumeControllers.add(use(RingVolumePreferenceController.class));
+ volumeControllers.add(use(SeparateRingVolumePreferenceController.class));
volumeControllers.add(use(NotificationVolumePreferenceController.class));
volumeControllers.add(use(CallVolumePreferenceController.class));
diff --git a/src/com/android/settings/panel/PanelSlicesAdapter.java b/src/com/android/settings/panel/PanelSlicesAdapter.java
index d728366..1bced76 100644
--- a/src/com/android/settings/panel/PanelSlicesAdapter.java
+++ b/src/com/android/settings/panel/PanelSlicesAdapter.java
@@ -54,7 +54,7 @@
* Maximum number of slices allowed on the panel view.
*/
@VisibleForTesting
- static final int MAX_NUM_OF_SLICES = 7;
+ static final int MAX_NUM_OF_SLICES = 9;
private final List<LiveData<Slice>> mSliceLiveData;
private final int mMetricsCategory;
diff --git a/src/com/android/settings/panel/VolumePanel.java b/src/com/android/settings/panel/VolumePanel.java
index 08884d5..938ee9d 100644
--- a/src/com/android/settings/panel/VolumePanel.java
+++ b/src/com/android/settings/panel/VolumePanel.java
@@ -24,7 +24,9 @@
import static com.android.settings.slices.CustomSliceRegistry.VOLUME_ALARM_URI;
import static com.android.settings.slices.CustomSliceRegistry.VOLUME_CALL_URI;
import static com.android.settings.slices.CustomSliceRegistry.VOLUME_MEDIA_URI;
+import static com.android.settings.slices.CustomSliceRegistry.VOLUME_NOTIFICATION_URI;
import static com.android.settings.slices.CustomSliceRegistry.VOLUME_RINGER_URI;
+import static com.android.settings.slices.CustomSliceRegistry.VOLUME_SEPARATE_RING_URI;
import android.app.Activity;
import android.app.settings.SettingsEnums;
@@ -125,6 +127,10 @@
return mContext.getText(R.string.sound_settings);
}
+ /**
+ * When considering ring and notification, we include all controllers unconditionally and rely
+ * on getAvailability to govern visibility
+ */
@Override
public List<Uri> getSlices() {
final List<Uri> uris = new ArrayList<>();
@@ -139,6 +145,8 @@
uris.add(MEDIA_OUTPUT_INDICATOR_SLICE_URI);
uris.add(VOLUME_CALL_URI);
uris.add(VOLUME_RINGER_URI);
+ uris.add(VOLUME_SEPARATE_RING_URI);
+ uris.add(VOLUME_NOTIFICATION_URI);
uris.add(VOLUME_ALARM_URI);
return uris;
}
@@ -189,4 +197,4 @@
}
return null;
}
-}
\ No newline at end of file
+}
diff --git a/src/com/android/settings/password/ChooseLockPattern.java b/src/com/android/settings/password/ChooseLockPattern.java
index c39ef66..c0342d1 100644
--- a/src/com/android/settings/password/ChooseLockPattern.java
+++ b/src/com/android/settings/password/ChooseLockPattern.java
@@ -212,9 +212,10 @@
protected LockPatternView mLockPatternView;
protected TextView mFooterText;
protected FooterButton mSkipOrClearButton;
- private FooterButton mNextButton;
+ protected FooterButton mNextButton;
@VisibleForTesting protected LockscreenCredential mChosenPattern;
private ColorStateList mDefaultHeaderColorList;
+ private View mSudContent;
/**
* The patten used during the help screen to show how to draw a pattern.
@@ -367,31 +368,34 @@
Introduction(
R.string.lock_settings_picker_biometrics_added_security_message,
- R.string.lockpattern_recording_intro_header,
+ R.string.lockpassword_choose_your_pattern_description,
LeftButtonMode.Gone, RightButtonMode.ContinueDisabled,
ID_EMPTY_MESSAGE, true),
HelpScreen(
- ID_EMPTY_MESSAGE, R.string.lockpattern_settings_help_how_to_record,
+ R.string.lockpattern_settings_help_how_to_record,
+ R.string.lockpattern_settings_help_how_to_record,
LeftButtonMode.Gone, RightButtonMode.Ok, ID_EMPTY_MESSAGE, false),
ChoiceTooShort(
- R.string.lock_settings_picker_biometrics_added_security_message,
+ R.string.lockpattern_recording_incorrect_too_short,
R.string.lockpattern_recording_incorrect_too_short,
LeftButtonMode.Retry, RightButtonMode.ContinueDisabled,
ID_EMPTY_MESSAGE, true),
FirstChoiceValid(
- R.string.lock_settings_picker_biometrics_added_security_message,
+ R.string.lockpattern_pattern_entered_header,
R.string.lockpattern_pattern_entered_header,
LeftButtonMode.Retry, RightButtonMode.Continue, ID_EMPTY_MESSAGE, false),
NeedToConfirm(
- ID_EMPTY_MESSAGE, R.string.lockpattern_need_to_confirm,
+ R.string.lockpattern_need_to_confirm, R.string.lockpattern_need_to_confirm,
LeftButtonMode.Gone, RightButtonMode.ConfirmDisabled,
ID_EMPTY_MESSAGE, true),
ConfirmWrong(
- ID_EMPTY_MESSAGE, R.string.lockpattern_need_to_unlock_wrong,
+ R.string.lockpattern_need_to_unlock_wrong,
+ R.string.lockpattern_need_to_unlock_wrong,
LeftButtonMode.Gone, RightButtonMode.ConfirmDisabled,
ID_EMPTY_MESSAGE, true),
ChoiceConfirmed(
- ID_EMPTY_MESSAGE, R.string.lockpattern_pattern_confirmed_header,
+ R.string.lockpattern_pattern_confirmed_header,
+ R.string.lockpattern_pattern_confirmed_header,
LeftButtonMode.Gone, RightButtonMode.Confirm, ID_EMPTY_MESSAGE, false);
@@ -537,6 +541,10 @@
);
mSkipOrClearButton = mixin.getSecondaryButton();
mNextButton = mixin.getPrimaryButton();
+ // TODO(b/243008023) Workaround for Glif layout on 2 panel choose lock settings.
+ mSudContent = layout.findViewById(R.id.sud_layout_content);
+ mSudContent.setPadding(mSudContent.getPaddingLeft(), 0, mSudContent.getPaddingRight(),
+ 0);
return layout;
}
@@ -544,7 +552,9 @@
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
- mHeaderText = (TextView) view.findViewById(R.id.headerText);
+ final GlifLayout layout = getActivity().findViewById(R.id.setup_wizard_layout);
+ mHeaderText = layout.getDescriptionTextView();
+ mHeaderText.setMinLines(2);
mDefaultHeaderColorList = mHeaderText.getTextColors();
mLockPatternView = (LockPatternView) view.findViewById(R.id.lockPattern);
mLockPatternView.setOnPatternListener(mChooseNewLockPatternListener);
@@ -719,30 +729,24 @@
*/
protected void updateStage(Stage stage) {
final Stage previousStage = mUiStage;
-
+ final GlifLayout layout = getActivity().findViewById(R.id.setup_wizard_layout);
mUiStage = stage;
+ if (stage == Stage.Introduction) {
+ layout.setDescriptionText(stage.headerMessage);
+ }
+
// header text, footer text, visibility and
// enabled state all known from the stage
if (stage == Stage.ChoiceTooShort) {
- mHeaderText.setText(
+ layout.setDescriptionText(
getResources().getString(
stage.headerMessage,
LockPatternUtils.MIN_LOCK_PATTERN_SIZE));
} else {
- mHeaderText.setText(stage.headerMessage);
+ layout.setDescriptionText(stage.headerMessage);
}
- final GlifLayout layout = getActivity().findViewById(R.id.setup_wizard_layout);
- final boolean forAnyBiometric = mForFingerprint || mForFace || mForBiometrics;
- if (forAnyBiometric) {
- if (stage.messageForBiometrics == ID_EMPTY_MESSAGE) {
- layout.setDescriptionText("");
- } else {
- layout.setDescriptionText(stage.messageForBiometrics);
- }
- } else {
- layout.getDescriptionTextView().setVisibility(View.GONE);
- }
+
if (stage.footerMessage == ID_EMPTY_MESSAGE) {
mFooterText.setText("");
} else {
@@ -760,8 +764,8 @@
mHeaderText.setTextColor(mDefaultHeaderColorList);
}
- if (stage == Stage.NeedToConfirm && forAnyBiometric) {
- mHeaderText.setText("");
+ if (stage == Stage.NeedToConfirm) {
+ mHeaderText.setText(stage.headerMessage);
layout.setHeaderText(R.string.lockpassword_draw_your_pattern_again_header);
}
}
@@ -791,6 +795,7 @@
mLockPatternView.setPattern(DisplayMode.Animate, mAnimatePattern);
break;
case ChoiceTooShort:
+ case ConfirmWrong:
mLockPatternView.setDisplayMode(DisplayMode.Wrong);
postClearPatternRunnable();
announceAlways = true;
@@ -800,11 +805,6 @@
case NeedToConfirm:
mLockPatternView.clearPattern();
break;
- case ConfirmWrong:
- mLockPatternView.setDisplayMode(DisplayMode.Wrong);
- postClearPatternRunnable();
- announceAlways = true;
- break;
case ChoiceConfirmed:
break;
}
diff --git a/src/com/android/settings/password/ConfirmLockPattern.java b/src/com/android/settings/password/ConfirmLockPattern.java
index 1062d94..b4f0aa3 100644
--- a/src/com/android/settings/password/ConfirmLockPattern.java
+++ b/src/com/android/settings/password/ConfirmLockPattern.java
@@ -100,6 +100,7 @@
private CountDownTimer mCountdownTimer;
private GlifLayout mGlifLayout;
+ private View mSudContent;
// caller-supplied text for various prompts
private CharSequence mHeaderText;
@@ -129,7 +130,10 @@
mGlifLayout = view.findViewById(R.id.setup_wizard_layout);
mLockPatternView = (LockPatternView) view.findViewById(R.id.lockPattern);
mErrorTextView = (TextView) view.findViewById(R.id.errorText);
-
+ // TODO(b/243008023) Workaround for Glif layout on 2 panel choose lock settings.
+ mSudContent = mGlifLayout.findViewById(R.id.sud_layout_content);
+ mSudContent.setPadding(mSudContent.getPaddingLeft(), 0, mSudContent.getPaddingRight(),
+ 0);
mIsManagedProfile = UserManager.get(getActivity()).isManagedProfile(mEffectiveUserId);
// make it so unhandled touch events within the unlock screen go to the
diff --git a/src/com/android/settings/password/SetupChooseLockPattern.java b/src/com/android/settings/password/SetupChooseLockPattern.java
index fd925ec..09ecda4 100644
--- a/src/com/android/settings/password/SetupChooseLockPattern.java
+++ b/src/com/android/settings/password/SetupChooseLockPattern.java
@@ -16,6 +16,8 @@
package com.android.settings.password;
+import static android.content.res.Configuration.ORIENTATION_LANDSCAPE;
+
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
@@ -30,8 +32,6 @@
import com.android.settings.R;
import com.android.settings.SetupRedactionInterstitial;
-import com.google.android.setupdesign.GlifLayout;
-
/**
* Setup Wizard's version of ChooseLockPattern screen. It inherits the logic and basic structure
* from ChooseLockPattern class, and should remain similar to that behaviorally. This class should
@@ -123,15 +123,25 @@
startChooseLockActivity(lock, getActivity());
}
+ private boolean showMinimalUi() {
+ return getResources().getBoolean(R.bool.config_lock_pattern_minimal_ui);
+ }
+
@Override
protected void updateStage(Stage stage) {
super.updateStage(stage);
- if (!getResources().getBoolean(R.bool.config_lock_pattern_minimal_ui)
- && mOptionsButton != null) {
+ if (!showMinimalUi() && mOptionsButton != null) {
+ // In landscape, keep view stub to avoid pattern view shifting, but in portrait the
+ // header title and description could become multiple lines in confirm stage,
+ // gone the button view to reserve more room for growth height of header.
+ @View.Visibility
+ final int hideOrGone =
+ getResources().getConfiguration().orientation == ORIENTATION_LANDSCAPE
+ ? View.INVISIBLE : View.GONE;
mOptionsButton.setVisibility(
(stage == Stage.Introduction || stage == Stage.HelpScreen ||
stage == Stage.ChoiceTooShort || stage == Stage.FirstChoiceValid)
- ? View.VISIBLE : View.INVISIBLE);
+ ? View.VISIBLE : hideOrGone);
}
if (stage.leftMode == LeftButtonMode.Gone && stage == Stage.Introduction) {
@@ -141,10 +151,6 @@
} else {
mLeftButtonIsSkip = false;
}
-
- final GlifLayout layout = getActivity().findViewById(R.id.setup_wizard_layout);
- layout.setDescriptionText(
- getString(R.string.lockpassword_choose_your_pattern_description));
}
@Override
diff --git a/src/com/android/settings/privacy/EnableContentCapturePreferenceController.java b/src/com/android/settings/privacy/EnableContentCapturePreferenceController.java
index 3cf72b2..5377f15 100644
--- a/src/com/android/settings/privacy/EnableContentCapturePreferenceController.java
+++ b/src/com/android/settings/privacy/EnableContentCapturePreferenceController.java
@@ -18,6 +18,8 @@
import android.annotation.NonNull;
import android.content.Context;
+import android.os.UserHandle;
+import android.os.UserManager;
import com.android.settings.R;
import com.android.settings.core.TogglePreferenceController;
@@ -42,9 +44,15 @@
@Override
public int getAvailabilityStatus() {
- boolean available = ContentCaptureUtils.isFeatureAvailable()
- && ContentCaptureUtils.getServiceSettingsComponentName() == null;
- return available ? AVAILABLE : UNSUPPORTED_ON_DEVICE;
+ if (!ContentCaptureUtils.isFeatureAvailable()
+ || ContentCaptureUtils.getServiceSettingsComponentName() != null) {
+ return UNSUPPORTED_ON_DEVICE;
+ }
+ if (UserManager.get(mContext).hasUserRestrictionForUser(
+ UserManager.DISALLOW_CONTENT_CAPTURE, UserHandle.of(UserHandle.myUserId()))) {
+ return DISABLED_FOR_USER;
+ }
+ return AVAILABLE;
}
@Override
diff --git a/src/com/android/settings/slices/CustomSliceRegistry.java b/src/com/android/settings/slices/CustomSliceRegistry.java
index c49d622..c499823 100644
--- a/src/com/android/settings/slices/CustomSliceRegistry.java
+++ b/src/com/android/settings/slices/CustomSliceRegistry.java
@@ -196,7 +196,7 @@
.build();
/**
- * Full {@link Uri} for the Ringer volume Slice.
+ * Full {@link Uri} for the Ringer volume Slice. (Ring & notification combined)
*/
public static final Uri VOLUME_RINGER_URI = new Uri.Builder()
.scheme(ContentResolver.SCHEME_CONTENT)
@@ -206,6 +206,16 @@
.build();
/**
+ * Full {@link Uri} for the Separate Ring volume Slice.
+ */
+ public static final Uri VOLUME_SEPARATE_RING_URI = new Uri.Builder()
+ .scheme(ContentResolver.SCHEME_CONTENT)
+ .authority(SettingsSliceProvider.SLICE_AUTHORITY)
+ .appendPath(SettingsSlicesContract.PATH_SETTING_ACTION)
+ .appendPath("separate_ring_volume")
+ .build();
+
+ /**
* Full {@link Uri} for the Notification volume Slice.
*/
public static final Uri VOLUME_NOTIFICATION_URI = new Uri.Builder()
diff --git a/src/com/android/settings/slices/SliceDataConverter.java b/src/com/android/settings/slices/SliceDataConverter.java
index eb08c5f..5177ff7 100644
--- a/src/com/android/settings/slices/SliceDataConverter.java
+++ b/src/com/android/settings/slices/SliceDataConverter.java
@@ -52,6 +52,7 @@
import com.android.settings.core.PreferenceXmlParserUtils;
import com.android.settings.core.PreferenceXmlParserUtils.MetadataFlag;
import com.android.settings.dashboard.DashboardFragment;
+import com.android.settings.notification.RingerModeAffectedVolumePreferenceController;
import com.android.settings.overlay.FeatureFactory;
import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
import com.android.settingslib.search.Indexable.SearchIndexProvider;
@@ -202,7 +203,10 @@
final BasePreferenceController controller = SliceBuilderUtils
.getPreferenceController(mContext, controllerClassName, key);
// Only add pre-approved Slices available on the device.
- if (!controller.isSliceable() || !controller.isAvailable()) {
+ // Always index RingerModeAffected slices so they are available for panel
+ if (!controller.isSliceable()
+ || !(controller.isAvailable()
+ || controller instanceof RingerModeAffectedVolumePreferenceController)) {
continue;
}
final String title = bundle.getString(METADATA_TITLE);
diff --git a/tests/robotests/src/com/android/settings/biometrics/face/FaceEnrollEducationTest.java b/tests/robotests/src/com/android/settings/biometrics/face/FaceEnrollEducationTest.java
new file mode 100644
index 0000000..b4dddde
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/biometrics/face/FaceEnrollEducationTest.java
@@ -0,0 +1,225 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.biometrics.face;
+
+import static android.util.DisplayMetrics.DENSITY_DEFAULT;
+import static android.util.DisplayMetrics.DENSITY_XXXHIGH;
+
+import static com.android.settings.biometrics.BiometricEnrollBase.EXTRA_KEY_NEXT_LAUNCHED;
+import static com.android.settings.biometrics.BiometricEnrollBase.EXTRA_LAUNCHED_POSTURE_GUIDANCE;
+import static com.android.settings.biometrics.BiometricUtils.DEVICE_POSTURE_CLOSED;
+import static com.android.settings.biometrics.BiometricUtils.DEVICE_POSTURE_OPENED;
+import static com.android.settings.biometrics.BiometricUtils.DEVICE_POSTURE_UNKNOWN;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.content.Intent;
+import android.content.res.Configuration;
+import android.hardware.face.FaceManager;
+import android.view.View;
+
+import androidx.test.core.app.ApplicationProvider;
+
+import com.android.settings.R;
+import com.android.settings.password.ChooseLockSettingsHelper;
+import com.android.settings.testutils.FakeFeatureFactory;
+import com.android.settings.testutils.shadow.ShadowUtils;
+
+import com.google.android.setupcompat.template.FooterBarMixin;
+import com.google.android.setupcompat.template.FooterButton;
+import com.google.android.setupdesign.GlifLayout;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.Robolectric;
+import org.robolectric.RobolectricTestRunner;
+import org.robolectric.android.controller.ActivityController;
+import org.robolectric.annotation.Config;
+
+@RunWith(RobolectricTestRunner.class)
+@Config(shadows = {ShadowUtils.class})
+public class FaceEnrollEducationTest {
+ @Mock
+ private FaceManager mFaceManager;
+
+ private Context mContext;
+ private ActivityController<TestFaceEnrollEducation> mActivityController;
+ private TestFaceEnrollEducation mActivity;
+ private FakeFeatureFactory mFakeFeatureFactory;
+
+ public static class TestFaceEnrollEducation extends FaceEnrollEducation {
+
+ @Override
+ protected boolean launchPostureGuidance() {
+ return super.launchPostureGuidance();
+ }
+ }
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ ShadowUtils.setFaceManager(mFaceManager);
+ mFakeFeatureFactory = FakeFeatureFactory.setupForTest();
+ }
+
+ @After
+ public void tearDown() {
+ ShadowUtils.reset();
+ }
+
+ private void setupActivityForPosture() {
+ final Intent testIntent = new Intent();
+ // Set the challenge token so the confirm screen will not be shown
+ testIntent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE_TOKEN, new byte[0]);
+ testIntent.putExtra(EXTRA_KEY_NEXT_LAUNCHED, false);
+ testIntent.putExtra(EXTRA_LAUNCHED_POSTURE_GUIDANCE, false);
+
+ when(mFakeFeatureFactory.mFaceFeatureProvider.getPostureGuidanceIntent(any())).thenReturn(
+ testIntent);
+ mContext = spy(ApplicationProvider.getApplicationContext());
+ mActivityController = Robolectric.buildActivity(
+ TestFaceEnrollEducation.class, testIntent);
+ mActivity = spy(mActivityController.create().get());
+
+ when(mContext.getSystemService(Context.FACE_SERVICE)).thenReturn(mFaceManager);
+ }
+
+ private void setupActivity() {
+ final Intent testIntent = new Intent();
+ // Set the challenge token so the confirm screen will not be shown
+ testIntent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE_TOKEN, new byte[0]);
+
+ when(mFakeFeatureFactory.mFaceFeatureProvider.getPostureGuidanceIntent(any())).thenReturn(
+ null /* Simulate no posture intent */);
+ mContext = spy(ApplicationProvider.getApplicationContext());
+ mActivityController = Robolectric.buildActivity(
+ TestFaceEnrollEducation.class, testIntent);
+ mActivity = spy(mActivityController.create().get());
+
+ when(mContext.getSystemService(Context.FACE_SERVICE)).thenReturn(mFaceManager);
+ }
+
+ private GlifLayout getGlifLayout() {
+ return mActivity.findViewById(R.id.setup_wizard_layout);
+ }
+
+ @Test
+ public void testFaceEnrollEducation_hasHeader() {
+ setupActivity();
+ CharSequence headerText = getGlifLayout().getHeaderText();
+
+ assertThat(headerText.toString()).isEqualTo(
+ mContext.getString(R.string.security_settings_face_enroll_education_title));
+ }
+
+ @Test
+ public void testFaceEnrollEducation_hasDescription() {
+ setupActivity();
+ CharSequence desc = getGlifLayout().getDescriptionText();
+
+ assertThat(desc.toString()).isEqualTo(
+ mContext.getString(R.string.security_settings_face_enroll_education_message));
+ }
+
+ @Test
+ public void testFaceEnrollEducation_showFooterPrimaryButton() {
+ setupActivity();
+ FooterBarMixin footer = getGlifLayout().getMixin(FooterBarMixin.class);
+ FooterButton footerButton = footer.getPrimaryButton();
+
+ assertThat(footerButton.getVisibility()).isEqualTo(View.VISIBLE);
+ assertThat(footerButton.getText().toString()).isEqualTo(
+ mContext.getString(R.string.security_settings_face_enroll_education_start));
+ }
+
+ @Test
+ public void testFaceEnrollEducation_showFooterSecondaryButton() {
+ setupActivity();
+ FooterBarMixin footer = getGlifLayout().getMixin(FooterBarMixin.class);
+ FooterButton footerButton = footer.getSecondaryButton();
+
+ assertThat(footerButton.getVisibility()).isEqualTo(View.VISIBLE);
+ assertThat(footerButton.getText().toString()).isEqualTo(mContext.getString(
+ R.string.security_settings_face_enroll_introduction_cancel));
+ }
+
+ @Test
+ public void testFaceEnrollEducation_defaultNeverLaunchPostureGuidance() {
+ setupActivity();
+
+ assertThat(mActivity.launchPostureGuidance()).isFalse();
+ assertThat(mActivity.getDevicePostureState()).isEqualTo(DEVICE_POSTURE_UNKNOWN);
+ }
+
+ @Test
+ public void testFaceEnrollEducation_onStartNeverRegisterPostureChangeCallback() {
+ setupActivity();
+ mActivity.onStart();
+
+ assertThat(mActivity.getPostureGuidanceIntent()).isNull();
+ assertThat(mActivity.getPostureCallback()).isNull();
+ assertThat(mActivity.getDevicePostureState()).isEqualTo(DEVICE_POSTURE_UNKNOWN);
+ }
+
+ @Test
+ public void testFaceEnrollEducationWithPosture_onStartRegisteredPostureChangeCallback() {
+ setupActivityForPosture();
+ mActivity.onStart();
+
+ assertThat(mActivity.getPostureGuidanceIntent()).isNotNull();
+ assertThat(mActivity.getPostureCallback()).isNotNull();
+ }
+
+ @Test
+ public void testFaceEnrollEducationWithPosture_onFoldedUpdated_unFolded() {
+ final Configuration newConfig = new Configuration();
+ newConfig.smallestScreenWidthDp = DENSITY_XXXHIGH;
+ setupActivityForPosture();
+ mActivity.onStart();
+
+ assertThat(mActivity.getPostureGuidanceIntent()).isNotNull();
+ assertThat(mActivity.getPostureCallback()).isNotNull();
+
+ mActivity.onConfigurationChanged(newConfig);
+
+ assertThat(mActivity.getDevicePostureState()).isEqualTo(DEVICE_POSTURE_OPENED);
+ }
+
+ @Test
+ public void testFaceEnrollEducationWithPosture_onFoldedUpdated_folded() {
+ final Configuration newConfig = new Configuration();
+ newConfig.smallestScreenWidthDp = DENSITY_DEFAULT;
+ setupActivityForPosture();
+ mActivity.onStart();
+
+ assertThat(mActivity.getPostureGuidanceIntent()).isNotNull();
+ assertThat(mActivity.getPostureCallback()).isNotNull();
+
+ mActivity.onConfigurationChanged(newConfig);
+
+ assertThat(mActivity.getDevicePostureState()).isEqualTo(DEVICE_POSTURE_CLOSED);
+ }
+}
diff --git a/tests/robotests/src/com/android/settings/biometrics/face/FaceEnrollIntroductionTest.java b/tests/robotests/src/com/android/settings/biometrics/face/FaceEnrollIntroductionTest.java
new file mode 100644
index 0000000..6c04add
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/biometrics/face/FaceEnrollIntroductionTest.java
@@ -0,0 +1,403 @@
+/*
+ * 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.biometrics.face;
+
+import static android.app.admin.DevicePolicyManager.PASSWORD_QUALITY_NUMERIC;
+import static android.util.DisplayMetrics.DENSITY_DEFAULT;
+import static android.util.DisplayMetrics.DENSITY_XXXHIGH;
+
+import static com.android.settings.biometrics.BiometricEnrollBase.EXTRA_KEY_NEXT_LAUNCHED;
+import static com.android.settings.biometrics.BiometricEnrollBase.EXTRA_LAUNCHED_POSTURE_GUIDANCE;
+import static com.android.settings.biometrics.BiometricUtils.DEVICE_POSTURE_CLOSED;
+import static com.android.settings.biometrics.BiometricUtils.DEVICE_POSTURE_OPENED;
+import static com.android.settings.biometrics.BiometricUtils.DEVICE_POSTURE_UNKNOWN;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth.assertWithMessage;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.Mockito.doAnswer;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.when;
+
+import android.app.Activity;
+import android.content.Context;
+import android.content.Intent;
+import android.content.res.Configuration;
+import android.hardware.face.Face;
+import android.hardware.face.FaceManager;
+import android.os.UserHandle;
+import android.view.View;
+import android.widget.TextView;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.test.core.app.ApplicationProvider;
+
+import com.android.internal.widget.LockPatternUtils;
+import com.android.settings.R;
+import com.android.settings.biometrics.BiometricUtils;
+import com.android.settings.password.ChooseLockSettingsHelper;
+import com.android.settings.testutils.FakeFeatureFactory;
+import com.android.settings.testutils.shadow.ShadowDevicePolicyManager;
+import com.android.settings.testutils.shadow.ShadowLockPatternUtils;
+import com.android.settings.testutils.shadow.ShadowSensorPrivacyManager;
+import com.android.settings.testutils.shadow.ShadowUserManager;
+import com.android.settings.testutils.shadow.ShadowUtils;
+
+import com.google.android.setupcompat.template.FooterBarMixin;
+import com.google.android.setupcompat.template.FooterButton;
+import com.google.android.setupdesign.GlifLayout;
+import com.google.android.setupdesign.view.BottomScrollView;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.Robolectric;
+import org.robolectric.RobolectricTestRunner;
+import org.robolectric.Shadows;
+import org.robolectric.android.controller.ActivityController;
+import org.robolectric.annotation.Config;
+import org.robolectric.shadows.ShadowActivity;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@RunWith(RobolectricTestRunner.class)
+@Config(shadows = {
+ ShadowLockPatternUtils.class,
+ ShadowUserManager.class,
+ ShadowUtils.class,
+ ShadowDevicePolicyManager.class,
+ ShadowSensorPrivacyManager.class
+})
+public class FaceEnrollIntroductionTest {
+
+ @Mock
+ private FaceManager mFaceManager;
+ @Mock
+ private LockPatternUtils mLockPatternUtils;
+
+ private Context mContext;
+ private ActivityController<? extends Activity> mController;
+ private TestFaceEnrollIntroduction mActivity;
+ private FaceEnrollIntroduction mSpyActivity;
+ private FakeFeatureFactory mFakeFeatureFactory;
+ private ShadowUserManager mUserManager;
+
+ enum GateKeeperAction { CALL_SUPER, RETURN_BYTE_ARRAY, THROW_CREDENTIAL_NOT_MATCH }
+
+ public static class TestFaceEnrollIntroduction extends FaceEnrollIntroduction {
+
+ private int mRecreateCount = 0;
+
+ public int getRecreateCount() {
+ return mRecreateCount;
+ }
+
+ @Override
+ public void recreate() {
+ mRecreateCount++;
+ // Do nothing
+ }
+
+ public boolean getConfirmingCredentials() {
+ return mConfirmingCredentials;
+ }
+
+ public FaceManager mOverrideFaceManager = null;
+ @NonNull
+ public GateKeeperAction mGateKeeperAction = GateKeeperAction.CALL_SUPER;
+
+ @Nullable
+ @Override
+ public byte[] requestGatekeeperHat(long challenge) {
+ switch (mGateKeeperAction) {
+ case RETURN_BYTE_ARRAY:
+ return new byte[]{1};
+ case THROW_CREDENTIAL_NOT_MATCH:
+ throw new BiometricUtils.GatekeeperCredentialNotMatchException("test");
+ case CALL_SUPER:
+ default:
+ return super.requestGatekeeperHat(challenge);
+ }
+ }
+
+ @Nullable
+ @Override
+ protected FaceManager getFaceManager() {
+ return mOverrideFaceManager;
+ }
+
+ @Override
+ protected boolean launchPostureGuidance() {
+ return super.launchPostureGuidance();
+ }
+ }
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ ShadowUtils.setFaceManager(mFaceManager);
+ mUserManager = ShadowUserManager.getShadow();
+ mFakeFeatureFactory = FakeFeatureFactory.setupForTest();
+
+ when(mFakeFeatureFactory.securityFeatureProvider.getLockPatternUtils(any(Context.class)))
+ .thenReturn(mLockPatternUtils);
+ }
+
+ @After
+ public void tearDown() {
+ ShadowUtils.reset();
+ }
+
+ private void setupActivity() {
+ final Intent testIntent = new Intent();
+ // Set the challenge token so the confirm screen will not be shown
+ testIntent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE_TOKEN, new byte[0]);
+
+ when(mFakeFeatureFactory.mFaceFeatureProvider.getPostureGuidanceIntent(any())).thenReturn(
+ null /* Simulate no posture intent */);
+ mContext = spy(ApplicationProvider.getApplicationContext());
+ mUserManager.addUserProfile(new UserHandle(0));
+ mController = Robolectric.buildActivity(
+ TestFaceEnrollIntroduction.class, testIntent);
+ mActivity = (TestFaceEnrollIntroduction) spy(mController.get());
+ mActivity.mOverrideFaceManager = mFaceManager;
+ when(mActivity.getPostureGuidanceIntent()).thenReturn(null);
+ when(mContext.getApplicationContext()).thenReturn(mContext);
+ when(mContext.getSystemService(Context.FACE_SERVICE)).thenReturn(mFaceManager);
+ when(mContext.getSystemService(Context.USER_SERVICE)).thenReturn(mUserManager);
+ when(mLockPatternUtils.getActivePasswordQuality(Mockito.anyInt())).thenReturn(
+ PASSWORD_QUALITY_NUMERIC);
+
+ mController.create();
+ }
+
+ private void setupActivityForPosture() {
+ final Intent testIntent = new Intent();
+ // Set the challenge token so the confirm screen will not be shown
+ testIntent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE_TOKEN, new byte[0]);
+ testIntent.putExtra(EXTRA_KEY_NEXT_LAUNCHED, false);
+ testIntent.putExtra(EXTRA_LAUNCHED_POSTURE_GUIDANCE, false);
+
+ when(mFakeFeatureFactory.mFaceFeatureProvider.getPostureGuidanceIntent(any())).thenReturn(
+ testIntent);
+
+ mContext = spy(ApplicationProvider.getApplicationContext());
+ mUserManager.addUserProfile(new UserHandle(0));
+ mController = Robolectric.buildActivity(TestFaceEnrollIntroduction.class, testIntent);
+ mSpyActivity = (FaceEnrollIntroduction) spy(mController.get());
+ when(mSpyActivity.getPostureGuidanceIntent()).thenReturn(testIntent);
+ when(mContext.getSystemService(Context.FACE_SERVICE)).thenReturn(mFaceManager);
+ when(mContext.getSystemService(Context.USER_SERVICE)).thenReturn(mUserManager);
+ when(mLockPatternUtils.getActivePasswordQuality(Mockito.anyInt())).thenReturn(
+ PASSWORD_QUALITY_NUMERIC);
+
+ mController.create();
+ }
+
+ private void setupActivityWithGenerateChallenge(@NonNull Intent intent) {
+ doAnswer(invocation -> {
+ final FaceManager.GenerateChallengeCallback callback =
+ invocation.getArgument(1);
+ callback.onGenerateChallengeResult(0, 0, 1L);
+ return null;
+ }).when(mFaceManager).generateChallenge(anyInt(), any());
+ mController = Robolectric.buildActivity(TestFaceEnrollIntroduction.class, intent);
+ mActivity = (TestFaceEnrollIntroduction) mController.get();
+ mActivity.mOverrideFaceManager = mFaceManager;
+ }
+
+ private GlifLayout getGlifLayout(Activity activity) {
+ return activity.findViewById(R.id.setup_wizard_layout);
+ }
+
+ private void setFaceManagerToHave(int numEnrollments) {
+ List<Face> faces = new ArrayList<>();
+ for (int i = 0; i < numEnrollments; i++) {
+ faces.add(new Face("Face " + i /* name */, 1 /*faceId */, 1 /* deviceId */));
+ }
+ when(mFaceManager.getEnrolledFaces(anyInt())).thenReturn(faces);
+ }
+
+ @Test
+ public void intro_CheckCanEnroll() {
+ setFaceManagerToHave(0 /* numEnrollments */);
+ setupActivityWithGenerateChallenge(new Intent());
+ mController.create();
+ int result = mActivity.checkMaxEnrolled();
+
+ assertThat(result).isEqualTo(0);
+ }
+
+ @Test
+ public void intro_CheckMaxEnrolled() {
+ setFaceManagerToHave(1 /* numEnrollments */);
+ setupActivityWithGenerateChallenge(new Intent());
+ mController.create();
+ int result = mActivity.checkMaxEnrolled();
+
+ assertThat(result).isEqualTo(R.string.face_intro_error_max);
+ }
+
+ @Test
+ public void testOnCreate() {
+ setupActivityWithGenerateChallenge(new Intent());
+ mController.create();
+ }
+
+ @Test
+ public void testOnCreateToGenerateChallenge() {
+ setupActivityWithGenerateChallenge(
+ new Intent().putExtra(ChooseLockSettingsHelper.EXTRA_KEY_GK_PW_HANDLE, 1L));
+ mActivity.mGateKeeperAction = GateKeeperAction.RETURN_BYTE_ARRAY;
+ mController.create();
+ }
+
+ @Test
+ public void testGenerateChallengeFailThenRecreate() {
+ setupActivityWithGenerateChallenge(
+ new Intent().putExtra(ChooseLockSettingsHelper.EXTRA_KEY_GK_PW_HANDLE, 1L));
+ mActivity.mGateKeeperAction = GateKeeperAction.THROW_CREDENTIAL_NOT_MATCH;
+ mController.create();
+
+ // Make sure recreate() is called on original activity
+ assertThat(mActivity.getRecreateCount()).isEqualTo(1);
+
+ // Simulate recreate() action
+ setupActivityWithGenerateChallenge(mActivity.getIntent());
+ mController.create();
+
+ // Verify confirmLock()
+ assertThat(mActivity.getConfirmingCredentials()).isTrue();
+ ShadowActivity shadowActivity = Shadows.shadowOf(mActivity);
+ ShadowActivity.IntentForResult startedActivity =
+ shadowActivity.getNextStartedActivityForResult();
+ assertWithMessage("Next activity 1").that(startedActivity).isNotNull();
+ }
+
+ @Test
+ public void testFaceEnrollIntroduction_hasHeader() {
+ setupActivity();
+ TextView headerTextView = getGlifLayout(mActivity).findViewById(R.id.suc_layout_title);
+
+ assertThat(headerTextView).isNotNull();
+ assertThat(headerTextView.getText().toString()).isNotEmpty();
+ }
+
+ @Test
+ public void testFaceEnrollIntroduction_hasDescription() {
+ setupActivity();
+ CharSequence desc = getGlifLayout(mActivity).getDescriptionText();
+
+ assertThat(desc.toString()).isEqualTo(
+ mContext.getString(R.string.security_settings_face_enroll_introduction_message));
+ }
+
+ @Test
+ public void testFaceEnrollEducation_hasBottomScrollView() {
+ setupActivity();
+ BottomScrollView scrollView = getGlifLayout(mActivity).findViewById(R.id.sud_scroll_view);
+
+ assertThat(scrollView).isNotNull();
+ assertThat(scrollView.getVisibility()).isEqualTo(View.VISIBLE);
+ }
+
+ @Test
+ public void testFaceEnrollIntroduction_showFooterPrimaryButton() {
+ setupActivity();
+ FooterBarMixin footer = getGlifLayout(mActivity).getMixin(FooterBarMixin.class);
+ FooterButton footerButton = footer.getPrimaryButton();
+
+ assertThat(footerButton).isNotNull();
+ assertThat(footerButton.getVisibility()).isEqualTo(View.VISIBLE);
+ assertThat(footerButton.getText().toString()).isEqualTo(
+ mContext.getString(R.string.security_settings_face_enroll_introduction_agree));
+ }
+
+ @Test
+ public void testFaceEnrollIntroduction_notShowFooterSecondaryButton() {
+ setupActivity();
+ FooterBarMixin footer = getGlifLayout(mActivity).getMixin(FooterBarMixin.class);
+ FooterButton footerButton = footer.getSecondaryButton();
+
+ assertThat(footerButton.getVisibility()).isEqualTo(View.INVISIBLE);
+ }
+
+ @Test
+ public void testFaceEnrollIntroduction_defaultNeverLaunchPostureGuidance() {
+ setupActivity();
+
+ assertThat(mActivity.launchPostureGuidance()).isFalse();
+ assertThat(mActivity.getDevicePostureState()).isEqualTo(DEVICE_POSTURE_UNKNOWN);
+ }
+
+ @Test
+ public void testFaceEnrollIntroduction_onStartNeverRegisterPostureChangeCallback() {
+ setupActivity();
+ mActivity.onStart();
+
+ assertThat(mActivity.getPostureGuidanceIntent()).isNull();
+ assertThat(mActivity.getPostureCallback()).isNull();
+ assertThat(mActivity.getDevicePostureState()).isEqualTo(DEVICE_POSTURE_UNKNOWN);
+ }
+
+ @Test
+ public void testFaceEnrollIntroduction_onStartRegisteredPostureChangeCallback() {
+ setupActivityForPosture();
+ mSpyActivity.onStart();
+
+ assertThat(mSpyActivity.getPostureGuidanceIntent()).isNotNull();
+ assertThat(mSpyActivity.getPostureCallback()).isNotNull();
+ }
+
+ @Test
+ public void testFaceEnrollIntroduction_onFoldedUpdated_unFolded() {
+ final Configuration newConfig = new Configuration();
+ newConfig.smallestScreenWidthDp = DENSITY_XXXHIGH;
+ setupActivityForPosture();
+ mSpyActivity.onStart();
+
+ assertThat(mSpyActivity.getPostureGuidanceIntent()).isNotNull();
+ assertThat(mSpyActivity.getPostureCallback()).isNotNull();
+
+ mSpyActivity.onConfigurationChanged(newConfig);
+
+ assertThat(mSpyActivity.getDevicePostureState()).isEqualTo(DEVICE_POSTURE_OPENED);
+ }
+
+ @Test
+ public void testFaceEnrollEducation_onFoldedUpdated_folded() {
+ final Configuration newConfig = new Configuration();
+ newConfig.smallestScreenWidthDp = DENSITY_DEFAULT;
+ setupActivityForPosture();
+ mSpyActivity.onStart();
+
+ assertThat(mSpyActivity.getPostureGuidanceIntent()).isNotNull();
+ assertThat(mSpyActivity.getPostureCallback()).isNotNull();
+
+ mSpyActivity.onConfigurationChanged(newConfig);
+
+ assertThat(mSpyActivity.getDevicePostureState()).isEqualTo(DEVICE_POSTURE_CLOSED);
+ }
+}
diff --git a/tests/robotests/src/com/android/settings/biometrics/fingerprint/FingerprintSettingsRequireScreenOnToAuthPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/biometrics/fingerprint/FingerprintSettingsRequireScreenOnToAuthPreferenceControllerTest.java
index ff74d59..b6df62e 100644
--- a/tests/robotests/src/com/android/settings/biometrics/fingerprint/FingerprintSettingsRequireScreenOnToAuthPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/biometrics/fingerprint/FingerprintSettingsRequireScreenOnToAuthPreferenceControllerTest.java
@@ -81,12 +81,12 @@
@Test
public void onPreferenceChange_settingIsUpdated() {
boolean state = Settings.Secure.getInt(mContext.getContentResolver(),
- Settings.Secure.SFPS_REQUIRE_SCREEN_ON_TO_AUTH_ENABLED, 1) != 0;
+ Settings.Secure.SFPS_PERFORMANT_AUTH_ENABLED, 1) != 0;
assertThat(mController.isChecked()).isFalse();
assertThat(mController.onPreferenceChange(mPreference, !state)).isTrue();
boolean newState = Settings.Secure.getInt(mContext.getContentResolver(),
- Settings.Secure.SFPS_REQUIRE_SCREEN_ON_TO_AUTH_ENABLED, 1) != 0;
+ Settings.Secure.SFPS_PERFORMANT_AUTH_ENABLED, 1) != 0;
assertThat(newState).isEqualTo(!state);
}
diff --git a/tests/robotests/src/com/android/settings/display/WalletPrivacyPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/display/WalletPrivacyPreferenceControllerTest.java
index 73f4946..32b8b66 100644
--- a/tests/robotests/src/com/android/settings/display/WalletPrivacyPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/display/WalletPrivacyPreferenceControllerTest.java
@@ -141,11 +141,29 @@
}
@Test
- public void getAvailabilityStatus_noService_returnsDisabled() {
+ public void getAvailabilityStatus_noServiceAndIsSecure_returnsUnsupported() {
when(mClient.isWalletServiceAvailable()).thenReturn(false);
when(mLockPatternUtils.isSecure(anyInt())).thenReturn(true);
assertThat(mController.getAvailabilityStatus()).isEqualTo(
+ BasePreferenceController.UNSUPPORTED_ON_DEVICE);
+ }
+
+ @Test
+ public void getAvailabilityStatus_hasServiceButNotSecure_returnsDisabled() {
+ when(mClient.isWalletServiceAvailable()).thenReturn(true);
+ when(mLockPatternUtils.isSecure(anyInt())).thenReturn(false);
+
+ assertThat(mController.getAvailabilityStatus()).isEqualTo(
BasePreferenceController.DISABLED_DEPENDENT_SETTING);
}
+
+ @Test
+ public void getAvailabilityStatus_hasServiceAndIsSecure_returnsAvailable() {
+ when(mClient.isWalletServiceAvailable()).thenReturn(true);
+ when(mLockPatternUtils.isSecure(anyInt())).thenReturn(true);
+
+ assertThat(mController.getAvailabilityStatus()).isEqualTo(
+ BasePreferenceController.AVAILABLE);
+ }
}
diff --git a/tests/robotests/src/com/android/settings/notification/RingVolumePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/RingVolumePreferenceControllerTest.java
index 1ad26c7..6728fee 100644
--- a/tests/robotests/src/com/android/settings/notification/RingVolumePreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/notification/RingVolumePreferenceControllerTest.java
@@ -32,7 +32,7 @@
import android.telephony.TelephonyManager;
import com.android.internal.config.sysui.SystemUiDeviceConfigFlags;
-import com.android.settings.R;
+import com.android.settings.core.BasePreferenceController;
import com.android.settings.testutils.shadow.ShadowDeviceConfig;
import org.junit.Before;
@@ -83,6 +83,9 @@
when(mContext.getResources()).thenReturn(mResources);
mController = new RingVolumePreferenceController(mContext);
mController.setAudioHelper(mHelper);
+
+ DeviceConfig.setProperty(DeviceConfig.NAMESPACE_SYSTEMUI,
+ SystemUiDeviceConfigFlags.VOLUME_SEPARATE_NOTIFICATION, "false", false);
}
@Test
@@ -93,16 +96,21 @@
assertThat(mController.isAvailable()).isFalse();
}
+ /**
+ * Devices that are not voice capable should still show Ring volume, because it is used by apps
+ * that make calls outside the cell network.
+ */
@Test
- public void isAvailable_notVoiceCapable_shouldReturnFalse() {
+ public void isAvailable_notSingleVolume_notVoiceCapable_shouldReturnTrue() {
when(mHelper.isSingleVolume()).thenReturn(false);
when(mTelephonyManager.isVoiceCapable()).thenReturn(false);
- assertThat(mController.isAvailable()).isFalse();
+ assertThat(mController.isAvailable()).isTrue();
}
@Test
public void isAvailable_notSingleVolume_VoiceCapable_shouldReturnTrue() {
+
when(mHelper.isSingleVolume()).thenReturn(false);
when(mTelephonyManager.isVoiceCapable()).thenReturn(true);
@@ -126,9 +134,11 @@
assertThat(mController.isPublicSlice()).isTrue();
}
- // todo: verify that the title change is displayed, by examining the underlying preference
+ /**
+ * Only when the two streams are merged would this controller appear
+ */
@Test
- public void ringNotificationStreamsNotAliased_sliderTitleSetToRingOnly() {
+ public void ringNotificationStreamsSeparate_controllerIsNotAvailable() {
DeviceConfig.setProperty(DeviceConfig.NAMESPACE_SYSTEMUI,
SystemUiDeviceConfigFlags.VOLUME_SEPARATE_NOTIFICATION, "true", false);
@@ -136,60 +146,68 @@
final RingVolumePreferenceController controller =
new RingVolumePreferenceController(mContext);
- int expectedTitleId = R.string.separate_ring_volume_option_title;
+ int controllerAvailability = controller.getAvailabilityStatus();
- assertThat(controller.mTitleId).isEqualTo(expectedTitleId);
- }
-
- @Test
- public void ringNotificationStreamsAliased_sliderTitleIncludesBothRingNotification() {
-
- DeviceConfig.setProperty(DeviceConfig.NAMESPACE_SYSTEMUI,
- SystemUiDeviceConfigFlags.VOLUME_SEPARATE_NOTIFICATION, "false", false);
-
- final RingVolumePreferenceController control = new RingVolumePreferenceController(mContext);
-
- int expectedTitleId = R.string.ring_volume_option_title;
-
- assertThat(control.mTitleId).isEqualTo(expectedTitleId);
+ assertThat(controllerAvailability)
+ .isNotEqualTo(BasePreferenceController.AVAILABLE);
}
@Test
public void setHintsRing_aliased_Matches() {
+ DeviceConfig.setProperty(DeviceConfig.NAMESPACE_SYSTEMUI,
+ SystemUiDeviceConfigFlags.VOLUME_SEPARATE_NOTIFICATION, "false", false);
+
+
assertThat(mController.hintsMatch(
- NotificationListenerService.HINT_HOST_DISABLE_CALL_EFFECTS, false)).isTrue();
+ NotificationListenerService.HINT_HOST_DISABLE_CALL_EFFECTS)).isTrue();
}
@Test
public void setHintsRingNotification_aliased_Matches() {
- assertThat(mController.hintsMatch(NotificationListenerService.HINT_HOST_DISABLE_EFFECTS,
- false)).isTrue();
+ DeviceConfig.setProperty(DeviceConfig.NAMESPACE_SYSTEMUI,
+ SystemUiDeviceConfigFlags.VOLUME_SEPARATE_NOTIFICATION, "false", false);
+
+ assertThat(mController.hintsMatch(NotificationListenerService.HINT_HOST_DISABLE_EFFECTS))
+ .isTrue();
}
@Test
public void setHintNotification_aliased_Matches() {
+ DeviceConfig.setProperty(DeviceConfig.NAMESPACE_SYSTEMUI,
+ SystemUiDeviceConfigFlags.VOLUME_SEPARATE_NOTIFICATION, "false", false);
+
+
assertThat(mController
- .hintsMatch(NotificationListenerService.HINT_HOST_DISABLE_NOTIFICATION_EFFECTS,
- false)).isTrue();
+ .hintsMatch(NotificationListenerService.HINT_HOST_DISABLE_NOTIFICATION_EFFECTS))
+ .isTrue();
}
@Test
public void setHintsRing_unaliased_Matches() {
+ DeviceConfig.setProperty(DeviceConfig.NAMESPACE_SYSTEMUI,
+ SystemUiDeviceConfigFlags.VOLUME_SEPARATE_NOTIFICATION, "true", false);
+
assertThat(mController.hintsMatch(
- NotificationListenerService.HINT_HOST_DISABLE_CALL_EFFECTS, true)).isTrue();
+ NotificationListenerService.HINT_HOST_DISABLE_CALL_EFFECTS)).isTrue();
}
@Test
public void setHintsRingNotification_unaliased_Matches() {
- assertThat(mController.hintsMatch(NotificationListenerService.HINT_HOST_DISABLE_EFFECTS,
- true)).isTrue();
+ DeviceConfig.setProperty(DeviceConfig.NAMESPACE_SYSTEMUI,
+ SystemUiDeviceConfigFlags.VOLUME_SEPARATE_NOTIFICATION, "true", false);
+
+ assertThat(mController.hintsMatch(NotificationListenerService.HINT_HOST_DISABLE_EFFECTS))
+ .isTrue();
}
@Test
public void setHintNotification_unaliased_doesNotMatch() {
+ DeviceConfig.setProperty(DeviceConfig.NAMESPACE_SYSTEMUI,
+ SystemUiDeviceConfigFlags.VOLUME_SEPARATE_NOTIFICATION, "true", false);
+
assertThat(mController
- .hintsMatch(NotificationListenerService.HINT_HOST_DISABLE_NOTIFICATION_EFFECTS,
- true)).isFalse();
+ .hintsMatch(NotificationListenerService.HINT_HOST_DISABLE_NOTIFICATION_EFFECTS))
+ .isFalse();
}
@Test
diff --git a/tests/robotests/src/com/android/settings/notification/RingerModeAffectedVolumePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/RingerModeAffectedVolumePreferenceControllerTest.java
new file mode 100644
index 0000000..d001653
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/notification/RingerModeAffectedVolumePreferenceControllerTest.java
@@ -0,0 +1,49 @@
+/*
+ * 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.notification;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mockito;
+import org.robolectric.RobolectricTestRunner;
+
+@RunWith(RobolectricTestRunner.class)
+public class RingerModeAffectedVolumePreferenceControllerTest {
+
+ private RingerModeAffectedVolumePreferenceController mController;
+
+ @Before
+ public void setUp() {
+ mController = Mockito.mock(
+ RingerModeAffectedVolumePreferenceController.class,
+ Mockito.CALLS_REAL_METHODS);
+ }
+
+ @Test
+ public void isSliceable_returnsTrue() {
+ assertThat(mController.isSliceable()).isTrue();
+ }
+
+ @Test
+ public void isPublicSlice_returnsTrue() {
+ assertThat(mController.isPublicSlice()).isTrue();
+ }
+
+}
diff --git a/tests/robotests/src/com/android/settings/notification/SeparateRingVolumePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/SeparateRingVolumePreferenceControllerTest.java
new file mode 100644
index 0000000..7c9390c
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/notification/SeparateRingVolumePreferenceControllerTest.java
@@ -0,0 +1,122 @@
+/*
+ * 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.notification;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.when;
+
+import android.app.NotificationManager;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.res.Resources;
+import android.media.AudioManager;
+import android.os.Vibrator;
+import android.provider.DeviceConfig;
+import android.telephony.TelephonyManager;
+
+import com.android.internal.config.sysui.SystemUiDeviceConfigFlags;
+import com.android.settings.testutils.shadow.ShadowDeviceConfig;
+
+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 org.robolectric.annotation.Config;
+import org.robolectric.shadows.ShadowApplication;
+
+@RunWith(RobolectricTestRunner.class)
+@Config(shadows = {ShadowDeviceConfig.class})
+public class SeparateRingVolumePreferenceControllerTest {
+
+ @Mock
+ private AudioHelper mHelper;
+ @Mock
+ private TelephonyManager mTelephonyManager;
+ @Mock
+ private AudioManager mAudioManager;
+ @Mock
+ private Vibrator mVibrator;
+ @Mock
+ private NotificationManager mNotificationManager;
+ @Mock
+ private ComponentName mSuppressor;
+ @Mock
+ private Resources mResources;
+
+ private Context mContext;
+
+ private SeparateRingVolumePreferenceController mController;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ ShadowApplication shadowContext = ShadowApplication.getInstance();
+ shadowContext.setSystemService(Context.TELEPHONY_SERVICE, mTelephonyManager);
+ shadowContext.setSystemService(Context.AUDIO_SERVICE, mAudioManager);
+ shadowContext.setSystemService(Context.VIBRATOR_SERVICE, mVibrator);
+ shadowContext.setSystemService(Context.NOTIFICATION_SERVICE, mNotificationManager);
+ mContext = spy(RuntimeEnvironment.application);
+ when(mNotificationManager.getEffectsSuppressor()).thenReturn(mSuppressor);
+ when(mContext.getResources()).thenReturn(mResources);
+ mController = new SeparateRingVolumePreferenceController(mContext);
+ mController.setAudioHelper(mHelper);
+ }
+
+ @Test
+ public void isAvailable_ringNotificationAliased_shouldReturnFalse() {
+ when(mHelper.isSingleVolume()).thenReturn(true);
+ when(mTelephonyManager.isVoiceCapable()).thenReturn(true);
+
+ assertThat(mController.isAvailable()).isFalse();
+ }
+
+ /**
+ * Maintain that the device does not need to be voice capable to display this slider
+ */
+ @Test
+ public void isAvailable_ringNotificationSeparated_isNotVoiceCapable_shouldReturnTrue() {
+ DeviceConfig.setProperty(DeviceConfig.NAMESPACE_SYSTEMUI,
+ SystemUiDeviceConfigFlags.VOLUME_SEPARATE_NOTIFICATION, "true", false);
+ when(mHelper.isSingleVolume()).thenReturn(false);
+ when(mTelephonyManager.isVoiceCapable()).thenReturn(false);
+
+ assertThat(mController.isAvailable()).isTrue();
+ }
+
+ @Test
+ public void getAudioStream_shouldReturnRing() {
+ assertThat(mController.getAudioStream()).isEqualTo(AudioManager.STREAM_RING);
+ }
+
+ @Test
+ public void isSliceableCorrectKey_returnsTrue() {
+ final SeparateRingVolumePreferenceController controller =
+ new SeparateRingVolumePreferenceController(mContext);
+ assertThat(controller.isSliceable()).isTrue();
+ }
+
+ @Test
+ public void isPublicSlice_returnTrue() {
+ assertThat(mController.isPublicSlice()).isTrue();
+ }
+
+}
diff --git a/tests/robotests/src/com/android/settings/notification/ShowOnlyUnseenNotificationsOnLockscreenPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/ShowOnlyUnseenNotificationsOnLockscreenPreferenceControllerTest.java
new file mode 100644
index 0000000..cc26e54
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/notification/ShowOnlyUnseenNotificationsOnLockscreenPreferenceControllerTest.java
@@ -0,0 +1,122 @@
+/*
+ * 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.notification;
+
+import static android.provider.Settings.Secure.LOCK_SCREEN_SHOW_ONLY_UNSEEN_NOTIFICATIONS;
+
+import static com.android.settings.notification.ShowOnlyUnseenNotificationsOnLockscreenPreferenceController.OFF;
+import static com.android.settings.notification.ShowOnlyUnseenNotificationsOnLockscreenPreferenceController.ON;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import android.app.admin.DevicePolicyManager;
+import android.content.Context;
+import android.provider.Settings;
+
+import androidx.preference.Preference;
+import androidx.preference.PreferenceScreen;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Answers;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
+import org.robolectric.RuntimeEnvironment;
+
+@RunWith(RobolectricTestRunner.class)
+public class ShowOnlyUnseenNotificationsOnLockscreenPreferenceControllerTest {
+
+ @Mock(answer = Answers.RETURNS_DEEP_STUBS)
+ private Context mContext;
+ @Mock(answer = Answers.RETURNS_DEEP_STUBS)
+ private PreferenceScreen mScreen;
+
+ private ShowOnlyUnseenNotificationsOnLockscreenPreferenceController mController;
+ private Preference mPreference;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ doReturn(mock(DevicePolicyManager.class)).when(mContext)
+ .getSystemService(Context.DEVICE_POLICY_SERVICE);
+ mController = new ShowOnlyUnseenNotificationsOnLockscreenPreferenceController(mContext,
+ "key");
+ mPreference = new Preference(RuntimeEnvironment.application);
+ mPreference.setKey(mController.getPreferenceKey());
+ when(mScreen.findPreference(mPreference.getKey())).thenReturn(mPreference);
+ }
+
+ @Test
+ public void display_configUnset_shouldNotDisplay() {
+ mController.displayPreference(mScreen);
+ assertThat(mPreference.isVisible()).isFalse();
+ }
+
+ @Test
+ public void display_configSet_showDisplay() {
+ Settings.Secure.putInt(mContext.getContentResolver(),
+ LOCK_SCREEN_SHOW_ONLY_UNSEEN_NOTIFICATIONS, OFF);
+ mController.displayPreference(mScreen);
+ assertThat(mPreference.isVisible()).isTrue();
+ }
+
+ @Test
+ public void isChecked_settingIsOff_shouldReturnFalse() {
+ Settings.Secure.putInt(mContext.getContentResolver(),
+ LOCK_SCREEN_SHOW_ONLY_UNSEEN_NOTIFICATIONS, OFF);
+
+ assertThat(mController.isChecked()).isFalse();
+ }
+
+ @Test
+ public void isChecked_settingIsOn_shouldReturnTrue() {
+ Settings.Secure.putInt(mContext.getContentResolver(),
+ LOCK_SCREEN_SHOW_ONLY_UNSEEN_NOTIFICATIONS, ON);
+
+ assertThat(mController.isChecked()).isTrue();
+ }
+
+ @Test
+ public void setChecked_setFalse_disablesSetting() {
+ Settings.Secure.putInt(mContext.getContentResolver(),
+ LOCK_SCREEN_SHOW_ONLY_UNSEEN_NOTIFICATIONS, ON);
+
+ mController.setChecked(false);
+ int updatedValue = Settings.Secure.getInt(mContext.getContentResolver(),
+ LOCK_SCREEN_SHOW_ONLY_UNSEEN_NOTIFICATIONS, -1);
+
+ assertThat(updatedValue).isEqualTo(OFF);
+ }
+
+ @Test
+ public void setChecked_setTrue_enablesSetting() {
+ Settings.Secure.putInt(mContext.getContentResolver(),
+ LOCK_SCREEN_SHOW_ONLY_UNSEEN_NOTIFICATIONS, OFF);
+
+ mController.setChecked(true);
+ int updatedValue = Settings.Secure.getInt(mContext.getContentResolver(),
+ LOCK_SCREEN_SHOW_ONLY_UNSEEN_NOTIFICATIONS, -1);
+
+ assertThat(updatedValue).isEqualTo(ON);
+ }
+}
diff --git a/tests/robotests/src/com/android/settings/panel/VolumePanelTest.java b/tests/robotests/src/com/android/settings/panel/VolumePanelTest.java
index 6c0e131..74998c9 100644
--- a/tests/robotests/src/com/android/settings/panel/VolumePanelTest.java
+++ b/tests/robotests/src/com/android/settings/panel/VolumePanelTest.java
@@ -63,6 +63,8 @@
CustomSliceRegistry.VOLUME_MEDIA_URI,
CustomSliceRegistry.MEDIA_OUTPUT_INDICATOR_SLICE_URI,
CustomSliceRegistry.VOLUME_RINGER_URI,
+ CustomSliceRegistry.VOLUME_SEPARATE_RING_URI,
+ CustomSliceRegistry.VOLUME_NOTIFICATION_URI,
CustomSliceRegistry.VOLUME_ALARM_URI);
}
diff --git a/tests/robotests/src/com/android/settings/password/SetupChooseLockPatternTest.java b/tests/robotests/src/com/android/settings/password/SetupChooseLockPatternTest.java
index e01e023..cf3daad 100644
--- a/tests/robotests/src/com/android/settings/password/SetupChooseLockPatternTest.java
+++ b/tests/robotests/src/com/android/settings/password/SetupChooseLockPatternTest.java
@@ -24,7 +24,9 @@
import android.content.ComponentName;
import android.content.Intent;
import android.content.pm.PackageManager;
+import android.content.res.Resources;
import android.os.UserHandle;
+import android.util.TypedValue;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
@@ -32,6 +34,7 @@
import androidx.appcompat.app.AlertDialog;
import androidx.fragment.app.FragmentActivity;
+import com.android.internal.widget.LockPatternUtils;
import com.android.internal.widget.LockPatternView;
import com.android.internal.widget.LockPatternView.Cell;
import com.android.internal.widget.LockPatternView.DisplayMode;
@@ -45,6 +48,7 @@
import com.google.android.setupcompat.PartnerCustomizationLayout;
import com.google.android.setupcompat.template.FooterBarMixin;
+import com.google.android.setupcompat.template.FooterButton;
import org.junit.Before;
import org.junit.Test;
@@ -94,11 +98,11 @@
@Test
public void optionsButton_whenPatternSelected_shouldBeVisible() {
- Button button = mActivity.findViewById(R.id.screen_lock_options);
+ final Button button = mActivity.findViewById(R.id.screen_lock_options);
assertThat(button).isNotNull();
assertThat(button.getVisibility()).isEqualTo(View.VISIBLE);
- LockPatternView lockPatternView = mActivity.findViewById(R.id.lockPattern);
+ final LockPatternView lockPatternView = mActivity.findViewById(R.id.lockPattern);
ReflectionHelpers.callInstanceMethod(lockPatternView, "notifyPatternDetected");
enterPattern();
@@ -106,12 +110,12 @@
}
private void verifyScreenLockOptionsShown() {
- Button button = mActivity.findViewById(R.id.screen_lock_options);
+ final Button button = mActivity.findViewById(R.id.screen_lock_options);
assertThat(button).isNotNull();
assertThat(button.getVisibility()).isEqualTo(View.VISIBLE);
button.performClick();
- AlertDialog chooserDialog = ShadowAlertDialogCompat.getLatestAlertDialog();
+ final AlertDialog chooserDialog = ShadowAlertDialogCompat.getLatestAlertDialog();
assertThat(chooserDialog).isNotNull();
int count = chooserDialog.getListView().getCount();
assertWithMessage("List items shown").that(count).isEqualTo(3);
@@ -149,9 +153,10 @@
@Test
public void skipButton_shouldBeVisible_duringNonFingerprintFlow() {
- PartnerCustomizationLayout layout = mActivity.findViewById(R.id.setup_wizard_layout);
+ final PartnerCustomizationLayout layout = mActivity.findViewById(R.id.setup_wizard_layout);
final Button skipOrClearButton =
layout.getMixin(FooterBarMixin.class).getSecondaryButtonView();
+
assertThat(skipOrClearButton).isNotNull();
assertThat(skipOrClearButton.getVisibility()).isEqualTo(View.VISIBLE);
@@ -164,29 +169,31 @@
public void clearButton_shouldBeVisible_duringRetryStage() {
enterPattern();
- PartnerCustomizationLayout layout = mActivity.findViewById(R.id.setup_wizard_layout);
+ final PartnerCustomizationLayout layout = mActivity.findViewById(R.id.setup_wizard_layout);
final Button skipOrClearButton =
layout.getMixin(FooterBarMixin.class).getSecondaryButtonView();
+
assertThat(skipOrClearButton.getVisibility()).isEqualTo(View.VISIBLE);
assertThat(skipOrClearButton.isEnabled()).isTrue();
skipOrClearButton.performClick();
+
assertThat(findFragment(mActivity).mChosenPattern).isNull();
}
@Test
public void createActivity_enterPattern_clearButtonShouldBeShown() {
- ChooseLockPatternFragment fragment = findFragment(mActivity);
-
- PartnerCustomizationLayout layout = mActivity.findViewById(R.id.setup_wizard_layout);
+ final PartnerCustomizationLayout layout = mActivity.findViewById(R.id.setup_wizard_layout);
final Button skipOrClearButton =
layout.getMixin(FooterBarMixin.class).getSecondaryButtonView();
+
assertThat(skipOrClearButton.isEnabled()).isTrue();
assertThat(skipOrClearButton.getVisibility()).isEqualTo(View.VISIBLE);
assertThat(skipOrClearButton.getText())
.isEqualTo(application.getString(R.string.skip_label));
enterPattern();
+
assertThat(skipOrClearButton.isEnabled()).isTrue();
assertThat(skipOrClearButton.getVisibility()).isEqualTo(View.VISIBLE);
assertThat(skipOrClearButton.getText())
@@ -195,8 +202,7 @@
@Test
public void createActivity_patternDescription_shouldBeShown() {
- PartnerCustomizationLayout layout = mActivity.findViewById(R.id.setup_wizard_layout);
-
+ final PartnerCustomizationLayout layout = mActivity.findViewById(R.id.setup_wizard_layout);
final TextView patternDescription =
layout.findViewById(R.id.sud_layout_subtitle);
@@ -205,6 +211,140 @@
application.getString(R.string.lockpassword_choose_your_pattern_description));
}
+ @Test
+ public void inIntroductionStage_theHeaderHeight_shouldSetMinLinesTwoToPreventFlicker() {
+ final PartnerCustomizationLayout layout = mActivity.findViewById(R.id.setup_wizard_layout);
+ final TextView headerView = layout.findViewById(R.id.sud_layout_subtitle);
+
+ assertThat(headerView.getVisibility()).isEqualTo(View.VISIBLE);
+ assertThat(headerView.getText().toString()).isEqualTo(
+ application.getString(R.string.lockpassword_choose_your_pattern_description));
+ }
+
+ @Test
+ public void createActivity_enterPattern_shouldGoToFirstChoiceValidStage() {
+ final PartnerCustomizationLayout layout = mActivity.findViewById(R.id.setup_wizard_layout);
+ final TextView headerView = layout.findViewById(R.id.sud_layout_subtitle);
+
+ assertThat(headerView.getVisibility()).isEqualTo(View.VISIBLE);
+
+ enterPattern();
+
+ assertThat(headerView.getText().toString()).isEqualTo(
+ application.getString(R.string.lockpattern_pattern_entered_header));
+ }
+
+ @Test
+ public void createActivity_enterShortPattern_shouldGoToChoiceTooShortStage() {
+ final PartnerCustomizationLayout layout = mActivity.findViewById(R.id.setup_wizard_layout);
+ final TextView headerView = layout.findViewById(R.id.sud_layout_subtitle);
+
+ enterShortPattern();
+
+ assertThat(headerView.getVisibility()).isEqualTo(View.VISIBLE);
+ assertThat(headerView.getText().toString()).isEqualTo(
+ application.getResources().getString(
+ R.string.lockpattern_recording_incorrect_too_short,
+ LockPatternUtils.MIN_LOCK_PATTERN_SIZE));
+ }
+
+ @Test
+ public void inChoiceTooShortStage_theHeaderColor_shouldTintOnErrorColor() {
+ final PartnerCustomizationLayout layout = mActivity.findViewById(R.id.setup_wizard_layout);
+ final TextView headerView = layout.findViewById(R.id.sud_layout_subtitle);
+ final TypedValue typedValue = new TypedValue();
+ final Resources.Theme theme = mActivity.getTheme();
+ theme.resolveAttribute(R.attr.colorError, typedValue, true);
+ final int errorColor = typedValue.data;
+
+ enterShortPattern();
+
+ assertThat(headerView.getVisibility()).isEqualTo(View.VISIBLE);
+ assertThat(headerView.getTextColors().getDefaultColor()).isEqualTo(errorColor);
+ }
+
+ @Test
+ public void inFirstChoiceValidStage_nextButtonState_shouldEnabled() {
+ final PartnerCustomizationLayout layout = mActivity.findViewById(R.id.setup_wizard_layout);
+ final FooterBarMixin footerBarMixin = layout.getMixin(FooterBarMixin.class);
+ final FooterButton nextButton = footerBarMixin.getPrimaryButton();
+
+ assertThat(nextButton.getVisibility()).isEqualTo(View.VISIBLE);
+ assertThat(nextButton.isEnabled()).isFalse();
+
+ enterPattern();
+
+ assertThat(nextButton.isEnabled()).isTrue();
+ }
+
+ @Test
+ public void inFirstChoiceValidStage_clickNextButton_shouldGoToNeedToConfirmStage() {
+ final PartnerCustomizationLayout layout = mActivity.findViewById(R.id.setup_wizard_layout);
+ final TextView headerView = layout.findViewById(R.id.sud_layout_subtitle);
+ final FooterBarMixin footerBarMixin = layout.getMixin(FooterBarMixin.class);
+ final Button nextButton = footerBarMixin.getPrimaryButtonView();
+
+ assertThat(headerView.getVisibility()).isEqualTo(View.VISIBLE);
+
+ enterPattern();
+ nextButton.performClick();
+
+ assertThat(headerView.getText().toString()).isEqualTo(
+ application.getString(R.string.lockpattern_need_to_confirm));
+ }
+
+ @Test
+ public void inNeedToConfirmStage_enterWrongPattern_shouldGoToConfirmWrongStage() {
+ final PartnerCustomizationLayout layout = mActivity.findViewById(R.id.setup_wizard_layout);
+ final TextView headerView = layout.findViewById(R.id.sud_layout_subtitle);
+ final FooterBarMixin footerBarMixin = layout.getMixin(FooterBarMixin.class);
+ final Button nextButton = footerBarMixin.getPrimaryButtonView();
+ // IntroductionStage
+ assertThat(headerView.getVisibility()).isEqualTo(View.VISIBLE);
+
+ enterPattern();
+ nextButton.performClick();
+
+ // NeedToConfirmStage
+ assertThat(headerView.getText().toString()).isEqualTo(
+ application.getString(R.string.lockpattern_need_to_confirm));
+
+ enterShortPattern();
+
+ // ConfirmWrongStage
+ assertThat(headerView.getText().toString()).isEqualTo(
+ application.getString(R.string.lockpattern_need_to_unlock_wrong));
+ assertThat(nextButton.getText().toString()).isEqualTo(
+ application.getString(R.string.lockpattern_confirm_button_text));
+ assertThat(nextButton.isEnabled()).isFalse();
+ }
+
+ @Test
+ public void inNeedToConfirmStage_enterCorrectPattern_shouldGoToChoiceConfirmedStage() {
+ final PartnerCustomizationLayout layout = mActivity.findViewById(R.id.setup_wizard_layout);
+ final TextView headerView = layout.findViewById(R.id.sud_layout_subtitle);
+ final FooterBarMixin footerBarMixin = layout.getMixin(FooterBarMixin.class);
+ final Button nextButton = footerBarMixin.getPrimaryButtonView();
+ // IntroductionStage
+ assertThat(headerView.getVisibility()).isEqualTo(View.VISIBLE);
+
+ enterPattern();
+ nextButton.performClick();
+
+ // NeedToConfirmStage
+ assertThat(headerView.getText().toString()).isEqualTo(
+ application.getString(R.string.lockpattern_need_to_confirm));
+
+ enterPattern();
+
+ // ChoiceConfirmedStage
+ assertThat(headerView.getText().toString()).isEqualTo(
+ application.getString(R.string.lockpattern_pattern_confirmed_header));
+ assertThat(nextButton.getText().toString()).isEqualTo(
+ application.getString(R.string.lockpattern_confirm_button_text));
+ assertThat(nextButton.isEnabled()).isTrue();
+ }
+
private ChooseLockPatternFragment findFragment(FragmentActivity activity) {
return (ChooseLockPatternFragment)
activity.getSupportFragmentManager().findFragmentById(R.id.main_content);
@@ -222,6 +362,17 @@
ReflectionHelpers.callInstanceMethod(lockPatternView, "notifyPatternDetected");
}
+ private void enterShortPattern() {
+ LockPatternView lockPatternView = mActivity.findViewById(R.id.lockPattern);
+ lockPatternView.setPattern(
+ DisplayMode.Animate,
+ Arrays.asList(
+ createCell(0, 0),
+ createCell(0, 1),
+ createCell(1, 1)));
+ ReflectionHelpers.callInstanceMethod(lockPatternView, "notifyPatternDetected");
+ }
+
private Cell createCell(int row, int column) {
return ReflectionHelpers.callConstructor(
Cell.class,
diff --git a/tests/unit/src/com/android/settings/communal/CommunalPreferenceControllerTest.java b/tests/unit/src/com/android/settings/communal/CommunalPreferenceControllerTest.java
new file mode 100644
index 0000000..e8421d0
--- /dev/null
+++ b/tests/unit/src/com/android/settings/communal/CommunalPreferenceControllerTest.java
@@ -0,0 +1,88 @@
+/*
+ * 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.communal;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.content.res.Resources;
+import android.os.UserManager;
+
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import com.android.settings.testutils.ResourcesUtils;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+@RunWith(AndroidJUnit4.class)
+public class CommunalPreferenceControllerTest {
+ @Mock
+ private UserManager mUserManager;
+
+ private Resources mResources;
+ private CommunalPreferenceController mController;
+
+ private static final String PREF_KEY = "test_key";
+
+ @Before
+ public void setup() {
+ MockitoAnnotations.initMocks(this);
+ final Context context = spy(ApplicationProvider.getApplicationContext());
+ mResources = spy(context.getResources());
+
+ mController = new CommunalPreferenceController(context, PREF_KEY);
+
+ when(context.getResources()).thenReturn(mResources);
+ when(context.getSystemService(UserManager.class)).thenReturn(mUserManager);
+ }
+
+ @Test
+ public void isAvailable_communalEnabled_shouldBeTrueForSystemUser() {
+ setCommunalEnabled(true);
+ when(mUserManager.isSystemUser()).thenReturn(true);
+ assertTrue(mController.isAvailable());
+ }
+
+ @Test
+ public void isAvailable_communalEnabled_shouldBeFalseForNonSystemUser() {
+ setCommunalEnabled(true);
+ when(mUserManager.isSystemUser()).thenReturn(false);
+ assertFalse(mController.isAvailable());
+ }
+
+ @Test
+ public void isAvailable_communalDisabled_shouldBeFalseForSystemUser() {
+ setCommunalEnabled(false);
+ when(mUserManager.isSystemUser()).thenReturn(true);
+ assertFalse(mController.isAvailable());
+ }
+
+ private void setCommunalEnabled(boolean enabled) {
+ final int boolId = ResourcesUtils.getResourcesId(
+ ApplicationProvider.getApplicationContext(), "bool",
+ "config_show_communal_settings");
+ when(mResources.getBoolean(boolId)).thenReturn(enabled);
+ }
+}