Merge "Fix the problem that the "Remove account" keyword has no search result." into tm-dev
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index be4810f..214d32a 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -9,7 +9,7 @@
<uses-permission android:name="android.permission.WRITE_MEDIA_STORAGE" />
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
- <uses-permission android:name="android.permission.READ_MEDIA_IMAGE" />
+ <uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
<uses-permission android:name="android.permission.READ_MEDIA_VIDEO" />
<uses-permission android:name="android.permission.READ_MEDIA_AUDIO" />
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
@@ -1517,6 +1517,8 @@
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="package" />
</intent-filter>
+ <meta-data android:name="com.android.settings.HIGHLIGHT_MENU_KEY"
+ android:value="@string/menu_key_apps"/>
</activity-alias>
<activity android:name=".applications.InstalledAppOpenByDefaultActivity"
@@ -1529,6 +1531,8 @@
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="package" />
</intent-filter>
+ <meta-data android:name="com.android.settings.HIGHLIGHT_MENU_KEY"
+ android:value="@string/menu_key_apps"/>
</activity>
<!-- Provide direct entry into manage apps showing running services. -->
@@ -1947,8 +1951,7 @@
<activity android:name=".accessibility.AccessibilitySettingsForSetupWizardActivity"
android:icon="@drawable/ic_accessibility_suggestion"
android:label="@string/vision_settings_title"
- android:exported="true"
- android:theme="@style/GlifV3Theme.Light">
+ android:exported="true">
<intent-filter android:priority="1">
<action android:name="android.settings.ACCESSIBILITY_SETTINGS_FOR_SUW" />
<category android:name="android.intent.category.DEFAULT" />
diff --git a/color-check-baseline.xml b/color-check-baseline.xml
index ba4d2f6..96f0210 100644
--- a/color-check-baseline.xml
+++ b/color-check-baseline.xml
@@ -21,38 +21,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=" <solid android:color="#BCEDDF"/>"
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~">
- <location
- file="res/drawable/accessibility_qs_tooltips_background.xml"
- line="22"
- column="20"/>
- </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=" <solid android:color="#BCEDDF"/>"
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~">
- <location
- file="res/drawable/accessibility_qs_tooltips_background.xml"
- line="35"
- column="20"/>
- </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:startColor="#4D000000""
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
@@ -117,6 +85,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="divider_color">#20ffffff</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="res/values/colors.xml"
+ line="20"
+ 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="homepage_accessibility_background">#783BE5</color>"
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
@@ -149,8 +133,40 @@
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="divider_color">#20ffffff</color>"
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ errorLine1=" <color name="setup_wizard_wifi_color_dark">#89ffffff</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="res/values/colors.xml"
+ line="22"
+ 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="setup_wizard_wifi_color_light">#89000000</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="res/values/colors.xml"
+ line="23"
+ 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="lock_pattern_background">#00000000</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
line="25"
@@ -181,22 +197,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=" <color name="setup_wizard_wifi_color_dark">#89ffffff</color>"
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
- <location
- file="res/values/colors.xml"
- line="27"
- 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="notification_importance_button_unselected">#5F6368</color>"
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
@@ -213,8 +213,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="setup_wizard_wifi_color_light">#89000000</color>"
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ errorLine1=" <color name="fingerprint_title_color">#ffffffff</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
line="28"
@@ -245,43 +245,11 @@
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="lock_pattern_background">#00000000</color>"
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
- <location
- file="res/values/colors.xml"
- line="30"
- 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_title_color">#ffffffff</color>"
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
- <location
- file="res/values/colors.xml"
- line="33"
- 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_message_color">#de000000</color>"
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="34"
+ line="29"
column="5"/>
</issue>
@@ -297,7 +265,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="36"
+ line="31"
column="5"/>
</issue>
@@ -313,7 +281,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="37"
+ line="32"
column="5"/>
</issue>
@@ -329,7 +297,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="41"
+ line="36"
column="5"/>
</issue>
@@ -345,6 +313,54 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
+ line="39"
+ 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="material_blue_500">#4285F4</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="res/values/colors.xml"
+ line="42"
+ 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="material_blue_700">#3367D6</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="res/values/colors.xml"
+ line="43"
+ 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="material_grey_100">#f5f5f5</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="res/values/colors.xml"
line="44"
column="5"/>
</issue>
@@ -373,10 +389,26 @@
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="material_blue_500">#4285F4</color>"
+ errorLine1=" <color name="material_grey_200">#ffffff</color>"
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
+ line="45"
+ 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="message_text_incoming">#ffffffff</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="res/values/colors.xml"
line="47"
column="5"/>
</issue>
@@ -405,8 +437,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="material_blue_700">#3367D6</color>"
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ errorLine1=" <color name="message_text_outgoing">#ff323232</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
line="48"
@@ -437,8 +469,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="material_grey_100">#f5f5f5</color>"
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ errorLine1=" <color name="timestamp_text_outgoing">#99323232</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
line="49"
@@ -469,8 +501,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="material_grey_200">#ffffff</color>"
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ errorLine1=" <color name="timestamp_text_incoming">#99ffffff</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
line="50"
@@ -501,75 +533,11 @@
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="message_text_incoming">#ffffffff</color>"
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
- <location
- file="res/values/colors.xml"
- line="52"
- 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="message_text_outgoing">#ff323232</color>"
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
- <location
- file="res/values/colors.xml"
- line="53"
- 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="timestamp_text_outgoing">#99323232</color>"
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
- <location
- file="res/values/colors.xml"
- line="54"
- 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="timestamp_text_incoming">#99ffffff</color>"
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
- <location
- file="res/values/colors.xml"
- line="55"
- 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="message_bubble_incoming">#689f38</color>"
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="56"
+ line="51"
column="5"/>
</issue>
@@ -585,7 +553,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="57"
+ line="52"
column="5"/>
</issue>
@@ -601,7 +569,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="58"
+ line="53"
column="5"/>
</issue>
@@ -617,7 +585,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="59"
+ line="54"
column="5"/>
</issue>
@@ -633,7 +601,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="60"
+ line="55"
column="5"/>
</issue>
@@ -649,7 +617,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="61"
+ line="56"
column="5"/>
</issue>
@@ -665,7 +633,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="63"
+ line="58"
column="5"/>
</issue>
@@ -681,7 +649,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="66"
+ line="61"
column="5"/>
</issue>
@@ -697,7 +665,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="69"
+ line="64"
column="5"/>
</issue>
@@ -713,7 +681,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="72"
+ line="67"
column="5"/>
</issue>
@@ -729,7 +697,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="75"
+ line="70"
column="5"/>
</issue>
@@ -745,7 +713,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="76"
+ line="71"
column="5"/>
</issue>
@@ -761,7 +729,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="77"
+ line="72"
column="5"/>
</issue>
@@ -777,7 +745,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="78"
+ line="73"
column="5"/>
</issue>
@@ -793,7 +761,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="79"
+ line="74"
column="5"/>
</issue>
@@ -809,7 +777,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="80"
+ line="75"
column="5"/>
</issue>
@@ -825,7 +793,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="81"
+ line="76"
column="5"/>
</issue>
@@ -841,7 +809,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="82"
+ line="77"
column="5"/>
</issue>
@@ -857,7 +825,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="83"
+ line="78"
column="5"/>
</issue>
@@ -873,7 +841,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="84"
+ line="79"
column="5"/>
</issue>
@@ -889,7 +857,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="85"
+ line="80"
column="5"/>
</issue>
@@ -905,7 +873,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="86"
+ line="81"
column="5"/>
</issue>
@@ -921,7 +889,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="87"
+ line="82"
column="5"/>
</issue>
@@ -937,7 +905,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="88"
+ line="83"
column="5"/>
</issue>
@@ -953,7 +921,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="89"
+ line="84"
column="5"/>
</issue>
@@ -969,7 +937,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="90"
+ line="85"
column="5"/>
</issue>
@@ -985,7 +953,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="91"
+ line="86"
column="5"/>
</issue>
@@ -1001,7 +969,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="92"
+ line="87"
column="5"/>
</issue>
@@ -1017,7 +985,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="93"
+ line="88"
column="5"/>
</issue>
@@ -1033,7 +1001,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="100"
+ line="95"
column="5"/>
</issue>
@@ -1049,7 +1017,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="103"
+ line="98"
column="5"/>
</issue>
@@ -1065,7 +1033,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="104"
+ line="99"
column="5"/>
</issue>
@@ -1081,7 +1049,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="105"
+ line="100"
column="5"/>
</issue>
@@ -1097,7 +1065,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="106"
+ line="101"
column="5"/>
</issue>
@@ -1113,7 +1081,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="107"
+ line="102"
column="5"/>
</issue>
@@ -1129,7 +1097,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="108"
+ line="103"
column="5"/>
</issue>
@@ -1145,7 +1113,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="111"
+ line="106"
column="5"/>
</issue>
@@ -1161,7 +1129,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="112"
+ line="107"
column="5"/>
</issue>
@@ -1177,7 +1145,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="113"
+ line="108"
column="5"/>
</issue>
@@ -1193,7 +1161,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="114"
+ line="109"
column="5"/>
</issue>
@@ -1209,7 +1177,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="115"
+ line="110"
column="5"/>
</issue>
@@ -1225,7 +1193,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="118"
+ line="113"
column="5"/>
</issue>
@@ -1241,7 +1209,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="119"
+ line="114"
column="5"/>
</issue>
@@ -1257,7 +1225,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="120"
+ line="115"
column="5"/>
</issue>
@@ -1273,7 +1241,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="123"
+ line="118"
column="5"/>
</issue>
@@ -1289,7 +1257,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="124"
+ line="119"
column="5"/>
</issue>
@@ -1305,7 +1273,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="125"
+ line="120"
column="5"/>
</issue>
@@ -1321,7 +1289,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="126"
+ line="121"
column="5"/>
</issue>
@@ -1337,7 +1305,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="127"
+ line="122"
column="5"/>
</issue>
@@ -1353,7 +1321,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="128"
+ line="123"
column="5"/>
</issue>
@@ -1369,7 +1337,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="135"
+ line="130"
column="5"/>
</issue>
@@ -1385,7 +1353,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="136"
+ line="131"
column="5"/>
</issue>
@@ -1401,7 +1369,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="137"
+ line="132"
column="5"/>
</issue>
@@ -1417,7 +1385,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="143"
+ line="138"
column="5"/>
</issue>
@@ -1433,7 +1401,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="145"
+ line="140"
column="5"/>
</issue>
@@ -1449,7 +1417,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="149"
+ line="144"
column="5"/>
</issue>
@@ -1465,7 +1433,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="150"
+ line="145"
column="5"/>
</issue>
@@ -1481,7 +1449,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="151"
+ line="146"
column="5"/>
</issue>
@@ -1497,7 +1465,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="152"
+ line="147"
column="5"/>
</issue>
@@ -1513,7 +1481,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="153"
+ line="148"
column="5"/>
</issue>
@@ -1529,7 +1497,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="154"
+ line="149"
column="5"/>
</issue>
@@ -1545,7 +1513,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="155"
+ line="150"
column="5"/>
</issue>
@@ -1561,7 +1529,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="156"
+ line="151"
column="5"/>
</issue>
@@ -1577,7 +1545,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="159"
+ line="154"
column="5"/>
</issue>
@@ -1593,7 +1561,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="160"
+ line="155"
column="5"/>
</issue>
@@ -1609,7 +1577,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="161"
+ line="156"
column="5"/>
</issue>
@@ -1625,7 +1593,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="162"
+ line="157"
column="5"/>
</issue>
@@ -1641,7 +1609,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="163"
+ line="158"
column="5"/>
</issue>
@@ -1657,7 +1625,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="164"
+ line="159"
column="5"/>
</issue>
@@ -1673,7 +1641,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="165"
+ line="160"
column="5"/>
</issue>
@@ -1689,7 +1657,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="166"
+ line="161"
column="5"/>
</issue>
@@ -1705,7 +1673,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="169"
+ line="164"
column="5"/>
</issue>
@@ -1721,7 +1689,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="170"
+ line="165"
column="5"/>
</issue>
@@ -1737,7 +1705,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="171"
+ line="166"
column="5"/>
</issue>
@@ -1753,7 +1721,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="172"
+ line="167"
column="5"/>
</issue>
@@ -1769,7 +1737,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="173"
+ line="168"
column="5"/>
</issue>
@@ -1785,7 +1753,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="174"
+ line="169"
column="5"/>
</issue>
@@ -1801,7 +1769,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="177"
+ line="172"
column="5"/>
</issue>
@@ -1817,7 +1785,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="178"
+ line="173"
column="5"/>
</issue>
@@ -1833,7 +1801,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="179"
+ line="174"
column="5"/>
</issue>
@@ -1849,7 +1817,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="180"
+ line="175"
column="5"/>
</issue>
@@ -1865,7 +1833,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="181"
+ line="176"
column="5"/>
</issue>
@@ -1881,7 +1849,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="182"
+ line="177"
column="5"/>
</issue>
@@ -1897,7 +1865,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="185"
+ line="180"
column="5"/>
</issue>
@@ -1913,7 +1881,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="186"
+ line="181"
column="5"/>
</issue>
@@ -1929,7 +1897,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="187"
+ line="182"
column="5"/>
</issue>
@@ -1945,7 +1913,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="188"
+ line="183"
column="5"/>
</issue>
@@ -1961,7 +1929,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="189"
+ line="184"
column="5"/>
</issue>
@@ -1977,7 +1945,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="190"
+ line="185"
column="5"/>
</issue>
@@ -1993,7 +1961,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="196"
+ line="191"
column="5"/>
</issue>
@@ -2009,7 +1977,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="197"
+ line="192"
column="5"/>
</issue>
@@ -2025,7 +1993,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="198"
+ line="193"
column="5"/>
</issue>
@@ -2041,7 +2009,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="199"
+ line="194"
column="5"/>
</issue>
@@ -2057,7 +2025,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="201"
+ line="196"
column="5"/>
</issue>
@@ -2073,7 +2041,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="203"
+ line="198"
column="5"/>
</issue>
@@ -2089,7 +2057,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="206"
+ line="201"
column="5"/>
</issue>
@@ -2837,6 +2805,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=" android:color="@color/accessibility_feature_background"/>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="res/drawable/ic_accessibility_animation.xml"
+ line="22"
+ column="13"/>
+ </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/accessibility_magnification_background"/>"
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
@@ -2949,6 +2933,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=" android:color="@color/accessibility_feature_background"/>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="res/drawable/ic_color_and_motion.xml"
+ line="22"
+ column="13"/>
+ </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/accessibility_color_inversion_background"/>"
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
@@ -3736,22 +3736,6 @@
errorLine1=" android:color="@color/accessibility_feature_background"/>"
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
- file="res/drawable/ic_color_and_motion.xml"
- line="22"
- column="13"/>
- </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/accessibility_feature_background"/>"
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
- <location
file="res/drawable/ic_vibration.xml"
line="22"
column="13"/>
@@ -4533,11 +4517,27 @@
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=" <string name="sync_plug" msgid="7956982719077985381">""<font fgcolor="#ffffffff">"Welcome to Google sync!"</font>" \nA Google approach to syncing data to allow access to your contacts, appointments, and more from wherever you are."</string>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="res/values-en-rXC/strings.xml"
+ line="3108"
+ column="170"/>
+ </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=" <string name="sync_plug" msgid="7956982719077985381"><font fgcolor="#ffffffff">"Welcome to Google sync!"</font>" \nA Google approach to syncing data to allow access to your contacts, appointments and more from wherever you are."</string>"
errorLine2=" ~~~~~~~~~~~~~~~~~~~">
<location
file="res/values-en-rAU/strings.xml"
- line="3104"
+ line="3112"
column="64"/>
</issue>
@@ -4553,7 +4553,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~">
<location
file="res/values-en-rCA/strings.xml"
- line="3104"
+ line="3112"
column="64"/>
</issue>
@@ -4569,7 +4569,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~">
<location
file="res/values-en-rGB/strings.xml"
- line="3104"
+ line="3112"
column="64"/>
</issue>
@@ -4585,7 +4585,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~">
<location
file="res/values-en-rIN/strings.xml"
- line="3104"
+ line="3112"
column="64"/>
</issue>
@@ -4597,27 +4597,11 @@
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=" <string name="sync_plug" msgid="7956982719077985381">""<font fgcolor="#ffffffff">"Welcome to Google sync!"</font>" \nA Google approach to syncing data to allow access to your contacts, appointments, and more from wherever you are."</string>"
- errorLine2=" ~~~~~~~~~~~~~~~~~~~">
- <location
- file="res/values-en-rXC/strings.xml"
- line="3104"
- column="170"/>
- </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=" <string name="sync_plug"><font fgcolor="#ffffffff">Welcome to Google sync!</font>"
errorLine2=" ~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/strings.xml"
- line="7142"
+ line="7103"
column="36"/>
</issue>
@@ -4629,22 +4613,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=" <item name="android:background">#ff000000</item>"
- errorLine2=" ^">
- <location
- file="res/values/styles.xml"
- line="202"
- column="41"/>
- </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 name="android:colorError">@color/settings_dialog_colorError</item>"
errorLine2=" ^">
<location
@@ -4713,7 +4681,7 @@
errorLine2=" ^">
<location
file="res/values/themes.xml"
- line="135"
+ line="126"
column="41"/>
</issue>
@@ -4729,7 +4697,7 @@
errorLine2=" ^">
<location
file="res/values/themes.xml"
- line="135"
+ line="126"
column="41"/>
</issue>
@@ -4745,6 +4713,38 @@
errorLine2=" ^">
<location
file="res/values/themes.xml"
+ line="183"
+ column="45"/>
+ </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 name="android:navigationBarColor">#00000000</item>"
+ errorLine2=" ^">
+ <location
+ file="res/values/themes.xml"
+ line="184"
+ column="49"/>
+ </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 name="android:statusBarColor">#00000000</item>"
+ errorLine2=" ^">
+ <location
+ file="res/values/themes.xml"
line="192"
column="45"/>
</issue>
@@ -4773,38 +4773,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=" <item name="android:statusBarColor">#00000000</item>"
- errorLine2=" ^">
- <location
- file="res/values/themes.xml"
- line="201"
- column="45"/>
- </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 name="android:navigationBarColor">#00000000</item>"
- errorLine2=" ^">
- <location
- file="res/values/themes.xml"
- line="202"
- column="49"/>
- </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 name="wifi_signal_color">@color/setup_wizard_wifi_color_dark</item>"
errorLine2=" ^">
<location
diff --git a/res/drawable/accessibility_auto_added_qs_tooltips_illustration.xml b/res/drawable/accessibility_auto_added_qs_tooltip_illustration.xml
similarity index 100%
rename from res/drawable/accessibility_auto_added_qs_tooltips_illustration.xml
rename to res/drawable/accessibility_auto_added_qs_tooltip_illustration.xml
diff --git a/res/drawable/accessibility_qs_tooltips_background.xml b/res/drawable/accessibility_qs_tooltip_background.xml
similarity index 100%
rename from res/drawable/accessibility_qs_tooltips_background.xml
rename to res/drawable/accessibility_qs_tooltip_background.xml
diff --git a/res/drawable/accessibility_qs_tooltips_illustration.xml b/res/drawable/accessibility_qs_tooltip_illustration.xml
similarity index 100%
rename from res/drawable/accessibility_qs_tooltips_illustration.xml
rename to res/drawable/accessibility_qs_tooltip_illustration.xml
diff --git a/res/drawable/accessibility_text_reading_reset_button_background.xml b/res/drawable/accessibility_text_reading_reset_button_background.xml
deleted file mode 100644
index b86facf..0000000
--- a/res/drawable/accessibility_text_reading_reset_button_background.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- Copyright (C) 2022 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<shape
- xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"
- android:shape="rectangle">
-
- <corners android:radius="100dp" />
- <solid android:color="?androidprv:attr/colorAccentPrimary" />
-</shape>
diff --git a/res/layout/accessibility_qs_tooltips.xml b/res/layout/accessibility_qs_tooltip.xml
similarity index 86%
rename from res/layout/accessibility_qs_tooltips.xml
rename to res/layout/accessibility_qs_tooltip.xml
index 2bc9f5f..41501aa 100644
--- a/res/layout/accessibility_qs_tooltips.xml
+++ b/res/layout/accessibility_qs_tooltip.xml
@@ -20,13 +20,13 @@
android:layout_height="wrap_content"
android:gravity="center"
android:orientation="vertical"
- android:background="@drawable/accessibility_qs_tooltips_background">
+ android:background="@drawable/accessibility_qs_tooltip_background">
<ImageView
android:id="@+id/qs_illustration"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:paddingTop="@dimen/accessibility_qs_tooltips_margin_top"
+ android:paddingTop="@dimen/accessibility_qs_tooltip_margin_top"
android:layout_gravity="center_horizontal"
android:contentDescription="@null" />
@@ -34,7 +34,7 @@
android:id="@+id/qs_content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:padding="@dimen/accessibility_qs_tooltips_margin"
+ android:padding="@dimen/accessibility_qs_tooltip_margin"
android:textColor="@android:color/black"
android:fontFamily="@*android:string/config_headlineFontFamilyMedium"
android:textSize="16sp" />
diff --git a/res/layout/accessibility_text_reading_reset_button.xml b/res/layout/accessibility_text_reading_reset_button.xml
index 43800df..dd9128b 100644
--- a/res/layout/accessibility_text_reading_reset_button.xml
+++ b/res/layout/accessibility_text_reading_reset_button.xml
@@ -28,9 +28,8 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
- android:background="@drawable/accessibility_text_reading_reset_button_background"
android:paddingHorizontal="24dp"
android:paddingVertical="14dp"
android:text="@string/accessibility_text_reading_reset_button_title"
- android:textAppearance="?android:attr/textAppearanceMedium" />
+ style="@style/ActionPrimaryButton"/>
</FrameLayout>
diff --git a/res/layout/apps_filter_spinner.xml b/res/layout/apps_filter_spinner.xml
index fcdcb5e..dfd41d4 100644
--- a/res/layout/apps_filter_spinner.xml
+++ b/res/layout/apps_filter_spinner.xml
@@ -33,8 +33,8 @@
style="?android:attr/borderlessButtonStyle"
android:layout_width="56dp"
android:layout_height="56dp"
- android:layout_marginTop="12dp"
- android:layout_toEndOf="@id/filter_spinner"
+ android:layout_centerHorizontal="true"
+ android:layout_toRightOf="@+id/filter_spinner"
android:contentDescription="@string/configure"
android:scaleType="center"
android:src="@drawable/ic_apps_filter_settings_24dp"
diff --git a/res/layout/profile_select_tablayout.xml b/res/layout/profile_select_tablayout.xml
deleted file mode 100644
index 3e83bb9..0000000
--- a/res/layout/profile_select_tablayout.xml
+++ /dev/null
@@ -1,49 +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.
- -->
-
-<LinearLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:app="http://schemas.android.com/apk/res-auto"
- android:theme="@style/Theme.MaterialComponents.DayNight"
- android:clipToPadding="true"
- android:clipChildren="true"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical">
-
- <com.google.android.material.tabs.TabLayout
- android:background="@android:color/transparent"
- android:id="@+id/tabs"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- app:tabMaxWidth="0dp"
- app:tabGravity="fill"
- app:tabMode="fixed"
- app:tabIndicatorColor="@*android:color/accent_device_default"
- app:tabSelectedTextColor="@*android:color/accent_device_default"
- app:tabTextColor="?android:attr/textColorSecondary" />
- <View
- android:layout_width="match_parent"
- android:layout_height="1dp"
- android:background="?android:attr/listDivider"/>
-
- <androidx.viewpager.widget.ViewPager
- android:id="@+id/view_pager"
- android:layout_width="match_parent"
- android:layout_height="match_parent">
-
- </androidx.viewpager.widget.ViewPager>
-</LinearLayout>
diff --git a/res/layout/support_details_dialog.xml b/res/layout/support_details_dialog.xml
index 0233a1b..2390f90 100644
--- a/res/layout/support_details_dialog.xml
+++ b/res/layout/support_details_dialog.xml
@@ -33,6 +33,8 @@
android:layout_width="@dimen/admin_details_dialog_icon_size"
android:layout_height="@dimen/admin_details_dialog_icon_size"
android:scaleType="fitCenter"
+ android:src="@drawable/ic_lock_closed"
+ android:tint="?android:attr/colorAccent"
android:contentDescription="@null"/>
<TextView
android:id="@+id/admin_support_dialog_title"
diff --git a/res/raw/udfps_edge_hint_lottie.json b/res/raw/udfps_left_edge_hint_lottie.json
similarity index 100%
rename from res/raw/udfps_edge_hint_lottie.json
rename to res/raw/udfps_left_edge_hint_lottie.json
diff --git a/res/raw/udfps_edge_hint_lottie.json b/res/raw/udfps_right_edge_hint_lottie.json
similarity index 100%
copy from res/raw/udfps_edge_hint_lottie.json
copy to res/raw/udfps_right_edge_hint_lottie.json
diff --git a/res/values/arrays.xml b/res/values/arrays.xml
index 469f201..867fecb 100644
--- a/res/values/arrays.xml
+++ b/res/values/arrays.xml
@@ -1626,4 +1626,24 @@
<item>300000</item>
</string-array>
+ <!-- Developer settings: ingress rate limit entries. [DO NOT TRANSLATE] -->
+ <string-array name="ingress_rate_limit_entries">
+ <item>@string/ingress_rate_limit_no_limit_entry</item>
+ <item>128kbps</item>
+ <item>256kbps</item>
+ <item>1Mbps</item>
+ <item>5Mbps</item>
+ <item>15Mbps</item>
+ </string-array>
+
+ <!-- Developer settings: ingress rate limit values. [DO NOT TRANSLATE] -->
+ <string-array name="ingress_rate_limit_values">
+ <item>-1</item> <!-- -1 codes for disabled -->
+ <item>16000</item> <!-- 128kbps == 16000B/s -->
+ <item>32000</item> <!-- 256kbps == 32000B/s -->
+ <item>125000</item> <!-- 1Mbps == 125000B/s -->
+ <item>625000</item> <!-- 5Mbps == 625000/s -->
+ <item>1875000</item> <!-- 15Mbps == 1875000/s -->
+ </string-array>
+
</resources>
diff --git a/res/values/config.xml b/res/values/config.xml
index 8933305..0d67de7 100755
--- a/res/values/config.xml
+++ b/res/values/config.xml
@@ -618,4 +618,6 @@
<!-- Whether the dream setup activity should be enabled as part of setupwizard -->
<bool name="dream_setup_supported">false</bool>
+ <!-- Whether to put the apps with system UID into system component bucket or not -->
+ <bool name="config_battery_combine_system_components">false</bool>
</resources>
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index 635bd82..c44a1cb 100755
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -276,9 +276,9 @@
<dimen name="accessibility_icon_size">32dp</dimen>
<dimen name="accessibility_icon_foreground_size">18dp</dimen>
- <!-- Accessibility quick settings tooltips -->
- <dimen name="accessibility_qs_tooltips_margin">20dp</dimen>
- <dimen name="accessibility_qs_tooltips_margin_top">27dp</dimen>
+ <!-- Accessibility quick settings tooltip -->
+ <dimen name="accessibility_qs_tooltip_margin">20dp</dimen>
+ <dimen name="accessibility_qs_tooltip_margin_top">27dp</dimen>
<!-- Restricted icon in switch bar -->
<dimen name="restricted_icon_margin_end">16dp</dimen>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index ffc224d..a6e2e3b 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -329,14 +329,16 @@
<!-- UI debug setting: Disable Bluetooth A2DP hardware offload [CHAR LIMIT=none] -->
<string name="bluetooth_disable_a2dp_hw_offload">Disable Bluetooth A2DP hardware offload</string>
- <!-- UI debug setting: Disable Bluetooth A2DP hardware offload [CHAR LIMIT=none] -->
- <string name="bluetooth_disable_a2dp_hw_offload_dialog_title">Restart Device?</string>
- <!-- UI debug setting: Disable Bluetooth A2DP hardware offload [CHAR LIMIT=none] -->
- <string name="bluetooth_disable_a2dp_hw_offload_dialog_message">You need to restart your device to change this setting.</string>
- <!-- UI debug setting: Disable Bluetooth A2DP hardware offload [CHAR LIMIT=none] -->
- <string name="bluetooth_disable_a2dp_hw_offload_dialog_confirm">Restart</string>
- <!-- UI debug setting: Disable Bluetooth A2DP hardware offload [CHAR LIMIT=none] -->
- <string name="bluetooth_disable_a2dp_hw_offload_dialog_cancel">Cancel</string>
+ <!-- UI debug setting: Disable Bluetooth LE AUDIO hardware offload [CHAR LIMIT=none] -->
+ <string name="bluetooth_disable_le_audio_hw_offload">Disable Bluetooth LE AUDIO hardware offload</string>
+ <!-- UI debug setting: Disable Bluetooth hardware offload [CHAR LIMIT=none] -->
+ <string name="bluetooth_disable_hw_offload_dialog_title">Restart Device?</string>
+ <!-- UI debug setting: Disable Bluetooth hardware offload [CHAR LIMIT=none] -->
+ <string name="bluetooth_disable_hw_offload_dialog_message">You need to restart your device to change this setting.</string>
+ <!-- UI debug setting: Disable Bluetooth hardware offload [CHAR LIMIT=none] -->
+ <string name="bluetooth_disable_hw_offload_dialog_confirm">Restart</string>
+ <!-- UI debug setting: Disable Bluetooth hardware offload [CHAR LIMIT=none] -->
+ <string name="bluetooth_disable_hw_offload_dialog_cancel">Cancel</string>
<!-- Title for Bluetooth device group with media capability group [CHAR LIMIT=none]-->
<string name="connected_device_media_device_title">Media devices</string>
@@ -5401,9 +5403,9 @@
<!-- 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"><b>How to use the button or gesture</b>\n\n1. Go to accessibility settings\n2. Select a feature and tap the shortcut\n3. To use the feature, tap the accessibility button or gesture</string>
+ <string name="accessibility_button_gesture_description"><b>To get started</b>\n1. Go to accessibility settings\n2. Select a feature and tap the shortcut\n3. Choose whether you want to use a button or gesture to access the feature</string>
<!-- Description for the accessibility button page. Explain how this page works. [CHAR LIMIT=NONE] -->
- <string name="accessibility_button_description"><b>How to use the button</b>\n\n1. Go to accessibility settings\n2. Select a feature and tap the shortcut\n3. To use the feature, tap the accessibility button</string>
+ <string name="accessibility_button_description"><b>To get started</b>\n1. Go to accessibility settings\n2. Select a feature and tap the shortcut\n3. Choose the button to access the feature</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] -->
@@ -5555,9 +5557,9 @@
<!-- Used in the accessibility service settings to open the activity. [CHAR LIMIT=NONE] -->
<string name="accessibility_service_primary_open_title">Open <xliff:g id="accessibility_app_name" example="TalkBack">%1$s</xliff:g></string>
<!-- Used in the accessibility service settings to show quick settings tooltip for auto-added feature. [CHAR LIMIT=NONE] -->
- <string name="accessibility_service_auto_added_qs_tooltips_content"><xliff:g id="accessibility_app_name" example="TalkBack">%1$s</xliff:g> added to Quick Settings. Swipe down to turn it on or off anytime.</string>
+ <string name="accessibility_service_auto_added_qs_tooltip_content"><xliff:g id="accessibility_app_name" example="TalkBack">%1$s</xliff:g> added to Quick Settings. Swipe down to turn it on or off anytime.</string>
<!-- Used in the accessibility service settings to show quick settings tooltip. [CHAR LIMIT=NONE] -->
- <string name="accessibility_service_qs_tooltips_content">You can also add <xliff:g id="accessibility_app_name" example="TalkBack">%1$s</xliff:g> to Quick Settings from the top of your screen</string>
+ <string name="accessibility_service_qs_tooltip_content">You can also add <xliff:g id="accessibility_app_name" example="TalkBack">%1$s</xliff:g> to Quick Settings from the top of your screen</string>
<!-- Used in the color correction settings to show quick settings tooltip for auto-added feature. [CHAR LIMIT=NONE] -->
<string name="accessibility_color_correction_auto_added_qs_tooltip_content">Color correction added to Quick Settings. Swipe down to turn it on or off anytime.</string>
<!-- Used in the color correction settings to show quick settings tooltip. [CHAR LIMIT=NONE] -->
@@ -5575,7 +5577,7 @@
<!-- Used in the One-hand mode settings to show quick settings tooltip. [CHAR LIMIT=NONE] -->
<string name="accessibility_one_handed_mode_qs_tooltip_content">You can also add one-handed mode to Quick Settings from the top of your screen</string>
<!-- Used in the accessibility action for accessibility quick settings tooltip to dismiss. [CHAR LIMIT=NONE] -->
- <string name="accessibility_quick_settings_tooltips_dismiss">Dismiss</string>
+ <string name="accessibility_quick_settings_tooltip_dismiss">Dismiss</string>
<!-- Intro for color correction settings screen to control turning on/off the feature entirely. [CHAR LIMIT=NONE] -->
<string name="accessibility_daltonizer_about_intro_text" product="default">Adjust how colors display on your phone</string>
<!-- Intro for color correction settings screen to control turning on/off the feature entirely. [CHAR LIMIT=NONE] -->
@@ -7772,6 +7774,8 @@
<string name="nfc_payment_btn_text_set_deault">Set default</string>
<!-- Label of the Update button of the Update default payment app dialog [CHAR LIMIT=40] -->
<string name="nfc_payment_btn_text_update">Update</string>
+ <!-- Summary text of the work apps in the default payment selection list [CHAR LIMIT=20]-->
+ <string name="nfc_work_text">Work</string>
<!-- Restrictions settings --><skip/>
<!-- Restriction settings title [CHAR LIMIT=35] -->
@@ -14035,4 +14039,13 @@
<string name="bluetooth_details_head_tracking_title">Make audio more realistic</string>
<!-- The summary of the head tracking [CHAR LIMIT=none] -->
<string name="bluetooth_details_head_tracking_summary">Shift positioning of audio so it sounds more natural.</string>
+
+ <!-- Developer Settings: Title for network bandwidth ingress rate limit [CHAR LIMIT=none] -->
+ <string name="ingress_rate_limit_title">Network download rate limit</string>
+ <!-- Developer Settings: Summary for network bandwidth ingress rate limit [CHAR LIMIT=none] -->
+ <string name="ingress_rate_limit_summary">Configure the network bandwidth ingress rate limit which is applied to all networks that provide internet connectivity.</string>
+ <!-- Developer Settings: Dialog for network bandwidth ingress rate limit [CHAR LIMIT=none] -->
+ <string name="ingress_rate_limit_dialog_title">Configure network download rate limit</string>
+ <!-- Developer Settings: Dialog ListPreference option to disable network bandwidth ingress rate limit [CHAR LIMIT=none] -->
+ <string name="ingress_rate_limit_no_limit_entry">No limit</string>
</resources>
diff --git a/res/values/styles.xml b/res/values/styles.xml
index c3ed5b2..bd0aea1 100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -432,12 +432,12 @@
</style>
<style name="LockPatternContainerStyle">
- <item name="android:maxHeight">400dp</item>
- <item name="android:maxWidth">420dp</item>
+ <item name="android:maxHeight">620dp</item>
+ <item name="android:maxWidth">620dp</item>
<item name="android:minHeight">0dp</item>
<item name="android:minWidth">0dp</item>
<item name="android:paddingBottom">0dp</item>
- <item name="android:paddingHorizontal">44dp</item>
+ <item name="android:paddingHorizontal">0dp</item>
<item name="android:paddingTop">0dp</item>
</style>
diff --git a/res/xml/bluetooth_device_details_fragment.xml b/res/xml/bluetooth_device_details_fragment.xml
index b21d5c9..ef5a990 100644
--- a/res/xml/bluetooth_device_details_fragment.xml
+++ b/res/xml/bluetooth_device_details_fragment.xml
@@ -38,11 +38,6 @@
android:key="action_buttons"
settings:allowDividerBelow="true"/>
- <!-- Add SpacePreference to draw divider -->
- <com.android.settings.applications.SpacePreference
- android:layout_height="0dp"
- settings:allowDividerAbove="true" />
-
<com.android.settings.slices.SlicePreference
android:key="bt_device_slice"
settings:controller="com.android.settings.slices.BlockingSlicePrefController"
diff --git a/res/xml/development_settings.xml b/res/xml/development_settings.xml
index ed1b4d2..75395c0 100644
--- a/res/xml/development_settings.xml
+++ b/res/xml/development_settings.xml
@@ -297,6 +297,14 @@
android:title="@string/tethering_hardware_offload"
android:summary="@string/tethering_hardware_offload_summary" />
+ <ListPreference
+ android:key="ingress_rate_limit"
+ android:title="@string/ingress_rate_limit_title"
+ android:summary="@string/ingress_rate_limit_summary"
+ android:dialogTitle="@string/ingress_rate_limit_dialog_title"
+ android:entries="@array/ingress_rate_limit_entries"
+ android:entryValues="@array/ingress_rate_limit_values" />
+
<com.android.settingslib.RestrictedPreference
android:key="default_usb_configuration"
android:fragment="com.android.settings.connecteddevice.usb.UsbDefaultFragment"
@@ -313,14 +321,13 @@
android:summary="@string/bluetooth_disable_absolute_volume_summary" />
<SwitchPreference
- android:key="bluetooth_gabeldorsche_enable"
- android:title="@string/bluetooth_enable_gabeldorsche"
- android:summary="@string/bluetooth_enable_gabeldorsche_summary" />
-
- <SwitchPreference
android:key="bluetooth_disable_a2dp_hw_offload"
android:title="@string/bluetooth_disable_a2dp_hw_offload" />
+ <SwitchPreference
+ android:key="bluetooth_disable_le_audio_hw_offload"
+ android:title="@string/bluetooth_disable_le_audio_hw_offload" />
+
<ListPreference
android:key="bluetooth_select_avrcp_version"
android:title="@string/bluetooth_select_avrcp_version_string"
diff --git a/res/xml/notification_access_permission_details.xml b/res/xml/notification_access_permission_details.xml
index cec383c..9867b6d 100644
--- a/res/xml/notification_access_permission_details.xml
+++ b/res/xml/notification_access_permission_details.xml
@@ -26,7 +26,7 @@
android:layout="@layout/settings_entity_header"
settings:controller="com.android.settings.applications.specialaccess.notificationaccess.HeaderPreferenceController"/>
- <com.android.settings.widget.FilterTouchesSwitchPreference
+ <com.android.settingslib.RestrictedSwitchPreference
android:key="notification_access_switch"
android:title="@string/notification_access_detail_switch"
settings:controller="com.android.settings.applications.specialaccess.notificationaccess.ApprovalPreferenceController"/>
diff --git a/src/com/android/settings/accessibility/AccessibilityFooterPreference.java b/src/com/android/settings/accessibility/AccessibilityFooterPreference.java
index 67b7827..fd9b6f8 100644
--- a/src/com/android/settings/accessibility/AccessibilityFooterPreference.java
+++ b/src/com/android/settings/accessibility/AccessibilityFooterPreference.java
@@ -25,9 +25,7 @@
import com.android.settingslib.widget.FooterPreference;
-/**
- * A custom preference acting as footer of a page. Disables the movement method by default.
- */
+/** A custom preference acting as footer of a page. Disables the movement method by default. */
public final class AccessibilityFooterPreference extends FooterPreference {
private boolean mLinkEnabled;
@@ -46,12 +44,16 @@
final TextView title = holder.itemView.findViewById(android.R.id.title);
if (mLinkEnabled) {
- // When a TextView has a movement method, it will set the view to clickable. This makes
- // View.onTouchEvent always return true and consumes the touch event, essentially
- // nullifying any return values of MovementMethod.onTouchEvent.
+ // When a TextView has a movement method, it will set the view to focusable and
+ // clickable. This makes View.onTouchEvent always return true and consumes the touch
+ // event, essentially nullifying any return values of MovementMethod.onTouchEvent.
// To still allow propagating touch events to the parent when this view doesn't have
// links, we only set the movement method here if the text contains links.
title.setMovementMethod(LinkMovementMethod.getInstance());
+
+ // Groups of related title and link content by making the container focusable,
+ // then make all the children inside not focusable.
+ title.setFocusable(false);
} else {
title.setMovementMethod(/* movement= */ null);
}
diff --git a/src/com/android/settings/accessibility/AccessibilityFooterPreferenceController.java b/src/com/android/settings/accessibility/AccessibilityFooterPreferenceController.java
index c22b11e..a422eb8 100644
--- a/src/com/android/settings/accessibility/AccessibilityFooterPreferenceController.java
+++ b/src/com/android/settings/accessibility/AccessibilityFooterPreferenceController.java
@@ -122,5 +122,8 @@
} else {
footerPreference.setLinkEnabled(false);
}
+
+ // Grouping subcomponents to make more accessible.
+ footerPreference.setSelectable(false);
}
}
diff --git a/src/com/android/settings/accessibility/AccessibilityQuickSettingsPrimarySwitchPreferenceController.java b/src/com/android/settings/accessibility/AccessibilityQuickSettingsPrimarySwitchPreferenceController.java
index 33b6deb..d272a0b 100644
--- a/src/com/android/settings/accessibility/AccessibilityQuickSettingsPrimarySwitchPreferenceController.java
+++ b/src/com/android/settings/accessibility/AccessibilityQuickSettingsPrimarySwitchPreferenceController.java
@@ -116,7 +116,7 @@
mTooltipWindow = new AccessibilityQuickSettingsTooltipWindow(mContext);
mTooltipWindow.setup(getTileTooltipContent(),
- R.drawable.accessibility_auto_added_qs_tooltips_illustration);
+ R.drawable.accessibility_auto_added_qs_tooltip_illustration);
mTooltipWindow.showAtTopCenter(mPreference.getSwitch());
AccessibilityQuickSettingUtils.optInValueToSharedPreferences(mContext, tileComponentName);
mNeedsQSTooltipReshow = false;
diff --git a/src/com/android/settings/accessibility/AccessibilityQuickSettingsTooltipWindow.java b/src/com/android/settings/accessibility/AccessibilityQuickSettingsTooltipWindow.java
index 6b6872f..bb6dba8 100644
--- a/src/com/android/settings/accessibility/AccessibilityQuickSettingsTooltipWindow.java
+++ b/src/com/android/settings/accessibility/AccessibilityQuickSettingsTooltipWindow.java
@@ -61,7 +61,7 @@
super.onInitializeAccessibilityNodeInfo(host, info);
final AccessibilityAction clickAction = new AccessibilityAction(
AccessibilityNodeInfo.ACTION_CLICK,
- mContext.getString(R.string.accessibility_quick_settings_tooltips_dismiss));
+ mContext.getString(R.string.accessibility_quick_settings_tooltip_dismiss));
info.addAction(clickAction);
}
@@ -100,7 +100,7 @@
setBackgroundDrawable(new ColorDrawable(mContext.getColor(android.R.color.transparent)));
final LayoutInflater inflater = mContext.getSystemService(LayoutInflater.class);
final View popupView =
- inflater.inflate(R.layout.accessibility_qs_tooltips, /* root= */ null);
+ inflater.inflate(R.layout.accessibility_qs_tooltip, /* root= */ null);
popupView.setFocusable(/* focusable= */ true);
popupView.setAccessibilityDelegate(mAccessibilityDelegate);
setContentView(popupView);
@@ -179,7 +179,7 @@
@VisibleForTesting
int getAvailableWindowWidth() {
final Resources res = mContext.getResources();
- final int padding = res.getDimensionPixelSize(R.dimen.accessibility_qs_tooltips_margin);
+ final int padding = res.getDimensionPixelSize(R.dimen.accessibility_qs_tooltip_margin);
final int screenWidth = res.getDisplayMetrics().widthPixels;
return screenWidth - padding * 2;
}
diff --git a/src/com/android/settings/accessibility/AccessibilityShortcutPreferenceFragment.java b/src/com/android/settings/accessibility/AccessibilityShortcutPreferenceFragment.java
index 9c54a0c..a25c4a6 100644
--- a/src/com/android/settings/accessibility/AccessibilityShortcutPreferenceFragment.java
+++ b/src/com/android/settings/accessibility/AccessibilityShortcutPreferenceFragment.java
@@ -506,8 +506,8 @@
}
final int imageResId = mNeedsQSTooltipType == QuickSettingsTooltipType.GUIDE_TO_EDIT
- ? R.drawable.accessibility_qs_tooltips_illustration
- : R.drawable.accessibility_auto_added_qs_tooltips_illustration;
+ ? R.drawable.accessibility_qs_tooltip_illustration
+ : R.drawable.accessibility_auto_added_qs_tooltip_illustration;
mTooltipWindow = new AccessibilityQuickSettingsTooltipWindow(getContext());
mTooltipWindow.setup(content, imageResId);
mTooltipWindow.showAtTopCenter(getView());
diff --git a/src/com/android/settings/accessibility/HighTextContrastPreferenceController.java b/src/com/android/settings/accessibility/HighTextContrastPreferenceController.java
index aad69b9..8c9d234 100644
--- a/src/com/android/settings/accessibility/HighTextContrastPreferenceController.java
+++ b/src/com/android/settings/accessibility/HighTextContrastPreferenceController.java
@@ -19,6 +19,9 @@
import android.content.Context;
import android.provider.Settings;
+import androidx.preference.PreferenceScreen;
+import androidx.preference.SwitchPreference;
+
import com.android.settings.R;
import com.android.settings.core.TogglePreferenceController;
@@ -27,6 +30,7 @@
*/
public class HighTextContrastPreferenceController extends TogglePreferenceController implements
TextReadingResetController.ResetStateListener {
+ private SwitchPreference mSwitchPreference;
public HighTextContrastPreferenceController(Context context, String preferenceKey) {
super(context, preferenceKey);
@@ -55,7 +59,14 @@
}
@Override
+ public void displayPreference(PreferenceScreen screen) {
+ super.displayPreference(screen);
+ mSwitchPreference = screen.findPreference(getPreferenceKey());
+ }
+
+ @Override
public void resetState() {
setChecked(false);
+ updateState(mSwitchPreference);
}
}
diff --git a/src/com/android/settings/accessibility/LaunchAccessibilityActivityPreferenceFragment.java b/src/com/android/settings/accessibility/LaunchAccessibilityActivityPreferenceFragment.java
index 036b2ea..3adef6d 100644
--- a/src/com/android/settings/accessibility/LaunchAccessibilityActivityPreferenceFragment.java
+++ b/src/com/android/settings/accessibility/LaunchAccessibilityActivityPreferenceFragment.java
@@ -141,8 +141,8 @@
}
final int titleResId = type == QuickSettingsTooltipType.GUIDE_TO_EDIT
- ? R.string.accessibility_service_qs_tooltips_content
- : R.string.accessibility_service_auto_added_qs_tooltips_content;
+ ? R.string.accessibility_service_qs_tooltip_content
+ : R.string.accessibility_service_auto_added_qs_tooltip_content;
return getString(titleResId, tileName);
}
diff --git a/src/com/android/settings/accessibility/TextReadingPreferenceFragmentForSetupWizard.java b/src/com/android/settings/accessibility/TextReadingPreferenceFragmentForSetupWizard.java
index 0ff960f..930fbe4 100644
--- a/src/com/android/settings/accessibility/TextReadingPreferenceFragmentForSetupWizard.java
+++ b/src/com/android/settings/accessibility/TextReadingPreferenceFragmentForSetupWizard.java
@@ -16,6 +16,7 @@
package com.android.settings.accessibility;
+import android.app.settings.SettingsEnums;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.view.LayoutInflater;
@@ -57,7 +58,7 @@
@Override
public int getMetricsCategory() {
- return super.getMetricsCategory();
+ return SettingsEnums.SUW_ACCESSIBILITY_TEXT_READING_OPTIONS;
}
@Override
diff --git a/src/com/android/settings/accessibility/ToggleAccessibilityServicePreferenceFragment.java b/src/com/android/settings/accessibility/ToggleAccessibilityServicePreferenceFragment.java
index 1a63f1f..e314036 100644
--- a/src/com/android/settings/accessibility/ToggleAccessibilityServicePreferenceFragment.java
+++ b/src/com/android/settings/accessibility/ToggleAccessibilityServicePreferenceFragment.java
@@ -252,8 +252,8 @@
}
final int titleResId = type == QuickSettingsTooltipType.GUIDE_TO_EDIT
- ? R.string.accessibility_service_qs_tooltips_content
- : R.string.accessibility_service_auto_added_qs_tooltips_content;
+ ? R.string.accessibility_service_qs_tooltip_content
+ : R.string.accessibility_service_auto_added_qs_tooltip_content;
return getString(titleResId, tileName);
}
diff --git a/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragment.java b/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragment.java
index 9738321..fd19376 100644
--- a/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragment.java
+++ b/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragment.java
@@ -564,13 +564,6 @@
createFooterPreference(getPreferenceScreen(), mDescription,
getString(R.string.accessibility_introduction_title, mPackageName));
}
-
- if (TextUtils.isEmpty(mHtmlDescription) && TextUtils.isEmpty(mDescription)) {
- final CharSequence defaultDescription =
- getText(R.string.accessibility_service_default_description);
- createFooterPreference(getPreferenceScreen(), defaultDescription,
- getString(R.string.accessibility_introduction_title, mPackageName));
- }
}
@@ -877,8 +870,8 @@
}
final int imageResId = mNeedsQSTooltipType == QuickSettingsTooltipType.GUIDE_TO_EDIT
- ? R.drawable.accessibility_qs_tooltips_illustration
- : R.drawable.accessibility_auto_added_qs_tooltips_illustration;
+ ? R.drawable.accessibility_qs_tooltip_illustration
+ : R.drawable.accessibility_auto_added_qs_tooltip_illustration;
mTooltipWindow = new AccessibilityQuickSettingsTooltipWindow(getContext());
mTooltipWindow.setup(content, imageResId);
mTooltipWindow.showAtTopCenter(getView());
diff --git a/src/com/android/settings/applications/appinfo/AppBatteryPreferenceController.java b/src/com/android/settings/applications/appinfo/AppBatteryPreferenceController.java
index 8d29301..3cb22e0 100644
--- a/src/com/android/settings/applications/appinfo/AppBatteryPreferenceController.java
+++ b/src/com/android/settings/applications/appinfo/AppBatteryPreferenceController.java
@@ -43,7 +43,6 @@
import com.android.settings.fuelgauge.BatteryEntry;
import com.android.settings.fuelgauge.BatteryUsageStatsLoader;
import com.android.settings.fuelgauge.BatteryUtils;
-import com.android.settings.fuelgauge.ConvertUtils;
import com.android.settings.fuelgauge.PowerUsageFeatureProvider;
import com.android.settings.overlay.FeatureFactory;
import com.android.settingslib.core.lifecycle.Lifecycle;
@@ -118,11 +117,7 @@
}
if (mBatteryDiffEntry != null) {
- Log.i(TAG, "BatteryDiffEntry not null, launch : "
- + mBatteryDiffEntry.getPackageName()
- + " | uid : "
- + mBatteryDiffEntry.mBatteryHistEntry.mUid
- + " with DiffEntry data");
+ Log.i(TAG, "handlePreferenceTreeClick():\n" + mBatteryDiffEntry);
AdvancedPowerUsageDetail.startBatteryDetailPage(
mParent.getActivity(),
mParent,
@@ -176,30 +171,11 @@
if (mPackageName == null) {
return null;
}
- final List<BatteryDiffEntry> batteryDiffEntries =
- BatteryChartPreferenceController.getBatteryLast24HrUsageData(mContext);
- if (batteryDiffEntries == null) {
- return null;
- }
- // Filter entry with consumer type to avoid system app,
- // then use user id to divide normal app and work profile app,
- // return target application from filter list by package name.
- return batteryDiffEntries.stream()
- .filter(entry -> entry.mBatteryHistEntry.mConsumerType
- == ConvertUtils.CONSUMER_TYPE_UID_BATTERY)
- .filter(entry -> entry.mBatteryHistEntry.mUserId == mUserId)
- .filter(entry -> {
- if (mPackageName.equals(entry.getPackageName())) {
- Log.i(TAG, "Return target application: "
- + entry.mBatteryHistEntry.mPackageName
- + " | uid: " + entry.mBatteryHistEntry.mUid
- + " | userId: " + entry.mBatteryHistEntry.mUserId);
- return true;
- }
- return false;
- })
- .findFirst()
- .orElse(/* other */null);
+ final BatteryDiffEntry entry =
+ BatteryChartPreferenceController.getBatteryLast24HrUsageData(
+ mContext, mPackageName, mUserId);
+ Log.d(TAG, "loadBatteryDiffEntries():\n" + entry);
+ return entry;
}
@Override
diff --git a/src/com/android/settings/applications/specialaccess/notificationaccess/ApprovalPreferenceController.java b/src/com/android/settings/applications/specialaccess/notificationaccess/ApprovalPreferenceController.java
index a43b9fd..0767e65 100644
--- a/src/com/android/settings/applications/specialaccess/notificationaccess/ApprovalPreferenceController.java
+++ b/src/com/android/settings/applications/specialaccess/notificationaccess/ApprovalPreferenceController.java
@@ -27,10 +27,10 @@
import androidx.annotation.VisibleForTesting;
import androidx.preference.Preference;
import androidx.preference.PreferenceFragmentCompat;
-import androidx.preference.SwitchPreference;
import com.android.settings.core.BasePreferenceController;
import com.android.settings.overlay.FeatureFactory;
+import com.android.settingslib.RestrictedSwitchPreference;
public class ApprovalPreferenceController extends BasePreferenceController {
@@ -78,9 +78,11 @@
@Override
public void updateState(Preference pref) {
- final SwitchPreference preference = (SwitchPreference) pref;
+ final RestrictedSwitchPreference preference =
+ (RestrictedSwitchPreference) pref;
final CharSequence label = mPkgInfo.applicationInfo.loadLabel(mPm);
- preference.setChecked(isServiceEnabled(mCn));
+ final boolean isEnabled = isServiceEnabled(mCn);
+ preference.setChecked(isEnabled);
preference.setOnPreferenceChangeListener((p, newValue) -> {
final boolean access = (Boolean) newValue;
if (!access) {
@@ -103,6 +105,7 @@
return false;
}
});
+ preference.updateState(mCn.getPackageName(), mPkgInfo.applicationInfo.uid, isEnabled);
}
public void disable(final ComponentName cn) {
diff --git a/src/com/android/settings/biometrics/combination/CombinedBiometricStatusUtils.java b/src/com/android/settings/biometrics/combination/CombinedBiometricStatusUtils.java
index f1e312a..f5ad76b 100644
--- a/src/com/android/settings/biometrics/combination/CombinedBiometricStatusUtils.java
+++ b/src/com/android/settings/biometrics/combination/CombinedBiometricStatusUtils.java
@@ -56,6 +56,13 @@
}
/**
+ * Returns whether at least one face template or fingerprint has been enrolled.
+ */
+ public boolean hasEnrolled() {
+ return hasEnrolledFingerprints() || hasEnrolledFace();
+ }
+
+ /**
* Returns the {@link EnforcedAdmin} in case parental consent is required to change both
* face and fingerprint settings.
*
@@ -84,8 +91,7 @@
public String getSummary() {
final int numFingerprintsEnrolled = mFingerprintManager != null
? mFingerprintManager.getEnrolledFingerprints(mUserId).size() : 0;
- final boolean faceEnrolled = mFaceManager != null
- && mFaceManager.hasEnrolledTemplates(mUserId);
+ final boolean faceEnrolled = hasEnrolledFace();
if (faceEnrolled && numFingerprintsEnrolled > 1) {
return mContext.getString(
@@ -105,6 +111,14 @@
}
}
+ private boolean hasEnrolledFingerprints() {
+ return mFingerprintManager != null && mFingerprintManager.hasEnrolledFingerprints(mUserId);
+ }
+
+ private boolean hasEnrolledFace() {
+ return mFaceManager != null && mFaceManager.hasEnrolledTemplates(mUserId);
+ }
+
/**
* Returns the class name of the Settings page corresponding to combined biometric settings.
*/
diff --git a/src/com/android/settings/biometrics/face/FaceStatusUtils.java b/src/com/android/settings/biometrics/face/FaceStatusUtils.java
index 4e25543..1749aca 100644
--- a/src/com/android/settings/biometrics/face/FaceStatusUtils.java
+++ b/src/com/android/settings/biometrics/face/FaceStatusUtils.java
@@ -75,7 +75,10 @@
: FaceEnrollIntroduction.class.getName();
}
- private boolean hasEnrolled() {
+ /**
+ * Returns whether at least one face template has been enrolled.
+ */
+ public boolean hasEnrolled() {
return mFaceManager.hasEnrolledTemplates(mUserId);
}
}
diff --git a/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrolling.java b/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrolling.java
index d42e8f1..70140c4 100644
--- a/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrolling.java
+++ b/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrolling.java
@@ -81,9 +81,11 @@
private static final int STAGE_CENTER = 0;
private static final int STAGE_GUIDED = 1;
private static final int STAGE_FINGERTIP = 2;
- private static final int STAGE_EDGES = 3;
+ private static final int STAGE_LEFT_EDGE = 3;
+ private static final int STAGE_RIGHT_EDGE = 4;
- @IntDef({STAGE_UNKNOWN, STAGE_CENTER, STAGE_GUIDED, STAGE_FINGERTIP, STAGE_EDGES})
+ @IntDef({STAGE_UNKNOWN, STAGE_CENTER, STAGE_GUIDED, STAGE_FINGERTIP, STAGE_LEFT_EDGE,
+ STAGE_RIGHT_EDGE})
@Retention(RetentionPolicy.SOURCE)
private @interface EnrollStage {}
@@ -132,7 +134,8 @@
private boolean mIsAccessibilityEnabled;
private LottieAnimationView mIllustrationLottie;
private boolean mHaveShownUdfpsTipLottie;
- private boolean mHaveShownUdfpsSideLottie;
+ private boolean mHaveShownUdfpsLeftEdgeLottie;
+ private boolean mHaveShownUdfpsRightEdgeLottie;
private boolean mShouldShowLottie;
private OrientationEventListener mOrientationEventListener;
@@ -372,12 +375,31 @@
}
break;
- case STAGE_EDGES:
+ case STAGE_LEFT_EDGE:
setHeaderText(R.string.security_settings_udfps_enroll_edge_title);
- if (!mHaveShownUdfpsSideLottie && mIllustrationLottie != null) {
- mHaveShownUdfpsSideLottie = true;
+ if (!mHaveShownUdfpsLeftEdgeLottie && mIllustrationLottie != null) {
+ mHaveShownUdfpsLeftEdgeLottie = true;
setDescriptionText("");
- mIllustrationLottie.setAnimation(R.raw.udfps_edge_hint_lottie);
+ mIllustrationLottie.setAnimation(R.raw.udfps_left_edge_hint_lottie);
+ mIllustrationLottie.setVisibility(View.VISIBLE);
+ mIllustrationLottie.playAnimation();
+ mIllustrationLottie.setContentDescription(
+ getString(R.string.security_settings_udfps_side_fingerprint_help));
+ } else if (mIllustrationLottie == null) {
+ if (isStageHalfCompleted()) {
+ setDescriptionText(
+ R.string.security_settings_fingerprint_enroll_repeat_message);
+ } else {
+ setDescriptionText(R.string.security_settings_udfps_enroll_edge_message);
+ }
+ }
+ break;
+ case STAGE_RIGHT_EDGE:
+ setHeaderText(R.string.security_settings_udfps_enroll_edge_title);
+ if (!mHaveShownUdfpsRightEdgeLottie && mIllustrationLottie != null) {
+ mHaveShownUdfpsRightEdgeLottie = true;
+ setDescriptionText("");
+ mIllustrationLottie.setAnimation(R.raw.udfps_right_edge_hint_lottie);
mIllustrationLottie.setVisibility(View.VISIBLE);
mIllustrationLottie.playAnimation();
mIllustrationLottie.setContentDescription(
@@ -422,8 +444,10 @@
return STAGE_GUIDED;
} else if (progressSteps < getStageThresholdSteps(2)) {
return STAGE_FINGERTIP;
+ } else if (progressSteps < getStageThresholdSteps(3)) {
+ return STAGE_LEFT_EDGE;
} else {
- return STAGE_EDGES;
+ return STAGE_RIGHT_EDGE;
}
}
diff --git a/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollFindSensor.java b/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollFindSensor.java
index 405c090..66059e7 100644
--- a/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollFindSensor.java
+++ b/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollFindSensor.java
@@ -312,9 +312,10 @@
default:
FingerprintManager fpm = Utils.getFingerprintManagerOrNull(this);
int enrolled = fpm.getEnrolledFingerprints().size();
- int max = getResources().getInteger(
- com.android.internal.R.integer.config_fingerprintMaxTemplatesPerUser);
- if (enrolled >= max) {
+ final List<FingerprintSensorPropertiesInternal> props =
+ fpm.getSensorPropertiesInternal();
+ final int maxEnrollments = props.get(0).maxEnrollmentsPerUser;
+ if (enrolled >= maxEnrollments) {
finish();
} else {
// We came back from enrolling but it wasn't completed, start again.
diff --git a/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollFinish.java b/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollFinish.java
index 80a6f05..74e844a 100644
--- a/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollFinish.java
+++ b/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollFinish.java
@@ -21,6 +21,7 @@
import android.content.Intent;
import android.content.pm.PackageManager;
import android.hardware.fingerprint.FingerprintManager;
+import android.hardware.fingerprint.FingerprintSensorPropertiesInternal;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
@@ -36,6 +37,7 @@
import com.google.android.setupcompat.template.FooterButton;
import com.google.android.setupcompat.util.WizardManagerHelper;
+import java.util.List;
/**
* Activity which concludes fingerprint enrollment.
*/
@@ -92,10 +94,11 @@
final FingerprintManager fpm = Utils.getFingerprintManagerOrNull(this);
boolean hideAddAnother = false;
if (fpm != null) {
+ final List<FingerprintSensorPropertiesInternal> props =
+ fpm.getSensorPropertiesInternal();
+ int maxEnrollments = props.get(0).maxEnrollmentsPerUser;
int enrolled = fpm.getEnrolledFingerprints(mUserId).size();
- int max = getResources().getInteger(
- com.android.internal.R.integer.config_fingerprintMaxTemplatesPerUser);
- hideAddAnother = enrolled >= max;
+ hideAddAnother = enrolled >= maxEnrollments;
}
if (hideAddAnother) {
// Don't show "Add" button if too many fingerprints already added
diff --git a/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollIntroduction.java b/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollIntroduction.java
index 2ef5446..23595fb 100644
--- a/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollIntroduction.java
+++ b/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollIntroduction.java
@@ -35,6 +35,7 @@
import androidx.annotation.Nullable;
import androidx.annotation.StringRes;
+import com.android.internal.annotations.VisibleForTesting;
import com.android.settings.R;
import com.android.settings.Utils;
import com.android.settings.biometrics.BiometricEnrollIntroduction;
@@ -55,6 +56,7 @@
private static final String TAG = "FingerprintIntro";
+ @VisibleForTesting
private FingerprintManager mFingerprintManager;
@Nullable private FooterButton mPrimaryFooterButton;
@Nullable private FooterButton mSecondaryFooterButton;
@@ -213,6 +215,8 @@
@Override
protected int checkMaxEnrolled() {
final boolean isSetupWizard = WizardManagerHelper.isAnySetupWizard(getIntent());
+ final boolean isDeferredSetupWizard =
+ WizardManagerHelper.isDeferredSetupWizard(getIntent());
if (mFingerprintManager != null) {
final List<FingerprintSensorPropertiesInternal> props =
mFingerprintManager.getSensorPropertiesInternal();
@@ -220,9 +224,11 @@
final int max = props.get(0).maxEnrollmentsPerUser;
final int numEnrolledFingerprints =
mFingerprintManager.getEnrolledFingerprints(mUserId).size();
- final int maxFingerprintsEnrollableIfSUW = getApplicationContext().getResources()
- .getInteger(R.integer.suw_max_fingerprints_enrollable);
- if (isSetupWizard) {
+ final int maxFingerprintsEnrollableIfSUW =
+ getApplicationContext()
+ .getResources()
+ .getInteger(R.integer.suw_max_fingerprints_enrollable);
+ if (isSetupWizard && !isDeferredSetupWizard) {
if (numEnrolledFingerprints >= maxFingerprintsEnrollableIfSUW) {
return R.string.fingerprint_intro_error_max;
} else {
diff --git a/src/com/android/settings/biometrics/fingerprint/FingerprintSettings.java b/src/com/android/settings/biometrics/fingerprint/FingerprintSettings.java
index abc6d53..a5832ea 100644
--- a/src/com/android/settings/biometrics/fingerprint/FingerprintSettings.java
+++ b/src/com/android/settings/biometrics/fingerprint/FingerprintSettings.java
@@ -457,8 +457,10 @@
final Preference addPreference = findPreference(KEY_FINGERPRINT_ADD);
/* Disable preference if too many fingerprints added */
- final int max = getContext().getResources().getInteger(
- com.android.internal.R.integer.config_fingerprintMaxTemplatesPerUser);
+ final List<FingerprintSensorPropertiesInternal> props =
+ mFingerprintManager.getSensorPropertiesInternal();
+ // This will need to be updated for devices with multiple fingerprint sensors
+ final int max = props.get(0).maxEnrollmentsPerUser;
boolean tooMany = mFingerprintManager.getEnrolledFingerprints(mUserId).size() >= max;
// retryFingerprint() will be called when remove finishes
// need to disable enroll or have a way to determine if enroll is in progress
diff --git a/src/com/android/settings/biometrics/fingerprint/FingerprintStatusUtils.java b/src/com/android/settings/biometrics/fingerprint/FingerprintStatusUtils.java
index d23195d..5707f32 100644
--- a/src/com/android/settings/biometrics/fingerprint/FingerprintStatusUtils.java
+++ b/src/com/android/settings/biometrics/fingerprint/FingerprintStatusUtils.java
@@ -82,7 +82,10 @@
: FingerprintEnrollIntroduction.class.getName();
}
- private boolean hasEnrolled() {
+ /**
+ * Returns whether at least one fingerprint has been enrolled.
+ */
+ public boolean hasEnrolled() {
return mFingerprintManager.hasEnrolledFingerprints(mUserId);
}
}
diff --git a/src/com/android/settings/development/BluetoothA2dpHwOffloadPreferenceController.java b/src/com/android/settings/development/BluetoothA2dpHwOffloadPreferenceController.java
index 95e663b..2ffa11b 100644
--- a/src/com/android/settings/development/BluetoothA2dpHwOffloadPreferenceController.java
+++ b/src/com/android/settings/development/BluetoothA2dpHwOffloadPreferenceController.java
@@ -16,9 +16,12 @@
package com.android.settings.development;
+import static com.android.settings.development.BluetoothLeAudioHwOffloadPreferenceController.LE_AUDIO_OFFLOAD_DISABLED_PROPERTY;
+
import android.content.Context;
import android.os.SystemProperties;
+import androidx.annotation.VisibleForTesting;
import androidx.preference.Preference;
import androidx.preference.SwitchPreference;
@@ -34,6 +37,9 @@
static final String A2DP_OFFLOAD_DISABLED_PROPERTY = "persist.bluetooth.a2dp_offload.disabled";
static final String A2DP_OFFLOAD_SUPPORTED_PROPERTY = "ro.bluetooth.a2dp_offload.supported";
+ @VisibleForTesting
+ boolean mChanged = false;
+
public BluetoothA2dpHwOffloadPreferenceController(Context context,
DevelopmentSettingsDashboardFragment fragment) {
super(context);
@@ -47,7 +53,8 @@
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
- BluetoothA2dpHwOffloadRebootDialog.show(mFragment, this);
+ BluetoothHwOffloadRebootDialog.show(mFragment);
+ mChanged = true;
return false;
}
@@ -85,10 +92,26 @@
return offloadSupported ? !offloadDisabled : true;
}
- public void onA2dpHwDialogConfirmed() {
+ /**
+ * Called when the HwOffloadDialog confirm is clicked.
+ */
+ public void onHwOffloadDialogConfirmed() {
+ if (!mChanged) {
+ return;
+ }
final boolean offloadDisabled =
SystemProperties.getBoolean(A2DP_OFFLOAD_DISABLED_PROPERTY, false);
SystemProperties.set(A2DP_OFFLOAD_DISABLED_PROPERTY, Boolean.toString(!offloadDisabled));
+ if (offloadDisabled) {
+ SystemProperties.set(LE_AUDIO_OFFLOAD_DISABLED_PROPERTY,
+ Boolean.toString(!offloadDisabled));
+ }
}
+ /**
+ * Called when the HwOffloadDialog cancel is clicked.
+ */
+ public void onHwOffloadDialogCanceled() {
+ mChanged = false;
+ }
}
diff --git a/src/com/android/settings/development/BluetoothGabeldorschePreferenceController.java b/src/com/android/settings/development/BluetoothGabeldorschePreferenceController.java
deleted file mode 100644
index f5c30f5..0000000
--- a/src/com/android/settings/development/BluetoothGabeldorschePreferenceController.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Copyright (C) 2017 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.development;
-
-import android.content.Context;
-import android.provider.DeviceConfig;
-
-import androidx.annotation.VisibleForTesting;
-import androidx.preference.Preference;
-import androidx.preference.SwitchPreference;
-
-import com.android.settings.core.PreferenceControllerMixin;
-import com.android.settingslib.development.DeveloperOptionsPreferenceController;
-
-/**
- * Preference controller for Bluetooth Gabeldorche feature
- */
-public class BluetoothGabeldorschePreferenceController extends
- DeveloperOptionsPreferenceController implements Preference.OnPreferenceChangeListener,
- PreferenceControllerMixin {
-
- private static final String BLUETOOTH_GABELDORSCHE_KEY =
- "bluetooth_gabeldorsche_enable";
-
- @VisibleForTesting
- static final String CURRENT_GD_FLAG = "INIT_gd_scanning";
-
- public BluetoothGabeldorschePreferenceController(Context context) {
- super(context);
- }
-
- @Override
- public String getPreferenceKey() {
- return BLUETOOTH_GABELDORSCHE_KEY;
- }
-
- @Override
- public boolean onPreferenceChange(Preference preference, Object newValue) {
- final boolean isEnabled = (Boolean) newValue;
- DeviceConfig.setProperty(DeviceConfig.NAMESPACE_BLUETOOTH,
- CURRENT_GD_FLAG, isEnabled ? "true" : "false", false /* makeDefault */);
- return true;
- }
-
- @Override
- public void updateState(Preference preference) {
- final boolean isEnabled = DeviceConfig.getBoolean(
- DeviceConfig.NAMESPACE_BLUETOOTH, CURRENT_GD_FLAG, false /* default */);
- ((SwitchPreference) mPreference).setChecked(isEnabled);
- }
-
- @Override
- protected void onDeveloperOptionsSwitchDisabled() {
- super.onDeveloperOptionsSwitchDisabled();
- DeviceConfig.setProperty(DeviceConfig.NAMESPACE_BLUETOOTH,
- CURRENT_GD_FLAG, null, false /* makeDefault */);
- ((SwitchPreference) mPreference).setChecked(false);
- }
-}
diff --git a/src/com/android/settings/development/BluetoothA2dpHwOffloadRebootDialog.java b/src/com/android/settings/development/BluetoothHwOffloadRebootDialog.java
similarity index 60%
rename from src/com/android/settings/development/BluetoothA2dpHwOffloadRebootDialog.java
rename to src/com/android/settings/development/BluetoothHwOffloadRebootDialog.java
index 95ef019..389103e 100644
--- a/src/com/android/settings/development/BluetoothA2dpHwOffloadRebootDialog.java
+++ b/src/com/android/settings/development/BluetoothHwOffloadRebootDialog.java
@@ -28,17 +28,23 @@
import com.android.settings.R;
import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
-public class BluetoothA2dpHwOffloadRebootDialog extends InstrumentedDialogFragment
+/**
+ * The a2dp and LE audio offload switch should reboot the device to take effect, the dialog is
+ * to ask the user to reboot the device after a2dp or LE audio offload user preference changed
+ */
+public class BluetoothHwOffloadRebootDialog extends InstrumentedDialogFragment
implements DialogInterface.OnClickListener {
- public static final String TAG = "BluetoothA2dpHwOffloadReboot";
+ public static final String TAG = "BluetoothHwOffloadReboot";
- public static void show(DevelopmentSettingsDashboardFragment host,
- BluetoothA2dpHwOffloadPreferenceController controller) {
+ /**
+ * The function to show the HwOffloadReboot Dialog.
+ */
+ public static void show(DevelopmentSettingsDashboardFragment host) {
final FragmentManager manager = host.getActivity().getSupportFragmentManager();
if (manager.findFragmentByTag(TAG) == null) {
- final BluetoothA2dpHwOffloadRebootDialog dialog =
- new BluetoothA2dpHwOffloadRebootDialog();
+ final BluetoothHwOffloadRebootDialog dialog =
+ new BluetoothHwOffloadRebootDialog();
dialog.setTargetFragment(host, 0 /* requestCode */);
dialog.show(manager, TAG);
}
@@ -52,33 +58,44 @@
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
return new AlertDialog.Builder(getActivity())
- .setMessage(R.string.bluetooth_disable_a2dp_hw_offload_dialog_message)
- .setTitle(R.string.bluetooth_disable_a2dp_hw_offload_dialog_title)
+ .setMessage(R.string.bluetooth_disable_hw_offload_dialog_message)
+ .setTitle(R.string.bluetooth_disable_hw_offload_dialog_title)
.setPositiveButton(
- R.string.bluetooth_disable_a2dp_hw_offload_dialog_confirm, this)
+ R.string.bluetooth_disable_hw_offload_dialog_confirm, this)
.setNegativeButton(
- R.string.bluetooth_disable_a2dp_hw_offload_dialog_cancel, this)
+ R.string.bluetooth_disable_hw_offload_dialog_cancel, this)
.create();
}
@Override
public void onClick(DialogInterface dialog, int which) {
- final OnA2dpHwDialogConfirmedListener host =
- (OnA2dpHwDialogConfirmedListener) getTargetFragment();
+ final OnHwOffloadDialogListener host =
+ (OnHwOffloadDialogListener) getTargetFragment();
if (host == null) {
return;
}
if (which == DialogInterface.BUTTON_POSITIVE) {
- host.onA2dpHwDialogConfirmed();
+ host.onHwOffloadDialogConfirmed();
PowerManager pm = getContext().getSystemService(PowerManager.class);
pm.reboot(null);
+ } else {
+ host.onHwOffloadDialogCanceled();
}
}
- public interface OnA2dpHwDialogConfirmedListener {
+ /**
+ * The interface for the HsOffloadDialogListener to provide the action as the
+ * confirmed or canceled clicked.
+ */
+ public interface OnHwOffloadDialogListener {
/**
* Called when the user presses reboot on the warning dialog.
*/
- void onA2dpHwDialogConfirmed();
+ void onHwOffloadDialogConfirmed();
+
+ /**
+ * Called when the user presses cancel on the warning dialog.
+ */
+ void onHwOffloadDialogCanceled();
}
}
diff --git a/src/com/android/settings/development/BluetoothLeAudioHwOffloadPreferenceController.java b/src/com/android/settings/development/BluetoothLeAudioHwOffloadPreferenceController.java
new file mode 100644
index 0000000..911b62d
--- /dev/null
+++ b/src/com/android/settings/development/BluetoothLeAudioHwOffloadPreferenceController.java
@@ -0,0 +1,127 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.development;
+
+import static com.android.settings.development.BluetoothA2dpHwOffloadPreferenceController.A2DP_OFFLOAD_SUPPORTED_PROPERTY;
+
+import android.content.Context;
+import android.os.SystemProperties;
+
+import androidx.annotation.VisibleForTesting;
+import androidx.preference.Preference;
+import androidx.preference.SwitchPreference;
+
+import com.android.settings.core.PreferenceControllerMixin;
+import com.android.settingslib.development.DeveloperOptionsPreferenceController;
+
+/**
+ * Preference controller to control Bluetooth LE audio offload
+ */
+public class BluetoothLeAudioHwOffloadPreferenceController
+ extends DeveloperOptionsPreferenceController
+ implements Preference.OnPreferenceChangeListener, PreferenceControllerMixin {
+
+ private static final String PREFERENCE_KEY = "bluetooth_disable_le_audio_hw_offload";
+ private final DevelopmentSettingsDashboardFragment mFragment;
+
+ static final String LE_AUDIO_OFFLOAD_DISABLED_PROPERTY =
+ "persist.bluetooth.leaudio_offload.disabled";
+ static final String LE_AUDIO_OFFLOAD_SUPPORTED_PROPERTY =
+ "ro.bluetooth.leaudio_offload.supported";
+
+ @VisibleForTesting
+ boolean mChanged = false;
+
+ public BluetoothLeAudioHwOffloadPreferenceController(Context context,
+ DevelopmentSettingsDashboardFragment fragment) {
+ super(context);
+ mFragment = fragment;
+ }
+
+ @Override
+ public String getPreferenceKey() {
+ return PREFERENCE_KEY;
+ }
+
+ @Override
+ public boolean onPreferenceChange(Preference preference, Object newValue) {
+ BluetoothHwOffloadRebootDialog.show(mFragment);
+ mChanged = true;
+ return false;
+ }
+
+ @Override
+ public void updateState(Preference preference) {
+ final boolean offloadSupported =
+ SystemProperties.getBoolean(A2DP_OFFLOAD_SUPPORTED_PROPERTY, false)
+ && SystemProperties.getBoolean(LE_AUDIO_OFFLOAD_SUPPORTED_PROPERTY, false);
+ if (offloadSupported) {
+ final boolean offloadDisabled =
+ SystemProperties.getBoolean(LE_AUDIO_OFFLOAD_DISABLED_PROPERTY, true);
+ ((SwitchPreference) mPreference).setChecked(offloadDisabled);
+ } else {
+ mPreference.setEnabled(false);
+ ((SwitchPreference) mPreference).setChecked(true);
+ }
+ }
+
+ @Override
+ protected void onDeveloperOptionsSwitchDisabled() {
+ super.onDeveloperOptionsSwitchDisabled();
+ final boolean offloadSupported =
+ SystemProperties.getBoolean(A2DP_OFFLOAD_SUPPORTED_PROPERTY, false)
+ && SystemProperties.getBoolean(LE_AUDIO_OFFLOAD_SUPPORTED_PROPERTY, false);
+ if (offloadSupported) {
+ ((SwitchPreference) mPreference).setChecked(true);
+ SystemProperties.set(LE_AUDIO_OFFLOAD_DISABLED_PROPERTY, "true");
+ }
+ }
+
+ /**
+ * Check if the le audio offload setting is default value.
+ */
+ public boolean isDefaultValue() {
+ final boolean offloadSupported =
+ SystemProperties.getBoolean(A2DP_OFFLOAD_SUPPORTED_PROPERTY, false)
+ && SystemProperties.getBoolean(LE_AUDIO_OFFLOAD_SUPPORTED_PROPERTY, false);
+ final boolean offloadDisabled =
+ SystemProperties.getBoolean(LE_AUDIO_OFFLOAD_DISABLED_PROPERTY, false);
+ return offloadSupported ? offloadDisabled : true;
+ }
+
+ /**
+ * Called when the HwOffloadDialog confirm is clicked.
+ */
+ public void onHwOffloadDialogConfirmed() {
+ if (!mChanged) {
+ return;
+ }
+
+ final boolean offloadDisabled =
+ SystemProperties.getBoolean(LE_AUDIO_OFFLOAD_DISABLED_PROPERTY,
+ false);
+ SystemProperties.set(LE_AUDIO_OFFLOAD_DISABLED_PROPERTY,
+ Boolean.toString(!offloadDisabled));
+ }
+
+ /**
+ * Called when the HwOffloadDialog cancel is clicked.
+ */
+ public void onHwOffloadDialogCanceled() {
+ mChanged = false;
+ }
+}
diff --git a/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java b/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java
index 57114e2..636404e 100644
--- a/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java
+++ b/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java
@@ -80,7 +80,7 @@
public class DevelopmentSettingsDashboardFragment extends RestrictedDashboardFragment
implements OnMainSwitchChangeListener, OemUnlockDialogHost, AdbDialogHost,
AdbClearKeysDialogHost, LogPersistDialogHost,
- BluetoothA2dpHwOffloadRebootDialog.OnA2dpHwDialogConfirmedListener,
+ BluetoothHwOffloadRebootDialog.OnHwOffloadDialogListener,
AbstractBluetoothPreferenceController.Callback {
private static final String TAG = "DevSettingsDashboard";
@@ -293,12 +293,16 @@
if (isChecked) {
EnableDevelopmentSettingWarningDialog.show(this /* host */);
} else {
- final BluetoothA2dpHwOffloadPreferenceController controller =
+ final BluetoothA2dpHwOffloadPreferenceController a2dpController =
getDevelopmentOptionsController(
BluetoothA2dpHwOffloadPreferenceController.class);
- // If A2DP hardware offload isn't default value, we must reboot after disable
+ final BluetoothLeAudioHwOffloadPreferenceController leAudioController =
+ getDevelopmentOptionsController(
+ BluetoothLeAudioHwOffloadPreferenceController.class);
+ // If hardware offload isn't default value, we must reboot after disable
// developer options. Show a dialog for the user to confirm.
- if (controller == null || controller.isDefaultValue()) {
+ if ((a2dpController == null || a2dpController.isDefaultValue())
+ && (leAudioController == null || leAudioController.isDefaultValue())) {
disableDeveloperOptions();
} else {
DisableDevSettingsDialogFragment.show(this /* host */);
@@ -358,10 +362,27 @@
}
@Override
- public void onA2dpHwDialogConfirmed() {
- final BluetoothA2dpHwOffloadPreferenceController controller =
+ public void onHwOffloadDialogConfirmed() {
+ final BluetoothA2dpHwOffloadPreferenceController a2dpController =
getDevelopmentOptionsController(BluetoothA2dpHwOffloadPreferenceController.class);
- controller.onA2dpHwDialogConfirmed();
+ a2dpController.onHwOffloadDialogConfirmed();
+
+ final BluetoothLeAudioHwOffloadPreferenceController leAudioController =
+ getDevelopmentOptionsController(
+ BluetoothLeAudioHwOffloadPreferenceController.class);
+ leAudioController.onHwOffloadDialogConfirmed();
+ }
+
+ @Override
+ public void onHwOffloadDialogCanceled() {
+ final BluetoothA2dpHwOffloadPreferenceController a2dpController =
+ getDevelopmentOptionsController(BluetoothA2dpHwOffloadPreferenceController.class);
+ a2dpController.onHwOffloadDialogCanceled();
+
+ final BluetoothLeAudioHwOffloadPreferenceController leAudioController =
+ getDevelopmentOptionsController(
+ BluetoothLeAudioHwOffloadPreferenceController.class);
+ leAudioController.onHwOffloadDialogCanceled();
}
@Override
@@ -517,10 +538,10 @@
controllers.add(new TetheringHardwareAccelPreferenceController(context));
controllers.add(new BluetoothDeviceNoNamePreferenceController(context));
controllers.add(new BluetoothAbsoluteVolumePreferenceController(context));
- controllers.add(new BluetoothGabeldorschePreferenceController(context));
controllers.add(new BluetoothAvrcpVersionPreferenceController(context));
controllers.add(new BluetoothMapVersionPreferenceController(context));
controllers.add(new BluetoothA2dpHwOffloadPreferenceController(context, fragment));
+ controllers.add(new BluetoothLeAudioHwOffloadPreferenceController(context, fragment));
controllers.add(new BluetoothMaxConnectedAudioDevicesPreferenceController(context));
controllers.add(new NfcStackDebugLogPreferenceController(context));
controllers.add(new ShowTapsPreferenceController(context));
@@ -585,6 +606,7 @@
controllers.add(new SharedDataPreferenceController(context));
controllers.add(new OverlaySettingsPreferenceController(context));
controllers.add(new StylusHandwritingPreferenceController(context));
+ controllers.add(new IngressRateLimitPreferenceController((context)));
return controllers;
}
diff --git a/src/com/android/settings/development/DisableDevSettingsDialogFragment.java b/src/com/android/settings/development/DisableDevSettingsDialogFragment.java
index 803030e..5db2ed4 100644
--- a/src/com/android/settings/development/DisableDevSettingsDialogFragment.java
+++ b/src/com/android/settings/development/DisableDevSettingsDialogFragment.java
@@ -56,15 +56,15 @@
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
- // Reuse the same text of disable_a2dp_hw_offload_dialog.
+ // Reuse the same text of disable_hw_offload_dialog.
// The text is generic enough to be used for turning off Dev options.
return new AlertDialog.Builder(getActivity())
- .setMessage(R.string.bluetooth_disable_a2dp_hw_offload_dialog_message)
- .setTitle(R.string.bluetooth_disable_a2dp_hw_offload_dialog_title)
+ .setMessage(R.string.bluetooth_disable_hw_offload_dialog_message)
+ .setTitle(R.string.bluetooth_disable_hw_offload_dialog_title)
.setPositiveButton(
- R.string.bluetooth_disable_a2dp_hw_offload_dialog_confirm, this)
+ R.string.bluetooth_disable_hw_offload_dialog_confirm, this)
.setNegativeButton(
- R.string.bluetooth_disable_a2dp_hw_offload_dialog_cancel, this)
+ R.string.bluetooth_disable_hw_offload_dialog_cancel, this)
.create();
}
diff --git a/src/com/android/settings/development/IngressRateLimitPreferenceController.java b/src/com/android/settings/development/IngressRateLimitPreferenceController.java
new file mode 100644
index 0000000..2e84aba
--- /dev/null
+++ b/src/com/android/settings/development/IngressRateLimitPreferenceController.java
@@ -0,0 +1,82 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.development;
+
+import android.content.Context;
+import android.net.ConnectivitySettingsManager;
+import android.util.Log;
+
+import androidx.preference.ListPreference;
+import androidx.preference.Preference;
+
+import com.android.settings.core.PreferenceControllerMixin;
+import com.android.settingslib.development.DeveloperOptionsPreferenceController;
+
+/**
+ * Controller for ingress rate limit developer setting.
+ */
+public class IngressRateLimitPreferenceController extends DeveloperOptionsPreferenceController
+ implements Preference.OnPreferenceChangeListener, PreferenceControllerMixin {
+ private static final String TAG = "IngressRateLimitPreferenceController";
+ private static final String INGRESS_RATE_LIMIT_KEY = "ingress_rate_limit";
+ private static final int RATE_LIMIT_DISABLED = -1;
+
+ public IngressRateLimitPreferenceController(Context context) {
+ super(context);
+ }
+
+ @Override
+ public String getPreferenceKey() {
+ return INGRESS_RATE_LIMIT_KEY;
+ }
+
+ @Override
+ public boolean onPreferenceChange(Preference preference, Object newValue) {
+ final long value = Long.parseLong(newValue.toString());
+ try {
+ ConnectivitySettingsManager.setIngressRateLimitInBytesPerSecond(mContext, value);
+ return true;
+ } catch (IllegalArgumentException e) {
+ Log.e(TAG, "invalid rate limit", e);
+ return false;
+ }
+ }
+
+ @Override
+ public void updateState(Preference preference) {
+ final String ingressRateLimit = String.valueOf(
+ ConnectivitySettingsManager.getIngressRateLimitInBytesPerSecond(mContext));
+
+ // verify ingressRateLimit is valid / present in ListPreference; else do nothing.
+ final CharSequence[] entryValues = ((ListPreference) preference).getEntryValues();
+ for (int i = 0; i < entryValues.length; i++) {
+ if (ingressRateLimit.contentEquals(entryValues[i])) {
+ ((ListPreference) preference).setValue(ingressRateLimit);
+ return;
+ }
+ }
+ }
+
+ @Override
+ protected void onDeveloperOptionsSwitchDisabled() {
+ super.onDeveloperOptionsSwitchDisabled();
+ // disable rate limiting when developer options are disabled
+ ConnectivitySettingsManager.setIngressRateLimitInBytesPerSecond(mContext,
+ RATE_LIMIT_DISABLED);
+ ((ListPreference) mPreference).setValue(String.valueOf(RATE_LIMIT_DISABLED));
+ }
+}
diff --git a/src/com/android/settings/development/compat/PlatformCompatDashboard.java b/src/com/android/settings/development/compat/PlatformCompatDashboard.java
index c617e17..f8cbf21 100644
--- a/src/com/android/settings/development/compat/PlatformCompatDashboard.java
+++ b/src/com/android/settings/development/compat/PlatformCompatDashboard.java
@@ -31,6 +31,7 @@
import android.os.Bundle;
import android.os.RemoteException;
import android.os.ServiceManager;
+import android.text.TextUtils;
import android.util.ArraySet;
import androidx.annotation.VisibleForTesting;
@@ -66,6 +67,8 @@
private AndroidBuildClassifier mAndroidBuildClassifier = new AndroidBuildClassifier();
+ private boolean mShouldStartAppPickerOnResume = true;
+
@VisibleForTesting
String mSelectedApp;
@@ -98,13 +101,67 @@
}
@Override
- public void onActivityCreated(Bundle savedInstanceState) {
- super.onActivityCreated(savedInstanceState);
+ public void onCreate(Bundle icicle) {
+ super.onCreate(icicle);
try {
mChanges = getPlatformCompat().listUIChanges();
} catch (RemoteException e) {
throw new RuntimeException("Could not list changes!", e);
}
+ if (icicle != null) {
+ mShouldStartAppPickerOnResume = false;
+ mSelectedApp = icicle.getString(COMPAT_APP);
+ }
+ }
+
+ @Override
+ public void onActivityResult(int requestCode, int resultCode, Intent data) {
+ if (requestCode == REQUEST_COMPAT_CHANGE_APP) {
+ mShouldStartAppPickerOnResume = false;
+ switch (resultCode) {
+ case Activity.RESULT_OK:
+ mSelectedApp = data.getAction();
+ break;
+ case Activity.RESULT_CANCELED:
+ if (TextUtils.isEmpty(mSelectedApp)) {
+ finish();
+ }
+ break;
+ case AppPicker.RESULT_NO_MATCHING_APPS:
+ mSelectedApp = null;
+ break;
+ }
+ return;
+ }
+ super.onActivityResult(requestCode, resultCode, data);
+ }
+
+ @Override
+ public void onResume() {
+ super.onResume();
+ if (isFinishingOrDestroyed()) {
+ return;
+ }
+ if (!mShouldStartAppPickerOnResume) {
+ if (TextUtils.isEmpty(mSelectedApp)) {
+ new AlertDialog.Builder(getContext())
+ .setTitle(R.string.platform_compat_dialog_title_no_apps)
+ .setMessage(R.string.platform_compat_dialog_text_no_apps)
+ .setPositiveButton(R.string.okay, (dialog, which) -> finish())
+ .setOnDismissListener(dialog -> finish())
+ .setCancelable(false)
+ .show();
+ return;
+ }
+ try {
+ final ApplicationInfo applicationInfo = getApplicationInfo();
+ addPreferences(applicationInfo);
+ return;
+ } catch (PackageManager.NameNotFoundException e) {
+ mShouldStartAppPickerOnResume = true;
+ mSelectedApp = null;
+ }
+ }
startAppPicker();
}
@@ -114,31 +171,6 @@
outState.putString(COMPAT_APP, mSelectedApp);
}
- @Override
- public void onActivityResult(int requestCode, int resultCode, Intent data) {
- if (requestCode == REQUEST_COMPAT_CHANGE_APP) {
- if (resultCode == Activity.RESULT_OK) {
- mSelectedApp = data.getAction();
- try {
- final ApplicationInfo applicationInfo = getApplicationInfo();
- addPreferences(applicationInfo);
- } catch (PackageManager.NameNotFoundException e) {
- startAppPicker();
- }
- } else if (resultCode == AppPicker.RESULT_NO_MATCHING_APPS) {
- new AlertDialog.Builder(getContext())
- .setTitle(R.string.platform_compat_dialog_title_no_apps)
- .setMessage(R.string.platform_compat_dialog_text_no_apps)
- .setPositiveButton(R.string.okay, (dialog, which) -> finish())
- .setOnDismissListener(dialog -> finish())
- .setCancelable(false)
- .show();
- }
- return;
- }
- super.onActivityResult(requestCode, resultCode, data);
- }
-
private void addPreferences(ApplicationInfo applicationInfo) {
getPreferenceScreen().removeAll();
getPreferenceScreen().addPreference(createAppPreference(applicationInfo));
diff --git a/src/com/android/settings/deviceinfo/StorageItemPreference.java b/src/com/android/settings/deviceinfo/StorageItemPreference.java
index d3549d4..91102a0 100644
--- a/src/com/android/settings/deviceinfo/StorageItemPreference.java
+++ b/src/com/android/settings/deviceinfo/StorageItemPreference.java
@@ -16,6 +16,8 @@
package com.android.settings.deviceinfo;
+import android.animation.TypeEvaluator;
+import android.animation.ValueAnimator;
import android.content.Context;
import android.util.AttributeSet;
import android.widget.ProgressBar;
@@ -30,6 +32,7 @@
public int userHandle;
private static final int UNINITIALIZED = -1;
+ private static final int ANIMATE_DURATION_IN_MILLIS = 1000;
private ProgressBar mProgressBar;
private static final int PROGRESS_MAX = 100;
@@ -46,15 +49,33 @@
}
public void setStorageSize(long size, long total) {
- mStorageSize = size;
- setSummary(StorageUtils.getStorageSizeLabel(getContext(), size));
+ setStorageSize(size, total, false /* animate */);
+ }
- if (total == 0) {
- mProgressPercent = 0;
+ /**
+ * Set the storage size info with/without animation
+ */
+ public void setStorageSize(long size, long total, boolean animate) {
+ if (animate) {
+ TypeEvaluator<Long> longEvaluator =
+ (fraction, startValue, endValue) -> {
+ // Directly returns end value if fraction is 1.0 and the end value is 0.
+ if (fraction >= 1.0f && endValue == 0) {
+ return endValue;
+ }
+ return startValue + (long) (fraction * (endValue - startValue));
+ };
+ ValueAnimator valueAnimator = ValueAnimator.ofObject(longEvaluator, mStorageSize, size);
+ valueAnimator.setDuration(ANIMATE_DURATION_IN_MILLIS);
+ valueAnimator.addUpdateListener(
+ animation -> {
+ updateProgressBarAndSizeInfo((long) animation.getAnimatedValue(), total);
+ });
+ valueAnimator.start();
} else {
- mProgressPercent = (int)(size * PROGRESS_MAX / total);
+ updateProgressBarAndSizeInfo(size, total);
}
- updateProgressBar();
+ mStorageSize = size;
}
public long getStorageSize() {
@@ -62,11 +83,18 @@
}
protected void updateProgressBar() {
- if (mProgressBar == null || mProgressPercent == UNINITIALIZED)
+ if (mProgressBar == null || mProgressPercent == UNINITIALIZED) {
return;
+ }
mProgressBar.setMax(PROGRESS_MAX);
- mProgressBar.setProgress(mProgressPercent, true /* animate */);
+ mProgressBar.setProgress(mProgressPercent);
+ }
+
+ private void updateProgressBarAndSizeInfo(long size, long total) {
+ setSummary(StorageUtils.getStorageSizeLabel(getContext(), size));
+ mProgressPercent = total == 0 ? 0 : (int) (size * PROGRESS_MAX / total);
+ updateProgressBar();
}
@Override
diff --git a/src/com/android/settings/deviceinfo/storage/StorageItemPreferenceController.java b/src/com/android/settings/deviceinfo/storage/StorageItemPreferenceController.java
index 9813439..7e27414 100644
--- a/src/com/android/settings/deviceinfo/storage/StorageItemPreferenceController.java
+++ b/src/com/android/settings/deviceinfo/storage/StorageItemPreferenceController.java
@@ -378,18 +378,22 @@
*/
public void onLoadFinished(@Nullable SparseArray<StorageAsyncLoader.StorageResult> result,
int userId) {
+ // Enable animation when the storage size info is from StorageAsyncLoader whereas disable
+ // animation when the cached storage size info is used instead.
+ boolean animate = result != null && mIsPreferenceOrderedBySize;
// Calculate the size info for each category
StorageCacheHelper.StorageCache storageCache = getSizeInfo(result, userId);
// Set size info to each preference
- mImagesPreference.setStorageSize(storageCache.imagesSize, mTotalSize);
- mVideosPreference.setStorageSize(storageCache.videosSize, mTotalSize);
- mAudioPreference.setStorageSize(storageCache.audioSize, mTotalSize);
- mAppsPreference.setStorageSize(storageCache.allAppsExceptGamesSize, mTotalSize);
- mGamesPreference.setStorageSize(storageCache.gamesSize, mTotalSize);
- mDocumentsAndOtherPreference.setStorageSize(storageCache.documentsAndOtherSize, mTotalSize);
- mTrashPreference.setStorageSize(storageCache.trashSize, mTotalSize);
+ mImagesPreference.setStorageSize(storageCache.imagesSize, mTotalSize, animate);
+ mVideosPreference.setStorageSize(storageCache.videosSize, mTotalSize, animate);
+ mAudioPreference.setStorageSize(storageCache.audioSize, mTotalSize, animate);
+ mAppsPreference.setStorageSize(storageCache.allAppsExceptGamesSize, mTotalSize, animate);
+ mGamesPreference.setStorageSize(storageCache.gamesSize, mTotalSize, animate);
+ mDocumentsAndOtherPreference.setStorageSize(storageCache.documentsAndOtherSize, mTotalSize,
+ animate);
+ mTrashPreference.setStorageSize(storageCache.trashSize, mTotalSize, animate);
if (mSystemPreference != null) {
- mSystemPreference.setStorageSize(storageCache.systemSize, mTotalSize);
+ mSystemPreference.setStorageSize(storageCache.systemSize, mTotalSize, animate);
}
// Cache the size info
if (result != null) {
@@ -519,7 +523,7 @@
if (mTrashPreference == null) {
return;
}
- mTrashPreference.setStorageSize(0, mTotalSize);
+ mTrashPreference.setStorageSize(0, mTotalSize, true /* animate */);
updatePrivateStorageCategoryPreferencesOrder();
}
diff --git a/src/com/android/settings/fuelgauge/BatteryChartPreferenceController.java b/src/com/android/settings/fuelgauge/BatteryChartPreferenceController.java
index 90a86f1..249ee49 100644
--- a/src/com/android/settings/fuelgauge/BatteryChartPreferenceController.java
+++ b/src/com/android/settings/fuelgauge/BatteryChartPreferenceController.java
@@ -617,6 +617,7 @@
return true;
}
+ /** Used for {@link AppBatteryPreferenceController}. */
public static List<BatteryDiffEntry> getBatteryLast24HrUsageData(Context context) {
final long start = System.currentTimeMillis();
final Map<Long, Map<String, BatteryHistEntry>> batteryHistoryMap =
@@ -638,6 +639,28 @@
return batteryIndexedMap.get(BatteryChartView.SELECTED_INDEX_ALL);
}
+ /** Used for {@link AppBatteryPreferenceController}. */
+ public static BatteryDiffEntry getBatteryLast24HrUsageData(
+ Context context, String packageName, int userId) {
+ if (packageName == null) {
+ return null;
+ }
+ final List<BatteryDiffEntry> entries = getBatteryLast24HrUsageData(context);
+ if (entries == null) {
+ return null;
+ }
+ for (BatteryDiffEntry entry : entries) {
+ final BatteryHistEntry batteryHistEntry = entry.mBatteryHistEntry;
+ if (batteryHistEntry != null
+ && batteryHistEntry.mConsumerType == ConvertUtils.CONSUMER_TYPE_UID_BATTERY
+ && batteryHistEntry.mUserId == userId
+ && packageName.equals(entry.getPackageName())) {
+ return entry;
+ }
+ }
+ return null;
+ }
+
private static long[] getBatteryHistoryKeys(
final Map<Long, Map<String, BatteryHistEntry>> batteryHistoryMap) {
final List<Long> batteryHistoryKeyList =
diff --git a/src/com/android/settings/fuelgauge/BatteryDiffEntry.java b/src/com/android/settings/fuelgauge/BatteryDiffEntry.java
index e524e98..ca29cfe 100644
--- a/src/com/android/settings/fuelgauge/BatteryDiffEntry.java
+++ b/src/com/android/settings/fuelgauge/BatteryDiffEntry.java
@@ -25,6 +25,7 @@
import androidx.annotation.VisibleForTesting;
+import com.android.settings.R;
import com.android.settingslib.utils.StringUtil;
import java.util.Comparator;
@@ -52,6 +53,7 @@
public double mConsumePower;
// A BatteryHistEntry corresponding to this diff usage data.
public final BatteryHistEntry mBatteryHistEntry;
+
private double mTotalConsumePower;
private double mPercentOfTotal;
@@ -151,8 +153,13 @@
case ConvertUtils.CONSUMER_TYPE_SYSTEM_BATTERY:
return true;
case ConvertUtils.CONSUMER_TYPE_UID_BATTERY:
- return isSystemUid((int) mBatteryHistEntry.mUid)
- || mBatteryHistEntry.mIsHidden;
+ if (mBatteryHistEntry.mIsHidden) {
+ return true;
+ }
+ final boolean combineSystemComponents =
+ mContext.getResources().getBoolean(
+ R.bool.config_battery_combine_system_components);
+ return combineSystemComponents && isSystemUid((int) mBatteryHistEntry.mUid);
}
return false;
}
diff --git a/src/com/android/settings/homepage/SettingsHomepageActivity.java b/src/com/android/settings/homepage/SettingsHomepageActivity.java
index 73c473a..3ed305e 100644
--- a/src/com/android/settings/homepage/SettingsHomepageActivity.java
+++ b/src/com/android/settings/homepage/SettingsHomepageActivity.java
@@ -182,6 +182,8 @@
showSuggestionFragment(scrollNeeded);
if (FeatureFlagUtils.isEnabled(this, FeatureFlags.CONTEXTUAL_HOME)) {
showFragment(() -> new ContextualCardsFragment(), R.id.contextual_cards_content);
+ ((FrameLayout) findViewById(R.id.main_content))
+ .getLayoutTransition().enableTransitionType(LayoutTransition.CHANGING);
}
}
mMainFragment = showFragment(() -> {
@@ -191,9 +193,6 @@
return fragment;
}, 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();
}
diff --git a/src/com/android/settings/homepage/TopLevelHighlightMixin.java b/src/com/android/settings/homepage/TopLevelHighlightMixin.java
index ebfe7f2..c473e87 100644
--- a/src/com/android/settings/homepage/TopLevelHighlightMixin.java
+++ b/src/com/android/settings/homepage/TopLevelHighlightMixin.java
@@ -23,7 +23,6 @@
import android.text.TextUtils;
import android.util.Log;
-import androidx.fragment.app.FragmentActivity;
import androidx.preference.PreferenceScreen;
import androidx.recyclerview.widget.RecyclerView;
@@ -43,14 +42,17 @@
private String mHiddenKey;
private DialogInterface mDialog;
private HighlightableTopLevelPreferenceAdapter mTopLevelAdapter;
+ private boolean mActivityEmbedded;
- public TopLevelHighlightMixin() {
+ public TopLevelHighlightMixin(boolean activityEmbedded) {
+ mActivityEmbedded = activityEmbedded;
}
public TopLevelHighlightMixin(Parcel source) {
mCurrentKey = source.readString();
mPreviousKey = source.readString();
mHiddenKey = source.readString();
+ mActivityEmbedded = source.readBoolean();
}
@Override
@@ -58,6 +60,7 @@
dest.writeString(mCurrentKey);
dest.writeString(mPreviousKey);
dest.writeString(mHiddenKey);
+ dest.writeBoolean(mActivityEmbedded);
}
@Override
@@ -96,8 +99,16 @@
}
}
+ void setActivityEmbedded(boolean activityEmbedded) {
+ mActivityEmbedded = activityEmbedded;
+ }
+
+ boolean isActivityEmbedded() {
+ return mActivityEmbedded;
+ }
+
RecyclerView.Adapter onCreateAdapter(TopLevelSettings topLevelSettings,
- PreferenceScreen preferenceScreen) {
+ PreferenceScreen preferenceScreen, boolean scrollNeeded) {
if (TextUtils.isEmpty(mCurrentKey)) {
mCurrentKey = getHighlightPrefKeyFromArguments(topLevelSettings.getArguments());
}
@@ -105,7 +116,7 @@
Log.d(TAG, "onCreateAdapter, pref key: " + mCurrentKey);
mTopLevelAdapter = new HighlightableTopLevelPreferenceAdapter(
(SettingsHomepageActivity) topLevelSettings.getActivity(), preferenceScreen,
- topLevelSettings.getListView(), mCurrentKey);
+ topLevelSettings.getListView(), mCurrentKey, scrollNeeded);
return mTopLevelAdapter;
}
@@ -129,7 +140,7 @@
}
}
- void highlightPreferenceIfNeeded(FragmentActivity activity) {
+ void highlightPreferenceIfNeeded() {
if (mTopLevelAdapter != null) {
mTopLevelAdapter.requestHighlight();
}
diff --git a/src/com/android/settings/homepage/TopLevelSettings.java b/src/com/android/settings/homepage/TopLevelSettings.java
index 7d57834..334462b 100644
--- a/src/com/android/settings/homepage/TopLevelSettings.java
+++ b/src/com/android/settings/homepage/TopLevelSettings.java
@@ -58,6 +58,7 @@
private boolean mIsEmbeddingActivityEnabled;
private TopLevelHighlightMixin mHighlightMixin;
+ private boolean mScrollNeeded = true;
private boolean mFirstStarted = true;
public TopLevelSettings() {
@@ -133,11 +134,14 @@
return;
}
+ boolean activityEmbedded = SplitController.getInstance().isActivityEmbedded(getActivity());
if (icicle != null) {
mHighlightMixin = icicle.getParcelable(SAVED_HIGHLIGHT_MIXIN);
+ mScrollNeeded = !mHighlightMixin.isActivityEmbedded() && activityEmbedded;
+ mHighlightMixin.setActivityEmbedded(activityEmbedded);
}
if (mHighlightMixin == null) {
- mHighlightMixin = new TopLevelHighlightMixin();
+ mHighlightMixin = new TopLevelHighlightMixin(activityEmbedded);
}
}
@@ -201,7 +205,7 @@
@Override
public void highlightPreferenceIfNeeded() {
if (mHighlightMixin != null) {
- mHighlightMixin.highlightPreferenceIfNeeded(getActivity());
+ mHighlightMixin.highlightPreferenceIfNeeded();
}
}
@@ -243,7 +247,7 @@
if (!mIsEmbeddingActivityEnabled || !(getActivity() instanceof SettingsHomepageActivity)) {
return super.onCreateAdapter(preferenceScreen);
}
- return mHighlightMixin.onCreateAdapter(this, preferenceScreen);
+ return mHighlightMixin.onCreateAdapter(this, preferenceScreen, mScrollNeeded);
}
@Override
diff --git a/src/com/android/settings/network/UiccSlotUtil.java b/src/com/android/settings/network/UiccSlotUtil.java
index 9a157d6..8fdc370 100644
--- a/src/com/android/settings/network/UiccSlotUtil.java
+++ b/src/com/android/settings/network/UiccSlotUtil.java
@@ -369,6 +369,7 @@
}
return true;
})
+ .sorted(Comparator.comparingInt(UiccSlotMapping::getLogicalSlotIndex))
.mapToInt(uiccSlotMapping -> uiccSlotMapping.getLogicalSlotIndex())
.findFirst()
.orElse(INVALID_LOGICAL_SLOT_ID);
diff --git a/src/com/android/settings/network/telephony/EnabledNetworkModePreferenceController.java b/src/com/android/settings/network/telephony/EnabledNetworkModePreferenceController.java
index 8e3f21a..6246b91 100644
--- a/src/com/android/settings/network/telephony/EnabledNetworkModePreferenceController.java
+++ b/src/com/android/settings/network/telephony/EnabledNetworkModePreferenceController.java
@@ -251,6 +251,10 @@
}
void setPreferenceEntries() {
+ mTelephonyManager = mTelephonyManager.createForSubscriptionId(mSubId);
+ final PersistableBundle carrierConfig = mCarrierConfigCache.getConfigForSubId(mSubId);
+ final boolean display2gOptions = carrierConfig
+ .getBoolean(CarrierConfigManager.KEY_PREFER_2G_BOOL);
clearAllEntries();
String[] entryValues;
int[] entryValuesInt;
@@ -266,7 +270,9 @@
add5gEntry(addNrToLteNetworkType(entryValuesInt[0]));
addLteEntry(entryValuesInt[0]);
add3gEntry(entryValuesInt[1]);
- add1xEntry(entryValuesInt[2]);
+ if (display2gOptions) {
+ add1xEntry(entryValuesInt[2]);
+ }
addGlobalEntry(entryValuesInt[3]);
break;
case ENABLED_NETWORKS_CDMA_NO_LTE_CHOICES:
@@ -278,7 +284,9 @@
"ENABLED_NETWORKS_CDMA_NO_LTE_CHOICES index error.");
}
add3gEntry(entryValuesInt[0]);
- add1xEntry(entryValuesInt[1]);
+ if (display2gOptions) {
+ add1xEntry(entryValuesInt[1]);
+ }
break;
case ENABLED_NETWORKS_CDMA_ONLY_LTE_CHOICES:
entryValues = getResourcesForSubId().getStringArray(
@@ -302,7 +310,9 @@
add5gEntry(addNrToLteNetworkType(entryValuesInt[0]));
addLteEntry(entryValuesInt[0]);
add3gEntry(entryValuesInt[1]);
- add2gEntry(entryValuesInt[2]);
+ if (display2gOptions) {
+ add2gEntry(entryValuesInt[2]);
+ }
break;
case ENABLED_NETWORKS_EXCEPT_GSM_LTE_CHOICES:
entryValues = getResourcesForSubId().getStringArray(
@@ -347,7 +357,9 @@
"ENABLED_NETWORKS_EXCEPT_LTE_CHOICES index error.");
}
add3gEntry(entryValuesInt[0]);
- add2gEntry(entryValuesInt[1]);
+ if (carrierConfig.getBoolean(CarrierConfigManager.KEY_PREFER_2G_BOOL)) {
+ add2gEntry(entryValuesInt[1]);
+ }
break;
case ENABLED_NETWORKS_4G_CHOICES:
entryValues = getResourcesForSubId().getStringArray(
@@ -361,7 +373,9 @@
entryValuesInt[0]));
add4gEntry(entryValuesInt[0]);
add3gEntry(entryValuesInt[1]);
- add2gEntry(entryValuesInt[2]);
+ if (display2gOptions) {
+ add2gEntry(entryValuesInt[2]);
+ }
break;
case ENABLED_NETWORKS_CHOICES:
entryValues = getResourcesForSubId().getStringArray(
@@ -373,7 +387,9 @@
add5gEntry(addNrToLteNetworkType(entryValuesInt[0]));
addLteEntry(entryValuesInt[0]);
add3gEntry(entryValuesInt[1]);
- add2gEntry(entryValuesInt[2]);
+ if (display2gOptions) {
+ add2gEntry(entryValuesInt[2]);
+ }
break;
case PREFERRED_NETWORK_MODE_CHOICES_WORLD_MODE:
entryValues = getResourcesForSubId().getStringArray(
diff --git a/src/com/android/settings/nfc/DefaultPaymentSettings.java b/src/com/android/settings/nfc/DefaultPaymentSettings.java
index 4dceefc..08b843d 100644
--- a/src/com/android/settings/nfc/DefaultPaymentSettings.java
+++ b/src/com/android/settings/nfc/DefaultPaymentSettings.java
@@ -143,7 +143,8 @@
CandidateInfo info, String defaultKey, String systemDefaultKey) {
final NfcPaymentCandidateInfo candidateInfo = (NfcPaymentCandidateInfo) info;
if (candidateInfo.isManagedProfile()) {
- pref.setSummary("Work");
+ final String textWork = getContext().getString(R.string.nfc_work_text);
+ pref.setSummary(textWork);
}
}
diff --git a/src/com/android/settings/nfc/PaymentDefaultDialog.java b/src/com/android/settings/nfc/PaymentDefaultDialog.java
index 75746ce..d333b3d 100644
--- a/src/com/android/settings/nfc/PaymentDefaultDialog.java
+++ b/src/com/android/settings/nfc/PaymentDefaultDialog.java
@@ -59,10 +59,13 @@
CardEmulation.EXTRA_SERVICE_COMPONENT);
String category = intent.getStringExtra(CardEmulation.EXTRA_CATEGORY);
UserHandle userHandle = intent.getParcelableExtra(Intent.EXTRA_USER);
+
+ int userId;
if (userHandle == null) {
- userHandle = UserHandle.CURRENT;
+ userId = UserHandle.myUserId();
+ } else {
+ userId = userHandle.getIdentifier();
}
- int userId = userHandle.getIdentifier();
setResult(RESULT_CANCELED);
if (!buildDialog(component, category, userId)) {
diff --git a/src/com/android/settings/safetycenter/BiometricsSafetySource.java b/src/com/android/settings/safetycenter/BiometricsSafetySource.java
index c302915..74d8e01 100644
--- a/src/com/android/settings/safetycenter/BiometricsSafetySource.java
+++ b/src/com/android/settings/safetycenter/BiometricsSafetySource.java
@@ -65,6 +65,7 @@
combinedBiometricStatusUtils.getSettingsClassName(), disablingAdmin,
Bundle.EMPTY),
disablingAdmin == null /* enabled */,
+ combinedBiometricStatusUtils.hasEnrolled(),
safetyEvent);
return;
}
@@ -82,6 +83,7 @@
faceStatusUtils.getSettingsClassName(), disablingAdmin,
Bundle.EMPTY),
disablingAdmin == null /* enabled */,
+ faceStatusUtils.hasEnrolled(),
safetyEvent);
return;
@@ -101,6 +103,7 @@
fingerprintStatusUtils.getSettingsClassName(), disablingAdmin,
Bundle.EMPTY),
disablingAdmin == null /* enabled */,
+ fingerprintStatusUtils.hasEnrolled(),
safetyEvent);
}
}
@@ -114,12 +117,14 @@
}
private static void setBiometricSafetySourceData(Context context, String title, String summary,
- Intent clickIntent, boolean enabled, SafetyEvent safetyEvent) {
+ Intent clickIntent, boolean enabled, boolean hasEnrolled, SafetyEvent safetyEvent) {
final PendingIntent pendingIntent = createPendingIntent(context, clickIntent);
+ final int statusLevel =
+ enabled && hasEnrolled ? SafetySourceStatus.STATUS_LEVEL_OK
+ : SafetySourceStatus.STATUS_LEVEL_NONE;
- final SafetySourceStatus status = new SafetySourceStatus.Builder(title, summary,
- SafetySourceStatus.STATUS_LEVEL_NONE, pendingIntent)
- .setEnabled(enabled).build();
+ final SafetySourceStatus status = new SafetySourceStatus.Builder(
+ title, summary, statusLevel, pendingIntent).setEnabled(enabled).build();
final SafetySourceData safetySourceData =
new SafetySourceData.Builder().setStatus(status).build();
diff --git a/src/com/android/settings/widget/HighlightableTopLevelPreferenceAdapter.java b/src/com/android/settings/widget/HighlightableTopLevelPreferenceAdapter.java
index ddd57f3..911aabb 100644
--- a/src/com/android/settings/widget/HighlightableTopLevelPreferenceAdapter.java
+++ b/src/com/android/settings/widget/HighlightableTopLevelPreferenceAdapter.java
@@ -67,10 +67,12 @@
private SparseArray<PreferenceViewHolder> mViewHolders;
public HighlightableTopLevelPreferenceAdapter(SettingsHomepageActivity homepageActivity,
- PreferenceGroup preferenceGroup, RecyclerView recyclerView, String key) {
+ PreferenceGroup preferenceGroup, RecyclerView recyclerView, String key,
+ boolean scrollNeeded) {
super(preferenceGroup);
mRecyclerView = recyclerView;
mHighlightKey = key;
+ mScrolled = !scrollNeeded;
mViewHolders = new SparseArray<>();
mContext = preferenceGroup.getContext();
mHomepageActivity = homepageActivity;
diff --git a/src/com/android/settings/wifi/WifiUtils.java b/src/com/android/settings/wifi/WifiUtils.java
index 6f955b2..1027792 100644
--- a/src/com/android/settings/wifi/WifiUtils.java
+++ b/src/com/android/settings/wifi/WifiUtils.java
@@ -41,6 +41,8 @@
private static final int SSID_ASCII_MIN_LENGTH = 1;
private static final int SSID_ASCII_MAX_LENGTH = 32;
+ private static final int PSK_PASSPHRASE_ASCII_MIN_LENGTH = 8;
+ private static final int PSK_PASSPHRASE_ASCII_MAX_LENGTH = 63;
public static boolean isSSIDTooLong(String ssid) {
if (TextUtils.isEmpty(ssid)) {
@@ -62,6 +64,13 @@
public static boolean isHotspotPasswordValid(String password, int securityType) {
final SoftApConfiguration.Builder configBuilder = new SoftApConfiguration.Builder();
try {
+ if (securityType == SoftApConfiguration.SECURITY_TYPE_WPA2_PSK
+ || securityType == SoftApConfiguration.SECURITY_TYPE_WPA3_SAE_TRANSITION) {
+ if (password.length() < PSK_PASSPHRASE_ASCII_MIN_LENGTH
+ || password.length() > PSK_PASSPHRASE_ASCII_MAX_LENGTH) {
+ return false;
+ }
+ }
configBuilder.setPassphrase(password, securityType);
} catch (IllegalArgumentException e) {
return false;
diff --git a/tests/robotests/src/com/android/settings/accessibility/AccessibilityFooterPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/accessibility/AccessibilityFooterPreferenceControllerTest.java
index cc8520b..cce240d 100644
--- a/tests/robotests/src/com/android/settings/accessibility/AccessibilityFooterPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/accessibility/AccessibilityFooterPreferenceControllerTest.java
@@ -121,4 +121,16 @@
assertThat(learnMoreView.getVisibility()).isEqualTo(View.GONE);
assertThat(mPreference.isLinkEnabled()).isFalse();
}
+
+ @Test
+ public void onBindViewHolder_setHelpResource_expectSummaryViewIsNonFocusable() {
+ mController.setupHelpLink(R.string.help_url_timeout, TEST_CONTENT_DESCRIPTION);
+ mController.displayPreference(mScreen);
+
+ mPreference.onBindViewHolder(mPreferenceViewHolder);
+
+ final TextView summaryView = (TextView) mPreferenceViewHolder
+ .findViewById(android.R.id.title);
+ assertThat(summaryView.isFocusable()).isFalse();
+ }
}
diff --git a/tests/robotests/src/com/android/settings/accessibility/AccessibilityFooterPreferenceTest.java b/tests/robotests/src/com/android/settings/accessibility/AccessibilityFooterPreferenceTest.java
index 14c56e8..0f83bc3 100644
--- a/tests/robotests/src/com/android/settings/accessibility/AccessibilityFooterPreferenceTest.java
+++ b/tests/robotests/src/com/android/settings/accessibility/AccessibilityFooterPreferenceTest.java
@@ -71,4 +71,15 @@
android.R.id.title);
assertThat(summaryView.getMovementMethod()).isInstanceOf(MovementMethod.class);
}
+
+ @Test
+ public void onBindViewHolder_setLinkEnabled_expectSummaryViewIsNonFocusable() {
+ mAccessibilityFooterPreference.setLinkEnabled(true);
+
+ mAccessibilityFooterPreference.onBindViewHolder(mPreferenceViewHolder);
+
+ final TextView summaryView = (TextView) mPreferenceViewHolder.findViewById(
+ android.R.id.title);
+ assertThat(summaryView.isFocusable()).isFalse();
+ }
}
diff --git a/tests/robotests/src/com/android/settings/accessibility/AccessibilityQuickSettingsTooltipWindowTest.java b/tests/robotests/src/com/android/settings/accessibility/AccessibilityQuickSettingsTooltipWindowTest.java
index 3fec81a..49602bc 100644
--- a/tests/robotests/src/com/android/settings/accessibility/AccessibilityQuickSettingsTooltipWindowTest.java
+++ b/tests/robotests/src/com/android/settings/accessibility/AccessibilityQuickSettingsTooltipWindowTest.java
@@ -67,7 +67,7 @@
@Test
public void initTooltipView_atMostAvailableTextWidth() {
final String quickSettingsTooltipsContent = mContext.getString(
- R.string.accessibility_service_qs_tooltips_content, TEST_PACKAGE_NAME);
+ R.string.accessibility_service_qs_tooltip_content, TEST_PACKAGE_NAME);
mTooltipView.setup(quickSettingsTooltipsContent, TEST_RES_ID);
final int getMaxWidth = mTooltipView.getAvailableWindowWidth();
diff --git a/tests/robotests/src/com/android/settings/accessibility/AccessibilitySettingsForSetupWizardActivityTest.java b/tests/robotests/src/com/android/settings/accessibility/AccessibilitySettingsForSetupWizardActivityTest.java
deleted file mode 100644
index 65b0647..0000000
--- a/tests/robotests/src/com/android/settings/accessibility/AccessibilitySettingsForSetupWizardActivityTest.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Copyright 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.accessibility;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import android.content.Intent;
-
-import androidx.test.filters.SmallTest;
-
-import com.android.settings.R;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.robolectric.Robolectric;
-import org.robolectric.RobolectricTestRunner;
-
-@RunWith(RobolectricTestRunner.class)
-@SmallTest
-public class AccessibilitySettingsForSetupWizardActivityTest {
-
- @Test
- public void createSetupAccessibilityActivity_shouldBeSUWTheme() {
- final Intent intent = new Intent();
- AccessibilitySettingsForSetupWizardActivity activity =
- Robolectric.buildActivity(AccessibilitySettingsForSetupWizardActivity.class,
- intent).get();
-
- assertThat(activity.getThemeResId()).isEqualTo(R.style.GlifV3Theme_Light);
- }
-}
diff --git a/tests/robotests/src/com/android/settings/accessibility/AccessibilitySettingsTest.java b/tests/robotests/src/com/android/settings/accessibility/AccessibilitySettingsTest.java
index f7c546f..c1950be 100644
--- a/tests/robotests/src/com/android/settings/accessibility/AccessibilitySettingsTest.java
+++ b/tests/robotests/src/com/android/settings/accessibility/AccessibilitySettingsTest.java
@@ -20,6 +20,8 @@
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyBoolean;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.ArgumentMatchers.isNull;
import static org.mockito.Mockito.atLeast;
@@ -31,6 +33,7 @@
import android.accessibilityservice.AccessibilityServiceInfo;
import android.accessibilityservice.AccessibilityShortcutInfo;
+import android.app.AppOpsManager;
import android.content.ComponentName;
import android.content.ContentResolver;
import android.content.Context;
@@ -110,6 +113,8 @@
@Mock
private PreferenceManager mPreferenceManager;
private ShadowAccessibilityManager mShadowAccessibilityManager;
+ @Mock
+ private AppOpsManager mAppOpsManager;
@Before
public void setup() {
@@ -121,6 +126,9 @@
when(mFragment.getPreferenceManager()).thenReturn(mPreferenceManager);
when(mFragment.getPreferenceManager().getContext()).thenReturn(mContext);
mContext.setTheme(R.style.Theme_AppCompat);
+ when(mContext.getSystemService(AppOpsManager.class)).thenReturn(mAppOpsManager);
+ when(mAppOpsManager.noteOpNoThrow(eq(AppOpsManager.OP_ACCESS_RESTRICTED_SETTINGS),
+ anyInt(), anyString())).thenReturn(AppOpsManager.MODE_ALLOWED);
}
@Test
diff --git a/tests/robotests/src/com/android/settings/accessibility/LaunchAccessibilityActivityPreferenceFragmentTest.java b/tests/robotests/src/com/android/settings/accessibility/LaunchAccessibilityActivityPreferenceFragmentTest.java
index 4660f77..8d5724b 100644
--- a/tests/robotests/src/com/android/settings/accessibility/LaunchAccessibilityActivityPreferenceFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/accessibility/LaunchAccessibilityActivityPreferenceFragmentTest.java
@@ -101,7 +101,7 @@
final CharSequence tileName =
mFragment.loadTileLabel(mContext, mFragment.getTileComponentName());
assertThat(tileTooltipContent.toString()).isEqualTo(
- mContext.getString(R.string.accessibility_service_qs_tooltips_content, tileName));
+ mContext.getString(R.string.accessibility_service_qs_tooltip_content, tileName));
}
@Test
@@ -115,7 +115,7 @@
mFragment.loadTileLabel(mContext, mFragment.getTileComponentName());
assertThat(tileTooltipContent.toString()).isEqualTo(
mContext.getString(
- R.string.accessibility_service_auto_added_qs_tooltips_content, tileName));
+ R.string.accessibility_service_auto_added_qs_tooltip_content, tileName));
}
@Test
@@ -130,7 +130,7 @@
final CharSequence tileName =
mFragment.loadTileLabel(mContext, mFragment.getTileComponentName());
assertThat(tileTooltipContent.toString()).isEqualTo(
- mContext.getString(R.string.accessibility_service_qs_tooltips_content, tileName));
+ mContext.getString(R.string.accessibility_service_qs_tooltip_content, tileName));
}
@Test
@@ -146,7 +146,7 @@
mFragment.loadTileLabel(mContext, mFragment.getTileComponentName());
assertThat(tileTooltipContent.toString()).isEqualTo(
mContext.getString(
- R.string.accessibility_service_auto_added_qs_tooltips_content, tileName));
+ R.string.accessibility_service_auto_added_qs_tooltip_content, tileName));
}
private void setupTileService(String packageName, String name, String tileName) {
diff --git a/tests/robotests/src/com/android/settings/accessibility/ToggleAccessibilityServicePreferenceFragmentTest.java b/tests/robotests/src/com/android/settings/accessibility/ToggleAccessibilityServicePreferenceFragmentTest.java
index ad5171d..2269529 100644
--- a/tests/robotests/src/com/android/settings/accessibility/ToggleAccessibilityServicePreferenceFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/accessibility/ToggleAccessibilityServicePreferenceFragmentTest.java
@@ -101,7 +101,7 @@
final CharSequence tileName =
mFragment.loadTileLabel(mContext, mFragment.getTileComponentName());
assertThat(tileTooltipContent.toString()).isEqualTo(
- mContext.getString(R.string.accessibility_service_qs_tooltips_content, tileName));
+ mContext.getString(R.string.accessibility_service_qs_tooltip_content, tileName));
}
@Test
@@ -115,7 +115,7 @@
mFragment.loadTileLabel(mContext, mFragment.getTileComponentName());
assertThat(tileTooltipContent.toString()).isEqualTo(
mContext.getString(
- R.string.accessibility_service_auto_added_qs_tooltips_content, tileName));
+ R.string.accessibility_service_auto_added_qs_tooltip_content, tileName));
}
@Test
@@ -130,7 +130,7 @@
final CharSequence tileName =
mFragment.loadTileLabel(mContext, mFragment.getTileComponentName());
assertThat(tileTooltipContent.toString()).isEqualTo(
- mContext.getString(R.string.accessibility_service_qs_tooltips_content, tileName));
+ mContext.getString(R.string.accessibility_service_qs_tooltip_content, tileName));
}
@Test
@@ -146,7 +146,7 @@
mFragment.loadTileLabel(mContext, mFragment.getTileComponentName());
assertThat(tileTooltipContent.toString()).isEqualTo(
mContext.getString(
- R.string.accessibility_service_auto_added_qs_tooltips_content, tileName));
+ R.string.accessibility_service_auto_added_qs_tooltip_content, tileName));
}
private void setupTileService(String packageName, String name, String tileName) {
diff --git a/tests/robotests/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragmentTest.java b/tests/robotests/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragmentTest.java
index 04018a6..114f969 100644
--- a/tests/robotests/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragmentTest.java
@@ -322,7 +322,7 @@
(AccessibilityFooterPreference) mFragment.getPreferenceScreen().getPreference(
mFragment.getPreferenceScreen().getPreferenceCount() - 1);
assertThat(accessibilityFooterPreference.getSummary()).isEqualTo(DEFAULT_SUMMARY);
- assertThat(accessibilityFooterPreference.isSelectable()).isEqualTo(true);
+ assertThat(accessibilityFooterPreference.isSelectable()).isEqualTo(false);
assertThat(accessibilityFooterPreference.getOrder()).isEqualTo(Integer.MAX_VALUE - 1);
}
diff --git a/tests/robotests/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollIntroductionTest.java b/tests/robotests/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollIntroductionTest.java
new file mode 100644
index 0000000..d8852db
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollIntroductionTest.java
@@ -0,0 +1,176 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.biometrics.fingerprint;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.content.Intent;
+import android.content.res.Resources;
+import android.hardware.biometrics.ComponentInfoInternal;
+import android.hardware.biometrics.SensorProperties;
+import android.hardware.fingerprint.Fingerprint;
+import android.hardware.fingerprint.FingerprintManager;
+import android.hardware.fingerprint.FingerprintSensorProperties;
+import android.hardware.fingerprint.FingerprintSensorPropertiesInternal;
+
+import com.android.settings.R;
+
+import com.google.android.setupcompat.util.WizardManagerHelper;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.Robolectric;
+import org.robolectric.RobolectricTestRunner;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.android.controller.ActivityController;
+import org.robolectric.util.ReflectionHelpers;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@RunWith(RobolectricTestRunner.class)
+public class FingerprintEnrollIntroductionTest {
+
+ @Mock private FingerprintManager mFingerprintManager;
+
+ private Context mContext;
+
+ private FingerprintEnrollIntroduction mFingerprintEnrollIntroduction;
+
+ private static final int MAX_ENROLLMENTS = 5;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ mContext = spy(RuntimeEnvironment.application.getApplicationContext());
+
+ final List<ComponentInfoInternal> componentInfo = new ArrayList<>();
+ final FingerprintSensorPropertiesInternal prop =
+ new FingerprintSensorPropertiesInternal(
+ 0 /* sensorId */,
+ SensorProperties.STRENGTH_STRONG,
+ MAX_ENROLLMENTS /* maxEnrollmentsPerUser */,
+ componentInfo,
+ FingerprintSensorProperties.TYPE_REAR,
+ true /* resetLockoutRequiresHardwareAuthToken */);
+ final ArrayList<FingerprintSensorPropertiesInternal> props = new ArrayList<>();
+ props.add(prop);
+ when(mFingerprintManager.getSensorPropertiesInternal()).thenReturn(props);
+ }
+
+ void setupFingerprintEnrollIntroWith(Intent intent) {
+ ActivityController<FingerprintEnrollIntroduction> controller =
+ Robolectric.buildActivity(FingerprintEnrollIntroduction.class, intent);
+ mFingerprintEnrollIntroduction = spy(controller.get());
+ ReflectionHelpers.setField(
+ mFingerprintEnrollIntroduction, "mFingerprintManager", mFingerprintManager);
+ controller.create();
+ }
+
+ void setFingerprintManagerToHave(int numEnrollments) {
+ List<Fingerprint> fingerprints = new ArrayList<>();
+ for (int i = 0; i < numEnrollments; i++) {
+ fingerprints.add(
+ new Fingerprint(
+ "Fingerprint " + i /* name */, 1 /*fingerId */, 1 /* deviceId */));
+ }
+ when(mFingerprintManager.getEnrolledFingerprints(anyInt())).thenReturn(fingerprints);
+ }
+
+ @Test
+ public void intro_CheckCanEnrollNormal() {
+ setupFingerprintEnrollIntroWith(new Intent());
+ setFingerprintManagerToHave(3 /* numEnrollments */);
+ int result = mFingerprintEnrollIntroduction.checkMaxEnrolled();
+
+ assertThat(result).isEqualTo(0);
+ }
+
+ @Test
+ public void intro_CheckMaxEnrolledNormal() {
+ setupFingerprintEnrollIntroWith(new Intent());
+ setFingerprintManagerToHave(7 /* numEnrollments */);
+ int result = mFingerprintEnrollIntroduction.checkMaxEnrolled();
+
+ assertThat(result).isEqualTo(R.string.fingerprint_intro_error_max);
+ }
+
+ @Test
+ public void intro_CheckCanEnrollDuringSUW() {
+ // This code path should depend on suw_max_fingerprints_enrollable versus
+ // FingerprintManager.getSensorProperties...maxEnrollmentsPerUser()
+ Resources resources = mock(Resources.class);
+ when(resources.getInteger(anyInt())).thenReturn(5);
+ when(mContext.getResources()).thenReturn(resources);
+
+ setupFingerprintEnrollIntroWith(
+ new Intent()
+ .putExtra(WizardManagerHelper.EXTRA_IS_FIRST_RUN, true)
+ .putExtra(WizardManagerHelper.EXTRA_IS_SETUP_FLOW, true));
+ setFingerprintManagerToHave(0 /* numEnrollments */);
+ int result = mFingerprintEnrollIntroduction.checkMaxEnrolled();
+
+ assertThat(result).isEqualTo(0);
+ }
+
+ @Test
+ public void intro_CheckMaxEnrolledDuringSUW() {
+ // This code path should depend on suw_max_fingerprints_enrollable versus
+ // FingerprintManager.getSensorProperties...maxEnrollmentsPerUser()
+ Resources resources = mock(Resources.class);
+ when(mContext.getResources()).thenReturn(resources);
+ when(resources.getInteger(anyInt())).thenReturn(1);
+
+ setupFingerprintEnrollIntroWith(
+ new Intent()
+ .putExtra(WizardManagerHelper.EXTRA_IS_FIRST_RUN, true)
+ .putExtra(WizardManagerHelper.EXTRA_IS_SETUP_FLOW, true));
+ setFingerprintManagerToHave(1 /* numEnrollments */);
+ int result = mFingerprintEnrollIntroduction.checkMaxEnrolled();
+
+ assertThat(result).isEqualTo(R.string.fingerprint_intro_error_max);
+ }
+
+ @Test
+ public void intro_CheckCanEnrollDuringDeferred() {
+ setupFingerprintEnrollIntroWith(
+ new Intent().putExtra(WizardManagerHelper.EXTRA_IS_DEFERRED_SETUP, true));
+ setFingerprintManagerToHave(2 /* numEnrollments */);
+ int result = mFingerprintEnrollIntroduction.checkMaxEnrolled();
+
+ assertThat(result).isEqualTo(0);
+ }
+
+ @Test
+ public void intro_CheckMaxEnrolledDuringDeferred() {
+ setupFingerprintEnrollIntroWith(
+ new Intent().putExtra(WizardManagerHelper.EXTRA_IS_DEFERRED_SETUP, true));
+ setFingerprintManagerToHave(6 /* numEnrollments */);
+ int result = mFingerprintEnrollIntroduction.checkMaxEnrolled();
+
+ assertThat(result).isEqualTo(R.string.fingerprint_intro_error_max);
+ }
+}
diff --git a/tests/robotests/src/com/android/settings/development/BluetoothA2dpHwOffloadPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/development/BluetoothA2dpHwOffloadPreferenceControllerTest.java
index a1d479f..fcb3ea9 100644
--- a/tests/robotests/src/com/android/settings/development/BluetoothA2dpHwOffloadPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/development/BluetoothA2dpHwOffloadPreferenceControllerTest.java
@@ -18,6 +18,8 @@
import static com.android.settings.development.BluetoothA2dpHwOffloadPreferenceController
.A2DP_OFFLOAD_DISABLED_PROPERTY;
+import static com.android.settings.development.BluetoothLeAudioHwOffloadPreferenceController
+ .LE_AUDIO_OFFLOAD_DISABLED_PROPERTY;
import static com.google.common.truth.Truth.assertThat;
@@ -62,15 +64,37 @@
}
@Test
- public void onA2dpHwDialogConfirmed_shouldChangeProperty() {
+ public void onA2dpHwDialogConfirmedAsA2dpOffloadDisabled_shouldChangeProperty() {
SystemProperties.set(A2DP_OFFLOAD_DISABLED_PROPERTY, Boolean.toString(false));
+ mController.mChanged = true;
- mController.onA2dpHwDialogConfirmed();
+ mController.onHwOffloadDialogConfirmed();
final boolean mode = SystemProperties.getBoolean(A2DP_OFFLOAD_DISABLED_PROPERTY, false);
assertThat(mode).isTrue();
+ }
- mController.onA2dpHwDialogConfirmed();
- final boolean mode2 = SystemProperties.getBoolean(A2DP_OFFLOAD_DISABLED_PROPERTY, false);
- assertThat(mode2).isFalse();
+ @Test
+ public void onA2dpHwDialogConfirmedAsA2dpOffloadEnabled_shouldChangeProperty() {
+ SystemProperties.set(A2DP_OFFLOAD_DISABLED_PROPERTY, Boolean.toString(true));
+ SystemProperties.set(LE_AUDIO_OFFLOAD_DISABLED_PROPERTY, Boolean.toString(true));
+
+ mController.mChanged = true;
+
+ mController.onHwOffloadDialogConfirmed();
+ final boolean a2dpMode = SystemProperties.getBoolean(A2DP_OFFLOAD_DISABLED_PROPERTY, true);
+ final boolean leAudioMode = SystemProperties
+ .getBoolean(LE_AUDIO_OFFLOAD_DISABLED_PROPERTY, true);
+ assertThat(a2dpMode).isFalse();
+ assertThat(leAudioMode).isFalse();
+ }
+
+ @Test
+ public void onA2dpHwDialogCanceled_shouldNotChangeProperty() {
+ SystemProperties.set(A2DP_OFFLOAD_DISABLED_PROPERTY, Boolean.toString(false));
+ mController.mChanged = true;
+
+ mController.onHwOffloadDialogCanceled();
+ final boolean mode = SystemProperties.getBoolean(A2DP_OFFLOAD_DISABLED_PROPERTY, false);
+ assertThat(mode).isFalse();
}
}
diff --git a/tests/robotests/src/com/android/settings/development/BluetoothGabeldorschePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/development/BluetoothGabeldorschePreferenceControllerTest.java
deleted file mode 100644
index 1916bf2..0000000
--- a/tests/robotests/src/com/android/settings/development/BluetoothGabeldorschePreferenceControllerTest.java
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
- * 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.development;
-
-import static com.android.settings.development.BluetoothGabeldorschePreferenceController
- .CURRENT_GD_FLAG;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-import android.content.Context;
-import android.provider.DeviceConfig;
-
-import androidx.preference.PreferenceScreen;
-import androidx.preference.SwitchPreference;
-
-import org.junit.Before;
-import org.junit.Ignore;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
-
-@RunWith(RobolectricTestRunner.class)
-public class BluetoothGabeldorschePreferenceControllerTest {
-
- @Mock
- private SwitchPreference mPreference;
- @Mock
- private PreferenceScreen mPreferenceScreen;
-
- private BluetoothGabeldorschePreferenceController mController;
-
- @Before
- public void setup() {
- MockitoAnnotations.initMocks(this);
- Context context = RuntimeEnvironment.application;
- mController = new BluetoothGabeldorschePreferenceController(context);
- when(mPreferenceScreen.findPreference(mController.getPreferenceKey()))
- .thenReturn(mPreference);
- mController.displayPreference(mPreferenceScreen);
- }
-
- @Test
- @Ignore
- public void onPreferenceChanged_settingEnabled_shouldTurnOnBluetoothGabeldorsche() {
- mController.onPreferenceChange(mPreference, true /* new value */);
-
- boolean enabled = DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_BLUETOOTH,
- CURRENT_GD_FLAG, false /* defaultValue */);
-
- assertThat(enabled).isTrue();
- }
-
- @Test
- @Ignore
- public void onPreferenceChanged_settingDisabled_shouldTurnOffBluetoothGabeldorsche() {
- mController.onPreferenceChange(mPreference, false /* new value */);
-
- boolean enabled = DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_BLUETOOTH,
- CURRENT_GD_FLAG, false /* defaultValue */);
-
- assertThat(enabled).isFalse();
- }
-
- @Test
- @Ignore
- public void updateState_settingEnabled_preferenceShouldBeChecked() {
- DeviceConfig.setProperty(DeviceConfig.NAMESPACE_BLUETOOTH,
- CURRENT_GD_FLAG, "true", false /* makeDefault */);
-
- mController.updateState(mPreference);
-
- verify(mPreference).setChecked(true);
- }
-
- @Test
- @Ignore
- public void updateState_settingDisabled_preferenceShouldNotBeChecked() {
- DeviceConfig.setProperty(DeviceConfig.NAMESPACE_BLUETOOTH,
- CURRENT_GD_FLAG, "false", false /* makeDefault */);
-
- mController.updateState(mPreference);
-
- verify(mPreference).setChecked(false);
- }
-
- @Test
- @Ignore
- public void onDeveloperOptionsDisabled_shouldDisablePreference() {
- mController.onDeveloperOptionsDisabled();
-
- String configStr = DeviceConfig.getProperty(DeviceConfig.NAMESPACE_BLUETOOTH,
- CURRENT_GD_FLAG);
-
- assertThat(configStr).isNull();
- verify(mPreference).setEnabled(false);
- verify(mPreference).setChecked(false);
- }
-}
diff --git a/tests/robotests/src/com/android/settings/development/BluetoothLeAudioHwOffloadPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/development/BluetoothLeAudioHwOffloadPreferenceControllerTest.java
new file mode 100644
index 0000000..c82df40e
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/development/BluetoothLeAudioHwOffloadPreferenceControllerTest.java
@@ -0,0 +1,94 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.development;
+
+import static com.android.settings.development.BluetoothLeAudioHwOffloadPreferenceController
+ .LE_AUDIO_OFFLOAD_DISABLED_PROPERTY;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.os.SystemProperties;
+
+import androidx.preference.PreferenceScreen;
+import androidx.preference.SwitchPreference;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
+import org.robolectric.RuntimeEnvironment;
+
+@RunWith(RobolectricTestRunner.class)
+public class BluetoothLeAudioHwOffloadPreferenceControllerTest {
+
+ @Mock
+ private PreferenceScreen mPreferenceScreen;
+ @Mock
+ private DevelopmentSettingsDashboardFragment mFragment;
+
+ private Context mContext;
+ private SwitchPreference mPreference;
+ private BluetoothLeAudioHwOffloadPreferenceController mController;
+
+ @Before
+ public void setup() {
+ MockitoAnnotations.initMocks(this);
+ mContext = RuntimeEnvironment.application;
+ mPreference = new SwitchPreference(mContext);
+ mController = spy(new BluetoothLeAudioHwOffloadPreferenceController(mContext, mFragment));
+ when(mPreferenceScreen.findPreference(mController.getPreferenceKey()))
+ .thenReturn(mPreference);
+ mController.displayPreference(mPreferenceScreen);
+ }
+
+ @Test
+ public void onLeAudioHwDialogConfirmedAsLeAudioOffloadDisabled_shouldChangeProperty() {
+ SystemProperties.set(LE_AUDIO_OFFLOAD_DISABLED_PROPERTY, Boolean.toString(false));
+ mController.mChanged = true;
+
+ mController.onHwOffloadDialogConfirmed();
+ final boolean mode = SystemProperties.getBoolean(LE_AUDIO_OFFLOAD_DISABLED_PROPERTY, false);
+ assertThat(mode).isTrue();
+ }
+
+ @Test
+ public void onLeAudioHwDialogConfirmedAsLeAudioOffloadEnabled_shouldChangeProperty() {
+ SystemProperties.set(LE_AUDIO_OFFLOAD_DISABLED_PROPERTY, Boolean.toString(true));
+ mController.mChanged = true;
+
+ mController.onHwOffloadDialogConfirmed();
+ final boolean mode2 = SystemProperties.getBoolean(
+ LE_AUDIO_OFFLOAD_DISABLED_PROPERTY, true);
+ assertThat(mode2).isFalse();
+ }
+
+ @Test
+ public void onLeAudioHwDialogCanceled_shouldNotChangeProperty() {
+ SystemProperties.set(LE_AUDIO_OFFLOAD_DISABLED_PROPERTY, Boolean.toString(false));
+ mController.mChanged = true;
+
+ mController.onHwOffloadDialogCanceled();
+ final boolean mode = SystemProperties.getBoolean(LE_AUDIO_OFFLOAD_DISABLED_PROPERTY, false);
+ assertThat(mode).isFalse();
+ }
+}
diff --git a/tests/robotests/src/com/android/settings/development/DevelopmentSettingsDashboardFragmentTest.java b/tests/robotests/src/com/android/settings/development/DevelopmentSettingsDashboardFragmentTest.java
index 5e4be68..7db7141 100644
--- a/tests/robotests/src/com/android/settings/development/DevelopmentSettingsDashboardFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/development/DevelopmentSettingsDashboardFragmentTest.java
@@ -208,9 +208,9 @@
assertThat(dialog).isNotNull();
ShadowAlertDialogCompat shadowDialog = ShadowAlertDialogCompat.shadowOf(dialog);
assertThat(shadowDialog.getTitle()).isEqualTo(
- mContext.getString(R.string.bluetooth_disable_a2dp_hw_offload_dialog_title));
+ mContext.getString(R.string.bluetooth_disable_hw_offload_dialog_title));
assertThat(shadowDialog.getMessage()).isEqualTo(
- mContext.getString(R.string.bluetooth_disable_a2dp_hw_offload_dialog_message));
+ mContext.getString(R.string.bluetooth_disable_hw_offload_dialog_message));
}
@Test
diff --git a/tests/robotests/src/com/android/settings/development/IngressRateLimitPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/development/IngressRateLimitPreferenceControllerTest.java
new file mode 100644
index 0000000..0f85a14
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/development/IngressRateLimitPreferenceControllerTest.java
@@ -0,0 +1,107 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.development;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.net.ConnectivitySettingsManager;
+
+import androidx.preference.ListPreference;
+import androidx.preference.PreferenceScreen;
+
+import com.android.settings.R;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
+import org.robolectric.RuntimeEnvironment;
+
+@RunWith(RobolectricTestRunner.class)
+public class IngressRateLimitPreferenceControllerTest {
+ private Context mContext = RuntimeEnvironment.application;
+ private ListPreference mPreference;
+ private IngressRateLimitPreferenceController mController;
+
+ @Mock
+ private PreferenceScreen mPreferenceScreen;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+
+ mPreference = new ListPreference(mContext);
+ mPreference.setEntries(R.array.ingress_rate_limit_entries);
+ mPreference.setEntryValues(R.array.ingress_rate_limit_values);
+
+ mController = new IngressRateLimitPreferenceController(mContext);
+ when(mPreferenceScreen.findPreference(mController.getPreferenceKey())).thenReturn(
+ mPreference);
+ mController.displayPreference(mPreferenceScreen);
+ }
+
+ @Test
+ public void onPreferenceChanged_select5Mbits_shouldEnableIngressRateLimit() {
+ final long newRateLimit = 625000; // 5mbit == 625000 B/s
+ assertThat(mController.onPreferenceChange(mPreference, newRateLimit)).isTrue();
+
+ final long configuredRateLimit =
+ ConnectivitySettingsManager.getIngressRateLimitInBytesPerSecond(mContext);
+ assertThat(configuredRateLimit).isEqualTo(newRateLimit);
+ }
+
+ @Test
+ public void onPreferenceChanged_selectDisabled_shouldDisableIngressRateLimit() {
+ final long disabledRateLimit = -1; // -1 == disabled
+ assertThat(mController.onPreferenceChange(mPreference, disabledRateLimit)).isTrue();
+
+ final long configuredRateLimit =
+ ConnectivitySettingsManager.getIngressRateLimitInBytesPerSecond(mContext);
+ assertThat(configuredRateLimit).isEqualTo(disabledRateLimit);
+ }
+
+ @Test
+ public void onPreferenceChanged_invalidValue_returnsFalse() {
+ final long invalidRateLimit = -123;
+ assertThat(mController.onPreferenceChange(mPreference, invalidRateLimit)).isFalse();
+ }
+
+ @Test
+ public void updateState_preferenceShouldBeSelected() {
+ final long newRateLimit = 625000; // 5mbit == 625000 B/s
+ ConnectivitySettingsManager.setIngressRateLimitInBytesPerSecond(mContext, newRateLimit);
+ mController.updateState(mPreference);
+ assertThat(Long.parseLong(mPreference.getValue())).isEqualTo(newRateLimit);
+ }
+
+ @Test
+ public void onDeveloperOptionsSwitchDisabled_shouldDisablePreference() {
+ final long newRateLimit = 625000; // 5mbit == 625000 B/s
+ ConnectivitySettingsManager.setIngressRateLimitInBytesPerSecond(mContext, newRateLimit);
+ mController.updateState(mPreference);
+
+ mController.onDeveloperOptionsSwitchDisabled();
+ assertThat(Long.parseLong(mPreference.getValue())).isEqualTo(-1);
+ assertThat(ConnectivitySettingsManager.getIngressRateLimitInBytesPerSecond(
+ mContext)).isEqualTo(-1);
+ }
+}
diff --git a/tests/robotests/src/com/android/settings/dream/WhenToDreamPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/dream/WhenToDreamPreferenceControllerTest.java
index a0188f8..3305cde 100644
--- a/tests/robotests/src/com/android/settings/dream/WhenToDreamPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/dream/WhenToDreamPreferenceControllerTest.java
@@ -23,26 +23,23 @@
import android.content.Context;
import androidx.preference.Preference;
+import androidx.test.core.app.ApplicationProvider;
import com.android.settingslib.dream.DreamBackend;
import com.android.settingslib.dream.DreamBackend.WhenToDream;
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.util.ReflectionHelpers;
@RunWith(RobolectricTestRunner.class)
-@Ignore
public class WhenToDreamPreferenceControllerTest {
private WhenToDreamPreferenceController mController;
- @Mock(answer = Answers.RETURNS_DEEP_STUBS)
private Context mContext;
@Mock
private DreamBackend mBackend;
@@ -50,6 +47,7 @@
@Before
public void setup() {
MockitoAnnotations.initMocks(this);
+ mContext = ApplicationProvider.getApplicationContext();
mController = new WhenToDreamPreferenceController(mContext);
ReflectionHelpers.setField(mController, "mBackend", mBackend);
}
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BatteryDiffEntryTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BatteryDiffEntryTest.java
index b1d8f0d..13ce29e 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/BatteryDiffEntryTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/BatteryDiffEntryTest.java
@@ -349,12 +349,12 @@
}
@Test
- public void testIsSystemEntry_uidBatteryWithSystemProcess_returnTrue() {
+ public void testIsSystemEntry_uidBatteryWithSystemProcess_returnFalse() {
final BatteryDiffEntry entry =
createBatteryDiffEntry(
ConvertUtils.CONSUMER_TYPE_UID_BATTERY,
/*uid=*/ 1230, /*isHidden=*/ false);
- assertThat(entry.isSystemEntry()).isTrue();
+ assertThat(entry.isSystemEntry()).isFalse();
}
@Test
diff --git a/tests/unit/src/com/android/settings/accessibility/HighTextContrastPreferenceControllerTest.java b/tests/unit/src/com/android/settings/accessibility/HighTextContrastPreferenceControllerTest.java
index 1ada051..9c4df36 100644
--- a/tests/unit/src/com/android/settings/accessibility/HighTextContrastPreferenceControllerTest.java
+++ b/tests/unit/src/com/android/settings/accessibility/HighTextContrastPreferenceControllerTest.java
@@ -19,8 +19,11 @@
import static com.google.common.truth.Truth.assertThat;
import android.content.Context;
+import android.os.Looper;
import android.provider.Settings;
+import androidx.preference.PreferenceManager;
+import androidx.preference.PreferenceScreen;
import androidx.preference.SwitchPreference;
import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4;
@@ -37,6 +40,7 @@
@RunWith(AndroidJUnit4.class)
public class HighTextContrastPreferenceControllerTest {
+ private static final String PREF_KEY = "text_contrast";
private static final int ON = 1;
private static final int OFF = 0;
private static final int UNKNOWN = -1;
@@ -44,12 +48,20 @@
private Context mContext;
private SwitchPreference mPreference;
private HighTextContrastPreferenceController mController;
+ private PreferenceScreen mScreen;
@Before
public void setUp() {
mContext = ApplicationProvider.getApplicationContext();
+ if (Looper.myLooper() == null) {
+ Looper.prepare();
+ }
+ final PreferenceManager preferenceManager = new PreferenceManager(mContext);
+ mScreen = preferenceManager.createPreferenceScreen(mContext);
mPreference = new SwitchPreference(mContext);
- mController = new HighTextContrastPreferenceController(mContext, "text_contrast");
+ mPreference.setKey(PREF_KEY);
+ mScreen.addPreference(mPreference);
+ mController = new HighTextContrastPreferenceController(mContext, PREF_KEY);
}
@Test
@@ -99,10 +111,13 @@
@Test
public void resetState_shouldDisableTextContrast() {
+ mController.displayPreference(mScreen);
mController.setChecked(true);
+ mPreference.setChecked(true);
mController.resetState();
+ assertThat(mPreference.isChecked()).isFalse();
assertThat(Settings.Secure.getInt(mContext.getContentResolver(),
Settings.Secure.ACCESSIBILITY_HIGH_TEXT_CONTRAST_ENABLED, UNKNOWN)).isEqualTo(OFF);
}
diff --git a/tests/unit/src/com/android/settings/applications/specialaccess/notificationaccess/ApprovalPreferenceControllerTest.java b/tests/unit/src/com/android/settings/applications/specialaccess/notificationaccess/ApprovalPreferenceControllerTest.java
index 064f813..249b713 100644
--- a/tests/unit/src/com/android/settings/applications/specialaccess/notificationaccess/ApprovalPreferenceControllerTest.java
+++ b/tests/unit/src/com/android/settings/applications/specialaccess/notificationaccess/ApprovalPreferenceControllerTest.java
@@ -18,12 +18,15 @@
import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
+import android.app.AppOpsManager;
import android.app.NotificationManager;
import android.content.ComponentName;
import android.content.Context;
@@ -31,12 +34,12 @@
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
-import androidx.preference.SwitchPreference;
import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import com.android.internal.logging.nano.MetricsProto;
import com.android.settings.testutils.FakeFeatureFactory;
+import com.android.settingslib.RestrictedSwitchPreference;
import org.junit.Before;
import org.junit.Test;
@@ -55,6 +58,8 @@
@Mock
NotificationManager mNm;
@Mock
+ AppOpsManager mAppOpsManager;
+ @Mock
PackageManager mPm;
PackageInfo mPkgInfo;
ComponentName mCn = new ComponentName("a", "b");
@@ -75,15 +80,47 @@
mController.setNm(mNm);
mController.setParent(mFragment);
mController.setPkgInfo(mPkgInfo);
+
}
@Test
public void updateState_checked() {
+ when(mAppOpsManager.noteOpNoThrow(anyInt(), anyInt(), anyString())).thenReturn(
+ AppOpsManager.MODE_ALLOWED);
when(mNm.isNotificationListenerAccessGranted(mCn)).thenReturn(true);
- SwitchPreference pref = new SwitchPreference(mContext);
+ RestrictedSwitchPreference pref = new RestrictedSwitchPreference(
+ mContext);
+ pref.setAppOps(mAppOpsManager);
mController.updateState(pref);
assertThat(pref.isChecked()).isTrue();
+ assertThat(pref.isEnabled()).isTrue();
+ }
+
+ @Test
+ public void restrictedSettings_appOpsDisabled() {
+ when(mAppOpsManager.noteOpNoThrow(anyInt(), anyInt(), anyString())).thenReturn(
+ AppOpsManager.MODE_ERRORED);
+ when(mNm.isNotificationListenerAccessGranted(mCn)).thenReturn(false);
+ RestrictedSwitchPreference pref = new RestrictedSwitchPreference(
+ mContext);
+ pref.setAppOps(mAppOpsManager);
+
+ mController.updateState(pref);
+ assertThat(pref.isEnabled()).isFalse();
+ }
+
+ @Test
+ public void restrictedSettings_serviceAlreadyEnabled() {
+ when(mAppOpsManager.noteOpNoThrow(anyInt(), anyInt(), anyString())).thenReturn(
+ AppOpsManager.MODE_ERRORED);
+ when(mNm.isNotificationListenerAccessGranted(mCn)).thenReturn(true);
+ RestrictedSwitchPreference pref = new RestrictedSwitchPreference(
+ mContext);
+ pref.setAppOps(mAppOpsManager);
+
+ mController.updateState(pref);
+ assertThat(pref.isEnabled()).isTrue();
}
@Test
diff --git a/tests/unit/src/com/android/settings/biometrics/combination/CombinedBiometricStatusUtilsTest.java b/tests/unit/src/com/android/settings/biometrics/combination/CombinedBiometricStatusUtilsTest.java
index 7d89079..10f1110 100644
--- a/tests/unit/src/com/android/settings/biometrics/combination/CombinedBiometricStatusUtilsTest.java
+++ b/tests/unit/src/com/android/settings/biometrics/combination/CombinedBiometricStatusUtilsTest.java
@@ -57,8 +57,7 @@
private static final ComponentName COMPONENT_NAME =
new ComponentName("package", "class");
private static final int USER_ID = UserHandle.myUserId();
- private static final UserHandle USER_HANDLE = new UserHandle(USER_ID);;
-
+ private static final UserHandle USER_HANDLE = new UserHandle(USER_ID);
@Mock
private PackageManager mPackageManager;
@@ -123,6 +122,54 @@
}
@Test
+ public void hasEnrolled_withoutFingerprintHardware_withoutFaceHardware_returnsFalse() {
+ when(mFingerprintManager.isHardwareDetected()).thenReturn(false);
+ when(mFaceManager.isHardwareDetected()).thenReturn(false);
+
+ assertThat(mCombinedBiometricStatusUtils.hasEnrolled()).isFalse();
+ }
+
+ @Test
+ public void hasEnrolled_withoutFingerprintEnroll_withoutFaceEnroll_returnsFalse() {
+ when(mFingerprintManager.isHardwareDetected()).thenReturn(true);
+ when(mFaceManager.isHardwareDetected()).thenReturn(true);
+ when(mFingerprintManager.hasEnrolledFingerprints(anyInt())).thenReturn(false);
+ when(mFaceManager.hasEnrolledTemplates(anyInt())).thenReturn(false);
+
+ assertThat(mCombinedBiometricStatusUtils.hasEnrolled()).isFalse();
+ }
+
+ @Test
+ public void hasEnrolled_withoutFingerprintEnroll_withFaceEnroll_returnsTrue() {
+ when(mFingerprintManager.isHardwareDetected()).thenReturn(true);
+ when(mFaceManager.isHardwareDetected()).thenReturn(true);
+ when(mFingerprintManager.hasEnrolledFingerprints(anyInt())).thenReturn(false);
+ when(mFaceManager.hasEnrolledTemplates(anyInt())).thenReturn(true);
+
+ assertThat(mCombinedBiometricStatusUtils.hasEnrolled()).isTrue();
+ }
+
+ @Test
+ public void hasEnrolled_withFingerprintEnroll_withoutFaceEnroll_returnsTrue() {
+ when(mFingerprintManager.isHardwareDetected()).thenReturn(true);
+ when(mFaceManager.isHardwareDetected()).thenReturn(true);
+ when(mFingerprintManager.hasEnrolledFingerprints(anyInt())).thenReturn(true);
+ when(mFaceManager.hasEnrolledTemplates(anyInt())).thenReturn(false);
+
+ assertThat(mCombinedBiometricStatusUtils.hasEnrolled()).isTrue();
+ }
+
+ @Test
+ public void hasEnrolled_withFingerprintEnroll_withFaceEnroll_returnsTrue() {
+ when(mFingerprintManager.isHardwareDetected()).thenReturn(true);
+ when(mFaceManager.isHardwareDetected()).thenReturn(true);
+ when(mFingerprintManager.hasEnrolledFingerprints(anyInt())).thenReturn(true);
+ when(mFaceManager.hasEnrolledTemplates(anyInt())).thenReturn(true);
+
+ assertThat(mCombinedBiometricStatusUtils.hasEnrolled()).isTrue();
+ }
+
+ @Test
public void getDisabledAdmin_whenFingerprintDisabled_whenFaceDisabled_returnsEnforcedAdmin() {
when(mDevicePolicyManager.getKeyguardDisabledFeatures(COMPONENT_NAME))
.thenReturn(KEYGUARD_DISABLE_FACE | KEYGUARD_DISABLE_FINGERPRINT);
diff --git a/tests/unit/src/com/android/settings/biometrics/face/FaceStatusUtilsTest.java b/tests/unit/src/com/android/settings/biometrics/face/FaceStatusUtilsTest.java
index 8697da7..9f9dd93 100644
--- a/tests/unit/src/com/android/settings/biometrics/face/FaceStatusUtilsTest.java
+++ b/tests/unit/src/com/android/settings/biometrics/face/FaceStatusUtilsTest.java
@@ -115,6 +115,20 @@
}
@Test
+ public void hasEnrolled_withEnrolledTemplates_returnsTrue() {
+ when(mFaceManager.hasEnrolledTemplates(anyInt())).thenReturn(true);
+
+ assertThat(mFaceStatusUtils.hasEnrolled()).isTrue();
+ }
+
+ @Test
+ public void hasEnrolled_withoutEnrolledTemplates_returnsFalse() {
+ when(mFaceManager.hasEnrolledTemplates(anyInt())).thenReturn(false);
+
+ assertThat(mFaceStatusUtils.hasEnrolled()).isFalse();
+ }
+
+ @Test
public void getDisabledAdmin_whenFaceDisabled_returnsEnforcedAdmin() {
when(mDevicePolicyManager.getKeyguardDisabledFeatures(COMPONENT_NAME))
.thenReturn(DevicePolicyManager.KEYGUARD_DISABLE_FACE);
diff --git a/tests/unit/src/com/android/settings/biometrics/fingerprint/FingerprintStatusUtilsTest.java b/tests/unit/src/com/android/settings/biometrics/fingerprint/FingerprintStatusUtilsTest.java
index cbe4298..4ecf82e 100644
--- a/tests/unit/src/com/android/settings/biometrics/fingerprint/FingerprintStatusUtilsTest.java
+++ b/tests/unit/src/com/android/settings/biometrics/fingerprint/FingerprintStatusUtilsTest.java
@@ -119,6 +119,20 @@
}
@Test
+ public void hasEnrolled_withEnrolledFingerprints_returnsTrue() {
+ when(mFingerprintManager.hasEnrolledFingerprints(anyInt())).thenReturn(true);
+
+ assertThat(mFingerprintStatusUtils.hasEnrolled()).isTrue();
+ }
+
+ @Test
+ public void hasEnrolled_withoutEnrolledFingerprints_returnsFalse() {
+ when(mFingerprintManager.hasEnrolledFingerprints(anyInt())).thenReturn(false);
+
+ assertThat(mFingerprintStatusUtils.hasEnrolled()).isFalse();
+ }
+
+ @Test
public void getDisabledAdmin_whenFingerprintDisabled_returnsEnforcedAdmin() {
when(mDevicePolicyManager.getKeyguardDisabledFeatures(COMPONENT_NAME))
.thenReturn(DevicePolicyManager.KEYGUARD_DISABLE_FINGERPRINT);
diff --git a/tests/unit/src/com/android/settings/network/UiccSlotUtilTest.java b/tests/unit/src/com/android/settings/network/UiccSlotUtilTest.java
index cc9bdfc..2cf9845 100644
--- a/tests/unit/src/com/android/settings/network/UiccSlotUtilTest.java
+++ b/tests/unit/src/com/android/settings/network/UiccSlotUtilTest.java
@@ -454,7 +454,7 @@
@Test
public void getExcludedLogicalSlotIndex_oneEsimAndFromDualPortsAToPsimAndPort0_logicalSlot1() {
// There is only one enabled esimPort0 before user enables the psim.
- Collection<UiccSlotMapping> uiccSlotMappings = createUiccSlotMappingPsimAndPort1();
+ Collection<UiccSlotMapping> uiccSlotMappings = createUiccSlotMappingDualPortsA();
Collection<SubscriptionInfo> activeSubscriptionInfoList =
createActiveSubscriptionInfoListOneSim(0, 0);
SubscriptionInfo removedSubInfo = null;
@@ -469,7 +469,7 @@
@Test
public void getExcludedLogicalSlotIndex_oneEsimAndFromDualPortsBToPsimAndPort1_logicalSlot1() {
// There is only one enabled esimPort1 before user enables the psim.
- Collection<UiccSlotMapping> uiccSlotMappings = createUiccSlotMappingPsimAndPort1();
+ Collection<UiccSlotMapping> uiccSlotMappings = createUiccSlotMappingDualPortsB();
Collection<SubscriptionInfo> activeSubscriptionInfoList =
createActiveSubscriptionInfoListOneSim(0, 1);
SubscriptionInfo removedSubInfo = null;
@@ -484,7 +484,7 @@
@Test
public void getExcludedLogicalSlotIndex_oneEsimAndFromDualPortsBToPsimAndPort0_logicalSlot0() {
// There is only one enabled esimPort0 before user enables the psim.
- Collection<UiccSlotMapping> uiccSlotMappings = createUiccSlotMappingPsimAndPort1();
+ Collection<UiccSlotMapping> uiccSlotMappings = createUiccSlotMappingDualPortsB();
Collection<SubscriptionInfo> activeSubscriptionInfoList =
createActiveSubscriptionInfoListOneSim(1, 0);
SubscriptionInfo removedSubInfo = null;
@@ -552,6 +552,48 @@
assertThat(testExcludedLogicalSlotIndex).isEqualTo(verifyExcludedLogicalSlotIndex);
}
+ @Test
+ public void getExcludedLogicalSlotIndex_noEsimAndFromDualPortsAToPsimAndPort1_logicalSlot0() {
+ // There is no profiles enabled on either esim port before user enables the psim.
+ Collection<UiccSlotMapping> uiccSlotMappings = createUiccSlotMappingDualPortsA();
+ Collection<SubscriptionInfo> activeSubscriptionInfoList = new ArrayList<>();
+ SubscriptionInfo removedSubInfo = null;
+ int verifyExcludedLogicalSlotIndex = 0;
+
+ int testExcludedLogicalSlotIndex = UiccSlotUtil.getExcludedLogicalSlotIndex(
+ uiccSlotMappings, activeSubscriptionInfoList, removedSubInfo, true);
+
+ assertThat(testExcludedLogicalSlotIndex).isEqualTo(verifyExcludedLogicalSlotIndex);
+ }
+
+ @Test
+ public void getExcludedLogicalSlotIndex_noEsimAndFromDualPortsBToPsimAndPort0_logicalSlot0() {
+ // There is no profiles enabled on either esim port before user enables the psim.
+ Collection<UiccSlotMapping> uiccSlotMappings = createUiccSlotMappingDualPortsB();
+ Collection<SubscriptionInfo> activeSubscriptionInfoList = new ArrayList<>();
+ SubscriptionInfo removedSubInfo = null;
+ int verifyExcludedLogicalSlotIndex = 0;
+
+ int testExcludedLogicalSlotIndex = UiccSlotUtil.getExcludedLogicalSlotIndex(
+ uiccSlotMappings, activeSubscriptionInfoList, removedSubInfo, true);
+
+ assertThat(testExcludedLogicalSlotIndex).isEqualTo(verifyExcludedLogicalSlotIndex);
+ }
+
+ @Test
+ public void getExcludedLogicalSlotIndex_noEsimNoOrdingFromDualPortsBToPsimAndPort1_logical0() {
+ // There is no profiles enabled on either esim port before user enables the psim.
+ Collection<UiccSlotMapping> uiccSlotMappings = createUiccSlotMappingDualPortsBNoOrding();
+ Collection<SubscriptionInfo> activeSubscriptionInfoList = new ArrayList<>();
+ SubscriptionInfo removedSubInfo = null;
+ int verifyExcludedLogicalSlotIndex = 0;
+
+ int testExcludedLogicalSlotIndex = UiccSlotUtil.getExcludedLogicalSlotIndex(
+ uiccSlotMappings, activeSubscriptionInfoList, removedSubInfo, true);
+
+ assertThat(testExcludedLogicalSlotIndex).isEqualTo(verifyExcludedLogicalSlotIndex);
+ }
+
private void compareTwoUiccSlotMappings(Collection<UiccSlotMapping> testUiccSlotMappings,
Collection<UiccSlotMapping> verifyUiccSlotMappings) {
assertThat(testUiccSlotMappings.size()).isEqualTo(verifyUiccSlotMappings.size());
@@ -656,7 +698,13 @@
return slotMap;
}
+ private List<UiccSlotMapping> createUiccSlotMappingDualPortsBNoOrding() {
+ List<UiccSlotMapping> slotMap = new ArrayList<>();
+ slotMap.add(new UiccSlotMapping(0, ESIM_PHYSICAL_SLOT, 1));
+ slotMap.add(new UiccSlotMapping(1, ESIM_PHYSICAL_SLOT, 0));
+ return slotMap;
+ }
/**
* The "oneSimSlotDevice" has below cases
* 1) The device is one psim slot and no esim slot
diff --git a/tests/unit/src/com/android/settings/safetycenter/BiometricsSafetySourceTest.java b/tests/unit/src/com/android/settings/safetycenter/BiometricsSafetySourceTest.java
index 13778f7..3030f0c 100644
--- a/tests/unit/src/com/android/settings/safetycenter/BiometricsSafetySourceTest.java
+++ b/tests/unit/src/com/android/settings/safetycenter/BiometricsSafetySourceTest.java
@@ -23,6 +23,7 @@
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
@@ -112,8 +113,8 @@
BiometricsSafetySource.setSafetySourceData(mApplicationContext, EVENT_SOURCE_STATE_CHANGED);
- verify(mSafetyCenterManagerWrapper, never()).setSafetySourceData(
- any(), any(), any(), any());
+ verify(mSafetyCenterManagerWrapper, never())
+ .setSafetySourceData(any(), any(), any(), any());
}
@Test
@@ -124,8 +125,8 @@
BiometricsSafetySource.setSafetySourceData(mApplicationContext, EVENT_SOURCE_STATE_CHANGED);
- verify(mSafetyCenterManagerWrapper, never()).setSafetySourceData(
- any(), any(), any(), any());
+ verify(mSafetyCenterManagerWrapper, never())
+ .setSafetySourceData(any(), any(), any(), any());
}
@Test
@@ -137,11 +138,9 @@
when(mDevicePolicyManager.getKeyguardDisabledFeatures(COMPONENT_NAME)).thenReturn(0);
BiometricsSafetySource.setSafetySourceData(mApplicationContext, EVENT_SOURCE_STATE_CHANGED);
- ArgumentCaptor<String> captor = ArgumentCaptor.forClass(String.class);
- verify(mSafetyCenterManagerWrapper).setSafetySourceData(
- any(), captor.capture(), any(), any());
- assertThat(captor.getValue()).isEqualTo(BiometricsSafetySource.SAFETY_SOURCE_ID);
+ verify(mSafetyCenterManagerWrapper).setSafetySourceData(
+ any(), eq(BiometricsSafetySource.SAFETY_SOURCE_ID), any(), any());
}
@Test
@@ -153,11 +152,9 @@
when(mDevicePolicyManager.getKeyguardDisabledFeatures(COMPONENT_NAME)).thenReturn(0);
BiometricsSafetySource.setSafetySourceData(mApplicationContext, EVENT_SOURCE_STATE_CHANGED);
- ArgumentCaptor<SafetyEvent> captor = ArgumentCaptor.forClass(SafetyEvent.class);
- verify(mSafetyCenterManagerWrapper).setSafetySourceData(
- any(), any(), any(), captor.capture());
- assertThat(captor.getValue()).isEqualTo(EVENT_SOURCE_STATE_CHANGED);
+ verify(mSafetyCenterManagerWrapper)
+ .setSafetySourceData(any(), any(), any(), eq(EVENT_SOURCE_STATE_CHANGED));
}
@Test
@@ -429,6 +426,128 @@
Settings.CombinedBiometricSettingsActivity.class.getName());
}
+ @Test
+ public void setSafetySourceData_faceAndFingerprint_whenFaceEnrolled_setsOkStatus() {
+ when(mSafetyCenterManagerWrapper.isEnabled(mApplicationContext)).thenReturn(true);
+ when(mFingerprintManager.isHardwareDetected()).thenReturn(true);
+ when(mFaceManager.isHardwareDetected()).thenReturn(true);
+ when(mFaceManager.hasEnrolledTemplates(anyInt())).thenReturn(true);
+ when(mFingerprintManager.hasEnrolledFingerprints(anyInt())).thenReturn(false);
+
+ BiometricsSafetySource.setSafetySourceData(mApplicationContext, EVENT_SOURCE_STATE_CHANGED);
+
+ ArgumentCaptor<SafetySourceData> captor = ArgumentCaptor.forClass(SafetySourceData.class);
+ verify(mSafetyCenterManagerWrapper).setSafetySourceData(
+ any(), eq(BiometricsSafetySource.SAFETY_SOURCE_ID), captor.capture(), any());
+ SafetySourceStatus safetySourceStatus = captor.getValue().getStatus();
+ assertThat(safetySourceStatus.getStatusLevel())
+ .isEqualTo(SafetySourceStatus.STATUS_LEVEL_OK);
+ }
+
+ @Test
+ public void setSafetySourceData_faceAndFingerprint_whenFingerprintEnrolled_setsOkStatus() {
+ when(mSafetyCenterManagerWrapper.isEnabled(mApplicationContext)).thenReturn(true);
+ when(mFingerprintManager.isHardwareDetected()).thenReturn(true);
+ when(mFaceManager.isHardwareDetected()).thenReturn(true);
+ when(mFaceManager.hasEnrolledTemplates(anyInt())).thenReturn(false);
+ when(mFingerprintManager.hasEnrolledFingerprints(anyInt())).thenReturn(true);
+
+ BiometricsSafetySource.setSafetySourceData(mApplicationContext, EVENT_SOURCE_STATE_CHANGED);
+
+ ArgumentCaptor<SafetySourceData> captor = ArgumentCaptor.forClass(SafetySourceData.class);
+ verify(mSafetyCenterManagerWrapper).setSafetySourceData(
+ any(), eq(BiometricsSafetySource.SAFETY_SOURCE_ID), captor.capture(), any());
+ SafetySourceStatus safetySourceStatus = captor.getValue().getStatus();
+ assertThat(safetySourceStatus.getStatusLevel())
+ .isEqualTo(SafetySourceStatus.STATUS_LEVEL_OK);
+ }
+
+ @Test
+ public void setSafetySourceData_faceAndFingerprint_whenNotEnrolled_setsNoneStatus() {
+ when(mSafetyCenterManagerWrapper.isEnabled(mApplicationContext)).thenReturn(true);
+ when(mFingerprintManager.isHardwareDetected()).thenReturn(true);
+ when(mFaceManager.isHardwareDetected()).thenReturn(true);
+ when(mFaceManager.hasEnrolledTemplates(anyInt())).thenReturn(false);
+ when(mFingerprintManager.hasEnrolledFingerprints(anyInt())).thenReturn(false);
+
+ BiometricsSafetySource.setSafetySourceData(mApplicationContext, EVENT_SOURCE_STATE_CHANGED);
+
+ ArgumentCaptor<SafetySourceData> captor = ArgumentCaptor.forClass(SafetySourceData.class);
+ verify(mSafetyCenterManagerWrapper).setSafetySourceData(
+ any(), eq(BiometricsSafetySource.SAFETY_SOURCE_ID), captor.capture(), any());
+ SafetySourceStatus safetySourceStatus = captor.getValue().getStatus();
+ assertThat(safetySourceStatus.getStatusLevel())
+ .isEqualTo(SafetySourceStatus.STATUS_LEVEL_NONE);
+ }
+
+ @Test
+ public void setSafetySourceData_fingerprint_whenEnrolled_setsOKStatus() {
+ when(mSafetyCenterManagerWrapper.isEnabled(mApplicationContext)).thenReturn(true);
+ when(mFingerprintManager.isHardwareDetected()).thenReturn(true);
+ when(mFaceManager.isHardwareDetected()).thenReturn(false);
+ when(mFingerprintManager.hasEnrolledFingerprints(anyInt())).thenReturn(true);
+
+ BiometricsSafetySource.setSafetySourceData(mApplicationContext, EVENT_SOURCE_STATE_CHANGED);
+
+ ArgumentCaptor<SafetySourceData> captor = ArgumentCaptor.forClass(SafetySourceData.class);
+ verify(mSafetyCenterManagerWrapper).setSafetySourceData(
+ any(), eq(BiometricsSafetySource.SAFETY_SOURCE_ID), captor.capture(), any());
+ SafetySourceStatus safetySourceStatus = captor.getValue().getStatus();
+ assertThat(safetySourceStatus.getStatusLevel())
+ .isEqualTo(SafetySourceStatus.STATUS_LEVEL_OK);
+ }
+
+ @Test
+ public void setSafetySourceData_fingerprint_whenNotEnrolled_setsNoneStatus() {
+ when(mSafetyCenterManagerWrapper.isEnabled(mApplicationContext)).thenReturn(true);
+ when(mFingerprintManager.isHardwareDetected()).thenReturn(true);
+ when(mFaceManager.isHardwareDetected()).thenReturn(false);
+ when(mFingerprintManager.hasEnrolledFingerprints(anyInt())).thenReturn(false);
+
+ BiometricsSafetySource.setSafetySourceData(mApplicationContext, EVENT_SOURCE_STATE_CHANGED);
+
+ ArgumentCaptor<SafetySourceData> captor = ArgumentCaptor.forClass(SafetySourceData.class);
+ verify(mSafetyCenterManagerWrapper).setSafetySourceData(
+ any(), eq(BiometricsSafetySource.SAFETY_SOURCE_ID), captor.capture(), any());
+ SafetySourceStatus safetySourceStatus = captor.getValue().getStatus();
+ assertThat(safetySourceStatus.getStatusLevel())
+ .isEqualTo(SafetySourceStatus.STATUS_LEVEL_NONE);
+ }
+
+ @Test
+ public void setSafetySourceData_face_whenEnrolled_setsOKStatus() {
+ when(mSafetyCenterManagerWrapper.isEnabled(mApplicationContext)).thenReturn(true);
+ when(mFingerprintManager.isHardwareDetected()).thenReturn(false);
+ when(mFaceManager.isHardwareDetected()).thenReturn(true);
+ when(mFaceManager.hasEnrolledTemplates(anyInt())).thenReturn(true);
+
+ BiometricsSafetySource.setSafetySourceData(mApplicationContext, EVENT_SOURCE_STATE_CHANGED);
+
+ ArgumentCaptor<SafetySourceData> captor = ArgumentCaptor.forClass(SafetySourceData.class);
+ verify(mSafetyCenterManagerWrapper).setSafetySourceData(
+ any(), eq(BiometricsSafetySource.SAFETY_SOURCE_ID), captor.capture(), any());
+ SafetySourceStatus safetySourceStatus = captor.getValue().getStatus();
+ assertThat(safetySourceStatus.getStatusLevel())
+ .isEqualTo(SafetySourceStatus.STATUS_LEVEL_OK);
+ }
+
+ @Test
+ public void setSafetySourceData_face_whenNotEnrolled_setsNoneStatus() {
+ when(mSafetyCenterManagerWrapper.isEnabled(mApplicationContext)).thenReturn(true);
+ when(mFingerprintManager.isHardwareDetected()).thenReturn(false);
+ when(mFaceManager.isHardwareDetected()).thenReturn(true);
+ when(mFaceManager.hasEnrolledTemplates(anyInt())).thenReturn(false);
+
+ BiometricsSafetySource.setSafetySourceData(mApplicationContext, EVENT_SOURCE_STATE_CHANGED);
+
+ ArgumentCaptor<SafetySourceData> captor = ArgumentCaptor.forClass(SafetySourceData.class);
+ verify(mSafetyCenterManagerWrapper).setSafetySourceData(
+ any(), eq(BiometricsSafetySource.SAFETY_SOURCE_ID), captor.capture(), any());
+ SafetySourceStatus safetySourceStatus = captor.getValue().getStatus();
+ assertThat(safetySourceStatus.getStatusLevel())
+ .isEqualTo(SafetySourceStatus.STATUS_LEVEL_NONE);
+ }
+
private void assertSafetySourceDisabledDataSetWithSingularSummary(String expectedTitleResName,
String expectedSummaryResName) {
assertSafetySourceDisabledDataSet(
@@ -478,13 +597,16 @@
private void assertSafetySourceDisabledDataSet(String expectedTitle, String expectedSummary) {
ArgumentCaptor<SafetySourceData> captor = ArgumentCaptor.forClass(SafetySourceData.class);
verify(mSafetyCenterManagerWrapper).setSafetySourceData(
- any(), any(), captor.capture(), any());
+ any(), eq(BiometricsSafetySource.SAFETY_SOURCE_ID), captor.capture(), any());
SafetySourceData safetySourceData = captor.getValue();
SafetySourceStatus safetySourceStatus = safetySourceData.getStatus();
assertThat(safetySourceStatus.getTitle().toString()).isEqualTo(expectedTitle);
assertThat(safetySourceStatus.getSummary().toString()).isEqualTo(expectedSummary);
assertThat(safetySourceStatus.isEnabled()).isFalse();
+ assertThat(safetySourceStatus.getStatusLevel())
+ .isEqualTo(SafetySourceStatus.STATUS_LEVEL_NONE);
+
final Intent clickIntent = safetySourceStatus.getPendingIntent().getIntent();
assertThat(clickIntent).isNotNull();
assertThat(clickIntent.getAction()).isEqualTo(ACTION_SHOW_ADMIN_SUPPORT_DETAILS);
@@ -494,7 +616,7 @@
String expectedSettingsClassName) {
ArgumentCaptor<SafetySourceData> captor = ArgumentCaptor.forClass(SafetySourceData.class);
verify(mSafetyCenterManagerWrapper).setSafetySourceData(
- any(), any(), captor.capture(), any());
+ any(), eq(BiometricsSafetySource.SAFETY_SOURCE_ID), captor.capture(), any());
SafetySourceData safetySourceData = captor.getValue();
SafetySourceStatus safetySourceStatus = safetySourceData.getStatus();
@@ -509,7 +631,6 @@
.isEqualTo(expectedSettingsClassName);
}
-
private List<Fingerprint> createFingerprintList(int size) {
final List<Fingerprint> fingerprintList = new ArrayList<>(size);
for (int i = 0; i < size; i++) {