[automerger skipped] Import translations. DO NOT MERGE ANYWHERE am: 20df40e783 -s ours am: 78abb83343 -s ours am: 7f395f18b2 -s ours am: e2bf04f17b -s ours
am skip reason: subject contains skip directive
Original change: https://googleplex-android-review.googlesource.com/c/platform/packages/apps/Settings/+/15898483
Change-Id: Ia56b84d5c9de7acef48ab0566d937a421d5b4804
diff --git a/Android.bp b/Android.bp
index bb9db22..dce25d7 100644
--- a/Android.bp
+++ b/Android.bp
@@ -73,6 +73,7 @@
"android.hardware.dumpstate-V1.0-java",
"android.hardware.dumpstate-V1.1-java",
"lottie",
+ "windowExtLib",
],
libs: [
@@ -101,6 +102,10 @@
],
static_libs: ["Settings-core"],
uses_libs: ["org.apache.http.legacy"],
+ optional_uses_libs: [
+ "androidx.window.extensions",
+ "androidx.window.sidecar",
+ ],
resource_dirs: [],
optimize: {
proguard_flags_files: ["proguard.flags"],
@@ -112,6 +117,11 @@
aars: ["libs/contextualcards.aar"],
}
+android_library_import {
+ name: "windowExtLib",
+ aars: ["libs/window_ext_lib.aar"],
+}
+
filegroup {
name: "Settings_proguard_flags",
srcs: ["proguard.flags"],
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index cd6db0f..d2a9c75 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -107,8 +107,12 @@
<uses-permission android:name="android.permission.READ_DREAM_STATE" />
<uses-permission android:name="android.permission.READ_DREAM_SUPPRESSION" />
<uses-permission android:name="android.permission.MANAGE_APP_HIBERNATION" />
+ <uses-permission android:name="android.permission.LAUNCH_TWO_PANE_SETTINGS_DEEP_LINK" />
+ <uses-permission android:name="android.permission.ALLOW_PLACE_IN_TWO_PANE_SETTINGS" />
- <application android:label="@string/settings_label"
+ <application
+ android:name=".SettingsApplication"
+ android:label="@string/settings_label"
android:icon="@drawable/ic_launcher_settings"
android:theme="@style/Theme.Settings"
android:hardwareAccelerated="true"
@@ -120,7 +124,10 @@
android:directBootAware="true"
android:appComponentFactory="androidx.core.app.CoreComponentFactory">
- <uses-library android:name="org.apache.http.legacy" />
+ <uses-library android:name="org.apache.http.legacy"/>
+ <uses-library android:name="androidx.window.extensions" android:required="false"/>
+ <uses-library android:name="androidx.window.sidecar" android:required="false"/>
+
<!-- Settings -->
<activity android:name=".homepage.SettingsHomepageActivity"
@@ -129,7 +136,7 @@
android:taskAffinity="com.android.settings.root"
android:launchMode="singleTask"
android:exported="true"
- android:configChanges="keyboard|keyboardHidden">
+ android:configChanges="keyboard|keyboardHidden|screenSize|screenLayout">
<intent-filter android:priority="1">
<action android:name="android.settings.SETTINGS" />
<category android:name="android.intent.category.DEFAULT" />
@@ -167,6 +174,17 @@
<meta-data android:name="android.app.shortcuts" android:resource="@xml/shortcuts"/>
</activity-alias>
+ <!-- Alias for SettingsHomepageActivity which works for deep link page in 2-panel. -->
+ <activity-alias android:name="DeepLinkHomepageActivity"
+ android:label="@string/settings_label_launcher"
+ android:exported="true"
+ android:targetActivity=".homepage.SettingsHomepageActivity">
+ <intent-filter>
+ <action android:name="android.settings.SETTINGS_LARGE_SCREEN_DEEP_LINK" />
+ <category android:name="android.intent.category.DEFAULT" />
+ </intent-filter>
+ </activity-alias>
+
<receiver android:name=".SettingsInitialize"
android:exported="true">
<intent-filter>
@@ -1711,11 +1729,6 @@
</activity>
<activity
- android:name=".SettingsTutorialDialogWrapperActivity"
- android:theme="@style/Theme.AlertDialog"
- android:exported="false"/>
-
- <activity
android:name="Settings$TextToSpeechSettingsActivity"
android:exported="true"
android:label="@string/tts_settings">
diff --git a/color-check-baseline.xml b/color-check-baseline.xml
index a9cd4c6..0b272d9 100644
--- a/color-check-baseline.xml
+++ b/color-check-baseline.xml
@@ -37,22 +37,6 @@
priority="4"
summary="Using hardcoded color"
explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
- errorLine1=" android:color="@color/notification_importance_selection_bg" />"
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
- <location
- file="res/drawable/button_border_selected.xml"
- line="20"
- column="9"/>
- </issue>
-
- <issue
- id="HardCodedColor"
- severity="Error"
- message="Avoid using hardcoded color"
- category="Correctness"
- priority="4"
- summary="Using hardcoded color"
- explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
errorLine1=" android:color="@color/notification_importance_button_unselected"/>"
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
@@ -501,6 +485,22 @@
priority="4"
summary="Using hardcoded color"
explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="fingerprint_enrollment_finish_color_outline">#669df6</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="res/values-night/colors.xml"
+ line="51"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
errorLine1=" <color name="confirm_device_credential_transparent_black">#60000000</color>"
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
@@ -1893,8 +1893,8 @@
priority="4"
summary="Using hardcoded color"
explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
- errorLine1=" <color name="SIM_dark_mode_color_teal">#ff80cbc4</color> <!-- Material Teal 200 -->"
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ errorLine1=" <color name="SIM_color_cyan">#ff006D74</color> <!-- Material Custom Cyan -->"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
line="188"
@@ -1909,8 +1909,8 @@
priority="4"
summary="Using hardcoded color"
explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
- errorLine1=" <color name="SIM_dark_mode_color_blue">#ff90caf9</color> <!-- Material Blue 200 -->"
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ errorLine1=" <color name="SIM_color_blue800">#ff185ABC</color> <!-- Material Blue 800 -->"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
line="189"
@@ -1925,8 +1925,8 @@
priority="4"
summary="Using hardcoded color"
explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
- errorLine1=" <color name="SIM_dark_mode_color_indigo">#ffc5cae9</color> <!-- Material Indigo 100 -->"
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ errorLine1=" <color name="SIM_color_green800">#ff137333</color> <!-- Material Green 800 -->"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
line="190"
@@ -1941,8 +1941,8 @@
priority="4"
summary="Using hardcoded color"
explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
- errorLine1=" <color name="SIM_dark_mode_color_purple">#ffe1bee7</color> <!-- Material Purple 100 -->"
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ errorLine1=" <color name="SIM_color_purple800">#ff7627bb</color> <!-- Material Purple 800 -->"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
line="191"
@@ -1957,8 +1957,8 @@
priority="4"
summary="Using hardcoded color"
explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
- errorLine1=" <color name="SIM_dark_mode_color_pink">#fff48fb1</color> <!-- Material Pink 200 -->"
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ errorLine1=" <color name="SIM_color_pink800">#ffb80672</color> <!-- Material Pink 800 -->"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
line="192"
@@ -1973,8 +1973,8 @@
priority="4"
summary="Using hardcoded color"
explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
- errorLine1=" <color name="SIM_dark_mode_color_red">#ffef9a9a</color> <!-- Material Red 200 -->"
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ errorLine1=" <color name="SIM_color_orange">#ff995400</color> <!-- Material Custom Orange -->"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
line="193"
@@ -1989,11 +1989,107 @@
priority="4"
summary="Using hardcoded color"
explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="SIM_dark_mode_color_cyan">#ff4DD0E1</color> <!-- Material Cyan 300 -->"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="res/values/colors.xml"
+ line="196"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="SIM_dark_mode_color_blue">#ff8AB4F8</color> <!-- Material Blue 300 -->"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="res/values/colors.xml"
+ line="197"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="SIM_dark_mode_color_green">#ff81C995</color> <!-- Material Green 300 -->"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="res/values/colors.xml"
+ line="198"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="SIM_dark_mode_color_purple">#ffC58AF9</color> <!-- Material Purple 300 -->"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="res/values/colors.xml"
+ line="199"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="SIM_dark_mode_color_pink">#ffff8bcb</color> <!-- Material Pink 300 -->"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="res/values/colors.xml"
+ line="200"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="SIM_dark_mode_color_orange">#fffcad70</color> <!-- Material Orange 300 -->"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="res/values/colors.xml"
+ line="201"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
errorLine1=" <color name="accessibility_feature_background">#5F6368</color> <!-- Google grey 700 -->"
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="199"
+ line="207"
column="5"/>
</issue>
@@ -2009,7 +2105,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="200"
+ line="208"
column="5"/>
</issue>
@@ -2025,7 +2121,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="201"
+ line="209"
column="5"/>
</issue>
@@ -2041,7 +2137,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="202"
+ line="210"
column="5"/>
</issue>
@@ -2057,7 +2153,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="204"
+ line="212"
column="5"/>
</issue>
@@ -2073,7 +2169,23 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="206"
+ line="214"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="fingerprint_enrollment_finish_color_outline">#1A73E8</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="res/values/colors.xml"
+ line="217"
column="5"/>
</issue>
@@ -2453,6 +2565,230 @@
priority="4"
summary="Using hardcoded color"
explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" android:fillColor="@color/fingerprint_enrollment_finish_color_outline"/>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="res/drawable/fingerprint_enroll_finish.xml"
+ line="25"
+ column="9"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" android:fillColor="@color/fingerprint_enrollment_finish_color_outline"/>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="res/drawable/fingerprint_enroll_finish.xml"
+ line="25"
+ column="9"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" android:fillColor="@color/fingerprint_enrollment_finish_color_outline"/>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="res/drawable/fingerprint_enroll_finish.xml"
+ line="31"
+ column="9"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" android:fillColor="@color/fingerprint_enrollment_finish_color_outline"/>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="res/drawable/fingerprint_enroll_finish.xml"
+ line="31"
+ column="9"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" android:fillColor="@color/fingerprint_enrollment_finish_color_outline"/>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="res/drawable/fingerprint_enroll_finish.xml"
+ line="34"
+ column="9"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" android:fillColor="@color/fingerprint_enrollment_finish_color_outline"/>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="res/drawable/fingerprint_enroll_finish.xml"
+ line="34"
+ column="9"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" android:fillColor="@color/fingerprint_enrollment_finish_color_outline"/>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="res/drawable/fingerprint_enroll_finish.xml"
+ line="37"
+ column="9"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" android:fillColor="@color/fingerprint_enrollment_finish_color_outline"/>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="res/drawable/fingerprint_enroll_finish.xml"
+ line="37"
+ column="9"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" android:fillColor="@color/fingerprint_enrollment_finish_color_outline"/>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="res/drawable/fingerprint_enroll_finish.xml"
+ line="40"
+ column="9"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" android:fillColor="@color/fingerprint_enrollment_finish_color_outline"/>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="res/drawable/fingerprint_enroll_finish.xml"
+ line="40"
+ column="9"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" android:fillColor="@color/fingerprint_enrollment_finish_color_outline"/>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="res/drawable/fingerprint_enroll_finish.xml"
+ line="43"
+ column="9"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" android:fillColor="@color/fingerprint_enrollment_finish_color_outline"/>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="res/drawable/fingerprint_enroll_finish.xml"
+ line="43"
+ column="9"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" android:fillColor="@color/fingerprint_enrollment_finish_color_outline"/>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="res/drawable/fingerprint_enroll_finish.xml"
+ line="46"
+ column="9"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" android:fillColor="@color/fingerprint_enrollment_finish_color_outline"/>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="res/drawable/fingerprint_enroll_finish.xml"
+ line="46"
+ column="9"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
errorLine1=" android:fillColor="@color/biometric_enroll_intro_color_bar""
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
@@ -3573,6 +3909,326 @@
priority="4"
summary="Using hardcoded color"
explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <item android:offset="0" android:color="#00669DF6"/>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="res/drawable-night/illustration_accessibility_gesture_three_finger.xml"
+ line="38"
+ column="34"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <item android:offset="0" android:color="#00669DF6"/>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="res/drawable/illustration_accessibility_gesture_three_finger.xml"
+ line="38"
+ column="34"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <item android:offset="0.695" android:color="#FF669DF6"/>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="res/drawable-night/illustration_accessibility_gesture_three_finger.xml"
+ line="39"
+ column="38"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <item android:offset="0.695" android:color="#FF669DF6"/>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="res/drawable/illustration_accessibility_gesture_three_finger.xml"
+ line="39"
+ column="38"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <item android:offset="0" android:color="#00669DF6"/>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="res/drawable-night/illustration_accessibility_gesture_three_finger.xml"
+ line="52"
+ column="34"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <item android:offset="0" android:color="#00669DF6"/>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="res/drawable/illustration_accessibility_gesture_three_finger.xml"
+ line="52"
+ column="34"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <item android:offset="0.695" android:color="#FF669DF6"/>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="res/drawable-night/illustration_accessibility_gesture_three_finger.xml"
+ line="53"
+ column="38"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <item android:offset="0.695" android:color="#FF669DF6"/>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="res/drawable/illustration_accessibility_gesture_three_finger.xml"
+ line="53"
+ column="38"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <item android:offset="0" android:color="#00669DF6"/>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="res/drawable-night/illustration_accessibility_gesture_three_finger.xml"
+ line="66"
+ column="34"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <item android:offset="0" android:color="#00669DF6"/>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="res/drawable/illustration_accessibility_gesture_three_finger.xml"
+ line="66"
+ column="34"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <item android:offset="0.695" android:color="#FF669DF6"/>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="res/drawable-night/illustration_accessibility_gesture_three_finger.xml"
+ line="67"
+ column="38"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <item android:offset="0.695" android:color="#FF669DF6"/>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="res/drawable/illustration_accessibility_gesture_three_finger.xml"
+ line="67"
+ column="38"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <item android:offset="0" android:color="#00669DF6"/>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="res/drawable-night/illustration_accessibility_gesture_two_finger.xml"
+ line="38"
+ column="34"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <item android:offset="0" android:color="#00669DF6"/>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="res/drawable/illustration_accessibility_gesture_two_finger.xml"
+ line="38"
+ column="34"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <item android:offset="0.695" android:color="#FF669DF6"/>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="res/drawable-night/illustration_accessibility_gesture_two_finger.xml"
+ line="39"
+ column="38"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <item android:offset="0.695" android:color="#FF669DF6"/>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="res/drawable/illustration_accessibility_gesture_two_finger.xml"
+ line="39"
+ column="38"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <item android:offset="0" android:color="#00669DF6"/>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="res/drawable-night/illustration_accessibility_gesture_two_finger.xml"
+ line="52"
+ column="34"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <item android:offset="0" android:color="#00669DF6"/>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="res/drawable/illustration_accessibility_gesture_two_finger.xml"
+ line="52"
+ column="34"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <item android:offset="0.695" android:color="#FF669DF6"/>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="res/drawable-night/illustration_accessibility_gesture_two_finger.xml"
+ line="53"
+ column="38"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <item android:offset="0.695" android:color="#FF669DF6"/>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="res/drawable/illustration_accessibility_gesture_two_finger.xml"
+ line="53"
+ column="38"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
errorLine1=" android:background="#FF80CBC4" >"
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
@@ -4025,7 +4681,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~">
<location
file="res/values-en-rAU/strings.xml"
- line="3041"
+ line="3091"
column="64"/>
</issue>
@@ -4041,7 +4697,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~">
<location
file="res/values-en-rCA/strings.xml"
- line="3041"
+ line="3091"
column="64"/>
</issue>
@@ -4057,7 +4713,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~">
<location
file="res/values-en-rGB/strings.xml"
- line="3041"
+ line="3091"
column="64"/>
</issue>
@@ -4073,7 +4729,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~">
<location
file="res/values-en-rIN/strings.xml"
- line="3041"
+ line="3091"
column="64"/>
</issue>
@@ -4089,7 +4745,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~">
<location
file="res/values-en-rXC/strings.xml"
- line="3041"
+ line="3091"
column="170"/>
</issue>
@@ -4105,7 +4761,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/strings.xml"
- line="7016"
+ line="7106"
column="36"/>
</issue>
@@ -4137,7 +4793,7 @@
errorLine2=" ^">
<location
file="res/values/styles.xml"
- line="430"
+ line="447"
column="44"/>
</issue>
@@ -4153,7 +4809,7 @@
errorLine2=" ^">
<location
file="res/values/styles.xml"
- line="436"
+ line="453"
column="44"/>
</issue>
@@ -4169,7 +4825,7 @@
errorLine2=" ^">
<location
file="res/values/styles.xml"
- line="437"
+ line="454"
column="44"/>
</issue>
@@ -4185,7 +4841,7 @@
errorLine2=" ^">
<location
file="res/values-night/themes.xml"
- line="35"
+ line="37"
column="41"/>
</issue>
@@ -4201,7 +4857,7 @@
errorLine2=" ^">
<location
file="res/values-night/themes.xml"
- line="35"
+ line="37"
column="41"/>
</issue>
@@ -4217,7 +4873,7 @@
errorLine2=" ^">
<location
file="res/values/themes.xml"
- line="111"
+ line="114"
column="40"/>
</issue>
@@ -4233,7 +4889,7 @@
errorLine2=" ^">
<location
file="res/values/themes.xml"
- line="111"
+ line="114"
column="40"/>
</issue>
@@ -4249,7 +4905,7 @@
errorLine2=" ^">
<location
file="res/values/themes.xml"
- line="132"
+ line="135"
column="41"/>
</issue>
@@ -4265,7 +4921,7 @@
errorLine2=" ^">
<location
file="res/values/themes.xml"
- line="132"
+ line="135"
column="41"/>
</issue>
@@ -4281,7 +4937,7 @@
errorLine2=" ^">
<location
file="res/values/themes.xml"
- line="182"
+ line="185"
column="45"/>
</issue>
@@ -4297,7 +4953,7 @@
errorLine2=" ^">
<location
file="res/values/themes.xml"
- line="183"
+ line="186"
column="49"/>
</issue>
@@ -4313,7 +4969,7 @@
errorLine2=" ^">
<location
file="res/values/themes.xml"
- line="191"
+ line="194"
column="45"/>
</issue>
@@ -4329,7 +4985,7 @@
errorLine2=" ^">
<location
file="res/values/themes.xml"
- line="192"
+ line="195"
column="49"/>
</issue>
@@ -4493,259 +5149,4 @@
column="5"/>
</issue>
- <issue
- id="HardCodedColor"
- severity="Error"
- message="Avoid using hardcoded color"
- category="Correctness"
- priority="4"
- summary="Using hardcoded color"
- explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
- errorLine1=" android:fillColor="@color/fingerprint_enrollment_finish_color_outline"/>"
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
- <location
- file="res/drawable/fingerprint_enroll_finish.xml"
- line="25"
- column="9"/>
- </issue>
-
- <issue
- id="HardCodedColor"
- severity="Error"
- message="Avoid using hardcoded color"
- category="Correctness"
- priority="4"
- summary="Using hardcoded color"
- explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
- errorLine1=" android:fillColor="@color/fingerprint_enrollment_finish_color_outline"/>"
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
- <location
- file="res/drawable/fingerprint_enroll_finish.xml"
- line="31"
- column="9"/>
- </issue>
-
- <issue
- id="HardCodedColor"
- severity="Error"
- message="Avoid using hardcoded color"
- category="Correctness"
- priority="4"
- summary="Using hardcoded color"
- explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
- errorLine1=" android:fillColor="@color/fingerprint_enrollment_finish_color_outline"/>"
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
- <location
- file="res/drawable/fingerprint_enroll_finish.xml"
- line="34"
- column="9"/>
- </issue>
-
- <issue
- id="HardCodedColor"
- severity="Error"
- message="Avoid using hardcoded color"
- category="Correctness"
- priority="4"
- summary="Using hardcoded color"
- explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
- errorLine1=" android:fillColor="@color/fingerprint_enrollment_finish_color_outline"/>"
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
- <location
- file="res/drawable/fingerprint_enroll_finish.xml"
- line="37"
- column="9"/>
- </issue>
-
- <issue
- id="HardCodedColor"
- severity="Error"
- message="Avoid using hardcoded color"
- category="Correctness"
- priority="4"
- summary="Using hardcoded color"
- explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
- errorLine1=" android:fillColor="@color/fingerprint_enrollment_finish_color_outline"/>"
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
- <location
- file="res/drawable/fingerprint_enroll_finish.xml"
- line="40"
- column="9"/>
- </issue>
-
- <issue
- id="HardCodedColor"
- severity="Error"
- message="Avoid using hardcoded color"
- category="Correctness"
- priority="4"
- summary="Using hardcoded color"
- explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
- errorLine1=" android:fillColor="@color/fingerprint_enrollment_finish_color_outline"/>"
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
- <location
- file="res/drawable/fingerprint_enroll_finish.xml"
- line="43"
- column="9"/>
- </issue>
-
- <issue
- id="HardCodedColor"
- severity="Error"
- message="Avoid using hardcoded color"
- category="Correctness"
- priority="4"
- summary="Using hardcoded color"
- explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
- errorLine1=" android:fillColor="@color/fingerprint_enrollment_finish_color_outline"/>"
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
- <location
- file="res/drawable/fingerprint_enroll_finish.xml"
- line="46"
- column="9"/>
- </issue>
-
- <issue
- id="HardCodedColor"
- severity="Error"
- message="Avoid using hardcoded color"
- category="Correctness"
- priority="4"
- summary="Using hardcoded color"
- explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
- errorLine1=" android:fillColor="@color/fingerprint_enrollment_finish_color_outline"/>"
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
- <location
- file="res/drawable/fingerprint_enroll_finish.xml"
- line="25"
- column="9"/>
- </issue>
-
- <issue
- id="HardCodedColor"
- severity="Error"
- message="Avoid using hardcoded color"
- category="Correctness"
- priority="4"
- summary="Using hardcoded color"
- explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
- errorLine1=" android:fillColor="@color/fingerprint_enrollment_finish_color_outline"/>"
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
- <location
- file="res/drawable/fingerprint_enroll_finish.xml"
- line="31"
- column="9"/>
- </issue>
-
- <issue
- id="HardCodedColor"
- severity="Error"
- message="Avoid using hardcoded color"
- category="Correctness"
- priority="4"
- summary="Using hardcoded color"
- explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
- errorLine1=" android:fillColor="@color/fingerprint_enrollment_finish_color_outline"/>"
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
- <location
- file="res/drawable/fingerprint_enroll_finish.xml"
- line="34"
- column="9"/>
- </issue>
-
- <issue
- id="HardCodedColor"
- severity="Error"
- message="Avoid using hardcoded color"
- category="Correctness"
- priority="4"
- summary="Using hardcoded color"
- explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
- errorLine1=" android:fillColor="@color/fingerprint_enrollment_finish_color_outline"/>"
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
- <location
- file="res/drawable/fingerprint_enroll_finish.xml"
- line="37"
- column="9"/>
- </issue>
-
- <issue
- id="HardCodedColor"
- severity="Error"
- message="Avoid using hardcoded color"
- category="Correctness"
- priority="4"
- summary="Using hardcoded color"
- explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
- errorLine1=" android:fillColor="@color/fingerprint_enrollment_finish_color_outline"/>"
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
- <location
- file="res/drawable/fingerprint_enroll_finish.xml"
- line="40"
- column="9"/>
- </issue>
-
- <issue
- id="HardCodedColor"
- severity="Error"
- message="Avoid using hardcoded color"
- category="Correctness"
- priority="4"
- summary="Using hardcoded color"
- explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
- errorLine1=" android:fillColor="@color/fingerprint_enrollment_finish_color_outline"/>"
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
- <location
- file="res/drawable/fingerprint_enroll_finish.xml"
- line="43"
- column="9"/>
- </issue>
-
- <issue
- id="HardCodedColor"
- severity="Error"
- message="Avoid using hardcoded color"
- category="Correctness"
- priority="4"
- summary="Using hardcoded color"
- explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
- errorLine1=" android:fillColor="@color/fingerprint_enrollment_finish_color_outline"/>"
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
- <location
- file="res/drawable/fingerprint_enroll_finish.xml"
- line="46"
- column="9"/>
- </issue>
-
- <issue
- id="HardCodedColor"
- severity="Error"
- message="Avoid using hardcoded color"
- category="Correctness"
- priority="4"
- summary="Using hardcoded color"
- explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
- errorLine1=" <color name="fingerprint_enrollment_finish_color_outline">#669df6</color>"
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
- <location
- file="res/values-night/colors.xml"
- line="51"
- column="5"/>
- </issue>
-
- <issue
- id="HardCodedColor"
- severity="Error"
- message="Avoid using hardcoded color"
- category="Correctness"
- priority="4"
- summary="Using hardcoded color"
- explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
- errorLine1=" <color name="fingerprint_enrollment_finish_color_outline">#669df6</color>"
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
- <location
- file="res/values/colors.xml"
- line="209"
- column="5"/>
- </issue>
</issues>
diff --git a/libs/window_ext_lib.aar b/libs/window_ext_lib.aar
new file mode 100644
index 0000000..301ff96
--- /dev/null
+++ b/libs/window_ext_lib.aar
Binary files differ
diff --git a/proguard.flags b/proguard.flags
index b66a786..3ed7136 100644
--- a/proguard.flags
+++ b/proguard.flags
@@ -66,3 +66,7 @@
-keepclasseswithmembers class * extends com.android.settings.slices.SliceBackgroundWorker {
public <init>(android.content.Context, android.net.Uri);
}
+
+# Keep WM Jetpack classes and callbacks
+-keep class androidx.window.** { *; }
+-dontwarn androidx.window.extensions.**
diff --git a/res/color/preference_highligh_color.xml b/res/color/preference_highlight_color.xml
similarity index 100%
rename from res/color/preference_highligh_color.xml
rename to res/color/preference_highlight_color.xml
diff --git a/res/drawable-night/accessibility_button_navigation.xml b/res/drawable-night/accessibility_button_navigation.xml
new file mode 100644
index 0000000..d6fd485
--- /dev/null
+++ b/res/drawable-night/accessibility_button_navigation.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2021 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:fillColor="#FF000000"
+ android:pathData="M384.2,300H27.8C12.5,300 0,287.2 0,271.5v-243C0,12.8 12.5,0 27.8,0h356.5C399.5,0 412,12.8 412,28.5v243.2C412,287.2 399.5,300 384.2,300z"/>
+ <path
+ android:pathData="M325.2,231.9c0,9.8 -7.9,17.7 -17.7,17.7H103.9c-9.8,0 -17.7,-7.9 -17.7,-17.7v-42.2h239V231.9z"
+ android:fillColor="#3D4043"/>
+ <path
+ android:pathData="M269.7,205.2c1.5,0 2.7,1.2 2.7,2.7s-1.2,2.7 -2.7,2.7c-1.5,0 -2.7,-1.2 -2.7,-2.7S268.2,205.2 269.7,205.2zM273.8,214.7v17.6H271v-8.1h-2.7v8.1h-2.7v-17.6c-2.7,-0.2 -5.6,-0.7 -8.1,-1.4l0.7,-2.7c3.5,0.9 7.7,1.4 11.5,1.4c3.8,0 8,-0.4 11.5,-1.4l0.7,2.7C279.4,214 276.5,214.5 273.8,214.7z"
+ android:fillColor="#FFFFFF"/>
+ <path
+ android:pathData="M205.7,219.7m-9.4,0a9.4,9.4 0,1 1,18.8 0a9.4,9.4 0,1 1,-18.8 0"
+ android:fillColor="#808589"/>
+ <path
+ android:pathData="M132.1,219.7l16,9.2l0,-18.5z"
+ android:fillColor="#808589"/>
+ <path
+ android:pathData="M325.4,231.9c0,9.8 -7.9,17.7 -17.7,17.7H103.9c-9.8,0 -17.7,-7.9 -17.7,-17.7V0h-4.4v231.9c0,12.2 9.9,22.2 22.1,22.2h203.8c12.2,0 22.1,-9.9 22.1,-22.2V14.8c2.4,0 4.4,-2 4.4,-4.4V0h-8.9V231.9z"
+ android:fillColor="#808589"/>
+ <path
+ android:pathData="M269.7,255.3c-19.6,0 -35.6,-16 -35.6,-35.6s16,-35.6 35.6,-35.6s35.6,16 35.6,35.6S289.3,255.3 269.7,255.3zM269.7,187.1c-17.9,0 -32.5,14.6 -32.5,32.5c0,17.9 14.6,32.5 32.5,32.5s32.5,-14.6 32.5,-32.5C302.2,201.7 287.6,187.1 269.7,187.1z"
+ android:fillColor="#729CEE"/>
+</vector>
diff --git a/res/drawable-night/accessibility_button_preview_base.xml b/res/drawable-night/accessibility_button_preview_base.xml
new file mode 100644
index 0000000..a5b0bfa
--- /dev/null
+++ b/res/drawable-night/accessibility_button_preview_base.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2021 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:fillColor="#FF000000"
+ android:pathData="M384.2,300H27.8C12.5,300 0,287.2 0,271.5v-243C0,12.8 12.5,0 27.8,0h356.5C399.5,0 412,12.8 412,28.5v243.2C412,287.2 399.5,300 384.2,300z"/>
+ <path
+ android:pathData="M325.4,231.9c0,9.8 -7.9,17.7 -17.7,17.7H103.9c-9.8,0 -17.7,-7.9 -17.7,-17.7V0h-4.4v231.9c0,12.2 9.9,22.2 22.1,22.2h203.8c12.2,0 22.1,-9.9 22.1,-22.2V14.8c2.4,0 4.4,-2 4.4,-4.4V0h-8.9L325.4,231.9L325.4,231.9z"
+ android:fillColor="#808589"/>
+</vector>
diff --git a/res/drawable-night/accessibility_button_preview_large_floating_menu.xml b/res/drawable-night/accessibility_button_preview_large_floating_menu.xml
new file mode 100644
index 0000000..74ecbfc
--- /dev/null
+++ b/res/drawable-night/accessibility_button_preview_large_floating_menu.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2021 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="M325.4,198.2h-40.9c-22.1,0 -40,-18 -40,-40s18,-40 40,-40h40.9v2.6h-40.9c-20.7,0 -37.5,16.8 -37.5,37.5s16.8,37.5 37.5,37.5h40.9V198.2z"
+ android:fillColor="#808589"/>
+ <path
+ android:pathData="M284.3,128.4c-16.5,0 -29.8,13.4 -29.8,29.8c0,16.5 13.4,29.8 29.8,29.8s29.8,-13.4 29.8,-29.8C314.2,141.7 300.9,128.4 284.3,128.4zM284.3,142.7c1.7,0 3.1,1.4 3.1,3.1c0,1.7 -1.4,3.1 -3.1,3.1s-3.1,-1.4 -3.1,-3.1C281.2,144.1 282.7,142.7 284.3,142.7zM289.1,153.7V174H286v-9.4h-3.1v9.4h-3.2v-20.3c-3.1,-0.3 -6.5,-0.8 -9.4,-1.5l0.8,-3.1c4.1,1 8.9,1.5 13.3,1.5s9.2,-0.5 13.3,-1.5l0.8,3.1C295.6,152.9 292.2,153.4 289.1,153.7z"
+ android:fillColor="#D9DBDF"/>
+</vector>
diff --git a/res/drawable-night/accessibility_button_preview_small_floating_menu.xml b/res/drawable-night/accessibility_button_preview_small_floating_menu.xml
new file mode 100644
index 0000000..4226086
--- /dev/null
+++ b/res/drawable-night/accessibility_button_preview_small_floating_menu.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2021 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="M325.4,189.2h-31.7c-17.1,0 -31,-13.9 -31,-31s13.9,-31 31,-31h31.7v2h-31.7c-16,0 -29,13 -29,29s13,29 29,29h31.7V189.2z"
+ android:fillColor="#808589"/>
+ <path
+ android:pathData="M293.6,135.1c-12.8,0 -23.1,10.4 -23.1,23.1c0,12.8 10.4,23.1 23.1,23.1s23.1,-10.4 23.1,-23.1C316.7,145.4 306.4,135.1 293.6,135.1zM293.6,146.2c1.3,0 2.4,1.1 2.4,2.4s-1.1,2.4 -2.4,2.4s-2.4,-1.1 -2.4,-2.4S292.3,146.2 293.6,146.2zM297.3,154.7v15.7h-2.4v-7.3h-2.4v7.3H290v-15.7c-2.4,-0.2 -5,-0.6 -7.3,-1.2l0.6,-2.4c3.2,0.8 6.9,1.2 10.3,1.2s7.1,-0.4 10.3,-1.2l0.6,2.4C302.3,154.1 299.7,154.5 297.3,154.7z"
+ android:fillColor="#D9DBDF"/>
+</vector>
diff --git a/res/drawable-night/accessibility_button_preview_three_finger.xml b/res/drawable-night/accessibility_button_preview_three_finger.xml
new file mode 100644
index 0000000..7afb0f7
--- /dev/null
+++ b/res/drawable-night/accessibility_button_preview_three_finger.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2021 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:fillColor="#FF000000"
+ android:pathData="M384.2,300H27.8C12.5,300 0,287.2 0,271.5v-243C0,12.8 12.5,0 27.8,0h356.5C399.5,0 412,12.8 412,28.5v243.2C412,287.2 399.5,300 384.2,300z"/>
+ <path
+ android:pathData="M242.5,226.9h-73.3c-1.7,0 -3.1,1.4 -3.1,3.1s1.4,3.1 3.1,3.1h73.3c1.7,0 3.1,-1.4 3.1,-3.1S244.2,226.9 242.5,226.9z"
+ android:fillColor="#80868B"/>
+ <path
+ android:pathData="M182.7,222.6v-17.5h7.5l-10.6,-18.7l-10.6,18.7h7.5v17.5c-2.9,1.2 -4.9,4 -4.9,7.4c0,4.4 3.5,8 8,8c4.4,0 8,-3.5 8,-8C187.6,226.7 185.6,223.8 182.7,222.6z"
+ android:fillColor="#669DF6"/>
+ <path
+ android:pathData="M209,222.6v-17.5h7.5l-10.6,-18.7l-10.6,18.7h7.5v17.5c-2.9,1.2 -4.9,4 -4.9,7.4c0,4.4 3.5,8 8,8c4.4,0 8,-3.5 8,-8C213.9,226.7 211.9,223.8 209,222.6z"
+ android:fillColor="#669DF6"/>
+ <path
+ android:pathData="M235.2,222.6v-17.5h7.5l-10.6,-18.7l-10.6,18.7h7.5v17.5c-2.9,1.2 -4.9,4 -4.9,7.4c0,4.4 3.5,8 8,8c4.4,0 8,-3.5 8,-8C240,226.7 238,223.8 235.2,222.6z"
+ android:fillColor="#669DF6"/>
+ <path
+ android:pathData="M325.4,231.9c0,9.8 -7.9,17.7 -17.7,17.7H103.9c-9.8,0 -17.7,-7.9 -17.7,-17.7V0h-4.4v231.9c0,12.2 9.9,22.2 22.1,22.2h203.8c12.2,0 22.1,-9.9 22.1,-22.2V14.8c2.4,0 4.4,-2 4.4,-4.4V0h-8.9V231.9z"
+ android:fillColor="#80868B"/>
+</vector>
diff --git a/res/drawable-night/accessibility_button_preview_two_finger.xml b/res/drawable-night/accessibility_button_preview_two_finger.xml
new file mode 100644
index 0000000..05871d9
--- /dev/null
+++ b/res/drawable-night/accessibility_button_preview_two_finger.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2021 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:fillColor="#FF000000"
+ android:pathData="M384.2,300H27.8C12.5,300 0,287.2 0,271.5v-243C0,12.8 12.5,0 27.8,0h356.5C399.5,0 412,12.8 412,28.5v243.2C412,287.2 399.5,300 384.2,300z"/>
+ <path
+ android:pathData="M325.4,231.9c0,9.8 -7.9,17.7 -17.7,17.7H103.9c-9.8,0 -17.7,-7.9 -17.7,-17.7V0h-4.4v231.9c0,12.2 9.9,22.2 22.1,22.2h203.8c12.2,0 22.1,-9.9 22.1,-22.2V14.8c2.4,0 4.4,-2 4.4,-4.4V0h-8.9V231.9z"
+ android:fillColor="#80868B"/>
+ <path
+ android:pathData="M242.4,226.9h-9.3h-5.6h-43.4h-4.7h-10.2c-1.7,0 -3.1,1.4 -3.1,3.1s1.4,3.1 3.1,3.1h10.2h3.9h45h4.8h9.3c1.7,0 3.1,-1.4 3.1,-3.1S244.1,226.9 242.4,226.9z"
+ android:fillColor="#80868B"/>
+ <path
+ android:pathData="M194,223.5v-17.5h7.5l-10.6,-18.7l-10.6,18.7h7.5v17.5c-1.6,0.7 -2.9,1.9 -3.8,3.4c-0.7,1.2 -1.1,2.5 -1.1,4c0,0.7 0.1,1.5 0.3,2.2c0.9,3.3 4,5.8 7.7,5.8c3.6,0 6.7,-2.5 7.7,-5.8c0.2,-0.7 0.3,-1.4 0.3,-2.2c0,-1.5 -0.4,-2.8 -1.1,-4C197,225.4 195.6,224.2 194,223.5z"
+ android:fillColor="#669DF6"/>
+ <path
+ android:pathData="M223.7,223.5v-17.5h7.5l-10.6,-18.7l-10.6,18.7h7.5v17.5c-1.6,0.7 -2.9,1.9 -3.8,3.4c-0.7,1.2 -1.1,2.5 -1.1,4c0,0.7 0.1,1.5 0.3,2.2c0.9,3.3 4,5.8 7.7,5.8c3.6,0 6.7,-2.5 7.7,-5.8c0.2,-0.7 0.3,-1.4 0.3,-2.2c0,-1.5 -0.4,-2.8 -1.1,-4C226.6,225.4 225.3,224.2 223.7,223.5z"
+ android:fillColor="#669DF6"/>
+</vector>
diff --git a/res/drawable-night/accessibility_captions_banner.xml b/res/drawable-night/accessibility_captions_banner.xml
new file mode 100644
index 0000000..7ee30f2
--- /dev/null
+++ b/res/drawable-night/accessibility_captions_banner.xml
@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2021 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:fillColor="#FF000000"
+ android:pathData="M383.9,300H28.1C12.6,300 0,287.4 0,271.9V28.1C0,12.6 12.6,0 28.1,0h355.8C399.4,0 412,12.6 412,28.1v243.8C412,287.4 399.4,300 383.9,300z"/>
+ <path
+ android:pathData="M79.2,179.6h53.6v8.5h-53.6z"
+ android:fillColor="#669DF6"/>
+ <path
+ android:pathData="M142.5,179.6h30.4v8.5h-30.4z"
+ android:fillColor="#669DF6"/>
+ <path
+ android:pathData="M79.2,195.5h79.2v8.5h-79.2z"
+ android:fillColor="#669DF6"/>
+ <path
+ android:pathData="M168.1,195.5h34.1v8.5h-34.1z"
+ android:fillColor="#669DF6"/>
+ <path
+ android:pathData="M211.9,195.5h34.1v8.5h-34.1z"
+ android:fillColor="#669DF6"/>
+ <path
+ android:pathData="M182.7,179.6h73.1v8.5h-73.1z"
+ android:fillColor="#669DF6"/>
+ <path
+ android:pathData="M265.5,179.6h26.8v8.5h-26.8z"
+ android:fillColor="#669DF6"/>
+ <path
+ android:pathData="M302.1,179.6h26.8v8.5h-26.8z"
+ android:fillColor="#669DF6"/>
+ <path
+ android:pathData="M142.7,67.9h-11.5c-1.6,0 -2.9,1.3 -2.9,2.9H67.8c-7.9,0 -14.4,6.5 -14.4,14.4v132.4c0,7.9 6.5,14.4 14.4,14.4h276.4c7.9,0 14.4,-6.5 14.4,-14.4V85.2c0,-7.9 -6.5,-14.4 -14.4,-14.4H203.1c0,-1.6 -1.3,-2.9 -2.9,-2.9h-28.8c-1.6,0 -2.9,1.3 -2.9,2.9h-23C145.5,69.2 144.3,67.9 142.7,67.9zM344.2,73.7c6.4,0 11.5,5.2 11.5,11.5v132.4c0,6.3 -5.2,11.5 -11.5,11.5H67.8c-6.4,0 -11.5,-5.2 -11.5,-11.5V85.2c0,-6.3 5.2,-11.5 11.5,-11.5H344.2z"
+ android:fillColor="#80868B"/>
+</vector>
diff --git a/res/drawable-night/accessibility_shortcut_type_hardware.xml b/res/drawable-night/accessibility_shortcut_type_hardware.xml
new file mode 100644
index 0000000..9ef3664
--- /dev/null
+++ b/res/drawable-night/accessibility_shortcut_type_hardware.xml
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2021 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:fillColor="#FF000000"
+ android:pathData="M384.2,300H27.8C12.5,300 0,287.2 0,271.5v-243C0,12.8 12.5,0 27.8,0h356.5C399.5,0 412,12.8 412,28.5v243.2C412,287.2 399.5,300 384.2,300z"/>
+ <path
+ android:pathData="M206.1,19.1c35,0 67.9,13.6 92.6,38.4C323.4,82.1 337,115 337,150s-13.6,67.9 -38.4,92.6C273.9,267.3 241,281 206,281s-67.9,-13.6 -92.6,-38.4C88.8,217.9 75.1,185 75.1,150s13.6,-67.9 38.4,-92.6S171.1,19.1 206.1,19.1M206.1,17.1c-73.4,0 -133,59.5 -133,132.9S132.6,282.9 206,282.9s133,-59.5 133,-132.9S279.5,17.1 206.1,17.1L206.1,17.1z"
+ android:fillColor="#3C4043"/>
+ <path
+ android:pathData="M287,187.8v-1.5h2.9v-13.7c0,-1.6 -1.3,-2.9 -2.9,-2.9v-23.2c1.6,0 2.9,-1.3 2.9,-2.9V132c0,-1.6 -1.3,-2.9 -2.9,-2.9V68.4c0,-8 -6.5,-14.5 -14.5,-14.5H139.4c-8,0 -14.5,6.5 -14.5,14.5v185.3c1,0.7 1.9,1.4 2.9,2.1V68.4c0,-6.4 5.2,-11.6 11.6,-11.6h133.1c6.4,0 11.6,5.2 11.6,11.6v188.7c1,-0.7 1.9,-1.4 2.9,-2.2v-50.5c1.6,0 2.9,-1.3 2.9,-2.9v-13.7H287z"
+ android:fillColor="#80868B"/>
+ <path
+ android:pathData="M287,204.4c1.6,0 2.9,-1.3 2.9,-2.9v-14H287v-0.9h2.9v-14c0,-1.6 -1.3,-2.9 -2.9,-2.9"
+ android:fillColor="#669DF6"/>
+ <path
+ android:pathData="M825.7,300H469.3c-15.3,0 -27.8,-12.8 -27.8,-28.5v-243C441.5,12.8 454,0 469.3,0h356.5c15.2,0 27.7,12.8 27.7,28.5v243.2C853.5,287.2 841,300 825.7,300z"
+ android:fillColor="#FFFFFF"/>
+ <path
+ android:pathData="M728.5,187.8v-1.5h2.9v-13.7c0,-1.6 -1.3,-2.9 -2.9,-2.9v-23.2c1.6,0 2.9,-1.3 2.9,-2.9V132c0,-1.6 -1.3,-2.9 -2.9,-2.9V68.4c0,-8 -6.5,-14.5 -14.5,-14.5H580.9c-8,0 -14.5,6.5 -14.5,14.5v185.3c1,0.7 1.9,1.4 2.9,2.1V68.4c0,-6.4 5.2,-11.6 11.6,-11.6H714c6.4,0 11.6,5.2 11.6,11.6v188.7c1,-0.7 1.9,-1.4 2.9,-2.2v-50.5c1.6,0 2.9,-1.3 2.9,-2.9v-13.7H728.5z"
+ android:fillColor="#DADCE0"/>
+ <path
+ android:pathData="M728.5,204.4c1.6,0 2.9,-1.3 2.9,-2.9v-14h-2.9v-0.9h2.9v-14c0,-1.6 -1.3,-2.9 -2.9,-2.9"
+ android:fillColor="#1A73E8"/>
+ <path
+ android:pathData="M648.2,19.1c35,0 67.9,13.6 92.6,38.4c24.7,24.6 38.3,57.5 38.3,92.5s-13.6,67.9 -38.4,92.6C716,267.3 683.1,281 648.1,281s-67.9,-13.6 -92.6,-38.4c-24.6,-24.7 -38.3,-57.6 -38.3,-92.6s13.6,-67.9 38.4,-92.6C580.4,32.7 613.2,19.1 648.2,19.1M648.2,17.1c-73.4,0 -133,59.5 -133,132.9s59.5,132.9 132.9,132.9s133,-59.5 133,-132.9S721.6,17.1 648.2,17.1L648.2,17.1z"
+ android:fillColor="#E8EAED"/>
+</vector>
diff --git a/res/drawable-night/accessibility_shortcut_type_software.xml b/res/drawable-night/accessibility_shortcut_type_software.xml
new file mode 100644
index 0000000..8d55ae9
--- /dev/null
+++ b/res/drawable-night/accessibility_shortcut_type_software.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2021 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:fillColor="#FF000000"
+ 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"/>
+ <path
+ android:pathData="M142,225.3H275.1a14.51,14.51 0,0 0,14.5 -14.5V69a2.9,2.9 0,0 0,2.9 -2.9v-17c-1.9,-1.6 -3.8,-3.2 -5.8,-4.7V210.8a11.61,11.61 0,0 1,-11.6 11.6H142a11.61,11.61 0,0 1,-11.6 -11.6V42.7c-1,0.7 -1.9,1.4 -2.9,2.1V210.9A14.62,14.62 0,0 0,142 225.3Z"
+ android:fillColor="#80868b"/>
+ <path
+ android:pathData="M286.7,210.83a11.59,11.59 0,0 1,-11.58 11.58H142a11.59,11.59 0,0 1,-11.58 -11.58V183.26H286.7Z"
+ android:fillColor="#3c4043"/>
+ <path
+ android:pathData="M250.41,193.38a1.77,1.77 0,1 1,-1.78 1.77A1.77,1.77 0,0 1,250.41 193.38ZM253.07,199.58v11.53h-1.78v-5.32h-1.77v5.32h-1.77L247.75,199.58a30.78,30.78 0,0 1,-5.32 -0.89l0.44,-1.77a32.34,32.34 0,0 0,15.07 0l0.45,1.77A30.78,30.78 0,0 1,253.07 199.58Z"
+ android:fillColor="#fff"/>
+ <path
+ android:pathData="M208.55,202.84m-6.13,0a6.13,6.13 0,1 1,12.26 0a6.13,6.13 0,1 1,-12.26 0"
+ android:fillColor="#80868b"/>
+ <path
+ android:pathData="M250.41,202.84m-22.28,0a22.28,22.28 0,1 1,44.56 0a22.28,22.28 0,1 1,-44.56 0"
+ android:strokeWidth="2"
+ android:fillColor="#00000000"
+ android:strokeColor="#669df6"/>
+ <path
+ android:pathData="M160.45,202.84l10.43,6.02l0,-12.05l-10.43,6.03z"
+ android:fillColor="#80868b"/>
+ <path
+ android:pathData="M207.4,19.1a131.11,131.11 0,0 1,131 131,131 131,0 0,1 -262,-0.1 130.94,130.94 0,0 1,131 -130.9m0,-2A132.9,132.9 0,1 0,340.3 150,133 133,0 0,0 207.4,17.1Z"
+ android:fillColor="#3c4043"/>
+</vector>
diff --git a/res/drawable-night/accessibility_shortcut_type_software_floating.xml b/res/drawable-night/accessibility_shortcut_type_software_floating.xml
new file mode 100644
index 0000000..25d53ca
--- /dev/null
+++ b/res/drawable-night/accessibility_shortcut_type_software_floating.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2021 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:fillColor="#FF000000"
+ 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"/>
+ <path
+ android:pathData="M142,225.3H275.1a14.51,14.51 0,0 0,14.5 -14.5V69a2.9,2.9 0,0 0,2.9 -2.9v-17c-1.9,-1.6 -3.8,-3.2 -5.8,-4.7V210.8a11.61,11.61 0,0 1,-11.6 11.6H142a11.61,11.61 0,0 1,-11.6 -11.6V42.7c-1,0.7 -1.9,1.4 -2.9,2.1V210.9A14.62,14.62 0,0 0,142 225.3Z"
+ android:fillColor="#80868b"/>
+ <path
+ android:strokeWidth="1"
+ android:pathData="M286.7,144.13H266a19.63,19.63 0,1 0,0 39.26H286.7"
+ android:fillColor="#00000000"
+ android:strokeColor="#80868b"/>
+ <path
+ android:pathData="M266,148.65a15.11,15.11 0,1 0,15.1 15.11A15.11,15.11 0,0 0,266 148.65ZM266,155.93a1.59,1.59 0,0 1,0 3.17,1.59 1.59,0 1,1 0,-3.17ZM268.37,161.47v10.29h-1.58L266.79,167h-1.59v4.75h-1.58L263.62,161.47a27.23,27.23 0,0 1,-4.75 -0.79l0.4,-1.58a29.06,29.06 0,0 0,13.46 0l0.39,1.58A27.23,27.23 0,0 1,268.33 161.47Z"
+ android:fillColor="#dadce0"/>
+ <path
+ android:pathData="M207.4,19.1a131.11,131.11 0,0 1,131 131,131 131,0 0,1 -262,-0.1 130.94,130.94 0,0 1,131 -130.9m0,-2A132.9,132.9 0,1 0,340.3 150,133 133,0 0,0 207.4,17.1Z"
+ android:fillColor="#3c4043"/>
+</vector>
diff --git a/res/drawable-night/accessibility_shortcut_type_software_gesture.xml b/res/drawable-night/accessibility_shortcut_type_software_gesture.xml
new file mode 100644
index 0000000..9055865
--- /dev/null
+++ b/res/drawable-night/accessibility_shortcut_type_software_gesture.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2021 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:fillColor="#FF000000"
+ android:pathData="M384.2,300H27.8C12.5,300 0,287.2 0,271.5v-243C0,12.8 12.5,0 27.8,0h356.5C399.5,0 412,12.8 412,28.5v243.2C412,287.2 399.5,300 384.2,300z"/>
+ <path
+ android:pathData="M139.5,225.3h133.1c8,0 14.5,-6.5 14.5,-14.5V69c1.6,0 2.9,-1.3 2.9,-2.9v-17c-1.9,-1.6 -3.8,-3.2 -5.8,-4.7v166.4c0,6.4 -5.2,11.6 -11.6,11.6H139.5c-6.4,0 -11.6,-5.2 -11.6,-11.6V42.7c-1,0.7 -1.9,1.4 -2.9,2.1v166.1C125.1,218.8 131.6,225.3 139.5,225.3z"
+ android:fillColor="#80868B"/>
+ <path
+ android:pathData="M229.9,207.9h-47.8c-1.1,0 -2,0.9 -2,2s0.9,2 2,2h47.8c1.1,0 2,-0.9 2,-2S231,207.9 229.9,207.9z"
+ android:fillColor="#80868B"/>
+ <path
+ android:pathData="M198.4,205.7v-11.4h4.9l-6.9,-12.2l-6.9,12.2h4.9v11.4c-1.9,0.8 -3.2,2.6 -3.2,4.8c0,2.9 2.3,5.2 5.2,5.2s5.2,-2.3 5.2,-5.2C201.6,208.4 200.2,206.5 198.4,205.7z"
+ android:fillColor="#669DF6"/>
+ <path
+ android:pathData="M217.7,205.7v-11.4h4.9l-6.9,-12.2l-6.9,12.2h4.9v11.4c-1.9,0.8 -3.2,2.6 -3.2,4.8c0,2.9 2.3,5.2 5.2,5.2s5.2,-2.3 5.2,-5.2C220.9,208.4 219.6,206.5 217.7,205.7z"
+ android:fillColor="#669DF6"/>
+ <path
+ android:pathData="M206.1,19.1c35,0 67.9,13.6 92.6,38.4c24.7,24.7 38.4,57.6 38.4,92.6s-13.6,67.9 -38.4,92.6c-24.7,24.7 -57.6,38.4 -92.6,38.4s-67.9,-13.6 -92.6,-38.4C88.8,217.9 75.1,185 75.1,150s13.6,-67.9 38.4,-92.6C138.2,32.7 171.1,19.1 206.1,19.1M206.1,17.1c-73.4,0 -133,59.5 -133,132.9S132.6,282.9 206,282.9S339,223.4 339,150S279.5,17.1 206.1,17.1L206.1,17.1z"
+ android:fillColor="#3C4043"/>
+</vector>
diff --git a/res/drawable-night/accessibility_shortcut_type_software_gesture_talkback.xml b/res/drawable-night/accessibility_shortcut_type_software_gesture_talkback.xml
new file mode 100644
index 0000000..0b6f1e6
--- /dev/null
+++ b/res/drawable-night/accessibility_shortcut_type_software_gesture_talkback.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2021 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:fillColor="#FF000000"
+ android:pathData="M384.2,300H27.8C12.5,300 0,287.2 0,271.5v-243C0,12.8 12.5,0 27.8,0h356.5C399.5,0 412,12.8 412,28.5v243.2C412,287.2 399.5,300 384.2,300z"/>
+ <path
+ android:pathData="M138,225.3h133.1c8,0 14.5,-6.5 14.5,-14.5V69c1.6,0 2.9,-1.3 2.9,-2.9V45.7c-1.9,-1.5 -3.8,-2.9 -5.8,-4.3v169.4c0,6.4 -5.2,11.6 -11.6,11.6H138c-6.4,0 -11.6,-5.2 -11.6,-11.6V43.5c-1,0.7 -1.9,1.5 -2.9,2.2v165C123.5,218.8 130,225.3 138,225.3z"
+ android:fillColor="#80868B"/>
+ <path
+ android:pathData="M206,283.9c-73.9,0 -133.9,-60.1 -133.9,-133.9S132.1,16.1 206,16.1c73.9,0 133.9,60.1 133.9,133.9S279.9,283.9 206,283.9zM206,18.1C133.2,18.1 74.1,77.2 74.1,150S133.2,281.9 206,281.9S337.9,222.8 337.9,150S278.8,18.1 206,18.1z"
+ android:fillColor="#3C4043"/>
+ <path
+ android:pathData="M229.9,207.9h-47.8c-1.1,0 -2,0.9 -2,2s0.9,2 2,2h47.8c1.1,0 2,-0.9 2,-2S231,207.9 229.9,207.9z"
+ android:fillColor="#80868B"/>
+ <path
+ android:pathData="M190.9,205.7v-11.4h4.9l-6.9,-12.2l-6.9,12.2h4.9v11.4c-1.9,0.8 -3.2,2.6 -3.2,4.8c0,2.9 2.3,5.2 5.2,5.2c2.9,0 5.2,-2.3 5.2,-5.2C194.1,208.4 192.8,206.5 190.9,205.7z"
+ android:fillColor="#669DF6"/>
+ <path
+ android:pathData="M208,205.7v-11.4h4.9l-6.9,-12.2l-6.9,12.2h4.9v11.4c-1.9,0.8 -3.2,2.6 -3.2,4.8c0,2.9 2.3,5.2 5.2,5.2c2.9,0 5.2,-2.3 5.2,-5.2C211.2,208.4 209.9,206.5 208,205.7z"
+ android:fillColor="#669DF6"/>
+ <path
+ android:pathData="M225.1,205.7v-11.4h4.9l-6.9,-12.2l-6.9,12.2h4.9v11.4c-1.9,0.8 -3.2,2.6 -3.2,4.8c0,2.9 2.3,5.2 5.2,5.2c2.9,0 5.2,-2.3 5.2,-5.2C228.2,208.4 226.9,206.5 225.1,205.7z"
+ android:fillColor="#669DF6"/>
+</vector>
diff --git a/res/drawable-night/ic_illustration_fullscreen.xml b/res/drawable-night/ic_illustration_fullscreen.xml
new file mode 100644
index 0000000..c5f1f92
--- /dev/null
+++ b/res/drawable-night/ic_illustration_fullscreen.xml
@@ -0,0 +1,211 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2021 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="M-83.4,-43h-356.4c-15.3,0 -27.8,-12.8 -27.8,-28.5v-243c0,-15.7 12.5,-28.5 27.8,-28.5h356.5c15.2,0 27.7,12.8 27.7,28.5v243.2C-55.6,-55.8 -68.1,-43 -83.4,-43z"
+ android:fillColor="#FFFFFF"/>
+ <path
+ android:pathData="M-260.2,-323.9c35,0 67.9,13.6 92.6,38.4c24.7,24.7 38.4,57.6 38.4,92.6s-13.6,67.9 -38.4,92.6c-24.7,24.7 -57.6,38.4 -92.6,38.4s-67.9,-13.6 -92.6,-38.4c-24.7,-24.8 -38.4,-57.7 -38.4,-92.7s13.6,-67.9 38.4,-92.6C-328.1,-310.3 -295.2,-323.9 -260.2,-323.9M-260.2,-325.9c-73.4,0 -133,59.5 -133,132.9s59.5,132.9 132.9,132.9s133,-59.5 133,-132.9S-186.8,-325.9 -260.2,-325.9L-260.2,-325.9z"
+ android:fillColor="#E8EAED"/>
+ <path
+ android:pathData="M-205.5,-235.3v-7.7c0,-1.1 -0.9,-1.9 -1.9,-1.9v-40.4c0,-5.3 -4.3,-9.6 -9.6,-9.6h-88.5c-5.3,0 -9.6,4.3 -9.6,9.6v184.8c0,5.3 4.3,9.6 9.6,9.6h88.5c5.3,0 9.6,-4.3 9.6,-9.6v-94.3c1.1,0 1.9,-0.9 1.9,-1.9v-19.2c0,-1.1 -0.9,-1.9 -1.9,-1.9v-15.4C-206.4,-233.4 -205.5,-234.3 -205.5,-235.3zM-209.4,-100.6c0,4.2 -3.5,7.7 -7.7,7.7h-88.5c-4.2,0 -7.7,-3.5 -7.7,-7.7v-184.8c0,-4.2 3.5,-7.7 7.7,-7.7h88.5c4.2,0 7.7,3.5 7.7,7.7V-100.6z"
+ android:fillColor="#DADCE0"/>
+ <path
+ android:pathData="M-217.1,-224.1c2,0 3.7,1.7 3.7,3.7v54.8c0,2 -1.7,3.7 -3.7,3.7h-88.5c-2,0 -3.7,-1.7 -3.7,-3.7v-54.8c0,-2 1.7,-3.7 3.7,-3.7H-217.1M-217.1,-228.1h-88.5c-4.2,0 -7.7,3.5 -7.7,7.7v54.8c0,4.2 3.5,7.7 7.7,7.7h88.5c4.2,0 7.7,-3.5 7.7,-7.7v-54.8C-209.4,-224.6 -212.8,-228.1 -217.1,-228.1L-217.1,-228.1z"
+ android:fillColor="#F9AB00"/>
+ <path
+ android:pathData="M-230.7,-217.4l11,0l0,11"
+ android:strokeLineJoin="round"
+ android:strokeWidth="4"
+ android:fillColor="#00000000"
+ android:strokeColor="#F9AB00"
+ android:strokeLineCap="round"/>
+ <path
+ android:pathData="M-219.7,-217.4L-235.3,-201.8"
+ android:strokeLineJoin="round"
+ android:strokeWidth="4"
+ android:fillColor="#00000000"
+ android:strokeColor="#F9AB00"
+ android:strokeLineCap="round"/>
+ <path
+ android:pathData="M-292.4,-167.9l-10.9,0l0,-11"
+ android:strokeLineJoin="round"
+ android:strokeWidth="4"
+ android:fillColor="#00000000"
+ android:strokeColor="#F9AB00"
+ android:strokeLineCap="round"/>
+ <path
+ android:pathData="M-303.3,-167.9L-287.7,-183.5"
+ android:strokeLineJoin="round"
+ android:strokeWidth="4"
+ android:fillColor="#00000000"
+ android:strokeColor="#F9AB00"
+ android:strokeLineCap="round"/>
+ <path
+ android:fillColor="#FF000000"
+ android:pathData="M384.2,-43H27.8C12.5,-43 0,-55.8 0,-71.5v-243C0,-330.2 12.5,-343 27.8,-343h356.5c15.2,0 27.7,12.8 27.7,28.5v243.2C412,-55.8 399.5,-43 384.2,-43z"/>
+ <path
+ android:pathData="M207.4,-323.9c35,0 67.9,13.6 92.6,38.4c24.7,24.7 38.4,57.6 38.4,92.6S324.8,-125 300,-100.3c-24.7,24.7 -57.6,38.4 -92.6,38.4s-67.9,-13.6 -92.6,-38.4C90.1,-125.1 76.4,-158 76.4,-193s13.6,-67.9 38.4,-92.6C139.5,-310.3 172.4,-323.9 207.4,-323.9M207.4,-325.9c-73.4,0 -133,59.5 -133,132.9S133.9,-60.1 207.3,-60.1s133,-59.5 133,-132.9S280.8,-325.9 207.4,-325.9L207.4,-325.9z"
+ android:fillColor="#3C4043"/>
+ <path
+ android:pathData="M262.1,-235.3v-7.7c0,-1.1 -0.9,-1.9 -1.9,-1.9v-40.4c0,-5.3 -4.3,-9.6 -9.6,-9.6H162c-5.3,0 -9.6,4.3 -9.6,9.6v184.8c0,5.3 4.3,9.6 9.6,9.6h88.5c5.3,0 9.6,-4.3 9.6,-9.6v-94.3c1.1,0 1.9,-0.9 1.9,-1.9v-19.2c0,-1.1 -0.9,-1.9 -1.9,-1.9v-15.4C261.2,-233.4 262.1,-234.3 262.1,-235.3zM258.2,-100.6c0,4.2 -3.5,7.7 -7.7,7.7H162c-4.2,0 -7.7,-3.5 -7.7,-7.7v-184.8c0,-4.2 3.5,-7.7 7.7,-7.7h88.5c4.2,0 7.7,3.5 7.7,7.7V-100.6z"
+ android:fillColor="#80868B"/>
+ <path
+ android:pathData="M250.5,-224.1c2,0 3.7,1.7 3.7,3.7v54.8c0,2 -1.7,3.7 -3.7,3.7H162c-2,0 -3.7,-1.7 -3.7,-3.7v-54.8c0,-2 1.7,-3.7 3.7,-3.7H250.5M250.5,-228.1H162c-4.2,0 -7.7,3.5 -7.7,7.7v54.8c0,4.2 3.5,7.7 7.7,7.7h88.5c4.2,0 7.7,-3.5 7.7,-7.7v-54.8C258.2,-224.6 254.8,-228.1 250.5,-228.1L250.5,-228.1z"
+ android:fillColor="#FCC934"/>
+ <path
+ android:pathData="M236.9,-217.4l11,0l0,11"
+ android:strokeLineJoin="round"
+ android:strokeWidth="4"
+ android:fillColor="#00000000"
+ android:strokeColor="#FCC934"
+ android:strokeLineCap="round"/>
+ <path
+ android:pathData="M247.9,-217.4L232.3,-201.8"
+ android:strokeLineJoin="round"
+ android:strokeWidth="4"
+ android:fillColor="#00000000"
+ android:strokeColor="#FCC934"
+ android:strokeLineCap="round"/>
+ <path
+ android:pathData="M175.2,-167.9l-10.9,0l0,-11"
+ android:strokeLineJoin="round"
+ android:strokeWidth="4"
+ android:fillColor="#00000000"
+ android:strokeColor="#FCC934"
+ android:strokeLineCap="round"/>
+ <path
+ android:pathData="M164.3,-167.9L179.9,-183.5"
+ android:strokeLineJoin="round"
+ android:strokeWidth="4"
+ android:fillColor="#00000000"
+ android:strokeColor="#FCC934"
+ android:strokeLineCap="round"/>
+ <path
+ android:fillColor="#FF000000"
+ android:pathData="M384.2,650.3H27.8C12.5,650.3 0,637.5 0,621.8v-243c0,-15.7 12.5,-28.5 27.8,-28.5h356.5c15.2,0 27.7,12.8 27.7,28.5V622C412,637.5 399.5,650.3 384.2,650.3z"/>
+ <path
+ android:pathData="M207.4,369.4c35,0 67.9,13.6 92.6,38.4c24.7,24.7 38.4,57.6 38.4,92.6c0,35 -13.6,67.9 -38.4,92.6c-24.7,24.7 -57.6,38.4 -92.6,38.4s-67.9,-13.6 -92.6,-38.4c-24.7,-24.8 -38.4,-57.7 -38.4,-92.7s13.6,-67.9 38.4,-92.6C139.5,383 172.4,369.4 207.4,369.4M207.4,367.4c-73.4,0 -133,59.5 -133,132.9s59.5,132.9 132.9,132.9s133,-59.5 133,-132.9S280.8,367.4 207.4,367.4L207.4,367.4z"
+ android:fillColor="#3C4043"/>
+ <path
+ android:pathData="M262.1,458v-7.7c0,-1.1 -0.9,-1.9 -1.9,-1.9V408c0,-5.3 -4.3,-9.6 -9.6,-9.6H162c-5.3,0 -9.6,4.3 -9.6,9.6v184.8c0,5.3 4.3,9.6 9.6,9.6h88.5c5.3,0 9.6,-4.3 9.6,-9.6v-94.3c1.1,0 1.9,-0.9 1.9,-1.9v-19.2c0,-1.1 -0.9,-1.9 -1.9,-1.9v-15.4C261.2,459.9 262.1,459.1 262.1,458zM258.2,592.7c0,4.2 -3.5,7.7 -7.7,7.7H162c-4.2,0 -7.7,-3.5 -7.7,-7.7V408c0,-4.2 3.5,-7.7 7.7,-7.7h88.5c4.2,0 7.7,3.5 7.7,7.7V592.7z"
+ android:fillColor="#80868B"/>
+ <path
+ android:pathData="M250.5,404.3c2,0 3.7,1.7 3.7,3.7v184.8c0,2 -1.7,3.7 -3.7,3.7H162c-2,0 -3.7,-1.7 -3.7,-3.7V408c0,-2 1.7,-3.7 3.7,-3.7H250.5M250.5,400.3H162c-4.2,0 -7.7,3.5 -7.7,7.7v184.8c0,4.2 3.5,7.7 7.7,7.7h88.5c4.2,0 7.7,-3.5 7.7,-7.7V408C258.2,403.7 254.8,400.3 250.5,400.3L250.5,400.3z"
+ android:fillColor="#FCC934"/>
+ <path
+ android:fillColor="#FF000000"
+ android:pathData="M384.2,300H27.8C12.5,300 0,287.2 0,271.5v-243C0,12.8 12.5,0 27.8,0h356.5C399.5,0 412,12.8 412,28.5v243.2C412,287.2 399.5,300 384.2,300z"/>
+ <path
+ android:pathData="M207.4,19.1c35,0 67.9,13.6 92.6,38.4c24.7,24.7 38.4,57.6 38.4,92.6S324.8,218 300,242.7c-24.7,24.7 -57.6,38.4 -92.6,38.4s-67.9,-13.6 -92.6,-38.4C90.1,217.9 76.4,185 76.4,150S90,82.1 114.8,57.4C139.5,32.7 172.4,19.1 207.4,19.1M207.4,17.1c-73.4,0 -133,59.5 -133,132.9s59.5,132.9 132.9,132.9s133,-59.5 133,-132.9S280.8,17.1 207.4,17.1L207.4,17.1z"
+ android:fillColor="#3C4043"/>
+ <path
+ android:pathData="M262.1,107.7V100c0,-1.1 -0.9,-1.9 -1.9,-1.9V57.6c0,-5.3 -4.3,-9.6 -9.6,-9.6H162c-5.3,0 -9.6,4.3 -9.6,9.6v184.8c0,5.3 4.3,9.6 9.6,9.6h88.5c5.3,0 9.6,-4.3 9.6,-9.6v-94.3c1.1,0 1.9,-0.9 1.9,-1.9v-19.2c0,-1.1 -0.9,-1.9 -1.9,-1.9v-15.4C261.2,109.6 262.1,108.7 262.1,107.7zM258.2,242.4c0,4.2 -3.5,7.7 -7.7,7.7H162c-4.2,0 -7.7,-3.5 -7.7,-7.7V57.6c0,-4.2 3.5,-7.7 7.7,-7.7h88.5c4.2,0 7.7,3.5 7.7,7.7V242.4z"
+ android:fillColor="#80868B"/>
+ <path
+ android:pathData="M250.5,53.9c2,0 3.7,1.7 3.7,3.7v184.8c0,2 -1.7,3.7 -3.7,3.7H162c-2,0 -3.7,-1.7 -3.7,-3.7V57.6c0,-2 1.7,-3.7 3.7,-3.7H250.5M250.5,49.9H162c-4.2,0 -7.7,3.5 -7.7,7.7v184.8c0,4.2 3.5,7.7 7.7,7.7h88.5c4.2,0 7.7,-3.5 7.7,-7.7V57.6C258.2,53.4 254.8,49.9 250.5,49.9L250.5,49.9z"
+ android:fillColor="#FCC934"/>
+ <path
+ android:pathData="M236.9,60.6l11,0l0,11"
+ android:strokeLineJoin="round"
+ android:strokeWidth="4"
+ android:fillColor="#00000000"
+ android:strokeColor="#FCC934"
+ android:strokeLineCap="round"/>
+ <path
+ android:pathData="M247.9,60.6L232.3,76.2"
+ android:strokeLineJoin="round"
+ android:strokeWidth="4"
+ android:fillColor="#00000000"
+ android:strokeColor="#FCC934"
+ android:strokeLineCap="round"/>
+ <path
+ android:pathData="M175.2,240.1l-10.9,0l0,-11"
+ android:strokeLineJoin="round"
+ android:strokeWidth="4"
+ android:fillColor="#00000000"
+ android:strokeColor="#FCC934"
+ android:strokeLineCap="round"/>
+ <path
+ android:pathData="M164.3,240.1L179.9,224.5"
+ android:strokeLineJoin="round"
+ android:strokeWidth="4"
+ android:fillColor="#00000000"
+ android:strokeColor="#FCC934"
+ android:strokeLineCap="round"/>
+ <path
+ android:pathData="M-83.4,300h-356.4c-15.3,0 -27.8,-12.8 -27.8,-28.5v-243c0,-15.7 12.5,-28.5 27.8,-28.5h356.5c15.2,0 27.7,12.8 27.7,28.5v243.2C-55.6,287.2 -68.1,300 -83.4,300z"
+ android:fillColor="#FFFFFF"/>
+ <path
+ android:pathData="M-260.2,19.1c35,0 67.9,13.6 92.6,38.4c24.7,24.7 38.4,57.6 38.4,92.6s-13.6,67.9 -38.4,92.6c-24.7,24.7 -57.6,38.4 -92.6,38.4s-67.9,-13.6 -92.6,-38.4c-24.7,-24.8 -38.4,-57.7 -38.4,-92.7s13.6,-67.9 38.4,-92.6C-328.1,32.7 -295.2,19.1 -260.2,19.1M-260.2,17.1c-73.4,0 -133,59.5 -133,132.9s59.5,132.9 132.9,132.9s133,-59.5 133,-132.9S-186.8,17.1 -260.2,17.1L-260.2,17.1z"
+ android:fillColor="#E8EAED"/>
+ <path
+ android:pathData="M-205.5,107.7V100c0,-1.1 -0.9,-1.9 -1.9,-1.9V57.6c0,-5.3 -4.3,-9.6 -9.6,-9.6h-88.5c-5.3,0 -9.6,4.3 -9.6,9.6v184.8c0,5.3 4.3,9.6 9.6,9.6h88.5c5.3,0 9.6,-4.3 9.6,-9.6v-94.3c1.1,0 1.9,-0.9 1.9,-1.9v-19.2c0,-1.1 -0.9,-1.9 -1.9,-1.9v-15.4C-206.4,109.6 -205.5,108.7 -205.5,107.7zM-209.4,242.4c0,4.2 -3.5,7.7 -7.7,7.7h-88.5c-4.2,0 -7.7,-3.5 -7.7,-7.7V57.6c0,-4.2 3.5,-7.7 7.7,-7.7h88.5c4.2,0 7.7,3.5 7.7,7.7V242.4z"
+ android:fillColor="#DADCE0"/>
+ <path
+ android:pathData="M-217.1,53.9c2,0 3.7,1.7 3.7,3.7v184.8c0,2 -1.7,3.7 -3.7,3.7h-88.5c-2,0 -3.7,-1.7 -3.7,-3.7V57.6c0,-2 1.7,-3.7 3.7,-3.7H-217.1M-217.1,49.9h-88.5c-4.2,0 -7.7,3.5 -7.7,7.7v184.8c0,4.2 3.5,7.7 7.7,7.7h88.5c4.2,0 7.7,-3.5 7.7,-7.7V57.6C-209.4,53.4 -212.8,49.9 -217.1,49.9L-217.1,49.9z"
+ android:fillColor="#F9AB00"/>
+ <path
+ android:pathData="M-230.7,60.6l11,0l0,11"
+ android:strokeLineJoin="round"
+ android:strokeWidth="4"
+ android:fillColor="#00000000"
+ android:strokeColor="#F9AB00"
+ android:strokeLineCap="round"/>
+ <path
+ android:pathData="M-219.7,60.6L-235.3,76.2"
+ android:strokeLineJoin="round"
+ android:strokeWidth="4"
+ android:fillColor="#00000000"
+ android:strokeColor="#F9AB00"
+ android:strokeLineCap="round"/>
+ <path
+ android:pathData="M-292.4,240.1l-10.9,0l0,-11"
+ android:strokeLineJoin="round"
+ android:strokeWidth="4"
+ android:fillColor="#00000000"
+ android:strokeColor="#F9AB00"
+ android:strokeLineCap="round"/>
+ <path
+ android:pathData="M-303.3,240.1L-287.7,224.5"
+ android:strokeLineJoin="round"
+ android:strokeWidth="4"
+ android:fillColor="#00000000"
+ android:strokeColor="#F9AB00"
+ android:strokeLineCap="round"/>
+ <path
+ android:pathData="M242.2,574.2h-13.9v10.4h13.9V574.2zM245.7,560.3h-31.3c-1.9,0 -3.5,1.5 -3.5,3.4v24.4c0,1.9 1.6,3.5 3.5,3.5h31.3c1.9,0 3.5,-1.6 3.5,-3.5v-24.4C249.1,561.8 247.6,560.3 245.7,560.3zM245.7,588.2h-31.3v-24.5h31.3V588.2z"
+ android:fillColor="#DADCE0"/>
+ <path
+ android:pathData="M-83.4,650.3h-356.4c-15.3,0 -27.8,-12.8 -27.8,-28.5v-243c0,-15.7 12.5,-28.5 27.8,-28.5h356.5c15.2,0 27.7,12.8 27.7,28.5V622C-55.6,637.5 -68.1,650.3 -83.4,650.3z"
+ android:fillColor="#FFFFFF"/>
+ <path
+ android:pathData="M-260.2,369.4c35,0 67.9,13.6 92.6,38.4c24.7,24.7 38.4,57.6 38.4,92.6c0,35 -13.6,67.9 -38.4,92.6c-24.7,24.7 -57.6,38.4 -92.6,38.4s-67.9,-13.6 -92.6,-38.4c-24.7,-24.8 -38.4,-57.7 -38.4,-92.7s13.6,-67.9 38.4,-92.6C-328.1,383 -295.2,369.4 -260.2,369.4M-260.2,367.4c-73.4,0 -133,59.5 -133,132.9s59.5,132.9 132.9,132.9s133,-59.5 133,-132.9S-186.8,367.4 -260.2,367.4L-260.2,367.4z"
+ android:fillColor="#E8EAED"/>
+ <path
+ android:pathData="M-205.5,458v-7.7c0,-1.1 -0.9,-1.9 -1.9,-1.9V408c0,-5.3 -4.3,-9.6 -9.6,-9.6h-88.5c-5.3,0 -9.6,4.3 -9.6,9.6v184.8c0,5.3 4.3,9.6 9.6,9.6h88.5c5.3,0 9.6,-4.3 9.6,-9.6v-94.3c1.1,0 1.9,-0.9 1.9,-1.9v-19.2c0,-1.1 -0.9,-1.9 -1.9,-1.9v-15.4C-206.4,459.9 -205.5,459.1 -205.5,458zM-209.4,592.7c0,4.2 -3.5,7.7 -7.7,7.7h-88.5c-4.2,0 -7.7,-3.5 -7.7,-7.7V408c0,-4.2 3.5,-7.7 7.7,-7.7h88.5c4.2,0 7.7,3.5 7.7,7.7V592.7z"
+ android:fillColor="#DADCE0"/>
+ <path
+ android:pathData="M-217.1,404.3c2,0 3.7,1.7 3.7,3.7v184.8c0,2 -1.7,3.7 -3.7,3.7h-88.5c-2,0 -3.7,-1.7 -3.7,-3.7V408c0,-2 1.7,-3.7 3.7,-3.7H-217.1M-217.1,400.3h-88.5c-4.2,0 -7.7,3.5 -7.7,7.7v184.8c0,4.2 3.5,7.7 7.7,7.7h88.5c4.2,0 7.7,-3.5 7.7,-7.7V408C-209.4,403.7 -212.8,400.3 -217.1,400.3L-217.1,400.3z"
+ android:fillColor="#F9AB00"/>
+ <path
+ android:pathData="M-225.4,574.2h-13.9v10.4h13.9V574.2zM-221.9,560.3h-31.3c-1.9,0 -3.5,1.5 -3.5,3.4v24.4c0,1.9 1.6,3.5 3.5,3.5h31.3c1.9,0 3.5,-1.6 3.5,-3.5v-24.4C-218.4,561.8 -220,560.3 -221.9,560.3zM-221.9,588.2h-31.3v-24.5h31.3V588.2z"
+ android:fillColor="#5F6368"/>
+</vector>
diff --git a/res/drawable-night/ic_illustration_switch.xml b/res/drawable-night/ic_illustration_switch.xml
new file mode 100644
index 0000000..9cabced
--- /dev/null
+++ b/res/drawable-night/ic_illustration_switch.xml
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2021 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:fillColor="#FF000000"
+ android:pathData="M384.2,300H27.8C12.5,300 0,287.2 0,271.5v-243C0,12.8 12.5,0 27.8,0h356.5C399.5,0 412,12.8 412,28.5v243.2C412,287.2 399.5,300 384.2,300z"/>
+ <path
+ android:pathData="M207.4,19.1c35,0 67.9,13.6 92.6,38.4c24.7,24.7 38.4,57.6 38.4,92.6S324.8,218 300,242.7c-24.7,24.7 -57.6,38.4 -92.6,38.4s-67.9,-13.6 -92.6,-38.4C90.1,217.9 76.4,185 76.4,150S90,82.1 114.8,57.4C139.5,32.7 172.4,19.1 207.4,19.1M207.4,17.1c-73.4,0 -133,59.5 -133,132.9s59.5,132.9 132.9,132.9s133,-59.5 133,-132.9S280.8,17.1 207.4,17.1L207.4,17.1z"
+ android:fillColor="#3C4043"/>
+ <path
+ android:pathData="M262.1,107.7V100c0,-1.1 -0.9,-1.9 -1.9,-1.9V57.6c0,-5.3 -4.3,-9.6 -9.6,-9.6H162c-5.3,0 -9.6,4.3 -9.6,9.6v184.8c0,5.3 4.3,9.6 9.6,9.6h88.5c5.3,0 9.6,-4.3 9.6,-9.6v-94.3c1.1,0 1.9,-0.9 1.9,-1.9v-19.2c0,-1.1 -0.9,-1.9 -1.9,-1.9v-15.4C261.2,109.6 262.1,108.7 262.1,107.7zM258.2,242.4c0,4.2 -3.5,7.7 -7.7,7.7H162c-4.2,0 -7.7,-3.5 -7.7,-7.7V57.6c0,-4.2 3.5,-7.7 7.7,-7.7h88.5c4.2,0 7.7,3.5 7.7,7.7V242.4z"
+ android:fillColor="#80868B"/>
+ <path
+ android:pathData="M250.5,53.9c2,0 3.7,1.7 3.7,3.7v184.8c0,2 -1.7,3.7 -3.7,3.7H162c-2,0 -3.7,-1.7 -3.7,-3.7V57.6c0,-2 1.7,-3.7 3.7,-3.7H250.5M250.5,49.9H162c-4.2,0 -7.7,3.5 -7.7,7.7v184.8c0,4.2 3.5,7.7 7.7,7.7h88.5c4.2,0 7.7,-3.5 7.7,-7.7V57.6C258.2,53.4 254.8,49.9 250.5,49.9L250.5,49.9z"
+ android:fillColor="#FCC934"/>
+ <path
+ android:pathData="M214.2,223.8v17.5h34.9v-34.9h-17.5v3.5h14v27.9h-27.9v-14H214.2z"
+ android:fillColor="#DADCE0"/>
+ <path
+ android:pathData="M228.2,206.3h-14v14h14V206.3z"
+ android:fillColor="#DADCE0"/>
+ <path
+ android:pathData="M242.2,222.1v3.5h-6.3l7.9,7.9l-2.5,2.5l-7.9,-7.9v6.3h-3.5v-12.2H242.2z"
+ android:fillColor="#DADCE0"/>
+</vector>
diff --git a/res/drawable-night/ic_illustration_window.xml b/res/drawable-night/ic_illustration_window.xml
new file mode 100644
index 0000000..7984df5
--- /dev/null
+++ b/res/drawable-night/ic_illustration_window.xml
@@ -0,0 +1,61 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2021 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:fillColor="#FF000000"
+ android:pathData="M384.2,300H27.8C12.5,300 0,287.2 0,271.5v-243C0,12.8 12.5,0 27.8,0h356.5C399.5,0 412,12.8 412,28.5v243.2C412,287.2 399.5,300 384.2,300z"/>
+ <path
+ android:pathData="M207.4,19.1c35,0 67.9,13.6 92.6,38.4c24.7,24.7 38.4,57.6 38.4,92.6S324.8,218 300,242.7c-24.7,24.7 -57.6,38.4 -92.6,38.4s-67.9,-13.6 -92.6,-38.4C90.1,217.9 76.4,185 76.4,150S90,82.1 114.8,57.4C139.5,32.7 172.4,19.1 207.4,19.1M207.4,17.1c-73.4,0 -133,59.5 -133,132.9s59.5,132.9 132.9,132.9s133,-59.5 133,-132.9S280.8,17.1 207.4,17.1L207.4,17.1z"
+ android:fillColor="#3C4043"/>
+ <path
+ android:pathData="M262.1,107.7V100c0,-1.1 -0.9,-1.9 -1.9,-1.9V57.6c0,-5.3 -4.3,-9.6 -9.6,-9.6H162c-5.3,0 -9.6,4.3 -9.6,9.6v184.8c0,5.3 4.3,9.6 9.6,9.6h88.5c5.3,0 9.6,-4.3 9.6,-9.6v-94.3c1.1,0 1.9,-0.9 1.9,-1.9v-19.2c0,-1.1 -0.9,-1.9 -1.9,-1.9v-15.4C261.2,109.6 262.1,108.7 262.1,107.7zM258.2,242.4c0,4.2 -3.5,7.7 -7.7,7.7H162c-4.2,0 -7.7,-3.5 -7.7,-7.7V57.6c0,-4.2 3.5,-7.7 7.7,-7.7h88.5c4.2,0 7.7,3.5 7.7,7.7V242.4z"
+ android:fillColor="#80868B"/>
+ <path
+ android:pathData="M250.5,118.9c2,0 3.7,1.7 3.7,3.7v54.8c0,2 -1.7,3.7 -3.7,3.7H162c-2,0 -3.7,-1.7 -3.7,-3.7v-54.8c0,-2 1.7,-3.7 3.7,-3.7H250.5M250.5,114.9H162c-4.2,0 -7.7,3.5 -7.7,7.7v54.8c0,4.2 3.5,7.7 7.7,7.7h88.5c4.2,0 7.7,-3.5 7.7,-7.7v-54.8C258.2,118.4 254.8,114.9 250.5,114.9L250.5,114.9z"
+ android:fillColor="#FCC934"/>
+ <path
+ android:pathData="M236.9,125.6l11,0l0,11"
+ android:strokeLineJoin="round"
+ android:strokeWidth="4"
+ android:fillColor="#00000000"
+ android:strokeColor="#FCC934"
+ android:strokeLineCap="round"/>
+ <path
+ android:pathData="M247.9,125.6L232.3,141.2"
+ android:strokeLineJoin="round"
+ android:strokeWidth="4"
+ android:fillColor="#00000000"
+ android:strokeColor="#FCC934"
+ android:strokeLineCap="round"/>
+ <path
+ android:pathData="M175.2,175.1l-10.9,0l0,-11"
+ android:strokeLineJoin="round"
+ android:strokeWidth="4"
+ android:fillColor="#00000000"
+ android:strokeColor="#FCC934"
+ android:strokeLineCap="round"/>
+ <path
+ android:pathData="M164.3,175.1L179.9,159.5"
+ android:strokeLineJoin="round"
+ android:strokeWidth="4"
+ android:fillColor="#00000000"
+ android:strokeColor="#FCC934"
+ android:strokeLineCap="round"/>
+</vector>
diff --git a/res/drawable-night/illustration_accessibility_gesture_three_finger.xml b/res/drawable-night/illustration_accessibility_gesture_three_finger.xml
new file mode 100644
index 0000000..593c3af
--- /dev/null
+++ b/res/drawable-night/illustration_accessibility_gesture_three_finger.xml
@@ -0,0 +1,71 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2021 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"
+ xmlns:aapt="http://schemas.android.com/aapt"
+ android:width="412dp"
+ android:height="300dp"
+ android:viewportWidth="412"
+ android:viewportHeight="300">
+ <path
+ android:fillColor="#FF000000"
+ android:pathData="M384.2,300H27.8C12.5,300 0,287.2 0,271.5v-243C0,12.8 12.5,0 27.8,0h356.5C399.5,0 412,12.8 412,28.5v243.2C412,287.2 399.5,300 384.2,300z"/>
+ <path
+ android:pathData="M274.9,97.7v-9.5c0,-1.3 -1.1,-2.4 -2.4,-2.4V35.9c0,-6.6 -5.3,-11.9 -11.9,-11.9H151.3c-6.6,0 -11.9,5.3 -11.9,11.9v228.2c0,6.6 5.3,11.9 11.9,11.9h109.4c6.6,0 11.9,-5.3 11.9,-11.9V147.6c1.3,0 2.4,-1.1 2.4,-2.4v-23.8c0,-1.3 -1.1,-2.4 -2.4,-2.4v-19C273.9,100.1 274.9,99 274.9,97.7zM270.2,264.1c0,5.2 -4.3,9.5 -9.5,9.5H151.3c-5.2,0 -9.5,-4.3 -9.5,-9.5V35.9c0,-5.2 4.3,-9.5 9.5,-9.5h109.4c5.2,0 9.5,4.3 9.5,9.5V264.1z"
+ android:fillColor="#80868B"/>
+ <path
+ android:pathData="M176.7,209.6c-3.7,0 -6.6,3 -6.6,6.6v24.6h13.3v-24.6C183.4,212.6 180.4,209.6 176.7,209.6z">
+ <aapt:attr name="android:fillColor">
+ <gradient
+ android:startY="240.8954"
+ android:startX="176.75"
+ android:endY="209.6335"
+ android:endX="176.75"
+ android:type="linear">
+ <item android:offset="0" android:color="#00669DF6"/>
+ <item android:offset="0.695" android:color="#FF669DF6"/>
+ </gradient>
+ </aapt:attr>
+ </path>
+ <path
+ android:pathData="M206,209.6c-3.7,0 -6.6,3 -6.6,6.6v24.6h13.3v-24.6C212.6,212.6 209.7,209.6 206,209.6z">
+ <aapt:attr name="android:fillColor">
+ <gradient
+ android:startY="240.8954"
+ android:startX="206.05"
+ android:endY="209.6335"
+ android:endX="206.05"
+ android:type="linear">
+ <item android:offset="0" android:color="#00669DF6"/>
+ <item android:offset="0.695" android:color="#FF669DF6"/>
+ </gradient>
+ </aapt:attr>
+ </path>
+ <path
+ android:pathData="M235.3,209.6c-3.7,0 -6.6,3 -6.6,6.6v24.6H242v-24.6C241.9,212.6 239,209.6 235.3,209.6z">
+ <aapt:attr name="android:fillColor">
+ <gradient
+ android:startY="240.8954"
+ android:startX="235.35"
+ android:endY="209.6335"
+ android:endX="235.35"
+ android:type="linear">
+ <item android:offset="0" android:color="#00669DF6"/>
+ <item android:offset="0.695" android:color="#FF669DF6"/>
+ </gradient>
+ </aapt:attr>
+ </path>
+</vector>
diff --git a/res/drawable-night/illustration_accessibility_gesture_two_finger.xml b/res/drawable-night/illustration_accessibility_gesture_two_finger.xml
new file mode 100644
index 0000000..c95523b
--- /dev/null
+++ b/res/drawable-night/illustration_accessibility_gesture_two_finger.xml
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2021 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"
+ xmlns:aapt="http://schemas.android.com/aapt"
+ android:width="412dp"
+ android:height="300dp"
+ android:viewportWidth="412"
+ android:viewportHeight="300">
+ <path
+ android:fillColor="#FF000000"
+ android:pathData="M384.2,300H27.8C12.5,300 0,287.2 0,271.5v-243C0,12.8 12.5,0 27.8,0h356.5C399.5,0 412,12.8 412,28.5v243.2C412,287.2 399.5,300 384.2,300z"/>
+ <path
+ android:pathData="M274.9,97.7v-9.5c0,-1.3 -1.1,-2.4 -2.4,-2.4V35.9c0,-6.6 -5.3,-11.9 -11.9,-11.9H151.3c-6.6,0 -11.9,5.3 -11.9,11.9v228.2c0,6.6 5.3,11.9 11.9,11.9h109.4c6.6,0 11.9,-5.3 11.9,-11.9V147.6c1.3,0 2.4,-1.1 2.4,-2.4v-23.8c0,-1.3 -1.1,-2.4 -2.4,-2.4v-19C273.9,100.1 274.9,99 274.9,97.7zM270.2,264.1c0,5.2 -4.3,9.5 -9.5,9.5H151.3c-5.2,0 -9.5,-4.3 -9.5,-9.5V35.9c0,-5.2 4.3,-9.5 9.5,-9.5h109.4c5.2,0 9.5,4.3 9.5,9.5V264.1z"
+ android:fillColor="#80868B"/>
+ <path
+ android:pathData="M188.6,209.6c-3.7,0 -6.6,3 -6.6,6.6v24.6h13.3v-24.6C195.3,212.6 192.3,209.6 188.6,209.6z">
+ <aapt:attr name="android:fillColor">
+ <gradient
+ android:startY="240.8954"
+ android:startX="188.65"
+ android:endY="209.6335"
+ android:endX="188.65"
+ android:type="linear">
+ <item android:offset="0" android:color="#00669DF6"/>
+ <item android:offset="0.695" android:color="#FF669DF6"/>
+ </gradient>
+ </aapt:attr>
+ </path>
+ <path
+ android:pathData="M223.4,209.6c-3.7,0 -6.6,3 -6.6,6.6v24.6H230v-24.6C230,212.6 227.1,209.6 223.4,209.6z">
+ <aapt:attr name="android:fillColor">
+ <gradient
+ android:startY="240.8954"
+ android:startX="223.4"
+ android:endY="209.6335"
+ android:endX="223.4"
+ android:type="linear">
+ <item android:offset="0" android:color="#00669DF6"/>
+ <item android:offset="0.695" android:color="#FF669DF6"/>
+ </gradient>
+ </aapt:attr>
+ </path>
+</vector>
diff --git a/res/drawable/accessibility_button_navigation.xml b/res/drawable/accessibility_button_navigation.xml
index 82e3c70..8fdb627 100644
--- a/res/drawable/accessibility_button_navigation.xml
+++ b/res/drawable/accessibility_button_navigation.xml
@@ -15,53 +15,29 @@
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="125dp"
- android:height="153dp"
- android:viewportWidth="125"
- android:viewportHeight="153">
- <group>
- <clip-path
- android:pathData="M0,0h125v153h-125z"/>
- <path
- android:pathData="M7.4,-62.9L117.6,-62.9A6.3,6.3 0,0 1,123.9 -56.6L123.9,145.6A6.3,6.3 0,0 1,117.6 151.9L7.4,151.9A6.3,6.3 0,0 1,1.1 145.6L1.1,-56.6A6.3,6.3 0,0 1,7.4 -62.9z"
- android:strokeWidth="1.8"
- android:fillColor="#DADCE0"
- android:strokeColor="#BDC1C6"/>
- <group>
- <clip-path
- android:pathData="M7.4,-62.9L116.6,-62.9A6.3,6.3 0,0 1,122.9 -56.6L122.9,145.6A6.3,6.3 0,0 1,116.6 151.9L7.4,151.9A6.3,6.3 0,0 1,1.1 145.6L1.1,-56.6A6.3,6.3 0,0 1,7.4 -62.9z"/>
- <path
- android:pathData="M12.4,-61L112.6,-61A5.4,5.4 0,0 1,118 -55.6L118,140.6A5.4,5.4 0,0 1,112.6 146L12.4,146A5.4,5.4 0,0 1,7 140.6L7,-55.6A5.4,5.4 0,0 1,12.4 -61z"
- android:fillColor="#F8F9FA"/>
- <group>
- <clip-path
- android:pathData="M12.4,-61L112.6,-61A5.4,5.4 0,0 1,118 -55.6L118,140.6A5.4,5.4 0,0 1,112.6 146L12.4,146A5.4,5.4 0,0 1,7 140.6L7,-55.6A5.4,5.4 0,0 1,12.4 -61z"/>
- </group>
- </group>
- <path
- android:pathData="M7,126H118V140.6C118,143.582 115.582,146 112.6,146H12.4C9.418,146 7,143.582 7,140.6V126Z"
- android:fillColor="#000000"
- android:fillAlpha="0.87"/>
- <path
- android:strokeWidth="1"
- android:pathData="M63.5,138.688C64.713,138.688 65.697,137.708 65.697,136.5C65.697,135.292 64.713,134.312 63.5,134.312C62.286,134.312 61.303,135.292 61.303,136.5C61.303,137.708 62.286,138.688 63.5,138.688Z"
- android:fillColor="#00000000"
- android:fillType="evenOdd"
- android:strokeColor="#9AA0A6"/>
- <path
- android:strokeWidth="1"
- android:pathData="M33.694,133.953C33.827,133.876 33.994,133.972 33.994,134.126V138.874C33.994,139.028 33.827,139.125 33.694,139.047L29.604,136.673C29.471,136.596 29.471,136.404 29.604,136.327L33.694,133.953Z"
- android:fillColor="#00000000"
- android:fillType="evenOdd"
- android:strokeColor="#9AA0A6"/>
- <path
- android:pathData="M96.111,131.2C96.111,131.86 95.611,132.4 95,132.4C94.389,132.4 93.889,131.86 93.889,131.2C93.889,130.54 94.389,130 95,130C95.611,130 96.111,130.54 96.111,131.2ZM95,133C96.572,133 98.272,132.82 99.722,132.4L100,133.6C98.967,133.9 97.778,134.098 96.667,134.2V142H95.556V138.4H94.444V142H93.333V134.2C92.222,134.098 91.033,133.9 90,133.6L90.278,132.4C91.728,132.82 93.428,133 95,133Z"
- android:fillColor="#ffffff"
- android:fillType="evenOdd"/>
- <path
- android:pathData="M94.5,135.5m-15.5,0a15.5,15.5 0,1 1,31 0a15.5,15.5 0,1 1,-31 0"
- android:strokeWidth="4"
- android:fillColor="#00000000"
- android:strokeColor="#4285F4"/>
- </group>
+ 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.5v-243C0,12.8 12.5,0 27.8,0h356.5C399.5,0 412,12.8 412,28.5v243.2C412,287.2 399.5,300 384.2,300z"
+ android:fillColor="#FFFFFF"/>
+ <path
+ android:fillColor="#FF000000"
+ android:pathData="M325.2,231.9c0,9.8 -7.9,17.7 -17.7,17.7H103.9c-9.8,0 -17.7,-7.9 -17.7,-17.7v-42.2h239V231.9z"/>
+ <path
+ android:pathData="M269.7,205.2c1.5,0 2.7,1.2 2.7,2.7s-1.2,2.7 -2.7,2.7c-1.5,0 -2.7,-1.2 -2.7,-2.7S268.2,205.2 269.7,205.2zM273.8,214.7v17.6H271v-8.1h-2.7v8.1h-2.7v-17.6c-2.7,-0.2 -5.6,-0.7 -8.1,-1.4l0.7,-2.7c3.5,0.9 7.7,1.4 11.5,1.4c3.8,0 8,-0.4 11.5,-1.4l0.7,2.7C279.4,214 276.5,214.5 273.8,214.7z"
+ android:fillColor="#FFFFFF"/>
+ <path
+ android:pathData="M205.7,219.7m-9.4,0a9.4,9.4 0,1 1,18.8 0a9.4,9.4 0,1 1,-18.8 0"
+ android:fillColor="#BDC0C4"/>
+ <path
+ android:pathData="M132.1,219.7l16,9.2l0,-18.5z"
+ android:fillColor="#BDC0C4"/>
+ <path
+ android:pathData="M325.4,231.9c0,9.8 -7.9,17.7 -17.7,17.7H103.9c-9.8,0 -17.7,-7.9 -17.7,-17.7V0h-4.4v231.9c0,12.2 9.9,22.2 22.1,22.2h203.8c12.2,0 22.1,-9.9 22.1,-22.2V14.8c2.4,0 4.4,-2 4.4,-4.4V0h-8.9V231.9z"
+ android:fillColor="#DADCE0"/>
+ <path
+ android:pathData="M269.7,255.3c-19.6,0 -35.6,-16 -35.6,-35.6s16,-35.6 35.6,-35.6s35.6,16 35.6,35.6S289.3,255.3 269.7,255.3zM269.7,187.1c-17.9,0 -32.5,14.6 -32.5,32.5c0,17.9 14.6,32.5 32.5,32.5s32.5,-14.6 32.5,-32.5C302.2,201.7 287.6,187.1 269.7,187.1z"
+ android:fillColor="#3773DF"/>
</vector>
diff --git a/res/drawable/accessibility_button_preview_base.xml b/res/drawable/accessibility_button_preview_base.xml
index 9e3ec59..b75b1a8 100644
--- a/res/drawable/accessibility_button_preview_base.xml
+++ b/res/drawable/accessibility_button_preview_base.xml
@@ -15,28 +15,14 @@
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="125dp"
- android:height="153dp"
- android:viewportWidth="125"
- android:viewportHeight="153">
- <group>
- <clip-path
- android:pathData="M0,0h125v153h-125z"/>
- <path
- android:pathData="M7.4,-62.9L117.6,-62.9A6.3,6.3 0,0 1,123.9 -56.6L123.9,145.6A6.3,6.3 0,0 1,117.6 151.9L7.4,151.9A6.3,6.3 0,0 1,1.1 145.6L1.1,-56.6A6.3,6.3 0,0 1,7.4 -62.9z"
- android:strokeWidth="1.8"
- android:fillColor="#DADCE0"
- android:strokeColor="#BDC1C6"/>
- <group>
- <clip-path
- android:pathData="M7.4,-62.9L116.6,-62.9A6.3,6.3 0,0 1,122.9 -56.6L122.9,145.6A6.3,6.3 0,0 1,116.6 151.9L7.4,151.9A6.3,6.3 0,0 1,1.1 145.6L1.1,-56.6A6.3,6.3 0,0 1,7.4 -62.9z"/>
- <path
- android:pathData="M12.4,-61L112.6,-61A5.4,5.4 0,0 1,118 -55.6L118,140.6A5.4,5.4 0,0 1,112.6 146L12.4,146A5.4,5.4 0,0 1,7 140.6L7,-55.6A5.4,5.4 0,0 1,12.4 -61z"
- android:fillColor="#F8F9FA"/>
- <group>
- <clip-path
- android:pathData="M12.4,-61L112.6,-61A5.4,5.4 0,0 1,118 -55.6L118,140.6A5.4,5.4 0,0 1,112.6 146L12.4,146A5.4,5.4 0,0 1,7 140.6L7,-55.6A5.4,5.4 0,0 1,12.4 -61z"/>
- </group>
- </group>
- </group>
+ 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.5v-243C0,12.8 12.5,0 27.8,0h356.5C399.5,0 412,12.8 412,28.5v243.2C412,287.2 399.5,300 384.2,300z"
+ android:fillColor="#FFFFFF"/>
+ <path
+ android:pathData="M325.4,231.9c0,9.8 -7.9,17.7 -17.7,17.7H103.9c-9.8,0 -17.7,-7.9 -17.7,-17.7V0h-4.4v231.9c0,12.2 9.9,22.2 22.1,22.2h203.8c12.2,0 22.1,-9.9 22.1,-22.2V14.8c2.4,0 4.4,-2 4.4,-4.4V0h-8.9L325.4,231.9L325.4,231.9z"
+ android:fillColor="#DADCE0"/>
</vector>
diff --git a/res/drawable/accessibility_button_preview_large_floating_menu.xml b/res/drawable/accessibility_button_preview_large_floating_menu.xml
index e003dc7..794f3ca 100644
--- a/res/drawable/accessibility_button_preview_large_floating_menu.xml
+++ b/res/drawable/accessibility_button_preview_large_floating_menu.xml
@@ -15,27 +15,14 @@
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="125dp"
- android:height="153dp"
- android:viewportWidth="125"
- android:viewportHeight="153">
+ android:width="412dp"
+ android:height="300dp"
+ android:viewportWidth="412"
+ android:viewportHeight="300">
<path
- android:pathData="M0,0h125v153h-125z"
- android:fillColor="#00000000"/>
- <group>
- <clip-path
- android:pathData="M89,95h29v34h-29z"/>
- <path
- android:strokeWidth="1"
- android:pathData="M105,97.5L131,97.5A14.5,14.5 0,0 1,145.5 112L145.5,112A14.5,14.5 0,0 1,131 126.5L105,126.5A14.5,14.5 0,0 1,90.5 112L90.5,112A14.5,14.5 0,0 1,105 97.5z"
- android:fillColor="#ffffff"
- android:strokeColor="#DADCE0"/>
- <path
- android:pathData="M105.4,112m-11.2,0a11.2,11.2 0,1 1,22.4 0a11.2,11.2 0,1 1,-22.4 0"
- android:fillColor="#80868B"/>
- <path
- android:pathData="M106.467,107.733C106.467,108.32 105.987,108.8 105.4,108.8C104.814,108.8 104.334,108.32 104.334,107.733C104.334,107.147 104.814,106.667 105.4,106.667C105.987,106.667 106.467,107.147 106.467,107.733ZM105.4,109.333C106.91,109.333 108.542,109.173 109.934,108.8L110.2,109.867C109.208,110.133 108.067,110.309 107,110.4V117.333H105.934V114.133H104.867V117.333H103.8V110.4C102.734,110.309 101.592,110.133 100.6,109.867L100.867,108.8C102.259,109.173 103.891,109.333 105.4,109.333Z"
- android:fillColor="#ffffff"
- android:fillType="evenOdd"/>
- </group>
-</vector>
\ No newline at end of file
+ android:pathData="M325.4,198.2h-40.9c-22.1,0 -40,-18 -40,-40s18,-40 40,-40h40.9v2.6h-40.9c-20.7,0 -37.5,16.8 -37.5,37.5s16.8,37.5 37.5,37.5h40.9V198.2z"
+ android:fillColor="#DADCE0"/>
+ <path
+ android:pathData="M284.3,128.4c-16.5,0 -29.8,13.4 -29.8,29.8c0,16.5 13.4,29.8 29.8,29.8s29.8,-13.4 29.8,-29.8C314.2,141.7 300.9,128.4 284.3,128.4zM284.3,142.7c1.7,0 3.1,1.4 3.1,3.1c0,1.7 -1.4,3.1 -3.1,3.1s-3.1,-1.4 -3.1,-3.1C281.2,144.1 282.7,142.7 284.3,142.7zM289.1,153.7V174H286v-9.4h-3.1v9.4h-3.2v-20.3c-3.1,-0.3 -6.5,-0.8 -9.4,-1.5l0.8,-3.1c4.1,1 8.9,1.5 13.3,1.5s9.2,-0.5 13.3,-1.5l0.8,3.1C295.6,152.9 292.2,153.4 289.1,153.7z"
+ android:fillColor="#606368"/>
+</vector>
diff --git a/res/drawable/accessibility_button_preview_small_floating_menu.xml b/res/drawable/accessibility_button_preview_small_floating_menu.xml
index 3ff8e4b..670a516 100644
--- a/res/drawable/accessibility_button_preview_small_floating_menu.xml
+++ b/res/drawable/accessibility_button_preview_small_floating_menu.xml
@@ -15,27 +15,14 @@
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="125dp"
- android:height="153dp"
- android:viewportWidth="125"
- android:viewportHeight="153">
+ android:width="412dp"
+ android:height="300dp"
+ android:viewportWidth="412"
+ android:viewportHeight="300">
<path
- android:pathData="M0,0h125v153h-125z"
- android:fillColor="#00000000"/>
- <group>
- <clip-path
- android:pathData="M89,106h29v22h-29z"/>
- <path
- android:strokeWidth="1"
- android:pathData="M111,107.5L137,107.5A9.5,9.5 0,0 1,146.5 117L146.5,117A9.5,9.5 0,0 1,137 126.5L111,126.5A9.5,9.5 0,0 1,101.5 117L101.5,117A9.5,9.5 0,0 1,111 107.5z"
- android:fillColor="#ffffff"
- android:strokeColor="#DADCE0"/>
- <path
- android:pathData="M111.168,116.968m-7.168,0a7.168,7.168 0,1 1,14.336 0a7.168,7.168 0,1 1,-14.336 0"
- android:fillColor="#80868B"/>
- <path
- android:pathData="M111.851,114.237C111.851,114.612 111.543,114.92 111.168,114.92C110.792,114.92 110.485,114.612 110.485,114.237C110.485,113.861 110.792,113.554 111.168,113.554C111.543,113.554 111.851,113.861 111.851,114.237ZM111.168,115.261C112.134,115.261 113.178,115.158 114.069,114.92L114.24,115.602C113.605,115.773 112.875,115.886 112.192,115.944V120.381H111.509V118.333H110.827V120.381H110.144V115.944C109.461,115.886 108.731,115.773 108.096,115.602L108.267,114.92C109.157,115.158 110.202,115.261 111.168,115.261Z"
- android:fillColor="#ffffff"
- android:fillType="evenOdd"/>
- </group>
-</vector>
\ No newline at end of file
+ android:pathData="M325.4,189.2h-31.7c-17.1,0 -31,-13.9 -31,-31s13.9,-31 31,-31h31.7v2h-31.7c-16,0 -29,13 -29,29s13,29 29,29h31.7V189.2z"
+ android:fillColor="#DADCE0"/>
+ <path
+ android:pathData="M293.6,135.1c-12.8,0 -23.1,10.4 -23.1,23.1c0,12.8 10.4,23.1 23.1,23.1s23.1,-10.4 23.1,-23.1C316.7,145.4 306.4,135.1 293.6,135.1zM293.6,146.2c1.3,0 2.4,1.1 2.4,2.4s-1.1,2.4 -2.4,2.4s-2.4,-1.1 -2.4,-2.4S292.3,146.2 293.6,146.2zM297.3,154.7v15.7h-2.4v-7.3h-2.4v7.3H290v-15.7c-2.4,-0.2 -5,-0.6 -7.3,-1.2l0.6,-2.4c3.2,0.8 6.9,1.2 10.3,1.2s7.1,-0.4 10.3,-1.2l0.6,2.4C302.3,154.1 299.7,154.5 297.3,154.7z"
+ android:fillColor="#606368"/>
+</vector>
diff --git a/res/drawable/accessibility_button_preview_three_finger.xml b/res/drawable/accessibility_button_preview_three_finger.xml
new file mode 100644
index 0000000..d18ce60
--- /dev/null
+++ b/res/drawable/accessibility_button_preview_three_finger.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2021 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.5v-243C0,12.8 12.5,0 27.8,0h356.5C399.5,0 412,12.8 412,28.5v243.2C412,287.2 399.5,300 384.2,300z"
+ android:fillColor="#FFFFFF"/>
+ <path
+ android:pathData="M242.5,226.9h-73.3c-1.7,0 -3.1,1.4 -3.1,3.1s1.4,3.1 3.1,3.1h73.3c1.7,0 3.1,-1.4 3.1,-3.1S244.2,226.9 242.5,226.9z"
+ android:fillColor="#DADCE0"/>
+ <path
+ android:pathData="M182.7,222.6v-17.5h7.5l-10.6,-18.7l-10.6,18.7h7.5v17.5c-2.9,1.2 -4.9,4 -4.9,7.4c0,4.4 3.5,8 8,8c4.4,0 8,-3.5 8,-8C187.6,226.7 185.6,223.8 182.7,222.6z"
+ android:fillColor="#1A73E8"/>
+ <path
+ android:pathData="M209,222.6v-17.5h7.5l-10.6,-18.7l-10.6,18.7h7.5v17.5c-2.9,1.2 -4.9,4 -4.9,7.4c0,4.4 3.5,8 8,8c4.4,0 8,-3.5 8,-8C213.9,226.7 211.9,223.8 209,222.6z"
+ android:fillColor="#1A73E8"/>
+ <path
+ android:pathData="M235.2,222.6v-17.5h7.5l-10.6,-18.7l-10.6,18.7h7.5v17.5c-2.9,1.2 -4.9,4 -4.9,7.4c0,4.4 3.5,8 8,8c4.4,0 8,-3.5 8,-8C240,226.7 238,223.8 235.2,222.6z"
+ android:fillColor="#1A73E8"/>
+ <path
+ android:pathData="M325.4,231.9c0,9.8 -7.9,17.7 -17.7,17.7H103.9c-9.8,0 -17.7,-7.9 -17.7,-17.7V0h-4.4v231.9c0,12.2 9.9,22.2 22.1,22.2h203.8c12.2,0 22.1,-9.9 22.1,-22.2V14.8c2.4,0 4.4,-2 4.4,-4.4V0h-8.9V231.9z"
+ android:fillColor="#DADCE0"/>
+</vector>
diff --git a/res/drawable/accessibility_button_preview_two_finger.xml b/res/drawable/accessibility_button_preview_two_finger.xml
new file mode 100644
index 0000000..bec95af
--- /dev/null
+++ b/res/drawable/accessibility_button_preview_two_finger.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2021 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.5v-243C0,12.8 12.5,0 27.8,0h356.5C399.5,0 412,12.8 412,28.5v243.2C412,287.2 399.5,300 384.2,300z"
+ android:fillColor="#FFFFFF"/>
+ <path
+ android:pathData="M325.4,231.9c0,9.8 -7.9,17.7 -17.7,17.7H103.9c-9.8,0 -17.7,-7.9 -17.7,-17.7V0h-4.4v231.9c0,12.2 9.9,22.2 22.1,22.2h203.8c12.2,0 22.1,-9.9 22.1,-22.2V14.8c2.4,0 4.4,-2 4.4,-4.4V0h-8.9V231.9z"
+ android:fillColor="#DADCE0"/>
+ <path
+ android:pathData="M242.4,226.9h-9.3h-5.6h-43.4h-4.7h-10.2c-1.7,0 -3.1,1.4 -3.1,3.1s1.4,3.1 3.1,3.1h10.2h3.9h45h4.8h9.3c1.7,0 3.1,-1.4 3.1,-3.1S244.1,226.9 242.4,226.9z"
+ android:fillColor="#DADCE0"/>
+ <path
+ android:pathData="M194,223.5v-17.5h7.5l-10.6,-18.7l-10.6,18.7h7.5v17.5c-1.6,0.7 -2.9,1.9 -3.8,3.4c-0.7,1.2 -1.1,2.5 -1.1,4c0,0.7 0.1,1.5 0.3,2.2c0.9,3.3 4,5.8 7.7,5.8c3.6,0 6.7,-2.5 7.7,-5.8c0.2,-0.7 0.3,-1.4 0.3,-2.2c0,-1.5 -0.4,-2.8 -1.1,-4C197,225.4 195.6,224.2 194,223.5z"
+ android:fillColor="#1A73E8"/>
+ <path
+ android:pathData="M223.7,223.5v-17.5h7.5l-10.6,-18.7l-10.6,18.7h7.5v17.5c-1.6,0.7 -2.9,1.9 -3.8,3.4c-0.7,1.2 -1.1,2.5 -1.1,4c0,0.7 0.1,1.5 0.3,2.2c0.9,3.3 4,5.8 7.7,5.8c3.6,0 6.7,-2.5 7.7,-5.8c0.2,-0.7 0.3,-1.4 0.3,-2.2c0,-1.5 -0.4,-2.8 -1.1,-4C226.6,225.4 225.3,224.2 223.7,223.5z"
+ android:fillColor="#1A73E8"/>
+</vector>
diff --git a/res/drawable/accessibility_captions.png b/res/drawable/accessibility_captions.png
deleted file mode 100644
index 718f4ef..0000000
--- a/res/drawable/accessibility_captions.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable/accessibility_captions_banner.xml b/res/drawable/accessibility_captions_banner.xml
new file mode 100644
index 0000000..6597ffb
--- /dev/null
+++ b/res/drawable/accessibility_captions_banner.xml
@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2021 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="M383.9,300H28.1C12.6,300 0,287.4 0,271.9V28.1C0,12.6 12.6,0 28.1,0h355.8C399.4,0 412,12.6 412,28.1v243.8C412,287.4 399.4,300 383.9,300z"
+ android:fillColor="#FFFFFF"/>
+ <path
+ android:pathData="M79.2,179.6h53.6v8.5h-53.6z"
+ android:fillColor="#1A73E8"/>
+ <path
+ android:pathData="M142.5,179.6h30.4v8.5h-30.4z"
+ android:fillColor="#1A73E8"/>
+ <path
+ android:pathData="M79.2,195.5h79.2v8.5h-79.2z"
+ android:fillColor="#1A73E8"/>
+ <path
+ android:pathData="M168.1,195.5h34.1v8.5h-34.1z"
+ android:fillColor="#1A73E8"/>
+ <path
+ android:pathData="M211.9,195.5h34.1v8.5h-34.1z"
+ android:fillColor="#1A73E8"/>
+ <path
+ android:pathData="M182.7,179.6h73.1v8.5h-73.1z"
+ android:fillColor="#1A73E8"/>
+ <path
+ android:pathData="M265.5,179.6h26.8v8.5h-26.8z"
+ android:fillColor="#1A73E8"/>
+ <path
+ android:pathData="M302.1,179.6h26.8v8.5h-26.8z"
+ android:fillColor="#1A73E8"/>
+ <path
+ android:pathData="M142.7,67.9h-11.5c-1.6,0 -2.9,1.3 -2.9,2.9H67.8c-7.9,0 -14.4,6.5 -14.4,14.4v132.4c0,7.9 6.5,14.4 14.4,14.4h276.4c7.9,0 14.4,-6.5 14.4,-14.4V85.2c0,-7.9 -6.5,-14.4 -14.4,-14.4H203.1c0,-1.6 -1.3,-2.9 -2.9,-2.9h-28.8c-1.6,0 -2.9,1.3 -2.9,2.9h-23C145.5,69.2 144.3,67.9 142.7,67.9zM344.2,73.7c6.4,0 11.5,5.2 11.5,11.5v132.4c0,6.3 -5.2,11.5 -11.5,11.5H67.8c-6.4,0 -11.5,-5.2 -11.5,-11.5V85.2c0,-6.3 5.2,-11.5 11.5,-11.5H344.2z"
+ android:fillColor="#DADCE0"/>
+</vector>
diff --git a/res/drawable/accessibility_shortcut_type_hardware.png b/res/drawable/accessibility_shortcut_type_hardware.png
deleted file mode 100644
index 664ceb3..0000000
--- a/res/drawable/accessibility_shortcut_type_hardware.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable/accessibility_shortcut_type_hardware.xml b/res/drawable/accessibility_shortcut_type_hardware.xml
new file mode 100644
index 0000000..b6b227b
--- /dev/null
+++ b/res/drawable/accessibility_shortcut_type_hardware.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2021 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.5v-243C0,12.8 12.5,0 27.8,0h356.5C399.5,0 412,12.8 412,28.5v243.2C412,287.2 399.5,300 384.2,300z"
+ android:fillColor="#FFFFFF"/>
+ <path
+ android:pathData="M287,187.8v-1.5h2.9v-13.7c0,-1.6 -1.3,-2.9 -2.9,-2.9v-23.2c1.6,0 2.9,-1.3 2.9,-2.9V132c0,-1.6 -1.3,-2.9 -2.9,-2.9V68.4c0,-8 -6.5,-14.5 -14.5,-14.5H139.4c-8,0 -14.5,6.5 -14.5,14.5v185.3c1,0.7 1.9,1.4 2.9,2.1V68.4c0,-6.4 5.2,-11.6 11.6,-11.6h133.1c6.4,0 11.6,5.2 11.6,11.6v188.7c1,-0.7 1.9,-1.4 2.9,-2.2v-50.5c1.6,0 2.9,-1.3 2.9,-2.9v-13.7L287,187.8L287,187.8z"
+ android:fillColor="#DADCE0"/>
+ <path
+ android:pathData="M287,204.4c1.6,0 2.9,-1.3 2.9,-2.9v-14H287v-0.9h2.9v-14c0,-1.6 -1.3,-2.9 -2.9,-2.9"
+ android:fillColor="#1A73E8"/>
+ <path
+ android:pathData="M206.7,19.1c35,0 67.9,13.6 92.6,38.4C324,82.1 337.6,115 337.6,150s-13.6,67.9 -38.4,92.6c-24.7,24.7 -57.6,38.4 -92.6,38.4s-67.9,-13.6 -92.6,-38.4C89.4,217.9 75.7,185 75.7,150s13.6,-67.9 38.4,-92.6C138.9,32.7 171.7,19.1 206.7,19.1M206.7,17.1c-73.4,0 -133,59.5 -133,132.9s59.5,132.9 132.9,132.9s133,-59.5 133,-132.9S280.1,17.1 206.7,17.1L206.7,17.1z"
+ android:fillColor="#E8EAED"/>
+</vector>
diff --git a/res/drawable/accessibility_shortcut_type_software.png b/res/drawable/accessibility_shortcut_type_software.png
deleted file mode 100644
index 0212548..0000000
--- a/res/drawable/accessibility_shortcut_type_software.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable/accessibility_shortcut_type_software.xml b/res/drawable/accessibility_shortcut_type_software.xml
new file mode 100644
index 0000000..d0573aa
--- /dev/null
+++ b/res/drawable/accessibility_shortcut_type_software.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2021 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="#fff"/>
+ <path
+ android:pathData="M142,225.3H275.1a14.51,14.51 0,0 0,14.5 -14.5V69a2.9,2.9 0,0 0,2.9 -2.9v-17c-1.9,-1.6 -3.8,-3.2 -5.8,-4.7V210.8a11.61,11.61 0,0 1,-11.6 11.6H142a11.61,11.61 0,0 1,-11.6 -11.6V42.7c-1,0.7 -1.9,1.4 -2.9,2.1V210.9A14.62,14.62 0,0 0,142 225.3Z"
+ android:fillColor="#dadce0"/>
+ <path
+ android:pathData="M207.4,19.1a131.11,131.11 0,0 1,131 131,131 131,0 0,1 -262,-0.1 130.94,130.94 0,0 1,131 -130.9m0,-2A132.9,132.9 0,1 0,340.3 150,133 133,0 0,0 207.4,17.1Z"
+ android:fillColor="#e8eaed"/>
+ <path
+ android:fillColor="#FF000000"
+ android:pathData="M286.7,210.83a11.59,11.59 0,0 1,-11.58 11.58H142a11.59,11.59 0,0 1,-11.58 -11.58V183.26H286.7Z"/>
+ <path
+ android:pathData="M250.41,193.38a1.77,1.77 0,1 1,-1.78 1.77A1.77,1.77 0,0 1,250.41 193.38ZM253.07,199.58v11.53h-1.78v-5.32h-1.77v5.32h-1.77L247.75,199.58a30.78,30.78 0,0 1,-5.32 -0.89l0.44,-1.77a32.34,32.34 0,0 0,15.07 0l0.45,1.77A30.78,30.78 0,0 1,253.07 199.58Z"
+ android:fillColor="#fff"/>
+ <path
+ android:pathData="M208.55,202.84m-6.13,0a6.13,6.13 0,1 1,12.26 0a6.13,6.13 0,1 1,-12.26 0"
+ android:fillColor="#bdc1c6"/>
+ <path
+ android:pathData="M250.41,202.84m-22.28,0a22.28,22.28 0,1 1,44.56 0a22.28,22.28 0,1 1,-44.56 0"
+ android:strokeWidth="2"
+ android:fillColor="#00000000"
+ android:strokeColor="#1a73e8"/>
+ <path
+ android:pathData="M160.45,202.84l10.43,6.02l0,-12.05l-10.43,6.03z"
+ android:fillColor="#bdc1c6"/>
+</vector>
diff --git a/res/drawable/accessibility_shortcut_type_software_floating.xml b/res/drawable/accessibility_shortcut_type_software_floating.xml
index 9582015..88ce42d 100644
--- a/res/drawable/accessibility_shortcut_type_software_floating.xml
+++ b/res/drawable/accessibility_shortcut_type_software_floating.xml
@@ -15,54 +15,25 @@
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="180dp"
- android:height="180dp"
- android:viewportWidth="180"
- android:viewportHeight="180">
+ android:width="412dp"
+ android:height="300dp"
+ android:viewportWidth="412"
+ android:viewportHeight="300">
<path
- android:pathData="M90,90m-89,0a89,89 0,1 1,178 0a89,89 0,1 1,-178 0"
- android:strokeWidth="2"
+ 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="#fff"/>
+ <path
+ android:pathData="M142,225.3H275.1a14.51,14.51 0,0 0,14.5 -14.5V69a2.9,2.9 0,0 0,2.9 -2.9v-17c-1.9,-1.6 -3.8,-3.2 -5.8,-4.7V210.8a11.61,11.61 0,0 1,-11.6 11.6H142a11.61,11.61 0,0 1,-11.6 -11.6V42.7c-1,0.7 -1.9,1.4 -2.9,2.1V210.9A14.62,14.62 0,0 0,142 225.3Z"
+ android:fillColor="#dadce0"/>
+ <path
+ android:strokeWidth="1"
+ android:pathData="M286.7,144.13H266a19.63,19.63 0,1 0,0 39.26H286.7"
android:fillColor="#00000000"
- android:strokeColor="#ECEEEF"/>
- <group>
- <clip-path
- android:pathData="M90,90m-87,0a87,87 0,1 1,174 0a87,87 0,1 1,-174 0"/>
- <path
- android:pathData="M35.4,-70.9L144.6,-70.9A6.3,6.3 0,0 1,150.9 -64.6L150.9,137.6A6.3,6.3 0,0 1,144.6 143.9L35.4,143.9A6.3,6.3 0,0 1,29.1 137.6L29.1,-64.6A6.3,6.3 0,0 1,35.4 -70.9z"
- android:strokeWidth="1.8"
- android:fillColor="#F2F3F4"
- android:strokeColor="#DADCE0"/>
- <group>
- <clip-path
- android:pathData="M35.4,-70.9L144.6,-70.9A6.3,6.3 0,0 1,150.9 -64.6L150.9,137.6A6.3,6.3 0,0 1,144.6 143.9L35.4,143.9A6.3,6.3 0,0 1,29.1 137.6L29.1,-64.6A6.3,6.3 0,0 1,35.4 -70.9z"/>
- <path
- android:pathData="M40.4,-69L140.6,-69A5.4,5.4 0,0 1,146 -63.6L146,132.6A5.4,5.4 0,0 1,140.6 138L40.4,138A5.4,5.4 0,0 1,35 132.6L35,-63.6A5.4,5.4 0,0 1,40.4 -69z"
- android:fillColor="#ffffff"/>
- <group>
- <clip-path
- android:pathData="M40.4,-69L140.6,-69A5.4,5.4 0,0 1,146 -63.6L146,132.6A5.4,5.4 0,0 1,140.6 138L40.4,138A5.4,5.4 0,0 1,35 132.6L35,-63.6A5.4,5.4 0,0 1,40.4 -69z"/>
- <path
- android:strokeWidth="1"
- android:pathData="M132,90.5L158,90.5A14.5,14.5 0,0 1,172.5 105L172.5,105A14.5,14.5 0,0 1,158 119.5L132,119.5A14.5,14.5 0,0 1,117.5 105L117.5,105A14.5,14.5 0,0 1,132 90.5z"
- android:fillColor="#ffffff"
- android:strokeColor="#DADCE0"/>
- <path
- android:pathData="M132.4,105m-11.2,0a11.2,11.2 0,1 1,22.4 0a11.2,11.2 0,1 1,-22.4 0"
- android:fillColor="#80868B"/>
- <path
- android:pathData="M133.467,100.733C133.467,101.32 132.987,101.8 132.4,101.8C131.813,101.8 131.333,101.32 131.333,100.733C131.333,100.147 131.813,99.666 132.4,99.666C132.987,99.666 133.467,100.147 133.467,100.733ZM132.4,102.333C133.909,102.333 135.541,102.173 136.933,101.8L137.2,102.867C136.208,103.133 135.067,103.309 134,103.4V110.333H132.933V107.133H131.867V110.333H130.8V103.4C129.733,103.309 128.592,103.133 127.6,102.867L127.867,101.8C129.259,102.173 130.891,102.333 132.4,102.333Z"
- android:fillColor="#ffffff"
- android:fillType="evenOdd"/>
- <path
- android:pathData="M121.719,120.653C121.719,121.29 121.198,121.81 120.562,121.81C119.927,121.81 119.406,121.29 119.406,120.653C119.406,120.017 119.927,119.497 120.562,119.497C121.198,119.497 121.719,120.017 121.719,120.653ZM120.562,122.533C122.38,122.533 124.346,122.316 126.023,121.81L126.344,123.255C125.149,123.617 123.774,123.855 122.49,123.978V133.374H121.205V129.038H119.92V133.374H118.635V123.978C117.351,123.855 115.976,123.617 114.781,123.255L115.102,121.81C116.779,122.316 118.745,122.533 120.562,122.533Z"
- android:fillColor="#ffffff"
- android:fillType="evenOdd"/>
- <group>
- <clip-path
- android:pathData="M121.719,120.653C121.719,121.29 121.198,121.81 120.562,121.81C119.927,121.81 119.406,121.29 119.406,120.653C119.406,120.017 119.927,119.497 120.562,119.497C121.198,119.497 121.719,120.017 121.719,120.653ZM120.562,122.533C122.38,122.533 124.346,122.316 126.023,121.81L126.344,123.255C125.149,123.617 123.774,123.855 122.49,123.978V133.374H121.205V129.038H119.92V133.374H118.635V123.978C117.351,123.855 115.976,123.617 114.781,123.255L115.102,121.81C116.779,122.316 118.745,122.533 120.562,122.533Z"
- android:fillType="evenOdd"/>
- </group>
- </group>
- </group>
- </group>
+ android:strokeColor="#dadce0"/>
+ <path
+ android:pathData="M266,148.65a15.11,15.11 0,1 0,15.1 15.11A15.11,15.11 0,0 0,266 148.65ZM266,155.93a1.59,1.59 0,0 1,0 3.17,1.59 1.59,0 1,1 0,-3.17ZM268.37,161.47v10.29h-1.58L266.79,167h-1.59v4.75h-1.58L263.62,161.47a27.23,27.23 0,0 1,-4.75 -0.79l0.4,-1.58a29.06,29.06 0,0 0,13.46 0l0.39,1.58A27.23,27.23 0,0 1,268.33 161.47Z"
+ android:fillColor="#5f6368"/>
+ <path
+ android:pathData="M207.4,19.1a131.11,131.11 0,0 1,131 131,131 131,0 0,1 -262,-0.1 130.94,130.94 0,0 1,131 -130.9m0,-2A132.9,132.9 0,1 0,340.3 150,133 133,0 0,0 207.4,17.1Z"
+ android:fillColor="#e8eaed"/>
</vector>
diff --git a/res/drawable/accessibility_shortcut_type_software_gesture.png b/res/drawable/accessibility_shortcut_type_software_gesture.png
deleted file mode 100644
index 0a2921a..0000000
--- a/res/drawable/accessibility_shortcut_type_software_gesture.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable/accessibility_shortcut_type_software_gesture.xml b/res/drawable/accessibility_shortcut_type_software_gesture.xml
new file mode 100644
index 0000000..514dd51
--- /dev/null
+++ b/res/drawable/accessibility_shortcut_type_software_gesture.xml
@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2021 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:fillColor="#FF000000"
+ android:pathData="M842.3,299.9H485.9c-15.3,0 -27.8,-12.8 -27.8,-28.5v-243c0,-15.7 12.5,-28.5 27.8,-28.5h356.5c15.2,0 27.7,12.8 27.7,28.5v243.2C870.1,287.1 857.6,299.9 842.3,299.9z"/>
+ <path
+ android:pathData="M597.6,225.2h133.1c8,0 14.5,-6.5 14.5,-14.5V68.9c1.6,0 2.9,-1.3 2.9,-2.9V49c-1.9,-1.6 -3.8,-3.2 -5.8,-4.7v166.4c0,6.4 -5.2,11.6 -11.6,11.6H597.6c-6.4,0 -11.6,-5.2 -11.6,-11.6V42.6c-1,0.7 -1.9,1.4 -2.9,2.1v166.1C583.2,218.7 589.7,225.2 597.6,225.2z"
+ android:fillColor="#80868B"/>
+ <path
+ android:pathData="M688,207.8h-47.8c-1.1,0 -2,0.9 -2,2s0.9,2 2,2H688c1.1,0 2,-0.9 2,-2S689.1,207.8 688,207.8z"
+ android:fillColor="#80868B"/>
+ <path
+ android:pathData="M656.5,205.6v-11.4h4.9l-6.9,-12.2l-6.9,12.2h4.9v11.4c-1.9,0.8 -3.2,2.6 -3.2,4.8c0,2.9 2.3,5.2 5.2,5.2c2.9,0 5.2,-2.3 5.2,-5.2C659.7,208.3 658.3,206.4 656.5,205.6z"
+ android:fillColor="#669DF6"/>
+ <path
+ android:pathData="M675.8,205.6v-11.4h4.9l-6.9,-12.2l-6.9,12.2h4.9v11.4c-1.9,0.8 -3.2,2.6 -3.2,4.8c0,2.9 2.3,5.2 5.2,5.2c2.9,0 5.2,-2.3 5.2,-5.2C679,208.3 677.7,206.4 675.8,205.6z"
+ android:fillColor="#669DF6"/>
+ <path
+ android:pathData="M664.2,19c35,0 67.9,13.6 92.6,38.4c24.7,24.7 38.4,57.6 38.4,92.6s-13.6,67.9 -38.4,92.6c-24.7,24.7 -57.6,38.4 -92.6,38.4s-67.9,-13.6 -92.6,-38.4c-24.7,-24.8 -38.4,-57.7 -38.4,-92.7s13.6,-67.9 38.4,-92.6C596.3,32.6 629.2,19 664.2,19M664.2,17c-73.4,0 -133,59.5 -133,132.9s59.5,132.9 132.9,132.9s133,-59.5 133,-132.9S737.6,17 664.2,17L664.2,17z"
+ android:fillColor="#3C4043"/>
+ <path
+ android:pathData="M384.2,300H27.8C12.5,300 0,287.2 0,271.5v-243C0,12.8 12.5,0 27.8,0h356.5C399.5,0 412,12.8 412,28.5v243.2C412,287.2 399.5,300 384.2,300z"
+ android:fillColor="#FFFFFF"/>
+ <path
+ android:pathData="M139.4,225.3h133.1c8,0 14.5,-6.5 14.5,-14.5V69c1.6,0 2.9,-1.3 2.9,-2.9v-17c-1.9,-1.6 -3.8,-3.2 -5.8,-4.7v166.4c0,6.4 -5.2,11.6 -11.6,11.6H139.4c-6.4,0 -11.6,-5.2 -11.6,-11.6V42.7c-1,0.7 -1.9,1.4 -2.9,2.1v166.1C125,218.8 131.5,225.3 139.4,225.3z"
+ android:fillColor="#DADCE0"/>
+ <path
+ android:pathData="M229.9,207.9h-47.8c-1.1,0 -2,0.9 -2,2s0.9,2 2,2h47.8c1.1,0 2,-0.9 2,-2S231,207.9 229.9,207.9z"
+ android:fillColor="#DADCE0"/>
+ <path
+ android:pathData="M198.4,205.7v-11.4h4.9l-6.9,-12.2l-6.9,12.2h4.9v11.4c-1.9,0.8 -3.2,2.6 -3.2,4.8c0,2.9 2.3,5.2 5.2,5.2s5.2,-2.3 5.2,-5.2C201.5,208.4 200.1,206.5 198.4,205.7z"
+ android:fillColor="#1A73E8"/>
+ <path
+ android:pathData="M217.6,205.7v-11.4h4.9l-6.9,-12.2l-6.9,12.2h4.9v11.4c-1.9,0.8 -3.2,2.6 -3.2,4.8c0,2.9 2.3,5.2 5.2,5.2s5.2,-2.3 5.2,-5.2C220.9,208.4 219.5,206.5 217.6,205.7z"
+ android:fillColor="#1A73E8"/>
+ <path
+ android:pathData="M206.1,19.1c35,0 67.9,13.6 92.6,38.4c24.7,24.7 38.4,57.6 38.4,92.6s-13.6,67.9 -38.4,92.6c-24.7,24.7 -57.6,38.4 -92.6,38.4s-67.9,-13.6 -92.6,-38.4S75.1,185 75.1,150s13.6,-67.9 38.4,-92.6C138.2,32.7 171.1,19.1 206.1,19.1M206.1,17.1c-73.4,0 -133,59.5 -133,132.9S132.6,282.9 206,282.9S339,223.4 339,150S279.5,17.1 206.1,17.1L206.1,17.1z"
+ android:fillColor="#E8EAED"/>
+</vector>
diff --git a/res/drawable/accessibility_shortcut_type_software_gesture_talkback.png b/res/drawable/accessibility_shortcut_type_software_gesture_talkback.png
deleted file mode 100644
index 85fec85..0000000
--- a/res/drawable/accessibility_shortcut_type_software_gesture_talkback.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable/accessibility_shortcut_type_software_gesture_talkback.xml b/res/drawable/accessibility_shortcut_type_software_gesture_talkback.xml
new file mode 100644
index 0000000..9388e66
--- /dev/null
+++ b/res/drawable/accessibility_shortcut_type_software_gesture_talkback.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2021 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.5v-243C0,12.8 12.5,0 27.8,0h356.5C399.5,0 412,12.8 412,28.5v243.2C412,287.2 399.5,300 384.2,300z"
+ android:fillColor="#FFFFFF"/>
+ <path
+ android:pathData="M138,225.3h133.1c8,0 14.5,-6.5 14.5,-14.5V69c1.6,0 2.9,-1.3 2.9,-2.9V45.7c-1.9,-1.5 -3.8,-2.9 -5.8,-4.3v169.4c0,6.4 -5.2,11.6 -11.6,11.6H138c-6.4,0 -11.6,-5.2 -11.6,-11.6V43.5c-1,0.7 -1.9,1.5 -2.9,2.2v165C123.5,218.8 130,225.3 138,225.3z"
+ android:fillColor="#DADCE0"/>
+ <path
+ android:pathData="M206,283.9c-73.9,0 -133.9,-60.1 -133.9,-133.9S132.1,16.1 206,16.1c73.9,0 133.9,60.1 133.9,133.9S279.9,283.9 206,283.9zM206,18.1C133.2,18.1 74.1,77.2 74.1,150S133.2,281.9 206,281.9S337.9,222.8 337.9,150S278.8,18.1 206,18.1z"
+ android:fillColor="#E8EAED"/>
+ <path
+ android:pathData="M229.9,207.9h-47.8c-1.1,0 -2,0.9 -2,2s0.9,2 2,2h47.8c1.1,0 2,-0.9 2,-2S231,207.9 229.9,207.9z"
+ android:fillColor="#DADCE0"/>
+ <path
+ android:pathData="M190.9,205.7v-11.4h4.9l-6.9,-12.2l-6.9,12.2h4.9v11.4c-1.9,0.8 -3.2,2.6 -3.2,4.8c0,2.9 2.3,5.2 5.2,5.2c2.9,0 5.2,-2.3 5.2,-5.2C194.1,208.4 192.8,206.5 190.9,205.7z"
+ android:fillColor="#1A73E8"/>
+ <path
+ android:pathData="M208,205.7v-11.4h4.9l-6.9,-12.2l-6.9,12.2h4.9v11.4c-1.9,0.8 -3.2,2.6 -3.2,4.8c0,2.9 2.3,5.2 5.2,5.2c2.9,0 5.2,-2.3 5.2,-5.2C211.2,208.4 209.9,206.5 208,205.7z"
+ android:fillColor="#1A73E8"/>
+ <path
+ android:pathData="M225.1,205.7v-11.4h4.9l-6.9,-12.2l-6.9,12.2h4.9v11.4c-1.9,0.8 -3.2,2.6 -3.2,4.8c0,2.9 2.3,5.2 5.2,5.2c2.9,0 5.2,-2.3 5.2,-5.2C228.2,208.4 226.9,206.5 225.1,205.7z"
+ android:fillColor="#1A73E8"/>
+</vector>
diff --git a/res/drawable/accessibility_shortcut_type_triple_tap.png b/res/drawable/accessibility_shortcut_type_triple_tap.png
deleted file mode 100644
index 6a08d29..0000000
--- a/res/drawable/accessibility_shortcut_type_triple_tap.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable/ic_illustration_fullscreen.xml b/res/drawable/ic_illustration_fullscreen.xml
index fbb62bf..2aca693 100644
--- a/res/drawable/ic_illustration_fullscreen.xml
+++ b/res/drawable/ic_illustration_fullscreen.xml
@@ -14,26 +14,48 @@
limitations under the License.
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="77dp"
- android:height="134dp"
- android:viewportWidth="77"
- android:viewportHeight="134">
+ android:width="412dp"
+ android:height="300dp"
+ android:viewportWidth="412"
+ android:viewportHeight="300">
<path
- android:pathData="M69.6,1.1H7.4C3.921,1.1 1.1,3.921 1.1,7.4V126.6C1.1,130.079 3.921,132.9 7.4,132.9H69.6C73.079,132.9 75.9,130.079 75.9,126.6V7.4C75.9,3.921 73.079,1.1 69.6,1.1Z"
- android:strokeWidth="1.8"
- android:fillColor="#F2F3F4"
- android:strokeColor="#DADCE0"/>
+ android:pathData="M384.2,300H27.8C12.5,300 0,287.2 0,271.5v-243C0,12.8 12.5,0 27.8,0h356.5C399.5,0 412,12.8 412,28.5v243.2C412,287.2 399.5,300 384.2,300z"
+ android:fillColor="#FFFFFF"/>
<path
- android:pathData="M66.642,5H10.358C7.399,5 5,7.418 5,10.4V123.6C5,126.582 7.399,129 10.358,129H66.642C69.601,129 72,126.582 72,123.6V10.4C72,7.418 69.601,5 66.642,5Z"
- android:fillColor="#ffffff"/>
+ android:pathData="M207.4,19.1c35,0 67.9,13.6 92.6,38.4c24.7,24.7 38.4,57.6 38.4,92.6S324.8,218 300,242.7c-24.7,24.7 -57.6,38.4 -92.6,38.4s-67.9,-13.6 -92.6,-38.4C90.1,217.9 76.4,185 76.4,150S90,82.1 114.8,57.4C139.5,32.7 172.4,19.1 207.4,19.1M207.4,17.1c-73.4,0 -133,59.5 -133,132.9s59.5,132.9 132.9,132.9s133,-59.5 133,-132.9S280.8,17.1 207.4,17.1L207.4,17.1z"
+ android:fillColor="#E8EAED"/>
<path
- android:pathData="M66,10H11C10.448,10 10,10.448 10,11V123C10,123.552 10.448,124 11,124H66C66.552,124 67,123.552 67,123V11C67,10.448 66.552,10 66,10ZM11,5C7.686,5 5,7.686 5,11V123C5,126.314 7.686,129 11,129H66C69.314,129 72,126.314 72,123V11C72,7.686 69.314,5 66,5H11Z"
- android:fillColor="#F29900"
- android:fillType="evenOdd"/>
+ android:pathData="M262.1,107.7V100c0,-1.1 -0.9,-1.9 -1.9,-1.9V57.6c0,-5.3 -4.3,-9.6 -9.6,-9.6H162c-5.3,0 -9.6,4.3 -9.6,9.6v184.8c0,5.3 4.3,9.6 9.6,9.6h88.5c5.3,0 9.6,-4.3 9.6,-9.6v-94.3c1.1,0 1.9,-0.9 1.9,-1.9v-19.2c0,-1.1 -0.9,-1.9 -1.9,-1.9v-15.4C261.2,109.6 262.1,108.7 262.1,107.7zM258.2,242.4c0,4.2 -3.5,7.7 -7.7,7.7H162c-4.2,0 -7.7,-3.5 -7.7,-7.7V57.6c0,-4.2 3.5,-7.7 7.7,-7.7h88.5c4.2,0 7.7,3.5 7.7,7.7V242.4z"
+ android:fillColor="#DADCE0"/>
<path
- android:pathData="M49.077,15V19.314H54.612L48,25.958L51.037,29L57.692,22.334V27.921H62V15H49.077Z"
- android:fillColor="#F29900"/>
+ android:pathData="M250.5,53.9c2,0 3.7,1.7 3.7,3.7v184.8c0,2 -1.7,3.7 -3.7,3.7H162c-2,0 -3.7,-1.7 -3.7,-3.7V57.6c0,-2 1.7,-3.7 3.7,-3.7H250.5M250.5,49.9H162c-4.2,0 -7.7,3.5 -7.7,7.7v184.8c0,4.2 3.5,7.7 7.7,7.7h88.5c4.2,0 7.7,-3.5 7.7,-7.7V57.6C258.2,53.4 254.8,49.9 250.5,49.9L250.5,49.9z"
+ android:fillColor="#F9AB00"/>
<path
- android:pathData="M25.963,105L19.308,111.655V106.077H15V119H27.923V114.692H22.366L29,108.037L25.963,105Z"
- android:fillColor="#F29900"/>
+ android:pathData="M236.9,60.6l11,0l0,11"
+ android:strokeLineJoin="round"
+ android:strokeWidth="4"
+ android:fillColor="#00000000"
+ android:strokeColor="#F9AB00"
+ android:strokeLineCap="round"/>
+ <path
+ android:pathData="M247.9,60.6L232.3,76.2"
+ android:strokeLineJoin="round"
+ android:strokeWidth="4"
+ android:fillColor="#00000000"
+ android:strokeColor="#F9AB00"
+ android:strokeLineCap="round"/>
+ <path
+ android:pathData="M175.2,240.1l-10.9,0l0,-11"
+ android:strokeLineJoin="round"
+ android:strokeWidth="4"
+ android:fillColor="#00000000"
+ android:strokeColor="#F9AB00"
+ android:strokeLineCap="round"/>
+ <path
+ android:pathData="M164.3,240.1L179.9,224.5"
+ android:strokeLineJoin="round"
+ android:strokeWidth="4"
+ android:fillColor="#00000000"
+ android:strokeColor="#F9AB00"
+ android:strokeLineCap="round"/>
</vector>
diff --git a/res/drawable/ic_illustration_switch.xml b/res/drawable/ic_illustration_switch.xml
index 9d3990b..bfe533c 100644
--- a/res/drawable/ic_illustration_switch.xml
+++ b/res/drawable/ic_illustration_switch.xml
@@ -14,33 +14,29 @@
limitations under the License.
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="77dp"
- android:height="134dp"
- android:viewportWidth="77"
- android:viewportHeight="134">
+ android:width="412dp"
+ android:height="300dp"
+ android:viewportWidth="412"
+ android:viewportHeight="300">
<path
- android:pathData="M69.6,1.1H7.4C3.921,1.1 1.1,3.921 1.1,7.4V126.6C1.1,130.079 3.921,132.9 7.4,132.9H69.6C73.079,132.9 75.9,130.079 75.9,126.6V7.4C75.9,3.921 73.079,1.1 69.6,1.1Z"
- android:strokeWidth="1.8"
- android:fillColor="#F2F3F4"
- android:strokeColor="#DADCE0"/>
+ android:pathData="M384.2,300H27.8C12.5,300 0,287.2 0,271.5v-243C0,12.8 12.5,0 27.8,0h356.5C399.5,0 412,12.8 412,28.5v243.2C412,287.2 399.5,300 384.2,300z"
+ android:fillColor="#FFFFFF"/>
<path
- android:pathData="M66.642,5H10.358C7.399,5 5,7.418 5,10.4V123.6C5,126.582 7.399,129 10.358,129H66.642C69.601,129 72,126.582 72,123.6V10.4C72,7.418 69.601,5 66.642,5Z"
- android:fillColor="#ffffff"/>
+ android:pathData="M207.4,19.1c35,0 67.9,13.6 92.6,38.4c24.7,24.7 38.4,57.6 38.4,92.6S324.8,218 300,242.7c-24.7,24.7 -57.6,38.4 -92.6,38.4s-67.9,-13.6 -92.6,-38.4C90.1,217.9 76.4,185 76.4,150S90,82.1 114.8,57.4C139.5,32.7 172.4,19.1 207.4,19.1M207.4,17.1c-73.4,0 -133,59.5 -133,132.9s59.5,132.9 132.9,132.9s133,-59.5 133,-132.9S280.8,17.1 207.4,17.1L207.4,17.1z"
+ android:fillColor="#E8EAED"/>
<path
- android:pathData="M63,94H39V118H63V94Z"
- android:fillColor="#000000"
- android:fillAlpha="0.7"/>
+ android:pathData="M262.1,107.7V100c0,-1.1 -0.9,-1.9 -1.9,-1.9V57.6c0,-5.3 -4.3,-9.6 -9.6,-9.6H162c-5.3,0 -9.6,4.3 -9.6,9.6v184.8c0,5.3 4.3,9.6 9.6,9.6h88.5c5.3,0 9.6,-4.3 9.6,-9.6v-94.3c1.1,0 1.9,-0.9 1.9,-1.9V127c0,-1.1 -0.9,-1.9 -1.9,-1.9v-15.4C261.2,109.6 262.1,108.7 262.1,107.7zM258.2,242.4c0,4.2 -3.5,7.7 -7.7,7.7H162c-4.2,0 -7.7,-3.5 -7.7,-7.7V57.6c0,-4.2 3.5,-7.7 7.7,-7.7h88.5c4.2,0 7.7,3.5 7.7,7.7V242.4z"
+ android:fillColor="#DADCE0"/>
<path
- android:pathData="M43,106V114H59V98H51V99.6H57.4V112.4H44.6V106H43Z"
- android:fillColor="#ffffff"/>
+ android:pathData="M250.5,53.9c2,0 3.7,1.7 3.7,3.7v184.8c0,2 -1.7,3.7 -3.7,3.7H162c-2,0 -3.7,-1.7 -3.7,-3.7V57.6c0,-2 1.7,-3.7 3.7,-3.7L250.5,53.9M250.5,49.9H162c-4.2,0 -7.7,3.5 -7.7,7.7v184.8c0,4.2 3.5,7.7 7.7,7.7h88.5c4.2,0 7.7,-3.5 7.7,-7.7V57.6C258.2,53.4 254.8,49.9 250.5,49.9L250.5,49.9z"
+ android:fillColor="#F9AB00"/>
<path
- android:pathData="M49.4,98H43V104.4H49.4V98Z"
- android:fillColor="#ffffff"/>
+ android:pathData="M214.2,223.8v17.5h34.9v-34.9h-17.5v3.5h14v27.9h-27.9v-14H214.2z"
+ android:fillColor="#5F6368"/>
<path
- android:pathData="M55.8,105.2V106.8H52.928L56.56,110.432L55.432,111.56L51.8,107.928V110.8H50.2V105.2H55.8Z"
- android:fillColor="#ffffff"/>
+ android:pathData="M228.2,206.3h-14v14h14V206.3z"
+ android:fillColor="#5F6368"/>
<path
- android:pathData="M66,10H11C10.448,10 10,10.448 10,11V123C10,123.552 10.448,124 11,124H66C66.552,124 67,123.552 67,123V11C67,10.448 66.552,10 66,10ZM11,5C7.686,5 5,7.686 5,11V123C5,126.314 7.686,129 11,129H66C69.314,129 72,126.314 72,123V11C72,7.686 69.314,5 66,5H11Z"
- android:fillColor="#F29900"
- android:fillType="evenOdd"/>
+ android:pathData="M242.2,222.1v3.5h-6.3l7.9,7.9l-2.5,2.5l-7.9,-7.9v6.3h-3.5v-12.2H242.2z"
+ android:fillColor="#5F6368"/>
</vector>
diff --git a/res/drawable/ic_illustration_window.xml b/res/drawable/ic_illustration_window.xml
index 1b87d7d..22513f4 100644
--- a/res/drawable/ic_illustration_window.xml
+++ b/res/drawable/ic_illustration_window.xml
@@ -14,28 +14,48 @@
limitations under the License.
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="77dp"
- android:height="134dp"
- android:viewportWidth="77"
- android:viewportHeight="134">
+ android:width="412dp"
+ android:height="300dp"
+ android:viewportWidth="412"
+ android:viewportHeight="300">
<path
- android:pathData="M69.6,1.1H7.4C3.921,1.1 1.1,3.921 1.1,7.4V126.6C1.1,130.079 3.921,132.9 7.4,132.9H69.6C73.079,132.9 75.9,130.079 75.9,126.6V7.4C75.9,3.921 73.079,1.1 69.6,1.1Z"
- android:strokeWidth="1.8"
- android:fillColor="#F2F3F4"
- android:strokeColor="#DADCE0"/>
+ android:pathData="M384.2,300H27.8C12.5,300 0,287.2 0,271.5v-243C0,12.8 12.5,0 27.8,0h356.5C399.5,0 412,12.8 412,28.5v243.2C412,287.2 399.5,300 384.2,300z"
+ android:fillColor="#FFFFFF"/>
<path
- android:pathData="M66.642,5H10.358C7.399,5 5,7.418 5,10.4V123.6C5,126.582 7.399,129 10.358,129H66.642C69.601,129 72,126.582 72,123.6V10.4C72,7.418 69.601,5 66.642,5Z"
- android:fillColor="#ffffff"/>
+ android:pathData="M207.4,19.1c35,0 67.9,13.6 92.6,38.4c24.7,24.7 38.4,57.6 38.4,92.6S324.8,218 300,242.7c-24.7,24.7 -57.6,38.4 -92.6,38.4s-67.9,-13.6 -92.6,-38.4C90.1,217.9 76.4,185 76.4,150S90,82.1 114.8,57.4C139.5,32.7 172.4,19.1 207.4,19.1M207.4,17.1c-73.4,0 -133,59.5 -133,132.9s59.5,132.9 132.9,132.9s133,-59.5 133,-132.9S280.8,17.1 207.4,17.1L207.4,17.1z"
+ android:fillColor="#E8EAED"/>
<path
- android:pathData="M63,48H14C12.895,48 12,48.895 12,50V85C12,86.105 12.895,87 14,87H63C64.105,87 65,86.105 65,85V50C65,48.895 64.105,48 63,48Z"
- android:strokeLineJoin="bevel"
- android:strokeWidth="5"
+ android:pathData="M262.1,107.7V100c0,-1.1 -0.9,-1.9 -1.9,-1.9V57.6c0,-5.3 -4.3,-9.6 -9.6,-9.6H162c-5.3,0 -9.6,4.3 -9.6,9.6v184.8c0,5.3 4.3,9.6 9.6,9.6h88.5c5.3,0 9.6,-4.3 9.6,-9.6v-94.3c1.1,0 1.9,-0.9 1.9,-1.9v-19.2c0,-1.1 -0.9,-1.9 -1.9,-1.9v-15.4C261.2,109.6 262.1,108.7 262.1,107.7zM258.2,242.4c0,4.2 -3.5,7.7 -7.7,7.7H162c-4.2,0 -7.7,-3.5 -7.7,-7.7V57.6c0,-4.2 3.5,-7.7 7.7,-7.7h88.5c4.2,0 7.7,3.5 7.7,7.7V242.4z"
+ android:fillColor="#DADCE0"/>
+ <path
+ android:pathData="M250.5,118.9c2,0 3.7,1.7 3.7,3.7v54.8c0,2 -1.7,3.7 -3.7,3.7H162c-2,0 -3.7,-1.7 -3.7,-3.7v-54.8c0,-2 1.7,-3.7 3.7,-3.7H250.5M250.5,114.9H162c-4.2,0 -7.7,3.5 -7.7,7.7v54.8c0,4.2 3.5,7.7 7.7,7.7h88.5c4.2,0 7.7,-3.5 7.7,-7.7v-54.8C258.2,118.4 254.8,114.9 250.5,114.9L250.5,114.9z"
+ android:fillColor="#F9AB00"/>
+ <path
+ android:pathData="M236.9,125.6l11,0l0,11"
+ android:strokeLineJoin="round"
+ android:strokeWidth="4"
android:fillColor="#00000000"
- android:strokeColor="#F29900"/>
+ android:strokeColor="#F9AB00"
+ android:strokeLineCap="round"/>
<path
- android:pathData="M46.077,54V58.314H51.612L45,64.958L48.037,68L54.692,61.334V66.921H59V54H46.077Z"
- android:fillColor="#F29900"/>
+ android:pathData="M247.9,125.6L232.3,141.2"
+ android:strokeLineJoin="round"
+ android:strokeWidth="4"
+ android:fillColor="#00000000"
+ android:strokeColor="#F9AB00"
+ android:strokeLineCap="round"/>
<path
- android:pathData="M28.963,67L22.308,73.655V68.077H18V81H30.923V76.692H25.366L32,70.037L28.963,67Z"
- android:fillColor="#F29900"/>
+ android:pathData="M175.2,175.1l-10.9,0l0,-11"
+ android:strokeLineJoin="round"
+ android:strokeWidth="4"
+ android:fillColor="#00000000"
+ android:strokeColor="#F9AB00"
+ android:strokeLineCap="round"/>
+ <path
+ android:pathData="M164.3,175.1L179.9,159.5"
+ android:strokeLineJoin="round"
+ android:strokeWidth="4"
+ android:fillColor="#00000000"
+ android:strokeColor="#F9AB00"
+ android:strokeLineCap="round"/>
</vector>
diff --git a/res/drawable/ic_settings_emergency.xml b/res/drawable/ic_settings_emergency.xml
index 25d4272..d331e3e 100644
--- a/res/drawable/ic_settings_emergency.xml
+++ b/res/drawable/ic_settings_emergency.xml
@@ -19,6 +19,6 @@
android:viewportWidth="24.0"
android:viewportHeight="24.0">
<path
- android:pathData="M9.321,2V7.359L4.68,4.68L2,9.321L6.641,12L2,14.679L4.68,19.32L9.321,16.641V22H14.68V16.641L19.321,19.32L22,14.679L17.359,12L22,9.321L19.321,4.68L14.68,7.359V2H9.321Z"
+ android:pathData="M20.79,9.23l-2,-3.46l-4.79,2.77l0,-5.54l-4,0l0,5.54l-4.79,-2.77l-2,3.46l4.79,2.77l-4.79,2.77l2,3.46l4.79,-2.77l0,5.54l4,0l0,-5.54l4.79,2.77l2,-3.46l-4.79,-2.77z"
android:fillColor="?android:attr/colorPrimary"/>
</vector>
diff --git a/res/drawable/illustration_accessibility_gesture_three_finger.xml b/res/drawable/illustration_accessibility_gesture_three_finger.xml
new file mode 100644
index 0000000..c14d744
--- /dev/null
+++ b/res/drawable/illustration_accessibility_gesture_three_finger.xml
@@ -0,0 +1,71 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2021 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"
+ xmlns:aapt="http://schemas.android.com/aapt"
+ 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.5v-243C0,12.8 12.5,0 27.8,0h356.5C399.5,0 412,12.8 412,28.5v243.2C412,287.2 399.5,300 384.2,300z"
+ android:fillColor="#FFFFFF"/>
+ <path
+ android:pathData="M274.9,97.7v-9.5c0,-1.3 -1.1,-2.4 -2.4,-2.4V35.9c0,-6.6 -5.3,-11.9 -11.9,-11.9H151.3c-6.6,0 -11.9,5.3 -11.9,11.9v228.2c0,6.6 5.3,11.9 11.9,11.9h109.4c6.6,0 11.9,-5.3 11.9,-11.9V147.6c1.3,0 2.4,-1.1 2.4,-2.4v-23.8c0,-1.3 -1.1,-2.4 -2.4,-2.4v-19C273.9,100.1 274.9,99 274.9,97.7zM270.2,264.1c0,5.2 -4.3,9.5 -9.5,9.5H151.3c-5.2,0 -9.5,-4.3 -9.5,-9.5V35.9c0,-5.2 4.3,-9.5 9.5,-9.5h109.4c5.2,0 9.5,4.3 9.5,9.5V264.1z"
+ android:fillColor="#DADCE0"/>
+ <path
+ android:pathData="M176.7,209.6c-3.7,0 -6.6,3 -6.6,6.6v24.6h13.3v-24.6C183.4,212.6 180.4,209.6 176.7,209.6z">
+ <aapt:attr name="android:fillColor">
+ <gradient
+ android:startY="240.8954"
+ android:startX="176.7163"
+ android:endY="209.6335"
+ android:endX="176.7163"
+ android:type="linear">
+ <item android:offset="0" android:color="#00669DF6"/>
+ <item android:offset="0.695" android:color="#FF669DF6"/>
+ </gradient>
+ </aapt:attr>
+ </path>
+ <path
+ android:pathData="M206,209.6c-3.7,0 -6.6,3 -6.6,6.6v24.6h13.3v-24.6C212.6,212.6 209.7,209.6 206,209.6z">
+ <aapt:attr name="android:fillColor">
+ <gradient
+ android:startY="240.8954"
+ android:startX="206"
+ android:endY="209.6335"
+ android:endX="206"
+ android:type="linear">
+ <item android:offset="0" android:color="#00669DF6"/>
+ <item android:offset="0.695" android:color="#FF669DF6"/>
+ </gradient>
+ </aapt:attr>
+ </path>
+ <path
+ android:pathData="M235.3,209.6c-3.7,0 -6.6,3 -6.6,6.6v24.6h13.3v-24.6C241.9,212.6 239,209.6 235.3,209.6z">
+ <aapt:attr name="android:fillColor">
+ <gradient
+ android:startY="240.8954"
+ android:startX="235.2837"
+ android:endY="209.6335"
+ android:endX="235.2837"
+ android:type="linear">
+ <item android:offset="0" android:color="#00669DF6"/>
+ <item android:offset="0.695" android:color="#FF669DF6"/>
+ </gradient>
+ </aapt:attr>
+ </path>
+</vector>
diff --git a/res/drawable/illustration_accessibility_gesture_two_finger.xml b/res/drawable/illustration_accessibility_gesture_two_finger.xml
new file mode 100644
index 0000000..3ef4fd1
--- /dev/null
+++ b/res/drawable/illustration_accessibility_gesture_two_finger.xml
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2021 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"
+ xmlns:aapt="http://schemas.android.com/aapt"
+ 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.5v-243C0,12.8 12.5,0 27.8,0h356.5C399.5,0 412,12.8 412,28.5v243.2C412,287.2 399.5,300 384.2,300z"
+ android:fillColor="#FFFFFF"/>
+ <path
+ android:pathData="M274.9,97.7v-9.5c0,-1.3 -1.1,-2.4 -2.4,-2.4V35.9c0,-6.6 -5.3,-11.9 -11.9,-11.9H151.3c-6.6,0 -11.9,5.3 -11.9,11.9v228.2c0,6.6 5.3,11.9 11.9,11.9h109.4c6.6,0 11.9,-5.3 11.9,-11.9V147.6c1.3,0 2.4,-1.1 2.4,-2.4v-23.8c0,-1.3 -1.1,-2.4 -2.4,-2.4v-19C273.9,100.1 274.9,99 274.9,97.7zM270.2,264.1c0,5.2 -4.3,9.5 -9.5,9.5H151.3c-5.2,0 -9.5,-4.3 -9.5,-9.5V35.9c0,-5.2 4.3,-9.5 9.5,-9.5h109.4c5.2,0 9.5,4.3 9.5,9.5V264.1z"
+ android:fillColor="#DADCE0"/>
+ <path
+ android:pathData="M188.6,209.6c-3.7,0 -6.6,3 -6.6,6.6v24.6h13.3v-24.6C195.3,212.6 192.3,209.6 188.6,209.6z">
+ <aapt:attr name="android:fillColor">
+ <gradient
+ android:startY="240.8954"
+ android:startX="188.65"
+ android:endY="209.6335"
+ android:endX="188.65"
+ android:type="linear">
+ <item android:offset="0" android:color="#00669DF6"/>
+ <item android:offset="0.695" android:color="#FF669DF6"/>
+ </gradient>
+ </aapt:attr>
+ </path>
+ <path
+ android:pathData="M223.4,209.6c-3.7,0 -6.6,3 -6.6,6.6v24.6H230v-24.6C230,212.6 227.1,209.6 223.4,209.6z">
+ <aapt:attr name="android:fillColor">
+ <gradient
+ android:startY="240.8954"
+ android:startX="223.4"
+ android:endY="209.6335"
+ android:endX="223.4"
+ android:type="linear">
+ <item android:offset="0" android:color="#00669DF6"/>
+ <item android:offset="0.695" android:color="#FF669DF6"/>
+ </gradient>
+ </aapt:attr>
+ </path>
+</vector>
diff --git a/res/layout/accessibility_button_preview.xml b/res/layout/accessibility_button_preview.xml
deleted file mode 100644
index 07cb0ff..0000000
--- a/res/layout/accessibility_button_preview.xml
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2021 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.
--->
-
-<FrameLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:clipToPadding="false"
- android:importantForAccessibility="noHideDescendants">
-
- <ImageView
- android:id="@+id/preview_image"
- android:layout_width="match_parent"
- android:layout_height="@dimen/accessibility_button_preview_height"
- android:layout_gravity="center"
- android:scaleType="fitCenter"
- android:focusable="false"
- android:clickable="false"
- android:adjustViewBounds="true"/>
-</FrameLayout>
\ No newline at end of file
diff --git a/res/layout/accessibility_captions_preview.xml b/res/layout/accessibility_captions_preview.xml
deleted file mode 100644
index 1818e64..0000000
--- a/res/layout/accessibility_captions_preview.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- Copyright (C) 2020 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<FrameLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="wrap_content">
-
- <ImageView
- android:layout_width="match_parent"
- android:layout_height="@dimen/captioning_preview_height"
- android:contentDescription="@null"
- android:scaleType="fitCenter"
- android:src="@drawable/accessibility_captions" />
-
-</FrameLayout>
diff --git a/res/layout/accessibility_edit_shortcut_component.xml b/res/layout/accessibility_edit_shortcut_component.xml
index 0d3324f..d54fff6 100644
--- a/res/layout/accessibility_edit_shortcut_component.xml
+++ b/res/layout/accessibility_edit_shortcut_component.xml
@@ -53,11 +53,9 @@
</LinearLayout>
- <ImageView
- android:id="@+id/image"
- android:layout_width="@dimen/accessibility_imageview_size"
- android:layout_height="@dimen/accessibility_imageview_size"
- android:layout_marginStart="44dp"
- android:scaleType="fitCenter" />
+ <include layout="@layout/accessibility_lottie_animation_view"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginStart="44dp"/>
</LinearLayout>
diff --git a/res/layout/accessibility_lottie_animation_view.xml b/res/layout/accessibility_lottie_animation_view.xml
new file mode 100644
index 0000000..f4638be
--- /dev/null
+++ b/res/layout/accessibility_lottie_animation_view.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2021 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
+ -->
+
+<FrameLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/illustration_frame"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content">
+
+ <ImageView
+ android:id="@+id/image_background"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:maxHeight="@dimen/accessibility_imageview_size"
+ android:src="@drawable/protection_background"
+ android:adjustViewBounds="true"/>
+
+ <com.airbnb.lottie.LottieAnimationView
+ android:id="@+id/image"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:maxHeight="@dimen/accessibility_imageview_size"
+ android:adjustViewBounds="true"/>
+
+</FrameLayout>
diff --git a/res/layout/dialog_single_radio_choice_list_item.xml b/res/layout/dialog_single_radio_choice_list_item.xml
index 49ef352..106a8a5 100644
--- a/res/layout/dialog_single_radio_choice_list_item.xml
+++ b/res/layout/dialog_single_radio_choice_list_item.xml
@@ -55,7 +55,7 @@
<ImageView
android:id="@+id/image"
- android:layout_width="@dimen/accessibility_imageview_size"
+ android:layout_width="match_parent"
android:layout_height="@dimen/accessibility_imageview_size"
android:layout_marginTop="16dp"
android:scaleType="fitStart"
diff --git a/res/layout/face_enroll_introduction.xml b/res/layout/face_enroll_introduction.xml
index c1c9ac6..5e7a6a1 100644
--- a/res/layout/face_enroll_introduction.xml
+++ b/res/layout/face_enroll_introduction.xml
@@ -108,6 +108,29 @@
</LinearLayout>
<LinearLayout
+ android:id="@+id/info_row_less_secure"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal"
+ android:visibility="gone">
+
+ <ImageView
+ android:id="@+id/icon_less_secure"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:background="@drawable/ic_info_outline_24dp"/>
+ <Space
+ android:layout_width="16dp"
+ android:layout_height="wrap_content"/>
+ <TextView
+ android:id="@+id/info_message_less_secure"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ style="@style/BiometricEnrollIntroMessage"
+ android:text="@string/security_settings_face_enroll_introduction_info_less_secure" />
+ </LinearLayout>
+
+ <LinearLayout
android:id="@+id/info_row_require_eyes"
android:layout_width="match_parent"
android:layout_height="wrap_content"
diff --git a/res/layout/panel_layout.xml b/res/layout/panel_layout.xml
index 9e15f15..4258c20 100644
--- a/res/layout/panel_layout.xml
+++ b/res/layout/panel_layout.xml
@@ -18,8 +18,9 @@
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/panel_container"
- android:layout_width="match_parent"
+ android:layout_width="@dimen/settings_panel_width"
android:layout_height="wrap_content"
+ android:layout_gravity="center_horizontal"
android:background="@drawable/settings_panel_rounded_top_corner_background" >
<LinearLayout
diff --git a/res/layout/settings_summary_preference.xml b/res/layout/settings_summary_preference.xml
index c4b6c1c..61f27ca 100644
--- a/res/layout/settings_summary_preference.xml
+++ b/res/layout/settings_summary_preference.xml
@@ -30,7 +30,7 @@
android:layout_marginBottom="5dp"
android:fontFamily="@*android:string/config_headlineFontFamily"
android:paddingTop="0dp"
- android:textColor="?android:attr/colorAccent"
+ android:textColor="?android:attr/textColorPrimary"
android:textAppearance="@*android:style/TextAppearance.DeviceDefault.Display1"
/>
@@ -45,9 +45,9 @@
<ProgressBar
android:id="@+id/color_bar"
style="?android:attr/progressBarStyleHorizontal"
+ android:scaleY="1"
android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:progressDrawable="@drawable/color_bar_progress"/>
+ android:layout_height="wrap_content"/>
<LinearLayout
android:id="@+id/label_bar"
diff --git a/res/layout/tutorial_dialog_launch_by_gesture_navigation_settings.xml b/res/layout/tutorial_dialog_launch_by_gesture_navigation_settings.xml
index 524f7c9..b494e93 100644
--- a/res/layout/tutorial_dialog_launch_by_gesture_navigation_settings.xml
+++ b/res/layout/tutorial_dialog_launch_by_gesture_navigation_settings.xml
@@ -29,11 +29,15 @@
android:orientation="vertical"
android:paddingTop="24dp">
- <TextureView
- android:id="@+id/gesture_tutorial_video"
- android:layout_width="200dp"
- android:layout_height="200dp"
- android:layout_gravity="center_horizontal"/>
+ <ImageView
+ android:id="@+id/image"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:maxHeight="@dimen/accessibility_imageview_size"
+ android:layout_gravity="center_horizontal"
+ android:adjustViewBounds="true"
+ android:paddingLeft="24dp"
+ android:paddingRight="24dp" />
<LinearLayout
android:layout_width="match_parent"
diff --git a/res/layout/tutorial_dialog_launch_service_by_gesture_navigation.xml b/res/layout/tutorial_dialog_launch_service_by_gesture_navigation.xml
index 7c4971f..2557737 100644
--- a/res/layout/tutorial_dialog_launch_service_by_gesture_navigation.xml
+++ b/res/layout/tutorial_dialog_launch_service_by_gesture_navigation.xml
@@ -29,11 +29,15 @@
android:orientation="vertical"
android:paddingTop="24dp">
- <TextureView
- android:id="@+id/gesture_tutorial_video"
- android:layout_width="200dp"
- android:layout_height="200dp"
- android:layout_gravity="center_horizontal"/>
+ <ImageView
+ android:id="@+id/image"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:maxHeight="@dimen/accessibility_imageview_size"
+ android:layout_gravity="center_horizontal"
+ android:adjustViewBounds="true"
+ android:paddingLeft="24dp"
+ android:paddingRight="24dp" />
<LinearLayout
android:layout_width="match_parent"
diff --git a/res/layout/udfps_enroll_find_sensor_layout.xml b/res/layout/udfps_enroll_find_sensor_layout.xml
index 867da19..1b3e0ee 100644
--- a/res/layout/udfps_enroll_find_sensor_layout.xml
+++ b/res/layout/udfps_enroll_find_sensor_layout.xml
@@ -26,7 +26,7 @@
android:id="@+id/illustration_lottie"
android:layout_width="match_parent"
android:layout_height="400dp"
- android:scaleType="fitCenter"
+ android:scaleType="centerInside"
app:lottie_imageAssetsFolder="images"
app:lottie_autoPlay="true"
app:lottie_loop="true"
diff --git a/res/raw/accessibility_shortcut_type_triple_tap.json b/res/raw/accessibility_shortcut_type_triple_tap.json
new file mode 100644
index 0000000..870e671
--- /dev/null
+++ b/res/raw/accessibility_shortcut_type_triple_tap.json
@@ -0,0 +1,1959 @@
+{
+ "v": "5.6.5",
+ "fr": 60,
+ "ip": 0,
+ "op": 180,
+ "w": 412,
+ "h": 300,
+ "nm": "Triple_Tap_Screen",
+ "ddd": 0,
+ "assets": [
+ {
+ "id": "comp_0",
+ "layers": [
+ {
+ "ddd": 0,
+ "ind": 1,
+ "ty": 4,
+ "nm": ".white",
+ "cl": "white",
+ "hd": true,
+ "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
+ },
+ "a": {
+ "a": 0,
+ "k": [
+ 0,
+ 0,
+ 0
+ ],
+ "ix": 1
+ },
+ "s": {
+ "a": 0,
+ "k": [
+ 100,
+ 100,
+ 100
+ ],
+ "ix": 6
+ }
+ },
+ "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": [
+ 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": 0,
+ "op": 1800,
+ "st": 0,
+ "bm": 0
+ }
+ ]
+ }
+ ],
+ "layers": [
+ {
+ "ddd": 0,
+ "ind": 1,
+ "ty": 4,
+ "nm": ".grey200",
+ "cl": "grey200",
+ "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
+ },
+ "a": {
+ "a": 0,
+ "k": [
+ 1.35,
+ 0,
+ 0
+ ],
+ "ix": 1
+ },
+ "s": {
+ "a": 0,
+ "k": [
+ 100,
+ 100,
+ 100
+ ],
+ "ix": 6
+ }
+ },
+ "ao": 0,
+ "shapes": [
+ {
+ "ty": "gr",
+ "it": [
+ {
+ "ind": 0,
+ "ty": "sh",
+ "ix": 1,
+ "ks": {
+ "a": 0,
+ "k": {
+ "i": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ -73.4
+ ],
+ [
+ -73.4,
+ 0
+ ],
+ [
+ 0,
+ 73.4
+ ],
+ [
+ 73.4,
+ 0
+ ]
+ ],
+ "o": [
+ [
+ -73.4,
+ 0
+ ],
+ [
+ 0,
+ 73.4
+ ],
+ [
+ 73.4,
+ 0
+ ],
+ [
+ 0,
+ -73.4
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "v": [
+ [
+ 1.4,
+ -132.9
+ ],
+ [
+ -131.6,
+ 0
+ ],
+ [
+ 1.3,
+ 132.9
+ ],
+ [
+ 134.3,
+ 0
+ ],
+ [
+ 1.4,
+ -132.9
+ ]
+ ],
+ "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
+ ],
+ [
+ -24.7,
+ -24.8
+ ],
+ [
+ 0,
+ -35
+ ],
+ [
+ 24.8,
+ -24.7
+ ],
+ [
+ 35,
+ 0
+ ],
+ [
+ 24.7,
+ 24.8
+ ],
+ [
+ 0,
+ 35
+ ],
+ [
+ -24.8,
+ 24.7
+ ],
+ [
+ -35,
+ 0
+ ]
+ ],
+ "o": [
+ [
+ 35,
+ 0
+ ],
+ [
+ 24.7,
+ 24.7
+ ],
+ [
+ 0,
+ 35
+ ],
+ [
+ -24.7,
+ 24.7
+ ],
+ [
+ -35,
+ 0
+ ],
+ [
+ -24.7,
+ -24.8
+ ],
+ [
+ 0,
+ -35
+ ],
+ [
+ 24.7,
+ -24.7
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "v": [
+ [
+ 1.4,
+ -130.9
+ ],
+ [
+ 94,
+ -92.5
+ ],
+ [
+ 132.4,
+ 0.1
+ ],
+ [
+ 94,
+ 92.7
+ ],
+ [
+ 1.4,
+ 131.1
+ ],
+ [
+ -91.2,
+ 92.7
+ ],
+ [
+ -129.6,
+ 0
+ ],
+ [
+ -91.2,
+ -92.6
+ ],
+ [
+ 1.4,
+ -130.9
+ ]
+ ],
+ "c": false
+ },
+ "ix": 2
+ },
+ "nm": "Path 2",
+ "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": 3,
+ "cix": 2,
+ "bm": 0,
+ "ix": 1,
+ "mn": "ADBE Vector Group",
+ "hd": false
+ }
+ ],
+ "ip": 0,
+ "op": 300,
+ "st": 0,
+ "bm": 0
+ },
+ {
+ "ddd": 0,
+ "ind": 2,
+ "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": [
+ 205,
+ 150,
+ 0
+ ],
+ "ix": 2
+ },
+ "a": {
+ "a": 0,
+ "k": [
+ 0,
+ 0,
+ 0
+ ],
+ "ix": 1
+ },
+ "s": {
+ "a": 0,
+ "k": [
+ 100,
+ 100,
+ 100
+ ],
+ "ix": 6
+ }
+ },
+ "ao": 0,
+ "shapes": [
+ {
+ "ty": "gr",
+ "it": [
+ {
+ "ty": "gr",
+ "it": [
+ {
+ "ind": 0,
+ "ty": "sh",
+ "ix": 1,
+ "ks": {
+ "a": 0,
+ "k": {
+ "i": [
+ [
+ -7.9,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 8
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 1.6
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 2,
+ 1.5
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 6.4,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 6.4
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 1,
+ -0.7
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "o": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 8,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 1.6,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ -1.9,
+ -1.6
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 6.4
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ -6.4,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ -1,
+ 0.7
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 0.1,
+ 7.9
+ ]
+ ],
+ "v": [
+ [
+ -64,
+ 75.3
+ ],
+ [
+ 69.1,
+ 75.3
+ ],
+ [
+ 83.6,
+ 60.8
+ ],
+ [
+ 83.6,
+ -81
+ ],
+ [
+ 86.5,
+ -83.9
+ ],
+ [
+ 86.5,
+ -100.9
+ ],
+ [
+ 80.7,
+ -105.6
+ ],
+ [
+ 80.7,
+ 60.8
+ ],
+ [
+ 69.1,
+ 72.4
+ ],
+ [
+ -64,
+ 72.4
+ ],
+ [
+ -75.6,
+ 60.8
+ ],
+ [
+ -75.6,
+ -107.3
+ ],
+ [
+ -78.5,
+ -105.2
+ ],
+ [
+ -78.5,
+ 60.9
+ ]
+ ],
+ "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": "Group 1",
+ "np": 2,
+ "cix": 2,
+ "bm": 0,
+ "ix": 1,
+ "mn": "ADBE Vector Group",
+ "hd": false
+ },
+ {
+ "ty": "tr",
+ "p": {
+ "a": 0,
+ "k": [
+ 0,
+ 0
+ ],
+ "ix": 2
+ },
+ "a": {
+ "a": 0,
+ "k": [
+ 0,
+ 0
+ ],
+ "ix": 1
+ },
+ "s": {
+ "a": 0,
+ "k": [
+ 100,
+ 100
+ ],
+ "ix": 3
+ },
+ "r": {
+ "a": 0,
+ "k": 0,
+ "ix": 6
+ },
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 7
+ },
+ "sk": {
+ "a": 0,
+ "k": 0,
+ "ix": 4
+ },
+ "sa": {
+ "a": 0,
+ "k": 0,
+ "ix": 5
+ },
+ "nm": "Transform"
+ }
+ ],
+ "nm": "Group 1",
+ "np": 1,
+ "cix": 2,
+ "bm": 0,
+ "ix": 1,
+ "mn": "ADBE Vector Group",
+ "hd": false
+ }
+ ],
+ "ip": 0,
+ "op": 300,
+ "st": 0,
+ "bm": 0
+ },
+ {
+ "ddd": 0,
+ "ind": 3,
+ "ty": 4,
+ "nm": "cursor 5",
+ "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
+ },
+ "a": {
+ "a": 0,
+ "k": [
+ -180.5,
+ -165.5,
+ 0
+ ],
+ "ix": 1
+ },
+ "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
+ }
+ },
+ "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": [
+ 1,
+ 0.182245725744,
+ 0.894323072246,
+ 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": "fl",
+ "c": {
+ "a": 0,
+ "k": [
+ 1,
+ 0.522196631338,
+ 0.9762855081,
+ 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,
+ "bm": 0
+ },
+ {
+ "ddd": 0,
+ "ind": 4,
+ "ty": 4,
+ "nm": "cursor 4",
+ "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
+ },
+ "a": {
+ "a": 0,
+ "k": [
+ -180.5,
+ -165.5,
+ 0
+ ],
+ "ix": 1
+ },
+ "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
+ }
+ },
+ "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": [
+ 1,
+ 0.182245725744,
+ 0.894323072246,
+ 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": "fl",
+ "c": {
+ "a": 0,
+ "k": [
+ 1,
+ 0.522196631338,
+ 0.9762855081,
+ 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,
+ "bm": 0
+ },
+ {
+ "ddd": 0,
+ "ind": 5,
+ "ty": 4,
+ "nm": "cursor",
+ "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
+ },
+ "a": {
+ "a": 0,
+ "k": [
+ -180.5,
+ -165.5,
+ 0
+ ],
+ "ix": 1
+ },
+ "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
+ }
+ },
+ "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": [
+ 1,
+ 0.182245725744,
+ 0.894323072246,
+ 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": "fl",
+ "c": {
+ "a": 0,
+ "k": [
+ 1,
+ 0.522196631338,
+ 0.9762855081,
+ 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,
+ "bm": 0
+ },
+ {
+ "ddd": 0,
+ "ind": 6,
+ "ty": 0,
+ "nm": "BG_White",
+ "refId": "comp_0",
+ "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
+ },
+ "a": {
+ "a": 0,
+ "k": [
+ 206,
+ 150,
+ 0
+ ],
+ "ix": 1
+ },
+ "s": {
+ "a": 0,
+ "k": [
+ 100,
+ 100,
+ 100
+ ],
+ "ix": 6
+ }
+ },
+ "ao": 0,
+ "w": 412,
+ "h": 300,
+ "ip": 0,
+ "op": 1800,
+ "st": 0,
+ "bm": 0
+ }
+ ],
+ "markers": []
+}
\ No newline at end of file
diff --git a/res/raw/illustration_accessibility_gesture_three_finger.mp4 b/res/raw/illustration_accessibility_gesture_three_finger.mp4
deleted file mode 100644
index d48371b..0000000
--- a/res/raw/illustration_accessibility_gesture_three_finger.mp4
+++ /dev/null
Binary files differ
diff --git a/res/raw/illustration_accessibility_gesture_two_finger.mp4 b/res/raw/illustration_accessibility_gesture_two_finger.mp4
deleted file mode 100644
index 7607abc..0000000
--- a/res/raw/illustration_accessibility_gesture_two_finger.mp4
+++ /dev/null
Binary files differ
diff --git a/res/raw/udfps_edu_a11y_lottie.json b/res/raw/udfps_edu_a11y_lottie.json
new file mode 100644
index 0000000..b1ffc9e
--- /dev/null
+++ b/res/raw/udfps_edu_a11y_lottie.json
@@ -0,0 +1,8243 @@
+{
+ "v": "5.7.6",
+ "fr": 60,
+ "ip": 0,
+ "op": 601,
+ "w": 1650,
+ "h": 2900,
+ "nm": "UDFPS_EDU_LOTTIE_A11y_052422",
+ "ddd": 0,
+ "assets": [
+ {
+ "id": "comp_0",
+ "layers": [
+ {
+ "ddd": 0,
+ "ind": 1,
+ "ty": 4,
+ "nm": "Fill 12",
+ "sr": 1,
+ "ks": {
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 11
+ },
+ "r": {
+ "a": 0,
+ "k": 0,
+ "ix": 10
+ },
+ "p": {
+ "a": 0,
+ "k": [
+ 53.488,
+ 54.901,
+ 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
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "o": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "v": [
+ [
+ -16.824,
+ -0.768
+ ],
+ [
+ -4.154,
+ 11.903
+ ],
+ [
+ 16.824,
+ -9.075
+ ],
+ [
+ 13.995,
+ -11.903
+ ],
+ [
+ -4.154,
+ 6.247
+ ],
+ [
+ -13.996,
+ -3.596
+ ]
+ ],
+ "c": true
+ },
+ "ix": 2
+ },
+ "nm": "Path 1",
+ "mn": "ADBE Vector Shape - Group",
+ "hd": false
+ },
+ {
+ "ty": "fl",
+ "c": {
+ "a": 0,
+ "k": [
+ 0.4,
+ 0.61568627451,
+ 0.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": [
+ 0,
+ 0
+ ],
+ "ix": 2
+ },
+ "a": {
+ "a": 0,
+ "k": [
+ 0,
+ 0
+ ],
+ "ix": 1
+ },
+ "s": {
+ "a": 0,
+ "k": [
+ 200,
+ 200
+ ],
+ "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": "Fill 12",
+ "np": 2,
+ "cix": 2,
+ "bm": 0,
+ "ix": 1,
+ "mn": "ADBE Vector Group",
+ "hd": false
+ }
+ ],
+ "ip": 0,
+ "op": 2100,
+ "st": 0,
+ "bm": 0
+ },
+ {
+ "ddd": 0,
+ "ind": 2,
+ "ty": 4,
+ "nm": "Path",
+ "sr": 1,
+ "ks": {
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 11
+ },
+ "r": {
+ "a": 0,
+ "k": 0,
+ "ix": 10
+ },
+ "p": {
+ "a": 0,
+ "k": [
+ 54,
+ 54,
+ 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,
+ 12.703
+ ],
+ [
+ 12.703,
+ 0
+ ],
+ [
+ 0,
+ -12.703
+ ],
+ [
+ -12.703,
+ 0
+ ]
+ ],
+ "o": [
+ [
+ 0,
+ -12.703
+ ],
+ [
+ -12.703,
+ 0
+ ],
+ [
+ 0,
+ 12.703
+ ],
+ [
+ 12.703,
+ 0
+ ]
+ ],
+ "v": [
+ [
+ 23.037,
+ 0
+ ],
+ [
+ 0,
+ -23.038
+ ],
+ [
+ -23.037,
+ 0
+ ],
+ [
+ 0,
+ 23.038
+ ]
+ ],
+ "c": true
+ },
+ "ix": 2
+ },
+ "nm": "Path 1",
+ "mn": "ADBE Vector Shape - Group",
+ "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": [
+ 200,
+ 200
+ ],
+ "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": "Path",
+ "np": 2,
+ "cix": 2,
+ "bm": 0,
+ "ix": 1,
+ "mn": "ADBE Vector Group",
+ "hd": false
+ },
+ {
+ "ty": "st",
+ "c": {
+ "a": 0,
+ "k": [
+ 0.717647058824,
+ 0.949019607843,
+ 0.623529411765,
+ 1
+ ],
+ "ix": 3,
+ "x": "var $bm_rt;\n$bm_rt = thisComp.layer('Fill 12').content('Fill 12').content('Fill 1').color;"
+ },
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 4
+ },
+ "w": {
+ "a": 0,
+ "k": 15,
+ "ix": 5
+ },
+ "lc": 2,
+ "lj": 1,
+ "ml": 4,
+ "bm": 0,
+ "nm": "Stroke 1",
+ "mn": "ADBE Vector Graphic - Stroke",
+ "hd": false
+ }
+ ],
+ "ip": 0,
+ "op": 2100,
+ "st": 0,
+ "bm": 0
+ }
+ ]
+ }
+ ],
+ "layers": [
+ {
+ "ddd": 0,
+ "ind": 1,
+ "ty": 3,
+ "nm": "Null 58",
+ "sr": 1,
+ "ks": {
+ "o": {
+ "a": 0,
+ "k": 0,
+ "ix": 11
+ },
+ "r": {
+ "a": 0,
+ "k": 0,
+ "ix": 10
+ },
+ "p": {
+ "a": 0,
+ "k": [
+ 1334.91,
+ 1644.843,
+ 0
+ ],
+ "ix": 2,
+ "l": 2
+ },
+ "a": {
+ "a": 0,
+ "k": [
+ 0,
+ 0,
+ 0
+ ],
+ "ix": 1,
+ "l": 2
+ },
+ "s": {
+ "a": 0,
+ "k": [
+ 232,
+ 232,
+ 100
+ ],
+ "ix": 6,
+ "l": 2
+ }
+ },
+ "ao": 0,
+ "ip": 327.5,
+ "op": 2802.5,
+ "st": 402.5,
+ "bm": 0
+ },
+ {
+ "ddd": 0,
+ "ind": 2,
+ "ty": 4,
+ "nm": "PHONE_OUTLINE 2",
+ "sr": 1,
+ "ks": {
+ "o": {
+ "a": 1,
+ "k": [
+ {
+ "i": {
+ "x": [
+ 0.833
+ ],
+ "y": [
+ 1
+ ]
+ },
+ "o": {
+ "x": [
+ 0.167
+ ],
+ "y": [
+ 0
+ ]
+ },
+ "t": 571,
+ "s": [
+ 0
+ ]
+ },
+ {
+ "t": 593.5,
+ "s": [
+ 100
+ ]
+ }
+ ],
+ "ix": 11
+ },
+ "r": {
+ "a": 0,
+ "k": 0,
+ "ix": 10
+ },
+ "p": {
+ "a": 0,
+ "k": [
+ 837,
+ 1430,
+ 0
+ ],
+ "ix": 2,
+ "l": 2
+ },
+ "a": {
+ "a": 0,
+ "k": [
+ 0,
+ 0,
+ 0
+ ],
+ "ix": 1,
+ "l": 2
+ },
+ "s": {
+ "a": 0,
+ "k": [
+ 929.1,
+ 929.1,
+ 100
+ ],
+ "ix": 6,
+ "l": 2
+ }
+ },
+ "ao": 0,
+ "shapes": [
+ {
+ "ty": "gr",
+ "it": [
+ {
+ "ind": 0,
+ "ty": "sh",
+ "ix": 1,
+ "ks": {
+ "a": 0,
+ "k": {
+ "i": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 5.243,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 5.244
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ -5.243,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ -5.244
+ ]
+ ],
+ "o": [
+ [
+ 0,
+ 5.244
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ -5.243,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ -5.244
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 5.243,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "v": [
+ [
+ 63.454,
+ 114.112
+ ],
+ [
+ 53.945,
+ 123.622
+ ],
+ [
+ -55.413,
+ 123.622
+ ],
+ [
+ -64.922,
+ 114.112
+ ],
+ [
+ -64.922,
+ -114.112
+ ],
+ [
+ -55.413,
+ -123.622
+ ],
+ [
+ 53.945,
+ -123.622
+ ],
+ [
+ 63.454,
+ -114.112
+ ]
+ ],
+ "c": true
+ },
+ "ix": 2
+ },
+ "nm": "Path 1",
+ "mn": "ADBE Vector Shape - Group",
+ "hd": false
+ },
+ {
+ "ind": 1,
+ "ty": "sh",
+ "ix": 2,
+ "ks": {
+ "a": 0,
+ "k": {
+ "i": [
+ [
+ 0,
+ 1.313
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 1.313,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 6.554,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ -6.555
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ -6.554,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 6.555
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 1.313
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 1.313,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "o": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ -1.313
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ -6.555
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ -6.554,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 6.555
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 6.554,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 1.313,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ -1.313
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 1.313,
+ 0
+ ]
+ ],
+ "v": [
+ [
+ 68.209,
+ -52.302
+ ],
+ [
+ 68.209,
+ -61.811
+ ],
+ [
+ 65.832,
+ -64.188
+ ],
+ [
+ 65.832,
+ -114.112
+ ],
+ [
+ 53.945,
+ -126
+ ],
+ [
+ -55.413,
+ -126
+ ],
+ [
+ -67.3,
+ -114.112
+ ],
+ [
+ -67.3,
+ 114.112
+ ],
+ [
+ -55.413,
+ 126
+ ],
+ [
+ 53.945,
+ 126
+ ],
+ [
+ 65.832,
+ 114.112
+ ],
+ [
+ 65.832,
+ -2.378
+ ],
+ [
+ 68.209,
+ -4.755
+ ],
+ [
+ 68.209,
+ -28.528
+ ],
+ [
+ 65.832,
+ -30.906
+ ],
+ [
+ 65.832,
+ -49.924
+ ]
+ ],
+ "c": true
+ },
+ "ix": 2
+ },
+ "nm": "Path 2",
+ "mn": "ADBE Vector Shape - Group",
+ "hd": false
+ },
+ {
+ "ty": "fl",
+ "c": {
+ "a": 0,
+ "k": [
+ 0.368627458811,
+ 0.368627458811,
+ 0.368627458811,
+ 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": 467.5,
+ "op": 2942.5,
+ "st": 542.5,
+ "bm": 0
+ },
+ {
+ "ddd": 0,
+ "ind": 3,
+ "ty": 0,
+ "nm": "â–½ checkmark",
+ "parent": 1,
+ "refId": "comp_0",
+ "sr": 1,
+ "ks": {
+ "o": {
+ "a": 1,
+ "k": [
+ {
+ "i": {
+ "x": [
+ 0
+ ],
+ "y": [
+ 1
+ ]
+ },
+ "o": {
+ "x": [
+ 0.78
+ ],
+ "y": [
+ 0
+ ]
+ },
+ "t": 472,
+ "s": [
+ 0
+ ]
+ },
+ {
+ "i": {
+ "x": [
+ 0.833
+ ],
+ "y": [
+ 1
+ ]
+ },
+ "o": {
+ "x": [
+ 0.167
+ ],
+ "y": [
+ 0
+ ]
+ },
+ "t": 478,
+ "s": [
+ 100
+ ]
+ },
+ {
+ "i": {
+ "x": [
+ 0
+ ],
+ "y": [
+ 1
+ ]
+ },
+ "o": {
+ "x": [
+ 0.52
+ ],
+ "y": [
+ 0
+ ]
+ },
+ "t": 548,
+ "s": [
+ 100
+ ]
+ },
+ {
+ "t": 555,
+ "s": [
+ 0
+ ]
+ }
+ ],
+ "ix": 11
+ },
+ "r": {
+ "a": 0,
+ "k": 0,
+ "ix": 10
+ },
+ "p": {
+ "a": 0,
+ "k": [
+ 0.507,
+ 0.564,
+ 0
+ ],
+ "ix": 2,
+ "l": 2
+ },
+ "a": {
+ "a": 0,
+ "k": [
+ 54.507,
+ 54.564,
+ 0
+ ],
+ "ix": 1,
+ "l": 2
+ },
+ "s": {
+ "a": 1,
+ "k": [
+ {
+ "i": {
+ "x": [
+ 0,
+ 0,
+ 0.667
+ ],
+ "y": [
+ 1.015,
+ 1.015,
+ 1
+ ]
+ },
+ "o": {
+ "x": [
+ 0.363,
+ 0.363,
+ 0.333
+ ],
+ "y": [
+ 0.038,
+ 0.038,
+ 0
+ ]
+ },
+ "t": 473,
+ "s": [
+ 0,
+ 0,
+ 100
+ ]
+ },
+ {
+ "i": {
+ "x": [
+ 0.474,
+ 0.474,
+ 0.667
+ ],
+ "y": [
+ 1,
+ 1,
+ 1
+ ]
+ },
+ "o": {
+ "x": [
+ 0.651,
+ 0.651,
+ 0.333
+ ],
+ "y": [
+ 0.331,
+ 0.331,
+ 0
+ ]
+ },
+ "t": 493,
+ "s": [
+ 105,
+ 105,
+ 100
+ ]
+ },
+ {
+ "i": {
+ "x": [
+ 0.833,
+ 0.833,
+ 0.833
+ ],
+ "y": [
+ 1,
+ 1,
+ 1
+ ]
+ },
+ "o": {
+ "x": [
+ 0.167,
+ 0.167,
+ 0.167
+ ],
+ "y": [
+ 0,
+ 0,
+ 0
+ ]
+ },
+ "t": 513,
+ "s": [
+ 100,
+ 100,
+ 100
+ ]
+ },
+ {
+ "i": {
+ "x": [
+ 0.833,
+ 0.833,
+ 0.833
+ ],
+ "y": [
+ 1,
+ 1,
+ 1
+ ]
+ },
+ "o": {
+ "x": [
+ 0.167,
+ 0.167,
+ 0.167
+ ],
+ "y": [
+ 0,
+ 0,
+ 0
+ ]
+ },
+ "t": 545,
+ "s": [
+ 100,
+ 100,
+ 100
+ ]
+ },
+ {
+ "t": 555,
+ "s": [
+ 0,
+ 0,
+ 100
+ ]
+ }
+ ],
+ "ix": 6,
+ "l": 2
+ }
+ },
+ "ao": 0,
+ "w": 108,
+ "h": 108,
+ "ip": 327.5,
+ "op": 2427.5,
+ "st": 327.5,
+ "bm": 0
+ },
+ {
+ "ddd": 0,
+ "ind": 4,
+ "ty": 3,
+ "nm": "Null 57 - COLOR CONTROLLER",
+ "sr": 1,
+ "ks": {
+ "o": {
+ "a": 0,
+ "k": 0,
+ "ix": 11
+ },
+ "r": {
+ "a": 0,
+ "k": 0,
+ "ix": 10
+ },
+ "p": {
+ "a": 0,
+ "k": [
+ 837,
+ 774,
+ 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,
+ "ef": [
+ {
+ "ty": 5,
+ "nm": "BLUE400",
+ "np": 3,
+ "mn": "ADBE Color Control",
+ "ix": 1,
+ "en": 1,
+ "ef": [
+ {
+ "ty": 2,
+ "nm": "Color",
+ "mn": "ADBE Color Control-0001",
+ "ix": 1,
+ "v": {
+ "a": 0,
+ "k": [
+ 0.40000000596,
+ 0.615686297417,
+ 0.988235294819,
+ 1
+ ],
+ "ix": 1
+ }
+ }
+ ]
+ }
+ ],
+ "ip": -20,
+ "op": 2455,
+ "st": 55,
+ "bm": 0
+ },
+ {
+ "ddd": 0,
+ "ind": 5,
+ "ty": 3,
+ "nm": "MAIN_MOVEMENT",
+ "sr": 1,
+ "ks": {
+ "o": {
+ "a": 0,
+ "k": 0,
+ "ix": 11
+ },
+ "r": {
+ "a": 0,
+ "k": 0,
+ "ix": 10
+ },
+ "p": {
+ "a": 0,
+ "k": [
+ 837,
+ 2098,
+ 0
+ ],
+ "ix": 2,
+ "l": 2
+ },
+ "a": {
+ "a": 0,
+ "k": [
+ 0,
+ 0,
+ 0
+ ],
+ "ix": 1,
+ "l": 2
+ },
+ "s": {
+ "a": 1,
+ "k": [
+ {
+ "i": {
+ "x": [
+ 0.07,
+ 0.07,
+ 0.07
+ ],
+ "y": [
+ 0.985,
+ 0.985,
+ 1
+ ]
+ },
+ "o": {
+ "x": [
+ 0.64,
+ 0.64,
+ 0.64
+ ],
+ "y": [
+ 0.015,
+ 0.015,
+ 0
+ ]
+ },
+ "t": 90,
+ "s": [
+ 105,
+ 105,
+ 100
+ ]
+ },
+ {
+ "i": {
+ "x": [
+ 0.833,
+ 0.833,
+ 0.833
+ ],
+ "y": [
+ 1,
+ 1,
+ 1
+ ]
+ },
+ "o": {
+ "x": [
+ 0.64,
+ 0.64,
+ 0.64
+ ],
+ "y": [
+ 0,
+ 0,
+ 0
+ ]
+ },
+ "t": 100.035,
+ "s": [
+ 95,
+ 95,
+ 100
+ ]
+ },
+ {
+ "i": {
+ "x": [
+ 0.833,
+ 0.833,
+ 0.833
+ ],
+ "y": [
+ 1,
+ 1,
+ 1
+ ]
+ },
+ "o": {
+ "x": [
+ 0.167,
+ 0.167,
+ 0.167
+ ],
+ "y": [
+ 0,
+ 0,
+ 0
+ ]
+ },
+ "t": 130.133,
+ "s": [
+ 95,
+ 95,
+ 100
+ ]
+ },
+ {
+ "i": {
+ "x": [
+ 0.833,
+ 0.833,
+ 0.833
+ ],
+ "y": [
+ 1,
+ 1,
+ 1.025
+ ]
+ },
+ "o": {
+ "x": [
+ 0.439,
+ 0.439,
+ 0.439
+ ],
+ "y": [
+ 0,
+ 0,
+ 0
+ ]
+ },
+ "t": 135,
+ "s": [
+ 105,
+ 105,
+ 100
+ ]
+ },
+ {
+ "i": {
+ "x": [
+ 0.07,
+ 0.07,
+ 0.07
+ ],
+ "y": [
+ 0.701,
+ 0.701,
+ 1
+ ]
+ },
+ "o": {
+ "x": [
+ 0.64,
+ 0.64,
+ 0.64
+ ],
+ "y": [
+ 0.299,
+ 0.299,
+ 0
+ ]
+ },
+ "t": 145,
+ "s": [
+ 105,
+ 105,
+ 100
+ ]
+ },
+ {
+ "i": {
+ "x": [
+ 0.833,
+ 0.833,
+ 0.833
+ ],
+ "y": [
+ 0.833,
+ 0.833,
+ 0.833
+ ]
+ },
+ "o": {
+ "x": [
+ 0.167,
+ 0.167,
+ 0.167
+ ],
+ "y": [
+ 0.167,
+ 0.167,
+ 0.167
+ ]
+ },
+ "t": 152.5,
+ "s": [
+ 105,
+ 105,
+ 100
+ ]
+ },
+ {
+ "i": {
+ "x": [
+ 0.6,
+ 0.6,
+ 0.6
+ ],
+ "y": [
+ 1,
+ 1,
+ 1
+ ]
+ },
+ "o": {
+ "x": [
+ 0.167,
+ 0.167,
+ 0.167
+ ],
+ "y": [
+ 0.167,
+ 0.167,
+ -0.833
+ ]
+ },
+ "t": 157.5,
+ "s": [
+ 105,
+ 105,
+ 100
+ ]
+ },
+ {
+ "i": {
+ "x": [
+ 0.07,
+ 0.07,
+ 0.07
+ ],
+ "y": [
+ 0.97,
+ 0.97,
+ 1
+ ]
+ },
+ "o": {
+ "x": [
+ 0.64,
+ 0.64,
+ 0.64
+ ],
+ "y": [
+ 0.03,
+ 0.03,
+ 0
+ ]
+ },
+ "t": 165.246,
+ "s": [
+ 100,
+ 100,
+ 100
+ ]
+ },
+ {
+ "i": {
+ "x": [
+ 0.833,
+ 0.833,
+ 0.833
+ ],
+ "y": [
+ 1,
+ 1,
+ 1
+ ]
+ },
+ "o": {
+ "x": [
+ 0.64,
+ 0.64,
+ 0.64
+ ],
+ "y": [
+ 0,
+ 0,
+ 0
+ ]
+ },
+ "t": 175.281,
+ "s": [
+ 95,
+ 95,
+ 100
+ ]
+ },
+ {
+ "i": {
+ "x": [
+ 0.833,
+ 0.833,
+ 0.833
+ ],
+ "y": [
+ 1,
+ 1,
+ 1
+ ]
+ },
+ "o": {
+ "x": [
+ 0.167,
+ 0.167,
+ 0.167
+ ],
+ "y": [
+ 0,
+ 0,
+ 0
+ ]
+ },
+ "t": 205.377,
+ "s": [
+ 95,
+ 95,
+ 100
+ ]
+ },
+ {
+ "i": {
+ "x": [
+ 0.833,
+ 0.833,
+ 0.833
+ ],
+ "y": [
+ 0.833,
+ 0.833,
+ 0.175
+ ]
+ },
+ "o": {
+ "x": [
+ 0.341,
+ 0.341,
+ 0.341
+ ],
+ "y": [
+ 0,
+ 0,
+ 0
+ ]
+ },
+ "t": 210.391,
+ "s": [
+ 100,
+ 100,
+ 100
+ ]
+ },
+ {
+ "i": {
+ "x": [
+ 0.07,
+ 0.07,
+ 0.07
+ ],
+ "y": [
+ 1,
+ 1,
+ 1
+ ]
+ },
+ "o": {
+ "x": [
+ 0.64,
+ 0.64,
+ 0.64
+ ],
+ "y": [
+ 0,
+ 0,
+ 0
+ ]
+ },
+ "t": 220,
+ "s": [
+ 105,
+ 105,
+ 100
+ ]
+ },
+ {
+ "i": {
+ "x": [
+ 0.833,
+ 0.833,
+ 0.833
+ ],
+ "y": [
+ 0.833,
+ 0.833,
+ 0.833
+ ]
+ },
+ "o": {
+ "x": [
+ 0.167,
+ 0.167,
+ 0.167
+ ],
+ "y": [
+ 0.167,
+ 0.167,
+ 0.167
+ ]
+ },
+ "t": 227.5,
+ "s": [
+ 105,
+ 105,
+ 100
+ ]
+ },
+ {
+ "i": {
+ "x": [
+ 0.621,
+ 0.621,
+ 0.621
+ ],
+ "y": [
+ 1,
+ 1,
+ 1
+ ]
+ },
+ "o": {
+ "x": [
+ 0.167,
+ 0.167,
+ 0.167
+ ],
+ "y": [
+ 0,
+ 0,
+ 0.102
+ ]
+ },
+ "t": 232.5,
+ "s": [
+ 105,
+ 105,
+ 100
+ ]
+ },
+ {
+ "i": {
+ "x": [
+ 0.07,
+ 0.07,
+ 0.07
+ ],
+ "y": [
+ 0.984,
+ 0.984,
+ 1
+ ]
+ },
+ "o": {
+ "x": [
+ 0.64,
+ 0.64,
+ 0.64
+ ],
+ "y": [
+ 0.016,
+ 0.016,
+ 0
+ ]
+ },
+ "t": 240,
+ "s": [
+ 105,
+ 105,
+ 100
+ ]
+ },
+ {
+ "i": {
+ "x": [
+ 0.07,
+ 0.07,
+ 0.07
+ ],
+ "y": [
+ 1,
+ 1,
+ 1
+ ]
+ },
+ "o": {
+ "x": [
+ 0.64,
+ 0.64,
+ 0.64
+ ],
+ "y": [
+ 0,
+ 0,
+ 0
+ ]
+ },
+ "t": 250.527,
+ "s": [
+ 95,
+ 95,
+ 100
+ ]
+ },
+ {
+ "i": {
+ "x": [
+ 0.316,
+ 0.316,
+ 0.316
+ ],
+ "y": [
+ 1,
+ 1,
+ 1
+ ]
+ },
+ "o": {
+ "x": [
+ 0.64,
+ 0.64,
+ 0.64
+ ],
+ "y": [
+ 0,
+ 0,
+ 0
+ ]
+ },
+ "t": 285,
+ "s": [
+ 95,
+ 95,
+ 100
+ ]
+ },
+ {
+ "i": {
+ "x": [
+ 0.577,
+ 0.577,
+ 0.577
+ ],
+ "y": [
+ 1,
+ 1,
+ 1
+ ]
+ },
+ "o": {
+ "x": [
+ 0.253,
+ 0.253,
+ 0.253
+ ],
+ "y": [
+ 0,
+ 0,
+ 0
+ ]
+ },
+ "t": 295,
+ "s": [
+ 105,
+ 105,
+ 100
+ ]
+ },
+ {
+ "i": {
+ "x": [
+ 0.833,
+ 0.833,
+ 0.833
+ ],
+ "y": [
+ 1,
+ 1,
+ 0.925
+ ]
+ },
+ "o": {
+ "x": [
+ 0.299,
+ 0.299,
+ 0.299
+ ],
+ "y": [
+ 0,
+ 0,
+ 0
+ ]
+ },
+ "t": 302.5,
+ "s": [
+ 105,
+ 105,
+ 100
+ ]
+ },
+ {
+ "i": {
+ "x": [
+ 0.627,
+ 0.627,
+ 0.627
+ ],
+ "y": [
+ 1,
+ 1,
+ 1
+ ]
+ },
+ "o": {
+ "x": [
+ 0.167,
+ 0.167,
+ 0.167
+ ],
+ "y": [
+ 0,
+ 0,
+ 0.262
+ ]
+ },
+ "t": 307.5,
+ "s": [
+ 105,
+ 105,
+ 100
+ ]
+ },
+ {
+ "i": {
+ "x": [
+ 0.07,
+ 0.07,
+ 0.07
+ ],
+ "y": [
+ 0.984,
+ 0.984,
+ 1
+ ]
+ },
+ "o": {
+ "x": [
+ 0.64,
+ 0.64,
+ 0.64
+ ],
+ "y": [
+ 0.016,
+ 0.016,
+ 0
+ ]
+ },
+ "t": 365,
+ "s": [
+ 105,
+ 105,
+ 100
+ ]
+ },
+ {
+ "i": {
+ "x": [
+ 0.833,
+ 0.833,
+ 0.833
+ ],
+ "y": [
+ 1,
+ 1,
+ 1
+ ]
+ },
+ "o": {
+ "x": [
+ 0.64,
+ 0.64,
+ 0.64
+ ],
+ "y": [
+ 0,
+ 0,
+ 0
+ ]
+ },
+ "t": 375.771,
+ "s": [
+ 95,
+ 95,
+ 100
+ ]
+ },
+ {
+ "i": {
+ "x": [
+ 0.833,
+ 0.833,
+ 0.833
+ ],
+ "y": [
+ 1,
+ 1,
+ 1
+ ]
+ },
+ "o": {
+ "x": [
+ 0.167,
+ 0.167,
+ 0.167
+ ],
+ "y": [
+ 0,
+ 0,
+ 0
+ ]
+ },
+ "t": 508.369,
+ "s": [
+ 95,
+ 95,
+ 100
+ ]
+ },
+ {
+ "t": 515,
+ "s": [
+ 105,
+ 105,
+ 100
+ ]
+ }
+ ],
+ "ix": 6,
+ "l": 2
+ }
+ },
+ "ao": 0,
+ "ip": -70,
+ "op": 2517.5,
+ "st": 117.5,
+ "bm": 0
+ },
+ {
+ "ddd": 0,
+ "ind": 6,
+ "ty": 4,
+ "nm": "ic_lock_24px",
+ "sr": 1,
+ "ks": {
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 11
+ },
+ "r": {
+ "a": 0,
+ "k": 0,
+ "ix": 10
+ },
+ "p": {
+ "a": 0,
+ "k": [
+ -15.442,
+ -1294.944,
+ 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.2,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 5.52,
+ 0
+ ],
+ [
+ 0,
+ -5.52
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ -2.2
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ -2.2,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 2.2
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "o": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ -5.52
+ ],
+ [
+ -5.52,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ -2.2,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 2.2
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 2.2,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ -2.2
+ ]
+ ],
+ "v": [
+ [
+ 12,
+ -7
+ ],
+ [
+ 10,
+ -7
+ ],
+ [
+ 10,
+ -11
+ ],
+ [
+ 0,
+ -21
+ ],
+ [
+ -10,
+ -11
+ ],
+ [
+ -10,
+ -7
+ ],
+ [
+ -12,
+ -7
+ ],
+ [
+ -16,
+ -3
+ ],
+ [
+ -16,
+ 17
+ ],
+ [
+ -12,
+ 21
+ ],
+ [
+ 12,
+ 21
+ ],
+ [
+ 16,
+ 17
+ ],
+ [
+ 16,
+ -3
+ ]
+ ],
+ "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
+ ],
+ [
+ -3.32,
+ 0
+ ],
+ [
+ 0,
+ -3.32
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "o": [
+ [
+ 0,
+ -3.32
+ ],
+ [
+ 3.32,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "v": [
+ [
+ -6,
+ -11
+ ],
+ [
+ 0,
+ -17
+ ],
+ [
+ 6,
+ -11
+ ],
+ [
+ 6,
+ -7
+ ],
+ [
+ -6,
+ -7
+ ]
+ ],
+ "c": true
+ },
+ "ix": 2
+ },
+ "nm": "Path 2",
+ "mn": "ADBE Vector Shape - Group",
+ "hd": false
+ },
+ {
+ "ind": 2,
+ "ty": "sh",
+ "ix": 3,
+ "ks": {
+ "a": 0,
+ "k": {
+ "i": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "o": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "v": [
+ [
+ -12,
+ -3
+ ],
+ [
+ -12,
+ 17
+ ],
+ [
+ 12,
+ 17
+ ],
+ [
+ 12,
+ -3
+ ]
+ ],
+ "c": true
+ },
+ "ix": 2
+ },
+ "nm": "Path 3",
+ "mn": "ADBE Vector Shape - Group",
+ "hd": false
+ },
+ {
+ "ind": 3,
+ "ty": "sh",
+ "ix": 4,
+ "ks": {
+ "a": 0,
+ "k": {
+ "i": [
+ [
+ -2.2,
+ 0
+ ],
+ [
+ 0,
+ 2.2
+ ],
+ [
+ 2.2,
+ 0
+ ],
+ [
+ 0,
+ -2.2
+ ]
+ ],
+ "o": [
+ [
+ 2.2,
+ 0
+ ],
+ [
+ 0,
+ -2.2
+ ],
+ [
+ -2.2,
+ 0
+ ],
+ [
+ 0,
+ 2.2
+ ]
+ ],
+ "v": [
+ [
+ 0,
+ 11
+ ],
+ [
+ 4,
+ 7
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -4,
+ 7
+ ]
+ ],
+ "c": true
+ },
+ "ix": 2
+ },
+ "nm": "Path 4",
+ "mn": "ADBE Vector Shape - Group",
+ "hd": false
+ },
+ {
+ "ty": "mm",
+ "mm": 5,
+ "nm": "Merge Paths 1",
+ "mn": "ADBE Vector Filter - Merge",
+ "hd": false
+ },
+ {
+ "ty": "fl",
+ "c": {
+ "a": 0,
+ "k": [
+ 0.717647058824,
+ 0.949019607843,
+ 0.623529411765,
+ 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": [
+ 600.243,
+ 600.243
+ ],
+ "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": "ic_lock_24px",
+ "np": 6,
+ "cix": 2,
+ "bm": 0,
+ "ix": 1,
+ "mn": "ADBE Vector Group",
+ "hd": false
+ }
+ ],
+ "ip": -20,
+ "op": 2455,
+ "st": 55,
+ "bm": 0
+ },
+ {
+ "ddd": 0,
+ "ind": 7,
+ "ty": 4,
+ "nm": "GREY_FINGER",
+ "parent": 5,
+ "sr": 1,
+ "ks": {
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 11
+ },
+ "r": {
+ "a": 0,
+ "k": 0,
+ "ix": 10
+ },
+ "p": {
+ "a": 0,
+ "k": [
+ 3.5,
+ -3,
+ 0
+ ],
+ "ix": 2,
+ "l": 2
+ },
+ "a": {
+ "a": 0,
+ "k": [
+ 28,
+ 34,
+ 0
+ ],
+ "ix": 1,
+ "l": 2
+ },
+ "s": {
+ "a": 0,
+ "k": [
+ 527,
+ 527,
+ 100
+ ],
+ "ix": 6,
+ "l": 2
+ }
+ },
+ "ao": 0,
+ "shapes": [
+ {
+ "ty": "gr",
+ "it": [
+ {
+ "ind": 0,
+ "ty": "sh",
+ "ix": 1,
+ "ks": {
+ "a": 0,
+ "k": {
+ "i": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 3.703,
+ 0
+ ],
+ [
+ 2.328,
+ 1.76
+ ]
+ ],
+ "o": [
+ [
+ -2.42,
+ 2.09
+ ],
+ [
+ -3.355,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "v": [
+ [
+ 9.038,
+ -1.687
+ ],
+ [
+ -0.348,
+ 1.687
+ ],
+ [
+ -9.038,
+ -1.118
+ ]
+ ],
+ "c": false
+ },
+ "ix": 2
+ },
+ "nm": "Path 1",
+ "mn": "ADBE Vector Shape - Group",
+ "hd": false
+ },
+ {
+ "ty": "st",
+ "c": {
+ "a": 0,
+ "k": [
+ 0.305882352941,
+ 0.309803921569,
+ 0.321568627451,
+ 1
+ ],
+ "ix": 3
+ },
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 4
+ },
+ "w": {
+ "a": 0,
+ "k": 3,
+ "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": [
+ 27.933,
+ 54.313
+ ],
+ "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
+ ],
+ [
+ -7.847,
+ 0
+ ],
+ [
+ 0,
+ -7.095
+ ]
+ ],
+ "o": [
+ [
+ -1.027,
+ -2.676
+ ],
+ [
+ 0,
+ -7.095
+ ],
+ [
+ 7.847,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "v": [
+ [
+ -12.723,
+ 9.167
+ ],
+ [
+ -13.75,
+ 3.667
+ ],
+ [
+ 0,
+ -9.167
+ ],
+ [
+ 13.75,
+ 3.667
+ ]
+ ],
+ "c": false
+ },
+ "ix": 2
+ },
+ "nm": "Path 1",
+ "mn": "ADBE Vector Shape - Group",
+ "hd": false
+ },
+ {
+ "ty": "st",
+ "c": {
+ "a": 0,
+ "k": [
+ 0.305882352941,
+ 0.309803921569,
+ 0.321568627451,
+ 1
+ ],
+ "ix": 3
+ },
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 4
+ },
+ "w": {
+ "a": 0,
+ "k": 3,
+ "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": [
+ 27.584,
+ 35.833
+ ],
+ "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
+ ],
+ [
+ 2.75,
+ 0
+ ],
+ [
+ 0.403,
+ 2.384
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 2.2,
+ 0
+ ],
+ [
+ -5.445,
+ -1.54
+ ]
+ ],
+ "o": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 2.733
+ ],
+ [
+ -2.42,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ -0.367,
+ -2.181
+ ],
+ [
+ -7.92,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "v": [
+ [
+ 11.376,
+ -1.824
+ ],
+ [
+ 11.376,
+ -1.293
+ ],
+ [
+ 6.408,
+ 3.676
+ ],
+ [
+ 1.512,
+ -0.468
+ ],
+ [
+ 0.999,
+ -3.548
+ ],
+ [
+ -3.456,
+ -7.324
+ ],
+ [
+ -2.667,
+ 7.324
+ ]
+ ],
+ "c": false
+ },
+ "ix": 2
+ },
+ "nm": "Path 1",
+ "mn": "ADBE Vector Shape - Group",
+ "hd": false
+ },
+ {
+ "ty": "st",
+ "c": {
+ "a": 0,
+ "k": [
+ 0.305882352941,
+ 0.309803921569,
+ 0.321568627451,
+ 1
+ ],
+ "ix": 3
+ },
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 4
+ },
+ "w": {
+ "a": 0,
+ "k": 3,
+ "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": [
+ 29.958,
+ 41.324
+ ],
+ "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
+ ],
+ [
+ -6.875,
+ 0
+ ],
+ [
+ -2.769,
+ -4.327
+ ]
+ ],
+ "o": [
+ [
+ 2.768,
+ -4.327
+ ],
+ [
+ 6.876,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "v": [
+ [
+ -15.583,
+ 3.667
+ ],
+ [
+ -0.001,
+ -3.667
+ ],
+ [
+ 15.583,
+ 3.667
+ ]
+ ],
+ "c": false
+ },
+ "ix": 2
+ },
+ "nm": "Path 1",
+ "mn": "ADBE Vector Shape - Group",
+ "hd": false
+ },
+ {
+ "ty": "st",
+ "c": {
+ "a": 0,
+ "k": [
+ 0.305882352941,
+ 0.309803921569,
+ 0.321568627451,
+ 1
+ ],
+ "ix": 3
+ },
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 4
+ },
+ "w": {
+ "a": 0,
+ "k": 3,
+ "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": [
+ 27.583,
+ 23.001
+ ],
+ "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
+ },
+ {
+ "ty": "gr",
+ "it": [
+ {
+ "ind": 0,
+ "ty": "sh",
+ "ix": 1,
+ "ks": {
+ "a": 0,
+ "k": {
+ "i": [
+ [
+ 0,
+ 0
+ ],
+ [
+ -3.666,
+ 0
+ ],
+ [
+ -2.97,
+ -1.485
+ ]
+ ],
+ "o": [
+ [
+ 2.97,
+ -1.485
+ ],
+ [
+ 3.667,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "v": [
+ [
+ -10.083,
+ 1.164
+ ],
+ [
+ -0.001,
+ -1.164
+ ],
+ [
+ 10.083,
+ 1.164
+ ]
+ ],
+ "c": false
+ },
+ "ix": 2
+ },
+ "nm": "Path 1",
+ "mn": "ADBE Vector Shape - Group",
+ "hd": false
+ },
+ {
+ "ty": "st",
+ "c": {
+ "a": 0,
+ "k": [
+ 0.305882352941,
+ 0.309803921569,
+ 0.321568627451,
+ 1
+ ],
+ "ix": 3
+ },
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 4
+ },
+ "w": {
+ "a": 0,
+ "k": 3,
+ "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": [
+ 27.583,
+ 13.164
+ ],
+ "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 5",
+ "np": 2,
+ "cix": 2,
+ "bm": 0,
+ "ix": 5,
+ "mn": "ADBE Vector Group",
+ "hd": false
+ },
+ {
+ "ty": "tm",
+ "s": {
+ "a": 1,
+ "k": [
+ {
+ "i": {
+ "x": [
+ 0
+ ],
+ "y": [
+ 1
+ ]
+ },
+ "o": {
+ "x": [
+ 0.4
+ ],
+ "y": [
+ 0
+ ]
+ },
+ "t": 90,
+ "s": [
+ 100
+ ]
+ },
+ {
+ "i": {
+ "x": [
+ 0.833
+ ],
+ "y": [
+ 1
+ ]
+ },
+ "o": {
+ "x": [
+ 0.64
+ ],
+ "y": [
+ 0
+ ]
+ },
+ "t": 110.035,
+ "s": [
+ 0
+ ]
+ },
+ {
+ "t": 150.197,
+ "s": [
+ 0
+ ],
+ "h": 1
+ },
+ {
+ "t": 152.705,
+ "s": [
+ 100
+ ],
+ "h": 1
+ },
+ {
+ "i": {
+ "x": [
+ 0
+ ],
+ "y": [
+ 1
+ ]
+ },
+ "o": {
+ "x": [
+ 0.4
+ ],
+ "y": [
+ 0
+ ]
+ },
+ "t": 165.246,
+ "s": [
+ 100
+ ]
+ },
+ {
+ "i": {
+ "x": [
+ 0.833
+ ],
+ "y": [
+ -14.687
+ ]
+ },
+ "o": {
+ "x": [
+ 0.64
+ ],
+ "y": [
+ 0
+ ]
+ },
+ "t": 185.281,
+ "s": [
+ 0
+ ]
+ },
+ {
+ "t": 225.441,
+ "s": [
+ 0
+ ],
+ "h": 1
+ },
+ {
+ "t": 227.949,
+ "s": [
+ 100
+ ],
+ "h": 1
+ },
+ {
+ "i": {
+ "x": [
+ 0
+ ],
+ "y": [
+ 1
+ ]
+ },
+ "o": {
+ "x": [
+ 0.4
+ ],
+ "y": [
+ 0
+ ]
+ },
+ "t": 240.494,
+ "s": [
+ 100
+ ]
+ },
+ {
+ "i": {
+ "x": [
+ 0.833
+ ],
+ "y": [
+ -14.701
+ ]
+ },
+ "o": {
+ "x": [
+ 0.64
+ ],
+ "y": [
+ 0
+ ]
+ },
+ "t": 260,
+ "s": [
+ 0
+ ]
+ },
+ {
+ "t": 300.689,
+ "s": [
+ 0
+ ],
+ "h": 1
+ },
+ {
+ "t": 303.193,
+ "s": [
+ 100
+ ],
+ "h": 1
+ },
+ {
+ "i": {
+ "x": [
+ 0
+ ],
+ "y": [
+ 1
+ ]
+ },
+ "o": {
+ "x": [
+ 0.4
+ ],
+ "y": [
+ 0
+ ]
+ },
+ "t": 365.74,
+ "s": [
+ 100
+ ]
+ },
+ {
+ "i": {
+ "x": [
+ 0.833
+ ],
+ "y": [
+ -15.359
+ ]
+ },
+ "o": {
+ "x": [
+ 0.64
+ ],
+ "y": [
+ 0
+ ]
+ },
+ "t": 385,
+ "s": [
+ 0
+ ]
+ },
+ {
+ "t": 518.434,
+ "s": [
+ 0
+ ],
+ "h": 1
+ },
+ {
+ "t": 520.943359375,
+ "s": [
+ 100
+ ],
+ "h": 1
+ }
+ ],
+ "ix": 1
+ },
+ "e": {
+ "a": 1,
+ "k": [
+ {
+ "i": {
+ "x": [
+ 0.07
+ ],
+ "y": [
+ 0.941
+ ]
+ },
+ "o": {
+ "x": [
+ 0.64
+ ],
+ "y": [
+ 0.059
+ ]
+ },
+ "t": 130.133,
+ "s": [
+ 100
+ ]
+ },
+ {
+ "i": {
+ "x": [
+ 0.833
+ ],
+ "y": [
+ 1
+ ]
+ },
+ "o": {
+ "x": [
+ 0.64
+ ],
+ "y": [
+ 0
+ ]
+ },
+ "t": 140.146,
+ "s": [
+ 0
+ ]
+ },
+ {
+ "t": 150.197,
+ "s": [
+ 0
+ ],
+ "h": 1
+ },
+ {
+ "t": 152.705,
+ "s": [
+ 100
+ ],
+ "h": 1
+ },
+ {
+ "i": {
+ "x": [
+ 0
+ ],
+ "y": [
+ 1
+ ]
+ },
+ "o": {
+ "x": [
+ 0.4
+ ],
+ "y": [
+ 0
+ ]
+ },
+ "t": 205.377,
+ "s": [
+ 100
+ ]
+ },
+ {
+ "i": {
+ "x": [
+ 0.833
+ ],
+ "y": [
+ -12.439
+ ]
+ },
+ "o": {
+ "x": [
+ 0.64
+ ],
+ "y": [
+ 0
+ ]
+ },
+ "t": 215,
+ "s": [
+ 0
+ ]
+ },
+ {
+ "t": 225.441,
+ "s": [
+ 0
+ ],
+ "h": 1
+ },
+ {
+ "t": 227.949,
+ "s": [
+ 100
+ ],
+ "h": 1
+ },
+ {
+ "i": {
+ "x": [
+ 0.07
+ ],
+ "y": [
+ 0.941
+ ]
+ },
+ "o": {
+ "x": [
+ 0.64
+ ],
+ "y": [
+ 0.059
+ ]
+ },
+ "t": 280.623,
+ "s": [
+ 100
+ ]
+ },
+ {
+ "i": {
+ "x": [
+ 0.833
+ ],
+ "y": [
+ -12.342
+ ]
+ },
+ "o": {
+ "x": [
+ 0.64
+ ],
+ "y": [
+ 0
+ ]
+ },
+ "t": 290.641,
+ "s": [
+ 0
+ ]
+ },
+ {
+ "t": 300.689,
+ "s": [
+ 0
+ ],
+ "h": 1
+ },
+ {
+ "t": 303.193,
+ "s": [
+ 100
+ ],
+ "h": 1
+ },
+ {
+ "i": {
+ "x": [
+ 0.07
+ ],
+ "y": [
+ 0.97
+ ]
+ },
+ "o": {
+ "x": [
+ 0.64
+ ],
+ "y": [
+ 0.03
+ ]
+ },
+ "t": 508.369,
+ "s": [
+ 100
+ ]
+ },
+ {
+ "i": {
+ "x": [
+ 0.833
+ ],
+ "y": [
+ -10.133
+ ]
+ },
+ "o": {
+ "x": [
+ 0.64
+ ],
+ "y": [
+ 0
+ ]
+ },
+ "t": 513.385,
+ "s": [
+ 0
+ ]
+ },
+ {
+ "t": 518.434,
+ "s": [
+ 0
+ ],
+ "h": 1
+ },
+ {
+ "t": 520.943359375,
+ "s": [
+ 100
+ ],
+ "h": 1
+ }
+ ],
+ "ix": 2
+ },
+ "o": {
+ "a": 0,
+ "k": 0,
+ "ix": 3
+ },
+ "m": 1,
+ "ix": 6,
+ "nm": "Trim Paths 1",
+ "mn": "ADBE Vector Filter - Trim",
+ "hd": false
+ }
+ ],
+ "ip": -20,
+ "op": 4855,
+ "st": 55,
+ "bm": 0
+ },
+ {
+ "ddd": 0,
+ "ind": 8,
+ "ty": 4,
+ "nm": "BLUE_FINGER",
+ "parent": 5,
+ "sr": 1,
+ "ks": {
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 11
+ },
+ "r": {
+ "a": 0,
+ "k": 0,
+ "ix": 10
+ },
+ "p": {
+ "a": 0,
+ "k": [
+ 3.5,
+ -3,
+ 0
+ ],
+ "ix": 2,
+ "l": 2
+ },
+ "a": {
+ "a": 0,
+ "k": [
+ 28,
+ 34,
+ 0
+ ],
+ "ix": 1,
+ "l": 2
+ },
+ "s": {
+ "a": 0,
+ "k": [
+ 527,
+ 527,
+ 100
+ ],
+ "ix": 6,
+ "l": 2
+ }
+ },
+ "ao": 0,
+ "shapes": [
+ {
+ "ty": "gr",
+ "it": [
+ {
+ "ind": 0,
+ "ty": "sh",
+ "ix": 1,
+ "ks": {
+ "a": 0,
+ "k": {
+ "i": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 3.703,
+ 0
+ ],
+ [
+ 2.328,
+ 1.76
+ ]
+ ],
+ "o": [
+ [
+ -2.42,
+ 2.09
+ ],
+ [
+ -3.355,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "v": [
+ [
+ 9.038,
+ -1.687
+ ],
+ [
+ -0.348,
+ 1.687
+ ],
+ [
+ -9.038,
+ -1.118
+ ]
+ ],
+ "c": false
+ },
+ "ix": 2
+ },
+ "nm": "Path 1",
+ "mn": "ADBE Vector Shape - Group",
+ "hd": false
+ },
+ {
+ "ty": "st",
+ "c": {
+ "a": 0,
+ "k": [
+ 0.4,
+ 0.61568627451,
+ 0.964705882353,
+ 1
+ ],
+ "ix": 3
+ },
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 4
+ },
+ "w": {
+ "a": 0,
+ "k": 3,
+ "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": [
+ 27.933,
+ 54.313
+ ],
+ "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
+ ],
+ [
+ -7.847,
+ 0
+ ],
+ [
+ 0,
+ -7.095
+ ]
+ ],
+ "o": [
+ [
+ -1.027,
+ -2.676
+ ],
+ [
+ 0,
+ -7.095
+ ],
+ [
+ 7.847,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "v": [
+ [
+ -12.723,
+ 9.167
+ ],
+ [
+ -13.75,
+ 3.667
+ ],
+ [
+ 0,
+ -9.167
+ ],
+ [
+ 13.75,
+ 3.667
+ ]
+ ],
+ "c": false
+ },
+ "ix": 2
+ },
+ "nm": "Path 1",
+ "mn": "ADBE Vector Shape - Group",
+ "hd": false
+ },
+ {
+ "ty": "st",
+ "c": {
+ "a": 0,
+ "k": [
+ 0.4,
+ 0.61568627451,
+ 0.964705882353,
+ 1
+ ],
+ "ix": 3
+ },
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 4
+ },
+ "w": {
+ "a": 0,
+ "k": 3,
+ "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": [
+ 27.584,
+ 35.833
+ ],
+ "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
+ ],
+ [
+ 2.75,
+ 0
+ ],
+ [
+ 0.403,
+ 2.384
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 2.2,
+ 0
+ ],
+ [
+ -5.445,
+ -1.54
+ ]
+ ],
+ "o": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 2.733
+ ],
+ [
+ -2.42,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ -0.367,
+ -2.181
+ ],
+ [
+ -7.92,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "v": [
+ [
+ 11.376,
+ -1.824
+ ],
+ [
+ 11.376,
+ -1.293
+ ],
+ [
+ 6.408,
+ 3.676
+ ],
+ [
+ 1.512,
+ -0.468
+ ],
+ [
+ 0.999,
+ -3.548
+ ],
+ [
+ -3.456,
+ -7.324
+ ],
+ [
+ -2.667,
+ 7.324
+ ]
+ ],
+ "c": false
+ },
+ "ix": 2
+ },
+ "nm": "Path 1",
+ "mn": "ADBE Vector Shape - Group",
+ "hd": false
+ },
+ {
+ "ty": "st",
+ "c": {
+ "a": 0,
+ "k": [
+ 0.4,
+ 0.61568627451,
+ 0.964705882353,
+ 1
+ ],
+ "ix": 3
+ },
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 4
+ },
+ "w": {
+ "a": 0,
+ "k": 3,
+ "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": [
+ 29.958,
+ 41.324
+ ],
+ "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
+ ],
+ [
+ -6.875,
+ 0
+ ],
+ [
+ -2.769,
+ -4.327
+ ]
+ ],
+ "o": [
+ [
+ 2.768,
+ -4.327
+ ],
+ [
+ 6.876,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "v": [
+ [
+ -15.583,
+ 3.667
+ ],
+ [
+ -0.001,
+ -3.667
+ ],
+ [
+ 15.583,
+ 3.667
+ ]
+ ],
+ "c": false
+ },
+ "ix": 2
+ },
+ "nm": "Path 1",
+ "mn": "ADBE Vector Shape - Group",
+ "hd": false
+ },
+ {
+ "ty": "st",
+ "c": {
+ "a": 0,
+ "k": [
+ 0.4,
+ 0.61568627451,
+ 0.964705882353,
+ 1
+ ],
+ "ix": 3
+ },
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 4
+ },
+ "w": {
+ "a": 0,
+ "k": 3,
+ "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": [
+ 27.583,
+ 23.001
+ ],
+ "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
+ },
+ {
+ "ty": "gr",
+ "it": [
+ {
+ "ind": 0,
+ "ty": "sh",
+ "ix": 1,
+ "ks": {
+ "a": 0,
+ "k": {
+ "i": [
+ [
+ 0,
+ 0
+ ],
+ [
+ -3.666,
+ 0
+ ],
+ [
+ -2.97,
+ -1.485
+ ]
+ ],
+ "o": [
+ [
+ 2.97,
+ -1.485
+ ],
+ [
+ 3.667,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "v": [
+ [
+ -10.083,
+ 1.164
+ ],
+ [
+ -0.001,
+ -1.164
+ ],
+ [
+ 10.083,
+ 1.164
+ ]
+ ],
+ "c": false
+ },
+ "ix": 2
+ },
+ "nm": "Path 1",
+ "mn": "ADBE Vector Shape - Group",
+ "hd": false
+ },
+ {
+ "ty": "st",
+ "c": {
+ "a": 0,
+ "k": [
+ 0.4,
+ 0.61568627451,
+ 0.964705882353,
+ 1
+ ],
+ "ix": 3
+ },
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 4
+ },
+ "w": {
+ "a": 0,
+ "k": 3,
+ "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": [
+ 27.583,
+ 13.164
+ ],
+ "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 5",
+ "np": 2,
+ "cix": 2,
+ "bm": 0,
+ "ix": 5,
+ "mn": "ADBE Vector Group",
+ "hd": false
+ }
+ ],
+ "ip": -20,
+ "op": 4855,
+ "st": 55,
+ "bm": 0
+ },
+ {
+ "ddd": 0,
+ "ind": 9,
+ "ty": 4,
+ "nm": "BG_Circle_Green",
+ "parent": 5,
+ "sr": 1,
+ "ks": {
+ "o": {
+ "a": 1,
+ "k": [
+ {
+ "i": {
+ "x": [
+ 0.5
+ ],
+ "y": [
+ 1
+ ]
+ },
+ "o": {
+ "x": [
+ 0.88
+ ],
+ "y": [
+ 0
+ ]
+ },
+ "t": 87.5,
+ "s": [
+ 33
+ ]
+ },
+ {
+ "i": {
+ "x": [
+ 0.833
+ ],
+ "y": [
+ 0.833
+ ]
+ },
+ "o": {
+ "x": [
+ 0.167
+ ],
+ "y": [
+ 0.167
+ ]
+ },
+ "t": 112.5,
+ "s": [
+ 12
+ ]
+ },
+ {
+ "i": {
+ "x": [
+ 0.5
+ ],
+ "y": [
+ 1
+ ]
+ },
+ "o": {
+ "x": [
+ 0.88
+ ],
+ "y": [
+ 0
+ ]
+ },
+ "t": 127.5,
+ "s": [
+ 12
+ ]
+ },
+ {
+ "i": {
+ "x": [
+ 0.833
+ ],
+ "y": [
+ 0.833
+ ]
+ },
+ "o": {
+ "x": [
+ 0.167
+ ],
+ "y": [
+ 0.167
+ ]
+ },
+ "t": 152.5,
+ "s": [
+ 33
+ ]
+ },
+ {
+ "i": {
+ "x": [
+ 0.5
+ ],
+ "y": [
+ 1
+ ]
+ },
+ "o": {
+ "x": [
+ 0.88
+ ],
+ "y": [
+ 0
+ ]
+ },
+ "t": 157.5,
+ "s": [
+ 33
+ ]
+ },
+ {
+ "i": {
+ "x": [
+ 0.833
+ ],
+ "y": [
+ 0.833
+ ]
+ },
+ "o": {
+ "x": [
+ 0.167
+ ],
+ "y": [
+ 0.167
+ ]
+ },
+ "t": 182.5,
+ "s": [
+ 12
+ ]
+ },
+ {
+ "i": {
+ "x": [
+ 0.5
+ ],
+ "y": [
+ 1
+ ]
+ },
+ "o": {
+ "x": [
+ 0.88
+ ],
+ "y": [
+ 0
+ ]
+ },
+ "t": 197.5,
+ "s": [
+ 12
+ ]
+ },
+ {
+ "i": {
+ "x": [
+ 0.833
+ ],
+ "y": [
+ 0.833
+ ]
+ },
+ "o": {
+ "x": [
+ 0.167
+ ],
+ "y": [
+ 0.167
+ ]
+ },
+ "t": 222.5,
+ "s": [
+ 33
+ ]
+ },
+ {
+ "i": {
+ "x": [
+ 0.5
+ ],
+ "y": [
+ 1
+ ]
+ },
+ "o": {
+ "x": [
+ 0.88
+ ],
+ "y": [
+ 0
+ ]
+ },
+ "t": 230,
+ "s": [
+ 33
+ ]
+ },
+ {
+ "i": {
+ "x": [
+ 0.833
+ ],
+ "y": [
+ 0.833
+ ]
+ },
+ "o": {
+ "x": [
+ 0.167
+ ],
+ "y": [
+ 0.167
+ ]
+ },
+ "t": 255,
+ "s": [
+ 12
+ ]
+ },
+ {
+ "i": {
+ "x": [
+ 0.5
+ ],
+ "y": [
+ 1
+ ]
+ },
+ "o": {
+ "x": [
+ 0.88
+ ],
+ "y": [
+ 0
+ ]
+ },
+ "t": 280,
+ "s": [
+ 12
+ ]
+ },
+ {
+ "i": {
+ "x": [
+ 0.833
+ ],
+ "y": [
+ 0.833
+ ]
+ },
+ "o": {
+ "x": [
+ 0.167
+ ],
+ "y": [
+ 0.167
+ ]
+ },
+ "t": 295,
+ "s": [
+ 33
+ ]
+ },
+ {
+ "i": {
+ "x": [
+ 0.5
+ ],
+ "y": [
+ 1
+ ]
+ },
+ "o": {
+ "x": [
+ 0.88
+ ],
+ "y": [
+ 0
+ ]
+ },
+ "t": 367.5,
+ "s": [
+ 33
+ ]
+ },
+ {
+ "i": {
+ "x": [
+ 0.833
+ ],
+ "y": [
+ 0.833
+ ]
+ },
+ "o": {
+ "x": [
+ 0.167
+ ],
+ "y": [
+ 0.167
+ ]
+ },
+ "t": 382.5,
+ "s": [
+ 12
+ ]
+ },
+ {
+ "i": {
+ "x": [
+ 0.5
+ ],
+ "y": [
+ 1
+ ]
+ },
+ "o": {
+ "x": [
+ 0.88
+ ],
+ "y": [
+ 0
+ ]
+ },
+ "t": 507.5,
+ "s": [
+ 12
+ ]
+ },
+ {
+ "t": 517.5,
+ "s": [
+ 33
+ ]
+ }
+ ],
+ "ix": 11
+ },
+ "r": {
+ "a": 0,
+ "k": 0,
+ "ix": 10
+ },
+ "p": {
+ "a": 0,
+ "k": [
+ 2.91,
+ -13.59,
+ 0
+ ],
+ "ix": 2,
+ "l": 2
+ },
+ "a": {
+ "a": 0,
+ "k": [
+ -13.09,
+ 1270.41,
+ 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": [
+ 440,
+ 440
+ ],
+ "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.964705942191,
+ 0.996078491211,
+ 0.87450986376,
+ 1
+ ],
+ "ix": 3
+ },
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 4
+ },
+ "w": {
+ "a": 0,
+ "k": 0,
+ "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": [
+ 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": [
+ -13.09,
+ 1270.41
+ ],
+ "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": -70,
+ "op": 2585,
+ "st": 117.5,
+ "bm": 0
+ },
+ {
+ "ddd": 0,
+ "ind": 10,
+ "ty": 4,
+ "nm": "BG_Circle",
+ "parent": 5,
+ "sr": 1,
+ "ks": {
+ "o": {
+ "a": 0,
+ "k": 0,
+ "ix": 11
+ },
+ "r": {
+ "a": 0,
+ "k": 0,
+ "ix": 10
+ },
+ "p": {
+ "a": 0,
+ "k": [
+ 2.91,
+ -13.59,
+ 0
+ ],
+ "ix": 2,
+ "l": 2
+ },
+ "a": {
+ "a": 0,
+ "k": [
+ -13.09,
+ 1270.41,
+ 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": [
+ 430,
+ 430
+ ],
+ "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.964705942191,
+ 0.996078491211,
+ 0.87450986376,
+ 1
+ ],
+ "ix": 3
+ },
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 4
+ },
+ "w": {
+ "a": 0,
+ "k": 0,
+ "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": [
+ 0.066666666667,
+ 0.086274509804,
+ 0.117647066303,
+ 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": [
+ -13.09,
+ 1270.41
+ ],
+ "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": -70,
+ "op": 2585,
+ "st": 117.5,
+ "bm": 0
+ },
+ {
+ "ddd": 0,
+ "ind": 11,
+ "ty": 3,
+ "nm": "Null 59 DIALOGUE",
+ "sr": 1,
+ "ks": {
+ "o": {
+ "a": 0,
+ "k": 0,
+ "ix": 11
+ },
+ "r": {
+ "a": 0,
+ "k": 0,
+ "ix": 10
+ },
+ "p": {
+ "a": 0,
+ "k": [
+ 840.657,
+ 2087.485,
+ 0
+ ],
+ "ix": 2,
+ "l": 2
+ },
+ "a": {
+ "a": 0,
+ "k": [
+ 0,
+ 0,
+ 0
+ ],
+ "ix": 1,
+ "l": 2
+ },
+ "s": {
+ "a": 0,
+ "k": [
+ 125,
+ 125,
+ 100
+ ],
+ "ix": 6,
+ "l": 2
+ }
+ },
+ "ao": 0,
+ "ip": -20,
+ "op": 2455,
+ "st": 55,
+ "bm": 0
+ },
+ {
+ "ddd": 0,
+ "ind": 12,
+ "ty": 4,
+ "nm": "PHONE_OUTLINE",
+ "sr": 1,
+ "ks": {
+ "o": {
+ "a": 1,
+ "k": [
+ {
+ "i": {
+ "x": [
+ 0.5
+ ],
+ "y": [
+ 1
+ ]
+ },
+ "o": {
+ "x": [
+ 0.88
+ ],
+ "y": [
+ 0
+ ]
+ },
+ "t": 60,
+ "s": [
+ 100
+ ]
+ },
+ {
+ "t": 72,
+ "s": [
+ 0
+ ]
+ }
+ ],
+ "ix": 11
+ },
+ "r": {
+ "a": 0,
+ "k": 0,
+ "ix": 10
+ },
+ "p": {
+ "a": 0,
+ "k": [
+ 837,
+ 1430,
+ 0
+ ],
+ "ix": 2,
+ "l": 2
+ },
+ "a": {
+ "a": 0,
+ "k": [
+ 0,
+ 0,
+ 0
+ ],
+ "ix": 1,
+ "l": 2
+ },
+ "s": {
+ "a": 0,
+ "k": [
+ 929.094,
+ 929.094,
+ 100
+ ],
+ "ix": 6,
+ "l": 2
+ }
+ },
+ "ao": 0,
+ "shapes": [
+ {
+ "ty": "gr",
+ "it": [
+ {
+ "ind": 0,
+ "ty": "sh",
+ "ix": 1,
+ "ks": {
+ "a": 0,
+ "k": {
+ "i": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 5.243,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 5.244
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ -5.243,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ -5.244
+ ]
+ ],
+ "o": [
+ [
+ 0,
+ 5.244
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ -5.243,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ -5.244
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 5.243,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "v": [
+ [
+ 63.454,
+ 114.112
+ ],
+ [
+ 53.945,
+ 123.622
+ ],
+ [
+ -55.413,
+ 123.622
+ ],
+ [
+ -64.922,
+ 114.112
+ ],
+ [
+ -64.922,
+ -114.112
+ ],
+ [
+ -55.413,
+ -123.622
+ ],
+ [
+ 53.945,
+ -123.622
+ ],
+ [
+ 63.454,
+ -114.112
+ ]
+ ],
+ "c": true
+ },
+ "ix": 2
+ },
+ "nm": "Path 1",
+ "mn": "ADBE Vector Shape - Group",
+ "hd": false
+ },
+ {
+ "ind": 1,
+ "ty": "sh",
+ "ix": 2,
+ "ks": {
+ "a": 0,
+ "k": {
+ "i": [
+ [
+ 0,
+ 1.313
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 1.313,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 6.554,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ -6.555
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ -6.554,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 6.555
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 1.313
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 1.313,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "o": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ -1.313
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ -6.555
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ -6.554,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 6.555
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 6.554,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 1.313,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ -1.313
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 1.313,
+ 0
+ ]
+ ],
+ "v": [
+ [
+ 68.209,
+ -52.302
+ ],
+ [
+ 68.209,
+ -61.811
+ ],
+ [
+ 65.832,
+ -64.188
+ ],
+ [
+ 65.832,
+ -114.112
+ ],
+ [
+ 53.945,
+ -126
+ ],
+ [
+ -55.413,
+ -126
+ ],
+ [
+ -67.3,
+ -114.112
+ ],
+ [
+ -67.3,
+ 114.112
+ ],
+ [
+ -55.413,
+ 126
+ ],
+ [
+ 53.945,
+ 126
+ ],
+ [
+ 65.832,
+ 114.112
+ ],
+ [
+ 65.832,
+ -2.378
+ ],
+ [
+ 68.209,
+ -4.755
+ ],
+ [
+ 68.209,
+ -28.528
+ ],
+ [
+ 65.832,
+ -30.906
+ ],
+ [
+ 65.832,
+ -49.924
+ ]
+ ],
+ "c": true
+ },
+ "ix": 2
+ },
+ "nm": "Path 2",
+ "mn": "ADBE Vector Shape - Group",
+ "hd": false
+ },
+ {
+ "ty": "fl",
+ "c": {
+ "a": 0,
+ "k": [
+ 0.368627458811,
+ 0.368627458811,
+ 0.368627458811,
+ 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": -20,
+ "op": 79,
+ "st": 55,
+ "bm": 0
+ },
+ {
+ "ddd": 0,
+ "ind": 13,
+ "ty": 4,
+ "nm": "CONFIRMATION_",
+ "parent": 11,
+ "sr": 1,
+ "ks": {
+ "o": {
+ "a": 1,
+ "k": [
+ {
+ "i": {
+ "x": [
+ 0
+ ],
+ "y": [
+ 1
+ ]
+ },
+ "o": {
+ "x": [
+ 0.4
+ ],
+ "y": [
+ 0
+ ]
+ },
+ "t": 472.812,
+ "s": [
+ 0
+ ]
+ },
+ {
+ "i": {
+ "x": [
+ 0.833
+ ],
+ "y": [
+ 1
+ ]
+ },
+ "o": {
+ "x": [
+ 0.4
+ ],
+ "y": [
+ 0
+ ]
+ },
+ "t": 485,
+ "s": [
+ 100
+ ]
+ },
+ {
+ "i": {
+ "x": [
+ 0.833
+ ],
+ "y": [
+ 1
+ ]
+ },
+ "o": {
+ "x": [
+ 0.167
+ ],
+ "y": [
+ 0
+ ]
+ },
+ "t": 540,
+ "s": [
+ 100
+ ]
+ },
+ {
+ "t": 565,
+ "s": [
+ 0
+ ]
+ }
+ ],
+ "ix": 11
+ },
+ "r": {
+ "a": 0,
+ "k": 0,
+ "ix": 10
+ },
+ "p": {
+ "a": 0,
+ "k": [
+ -0.747,
+ -3.075,
+ 0
+ ],
+ "ix": 2,
+ "l": 2
+ },
+ "a": {
+ "a": 0,
+ "k": [
+ -13.09,
+ 1270.41,
+ 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": [
+ 1075,
+ 1075
+ ],
+ "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.400000029919,
+ 0.61568627451,
+ 0.988235353956,
+ 1
+ ],
+ "ix": 3
+ },
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 4
+ },
+ "w": {
+ "a": 0,
+ "k": 49,
+ "ix": 5,
+ "x": "var $bm_rt;\n$bm_rt = thisComp.layer('OuterRing - WIDTH CONTROLLER').content('Ellipse 1').content('Stroke 1').strokeWidth;"
+ },
+ "lc": 2,
+ "lj": 1,
+ "ml": 4,
+ "bm": 0,
+ "nm": "Stroke 1",
+ "mn": "ADBE Vector Graphic - Stroke",
+ "hd": false
+ },
+ {
+ "ty": "tr",
+ "p": {
+ "a": 0,
+ "k": [
+ -13.09,
+ 1270.41
+ ],
+ "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": 255,
+ "op": 2570,
+ "st": 102.5,
+ "bm": 0
+ },
+ {
+ "ddd": 0,
+ "ind": 14,
+ "ty": 4,
+ "nm": "MATTE_BOTTOM",
+ "parent": 11,
+ "td": 1,
+ "sr": 1,
+ "ks": {
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 11
+ },
+ "r": {
+ "a": 0,
+ "k": 0,
+ "ix": 10
+ },
+ "p": {
+ "a": 0,
+ "k": [
+ 14.543,
+ -11.886,
+ 0
+ ],
+ "ix": 2,
+ "l": 2
+ },
+ "a": {
+ "a": 0,
+ "k": [
+ 593.879,
+ 1034.5,
+ 0
+ ],
+ "ix": 1,
+ "l": 2
+ },
+ "s": {
+ "a": 0,
+ "k": [
+ 135.338,
+ 132.074,
+ 100
+ ],
+ "ix": 6,
+ "l": 2
+ }
+ },
+ "ao": 0,
+ "shapes": [
+ {
+ "ty": "gr",
+ "it": [
+ {
+ "ind": 0,
+ "ty": "sh",
+ "ix": 1,
+ "ks": {
+ "a": 0,
+ "k": {
+ "i": [
+ [
+ 0,
+ -220.914
+ ],
+ [
+ 220.914,
+ 0
+ ],
+ [
+ 0,
+ 220.914
+ ],
+ [
+ -220.914,
+ 0
+ ]
+ ],
+ "o": [
+ [
+ 0,
+ 220.914
+ ],
+ [
+ -220.914,
+ 0
+ ],
+ [
+ 0,
+ -220.914
+ ],
+ [
+ 220.914,
+ 0
+ ]
+ ],
+ "v": [
+ [
+ 400,
+ 0
+ ],
+ [
+ 0,
+ 400
+ ],
+ [
+ -400,
+ 0
+ ],
+ [
+ 0,
+ -400
+ ]
+ ],
+ "c": true
+ },
+ "ix": 2
+ },
+ "nm": "Path 1",
+ "mn": "ADBE Vector Shape - Group",
+ "hd": false
+ },
+ {
+ "ty": "st",
+ "c": {
+ "a": 0,
+ "k": [
+ 0.600934436275,
+ 1,
+ 0.659657257678,
+ 1
+ ],
+ "ix": 3
+ },
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 4
+ },
+ "w": {
+ "a": 0,
+ "k": 103,
+ "ix": 5
+ },
+ "lc": 1,
+ "lj": 2,
+ "bm": 0,
+ "d": [
+ {
+ "n": "d",
+ "nm": "dash",
+ "v": {
+ "a": 0,
+ "k": 15,
+ "ix": 1
+ }
+ },
+ {
+ "n": "g",
+ "nm": "gap",
+ "v": {
+ "a": 0,
+ "k": 2,
+ "ix": 2
+ }
+ },
+ {
+ "n": "d",
+ "nm": "dash2",
+ "v": {
+ "a": 0,
+ "k": 15,
+ "ix": 3
+ }
+ },
+ {
+ "n": "g",
+ "nm": "gap2",
+ "v": {
+ "a": 0,
+ "k": 2,
+ "ix": 4
+ }
+ },
+ {
+ "n": "d",
+ "nm": "dash3",
+ "v": {
+ "a": 0,
+ "k": 15,
+ "ix": 5
+ }
+ },
+ {
+ "n": "g",
+ "nm": "gap3",
+ "v": {
+ "a": 0,
+ "k": 2,
+ "ix": 6
+ }
+ },
+ {
+ "n": "o",
+ "nm": "offset",
+ "v": {
+ "a": 0,
+ "k": 8,
+ "ix": 7
+ }
+ }
+ ],
+ "nm": "Stroke 1",
+ "mn": "ADBE Vector Graphic - Stroke",
+ "hd": false
+ },
+ {
+ "ty": "tr",
+ "p": {
+ "a": 0,
+ "k": [
+ 584.5,
+ 1034.5
+ ],
+ "ix": 2
+ },
+ "a": {
+ "a": 0,
+ "k": [
+ 0,
+ 0
+ ],
+ "ix": 1
+ },
+ "s": {
+ "a": 0,
+ "k": [
+ 100,
+ 100
+ ],
+ "ix": 3
+ },
+ "r": {
+ "a": 0,
+ "k": 0,
+ "ix": 6
+ },
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 7
+ },
+ "sk": {
+ "a": 0,
+ "k": 0,
+ "ix": 4
+ },
+ "sa": {
+ "a": 0,
+ "k": 0,
+ "ix": 5
+ },
+ "nm": "Transform"
+ }
+ ],
+ "nm": "Group 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": 0,
+ "k": 100,
+ "ix": 2
+ },
+ "o": {
+ "a": 0,
+ "k": 0,
+ "ix": 3
+ },
+ "m": 1,
+ "ix": 2,
+ "nm": "Trim Paths 1",
+ "mn": "ADBE Vector Filter - Trim",
+ "hd": false
+ },
+ {
+ "ty": "tm",
+ "s": {
+ "a": 0,
+ "k": 0,
+ "ix": 1
+ },
+ "e": {
+ "a": 0,
+ "k": 100,
+ "ix": 2
+ },
+ "o": {
+ "a": 0,
+ "k": 0,
+ "ix": 3
+ },
+ "m": 1,
+ "ix": 3,
+ "nm": "Trim Paths 2",
+ "mn": "ADBE Vector Filter - Trim",
+ "hd": false
+ }
+ ],
+ "ip": -87.5,
+ "op": 2520,
+ "st": -160,
+ "bm": 0
+ },
+ {
+ "ddd": 0,
+ "ind": 15,
+ "ty": 4,
+ "nm": "OuterRing - WIDTH CONTROLLER",
+ "parent": 11,
+ "tt": 1,
+ "sr": 1,
+ "ks": {
+ "o": {
+ "a": 1,
+ "k": [
+ {
+ "i": {
+ "x": [
+ 0.833
+ ],
+ "y": [
+ 0.833
+ ]
+ },
+ "o": {
+ "x": [
+ 0.167
+ ],
+ "y": [
+ 0.167
+ ]
+ },
+ "t": 547.5,
+ "s": [
+ 100
+ ]
+ },
+ {
+ "t": 555,
+ "s": [
+ 0
+ ]
+ }
+ ],
+ "ix": 11
+ },
+ "r": {
+ "a": 1,
+ "k": [
+ {
+ "i": {
+ "x": [
+ 0
+ ],
+ "y": [
+ 1
+ ]
+ },
+ "o": {
+ "x": [
+ 0.29
+ ],
+ "y": [
+ 0
+ ]
+ },
+ "t": 392.5,
+ "s": [
+ 0
+ ]
+ },
+ {
+ "t": 617.5,
+ "s": [
+ 535
+ ]
+ }
+ ],
+ "ix": 10
+ },
+ "p": {
+ "a": 0,
+ "k": [
+ -0.747,
+ -3.075,
+ 0
+ ],
+ "ix": 2,
+ "l": 2
+ },
+ "a": {
+ "a": 0,
+ "k": [
+ -13.09,
+ 1270.41,
+ 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": [
+ 1075,
+ 1075
+ ],
+ "ix": 2
+ },
+ "p": {
+ "a": 0,
+ "k": [
+ 0,
+ 0
+ ],
+ "ix": 3
+ },
+ "nm": "Ellipse Path 1",
+ "mn": "ADBE Vector Shape - Ellipse",
+ "hd": false
+ },
+ {
+ "ty": "tm",
+ "s": {
+ "a": 0,
+ "k": 0,
+ "ix": 1
+ },
+ "e": {
+ "a": 1,
+ "k": [
+ {
+ "i": {
+ "x": [
+ 0.5
+ ],
+ "y": [
+ 1
+ ]
+ },
+ "o": {
+ "x": [
+ 0.88
+ ],
+ "y": [
+ 0
+ ]
+ },
+ "t": 92.535,
+ "s": [
+ 0
+ ]
+ },
+ {
+ "i": {
+ "x": [
+ 0.833
+ ],
+ "y": [
+ 0.833
+ ]
+ },
+ "o": {
+ "x": [
+ 0.167
+ ],
+ "y": [
+ 0.167
+ ]
+ },
+ "t": 141.172,
+ "s": [
+ 25
+ ]
+ },
+ {
+ "i": {
+ "x": [
+ 0.5
+ ],
+ "y": [
+ 1
+ ]
+ },
+ "o": {
+ "x": [
+ 0.88
+ ],
+ "y": [
+ 0
+ ]
+ },
+ "t": 168.826,
+ "s": [
+ 25
+ ]
+ },
+ {
+ "i": {
+ "x": [
+ 0.833
+ ],
+ "y": [
+ 0.833
+ ]
+ },
+ "o": {
+ "x": [
+ 0.167
+ ],
+ "y": [
+ 0.167
+ ]
+ },
+ "t": 215,
+ "s": [
+ 50
+ ]
+ },
+ {
+ "i": {
+ "x": [
+ 0.5
+ ],
+ "y": [
+ 1
+ ]
+ },
+ "o": {
+ "x": [
+ 0.88
+ ],
+ "y": [
+ 0
+ ]
+ },
+ "t": 242.439,
+ "s": [
+ 50
+ ]
+ },
+ {
+ "i": {
+ "x": [
+ 0.833
+ ],
+ "y": [
+ 0.833
+ ]
+ },
+ "o": {
+ "x": [
+ 0.167
+ ],
+ "y": [
+ 0.167
+ ]
+ },
+ "t": 290.633,
+ "s": [
+ 75
+ ]
+ },
+ {
+ "i": {
+ "x": [
+ 0.5
+ ],
+ "y": [
+ 1
+ ]
+ },
+ "o": {
+ "x": [
+ 0.88
+ ],
+ "y": [
+ 0
+ ]
+ },
+ "t": 335.787,
+ "s": [
+ 75
+ ]
+ },
+ {
+ "t": 508.98046875,
+ "s": [
+ 100
+ ]
+ }
+ ],
+ "ix": 2
+ },
+ "o": {
+ "a": 0,
+ "k": 0,
+ "ix": 3
+ },
+ "m": 1,
+ "ix": 2,
+ "nm": "Trim Paths 1",
+ "mn": "ADBE Vector Filter - Trim",
+ "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": 65,
+ "ix": 5
+ },
+ "lc": 2,
+ "lj": 1,
+ "ml": 4,
+ "bm": 0,
+ "nm": "Stroke 1",
+ "mn": "ADBE Vector Graphic - Stroke",
+ "hd": false
+ },
+ {
+ "ty": "tr",
+ "p": {
+ "a": 0,
+ "k": [
+ -13.09,
+ 1270.41
+ ],
+ "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": 4,
+ "cix": 2,
+ "bm": 0,
+ "ix": 1,
+ "mn": "ADBE Vector Group",
+ "hd": false
+ }
+ ],
+ "ip": -70,
+ "op": 2585,
+ "st": 117.5,
+ "bm": 0
+ },
+ {
+ "ddd": 0,
+ "ind": 16,
+ "ty": 4,
+ "nm": "OuterRing",
+ "parent": 11,
+ "sr": 1,
+ "ks": {
+ "o": {
+ "a": 1,
+ "k": [
+ {
+ "i": {
+ "x": [
+ 0.5
+ ],
+ "y": [
+ 1
+ ]
+ },
+ "o": {
+ "x": [
+ 0.88
+ ],
+ "y": [
+ 0
+ ]
+ },
+ "t": 73,
+ "s": [
+ 0
+ ]
+ },
+ {
+ "i": {
+ "x": [
+ 0.833
+ ],
+ "y": [
+ 1
+ ]
+ },
+ "o": {
+ "x": [
+ 0.167
+ ],
+ "y": [
+ 0
+ ]
+ },
+ "t": 79,
+ "s": [
+ 100
+ ]
+ },
+ {
+ "i": {
+ "x": [
+ 0.833
+ ],
+ "y": [
+ 1
+ ]
+ },
+ "o": {
+ "x": [
+ 0.167
+ ],
+ "y": [
+ 0
+ ]
+ },
+ "t": 550,
+ "s": [
+ 100
+ ]
+ },
+ {
+ "t": 582.5,
+ "s": [
+ 0
+ ]
+ }
+ ],
+ "ix": 11
+ },
+ "r": {
+ "a": 0,
+ "k": 0,
+ "ix": 10
+ },
+ "p": {
+ "a": 0,
+ "k": [
+ -0.747,
+ -3.075,
+ 0
+ ],
+ "ix": 2,
+ "l": 2
+ },
+ "a": {
+ "a": 0,
+ "k": [
+ -13.09,
+ 1270.41,
+ 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": [
+ 1075,
+ 1075
+ ],
+ "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.231372563979,
+ 0.294117647059,
+ 0.400000029919,
+ 1
+ ],
+ "ix": 3
+ },
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 4
+ },
+ "w": {
+ "a": 0,
+ "k": 65,
+ "ix": 5,
+ "x": "var $bm_rt;\n$bm_rt = thisComp.layer('OuterRing - WIDTH CONTROLLER').content('Ellipse 1').content('Stroke 1').strokeWidth;"
+ },
+ "lc": 1,
+ "lj": 1,
+ "ml": 4,
+ "bm": 0,
+ "nm": "Stroke 1",
+ "mn": "ADBE Vector Graphic - Stroke",
+ "hd": false
+ },
+ {
+ "ty": "tr",
+ "p": {
+ "a": 0,
+ "k": [
+ -13.09,
+ 1270.41
+ ],
+ "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": -70,
+ "op": 486,
+ "st": 117.5,
+ "bm": 0
+ },
+ {
+ "ddd": 0,
+ "ind": 17,
+ "ty": 4,
+ "nm": "ILLUMINATION",
+ "sr": 1,
+ "ks": {
+ "o": {
+ "a": 1,
+ "k": [
+ {
+ "i": {
+ "x": [
+ 0
+ ],
+ "y": [
+ 1
+ ]
+ },
+ "o": {
+ "x": [
+ 0.78
+ ],
+ "y": [
+ 0
+ ]
+ },
+ "t": 87.5,
+ "s": [
+ 0
+ ]
+ },
+ {
+ "i": {
+ "x": [
+ 0.833
+ ],
+ "y": [
+ 1
+ ]
+ },
+ "o": {
+ "x": [
+ 0.167
+ ],
+ "y": [
+ 0
+ ]
+ },
+ "t": 97.5,
+ "s": [
+ 93
+ ]
+ },
+ {
+ "i": {
+ "x": [
+ 0
+ ],
+ "y": [
+ 1
+ ]
+ },
+ "o": {
+ "x": [
+ 0.33
+ ],
+ "y": [
+ 0
+ ]
+ },
+ "t": 130,
+ "s": [
+ 93
+ ]
+ },
+ {
+ "i": {
+ "x": [
+ 0
+ ],
+ "y": [
+ 1
+ ]
+ },
+ "o": {
+ "x": [
+ 0.167
+ ],
+ "y": [
+ 0
+ ]
+ },
+ "t": 140,
+ "s": [
+ 0
+ ]
+ },
+ {
+ "i": {
+ "x": [
+ 0
+ ],
+ "y": [
+ 1
+ ]
+ },
+ "o": {
+ "x": [
+ 0.78
+ ],
+ "y": [
+ 0
+ ]
+ },
+ "t": 165,
+ "s": [
+ 0
+ ]
+ },
+ {
+ "i": {
+ "x": [
+ 0.833
+ ],
+ "y": [
+ 1
+ ]
+ },
+ "o": {
+ "x": [
+ 0.167
+ ],
+ "y": [
+ 0
+ ]
+ },
+ "t": 175,
+ "s": [
+ 93
+ ]
+ },
+ {
+ "i": {
+ "x": [
+ 0
+ ],
+ "y": [
+ 1
+ ]
+ },
+ "o": {
+ "x": [
+ 0.33
+ ],
+ "y": [
+ 0
+ ]
+ },
+ "t": 205,
+ "s": [
+ 93
+ ]
+ },
+ {
+ "i": {
+ "x": [
+ 0
+ ],
+ "y": [
+ 1
+ ]
+ },
+ "o": {
+ "x": [
+ 0.167
+ ],
+ "y": [
+ 0
+ ]
+ },
+ "t": 215,
+ "s": [
+ 0
+ ]
+ },
+ {
+ "i": {
+ "x": [
+ 0
+ ],
+ "y": [
+ 1
+ ]
+ },
+ "o": {
+ "x": [
+ 0.78
+ ],
+ "y": [
+ 0
+ ]
+ },
+ "t": 242.5,
+ "s": [
+ 0
+ ]
+ },
+ {
+ "i": {
+ "x": [
+ 0.833
+ ],
+ "y": [
+ 1
+ ]
+ },
+ "o": {
+ "x": [
+ 0.167
+ ],
+ "y": [
+ 0
+ ]
+ },
+ "t": 252.5,
+ "s": [
+ 93
+ ]
+ },
+ {
+ "i": {
+ "x": [
+ 0
+ ],
+ "y": [
+ 1
+ ]
+ },
+ "o": {
+ "x": [
+ 0.33
+ ],
+ "y": [
+ 0
+ ]
+ },
+ "t": 287.5,
+ "s": [
+ 93
+ ]
+ },
+ {
+ "i": {
+ "x": [
+ 0
+ ],
+ "y": [
+ 1
+ ]
+ },
+ "o": {
+ "x": [
+ 0.167
+ ],
+ "y": [
+ 0
+ ]
+ },
+ "t": 297.5,
+ "s": [
+ 0
+ ]
+ },
+ {
+ "i": {
+ "x": [
+ 0
+ ],
+ "y": [
+ 1
+ ]
+ },
+ "o": {
+ "x": [
+ 0.78
+ ],
+ "y": [
+ 0
+ ]
+ },
+ "t": 367.5,
+ "s": [
+ 0
+ ]
+ },
+ {
+ "i": {
+ "x": [
+ 0.833
+ ],
+ "y": [
+ 1
+ ]
+ },
+ "o": {
+ "x": [
+ 0.167
+ ],
+ "y": [
+ 0
+ ]
+ },
+ "t": 377.5,
+ "s": [
+ 93
+ ]
+ },
+ {
+ "i": {
+ "x": [
+ 0
+ ],
+ "y": [
+ 1
+ ]
+ },
+ "o": {
+ "x": [
+ 0.33
+ ],
+ "y": [
+ 0
+ ]
+ },
+ "t": 485,
+ "s": [
+ 93
+ ]
+ },
+ {
+ "t": 495,
+ "s": [
+ 0
+ ]
+ }
+ ],
+ "ix": 11
+ },
+ "r": {
+ "a": 0,
+ "k": 0,
+ "ix": 10
+ },
+ "p": {
+ "a": 0,
+ "k": [
+ 839.765,
+ 2085.09,
+ 0
+ ],
+ "ix": 2,
+ "l": 2
+ },
+ "a": {
+ "a": 0,
+ "k": [
+ -13.09,
+ 1270.41,
+ 0
+ ],
+ "ix": 1,
+ "l": 2
+ },
+ "s": {
+ "a": 0,
+ "k": [
+ 95,
+ 95,
+ 100
+ ],
+ "ix": 6,
+ "l": 2
+ }
+ },
+ "ao": 0,
+ "ef": [
+ {
+ "ty": 29,
+ "nm": "Gaussian Blur",
+ "np": 5,
+ "mn": "ADBE Gaussian Blur 2",
+ "ix": 1,
+ "en": 1,
+ "ef": [
+ {
+ "ty": 0,
+ "nm": "Blurriness",
+ "mn": "ADBE Gaussian Blur 2-0001",
+ "ix": 1,
+ "v": {
+ "a": 0,
+ "k": 49.5,
+ "ix": 1
+ }
+ },
+ {
+ "ty": 7,
+ "nm": "Blur Dimensions",
+ "mn": "ADBE Gaussian Blur 2-0002",
+ "ix": 2,
+ "v": {
+ "a": 0,
+ "k": 1,
+ "ix": 2
+ }
+ },
+ {
+ "ty": 7,
+ "nm": "Repeat Edge Pixels",
+ "mn": "ADBE Gaussian Blur 2-0003",
+ "ix": 3,
+ "v": {
+ "a": 0,
+ "k": 0,
+ "ix": 3
+ }
+ }
+ ]
+ }
+ ],
+ "shapes": [
+ {
+ "ty": "gr",
+ "it": [
+ {
+ "d": 1,
+ "ty": "el",
+ "s": {
+ "a": 0,
+ "k": [
+ 430,
+ 430
+ ],
+ "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.682352941176,
+ 0.796078431373,
+ 0.980392156863,
+ 1
+ ],
+ "ix": 3
+ },
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 4
+ },
+ "w": {
+ "a": 0,
+ "k": 0,
+ "ix": 5
+ },
+ "lc": 1,
+ "lj": 1,
+ "ml": 4,
+ "bm": 0,
+ "nm": "Stroke 1",
+ "mn": "ADBE Vector Graphic - Stroke",
+ "hd": false
+ },
+ {
+ "ty": "gf",
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 10
+ },
+ "r": 1,
+ "bm": 0,
+ "g": {
+ "p": 3,
+ "k": {
+ "a": 0,
+ "k": [
+ 0,
+ 1,
+ 1,
+ 1,
+ 0.5,
+ 0.805,
+ 0.805,
+ 0.805,
+ 1,
+ 0.61,
+ 0.61,
+ 0.61
+ ],
+ "ix": 9
+ }
+ },
+ "s": {
+ "a": 0,
+ "k": [
+ 0,
+ 0
+ ],
+ "ix": 5
+ },
+ "e": {
+ "a": 0,
+ "k": [
+ 300.822,
+ 0
+ ],
+ "ix": 6
+ },
+ "t": 2,
+ "h": {
+ "a": 0,
+ "k": 0,
+ "ix": 7
+ },
+ "a": {
+ "a": 0,
+ "k": 0,
+ "ix": 8
+ },
+ "nm": "Gradient Fill 1",
+ "mn": "ADBE Vector Graphic - G-Fill",
+ "hd": false
+ },
+ {
+ "ty": "tr",
+ "p": {
+ "a": 0,
+ "k": [
+ -13.09,
+ 1270.41
+ ],
+ "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": 72.5,
+ "op": 2572.5,
+ "st": 105,
+ "bm": 0
+ },
+ {
+ "ddd": 0,
+ "ind": 18,
+ "ty": 4,
+ "nm": "Finger_Circle",
+ "parent": 5,
+ "sr": 1,
+ "ks": {
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 11
+ },
+ "r": {
+ "a": 0,
+ "k": 0,
+ "ix": 10
+ },
+ "p": {
+ "a": 0,
+ "k": [
+ -11.429,
+ -617.143,
+ 0
+ ],
+ "ix": 2,
+ "l": 2
+ },
+ "a": {
+ "a": 0,
+ "k": [
+ 0,
+ 0,
+ 0
+ ],
+ "ix": 1,
+ "l": 2
+ },
+ "s": {
+ "a": 0,
+ "k": [
+ 95.238,
+ 95.238,
+ 100
+ ],
+ "ix": 6,
+ "l": 2
+ }
+ },
+ "ao": 0,
+ "shapes": [
+ {
+ "ty": "gr",
+ "it": [
+ {
+ "d": 1,
+ "ty": "el",
+ "s": {
+ "a": 0,
+ "k": [
+ 452.344,
+ 452.344
+ ],
+ "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.590962009804,
+ 0.746925982307,
+ 1,
+ 1
+ ],
+ "ix": 3
+ },
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 4
+ },
+ "w": {
+ "a": 0,
+ "k": 0,
+ "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": [
+ 0.712009803922,
+ 0.817606129366,
+ 1,
+ 1
+ ],
+ "ix": 4
+ },
+ "o": {
+ "a": 0,
+ "k": 71,
+ "ix": 5
+ },
+ "r": 1,
+ "bm": 0,
+ "nm": "Fill 1",
+ "mn": "ADBE Vector Graphic - Fill",
+ "hd": false
+ },
+ {
+ "ty": "tr",
+ "p": {
+ "a": 0,
+ "k": [
+ 13.871,
+ 635.457
+ ],
+ "ix": 2
+ },
+ "a": {
+ "a": 0,
+ "k": [
+ 0,
+ 0
+ ],
+ "ix": 1
+ },
+ "s": {
+ "a": 0,
+ "k": [
+ 102.789,
+ 102.789
+ ],
+ "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": 2400,
+ "st": 0,
+ "bm": 0
+ }
+ ],
+ "markers": [
+ {
+ "tm": 0,
+ "cm": "0",
+ "dr": 0
+ },
+ {
+ "tm": 292.5,
+ "cm": "2",
+ "dr": 0
+ },
+ {
+ "tm": 600,
+ "cm": "3",
+ "dr": 0
+ }
+ ]
+}
\ No newline at end of file
diff --git a/res/values-sw600dp/dimens.xml b/res/values-sw600dp/dimens.xml
index 241471c..45c28dd 100755
--- a/res/values-sw600dp/dimens.xml
+++ b/res/values-sw600dp/dimens.xml
@@ -66,4 +66,6 @@
<!-- Padding for screen pinning -->
<dimen name="screen_pinning_padding_start">40dp</dimen>
<dimen name="screen_pinning_padding_end">40dp</dimen>
+
+ <dimen name="settings_panel_width">560dp</dimen>
</resources>
diff --git a/res/values/arrays.xml b/res/values/arrays.xml
index 97c6a54..0fe13fe 100644
--- a/res/values/arrays.xml
+++ b/res/values/arrays.xml
@@ -1536,17 +1536,6 @@
<item>@string/enhanced_4g_lte_mode_summary_4g_calling</item>
</string-array>
- <!-- An allowlist which packages won't show summary in battery usage screen.
- [CHAR LIMIT=NONE] -->
- <string-array name="allowlist_hide_summary_in_battery_usage" translatable="false">
- </string-array>
-
- <!-- An allowlist which packages won't show entry in battery usage screen.
- [CHAR LIMIT=NONE] -->
- <string-array name="allowlist_hide_entry_in_battery_usage" translatable="false">
- <item>"com.google.android.gms.persistent"</item>
- </string-array>
-
<!-- Array of titles palette list for accessibility. -->
<string-array name="setting_palette_data" translatable="false" >
<item>@string/color_red</item>
diff --git a/res/values/attrs.xml b/res/values/attrs.xml
index 573d906..579ac35 100644
--- a/res/values/attrs.xml
+++ b/res/values/attrs.xml
@@ -72,6 +72,8 @@
<attr name="unavailableSliceSubtitle" format="string" />
<!-- Whether or not the preference is for work profile, by default it's false. -->
<attr name="forWork" format="boolean" />
+ <!-- Identifier for highlighting the menu preference on 2-pane -->
+ <attr name="highlightableMenuKey" format="string" />
</declare-styleable>
<declare-styleable name="PreferenceScreen">
diff --git a/res/values/config.xml b/res/values/config.xml
index 9ed7536..5411264 100755
--- a/res/values/config.xml
+++ b/res/values/config.xml
@@ -269,6 +269,9 @@
<!-- ComponentName to launch a vendor-specific enrollment activity if available -->
<string name="config_face_enroll" translatable="false"></string>
+ <!-- Whether to show the "less secure" info section on the face enroll intro screen -->
+ <bool name="config_face_intro_show_less_secure">false</bool>
+
<!-- Whether to show the "require eyes" info section on the face enroll intro screen -->
<bool name="config_face_intro_show_require_eyes">true</bool>
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index 7a75883..2cd944a 100755
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -426,6 +426,7 @@
<!-- Settings panel related dimensions -->
<dimen name="settings_panel_corner_radius">28dp</dimen>
<dimen name="settings_panel_title_margin">24dp</dimen>
+ <dimen name="settings_panel_width">@dimen/match_parent</dimen>
<!-- Text padding for EmptyTextSettings -->
<dimen name="empty_text_padding">24dp</dimen>
diff --git a/res/values/menu_keys.xml b/res/values/menu_keys.xml
new file mode 100755
index 0000000..e69664a
--- /dev/null
+++ b/res/values/menu_keys.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2021 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 xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+
+ <string name="menu_key_network" translatable="false">top_level_network</string>
+ <string name="menu_key_connected_devices" translatable="false">top_level_connected_devices</string>
+ <string name="menu_key_apps" translatable="false">top_level_apps</string>
+ <string name="menu_key_notifications" translatable="false">top_level_notifications</string>
+ <string name="menu_key_battery" translatable="false">top_level_battery</string>
+ <string name="menu_key_storage" translatable="false">top_level_storage</string>
+ <string name="menu_key_sound" translatable="false">top_level_sound</string>
+ <string name="menu_key_display" translatable="false">top_level_display</string>
+ <string name="menu_key_wallpaper" translatable="false">top_level_wallpaper</string>
+ <string name="menu_key_accessibility" translatable="false">top_level_accessibility</string>
+ <string name="menu_key_security" translatable="false">top_level_security</string>
+ <string name="menu_key_privacy" translatable="false">top_level_privacy</string>
+ <string name="menu_key_location" translatable="false">top_level_location</string>
+ <string name="menu_key_emergency" translatable="false">top_level_emergency</string>
+ <string name="menu_key_accounts" translatable="false">top_level_accounts</string>
+ <string name="menu_key_system" translatable="false">top_level_system</string>
+ <string name="menu_key_about_device" translatable="false">top_level_about_device</string>
+ <string name="menu_key_support" translatable="false">top_level_support</string>
+
+</resources>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 3a7de39..4bb7446 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -793,6 +793,8 @@
<string name="security_settings_face_enroll_introduction_info_looking"></string>
<!-- Message on the face enrollment introduction page that provides information about what could cause the phone to unlock when asking for parental consent. [CHAR LIMIT=NONE] -->
<string name="security_settings_face_enroll_introduction_info_consent_looking"></string>
+ <!-- Message on the face enrollment introduction page that provides information about the relative security of face for unlocking the phone. [CHAR LIMIT=NONE] -->
+ <string name="security_settings_face_enroll_introduction_info_less_secure"></string>
<!-- Message on the face enrollment introduction page that provides information about how to require eyes to be open for Face Unlock. [CHAR LIMIT=NONE] -->
<string name="security_settings_face_enroll_introduction_info_gaze"></string>
<!-- Message on the face enrollment introduction page that provides information about how to require eyes to be open for Face Unlock when asking for parental consent. [CHAR LIMIT=NONE] -->
@@ -5202,7 +5204,7 @@
<string name="allow_bind_app_widget_activity_allow_bind_title">Create widget and allow access?</string>
<!-- Message in dialog that pops up when an app requests permission to bind a widget [CHAR LIMIT=NONE] -->
- <string name="allow_bind_app_widget_activity_allow_bind">After you create the widget, <xliff:g id="widget_host_name">%1$s</xliff:g> can access all data it displays.</string>
+ <string name="allow_bind_app_widget_activity_allow_bind">After you create the widget, the application can access everything displayed.\n\nApplication: <xliff:g id="widget_host_name">%1$s</xliff:g>\nWidget: <xliff:g id="widget_label">%2$s</xliff:g>\n</string>
<!-- Text for checkbox that pops up when an app requests permission to bind a widget [CHAR LIMIT=NONE] -->
<string name="allow_bind_app_widget_activity_always_allow_bind">Always allow <xliff:g id="widget_host_name">%1$s</xliff:g> to create widgets and access their data</string>
@@ -5270,8 +5272,18 @@
<string name="select_to_speak_summary">Tap items on your screen to hear them read aloud</string>
<!-- Title for the accessibility preference screen to enable video captioning. [CHAR LIMIT=35] -->
<string name="accessibility_captioning_title">Caption preferences</string>
+ <!-- Title for accessibility captioning footer. [CHAR LIMIT=60] -->
+ <string name="accessibility_captioning_about_title">About caption preferences</string>
+ <!-- Accessibility captioning footer link content description [CHAR LIMIT=NONE] -->
+ <string name="accessibility_captioning_footer_learn_more_content_description">Learn more about caption preferences</string>
<!-- Title for the accessibility preference screen to enable screen magnification. [CHAR LIMIT=35] -->
<string name="accessibility_screen_magnification_title">Magnification</string>
+ <!-- Title for accessibility shortcut preference for magnification. [CHAR LIMIT=60] -->
+ <string name="accessibility_screen_magnification_shortcut_title">Magnification shortcut</string>
+ <!-- Title for screen magnification footer. [CHAR LIMIT=60] -->
+ <string name="accessibility_screen_magnification_about_title">About magnification</string>
+ <!-- Screen magnification footer link content description [CHAR LIMIT=NONE] -->
+ <string name="accessibility_screen_magnification_footer_learn_more_content_description">Learn more about magnification</string>
<!-- Title for the accessibility preference screen to edit magnification area. [CHAR LIMIT=35] -->
<string name="accessibility_magnification_mode_title">Magnification type</string>
<!-- Message for the accessibility preference screen to edit magnification area dialog. [CHAR LIMIT=none] -->
@@ -5422,14 +5434,20 @@
<string name="accessibility_button_title">Accessibility button</string>
<!-- Title for the accessibility button & gesture page. [CHAR LIMIT=35] -->
<string name="accessibility_button_gesture_title">Accessibility button & gesture</string>
+ <!-- Title for the accessibility button footer. [CHAR LIMIT=35] -->
+ <string name="accessibility_button_about_title">About accessibility button</string>
+ <!-- Title for the accessibility button & gesture footer. [CHAR LIMIT=55] -->
+ <string name="accessibility_button_gesture_about_title">About accessibility button & gesture</string>
+ <!-- Accessibility button & gestures footer link content description [CHAR LIMIT=NONE] -->
+ <string name="accessibility_button_gesture_footer_learn_more_content_description">Learn more about accessibility button & gesture</string>
<!-- Intro for the accessibility button page. [CHAR LIMIT=100] -->
<string name="accessibility_button_intro">Using the accessibility button. The gesture isn\u2019t available with 3-button navigation.</string>
<!-- Summary text for the accessibility button preference. [CHAR LIMIT=50] -->
<string name="accessibility_button_summary">Quickly access accessibility features</string>
<!-- Description for the accessibility button in gesture navigation. Explain how this page works. [CHAR LIMIT=NONE] -->
- <string name="accessibility_button_gesture_description">Quickly access accessibility features from any screen.\n\nTo get started, go to accessibility settings and select a feature. Tap on the shortcut and select the accessibility button.\n\nTo use the accessibility button in the navigation bar instead, switch to 2-button navigation or 3-button navigation.</string>
+ <string name="accessibility_button_gesture_description">Quickly access accessibility features from any screen.\n\nTo get started, go to accessibility settings and select a feature. Tap on the shortcut and select the accessibility button or gesture.</string>
<!-- Description for the accessibility button page. Explain how this page works. [CHAR LIMIT=NONE] -->
- <string name="accessibility_button_description">Quickly access accessibility features from any screen. \n\nTo get started, go to accessibility settings and select a feature. Tap on the shortcut and select the accessibility button.</string>
+ <string name="accessibility_button_description">Quickly access accessibility features from any screen.\n\nTo get started, go to accessibility settings and select a feature. Tap on the shortcut and select the accessibility button.</string>
<!-- Title for the button or gesture of the accessibility button. [CHAR LIMIT=35] -->
<string name="accessibility_button_or_gesture_title">Use button or gesture</string>
<!-- Title for the location of the accessibility button. [CHAR LIMIT=35] -->
@@ -5483,6 +5501,10 @@
<string name="accessibility_timeout_2mins">2 minutes</string>
<!-- Title for accessibility settings timeout item. [CHAR LIMIT=43] -->
<string name="accessibility_setting_item_control_timeout_title">Time to take action (Accessibility timeout)</string>
+ <!-- Title for accessibility timeout footer. [CHAR LIMIT=65] -->
+ <string name="accessibility_control_timeout_about_title">About time to take action (Accessibility timeout)</string>
+ <!-- Accessibility timeout footer link content description [CHAR LIMIT=NONE] -->
+ <string name="accessibility_control_timeout_footer_learn_more_content_description">Learn more about time to take action (Accessibility timeout)</string>
<!-- Title for accessibility preference to accessibility timeout. [CHAR LIMIT=35] -->
<string name="accessibility_control_timeout_preference_title">Time to take action</string>
<!-- Descriptive text for accessibility preference to accessibility control timeout. [CHAR LIMIT=NONE] -->
@@ -5494,6 +5516,8 @@
<string name="accessibility_display_inversion_preference_title">Color inversion</string>
<!-- Used in the accessibility service settings to control turning display color inversion on/off entirely. [CHAR LIMIT=NONE] -->
<string name="accessibility_display_inversion_switch_title">Use color inversion</string>
+ <!-- Title for accessibility shortcut preference for color inversion. [CHAR LIMIT=60] -->
+ <string name="accessibility_display_inversion_shortcut_title">Color inversion shortcut</string>
<!-- Subtitle for the accessibility preference to configure display color inversion. [CHAR LIMIT=NONE] -->
<string name="accessibility_display_inversion_preference_subtitle">
<![CDATA[Color inversion turns light screens dark.<br/><br/>
@@ -5507,6 +5531,10 @@
</string>
<!-- Title for accessibility preference for configuring feature that performs click action soon after mouse/trackpad pointer stops moving. [CHAR LIMIT=NONE] -->
<string name="accessibility_autoclick_preference_title">Autoclick (dwell timing)</string>
+ <!-- Title for accessibility dwell timing footer. [CHAR LIMIT=NONE] -->
+ <string name="accessibility_autoclick_about_title">About autoclick (dwell timing)</string>
+ <!-- Accessibility dwell timing footer link content description [CHAR LIMIT=NONE] -->
+ <string name="accessibility_autoclick_footer_learn_more_content_description">Learn more about autoclick (dwell timing)</string>
<!-- Footer text to explain what autoclick does -->
<string name="accessibility_autoclick_description">Autoclick works with a connected mouse. You can set the mouse cursor to click automatically when the cursor stops moving for a certain amount of time.</string>
<!-- Option heading to leave the auto click requirement for accessibility users at its default level. [CHAR LIMIT=50] -->
@@ -5545,6 +5573,16 @@
<string name="accessibility_service_primary_open_title">Open <xliff:g id="accessibility_app_name" example="TalkBack">%1$s</xliff:g></string>
<!-- Used in the Color correction settings screen to control turning on/off the feature entirely [CHAR LIMIT=60] -->
<string name="accessibility_daltonizer_primary_switch_title">Use color correction</string>
+ <!-- Title for accessibility shortcut preference for color correction. [CHAR LIMIT=60] -->
+ <string name="accessibility_daltonizer_shortcut_title">Color correction shortcut</string>
+ <!-- Title for Color correction footer. [CHAR LIMIT=35] -->
+ <string name="accessibility_daltonizer_about_title">About color correction</string>
+ <!-- Color inversion footer link content description [CHAR LIMIT=NONE] -->
+ <string name="accessibility_daltonizer_footer_learn_more_content_description">Learn more about color correction</string>
+ <!-- Title for Color inversion footer. [CHAR LIMIT=35] -->
+ <string name="accessibility_color_inversion_about_title">About color inversion</string>
+ <!-- Color correction footer link content description [CHAR LIMIT=NONE] -->
+ <string name="accessibility_color_inversion_footer_learn_more_content_description">Learn more about color inversion</string>
<!-- Title for Captions settings screen to control turning on/off the feature entirely [CHAR LIMIT=60] -->
<string name="accessibility_caption_primary_switch_title">Show captions</string>
<!-- Summary for Captions settings screen to control turning on/off the feature entirely [CHAR LIMIT=NONE] -->
@@ -5624,6 +5662,10 @@
<string name="reduce_bright_colors_preference_title">Extra dim</string>
<!-- Title for the activation switch of the Reduce Brightness feature. [CHAR LIMIT=NONE] -->
<string name="reduce_bright_colors_switch_title">Make screen extra dim</string>
+ <!-- Title for accessibility shortcut preference for Reduce Brightness. [CHAR LIMIT=60] -->
+ <string name="reduce_bright_colors_shortcut_title">Extra dim shortcut</string>
+ <!-- Title for Reduce Brightness feature footer. [CHAR LIMIT=35] -->
+ <string name="reduce_bright_colors_about_title">About extra dim</string>
<!-- Summary for the accessibility preference to configure Reduce Brightness feature. [CHAR LIMIT=NONE] -->
<string name="reduce_bright_colors_preference_summary" product="default">Dim screen beyond your phone\u2019s minimum brightness</string>
<!-- Summary for the accessibility preference to configure Reduce Brightness feature. [CHAR LIMIT=NONE] -->
@@ -6119,7 +6161,7 @@
<!-- Activity title for battery usage history details [CHAR LIMIT=60] -->
<string name="history_details_title">History details</string>
<!-- Preference title for advanced battery usage [CHAR LIMIT=40] -->
- <string name="advanced_battery_preference_title">Battery Usage</string>
+ <string name="advanced_battery_preference_title">Battery usage</string>
<!-- Preference summary for advanced battery usage, for past 24 hours [CHAR LIMIT=40] -->
<string name="advanced_battery_preference_summary_with_hours">View usage for past 24 hours</string>
<!-- Preference summary for advanced battery usage, from last full charge [CHAR LIMIT=40] -->
@@ -8454,6 +8496,9 @@
<!-- Sound: Title for the other sounds option and associated settings page. [CHAR LIMIT=30] -->
<string name="other_sound_settings">Other sounds</string>
+ <!-- Sound: Title for the option enabling spatializer effect. [CHAR LIMIT=30] -->
+ <string name="spatial_audio_title">Spatial audio</string>
+
<!-- Sound: Other sounds: Title for the option enabling touch sounds for dial pad tones. [CHAR LIMIT=30] -->
<string name="dial_pad_tones_title">Dial pad tones</string>
@@ -11779,6 +11824,8 @@
<string name="one_handed_title">One-handed mode</string>
<!-- Preference Switch for enabling one handed [CHAR LIMIT=60] -->
<string name="one_handed_mode_enabled">Use one-handed mode</string>
+ <!-- Title for accessibility shortcut preference for enabling one handed. [CHAR LIMIT=60] -->
+ <string name="one_handed_mode_shortcut_title">One-handed mode shortcut</string>
<!-- Search keywords for "One-Handed" settings [CHAR_LIMIT=NONE] -->
<string name="keywords_one_handed">reachability</string>
<!-- Category title for one handed swipe down [CHAR_LIMIT=60] -->
diff --git a/res/xml/accessibility_button_settings.xml b/res/xml/accessibility_button_settings.xml
index 02b1c7d..86dd087 100644
--- a/res/xml/accessibility_button_settings.xml
+++ b/res/xml/accessibility_button_settings.xml
@@ -16,13 +16,10 @@
<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:settings="http://schemas.android.com/apk/res-auto"
- android:title="@string/accessibility_button_title">
+ xmlns:settings="http://schemas.android.com/apk/res-auto">
- <com.android.settingslib.widget.LayoutPreference
- android:key="caption_preview"
- android:title="@string/summary_placeholder"
- android:layout="@layout/accessibility_button_preview"
+ <com.android.settingslib.widget.IllustrationPreference
+ android:key="accessibility_button_preview"
android:selectable="false"
settings:searchable="false"
android:persistent="false"
@@ -38,6 +35,15 @@
settings:controller="com.android.settings.accessibility.AccessibilityButtonLocationPreferenceController"/>
<ListPreference
+ android:entries="@array/accessibility_button_gesture_selector_titles"
+ android:entryValues="@array/accessibility_button_gesture_selector_values"
+ android:key="accessibility_button_or_gesture"
+ android:title="@string/accessibility_button_or_gesture_title"
+ android:summary="%s"
+ android:persistent="false"
+ settings:controller="com.android.settings.accessibility.AccessibilityButtonGesturePreferenceController"/>
+
+ <ListPreference
android:entries="@array/accessibility_button_size_selector_titles"
android:entryValues="@array/accessibility_button_size_selector_values"
android:key="accessibility_button_size"
@@ -61,7 +67,6 @@
<com.android.settings.accessibility.AccessibilityFooterPreference
android:key="accessibility_button_footer"
- android:title="@string/accessibility_button_description"
android:persistent="false"
android:selectable="false"
settings:searchable="false"
diff --git a/res/xml/accessibility_shortcuts_settings.xml b/res/xml/accessibility_shortcuts_settings.xml
index 465f96d..2863335 100644
--- a/res/xml/accessibility_shortcuts_settings.xml
+++ b/res/xml/accessibility_shortcuts_settings.xml
@@ -25,8 +25,8 @@
android:fragment="com.android.settings.accessibility.AccessibilityButtonFragment"
android:key="accessibility_button_preference"
android:persistent="false"
- android:title="@string/accessibility_button_title"
- android:summary="@string/accessibility_button_summary"/>
+ android:summary="@string/accessibility_button_summary"
+ settings:controller="com.android.settings.accessibility.AccessibilityButtonPreferenceController"/>
<SwitchPreference
android:key="accessibility_shortcut_preference"
diff --git a/res/xml/captioning_settings.xml b/res/xml/captioning_settings.xml
index b397146..f5059e5 100644
--- a/res/xml/captioning_settings.xml
+++ b/res/xml/captioning_settings.xml
@@ -21,12 +21,11 @@
android:persistent="false"
android:title="@string/accessibility_captioning_title">
- <com.android.settingslib.widget.LayoutPreference
+ <com.android.settingslib.widget.IllustrationPreference
android:key="captions_preview"
- android:layout="@layout/accessibility_captions_preview"
android:persistent="false"
android:selectable="false"
- android:title="@string/summary_placeholder"
+ settings:lottie_rawRes="@drawable/accessibility_captions_banner"
settings:searchable="false" />
<com.android.settings.widget.SettingsMainSwitchPreference
diff --git a/res/xml/sound_settings.xml b/res/xml/sound_settings.xml
index 56632a5..e30f139 100644
--- a/res/xml/sound_settings.xml
+++ b/res/xml/sound_settings.xml
@@ -154,6 +154,13 @@
android:ringtoneType="alarm"
android:order="-60"/>
+ <!-- Spatial audio -->
+ <SwitchPreference
+ android:key="spatial_audio"
+ android:title="@string/spatial_audio_title"
+ android:order="-55"
+ settings:controller="com.android.settings.notification.SpatialAudioPreferenceController"/>
+
<!-- Dial pad tones -->
<SwitchPreference
android:key="dial_pad_tones"
diff --git a/res/xml/top_level_settings.xml b/res/xml/top_level_settings.xml
index 1b949e9..e2cb173 100644
--- a/res/xml/top_level_settings.xml
+++ b/res/xml/top_level_settings.xml
@@ -27,6 +27,7 @@
android:order="-150"
android:title="@string/network_dashboard_title"
android:summary="@string/summary_placeholder"
+ settings:highlightableMenuKey="@string/menu_key_network"
settings:controller="com.android.settings.network.TopLevelNetworkEntryPreferenceController"/>
<Preference
@@ -36,6 +37,7 @@
android:order="-140"
android:title="@string/connected_devices_dashboard_title"
android:summary="@string/connected_devices_dashboard_default_summary"
+ settings:highlightableMenuKey="@string/menu_key_connected_devices"
settings:controller="com.android.settings.connecteddevice.TopLevelConnectedDevicesPreferenceController"/>
<Preference
@@ -44,15 +46,17 @@
android:key="top_level_apps"
android:order="-130"
android:title="@string/apps_dashboard_title"
- android:summary="@string/app_and_notification_dashboard_summary"/>
+ android:summary="@string/app_and_notification_dashboard_summary"
+ settings:highlightableMenuKey="@string/menu_key_apps"/>
<Preference
android:fragment="com.android.settings.notification.ConfigureNotificationSettings"
android:icon="@drawable/ic_notifications"
- android:key="top_level_notification"
+ android:key="top_level_notifications"
android:order="-120"
android:title="@string/configure_notification_settings"
- android:summary="@string/notification_dashboard_summary"/>
+ android:summary="@string/notification_dashboard_summary"
+ settings:highlightableMenuKey="@string/menu_key_notifications"/>
<Preference
android:fragment="com.android.settings.fuelgauge.PowerUsageSummary"
@@ -61,6 +65,7 @@
android:order="-110"
android:title="@string/power_usage_summary_title"
android:summary="@string/summary_placeholder"
+ settings:highlightableMenuKey="@string/menu_key_battery"
settings:controller="com.android.settings.fuelgauge.TopLevelBatteryPreferenceController"/>
<Preference
@@ -70,6 +75,7 @@
android:order="-100"
android:title="@string/storage_settings"
android:summary="@string/summary_placeholder"
+ settings:highlightableMenuKey="@string/menu_key_storage"
settings:controller="com.android.settings.deviceinfo.TopLevelStoragePreferenceController"/>
<Preference
@@ -78,7 +84,8 @@
android:key="top_level_sound"
android:order="-90"
android:title="@string/sound_settings"
- android:summary="@string/sound_dashboard_summary"/>
+ android:summary="@string/sound_dashboard_summary"
+ settings:highlightableMenuKey="@string/menu_key_sound"/>
<Preference
android:fragment="com.android.settings.DisplaySettings"
@@ -87,6 +94,7 @@
android:order="-80"
android:title="@string/display_settings"
android:summary="@string/display_dashboard_summary"
+ settings:highlightableMenuKey="@string/menu_key_display"
settings:controller="com.android.settings.display.TopLevelDisplayPreferenceController"/>
<com.android.settingslib.RestrictedTopLevelPreference
@@ -95,6 +103,7 @@
android:order="-70"
android:title="@string/wallpaper_settings_title"
android:summary="@string/wallpaper_dashboard_summary"
+ settings:highlightableMenuKey="@string/menu_key_wallpaper"
settings:controller="com.android.settings.display.TopLevelWallpaperPreferenceController"/>
<Preference
@@ -104,6 +113,7 @@
android:order="-60"
android:title="@string/accessibility_settings"
android:summary="@string/accessibility_settings_summary"
+ settings:highlightableMenuKey="@string/menu_key_accessibility"
settings:controller="com.android.settings.accessibility.TopLevelAccessibilityPreferenceController"/>
<Preference
@@ -113,6 +123,7 @@
android:order="-50"
android:title="@string/security_settings_title"
android:summary="@string/security_dashboard_summary"
+ settings:highlightableMenuKey="@string/menu_key_security"
settings:controller="com.android.settings.security.TopLevelSecurityEntryPreferenceController"/>
<Preference
@@ -121,7 +132,8 @@
android:key="top_level_privacy"
android:order="-40"
android:title="@string/privacy_dashboard_title"
- android:summary="@string/privacy_dashboard_summary"/>
+ android:summary="@string/privacy_dashboard_summary"
+ settings:highlightableMenuKey="@string/menu_key_privacy"/>
<Preference
android:fragment="com.android.settings.location.LocationSettings"
@@ -130,6 +142,7 @@
android:order="-30"
android:title="@string/location_settings_title"
android:summary="@string/location_settings_loading_app_permission_stats"
+ settings:highlightableMenuKey="@string/menu_key_location"
settings:controller="com.android.settings.location.TopLevelLocationPreferenceController"/>
<Preference
@@ -138,7 +151,8 @@
android:summary="@string/emergency_dashboard_summary"
android:icon="@drawable/ic_settings_emergency"
android:order="-20"
- android:fragment="com.android.settings.emergency.EmergencyDashboardFragment"/>
+ android:fragment="com.android.settings.emergency.EmergencyDashboardFragment"
+ settings:highlightableMenuKey="@string/menu_key_emergency"/>
<Preference
android:fragment="com.android.settings.accounts.AccountDashboardFragment"
@@ -147,6 +161,7 @@
android:order="-10"
android:title="@string/account_dashboard_title"
android:summary="@string/summary_placeholder"
+ settings:highlightableMenuKey="@string/menu_key_accounts"
settings:controller="com.android.settings.accounts.TopLevelAccountEntryPreferenceController"/>
<Preference
@@ -155,7 +170,8 @@
android:key="top_level_system"
android:order="10"
android:title="@string/header_category_system"
- android:summary="@string/system_dashboard_summary"/>
+ android:summary="@string/system_dashboard_summary"
+ settings:highlightableMenuKey="@string/menu_key_system"/>
<Preference
android:fragment="com.android.settings.deviceinfo.aboutphone.MyDeviceInfoFragment"
@@ -164,6 +180,7 @@
android:order="20"
android:title="@string/about_settings"
android:summary="@string/summary_placeholder"
+ settings:highlightableMenuKey="@string/menu_key_about_device"
settings:controller="com.android.settings.deviceinfo.aboutphone.TopLevelAboutDevicePreferenceController"/>
<Preference
@@ -172,6 +189,7 @@
android:order="100"
android:title="@string/page_tab_title_support"
android:summary="@string/support_summary"
+ settings:highlightableMenuKey="@string/menu_key_support"
settings:controller="com.android.settings.support.SupportPreferenceController"/>
</PreferenceScreen>
diff --git a/src/com/android/settings/AllowBindAppWidgetActivity.java b/src/com/android/settings/AllowBindAppWidgetActivity.java
index e7f7a6a..0272c83 100644
--- a/src/com/android/settings/AllowBindAppWidgetActivity.java
+++ b/src/com/android/settings/AllowBindAppWidgetActivity.java
@@ -19,6 +19,7 @@
import static android.view.WindowManager.LayoutParams.SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS;
import android.appwidget.AppWidgetManager;
+import android.appwidget.AppWidgetProviderInfo;
import android.content.ComponentName;
import android.content.Context;
import android.content.DialogInterface;
@@ -122,9 +123,12 @@
return;
}
}
+ mAppWidgetManager = AppWidgetManager.getInstance(this);
+ final String widgetLabel = getWidgetLabel();
AlertController.AlertParams ap = mAlertParams;
ap.mTitle = getString(R.string.allow_bind_app_widget_activity_allow_bind_title);
- ap.mMessage = getString(R.string.allow_bind_app_widget_activity_allow_bind, label);
+ ap.mMessage = getString(R.string.allow_bind_app_widget_activity_allow_bind, label,
+ widgetLabel);
ap.mPositiveButtonText = getString(R.string.create);
ap.mNegativeButtonText = getString(android.R.string.cancel);
ap.mPositiveButtonListener = this;
@@ -133,18 +137,30 @@
(LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
ap.mView = inflater.inflate(com.android.internal.R.layout.always_use_checkbox, null);
mAlwaysUse = (CheckBox) ap.mView.findViewById(com.android.internal.R.id.alwaysUse);
- mAlwaysUse.setText(getString(R.string.allow_bind_app_widget_activity_always_allow_bind, label));
+ mAlwaysUse.setText(
+ getString(R.string.allow_bind_app_widget_activity_always_allow_bind, label));
mAlwaysUse.setPadding(mAlwaysUse.getPaddingLeft(),
mAlwaysUse.getPaddingTop(),
mAlwaysUse.getPaddingRight(),
(int) (mAlwaysUse.getPaddingBottom() +
- getResources().getDimension(R.dimen.bind_app_widget_dialog_checkbox_bottom_padding)));
+ getResources().getDimension(
+ R.dimen.bind_app_widget_dialog_checkbox_bottom_padding)));
- mAppWidgetManager = AppWidgetManager.getInstance(this);
mAlwaysUse.setChecked(mAppWidgetManager.hasBindAppWidgetPermission(mCallingPackage,
mProfile.getIdentifier()));
setupAlert();
}
+
+ private String getWidgetLabel() {
+ String label = "";
+ for (AppWidgetProviderInfo providerInfo : mAppWidgetManager.getInstalledProviders()) {
+ if (providerInfo.provider.equals(mComponentName)) {
+ label = providerInfo.loadLabel(getPackageManager());
+ break;
+ }
+ }
+ return label;
+ }
}
diff --git a/src/com/android/settings/SettingsActivity.java b/src/com/android/settings/SettingsActivity.java
index f3cdd6c..dc5d68f 100644
--- a/src/com/android/settings/SettingsActivity.java
+++ b/src/com/android/settings/SettingsActivity.java
@@ -58,6 +58,8 @@
import com.android.settings.core.SubSettingLauncher;
import com.android.settings.core.gateway.SettingsGateway;
import com.android.settings.dashboard.DashboardFeatureProvider;
+import com.android.settings.activityembedding.ActivityEmbeddingUtils;
+import com.android.settings.homepage.SettingsHomepageActivity;
import com.android.settings.homepage.TopLevelSettings;
import com.android.settings.overlay.FeatureFactory;
import com.android.settings.wfd.WifiDisplaySettings;
@@ -231,6 +233,12 @@
protected void onCreate(Bundle savedState) {
super.onCreate(savedState);
Log.d(LOG_TAG, "Starting onCreate");
+
+ if (launchHomepageForTwonPaneDeepLink()) {
+ finish();
+ return;
+ }
+
long startTime = System.currentTimeMillis();
final FeatureFactory factory = FeatureFactory.getFactory(this);
@@ -248,17 +256,11 @@
// Getting Intent properties can only be done after the super.onCreate(...)
final String initialFragmentName = getInitialFragmentName(intent);
- // This is a "Sub Settings" when:
- // - this is a real SubSettings
- // - or :settings:show_fragment_as_subsetting is passed to the Intent
- final boolean isSubSettings = this instanceof SubSettings ||
- intent.getBooleanExtra(EXTRA_SHOW_FRAGMENT_AS_SUBSETTING, false);
-
// If this is a sub settings, then apply the SubSettings Theme for the ActionBar content
// insets.
// If this is in setup flow, don't apply theme. Because light theme needs to be applied
// in SettingsBaseActivity#onCreate().
- if (isSubSettings && !WizardManagerHelper.isAnySetupWizard(getIntent())) {
+ if (isSubSettings(intent) && !WizardManagerHelper.isAnySetupWizard(getIntent())) {
setTheme(R.style.Theme_SubSettings);
}
@@ -347,6 +349,47 @@
}
}
+ private boolean isSubSettings(Intent intent) {
+ return this instanceof SubSettings ||
+ intent.getBooleanExtra(EXTRA_SHOW_FRAGMENT_AS_SUBSETTING, false);
+ }
+
+ /** Returns true if the Activity is started by a deep link intent for large screen devices. */
+ private boolean launchHomepageForTwonPaneDeepLink() {
+ if (!ActivityEmbeddingUtils.isEmbeddingActivityEnabled(this)) {
+ return false;
+ }
+
+ final Intent intent = getIntent();
+ // Only starts trampoline for deep links. Should return false for all the cases that
+ // Settings app starts SettingsActivity or SubSetting by itself.
+ if (intent.getAction() == null) {
+ // Other apps should send deep link intent which matches intent filter of the Activity.
+ return false;
+ }
+
+ if (isSubSettings(intent)) {
+ return false;
+ }
+
+ if (intent.getBooleanExtra(SettingsHomepageActivity.EXTRA_IS_FROM_SETTINGS_HOMEPAGE,
+ /* defaultValue */ false)) {
+ return false;
+ }
+
+ // It's a deep link intent, SettingsHomepageActivity will set SplitPairRule and start it.
+ final Intent trampolineIntent =
+ new Intent(android.provider.Settings.ACTION_SETTINGS_LARGE_SCREEN_DEEP_LINK);
+ trampolineIntent.replaceExtras(intent);
+ trampolineIntent.putExtra(
+ android.provider.Settings.EXTRA_SETTINGS_LARGE_SCREEN_DEEP_LINK_INTENT_URI,
+ intent.toUri(Intent.URI_INTENT_SCHEME));
+ trampolineIntent.addFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT);
+ startActivity(trampolineIntent);
+
+ return true;
+ }
+
/** Returns the initial fragment name that the activity will launch. */
@VisibleForTesting
public String getInitialFragmentName(Intent intent) {
diff --git a/src/com/android/settings/SettingsApplication.java b/src/com/android/settings/SettingsApplication.java
new file mode 100644
index 0000000..7aa5af8
--- /dev/null
+++ b/src/com/android/settings/SettingsApplication.java
@@ -0,0 +1,34 @@
+/*
+ * Copyright (C) 2021 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;
+
+import android.app.Application;
+
+import com.android.settings.activityembedding.ActivityEmbeddingRulesController;
+
+/** Settings application which sets up activity embedding rules for the large screen device. */
+public class SettingsApplication extends Application {
+
+ @Override
+ public void onCreate() {
+ super.onCreate();
+
+ final ActivityEmbeddingRulesController controller =
+ new ActivityEmbeddingRulesController(this);
+ controller.initRules();
+ }
+}
diff --git a/src/com/android/settings/SettingsTutorialDialogWrapperActivity.java b/src/com/android/settings/SettingsTutorialDialogWrapperActivity.java
deleted file mode 100644
index 50b966f..0000000
--- a/src/com/android/settings/SettingsTutorialDialogWrapperActivity.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Copyright (C) 2019 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;
-
-import android.app.Activity;
-import android.os.Bundle;
-
-import com.android.settings.accessibility.AccessibilityGestureNavigationTutorial;
-import com.android.settings.R;
-
-/**
- * This activity is to create the tutorial dialog in gesture navigation settings since we couldn't
- * use the dialog utils because SystemNavigationGestureSettings extends RadioButtonPickerFragment,
- * not SettingsPreferenceFragment.
- */
-public class SettingsTutorialDialogWrapperActivity extends Activity {
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- showDialog();
- }
-
- private void showDialog() {
- AccessibilityGestureNavigationTutorial
- .showGestureNavigationSettingsTutorialDialog(this, dialog -> finish());
- }
-}
diff --git a/src/com/android/settings/Utils.java b/src/com/android/settings/Utils.java
index e79852b..72bfa11 100644
--- a/src/com/android/settings/Utils.java
+++ b/src/com/android/settings/Utils.java
@@ -1013,7 +1013,8 @@
Drawable safeIcon = icon;
if ((icon != null) && !(icon instanceof VectorDrawable)) {
- safeIcon = getSafeDrawable(icon, 500, 500);
+ safeIcon = getSafeDrawable(icon,
+ /* MAX_DRAWABLE_SIZE */ 600, /* MAX_DRAWABLE_SIZE */ 600);
}
return safeIcon;
diff --git a/src/com/android/settings/accessibility/AccessibilityButtonFooterPreferenceController.java b/src/com/android/settings/accessibility/AccessibilityButtonFooterPreferenceController.java
index de90374..55b8019 100644
--- a/src/com/android/settings/accessibility/AccessibilityButtonFooterPreferenceController.java
+++ b/src/com/android/settings/accessibility/AccessibilityButtonFooterPreferenceController.java
@@ -33,21 +33,26 @@
}
@Override
- protected String getLabelName() {
- return mContext.getString(R.string.accessibility_button_title);
+ protected String getLearnMoreContentDescription() {
+ return mContext.getString(
+ R.string.accessibility_button_gesture_footer_learn_more_content_description);
+ }
+
+ @Override
+ protected String getIntroductionTitle() {
+ return mContext.getString(R.string.accessibility_button_about_title);
}
@Override
public void displayPreference(PreferenceScreen screen) {
// Need to update footerPreference's data before super.displayPreference(), then it will use
// data to update related property of footerPreference.
- if (AccessibilityUtil.isGestureNavigateEnabled(mContext)) {
- final AccessibilityFooterPreference footerPreference =
- screen.findPreference(getPreferenceKey());
- footerPreference.setTitle(
- mContext.getString(R.string.accessibility_button_gesture_description));
- }
-
+ final int titleResource = AccessibilityUtil.isGestureNavigateEnabled(mContext)
+ ? R.string.accessibility_button_gesture_description
+ : R.string.accessibility_button_description;
+ final AccessibilityFooterPreference footerPreference =
+ screen.findPreference(getPreferenceKey());
+ footerPreference.setTitle(titleResource);
super.displayPreference(screen);
}
}
diff --git a/src/com/android/settings/accessibility/AccessibilityButtonFragment.java b/src/com/android/settings/accessibility/AccessibilityButtonFragment.java
index 4e067d8..2df11a9 100644
--- a/src/com/android/settings/accessibility/AccessibilityButtonFragment.java
+++ b/src/com/android/settings/accessibility/AccessibilityButtonFragment.java
@@ -17,6 +17,7 @@
package com.android.settings.accessibility;
import android.app.settings.SettingsEnums;
+import android.os.Bundle;
import com.android.settings.R;
import com.android.settings.dashboard.DashboardFragment;
@@ -30,6 +31,14 @@
private static final String TAG = "AccessibilityButtonFragment";
@Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ final int titleResource = AccessibilityUtil.isGestureNavigateEnabled(getPrefContext())
+ ? R.string.accessibility_button_gesture_title : R.string.accessibility_button_title;
+ getActivity().setTitle(titleResource);
+ }
+
+ @Override
protected int getPreferenceScreenResId() {
return R.xml.accessibility_button_settings;
}
diff --git a/src/com/android/settings/accessibility/AccessibilityButtonGesturePreferenceController.java b/src/com/android/settings/accessibility/AccessibilityButtonGesturePreferenceController.java
new file mode 100644
index 0000000..e6b49d0
--- /dev/null
+++ b/src/com/android/settings/accessibility/AccessibilityButtonGesturePreferenceController.java
@@ -0,0 +1,82 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.accessibility;
+
+import android.content.Context;
+import android.provider.Settings;
+
+import androidx.preference.ListPreference;
+import androidx.preference.Preference;
+
+import com.android.settings.R;
+import com.android.settings.core.BasePreferenceController;
+
+import com.google.common.primitives.Ints;
+
+import java.util.Optional;
+
+/** Preference controller that controls the button or gesture in accessibility button page. */
+public class AccessibilityButtonGesturePreferenceController extends BasePreferenceController
+ implements Preference.OnPreferenceChangeListener {
+
+ private Optional<Integer> mDefaultGesture = Optional.empty();
+
+ public AccessibilityButtonGesturePreferenceController(Context context, String preferenceKey) {
+ super(context, preferenceKey);
+ }
+
+ @Override
+ public int getAvailabilityStatus() {
+ return AccessibilityUtil.isGestureNavigateEnabled(mContext)
+ ? AVAILABLE : CONDITIONALLY_UNAVAILABLE;
+ }
+
+ @Override
+ public boolean onPreferenceChange(Preference preference, Object newValue) {
+ final ListPreference listPreference = (ListPreference) preference;
+ final Integer value = Ints.tryParse((String) newValue);
+ if (value != null) {
+ Settings.Secure.putInt(mContext.getContentResolver(),
+ Settings.Secure.ACCESSIBILITY_BUTTON_MODE, value);
+ updateState(listPreference);
+ }
+ return true;
+ }
+
+ @Override
+ public void updateState(Preference preference) {
+ super.updateState(preference);
+ final ListPreference listPreference = (ListPreference) preference;
+
+ listPreference.setValue(getCurrentAccessibilityButtonMode());
+ }
+
+ private String getCurrentAccessibilityButtonMode() {
+ final int mode = Settings.Secure.getInt(mContext.getContentResolver(),
+ Settings.Secure.ACCESSIBILITY_BUTTON_MODE, getDefaultGestureValue());
+ return String.valueOf(mode);
+ }
+
+ private int getDefaultGestureValue() {
+ if (!mDefaultGesture.isPresent()) {
+ final String[] valuesList = mContext.getResources().getStringArray(
+ R.array.accessibility_button_gesture_selector_values);
+ mDefaultGesture = Optional.of(Integer.parseInt(valuesList[0]));
+ }
+ return mDefaultGesture.get();
+ }
+}
diff --git a/src/com/android/settings/accessibility/AccessibilityButtonLocationPreferenceController.java b/src/com/android/settings/accessibility/AccessibilityButtonLocationPreferenceController.java
index ed7cb27..167e08f 100644
--- a/src/com/android/settings/accessibility/AccessibilityButtonLocationPreferenceController.java
+++ b/src/com/android/settings/accessibility/AccessibilityButtonLocationPreferenceController.java
@@ -18,7 +18,6 @@
import android.content.Context;
import android.provider.Settings;
-import android.util.ArrayMap;
import androidx.preference.ListPreference;
import androidx.preference.Preference;
@@ -28,16 +27,16 @@
import com.google.common.primitives.Ints;
+import java.util.Optional;
+
/** Preference controller that controls the preferred location in accessibility button page. */
public class AccessibilityButtonLocationPreferenceController extends BasePreferenceController
implements Preference.OnPreferenceChangeListener {
- private final ArrayMap<String, String> mValueTitleMap = new ArrayMap<>();
- private int mDefaultLocation;
+ private Optional<Integer> mDefaultLocation = Optional.empty();
public AccessibilityButtonLocationPreferenceController(Context context, String preferenceKey) {
super(context, preferenceKey);
- initValueTitleMap();
}
@Override
@@ -68,22 +67,16 @@
private String getCurrentAccessibilityButtonMode() {
final int mode = Settings.Secure.getInt(mContext.getContentResolver(),
- Settings.Secure.ACCESSIBILITY_BUTTON_MODE, mDefaultLocation);
+ Settings.Secure.ACCESSIBILITY_BUTTON_MODE, getDefaultLocationValue());
return String.valueOf(mode);
}
- private void initValueTitleMap() {
- if (mValueTitleMap.size() == 0) {
- final String[] values = mContext.getResources().getStringArray(
+ private int getDefaultLocationValue() {
+ if (!mDefaultLocation.isPresent()) {
+ final String[] valuesList = mContext.getResources().getStringArray(
R.array.accessibility_button_location_selector_values);
- final String[] titles = mContext.getResources().getStringArray(
- R.array.accessibility_button_location_selector_titles);
- final int mapSize = values.length;
-
- mDefaultLocation = Integer.parseInt(values[0]);
- for (int i = 0; i < mapSize; i++) {
- mValueTitleMap.put(values[i], titles[i]);
- }
+ mDefaultLocation = Optional.of(Integer.parseInt(valuesList[0]));
}
+ return mDefaultLocation.get();
}
}
diff --git a/src/com/android/settings/accessibility/AccessibilityButtonPreferenceController.java b/src/com/android/settings/accessibility/AccessibilityButtonPreferenceController.java
new file mode 100644
index 0000000..f076472
--- /dev/null
+++ b/src/com/android/settings/accessibility/AccessibilityButtonPreferenceController.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.accessibility;
+
+import android.content.Context;
+
+import androidx.preference.Preference;
+import androidx.preference.PreferenceScreen;
+
+import com.android.settings.R;
+import com.android.settings.core.BasePreferenceController;
+
+/**
+ * Preference controller for accessibility button preference.
+ */
+public class AccessibilityButtonPreferenceController extends BasePreferenceController {
+
+ public AccessibilityButtonPreferenceController(Context context, String key) {
+ super(context, key);
+ }
+
+ @Override
+ public int getAvailabilityStatus() {
+ return AVAILABLE;
+ }
+
+ @Override
+ public void displayPreference(PreferenceScreen screen) {
+ super.displayPreference(screen);
+ final int titleResource = AccessibilityUtil.isGestureNavigateEnabled(mContext)
+ ? R.string.accessibility_button_gesture_title : R.string.accessibility_button_title;
+ final Preference preference = screen.findPreference(getPreferenceKey());
+ preference.setTitle(titleResource);
+
+ }
+}
diff --git a/src/com/android/settings/accessibility/AccessibilityButtonPreviewPreferenceController.java b/src/com/android/settings/accessibility/AccessibilityButtonPreviewPreferenceController.java
index 69a7a46..c9f3c43 100644
--- a/src/com/android/settings/accessibility/AccessibilityButtonPreviewPreferenceController.java
+++ b/src/com/android/settings/accessibility/AccessibilityButtonPreviewPreferenceController.java
@@ -23,7 +23,7 @@
import android.os.Handler;
import android.os.Looper;
import android.provider.Settings;
-import android.widget.ImageView;
+import android.view.accessibility.AccessibilityManager;
import androidx.annotation.VisibleForTesting;
import androidx.preference.PreferenceScreen;
@@ -33,7 +33,7 @@
import com.android.settingslib.core.lifecycle.LifecycleObserver;
import com.android.settingslib.core.lifecycle.events.OnPause;
import com.android.settingslib.core.lifecycle.events.OnResume;
-import com.android.settingslib.widget.LayoutPreference;
+import com.android.settingslib.widget.IllustrationPreference;
/** Preference controller that controls the preview effect in accessibility button page. */
public class AccessibilityButtonPreviewPreferenceController extends BasePreferenceController
@@ -46,10 +46,12 @@
private final ContentResolver mContentResolver;
@VisibleForTesting
final ContentObserver mContentObserver;
- private FloatingMenuLayerDrawable mFloatingMenuPreviewDrawable;
-
+ private AccessibilityLayerDrawable mAccessibilityPreviewDrawable;
@VisibleForTesting
- ImageView mPreview;
+ IllustrationPreference mIllustrationPreference;
+
+ private AccessibilityManager.TouchExplorationStateChangeListener
+ mTouchExplorationStateChangeListener;
public AccessibilityButtonPreviewPreferenceController(Context context, String preferenceKey) {
super(context, preferenceKey);
@@ -60,6 +62,9 @@
updatePreviewPreference();
}
};
+ mTouchExplorationStateChangeListener = isTouchExplorationEnabled -> {
+ updatePreviewPreference();
+ };
}
@Override
@@ -70,14 +75,16 @@
@Override
public void displayPreference(PreferenceScreen screen) {
super.displayPreference(screen);
- final LayoutPreference preference = screen.findPreference(getPreferenceKey());
- mPreview = preference.findViewById(R.id.preview_image);
+ mIllustrationPreference = screen.findPreference(getPreferenceKey());
updatePreviewPreference();
}
@Override
public void onResume() {
+ final AccessibilityManager am = mContext.getSystemService(AccessibilityManager.class);
+ am.addTouchExplorationStateChangeListener(mTouchExplorationStateChangeListener);
+
mContentResolver.registerContentObserver(
Settings.Secure.getUriFor(Settings.Secure.ACCESSIBILITY_BUTTON_MODE),
/* notifyForDescendants= */ false, mContentObserver);
@@ -91,6 +98,9 @@
@Override
public void onPause() {
+ final AccessibilityManager am = mContext.getSystemService(AccessibilityManager.class);
+ am.removeTouchExplorationStateChangeListener(mTouchExplorationStateChangeListener);
+
mContentResolver.unregisterContentObserver(mContentObserver);
}
@@ -103,24 +113,29 @@
final int floatingMenuIconId = (size == SMALL_SIZE)
? R.drawable.accessibility_button_preview_small_floating_menu
: R.drawable.accessibility_button_preview_large_floating_menu;
-
- mPreview.setImageDrawable(getFloatingMenuPreviewDrawable(floatingMenuIconId, opacity));
- // Only change opacity(alpha) would not invoke redraw view, need to invalidate manually.
- mPreview.invalidate();
+ mIllustrationPreference.setImageDrawable(
+ getAccessibilityPreviewDrawable(floatingMenuIconId, opacity));
+ } else if (AccessibilityUtil.isGestureNavigateEnabled(mContext)) {
+ mIllustrationPreference.setImageDrawable(mContext.getDrawable(
+ AccessibilityUtil.isTouchExploreEnabled(mContext)
+ ? R.drawable.accessibility_button_preview_three_finger
+ : R.drawable.accessibility_button_preview_two_finger));
} else {
- mPreview.setImageDrawable(
+ mIllustrationPreference.setImageDrawable(
mContext.getDrawable(R.drawable.accessibility_button_navigation));
}
}
- private Drawable getFloatingMenuPreviewDrawable(int resId, int opacity) {
- if (mFloatingMenuPreviewDrawable == null) {
- mFloatingMenuPreviewDrawable = FloatingMenuLayerDrawable.createLayerDrawable(
+ private Drawable getAccessibilityPreviewDrawable(int resId, int opacity) {
+ if (mAccessibilityPreviewDrawable == null) {
+ mAccessibilityPreviewDrawable = AccessibilityLayerDrawable.createLayerDrawable(
mContext, resId, opacity);
} else {
- mFloatingMenuPreviewDrawable.updateLayerDrawable(mContext, resId, opacity);
+ mAccessibilityPreviewDrawable.updateLayerDrawable(mContext, resId, opacity);
+ // Only change alpha (opacity) value did not change drawable id. It needs to force to
+ // redraw.
+ mAccessibilityPreviewDrawable.invalidateSelf();
}
-
- return mFloatingMenuPreviewDrawable;
+ return mAccessibilityPreviewDrawable;
}
}
diff --git a/src/com/android/settings/accessibility/AccessibilityControlTimeoutFooterPreferenceController.java b/src/com/android/settings/accessibility/AccessibilityControlTimeoutFooterPreferenceController.java
index 0e65ac5..498b767 100644
--- a/src/com/android/settings/accessibility/AccessibilityControlTimeoutFooterPreferenceController.java
+++ b/src/com/android/settings/accessibility/AccessibilityControlTimeoutFooterPreferenceController.java
@@ -31,8 +31,14 @@
}
@Override
- protected String getLabelName() {
- return mContext.getString(R.string.accessibility_setting_item_control_timeout_title);
+ protected String getLearnMoreContentDescription() {
+ return mContext.getString(
+ R.string.accessibility_control_timeout_footer_learn_more_content_description);
+ }
+
+ @Override
+ protected String getIntroductionTitle() {
+ return mContext.getString(R.string.accessibility_control_timeout_about_title);
}
@Override
diff --git a/src/com/android/settings/accessibility/AccessibilityControlTimeoutPreferenceFragment.java b/src/com/android/settings/accessibility/AccessibilityControlTimeoutPreferenceFragment.java
index 1e2a2b4..c7a9b10 100644
--- a/src/com/android/settings/accessibility/AccessibilityControlTimeoutPreferenceFragment.java
+++ b/src/com/android/settings/accessibility/AccessibilityControlTimeoutPreferenceFragment.java
@@ -69,7 +69,7 @@
@Override
public int getMetricsCategory() {
- return SettingsEnums.ACCESSIBILITY;
+ return SettingsEnums.ACCESSIBILITY_TIMEOUT;
}
@Override
diff --git a/src/com/android/settings/accessibility/AccessibilityDialogUtils.java b/src/com/android/settings/accessibility/AccessibilityDialogUtils.java
index ffe5d6d..b353805 100644
--- a/src/com/android/settings/accessibility/AccessibilityDialogUtils.java
+++ b/src/com/android/settings/accessibility/AccessibilityDialogUtils.java
@@ -31,6 +31,7 @@
import android.text.TextUtils;
import android.text.method.LinkMovementMethod;
import android.text.style.ImageSpan;
+import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.AbsListView;
@@ -44,9 +45,11 @@
import android.widget.TextView;
import androidx.annotation.ColorInt;
+import androidx.annotation.DrawableRes;
import androidx.annotation.IntDef;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RawRes;
import androidx.appcompat.app.AlertDialog;
import androidx.core.content.ContextCompat;
@@ -54,6 +57,9 @@
import com.android.settings.core.SubSettingLauncher;
import com.android.settings.utils.AnnotationSpan;
+import com.airbnb.lottie.LottieAnimationView;
+import com.airbnb.lottie.LottieDrawable;
+
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.List;
@@ -63,6 +69,7 @@
* Utility class for creating the edit dialog.
*/
public class AccessibilityDialogUtils {
+ private static final String TAG = "AccessibilityDialogUtils";
/** Denotes the dialog emuns for show dialog. */
@Retention(RetentionPolicy.SOURCE)
@@ -315,9 +322,22 @@
}
private static void setupShortcutWidget(View view, CharSequence titleText,
- CharSequence summaryText, int imageResId) {
+ CharSequence summaryText, @DrawableRes int imageResId) {
+ setupShortcutWidgetWithTitleAndSummary(view, titleText, summaryText);
+ setupShortcutWidgetWithImageResource(view, imageResId);
+ }
+
+ private static void setupShortcutWidgetWithImageRawResource(View view, CharSequence titleText,
+ CharSequence summaryText, @RawRes int imageRawResId) {
+ setupShortcutWidgetWithTitleAndSummary(view, titleText, summaryText);
+ setupShortcutWidgetWithImageRawResource(view, imageRawResId);
+ }
+
+ private static void setupShortcutWidgetWithTitleAndSummary(View view, CharSequence titleText,
+ CharSequence summaryText) {
final CheckBox checkBox = view.findViewById(R.id.checkbox);
checkBox.setText(titleText);
+
final TextView summary = view.findViewById(R.id.summary);
if (TextUtils.isEmpty(summaryText)) {
summary.setVisibility(View.GONE);
@@ -326,8 +346,23 @@
summary.setMovementMethod(LinkMovementMethod.getInstance());
summary.setFocusable(false);
}
- final ImageView image = view.findViewById(R.id.image);
- image.setImageResource(imageResId);
+ }
+
+ private static void setupShortcutWidgetWithImageResource(View view,
+ @DrawableRes int imageResId) {
+ final ImageView imageView = view.findViewById(R.id.image);
+ imageView.setImageResource(imageResId);
+ }
+
+ private static void setupShortcutWidgetWithImageRawResource(View view,
+ @RawRes int imageRawResId) {
+ final LottieAnimationView lottieView = view.findViewById(R.id.image);
+ lottieView.setFailureListener(
+ result -> Log.w(TAG, "Invalid image raw resource id: " + imageRawResId,
+ result));
+ lottieView.setAnimation(imageRawResId);
+ lottieView.setRepeatCount(LottieDrawable.INFINITE);
+ lottieView.playAnimation();
}
private static void initSoftwareShortcutForSUW(Context context, View view) {
@@ -344,12 +379,11 @@
private static void initSoftwareShortcut(Context context, View view) {
final View dialogView = view.findViewById(R.id.software_shortcut);
- final CharSequence title = context.getText(
- R.string.accessibility_shortcut_edit_dialog_title_software);
final TextView summary = dialogView.findViewById(R.id.summary);
final int lineHeight = summary.getLineHeight();
- setupShortcutWidget(dialogView, title,
+ setupShortcutWidget(dialogView,
+ retrieveTitle(context),
retrieveSoftwareShortcutSummary(context, lineHeight),
retrieveSoftwareShortcutImageResId(context));
}
@@ -362,7 +396,6 @@
R.string.accessibility_shortcut_edit_dialog_summary_hardware);
setupShortcutWidget(dialogView, title, summary,
R.drawable.accessibility_shortcut_type_hardware);
- // TODO(b/142531156): Use vector drawable instead of temporal png file to avoid distorted.
}
private static void initMagnifyShortcut(Context context, View view) {
@@ -375,9 +408,8 @@
final Object[] arguments = {3};
summary = MessageFormat.format(summary, arguments);
- setupShortcutWidget(dialogView, title, summary,
- R.drawable.accessibility_shortcut_type_triple_tap);
- // TODO(b/142531156): Use vector drawable instead of temporal png file to avoid distorted.
+ setupShortcutWidgetWithImageRawResource(dialogView, title, summary,
+ R.raw.accessibility_shortcut_type_triple_tap);
}
private static void initAdvancedWidget(View view) {
@@ -398,20 +430,49 @@
return sb;
}
+ private static CharSequence retrieveTitle(Context context) {
+ int resId;
+ if (AccessibilityUtil.isFloatingMenuEnabled(context)) {
+ resId = R.string.accessibility_shortcut_edit_dialog_title_software;
+ } else if (AccessibilityUtil.isGestureNavigateEnabled(context)) {
+ resId = R.string.accessibility_shortcut_edit_dialog_title_software_by_gesture;
+ } else {
+ resId = R.string.accessibility_shortcut_edit_dialog_title_software;
+ }
+ return context.getText(resId);
+ }
+
private static CharSequence retrieveSoftwareShortcutSummary(Context context, int lineHeight) {
final SpannableStringBuilder sb = new SpannableStringBuilder();
- if (!AccessibilityUtil.isFloatingMenuEnabled(context)) {
+ if (AccessibilityUtil.isFloatingMenuEnabled(context)) {
+ sb.append(getCustomizeAccessibilityButtonLink(context));
+ } else if (AccessibilityUtil.isGestureNavigateEnabled(context)) {
+ final int resId = AccessibilityUtil.isTouchExploreEnabled(context)
+ ? R.string.accessibility_shortcut_edit_dialog_summary_software_gesture_talkback
+ : R.string.accessibility_shortcut_edit_dialog_summary_software_gesture;
+ sb.append(context.getText(resId));
+ sb.append("\n\n");
+ sb.append(getCustomizeAccessibilityButtonLink(context));
+ } else {
sb.append(getSummaryStringWithIcon(context, lineHeight));
sb.append("\n\n");
+ sb.append(getCustomizeAccessibilityButtonLink(context));
}
- sb.append(getCustomizeAccessibilityButtonLink(context));
return sb;
}
private static int retrieveSoftwareShortcutImageResId(Context context) {
- return AccessibilityUtil.isFloatingMenuEnabled(context)
- ? R.drawable.accessibility_shortcut_type_software_floating
- : R.drawable.accessibility_shortcut_type_software;
+ int resId;
+ if (AccessibilityUtil.isFloatingMenuEnabled(context)) {
+ resId = R.drawable.accessibility_shortcut_type_software_floating;
+ } else if (AccessibilityUtil.isGestureNavigateEnabled(context)) {
+ resId = AccessibilityUtil.isTouchExploreEnabled(context)
+ ? R.drawable.accessibility_shortcut_type_software_gesture_talkback
+ : R.drawable.accessibility_shortcut_type_software_gesture;
+ } else {
+ resId = R.drawable.accessibility_shortcut_type_software;
+ }
+ return resId;
}
private static CharSequence getCustomizeAccessibilityButtonLink(Context context) {
@@ -422,7 +483,6 @@
.launch();
final AnnotationSpan.LinkInfo linkInfo = new AnnotationSpan.LinkInfo(
AnnotationSpan.LinkInfo.DEFAULT_ANNOTATION, linkListener);
-
return AnnotationSpan.linkify(context.getText(
R.string.accessibility_shortcut_edit_dialog_summary_software_floating), linkInfo);
}
diff --git a/src/com/android/settings/accessibility/AccessibilityFooterPreferenceController.java b/src/com/android/settings/accessibility/AccessibilityFooterPreferenceController.java
index e3422e4..c22b11e 100644
--- a/src/com/android/settings/accessibility/AccessibilityFooterPreferenceController.java
+++ b/src/com/android/settings/accessibility/AccessibilityFooterPreferenceController.java
@@ -21,14 +21,18 @@
import androidx.preference.PreferenceScreen;
-import com.android.settings.R;
import com.android.settings.core.BasePreferenceController;
import com.android.settingslib.HelpUtils;
/**
- * Base class for accessibility preference footer.
+ * Preference controller that controls the help link and customizes the preference title in {@link
+ * AccessibilityFooterPreference}.
*/
-public abstract class AccessibilityFooterPreferenceController extends BasePreferenceController {
+public class AccessibilityFooterPreferenceController extends BasePreferenceController {
+
+ private int mHelpResource;
+ private String mLearnMoreContentDescription;
+ private String mIntroductionTitle;
public AccessibilityFooterPreferenceController(Context context, String key) {
super(context, key);
@@ -49,36 +53,74 @@
}
/**
- * Override this if showing a help item in the footer bar, by returning the resource id.
+ * Setups a help item in the {@link AccessibilityFooterPreference} with specific content
+ * description.
+ */
+ public void setupHelpLink(int helpResource, String learnMoreContentDescription) {
+ mHelpResource = helpResource;
+ mLearnMoreContentDescription = learnMoreContentDescription;
+ }
+
+ /**
+ * Overrides this if showing a help item in the {@link AccessibilityFooterPreference}, by
+ * returning the resource id.
*
* @return the resource id for the help url
*/
protected int getHelpResource() {
- return 0;
+ return mHelpResource;
}
- /** Returns the accessibility feature name. */
- protected abstract String getLabelName();
+ /**
+ * Overrides this if showing a help item in the {@link AccessibilityFooterPreference} with
+ * specific content description.
+ *
+ * @return the content description for the help url
+ */
+ protected String getLearnMoreContentDescription() {
+ return mLearnMoreContentDescription;
+ }
+
+ /**
+ * Sets the announcement the specific features introduction in the {@link
+ * AccessibilityFooterPreference}.
+ */
+ public void setIntroductionTitle(String introductionTitle) {
+ mIntroductionTitle = introductionTitle;
+ }
+
+ /**
+ * Overrides this if announcement the specific features introduction in the {@link
+ * AccessibilityFooterPreference}.
+ *
+ * @return the extended content description for specific features introduction
+ */
+ protected String getIntroductionTitle() {
+ return mIntroductionTitle;
+ }
private void updateFooterPreferences(AccessibilityFooterPreference footerPreference) {
final StringBuffer sb = new StringBuffer();
- sb.append(mContext.getString(
- R.string.accessibility_introduction_title, getLabelName()))
- .append("\n\n")
- .append(footerPreference.getTitle());
+ sb.append(getIntroductionTitle()).append("\n\n").append(footerPreference.getTitle());
footerPreference.setContentDescription(sb);
+ final Intent helpIntent;
if (getHelpResource() != 0) {
+ // Returns may be null if content is wrong or empty.
+ helpIntent = HelpUtils.getHelpIntent(mContext, mContext.getString(getHelpResource()),
+ mContext.getClass().getName());
+ } else {
+ helpIntent = null;
+ }
+
+ if (helpIntent != null) {
footerPreference.setLearnMoreAction(view -> {
- final Intent helpIntent = HelpUtils.getHelpIntent(
- mContext, mContext.getString(getHelpResource()),
- mContext.getClass().getName());
view.startActivityForResult(helpIntent, 0);
});
-
- final String learnMoreContentDescription = mContext.getString(
- R.string.footer_learn_more_content_description, getLabelName());
- footerPreference.setLearnMoreContentDescription(learnMoreContentDescription);
+ footerPreference.setLearnMoreContentDescription(getLearnMoreContentDescription());
+ footerPreference.setLinkEnabled(true);
+ } else {
+ footerPreference.setLinkEnabled(false);
}
}
}
diff --git a/src/com/android/settings/accessibility/AccessibilityGestureNavigationTutorial.java b/src/com/android/settings/accessibility/AccessibilityGestureNavigationTutorial.java
index f8cdcb3..0ca16cb 100644
--- a/src/com/android/settings/accessibility/AccessibilityGestureNavigationTutorial.java
+++ b/src/com/android/settings/accessibility/AccessibilityGestureNavigationTutorial.java
@@ -27,13 +27,15 @@
import android.graphics.drawable.Drawable;
import android.text.Spannable;
import android.text.SpannableString;
+import android.text.SpannableStringBuilder;
import android.text.style.ImageSpan;
+import android.util.Log;
import android.view.Gravity;
import android.view.LayoutInflater;
-import android.view.TextureView;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
+import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextSwitcher;
@@ -41,8 +43,10 @@
import androidx.annotation.AnimRes;
import androidx.annotation.ColorInt;
+import androidx.annotation.DrawableRes;
import androidx.annotation.IntDef;
import androidx.annotation.NonNull;
+import androidx.annotation.RawRes;
import androidx.annotation.VisibleForTesting;
import androidx.appcompat.app.AlertDialog;
import androidx.core.content.ContextCompat;
@@ -53,6 +57,9 @@
import com.android.settings.R;
+import com.airbnb.lottie.LottieAnimationView;
+import com.airbnb.lottie.LottieDrawable;
+
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.ArrayList;
@@ -63,17 +70,19 @@
* accessibility services.
*/
public final class AccessibilityGestureNavigationTutorial {
+ private static final String TAG = "AccessibilityGestureNavigationTutorial";
+
/** IntDef enum for dialog type. */
@Retention(RetentionPolicy.SOURCE)
@IntDef({
DialogType.LAUNCH_SERVICE_BY_ACCESSIBILITY_BUTTON,
- DialogType.LAUNCH_SERVICE_BY_GESTURE_NAVIGATION,
+ DialogType.LAUNCH_SERVICE_BY_ACCESSIBILITY_GESTURE,
DialogType.GESTURE_NAVIGATION_SETTINGS,
})
private @interface DialogType {
int LAUNCH_SERVICE_BY_ACCESSIBILITY_BUTTON = 0;
- int LAUNCH_SERVICE_BY_GESTURE_NAVIGATION = 1;
+ int LAUNCH_SERVICE_BY_ACCESSIBILITY_GESTURE = 1;
int GESTURE_NAVIGATION_SETTINGS = 2;
}
@@ -82,13 +91,17 @@
private static final DialogInterface.OnClickListener mOnClickListener =
(DialogInterface dialog, int which) -> dialog.dismiss();
- public static void showGestureNavigationSettingsTutorialDialog(Context context,
- DialogInterface.OnDismissListener dismissListener) {
+ /**
+ * Displays a dialog that guides users to use accessibility features with accessibility
+ * gestures under system gesture navigation mode.
+ */
+ public static void showGestureNavigationTutorialDialog(Context context,
+ DialogInterface.OnDismissListener onDismissListener) {
final AlertDialog alertDialog = new AlertDialog.Builder(context)
.setView(createTutorialDialogContentView(context,
DialogType.GESTURE_NAVIGATION_SETTINGS))
.setNegativeButton(R.string.accessibility_tutorial_dialog_button, mOnClickListener)
- .setOnDismissListener(dismissListener)
+ .setOnDismissListener(onDismissListener)
.create();
alertDialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
@@ -107,8 +120,8 @@
return alertDialog;
}
- static AlertDialog showGestureNavigationTutorialDialog(Context context) {
- return createDialog(context, DialogType.LAUNCH_SERVICE_BY_GESTURE_NAVIGATION);
+ static AlertDialog showAccessibilityGestureTutorialDialog(Context context) {
+ return createDialog(context, DialogType.LAUNCH_SERVICE_BY_ACCESSIBILITY_GESTURE);
}
static AlertDialog createAccessibilityTutorialDialog(Context context, int shortcutTypes) {
@@ -119,7 +132,7 @@
}
/**
- * Get a content View for a dialog to confirm that they want to enable a service.
+ * Gets a content View for a dialog to confirm that they want to enable a service.
*
* @param context A valid context
* @param dialogType The type of tutorial dialog
@@ -136,42 +149,36 @@
content = inflater.inflate(
R.layout.tutorial_dialog_launch_service_by_accessibility_button, null);
break;
- case DialogType.LAUNCH_SERVICE_BY_GESTURE_NAVIGATION:
+ case DialogType.LAUNCH_SERVICE_BY_ACCESSIBILITY_GESTURE:
content = inflater.inflate(
R.layout.tutorial_dialog_launch_service_by_gesture_navigation, null);
- final TextureView gestureTutorialVideo = content.findViewById(
- R.id.gesture_tutorial_video);
- final TextView gestureTutorialMessage = content.findViewById(
- R.id.gesture_tutorial_message);
- VideoPlayer.create(context, AccessibilityUtil.isTouchExploreEnabled(context)
- ? R.raw.illustration_accessibility_gesture_three_finger
- : R.raw.illustration_accessibility_gesture_two_finger,
- gestureTutorialVideo);
- gestureTutorialMessage.setText(AccessibilityUtil.isTouchExploreEnabled(context)
- ? R.string.accessibility_tutorial_dialog_message_gesture_talkback
- : R.string.accessibility_tutorial_dialog_message_gesture);
+ setupGestureNavigationTextWithImage(context, content);
break;
case DialogType.GESTURE_NAVIGATION_SETTINGS:
content = inflater.inflate(
R.layout.tutorial_dialog_launch_by_gesture_navigation_settings, null);
- final TextureView gestureSettingsTutorialVideo = content.findViewById(
- R.id.gesture_tutorial_video);
- final TextView gestureSettingsTutorialMessage = content.findViewById(
- R.id.gesture_tutorial_message);
- VideoPlayer.create(context, AccessibilityUtil.isTouchExploreEnabled(context)
- ? R.raw.illustration_accessibility_gesture_three_finger
- : R.raw.illustration_accessibility_gesture_two_finger,
- gestureSettingsTutorialVideo);
- final int stringResId = AccessibilityUtil.isTouchExploreEnabled(context)
- ? R.string.accessibility_tutorial_dialog_message_gesture_settings_talkback
- : R.string.accessibility_tutorial_dialog_message_gesture_settings;
- gestureSettingsTutorialMessage.setText(stringResId);
+ setupGestureNavigationTextWithImage(context, content);
break;
}
return content;
}
+ private static void setupGestureNavigationTextWithImage(Context context, View view) {
+ final boolean isTouchExploreEnabled = AccessibilityUtil.isTouchExploreEnabled(context);
+
+ final ImageView imageView = view.findViewById(R.id.image);
+ final int gestureSettingsImageResId =
+ isTouchExploreEnabled ? R.drawable.illustration_accessibility_gesture_three_finger
+ : R.drawable.illustration_accessibility_gesture_two_finger;
+ imageView.setImageResource(gestureSettingsImageResId);
+
+ final TextView textView = view.findViewById(R.id.gesture_tutorial_message);
+ textView.setText(isTouchExploreEnabled
+ ? R.string.accessibility_tutorial_dialog_message_gesture_settings_talkback
+ : R.string.accessibility_tutorial_dialog_message_gesture_settings);
+ }
+
private static AlertDialog createDialog(Context context, int dialogType) {
final AlertDialog alertDialog = new AlertDialog.Builder(context)
.setView(createTutorialDialogContentView(context, dialogType))
@@ -238,7 +245,7 @@
@NonNull
@Override
public Object instantiateItem(@NonNull ViewGroup container, int position) {
- final View itemView = mTutorialPages.get(position).getImageView();
+ final View itemView = mTutorialPages.get(position).getIllustrationView();
container.addView(itemView);
return itemView;
}
@@ -256,7 +263,7 @@
@Override
public void destroyItem(@NonNull ViewGroup container, int position,
@NonNull Object object) {
- final View itemView = mTutorialPages.get(position).getImageView();
+ final View itemView = mTutorialPages.get(position).getIllustrationView();
container.removeView(itemView);
}
}
@@ -269,6 +276,34 @@
return imageView;
}
+ private static View createIllustrationView(Context context, @DrawableRes int imageRes) {
+ final View illustrationFrame = inflateAndInitIllustrationFrame(context);
+ final LottieAnimationView lottieView = illustrationFrame.findViewById(R.id.image);
+ lottieView.setImageResource(imageRes);
+
+ return illustrationFrame;
+ }
+
+ private static View createIllustrationViewWithImageRawResource(Context context,
+ @RawRes int imageRawRes) {
+ final View illustrationFrame = inflateAndInitIllustrationFrame(context);
+ final LottieAnimationView lottieView = illustrationFrame.findViewById(R.id.image);
+ lottieView.setFailureListener(
+ result -> Log.w(TAG, "Invalid image raw resource id: " + imageRawRes,
+ result));
+ lottieView.setAnimation(imageRawRes);
+ lottieView.setRepeatCount(LottieDrawable.INFINITE);
+ lottieView.playAnimation();
+
+ return illustrationFrame;
+ }
+
+ private static View inflateAndInitIllustrationFrame(Context context) {
+ final LayoutInflater inflater = context.getSystemService(LayoutInflater.class);
+
+ return inflater.inflate(R.layout.accessibility_lottie_animation_view, /* root= */ null);
+ }
+
private static View createShortcutNavigationContentView(Context context, int shortcutTypes) {
final LayoutInflater inflater = context.getSystemService(LayoutInflater.class);
final View contentView = inflater.inflate(
@@ -323,9 +358,8 @@
}
private static TutorialPage createSoftwareTutorialPage(@NonNull Context context) {
- final CharSequence title = context.getText(
- R.string.accessibility_tutorial_dialog_title_button);
- final ImageView image = createSoftwareImage(context);
+ final CharSequence title = getSoftwareTitle(context);
+ final View image = createSoftwareImage(context);
final CharSequence instruction = getSoftwareInstruction(context);
final ImageView indicatorIcon =
createImageView(context, R.drawable.ic_accessibility_page_indicator);
@@ -337,8 +371,8 @@
private static TutorialPage createHardwareTutorialPage(@NonNull Context context) {
final CharSequence title =
context.getText(R.string.accessibility_tutorial_dialog_title_volume);
- final ImageView image =
- createImageView(context, R.drawable.accessibility_shortcut_type_hardware);
+ final View image =
+ createIllustrationView(context, R.drawable.accessibility_shortcut_type_hardware);
final ImageView indicatorIcon =
createImageView(context, R.drawable.ic_accessibility_page_indicator);
final CharSequence instruction =
@@ -351,8 +385,9 @@
private static TutorialPage createTripleTapTutorialPage(@NonNull Context context) {
final CharSequence title =
context.getText(R.string.accessibility_tutorial_dialog_title_triple);
- final ImageView image =
- createImageView(context, R.drawable.accessibility_shortcut_type_triple_tap);
+ final View image =
+ createIllustrationViewWithImageRawResource(context,
+ R.raw.accessibility_shortcut_type_triple_tap);
final CharSequence instruction =
context.getText(R.string.accessibility_tutorial_dialog_message_triple);
final ImageView indicatorIcon =
@@ -381,19 +416,47 @@
return tutorialPages;
}
- private static ImageView createSoftwareImage(Context context) {
- final int resId = AccessibilityUtil.isFloatingMenuEnabled(context)
- ? R.drawable.accessibility_shortcut_type_software_floating
- : R.drawable.accessibility_shortcut_type_software;
+ private static View createSoftwareImage(Context context) {
+ int resId;
+ if (AccessibilityUtil.isFloatingMenuEnabled(context)) {
+ resId = R.drawable.accessibility_shortcut_type_software_floating;
+ } else if (AccessibilityUtil.isGestureNavigateEnabled(context)) {
+ resId = AccessibilityUtil.isTouchExploreEnabled(context)
+ ? R.drawable.accessibility_shortcut_type_software_gesture_talkback
+ : R.drawable.accessibility_shortcut_type_software_gesture;
+ } else {
+ resId = R.drawable.accessibility_shortcut_type_software;
+ }
+ return createIllustrationView(context, resId);
+ }
- return createImageView(context, resId);
+ private static CharSequence getSoftwareTitle(Context context) {
+ int resId;
+ if (AccessibilityUtil.isFloatingMenuEnabled(context)) {
+ resId = R.string.accessibility_tutorial_dialog_title_button;
+ } else if (AccessibilityUtil.isGestureNavigateEnabled(context)) {
+ resId = R.string.accessibility_tutorial_dialog_title_gesture;
+ } else {
+ resId = R.string.accessibility_tutorial_dialog_title_button;
+ }
+ return context.getText(resId);
}
private static CharSequence getSoftwareInstruction(Context context) {
- return AccessibilityUtil.isFloatingMenuEnabled(context)
- ? context.getText(R.string.accessibility_tutorial_dialog_message_floating_button)
- : getSoftwareInstructionWithIcon(context,
- context.getText(R.string.accessibility_tutorial_dialog_message_button));
+ final SpannableStringBuilder sb = new SpannableStringBuilder();
+ if (AccessibilityUtil.isFloatingMenuEnabled(context)) {
+ final int resId = R.string.accessibility_tutorial_dialog_message_floating_button;
+ sb.append(context.getText(resId));
+ } else if (AccessibilityUtil.isGestureNavigateEnabled(context)) {
+ final int resId = AccessibilityUtil.isTouchExploreEnabled(context)
+ ? R.string.accessibility_tutorial_dialog_message_gesture_talkback
+ : R.string.accessibility_tutorial_dialog_message_gesture;
+ sb.append(context.getText(resId));
+ } else {
+ final int resId = R.string.accessibility_tutorial_dialog_message_button;
+ sb.append(getSoftwareInstructionWithIcon(context, context.getText(resId)));
+ }
+ return sb;
}
private static CharSequence getSoftwareInstructionWithIcon(Context context, CharSequence text) {
@@ -416,24 +479,26 @@
private static class TutorialPage {
private final CharSequence mTitle;
- private final ImageView mImageView;
+ private final View mIllustrationView;
private final ImageView mIndicatorIcon;
private final CharSequence mInstruction;
- TutorialPage(CharSequence title, ImageView imageView, ImageView indicatorIcon,
+ TutorialPage(CharSequence title, View illustrationView, ImageView indicatorIcon,
CharSequence instruction) {
this.mTitle = title;
- this.mImageView = imageView;
+ this.mIllustrationView = illustrationView;
this.mIndicatorIcon = indicatorIcon;
this.mInstruction = instruction;
+
+ setupIllustrationChildViewsGravity();
}
public CharSequence getTitle() {
return mTitle;
}
- public ImageView getImageView() {
- return mImageView;
+ public View getIllustrationView() {
+ return mIllustrationView;
}
public ImageView getIndicatorIcon() {
@@ -443,6 +508,23 @@
public CharSequence getInstruction() {
return mInstruction;
}
+
+ private void setupIllustrationChildViewsGravity() {
+ final View backgroundView = mIllustrationView.findViewById(R.id.image_background);
+ initViewGravity(backgroundView);
+
+ final View lottieView = mIllustrationView.findViewById(R.id.image);
+ initViewGravity(lottieView);
+ }
+
+ private void initViewGravity(@NonNull View view) {
+ final FrameLayout.LayoutParams layoutParams =
+ new FrameLayout.LayoutParams(FrameLayout.LayoutParams.WRAP_CONTENT,
+ FrameLayout.LayoutParams.WRAP_CONTENT);
+ layoutParams.gravity = Gravity.CENTER;
+
+ view.setLayoutParams(layoutParams);
+ }
}
private static class TutorialPageChangeListener implements ViewPager.OnPageChangeListener {
diff --git a/src/com/android/settings/accessibility/FloatingMenuLayerDrawable.java b/src/com/android/settings/accessibility/AccessibilityLayerDrawable.java
similarity index 76%
rename from src/com/android/settings/accessibility/FloatingMenuLayerDrawable.java
rename to src/com/android/settings/accessibility/AccessibilityLayerDrawable.java
index bfce114..b04a969 100644
--- a/src/com/android/settings/accessibility/FloatingMenuLayerDrawable.java
+++ b/src/com/android/settings/accessibility/AccessibilityLayerDrawable.java
@@ -27,10 +27,10 @@
import java.util.Objects;
-/** LayerDrawable that contains device icon as background and floating menu icon as foreground. */
-public class FloatingMenuLayerDrawable extends LayerDrawable {
+/** LayerDrawable that contains device icon as background and given icon as foreground. */
+public class AccessibilityLayerDrawable extends LayerDrawable {
- private FloatingMenuLayerDrawableState mState;
+ private AccessibilityLayerDrawableState mState;
/**
* Creates a new layer drawable with the list of specified layers.
@@ -38,23 +38,23 @@
* @param layers a list of drawables to use as layers in this new drawable,
* must be non-null
*/
- private FloatingMenuLayerDrawable(@NonNull Drawable[] layers) {
+ private AccessibilityLayerDrawable(@NonNull Drawable[] layers) {
super(layers);
}
/**
- * Create the {@link LayerDrawable} that contains device icon as background and floating menu
- * icon with given {@code opacity} value as foreground.
+ * Create the {@link LayerDrawable} that contains device icon as background and given menu icon
+ * with given {@code opacity} value as foreground.
*
* @param context the valid context used to get the icon
- * @param resId the resource ID of the floating menu icon
+ * @param resId the resource ID of the given icon
* @param opacity the opacity to apply to the given icon
- * @return the drawable that combines the device icon and the floating menu icon
+ * @return the drawable that combines the device icon and the given icon
*/
- public static FloatingMenuLayerDrawable createLayerDrawable(Context context, int resId,
+ public static AccessibilityLayerDrawable createLayerDrawable(Context context, int resId,
int opacity) {
final Drawable bg = context.getDrawable(R.drawable.accessibility_button_preview_base);
- final FloatingMenuLayerDrawable basicDrawable = new FloatingMenuLayerDrawable(
+ final AccessibilityLayerDrawable basicDrawable = new AccessibilityLayerDrawable(
new Drawable[]{bg, null});
basicDrawable.updateLayerDrawable(context, resId, opacity);
@@ -66,7 +66,7 @@
* value at index 1 layer.
*
* @param context the valid context used to get the icon
- * @param resId the resource ID of the floating menu icon
+ * @param resId the resource ID of the given icon
* @param opacity the opacity to apply to the given icon
*/
public void updateLayerDrawable(Context context, int resId, int opacity) {
@@ -83,18 +83,18 @@
/** Stores the constant state and data to the given drawable. */
private void setConstantState(Context context, int resId, int opacity) {
- mState = new FloatingMenuLayerDrawableState(context, resId, opacity);
+ mState = new AccessibilityLayerDrawableState(context, resId, opacity);
}
- /** {@link ConstantState} to store the data of {@link FloatingMenuLayerDrawable}. */
+ /** {@link ConstantState} to store the data of {@link AccessibilityLayerDrawable}. */
@VisibleForTesting
- static class FloatingMenuLayerDrawableState extends ConstantState {
+ static class AccessibilityLayerDrawableState extends ConstantState {
private final Context mContext;
private final int mResId;
private final int mOpacity;
- FloatingMenuLayerDrawableState(Context context, int resId, int opacity) {
+ AccessibilityLayerDrawableState(Context context, int resId, int opacity) {
mContext = context;
mResId = resId;
mOpacity = opacity;
@@ -119,7 +119,7 @@
if (o == null || getClass() != o.getClass()) {
return false;
}
- final FloatingMenuLayerDrawableState that = (FloatingMenuLayerDrawableState) o;
+ final AccessibilityLayerDrawableState that = (AccessibilityLayerDrawableState) o;
return mResId == that.mResId
&& mOpacity == that.mOpacity
&& Objects.equals(mContext, that.mContext);
diff --git a/src/com/android/settings/accessibility/AccessibilityMetricsFeatureProvider.java b/src/com/android/settings/accessibility/AccessibilityMetricsFeatureProvider.java
new file mode 100644
index 0000000..a9d7c05
--- /dev/null
+++ b/src/com/android/settings/accessibility/AccessibilityMetricsFeatureProvider.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.accessibility;
+
+import android.content.ComponentName;
+
+import androidx.annotation.Nullable;
+
+/**
+ * Provider for Accessibility metrics related features.
+ */
+public interface AccessibilityMetricsFeatureProvider {
+
+ /**
+ * Returns {@link android.app.settings.SettingsEnums} value according to the {@code
+ * componentName}.
+ *
+ * @param componentName the component name of the downloaded service or activity
+ * @return value in {@link android.app.settings.SettingsEnums}
+ */
+ int getDownloadedFeatureMetricsCategory(@Nullable ComponentName componentName);
+}
diff --git a/src/com/android/settings/accessibility/AccessibilityMetricsFeatureProviderImpl.java b/src/com/android/settings/accessibility/AccessibilityMetricsFeatureProviderImpl.java
new file mode 100644
index 0000000..0f85f38
--- /dev/null
+++ b/src/com/android/settings/accessibility/AccessibilityMetricsFeatureProviderImpl.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.accessibility;
+
+import android.app.settings.SettingsEnums;
+import android.content.ComponentName;
+
+/**
+ * Provider implementation for Accessibility metrics related features.
+ */
+public class AccessibilityMetricsFeatureProviderImpl implements
+ AccessibilityMetricsFeatureProvider {
+
+ @Override
+ public int getDownloadedFeatureMetricsCategory(ComponentName componentName) {
+ return SettingsEnums.ACCESSIBILITY_SERVICE;
+ }
+}
diff --git a/src/com/android/settings/accessibility/AccessibilityShortcutPreferenceFragment.java b/src/com/android/settings/accessibility/AccessibilityShortcutPreferenceFragment.java
index 127c7c6..22f037b 100644
--- a/src/com/android/settings/accessibility/AccessibilityShortcutPreferenceFragment.java
+++ b/src/com/android/settings/accessibility/AccessibilityShortcutPreferenceFragment.java
@@ -115,8 +115,7 @@
mShortcutPreference.setKey(getShortcutPreferenceKey());
mShortcutPreference.setOnClickCallback(this);
- final CharSequence title = getString(R.string.accessibility_shortcut_title, getLabelName());
- mShortcutPreference.setTitle(title);
+ updateShortcutTitle(mShortcutPreference);
getPreferenceScreen().addPreference(mShortcutPreference);
mTouchExplorationStateChangeListener = isTouchExplorationEnabled -> {
@@ -182,6 +181,11 @@
}
}
+ protected void updateShortcutTitle(ShortcutPreference shortcutPreference) {
+ final CharSequence title = getString(R.string.accessibility_shortcut_title, getLabelName());
+ shortcutPreference.setTitle(title);
+ }
+
@Override
public int getDialogMetricsCategory(int dialogId) {
switch (dialogId) {
diff --git a/src/com/android/settings/accessibility/BalanceSeekBar.java b/src/com/android/settings/accessibility/BalanceSeekBar.java
index 8a88d6c..19301ae 100644
--- a/src/com/android/settings/accessibility/BalanceSeekBar.java
+++ b/src/com/android/settings/accessibility/BalanceSeekBar.java
@@ -17,6 +17,7 @@
package com.android.settings.accessibility;
import static android.view.HapticFeedbackConstants.CLOCK_TICK;
+
import static com.android.settings.Utils.isNightMode;
import android.content.Context;
@@ -154,7 +155,7 @@
// Draw a vertical line at 50% that represents centred balance
int seekBarCenter = (canvas.getHeight() - getPaddingBottom()) / 2;
canvas.save();
- canvas.translate((canvas.getWidth() - mCenterMarkerRect.right) / 2,
+ canvas.translate((canvas.getWidth() - mCenterMarkerRect.right - getPaddingEnd()) / 2,
seekBarCenter - (mCenterMarkerRect.bottom / 2));
canvas.drawRect(mCenterMarkerRect, mCenterMarkerPaint);
canvas.restore();
diff --git a/src/com/android/settings/accessibility/CaptionFooterPreferenceController.java b/src/com/android/settings/accessibility/CaptionFooterPreferenceController.java
index 4e50b89..495d395 100644
--- a/src/com/android/settings/accessibility/CaptionFooterPreferenceController.java
+++ b/src/com/android/settings/accessibility/CaptionFooterPreferenceController.java
@@ -30,12 +30,18 @@
}
@Override
- protected String getLabelName() {
- return mContext.getString(R.string.accessibility_captioning_title);
+ protected String getLearnMoreContentDescription() {
+ return mContext.getString(
+ R.string.accessibility_captioning_footer_learn_more_content_description);
}
@Override
- protected int getHelpResource() {
+ protected String getIntroductionTitle() {
+ return mContext.getString(R.string.accessibility_captioning_about_title);
+ }
+
+ @Override
+ protected int getHelpResource() {
return R.string.help_url_caption;
}
}
diff --git a/src/com/android/settings/accessibility/LaunchAccessibilityActivityPreferenceFragment.java b/src/com/android/settings/accessibility/LaunchAccessibilityActivityPreferenceFragment.java
index 98090ac..3b15830 100644
--- a/src/com/android/settings/accessibility/LaunchAccessibilityActivityPreferenceFragment.java
+++ b/src/com/android/settings/accessibility/LaunchAccessibilityActivityPreferenceFragment.java
@@ -41,6 +41,7 @@
import androidx.preference.Preference;
import com.android.settings.R;
+import com.android.settings.overlay.FeatureFactory;
import java.util.ArrayList;
import java.util.List;
@@ -52,6 +53,19 @@
protected static final String KEY_LAUNCH_PREFERENCE = "launch_preference";
@Override
+ public int getMetricsCategory() {
+ // Retrieve from getArguments() directly because this function will be executed from
+ // onAttach(), but variable mComponentName only available after onProcessArguments()
+ // which comes from onCreateView().
+ final ComponentName componentName = getArguments().getParcelable(
+ AccessibilitySettings.EXTRA_COMPONENT_NAME);
+
+ return FeatureFactory.getFactory(getActivity().getApplicationContext())
+ .getAccessibilityMetricsFeatureProvider()
+ .getDownloadedFeatureMetricsCategory(componentName);
+ }
+
+ @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
final View view = super.onCreateView(inflater, container, savedInstanceState);
@@ -60,7 +74,7 @@
initLaunchPreference();
removePreference(KEY_USE_SERVICE_PREFERENCE);
return view;
- };
+ }
@Override
protected void onPreferenceToggled(String preferenceKey, boolean enabled) {
@@ -70,7 +84,6 @@
@Override
protected void onProcessArguments(Bundle arguments) {
super.onProcessArguments(arguments);
-
mComponentName = arguments.getParcelable(AccessibilitySettings.EXTRA_COMPONENT_NAME);
final ActivityInfo info = getAccessibilityShortcutInfo().getActivityInfo();
mPackageName = info.loadLabel(getPackageManager()).toString();
diff --git a/src/com/android/settings/accessibility/ToggleAccessibilityServicePreferenceFragment.java b/src/com/android/settings/accessibility/ToggleAccessibilityServicePreferenceFragment.java
index 9349071..bd63406 100644
--- a/src/com/android/settings/accessibility/ToggleAccessibilityServicePreferenceFragment.java
+++ b/src/com/android/settings/accessibility/ToggleAccessibilityServicePreferenceFragment.java
@@ -54,8 +54,8 @@
import com.android.internal.widget.LockPatternUtils;
import com.android.settings.R;
import com.android.settings.accessibility.AccessibilityUtil.UserShortcutType;
+import com.android.settings.overlay.FeatureFactory;
import com.android.settings.password.ConfirmDeviceCredentialActivity;
-import com.android.settings.widget.SettingsMainSwitchPreference;
import com.android.settingslib.accessibility.AccessibilityUtils;
import java.util.List;
@@ -85,7 +85,15 @@
@Override
public int getMetricsCategory() {
- return SettingsEnums.ACCESSIBILITY_SERVICE;
+ // Retrieve from getArguments() directly because this function will be executed from
+ // onAttach(), but variable mComponentName only available after onProcessArguments()
+ // which comes from onCreateView().
+ final ComponentName componentName = getArguments().getParcelable(
+ AccessibilitySettings.EXTRA_COMPONENT_NAME);
+
+ return FeatureFactory.getFactory(getActivity().getApplicationContext())
+ .getAccessibilityMetricsFeatureProvider()
+ .getDownloadedFeatureMetricsCategory(componentName);
}
@Override
@@ -222,15 +230,6 @@
}
@Override
- protected void updateToggleServiceTitle(SettingsMainSwitchPreference switchPreference) {
- final AccessibilityServiceInfo info = getAccessibilityServiceInfo();
- final String switchBarText = (info == null) ? "" :
- getString(R.string.accessibility_service_primary_switch_title,
- info.getResolveInfo().loadLabel(getPackageManager()));
- switchPreference.setTitle(switchBarText);
- }
-
- @Override
protected void updateSwitchBarToggleSwitch() {
final boolean checked = isAccessibilityServiceEnabled();
if (mToggleServiceSwitchPreference.isChecked() == checked) {
diff --git a/src/com/android/settings/accessibility/ToggleAutoclickFooterPreferenceController.java b/src/com/android/settings/accessibility/ToggleAutoclickFooterPreferenceController.java
index 053fa9d..962ffec 100644
--- a/src/com/android/settings/accessibility/ToggleAutoclickFooterPreferenceController.java
+++ b/src/com/android/settings/accessibility/ToggleAutoclickFooterPreferenceController.java
@@ -31,8 +31,14 @@
}
@Override
- protected String getLabelName() {
- return mContext.getString(R.string.accessibility_autoclick_preference_title);
+ protected String getLearnMoreContentDescription() {
+ return mContext.getString(
+ R.string.accessibility_autoclick_footer_learn_more_content_description);
+ }
+
+ @Override
+ protected String getIntroductionTitle() {
+ return mContext.getString(R.string.accessibility_autoclick_about_title);
}
@Override
diff --git a/src/com/android/settings/accessibility/ToggleColorInversionPreferenceFragment.java b/src/com/android/settings/accessibility/ToggleColorInversionPreferenceFragment.java
index b41bafd..419514f 100644
--- a/src/com/android/settings/accessibility/ToggleColorInversionPreferenceFragment.java
+++ b/src/com/android/settings/accessibility/ToggleColorInversionPreferenceFragment.java
@@ -38,8 +38,7 @@
import java.util.List;
/** Settings page for color inversion. */
-public class ToggleColorInversionPreferenceFragment extends
- ToggleFeaturePreferenceFragment {
+public class ToggleColorInversionPreferenceFragment extends ToggleFeaturePreferenceFragment {
private static final String ENABLED = Settings.Secure.ACCESSIBILITY_DISPLAY_INVERSION_ENABLED;
private final Handler mHandler = new Handler();
@@ -73,6 +72,11 @@
}
@Override
+ protected void updateShortcutTitle(ShortcutPreference shortcutPreference) {
+ shortcutPreference.setTitle(R.string.accessibility_display_inversion_shortcut_title);
+ }
+
+ @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
mComponentName = COLOR_INVERSION_COMPONENT_NAME;
@@ -90,7 +94,20 @@
updateSwitchBarToggleSwitch();
}
};
- return super.onCreateView(inflater, container, savedInstanceState);
+
+ final View view = super.onCreateView(inflater, container, savedInstanceState);
+ updateFooterPreference();
+ return view;
+ }
+
+ private void updateFooterPreference() {
+ final String title = getPrefContext().getString(
+ R.string.accessibility_color_inversion_about_title);
+ final String learnMoreContentDescription = getPrefContext().getString(
+ R.string.accessibility_color_inversion_footer_learn_more_content_description);
+ mFooterPreferenceController.setIntroductionTitle(title);
+ mFooterPreferenceController.setupHelpLink(getHelpResource(), learnMoreContentDescription);
+ mFooterPreferenceController.displayPreference(getPreferenceScreen());
}
@Override
diff --git a/src/com/android/settings/accessibility/ToggleDaltonizerPreferenceFragment.java b/src/com/android/settings/accessibility/ToggleDaltonizerPreferenceFragment.java
index 4bcf478..c9449d24 100644
--- a/src/com/android/settings/accessibility/ToggleDaltonizerPreferenceFragment.java
+++ b/src/com/android/settings/accessibility/ToggleDaltonizerPreferenceFragment.java
@@ -92,12 +92,20 @@
updateSwitchBarToggleSwitch();
}
};
- return super.onCreateView(inflater, container, savedInstanceState);
+
+ final View view = super.onCreateView(inflater, container, savedInstanceState);
+ updateFooterPreference();
+ return view;
}
- @Override
- public void onViewCreated(View view, Bundle savedInstanceState) {
- super.onViewCreated(view, savedInstanceState);
+ private void updateFooterPreference() {
+ final String title = getPrefContext()
+ .getString(R.string.accessibility_daltonizer_about_title);
+ final String learnMoreContentDescription = getPrefContext()
+ .getString(R.string.accessibility_daltonizer_footer_learn_more_content_description);
+ mFooterPreferenceController.setIntroductionTitle(title);
+ mFooterPreferenceController.setupHelpLink(getHelpResource(), learnMoreContentDescription);
+ mFooterPreferenceController.displayPreference(getPreferenceScreen());
}
/** Customizes the order by preference key. */
@@ -168,6 +176,11 @@
}
@Override
+ protected void updateShortcutTitle(ShortcutPreference shortcutPreference) {
+ shortcutPreference.setTitle(R.string.accessibility_daltonizer_shortcut_title);
+ }
+
+ @Override
int getUserShortcutTypes() {
return AccessibilityUtil.getUserShortcutTypesFromSettings(getPrefContext(),
mComponentName);
diff --git a/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragment.java b/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragment.java
index 510f8d3..245f362 100644
--- a/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragment.java
+++ b/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragment.java
@@ -57,7 +57,6 @@
import com.android.settings.utils.LocaleUtils;
import com.android.settings.widget.SettingsMainSwitchBar;
import com.android.settings.widget.SettingsMainSwitchPreference;
-import com.android.settingslib.HelpUtils;
import com.android.settingslib.accessibility.AccessibilityUtils;
import com.android.settingslib.widget.IllustrationPreference;
import com.android.settingslib.widget.OnMainSwitchChangeListener;
@@ -78,6 +77,7 @@
protected SettingsMainSwitchPreference mToggleServiceSwitchPreference;
protected ShortcutPreference mShortcutPreference;
protected Preference mSettingsPreference;
+ protected AccessibilityFooterPreferenceController mFooterPreferenceController;
protected String mPreferenceKey;
protected CharSequence mSettingsTitle;
@@ -284,7 +284,14 @@
abstract int getUserShortcutTypes();
protected void updateToggleServiceTitle(SettingsMainSwitchPreference switchPreference) {
- switchPreference.setTitle(R.string.accessibility_service_primary_switch_title);
+ final CharSequence title =
+ getString(R.string.accessibility_service_primary_switch_title, mPackageName);
+ switchPreference.setTitle(title);
+ }
+
+ protected void updateShortcutTitle(ShortcutPreference shortcutPreference) {
+ final CharSequence title = getString(R.string.accessibility_shortcut_title, mPackageName);
+ shortcutPreference.setTitle(title);
}
protected abstract void onPreferenceToggled(String preferenceKey, boolean enabled);
@@ -434,8 +441,7 @@
mShortcutPreference.setKey(getShortcutPreferenceKey());
mShortcutPreference.setOnClickCallback(this);
- final CharSequence title = getString(R.string.accessibility_shortcut_title, mPackageName);
- mShortcutPreference.setTitle(title);
+ updateShortcutTitle(mShortcutPreference);
final PreferenceCategory generalCategory = findPreference(KEY_GENERAL_CATEGORY);
generalCategory.addPreference(mShortcutPreference);
@@ -463,33 +469,19 @@
final PreferenceScreen screen = getPreferenceScreen();
final CharSequence htmlDescription = Html.fromHtml(mHtmlDescription.toString(),
Html.FROM_HTML_MODE_COMPACT, mImageGetter, /* tagHandler= */ null);
- final String iconContentDescription =
- getString(R.string.accessibility_introduction_title, mPackageName);
final AccessibilityFooterPreference htmlFooterPreference =
new AccessibilityFooterPreference(screen.getContext());
htmlFooterPreference.setKey(KEY_HTML_DESCRIPTION_PREFERENCE);
htmlFooterPreference.setSummary(htmlDescription);
- htmlFooterPreference.setContentDescription(
- generateFooterContentDescription(htmlDescription));
-
- // Only framework tools support help link
- if (getHelpResource() != 0) {
- htmlFooterPreference.setLearnMoreAction(view -> {
- final Intent helpIntent = HelpUtils.getHelpIntent(
- getContext(), getContext().getString(getHelpResource()),
- getContext().getClass().getName());
- view.startActivityForResult(helpIntent, 0);
- });
-
- final String learnMoreContentDescription = getPrefContext().getString(
- R.string.footer_learn_more_content_description, mPackageName);
- htmlFooterPreference.setLearnMoreContentDescription(learnMoreContentDescription);
- htmlFooterPreference.setLinkEnabled(true);
- } else {
- htmlFooterPreference.setLinkEnabled(false);
- }
screen.addPreference(htmlFooterPreference);
+
+ // TODO(b/171272809): Migrate to DashboardFragment.
+ final String title = getString(R.string.accessibility_introduction_title, mPackageName);
+ mFooterPreferenceController = new AccessibilityFooterPreferenceController(
+ screen.getContext(), htmlFooterPreference.getKey());
+ mFooterPreferenceController.setIntroductionTitle(title);
+ mFooterPreferenceController.displayPreference(screen);
}
private void initFooterPreference() {
@@ -512,41 +504,22 @@
*
* @param screen The preference screen to add the footer preference
* @param summary The summary of the preference summary.
- * @param iconContentDescription The content description of icon in the footer.
+ * @param introductionTitle The title of introduction in the footer.
*/
@VisibleForTesting
void createFooterPreference(PreferenceScreen screen, CharSequence summary,
- String iconContentDescription) {
+ String introductionTitle) {
final AccessibilityFooterPreference footerPreference =
new AccessibilityFooterPreference(screen.getContext());
footerPreference.setSummary(summary);
- footerPreference.setContentDescription(
- generateFooterContentDescription(summary));
-
- // Only framework tools support help link
- if (getHelpResource() != 0) {
- footerPreference.setLearnMoreAction(view -> {
- final Intent helpIntent = HelpUtils.getHelpIntent(
- getContext(), getContext().getString(getHelpResource()),
- getContext().getClass().getName());
- view.startActivityForResult(helpIntent, 0);
- });
-
- final String learnMoreContentDescription = getPrefContext().getString(
- R.string.footer_learn_more_content_description, mPackageName);
- footerPreference.setLearnMoreContentDescription(learnMoreContentDescription);
- }
screen.addPreference(footerPreference);
+
+ mFooterPreferenceController = new AccessibilityFooterPreferenceController(
+ screen.getContext(), footerPreference.getKey());
+ mFooterPreferenceController.setIntroductionTitle(introductionTitle);
+ mFooterPreferenceController.displayPreference(screen);
}
- private CharSequence generateFooterContentDescription(CharSequence footerContent) {
- final StringBuffer sb = new StringBuffer();
- sb.append(getPrefContext().getString(
- R.string.accessibility_introduction_title, mPackageName))
- .append("\n\n")
- .append(footerContent);
- return sb;
- }
@VisibleForTesting
void setupEditShortcutDialog(Dialog dialog) {
final View dialogSoftwareView = dialog.findViewById(R.id.software_shortcut);
@@ -611,6 +584,18 @@
return value;
}
+ private static CharSequence getSoftwareShortcutTypeSummary(Context context) {
+ int resId;
+ if (AccessibilityUtil.isFloatingMenuEnabled(context)) {
+ resId = R.string.accessibility_shortcut_edit_summary_software;
+ } else if (AccessibilityUtil.isGestureNavigateEnabled(context)) {
+ resId = R.string.accessibility_shortcut_edit_summary_software_gesture;
+ } else {
+ resId = R.string.accessibility_shortcut_edit_summary_software;
+ }
+ return context.getText(resId);
+ }
+
protected CharSequence getShortcutTypeSummary(Context context) {
if (!mShortcutPreference.isSettingsEditable()) {
return context.getText(R.string.accessibility_shortcut_edit_dialog_title_hardware);
@@ -624,11 +609,8 @@
mComponentName.flattenToString(), UserShortcutType.SOFTWARE);
final List<CharSequence> list = new ArrayList<>();
- final CharSequence softwareTitle = context.getText(
- R.string.accessibility_shortcut_edit_summary_software);
-
if (hasShortcutType(shortcutTypes, UserShortcutType.SOFTWARE)) {
- list.add(softwareTitle);
+ list.add(getSoftwareShortcutTypeSummary(context));
}
if (hasShortcutType(shortcutTypes, UserShortcutType.HARDWARE)) {
final CharSequence hardwareTitle = context.getText(
@@ -638,7 +620,7 @@
// Show software shortcut if first time to use.
if (list.isEmpty()) {
- list.add(softwareTitle);
+ list.add(getSoftwareShortcutTypeSummary(context));
}
return CaseMap.toTitle().wholeString().noLowercase().apply(Locale.getDefault(), /* iter= */
diff --git a/src/com/android/settings/accessibility/ToggleReduceBrightColorsPreferenceFragment.java b/src/com/android/settings/accessibility/ToggleReduceBrightColorsPreferenceFragment.java
index e60751e..81bd45a 100644
--- a/src/com/android/settings/accessibility/ToggleReduceBrightColorsPreferenceFragment.java
+++ b/src/com/android/settings/accessibility/ToggleReduceBrightColorsPreferenceFragment.java
@@ -86,6 +86,7 @@
// Parent sets the title when creating the view, so set it after calling super
mToggleServiceSwitchPreference.setTitle(R.string.reduce_bright_colors_switch_title);
updateGeneralCategoryOrder();
+ updateFooterPreference();
return view;
}
@@ -101,6 +102,12 @@
generalCategory.addPreference(persist);
}
+ private void updateFooterPreference() {
+ final String title = getPrefContext().getString(R.string.reduce_bright_colors_about_title);
+ mFooterPreferenceController.setIntroductionTitle(title);
+ mFooterPreferenceController.displayPreference(getPreferenceScreen());
+ }
+
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
@@ -135,7 +142,6 @@
return R.xml.reduce_bright_colors_settings;
}
-
@Override
protected void onPreferenceToggled(String preferenceKey, boolean enabled) {
AccessibilityStatsLogUtils.logAccessibilityServiceEnabled(mComponentName, enabled);
@@ -155,6 +161,11 @@
}
@Override
+ protected void updateShortcutTitle(ShortcutPreference shortcutPreference) {
+ shortcutPreference.setTitle(R.string.reduce_bright_colors_shortcut_title);
+ }
+
+ @Override
int getUserShortcutTypes() {
return AccessibilityUtil.getUserShortcutTypesFromSettings(getPrefContext(),
mComponentName);
diff --git a/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragment.java b/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragment.java
index 9266f72..c152174 100644
--- a/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragment.java
+++ b/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragment.java
@@ -95,7 +95,20 @@
removeDialog(DialogEnums.EDIT_SHORTCUT);
mShortcutPreference.setSummary(getShortcutTypeSummary(getPrefContext()));
};
- return super.onCreateView(inflater, container, savedInstanceState);
+
+ final View view = super.onCreateView(inflater, container, savedInstanceState);
+ updateFooterPreference();
+ return view;
+ }
+
+ private void updateFooterPreference() {
+ final String title = getPrefContext().getString(
+ R.string.accessibility_screen_magnification_about_title);
+ final String learnMoreContentDescription = getPrefContext().getString(
+ R.string.accessibility_screen_magnification_footer_learn_more_content_description);
+ mFooterPreferenceController.setIntroductionTitle(title);
+ mFooterPreferenceController.setupHelpLink(getHelpResource(), learnMoreContentDescription);
+ mFooterPreferenceController.displayPreference(getPreferenceScreen());
}
@Override
@@ -128,7 +141,7 @@
switch (dialogId) {
case DialogEnums.GESTURE_NAVIGATION_TUTORIAL:
return AccessibilityGestureNavigationTutorial
- .showGestureNavigationTutorialDialog(getPrefContext());
+ .showAccessibilityGestureTutorialDialog(getPrefContext());
case DialogEnums.MAGNIFICATION_EDIT_SHORTCUT:
final CharSequence dialogTitle = getPrefContext().getString(
R.string.accessibility_shortcut_title, mPackageName);
@@ -252,6 +265,18 @@
return (value & type) == type;
}
+ private static CharSequence getSoftwareShortcutTypeSummary(Context context) {
+ int resId;
+ if (AccessibilityUtil.isFloatingMenuEnabled(context)) {
+ resId = R.string.accessibility_shortcut_edit_summary_software;
+ } else if (AccessibilityUtil.isGestureNavigateEnabled(context)) {
+ resId = R.string.accessibility_shortcut_edit_summary_software_gesture;
+ } else {
+ resId = R.string.accessibility_shortcut_edit_summary_software;
+ }
+ return context.getText(resId);
+ }
+
@Override
protected CharSequence getShortcutTypeSummary(Context context) {
if (!mShortcutPreference.isChecked()) {
@@ -262,18 +287,14 @@
MAGNIFICATION_CONTROLLER_NAME, UserShortcutType.SOFTWARE);
final List<CharSequence> list = new ArrayList<>();
- final CharSequence softwareTitle = context.getText(
- R.string.accessibility_shortcut_edit_summary_software);
-
if (hasShortcutType(shortcutTypes, UserShortcutType.SOFTWARE)) {
- list.add(softwareTitle);
+ list.add(getSoftwareShortcutTypeSummary(context));
}
if (hasShortcutType(shortcutTypes, UserShortcutType.HARDWARE)) {
final CharSequence hardwareTitle = context.getText(
R.string.accessibility_shortcut_hardware_keyword);
list.add(hardwareTitle);
}
-
if (hasShortcutType(shortcutTypes, UserShortcutType.TRIPLETAP)) {
final CharSequence tripleTapTitle = context.getText(
R.string.accessibility_shortcut_triple_tap_keyword);
@@ -282,7 +303,7 @@
// Show software shortcut if first time to use.
if (list.isEmpty()) {
- list.add(softwareTitle);
+ list.add(getSoftwareShortcutTypeSummary(context));
}
return CaseMap.toTitle().wholeString().noLowercase().apply(Locale.getDefault(), /* iter= */
@@ -397,6 +418,11 @@
}
@Override
+ protected void updateShortcutTitle(ShortcutPreference shortcutPreference) {
+ shortcutPreference.setTitle(R.string.accessibility_screen_magnification_shortcut_title);
+ }
+
+ @Override
protected void updateShortcutPreference() {
final int shortcutTypes = PreferredShortcuts.retrieveUserShortcutType(getPrefContext(),
MAGNIFICATION_CONTROLLER_NAME, UserShortcutType.SOFTWARE);
diff --git a/src/com/android/settings/accessibility/ToggleSelectToSpeakPreferenceFragmentForSetupWizard.java b/src/com/android/settings/accessibility/ToggleSelectToSpeakPreferenceFragmentForSetupWizard.java
index 4334cd0..9ca1f19 100644
--- a/src/com/android/settings/accessibility/ToggleSelectToSpeakPreferenceFragmentForSetupWizard.java
+++ b/src/com/android/settings/accessibility/ToggleSelectToSpeakPreferenceFragmentForSetupWizard.java
@@ -33,7 +33,7 @@
@Override
public int getMetricsCategory() {
- return SettingsEnums.SUW_ACCESSIBILITY_TOGGLE_SCREEN_READER;
+ return SettingsEnums.SUW_ACCESSIBILITY_TOGGLE_SELECT_TO_SPEAK;
}
@Override
diff --git a/src/com/android/settings/activityembedding/ActivityEmbeddingRulesController.java b/src/com/android/settings/activityembedding/ActivityEmbeddingRulesController.java
new file mode 100644
index 0000000..3967bd7
--- /dev/null
+++ b/src/com/android/settings/activityembedding/ActivityEmbeddingRulesController.java
@@ -0,0 +1,116 @@
+/*
+ * Copyright (C) 2021 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.activityembedding;
+
+import android.app.Activity;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.util.LayoutDirection;
+import android.util.Log;
+
+import androidx.annotation.NonNull;
+import androidx.window.embedding.ActivityFilter;
+import androidx.window.embedding.SplitController;
+import androidx.window.embedding.SplitPairFilter;
+import androidx.window.embedding.SplitPairRule;
+import androidx.window.embedding.SplitPlaceholderRule;
+
+import com.android.settings.Settings;
+import com.android.settings.SubSettings;
+import com.android.settings.Utils;
+import com.android.settings.homepage.SettingsHomepageActivity;
+
+import java.util.HashSet;
+import java.util.Set;
+
+/** A class to initialize split rules for activity embedding. */
+public class ActivityEmbeddingRulesController {
+
+ private static final String TAG = "ActivityEmbeddingCtrl ";
+ private final Context mContext;
+ private final SplitController mSplitController;
+
+ public ActivityEmbeddingRulesController(Context context) {
+ mContext = context;
+ mSplitController = SplitController.getInstance();
+ }
+
+ /**
+ * Set up embedding rules to place activities to the right pane.
+ */
+ public void initRules() {
+ if (!ActivityEmbeddingUtils.isEmbeddingActivityEnabled(mContext)) {
+ Log.d(TAG, "Not support this feature now");
+ return;
+ }
+
+ mSplitController.clearRegisteredRules();
+
+ // Set a placeholder for home page.
+ registerHomepagePlaceholderRule();
+ // Set subsettings rule.
+ registerTwoPanePairRule(mContext,
+ getComponentName(Settings.class),
+ getComponentName(SubSettings.class),
+ true /* finishPrimaryWithSecondary */,
+ true /* finishSecondaryWithPrimary */);
+ }
+
+ /** Register a SplitPairRule for 2-pane. */
+ public static void registerTwoPanePairRule(Context context,
+ ComponentName primary, ComponentName secondary,
+ boolean finishPrimaryWithSecondary, boolean finishSecondaryWithPrimary) {
+ final Set<SplitPairFilter> filters = new HashSet<>();
+ filters.add(new SplitPairFilter(primary, secondary,
+ null /* secondaryActivityIntentAction */));
+
+ SplitController.getInstance().registerRule(new SplitPairRule(filters,
+ finishPrimaryWithSecondary,
+ finishSecondaryWithPrimary, true /* clearTop */,
+ ActivityEmbeddingUtils.getMinCurrentScreenSplitWidthPx(context),
+ ActivityEmbeddingUtils.getMinSmallestScreenSplitWidthPx(context),
+ ActivityEmbeddingUtils.SPLIT_RATIO,
+ LayoutDirection.LOCALE));
+ }
+
+ private void registerHomepagePlaceholderRule() {
+ final Set<ActivityFilter> activityFilters = new HashSet<>();
+ activityFilters.add(new ActivityFilter(getComponentName(SettingsHomepageActivity.class),
+ null /* intentAction */));
+ activityFilters.add(new ActivityFilter(getComponentName(Settings.class),
+ null /* intentAction */));
+ activityFilters.add(new ActivityFilter(new ComponentName(Utils.SETTINGS_PACKAGE_NAME,
+ SettingsHomepageActivity.ALIAS_DEEP_LINK), null /* intentAction */));
+ final Intent intent = new Intent();
+ intent.setComponent(getComponentName(Settings.NetworkDashboardActivity.class));
+ final SplitPlaceholderRule placeholderRule = new SplitPlaceholderRule(
+ activityFilters,
+ intent,
+ ActivityEmbeddingUtils.getMinCurrentScreenSplitWidthPx(mContext),
+ ActivityEmbeddingUtils.getMinSmallestScreenSplitWidthPx(mContext),
+ ActivityEmbeddingUtils.SPLIT_RATIO,
+ LayoutDirection.LOCALE);
+
+ mSplitController.registerRule(placeholderRule);
+ }
+
+ @NonNull
+ private ComponentName getComponentName(Class<? extends Activity> activityClass) {
+ return new ComponentName(mContext.getPackageName(), activityClass.getName());
+ }
+}
diff --git a/src/com/android/settings/activityembedding/ActivityEmbeddingUtils.java b/src/com/android/settings/activityembedding/ActivityEmbeddingUtils.java
new file mode 100644
index 0000000..ab999ed
--- /dev/null
+++ b/src/com/android/settings/activityembedding/ActivityEmbeddingUtils.java
@@ -0,0 +1,65 @@
+/*
+ * Copyright (C) 2021 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.activityembedding;
+
+import android.content.Context;
+import android.util.DisplayMetrics;
+import android.util.FeatureFlagUtils;
+import android.util.Log;
+import android.util.TypedValue;
+
+import androidx.window.embedding.SplitController;
+
+/** An util class collecting all common methods for the embedding activity features. */
+public class ActivityEmbeddingUtils {
+ public static final float SPLIT_RATIO = 0.5f;
+ // The smallest value of current width of the window when the split should be used.
+ private static final float MIN_CURRENT_SCREEN_SPLIT_WIDTH_DP = 720f;
+ // The smallest value of the smallest-width (sw) of the window in any rotation when
+ // the split should be used.
+ private static final float MIN_SMALLEST_SCREEN_SPLIT_WIDTH_DP = 600f;
+ private static final String TAG = "ActivityEmbeddingUtils";
+
+ /** Get the smallest pixel value of width of the window when the split should be used. */
+ public static int getMinCurrentScreenSplitWidthPx(Context context) {
+ final DisplayMetrics dm = context.getResources().getDisplayMetrics();
+ return (int) TypedValue.applyDimension(
+ TypedValue.COMPLEX_UNIT_DIP, MIN_CURRENT_SCREEN_SPLIT_WIDTH_DP, dm);
+ }
+
+ /**
+ * Get the smallest pixel value of the smallest-width (sw) of the window in any rotation when
+ * the split should be used.
+ */
+ public static int getMinSmallestScreenSplitWidthPx(Context context) {
+ final DisplayMetrics dm = context.getResources().getDisplayMetrics();
+ return (int) TypedValue.applyDimension(
+ TypedValue.COMPLEX_UNIT_DIP, MIN_SMALLEST_SCREEN_SPLIT_WIDTH_DP, dm);
+ }
+
+ /** Whether to support embedding activity feature. */
+ public static boolean isEmbeddingActivityEnabled(Context context) {
+ final boolean isFlagEnabled = FeatureFlagUtils.isEnabled(context,
+ FeatureFlagUtils.SETTINGS_SUPPORT_LARGE_SCREEN);
+ final boolean isSplitSupported = SplitController.getInstance().isSplitSupported();
+
+ Log.d(TAG, "isFlagEnabled = " + isFlagEnabled);
+ Log.d(TAG, "isSplitSupported = " + isSplitSupported);
+
+ return isFlagEnabled && isSplitSupported;
+ }
+}
diff --git a/src/com/android/settings/applications/appinfo/AppButtonsPreferenceController.java b/src/com/android/settings/applications/appinfo/AppButtonsPreferenceController.java
index 09bf86a..1b270d6 100644
--- a/src/com/android/settings/applications/appinfo/AppButtonsPreferenceController.java
+++ b/src/com/android/settings/applications/appinfo/AppButtonsPreferenceController.java
@@ -226,7 +226,8 @@
uninstallDaIntent.putExtra(DeviceAdminAdd.EXTRA_DEVICE_ADMIN_PACKAGE_NAME,
packageName);
mMetricsFeatureProvider.action(mActivity,
- SettingsEnums.ACTION_SETTINGS_UNINSTALL_DEVICE_ADMIN);
+ SettingsEnums.ACTION_SETTINGS_UNINSTALL_DEVICE_ADMIN,
+ getPackageNameForMetric());
mFragment.startActivityForResult(uninstallDaIntent, mRequestRemoveDeviceAdmin);
return;
}
@@ -253,7 +254,8 @@
mActivity,
mAppEntry.info.enabled
? SettingsEnums.ACTION_SETTINGS_DISABLE_APP
- : SettingsEnums.ACTION_SETTINGS_ENABLE_APP);
+ : SettingsEnums.ACTION_SETTINGS_ENABLE_APP,
+ getPackageNameForMetric());
AsyncTask.execute(new DisableChangerRunnable(mPm, mAppEntry.info.packageName,
PackageManager.COMPONENT_ENABLED_STATE_DEFAULT));
}
@@ -270,7 +272,9 @@
@Override
public void onClick(View v) {
mMetricsFeatureProvider.action(
- mActivity, SettingsEnums.ACTION_APP_INFO_FORCE_STOP);
+ mActivity,
+ SettingsEnums.ACTION_APP_INFO_FORCE_STOP,
+ getPackageNameForMetric());
// force stop
if (mPm.isPackageStateProtected(mAppEntry.info.packageName, mUserId)) {
RestrictedLockUtils.sendShowAdminSupportDetailsIntent(mActivity,
@@ -757,6 +761,14 @@
|| AppUtils.isMainlineModule(mPm, mAppEntry.info.packageName));
}
+ private String getPackageNameForMetric() {
+ final String packageName =
+ mAppEntry != null && mAppEntry.info != null
+ ? mAppEntry.info.packageName
+ : null;
+ return packageName != null ? packageName : "";
+ }
+
/**
* Changes the status of disable/enable for a package
*/
diff --git a/src/com/android/settings/backup/SettingsBackupHelper.java b/src/com/android/settings/backup/SettingsBackupHelper.java
index 6437b78..a682df8 100644
--- a/src/com/android/settings/backup/SettingsBackupHelper.java
+++ b/src/com/android/settings/backup/SettingsBackupHelper.java
@@ -22,6 +22,7 @@
import android.app.backup.BackupHelper;
import android.os.ParcelFileDescriptor;
+import com.android.settings.fuelgauge.BatteryBackupHelper;
import com.android.settings.shortcut.CreateShortcutPreferenceController;
import java.io.FileInputStream;
@@ -37,6 +38,7 @@
public void onCreate() {
super.onCreate();
addHelper("no-op", new NoOpHelper());
+ addHelper(BatteryBackupHelper.TAG, new BatteryBackupHelper(this));
}
@Override
diff --git a/src/com/android/settings/biometrics/face/FaceEnrollIntroduction.java b/src/com/android/settings/biometrics/face/FaceEnrollIntroduction.java
index ae21177..707dea9 100644
--- a/src/com/android/settings/biometrics/face/FaceEnrollIntroduction.java
+++ b/src/com/android/settings/biometrics/face/FaceEnrollIntroduction.java
@@ -112,6 +112,14 @@
howMessage.setText(getHowMessage());
inControlMessage.setText(getInControlMessage());
+ // Set up and show the "less secure" info section if necessary.
+ if (getResources().getBoolean(R.bool.config_face_intro_show_less_secure)) {
+ final LinearLayout infoRowLessSecure = findViewById(R.id.info_row_less_secure);
+ final ImageView iconLessSecure = findViewById(R.id.icon_less_secure);
+ infoRowLessSecure.setVisibility(View.VISIBLE);
+ iconLessSecure.getBackground().setColorFilter(getIconColorFilter());
+ }
+
// Set up and show the "require eyes" info section if necessary.
if (getResources().getBoolean(R.bool.config_face_intro_show_require_eyes)) {
final LinearLayout infoRowRequireEyes = findViewById(R.id.info_row_require_eyes);
diff --git a/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrolling.java b/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrolling.java
index 748a1dc..c2bcee3 100644
--- a/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrolling.java
+++ b/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrolling.java
@@ -18,6 +18,7 @@
import android.animation.Animator;
import android.animation.ObjectAnimator;
+import android.annotation.IntDef;
import android.annotation.Nullable;
import android.app.Dialog;
import android.app.settings.SettingsEnums;
@@ -46,7 +47,6 @@
import android.widget.ProgressBar;
import android.widget.TextView;
-import androidx.annotation.IntDef;
import androidx.appcompat.app.AlertDialog;
import com.android.settings.R;
@@ -158,7 +158,7 @@
mIsSetupWizard = WizardManagerHelper.isAnySetupWizard(getIntent());
if (mCanAssumeUdfps) {
- updateTitleAndDescriptionForUdfps();
+ updateTitleAndDescription();
} else {
setHeaderText(R.string.security_settings_fingerprint_enroll_repeat_title);
}
@@ -567,6 +567,7 @@
private final Animator.AnimatorListener mProgressAnimationListener =
new Animator.AnimatorListener() {
+
@Override
public void onAnimationStart(Animator animation) { }
diff --git a/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollFindSensor.java b/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollFindSensor.java
index cabe5bf..e4de7f1 100644
--- a/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollFindSensor.java
+++ b/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollFindSensor.java
@@ -22,9 +22,11 @@
import android.hardware.fingerprint.FingerprintSensorPropertiesInternal;
import android.os.Bundle;
import android.view.View;
+import android.view.accessibility.AccessibilityManager;
import androidx.annotation.Nullable;
+import com.airbnb.lottie.LottieAnimationView;
import com.android.settings.R;
import com.android.settings.Utils;
import com.android.settings.biometrics.BiometricEnrollBase;
@@ -80,6 +82,13 @@
.setTheme(R.style.SudGlifButton_Primary)
.build()
);
+
+ LottieAnimationView lottieAnimationView = findViewById(R.id.illustration_lottie);
+ AccessibilityManager am = getSystemService(AccessibilityManager.class);
+ if (am.isEnabled()) {
+ lottieAnimationView.setAnimation(R.raw.udfps_edu_a11y_lottie);
+ }
+
} else {
setHeaderText(R.string.security_settings_fingerprint_enroll_find_sensor_title);
setDescriptionText(R.string.security_settings_fingerprint_enroll_find_sensor_message);
diff --git a/src/com/android/settings/biometrics/fingerprint/FingerprintErrorDialog.java b/src/com/android/settings/biometrics/fingerprint/FingerprintErrorDialog.java
index fa92951..0fc8670 100644
--- a/src/com/android/settings/biometrics/fingerprint/FingerprintErrorDialog.java
+++ b/src/com/android/settings/biometrics/fingerprint/FingerprintErrorDialog.java
@@ -31,12 +31,18 @@
*/
public class FingerprintErrorDialog extends BiometricErrorDialog {
public static void showErrorDialog(BiometricEnrollBase host, int errMsgId) {
+ if (host.isFinishing()) {
+ return;
+ }
+
+ final FragmentManager fragmentManager = host.getSupportFragmentManager();
+ if (fragmentManager.isDestroyed()) {
+ return;
+ }
+
final CharSequence errMsg = host.getText(getErrorMessage(errMsgId));
final FingerprintErrorDialog dialog = newInstance(errMsg, errMsgId);
- final FragmentManager fragmentManager = host.getSupportFragmentManager();
- if (!fragmentManager.isDestroyed()) {
- dialog.show(fragmentManager, FingerprintErrorDialog.class.getName());
- }
+ dialog.show(fragmentManager, FingerprintErrorDialog.class.getName());
}
private static int getErrorMessage(int errMsgId) {
diff --git a/src/com/android/settings/core/InstrumentedPreferenceFragment.java b/src/com/android/settings/core/InstrumentedPreferenceFragment.java
index f6115fc..48e5176 100644
--- a/src/com/android/settings/core/InstrumentedPreferenceFragment.java
+++ b/src/com/android/settings/core/InstrumentedPreferenceFragment.java
@@ -158,8 +158,7 @@
switch (newState) {
case RecyclerView.SCROLL_STATE_DRAGGING:
final Configuration.Builder builder =
- new Configuration.Builder(CUJ_SETTINGS_PAGE_SCROLL)
- .setView(recyclerView)
+ Configuration.Builder.withView(CUJ_SETTINGS_PAGE_SCROLL, recyclerView)
.setTag(mClassName);
mMonitor.begin(builder);
break;
diff --git a/src/com/android/settings/core/PreferenceXmlParserUtils.java b/src/com/android/settings/core/PreferenceXmlParserUtils.java
index 240426d..a1a8d67 100644
--- a/src/com/android/settings/core/PreferenceXmlParserUtils.java
+++ b/src/com/android/settings/core/PreferenceXmlParserUtils.java
@@ -73,7 +73,8 @@
MetadataFlag.FLAG_NEED_PREF_ICON,
MetadataFlag.FLAG_NEED_SEARCHABLE,
MetadataFlag.FLAG_UNAVAILABLE_SLICE_SUBTITLE,
- MetadataFlag.FLAG_FOR_WORK})
+ MetadataFlag.FLAG_FOR_WORK,
+ MetadataFlag.FLAG_NEED_HIGHLIGHTABLE_MENU_KEY})
@Retention(RetentionPolicy.SOURCE)
public @interface MetadataFlag {
@@ -89,6 +90,7 @@
int FLAG_NEED_PREF_APPEND = 1 << 10;
int FLAG_UNAVAILABLE_SLICE_SUBTITLE = 1 << 11;
int FLAG_FOR_WORK = 1 << 12;
+ int FLAG_NEED_HIGHLIGHTABLE_MENU_KEY = 1 << 13;
}
public static final String METADATA_PREF_TYPE = "type";
@@ -102,6 +104,7 @@
public static final String METADATA_APPEND = "staticPreferenceLocation";
public static final String METADATA_UNAVAILABLE_SLICE_SUBTITLE = "unavailable_slice_subtitle";
public static final String METADATA_FOR_WORK = "for_work";
+ public static final String METADATA_HIGHLIGHTABLE_MENU_KEY = "highlightable_menu_key";
private static final String ENTRIES_SEPARATOR = "|";
@@ -250,6 +253,10 @@
preferenceMetadata.putBoolean(METADATA_FOR_WORK,
isForWork(preferenceAttributes));
}
+ if (hasFlag(flags, MetadataFlag.FLAG_NEED_HIGHLIGHTABLE_MENU_KEY)) {
+ preferenceMetadata.putString(METADATA_HIGHLIGHTABLE_MENU_KEY,
+ getHighlightableMenuKey(preferenceAttributes));
+ }
metadata.add(preferenceMetadata);
preferenceAttributes.recycle();
@@ -314,6 +321,10 @@
return styledAttributes.getString(R.styleable.Preference_controller);
}
+ private static String getHighlightableMenuKey(TypedArray styledAttributes) {
+ return styledAttributes.getString(R.styleable.Preference_highlightableMenuKey);
+ }
+
private static int getIcon(TypedArray styledAttributes) {
return styledAttributes.getResourceId(com.android.internal.R.styleable.Icon_icon, 0);
}
diff --git a/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java b/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java
index a03a4f9..4581f6c 100644
--- a/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java
+++ b/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java
@@ -422,19 +422,19 @@
mMetricsFeatureProvider.logStartedIntent(intent, sourceMetricCategory);
if (tile.userHandle == null || tile.isPrimaryProfileOnly()) {
- activity.startActivityForResult(intent, 0);
+ activity.startActivity(intent);
} else if (tile.userHandle.size() == 1) {
- activity.startActivityForResultAsUser(intent, 0, tile.userHandle.get(0));
+ activity.startActivityAsUser(intent, tile.userHandle.get(0));
} else {
final UserHandle userHandle = intent.getParcelableExtra(EXTRA_USER);
if (userHandle != null && tile.userHandle.contains(userHandle)) {
- activity.startActivityForResultAsUser(intent, 0, userHandle);
+ activity.startActivityAsUser(intent, userHandle);
return;
}
final List<UserHandle> resolvableUsers = getResolvableUsers(intent, tile);
if (resolvableUsers.size() == 1) {
- activity.startActivityForResultAsUser(intent, 0, resolvableUsers.get(0));
+ activity.startActivityAsUser(intent, resolvableUsers.get(0));
return;
}
diff --git a/src/com/android/settings/deviceinfo/StorageCategoryFragment.java b/src/com/android/settings/deviceinfo/StorageCategoryFragment.java
index 98736e3..7cc0a3e 100644
--- a/src/com/android/settings/deviceinfo/StorageCategoryFragment.java
+++ b/src/com/android/settings/deviceinfo/StorageCategoryFragment.java
@@ -286,6 +286,7 @@
metricsFeatureProvider.logClickedPreference(preference, getMetricsCategory());
metricsFeatureProvider.action(context, SettingsEnums.STORAGE_FREE_UP_SPACE_NOW);
final Intent intent = new Intent(StorageManager.ACTION_MANAGE_STORAGE);
+ intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivityAsUser(intent, new UserHandle(mUserId));
return true;
}
diff --git a/src/com/android/settings/deviceinfo/StorageDashboardFragment.java b/src/com/android/settings/deviceinfo/StorageDashboardFragment.java
index 6dbc3aa..4903948 100644
--- a/src/com/android/settings/deviceinfo/StorageDashboardFragment.java
+++ b/src/com/android/settings/deviceinfo/StorageDashboardFragment.java
@@ -486,6 +486,7 @@
metricsFeatureProvider.logClickedPreference(preference, getMetricsCategory());
metricsFeatureProvider.action(context, SettingsEnums.STORAGE_FREE_UP_SPACE_NOW);
final Intent intent = new Intent(StorageManager.ACTION_MANAGE_STORAGE);
+ intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivityAsUser(intent, new UserHandle(mUserId));
return true;
}
diff --git a/src/com/android/settings/emergency/MoreSettingsPreferenceController.java b/src/com/android/settings/emergency/MoreSettingsPreferenceController.java
index cbb95a6..d945b21 100644
--- a/src/com/android/settings/emergency/MoreSettingsPreferenceController.java
+++ b/src/com/android/settings/emergency/MoreSettingsPreferenceController.java
@@ -115,7 +115,7 @@
.logClickedPreference(mPreference, getMetricsCategory());
final Intent intent = new Intent(mIntent)
.addCategory(Intent.CATEGORY_LAUNCHER)
- .setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
+ .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
Bundle bundle = new Bundle();
bundle.putString(EXTRA_KEY_ATTRIBUTION, mContext.getPackageName());
mContext.startActivity(intent, bundle);
diff --git a/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java b/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java
index 3319e1b..c067094 100644
--- a/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java
+++ b/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java
@@ -19,6 +19,7 @@
import android.annotation.UserIdInt;
import android.app.Activity;
import android.app.ActivityManager;
+import android.app.backup.BackupManager;
import android.app.settings.SettingsEnums;
import android.content.Context;
import android.content.Intent;
@@ -113,7 +114,12 @@
@VisibleForTesting
RadioButtonPreference mUnrestrictedPreference;
@VisibleForTesting
- boolean enableTriState = true;
+ boolean mEnableTriState = true;
+ @VisibleForTesting
+ @BatteryOptimizeUtils.OptimizationMode
+ int mOptimizationMode = BatteryOptimizeUtils.MODE_UNKNOWN;
+ @VisibleForTesting
+ BackupManager mBackupManager;
private AppButtonsPreferenceController mAppButtonsPreferenceController;
private BackgroundActivityPreferenceController mBackgroundActivityPreferenceController;
@@ -245,7 +251,7 @@
super.onCreate(icicle);
final String packageName = getArguments().getString(EXTRA_PACKAGE_NAME);
- if (enableTriState) {
+ if (mEnableTriState) {
onCreateForTriState(packageName);
} else {
mForegroundPreference = findPreference(KEY_PREF_FOREGROUND);
@@ -263,7 +269,7 @@
super.onResume();
initHeader();
- if (enableTriState) {
+ if (mEnableTriState) {
initPreferenceForTriState(getContext());
final String packageName = mBatteryOptimizeUtils.getPackageName();
FeatureFactory.getFactory(getContext()).getMetricsFeatureProvider()
@@ -276,6 +282,22 @@
}
}
+ @Override
+ public void onDestroy() {
+ super.onDestroy();
+ notifyBackupManager();
+ }
+
+ @VisibleForTesting
+ void notifyBackupManager() {
+ if (mEnableTriState
+ && mOptimizationMode != mBatteryOptimizeUtils.getAppOptimizationMode()) {
+ final BackupManager backupManager = mBackupManager != null
+ ? mBackupManager : new BackupManager(getContext());
+ backupManager.dataChanged();
+ }
+ }
+
@VisibleForTesting
void initHeader() {
final View appSnippet = mHeaderPreference.findViewById(R.id.entity_header);
@@ -303,7 +325,7 @@
controller.setIsInstantApp(AppUtils.isInstant(mAppEntry.info));
}
- if (enableTriState) {
+ if (mEnableTriState) {
final long foregroundTimeMs = bundle.getLong(EXTRA_FOREGROUND_TIME);
final long backgroundTimeMs = bundle.getLong(EXTRA_BACKGROUND_TIME);
final String slotTime = bundle.getString(EXTRA_SLOT_TIME, null);
@@ -339,18 +361,20 @@
final String stateString;
final String footerString;
- if (!mBatteryOptimizeUtils.isValidPackageName()) {
- //Present optimized only string when the package name is invalid.
+ if (!mBatteryOptimizeUtils.isValidPackageName()
+ || mBatteryOptimizeUtils.isAllowlistedExceptIdleApp()) {
+ // Present optimized only string when the package name is invalid or
+ // it's in allow list not idle app.
stateString = context.getString(R.string.manager_battery_usage_optimized_only);
footerString = context.getString(
R.string.manager_battery_usage_footer_limited, stateString);
} else if (mBatteryOptimizeUtils.isSystemOrDefaultApp()) {
- //Present unrestricted only string when the package is system or default active app.
+ // Present unrestricted only string when the package is system or default active app.
stateString = context.getString(R.string.manager_battery_usage_unrestricted_only);
footerString = context.getString(
R.string.manager_battery_usage_footer_limited, stateString);
} else {
- //Present default string to normal app.
+ // Present default string to normal app.
footerString = context.getString(R.string.manager_battery_usage_footer);
}
mFooterPreference.setTitle(footerString);
@@ -374,7 +398,7 @@
@Override
protected int getPreferenceScreenResId() {
- return enableTriState ? R.xml.power_usage_detail : R.xml.power_usage_detail_legacy;
+ return mEnableTriState ? R.xml.power_usage_detail : R.xml.power_usage_detail_legacy;
}
@Override
@@ -388,7 +412,7 @@
(SettingsActivity) getActivity(), this, getSettingsLifecycle(), packageName,
mState, REQUEST_UNINSTALL, REQUEST_REMOVE_DEVICE_ADMIN);
controllers.add(mAppButtonsPreferenceController);
- if (enableTriState) {
+ if (mEnableTriState) {
controllers.add(new UnrestrictedPreferenceController(context, uid, packageName));
controllers.add(new OptimizedPreferenceController(context, uid, packageName));
controllers.add(new RestrictedPreferenceController(context, uid, packageName));
@@ -467,6 +491,7 @@
mBatteryOptimizeUtils = new BatteryOptimizeUtils(
getContext(), getArguments().getInt(EXTRA_UID), packageName);
+ mOptimizationMode = mBatteryOptimizeUtils.getAppOptimizationMode();
}
private CharSequence getAppActiveTime(
diff --git a/src/com/android/settings/fuelgauge/BatteryAppListPreferenceController.java b/src/com/android/settings/fuelgauge/BatteryAppListPreferenceController.java
index 29872ac..bf464a8 100644
--- a/src/com/android/settings/fuelgauge/BatteryAppListPreferenceController.java
+++ b/src/com/android/settings/fuelgauge/BatteryAppListPreferenceController.java
@@ -47,6 +47,7 @@
import com.android.settings.SettingsActivity;
import com.android.settings.core.InstrumentedPreferenceFragment;
import com.android.settings.core.PreferenceControllerMixin;
+import com.android.settings.overlay.FeatureFactory;
import com.android.settingslib.core.AbstractPreferenceController;
import com.android.settingslib.core.lifecycle.Lifecycle;
import com.android.settingslib.core.lifecycle.LifecycleObserver;
@@ -440,8 +441,10 @@
}
private boolean shouldShowSummary(BatteryEntry entry) {
- final CharSequence[] allowlistPackages = mContext.getResources()
- .getTextArray(R.array.allowlist_hide_summary_in_battery_usage);
+ final CharSequence[] allowlistPackages =
+ FeatureFactory.getFactory(mContext)
+ .getPowerUsageFeatureProvider(mContext)
+ .getHideApplicationSummary(mContext);
final String target = entry.getDefaultPackageName();
for (CharSequence packageName : allowlistPackages) {
diff --git a/src/com/android/settings/fuelgauge/BatteryBackupHelper.java b/src/com/android/settings/fuelgauge/BatteryBackupHelper.java
new file mode 100644
index 0000000..24080fe
--- /dev/null
+++ b/src/com/android/settings/fuelgauge/BatteryBackupHelper.java
@@ -0,0 +1,318 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package com.android.settings.fuelgauge;
+
+import android.app.AppGlobals;
+import android.app.AppOpsManager;
+import android.app.backup.BackupDataInputStream;
+import android.app.backup.BackupDataOutput;
+import android.app.backup.BackupHelper;
+import android.content.Context;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.IPackageManager;
+import android.content.pm.PackageManager;
+import android.content.pm.ParceledListSlice;
+import android.content.pm.UserInfo;
+import android.os.Build;
+import android.os.IDeviceIdleController;
+import android.os.RemoteException;
+import android.os.ParcelFileDescriptor;
+import android.os.ServiceManager;
+import android.os.UserHandle;
+import android.os.UserManager;
+import android.util.Log;
+
+import androidx.annotation.VisibleForTesting;
+
+import com.android.settingslib.fuelgauge.PowerAllowlistBackend;
+
+import java.io.IOException;
+import java.nio.charset.StandardCharsets;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+/** An implementation to backup and restore battery configurations. */
+public final class BatteryBackupHelper implements BackupHelper {
+ /** An inditifier for {@link BackupHelper}. */
+ public static final String TAG = "BatteryBackupHelper";
+ private static final String DEVICE_IDLE_SERVICE = "deviceidle";
+ private static final boolean DEBUG = Build.TYPE.equals("userdebug");
+
+ // Only the owner can see all apps.
+ private static final int RETRIEVE_FLAG_ADMIN =
+ PackageManager.MATCH_ANY_USER |
+ PackageManager.MATCH_DISABLED_COMPONENTS |
+ PackageManager.MATCH_DISABLED_UNTIL_USED_COMPONENTS;
+ private static final int RETRIEVE_FLAG =
+ PackageManager.MATCH_DISABLED_COMPONENTS |
+ PackageManager.MATCH_DISABLED_UNTIL_USED_COMPONENTS;
+
+ static final String DELIMITER = ",";
+ static final String DELIMITER_MODE = ":";
+ static final String KEY_FULL_POWER_LIST = "full_power_list";
+ static final String KEY_OPTIMIZATION_LIST = "optimization_mode_list";
+
+ @VisibleForTesting
+ PowerAllowlistBackend mPowerAllowlistBackend;
+ @VisibleForTesting
+ IDeviceIdleController mIDeviceIdleController;
+ @VisibleForTesting
+ IPackageManager mIPackageManager;
+ @VisibleForTesting
+ BatteryOptimizeUtils mBatteryOptimizeUtils;
+
+ private final Context mContext;
+
+ public BatteryBackupHelper(Context context) {
+ mContext = context.getApplicationContext();
+ }
+
+ @Override
+ public void performBackup(ParcelFileDescriptor oldState, BackupDataOutput data,
+ ParcelFileDescriptor newState) {
+ if (!isOwner() || data == null) {
+ Log.w(TAG, "ignore performBackup() for non-owner or empty data");
+ return;
+ }
+ final List<String> allowlistedApps = backupFullPowerList(data);
+ if (allowlistedApps != null) {
+ backupOptimizationMode(data, allowlistedApps);
+ }
+ }
+
+ @Override
+ public void restoreEntity(BackupDataInputStream data) {
+ if (!isOwner() || data == null || data.size() == 0) {
+ Log.w(TAG, "ignore restoreEntity() for non-owner or empty data");
+ return;
+ }
+ if (KEY_OPTIMIZATION_LIST.equals(data.getKey())) {
+ final int dataSize = data.size();
+ final byte[] dataBytes = new byte[dataSize];
+ try {
+ data.read(dataBytes, 0 /*offset*/, dataSize);
+ } catch (IOException e) {
+ Log.e(TAG, "failed to load BackupDataInputStream", e);
+ return;
+ }
+ restoreOptimizationMode(dataBytes);
+ }
+ }
+
+ @Override
+ public void writeNewStateDescription(ParcelFileDescriptor newState) {
+ }
+
+ private List<String> backupFullPowerList(BackupDataOutput data) {
+ final long timestamp = System.currentTimeMillis();
+ String[] allowlistedApps;
+ try {
+ allowlistedApps = getIDeviceIdleController().getFullPowerWhitelist();
+ } catch (RemoteException e) {
+ Log.e(TAG, "backupFullPowerList() failed", e);
+ return null;
+ }
+ // Ignores unexpected emptty result case.
+ if (allowlistedApps == null || allowlistedApps.length == 0) {
+ Log.w(TAG, "no data found in the getFullPowerList()");
+ return new ArrayList<>();
+ }
+
+ final String allowedApps = String.join(DELIMITER, allowlistedApps);
+ writeBackupData(data, KEY_FULL_POWER_LIST, allowedApps);
+ Log.d(TAG, String.format("backup getFullPowerList() size=%d in %d/ms",
+ allowlistedApps.length, (System.currentTimeMillis() - timestamp)));
+ return Arrays.asList(allowlistedApps);
+ }
+
+ @VisibleForTesting
+ void backupOptimizationMode(BackupDataOutput data, List<String> allowlistedApps) {
+ final long timestamp = System.currentTimeMillis();
+ final List<ApplicationInfo> applications = getInstalledApplications();
+ if (applications == null || applications.isEmpty()) {
+ Log.w(TAG, "no data found in the getInstalledApplications()");
+ return;
+ }
+ int backupCount = 0;
+ final StringBuilder builder = new StringBuilder();
+ final AppOpsManager appOps = mContext.getSystemService(AppOpsManager.class);
+ // Converts application into the AppUsageState.
+ for (ApplicationInfo info : applications) {
+ final int mode = appOps.checkOpNoThrow(
+ AppOpsManager.OP_RUN_ANY_IN_BACKGROUND, info.uid, info.packageName);
+ @BatteryOptimizeUtils.OptimizationMode
+ final int optimizationMode = BatteryOptimizeUtils.getAppOptimizationMode(
+ mode, allowlistedApps.contains(info.packageName));
+ // Ignores default optimized/unknown state or system/default apps.
+ if (optimizationMode == BatteryOptimizeUtils.MODE_OPTIMIZED
+ || optimizationMode == BatteryOptimizeUtils.MODE_UNKNOWN
+ || isSystemOrDefaultApp(info.packageName)) {
+ continue;
+ }
+ final String packageOptimizeMode =
+ info.packageName + DELIMITER_MODE + optimizationMode;
+ builder.append(packageOptimizeMode + DELIMITER);
+ debugLog(packageOptimizeMode);
+ backupCount++;
+ }
+
+ writeBackupData(data, KEY_OPTIMIZATION_LIST, builder.toString());
+ Log.d(TAG, String.format("backup getInstalledApplications():%d count=%d in %d/ms",
+ applications.size(), backupCount, (System.currentTimeMillis() - timestamp)));
+ }
+
+ @VisibleForTesting
+ void restoreOptimizationMode(byte[] dataBytes) {
+ final long timestamp = System.currentTimeMillis();
+ final String dataContent = new String(dataBytes, StandardCharsets.UTF_8);
+ if (dataContent == null || dataContent.isEmpty()) {
+ Log.w(TAG, "no data found in the restoreOptimizationMode()");
+ return;
+ }
+ final String[] appConfigurations = dataContent.split(BatteryBackupHelper.DELIMITER);
+ if (appConfigurations == null || appConfigurations.length == 0) {
+ Log.w(TAG, "no data found from the split() processing");
+ return;
+ }
+ int restoreCount = 0;
+ for (int index = 0; index < appConfigurations.length; index++) {
+ final String[] results = appConfigurations[index]
+ .split(BatteryBackupHelper.DELIMITER_MODE);
+ // Example format: com.android.systemui:2 we should have length=2
+ if (results == null || results.length != 2) {
+ Log.w(TAG, "invalid raw data found:" + appConfigurations[index]);
+ continue;
+ }
+ final String packageName = results[0];
+ // Ignores system/default apps.
+ if (isSystemOrDefaultApp(packageName)) {
+ Log.w(TAG, "ignore from isSystemOrDefaultApp():" + packageName);
+ continue;
+ }
+ @BatteryOptimizeUtils.OptimizationMode
+ int optimizationMode = BatteryOptimizeUtils.MODE_UNKNOWN;
+ try {
+ optimizationMode = Integer.parseInt(results[1]);
+ } catch (NumberFormatException e) {
+ Log.e(TAG, "failed to parse the optimization mode: "
+ + appConfigurations[index], e);
+ continue;
+ }
+ restoreOptimizationMode(packageName, optimizationMode);
+ restoreCount++;
+ }
+ Log.d(TAG, String.format("restoreOptimizationMode() count=%d in %d/ms",
+ restoreCount, (System.currentTimeMillis() - timestamp)));
+ }
+
+ private void restoreOptimizationMode(
+ String packageName, @BatteryOptimizeUtils.OptimizationMode int mode) {
+ final int uid = BatteryUtils.getInstance(mContext).getPackageUid(packageName);
+ if (uid == BatteryUtils.UID_NULL) {
+ return;
+ }
+ final BatteryOptimizeUtils batteryOptimizeUtils =
+ mBatteryOptimizeUtils != null
+ ? mBatteryOptimizeUtils /*testing only*/
+ : new BatteryOptimizeUtils(mContext, uid, packageName);
+ batteryOptimizeUtils.setAppOptimizationMode(mode);
+ Log.d(TAG, String.format("restore:%s mode=%d", packageName, mode));
+ }
+
+ // Provides an opportunity to inject mock IDeviceIdleController for testing.
+ private IDeviceIdleController getIDeviceIdleController() {
+ if (mIDeviceIdleController != null) {
+ return mIDeviceIdleController;
+ }
+ mIDeviceIdleController = IDeviceIdleController.Stub.asInterface(
+ ServiceManager.getService(DEVICE_IDLE_SERVICE));
+ return mIDeviceIdleController;
+ }
+
+ private IPackageManager getIPackageManager() {
+ if (mIPackageManager != null) {
+ return mIPackageManager;
+ }
+ mIPackageManager = AppGlobals.getPackageManager();
+ return mIPackageManager;
+ }
+
+ private PowerAllowlistBackend getPowerAllowlistBackend() {
+ if (mPowerAllowlistBackend != null) {
+ return mPowerAllowlistBackend;
+ }
+ mPowerAllowlistBackend = PowerAllowlistBackend.getInstance(mContext);
+ return mPowerAllowlistBackend;
+ }
+
+ private boolean isSystemOrDefaultApp(String packageName) {
+ final PowerAllowlistBackend powerAllowlistBackend = getPowerAllowlistBackend();
+ return powerAllowlistBackend.isSysAllowlisted(packageName)
+ || powerAllowlistBackend.isDefaultActiveApp(packageName)
+ // Optimize mode only for app which is in the allow list not idle app.
+ || powerAllowlistBackend.isAllowlistedExceptIdle(packageName);
+ }
+
+ private List<ApplicationInfo> getInstalledApplications() {
+ final List<ApplicationInfo> applications = new ArrayList<>();
+ final UserManager um = mContext.getSystemService(UserManager.class);
+ for (UserInfo userInfo : um.getProfiles(UserHandle.myUserId())) {
+ try {
+ @SuppressWarnings("unchecked")
+ final ParceledListSlice<ApplicationInfo> infoList =
+ getIPackageManager().getInstalledApplications(
+ userInfo.isAdmin() ? RETRIEVE_FLAG_ADMIN : RETRIEVE_FLAG,
+ userInfo.id);
+ if (infoList != null) {
+ applications.addAll(infoList.getList());
+ }
+ } catch (Exception e) {
+ Log.e(TAG, "getInstalledApplications() is failed", e);
+ return null;
+ }
+ }
+ // Removes the application which is disabled by the system.
+ for (int index = applications.size() - 1; index >= 0; index--) {
+ final ApplicationInfo info = applications.get(index);
+ if (info.enabledSetting != PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER
+ && !info.enabled) {
+ applications.remove(index);
+ }
+ }
+ return applications;
+ }
+
+ private void debugLog(String debugContent) {
+ if (DEBUG) Log.d(TAG, debugContent);
+ }
+
+ private static void writeBackupData(
+ BackupDataOutput data, String dataKey, String dataContent) {
+ final byte[] dataContentBytes = dataContent.getBytes();
+ try {
+ data.writeEntityHeader(dataKey, dataContentBytes.length);
+ data.writeEntityData(dataContentBytes, dataContentBytes.length);
+ } catch (IOException e) {
+ Log.e(TAG, "writeBackupData() is failed for " + dataKey, e);
+ }
+ }
+
+ private static boolean isOwner() {
+ return UserHandle.myUserId() == UserHandle.USER_OWNER;
+ }
+}
diff --git a/src/com/android/settings/fuelgauge/BatteryChartPreferenceController.java b/src/com/android/settings/fuelgauge/BatteryChartPreferenceController.java
index f075c7b..8541179 100644
--- a/src/com/android/settings/fuelgauge/BatteryChartPreferenceController.java
+++ b/src/com/android/settings/fuelgauge/BatteryChartPreferenceController.java
@@ -121,12 +121,16 @@
mFragment = fragment;
mPreferenceKey = preferenceKey;
mIs24HourFormat = DateFormat.is24HourFormat(context);
- mNotAllowShowSummaryPackages = context.getResources()
- .getTextArray(R.array.allowlist_hide_summary_in_battery_usage);
- mNotAllowShowEntryPackages = context.getResources()
- .getTextArray(R.array.allowlist_hide_entry_in_battery_usage);
mMetricsFeatureProvider =
FeatureFactory.getFactory(mContext).getMetricsFeatureProvider();
+ mNotAllowShowEntryPackages =
+ FeatureFactory.getFactory(context)
+ .getPowerUsageFeatureProvider(context)
+ .getHideApplicationEntries(context);
+ mNotAllowShowSummaryPackages =
+ FeatureFactory.getFactory(context)
+ .getPowerUsageFeatureProvider(context)
+ .getHideApplicationSummary(context);
if (lifecycle != null) {
lifecycle.addObserver(this);
}
diff --git a/src/com/android/settings/fuelgauge/BatteryDiffEntry.java b/src/com/android/settings/fuelgauge/BatteryDiffEntry.java
index 3ad768a..e524e98 100644
--- a/src/com/android/settings/fuelgauge/BatteryDiffEntry.java
+++ b/src/com/android/settings/fuelgauge/BatteryDiffEntry.java
@@ -40,7 +40,8 @@
// Caches app label and icon to improve loading performance.
static final Map<String, BatteryEntry.NameAndIcon> sResourceCache = new HashMap<>();
// Whether a specific item is valid to launch restriction page?
- static final Map<String, Boolean> sValidForRestriction = new HashMap<>();
+ @VisibleForTesting(otherwise = VisibleForTesting.PACKAGE_PRIVATE)
+ public static final Map<String, Boolean> sValidForRestriction = new HashMap<>();
/** A comparator for {@link BatteryDiffEntry} based on consumed percentage. */
public static final Comparator<BatteryDiffEntry> COMPARATOR =
@@ -112,7 +113,9 @@
/** Gets the app icon {@link Drawable} for this entry. */
public Drawable getAppIcon() {
loadLabelAndIcon();
- return mAppIcon;
+ return mAppIcon != null && mAppIcon.getConstantState() != null
+ ? mAppIcon.getConstantState().newDrawable()
+ : null;
}
/** Gets the app icon id for this entry. */
@@ -339,15 +342,16 @@
return builder.toString();
}
- static void clearCache() {
+ /** Clears app icon and label cache data. */
+ public static void clearCache() {
sResourceCache.clear();
sValidForRestriction.clear();
}
private Drawable getBadgeIconForUser(Drawable icon) {
final int userId = UserHandle.getUserId((int) mBatteryHistEntry.mUid);
- final UserHandle userHandle = new UserHandle(userId);
- return mUserManager.getBadgedIconForUser(icon, userHandle);
+ return userId == UserHandle.USER_OWNER ? icon :
+ mUserManager.getBadgedIconForUser(icon, new UserHandle(userId));
}
private static boolean isSystemUid(int uid) {
diff --git a/src/com/android/settings/fuelgauge/BatteryInfo.java b/src/com/android/settings/fuelgauge/BatteryInfo.java
index 92151c0..4433da2 100644
--- a/src/com/android/settings/fuelgauge/BatteryInfo.java
+++ b/src/com/android/settings/fuelgauge/BatteryInfo.java
@@ -25,6 +25,7 @@
import android.os.BatteryUsageStats;
import android.os.SystemClock;
import android.text.format.Formatter;
+import android.util.Log;
import android.util.SparseIntArray;
import androidx.annotation.NonNull;
@@ -42,6 +43,7 @@
import com.android.settingslib.utils.StringUtil;
public class BatteryInfo {
+ private static final String TAG = "BatteryInfo";
public CharSequence chargeLabel;
public CharSequence remainingLabel;
@@ -155,8 +157,13 @@
if (batteryUsageStats != null) {
stats = batteryUsageStats;
} else {
- stats = context.getSystemService(BatteryStatsManager.class)
- .getBatteryUsageStats();
+ try {
+ stats = context.getSystemService(BatteryStatsManager.class)
+ .getBatteryUsageStats();
+ } catch (RuntimeException e) {
+ Log.e(TAG, "getBatteryInfo() from getBatteryUsageStats()", e);
+ return null;
+ }
}
return getBatteryInfo(context, stats, shortString);
}
diff --git a/src/com/android/settings/fuelgauge/BatteryOptimizeUtils.java b/src/com/android/settings/fuelgauge/BatteryOptimizeUtils.java
index 4a56040..11528a6 100644
--- a/src/com/android/settings/fuelgauge/BatteryOptimizeUtils.java
+++ b/src/com/android/settings/fuelgauge/BatteryOptimizeUtils.java
@@ -16,6 +16,7 @@
package com.android.settings.fuelgauge;
+import android.annotation.IntDef;
import android.app.AppOpsManager;
import android.content.Context;
import android.util.Log;
@@ -24,6 +25,9 @@
import com.android.settingslib.fuelgauge.PowerAllowlistBackend;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
/** A utility class for application usage operation. */
public class BatteryOptimizeUtils {
private static final String TAG = "BatteryOptimizeUtils";
@@ -32,21 +36,26 @@
@VisibleForTesting AppOpsManager mAppOpsManager;
@VisibleForTesting BatteryUtils mBatteryUtils;
@VisibleForTesting PowerAllowlistBackend mPowerAllowListBackend;
+ @VisibleForTesting int mMode;
+ @VisibleForTesting boolean mAllowListed;
+
private final String mPackageName;
private final int mUid;
- private int mMode;
- private boolean mAllowListed;
+ // Optimization modes.
+ static final int MODE_UNKNOWN = 0;
+ static final int MODE_RESTRICTED = 1;
+ static final int MODE_UNRESTRICTED = 2;
+ static final int MODE_OPTIMIZED = 3;
- /**
- * Usage type of application.
- */
- public enum AppUsageState {
- UNKNOWN,
- RESTRICTED,
- UNRESTRICTED,
- OPTIMIZED,
- }
+ @IntDef(prefix = {"MODE_"}, value = {
+ MODE_UNKNOWN,
+ MODE_RESTRICTED,
+ MODE_UNRESTRICTED,
+ MODE_OPTIMIZED,
+ })
+ @Retention(RetentionPolicy.SOURCE)
+ static @interface OptimizationMode {}
public BatteryOptimizeUtils(Context context, int uid, String packageName) {
mUid = uid;
@@ -59,36 +68,48 @@
mAllowListed = mPowerAllowListBackend.isAllowlisted(mPackageName);
}
- public AppUsageState getAppUsageState() {
- refreshState();
- if (!mAllowListed && mMode == AppOpsManager.MODE_IGNORED) {
- return AppUsageState.RESTRICTED;
- } else if (mAllowListed && mMode == AppOpsManager.MODE_ALLOWED) {
- return AppUsageState.UNRESTRICTED;
- } else if (!mAllowListed && mMode == AppOpsManager.MODE_ALLOWED) {
- return AppUsageState.OPTIMIZED;
+ /** Gets the {@link OptimizationMode} based on mode and allowed list. */
+ @OptimizationMode
+ public static int getAppOptimizationMode(int mode, boolean isAllowListed) {
+ if (!isAllowListed && mode == AppOpsManager.MODE_IGNORED) {
+ return MODE_RESTRICTED;
+ } else if (isAllowListed && mode == AppOpsManager.MODE_ALLOWED) {
+ return MODE_UNRESTRICTED;
+ } else if (!isAllowListed && mode == AppOpsManager.MODE_ALLOWED) {
+ return MODE_OPTIMIZED;
} else {
- Log.d(TAG, "get unknown app usage state.");
- return AppUsageState.UNKNOWN;
+ return MODE_UNKNOWN;
}
}
- public void setAppUsageState(AppUsageState state) {
- switch (state) {
- case RESTRICTED:
+ /** Gets the {@link OptimizationMode} for associated app. */
+ @OptimizationMode
+ public int getAppOptimizationMode() {
+ refreshState();
+ return getAppOptimizationMode(mMode, mAllowListed);
+ }
+
+ /** Sets the {@link OptimizationMode} for associated app. */
+ public void setAppOptimizationMode(@OptimizationMode int mode) {
+ if (getAppOptimizationMode(mMode, mAllowListed) == mode) {
+ Log.w(TAG, "set the same optimization mode for: " + mPackageName);
+ return;
+ }
+ switch (mode) {
+ case MODE_RESTRICTED:
mBatteryUtils.setForceAppStandby(mUid, mPackageName, AppOpsManager.MODE_IGNORED);
mPowerAllowListBackend.removeApp(mPackageName);
break;
- case UNRESTRICTED:
+ case MODE_UNRESTRICTED:
mBatteryUtils.setForceAppStandby(mUid, mPackageName, AppOpsManager.MODE_ALLOWED);
mPowerAllowListBackend.addApp(mPackageName);
break;
- case OPTIMIZED:
+ case MODE_OPTIMIZED:
mBatteryUtils.setForceAppStandby(mUid, mPackageName, AppOpsManager.MODE_ALLOWED);
mPowerAllowListBackend.removeApp(mPackageName);
break;
default:
- Log.d(TAG, "set unknown app usage state.");
+ Log.d(TAG, "set unknown app optimization mode.");
}
}
@@ -109,6 +130,13 @@
|| mPowerAllowListBackend.isDefaultActiveApp(mPackageName);
}
+ /**
+ * Return {@code true} if this package is in allow list except idle app.
+ */
+ public boolean isAllowlistedExceptIdleApp() {
+ return mPowerAllowListBackend.isAllowlistedExceptIdle(mPackageName);
+ }
+
String getPackageName() {
return mPackageName == null ? UNKNOWN_PACKAGE : mPackageName;
}
diff --git a/src/com/android/settings/fuelgauge/BatteryUsageStatsLoader.java b/src/com/android/settings/fuelgauge/BatteryUsageStatsLoader.java
index d35ef82..0acc54e 100644
--- a/src/com/android/settings/fuelgauge/BatteryUsageStatsLoader.java
+++ b/src/com/android/settings/fuelgauge/BatteryUsageStatsLoader.java
@@ -20,6 +20,7 @@
import android.os.BatteryStatsManager;
import android.os.BatteryUsageStats;
import android.os.BatteryUsageStatsQuery;
+import android.util.Log;
import com.android.settingslib.utils.AsyncLoaderCompat;
@@ -27,6 +28,7 @@
* Loader to get new {@link BatteryUsageStats} in the background
*/
public class BatteryUsageStatsLoader extends AsyncLoaderCompat<BatteryUsageStats> {
+ private static final String TAG = "BatteryUsageStatsLoader";
private final BatteryStatsManager mBatteryStatsManager;
private final boolean mIncludeBatteryHistory;
@@ -42,7 +44,12 @@
if (mIncludeBatteryHistory) {
builder.includeBatteryHistory();
}
- return mBatteryStatsManager.getBatteryUsageStats(builder.build());
+ try {
+ return mBatteryStatsManager.getBatteryUsageStats(builder.build());
+ } catch (RuntimeException e) {
+ Log.e(TAG, "loadInBackground() for getBatteryUsageStats()", e);
+ return null;
+ }
}
@Override
diff --git a/src/com/android/settings/fuelgauge/BatteryUtils.java b/src/com/android/settings/fuelgauge/BatteryUtils.java
index d521ed1..f8f01b9 100644
--- a/src/com/android/settings/fuelgauge/BatteryUtils.java
+++ b/src/com/android/settings/fuelgauge/BatteryUtils.java
@@ -368,8 +368,14 @@
public BatteryInfo getBatteryInfo(final String tag) {
final BatteryStatsManager systemService = mContext.getSystemService(
BatteryStatsManager.class);
- final BatteryUsageStats batteryUsageStats = systemService.getBatteryUsageStats(
- new BatteryUsageStatsQuery.Builder().includeBatteryHistory().build());
+ BatteryUsageStats batteryUsageStats;
+ try {
+ batteryUsageStats = systemService.getBatteryUsageStats(
+ new BatteryUsageStatsQuery.Builder().includeBatteryHistory().build());
+ } catch (RuntimeException e) {
+ Log.e(TAG, "getBatteryInfo() from getBatteryUsageStats()", e);
+ return null;
+ }
final long startTime = System.currentTimeMillis();
diff --git a/src/com/android/settings/fuelgauge/ConvertUtils.java b/src/com/android/settings/fuelgauge/ConvertUtils.java
index a5a58ad..4794d42 100644
--- a/src/com/android/settings/fuelgauge/ConvertUtils.java
+++ b/src/com/android/settings/fuelgauge/ConvertUtils.java
@@ -302,10 +302,10 @@
private static void purgeLowPercentageAndFakeData(
final Context context,
final Map<Integer, List<BatteryDiffEntry>> indexedUsageMap) {
- final List<CharSequence> backgroundUsageTimeHideList =
+ final Set<CharSequence> backgroundUsageTimeHideList =
FeatureFactory.getFactory(context)
.getPowerUsageFeatureProvider(context)
- .getHideBackgroundUsageTimeList(context);
+ .getHideBackgroundUsageTimeSet(context);
for (List<BatteryDiffEntry> entries : indexedUsageMap.values()) {
final Iterator<BatteryDiffEntry> iterator = entries.iterator();
while (iterator.hasNext()) {
diff --git a/src/com/android/settings/fuelgauge/OptimizedPreferenceController.java b/src/com/android/settings/fuelgauge/OptimizedPreferenceController.java
index b2da356..ef23397 100644
--- a/src/com/android/settings/fuelgauge/OptimizedPreferenceController.java
+++ b/src/com/android/settings/fuelgauge/OptimizedPreferenceController.java
@@ -16,8 +16,6 @@
package com.android.settings.fuelgauge;
-import static com.android.settings.fuelgauge.BatteryOptimizeUtils.AppUsageState.OPTIMIZED;
-
import android.content.Context;
import android.util.Log;
@@ -59,7 +57,12 @@
Log.d(TAG, "is system or default app, disable pref");
((RadioButtonPreference) preference).setChecked(false);
preference.setEnabled(false);
- } else if (mBatteryOptimizeUtils.getAppUsageState() == OPTIMIZED) {
+ } else if (mBatteryOptimizeUtils.isAllowlistedExceptIdleApp()) {
+ Log.d(TAG, "in allow list not idle app, optimized states only");
+ preference.setEnabled(true);
+ ((RadioButtonPreference) preference).setChecked(true);
+ } else if (mBatteryOptimizeUtils.getAppOptimizationMode()
+ == BatteryOptimizeUtils.MODE_OPTIMIZED) {
Log.d(TAG, "is optimized states");
((RadioButtonPreference) preference).setChecked(true);
} else {
@@ -78,7 +81,7 @@
return false;
}
- mBatteryOptimizeUtils.setAppUsageState(OPTIMIZED);
+ mBatteryOptimizeUtils.setAppOptimizationMode(BatteryOptimizeUtils.MODE_OPTIMIZED);
Log.d(TAG, "Set optimized");
return true;
}
diff --git a/src/com/android/settings/fuelgauge/PowerUsageAdvanced.java b/src/com/android/settings/fuelgauge/PowerUsageAdvanced.java
index 7c69618..afbb71f 100644
--- a/src/com/android/settings/fuelgauge/PowerUsageAdvanced.java
+++ b/src/com/android/settings/fuelgauge/PowerUsageAdvanced.java
@@ -19,8 +19,11 @@
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
+import android.database.ContentObserver;
+import android.net.Uri;
import android.os.BatteryManager;
import android.os.Bundle;
+import android.os.Handler;
import android.provider.SearchIndexableResource;
import android.util.Log;
@@ -31,6 +34,7 @@
import com.android.settings.R;
import com.android.settings.SettingsActivity;
+import com.android.settings.fuelgauge.BatteryBroadcastReceiver;
import com.android.settings.overlay.FeatureFactory;
import com.android.settings.search.BaseSearchIndexProvider;
import com.android.settingslib.core.AbstractPreferenceController;
@@ -63,6 +67,17 @@
private BatteryChartPreferenceController mBatteryChartPreferenceController;
private BatteryAppListPreferenceController mBatteryAppListPreferenceController;
+ private final ContentObserver mBatteryObserver =
+ new ContentObserver(new Handler()) {
+ @Override
+ public void onChange(boolean selfChange) {
+ Log.d(TAG, "onBatteryContentChange: " + selfChange);
+ mIsChartDataLoaded = false;
+ restartBatteryStatsLoader(
+ BatteryBroadcastReceiver.BatteryUpdateType.MANUAL);
+ }
+ };
+
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
@@ -104,6 +119,20 @@
super.onPause();
// Resets the flag to reload usage data in onResume() callback.
mIsChartDataLoaded = false;
+ final Uri uri = mPowerUsageFeatureProvider.getBatteryHistoryUri();
+ if (uri != null) {
+ getContext().getContentResolver().unregisterContentObserver(mBatteryObserver);
+ }
+ }
+
+ @Override
+ public void onResume() {
+ super.onResume();
+ final Uri uri = mPowerUsageFeatureProvider.getBatteryHistoryUri();
+ if (uri != null) {
+ getContext().getContentResolver().registerContentObserver(
+ uri, /*notifyForDescendants*/ true, mBatteryObserver);
+ }
}
@Override
diff --git a/src/com/android/settings/fuelgauge/PowerUsageFeatureProvider.java b/src/com/android/settings/fuelgauge/PowerUsageFeatureProvider.java
index bab8811..a8e0317 100644
--- a/src/com/android/settings/fuelgauge/PowerUsageFeatureProvider.java
+++ b/src/com/android/settings/fuelgauge/PowerUsageFeatureProvider.java
@@ -18,13 +18,14 @@
import android.content.Context;
import android.content.Intent;
+import android.net.Uri;
import android.util.SparseIntArray;
import com.android.internal.os.BatterySipper;
import com.android.settingslib.fuelgauge.Estimate;
-import java.util.List;
import java.util.Map;
+import java.util.Set;
/**
* Feature Provider used in power usage
@@ -149,7 +150,22 @@
Map<Long, Map<String, BatteryHistEntry>> getBatteryHistory(Context context);
/**
- * Returns {@link List} for hidding applications background usage time.
+ * Returns {@link Uri} to monitor battery history data is update.
*/
- List<CharSequence> getHideBackgroundUsageTimeList(Context context);
+ Uri getBatteryHistoryUri();
+
+ /**
+ * Returns {@link Set} for hidding applications background usage time.
+ */
+ Set<CharSequence> getHideBackgroundUsageTimeSet(Context context);
+
+ /**
+ * Returns package names for hidding application in the usage screen.
+ */
+ CharSequence[] getHideApplicationEntries(Context context);
+
+ /**
+ * Returns package names for hidding summary in the usage screen.
+ */
+ CharSequence[] getHideApplicationSummary(Context context);
}
diff --git a/src/com/android/settings/fuelgauge/PowerUsageFeatureProviderImpl.java b/src/com/android/settings/fuelgauge/PowerUsageFeatureProviderImpl.java
index 208a478..e2c7800 100644
--- a/src/com/android/settings/fuelgauge/PowerUsageFeatureProviderImpl.java
+++ b/src/com/android/settings/fuelgauge/PowerUsageFeatureProviderImpl.java
@@ -19,6 +19,7 @@
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
+import android.net.Uri;
import android.os.Process;
import android.util.SparseIntArray;
@@ -26,9 +27,9 @@
import com.android.internal.util.ArrayUtils;
import com.android.settingslib.fuelgauge.Estimate;
-import java.util.ArrayList;
-import java.util.List;
+import java.util.HashSet;
import java.util.Map;
+import java.util.Set;
public class PowerUsageFeatureProviderImpl implements PowerUsageFeatureProvider {
@@ -176,7 +177,22 @@
}
@Override
- public List<CharSequence> getHideBackgroundUsageTimeList(Context context) {
- return new ArrayList<>();
+ public Uri getBatteryHistoryUri() {
+ return null;
+ }
+
+ @Override
+ public Set<CharSequence> getHideBackgroundUsageTimeSet(Context context) {
+ return new HashSet<>();
+ }
+
+ @Override
+ public CharSequence[] getHideApplicationEntries(Context context) {
+ return new CharSequence[0];
+ }
+
+ @Override
+ public CharSequence[] getHideApplicationSummary(Context context) {
+ return new CharSequence[0];
}
}
diff --git a/src/com/android/settings/fuelgauge/PowerUsageSummary.java b/src/com/android/settings/fuelgauge/PowerUsageSummary.java
index 19a8011..638aaa5 100644
--- a/src/com/android/settings/fuelgauge/PowerUsageSummary.java
+++ b/src/com/android/settings/fuelgauge/PowerUsageSummary.java
@@ -25,6 +25,7 @@
import android.os.Bundle;
import android.os.Handler;
import android.provider.Settings.Global;
+import android.util.Log;
import androidx.annotation.VisibleForTesting;
import androidx.loader.app.LoaderManager;
@@ -103,6 +104,10 @@
@Override
public void onLoadFinished(Loader<BatteryInfo> loader, BatteryInfo batteryInfo) {
+ if (batteryInfo == null) {
+ Log.w(TAG, "mBatteryInfoLoaderCallbacks: batteryInfo = null");
+ return;
+ }
mBatteryHeaderPreferenceController.updateHeaderPreference(batteryInfo);
mBatteryHeaderPreferenceController.updateHeaderByBatteryTips(
mBatteryTipPreferenceController.getCurrentBatteryTip(), batteryInfo);
@@ -126,6 +131,10 @@
@Override
public void onLoadFinished(Loader<List<BatteryTip>> loader,
List<BatteryTip> data) {
+ if (mBatteryInfo == null) {
+ Log.w(TAG, "mBatteryTipsCallbacks: batteryInfo = null");
+ return;
+ }
mBatteryTipPreferenceController.updateBatteryTips(data);
mBatteryHeaderPreferenceController.updateHeaderByBatteryTips(
mBatteryTipPreferenceController.getCurrentBatteryTip(), mBatteryInfo);
diff --git a/src/com/android/settings/fuelgauge/RequestIgnoreBatteryOptimizations.java b/src/com/android/settings/fuelgauge/RequestIgnoreBatteryOptimizations.java
index 7caad60..ee46090 100644
--- a/src/com/android/settings/fuelgauge/RequestIgnoreBatteryOptimizations.java
+++ b/src/com/android/settings/fuelgauge/RequestIgnoreBatteryOptimizations.java
@@ -19,6 +19,7 @@
import android.Manifest;
import android.content.DialogInterface;
import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageItemInfo;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Bundle;
@@ -41,6 +42,8 @@
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
+ getWindow().addSystemFlags(android.view.WindowManager.LayoutParams
+ .SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS);
mPowerWhitelistManager = getSystemService(PowerWhitelistManager.class);
@@ -85,8 +88,11 @@
}
final AlertController.AlertParams p = mAlertParams;
+ final CharSequence appLabel = ai.loadSafeLabel(getPackageManager(),
+ PackageItemInfo.DEFAULT_MAX_LABEL_SIZE_PX, PackageItemInfo.SAFE_LABEL_FLAG_TRIM
+ | PackageItemInfo.SAFE_LABEL_FLAG_FIRST_LINE);
p.mTitle = getText(R.string.high_power_prompt_title);
- p.mMessage = getString(R.string.high_power_prompt_body, ai.loadLabel(getPackageManager()));
+ p.mMessage = getString(R.string.high_power_prompt_body, appLabel);
p.mPositiveButtonText = getText(R.string.allow);
p.mNegativeButtonText = getText(R.string.deny);
p.mPositiveButtonListener = this;
@@ -95,13 +101,6 @@
}
@Override
- protected void onStart() {
- super.onStart();
- getWindow().addSystemFlags(android.view.WindowManager.LayoutParams
- .SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS);
- }
-
- @Override
public void onClick(DialogInterface dialog, int which) {
switch (which) {
case BUTTON_POSITIVE:
diff --git a/src/com/android/settings/fuelgauge/RestrictedPreferenceController.java b/src/com/android/settings/fuelgauge/RestrictedPreferenceController.java
index b52af57..230b1fc 100644
--- a/src/com/android/settings/fuelgauge/RestrictedPreferenceController.java
+++ b/src/com/android/settings/fuelgauge/RestrictedPreferenceController.java
@@ -17,8 +17,6 @@
package com.android.settings.fuelgauge;
-import static com.android.settings.fuelgauge.BatteryOptimizeUtils.AppUsageState.RESTRICTED;
-
import android.content.Context;
import android.util.Log;
@@ -57,7 +55,11 @@
Log.d(TAG, "is system or default app, disable pref");
((RadioButtonPreference) preference).setChecked(false);
preference.setEnabled(false);
- } else if (mBatteryOptimizeUtils.getAppUsageState() == RESTRICTED) {
+ } else if (mBatteryOptimizeUtils.isAllowlistedExceptIdleApp()) {
+ Log.d(TAG, "in allow list not idle app, disable perf");
+ preference.setEnabled(false);
+ } else if (mBatteryOptimizeUtils.getAppOptimizationMode()
+ == BatteryOptimizeUtils.MODE_RESTRICTED) {
Log.d(TAG, "is restricted states");
((RadioButtonPreference) preference).setChecked(true);
} else {
@@ -81,7 +83,7 @@
return false;
}
- mBatteryOptimizeUtils.setAppUsageState(RESTRICTED);
+ mBatteryOptimizeUtils.setAppOptimizationMode(BatteryOptimizeUtils.MODE_RESTRICTED);
Log.d(TAG, "Set restricted");
return true;
}
diff --git a/src/com/android/settings/fuelgauge/UnrestrictedPreferenceController.java b/src/com/android/settings/fuelgauge/UnrestrictedPreferenceController.java
index 36141c5..f8ee651 100644
--- a/src/com/android/settings/fuelgauge/UnrestrictedPreferenceController.java
+++ b/src/com/android/settings/fuelgauge/UnrestrictedPreferenceController.java
@@ -16,8 +16,6 @@
package com.android.settings.fuelgauge;
-import static com.android.settings.fuelgauge.BatteryOptimizeUtils.AppUsageState.UNRESTRICTED;
-
import android.content.Context;
import android.util.Log;
@@ -55,7 +53,11 @@
if (mBatteryOptimizeUtils.isSystemOrDefaultApp()) {
Log.d(TAG, "is system or default app, unrestricted states only");
((RadioButtonPreference) preference).setChecked(true);
- } else if (mBatteryOptimizeUtils.getAppUsageState() == UNRESTRICTED) {
+ } else if (mBatteryOptimizeUtils.isAllowlistedExceptIdleApp()) {
+ Log.d(TAG, "in allow list not idle app, disable perf");
+ preference.setEnabled(false);
+ } else if (mBatteryOptimizeUtils.getAppOptimizationMode()
+ == BatteryOptimizeUtils.MODE_UNRESTRICTED) {
Log.d(TAG, "is unrestricted states");
((RadioButtonPreference) preference).setChecked(true);
} else {
@@ -79,7 +81,7 @@
return false;
}
- mBatteryOptimizeUtils.setAppUsageState(UNRESTRICTED);
+ mBatteryOptimizeUtils.setAppOptimizationMode(BatteryOptimizeUtils.MODE_UNRESTRICTED);
Log.d(TAG, "Set unrestricted");
return true;
}
diff --git a/src/com/android/settings/fuelgauge/batterytip/BatteryTipLoader.java b/src/com/android/settings/fuelgauge/batterytip/BatteryTipLoader.java
index 7d11ba5..b6806e8 100644
--- a/src/com/android/settings/fuelgauge/batterytip/BatteryTipLoader.java
+++ b/src/com/android/settings/fuelgauge/batterytip/BatteryTipLoader.java
@@ -18,6 +18,7 @@
import android.content.Context;
import android.os.BatteryUsageStats;
+import android.util.Log;
import androidx.annotation.VisibleForTesting;
@@ -67,16 +68,17 @@
final BatteryInfo batteryInfo = mBatteryUtils.getBatteryInfo(TAG);
final Context context = getContext();
+ tips.add(new EarlyWarningDetector(policy, context).detect());
+ if (batteryInfo == null) {
+ Log.w(TAG, "loadInBackground() batteryInfo = null");
+ return tips;
+ }
+
tips.add(new LowBatteryDetector(context, policy, batteryInfo).detect());
tips.add(new HighUsageDetector(context, policy, mBatteryUsageStats, batteryInfo).detect());
tips.add(new SmartBatteryDetector(
context, policy, batteryInfo, context.getContentResolver()).detect());
- tips.add(new EarlyWarningDetector(policy, context).detect());
tips.add(new BatteryDefenderDetector(batteryInfo).detect());
- // Disable this feature now since it introduces false positive cases. We will try to improve
- // it in the future.
- // tips.add(new RestrictAppDetector(context, policy).detect());
-
Collections.sort(tips);
return tips;
}
diff --git a/src/com/android/settings/gestures/OneHandedSettings.java b/src/com/android/settings/gestures/OneHandedSettings.java
index 51c6b66..1310789 100644
--- a/src/com/android/settings/gestures/OneHandedSettings.java
+++ b/src/com/android/settings/gestures/OneHandedSettings.java
@@ -26,6 +26,7 @@
import com.android.internal.accessibility.AccessibilityShortcutController;
import com.android.settings.R;
import com.android.settings.accessibility.AccessibilityShortcutPreferenceFragment;
+import com.android.settings.accessibility.ShortcutPreference;
import com.android.settings.search.BaseSearchIndexProvider;
import com.android.settingslib.widget.IllustrationPreference;
@@ -77,6 +78,11 @@
}
@Override
+ protected void updateShortcutTitle(ShortcutPreference shortcutPreference) {
+ shortcutPreference.setTitle(R.string.one_handed_mode_shortcut_title);
+ }
+
+ @Override
protected boolean showGeneralCategory() {
return true;
}
diff --git a/src/com/android/settings/gestures/SystemNavigationGestureSettings.java b/src/com/android/settings/gestures/SystemNavigationGestureSettings.java
index 4e783c9..1a116da 100644
--- a/src/com/android/settings/gestures/SystemNavigationGestureSettings.java
+++ b/src/com/android/settings/gestures/SystemNavigationGestureSettings.java
@@ -17,6 +17,7 @@
package com.android.settings.gestures;
import static android.os.UserHandle.USER_CURRENT;
+import static android.provider.Settings.Secure.ACCESSIBILITY_BUTTON_MODE_FLOATING_MENU;
import static android.view.WindowManagerPolicyConstants.NAV_BAR_MODE_2BUTTON_OVERLAY;
import static android.view.WindowManagerPolicyConstants.NAV_BAR_MODE_3BUTTON_OVERLAY;
import static android.view.WindowManagerPolicyConstants.NAV_BAR_MODE_GESTURAL_OVERLAY;
@@ -27,14 +28,19 @@
import android.content.SharedPreferences;
import android.content.om.IOverlayManager;
import android.content.om.OverlayInfo;
+import android.os.Bundle;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.provider.Settings;
+import android.text.TextUtils;
+import android.view.accessibility.AccessibilityManager;
+import androidx.annotation.Nullable;
import androidx.annotation.VisibleForTesting;
import androidx.preference.PreferenceScreen;
import com.android.settings.R;
+import com.android.settings.accessibility.AccessibilityGestureNavigationTutorial;
import com.android.settings.dashboard.suggestions.SuggestionFeatureProvider;
import com.android.settings.overlay.FeatureFactory;
import com.android.settings.search.BaseSearchIndexProvider;
@@ -53,8 +59,6 @@
public class SystemNavigationGestureSettings extends RadioButtonPickerFragment implements
HelpResourceProvider {
- private static final String TAG = "SystemNavigationGesture";
-
@VisibleForTesting
static final String KEY_SYSTEM_NAV_3BUTTONS = "system_nav_3buttons";
@VisibleForTesting
@@ -65,11 +69,34 @@
public static final String PREF_KEY_SUGGESTION_COMPLETE =
"pref_system_navigation_suggestion_complete";
+ private static final String KEY_SHOW_A11Y_TUTORIAL_DIALOG = "show_a11y_tutorial_dialog_bool";
+
+ private boolean mA11yTutorialDialogShown = false;
+
private IOverlayManager mOverlayManager;
private IllustrationPreference mVideoPreference;
@Override
+ public void onCreate(@Nullable Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ if (savedInstanceState != null) {
+ mA11yTutorialDialogShown =
+ savedInstanceState.getBoolean(KEY_SHOW_A11Y_TUTORIAL_DIALOG, false);
+ if (mA11yTutorialDialogShown) {
+ AccessibilityGestureNavigationTutorial.showGestureNavigationTutorialDialog(
+ getContext(), dialog -> mA11yTutorialDialogShown = false);
+ }
+ }
+ }
+
+ @Override
+ public void onSaveInstanceState(Bundle outState) {
+ outState.putBoolean(KEY_SHOW_A11Y_TUTORIAL_DIALOG, mA11yTutorialDialogShown);
+ super.onSaveInstanceState(outState);
+ }
+
+ @Override
public void onAttach(Context context) {
super.onAttach(context);
@@ -173,7 +200,7 @@
protected boolean setDefaultKey(String key) {
setCurrentSystemNavigationMode(mOverlayManager, key);
setIllustrationVideo(mVideoPreference, key);
-
+ setGestureNavigationTutorialDialog(key);
return true;
}
@@ -246,6 +273,36 @@
}
}
+ private void setGestureNavigationTutorialDialog(String systemNavKey) {
+ if (TextUtils.equals(KEY_SYSTEM_NAV_GESTURAL, systemNavKey)
+ && !isAccessibilityFloatingMenuEnabled()
+ && (isAnyServiceSupportAccessibilityButton() || isNavBarMagnificationEnabled())) {
+ mA11yTutorialDialogShown = true;
+ AccessibilityGestureNavigationTutorial.showGestureNavigationTutorialDialog(getContext(),
+ dialog -> mA11yTutorialDialogShown = false);
+ } else {
+ mA11yTutorialDialogShown = false;
+ }
+ }
+
+ private boolean isAnyServiceSupportAccessibilityButton() {
+ final AccessibilityManager ams = getContext().getSystemService(AccessibilityManager.class);
+ final List<String> targets = ams.getAccessibilityShortcutTargets(
+ AccessibilityManager.ACCESSIBILITY_BUTTON);
+ return !targets.isEmpty();
+ }
+
+ private boolean isNavBarMagnificationEnabled() {
+ return Settings.Secure.getInt(getContext().getContentResolver(),
+ Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_NAVBAR_ENABLED, 0) == 1;
+ }
+
+ private boolean isAccessibilityFloatingMenuEnabled() {
+ return Settings.Secure.getInt(getContext().getContentResolver(),
+ Settings.Secure.ACCESSIBILITY_BUTTON_MODE, /* def= */ -1)
+ == ACCESSIBILITY_BUTTON_MODE_FLOATING_MENU;
+ }
+
public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
new BaseSearchIndexProvider(R.xml.system_navigation_gesture_settings) {
diff --git a/src/com/android/settings/homepage/SettingsHomepageActivity.java b/src/com/android/settings/homepage/SettingsHomepageActivity.java
index 1d7b5dc..d6a8a92 100644
--- a/src/com/android/settings/homepage/SettingsHomepageActivity.java
+++ b/src/com/android/settings/homepage/SettingsHomepageActivity.java
@@ -18,8 +18,13 @@
import android.animation.LayoutTransition;
import android.app.ActivityManager;
+import android.app.PendingIntent;
import android.app.settings.SettingsEnums;
+import android.content.ComponentName;
+import android.content.Intent;
+import android.content.pm.PackageManager;
import android.os.Bundle;
+import android.text.TextUtils;
import android.util.FeatureFlagUtils;
import android.util.Log;
import android.view.View;
@@ -31,21 +36,34 @@
import androidx.fragment.app.FragmentActivity;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentTransaction;
+import androidx.window.embedding.SplitController;
import com.android.settings.R;
+import com.android.settings.Settings;
+import com.android.settings.Utils;
import com.android.settings.accounts.AvatarViewMixin;
import com.android.settings.core.CategoryMixin;
import com.android.settings.core.FeatureFlags;
+import com.android.settings.activityembedding.ActivityEmbeddingRulesController;
+import com.android.settings.activityembedding.ActivityEmbeddingUtils;
import com.android.settings.homepage.contextualcards.ContextualCardsFragment;
import com.android.settings.overlay.FeatureFactory;
import com.android.settingslib.core.lifecycle.HideNonSystemOverlayMixin;
+import java.net.URISyntaxException;
+
/** Settings homepage activity */
public class SettingsHomepageActivity extends FragmentActivity implements
CategoryMixin.CategoryHandler {
private static final String TAG = "SettingsHomepageActivity";
+ // Put true value to the intent when startActivity for a deep link intent from this Activity.
+ public static final String EXTRA_IS_FROM_SETTINGS_HOMEPAGE = "is_from_settings_homepage";
+
+ // An alias class name of SettingsHomepageActivity.
+ public static final String ALIAS_DEEP_LINK = "com.android.settings.DeepLinkHomepageActivity";
+
private static final long HOMEPAGE_LOADING_TIMEOUT_MS = 300;
private View mHomepageView;
@@ -105,6 +123,20 @@
showFragment(new TopLevelSettings(), R.id.main_content);
((FrameLayout) findViewById(R.id.main_content))
.getLayoutTransition().enableTransitionType(LayoutTransition.CHANGING);
+
+ // Launch the intent from deep link for large screen devices.
+ launchDeepLinkIntentToRight();
+ }
+
+ @Override
+ protected void onNewIntent(Intent intent) {
+ super.onNewIntent(intent);
+
+ // When it's large screen 2-pane and Settings app is in background. Receiving a Intent
+ // in this Activity will not finish nor onCreate. setIntent here for this case.
+ setIntent(intent);
+ // Launch the intent from deep link for large screen devices.
+ launchDeepLinkIntentToRight();
}
private void showSuggestionFragment() {
@@ -141,6 +173,66 @@
fragmentTransaction.commit();
}
+ private void launchDeepLinkIntentToRight() {
+ if (!ActivityEmbeddingUtils.isEmbeddingActivityEnabled(this)) {
+ return;
+ }
+
+ final Intent intent = getIntent();
+ if (intent == null || !TextUtils.equals(intent.getAction(),
+ android.provider.Settings.ACTION_SETTINGS_LARGE_SCREEN_DEEP_LINK)) {
+ return;
+ }
+
+ final String intentUriString = intent.getStringExtra(
+ android.provider.Settings.EXTRA_SETTINGS_LARGE_SCREEN_DEEP_LINK_INTENT_URI);
+ if (TextUtils.isEmpty(intentUriString)) {
+ Log.e(TAG, "No EXTRA_SETTINGS_LARGE_SCREEN_DEEP_LINK_INTENT_URI to deep link");
+ finish();
+ return;
+ }
+
+ final Intent targetIntent;
+ try {
+ targetIntent = Intent.parseUri(intentUriString, Intent.URI_INTENT_SCHEME);
+ } catch (URISyntaxException e) {
+ Log.e(TAG, "Failed to parse deep link intent: " + e);
+ finish();
+ return;
+ }
+
+ final ComponentName targetComponentName = targetIntent.resolveActivity(getPackageManager());
+ if (targetComponentName == null) {
+ Log.e(TAG, "No valid target for the deep link intent: " + targetIntent);
+ finish();
+ return;
+ }
+
+ // To prevent launchDeepLinkIntentToRight again for configuration change.
+ intent.setAction(null);
+
+ targetIntent.setFlags(targetIntent.getFlags() & ~Intent.FLAG_ACTIVITY_NEW_TASK);
+ targetIntent.addFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT);
+
+ // Sender of intent may want to send intent extra data to the destination of targetIntent.
+ targetIntent.replaceExtras(intent);
+
+ targetIntent.putExtra(EXTRA_IS_FROM_SETTINGS_HOMEPAGE, true);
+
+ // Set 2-pane pair rule for the deep link page.
+ ActivityEmbeddingRulesController.registerTwoPanePairRule(this,
+ new ComponentName(Utils.SETTINGS_PACKAGE_NAME, ALIAS_DEEP_LINK),
+ targetComponentName,
+ true /* finishPrimaryWithSecondary */,
+ true /* finishSecondaryWithPrimary */);
+ ActivityEmbeddingRulesController.registerTwoPanePairRule(this,
+ new ComponentName(Settings.class.getPackageName(), Settings.class.getName()),
+ targetComponentName,
+ true /* finishPrimaryWithSecondary */,
+ true /* finishSecondaryWithPrimary */);
+ startActivity(targetIntent);
+ }
+
private void initHomepageContainer() {
final View view = findViewById(R.id.homepage_container);
// Prevent inner RecyclerView gets focus and invokes scrolling.
diff --git a/src/com/android/settings/location/RecentLocationAccessPreferenceController.java b/src/com/android/settings/location/RecentLocationAccessPreferenceController.java
index 97de4a7..a8a30b4 100644
--- a/src/com/android/settings/location/RecentLocationAccessPreferenceController.java
+++ b/src/com/android/settings/location/RecentLocationAccessPreferenceController.java
@@ -29,7 +29,7 @@
import com.android.settings.R;
import com.android.settings.dashboard.DashboardFragment;
import com.android.settings.dashboard.profileselector.ProfileSelectFragment;
-import com.android.settingslib.location.RecentLocationAccesses;
+import com.android.settingslib.applications.RecentAppOpsAccess;
import com.android.settingslib.utils.StringUtil;
import com.android.settingslib.widget.AppPreference;
@@ -42,7 +42,7 @@
public class RecentLocationAccessPreferenceController extends LocationBasePreferenceController {
public static final int MAX_APPS = 3;
@VisibleForTesting
- RecentLocationAccesses mRecentLocationApps;
+ RecentAppOpsAccess mRecentLocationApps;
private PreferenceCategory mCategoryRecentLocationRequests;
private int mType = ProfileSelectFragment.ProfileType.ALL;
@@ -71,12 +71,12 @@
}
public RecentLocationAccessPreferenceController(Context context, String key) {
- this(context, key, new RecentLocationAccesses(context));
+ this(context, key, RecentAppOpsAccess.createForLocation(context));
}
@VisibleForTesting
public RecentLocationAccessPreferenceController(Context context, String key,
- RecentLocationAccesses recentLocationApps) {
+ RecentAppOpsAccess recentLocationApps) {
super(context, key);
mRecentLocationApps = recentLocationApps;
}
@@ -86,9 +86,9 @@
super.displayPreference(screen);
mCategoryRecentLocationRequests = screen.findPreference(getPreferenceKey());
final Context prefContext = mCategoryRecentLocationRequests.getContext();
- final List<RecentLocationAccesses.Access> recentLocationAccesses = new ArrayList<>();
+ final List<RecentAppOpsAccess.Access> recentLocationAccesses = new ArrayList<>();
final UserManager userManager = UserManager.get(mContext);
- for (RecentLocationAccesses.Access access : mRecentLocationApps.getAppListSorted(
+ for (RecentAppOpsAccess.Access access : mRecentLocationApps.getAppListSorted(
/* showSystemApps= */ false)) {
if (isRequestMatchesProfileType(userManager, access, mType)) {
recentLocationAccesses.add(access);
@@ -100,7 +100,7 @@
if (recentLocationAccesses.size() > 0) {
// Add preferences to container in original order (already sorted by recency).
- for (RecentLocationAccesses.Access access : recentLocationAccesses) {
+ for (RecentAppOpsAccess.Access access : recentLocationAccesses) {
mCategoryRecentLocationRequests.addPreference(
createAppPreference(prefContext, access, mFragment));
}
@@ -132,7 +132,7 @@
* Create a {@link AppPreference}
*/
public static AppPreference createAppPreference(Context prefContext,
- RecentLocationAccesses.Access access, DashboardFragment fragment) {
+ RecentAppOpsAccess.Access access, DashboardFragment fragment) {
final AppPreference pref = new AppPreference(prefContext);
pref.setIcon(access.icon);
pref.setTitle(access.label);
@@ -145,11 +145,11 @@
}
/**
- * Return if the {@link RecentLocationAccesses.Access} matches current UI
- * {@ProfileSelectFragment.ProfileType}
+ * Return if the {@link RecentAppOpsAccess.Access} matches current UI
+ * {@link ProfileSelectFragment.ProfileType}
*/
public static boolean isRequestMatchesProfileType(UserManager userManager,
- RecentLocationAccesses.Access access, @ProfileSelectFragment.ProfileType int type) {
+ RecentAppOpsAccess.Access access, @ProfileSelectFragment.ProfileType int type) {
final boolean isWorkProfile = userManager.isManagedProfile(
access.userHandle.getIdentifier());
diff --git a/src/com/android/settings/location/RecentLocationAccessSeeAllPreferenceController.java b/src/com/android/settings/location/RecentLocationAccessSeeAllPreferenceController.java
index a05092d..eba6271 100644
--- a/src/com/android/settings/location/RecentLocationAccessSeeAllPreferenceController.java
+++ b/src/com/android/settings/location/RecentLocationAccessSeeAllPreferenceController.java
@@ -26,7 +26,7 @@
import com.android.settings.R;
import com.android.settings.dashboard.profileselector.ProfileSelectFragment;
-import com.android.settingslib.location.RecentLocationAccesses;
+import com.android.settingslib.applications.RecentAppOpsAccess;
import com.android.settingslib.widget.AppPreference;
import java.util.ArrayList;
@@ -37,14 +37,14 @@
extends LocationBasePreferenceController {
private PreferenceScreen mCategoryAllRecentLocationAccess;
- private final RecentLocationAccesses mRecentLocationAccesses;
+ private final RecentAppOpsAccess mRecentLocationAccesses;
private boolean mShowSystem = false;
private Preference mPreference;
private int mType = ProfileSelectFragment.ProfileType.ALL;
public RecentLocationAccessSeeAllPreferenceController(Context context, String key) {
super(context, key);
- mRecentLocationAccesses = new RecentLocationAccesses(context);
+ mRecentLocationAccesses = RecentAppOpsAccess.createForLocation(context);
}
@Override
@@ -65,8 +65,8 @@
final UserManager userManager = UserManager.get(mContext);
- final List<RecentLocationAccesses.Access> recentLocationAccesses = new ArrayList<>();
- for (RecentLocationAccesses.Access access : mRecentLocationAccesses.getAppListSorted(
+ final List<RecentAppOpsAccess.Access> recentLocationAccesses = new ArrayList<>();
+ for (RecentAppOpsAccess.Access access : mRecentLocationAccesses.getAppListSorted(
mShowSystem)) {
if (isRequestMatchesProfileType(userManager, access, mType)) {
recentLocationAccesses.add(access);
@@ -80,7 +80,7 @@
banner.setSelectable(false);
mCategoryAllRecentLocationAccess.addPreference(banner);
} else {
- for (RecentLocationAccesses.Access request : recentLocationAccesses) {
+ for (RecentAppOpsAccess.Access request : recentLocationAccesses) {
final Preference appPreference = createAppPreference(
preference.getContext(),
request, mFragment);
diff --git a/src/com/android/settings/notification/SpatialAudioPreferenceController.java b/src/com/android/settings/notification/SpatialAudioPreferenceController.java
new file mode 100644
index 0000000..1420076
--- /dev/null
+++ b/src/com/android/settings/notification/SpatialAudioPreferenceController.java
@@ -0,0 +1,56 @@
+/*
+ * Copyright (C) 2021 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 android.media.AudioManager;
+import android.media.Spatializer;
+
+import com.android.settings.core.TogglePreferenceController;
+
+/**
+ * The controller of the Spatial audio setting in the SoundSettings.
+ */
+public class SpatialAudioPreferenceController extends TogglePreferenceController {
+
+ private static final String KEY_SPATIAL_AUDIO = "spatial_audio";
+
+ private final Spatializer mSpatializer;
+
+ public SpatialAudioPreferenceController(Context context) {
+ super(context, KEY_SPATIAL_AUDIO);
+ AudioManager audioManager = context.getSystemService(AudioManager.class);
+ mSpatializer = audioManager.getSpatializer();
+ }
+
+ @Override
+ public int getAvailabilityStatus() {
+ return mSpatializer.getImmersiveAudioLevel() == Spatializer.SPATIALIZER_IMMERSIVE_LEVEL_NONE
+ ? UNSUPPORTED_ON_DEVICE : AVAILABLE;
+ }
+
+ @Override
+ public boolean isChecked() {
+ return mSpatializer.isEnabled();
+ }
+
+ @Override
+ public boolean setChecked(boolean isChecked) {
+ mSpatializer.setEnabled(isChecked);
+ return isChecked == isChecked();
+ }
+}
diff --git a/src/com/android/settings/notification/zen/ZenModePrioritySendersPreferenceController.java b/src/com/android/settings/notification/zen/ZenModePrioritySendersPreferenceController.java
index 482865c..d89163d 100644
--- a/src/com/android/settings/notification/zen/ZenModePrioritySendersPreferenceController.java
+++ b/src/com/android/settings/notification/zen/ZenModePrioritySendersPreferenceController.java
@@ -54,10 +54,13 @@
@VisibleForTesting static final String KEY_NONE = "senders_none";
private static final Intent ALL_CONTACTS_INTENT =
- new Intent(Contacts.Intents.UI.LIST_DEFAULT);
+ new Intent(Contacts.Intents.UI.LIST_DEFAULT)
+ .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
private static final Intent STARRED_CONTACTS_INTENT =
- new Intent(Contacts.Intents.UI.LIST_STARRED_ACTION);
- private static final Intent FALLBACK_INTENT = new Intent(Intent.ACTION_MAIN);
+ new Intent(Contacts.Intents.UI.LIST_STARRED_ACTION)
+ .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
+ private static final Intent FALLBACK_INTENT = new Intent(Intent.ACTION_MAIN)
+ .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
private final PackageManager mPackageManager;
private final boolean mIsMessages; // if this is false, then this preference is for calls
diff --git a/src/com/android/settings/notification/zen/ZenRuleStarredContactsPreferenceController.java b/src/com/android/settings/notification/zen/ZenRuleStarredContactsPreferenceController.java
index a6de68c..3ac6633 100644
--- a/src/com/android/settings/notification/zen/ZenRuleStarredContactsPreferenceController.java
+++ b/src/com/android/settings/notification/zen/ZenRuleStarredContactsPreferenceController.java
@@ -43,10 +43,12 @@
mPriorityCategory = priorityCategory;
mPackageManager = mContext.getPackageManager();
- mStarredContactsIntent = new Intent(Contacts.Intents.UI.LIST_STARRED_ACTION);
+ mStarredContactsIntent = new Intent(Contacts.Intents.UI.LIST_STARRED_ACTION)
+ .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
mFallbackIntent = new Intent(Intent.ACTION_MAIN);
mFallbackIntent.addCategory(Intent.CATEGORY_APP_CONTACTS);
+ mFallbackIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
}
@Override
diff --git a/src/com/android/settings/overlay/FeatureFactory.java b/src/com/android/settings/overlay/FeatureFactory.java
index cfdc9eb..93af231 100644
--- a/src/com/android/settings/overlay/FeatureFactory.java
+++ b/src/com/android/settings/overlay/FeatureFactory.java
@@ -23,6 +23,7 @@
import androidx.annotation.Nullable;
import com.android.settings.R;
+import com.android.settings.accessibility.AccessibilityMetricsFeatureProvider;
import com.android.settings.accessibility.AccessibilitySearchFeatureProvider;
import com.android.settings.accounts.AccountFeatureProvider;
import com.android.settings.applications.ApplicationFeatureProvider;
@@ -111,13 +112,13 @@
public abstract PowerUsageFeatureProvider getPowerUsageFeatureProvider(Context context);
/**
- * Retrieve implementation for Battery Status feature.
+ * Retrieves implementation for Battery Status feature.
*/
public abstract BatteryStatusFeatureProvider getBatteryStatusFeatureProvider(
Context context);
/**
- * Get implementation for Battery Settings provider.
+ * Gets implementation for Battery Settings provider.
*/
public abstract BatterySettingsFeatureProvider getBatterySettingsFeatureProvider(
Context context);
@@ -161,25 +162,30 @@
public abstract WifiTrackerLibProvider getWifiTrackerLibProvider();
/**
- * Retrieve implementation for Extra App Info feature.
+ * Retrieves implementation for Extra App Info feature.
*/
public abstract ExtraAppInfoFeatureProvider getExtraAppInfoFeatureProvider();
/**
- * Retrieve implementation for SecuritySettings feature.
+ * Retrieves implementation for SecuritySettings feature.
*/
public abstract SecuritySettingsFeatureProvider getSecuritySettingsFeatureProvider();
/**
- * Retrieve implementation for Game Settings feature.
+ * Retrieves implementation for Game Settings feature.
*/
public abstract GameSettingsFeatureProvider getGameSettingsFeatureProvider();
/**
- * Retrieve implementation for Accessibility search index feature.
+ * Retrieves implementation for Accessibility search index feature.
*/
public abstract AccessibilitySearchFeatureProvider getAccessibilitySearchFeatureProvider();
+ /**
+ * Retrieves implementation for Accessibility metrics category feature.
+ */
+ public abstract AccessibilityMetricsFeatureProvider getAccessibilityMetricsFeatureProvider();
+
public static final class FactoryNotFoundException extends RuntimeException {
public FactoryNotFoundException(Throwable throwable) {
super("Unable to create factory. Did you misconfigure Proguard?", throwable);
diff --git a/src/com/android/settings/overlay/FeatureFactoryImpl.java b/src/com/android/settings/overlay/FeatureFactoryImpl.java
index 9890a10..2c63856 100644
--- a/src/com/android/settings/overlay/FeatureFactoryImpl.java
+++ b/src/com/android/settings/overlay/FeatureFactoryImpl.java
@@ -25,6 +25,8 @@
import androidx.annotation.Keep;
+import com.android.settings.accessibility.AccessibilityMetricsFeatureProvider;
+import com.android.settings.accessibility.AccessibilityMetricsFeatureProviderImpl;
import com.android.settings.accessibility.AccessibilitySearchFeatureProvider;
import com.android.settings.accessibility.AccessibilitySearchFeatureProviderImpl;
import com.android.settings.accounts.AccountFeatureProvider;
@@ -109,6 +111,7 @@
private SecuritySettingsFeatureProvider mSecuritySettingsFeatureProvider;
private GameSettingsFeatureProvider mGameSettingsFeatureProvider;
private AccessibilitySearchFeatureProvider mAccessibilitySearchFeatureProvider;
+ private AccessibilityMetricsFeatureProvider mAccessibilityMetricsFeatureProvider;
@Override
public SupportFeatureProvider getSupportFeatureProvider(Context context) {
@@ -346,4 +349,12 @@
}
return mAccessibilitySearchFeatureProvider;
}
+
+ @Override
+ public AccessibilityMetricsFeatureProvider getAccessibilityMetricsFeatureProvider() {
+ if (mAccessibilityMetricsFeatureProvider == null) {
+ mAccessibilityMetricsFeatureProvider = new AccessibilityMetricsFeatureProviderImpl();
+ }
+ return mAccessibilityMetricsFeatureProvider;
+ }
}
diff --git a/src/com/android/settings/widget/HighlightablePreferenceGroupAdapter.java b/src/com/android/settings/widget/HighlightablePreferenceGroupAdapter.java
index 6e73382..9009b32 100644
--- a/src/com/android/settings/widget/HighlightablePreferenceGroupAdapter.java
+++ b/src/com/android/settings/widget/HighlightablePreferenceGroupAdapter.java
@@ -105,7 +105,7 @@
context.getTheme().resolveAttribute(android.R.attr.selectableItemBackground,
outValue, true /* resolveRefs */);
mNormalBackgroundRes = outValue.resourceId;
- mHighlightColor = context.getColor(R.color.preference_highligh_color);
+ mHighlightColor = context.getColor(R.color.preference_highlight_color);
}
@Override
diff --git a/src/com/android/settings/wifi/WifiDialogActivity.java b/src/com/android/settings/wifi/WifiDialogActivity.java
index 4514b0d..56ecde4 100644
--- a/src/com/android/settings/wifi/WifiDialogActivity.java
+++ b/src/com/android/settings/wifi/WifiDialogActivity.java
@@ -197,13 +197,11 @@
public void onDestroy() {
if (mIsWifiTrackerLib) {
if (mDialog2 != null && mDialog2.isShowing()) {
- mDialog2.dismiss();
mDialog2 = null;
}
mWorkerThread.quit();
} else {
if (mDialog != null && mDialog.isShowing()) {
- mDialog.dismiss();
mDialog = null;
}
}
diff --git a/tests/robotests/Android.bp b/tests/robotests/Android.bp
index 9b2e97f..43bcec7 100644
--- a/tests/robotests/Android.bp
+++ b/tests/robotests/Android.bp
@@ -50,6 +50,7 @@
"contextualcards",
"settings-logtags",
"zxing-core-1.7",
+ "windowExtLib",
],
aaptflags: ["--extra-packages com.android.settings"],
diff --git a/tests/robotests/res/xml-mcc999/location_settings.xml b/tests/robotests/res/xml-mcc999/location_settings.xml
index d2dc132..b2a67ab 100644
--- a/tests/robotests/res/xml-mcc999/location_settings.xml
+++ b/tests/robotests/res/xml-mcc999/location_settings.xml
@@ -24,6 +24,7 @@
android:title="title"
android:icon="@drawable/ic_android"
android:summary="summary"
+ settings:highlightableMenuKey="menu_key"
settings:controller="com.android.settings.slices.FakePreferenceController"
settings:keywords="a, b, c"
settings:unavailableSliceSubtitle="subtitleOfUnavailableSlice"/>
diff --git a/tests/robotests/src/com/android/settings/accessibility/AccessibilityButtonFooterPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/accessibility/AccessibilityButtonFooterPreferenceControllerTest.java
index 010b444..7354555 100644
--- a/tests/robotests/src/com/android/settings/accessibility/AccessibilityButtonFooterPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/accessibility/AccessibilityButtonFooterPreferenceControllerTest.java
@@ -16,6 +16,7 @@
package com.android.settings.accessibility;
+import static android.view.WindowManagerPolicyConstants.NAV_BAR_MODE_2BUTTON;
import static android.view.WindowManagerPolicyConstants.NAV_BAR_MODE_GESTURAL;
import static com.google.common.truth.Truth.assertThat;
@@ -46,7 +47,6 @@
@Rule
public final MockitoRule mockito = MockitoJUnit.rule();
-
@Spy
private final Context mContext = ApplicationProvider.getApplicationContext();
@Spy
@@ -76,4 +76,15 @@
assertThat(mPreference.getTitle()).isEqualTo(
mContext.getText(R.string.accessibility_button_gesture_description));
}
+
+ @Test
+ public void displayPreference_navigationGestureDisabled_setCorrectTitle() {
+ when(mResources.getInteger(com.android.internal.R.integer.config_navBarInteractionMode))
+ .thenReturn(NAV_BAR_MODE_2BUTTON);
+
+ mController.displayPreference(mScreen);
+
+ assertThat(mPreference.getTitle()).isEqualTo(
+ mContext.getText(R.string.accessibility_button_description));
+ }
}
diff --git a/tests/robotests/src/com/android/settings/accessibility/AccessibilityButtonGesturePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/accessibility/AccessibilityButtonGesturePreferenceControllerTest.java
new file mode 100644
index 0000000..da44228
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/accessibility/AccessibilityButtonGesturePreferenceControllerTest.java
@@ -0,0 +1,105 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.accessibility;
+
+import static android.provider.Settings.Secure.ACCESSIBILITY_BUTTON_MODE_FLOATING_MENU;
+import static android.provider.Settings.Secure.ACCESSIBILITY_BUTTON_MODE_GESTURE;
+import static android.view.WindowManagerPolicyConstants.NAV_BAR_MODE_2BUTTON;
+import static android.view.WindowManagerPolicyConstants.NAV_BAR_MODE_GESTURAL;
+
+import static com.android.settings.core.BasePreferenceController.AVAILABLE;
+import static com.android.settings.core.BasePreferenceController.CONDITIONALLY_UNAVAILABLE;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.when;
+
+import android.content.ContentResolver;
+import android.content.Context;
+import android.content.res.Resources;
+import android.provider.Settings;
+
+import androidx.preference.ListPreference;
+import androidx.test.core.app.ApplicationProvider;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Spy;
+import org.mockito.junit.MockitoJUnit;
+import org.mockito.junit.MockitoRule;
+import org.robolectric.RobolectricTestRunner;
+
+/** Tests for {@link AccessibilityButtonGesturePreferenceController}. */
+@RunWith(RobolectricTestRunner.class)
+public class AccessibilityButtonGesturePreferenceControllerTest {
+
+ @Rule
+ public final MockitoRule mockito = MockitoJUnit.rule();
+
+ @Spy
+ private final Context mContext = ApplicationProvider.getApplicationContext();
+ @Spy
+ private final Resources mResources = mContext.getResources();
+ private final ContentResolver mContentResolver = mContext.getContentResolver();
+ private final ListPreference mListPreference = new ListPreference(mContext);
+ private AccessibilityButtonGesturePreferenceController mController;
+
+ @Before
+ public void setUp() {
+ mController = new AccessibilityButtonGesturePreferenceController(mContext,
+ "test_key");
+ when(mContext.getResources()).thenReturn(mResources);
+ }
+
+ @Test
+ public void getAvailabilityStatus_navigationGestureEnabled_returnAvailable() {
+ when(mResources.getInteger(com.android.internal.R.integer.config_navBarInteractionMode))
+ .thenReturn(NAV_BAR_MODE_GESTURAL);
+
+ assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE);
+ }
+
+ @Test
+ public void getAvailabilityStatus_navigationGestureDisabled_returnConditionallyUnavailable() {
+ when(mResources.getInteger(com.android.internal.R.integer.config_navBarInteractionMode))
+ .thenReturn(NAV_BAR_MODE_2BUTTON);
+
+ assertThat(mController.getAvailabilityStatus()).isEqualTo(CONDITIONALLY_UNAVAILABLE);
+ }
+
+ @Test
+ public void updateState_a11yBtnModeGesture_navigationBarValue() {
+ Settings.Secure.putInt(mContentResolver, Settings.Secure.ACCESSIBILITY_BUTTON_MODE,
+ ACCESSIBILITY_BUTTON_MODE_GESTURE);
+
+ mController.updateState(mListPreference);
+
+ final String gestureValue = String.valueOf(ACCESSIBILITY_BUTTON_MODE_GESTURE);
+ assertThat(mListPreference.getValue()).isEqualTo(gestureValue);
+ }
+
+ @Test
+ public void onPreferenceChange_a11yBtnModeFloatingMenu_floatingMenuValue() {
+ final String floatingMenuValue = String.valueOf(ACCESSIBILITY_BUTTON_MODE_FLOATING_MENU);
+
+ mController.onPreferenceChange(mListPreference, floatingMenuValue);
+
+ assertThat(mListPreference.getValue()).isEqualTo(floatingMenuValue);
+ }
+}
diff --git a/tests/robotests/src/com/android/settings/accessibility/AccessibilityButtonPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/accessibility/AccessibilityButtonPreferenceControllerTest.java
new file mode 100644
index 0000000..03f7887
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/accessibility/AccessibilityButtonPreferenceControllerTest.java
@@ -0,0 +1,91 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.accessibility;
+
+import static android.view.WindowManagerPolicyConstants.NAV_BAR_MODE_2BUTTON;
+import static android.view.WindowManagerPolicyConstants.NAV_BAR_MODE_GESTURAL;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.content.res.Resources;
+
+import androidx.preference.Preference;
+import androidx.preference.PreferenceScreen;
+import androidx.test.core.app.ApplicationProvider;
+
+import com.android.settings.R;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.Spy;
+import org.mockito.junit.MockitoJUnit;
+import org.mockito.junit.MockitoRule;
+import org.robolectric.RobolectricTestRunner;
+
+/** Tests for {@link AccessibilityButtonPreferenceController}. */
+@RunWith(RobolectricTestRunner.class)
+public class AccessibilityButtonPreferenceControllerTest {
+
+ @Rule
+ public final MockitoRule mockito = MockitoJUnit.rule();
+ @Spy
+ private final Context mContext = ApplicationProvider.getApplicationContext();
+ @Spy
+ private final Resources mResources = mContext.getResources();
+ @Mock
+ private PreferenceScreen mScreen;
+ private Preference mPreference;
+ private AccessibilityButtonPreferenceController mController;
+
+ @Before
+ public void setUp() {
+ mController = new AccessibilityButtonPreferenceController(mContext, "test_key");
+ mPreference = new Preference(mContext);
+ mPreference.setKey("test_key");
+
+ when(mScreen.findPreference(mController.getPreferenceKey())).thenReturn(mPreference);
+ when(mContext.getResources()).thenReturn(mResources);
+ }
+
+ @Test
+ public void displayPreference_navigationGestureEnabled_setCorrectTitle() {
+ when(mResources.getInteger(com.android.internal.R.integer.config_navBarInteractionMode))
+ .thenReturn(NAV_BAR_MODE_GESTURAL);
+
+ mController.displayPreference(mScreen);
+
+ assertThat(mPreference.getTitle()).isEqualTo(
+ mContext.getText(R.string.accessibility_button_gesture_title));
+ }
+
+ @Test
+ public void displayPreference_navigationGestureDisabled_setCorrectTitle() {
+ when(mResources.getInteger(com.android.internal.R.integer.config_navBarInteractionMode))
+ .thenReturn(NAV_BAR_MODE_2BUTTON);
+
+ mController.displayPreference(mScreen);
+
+ assertThat(mPreference.getTitle()).isEqualTo(
+ mContext.getText(R.string.accessibility_button_title));
+ }
+}
diff --git a/tests/robotests/src/com/android/settings/accessibility/AccessibilityButtonPreviewPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/accessibility/AccessibilityButtonPreviewPreferenceControllerTest.java
index 3065030..05aba99 100644
--- a/tests/robotests/src/com/android/settings/accessibility/AccessibilityButtonPreviewPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/accessibility/AccessibilityButtonPreviewPreferenceControllerTest.java
@@ -19,6 +19,8 @@
import static android.provider.Settings.Secure.ACCESSIBILITY_BUTTON_MODE_FLOATING_MENU;
import static android.provider.Settings.Secure.ACCESSIBILITY_BUTTON_MODE_NAVIGATION_BAR;
+import static com.android.settings.testutils.ImageTestUtils.drawableToBitmap;
+
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Mockito.verify;
@@ -28,12 +30,11 @@
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.provider.Settings;
-import android.widget.ImageView;
import androidx.test.core.app.ApplicationProvider;
import com.android.settings.R;
-import com.android.settings.testutils.ImageTestUtils;
+import com.android.settingslib.widget.IllustrationPreference;
import org.junit.Before;
import org.junit.Rule;
@@ -62,7 +63,7 @@
public void setUp() {
when(mContext.getContentResolver()).thenReturn(mContentResolver);
mController = new AccessibilityButtonPreviewPreferenceController(mContext, "test_key");
- mController.mPreview = new ImageView(mContext);
+ mController.mIllustrationPreference = new IllustrationPreference(mContext);
}
@Test
@@ -74,8 +75,8 @@
final Drawable navigationBarDrawable = mContext.getDrawable(
R.drawable.accessibility_button_navigation);
- assertThat(ImageTestUtils.drawableToBitmap(mController.mPreview.getDrawable()).sameAs(
- ImageTestUtils.drawableToBitmap(navigationBarDrawable))).isTrue();
+ assertThat(drawableToBitmap(mController.mIllustrationPreference.getImageDrawable()).sameAs(
+ drawableToBitmap(navigationBarDrawable))).isTrue();
}
@Test
@@ -90,10 +91,11 @@
mController.mContentObserver.onChange(false);
final Drawable smallFloatingMenuWithTenOpacityDrawable =
- FloatingMenuLayerDrawable.createLayerDrawable(mContext,
+ AccessibilityLayerDrawable.createLayerDrawable(mContext,
R.drawable.accessibility_button_preview_small_floating_menu, 10);
- assertThat(mController.mPreview.getDrawable().getConstantState()).isEqualTo(
- smallFloatingMenuWithTenOpacityDrawable.getConstantState());
+ assertThat(
+ mController.mIllustrationPreference.getImageDrawable().getConstantState())
+ .isEqualTo(smallFloatingMenuWithTenOpacityDrawable.getConstantState());
}
@Test
diff --git a/tests/robotests/src/com/android/settings/accessibility/AccessibilityFooterPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/accessibility/AccessibilityFooterPreferenceControllerTest.java
new file mode 100644
index 0000000..cc8520b
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/accessibility/AccessibilityFooterPreferenceControllerTest.java
@@ -0,0 +1,124 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.accessibility;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.widget.TextView;
+
+import androidx.preference.PreferenceScreen;
+import androidx.preference.PreferenceViewHolder;
+import androidx.test.core.app.ApplicationProvider;
+
+import com.android.settings.R;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.Spy;
+import org.mockito.junit.MockitoJUnit;
+import org.mockito.junit.MockitoRule;
+import org.robolectric.RobolectricTestRunner;
+
+/**
+ * Tests for {@link AccessibilityFooterPreferenceController}.
+ */
+@RunWith(RobolectricTestRunner.class)
+public class AccessibilityFooterPreferenceControllerTest {
+
+ private static final String TEST_KEY = "test_pref_key";
+ private static final String TEST_TITLE = "test_title";
+ private static final String TEST_INTRODUCTION_TITLE = "test_introduction_title";
+ private static final String TEST_CONTENT_DESCRIPTION = "test_content_description";
+ private static final int TEST_HELP_ID = 12345;
+
+ @Rule
+ public final MockitoRule mockito = MockitoJUnit.rule();
+
+ @Spy
+ private final Context mContext = ApplicationProvider.getApplicationContext();
+ @Mock
+ private PreferenceScreen mScreen;
+ private AccessibilityFooterPreferenceController mController;
+ private AccessibilityFooterPreference mPreference;
+ private PreferenceViewHolder mPreferenceViewHolder;
+
+ @Before
+ public void setUp() {
+ mController = new AccessibilityFooterPreferenceController(mContext, TEST_KEY);
+ mPreference = new AccessibilityFooterPreference(mContext);
+ mPreference.setKey(TEST_KEY);
+ mPreference.setTitle(TEST_TITLE);
+
+ final LayoutInflater inflater = LayoutInflater.from(mContext);
+ final View view = inflater.inflate(R.layout.preference_footer, null);
+ mPreferenceViewHolder = PreferenceViewHolder.createInstanceForTests(view);
+ mPreference.onBindViewHolder(mPreferenceViewHolder);
+
+ when(mScreen.findPreference(mController.getPreferenceKey())).thenReturn(mPreference);
+ }
+
+ @Test
+ public void setIntroductionTitle_setCorrectIntroductionTitle() {
+ mController.setIntroductionTitle(TEST_INTRODUCTION_TITLE);
+
+ assertThat(mController.getIntroductionTitle()).isEqualTo(TEST_INTRODUCTION_TITLE);
+ }
+
+ @Test
+ public void onBindViewHolder_setIntroductionTitle_setCorrectIntroductionTitle() {
+ mController.setIntroductionTitle(TEST_INTRODUCTION_TITLE);
+ mController.displayPreference(mScreen);
+
+ mPreference.onBindViewHolder(mPreferenceViewHolder);
+
+ final TextView summaryView = (TextView) mPreferenceViewHolder
+ .findViewById(android.R.id.title);
+ assertThat(summaryView.getContentDescription().toString())
+ .contains(TEST_INTRODUCTION_TITLE);
+ }
+
+ @Test
+ public void setupHelpLink_setCorrectHelpLinkAndContentDescription() {
+ mController.setupHelpLink(TEST_HELP_ID, TEST_CONTENT_DESCRIPTION);
+
+ assertThat(mController.getHelpResource()).isEqualTo(TEST_HELP_ID);
+ assertThat(mController.getLearnMoreContentDescription())
+ .isEqualTo(TEST_CONTENT_DESCRIPTION);
+ }
+
+ @Test
+ public void onBindViewHolder_setHelpResource_emptyString_notVisible() {
+ mController.setupHelpLink(R.string.help_url_timeout, TEST_CONTENT_DESCRIPTION);
+ mController.displayPreference(mScreen);
+
+ mPreference.onBindViewHolder(mPreferenceViewHolder);
+
+ final TextView learnMoreView = (TextView) mPreferenceViewHolder
+ .findViewById(com.android.settingslib.R.id.settingslib_learn_more);
+ assertThat(learnMoreView.getContentDescription()).isNull();
+ assertThat(learnMoreView.getVisibility()).isEqualTo(View.GONE);
+ assertThat(mPreference.isLinkEnabled()).isFalse();
+ }
+}
diff --git a/tests/robotests/src/com/android/settings/accessibility/FloatingMenuLayerDrawableTest.java b/tests/robotests/src/com/android/settings/accessibility/AccessibilityLayerDrawableTest.java
similarity index 83%
rename from tests/robotests/src/com/android/settings/accessibility/FloatingMenuLayerDrawableTest.java
rename to tests/robotests/src/com/android/settings/accessibility/AccessibilityLayerDrawableTest.java
index 45cefe4..915c788 100644
--- a/tests/robotests/src/com/android/settings/accessibility/FloatingMenuLayerDrawableTest.java
+++ b/tests/robotests/src/com/android/settings/accessibility/AccessibilityLayerDrawableTest.java
@@ -30,9 +30,9 @@
import org.junit.runner.RunWith;
import org.robolectric.RobolectricTestRunner;
-/** Tests for {@link FloatingMenuLayerDrawable}. */
+/** Tests for {@link AccessibilityLayerDrawable}. */
@RunWith(RobolectricTestRunner.class)
-public class FloatingMenuLayerDrawableTest {
+public class AccessibilityLayerDrawableTest {
private static final int TEST_RES_ID =
com.android.internal.R.drawable.ic_accessibility_magnification;
@@ -46,8 +46,8 @@
R.drawable.accessibility_button_preview_base);
final Drawable expected2ndDrawable = mContext.getDrawable(TEST_RES_ID);
- final FloatingMenuLayerDrawable actualDrawable =
- FloatingMenuLayerDrawable.createLayerDrawable(mContext, TEST_RES_ID,
+ final AccessibilityLayerDrawable actualDrawable =
+ AccessibilityLayerDrawable.createLayerDrawable(mContext, TEST_RES_ID,
/* opacity= */ 27);
final Drawable actual1stDrawable = actualDrawable.getDrawable(0);
@@ -60,14 +60,14 @@
@Test
public void updateLayerDrawable_expectedFloatingMenuLayerDrawableState() {
- final FloatingMenuLayerDrawable originalDrawable =
- FloatingMenuLayerDrawable.createLayerDrawable(mContext, TEST_RES_ID, /* opacity= */
+ final AccessibilityLayerDrawable originalDrawable =
+ AccessibilityLayerDrawable.createLayerDrawable(mContext, TEST_RES_ID, /* opacity= */
72);
originalDrawable.updateLayerDrawable(mContext, TEST_RES_ID_2, /* opacity= */ 27);
assertThat(originalDrawable.getConstantState()).isEqualTo(
- new FloatingMenuLayerDrawable.FloatingMenuLayerDrawableState(mContext,
+ new AccessibilityLayerDrawable.AccessibilityLayerDrawableState(mContext,
TEST_RES_ID_2, /* opacity= */ 27));
}
}
diff --git a/tests/robotests/src/com/android/settings/core/PreferenceXmlParserUtilsTest.java b/tests/robotests/src/com/android/settings/core/PreferenceXmlParserUtilsTest.java
index 4cde04b..23ade9d 100644
--- a/tests/robotests/src/com/android/settings/core/PreferenceXmlParserUtilsTest.java
+++ b/tests/robotests/src/com/android/settings/core/PreferenceXmlParserUtilsTest.java
@@ -175,17 +175,35 @@
}
@Test
+ public void extractHomepageMetadata_shouldContainKeyAndHighlightableMenuKey()
+ throws IOException, XmlPullParserException {
+ List<Bundle> metadata = PreferenceXmlParserUtils.extractMetadata(mContext,
+ R.xml.top_level_settings,
+ MetadataFlag.FLAG_NEED_KEY | MetadataFlag.FLAG_NEED_HIGHLIGHTABLE_MENU_KEY);
+
+ assertThat(metadata).isNotEmpty();
+ for (Bundle bundle : metadata) {
+ assertThat(bundle.getString(PreferenceXmlParserUtils.METADATA_KEY)).isNotNull();
+ assertThat(bundle.getString(PreferenceXmlParserUtils.METADATA_HIGHLIGHTABLE_MENU_KEY))
+ .isNotNull();
+ }
+ }
+
+ @Test
@Config(qualifiers = "mcc999")
- public void extractMetadata_shouldContainKeyAndControllerName()
+ public void extractMetadata_shouldContainKeyAndControllerNameAndHighlightableMenuKey()
throws IOException, XmlPullParserException {
List<Bundle> metadata = PreferenceXmlParserUtils.extractMetadata(mContext,
R.xml.location_settings,
- MetadataFlag.FLAG_NEED_KEY | MetadataFlag.FLAG_NEED_PREF_CONTROLLER);
+ MetadataFlag.FLAG_NEED_KEY | MetadataFlag.FLAG_NEED_PREF_CONTROLLER
+ | MetadataFlag.FLAG_NEED_HIGHLIGHTABLE_MENU_KEY);
assertThat(metadata).isNotEmpty();
for (Bundle bundle : metadata) {
assertThat(bundle.getString(PreferenceXmlParserUtils.METADATA_KEY)).isNotNull();
assertThat(bundle.getString(PreferenceXmlParserUtils.METADATA_CONTROLLER)).isNotNull();
+ assertThat(bundle.getString(PreferenceXmlParserUtils.METADATA_HIGHLIGHTABLE_MENU_KEY))
+ .isNotNull();
}
}
diff --git a/tests/robotests/src/com/android/settings/dashboard/DashboardFeatureProviderImplTest.java b/tests/robotests/src/com/android/settings/dashboard/DashboardFeatureProviderImplTest.java
index 6ef6b18..5d6fdf9 100644
--- a/tests/robotests/src/com/android/settings/dashboard/DashboardFeatureProviderImplTest.java
+++ b/tests/robotests/src/com/android/settings/dashboard/DashboardFeatureProviderImplTest.java
@@ -239,7 +239,7 @@
any(Intent.class),
eq(MetricsEvent.SETTINGS_GESTURES));
verify(mActivity)
- .startActivityForResultAsUser(any(Intent.class), anyInt(), any(UserHandle.class));
+ .startActivityAsUser(any(Intent.class), any(UserHandle.class));
}
@Test
@@ -257,7 +257,7 @@
any(Intent.class),
anyInt());
verify(mActivity)
- .startActivityForResultAsUser(any(Intent.class), anyInt(), any(UserHandle.class));
+ .startActivityAsUser(any(Intent.class), any(UserHandle.class));
}
@Test
@@ -568,7 +568,7 @@
mImpl.openTileIntent(mActivity, tile);
verify(mActivity, never())
- .startActivityForResult(any(Intent.class), eq(0));
+ .startActivity(any(Intent.class));
verify(mActivity).getSupportFragmentManager();
}
@@ -585,7 +585,7 @@
mImpl.openTileIntent(mActivity, tile);
verify(mActivity, never())
- .startActivityForResult(any(Intent.class), eq(0));
+ .startActivity(any(Intent.class));
verify(mActivity).getSupportFragmentManager();
}
@@ -602,7 +602,7 @@
mImpl.openTileIntent(mActivity, tile);
verify(mActivity)
- .startActivityForResult(any(Intent.class), eq(0));
+ .startActivity(any(Intent.class));
verify(mActivity, never()).getSupportFragmentManager();
}
@@ -623,7 +623,7 @@
final ArgumentCaptor<UserHandle> argument = ArgumentCaptor.forClass(UserHandle.class);
verify(mActivity)
- .startActivityForResultAsUser(any(Intent.class), anyInt(), argument.capture());
+ .startActivityAsUser(any(Intent.class), argument.capture());
assertThat(argument.getValue().getIdentifier()).isEqualTo(userId);
verify(mActivity, never()).getSupportFragmentManager();
}
@@ -642,7 +642,7 @@
mImpl.openTileIntent(mActivity, tile);
verify(mActivity, never())
- .startActivityForResultAsUser(any(Intent.class), anyInt(), any(UserHandle.class));
+ .startActivityAsUser(any(Intent.class), any(UserHandle.class));
verify(mActivity).getSupportFragmentManager();
}
@@ -665,7 +665,7 @@
final ArgumentCaptor<UserHandle> argument = ArgumentCaptor.forClass(UserHandle.class);
verify(mActivity)
- .startActivityForResultAsUser(any(Intent.class), anyInt(), argument.capture());
+ .startActivityAsUser(any(Intent.class), argument.capture());
assertThat(argument.getValue().getIdentifier()).isEqualTo(0);
verify(mActivity, never()).getSupportFragmentManager();
}
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java b/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java
index b50e083..ac85d97 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java
@@ -30,9 +30,11 @@
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyZeroInteractions;
import static org.mockito.Mockito.when;
import android.app.AppOpsManager;
+import android.app.backup.BackupManager;
import android.app.settings.SettingsEnums;
import android.content.Context;
import android.content.Intent;
@@ -123,6 +125,9 @@
private BatteryUtils mBatteryUtils;
@Mock
private BatteryOptimizeUtils mBatteryOptimizeUtils;
+ @Mock
+ private BackupManager mBackupManager;
+
private Context mContext;
private Preference mForegroundPreference;
private Preference mBackgroundPreference;
@@ -180,9 +185,10 @@
mFragment.mHeaderPreference = mHeaderPreference;
mFragment.mState = mState;
- mFragment.enableTriState = true;
+ mFragment.mEnableTriState = true;
mFragment.mBatteryUtils = new BatteryUtils(RuntimeEnvironment.application);
mFragment.mBatteryOptimizeUtils = mBatteryOptimizeUtils;
+ mFragment.mBackupManager = mBackupManager;
mAppEntry.info = mock(ApplicationInfo.class);
mTestActivity = spy(new SettingsActivity());
@@ -231,7 +237,7 @@
@Test
public void testGetPreferenceScreenResId_disableTriState_returnLegacyLayout() {
- mFragment.enableTriState = false;
+ mFragment.mEnableTriState = false;
assertThat(mFragment.getPreferenceScreenResId()).isEqualTo(R.xml.power_usage_detail_legacy);
}
@@ -740,6 +746,16 @@
}
@Test
+ public void testInitPreferenceForTriState_isAllowlistedExceptIdleApp_hasCorrectString() {
+ when(mBatteryOptimizeUtils.isAllowlistedExceptIdleApp()).thenReturn(true);
+
+ mFragment.initPreferenceForTriState(mContext);
+
+ assertThat(mFooterPreference.getTitle().toString())
+ .isEqualTo("This app requires optimized battery usage.");
+ }
+
+ @Test
public void testInitPreferenceForTriState_isSystemOrDefaultApp_hasCorrectString() {
when(mBatteryOptimizeUtils.isValidPackageName()).thenReturn(true);
when(mBatteryOptimizeUtils.isSystemOrDefaultApp()).thenReturn(true);
@@ -780,4 +796,38 @@
new Pair(ConvertUtils.METRIC_KEY_BATTERY_USAGE, "app label")
});
}
+
+ @Test
+ public void notifyBackupManager_optimizationModeIsNotChanged_notInvokeDataChanged() {
+ final int mode = BatteryOptimizeUtils.MODE_RESTRICTED;
+ mFragment.mOptimizationMode = mode;
+ when(mBatteryOptimizeUtils.getAppOptimizationMode()).thenReturn(mode);
+
+ mFragment.notifyBackupManager();
+
+ verifyZeroInteractions(mBackupManager);
+ }
+
+ @Test
+ public void notifyBackupManager_optimizationModeIsChanged_invokeDataChanged() {
+ mFragment.mOptimizationMode = BatteryOptimizeUtils.MODE_RESTRICTED;
+ when(mBatteryOptimizeUtils.getAppOptimizationMode())
+ .thenReturn(BatteryOptimizeUtils.MODE_UNRESTRICTED);
+
+ mFragment.notifyBackupManager();
+
+ verify(mBackupManager).dataChanged();
+ }
+
+ @Test
+ public void notifyBackupManager_triStateIsNotEnabled_notInvokeDataChanged() {
+ mFragment.mOptimizationMode = BatteryOptimizeUtils.MODE_RESTRICTED;
+ when(mBatteryOptimizeUtils.getAppOptimizationMode())
+ .thenReturn(BatteryOptimizeUtils.MODE_UNRESTRICTED);
+ mFragment.mEnableTriState = false;
+
+ mFragment.notifyBackupManager();
+
+ verifyZeroInteractions(mBackupManager);
+ }
}
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BatteryAppListPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BatteryAppListPreferenceControllerTest.java
index c3b3075..5e69b8f 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/BatteryAppListPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/BatteryAppListPreferenceControllerTest.java
@@ -67,11 +67,13 @@
private Context mContext;
private PowerGaugePreference mPreference;
private BatteryAppListPreferenceController mPreferenceController;
+ private FakeFeatureFactory mFeatureFactory;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
+ mFeatureFactory = FakeFeatureFactory.setupForTest();
mContext = spy(RuntimeEnvironment.application);
final Resources resources = spy(mContext.getResources());
when(mContext.getResources()).thenReturn(resources);
@@ -79,9 +81,8 @@
when(mContext.getApplicationContext()).thenReturn(mContext);
when(mContext.getSystemService(UserManager.class)).thenReturn(mUserManager);
when(mUserManager.getProfileIdsWithDisabled(anyInt())).thenReturn(new int[] {});
- when(resources.getTextArray(R.array.allowlist_hide_summary_in_battery_usage))
+ when(mFeatureFactory.powerUsageFeatureProvider.getHideApplicationSummary(mContext))
.thenReturn(new String[] {"com.android.googlequicksearchbox"});
- FakeFeatureFactory.setupForTest();
mPreference = new PowerGaugePreference(mContext);
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BatteryBackupHelperTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BatteryBackupHelperTest.java
new file mode 100644
index 0000000..aa1caf9
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/fuelgauge/BatteryBackupHelperTest.java
@@ -0,0 +1,420 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package com.android.settings.fuelgauge;
+
+import static com.android.settings.fuelgauge.BatteryBackupHelper.DELIMITER;
+import static com.android.settings.fuelgauge.BatteryBackupHelper.DELIMITER_MODE;
+import static com.android.settings.fuelgauge.BatteryOptimizeUtils.MODE_RESTRICTED;
+import static com.android.settings.fuelgauge.BatteryOptimizeUtils.MODE_UNRESTRICTED;
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.doThrow;
+import static org.mockito.Mockito.inOrder;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyZeroInteractions;
+import static org.mockito.Mockito.when;
+
+import android.app.AppOpsManager;
+import android.app.backup.BackupDataInputStream;
+import android.app.backup.BackupDataOutput;
+import android.content.Context;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.IPackageManager;
+import android.content.pm.PackageManager;
+import android.content.pm.ParceledListSlice;
+import android.content.pm.UserInfo;
+import android.os.IDeviceIdleController;
+import android.os.RemoteException;
+import android.os.UserHandle;
+import android.os.UserManager;
+
+import com.android.settingslib.fuelgauge.PowerAllowlistBackend;
+
+import java.util.Arrays;
+import java.util.List;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
+import org.mockito.InOrder;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
+import org.robolectric.annotation.Implementation;
+import org.robolectric.annotation.Implements;
+import org.robolectric.annotation.Resetter;
+
+@RunWith(RobolectricTestRunner.class)
+@Config(shadows = {BatteryBackupHelperTest.ShadowUserHandle.class})
+public final class BatteryBackupHelperTest {
+ private static final String PACKAGE_NAME1 = "com.android.testing.1";
+ private static final String PACKAGE_NAME2 = "com.android.testing.2";
+ private static final String PACKAGE_NAME3 = "com.android.testing.3";
+
+ private Context mContext;
+ private BatteryBackupHelper mBatteryBackupHelper;
+
+ @Mock
+ private PackageManager mPackageManager;
+ @Mock
+ private BackupDataOutput mBackupDataOutput;
+ @Mock
+ private BackupDataInputStream mBackupDataInputStream;
+ @Mock
+ private IDeviceIdleController mDeviceController;
+ @Mock
+ private IPackageManager mIPackageManager;
+ @Mock
+ private AppOpsManager mAppOpsManager;
+ @Mock
+ private UserManager mUserManager;
+ @Mock
+ private PowerAllowlistBackend mPowerAllowlistBackend;
+ @Mock
+ private BatteryOptimizeUtils mBatteryOptimizeUtils;
+
+ @Before
+ public void setUp() throws Exception {
+ MockitoAnnotations.initMocks(this);
+ mContext = spy(RuntimeEnvironment.application);
+ doReturn(mContext).when(mContext).getApplicationContext();
+ doReturn(mAppOpsManager).when(mContext).getSystemService(AppOpsManager.class);
+ doReturn(mUserManager).when(mContext).getSystemService(UserManager.class);
+ doReturn(mPackageManager).when(mContext).getPackageManager();
+ mBatteryBackupHelper = new BatteryBackupHelper(mContext);
+ mBatteryBackupHelper.mIDeviceIdleController = mDeviceController;
+ mBatteryBackupHelper.mIPackageManager = mIPackageManager;
+ mBatteryBackupHelper.mPowerAllowlistBackend = mPowerAllowlistBackend;
+ mBatteryBackupHelper.mBatteryOptimizeUtils = mBatteryOptimizeUtils;
+ mockUid(1001 /*fake uid*/, PACKAGE_NAME1);
+ mockUid(1002 /*fake uid*/, PACKAGE_NAME2);
+ mockUid(BatteryUtils.UID_NULL, PACKAGE_NAME3);
+ doReturn(false).when(mPowerAllowlistBackend).isDefaultActiveApp(anyString());
+ doReturn(false).when(mPowerAllowlistBackend).isDefaultActiveApp(anyString());
+ doReturn(false).when(mPowerAllowlistBackend).isAllowlistedExceptIdle(anyString());
+ }
+
+ @After
+ public void resetShadows() {
+ ShadowUserHandle.reset();
+ }
+
+ @Test
+ public void performBackup_nullPowerList_notBackupPowerList() throws Exception {
+ doReturn(null).when(mDeviceController).getFullPowerWhitelist();
+ mBatteryBackupHelper.performBackup(null, mBackupDataOutput, null);
+
+ verify(mBackupDataOutput, never()).writeEntityHeader(anyString(), anyInt());
+ }
+
+ @Test
+ public void performBackup_emptyPowerList_notBackupPowerList() throws Exception {
+ doReturn(new String[0]).when(mDeviceController).getFullPowerWhitelist();
+ mBatteryBackupHelper.performBackup(null, mBackupDataOutput, null);
+
+ verify(mBackupDataOutput, never()).writeEntityHeader(anyString(), anyInt());
+ }
+
+ @Test
+ public void performBackup_remoteException_notBackupPowerList() throws Exception {
+ doThrow(new RemoteException()).when(mDeviceController).getFullPowerWhitelist();
+ mBatteryBackupHelper.performBackup(null, mBackupDataOutput, null);
+
+ verify(mBackupDataOutput, never()).writeEntityHeader(anyString(), anyInt());
+ }
+
+ @Test
+ public void performBackup_oneFullPowerListElement_backupFullPowerListData()
+ throws Exception {
+ final String[] fullPowerList = {"com.android.package"};
+ doReturn(fullPowerList).when(mDeviceController).getFullPowerWhitelist();
+
+ mBatteryBackupHelper.performBackup(null, mBackupDataOutput, null);
+
+ final byte[] expectedBytes = fullPowerList[0].getBytes();
+ verify(mBackupDataOutput).writeEntityHeader(
+ BatteryBackupHelper.KEY_FULL_POWER_LIST, expectedBytes.length);
+ verify(mBackupDataOutput).writeEntityData(expectedBytes, expectedBytes.length);
+ }
+
+ @Test
+ public void performBackup_backupFullPowerListData() throws Exception {
+ final String[] fullPowerList = {"com.android.package1", "com.android.package2"};
+ doReturn(fullPowerList).when(mDeviceController).getFullPowerWhitelist();
+
+ mBatteryBackupHelper.performBackup(null, mBackupDataOutput, null);
+
+ final String expectedResult = fullPowerList[0] + DELIMITER + fullPowerList[1];
+ final byte[] expectedBytes = expectedResult.getBytes();
+ verify(mBackupDataOutput).writeEntityHeader(
+ BatteryBackupHelper.KEY_FULL_POWER_LIST, expectedBytes.length);
+ verify(mBackupDataOutput).writeEntityData(expectedBytes, expectedBytes.length);
+ }
+
+ @Test
+ public void performBackup_nonOwner_ignoreAllBackupAction() throws Exception {
+ ShadowUserHandle.setUid(1);
+ final String[] fullPowerList = {"com.android.package"};
+ doReturn(fullPowerList).when(mDeviceController).getFullPowerWhitelist();
+
+ mBatteryBackupHelper.performBackup(null, mBackupDataOutput, null);
+
+ verify(mBackupDataOutput, never()).writeEntityHeader(anyString(), anyInt());
+ }
+
+ @Test
+ public void backupOptimizationMode_nullInstalledApps_ignoreBackupOptimization()
+ throws Exception {
+ final UserInfo userInfo =
+ new UserInfo(/*userId=*/ 0, /*userName=*/ "google", /*flag=*/ 0);
+ doReturn(Arrays.asList(userInfo)).when(mUserManager).getProfiles(anyInt());
+ doThrow(new RuntimeException())
+ .when(mIPackageManager)
+ .getInstalledApplications(anyInt(), anyInt());
+
+ mBatteryBackupHelper.backupOptimizationMode(mBackupDataOutput, null);
+
+ verify(mBackupDataOutput, never()).writeEntityHeader(anyString(), anyInt());
+ }
+
+ @Test
+ public void backupOptimizationMode_backupOptimizationMode() throws Exception {
+ final List<String> allowlistedApps = Arrays.asList(PACKAGE_NAME1);
+ createTestingData(PACKAGE_NAME1, PACKAGE_NAME2, PACKAGE_NAME3);
+
+ mBatteryBackupHelper.backupOptimizationMode(mBackupDataOutput, allowlistedApps);
+
+ // 2 for UNRESTRICTED mode and 1 for RESTRICTED mode.
+ final String expectedResult = PACKAGE_NAME1 + ":2," + PACKAGE_NAME2 + ":1,";
+ verifyBackupData(expectedResult);
+ }
+
+ @Test
+ public void backupOptimizationMode_backupOptimizationModeAndIgnoreSystemApp()
+ throws Exception {
+ final List<String> allowlistedApps = Arrays.asList(PACKAGE_NAME1);
+ createTestingData(PACKAGE_NAME1, PACKAGE_NAME2, PACKAGE_NAME3);
+ // Sets "com.android.testing.1" as system app.
+ doReturn(true).when(mPowerAllowlistBackend).isSysAllowlisted(PACKAGE_NAME1);
+
+ mBatteryBackupHelper.backupOptimizationMode(mBackupDataOutput, allowlistedApps);
+
+ // "com.android.testing.2" for RESTRICTED mode.
+ final String expectedResult = PACKAGE_NAME2 + ":1,";
+ verifyBackupData(expectedResult);
+ }
+
+ @Test
+ public void backupOptimizationMode_backupOptimizationModeAndIgnoreDefaultApp()
+ throws Exception {
+ final List<String> allowlistedApps = Arrays.asList(PACKAGE_NAME1);
+ createTestingData(PACKAGE_NAME1, PACKAGE_NAME2, PACKAGE_NAME3);
+ // Sets "com.android.testing.1" as device default app.
+ doReturn(true).when(mPowerAllowlistBackend).isDefaultActiveApp(PACKAGE_NAME1);
+
+ mBatteryBackupHelper.backupOptimizationMode(mBackupDataOutput, allowlistedApps);
+
+ // "com.android.testing.2" for RESTRICTED mode.
+ final String expectedResult = PACKAGE_NAME2 + ":1,";
+ verifyBackupData(expectedResult);
+ }
+
+ @Test
+ public void backupOptimizationMode_backupOptimizationAndIgnoreAppInTheAllowlist()
+ throws Exception {
+ final List<String> allowlistedApps = Arrays.asList(PACKAGE_NAME1);
+ createTestingData(PACKAGE_NAME1, PACKAGE_NAME2, PACKAGE_NAME3);
+ // Sets "com.android.testing.1" in the allowlist.
+ doReturn(true).when(mPowerAllowlistBackend).isAllowlistedExceptIdle(PACKAGE_NAME1);
+
+ mBatteryBackupHelper.backupOptimizationMode(mBackupDataOutput, allowlistedApps);
+
+ // "com.android.testing.2" for RESTRICTED mode.
+ final String expectedResult = PACKAGE_NAME2 + ":1,";
+ verifyBackupData(expectedResult);
+ }
+
+ @Test
+ public void restoreEntity_nonOwner_notReadBackupData() throws Exception {
+ ShadowUserHandle.setUid(1);
+ mockBackupData(30 /*dataSize*/, BatteryBackupHelper.KEY_OPTIMIZATION_LIST);
+
+ mBatteryBackupHelper.restoreEntity(mBackupDataInputStream);
+
+ verifyZeroInteractions(mBackupDataInputStream);
+ }
+
+ @Test
+ public void restoreEntity_zeroDataSize_notReadBackupData() throws Exception {
+ final int zeroDataSize = 0;
+ mockBackupData(zeroDataSize, BatteryBackupHelper.KEY_OPTIMIZATION_LIST);
+
+ mBatteryBackupHelper.restoreEntity(mBackupDataInputStream);
+
+ verify(mBackupDataInputStream, never()).read(any(), anyInt(), anyInt());
+ }
+
+ @Test
+ public void restoreEntity_incorrectDataKey_notReadBackupData() throws Exception {
+ final String incorrectDataKey = BatteryBackupHelper.KEY_FULL_POWER_LIST;
+ mockBackupData(30 /*dataSize*/, incorrectDataKey);
+
+ mBatteryBackupHelper.restoreEntity(mBackupDataInputStream);
+
+ verify(mBackupDataInputStream, never()).read(any(), anyInt(), anyInt());
+ }
+
+ @Test
+ public void restoreEntity_readExpectedDataFromBackupData() throws Exception {
+ final int dataSize = 30;
+ mockBackupData(dataSize, BatteryBackupHelper.KEY_OPTIMIZATION_LIST);
+
+ mBatteryBackupHelper.restoreEntity(mBackupDataInputStream);
+
+ final ArgumentCaptor<byte[]> captor = ArgumentCaptor.forClass(byte[].class);
+ verify(mBackupDataInputStream).read(captor.capture(), eq(0), eq(dataSize));
+ assertThat(captor.getValue().length).isEqualTo(dataSize);
+ }
+
+ @Test
+ public void restoreOptimizationMode_nullBytesData_skipRestore() throws Exception {
+ mBatteryBackupHelper.restoreOptimizationMode(new byte[0]);
+ verifyZeroInteractions(mBatteryOptimizeUtils);
+
+ mBatteryBackupHelper.restoreOptimizationMode("invalid data format".getBytes());
+ verifyZeroInteractions(mBatteryOptimizeUtils);
+
+ mBatteryBackupHelper.restoreOptimizationMode(DELIMITER.getBytes());
+ verifyZeroInteractions(mBatteryOptimizeUtils);
+ }
+
+ @Test
+ public void restoreOptimizationMode_invalidModeFormat_skipRestore() throws Exception {
+ final String invalidNumberFormat = "google";
+ final String packageModes =
+ PACKAGE_NAME1 + DELIMITER_MODE + MODE_RESTRICTED + DELIMITER +
+ PACKAGE_NAME2 + DELIMITER_MODE + invalidNumberFormat;
+
+ mBatteryBackupHelper.restoreOptimizationMode(packageModes.getBytes());
+
+ final InOrder inOrder = inOrder(mBatteryOptimizeUtils);
+ inOrder.verify(mBatteryOptimizeUtils).setAppOptimizationMode(MODE_RESTRICTED);
+ inOrder.verify(mBatteryOptimizeUtils, never()).setAppOptimizationMode(anyInt());
+ }
+
+ @Test
+ public void restoreOptimizationMode_restoreExpectedModes() throws Exception {
+ final String packageModes =
+ PACKAGE_NAME1 + DELIMITER_MODE + MODE_RESTRICTED + DELIMITER +
+ PACKAGE_NAME2 + DELIMITER_MODE + MODE_UNRESTRICTED + DELIMITER +
+ PACKAGE_NAME3 + DELIMITER_MODE + MODE_RESTRICTED + DELIMITER;
+
+ mBatteryBackupHelper.restoreOptimizationMode(packageModes.getBytes());
+
+ final InOrder inOrder = inOrder(mBatteryOptimizeUtils);
+ inOrder.verify(mBatteryOptimizeUtils).setAppOptimizationMode(MODE_RESTRICTED);
+ inOrder.verify(mBatteryOptimizeUtils).setAppOptimizationMode(MODE_UNRESTRICTED);
+ inOrder.verify(mBatteryOptimizeUtils, never()).setAppOptimizationMode(MODE_RESTRICTED);
+ }
+
+ private void mockUid(int uid, String packageName) throws Exception {
+ doReturn(uid).when(mPackageManager)
+ .getPackageUid(packageName, PackageManager.GET_META_DATA);
+ }
+
+ private void mockBackupData(int dataSize, String dataKey) {
+ doReturn(dataSize).when(mBackupDataInputStream).size();
+ doReturn(dataKey).when(mBackupDataInputStream).getKey();
+ }
+
+ private void verifyBackupData(String expectedResult) throws Exception {
+ final byte[] expectedBytes = expectedResult.getBytes();
+ verify(mBackupDataOutput).writeEntityHeader(
+ BatteryBackupHelper.KEY_OPTIMIZATION_LIST, expectedBytes.length);
+ verify(mBackupDataOutput).writeEntityData(expectedBytes, expectedBytes.length);
+ }
+
+ private void createTestingData(
+ String packageName1, String packageName2, String packageName3) throws Exception {
+ // Sets the getInstalledApplications() method for testing.
+ final UserInfo userInfo =
+ new UserInfo(/*userId=*/ 0, /*userName=*/ "google", /*flag=*/ 0);
+ doReturn(Arrays.asList(userInfo)).when(mUserManager).getProfiles(anyInt());
+ final ApplicationInfo applicationInfo1 = new ApplicationInfo();
+ applicationInfo1.enabled = true;
+ applicationInfo1.uid = 1;
+ applicationInfo1.packageName = packageName1;
+ final ApplicationInfo applicationInfo2 = new ApplicationInfo();
+ applicationInfo2.enabled = false;
+ applicationInfo2.uid = 2;
+ applicationInfo2.packageName = packageName2;
+ applicationInfo2.enabledSetting = PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER;
+ final ApplicationInfo applicationInfo3 = new ApplicationInfo();
+ applicationInfo3.enabled = false;
+ applicationInfo3.uid = 3;
+ applicationInfo3.packageName = packageName3;
+ applicationInfo3.enabledSetting = PackageManager.COMPONENT_ENABLED_STATE_DISABLED;
+ doReturn(new ParceledListSlice<ApplicationInfo>(
+ Arrays.asList(applicationInfo1, applicationInfo2, applicationInfo3)))
+ .when(mIPackageManager)
+ .getInstalledApplications(anyInt(), anyInt());
+ // Sets the AppOpsManager for checkOpNoThrow() method.
+ doReturn(AppOpsManager.MODE_ALLOWED)
+ .when(mAppOpsManager)
+ .checkOpNoThrow(
+ AppOpsManager.OP_RUN_ANY_IN_BACKGROUND,
+ applicationInfo1.uid,
+ applicationInfo1.packageName);
+ doReturn(AppOpsManager.MODE_IGNORED)
+ .when(mAppOpsManager)
+ .checkOpNoThrow(
+ AppOpsManager.OP_RUN_ANY_IN_BACKGROUND,
+ applicationInfo2.uid,
+ applicationInfo2.packageName);
+ }
+
+ @Implements(UserHandle.class)
+ public static class ShadowUserHandle {
+ // Sets the default as thte OWNER role.
+ private static int sUid = 0;
+
+ public static void setUid(int uid) {
+ sUid = uid;
+ }
+
+ @Implementation
+ public static int myUserId() {
+ return sUid;
+ }
+
+ @Resetter
+ public static void reset() {
+ sUid = 0;
+ }
+ }
+}
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BatteryChartPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BatteryChartPreferenceControllerTest.java
index 43fbe81..a9a743b 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/BatteryChartPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/BatteryChartPreferenceControllerTest.java
@@ -103,7 +103,11 @@
resources.getConfiguration().setLocales(new LocaleList(new Locale("en_US")));
doReturn(resources).when(mContext).getResources();
doReturn(new String[] {"com.android.googlequicksearchbox"})
- .when(resources).getTextArray(R.array.allowlist_hide_summary_in_battery_usage);
+ .when(mFeatureFactory.powerUsageFeatureProvider)
+ .getHideApplicationSummary(mContext);
+ doReturn(new String[] {"com.android.gms.persistent"})
+ .when(mFeatureFactory.powerUsageFeatureProvider)
+ .getHideApplicationEntries(mContext);
mBatteryChartPreferenceController = createController();
mBatteryChartPreferenceController.mPrefContext = mContext;
mBatteryChartPreferenceController.mAppListPrefGroup = mAppListGroup;
@@ -660,7 +664,7 @@
// Verifies the items which are defined in the array list.
assertThat(mBatteryChartPreferenceController
- .isValidToShowEntry("com.google.android.gms.persistent"))
+ .isValidToShowEntry("com.android.gms.persistent"))
.isFalse();
}
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BatteryDiffEntryTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BatteryDiffEntryTest.java
index 85ac941..b1d8f0d 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/BatteryDiffEntryTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/BatteryDiffEntryTest.java
@@ -17,6 +17,7 @@
import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Matchers.anyInt;
import static org.mockito.Mockito.doReturn;
@@ -28,6 +29,7 @@
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.graphics.drawable.Drawable;
+import android.graphics.drawable.Drawable.ConstantState;
import android.os.BatteryConsumer;
import android.os.UserHandle;
import android.os.UserManager;
@@ -41,6 +43,10 @@
import org.mockito.MockitoAnnotations;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
+import org.robolectric.annotation.Implementation;
+import org.robolectric.annotation.Implements;
+import org.robolectric.annotation.Resetter;
import java.util.ArrayList;
import java.util.Collections;
@@ -48,6 +54,7 @@
import java.util.Locale;
@RunWith(RobolectricTestRunner.class)
+@Config(shadows = {BatteryDiffEntryTest.ShadowUserHandle.class})
public final class BatteryDiffEntryTest {
private Context mContext;
@@ -60,10 +67,12 @@
@Mock private Drawable mockBadgedDrawable;
@Mock private BatteryHistEntry mBatteryHistEntry;
@Mock private PackageInfo mockPackageInfo;
+ @Mock private ConstantState mockConstantState;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
+ ShadowUserHandle.reset();
mContext = spy(RuntimeEnvironment.application);
doReturn(mContext).when(mContext).getApplicationContext();
doReturn(mockUserManager).when(mContext).getSystemService(UserManager.class);
@@ -229,6 +238,7 @@
final ContentValues values = getContentValuesWithType(
ConvertUtils.CONSUMER_TYPE_SYSTEM_BATTERY);
final BatteryHistEntry batteryHistEntry = new BatteryHistEntry(values);
+ mockConstantState(mockDrawable);
final BatteryDiffEntry entry = createBatteryDiffEntry(10, batteryHistEntry);
@@ -239,20 +249,32 @@
}
@Test
- public void testGetAppIcon_uidConsumerWithNullIcon_returnDefaultActivityIcon()
+ public void testGetAppIcon_uidConsumerForNonOwner_returnDefaultActivityIconWithBadge()
throws Exception {
+ ShadowUserHandle.setUid(10);
final BatteryDiffEntry entry = createBatteryDiffEntry(mockDrawable);
- final int userId = UserHandle.getUserId(1001);
+ mockConstantState(mockDrawable);
+ mockConstantState(mockBadgedDrawable);
doReturn(mockBadgedDrawable).when(mockUserManager)
- .getBadgedIconForUser(mockDrawable, new UserHandle(userId));
+ .getBadgedIconForUser(eq(mockDrawable), any());
entry.mAppIcon = null;
assertThat(entry.getAppIcon()).isEqualTo(mockBadgedDrawable);
+ }
+
+ @Test
+ public void testGetAppIcon_uidConsumerWithNullIcon_returnDefaultActivityIcon()
+ throws Exception {
+ final BatteryDiffEntry entry = createBatteryDiffEntry(mockDrawable);
+ mockConstantState(mockDrawable);
+
+ entry.mAppIcon = null;
+ assertThat(entry.getAppIcon()).isEqualTo(mockDrawable);
assertThat(BatteryDiffEntry.sResourceCache).hasSize(1);
// Verifies the app label in the cache.
final BatteryEntry.NameAndIcon nameAndIcon =
BatteryDiffEntry.sResourceCache.get(entry.getKey());
- assertThat(nameAndIcon.icon).isEqualTo(mockBadgedDrawable);
+ assertThat(nameAndIcon.icon).isEqualTo(mockDrawable);
}
@Test
@@ -272,19 +294,17 @@
@Test
public void testClearCache_switchLocale_clearCacheIconAndLabel() throws Exception {
final int userId = UserHandle.getUserId(1001);
- doReturn(mockBadgedDrawable).when(mockUserManager)
- .getBadgedIconForUser(mockDrawable, new UserHandle(userId));
- doReturn(mockDrawable2).when(mockUserManager)
- .getBadgedIconForUser(mockDrawable2, new UserHandle(userId));
Locale.setDefault(new Locale("en_US"));
final BatteryDiffEntry entry1 = createBatteryDiffEntry(mockDrawable);
- assertThat(entry1.getAppIcon()).isEqualTo(mockBadgedDrawable);
+ mockConstantState(mockDrawable);
+ assertThat(entry1.getAppIcon()).isEqualTo(mockDrawable);
// Switch the locale into another one.
Locale.setDefault(new Locale("zh_TW"));
final BatteryDiffEntry entry2 = createBatteryDiffEntry(mockDrawable2);
// We should get new drawable without caching.
+ mockConstantState(mockDrawable2);
assertThat(entry2.getAppIcon()).isEqualTo(mockDrawable2);
// Verifies the cache is updated into the new drawable.
final BatteryEntry.NameAndIcon nameAndIcon =
@@ -440,4 +460,34 @@
.getPackagesForUid(1001);
return createBatteryDiffEntry(10, batteryHistEntry);
}
+
+ private void mockConstantState(Drawable drawable) {
+ doReturn(mockConstantState).when(drawable).getConstantState();
+ doReturn(drawable).when(mockConstantState).newDrawable();
+ }
+
+ @Implements(UserHandle.class)
+ public static class ShadowUserHandle {
+ // Sets the default as thte OWNER role.
+ private static int sUid = 0;
+
+ public static void setUid(int uid) {
+ sUid = uid;
+ }
+
+ @Implementation
+ public static int myUserId() {
+ return sUid;
+ }
+
+ @Implementation
+ public static int getUserId(int userId) {
+ return sUid;
+ }
+
+ @Resetter
+ public static void reset() {
+ sUid = 0;
+ }
+ }
}
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BatteryOptimizeUtilsTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BatteryOptimizeUtilsTest.java
index 89d66be..c32be18 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/BatteryOptimizeUtilsTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/BatteryOptimizeUtilsTest.java
@@ -16,9 +16,9 @@
package com.android.settings.fuelgauge;
-import static com.android.settings.fuelgauge.BatteryOptimizeUtils.AppUsageState.OPTIMIZED;
-import static com.android.settings.fuelgauge.BatteryOptimizeUtils.AppUsageState.RESTRICTED;
-import static com.android.settings.fuelgauge.BatteryOptimizeUtils.AppUsageState.UNRESTRICTED;
+import static com.android.settings.fuelgauge.BatteryOptimizeUtils.MODE_OPTIMIZED;
+import static com.android.settings.fuelgauge.BatteryOptimizeUtils.MODE_RESTRICTED;
+import static com.android.settings.fuelgauge.BatteryOptimizeUtils.MODE_UNRESTRICTED;
import static com.google.common.truth.Truth.assertThat;
@@ -26,6 +26,7 @@
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyZeroInteractions;
import static org.mockito.Mockito.when;
import android.app.AppOpsManager;
@@ -47,9 +48,9 @@
private static final int UID = 12345;
private static final String PACKAGE_NAME = "com.android.app";
- @Mock BatteryUtils mockBatteryUtils;
- @Mock AppOpsManager mockAppOpsManager;
- @Mock PowerAllowlistBackend mockBackend;
+ @Mock BatteryUtils mMockBatteryUtils;
+ @Mock AppOpsManager mMockAppOpsManager;
+ @Mock PowerAllowlistBackend mMockBackend;
private Context mContext;
private BatteryOptimizeUtils mBatteryOptimizeUtils;
@@ -59,42 +60,48 @@
MockitoAnnotations.initMocks(this);
mContext = spy(RuntimeEnvironment.application);
mBatteryOptimizeUtils = spy(new BatteryOptimizeUtils(mContext, UID, PACKAGE_NAME));
- mBatteryOptimizeUtils.mAppOpsManager = mockAppOpsManager;
- mBatteryOptimizeUtils.mBatteryUtils = mockBatteryUtils;
- mBatteryOptimizeUtils.mPowerAllowListBackend = mockBackend;
+ mBatteryOptimizeUtils.mAppOpsManager = mMockAppOpsManager;
+ mBatteryOptimizeUtils.mBatteryUtils = mMockBatteryUtils;
+ mBatteryOptimizeUtils.mPowerAllowListBackend = mMockBackend;
+ // Sets the default mode as MODE_RESTRICTED.
+ mBatteryOptimizeUtils.mMode = AppOpsManager.MODE_IGNORED;
+ mBatteryOptimizeUtils.mAllowListed = false;
}
@Test
- public void testGetAppUsageState_returnRestricted() {
- when(mockBackend.isAllowlisted(anyString())).thenReturn(false);
- when(mockAppOpsManager.checkOpNoThrow(anyInt(), anyInt(), anyString()))
+ public void testGetAppOptimizationMode_returnRestricted() {
+ when(mMockBackend.isAllowlisted(anyString())).thenReturn(false);
+ when(mMockAppOpsManager.checkOpNoThrow(anyInt(), anyInt(), anyString()))
.thenReturn(AppOpsManager.MODE_IGNORED);
- assertThat(mBatteryOptimizeUtils.getAppUsageState()).isEqualTo(RESTRICTED);
+ assertThat(mBatteryOptimizeUtils.getAppOptimizationMode())
+ .isEqualTo(MODE_RESTRICTED);
}
@Test
- public void testGetAppUsageState_returnUnrestricted() {
- when(mockBackend.isAllowlisted(anyString())).thenReturn(true);
- when(mockAppOpsManager.checkOpNoThrow(anyInt(), anyInt(), anyString()))
+ public void testGetAppOptimizationMode_returnUnrestricted() {
+ when(mMockBackend.isAllowlisted(anyString())).thenReturn(true);
+ when(mMockAppOpsManager.checkOpNoThrow(anyInt(), anyInt(), anyString()))
.thenReturn(AppOpsManager.MODE_ALLOWED);
- assertThat(mBatteryOptimizeUtils.getAppUsageState()).isEqualTo(UNRESTRICTED);
+ assertThat(mBatteryOptimizeUtils.getAppOptimizationMode())
+ .isEqualTo(MODE_UNRESTRICTED);
}
@Test
- public void testGetAppUsageState_returnOptimized() {
- when(mockBackend.isAllowlisted(anyString())).thenReturn(false);
- when(mockAppOpsManager.checkOpNoThrow(anyInt(), anyInt(), anyString()))
+ public void testGetAppOptimizationMode_returnOptimized() {
+ when(mMockBackend.isAllowlisted(anyString())).thenReturn(false);
+ when(mMockAppOpsManager.checkOpNoThrow(anyInt(), anyInt(), anyString()))
.thenReturn(AppOpsManager.MODE_ALLOWED);
- assertThat(mBatteryOptimizeUtils.getAppUsageState()).isEqualTo(OPTIMIZED);
+ assertThat(mBatteryOptimizeUtils.getAppOptimizationMode())
+ .isEqualTo(MODE_OPTIMIZED);
}
@Test
public void testIsSystemOrDefaultApp_isSystemOrDefaultApp_returnTrue() {
- when(mockBackend.isAllowlisted(anyString())).thenReturn(true);
- when(mockBackend.isDefaultActiveApp(anyString())).thenReturn(true);
+ when(mMockBackend.isAllowlisted(anyString())).thenReturn(true);
+ when(mMockBackend.isDefaultActiveApp(anyString())).thenReturn(true);
assertThat(mBatteryOptimizeUtils.isSystemOrDefaultApp()).isTrue();
}
@@ -118,29 +125,57 @@
}
@Test
- public void testSetAppUsageState_Restricted_verifyAction() {
- mBatteryOptimizeUtils.setAppUsageState(RESTRICTED);
+ public void testIsAllowlistedExpectIdle_isAllowlistedExceptIdle_returnTrue() {
+ when(mMockBackend.isAllowlistedExceptIdle(anyString())).thenReturn(true);
- verify(mockBatteryUtils).setForceAppStandby(UID,
+ assertThat(mBatteryOptimizeUtils.isAllowlistedExceptIdleApp()).isTrue();
+ }
+
+ @Test
+ public void testIsAllowlistedExpectIdle_notAllowlistedExpectIdle_returnFalse() {
+ assertThat(mBatteryOptimizeUtils.isAllowlistedExceptIdleApp()).isFalse();
+ }
+
+ @Test
+ public void testSetAppOptimizationMode_Restricted_verifyAction() {
+ // Sets the current mode as MODE_UNRESTRICTED.
+ mBatteryOptimizeUtils.mAllowListed = false;
+ mBatteryOptimizeUtils.mMode = AppOpsManager.MODE_ALLOWED;
+
+ mBatteryOptimizeUtils.setAppOptimizationMode(MODE_RESTRICTED);
+
+ verify(mMockBatteryUtils).setForceAppStandby(UID,
PACKAGE_NAME, AppOpsManager.MODE_IGNORED);
- verify(mockBackend).removeApp(PACKAGE_NAME);
+ verify(mMockBackend).removeApp(PACKAGE_NAME);
}
@Test
- public void testSetAppUsageState_Unrestricted_verifyAction() {
- mBatteryOptimizeUtils.setAppUsageState(UNRESTRICTED);
+ public void testSetAppOptimizationMode_Unrestricted_verifyAction() {
+ mBatteryOptimizeUtils.setAppOptimizationMode(MODE_UNRESTRICTED);
- verify(mockBatteryUtils).setForceAppStandby(UID,
+ verify(mMockBatteryUtils).setForceAppStandby(UID,
PACKAGE_NAME, AppOpsManager.MODE_ALLOWED);
- verify(mockBackend).addApp(PACKAGE_NAME);
+ verify(mMockBackend).addApp(PACKAGE_NAME);
}
@Test
- public void testSetAppUsageState_Optimized_verifyAction() {
- mBatteryOptimizeUtils.setAppUsageState(OPTIMIZED);
+ public void testSetAppOptimizationMode_Optimized_verifyAction() {
+ mBatteryOptimizeUtils.setAppOptimizationMode(MODE_OPTIMIZED);
- verify(mockBatteryUtils).setForceAppStandby(UID,
+ verify(mMockBatteryUtils).setForceAppStandby(UID,
PACKAGE_NAME, AppOpsManager.MODE_ALLOWED);
- verify(mockBackend).removeApp(PACKAGE_NAME);
+ verify(mMockBackend).removeApp(PACKAGE_NAME);
+ }
+
+ @Test
+ public void testSetAppOptimizationMode_sameUnrestrictedMode_verifyNoAction() {
+ // Sets the current mode as MODE_UNRESTRICTED.
+ mBatteryOptimizeUtils.mAllowListed = true;
+ mBatteryOptimizeUtils.mMode = AppOpsManager.MODE_ALLOWED;
+
+ mBatteryOptimizeUtils.setAppOptimizationMode(MODE_UNRESTRICTED);
+
+ verifyZeroInteractions(mMockBackend);
+ verifyZeroInteractions(mMockBatteryUtils);
}
}
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/ConvertUtilsTest.java b/tests/robotests/src/com/android/settings/fuelgauge/ConvertUtilsTest.java
index b04f053..ff0f25c 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/ConvertUtilsTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/ConvertUtilsTest.java
@@ -40,6 +40,7 @@
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
+import java.util.HashSet;
import java.util.List;
import java.util.Locale;
import java.util.Map;
@@ -67,7 +68,7 @@
}
@Test
- public void testConvert_returnsExpectedContentValues() {
+ public void convert_returnsExpectedContentValues() {
final int expectedType = 3;
when(mockBatteryEntry.getUid()).thenReturn(1001);
when(mockBatteryEntry.getLabel()).thenReturn("Settings");
@@ -124,7 +125,7 @@
}
@Test
- public void testConvert_nullBatteryEntry_returnsExpectedContentValues() {
+ public void convert_nullBatteryEntry_returnsExpectedContentValues() {
final ContentValues values =
ConvertUtils.convert(
/*entry=*/ null,
@@ -151,7 +152,7 @@
}
@Test
- public void testGetIndexedUsageMap_nullOrEmptyHistoryMap_returnEmptyCollection() {
+ public void getIndexedUsageMap_nullOrEmptyHistoryMap_returnEmptyCollection() {
final int timeSlotSize = 2;
final long[] batteryHistoryKeys = new long[] {101L, 102L, 103L, 104L, 105L};
@@ -166,7 +167,7 @@
.isEmpty();
}
@Test
- public void testGetIndexedUsageMap_returnsExpectedResult() {
+ public void getIndexedUsageMap_returnsExpectedResult() {
// Creates the fake testing data.
final int timeSlotSize = 2;
final long[] batteryHistoryKeys = new long[] {101L, 102L, 103L, 104L, 105L};
@@ -278,7 +279,7 @@
}
@Test
- public void testGetIndexedUsageMap_usageTimeExceed_returnsExpectedResult() {
+ public void getIndexedUsageMap_usageTimeExceed_returnsExpectedResult() {
final int timeSlotSize = 1;
final long[] batteryHistoryKeys = new long[] {101L, 102L, 103L};
final Map<Long, Map<String, BatteryHistEntry>> batteryHistoryMap =
@@ -320,7 +321,7 @@
}
@Test
- public void testGetIndexedUsageMap_hideBackgroundUsageTime_returnsExpectedResult() {
+ public void getIndexedUsageMap_hideBackgroundUsageTime_returnsExpectedResult() {
final long[] batteryHistoryKeys = new long[] {101L, 102L, 103L};
final Map<Long, Map<String, BatteryHistEntry>> batteryHistoryMap = new HashMap<>();
final BatteryHistEntry fakeEntry = createBatteryHistEntry(
@@ -339,8 +340,8 @@
"package3", "label3", 500, 5L, 3600000L, 7200000L);
entryMap.put(entry.getKey(), entry);
batteryHistoryMap.put(Long.valueOf(batteryHistoryKeys[2]), entryMap);
- when(mPowerUsageFeatureProvider.getHideBackgroundUsageTimeList(mContext))
- .thenReturn(Arrays.asList((CharSequence) "package3"));
+ when(mPowerUsageFeatureProvider.getHideBackgroundUsageTimeSet(mContext))
+ .thenReturn(new HashSet(Arrays.asList((CharSequence) "package3")));
final Map<Integer, List<BatteryDiffEntry>> purgedResultMap =
ConvertUtils.getIndexedUsageMap(
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/OptimizedPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/OptimizedPreferenceControllerTest.java
index 874618d..923855d 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/OptimizedPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/OptimizedPreferenceControllerTest.java
@@ -76,8 +76,8 @@
@Test
public void testUpdateState_isOptimizedStates_prefChecked() {
when(mockBatteryOptimizeUtils.isValidPackageName()).thenReturn(true);
- when(mockBatteryOptimizeUtils.getAppUsageState()).thenReturn(
- BatteryOptimizeUtils.AppUsageState.OPTIMIZED);
+ when(mockBatteryOptimizeUtils.getAppOptimizationMode()).thenReturn(
+ BatteryOptimizeUtils.MODE_OPTIMIZED);
mController.updateState(mPreference);
@@ -94,12 +94,22 @@
}
@Test
+ public void testUpdateState_isAllowlistedExceptIdleApp_prefEnabled() {
+ when(mockBatteryOptimizeUtils.isAllowlistedExceptIdleApp()).thenReturn(true);
+
+ mController.updateState(mPreference);
+
+ assertThat(mPreference.isEnabled()).isTrue();
+ assertThat(mPreference.isChecked()).isTrue();
+ }
+
+ @Test
public void testHandlePreferenceTreeClick_samePrefKey_verifyAction() {
mPreference.setKey(mController.KEY_OPTIMIZED_PREF);
mController.handlePreferenceTreeClick(mPreference);
- verify(mockBatteryOptimizeUtils).setAppUsageState(
- BatteryOptimizeUtils.AppUsageState.OPTIMIZED);
+ verify(mockBatteryOptimizeUtils).setAppOptimizationMode(
+ BatteryOptimizeUtils.MODE_OPTIMIZED);
}
@Test
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/RestrictedPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/RestrictedPreferenceControllerTest.java
index 2e17404..7b4271f 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/RestrictedPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/RestrictedPreferenceControllerTest.java
@@ -84,8 +84,8 @@
@Test
public void testUpdateState_isRestrictedStates_prefChecked() {
when(mockBatteryOptimizeUtils.isValidPackageName()).thenReturn(true);
- when(mockBatteryOptimizeUtils.getAppUsageState()).thenReturn(
- BatteryOptimizeUtils.AppUsageState.RESTRICTED);
+ when(mockBatteryOptimizeUtils.getAppOptimizationMode()).thenReturn(
+ BatteryOptimizeUtils.MODE_RESTRICTED);
mController.updateState(mPreference);
@@ -102,12 +102,22 @@
}
@Test
+ public void testUpdateState_isAllowlistedExceptIdleApp_prefDisabled() {
+ when(mockBatteryOptimizeUtils.isAllowlistedExceptIdleApp()).thenReturn(true);
+
+ mController.updateState(mPreference);
+
+ assertThat(mPreference.isChecked()).isFalse();
+ assertThat(mPreference.isEnabled()).isFalse();
+ }
+
+ @Test
public void testHandlePreferenceTreeClick_samePrefKey_verifyAction() {
mPreference.setKey(mController.KEY_RESTRICTED_PREF);
mController.handlePreferenceTreeClick(mPreference);
- verify(mockBatteryOptimizeUtils).setAppUsageState(
- BatteryOptimizeUtils.AppUsageState.RESTRICTED);
+ verify(mockBatteryOptimizeUtils).setAppOptimizationMode(
+ BatteryOptimizeUtils.MODE_RESTRICTED);
}
@Test
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/UnrestrictedPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/UnrestrictedPreferenceControllerTest.java
index 63cf760..5052784 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/UnrestrictedPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/UnrestrictedPreferenceControllerTest.java
@@ -84,8 +84,8 @@
@Test
public void testUpdateState_isUnrestrictedStates_prefChecked() {
when(mockBatteryOptimizeUtils.isValidPackageName()).thenReturn(true);
- when(mockBatteryOptimizeUtils.getAppUsageState()).thenReturn(
- BatteryOptimizeUtils.AppUsageState.UNRESTRICTED);
+ when(mockBatteryOptimizeUtils.getAppOptimizationMode()).thenReturn(
+ BatteryOptimizeUtils.MODE_UNRESTRICTED);
mController.updateState(mPreference);
@@ -102,12 +102,22 @@
}
@Test
+ public void testUpdateState_isAllowlistedExceptIdleApp_prefDisabled() {
+ when(mockBatteryOptimizeUtils.isAllowlistedExceptIdleApp()).thenReturn(true);
+
+ mController.updateState(mPreference);
+
+ assertThat(mPreference.isChecked()).isFalse();
+ assertThat(mPreference.isEnabled()).isFalse();
+ }
+
+ @Test
public void testHandlePreferenceTreeClick_samePrefKey_verifyAction() {
mPreference.setKey(mController.KEY_UNRESTRICTED_PREF);
mController.handlePreferenceTreeClick(mPreference);
- verify(mockBatteryOptimizeUtils).setAppUsageState(
- BatteryOptimizeUtils.AppUsageState.UNRESTRICTED);
+ verify(mockBatteryOptimizeUtils).setAppOptimizationMode(
+ BatteryOptimizeUtils.MODE_UNRESTRICTED);
}
@Test
diff --git a/tests/robotests/src/com/android/settings/location/RecentLocationAccessPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/location/RecentLocationAccessPreferenceControllerTest.java
index 32c8627..52068c4 100644
--- a/tests/robotests/src/com/android/settings/location/RecentLocationAccessPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/location/RecentLocationAccessPreferenceControllerTest.java
@@ -18,12 +18,10 @@
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.spy;
import static org.mockito.Mockito.when;
import android.content.Context;
-import android.graphics.drawable.Drawable;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.TextView;
@@ -34,7 +32,7 @@
import com.android.settings.R;
import com.android.settings.dashboard.DashboardFragment;
import com.android.settings.testutils.shadow.ShadowDeviceConfig;
-import com.android.settingslib.location.RecentLocationAccesses;
+import com.android.settingslib.applications.RecentAppOpsAccess;
import org.junit.After;
import org.junit.Before;
@@ -48,7 +46,6 @@
import org.robolectric.annotation.Config;
import java.util.ArrayList;
-import java.util.List;
@RunWith(RobolectricTestRunner.class)
@Config(shadows = {ShadowDeviceConfig.class})
@@ -61,7 +58,7 @@
@Mock
private DashboardFragment mDashboardFragment;
@Mock
- private RecentLocationAccesses mRecentLocationApps;
+ private RecentAppOpsAccess mRecentLocationApps;
private Context mContext;
private RecentLocationAccessPreferenceController mController;
@@ -110,17 +107,4 @@
mContext.getText(R.string.location_recent_location_access_view_details));
assertThat(details.hasOnClickListeners()).isTrue();
}
-
- private List<RecentLocationAccesses.Access> createMockAccesses(int count) {
- final List<RecentLocationAccesses.Access> accesses = new ArrayList<>();
- for (int i = 0; i < count; i++) {
- final Drawable icon = mock(Drawable.class);
- // Add mock accesses
- final RecentLocationAccesses.Access access = new RecentLocationAccesses.Access(
- "packageName", android.os.Process.myUserHandle(), icon,
- "appTitle" + i, "appSummary" + i, 1000 - i);
- accesses.add(access);
- }
- return accesses;
- }
}
diff --git a/tests/robotests/src/com/android/settings/notification/SpatialAudioPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/SpatialAudioPreferenceControllerTest.java
new file mode 100644
index 0000000..66d18ec
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/notification/SpatialAudioPreferenceControllerTest.java
@@ -0,0 +1,91 @@
+/*
+ * Copyright (C) 2021 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.android.settings.core.BasePreferenceController.AVAILABLE;
+import static com.android.settings.core.BasePreferenceController.UNSUPPORTED_ON_DEVICE;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.media.AudioManager;
+import android.media.Spatializer;
+
+import org.junit.Before;
+import org.junit.Ignore;
+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;
+
+@Ignore("b/200896161")
+@RunWith(RobolectricTestRunner.class)
+public class SpatialAudioPreferenceControllerTest {
+
+ @Mock(answer = Answers.RETURNS_DEEP_STUBS)
+ private Context mContext;
+ @Mock
+ private AudioManager mAudioManager;
+ @Mock
+ private Spatializer mSpatializer;
+
+ private SpatialAudioPreferenceController mController;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ mContext = spy(RuntimeEnvironment.application);
+ when((Object) mContext.getSystemService(AudioManager.class)).thenReturn(mAudioManager);
+ when(mAudioManager.getSpatializer()).thenReturn(mSpatializer);
+ mController = new SpatialAudioPreferenceController(mContext);
+ }
+
+ @Test
+ public void getAvailabilityStatus_levelNone_shouldReturnUnsupported() {
+ when(mSpatializer.getImmersiveAudioLevel()).thenReturn(
+ Spatializer.SPATIALIZER_IMMERSIVE_LEVEL_NONE);
+ assertThat(mController.getAvailabilityStatus()).isEqualTo(UNSUPPORTED_ON_DEVICE);
+ }
+
+ @Test
+ public void getAvailabilityStatus_levelMultiChannel_shouldReturnAvailable() {
+ when(mSpatializer.getImmersiveAudioLevel()).thenReturn(
+ Spatializer.SPATIALIZER_IMMERSIVE_LEVEL_MULTICHANNEL);
+ assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE);
+ }
+
+ @Test
+ public void setChecked_withTrue_shouldEnableSpatializer() {
+ mController.setChecked(true);
+
+ verify(mSpatializer).setEnabled(true);
+ }
+
+ @Test
+ public void setChecked_withFalse_shouldDisableSpatializer() {
+ mController.setChecked(false);
+
+ verify(mSpatializer).setEnabled(false);
+ }
+}
diff --git a/tests/robotests/src/com/android/settings/testutils/FakeFeatureFactory.java b/tests/robotests/src/com/android/settings/testutils/FakeFeatureFactory.java
index de1af23..bc430e8 100644
--- a/tests/robotests/src/com/android/settings/testutils/FakeFeatureFactory.java
+++ b/tests/robotests/src/com/android/settings/testutils/FakeFeatureFactory.java
@@ -21,6 +21,7 @@
import android.content.Context;
+import com.android.settings.accessibility.AccessibilityMetricsFeatureProvider;
import com.android.settings.accessibility.AccessibilitySearchFeatureProvider;
import com.android.settings.accounts.AccountFeatureProvider;
import com.android.settings.applications.ApplicationFeatureProvider;
@@ -89,6 +90,7 @@
public SecuritySettingsFeatureProvider securitySettingsFeatureProvider;
public GameSettingsFeatureProvider gameSettingsFeatureProvider;
public AccessibilitySearchFeatureProvider mAccessibilitySearchFeatureProvider;
+ public AccessibilityMetricsFeatureProvider mAccessibilityMetricsFeatureProvider;
/**
* Call this in {@code @Before} method of the test class to use fake factory.
@@ -139,6 +141,7 @@
securitySettingsFeatureProvider = mock(SecuritySettingsFeatureProvider.class);
gameSettingsFeatureProvider = mock(GameSettingsFeatureProvider.class);
mAccessibilitySearchFeatureProvider = mock(AccessibilitySearchFeatureProvider.class);
+ mAccessibilityMetricsFeatureProvider = mock(AccessibilityMetricsFeatureProvider.class);
}
@Override
@@ -280,4 +283,9 @@
public AccessibilitySearchFeatureProvider getAccessibilitySearchFeatureProvider() {
return mAccessibilitySearchFeatureProvider;
}
+
+ @Override
+ public AccessibilityMetricsFeatureProvider getAccessibilityMetricsFeatureProvider() {
+ return mAccessibilityMetricsFeatureProvider;
+ }
}
diff --git a/tests/unit/src/com/android/settings/testutils/FakeFeatureFactory.java b/tests/unit/src/com/android/settings/testutils/FakeFeatureFactory.java
index ba7e0bd..0b6061c 100644
--- a/tests/unit/src/com/android/settings/testutils/FakeFeatureFactory.java
+++ b/tests/unit/src/com/android/settings/testutils/FakeFeatureFactory.java
@@ -19,6 +19,7 @@
import android.content.Context;
+import com.android.settings.accessibility.AccessibilityMetricsFeatureProvider;
import com.android.settings.accessibility.AccessibilitySearchFeatureProvider;
import com.android.settings.accounts.AccountFeatureProvider;
import com.android.settings.applications.ApplicationFeatureProvider;
@@ -84,6 +85,7 @@
public SecuritySettingsFeatureProvider securitySettingsFeatureProvider;
public GameSettingsFeatureProvider gameSettingsFeatureProvider;
public AccessibilitySearchFeatureProvider mAccessibilitySearchFeatureProvider;
+ public AccessibilityMetricsFeatureProvider mAccessibilityMetricsFeatureProvider;
/**
* Call this in {@code @Before} method of the test class to use fake factory.
@@ -124,6 +126,8 @@
extraAppInfoFeatureProvider = mock(ExtraAppInfoFeatureProvider.class);
securitySettingsFeatureProvider = mock(SecuritySettingsFeatureProvider.class);
gameSettingsFeatureProvider = mock(GameSettingsFeatureProvider.class);
+ mAccessibilitySearchFeatureProvider = mock(AccessibilitySearchFeatureProvider.class);
+ mAccessibilityMetricsFeatureProvider = mock(AccessibilityMetricsFeatureProvider.class);
}
@Override
@@ -265,4 +269,9 @@
public AccessibilitySearchFeatureProvider getAccessibilitySearchFeatureProvider() {
return mAccessibilitySearchFeatureProvider;
}
+
+ @Override
+ public AccessibilityMetricsFeatureProvider getAccessibilityMetricsFeatureProvider() {
+ return mAccessibilityMetricsFeatureProvider;
+ }
}