Merge "Return mapping of subscription id to unique display name."
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index c946122..2eaebb1 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -174,7 +174,8 @@
</intent-filter>
</receiver>
- <activity android:name=".SubSettings"/>
+ <activity android:name=".SubSettings"
+ android:theme="@style/Theme.SubSettings" />
<activity android:name=".Settings$CreateShortcutActivity"
android:exported="true"
diff --git a/color-check-baseline.xml b/color-check-baseline.xml
index 3ebe9b1..eac6d3c 100644
--- a/color-check-baseline.xml
+++ b/color-check-baseline.xml
@@ -2,6 +2,18 @@
<issues format="4">
<issue
+ id="LintError"
+ severity="Error"
+ message="No `.class` files were found in project ".", so none of the classfile based checks could be run. Does the project need to be built first?"
+ category="Lint"
+ priority="10"
+ summary="Lint Failure"
+ explanation="This issue type represents a problem running lint itself. Examples include failure to find bytecode for source files (which means certain detectors could not be run), parsing errors in lint configuration files, etc.
These errors are not errors in your own code, but they are shown to make it clear that some checks were not completed.">
+ <location
+ file="."/>
+ </issue>
+
+ <issue
id="HardCodedColor"
severity="Error"
message="Avoid using hardcoded color"
@@ -1033,11 +1045,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=" <color name="homepage_wallpaper_background">#E51AD1</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="res/values/colors.xml"
+ line="102"
+ 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="contextual_card_stroke_color">#1f000000</color>"
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="103"
+ line="104"
column="5"/>
</issue>
@@ -1053,7 +1081,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="109"
+ line="110"
column="5"/>
</issue>
@@ -1069,7 +1097,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="112"
+ line="113"
column="5"/>
</issue>
@@ -1085,7 +1113,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="113"
+ line="114"
column="5"/>
</issue>
@@ -1101,7 +1129,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="114"
+ line="115"
column="5"/>
</issue>
@@ -1117,7 +1145,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="115"
+ line="116"
column="5"/>
</issue>
@@ -1133,7 +1161,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="116"
+ line="117"
column="5"/>
</issue>
@@ -1149,7 +1177,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="117"
+ line="118"
column="5"/>
</issue>
@@ -1165,7 +1193,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="120"
+ line="121"
column="5"/>
</issue>
@@ -1181,7 +1209,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="121"
+ line="122"
column="5"/>
</issue>
@@ -1197,7 +1225,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="122"
+ line="123"
column="5"/>
</issue>
@@ -1213,7 +1241,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="123"
+ line="124"
column="5"/>
</issue>
@@ -1229,7 +1257,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="124"
+ line="125"
column="5"/>
</issue>
@@ -1245,7 +1273,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="127"
+ line="128"
column="5"/>
</issue>
@@ -1261,7 +1289,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="128"
+ line="129"
column="5"/>
</issue>
@@ -1277,7 +1305,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="129"
+ line="130"
column="5"/>
</issue>
@@ -1293,7 +1321,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="130"
+ line="131"
column="5"/>
</issue>
@@ -1309,7 +1337,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="131"
+ line="132"
column="5"/>
</issue>
@@ -1325,7 +1353,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="132"
+ line="133"
column="5"/>
</issue>
@@ -1341,7 +1369,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="139"
+ line="140"
column="5"/>
</issue>
@@ -1357,7 +1385,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="140"
+ line="141"
column="5"/>
</issue>
@@ -1373,7 +1401,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="141"
+ line="142"
column="5"/>
</issue>
@@ -1389,7 +1417,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="150"
+ line="151"
column="5"/>
</issue>
@@ -1405,7 +1433,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="152"
+ line="153"
column="5"/>
</issue>
@@ -1421,7 +1449,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="156"
+ line="157"
column="5"/>
</issue>
@@ -1437,7 +1465,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="157"
+ line="158"
column="5"/>
</issue>
@@ -1453,7 +1481,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="158"
+ line="159"
column="5"/>
</issue>
@@ -1469,7 +1497,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="159"
+ line="160"
column="5"/>
</issue>
@@ -1485,7 +1513,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="160"
+ line="161"
column="5"/>
</issue>
@@ -1501,7 +1529,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="161"
+ line="162"
column="5"/>
</issue>
@@ -1517,7 +1545,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="162"
+ line="163"
column="5"/>
</issue>
@@ -1533,7 +1561,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="163"
+ line="164"
column="5"/>
</issue>
@@ -1549,7 +1577,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="166"
+ line="167"
column="5"/>
</issue>
@@ -1565,7 +1593,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="167"
+ line="168"
column="5"/>
</issue>
@@ -1581,7 +1609,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="168"
+ line="169"
column="5"/>
</issue>
@@ -1597,7 +1625,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="169"
+ line="170"
column="5"/>
</issue>
@@ -1613,7 +1641,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="170"
+ line="171"
column="5"/>
</issue>
@@ -1629,7 +1657,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="171"
+ line="172"
column="5"/>
</issue>
@@ -1645,7 +1673,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="172"
+ line="173"
column="5"/>
</issue>
@@ -1661,7 +1689,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="173"
+ line="174"
column="5"/>
</issue>
@@ -1677,7 +1705,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="176"
+ line="177"
column="5"/>
</issue>
@@ -1693,7 +1721,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="177"
+ line="178"
column="5"/>
</issue>
@@ -1709,7 +1737,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="178"
+ line="179"
column="5"/>
</issue>
@@ -1725,7 +1753,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="179"
+ line="180"
column="5"/>
</issue>
@@ -1741,7 +1769,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="180"
+ line="181"
column="5"/>
</issue>
@@ -1757,7 +1785,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="181"
+ line="182"
column="5"/>
</issue>
@@ -1773,7 +1801,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="184"
+ line="185"
column="5"/>
</issue>
@@ -1789,7 +1817,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="185"
+ line="186"
column="5"/>
</issue>
@@ -1805,7 +1833,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="186"
+ line="187"
column="5"/>
</issue>
@@ -1821,7 +1849,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="187"
+ line="188"
column="5"/>
</issue>
@@ -1837,7 +1865,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="188"
+ line="189"
column="5"/>
</issue>
@@ -1853,7 +1881,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="189"
+ line="190"
column="5"/>
</issue>
@@ -2265,6 +2293,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/homepage_about_background" />"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="res/drawable/ic_homepage_about_v2.xml"
+ line="24"
+ 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/homepage_accessibility_background" />"
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
@@ -2297,6 +2341,38 @@
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/homepage_accessibility_background" />"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="res/drawable/ic_homepage_accessibility_v2.xml"
+ line="24"
+ 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/homepage_accessibility_background" />"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="res/drawable/ic_homepage_accessibility_v2.xml"
+ line="24"
+ 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/homepage_accounts_background" />"
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
@@ -2313,6 +2389,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/homepage_accounts_background" />"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="res/drawable/ic_homepage_accounts_v2.xml"
+ line="24"
+ 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/homepage_app_and_notification_background" />"
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
@@ -2329,6 +2421,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/homepage_app_and_notification_background" />"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="res/drawable/ic_homepage_apps_v2.xml"
+ line="24"
+ 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/homepage_battery_background" />"
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
@@ -2345,6 +2453,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/homepage_battery_background" />"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="res/drawable/ic_homepage_battery_v2.xml"
+ line="24"
+ 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/homepage_connected_device_background" />"
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
@@ -2361,6 +2485,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/homepage_connected_device_background" />"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="res/drawable/ic_homepage_connected_device_v2.xml"
+ line="24"
+ 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/homepage_display_background" />"
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
@@ -2377,6 +2517,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/homepage_display_background" />"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="res/drawable/ic_homepage_display_v2.xml"
+ line="24"
+ 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/homepage_emergency_background" />"
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
@@ -2393,6 +2549,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/homepage_emergency_background" />"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="res/drawable/ic_homepage_emergency_v2.xml"
+ line="24"
+ 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/homepage_location_background" />"
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
@@ -2409,6 +2581,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/homepage_location_background" />"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="res/drawable/ic_homepage_location_v2.xml"
+ line="24"
+ 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/homepage_network_background" />"
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
@@ -2425,6 +2613,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/homepage_network_background" />"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="res/drawable/ic_homepage_network_v2.xml"
+ line="24"
+ 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/homepage_generic_icon_background" />"
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
@@ -2457,6 +2661,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/homepage_generic_icon_background" />"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="res/drawable/ic_homepage_notification_v2.xml"
+ line="24"
+ 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/homepage_privacy_background" />"
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
@@ -2473,6 +2693,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/homepage_privacy_background" />"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="res/drawable/ic_homepage_privacy_v2.xml"
+ line="24"
+ 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/homepage_security_background" />"
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
@@ -2489,6 +2725,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/homepage_security_background" />"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="res/drawable/ic_homepage_security_v2.xml"
+ line="24"
+ 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/homepage_sound_background" />"
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
@@ -2505,6 +2757,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/homepage_sound_background" />"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="res/drawable/ic_homepage_sound_v2.xml"
+ line="24"
+ 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/homepage_storage_background" />"
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
@@ -2521,6 +2789,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/homepage_storage_background" />"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="res/drawable/ic_homepage_storage_v2.xml"
+ line="24"
+ 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/homepage_support_background" />"
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
@@ -2553,6 +2837,38 @@
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/homepage_support_background" />"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="res/drawable/ic_homepage_support_v2.xml"
+ line="24"
+ 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/homepage_support_background" />"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="res/drawable/ic_homepage_support_v2.xml"
+ line="24"
+ 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/homepage_system_background" />"
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
@@ -2569,6 +2885,54 @@
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/homepage_system_background" />"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="res/drawable/ic_homepage_system_dashboard_v2.xml"
+ line="24"
+ 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/homepage_wallpaper_background" />"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="res/drawable/ic_homepage_wallpaper.xml"
+ line="24"
+ 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/homepage_wallpaper_background" />"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="res/drawable/ic_homepage_wallpaper_v2.xml"
+ line="24"
+ 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/notification_block_color"/>"
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
@@ -2925,7 +3289,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/layout/screen_zoom_preview_1.xml"
- line="44"
+ line="45"
column="17"/>
</issue>
@@ -2941,7 +3305,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/layout/screen_zoom_preview_1.xml"
- line="45"
+ line="46"
column="17"/>
</issue>
@@ -2957,7 +3321,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/layout/screen_zoom_preview_1.xml"
- line="54"
+ line="55"
column="17"/>
</issue>
@@ -2973,7 +3337,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/layout/screen_zoom_preview_1.xml"
- line="55"
+ line="56"
column="17"/>
</issue>
@@ -2989,7 +3353,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/layout/screen_zoom_preview_1.xml"
- line="64"
+ line="65"
column="17"/>
</issue>
@@ -3005,7 +3369,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/layout/screen_zoom_preview_1.xml"
- line="65"
+ line="66"
column="17"/>
</issue>
@@ -3021,7 +3385,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/layout/screen_zoom_preview_1.xml"
- line="74"
+ line="75"
column="17"/>
</issue>
@@ -3037,7 +3401,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/layout/screen_zoom_preview_1.xml"
- line="75"
+ line="76"
column="17"/>
</issue>
@@ -3097,11 +3461,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="2815"
+ 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="2818"
+ line="2816"
column="64"/>
</issue>
@@ -3117,7 +3497,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~">
<location
file="res/values-en-rCA/strings.xml"
- line="2818"
+ line="2816"
column="64"/>
</issue>
@@ -3133,7 +3513,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~">
<location
file="res/values-en-rGB/strings.xml"
- line="2818"
+ line="2816"
column="64"/>
</issue>
@@ -3149,7 +3529,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~">
<location
file="res/values-en-rIN/strings.xml"
- line="2818"
+ line="2816"
column="64"/>
</issue>
@@ -3161,27 +3541,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="2818"
- 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="6537"
+ line="6533"
column="36"/>
</issue>
@@ -3213,7 +3577,7 @@
errorLine2=" ^">
<location
file="res/values/styles.xml"
- line="428"
+ line="434"
column="44"/>
</issue>
@@ -3229,7 +3593,7 @@
errorLine2=" ^">
<location
file="res/values/styles.xml"
- line="434"
+ line="440"
column="44"/>
</issue>
@@ -3245,7 +3609,7 @@
errorLine2=" ^">
<location
file="res/values/styles.xml"
- line="435"
+ line="441"
column="44"/>
</issue>
@@ -3261,7 +3625,7 @@
errorLine2=" ^">
<location
file="res/values/styles.xml"
- line="471"
+ line="477"
column="34"/>
</issue>
diff --git a/res/drawable/ic_homepage_about_v2.xml b/res/drawable/ic_homepage_about_v2.xml
new file mode 100644
index 0000000..c069bfc
--- /dev/null
+++ b/res/drawable/ic_homepage_about_v2.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2018 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.
+ -->
+
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+
+ <item>
+ <com.android.settingslib.widget.AdaptiveIconShapeDrawable
+ android:width="@dimen/homepage_image_size"
+ android:height="@dimen/homepage_image_size"
+ android:color="@color/homepage_about_background" />
+ </item>
+
+ <item
+ android:width="@dimen/dashboard_tile_foreground_image_size"
+ android:height="@dimen/dashboard_tile_foreground_image_size"
+ android:start="@dimen/homepage_foreground_image_inset"
+ android:top="@dimen/homepage_foreground_image_inset"
+ android:drawable="@drawable/ic_phone_info" />
+</layer-list>
diff --git a/res/drawable/ic_homepage_accessibility_v2.xml b/res/drawable/ic_homepage_accessibility_v2.xml
new file mode 100644
index 0000000..24ca8cf
--- /dev/null
+++ b/res/drawable/ic_homepage_accessibility_v2.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2018 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.
+ -->
+
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+
+ <item>
+ <com.android.settingslib.widget.AdaptiveIconShapeDrawable
+ android:width="@dimen/homepage_image_size"
+ android:height="@dimen/homepage_image_size"
+ android:color="@color/homepage_accessibility_background" />
+ </item>
+
+ <item
+ android:width="@dimen/dashboard_tile_foreground_image_size"
+ android:height="@dimen/dashboard_tile_foreground_image_size"
+ android:start="@dimen/homepage_foreground_image_inset"
+ android:top="@dimen/homepage_foreground_image_inset"
+ android:drawable="@drawable/ic_settings_accessibility" />
+</layer-list>
diff --git a/res/drawable/ic_homepage_accounts_v2.xml b/res/drawable/ic_homepage_accounts_v2.xml
new file mode 100644
index 0000000..6ea981f
--- /dev/null
+++ b/res/drawable/ic_homepage_accounts_v2.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2018 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.
+ -->
+
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+
+ <item>
+ <com.android.settingslib.widget.AdaptiveIconShapeDrawable
+ android:width="@dimen/homepage_image_size"
+ android:height="@dimen/homepage_image_size"
+ android:color="@color/homepage_accounts_background" />
+ </item>
+
+ <item
+ android:width="@dimen/dashboard_tile_foreground_image_size"
+ android:height="@dimen/dashboard_tile_foreground_image_size"
+ android:start="@dimen/homepage_foreground_image_inset"
+ android:top="@dimen/homepage_foreground_image_inset"
+ android:drawable="@drawable/ic_settings_accounts" />
+</layer-list>
diff --git a/res/drawable/ic_homepage_apps_v2.xml b/res/drawable/ic_homepage_apps_v2.xml
new file mode 100644
index 0000000..c6ac0c4
--- /dev/null
+++ b/res/drawable/ic_homepage_apps_v2.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2018 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.
+ -->
+
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+
+ <item>
+ <com.android.settingslib.widget.AdaptiveIconShapeDrawable
+ android:width="@dimen/homepage_image_size"
+ android:height="@dimen/homepage_image_size"
+ android:color="@color/homepage_app_and_notification_background" />
+ </item>
+
+ <item
+ android:width="@dimen/dashboard_tile_foreground_image_size"
+ android:height="@dimen/dashboard_tile_foreground_image_size"
+ android:start="@dimen/homepage_foreground_image_inset"
+ android:top="@dimen/homepage_foreground_image_inset"
+ android:drawable="@drawable/ic_apps" />
+</layer-list>
diff --git a/res/drawable/ic_homepage_battery_v2.xml b/res/drawable/ic_homepage_battery_v2.xml
new file mode 100644
index 0000000..680031f
--- /dev/null
+++ b/res/drawable/ic_homepage_battery_v2.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2018 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.
+ -->
+
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+
+ <item>
+ <com.android.settingslib.widget.AdaptiveIconShapeDrawable
+ android:width="@dimen/homepage_image_size"
+ android:height="@dimen/homepage_image_size"
+ android:color="@color/homepage_battery_background" />
+ </item>
+
+ <item
+ android:width="@dimen/dashboard_tile_foreground_image_size"
+ android:height="@dimen/dashboard_tile_foreground_image_size"
+ android:start="@dimen/homepage_foreground_image_inset"
+ android:top="@dimen/homepage_foreground_image_inset"
+ android:drawable="@drawable/ic_settings_battery_white" />
+</layer-list>
diff --git a/res/drawable/ic_homepage_connected_device_v2.xml b/res/drawable/ic_homepage_connected_device_v2.xml
new file mode 100644
index 0000000..f3e95d2
--- /dev/null
+++ b/res/drawable/ic_homepage_connected_device_v2.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2018 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.
+ -->
+
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+
+ <item>
+ <com.android.settingslib.widget.AdaptiveIconShapeDrawable
+ android:width="@dimen/homepage_image_size"
+ android:height="@dimen/homepage_image_size"
+ android:color="@color/homepage_connected_device_background" />
+ </item>
+
+ <item
+ android:width="@dimen/dashboard_tile_foreground_image_size"
+ android:height="@dimen/dashboard_tile_foreground_image_size"
+ android:start="@dimen/homepage_foreground_image_inset"
+ android:top="@dimen/homepage_foreground_image_inset"
+ android:drawable="@drawable/ic_devices_other" />
+</layer-list>
diff --git a/res/drawable/ic_homepage_display_v2.xml b/res/drawable/ic_homepage_display_v2.xml
new file mode 100644
index 0000000..e4014ee
--- /dev/null
+++ b/res/drawable/ic_homepage_display_v2.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2018 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.
+ -->
+
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+
+ <item>
+ <com.android.settingslib.widget.AdaptiveIconShapeDrawable
+ android:width="@dimen/homepage_image_size"
+ android:height="@dimen/homepage_image_size"
+ android:color="@color/homepage_display_background" />
+ </item>
+
+ <item
+ android:width="@dimen/dashboard_tile_foreground_image_size"
+ android:height="@dimen/dashboard_tile_foreground_image_size"
+ android:start="@dimen/homepage_foreground_image_inset"
+ android:top="@dimen/homepage_foreground_image_inset"
+ android:drawable="@drawable/ic_settings_display_white" />
+</layer-list>
diff --git a/res/drawable/ic_homepage_emergency_v2.xml b/res/drawable/ic_homepage_emergency_v2.xml
new file mode 100644
index 0000000..86d1470
--- /dev/null
+++ b/res/drawable/ic_homepage_emergency_v2.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2021 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+
+ <item>
+ <com.android.settingslib.widget.AdaptiveIconShapeDrawable
+ android:width="@dimen/homepage_image_size"
+ android:height="@dimen/homepage_image_size"
+ android:color="@color/homepage_emergency_background" />
+ </item>
+
+ <item
+ android:width="@dimen/dashboard_tile_foreground_image_size"
+ android:height="@dimen/dashboard_tile_foreground_image_size"
+ android:start="@dimen/homepage_foreground_image_inset"
+ android:top="@dimen/homepage_foreground_image_inset"
+ android:drawable="@drawable/ic_settings_emergency" />
+</layer-list>
diff --git a/res/drawable/ic_homepage_location_v2.xml b/res/drawable/ic_homepage_location_v2.xml
new file mode 100644
index 0000000..5dc72eb
--- /dev/null
+++ b/res/drawable/ic_homepage_location_v2.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2018 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.
+ -->
+
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+
+ <item>
+ <com.android.settingslib.widget.AdaptiveIconShapeDrawable
+ android:width="@dimen/homepage_image_size"
+ android:height="@dimen/homepage_image_size"
+ android:color="@color/homepage_location_background" />
+ </item>
+
+ <item
+ android:width="@dimen/dashboard_tile_foreground_image_size"
+ android:height="@dimen/dashboard_tile_foreground_image_size"
+ android:start="@dimen/homepage_foreground_image_inset"
+ android:top="@dimen/homepage_foreground_image_inset"
+ android:drawable="@drawable/ic_settings_location"/>
+</layer-list>
diff --git a/res/drawable/ic_homepage_network_v2.xml b/res/drawable/ic_homepage_network_v2.xml
new file mode 100644
index 0000000..d3b33e9
--- /dev/null
+++ b/res/drawable/ic_homepage_network_v2.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2018 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.
+ -->
+
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+
+ <item>
+ <com.android.settingslib.widget.AdaptiveIconShapeDrawable
+ android:width="@dimen/homepage_image_size"
+ android:height="@dimen/homepage_image_size"
+ android:color="@color/homepage_network_background" />
+ </item>
+
+ <item
+ android:width="@dimen/dashboard_tile_foreground_image_size"
+ android:height="@dimen/dashboard_tile_foreground_image_size"
+ android:start="@dimen/homepage_foreground_image_inset"
+ android:top="@dimen/homepage_foreground_image_inset"
+ android:drawable="@drawable/ic_settings_wireless_white" />
+</layer-list>
diff --git a/res/drawable/ic_homepage_notification_v2.xml b/res/drawable/ic_homepage_notification_v2.xml
new file mode 100644
index 0000000..9b57456
--- /dev/null
+++ b/res/drawable/ic_homepage_notification_v2.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2020 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+
+ <item>
+ <com.android.settingslib.widget.AdaptiveIconShapeDrawable
+ android:width="@dimen/homepage_image_size"
+ android:height="@dimen/homepage_image_size"
+ android:color="@color/homepage_generic_icon_background" />
+ </item>
+
+ <item
+ android:width="@dimen/dashboard_tile_foreground_image_size"
+ android:height="@dimen/dashboard_tile_foreground_image_size"
+ android:start="@dimen/homepage_foreground_image_inset"
+ android:top="@dimen/homepage_foreground_image_inset"
+ android:drawable="@drawable/ic_notifications_white" />
+</layer-list>
diff --git a/res/drawable/ic_homepage_privacy_v2.xml b/res/drawable/ic_homepage_privacy_v2.xml
new file mode 100644
index 0000000..56e6da8
--- /dev/null
+++ b/res/drawable/ic_homepage_privacy_v2.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2018 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.
+ -->
+
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+
+ <item>
+ <com.android.settingslib.widget.AdaptiveIconShapeDrawable
+ android:width="@dimen/homepage_image_size"
+ android:height="@dimen/homepage_image_size"
+ android:color="@color/homepage_privacy_background" />
+ </item>
+
+ <item
+ android:width="@dimen/dashboard_tile_foreground_image_size"
+ android:height="@dimen/dashboard_tile_foreground_image_size"
+ android:start="@dimen/homepage_foreground_image_inset"
+ android:top="@dimen/homepage_foreground_image_inset"
+ android:drawable="@drawable/ic_settings_privacy"/>
+</layer-list>
diff --git a/res/drawable/ic_homepage_security_v2.xml b/res/drawable/ic_homepage_security_v2.xml
new file mode 100644
index 0000000..5e33add
--- /dev/null
+++ b/res/drawable/ic_homepage_security_v2.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2018 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.
+ -->
+
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+
+ <item>
+ <com.android.settingslib.widget.AdaptiveIconShapeDrawable
+ android:width="@dimen/homepage_image_size"
+ android:height="@dimen/homepage_image_size"
+ android:color="@color/homepage_security_background" />
+ </item>
+
+ <item
+ android:width="@dimen/dashboard_tile_foreground_image_size"
+ android:height="@dimen/dashboard_tile_foreground_image_size"
+ android:start="@dimen/homepage_foreground_image_inset"
+ android:top="@dimen/homepage_foreground_image_inset"
+ android:drawable="@drawable/ic_settings_security_white" />
+</layer-list>
diff --git a/res/drawable/ic_homepage_sound_v2.xml b/res/drawable/ic_homepage_sound_v2.xml
new file mode 100644
index 0000000..8561820
--- /dev/null
+++ b/res/drawable/ic_homepage_sound_v2.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2018 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.
+ -->
+
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+
+ <item>
+ <com.android.settingslib.widget.AdaptiveIconShapeDrawable
+ android:width="@dimen/homepage_image_size"
+ android:height="@dimen/homepage_image_size"
+ android:color="@color/homepage_sound_background" />
+ </item>
+
+ <item
+ android:width="@dimen/dashboard_tile_foreground_image_size"
+ android:height="@dimen/dashboard_tile_foreground_image_size"
+ android:start="@dimen/homepage_foreground_image_inset"
+ android:top="@dimen/homepage_foreground_image_inset"
+ android:drawable="@drawable/ic_volume_up_24dp" />
+</layer-list>
diff --git a/res/drawable/ic_homepage_storage_v2.xml b/res/drawable/ic_homepage_storage_v2.xml
new file mode 100644
index 0000000..1a8b7d2
--- /dev/null
+++ b/res/drawable/ic_homepage_storage_v2.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2018 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.
+ -->
+
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+
+ <item>
+ <com.android.settingslib.widget.AdaptiveIconShapeDrawable
+ android:width="@dimen/homepage_image_size"
+ android:height="@dimen/homepage_image_size"
+ android:color="@color/homepage_storage_background" />
+ </item>
+
+ <item
+ android:width="@dimen/dashboard_tile_foreground_image_size"
+ android:height="@dimen/dashboard_tile_foreground_image_size"
+ android:start="@dimen/homepage_foreground_image_inset"
+ android:top="@dimen/homepage_foreground_image_inset"
+ android:drawable="@drawable/ic_storage_white" />
+</layer-list>
diff --git a/res/drawable/ic_homepage_support_v2.xml b/res/drawable/ic_homepage_support_v2.xml
new file mode 100644
index 0000000..8139973
--- /dev/null
+++ b/res/drawable/ic_homepage_support_v2.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2018 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.
+ -->
+
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+
+ <item>
+ <com.android.settingslib.widget.AdaptiveIconShapeDrawable
+ android:width="@dimen/homepage_image_size"
+ android:height="@dimen/homepage_image_size"
+ android:color="@color/homepage_support_background" />
+ </item>
+
+ <item
+ android:width="@dimen/dashboard_tile_foreground_image_size"
+ android:height="@dimen/dashboard_tile_foreground_image_size"
+ android:start="@dimen/homepage_foreground_image_inset"
+ android:top="@dimen/homepage_foreground_image_inset"
+ android:drawable="@drawable/ic_help" />
+</layer-list>
diff --git a/res/drawable/ic_homepage_system_dashboard_v2.xml b/res/drawable/ic_homepage_system_dashboard_v2.xml
new file mode 100644
index 0000000..7c016a2
--- /dev/null
+++ b/res/drawable/ic_homepage_system_dashboard_v2.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2018 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.
+ -->
+
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+
+ <item>
+ <com.android.settingslib.widget.AdaptiveIconShapeDrawable
+ android:width="@dimen/homepage_image_size"
+ android:height="@dimen/homepage_image_size"
+ android:color="@color/homepage_system_background" />
+ </item>
+
+ <item
+ android:width="@dimen/dashboard_tile_foreground_image_size"
+ android:height="@dimen/dashboard_tile_foreground_image_size"
+ android:start="@dimen/homepage_foreground_image_inset"
+ android:top="@dimen/homepage_foreground_image_inset"
+ android:drawable="@drawable/ic_settings_system_dashboard_white" />
+</layer-list>
diff --git a/res/drawable/ic_homepage_wallpaper.xml b/res/drawable/ic_homepage_wallpaper.xml
new file mode 100644
index 0000000..0f91465
--- /dev/null
+++ b/res/drawable/ic_homepage_wallpaper.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2021 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+
+ <item>
+ <com.android.settingslib.widget.AdaptiveIconShapeDrawable
+ android:width="@dimen/dashboard_tile_image_size"
+ android:height="@dimen/dashboard_tile_image_size"
+ android:color="@color/homepage_wallpaper_background" />
+ </item>
+
+ <item
+ android:width="@dimen/dashboard_tile_foreground_image_size"
+ android:height="@dimen/dashboard_tile_foreground_image_size"
+ android:start="@dimen/dashboard_tile_foreground_image_inset"
+ android:top="@dimen/dashboard_tile_foreground_image_inset"
+ android:drawable="@drawable/ic_settings_wallpaper_white" />
+</layer-list>
diff --git a/res/drawable/ic_homepage_wallpaper_v2.xml b/res/drawable/ic_homepage_wallpaper_v2.xml
new file mode 100644
index 0000000..ee16339
--- /dev/null
+++ b/res/drawable/ic_homepage_wallpaper_v2.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2021 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+
+ <item>
+ <com.android.settingslib.widget.AdaptiveIconShapeDrawable
+ android:width="@dimen/homepage_image_size"
+ android:height="@dimen/homepage_image_size"
+ android:color="@color/homepage_wallpaper_background" />
+ </item>
+
+ <item
+ android:width="@dimen/dashboard_tile_foreground_image_size"
+ android:height="@dimen/dashboard_tile_foreground_image_size"
+ android:start="@dimen/homepage_foreground_image_inset"
+ android:top="@dimen/homepage_foreground_image_inset"
+ android:drawable="@drawable/ic_settings_wallpaper_white" />
+</layer-list>
diff --git a/res/drawable/ic_settings_wallpaper_white.xml b/res/drawable/ic_settings_wallpaper_white.xml
new file mode 100644
index 0000000..8591fb5
--- /dev/null
+++ b/res/drawable/ic_settings_wallpaper_white.xml
@@ -0,0 +1,25 @@
+<!--
+ Copyright (C) 2021 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="24.0dp"
+ android:height="24.0dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="?android:attr/colorPrimary"
+ android:fillType="evenOdd"
+ android:pathData="M11,5H5V11H3V5C3,3.9 3.9,3 5,3H11V5ZM11.14,15.29L9,12.71L6,16.57H18L14.14,11.42L11.14,15.29ZM19,13V19H13V21H19C20.1,21 21,20.1 21,19V13H19ZM5,13V19H11V21H5C3.9,21 3,20.1 3,19V13H5ZM19,5V11H21V5C21,3.9 20.1,3 19,3H13V5H19ZM17,8C17,8.55 16.55,9 16,9C15.45,9 15,8.55 15,8C15,7.45 15.45,7 16,7C16.55,7 17,7.45 17,8Z"/>
+</vector>
diff --git a/res/layout-sw300dp-land/font_size_activity.xml b/res/layout-sw300dp-land/font_size_activity.xml
index 6664704..7703eb2 100644
--- a/res/layout-sw300dp-land/font_size_activity.xml
+++ b/res/layout-sw300dp-land/font_size_activity.xml
@@ -36,7 +36,7 @@
android:padding="6dp" />
</LinearLayout>
- <ScrollView
+ <androidx.core.widget.NestedScrollView
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="match_parent"
@@ -104,5 +104,5 @@
android:layout_marginBottom="16dp"
android:textAppearance="@*android:style/TextAppearance.DeviceDefault.Subhead" />
</LinearLayout>
- </ScrollView>
+ </androidx.core.widget.NestedScrollView>
</LinearLayout>
diff --git a/res/layout-sw300dp-land/screen_zoom_activity.xml b/res/layout-sw300dp-land/screen_zoom_activity.xml
index 0f1c000..1cdb5b4 100644
--- a/res/layout-sw300dp-land/screen_zoom_activity.xml
+++ b/res/layout-sw300dp-land/screen_zoom_activity.xml
@@ -38,7 +38,7 @@
android:padding="6dp" />
</LinearLayout>
- <ScrollView
+ <androidx.core.widget.NestedScrollView
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="match_parent"
@@ -106,5 +106,5 @@
android:layout_marginBottom="16dp"
android:textAppearance="@*android:style/TextAppearance.DeviceDefault.Subhead" />
</LinearLayout>
- </ScrollView>
+ </androidx.core.widget.NestedScrollView>
</LinearLayout>
diff --git a/res/layout/emergency_gesture_switch_bar.xml b/res/layout/emergency_gesture_switch_bar.xml
deleted file mode 100644
index 2524601..0000000
--- a/res/layout/emergency_gesture_switch_bar.xml
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- ~ Copyright (C) 2020 The Android Open Source Project
- ~
- ~ Licensed under the Apache License, Version 2.0 (the "License");
- ~ you may not use this file except in compliance with the License.
- ~ You may obtain a copy of the License at
- ~
- ~ http://www.apache.org/licenses/LICENSE-2.0
- ~
- ~ Unless required by applicable law or agreed to in writing, software
- ~ distributed under the License is distributed on an "AS IS" BASIS,
- ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ~ See the License for the specific language governing permissions and
- ~ limitations under the License.
- -->
-
-<!-- For use in a LayoutPreference -->
-<LinearLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_height="wrap_content"
- android:layout_width="match_parent"
- android:orientation="vertical"
- android:importantForAccessibility="no">
-
- <com.android.settings.widget.SwitchBar
- android:id="@+id/switch_bar"
- android:minHeight="?android:attr/actionBarSize"
- android:layout_height="wrap_content"
- android:layout_width="match_parent"
- android:paddingStart="0dp"
- android:theme="?attr/switchBarTheme"/>
- <TextView
- android:layout_height="wrap_content"
- android:layout_width="match_parent"
- android:layout_marginStart="@dimen/actionbar_subsettings_contentInsetStart"
- android:layout_marginVertical="16dp"
- android:text="@string/emergency_gesture_screen_summary"/>
-</LinearLayout>
\ No newline at end of file
diff --git a/res/layout/font_size_activity.xml b/res/layout/font_size_activity.xml
index 32de37d..c3b26ae 100644
--- a/res/layout/font_size_activity.xml
+++ b/res/layout/font_size_activity.xml
@@ -14,17 +14,18 @@
limitations under the License.
-->
-<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:fillViewport="true">
+<androidx.core.widget.NestedScrollView
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:fillViewport="true">
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
- android:layout_height="wrap_content" >
+ android:layout_height="wrap_content">
- <include layout="@layout/preview_seek_bar_view_pager" />
+ <include layout="@layout/preview_seek_bar_view_pager"/>
<LinearLayout
android:orientation="vertical"
@@ -40,7 +41,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
- android:padding="6dp" />
+ android:padding="6dp"/>
<TextView
android:id="@+id/current_label"
@@ -49,7 +50,7 @@
android:layout_gravity="center_horizontal"
android:padding="6dp"
android:textAppearance="@android:style/TextAppearance.DeviceDefault.Widget.TextView"
- android:elevation="2dp" />
+ android:elevation="2dp"/>
<LinearLayout
android:layout_width="match_parent"
@@ -68,7 +69,7 @@
android:tintMode="src_in"
android:scaleType="center"
android:focusable="true"
- android:contentDescription="@string/font_size_make_smaller_desc" />
+ android:contentDescription="@string/font_size_make_smaller_desc"/>
<com.android.settings.widget.LabeledSeekBar
android:id="@+id/seek_bar"
@@ -87,7 +88,7 @@
android:tintMode="src_in"
android:scaleType="center"
android:focusable="true"
- android:contentDescription="@string/font_size_make_larger_desc" />
+ android:contentDescription="@string/font_size_make_larger_desc"/>
</LinearLayout>
<TextView
@@ -95,7 +96,7 @@
android:layout_height="wrap_content"
android:text="@string/font_size_summary"
android:layout_marginBottom="16dp"
- android:textAppearance="@*android:style/TextAppearance.DeviceDefault.Subhead" />
+ android:textAppearance="@*android:style/TextAppearance.DeviceDefault.Subhead"/>
</LinearLayout>
</LinearLayout>
-</ScrollView>
+</androidx.core.widget.NestedScrollView>
diff --git a/res/layout/font_size_preview.xml b/res/layout/font_size_preview.xml
index 669ece0..2b1773b 100644
--- a/res/layout/font_size_preview.xml
+++ b/res/layout/font_size_preview.xml
@@ -14,7 +14,8 @@
limitations under the License.
-->
-<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
+<androidx.core.widget.NestedScrollView
+ xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fillViewport="true" >
@@ -57,4 +58,4 @@
android:textAppearance="@*android:style/TextAppearance.DeviceDefault.Body1"/>
</LinearLayout>
</view>
-</ScrollView>
+</androidx.core.widget.NestedScrollView>
diff --git a/res/layout/homepage_preference.xml b/res/layout/homepage_preference.xml
new file mode 100644
index 0000000..c08a74f
--- /dev/null
+++ b/res/layout/homepage_preference.xml
@@ -0,0 +1,65 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2021 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<LinearLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:minHeight="72dp"
+ android:gravity="center_vertical"
+ android:paddingStart="24dp"
+ android:paddingEnd="24dp"
+ android:background="?android:attr/selectableItemBackground"
+ android:clipToPadding="false"
+ android:baselineAligned="false">
+
+ <LinearLayout
+ android:id="@+id/icon_frame"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:gravity="start|center_vertical"
+ android:orientation="horizontal"
+ android:paddingTop="4dp"
+ android:paddingBottom="4dp"
+ android:layout_marginEnd="16dp">
+
+ <androidx.preference.internal.PreferenceImageView
+ android:id="@android:id/icon"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ app:maxWidth="48dp"
+ app:maxHeight="48dp"/>
+
+ </LinearLayout>
+
+ <RelativeLayout
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:paddingTop="16dp"
+ android:paddingBottom="16dp">
+
+ <TextView
+ android:id="@android:id/title"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:singleLine="true"
+ android:textAppearance="@style/TextAppearance.HomepagePreferenceTitle"
+ android:ellipsize="marquee"/>
+ </RelativeLayout>
+</LinearLayout>
\ No newline at end of file
diff --git a/res/layout/preview_seek_bar_view_pager.xml b/res/layout/preview_seek_bar_view_pager.xml
index 12f2611..6ddff13 100644
--- a/res/layout/preview_seek_bar_view_pager.xml
+++ b/res/layout/preview_seek_bar_view_pager.xml
@@ -25,7 +25,7 @@
<androidx.viewpager.widget.ViewPager
android:id="@+id/preview_pager"
android:layout_width="match_parent"
- android:layout_height="100dp"
+ android:layout_height="400dp"
android:layout_weight="1"
android:background="?android:attr/colorBackgroundFloating"
android:contentDescription="@string/preview_pager_content_description" />
diff --git a/res/layout/screen_zoom_activity.xml b/res/layout/screen_zoom_activity.xml
index 4cfa7b6..00831fb 100644
--- a/res/layout/screen_zoom_activity.xml
+++ b/res/layout/screen_zoom_activity.xml
@@ -14,17 +14,18 @@
limitations under the License.
-->
-<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:fillViewport="true">
+<androidx.core.widget.NestedScrollView
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:fillViewport="true">
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
- android:layout_height="wrap_content" >
+ android:layout_height="wrap_content">
- <include layout="@layout/preview_seek_bar_view_pager" />
+ <include layout="@layout/preview_seek_bar_view_pager"/>
<LinearLayout
android:orientation="vertical"
@@ -40,7 +41,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
- android:padding="6dp" />
+ android:padding="6dp"/>
<TextView
android:id="@+id/current_label"
@@ -49,7 +50,7 @@
android:layout_gravity="center_horizontal"
android:padding="6dp"
android:textAppearance="@android:style/TextAppearance.DeviceDefault.Widget.TextView"
- android:elevation="2dp" />
+ android:elevation="2dp"/>
<LinearLayout
android:layout_width="match_parent"
@@ -66,7 +67,7 @@
android:tintMode="src_in"
android:scaleType="center"
android:focusable="true"
- android:contentDescription="@string/screen_zoom_make_smaller_desc" />
+ android:contentDescription="@string/screen_zoom_make_smaller_desc"/>
<com.android.settings.widget.LabeledSeekBar
android:id="@+id/seek_bar"
@@ -85,7 +86,7 @@
android:tintMode="src_in"
android:scaleType="center"
android:focusable="true"
- android:contentDescription="@string/screen_zoom_make_larger_desc" />
+ android:contentDescription="@string/screen_zoom_make_larger_desc"/>
</LinearLayout>
<TextView
@@ -93,7 +94,7 @@
android:layout_height="wrap_content"
android:text="@string/screen_zoom_summary"
android:layout_marginBottom="16dp"
- android:textAppearance="@*android:style/TextAppearance.DeviceDefault.Subhead" />
+ android:textAppearance="@*android:style/TextAppearance.DeviceDefault.Subhead"/>
</LinearLayout>
</LinearLayout>
-</ScrollView>
+</androidx.core.widget.NestedScrollView>
diff --git a/res/layout/screen_zoom_preview_1.xml b/res/layout/screen_zoom_preview_1.xml
index 65d27ee..9290df9 100644
--- a/res/layout/screen_zoom_preview_1.xml
+++ b/res/layout/screen_zoom_preview_1.xml
@@ -13,7 +13,8 @@
See the License for the specific language governing permissions and
limitations under the License.
-->
-<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
+<androidx.core.widget.NestedScrollView
+ xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
@@ -75,4 +76,4 @@
app:iconBackgroundColor="@color/message_icon_background_incoming" />
</LinearLayout>
</view>
-</ScrollView>
+</androidx.core.widget.NestedScrollView>
diff --git a/res/layout/screen_zoom_preview_settings.xml b/res/layout/screen_zoom_preview_settings.xml
index 3401fcf..de16392 100644
--- a/res/layout/screen_zoom_preview_settings.xml
+++ b/res/layout/screen_zoom_preview_settings.xml
@@ -14,7 +14,8 @@
limitations under the License.
-->
-<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
+<androidx.core.widget.NestedScrollView
+ xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fillViewport="true"
@@ -223,4 +224,4 @@
</LinearLayout>
</LinearLayout>
</view>
-</ScrollView>
+</androidx.core.widget.NestedScrollView>
diff --git a/res/layout/search_bar.xml b/res/layout/search_bar.xml
index d3e98c3..c4dd15d 100644
--- a/res/layout/search_bar.xml
+++ b/res/layout/search_bar.xml
@@ -20,7 +20,10 @@
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:layout_margin="@dimen/search_bar_margin"
+ android:layout_marginTop="@dimen/search_bar_margin"
+ android:layout_marginStart="@dimen/search_bar_margin"
+ android:layout_marginEnd="@dimen/search_bar_margin"
+ android:layout_marginBottom="16dp"
app:layout_scrollFlags="scroll|enterAlways">
<com.google.android.material.card.MaterialCardView
diff --git a/res/layout/settings_collapsing_base_layout.xml b/res/layout/settings_collapsing_base_layout.xml
new file mode 100644
index 0000000..5858fc1
--- /dev/null
+++ b/res/layout/settings_collapsing_base_layout.xml
@@ -0,0 +1,64 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2021 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<androidx.coordinatorlayout.widget.CoordinatorLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ android:id="@+id/content_parent"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+
+ <com.google.android.material.appbar.AppBarLayout
+ android:id="@+id/appbar_layout"
+ android:layout_width="match_parent"
+ android:layout_height="160dp"
+ android:theme="@style/Theme.CollapsingToolbar.Settings">
+
+ <com.google.android.material.appbar.CollapsingToolbarLayout
+ android:id="@+id/collapsing_toolbar"
+ android:background="?android:attr/colorPrimary"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ app:maxLines="3"
+ app:contentScrim="?android:attr/colorPrimary"
+ app:collapsedTitleTextAppearance="@style/ToolbarText.Collapsed"
+ app:statusBarScrim="?android:attr/colorPrimary"
+ app:layout_scrollFlags="scroll|exitUntilCollapsed"
+ app:toolbarId="@id/tool_bar">
+
+ <androidx.appcompat.widget.Toolbar
+ android:id="@+id/tool_bar"
+ android:layout_width="match_parent"
+ android:layout_height="?attr/actionBarSize"
+ app:layout_collapseMode="pin"
+ app:contentInsetStart="68dp"/>
+
+ <Toolbar
+ android:id="@+id/action_bar"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ app:layout_collapseMode="pin"
+ android:theme="?android:attr/actionBarTheme"/>
+
+ </com.google.android.material.appbar.CollapsingToolbarLayout>
+ </com.google.android.material.appbar.AppBarLayout>
+
+ <FrameLayout
+ android:id="@+id/content_frame"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ app:layout_behavior="@string/appbar_scrolling_view_behavior"/>
+</androidx.coordinatorlayout.widget.CoordinatorLayout>
\ No newline at end of file
diff --git a/res/values-night/themes.xml b/res/values-night/themes.xml
index c5f67fe..a4f495a 100644
--- a/res/values-night/themes.xml
+++ b/res/values-night/themes.xml
@@ -44,4 +44,10 @@
<style name="Theme.TabTheme" parent="@style/Theme.MaterialComponents.DayNight">
<item name="colorPrimary">@*android:color/edge_effect_device_default_dark</item>
</style>
+
+ <style name="Theme.CollapsingToolbar.Settings"
+ parent="@style/Theme.MaterialComponents.DayNight">
+ <item name="colorPrimary">@*android:color/primary_dark_device_default_settings</item>
+ <item name="colorAccent">@*android:color/accent_device_default_dark</item>
+ </style>
</resources>
diff --git a/res/values/arrays.xml b/res/values/arrays.xml
index 3528f9f..183dd1e 100644
--- a/res/values/arrays.xml
+++ b/res/values/arrays.xml
@@ -223,6 +223,10 @@
<!-- Security types for wireless tether -->
<string-array name="wifi_tether_security">
<!-- Do not translate. -->
+ <item>@string/wifi_security_sae</item>
+ <!-- Do not translate. -->
+ <item>@string/wifi_security_psk_sae</item>
+ <!-- Do not translate. -->
<item>@string/wifi_security_wpa2</item>
<!-- Do not translate. -->
<item>@string/wifi_security_none</item>
@@ -231,6 +235,10 @@
<!-- Values for security type for wireless tether -->
<string-array name="wifi_tether_security_values" translatable="false">
<!-- Do not translate. -->
+ <item>3</item>
+ <!-- Do not translate. -->
+ <item>2</item>
+ <!-- Do not translate. -->
<item>1</item>
<!-- Do not translate. -->
<item>0</item>
diff --git a/res/values/colors.xml b/res/values/colors.xml
index 2ce3949..c858cb3 100644
--- a/res/values/colors.xml
+++ b/res/values/colors.xml
@@ -99,6 +99,7 @@
<color name="homepage_location_background">#2EC7DC</color>
<color name="homepage_about_background">#6F86DA</color>
<color name="homepage_privacy_background">#5E97F6</color>
+ <color name="homepage_wallpaper_background">#E51AD1</color>
<color name="contextual_card_stroke_color">#1f000000</color>
<color name="contextual_card_dismissal_background">@*android:color/material_grey_100</color>
diff --git a/res/values/config.xml b/res/values/config.xml
index 9a6e486..d34c481 100755
--- a/res/values/config.xml
+++ b/res/values/config.xml
@@ -473,4 +473,10 @@
<!-- Authority of advanced device battery prediction -->
<string name="config_battery_prediction_authority" translatable="false"></string>
+
+ <!-- Packages for overriding tile positions on the homepage -->
+ <string-array name="config_homepage_tile_packages" translatable="false"/>
+
+ <!-- Orders for overriding tile positions on the homepage -->
+ <integer-array name="config_homepage_tile_orders"/>
</resources>
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index bc01d59..7bd5971 100755
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -116,6 +116,12 @@
<!-- Dashboard foreground image inset (from background edge to foreground edge) -->
<dimen name="dashboard_tile_foreground_image_inset">6dp</dimen>
+ <!-- Homepage image tile size -->
+ <dimen name="homepage_image_size">48dp</dimen>
+
+ <!-- Homepage foreground image inset (from background edge to foreground edge) -->
+ <dimen name="homepage_foreground_image_inset">12dp</dimen>
+
<!-- Preference icon foreground image inset (from background edge to foreground edge) -->
<dimen name="preference_icon_foreground_image_inset">12dp</dimen>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index d687357..7c03010 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -4950,6 +4950,10 @@
<string name="accessibility_text_and_display_title">Text and display</string>
<!-- Title for the accessibility preference category of interaction control services and settings. [CHAR LIMIT=50] -->
<string name="interaction_control_category_title">Interaction controls</string>
+ <!-- Title for the accessibility tap assistance page. [CHAR LIMIT=50] -->
+ <string name="accessibility_tap_assistance_title">Tap assistance</string>
+ <!-- Title for the accessibility system controls page. [CHAR LIMIT=50] -->
+ <string name="accessibility_system_controls_title">System controls</string>
<!-- Title for the accessibility preference category of services downloaded by the user. [CHAR LIMIT=50] -->
<string name="user_installed_services_category_title">Downloaded apps</string>
<!-- Title for the accessibility preference category of settings considered to be experimental, meaning they might be changed or removed in the future. [CHAR LIMIT=50] -->
@@ -5112,7 +5116,7 @@
<string name="accessibility_disable_animations">Remove animations</string>
<!-- Title for the accessibility preference for primary mono. [CHAR LIMIT=35] -->
<string name="accessibility_toggle_primary_mono_title">Mono audio</string>
- <!-- Summary for the accessibility preference for primary mono. [CHAR LIMIT=50] -->
+ <!-- Summary for the accessibility preference for primary mono. [CHAR LIMIT=60] -->
<string name="accessibility_toggle_primary_mono_summary">Combine channels when playing audio</string>
<!-- Title for the accessibility preference for primary balance. [CHAR LIMIT=35] -->
<string name="accessibility_toggle_primary_balance_title">Audio balance</string>
@@ -11666,11 +11670,9 @@
<!-- Option for prevent ringing setting -->
<string name="prevent_ringing_option_none">Do nothing</string>
<!-- Summary for prevent ringing setting -->
- <string name="prevent_ringing_option_vibrate_summary">On (vibrate)</string>
+ <string name="prevent_ringing_option_vibrate_summary">Vibrate</string>
<!-- Summary for prevent ringing setting -->
- <string name="prevent_ringing_option_mute_summary">On (mute)</string>
- <!-- Summary for prevent ringing setting -->
- <string name="prevent_ringing_option_none_summary">Off</string>
+ <string name="prevent_ringing_option_mute_summary">Mute</string>
<!-- Title for detail page of wifi network [CHAR LIMIT=30] -->
<string name="pref_title_network_details">Network details</string>
@@ -12581,4 +12583,8 @@
<string name="category_name_others">Others</string>
<!-- General category name [CHAR LIMIT=none] -->
<string name="category_name_general">General</string>
+
+ <!-- Do not translate. Title for prevent ringing main switch. [CHAR LIMIT=50] -->
+ <string name="prevent_ringing_main_switch_title" translatable="false">Use prevent ringing</string>
+
</resources>
diff --git a/res/values/styles.xml b/res/values/styles.xml
index ce6b095..e75766d 100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -312,6 +312,12 @@
<item name="android:textSize">@dimen/search_bar_text_size</item>
</style>
+ <style name="TextAppearance.HomepagePreferenceTitle"
+ parent="@*android:style/TextAppearance.DeviceDefault">
+ <item name="android:fontFamily">google-sans</item>
+ <item name="android:textSize">20sp</item>
+ </style>
+
<style name="TextAppearance.HomepageCardTitle"
parent="@*android:style/TextAppearance.DeviceDefault.Subhead">
<item name="android:fontFamily">@*android:string/config_headlineFontFamilyMedium</item>
@@ -874,4 +880,17 @@
<item name="android:textSize">16sp</item>
<item name="android:textColor">?android:attr/textColorSecondary</item>
</style>
+
+ <style name="ToolbarText.Collapsed"
+ parent="@android:style/TextAppearance.DeviceDefault.Widget.ActionBar.Title">
+ </style>
+
+ <style name="ToolbarText"
+ parent="@android:style/TextAppearance.DeviceDefault.Widget.ActionBar.Title" >
+ <item name="android:textSize">32sp</item>
+ </style>
+
+ <style name="ToolbarText.MoreThanTwoLines">
+ <item name="android:textSize">24sp</item>
+ </style>
</resources>
diff --git a/res/values/themes.xml b/res/values/themes.xml
index 01ea103..fc69246 100644
--- a/res/values/themes.xml
+++ b/res/values/themes.xml
@@ -72,7 +72,7 @@
<item name="android:windowNoTitle">true</item>
</style>
- <style name="Theme.SubSettings.Base" parent="Theme.Settings">
+ <style name="Theme.SubSettings.Base" parent="Theme.Settings.NoActionBar">
<!-- Redefine the ActionBar style for contentInsetStart -->
<item name="android:actionBarStyle">@style/Widget.ActionBar.SubSettings</item>
@@ -276,4 +276,10 @@
<style name="Theme.TabTheme" parent="@style/Theme.MaterialComponents.DayNight">
<item name="colorPrimary">@*android:color/edge_effect_device_default_light</item>
</style>
+
+ <style name="Theme.CollapsingToolbar.Settings"
+ parent="@style/Theme.MaterialComponents.DayNight">
+ <item name="colorPrimary">@*android:color/primary_device_default_settings_light</item>
+ <item name="colorAccent">@*android:color/accent_device_default_light</item>
+ </style>
</resources>
diff --git a/res/xml/accessibility_settings.xml b/res/xml/accessibility_settings.xml
index 6efd884..b7c28b4 100644
--- a/res/xml/accessibility_settings.xml
+++ b/res/xml/accessibility_settings.xml
@@ -66,38 +66,17 @@
android:title="@string/interaction_control_category_title">
<Preference
- android:fragment="com.android.settings.accessibility.ToggleAutoclickPreferenceFragment"
- android:key="autoclick_preference"
+ android:fragment="com.android.settings.accessibility.TapAssistanceFragment"
+ android:key="tap_assistance_preference_screen"
android:persistent="false"
- android:title="@string/accessibility_autoclick_preference_title"
- settings:controller="com.android.settings.accessibility.AutoclickPreferenceController"/>
-
- <SwitchPreference
- android:key="toggle_power_button_ends_call_preference"
- android:persistent="false"
- android:title="@string/accessibility_power_button_ends_call_prerefence_title"
- settings:controller="com.android.settings.accessibility.PowerButtonEndsCallPreferenceController"/>
-
- <SwitchPreference
- android:key="toggle_lock_screen_rotation_preference"
- android:persistent="false"
- android:title="@string/accelerometer_title"
- settings:controller="com.android.settings.accessibility.LockScreenRotationPreferenceController"/>
-
- <ListPreference
- android:entries="@array/long_press_timeout_selector_list_titles"
- android:entryValues="@array/long_press_timeout_selector_values"
- android:key="select_long_press_timeout_preference"
- android:persistent="false"
- android:title="@string/accessibility_long_press_timeout_preference_title"
- settings:controller="com.android.settings.accessibility.SelectLongPressTimeoutPreferenceController"/>
+ android:title="@string/accessibility_tap_assistance_title"
+ settings:searchable="true"/>
<Preference
- android:fragment="com.android.settings.accessibility.AccessibilityControlTimeoutPreferenceFragment"
- android:key="accessibility_control_timeout_preference_fragment"
- android:persistent="false"
- android:title="@string/accessibility_setting_item_control_timeout_title"
- settings:controller="com.android.settings.accessibility.AccessibilityTimeoutPreferenceController"/>
+ android:fragment="com.android.settings.accessibility.SystemControlsFragment"
+ android:key="system_controls_preference_screen"
+ android:title="@string/accessibility_system_controls_title"
+ settings:searchable="true"/>
<Preference
android:fragment="com.android.settings.accessibility.VibrationSettings"
@@ -106,14 +85,6 @@
android:title="@string/accessibility_vibration_settings_title"
settings:controller="com.android.settings.accessibility.VibrationPreferenceController"/>
- <Preference
- android:fragment="com.android.settings.gestures.SystemNavigationGestureSettings"
- android:key="gesture_system_navigation_input_summary_accessibility"
- android:persistent="false"
- android:title="@string/system_navigation_title"
- settings:searchable="false"
- settings:controller="com.android.settings.gestures.SystemNavigationPreferenceController"/>
-
</PreferenceCategory>
<PreferenceCategory
diff --git a/res/xml/accessibility_system_controls.xml b/res/xml/accessibility_system_controls.xml
new file mode 100644
index 0000000..12797d1
--- /dev/null
+++ b/res/xml/accessibility_system_controls.xml
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2021 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<PreferenceScreen
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:settings="http://schemas.android.com/apk/res-auto"
+ android:key="accessibility_system_controls"
+ android:persistent="false"
+ android:title="@string/accessibility_system_controls_title">
+
+ <Preference
+ android:fragment="com.android.settings.gestures.SystemNavigationGestureSettings"
+ android:key="gesture_system_navigation_input_summary_accessibility"
+ android:persistent="false"
+ android:title="@string/system_navigation_title"
+ settings:searchable="false"
+ settings:controller="com.android.settings.gestures.SystemNavigationPreferenceController"/>
+
+ <SwitchPreference
+ android:key="toggle_power_button_ends_call_preference"
+ android:persistent="false"
+ android:title="@string/accessibility_power_button_ends_call_prerefence_title"
+ settings:controller="com.android.settings.accessibility.PowerButtonEndsCallPreferenceController"/>
+
+ <SwitchPreference
+ android:key="toggle_lock_screen_rotation_preference"
+ android:persistent="false"
+ android:title="@string/accelerometer_title"
+ settings:controller="com.android.settings.accessibility.LockScreenRotationPreferenceController"/>
+</PreferenceScreen>
\ No newline at end of file
diff --git a/res/xml/accessibility_tap_assistance.xml b/res/xml/accessibility_tap_assistance.xml
new file mode 100644
index 0000000..b96dee6
--- /dev/null
+++ b/res/xml/accessibility_tap_assistance.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2021 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<PreferenceScreen
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:settings="http://schemas.android.com/apk/res-auto"
+ android:key="accessibility_tap_assistance"
+ android:persistent="false"
+ android:title="@string/accessibility_tap_assistance_title">
+
+ <ListPreference
+ android:entries="@array/long_press_timeout_selector_list_titles"
+ android:entryValues="@array/long_press_timeout_selector_values"
+ android:key="select_long_press_timeout_preference"
+ android:persistent="false"
+ android:title="@string/accessibility_long_press_timeout_preference_title"
+ settings:controller="com.android.settings.accessibility.SelectLongPressTimeoutPreferenceController"/>
+
+ <Preference
+ android:fragment="com.android.settings.accessibility.AccessibilityControlTimeoutPreferenceFragment"
+ android:key="accessibility_control_timeout_preference_fragment"
+ android:persistent="false"
+ android:title="@string/accessibility_setting_item_control_timeout_title"
+ settings:controller="com.android.settings.accessibility.AccessibilityTimeoutPreferenceController"/>
+
+ <Preference
+ android:fragment="com.android.settings.accessibility.ToggleAutoclickPreferenceFragment"
+ android:key="autoclick_preference"
+ android:persistent="false"
+ android:title="@string/accessibility_autoclick_preference_title"
+ settings:controller="com.android.settings.accessibility.AutoclickPreferenceController"/>
+</PreferenceScreen>
\ No newline at end of file
diff --git a/res/xml/app_notification_settings.xml b/res/xml/app_notification_settings.xml
index b3a1117..877b38b 100644
--- a/res/xml/app_notification_settings.xml
+++ b/res/xml/app_notification_settings.xml
@@ -22,9 +22,8 @@
android:key="pref_app_header"
android:layout="@layout/settings_entity_header" />
- <com.android.settingslib.widget.LayoutPreference
- android:key="block"
- android:layout="@layout/styled_switch_bar" />
+ <com.android.settingslib.widget.MainSwitchPreference
+ android:key="block" />
<com.android.settings.notification.app.NotificationFooterPreference
android:key="block_desc" />
diff --git a/res/xml/emergency_gesture_settings.xml b/res/xml/emergency_gesture_settings.xml
index 2e1a259..2f53a90 100644
--- a/res/xml/emergency_gesture_settings.xml
+++ b/res/xml/emergency_gesture_settings.xml
@@ -20,16 +20,18 @@
xmlns:app="http://schemas.android.com/apk/res-auto"
android:title="@string/emergency_gesture_screen_title">
+ <com.android.settingslib.widget.MainSwitchPreference
+ android:key="gesture_emergency_button_switch_bar"
+ app:controller="com.android.settings.gestures.EmergencyGesturePreferenceController" />
+
<com.android.settings.widget.VideoPreference
android:key="emergency_gesture_screen_video"
app:animation="@raw/gesture_double_tap"
app:preview="@drawable/gesture_double_tap"/>
- <com.android.settingslib.widget.LayoutPreference
- android:key="gesture_emergency_button_switch_bar"
- android:layout="@layout/emergency_gesture_switch_bar"
- app:controller="com.android.settings.gestures.EmergencyGesturePreferenceController"
- app:allowDividerBelow="true"/>
+ <com.android.settingslib.widget.TopIntroPreference
+ android:title="@string/emergency_gesture_screen_summary"
+ app:allowDividerBelow="true" />
<SwitchPreference
android:key="emergency_gesture_sound"
diff --git a/res/xml/emergency_settings.xml b/res/xml/emergency_settings.xml
index 41b503e..31c209b 100644
--- a/res/xml/emergency_settings.xml
+++ b/res/xml/emergency_settings.xml
@@ -23,15 +23,18 @@
android:key="emergency_info"
android:title="@string/emergency_info_title"
android:summary="@string/summary_placeholder"
+ android:order="0"
settings:controller="com.android.settings.accounts.EmergencyInfoPreferenceController"/>
<Preference
android:key="gesture_emergency_summary"
android:title="@string/emergency_gesture_screen_title"
+ android:order="100"
android:fragment="com.android.settings.gestures.EmergencyGestureSettings"
settings:controller="com.android.settings.gestures.EmergencyGestureEntrypointPreferenceController" />
<com.android.settingslib.RestrictedPreference
android:key="app_and_notif_cell_broadcast_settings"
android:title="@string/cell_broadcast_settings"
+ android:order="200"
settings:useAdminDisabledSummary="true">
<intent
android:action="android.intent.action.MAIN"
diff --git a/res/xml/gestures.xml b/res/xml/gestures.xml
index 32dad20..970ad21 100644
--- a/res/xml/gestures.xml
+++ b/res/xml/gestures.xml
@@ -21,12 +21,6 @@
android:title="@string/gesture_preference_title">
<Preference
- android:key="gesture_emergency_summary"
- android:title="@string/emergency_gesture_screen_title"
- android:fragment="com.android.settings.gestures.EmergencyGestureSettings"
- settings:controller="com.android.settings.gestures.EmergencyGestureEntrypointPreferenceController" />
-
- <Preference
android:key="gesture_assist_input_summary"
android:title="@string/assist_gesture_title"
android:fragment="com.android.settings.gestures.AssistGestureSettings"
diff --git a/res/xml/my_device_info.xml b/res/xml/my_device_info.xml
index eb9ceb4..5077f77 100644
--- a/res/xml/my_device_info.xml
+++ b/res/xml/my_device_info.xml
@@ -56,13 +56,6 @@
settings:controller="com.android.settings.deviceinfo.PhoneNumberPreferenceController"
settings:enableCopying="true"/>
- <Preference
- android:key="emergency_info"
- android:order="14"
- android:title="@string/emergency_info_title"
- android:summary="@string/summary_placeholder"
- settings:controller="com.android.settings.accounts.EmergencyInfoPreferenceController"/>
-
<!-- Legal information -->
<Preference
android:key="legal_container"
diff --git a/res/xml/prevent_ringing_gesture_settings.xml b/res/xml/prevent_ringing_gesture_settings.xml
index 67a9c9b..4080375 100644
--- a/res/xml/prevent_ringing_gesture_settings.xml
+++ b/res/xml/prevent_ringing_gesture_settings.xml
@@ -20,16 +20,15 @@
xmlns:app="http://schemas.android.com/apk/res-auto"
android:title="@string/gesture_prevent_ringing_screen_title">
+ <com.android.settingslib.widget.MainSwitchPreference
+ android:key="gesture_prevent_ringing_switch" />
+
<com.android.settings.widget.VideoPreference
android:key="gesture_prevent_ringing_video"
app:animation="@raw/gesture_prevent_ringing"
app:preview="@drawable/gesture_prevent_ringing"
app:controller="com.android.settings.widget.VideoPreferenceController" />
- <com.android.settingslib.widget.LayoutPreference
- android:key="gesture_prevent_ringing_switch"
- android:layout="@layout/styled_switch_bar" />
-
<PreferenceCategory
android:key="gesture_prevent_ringing_category"
android:title="@string/gesture_prevent_ringing_title" />
diff --git a/res/xml/sound_settings.xml b/res/xml/sound_settings.xml
index fc5c3e2..31571f6 100644
--- a/res/xml/sound_settings.xml
+++ b/res/xml/sound_settings.xml
@@ -118,7 +118,7 @@
settings:controller="com.android.settings.sound.MediaControlsParentPreferenceController"
settings:keywords="@string/keywords_media_controls"/>
- <Preference
+ <com.android.settings.widget.PrimarySwitchPreference
android:key="gesture_prevent_ringing_sound"
android:title="@string/gesture_prevent_ringing_sound_title"
android:order="-107"
diff --git a/res/xml/sound_settings_v2.xml b/res/xml/sound_settings_v2.xml
new file mode 100644
index 0000000..9699240
--- /dev/null
+++ b/res/xml/sound_settings_v2.xml
@@ -0,0 +1,251 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2021 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<PreferenceScreen
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:settings="http://schemas.android.com/apk/res-auto"
+ android:title="@string/sound_settings"
+ android:key="sound_settings"
+ settings:keywords="@string/keywords_sounds"
+ settings:initialExpandedChildrenCount="9">
+
+ <!-- Remote volume group -->
+ <PreferenceCategory
+ android:key="remote_media_group"
+ android:title=""
+ android:order="-185"
+ settings:allowDividerBelow="true"
+ settings:controller="com.android.settings.notification.RemoteVolumeGroupController">
+ </PreferenceCategory>
+
+ <!-- Media volume -->
+ <com.android.settings.notification.VolumeSeekBarPreference
+ android:key="media_volume"
+ android:icon="@drawable/ic_media_stream"
+ android:title="@string/media_volume_option_title"
+ android:order="-180"
+ settings:controller="com.android.settings.notification.MediaVolumePreferenceController"/>
+
+ <!-- Media output switcher -->
+ <Preference
+ android:key="media_output"
+ android:title="@string/media_output_title"
+ android:dialogTitle="@string/media_output_title"
+ android:order="-175"
+ settings:searchable="false"
+ settings:controller="com.android.settings.sound.MediaOutputPreferenceController"/>
+
+ <!-- Call volume -->
+ <com.android.settings.notification.VolumeSeekBarPreference
+ android:key="call_volume"
+ android:icon="@drawable/ic_local_phone_24_lib"
+ android:title="@string/call_volume_option_title"
+ android:order="-170"
+ settings:controller="com.android.settings.notification.CallVolumePreferenceController"/>
+
+ <!-- Hands free profile output switcher -->
+ <ListPreference
+ android:key="take_call_on_output"
+ android:title="@string/take_call_on_title"
+ android:dialogTitle="@string/take_call_on_title"
+ android:order="-165"
+ settings:searchable="false"
+ settings:controller="com.android.settings.sound.HandsFreeProfileOutputPreferenceController"/>
+
+ <!-- Ring volume -->
+ <com.android.settings.notification.VolumeSeekBarPreference
+ android:key="ring_volume"
+ android:icon="@drawable/ic_notifications"
+ android:title="@string/ring_volume_option_title"
+ android:order="-160"
+ settings:controller="com.android.settings.notification.RingVolumePreferenceController"/>
+
+
+ <!-- Alarm volume -->
+ <com.android.settings.notification.VolumeSeekBarPreference
+ android:key="alarm_volume"
+ android:icon="@*android:drawable/ic_audio_alarm"
+ android:title="@string/alarm_volume_option_title"
+ android:order="-150"
+ settings:controller="com.android.settings.notification.AlarmVolumePreferenceController"/>
+
+ <!-- Notification volume -->
+ <com.android.settings.notification.VolumeSeekBarPreference
+ android:key="notification_volume"
+ android:icon="@drawable/ic_notifications"
+ android:title="@string/notification_volume_option_title"
+ android:order="-140"
+ settings:controller="com.android.settings.notification.NotificationVolumePreferenceController"/>
+
+ <!-- Also vibrate for calls -->
+ <Preference
+ android:fragment="com.android.settings.sound.VibrateForCallsPreferenceFragment"
+ android:key="vibrate_for_calls"
+ android:title="@string/vibrate_when_ringing_title"
+ android:order="-130"
+ settings:controller="com.android.settings.sound.VibrateForCallsPreferenceController"
+ settings:keywords="@string/keywords_vibrate_for_calls"/>
+
+ <!-- Interruptions -->
+ <com.android.settingslib.RestrictedPreference
+ android:key="zen_mode"
+ android:title="@string/zen_mode_settings_title"
+ android:fragment="com.android.settings.notification.zen.ZenModeSettings"
+ android:order="-120"
+ settings:useAdminDisabledSummary="true"
+ settings:keywords="@string/keywords_sounds_and_notifications_interruptions"
+ settings:allowDividerAbove="true"
+ settings:controller="com.android.settings.notification.zen.ZenModePreferenceController"/>
+
+ <Preference
+ android:key="media_controls_summary"
+ android:title="@string/media_controls_title"
+ android:fragment="com.android.settings.sound.MediaControlsSettings"
+ android:order="-110"
+ settings:controller="com.android.settings.sound.MediaControlsParentPreferenceController"
+ settings:keywords="@string/keywords_media_controls"/>
+
+ <com.android.settings.widget.PrimarySwitchPreference
+ android:key="gesture_prevent_ringing_sound"
+ android:title="@string/gesture_prevent_ringing_sound_title"
+ android:order="-107"
+ android:fragment="com.android.settings.gestures.PreventRingingGestureSettings"
+ settings:controller="com.android.settings.gestures.PreventRingingParentPreferenceController"/>
+
+ <!-- Phone ringtone -->
+ <com.android.settings.DefaultRingtonePreference
+ android:key="phone_ringtone"
+ android:title="@string/ringtone_title"
+ android:dialogTitle="@string/ringtone_title"
+ android:summary="@string/summary_placeholder"
+ android:ringtoneType="ringtone"
+ android:order="-100"
+ settings:keywords="@string/sound_settings"/>
+
+ <!-- Default notification ringtone -->
+ <com.android.settings.DefaultRingtonePreference
+ android:key="notification_ringtone"
+ android:title="@string/notification_ringtone_title"
+ android:dialogTitle="@string/notification_ringtone_title"
+ android:summary="@string/summary_placeholder"
+ android:ringtoneType="notification"
+ android:order="-90"/>
+
+ <!-- Default alarm ringtone -->
+ <com.android.settings.DefaultRingtonePreference
+ android:key="alarm_ringtone"
+ android:title="@string/alarm_ringtone_title"
+ android:dialogTitle="@string/alarm_ringtone_title"
+ android:summary="@string/summary_placeholder"
+ android:persistent="false"
+ android:ringtoneType="alarm"
+ android:order="-80"/>
+
+ <!-- Other sounds -->
+ <PreferenceCategory
+ android:key="other_sounds_and_vibrations_category"
+ android:title="@string/other_sound_category_preference_title"
+ android:order="-50">
+
+ <!-- Dial pad tones -->
+ <SwitchPreference
+ android:key="dial_pad_tones"
+ android:title="@string/dial_pad_tones_title"/>
+
+ <!-- Screen locking sounds -->
+ <SwitchPreference
+ android:key="screen_locking_sounds"
+ android:title="@string/screen_locking_sounds_title"/>
+
+ <!-- Charging sounds -->
+ <SwitchPreference
+ android:key="charging_sounds"
+ android:title="@string/charging_sounds_title"/>
+
+ <!-- Docking sounds -->
+ <SwitchPreference
+ android:key="docking_sounds"
+ android:title="@string/docking_sounds_title"/>
+
+ <!-- Touch sounds -->
+ <SwitchPreference
+ android:key="touch_sounds"
+ android:title="@string/touch_sounds_title"/>
+
+ <!-- Vibrate on touch -->
+ <SwitchPreference
+ android:key="vibrate_on_touch"
+ android:title="@string/vibrate_on_touch_title"
+ android:summary="@string/vibrate_on_touch_summary"
+ settings:keywords="@string/keywords_vibrate_on_touch"/>
+
+ <!-- Dock speaker plays -->
+ <DropDownPreference
+ android:key="dock_audio_media"
+ android:title="@string/dock_audio_media_title"
+ android:summary="%s"/>
+
+ <!-- Boot sounds -->
+ <SwitchPreference
+ android:key="boot_sounds"
+ android:title="@string/boot_sounds_title"/>
+
+ <!-- Emergency tone -->
+ <DropDownPreference
+ android:key="emergency_tone"
+ android:title="@string/emergency_tone_title"
+ android:summary="%s"/>
+ </PreferenceCategory>
+
+ <com.android.settings.widget.WorkOnlyCategory
+ android:key="sound_work_settings_section"
+ android:title="@string/sound_work_settings"
+ android:order="100">
+
+ <!-- Use the same sounds of the work profile -->
+ <SwitchPreference
+ android:key="work_use_personal_sounds"
+ android:title="@string/work_use_personal_sounds_title"
+ android:summary="@string/work_use_personal_sounds_summary"
+ android:disableDependentsState="true"/>
+
+ <!-- Work phone ringtone -->
+ <com.android.settings.DefaultRingtonePreference
+ android:key="work_ringtone"
+ android:title="@string/work_ringtone_title"
+ android:dialogTitle="@string/work_alarm_ringtone_title"
+ android:ringtoneType="ringtone"
+ android:dependency="work_use_personal_sounds"/>
+
+ <!-- Default work notification ringtone -->
+ <com.android.settings.DefaultRingtonePreference
+ android:key="work_notification_ringtone"
+ android:title="@string/work_notification_ringtone_title"
+ android:dialogTitle="@string/work_alarm_ringtone_title"
+ android:ringtoneType="notification"
+ android:dependency="work_use_personal_sounds"/>
+
+ <!-- Default work alarm ringtone -->
+ <com.android.settings.DefaultRingtonePreference
+ android:key="work_alarm_ringtone"
+ android:title="@string/work_alarm_ringtone_title"
+ android:dialogTitle="@string/work_alarm_ringtone_title"
+ android:persistent="false"
+ android:ringtoneType="alarm"
+ android:dependency="work_use_personal_sounds"/>
+
+ </com.android.settings.widget.WorkOnlyCategory>
+</PreferenceScreen>
diff --git a/res/xml/top_level_settings.xml b/res/xml/top_level_settings.xml
index 3c65f7b..78dfe9b 100644
--- a/res/xml/top_level_settings.xml
+++ b/res/xml/top_level_settings.xml
@@ -125,13 +125,12 @@
android:fragment="com.android.settings.accessibility.AccessibilitySettings"
settings:controller="com.android.settings.accessibility.TopLevelAccessibilityPreferenceController"/>
- <!-- TODO(b/175158310): Enable this tile when the setting content is more flushed out-->
- <!-- <Preference-->
- <!-- android:key="top_level_emergency"-->
- <!-- android:title="@string/emergency_settings_preference_title"-->
- <!-- android:icon="@drawable/ic_homepage_emergency"-->
- <!-- android:order="-10"-->
- <!-- android:fragment="com.android.settings.emergency.EmergencyDashboardFragment"/>-->
+ <Preference
+ android:key="top_level_emergency"
+ android:title="@string/emergency_settings_preference_title"
+ android:icon="@drawable/ic_homepage_emergency"
+ android:order="-10"
+ android:fragment="com.android.settings.emergency.EmergencyDashboardFragment"/>
<Preference
android:key="top_level_system"
diff --git a/res/xml/top_level_settings_grouped.xml b/res/xml/top_level_settings_grouped.xml
index 1ae6131..9f87ffc 100644
--- a/res/xml/top_level_settings_grouped.xml
+++ b/res/xml/top_level_settings_grouped.xml
@@ -20,17 +20,17 @@
xmlns:settings="http://schemas.android.com/apk/res-auto"
android:key="top_level_settings_grouped">
- <Preference
+ <com.android.settings.homepage.HomePagePreference
android:fragment="com.android.settings.network.NetworkDashboardFragment"
- android:icon="@drawable/ic_homepage_network"
+ android:icon="@drawable/ic_homepage_network_v2"
android:key="top_level_network"
android:order="-140"
android:title="@string/network_dashboard_title"
settings:controller="com.android.settings.network.TopLevelNetworkEntryPreferenceController"/>
- <Preference
+ <com.android.settings.homepage.HomePagePreference
android:fragment="com.android.settings.connecteddevice.ConnectedDeviceDashboardFragment"
- android:icon="@drawable/ic_homepage_connected_device"
+ android:icon="@drawable/ic_homepage_connected_device_v2"
android:key="top_level_connected_devices"
android:order="-130"
android:title="@string/connected_devices_dashboard_title"
@@ -40,16 +40,16 @@
android:key="apps"
android:order="-120"
settings:allowDividerAbove="false">
- <Preference
+ <com.android.settings.homepage.HomePagePreference
android:fragment="com.android.settings.applications.AppAndNotificationDashboardFragment"
- android:icon="@drawable/ic_homepage_apps"
+ android:icon="@drawable/ic_homepage_apps_v2"
android:key="top_level_apps_and_notifs"
android:order="-120"
android:title="@string/apps_dashboard_title"/>
- <Preference
+ <com.android.settings.homepage.HomePagePreference
android:fragment="com.android.settings.notification.ConfigureNotificationSettings"
- android:icon="@drawable/ic_homepage_notification"
+ android:icon="@drawable/ic_homepage_notification_v2"
android:key="top_level_notification"
android:order="-110"
android:title="@string/configure_notification_settings"/>
@@ -61,47 +61,47 @@
android:key="phone_essential"
android:order="-100"
settings:allowDividerAbove="false">
- <Preference
+ <com.android.settings.homepage.HomePagePreference
android:fragment="com.android.settings.fuelgauge.PowerUsageSummary"
- android:icon="@drawable/ic_homepage_battery"
+ android:icon="@drawable/ic_homepage_battery_v2"
android:key="top_level_battery"
android:order="-100"
android:title="@string/power_usage_summary_title"
settings:controller="com.android.settings.fuelgauge.TopLevelBatteryPreferenceController"/>
- <Preference
+ <com.android.settings.homepage.HomePagePreference
android:fragment="com.android.settings.deviceinfo.StorageSettings"
- android:icon="@drawable/ic_homepage_storage"
+ android:icon="@drawable/ic_homepage_storage_v2"
android:key="top_level_storage"
android:order="-90"
android:title="@string/storage_settings"
settings:controller="com.android.settings.deviceinfo.TopLevelStoragePreferenceController"/>
- <Preference
+ <com.android.settings.homepage.HomePagePreference
android:fragment="com.android.settings.notification.SoundSettings"
- android:icon="@drawable/ic_homepage_sound"
+ android:icon="@drawable/ic_homepage_sound_v2"
android:key="top_level_sound"
android:order="-80"
android:title="@string/sound_settings"/>
- <Preference
+ <com.android.settings.homepage.HomePagePreference
android:fragment="com.android.settings.DisplaySettings"
- android:icon="@drawable/ic_homepage_display"
+ android:icon="@drawable/ic_homepage_display_v2"
android:key="top_level_display"
android:order="-70"
android:title="@string/display_settings"
settings:controller="com.android.settings.display.TopLevelDisplayPreferenceController"/>
- <com.android.settingslib.RestrictedTopLevelPreference
- android:icon="@drawable/ic_homepage_display"
+ <com.android.settings.homepage.RestrictedHomepagePreference
+ android:icon="@drawable/ic_homepage_wallpaper_v2"
android:key="top_level_wallpaper"
android:order="-60"
android:title="@string/wallpaper_settings_title"
settings:controller="com.android.settings.display.TopLevelWallpaperPreferenceController"/>
- <Preference
+ <com.android.settings.homepage.HomePagePreference
android:fragment="com.android.settings.accessibility.AccessibilitySettings"
- android:icon="@drawable/ic_homepage_accessibility"
+ android:icon="@drawable/ic_homepage_accessibility_v2"
android:key="top_level_accessibility"
android:order="-50"
android:title="@string/accessibility_settings"
@@ -112,44 +112,44 @@
android:key="privacy_and_security"
android:order="-40"
settings:allowDividerAbove="false">
- <Preference
+ <com.android.settings.homepage.HomePagePreference
android:fragment="com.android.settings.privacy.PrivacyDashboardFragment"
- android:icon="@drawable/ic_homepage_privacy"
+ android:icon="@drawable/ic_homepage_privacy_v2"
android:key="top_level_privacy"
android:order="-40"
android:title="@string/privacy_dashboard_title"/>
- <Preference
+ <com.android.settings.homepage.HomePagePreference
android:fragment="com.android.settings.location.LocationSettings"
- android:icon="@drawable/ic_homepage_location"
+ android:icon="@drawable/ic_homepage_location_v2"
android:key="top_level_location"
android:order="-30"
android:title="@string/location_settings_title"
settings:controller="com.android.settings.location.TopLevelLocationPreferenceController"/>
- <Preference
+ <com.android.settings.homepage.HomePagePreference
android:fragment="com.android.settings.security.SecuritySettings"
- android:icon="@drawable/ic_homepage_security"
+ android:icon="@drawable/ic_homepage_security_v2"
android:key="top_level_security"
android:order="-20"
android:title="@string/security_settings_title"
settings:controller="com.android.settings.security.TopLevelSecurityEntryPreferenceController"/>
- <!-- TODO(b/175158310): Enable this tile when the setting content is more flushed out-->
- <!-- <Preference-->
- <!-- android:key="top_level_emergency"-->
- <!-- android:title="@string/emergency_settings_preference_title"-->
- <!-- android:icon="@drawable/ic_homepage_emergency"-->
- <!-- android:order="-10"-->
- <!-- android:fragment="com.android.settings.emergency.EmergencyDashboardFragment"/>-->
+
+ <com.android.settings.homepage.HomePagePreference
+ android:key="top_level_emergency"
+ android:title="@string/emergency_settings_preference_title"
+ android:icon="@drawable/ic_homepage_emergency_v2"
+ android:order="-10"
+ android:fragment="com.android.settings.emergency.EmergencyDashboardFragment"/>
</PreferenceCategory>
<PreferenceCategory
android:key="accounts"
android:order="-10"
settings:allowDividerAbove="false">
- <Preference
+ <com.android.settings.homepage.HomePagePreference
android:fragment="com.android.settings.accounts.AccountDashboardFragment"
- android:icon="@drawable/ic_homepage_accounts"
+ android:icon="@drawable/ic_homepage_accounts_v2"
android:key="top_level_accounts"
android:order="-10"
android:title="@string/account_dashboard_title"
@@ -160,23 +160,23 @@
android:key="system"
android:order="10"
settings:allowDividerAbove="false">
- <Preference
+ <com.android.settings.homepage.HomePagePreference
android:fragment="com.android.settings.system.SystemDashboardFragment"
- android:icon="@drawable/ic_homepage_system_dashboard"
+ android:icon="@drawable/ic_homepage_system_dashboard_v2"
android:key="top_level_system"
android:order="10"
android:title="@string/header_category_system"/>
- <Preference
+ <com.android.settings.homepage.HomePagePreference
android:fragment="com.android.settings.deviceinfo.aboutphone.MyDeviceInfoFragment"
- android:icon="@drawable/ic_homepage_about"
+ android:icon="@drawable/ic_homepage_about_v2"
android:key="top_level_about_device"
android:order="20"
android:title="@string/about_settings"
settings:controller="com.android.settings.deviceinfo.aboutphone.TopLevelAboutDevicePreferenceController"/>
- <Preference
- android:icon="@drawable/ic_homepage_support"
+ <com.android.settings.homepage.HomePagePreference
+ android:icon="@drawable/ic_homepage_support_v2"
android:key="top_level_support"
android:order="100"
android:title="@string/page_tab_title_support"
diff --git a/res/xml/zen_mode_event_rule_settings.xml b/res/xml/zen_mode_event_rule_settings.xml
index 46b95e1..d6a0e68 100644
--- a/res/xml/zen_mode_event_rule_settings.xml
+++ b/res/xml/zen_mode_event_rule_settings.xml
@@ -27,13 +27,12 @@
android:selectable="false"
settings:allowDividerBelow="true" />
+ <com.android.settingslib.widget.MainSwitchPreference
+ android:key="zen_automatic_rule_switch" />
+
<com.android.settingslib.widget.ActionButtonsPreference
android:key="zen_action_buttons" />
- <com.android.settingslib.widget.LayoutPreference
- android:key="zen_automatic_rule_switch"
- android:layout="@layout/styled_switch_bar" />
-
<!-- During events for -->
<DropDownPreference
android:key="calendar"
diff --git a/res/xml/zen_mode_schedule_rule_settings.xml b/res/xml/zen_mode_schedule_rule_settings.xml
index cab8731..874f5c9 100644
--- a/res/xml/zen_mode_schedule_rule_settings.xml
+++ b/res/xml/zen_mode_schedule_rule_settings.xml
@@ -27,13 +27,12 @@
android:selectable="false"
settings:allowDividerBelow="true"/>
+ <com.android.settingslib.widget.MainSwitchPreference
+ android:key="zen_automatic_rule_switch" />
+
<com.android.settingslib.widget.ActionButtonsPreference
android:key="zen_action_buttons"/>
- <com.android.settingslib.widget.LayoutPreference
- android:key="zen_automatic_rule_switch"
- android:layout="@layout/styled_switch_bar" />
-
<!-- Days -->
<Preference
android:key="days"
diff --git a/src/com/android/settings/AllInOneTetherSettings.java b/src/com/android/settings/AllInOneTetherSettings.java
index 82e3206..5442ed7 100644
--- a/src/com/android/settings/AllInOneTetherSettings.java
+++ b/src/com/android/settings/AllInOneTetherSettings.java
@@ -355,7 +355,7 @@
@Override
public void onTetherConfigUpdated(AbstractPreferenceController controller) {
final SoftApConfiguration config = buildNewConfig();
- mPasswordPreferenceController.updateVisibility(config.getSecurityType());
+ mPasswordPreferenceController.setSecurityType(config.getSecurityType());
mWifiManager.setSoftApConfiguration(config);
if (mWifiManager.getWifiApState() == WifiManager.WIFI_AP_STATE_ENABLED) {
diff --git a/src/com/android/settings/SettingsActivity.java b/src/com/android/settings/SettingsActivity.java
index 1c2952a..7f214f6 100644
--- a/src/com/android/settings/SettingsActivity.java
+++ b/src/com/android/settings/SettingsActivity.java
@@ -288,7 +288,9 @@
if (actionBar != null) {
actionBar.setDisplayHomeAsUpEnabled(!isInSetupWizard);
actionBar.setHomeButtonEnabled(!isInSetupWizard);
- actionBar.setDisplayShowTitleEnabled(true);
+ // TODO(b/176882938): Enable title after material component updated
+ // If CollapsingToolbarLayout is applied, the old action bar won't show title.
+ actionBar.setDisplayShowTitleEnabled(mCollapsingToolbarLayout == null);
}
mSwitchBar = findViewById(R.id.switch_bar);
if (mSwitchBar != null) {
diff --git a/src/com/android/settings/SettingsPreferenceFragment.java b/src/com/android/settings/SettingsPreferenceFragment.java
index 659ada4..2c628f6 100644
--- a/src/com/android/settings/SettingsPreferenceFragment.java
+++ b/src/com/android/settings/SettingsPreferenceFragment.java
@@ -26,6 +26,7 @@
import android.os.Bundle;
import android.text.TextUtils;
import android.util.ArrayMap;
+import android.util.FeatureFlagUtils;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
@@ -42,6 +43,7 @@
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
+import com.android.settings.core.FeatureFlags;
import com.android.settings.core.InstrumentedPreferenceFragment;
import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
import com.android.settings.search.actionbar.SearchMenuController;
@@ -126,8 +128,11 @@
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
- SearchMenuController.init(this /* host */);
- HelpMenuController.init(this /* host */);
+ // TODO(b/176883483): Remove both search and help menu if this feature rolled out
+ if (!FeatureFlagUtils.isEnabled(getContext(), FeatureFlags.SILKY_HOME)) {
+ SearchMenuController.init(this /* host */);
+ HelpMenuController.init(this /* host */);
+ }
if (icicle != null) {
mPreferenceHighlighted = icicle.getBoolean(SAVE_HIGHLIGHTED_KEY);
diff --git a/src/com/android/settings/TestingSettingsBroadcastReceiver.java b/src/com/android/settings/TestingSettingsBroadcastReceiver.java
index 0e1296b..30a0d79 100644
--- a/src/com/android/settings/TestingSettingsBroadcastReceiver.java
+++ b/src/com/android/settings/TestingSettingsBroadcastReceiver.java
@@ -1,3 +1,19 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
package com.android.settings;
import android.content.BroadcastReceiver;
@@ -15,7 +31,8 @@
@Override
public void onReceive(Context context, Intent intent) {
- if (intent.getAction().equals(TelephonyManager.ACTION_SECRET_CODE)) {
+ if (intent != null && intent.getAction() != null
+ && intent.getAction().equals(TelephonyManager.ACTION_SECRET_CODE)) {
Intent i = new Intent(Intent.ACTION_MAIN);
i.setClass(context, TestingSettingsActivity.class);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
diff --git a/src/com/android/settings/accessibility/SystemControlsFragment.java b/src/com/android/settings/accessibility/SystemControlsFragment.java
new file mode 100644
index 0000000..237f2b4
--- /dev/null
+++ b/src/com/android/settings/accessibility/SystemControlsFragment.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.accessibility;
+
+import android.app.settings.SettingsEnums;
+
+import com.android.settings.R;
+import com.android.settings.dashboard.DashboardFragment;
+import com.android.settings.search.BaseSearchIndexProvider;
+import com.android.settingslib.search.SearchIndexable;
+
+/** Accessibility settings for system controls. */
+@SearchIndexable(forTarget = SearchIndexable.ALL & ~SearchIndexable.ARC)
+public class SystemControlsFragment extends DashboardFragment {
+
+ private static final String TAG = "SystemControlsFragment";
+
+ @Override
+ public int getMetricsCategory() {
+ return SettingsEnums.ACCESSIBILITY_SYSTEM_CONTROLS;
+ }
+
+ @Override
+ protected int getPreferenceScreenResId() {
+ return R.xml.accessibility_system_controls;
+ }
+
+ @Override
+ protected String getLogTag() {
+ return TAG;
+ }
+
+ public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
+ new BaseSearchIndexProvider(R.xml.accessibility_system_controls);
+
+}
diff --git a/src/com/android/settings/accessibility/TapAssistanceFragment.java b/src/com/android/settings/accessibility/TapAssistanceFragment.java
new file mode 100644
index 0000000..1a999ea
--- /dev/null
+++ b/src/com/android/settings/accessibility/TapAssistanceFragment.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.accessibility;
+
+import android.app.settings.SettingsEnums;
+
+import com.android.settings.R;
+import com.android.settings.dashboard.DashboardFragment;
+import com.android.settings.search.BaseSearchIndexProvider;
+import com.android.settingslib.search.SearchIndexable;
+
+/** Accessibility settings for tap assistance. */
+@SearchIndexable(forTarget = SearchIndexable.ALL & ~SearchIndexable.ARC)
+public class TapAssistanceFragment extends DashboardFragment {
+
+ private static final String TAG = "TapAssistanceFragment";
+
+ @Override
+ public int getMetricsCategory() {
+ return SettingsEnums.ACCESSIBILITY_TAP_ASSISTANCE;
+ }
+
+ @Override
+ protected int getPreferenceScreenResId() {
+ return R.xml.accessibility_tap_assistance;
+ }
+
+ @Override
+ protected String getLogTag() {
+ return TAG;
+ }
+
+ public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
+ new BaseSearchIndexProvider(R.xml.accessibility_tap_assistance);
+
+}
diff --git a/src/com/android/settings/accessibility/ToggleAutoclickCustomSeekbarController.java b/src/com/android/settings/accessibility/ToggleAutoclickCustomSeekbarController.java
index 31ce9d8..1a58b39 100644
--- a/src/com/android/settings/accessibility/ToggleAutoclickCustomSeekbarController.java
+++ b/src/com/android/settings/accessibility/ToggleAutoclickCustomSeekbarController.java
@@ -30,6 +30,7 @@
import android.widget.SeekBar;
import android.widget.TextView;
+import androidx.annotation.VisibleForTesting;
import androidx.preference.PreferenceScreen;
import com.android.settings.R;
@@ -49,7 +50,9 @@
private static final String CONTROL_AUTOCLICK_DELAY_SECURE =
Settings.Secure.ACCESSIBILITY_AUTOCLICK_DELAY;
- private static final String KEY_CUSTOM_DELAY_VALUE = "custom_delay_value";
+
+ @VisibleForTesting
+ static final String KEY_CUSTOM_DELAY_VALUE = "custom_delay_value";
// Min allowed autoclick delay value.
static final int MIN_AUTOCLICK_DELAY_MS = 200;
@@ -59,7 +62,8 @@
// Allowed autoclick delay values are discrete.
// This is the difference between two allowed values.
- private static final int AUTOCLICK_DELAY_STEP = 100;
+ @VisibleForTesting
+ static final int AUTOCLICK_DELAY_STEP = 100;
private final SharedPreferences mSharedPreferences;
private final ContentResolver mContentResolver;
@@ -68,7 +72,8 @@
private SeekBar mSeekBar;
private TextView mDelayLabel;
- private final SeekBar.OnSeekBarChangeListener mSeekBarChangeListener =
+ @VisibleForTesting
+ final SeekBar.OnSeekBarChangeListener mSeekBarChangeListener =
new SeekBar.OnSeekBarChangeListener() {
@Override
diff --git a/src/com/android/settings/applications/appinfo/DefaultAppShortcutPreferenceControllerBase.java b/src/com/android/settings/applications/appinfo/DefaultAppShortcutPreferenceControllerBase.java
index 5a1883b..5df30c2 100644
--- a/src/com/android/settings/applications/appinfo/DefaultAppShortcutPreferenceControllerBase.java
+++ b/src/com/android/settings/applications/appinfo/DefaultAppShortcutPreferenceControllerBase.java
@@ -14,7 +14,9 @@
package com.android.settings.applications.appinfo;
+import android.app.role.RoleControllerManager;
import android.app.role.RoleManager;
+import android.app.settings.SettingsEnums;
import android.content.Context;
import android.content.Intent;
import android.os.UserManager;
@@ -56,12 +58,14 @@
mRoleManager = context.getSystemService(RoleManager.class);
+ final RoleControllerManager roleControllerManager =
+ mContext.getSystemService(RoleControllerManager.class);
final Executor executor = mContext.getMainExecutor();
- mRoleManager.isRoleVisible(mRoleName, executor, visible -> {
+ roleControllerManager.isRoleVisible(mRoleName, executor, visible -> {
mRoleVisible = visible;
refreshAvailability();
});
- mRoleManager.isApplicationVisibleForRole(mRoleName, mPackageName, executor,
+ roleControllerManager.isApplicationVisibleForRole(mRoleName, mPackageName, executor,
visible -> {
mAppVisible = visible;
refreshAvailability();
diff --git a/src/com/android/settings/bluetooth/BluetoothSliceBuilder.java b/src/com/android/settings/bluetooth/BluetoothSliceBuilder.java
index 67c3650..b09d180 100644
--- a/src/com/android/settings/bluetooth/BluetoothSliceBuilder.java
+++ b/src/com/android/settings/bluetooth/BluetoothSliceBuilder.java
@@ -136,6 +136,6 @@
final Intent intent = new Intent(ACTION_BLUETOOTH_SLICE_CHANGED)
.setClass(context, SliceBroadcastReceiver.class);
return PendingIntent.getBroadcast(context, 0 /* requestCode */, intent,
- PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE);
+ PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_MUTABLE);
}
}
diff --git a/src/com/android/settings/core/SettingsBaseActivity.java b/src/com/android/settings/core/SettingsBaseActivity.java
index d160dc5..4704702 100644
--- a/src/com/android/settings/core/SettingsBaseActivity.java
+++ b/src/com/android/settings/core/SettingsBaseActivity.java
@@ -29,6 +29,7 @@
import android.os.Bundle;
import android.text.TextUtils;
import android.util.ArraySet;
+import android.util.FeatureFlagUtils;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
@@ -43,8 +44,11 @@
import com.android.settings.dashboard.CategoryManager;
import com.android.settingslib.drawer.Tile;
+import com.google.android.material.appbar.CollapsingToolbarLayout;
import com.google.android.setupcompat.util.WizardManagerHelper;
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
@@ -55,6 +59,7 @@
protected static final boolean DEBUG_TIMING = false;
private static final String TAG = "SettingsBaseActivity";
private static final String DATA_SCHEME_PKG = "package";
+ private static final int TOOLBAR_MAX_LINE_NUMBER = 2;
// Serves as a temporary list of tiles to ignore until we heard back from the PM that they
// are disabled.
@@ -62,6 +67,8 @@
private final PackageReceiver mPackageReceiver = new PackageReceiver();
private final List<CategoryListener> mCategoryListeners = new ArrayList<>();
+
+ protected CollapsingToolbarLayout mCollapsingToolbarLayout;
private int mCategoriesUpdateTaskCount;
@Override
@@ -79,21 +86,30 @@
requestWindowFeature(Window.FEATURE_NO_TITLE);
}
// Apply SetupWizard light theme during setup flow. This is for SubSettings pages.
- if (WizardManagerHelper.isAnySetupWizard(getIntent()) && this instanceof SubSettings) {
+ final boolean isAnySetupWizard = WizardManagerHelper.isAnySetupWizard(getIntent());
+ if (isAnySetupWizard && this instanceof SubSettings) {
setTheme(R.style.LightTheme_SubSettings_SetupWizard);
}
- super.setContentView(R.layout.settings_base_layout);
+ if (FeatureFlagUtils.isEnabled(this, FeatureFlags.SILKY_HOME)
+ && isToolbarEnabled() && !isAnySetupWizard) {
+ super.setContentView(R.layout.settings_collapsing_base_layout);
+ mCollapsingToolbarLayout = findViewById(R.id.collapsing_toolbar);
+ } else {
+ super.setContentView(R.layout.settings_base_layout);
+ }
+
+ // This is to hide the toolbar from those pages which don't need a toolbar originally.
final Toolbar toolbar = findViewById(R.id.action_bar);
- if (theme.getBoolean(android.R.styleable.Theme_windowNoTitle, false)) {
+ if (!isToolbarEnabled() || isAnySetupWizard) {
toolbar.setVisibility(View.GONE);
return;
}
setActionBar(toolbar);
+ initCollapsingToolbar();
if (DEBUG_TIMING) {
- Log.d(TAG, "onCreate took " + (System.currentTimeMillis() - startTime)
- + " ms");
+ Log.d(TAG, "onCreate took " + (System.currentTimeMillis() - startTime) + " ms");
}
}
@@ -151,6 +167,70 @@
((ViewGroup) findViewById(R.id.content_frame)).addView(view, params);
}
+ @Override
+ public void setTitle(CharSequence title) {
+ if (mCollapsingToolbarLayout != null) {
+ mCollapsingToolbarLayout.setTitle(title);
+ }
+ super.setTitle(title);
+ }
+
+ @Override
+ public void setTitle(int titleId) {
+ if (mCollapsingToolbarLayout != null) {
+ mCollapsingToolbarLayout.setTitle(getText(titleId));
+ }
+ super.setTitle(titleId);
+ }
+
+ /**
+ * SubSetting page should show a toolbar by default. If the page wouldn't show a toolbar,
+ * override this method and return false value.
+ * @return ture by default
+ */
+ protected boolean isToolbarEnabled() {
+ return true;
+ }
+
+ private void initCollapsingToolbar() {
+ if (mCollapsingToolbarLayout == null) {
+ return;
+ }
+ mCollapsingToolbarLayout.addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
+ @Override
+ public void onLayoutChange(View v, int left, int top, int right, int bottom,
+ int oldLeft, int oldTop, int oldRight, int oldBottom) {
+ v.removeOnLayoutChangeListener(this);
+ final int count = getLineCount();
+ if (count > TOOLBAR_MAX_LINE_NUMBER) {
+ mCollapsingToolbarLayout
+ .setExpandedTitleTextAppearance(R.style.ToolbarText_MoreThanTwoLines);
+ } else {
+ mCollapsingToolbarLayout.setExpandedTitleTextAppearance(R.style.ToolbarText);
+ }
+ }
+ });
+ }
+
+ private int getLineCount() {
+ try {
+ final Class<?> toolbarClazz = mCollapsingToolbarLayout.getClass();
+ final Field textHelperField = toolbarClazz.getDeclaredField("collapsingTextHelper");
+ textHelperField.setAccessible(true);
+ final Object textHelperObj = textHelperField.get(mCollapsingToolbarLayout);
+
+ final Field layoutField = textHelperObj.getClass().getDeclaredField("textLayout");
+ layoutField.setAccessible(true);
+ final Object layoutObj = layoutField.get(textHelperObj);
+
+ final Method method = layoutObj.getClass().getDeclaredMethod("getLineCount");
+ return (int) method.invoke(layoutObj);
+ } catch (Exception e) {
+ return 0;
+ }
+ }
+
+
private void onCategoriesChanged(Set<String> categories) {
final int N = mCategoryListeners.size();
for (int i = 0; i < N; i++) {
diff --git a/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java b/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java
index 0243b8a..9c00e4b 100644
--- a/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java
+++ b/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java
@@ -184,6 +184,9 @@
pref.setOrder(order + baseOrder);
}
}
+
+ overrideTilePosition(tile, pref);
+
return outObservers.isEmpty() ? null : outObservers;
}
@@ -457,4 +460,25 @@
}
return eligibleUsers;
}
+
+ private void overrideTilePosition(Tile tile, Preference pref) {
+ if (FeatureFlagUtils.isEnabled(mContext, FeatureFlags.SILKY_HOME)
+ && TextUtils.equals(tile.getCategory(), CategoryKey.CATEGORY_HOMEPAGE)) {
+ final String[] homepageTilePackages = mContext.getResources().getStringArray(
+ R.array.config_homepage_tile_packages);
+ final int[] homepageTileOrders = mContext.getResources().getIntArray(
+ R.array.config_homepage_tile_orders);
+ if (homepageTilePackages.length == 0
+ || homepageTilePackages.length != homepageTileOrders.length) {
+ return;
+ }
+
+ for (int i = 0; i < homepageTilePackages.length; i++) {
+ if (TextUtils.equals(tile.getPackageName(), homepageTilePackages[i])) {
+ pref.setOrder(homepageTileOrders[i]);
+ return;
+ }
+ }
+ }
+ }
}
diff --git a/src/com/android/settings/display/TopLevelWallpaperPreferenceController.java b/src/com/android/settings/display/TopLevelWallpaperPreferenceController.java
index beef4f3..5118b27 100644
--- a/src/com/android/settings/display/TopLevelWallpaperPreferenceController.java
+++ b/src/com/android/settings/display/TopLevelWallpaperPreferenceController.java
@@ -25,6 +25,7 @@
import android.content.pm.ResolveInfo;
import android.os.UserHandle;
import android.text.TextUtils;
+import android.util.FeatureFlagUtils;
import android.util.Log;
import androidx.preference.Preference;
@@ -32,6 +33,8 @@
import com.android.settings.R;
import com.android.settings.core.BasePreferenceController;
+import com.android.settings.core.FeatureFlags;
+import com.android.settings.homepage.RestrictedHomepagePreference;
import com.android.settingslib.RestrictedLockUtilsInternal;
import com.android.settingslib.RestrictedTopLevelPreference;
@@ -89,7 +92,11 @@
@Override
public void updateState(Preference preference) {
- disablePreferenceIfManaged((RestrictedTopLevelPreference) preference);
+ if (FeatureFlagUtils.isEnabled(mContext, FeatureFlags.SILKY_HOME)) {
+ disablePreferenceIfManaged((RestrictedHomepagePreference) preference);
+ } else {
+ disablePreferenceIfManaged((RestrictedTopLevelPreference) preference);
+ }
}
@Override
@@ -133,4 +140,18 @@
}
}
}
+
+ private void disablePreferenceIfManaged(RestrictedHomepagePreference pref) {
+ final String restriction = DISALLOW_SET_WALLPAPER;
+ if (pref != null) {
+ pref.setDisabledByAdmin(null);
+ if (RestrictedLockUtilsInternal.hasBaseUserRestriction(mContext,
+ restriction, UserHandle.myUserId())) {
+ // Do not show the admin dialog for system restriction.
+ pref.setEnabled(false);
+ } else {
+ pref.checkRestrictionAndSetDisabled(restriction);
+ }
+ }
+ }
}
diff --git a/src/com/android/settings/emergency/EmergencyDashboardFragment.java b/src/com/android/settings/emergency/EmergencyDashboardFragment.java
index c786767..1983430 100644
--- a/src/com/android/settings/emergency/EmergencyDashboardFragment.java
+++ b/src/com/android/settings/emergency/EmergencyDashboardFragment.java
@@ -44,7 +44,7 @@
@Override
public int getMetricsCategory() {
- return SettingsEnums.EMERGENCY_SOS_GESTURE_SETTINGS;
+ return SettingsEnums.EMERGENCY_SETTINGS;
}
public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
diff --git a/src/com/android/settings/gestures/EmergencyGesturePreferenceController.java b/src/com/android/settings/gestures/EmergencyGesturePreferenceController.java
index 6f0357f..2415526 100644
--- a/src/com/android/settings/gestures/EmergencyGesturePreferenceController.java
+++ b/src/com/android/settings/gestures/EmergencyGesturePreferenceController.java
@@ -21,18 +21,19 @@
import android.widget.Switch;
import androidx.annotation.VisibleForTesting;
+import androidx.preference.Preference;
import androidx.preference.PreferenceScreen;
import com.android.settings.R;
import com.android.settings.core.BasePreferenceController;
-import com.android.settings.widget.SwitchBar;
-import com.android.settingslib.widget.LayoutPreference;
+import com.android.settingslib.widget.MainSwitchPreference;
+import com.android.settingslib.widget.OnMainSwitchChangeListener;
/**
* Preference controller for emergency gesture setting
*/
public class EmergencyGesturePreferenceController extends BasePreferenceController implements
- SwitchBar.OnSwitchChangeListener {
+ OnMainSwitchChangeListener {
@VisibleForTesting
static final int ON = 1;
@@ -41,7 +42,7 @@
private static final String SECURE_KEY = Settings.Secure.EMERGENCY_GESTURE_ENABLED;
- private SwitchBar mSwitchBar;
+ private MainSwitchPreference mSwitchBar;
public EmergencyGesturePreferenceController(Context context, String key) {
super(context, key);
@@ -61,13 +62,11 @@
@Override
public void displayPreference(PreferenceScreen screen) {
super.displayPreference(screen);
- final LayoutPreference pref = screen.findPreference(mPreferenceKey);
- mSwitchBar = pref.findViewById(R.id.switch_bar);
- mSwitchBar.setSwitchBarText(R.string.emergency_gesture_switchbar_title,
- R.string.emergency_gesture_switchbar_title);
+ final Preference pref = screen.findPreference(mPreferenceKey);
+ mSwitchBar = (MainSwitchPreference) pref;
+ mSwitchBar.setTitle(mContext.getString(R.string.emergency_gesture_switchbar_title));
mSwitchBar.addOnSwitchChangeListener(this);
- mSwitchBar.setChecked(isChecked());
- mSwitchBar.show();
+ mSwitchBar.updateStatus(isChecked());
}
@VisibleForTesting
diff --git a/src/com/android/settings/gestures/PreventRingingParentPreferenceController.java b/src/com/android/settings/gestures/PreventRingingParentPreferenceController.java
index 7c7be09..ca1f1c7 100644
--- a/src/com/android/settings/gestures/PreventRingingParentPreferenceController.java
+++ b/src/com/android/settings/gestures/PreventRingingParentPreferenceController.java
@@ -20,21 +20,85 @@
import static android.provider.Settings.Secure.VOLUME_HUSH_MUTE;
import static android.provider.Settings.Secure.VOLUME_HUSH_VIBRATE;
+import android.content.ContentResolver;
import android.content.Context;
+import android.database.ContentObserver;
+import android.net.Uri;
+import android.os.Handler;
import android.provider.Settings;
-import com.android.settings.R;
-import com.android.settings.core.BasePreferenceController;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceScreen;
-public class PreventRingingParentPreferenceController extends BasePreferenceController {
+import com.android.settings.R;
+import com.android.settings.core.TogglePreferenceController;
+import com.android.settings.widget.PrimarySwitchPreference;
+import com.android.settingslib.core.lifecycle.LifecycleObserver;
+import com.android.settingslib.core.lifecycle.events.OnStart;
+import com.android.settingslib.core.lifecycle.events.OnStop;
+
+/** The controller manages the behaviour of the Prevent Ringing gesture setting. */
+public class PreventRingingParentPreferenceController extends TogglePreferenceController
+ implements LifecycleObserver, OnStart, OnStop {
final String SECURE_KEY = VOLUME_HUSH_GESTURE;
+ private PrimarySwitchPreference mPreference;
+ private SettingObserver mSettingObserver;
+
public PreventRingingParentPreferenceController(Context context, String preferenceKey) {
super(context, preferenceKey);
}
@Override
+ public void displayPreference(PreferenceScreen screen) {
+ super.displayPreference(screen);
+ mPreference = screen.findPreference(getPreferenceKey());
+ mSettingObserver = new SettingObserver(mPreference);
+ }
+
+ @Override
+ public boolean isChecked() {
+ final int preventRinging = Settings.Secure.getInt(mContext.getContentResolver(),
+ Settings.Secure.VOLUME_HUSH_GESTURE,
+ Settings.Secure.VOLUME_HUSH_VIBRATE);
+ return preventRinging != Settings.Secure.VOLUME_HUSH_OFF;
+ }
+
+ @Override
+ public boolean setChecked(boolean isChecked) {
+ final int preventRingingSetting = Settings.Secure.getInt(mContext.getContentResolver(),
+ Settings.Secure.VOLUME_HUSH_GESTURE, Settings.Secure.VOLUME_HUSH_VIBRATE);
+ final int newRingingSetting = preventRingingSetting == Settings.Secure.VOLUME_HUSH_OFF
+ ? Settings.Secure.VOLUME_HUSH_VIBRATE
+ : preventRingingSetting;
+
+ return Settings.Secure.putInt(mContext.getContentResolver(),
+ Settings.Secure.VOLUME_HUSH_GESTURE, isChecked
+ ? newRingingSetting
+ : Settings.Secure.VOLUME_HUSH_OFF);
+ }
+
+ @Override
+ public void updateState(Preference preference) {
+ super.updateState(preference);
+ final int value = Settings.Secure.getInt(
+ mContext.getContentResolver(), SECURE_KEY, VOLUME_HUSH_VIBRATE);
+ CharSequence summary;
+ switch (value) {
+ case VOLUME_HUSH_VIBRATE:
+ summary = mContext.getText(R.string.prevent_ringing_option_vibrate_summary);
+ break;
+ case VOLUME_HUSH_MUTE:
+ summary = mContext.getText(R.string.prevent_ringing_option_mute_summary);
+ break;
+ default:
+ summary = null;
+ }
+ preference.setSummary(summary);
+ }
+
+ @Override
public int getAvailabilityStatus() {
return mContext.getResources().getBoolean(
com.android.internal.R.bool.config_volumeHushGestureEnabled)
@@ -42,20 +106,45 @@
}
@Override
- public CharSequence getSummary() {
- int value = Settings.Secure.getInt(
- mContext.getContentResolver(), SECURE_KEY, VOLUME_HUSH_VIBRATE);
- int summary;
- switch (value) {
- case VOLUME_HUSH_VIBRATE:
- summary = R.string.prevent_ringing_option_vibrate_summary;
- break;
- case VOLUME_HUSH_MUTE:
- summary = R.string.prevent_ringing_option_mute_summary;
- break;
- default:
- summary = R.string.prevent_ringing_option_none_summary;
+ public void onStart() {
+ if (mSettingObserver != null) {
+ mSettingObserver.register(mContext.getContentResolver());
+ mSettingObserver.onChange(false, null);
}
- return mContext.getText(summary);
+ }
+
+ @Override
+ public void onStop() {
+ if (mSettingObserver != null) {
+ mSettingObserver.unregister(mContext.getContentResolver());
+ }
+ }
+
+ private class SettingObserver extends ContentObserver {
+ private final Uri mVolumeHushGestureUri = Settings.Secure.getUriFor(
+ Settings.Secure.VOLUME_HUSH_GESTURE);
+
+ private final Preference mPreference;
+
+ SettingObserver(Preference preference) {
+ super(new Handler());
+ mPreference = preference;
+ }
+
+ public void register(ContentResolver cr) {
+ cr.registerContentObserver(mVolumeHushGestureUri, false, this);
+ }
+
+ public void unregister(ContentResolver cr) {
+ cr.unregisterContentObserver(this);
+ }
+
+ @Override
+ public void onChange(boolean selfChange, Uri uri) {
+ super.onChange(selfChange, uri);
+ if (uri == null || mVolumeHushGestureUri.equals(uri)) {
+ updateState(mPreference);
+ }
+ }
}
}
diff --git a/src/com/android/settings/gestures/PreventRingingSwitchPreferenceController.java b/src/com/android/settings/gestures/PreventRingingSwitchPreferenceController.java
index 9545939..642623a 100644
--- a/src/com/android/settings/gestures/PreventRingingSwitchPreferenceController.java
+++ b/src/com/android/settings/gestures/PreventRingingSwitchPreferenceController.java
@@ -16,11 +16,7 @@
package com.android.settings.gestures;
-import android.content.ContentResolver;
import android.content.Context;
-import android.database.ContentObserver;
-import android.net.Uri;
-import android.os.Handler;
import android.provider.Settings;
import android.widget.Switch;
@@ -30,19 +26,18 @@
import com.android.settings.R;
import com.android.settings.core.PreferenceControllerMixin;
-import com.android.settings.widget.SwitchBar;
import com.android.settingslib.core.AbstractPreferenceController;
-import com.android.settingslib.widget.LayoutPreference;
+import com.android.settingslib.widget.MainSwitchPreference;
+import com.android.settingslib.widget.OnMainSwitchChangeListener;
public class PreventRingingSwitchPreferenceController extends AbstractPreferenceController
- implements PreferenceControllerMixin, SwitchBar.OnSwitchChangeListener {
+ implements PreferenceControllerMixin, OnMainSwitchChangeListener {
private static final String KEY = "gesture_prevent_ringing_switch";
private final Context mContext;
- private SettingObserver mSettingObserver;
@VisibleForTesting
- SwitchBar mSwitch;
+ MainSwitchPreference mSwitch;
public PreventRingingSwitchPreferenceController(Context context) {
super(context);
@@ -58,9 +53,8 @@
public void displayPreference(PreferenceScreen screen) {
super.displayPreference(screen);
if (isAvailable()) {
- LayoutPreference pref = screen.findPreference(getPreferenceKey());
+ Preference pref = screen.findPreference(getPreferenceKey());
if (pref != null) {
- mSettingObserver = new SettingObserver(pref);
pref.setOnPreferenceClickListener(preference -> {
int preventRinging = Settings.Secure.getInt(mContext.getContentResolver(),
Settings.Secure.VOLUME_HUSH_GESTURE,
@@ -72,18 +66,17 @@
: Settings.Secure.VOLUME_HUSH_VIBRATE);
return true;
});
- mSwitch = pref.findViewById(R.id.switch_bar);
- if (mSwitch != null) {
- mSwitch.addOnSwitchChangeListener(this);
- mSwitch.show();
- }
+ mSwitch = (MainSwitchPreference) pref;
+ mSwitch.setTitle(mContext.getString(R.string.prevent_ringing_main_switch_title));
+ mSwitch.addOnSwitchChangeListener(this);
+ updateState(mSwitch);
}
}
}
public void setChecked(boolean isChecked) {
if (mSwitch != null) {
- mSwitch.setChecked(isChecked);
+ mSwitch.updateStatus(isChecked);
}
}
@@ -113,32 +106,4 @@
? newRingingSetting
: Settings.Secure.VOLUME_HUSH_OFF);
}
-
- private class SettingObserver extends ContentObserver {
- private final Uri VOLUME_HUSH_GESTURE = Settings.Secure.getUriFor(
- Settings.Secure.VOLUME_HUSH_GESTURE);
-
- private final Preference mPreference;
-
- public SettingObserver(Preference preference) {
- super(new Handler());
- mPreference = preference;
- }
-
- public void register(ContentResolver cr) {
- cr.registerContentObserver(VOLUME_HUSH_GESTURE, false, this);
- }
-
- public void unregister(ContentResolver cr) {
- cr.unregisterContentObserver(this);
- }
-
- @Override
- public void onChange(boolean selfChange, Uri uri) {
- super.onChange(selfChange, uri);
- if (uri == null || VOLUME_HUSH_GESTURE.equals(uri)) {
- updateState(mPreference);
- }
- }
- }
}
diff --git a/src/com/android/settings/homepage/HomePagePreference.java b/src/com/android/settings/homepage/HomePagePreference.java
new file mode 100644
index 0000000..41d59b7
--- /dev/null
+++ b/src/com/android/settings/homepage/HomePagePreference.java
@@ -0,0 +1,49 @@
+/*
+ * 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.homepage;
+
+import android.content.Context;
+import android.util.AttributeSet;
+
+import androidx.preference.Preference;
+
+import com.android.settings.R;
+
+/** A customized layout for homepage preference. */
+public class HomePagePreference extends Preference {
+
+ public HomePagePreference(Context context) {
+ super(context);
+ setLayoutResource(R.layout.homepage_preference);
+ }
+
+ public HomePagePreference(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ setLayoutResource(R.layout.homepage_preference);
+ }
+
+ public HomePagePreference(Context context, AttributeSet attrs, int defStyleAttr) {
+ this(context, attrs, defStyleAttr, /* defStyleRes= */ 0);
+ setLayoutResource(R.layout.homepage_preference);
+ }
+
+ public HomePagePreference(Context context, AttributeSet attrs,
+ int defStyleAttr, int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
+ setLayoutResource(R.layout.homepage_preference);
+ }
+}
diff --git a/src/com/android/settings/homepage/RestrictedHomepagePreference.java b/src/com/android/settings/homepage/RestrictedHomepagePreference.java
new file mode 100644
index 0000000..47b552c
--- /dev/null
+++ b/src/com/android/settings/homepage/RestrictedHomepagePreference.java
@@ -0,0 +1,122 @@
+/*
+ * 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.homepage;
+
+import static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
+
+import android.content.Context;
+import android.os.UserHandle;
+import android.util.AttributeSet;
+
+import androidx.core.content.res.TypedArrayUtils;
+import androidx.preference.PreferenceManager;
+import androidx.preference.PreferenceViewHolder;
+
+import com.android.settings.R;
+import com.android.settingslib.RestrictedPreferenceHelper;
+
+/** Homepage preference that can be disabled by a device admin using a user restriction. */
+public class RestrictedHomepagePreference extends HomePagePreference {
+ private RestrictedPreferenceHelper mHelper;
+
+ public RestrictedHomepagePreference(Context context, AttributeSet attrs,
+ int defStyleAttr, int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
+ mHelper = new RestrictedPreferenceHelper(context, /* preference= */ this, attrs);
+ }
+
+ public RestrictedHomepagePreference(Context context, AttributeSet attrs, int defStyleAttr) {
+ this(context, attrs, defStyleAttr, /* defStyleRes= */ 0);
+ }
+
+ public RestrictedHomepagePreference(Context context, AttributeSet attrs) {
+ this(context, attrs, TypedArrayUtils.getAttr(context, R.attr.preferenceStyle,
+ android.R.attr.preferenceStyle));
+ }
+
+ public RestrictedHomepagePreference(Context context) {
+ this(context, /* attrs= */ null);
+ }
+
+ @Override
+ public void onBindViewHolder(PreferenceViewHolder holder) {
+ super.onBindViewHolder(holder);
+ mHelper.onBindViewHolder(holder);
+ }
+
+ @Override
+ public void performClick() {
+ if (!mHelper.performClick()) {
+ super.performClick();
+ }
+ }
+
+ @Override
+ protected void onAttachedToHierarchy(PreferenceManager preferenceManager) {
+ mHelper.onAttachedToHierarchy();
+ super.onAttachedToHierarchy(preferenceManager);
+ }
+
+ /**
+ * Set the user restriction and disable this preference.
+ *
+ * @param userRestriction constant from {@link android.os.UserManager}
+ */
+ public void checkRestrictionAndSetDisabled(String userRestriction) {
+ mHelper.checkRestrictionAndSetDisabled(userRestriction, UserHandle.myUserId());
+ }
+
+ /**
+ * Set the user restriction and disable this preference for the given user.
+ *
+ * @param userRestriction constant from {@link android.os.UserManager}
+ * @param userId user to check the restriction for.
+ */
+ public void checkRestrictionAndSetDisabled(String userRestriction, int userId) {
+ mHelper.checkRestrictionAndSetDisabled(userRestriction, userId);
+ }
+
+ @Override
+ public void setEnabled(boolean enabled) {
+ if (enabled && isDisabledByAdmin()) {
+ mHelper.setDisabledByAdmin(/* admin= */ null);
+ return;
+ }
+ super.setEnabled(enabled);
+ }
+
+ /**
+ * Check whether this preference is disabled by admin.
+ *
+ * @return true if this preference is disabled by admin.
+ */
+ public boolean isDisabledByAdmin() {
+ return mHelper.isDisabledByAdmin();
+ }
+
+ /**
+ * Disable preference based on the enforce admin.
+ *
+ * @param admin details of the admin who enforced the restriction. If it is {@code null}, then
+ * this preference will be enabled. Otherwise, it will be disabled.
+ */
+ public void setDisabledByAdmin(EnforcedAdmin admin) {
+ if (mHelper.setDisabledByAdmin(admin)) {
+ notifyChanged();
+ }
+ }
+}
diff --git a/src/com/android/settings/homepage/contextualcards/slices/FaceSetupSlice.java b/src/com/android/settings/homepage/contextualcards/slices/FaceSetupSlice.java
index 2e34824..1b3ee10 100644
--- a/src/com/android/settings/homepage/contextualcards/slices/FaceSetupSlice.java
+++ b/src/com/android/settings/homepage/contextualcards/slices/FaceSetupSlice.java
@@ -143,8 +143,8 @@
private static RowBuilder buildRowBuilder(CharSequence title, CharSequence subTitle,
IconCompat icon, Context context, Intent intent) {
final SliceAction primarySliceAction = SliceAction.createDeeplink(
- PendingIntent.getActivity(context, 0, intent, 0), icon, ListBuilder.ICON_IMAGE,
- title);
+ PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_IMMUTABLE),
+ icon, ListBuilder.ICON_IMAGE, title);
return new RowBuilder()
.setTitleItem(icon, ListBuilder.ICON_IMAGE)
.setTitle(title)
diff --git a/src/com/android/settings/inputmethod/UserDictionarySettings.java b/src/com/android/settings/inputmethod/UserDictionarySettings.java
index 67420a2..5e3e749 100644
--- a/src/com/android/settings/inputmethod/UserDictionarySettings.java
+++ b/src/com/android/settings/inputmethod/UserDictionarySettings.java
@@ -26,6 +26,7 @@
import android.os.Bundle;
import android.provider.UserDictionary;
import android.text.TextUtils;
+import android.util.FeatureFlagUtils;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
@@ -44,6 +45,7 @@
import androidx.loader.content.Loader;
import com.android.settings.R;
+import com.android.settings.core.FeatureFlags;
import com.android.settings.core.SubSettingLauncher;
import com.android.settings.overlay.FeatureFactory;
import com.android.settingslib.core.instrumentation.Instrumentable;
@@ -104,6 +106,10 @@
@Override
public View onCreateView(
LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
+ // TODO(b/176883483): Remove the title after material component updated
+ if (FeatureFlagUtils.isEnabled(getContext(), FeatureFlags.SILKY_HOME)) {
+ getActivity().setTitle(R.string.user_dict_settings_title);
+ }
// Show the language as a subtitle of the action bar
final ActionBar actionBar = getActivity().getActionBar();
if (actionBar != null) {
diff --git a/src/com/android/settings/media/BluetoothPairingReceiver.java b/src/com/android/settings/media/BluetoothPairingReceiver.java
index 5b57800..1ec99b0 100644
--- a/src/com/android/settings/media/BluetoothPairingReceiver.java
+++ b/src/com/android/settings/media/BluetoothPairingReceiver.java
@@ -25,7 +25,7 @@
import com.android.settings.R;
import com.android.settings.bluetooth.BluetoothPairingDetail;
import com.android.settings.core.SubSettingLauncher;
-import com.android.settingslib.media.MediaOutputSliceConstants;
+import com.android.settingslib.media.MediaOutputConstants;
/**
* BroadcastReceiver for handling media output intent
@@ -33,7 +33,7 @@
public class BluetoothPairingReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
- if (TextUtils.equals(MediaOutputSliceConstants.ACTION_LAUNCH_BLUETOOTH_PAIRING,
+ if (TextUtils.equals(MediaOutputConstants.ACTION_LAUNCH_BLUETOOTH_PAIRING,
intent.getAction())) {
context.startActivity(new SubSettingLauncher(context)
.setDestination(BluetoothPairingDetail.class.getName())
diff --git a/src/com/android/settings/media/MediaOutputIndicatorSlice.java b/src/com/android/settings/media/MediaOutputIndicatorSlice.java
index 69e5dde..10a8b79 100644
--- a/src/com/android/settings/media/MediaOutputIndicatorSlice.java
+++ b/src/com/android/settings/media/MediaOutputIndicatorSlice.java
@@ -36,7 +36,7 @@
import com.android.settings.Utils;
import com.android.settings.slices.CustomSliceable;
import com.android.settings.slices.SliceBackgroundWorker;
-import com.android.settingslib.media.MediaOutputSliceConstants;
+import com.android.settingslib.media.MediaOutputConstants;
public class MediaOutputIndicatorSlice implements CustomSliceable {
@@ -128,15 +128,15 @@
}
// Launch media output dialog
mContext.sendBroadcast(new Intent()
- .setPackage(MediaOutputSliceConstants.SYSTEMUI_PACKAGE_NAME)
- .setAction(MediaOutputSliceConstants.ACTION_LAUNCH_MEDIA_OUTPUT_DIALOG)
- .putExtra(MediaOutputSliceConstants.KEY_MEDIA_SESSION_TOKEN,
+ .setPackage(MediaOutputConstants.SYSTEMUI_PACKAGE_NAME)
+ .setAction(MediaOutputConstants.ACTION_LAUNCH_MEDIA_OUTPUT_DIALOG)
+ .putExtra(MediaOutputConstants.KEY_MEDIA_SESSION_TOKEN,
mediaController.getSessionToken())
- .putExtra(MediaOutputSliceConstants.EXTRA_PACKAGE_NAME,
+ .putExtra(MediaOutputConstants.EXTRA_PACKAGE_NAME,
mediaController.getPackageName()));
// Dismiss volume panel
mContext.sendBroadcast(new Intent()
- .setPackage(MediaOutputSliceConstants.SETTINGS_PACKAGE_NAME)
- .setAction(MediaOutputSliceConstants.ACTION_CLOSE_PANEL));
+ .setPackage(MediaOutputConstants.SETTINGS_PACKAGE_NAME)
+ .setAction(MediaOutputConstants.ACTION_CLOSE_PANEL));
}
}
diff --git a/src/com/android/settings/media/RemoteMediaSlice.java b/src/com/android/settings/media/RemoteMediaSlice.java
index 839dc4f..e69c005 100644
--- a/src/com/android/settings/media/RemoteMediaSlice.java
+++ b/src/com/android/settings/media/RemoteMediaSlice.java
@@ -48,7 +48,7 @@
import com.android.settings.slices.SliceBackgroundWorker;
import com.android.settings.slices.SliceBroadcastReceiver;
import com.android.settings.slices.SliceBuilderUtils;
-import com.android.settingslib.media.MediaOutputSliceConstants;
+import com.android.settingslib.media.MediaOutputConstants;
import java.util.List;
@@ -86,14 +86,14 @@
// Launch Media Output Dialog
final RoutingSessionInfo info = intent.getParcelableExtra(SESSION_INFO);
mContext.sendBroadcast(new Intent()
- .setPackage(MediaOutputSliceConstants.SYSTEMUI_PACKAGE_NAME)
- .setAction(MediaOutputSliceConstants.ACTION_LAUNCH_MEDIA_OUTPUT_DIALOG)
- .putExtra(MediaOutputSliceConstants.EXTRA_PACKAGE_NAME,
+ .setPackage(MediaOutputConstants.SYSTEMUI_PACKAGE_NAME)
+ .setAction(MediaOutputConstants.ACTION_LAUNCH_MEDIA_OUTPUT_DIALOG)
+ .putExtra(MediaOutputConstants.EXTRA_PACKAGE_NAME,
info.getClientPackageName()));
// Dismiss volume panel
mContext.sendBroadcast(new Intent()
- .setPackage(MediaOutputSliceConstants.SETTINGS_PACKAGE_NAME)
- .setAction(MediaOutputSliceConstants.ACTION_CLOSE_PANEL));
+ .setPackage(MediaOutputConstants.SETTINGS_PACKAGE_NAME)
+ .setAction(MediaOutputConstants.ACTION_CLOSE_PANEL));
}
}
diff --git a/src/com/android/settings/network/telephony/EuiccOperationSidecar.java b/src/com/android/settings/network/telephony/EuiccOperationSidecar.java
index c82220e..0ee6d95 100644
--- a/src/com/android/settings/network/telephony/EuiccOperationSidecar.java
+++ b/src/com/android/settings/network/telephony/EuiccOperationSidecar.java
@@ -99,7 +99,8 @@
Intent intent = new Intent(getReceiverAction());
intent.putExtra(EXTRA_OP_ID, mOpId);
return PendingIntent.getBroadcast(
- getContext(), REQUEST_CODE, intent, PendingIntent.FLAG_CANCEL_CURRENT);
+ getContext(), REQUEST_CODE, intent,
+ PendingIntent.FLAG_CANCEL_CURRENT | PendingIntent.FLAG_IMMUTABLE);
}
@Override
diff --git a/src/com/android/settings/network/telephony/MobileDataSlice.java b/src/com/android/settings/network/telephony/MobileDataSlice.java
index c3b08d3..106f336 100644
--- a/src/com/android/settings/network/telephony/MobileDataSlice.java
+++ b/src/com/android/settings/network/telephony/MobileDataSlice.java
@@ -172,8 +172,8 @@
private PendingIntent getPrimaryAction() {
final Intent intent = getIntent();
- return PendingIntent.getActivity(mContext, 0 /* requestCode */,
- intent, 0 /* flags */);
+ return PendingIntent.getActivity(mContext, 0 /* requestCode */, intent,
+ PendingIntent.FLAG_IMMUTABLE);
}
/**
diff --git a/src/com/android/settings/network/telephony/MobileNetworkActivity.java b/src/com/android/settings/network/telephony/MobileNetworkActivity.java
index b179770..92f0054 100644
--- a/src/com/android/settings/network/telephony/MobileNetworkActivity.java
+++ b/src/com/android/settings/network/telephony/MobileNetworkActivity.java
@@ -115,6 +115,9 @@
final ActionBar actionBar = getActionBar();
if (actionBar != null) {
actionBar.setDisplayHomeAsUpEnabled(true);
+ // TODO(b/176882938): Enable title after material component updated
+ // If CollapsingToolbarLayout is applied, the old action bar won't show title.
+ actionBar.setDisplayShowTitleEnabled(mCollapsingToolbarLayout == null);
}
getProxySubscriptionManager().setLifecycle(getLifecycle());
diff --git a/src/com/android/settings/notification/RedactionInterstitial.java b/src/com/android/settings/notification/RedactionInterstitial.java
index a17298f..27e2b72 100644
--- a/src/com/android/settings/notification/RedactionInterstitial.java
+++ b/src/com/android/settings/notification/RedactionInterstitial.java
@@ -77,6 +77,11 @@
findViewById(R.id.content_parent).setFitsSystemWindows(false);
}
+ @Override
+ protected boolean isToolbarEnabled() {
+ return false;
+ }
+
/**
* Create an intent for launching RedactionInterstitial.
*
diff --git a/src/com/android/settings/notification/RemoteVolumeGroupController.java b/src/com/android/settings/notification/RemoteVolumeGroupController.java
index eaff9e1..dd6f516 100644
--- a/src/com/android/settings/notification/RemoteVolumeGroupController.java
+++ b/src/com/android/settings/notification/RemoteVolumeGroupController.java
@@ -34,7 +34,7 @@
import com.android.settingslib.core.lifecycle.events.OnDestroy;
import com.android.settingslib.media.LocalMediaManager;
import com.android.settingslib.media.MediaDevice;
-import com.android.settingslib.media.MediaOutputSliceConstants;
+import com.android.settingslib.media.MediaOutputConstants;
import com.android.settingslib.utils.ThreadUtils;
import java.util.ArrayList;
@@ -196,9 +196,9 @@
if (TextUtils.equals(info.getId(),
preference.getKey().substring(SWITCHER_PREFIX.length()))) {
final Intent intent = new Intent()
- .setAction(MediaOutputSliceConstants.ACTION_LAUNCH_MEDIA_OUTPUT_DIALOG)
- .setPackage(MediaOutputSliceConstants.SYSTEMUI_PACKAGE_NAME)
- .putExtra(MediaOutputSliceConstants.EXTRA_PACKAGE_NAME,
+ .setAction(MediaOutputConstants.ACTION_LAUNCH_MEDIA_OUTPUT_DIALOG)
+ .setPackage(MediaOutputConstants.SYSTEMUI_PACKAGE_NAME)
+ .putExtra(MediaOutputConstants.EXTRA_PACKAGE_NAME,
info.getClientPackageName());
mContext.sendBroadcast(intent);
return true;
diff --git a/src/com/android/settings/notification/SoundSettings.java b/src/com/android/settings/notification/SoundSettings.java
index 1ad093f..fc209b8 100644
--- a/src/com/android/settings/notification/SoundSettings.java
+++ b/src/com/android/settings/notification/SoundSettings.java
@@ -26,6 +26,7 @@
import android.os.UserHandle;
import android.preference.SeekBarVolumizer;
import android.text.TextUtils;
+import android.util.FeatureFlagUtils;
import androidx.annotation.VisibleForTesting;
import androidx.preference.ListPreference;
@@ -33,6 +34,7 @@
import com.android.settings.R;
import com.android.settings.RingtonePreference;
+import com.android.settings.core.FeatureFlags;
import com.android.settings.core.OnActivityResultListener;
import com.android.settings.dashboard.DashboardFragment;
import com.android.settings.search.BaseSearchIndexProvider;
@@ -152,6 +154,9 @@
@Override
protected int getPreferenceScreenResId() {
+ if (FeatureFlagUtils.isEnabled(getContext(), FeatureFlags.SILKY_HOME)) {
+ return R.xml.sound_settings_v2;
+ }
return R.xml.sound_settings;
}
diff --git a/src/com/android/settings/notification/zen/ZenAutomaticRuleSwitchPreferenceController.java b/src/com/android/settings/notification/zen/ZenAutomaticRuleSwitchPreferenceController.java
index cafb0d1..703ffae 100644
--- a/src/com/android/settings/notification/zen/ZenAutomaticRuleSwitchPreferenceController.java
+++ b/src/com/android/settings/notification/zen/ZenAutomaticRuleSwitchPreferenceController.java
@@ -25,18 +25,18 @@
import androidx.preference.PreferenceScreen;
import com.android.settings.R;
-import com.android.settings.widget.SwitchBar;
import com.android.settingslib.core.lifecycle.Lifecycle;
-import com.android.settingslib.widget.LayoutPreference;
+import com.android.settingslib.widget.MainSwitchPreference;
+import com.android.settingslib.widget.OnMainSwitchChangeListener;
public class ZenAutomaticRuleSwitchPreferenceController extends
AbstractZenModeAutomaticRulePreferenceController implements
- SwitchBar.OnSwitchChangeListener {
+ OnMainSwitchChangeListener {
private static final String KEY = "zen_automatic_rule_switch";
private AutomaticZenRule mRule;
private String mId;
- private SwitchBar mSwitchBar;
+ private MainSwitchPreference mSwitchBar;
public ZenAutomaticRuleSwitchPreferenceController(Context context, Fragment parent,
Lifecycle lifecycle) {
@@ -56,12 +56,11 @@
@Override
public void displayPreference(PreferenceScreen screen) {
super.displayPreference(screen);
- LayoutPreference pref = screen.findPreference(KEY);
- mSwitchBar = pref.findViewById(R.id.switch_bar);
+ final Preference pref = screen.findPreference(KEY);
+ mSwitchBar = (MainSwitchPreference) pref;
if (mSwitchBar != null) {
- mSwitchBar.setSwitchBarText(R.string.zen_mode_use_automatic_rule,
- R.string.zen_mode_use_automatic_rule);
+ mSwitchBar.setTitle(mContext.getString(R.string.zen_mode_use_automatic_rule));
try {
pref.setOnPreferenceClickListener(preference -> {
mRule.setEnabled(!mRule.isEnabled());
@@ -72,7 +71,6 @@
} catch (IllegalStateException e) {
// an exception is thrown if you try to add the listener twice
}
- mSwitchBar.show();
}
}
@@ -83,7 +81,7 @@
public void updateState(Preference preference) {
if (mRule != null) {
- mSwitchBar.setChecked(mRule.isEnabled());
+ mSwitchBar.updateStatus(mRule.isEnabled());
}
}
diff --git a/src/com/android/settings/panel/InternetConnectivityPanel.java b/src/com/android/settings/panel/InternetConnectivityPanel.java
index 312bf75..64a4699 100644
--- a/src/com/android/settings/panel/InternetConnectivityPanel.java
+++ b/src/com/android/settings/panel/InternetConnectivityPanel.java
@@ -34,10 +34,6 @@
/**
* Represents the Internet Connectivity Panel.
- *
- * <p>
- * Displays Wifi (full Slice) and Airplane mode.
- * </p>
*/
public class InternetConnectivityPanel implements PanelContent {
@@ -79,6 +75,21 @@
}
@Override
+ public boolean isCustomizedButtonUsed() {
+ return Utils.isProviderModelEnabled(mContext);
+ }
+
+ @Override
+ public CharSequence getCustomizedButtonTitle() {
+ return mContext.getText(R.string.settings_button);
+ }
+
+ @Override
+ public void onClickCustomizedButton() {
+ mContext.startActivity(getSeeMoreIntent());
+ }
+
+ @Override
public int getMetricsCategory() {
return SettingsEnums.PANEL_INTERNET_CONNECTIVITY;
}
diff --git a/src/com/android/settings/panel/PanelFragment.java b/src/com/android/settings/panel/PanelFragment.java
index cc27683..8eec24f 100644
--- a/src/com/android/settings/panel/PanelFragment.java
+++ b/src/com/android/settings/panel/PanelFragment.java
@@ -452,13 +452,13 @@
View.OnClickListener getSeeMoreListener() {
return (v) -> {
mPanelClosedKey = PanelClosedKeys.KEY_SEE_MORE;
+ final FragmentActivity activity = getActivity();
if (mPanel.isCustomizedButtonUsed()) {
mPanel.onClickCustomizedButton();
} else {
- final FragmentActivity activity = getActivity();
activity.startActivityForResult(mPanel.getSeeMoreIntent(), 0);
- activity.finish();
}
+ activity.finish();
};
}
diff --git a/src/com/android/settings/panel/SettingsPanelActivity.java b/src/com/android/settings/panel/SettingsPanelActivity.java
index b7b1519..856dc35 100644
--- a/src/com/android/settings/panel/SettingsPanelActivity.java
+++ b/src/com/android/settings/panel/SettingsPanelActivity.java
@@ -16,7 +16,7 @@
package com.android.settings.panel;
-import static com.android.settingslib.media.MediaOutputSliceConstants.EXTRA_PACKAGE_NAME;
+import static com.android.settingslib.media.MediaOutputConstants.EXTRA_PACKAGE_NAME;
import android.content.Intent;
import android.content.res.Configuration;
diff --git a/src/com/android/settings/panel/VolumePanel.java b/src/com/android/settings/panel/VolumePanel.java
index b5e807d..3e6d1ce 100644
--- a/src/com/android/settings/panel/VolumePanel.java
+++ b/src/com/android/settings/panel/VolumePanel.java
@@ -38,7 +38,7 @@
import androidx.lifecycle.OnLifecycleEvent;
import com.android.settings.R;
-import com.android.settingslib.media.MediaOutputSliceConstants;
+import com.android.settingslib.media.MediaOutputConstants;
import java.util.ArrayList;
import java.util.List;
@@ -55,7 +55,7 @@
private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
- if (MediaOutputSliceConstants.ACTION_CLOSE_PANEL.equals(intent.getAction())) {
+ if (MediaOutputConstants.ACTION_CLOSE_PANEL.equals(intent.getAction())) {
mCallback.forceClose();
}
}
@@ -73,7 +73,7 @@
@OnLifecycleEvent(ON_RESUME)
public void onResume() {
final IntentFilter filter = new IntentFilter();
- filter.addAction(MediaOutputSliceConstants.ACTION_CLOSE_PANEL);
+ filter.addAction(MediaOutputConstants.ACTION_CLOSE_PANEL);
mContext.registerReceiver(mReceiver, filter);
}
diff --git a/src/com/android/settings/password/ChooseLockPassword.java b/src/com/android/settings/password/ChooseLockPassword.java
index 0c84ba9..f5e23fa 100644
--- a/src/com/android/settings/password/ChooseLockPassword.java
+++ b/src/com/android/settings/password/ChooseLockPassword.java
@@ -184,6 +184,11 @@
return false;
}
+ @Override
+ protected boolean isToolbarEnabled() {
+ return false;
+ }
+
/* package */ Class<? extends Fragment> getFragmentClass() {
return ChooseLockPasswordFragment.class;
}
diff --git a/src/com/android/settings/password/ChooseLockPattern.java b/src/com/android/settings/password/ChooseLockPattern.java
index 6e9cf98..c52b410 100644
--- a/src/com/android/settings/password/ChooseLockPattern.java
+++ b/src/com/android/settings/password/ChooseLockPattern.java
@@ -194,6 +194,11 @@
return super.onKeyDown(keyCode, event);
}
+ @Override
+ protected boolean isToolbarEnabled() {
+ return false;
+ }
+
public static class ChooseLockPatternFragment extends InstrumentedFragment
implements SaveAndFinishWorker.Listener {
diff --git a/src/com/android/settings/password/ConfirmDeviceCredentialBaseActivity.java b/src/com/android/settings/password/ConfirmDeviceCredentialBaseActivity.java
index 3ecff58..f0b50a1 100644
--- a/src/com/android/settings/password/ConfirmDeviceCredentialBaseActivity.java
+++ b/src/com/android/settings/password/ConfirmDeviceCredentialBaseActivity.java
@@ -176,6 +176,11 @@
}
}
+ @Override
+ protected boolean isToolbarEnabled() {
+ return false;
+ }
+
public void prepareEnterAnimation() {
getFragment().prepareEnterAnimation();
}
diff --git a/src/com/android/settings/password/SetupChooseLockPassword.java b/src/com/android/settings/password/SetupChooseLockPassword.java
index e82dc94..25f5a34 100644
--- a/src/com/android/settings/password/SetupChooseLockPassword.java
+++ b/src/com/android/settings/password/SetupChooseLockPassword.java
@@ -24,7 +24,6 @@
import android.util.Log;
import android.view.View;
import android.widget.Button;
-import android.widget.LinearLayout;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
@@ -65,8 +64,7 @@
@Override
protected void onCreate(Bundle savedInstance) {
super.onCreate(savedInstance);
- LinearLayout layout = (LinearLayout) findViewById(R.id.content_parent);
- layout.setFitsSystemWindows(false);
+ findViewById(R.id.content_parent).setFitsSystemWindows(false);
}
public static class SetupChooseLockPasswordFragment extends ChooseLockPasswordFragment
diff --git a/src/com/android/settings/sim/SimSelectNotification.java b/src/com/android/settings/sim/SimSelectNotification.java
index 8d5a3e0..4b46939 100644
--- a/src/com/android/settings/sim/SimSelectNotification.java
+++ b/src/com/android/settings/sim/SimSelectNotification.java
@@ -226,7 +226,7 @@
resultIntent.setPackage(SETTINGS_PACKAGE_NAME);
resultIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
PendingIntent resultPendingIntent = PendingIntent.getActivity(context, 0, resultIntent,
- PendingIntent.FLAG_CANCEL_CURRENT);
+ PendingIntent.FLAG_CANCEL_CURRENT | PendingIntent.FLAG_IMMUTABLE);
builder.setContentIntent(resultPendingIntent);
NotificationManager notificationManager =
(NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
@@ -264,7 +264,7 @@
resultIntent.putExtra(Settings.EXTRA_SUB_ID, subId);
resultIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
PendingIntent resultPendingIntent = PendingIntent.getActivity(context, 0, resultIntent,
- PendingIntent.FLAG_CANCEL_CURRENT);
+ PendingIntent.FLAG_CANCEL_CURRENT | PendingIntent.FLAG_IMMUTABLE);
builder.setContentIntent(resultPendingIntent);
// Notify the notification.
@@ -312,7 +312,7 @@
resultIntent.putExtra(Intent.EXTRA_TEXT, "help_uri_sim_combination_warning");
PendingIntent resultPendingIntent = PendingIntent.getActivity(context, 0, resultIntent,
- PendingIntent.FLAG_CANCEL_CURRENT);
+ PendingIntent.FLAG_CANCEL_CURRENT | PendingIntent.FLAG_IMMUTABLE);
builder.setContentIntent(resultPendingIntent);
NotificationManager notificationManager =
diff --git a/src/com/android/settings/slices/CustomSliceRegistry.java b/src/com/android/settings/slices/CustomSliceRegistry.java
index be71b30..e40b164 100644
--- a/src/com/android/settings/slices/CustomSliceRegistry.java
+++ b/src/com/android/settings/slices/CustomSliceRegistry.java
@@ -46,7 +46,7 @@
import com.android.settings.wifi.calling.WifiCallingSliceHelper;
import com.android.settings.wifi.slice.ContextualWifiSlice;
import com.android.settings.wifi.slice.WifiSlice;
-import com.android.settingslib.media.MediaOutputSliceConstants;
+import com.android.settingslib.media.MediaOutputConstants;
import java.util.Map;
@@ -293,7 +293,7 @@
.scheme(ContentResolver.SCHEME_CONTENT)
.authority(SettingsSliceProvider.SLICE_AUTHORITY)
.appendPath(SettingsSlicesContract.PATH_SETTING_ACTION)
- .appendPath(MediaOutputSliceConstants.KEY_REMOTE_MEDIA)
+ .appendPath(MediaOutputConstants.KEY_REMOTE_MEDIA)
.build();
/**
diff --git a/src/com/android/settings/sound/MediaOutputPreferenceController.java b/src/com/android/settings/sound/MediaOutputPreferenceController.java
index b5562a3..4ec00e3 100644
--- a/src/com/android/settings/sound/MediaOutputPreferenceController.java
+++ b/src/com/android/settings/sound/MediaOutputPreferenceController.java
@@ -32,7 +32,7 @@
import com.android.settingslib.Utils;
import com.android.settingslib.bluetooth.A2dpProfile;
import com.android.settingslib.bluetooth.HearingAidProfile;
-import com.android.settingslib.media.MediaOutputSliceConstants;
+import com.android.settingslib.media.MediaOutputConstants;
import java.util.List;
@@ -134,11 +134,11 @@
public boolean handlePreferenceTreeClick(Preference preference) {
if (TextUtils.equals(preference.getKey(), getPreferenceKey())) {
mContext.sendBroadcast(new Intent()
- .setAction(MediaOutputSliceConstants.ACTION_LAUNCH_MEDIA_OUTPUT_DIALOG)
- .setPackage(MediaOutputSliceConstants.SYSTEMUI_PACKAGE_NAME)
- .putExtra(MediaOutputSliceConstants.EXTRA_PACKAGE_NAME,
+ .setAction(MediaOutputConstants.ACTION_LAUNCH_MEDIA_OUTPUT_DIALOG)
+ .setPackage(MediaOutputConstants.SYSTEMUI_PACKAGE_NAME)
+ .putExtra(MediaOutputConstants.EXTRA_PACKAGE_NAME,
mMediaController.getPackageName())
- .putExtra(MediaOutputSliceConstants.KEY_MEDIA_SESSION_TOKEN,
+ .putExtra(MediaOutputConstants.KEY_MEDIA_SESSION_TOKEN,
mMediaController.getSessionToken()));
return true;
}
diff --git a/src/com/android/settings/wifi/WifiUtils.java b/src/com/android/settings/wifi/WifiUtils.java
index 06f74d5..d05260a 100644
--- a/src/com/android/settings/wifi/WifiUtils.java
+++ b/src/com/android/settings/wifi/WifiUtils.java
@@ -56,12 +56,12 @@
}
/**
- * Check if the WPA2-PSK hotspot password is valid.
+ * Check if the hotspot password is valid.
*/
- public static boolean isHotspotWpa2PasswordValid(String password) {
+ public static boolean isHotspotPasswordValid(String password, int securityType) {
final SoftApConfiguration.Builder configBuilder = new SoftApConfiguration.Builder();
try {
- configBuilder.setPassphrase(password, SoftApConfiguration.SECURITY_TYPE_WPA2_PSK);
+ configBuilder.setPassphrase(password, securityType);
} catch (IllegalArgumentException e) {
return false;
}
diff --git a/src/com/android/settings/wifi/calling/WifiCallingSliceHelper.java b/src/com/android/settings/wifi/calling/WifiCallingSliceHelper.java
index 26d742d..4467d66 100644
--- a/src/com/android/settings/wifi/calling/WifiCallingSliceHelper.java
+++ b/src/com/android/settings/wifi/calling/WifiCallingSliceHelper.java
@@ -18,9 +18,9 @@
import static android.app.slice.Slice.EXTRA_TOGGLE_STATE;
+import static com.android.settings.Utils.SETTINGS_PACKAGE_NAME;
import static com.android.settings.slices.CustomSliceRegistry.WIFI_CALLING_PREFERENCE_URI;
import static com.android.settings.slices.CustomSliceRegistry.WIFI_CALLING_URI;
-import static com.android.settings.Utils.SETTINGS_PACKAGE_NAME;
import android.app.PendingIntent;
import android.content.ComponentName;
@@ -539,7 +539,8 @@
*/
public static PendingIntent getSettingsIntent(Context context) {
final Intent intent = new Intent(Settings.ACTION_SETTINGS);
- return PendingIntent.getActivity(context, 0 /* requestCode */, intent, 0 /* flags */);
+ return PendingIntent.getActivity(context, 0 /* requestCode */, intent,
+ PendingIntent.FLAG_IMMUTABLE);
}
private PendingIntent getBroadcastIntent(String action) {
@@ -547,7 +548,7 @@
intent.setClass(mContext, SliceBroadcastReceiver.class);
intent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND);
return PendingIntent.getBroadcast(mContext, 0 /* requestCode */, intent,
- PendingIntent.FLAG_CANCEL_CURRENT);
+ PendingIntent.FLAG_CANCEL_CURRENT | PendingIntent.FLAG_IMMUTABLE);
}
/**
@@ -557,7 +558,8 @@
final Intent intent = new Intent(action);
intent.setPackage(SETTINGS_PACKAGE_NAME);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- return PendingIntent.getActivity(mContext, 0 /* requestCode */, intent, 0 /* flags */);
+ return PendingIntent.getActivity(mContext, 0 /* requestCode */, intent,
+ PendingIntent.FLAG_IMMUTABLE);
}
private Resources getResourcesForSubId(int subId) {
diff --git a/src/com/android/settings/wifi/dpp/WifiDppUtils.java b/src/com/android/settings/wifi/dpp/WifiDppUtils.java
index 2957e1f..abf5bec 100644
--- a/src/com/android/settings/wifi/dpp/WifiDppUtils.java
+++ b/src/com/android/settings/wifi/dpp/WifiDppUtils.java
@@ -301,7 +301,11 @@
final String ssid = removeFirstAndLastDoubleQuotes(softApConfiguration.getSsid());
String security;
- if (softApConfiguration.getSecurityType() == SoftApConfiguration.SECURITY_TYPE_WPA2_PSK) {
+ final int securityType = softApConfiguration.getSecurityType();
+ if (securityType == SoftApConfiguration.SECURITY_TYPE_WPA3_SAE) {
+ security = WifiQrCode.SECURITY_SAE;
+ } else if (securityType == SoftApConfiguration.SECURITY_TYPE_WPA2_PSK
+ || securityType == SoftApConfiguration.SECURITY_TYPE_WPA3_SAE_TRANSITION) {
security = WifiQrCode.SECURITY_WPA_PSK;
} else {
security = WifiQrCode.SECURITY_NO_PASSWORD;
@@ -431,11 +435,11 @@
private static boolean isSupportHotspotConfiguratorQrCodeGenerator(
SoftApConfiguration softApConfiguration) {
- // QR code generator produces QR code with ZXing's Wi-Fi network config format,
- // it supports PSK and WEP and non security
- // KeyMgmt.NONE is for WEP or non security
- return softApConfiguration.getSecurityType() == SoftApConfiguration.SECURITY_TYPE_WPA2_PSK
- || softApConfiguration.getSecurityType() == SoftApConfiguration.SECURITY_TYPE_OPEN;
+ final int securityType = softApConfiguration.getSecurityType();
+ return securityType == SoftApConfiguration.SECURITY_TYPE_WPA3_SAE
+ || securityType == SoftApConfiguration.SECURITY_TYPE_WPA3_SAE_TRANSITION
+ || securityType == SoftApConfiguration.SECURITY_TYPE_WPA2_PSK
+ || securityType == SoftApConfiguration.SECURITY_TYPE_OPEN;
}
private static boolean isSupportWifiDpp(Context context, int wifiEntrySecurity) {
diff --git a/src/com/android/settings/wifi/tether/WifiTetherPasswordPreferenceController.java b/src/com/android/settings/wifi/tether/WifiTetherPasswordPreferenceController.java
index be67d22..14766f9 100644
--- a/src/com/android/settings/wifi/tether/WifiTetherPasswordPreferenceController.java
+++ b/src/com/android/settings/wifi/tether/WifiTetherPasswordPreferenceController.java
@@ -37,12 +37,16 @@
import java.util.UUID;
+/**
+ * Controller for logic pertaining to the password of Wi-Fi tethering.
+ */
public class WifiTetherPasswordPreferenceController extends WifiTetherBasePreferenceController
implements ValidatedEditTextPreference.Validator {
private static final String PREF_KEY = "wifi_tether_network_password";
private String mPassword;
+ private int mSecurityType;
private final MetricsFeatureProvider mMetricsFeatureProvider;
@@ -68,13 +72,13 @@
@Override
public void updateDisplay() {
final SoftApConfiguration config = mWifiManager.getSoftApConfiguration();
- if (config == null
- || (config.getSecurityType() == SoftApConfiguration.SECURITY_TYPE_WPA2_PSK
- && TextUtils.isEmpty(config.getPassphrase()))) {
+ if (config.getSecurityType() != SoftApConfiguration.SECURITY_TYPE_OPEN
+ && TextUtils.isEmpty(config.getPassphrase())) {
mPassword = generateRandomPassword();
} else {
mPassword = config.getPassphrase();
}
+ mSecurityType = config.getSecurityType();
((ValidatedEditTextPreference) mPreference).setValidator(this);
((ValidatedEditTextPreference) mPreference).setIsPassword(true);
((ValidatedEditTextPreference) mPreference).setIsSummaryPassword(true);
@@ -105,20 +109,27 @@
// don't actually overwrite unless we get a new config in case it was accidentally toggled.
if (securityType == SoftApConfiguration.SECURITY_TYPE_OPEN) {
return "";
- } else if (!isTextValid(mPassword)) {
+ } else if (!WifiUtils.isHotspotPasswordValid(mPassword, securityType)) {
mPassword = generateRandomPassword();
updatePasswordDisplay((EditTextPreference) mPreference);
}
return mPassword;
}
- public void updateVisibility(int securityType) {
+ /**
+ * This method set the security type of user selection. Then the controller will based on the
+ * security type changed to update the password changed on the preference.
+ *
+ * @param securityType The security type of SoftApConfiguration.
+ */
+ public void setSecurityType(int securityType) {
+ mSecurityType = securityType;
mPreference.setVisible(securityType != SoftApConfiguration.SECURITY_TYPE_OPEN);
}
@Override
public boolean isTextValid(String value) {
- return WifiUtils.isHotspotWpa2PasswordValid(value);
+ return WifiUtils.isHotspotPasswordValid(value, mSecurityType);
}
private static String generateRandomPassword() {
diff --git a/src/com/android/settings/wifi/tether/WifiTetherSecurityPreferenceController.java b/src/com/android/settings/wifi/tether/WifiTetherSecurityPreferenceController.java
index 56b5031..acb8206 100644
--- a/src/com/android/settings/wifi/tether/WifiTetherSecurityPreferenceController.java
+++ b/src/com/android/settings/wifi/tether/WifiTetherSecurityPreferenceController.java
@@ -1,28 +1,65 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
package com.android.settings.wifi.tether;
import static com.android.settings.AllInOneTetherSettings.DEDUP_POSTFIX;
+import android.annotation.NonNull;
import android.content.Context;
+import android.net.wifi.SoftApCapability;
import android.net.wifi.SoftApConfiguration;
+import android.net.wifi.WifiManager;
import android.util.FeatureFlagUtils;
+import android.util.Log;
+import androidx.annotation.VisibleForTesting;
import androidx.preference.ListPreference;
import androidx.preference.Preference;
import com.android.settings.R;
import com.android.settings.core.FeatureFlags;
-public class WifiTetherSecurityPreferenceController extends WifiTetherBasePreferenceController {
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+/**
+ * Controller for logic pertaining to the security type of Wi-Fi tethering.
+ */
+public class WifiTetherSecurityPreferenceController extends WifiTetherBasePreferenceController
+ implements WifiManager.SoftApCallback {
private static final String PREF_KEY = "wifi_tether_security";
- private final String[] mSecurityEntries;
+ private Map<Integer, String> mSecurityMap = new LinkedHashMap<Integer, String>();
private int mSecurityValue;
+ @VisibleForTesting
+ boolean mIsWpa3Supported = true;
public WifiTetherSecurityPreferenceController(Context context,
OnTetherConfigUpdateListener listener) {
super(context, listener);
- mSecurityEntries = mContext.getResources().getStringArray(R.array.wifi_tether_security);
+ final String[] securityNames = mContext.getResources().getStringArray(
+ R.array.wifi_tether_security);
+ final String[] securityValues = mContext.getResources().getStringArray(
+ R.array.wifi_tether_security_values);
+ for (int i = 0; i < securityNames.length; i++) {
+ mSecurityMap.put(Integer.parseInt(securityValues[i]), securityNames[i]);
+ }
+ mWifiManager.registerSoftApCallback(context.getMainExecutor(), this);
}
@Override
@@ -33,35 +70,55 @@
@Override
public void updateDisplay() {
- final SoftApConfiguration config = mWifiManager.getSoftApConfiguration();
- if (config != null && config.getSecurityType() == SoftApConfiguration.SECURITY_TYPE_OPEN) {
- mSecurityValue = SoftApConfiguration.SECURITY_TYPE_OPEN;
- } else {
- mSecurityValue = SoftApConfiguration.SECURITY_TYPE_WPA2_PSK;
+ // The mPreference will be ready when the fragment calls displayPreference(). Since the
+ // capability of WPA3 hotspot callback will update the preference list here, add null point
+ // checking to avoid the mPreference is not ready when the fragment is loading for settings
+ // keyword searching only.
+ if (mPreference == null) {
+ return;
+ }
+ final ListPreference preference = (ListPreference) mPreference;
+ // If the device is not support WPA3 then remove the WPA3 options.
+ if (!mIsWpa3Supported && mSecurityMap.keySet()
+ .removeIf(key -> key > SoftApConfiguration.SECURITY_TYPE_WPA2_PSK)) {
+ preference.setEntries(mSecurityMap.values().stream().toArray(CharSequence[]::new));
+ preference.setEntryValues(mSecurityMap.keySet().stream().map(Integer::toBinaryString)
+ .toArray(CharSequence[]::new));
}
- final ListPreference preference = (ListPreference) mPreference;
- preference.setSummary(getSummaryForSecurityType(mSecurityValue));
+ final int securityType = mWifiManager.getSoftApConfiguration().getSecurityType();
+ mSecurityValue = mSecurityMap.get(securityType) != null
+ ? securityType : SoftApConfiguration.SECURITY_TYPE_WPA2_PSK;
+
+ preference.setSummary(mSecurityMap.get(mSecurityValue));
preference.setValue(String.valueOf(mSecurityValue));
}
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
mSecurityValue = Integer.parseInt((String) newValue);
- preference.setSummary(getSummaryForSecurityType(mSecurityValue));
- mListener.onTetherConfigUpdated(this);
+ preference.setSummary(mSecurityMap.get(mSecurityValue));
+ if (mListener != null) {
+ mListener.onTetherConfigUpdated(this);
+ }
return true;
}
+ @Override
+ public void onCapabilityChanged(@NonNull SoftApCapability softApCapability) {
+ final boolean isWpa3Supported =
+ softApCapability.areFeaturesSupported(SoftApCapability.SOFTAP_FEATURE_WPA3_SAE);
+ if (!isWpa3Supported) {
+ Log.i(PREF_KEY, "WPA3 SAE is not supported on this device");
+ }
+ if (mIsWpa3Supported != isWpa3Supported) {
+ mIsWpa3Supported = isWpa3Supported;
+ updateDisplay();
+ }
+ mWifiManager.unregisterSoftApCallback(this);
+ }
+
public int getSecurityType() {
return mSecurityValue;
}
-
- private String getSummaryForSecurityType(int securityType) {
- if (securityType == SoftApConfiguration.SECURITY_TYPE_OPEN) {
- return mSecurityEntries[1];
- }
- // WPA2 PSK
- return mSecurityEntries[0];
- }
}
diff --git a/src/com/android/settings/wifi/tether/WifiTetherSettings.java b/src/com/android/settings/wifi/tether/WifiTetherSettings.java
index d6c49bc..f260298 100644
--- a/src/com/android/settings/wifi/tether/WifiTetherSettings.java
+++ b/src/com/android/settings/wifi/tether/WifiTetherSettings.java
@@ -192,7 +192,7 @@
@Override
public void onTetherConfigUpdated(AbstractPreferenceController context) {
final SoftApConfiguration config = buildNewConfig();
- mPasswordPreferenceController.updateVisibility(config.getSecurityType());
+ mPasswordPreferenceController.setSecurityType(config.getSecurityType());
/**
* if soft AP is stopped, bring up
@@ -216,10 +216,10 @@
final SoftApConfiguration.Builder configBuilder = new SoftApConfiguration.Builder();
final int securityType = mSecurityPreferenceController.getSecurityType();
configBuilder.setSsid(mSSIDPreferenceController.getSSID());
- if (securityType == SoftApConfiguration.SECURITY_TYPE_WPA2_PSK) {
+ if (securityType != SoftApConfiguration.SECURITY_TYPE_OPEN) {
configBuilder.setPassphrase(
mPasswordPreferenceController.getPasswordValidated(securityType),
- SoftApConfiguration.SECURITY_TYPE_WPA2_PSK);
+ securityType);
}
configBuilder.setBand(mApBandPreferenceController.getBandIndex());
return configBuilder.build();
diff --git a/tests/robotests/res/values-mcc999/config.xml b/tests/robotests/res/values-mcc999/config.xml
index b1d4be9..af02d45 100644
--- a/tests/robotests/res/values-mcc999/config.xml
+++ b/tests/robotests/res/values-mcc999/config.xml
@@ -100,4 +100,14 @@
<!-- Uri to query non-public Slice Uris. -->
<string name="config_non_public_slice_query_uri" translatable="false">content://com.android.settings.slices/test</string>
+
+ <!-- Packages for overriding tile positions on the homepage -->
+ <string-array name="config_homepage_tile_packages" translatable="false">
+ <item>com.android.settings</item>
+ </string-array>
+
+ <!-- Orders for overriding tile positions on the homepage -->
+ <integer-array name="config_homepage_tile_orders">
+ <item>100</item>
+ </integer-array>
</resources>
diff --git a/tests/robotests/src/com/android/settings/TestingSettingsBroadcastReceiverTest.java b/tests/robotests/src/com/android/settings/TestingSettingsBroadcastReceiverTest.java
new file mode 100644
index 0000000..10fdffb
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/TestingSettingsBroadcastReceiverTest.java
@@ -0,0 +1,81 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.app.Application;
+import android.content.Context;
+import android.content.Intent;
+import android.telephony.TelephonyManager;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.Shadows;
+
+@RunWith(RobolectricTestRunner.class)
+public class TestingSettingsBroadcastReceiverTest {
+
+ private Context mContext;
+ private Application mApplication;
+ private TestingSettingsBroadcastReceiver mReceiver;
+
+ @Before
+ public void setUp() {
+ mContext = RuntimeEnvironment.application;
+ mApplication = RuntimeEnvironment.application;
+ mReceiver = new TestingSettingsBroadcastReceiver();
+ }
+
+ @Test
+ public void onReceive_nullIntent_shouldNotCrash() {
+ final Intent intent = new Intent();
+
+ mReceiver.onReceive(mContext, null);
+ mReceiver.onReceive(mContext, intent);
+
+ final Intent next = Shadows.shadowOf(mApplication).getNextStartedActivity();
+ assertThat(next).isNull();
+ }
+
+ @Test
+ public void onReceive_wrongIntent_shouldNotStartActivity() {
+ final Intent intent = new Intent();
+ intent.setAction("");
+
+ mReceiver.onReceive(mContext, intent);
+
+ final Intent next = Shadows.shadowOf(mApplication).getNextStartedActivity();
+ assertThat(next).isNull();
+ }
+
+ @Test
+ public void onReceive_correctIntent_shouldStartActivity() {
+ final Intent intent = new Intent();
+ intent.setAction(TelephonyManager.ACTION_SECRET_CODE);
+
+ mReceiver.onReceive(mContext, intent);
+
+ final Intent next = Shadows.shadowOf(mApplication).getNextStartedActivity();
+ assertThat(next).isNotNull();
+ final String dest = next.getComponent().getClassName();
+ assertThat(dest).isEqualTo(Settings.TestingSettingsActivity.class.getName());
+ }
+}
diff --git a/tests/robotests/src/com/android/settings/accessibility/SystemControlsFragmentTest.java b/tests/robotests/src/com/android/settings/accessibility/SystemControlsFragmentTest.java
new file mode 100644
index 0000000..4b12900
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/accessibility/SystemControlsFragmentTest.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.accessibility;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.content.Context;
+
+import androidx.test.core.app.ApplicationProvider;
+
+import com.android.settings.R;
+import com.android.settings.testutils.XmlTestUtils;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
+
+import java.util.List;
+
+/** Tests for {@link SystemControlsFragment}. */
+@RunWith(RobolectricTestRunner.class)
+public class SystemControlsFragmentTest {
+
+ private Context mContext = ApplicationProvider.getApplicationContext();
+
+ @Test
+ public void getNonIndexableKeys_existInXmlLayout() {
+ final List<String> niks = SystemControlsFragment.SEARCH_INDEX_DATA_PROVIDER
+ .getNonIndexableKeys(mContext);
+ final List<String> keys =
+ XmlTestUtils.getKeysFromPreferenceXml(mContext,
+ R.xml.accessibility_system_controls);
+
+ assertThat(keys).containsAtLeastElementsIn(niks);
+ }
+}
diff --git a/tests/robotests/src/com/android/settings/accessibility/TapAssistanceFragmentTest.java b/tests/robotests/src/com/android/settings/accessibility/TapAssistanceFragmentTest.java
new file mode 100644
index 0000000..093ea03
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/accessibility/TapAssistanceFragmentTest.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.accessibility;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.content.Context;
+
+import androidx.test.core.app.ApplicationProvider;
+
+import com.android.settings.R;
+import com.android.settings.testutils.XmlTestUtils;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
+
+import java.util.List;
+
+@RunWith(RobolectricTestRunner.class)
+/** Tests for {@link TapAssistanceFragment}. */
+public class TapAssistanceFragmentTest {
+
+ private Context mContext = ApplicationProvider.getApplicationContext();
+
+ @Test
+ public void getNonIndexableKeys_existInXmlLayout() {
+ final List<String> niks = TapAssistanceFragment.SEARCH_INDEX_DATA_PROVIDER
+ .getNonIndexableKeys(mContext);
+ final List<String> keys =
+ XmlTestUtils.getKeysFromPreferenceXml(mContext, R.xml.accessibility_tap_assistance);
+
+ assertThat(keys).containsAtLeastElementsIn(niks);
+ }
+}
diff --git a/tests/robotests/src/com/android/settings/accessibility/ToggleAutoclickCustomSeekbarControllerTest.java b/tests/robotests/src/com/android/settings/accessibility/ToggleAutoclickCustomSeekbarControllerTest.java
new file mode 100644
index 0000000..d6c66ad
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/accessibility/ToggleAutoclickCustomSeekbarControllerTest.java
@@ -0,0 +1,206 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.accessibility;
+
+import static android.content.Context.MODE_PRIVATE;
+
+import static com.android.settings.accessibility.ToggleAutoclickCustomSeekbarController.KEY_CUSTOM_DELAY_VALUE;
+import static com.android.settings.accessibility.ToggleAutoclickPreferenceController.KEY_DELAY_MODE;
+import static com.android.settings.core.BasePreferenceController.AVAILABLE;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.robolectric.Shadows.shadowOf;
+
+import android.content.Context;
+import android.content.SharedPreferences;
+import android.provider.Settings;
+import android.widget.ImageView;
+import android.widget.SeekBar;
+import android.widget.TextView;
+
+import androidx.lifecycle.LifecycleObserver;
+import androidx.preference.PreferenceScreen;
+import androidx.test.core.app.ApplicationProvider;
+
+import com.android.settings.R;
+import com.android.settingslib.core.lifecycle.Lifecycle;
+import com.android.settingslib.widget.LayoutPreference;
+
+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;
+
+/** Tests for {@link ToggleAutoclickCustomSeekbarController}. */
+@RunWith(RobolectricTestRunner.class)
+public class ToggleAutoclickCustomSeekbarControllerTest {
+
+ @Mock
+ private PreferenceScreen mScreen;
+
+ @Mock
+ private LayoutPreference mLayoutPreference;
+
+ @Mock
+ private Lifecycle mLifecycle;
+
+ private SharedPreferences mSharedPreferences;
+ private TextView mDelayLabel;
+ private ImageView mShorter;
+ private ImageView mLonger;
+ private SeekBar mSeekBar;
+ private ToggleAutoclickCustomSeekbarController mController;
+ private Context mContext;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+
+ final String mPrefKey = "prefKey";
+ mContext = ApplicationProvider.getApplicationContext();
+ mSharedPreferences = mContext.getSharedPreferences(mContext.getPackageName(), MODE_PRIVATE);
+ mDelayLabel = new TextView(mContext);
+ mShorter = new ImageView(mContext);
+ mLonger = new ImageView(mContext);
+ mSeekBar = new SeekBar(mContext);
+ mController =
+ new ToggleAutoclickCustomSeekbarController(mContext, mLifecycle, mPrefKey);
+
+ doReturn(mLayoutPreference).when(mScreen).findPreference(mPrefKey);
+ doReturn(mSeekBar).when(mLayoutPreference).findViewById(R.id.autoclick_delay);
+ doReturn(mDelayLabel).when(mLayoutPreference).findViewById(R.id.current_label);
+ doReturn(mShorter).when(mLayoutPreference).findViewById(R.id.shorter);
+ doReturn(mLonger).when(mLayoutPreference).findViewById(R.id.longer);
+ }
+
+ @Test
+ public void getAvailabilityStatus_available() {
+ assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE);
+ }
+
+ @Test
+ public void constructor_hasLifecycle_addObserver() {
+ verify(mLifecycle).addObserver(any(LifecycleObserver.class));
+ }
+
+ @Test
+ public void displayPreference_initSeekBar() {
+ mSharedPreferences.edit().putInt(KEY_CUSTOM_DELAY_VALUE, 700).apply();
+
+ mController.onResume();
+ mController.displayPreference(mScreen);
+ mController.onPause();
+ final SeekBar.OnSeekBarChangeListener mListener =
+ shadowOf(mSeekBar).getOnSeekBarChangeListener();
+
+ assertThat(mSeekBar.getMax()).isEqualTo(8);
+ assertThat(mSeekBar.getProgress()).isEqualTo(5);
+ assertThat(mListener).isNotNull();
+ }
+
+ @Test
+ public void displayPreference_initDelayLabel() {
+ mSharedPreferences.edit().putInt(KEY_CUSTOM_DELAY_VALUE, 700).apply();
+
+ mController.onResume();
+ mController.displayPreference(mScreen);
+ mController.onPause();
+
+ assertThat(mDelayLabel.getText()).isEqualTo("0.7 seconds");
+ }
+
+ @Test
+ public void onSharedPreferenceChanged_delayMode_updateCustomDelayValue() {
+ mSharedPreferences.edit().putInt(KEY_CUSTOM_DELAY_VALUE, 700).apply();
+
+ mController.displayPreference(mScreen);
+ mController.onSharedPreferenceChanged(mSharedPreferences, KEY_DELAY_MODE);
+ final int actualDelayValue =
+ Settings.Secure.getInt(mContext.getContentResolver(),
+ Settings.Secure.ACCESSIBILITY_AUTOCLICK_DELAY, /* def= */ 0);
+ final int actualCustomDelayValue =
+ mSharedPreferences.getInt(KEY_CUSTOM_DELAY_VALUE, /* defValue= */ 0);
+
+ assertThat(mDelayLabel.getText()).isEqualTo("0.7 seconds");
+ assertThat(mSeekBar.getProgress()).isEqualTo(5);
+ assertThat(actualDelayValue).isEqualTo(700);
+ assertThat(actualCustomDelayValue).isEqualTo(700);
+ }
+
+ @Test
+ public void onSeekBarProgressChanged_updateCustomDelayValue() {
+ mSharedPreferences.edit().putInt(KEY_CUSTOM_DELAY_VALUE, 700).apply();
+
+ mController.displayPreference(mScreen);
+ mController.mSeekBarChangeListener.onProgressChanged(mock(SeekBar.class),
+ /* value= */ 8,
+ true);
+ final int actualDelayValue =
+ Settings.Secure.getInt(mContext.getContentResolver(),
+ Settings.Secure.ACCESSIBILITY_AUTOCLICK_DELAY, /* def= */ 0);
+ final int actualCustomDelayValue =
+ mSharedPreferences.getInt(KEY_CUSTOM_DELAY_VALUE, /* defValue= */ 0);
+
+ assertThat(mDelayLabel.getText()).isEqualTo("1 second");
+ assertThat(mSeekBar.getProgress()).isEqualTo(8);
+ assertThat(actualDelayValue).isEqualTo(1000);
+ assertThat(actualCustomDelayValue).isEqualTo(1000);
+ }
+
+ @Test
+ public void onShorterClicked_updateCustomDelayValue() {
+ mSharedPreferences.edit().putInt(KEY_CUSTOM_DELAY_VALUE, 700).apply();
+
+ mController.displayPreference(mScreen);
+ mShorter.callOnClick();
+ final int actualDelayValue =
+ Settings.Secure.getInt(mContext.getContentResolver(),
+ Settings.Secure.ACCESSIBILITY_AUTOCLICK_DELAY, /* def= */ 0);
+ final int actualCustomDelayValue =
+ mSharedPreferences.getInt(KEY_CUSTOM_DELAY_VALUE, /* defValue= */ 0);
+
+ assertThat(mSeekBar.getProgress()).isEqualTo(4);
+ assertThat(mDelayLabel.getText()).isEqualTo("0.6 seconds");
+ assertThat(actualDelayValue).isEqualTo(600);
+ assertThat(actualCustomDelayValue).isEqualTo(600);
+ }
+
+ @Test
+ public void onLongerClicked_updateCustomDelayValue() {
+ mSharedPreferences.edit().putInt(KEY_CUSTOM_DELAY_VALUE, 700).apply();
+
+ mController.displayPreference(mScreen);
+ mLonger.callOnClick();
+ final int actualDelayValue =
+ Settings.Secure.getInt(mContext.getContentResolver(),
+ Settings.Secure.ACCESSIBILITY_AUTOCLICK_DELAY, /* def= */ 0);
+ final int actualCustomDelayValue =
+ mSharedPreferences.getInt(KEY_CUSTOM_DELAY_VALUE, /* defValue= */ 0);
+
+ assertThat(mSeekBar.getProgress()).isEqualTo(6);
+ assertThat(mDelayLabel.getText()).isEqualTo("0.8 seconds");
+ assertThat(actualDelayValue).isEqualTo(800);
+ assertThat(actualCustomDelayValue).isEqualTo(800);
+ }
+}
diff --git a/tests/robotests/src/com/android/settings/applications/appinfo/DefaultAppShortcutPreferenceControllerBaseTest.java b/tests/robotests/src/com/android/settings/applications/appinfo/DefaultAppShortcutPreferenceControllerBaseTest.java
index 74c0bb5..7a4c610 100644
--- a/tests/robotests/src/com/android/settings/applications/appinfo/DefaultAppShortcutPreferenceControllerBaseTest.java
+++ b/tests/robotests/src/com/android/settings/applications/appinfo/DefaultAppShortcutPreferenceControllerBaseTest.java
@@ -25,6 +25,7 @@
import static org.robolectric.Shadows.shadowOf;
import android.app.Activity;
+import android.app.role.RoleControllerManager;
import android.app.role.RoleManager;
import android.content.Context;
import android.content.Intent;
@@ -62,6 +63,8 @@
@Mock
private RoleManager mRoleManager;
@Mock
+ private RoleControllerManager mRoleControllerManager;
+ @Mock
private Preference mPreference;
private Activity mActivity;
@@ -74,6 +77,7 @@
MockitoAnnotations.initMocks(this);
ShadowApplication shadowApplication = ShadowApplication.getInstance();
shadowApplication.setSystemService(Context.ROLE_SERVICE, mRoleManager);
+ shadowApplication.setSystemService(Context.ROLE_CONTROLLER_SERVICE, mRoleControllerManager);
mActivity = Robolectric.setupActivity(Activity.class);
mShadowUserManager = shadowOf(mActivity.getSystemService(UserManager.class));
mController = new TestRolePreferenceController(mActivity);
@@ -82,7 +86,7 @@
@Test
public void constructor_callsIsApplicationVisibleForRole() {
- verify(mRoleManager).isApplicationVisibleForRole(eq(TEST_ROLE_NAME), eq(
+ verify(mRoleControllerManager).isApplicationVisibleForRole(eq(TEST_ROLE_NAME), eq(
TEST_PACKAGE_NAME), any(Executor.class), any(Consumer.class));
}
@@ -149,7 +153,7 @@
private void setRoleIsVisible(boolean visible) {
final ArgumentCaptor<Consumer<Boolean>> callbackCaptor = ArgumentCaptor.forClass(
Consumer.class);
- verify(mRoleManager).isRoleVisible(eq(TEST_ROLE_NAME), any(Executor.class),
+ verify(mRoleControllerManager).isRoleVisible(eq(TEST_ROLE_NAME), any(Executor.class),
callbackCaptor.capture());
final Consumer<Boolean> callback = callbackCaptor.getValue();
callback.accept(visible);
@@ -158,7 +162,7 @@
private void setApplicationIsVisibleForRole(boolean visible) {
final ArgumentCaptor<Consumer<Boolean>> callbackCaptor = ArgumentCaptor.forClass(
Consumer.class);
- verify(mRoleManager).isApplicationVisibleForRole(eq(TEST_ROLE_NAME), eq(
+ verify(mRoleControllerManager).isApplicationVisibleForRole(eq(TEST_ROLE_NAME), eq(
TEST_PACKAGE_NAME), any(Executor.class), callbackCaptor.capture());
final Consumer<Boolean> callback = callbackCaptor.getValue();
callback.accept(visible);
diff --git a/tests/robotests/src/com/android/settings/applications/appinfo/DefaultBrowserShortcutPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/applications/appinfo/DefaultBrowserShortcutPreferenceControllerTest.java
index 6d4186c..5940d72 100644
--- a/tests/robotests/src/com/android/settings/applications/appinfo/DefaultBrowserShortcutPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/applications/appinfo/DefaultBrowserShortcutPreferenceControllerTest.java
@@ -18,7 +18,7 @@
import static com.google.common.truth.Truth.assertThat;
-import android.app.role.RoleManager;
+import android.app.role.RoleControllerManager;
import android.content.Context;
import org.junit.Before;
@@ -34,14 +34,15 @@
public class DefaultBrowserShortcutPreferenceControllerTest {
@Mock
- private RoleManager mRoleManager;
+ private RoleControllerManager mRoleControllerManager;
private DefaultBrowserShortcutPreferenceController mController;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
- ShadowApplication.getInstance().setSystemService(Context.ROLE_SERVICE, mRoleManager);
+ ShadowApplication.getInstance().setSystemService(Context.ROLE_CONTROLLER_SERVICE,
+ mRoleControllerManager);
mController = new DefaultBrowserShortcutPreferenceController(RuntimeEnvironment.application,
"Package1");
}
diff --git a/tests/robotests/src/com/android/settings/applications/appinfo/DefaultEmergencyShortcutPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/applications/appinfo/DefaultEmergencyShortcutPreferenceControllerTest.java
index 0acd7bd..8dcf530 100644
--- a/tests/robotests/src/com/android/settings/applications/appinfo/DefaultEmergencyShortcutPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/applications/appinfo/DefaultEmergencyShortcutPreferenceControllerTest.java
@@ -18,7 +18,7 @@
import static com.google.common.truth.Truth.assertThat;
-import android.app.role.RoleManager;
+import android.app.role.RoleControllerManager;
import android.content.Context;
import org.junit.Before;
@@ -34,14 +34,15 @@
public class DefaultEmergencyShortcutPreferenceControllerTest {
@Mock
- private RoleManager mRoleManager;
+ private RoleControllerManager mRoleControllerManager;
private DefaultEmergencyShortcutPreferenceController mController;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
- ShadowApplication.getInstance().setSystemService(Context.ROLE_SERVICE, mRoleManager);
+ ShadowApplication.getInstance().setSystemService(Context.ROLE_CONTROLLER_SERVICE,
+ mRoleControllerManager);
mController = new DefaultEmergencyShortcutPreferenceController(
RuntimeEnvironment.application, "Package1");
}
diff --git a/tests/robotests/src/com/android/settings/applications/appinfo/DefaultHomeShortcutPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/applications/appinfo/DefaultHomeShortcutPreferenceControllerTest.java
index 1f0023a..7071fec 100644
--- a/tests/robotests/src/com/android/settings/applications/appinfo/DefaultHomeShortcutPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/applications/appinfo/DefaultHomeShortcutPreferenceControllerTest.java
@@ -18,7 +18,7 @@
import static com.google.common.truth.Truth.assertThat;
-import android.app.role.RoleManager;
+import android.app.role.RoleControllerManager;
import android.content.Context;
import org.junit.Before;
@@ -34,14 +34,15 @@
public class DefaultHomeShortcutPreferenceControllerTest {
@Mock
- private RoleManager mRoleManager;
+ private RoleControllerManager mRoleControllerManager;
private DefaultHomeShortcutPreferenceController mController;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
- ShadowApplication.getInstance().setSystemService(Context.ROLE_SERVICE, mRoleManager);
+ ShadowApplication.getInstance().setSystemService(Context.ROLE_CONTROLLER_SERVICE,
+ mRoleControllerManager);
mController = new DefaultHomeShortcutPreferenceController(RuntimeEnvironment.application,
"Package1");
}
diff --git a/tests/robotests/src/com/android/settings/applications/appinfo/DefaultPhoneShortcutPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/applications/appinfo/DefaultPhoneShortcutPreferenceControllerTest.java
index c130665..d1b6aeb 100644
--- a/tests/robotests/src/com/android/settings/applications/appinfo/DefaultPhoneShortcutPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/applications/appinfo/DefaultPhoneShortcutPreferenceControllerTest.java
@@ -18,7 +18,7 @@
import static com.google.common.truth.Truth.assertThat;
-import android.app.role.RoleManager;
+import android.app.role.RoleControllerManager;
import android.content.Context;
import org.junit.Before;
@@ -37,14 +37,15 @@
private static final String PREFERENCE_KEY = "default_phone_app";
@Mock
- private RoleManager mRoleManager;
+ private RoleControllerManager mRoleControllerManager;
private DefaultPhoneShortcutPreferenceController mController;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
- ShadowApplication.getInstance().setSystemService(Context.ROLE_SERVICE, mRoleManager);
+ ShadowApplication.getInstance().setSystemService(Context.ROLE_CONTROLLER_SERVICE,
+ mRoleControllerManager);
mController = new DefaultPhoneShortcutPreferenceController(RuntimeEnvironment.application,
TEST_PACKAGE_NAME);
}
diff --git a/tests/robotests/src/com/android/settings/applications/appinfo/DefaultSmsShortcutPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/applications/appinfo/DefaultSmsShortcutPreferenceControllerTest.java
index e9c238d..691ce5e 100644
--- a/tests/robotests/src/com/android/settings/applications/appinfo/DefaultSmsShortcutPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/applications/appinfo/DefaultSmsShortcutPreferenceControllerTest.java
@@ -18,6 +18,7 @@
import static com.google.common.truth.Truth.assertThat;
+import android.app.role.RoleControllerManager;
import android.app.role.RoleManager;
import android.content.Context;
@@ -38,6 +39,8 @@
@Mock
private RoleManager mRoleManager;
+ @Mock
+ private RoleControllerManager mRoleControllerManager;
private DefaultSmsShortcutPreferenceController mController;
@@ -46,6 +49,7 @@
MockitoAnnotations.initMocks(this);
final ShadowApplication shadowApplication = ShadowApplication.getInstance();
shadowApplication.setSystemService(Context.ROLE_SERVICE, mRoleManager);
+ shadowApplication.setSystemService(Context.ROLE_CONTROLLER_SERVICE, mRoleControllerManager);
mController = new DefaultSmsShortcutPreferenceController(RuntimeEnvironment.application,
TEST_PACKAGE_NAME);
}
diff --git a/tests/robotests/src/com/android/settings/dashboard/DashboardFeatureProviderImplTest.java b/tests/robotests/src/com/android/settings/dashboard/DashboardFeatureProviderImplTest.java
index 36bc376..a0024c0 100644
--- a/tests/robotests/src/com/android/settings/dashboard/DashboardFeatureProviderImplTest.java
+++ b/tests/robotests/src/com/android/settings/dashboard/DashboardFeatureProviderImplTest.java
@@ -707,4 +707,18 @@
assertThat(preference.getSummary()).isEqualTo(
mContext.getText(R.string.about_settings_summary));
}
+
+ @Test
+ @Config(qualifiers = "mcc999")
+ public void bindPreference_specificHomepageTile_shouldOverridePosition() {
+ FeatureFlagUtils.setEnabled(mContext, FeatureFlags.SILKY_HOME, true);
+ final Preference preference = new Preference(RuntimeEnvironment.application);
+ final Tile tile = new ActivityTile(mActivityInfo, CategoryKey.CATEGORY_HOMEPAGE);
+
+ mImpl.bindPreferenceToTileAndGetObservers(mActivity, mForceRoundedIcon,
+ MetricsEvent.VIEW_UNKNOWN, preference, tile, null /*key */,
+ Preference.DEFAULT_ORDER);
+
+ assertThat(preference.getOrder()).isEqualTo(100);
+ }
}
diff --git a/tests/robotests/src/com/android/settings/development/compat/PlatformCompatDashboardTest.java b/tests/robotests/src/com/android/settings/development/compat/PlatformCompatDashboardTest.java
index 15e9bda..dffd7fb 100644
--- a/tests/robotests/src/com/android/settings/development/compat/PlatformCompatDashboardTest.java
+++ b/tests/robotests/src/com/android/settings/development/compat/PlatformCompatDashboardTest.java
@@ -88,14 +88,16 @@
public void setUp() throws RemoteException, NameNotFoundException {
MockitoAnnotations.initMocks(this);
mChanges = new CompatibilityChangeInfo[5];
- mChanges[0] = new CompatibilityChangeInfo(1L, "Default_Enabled", 0, 0, false, false, "");
- mChanges[1] = new CompatibilityChangeInfo(2L, "Default_Disabled", 0, 0, true, false, "");
- mChanges[2] = new CompatibilityChangeInfo(3L, "Enabled_Since_SDK_1_1", -1, 1, false, false,
- "");
- mChanges[3] = new CompatibilityChangeInfo(4L, "Enabled_Since_SDK_1_2", -1, 1, false, false,
- "");
- mChanges[4] = new CompatibilityChangeInfo(5L, "Enabled_Since_SDK_2", -1, 2, false, false,
- "");
+ mChanges[0] = new CompatibilityChangeInfo(
+ 1L, "Default_Enabled", 0, 0, false, false, "", false);
+ mChanges[1] = new CompatibilityChangeInfo(
+ 2L, "Default_Disabled", 0, 0, true, false, "", false);
+ mChanges[2] = new CompatibilityChangeInfo(
+ 3L, "Enabled_Since_SDK_1_1", -1, 1, false, false, "", false);
+ mChanges[3] = new CompatibilityChangeInfo(
+ 4L, "Enabled_Since_SDK_1_2", -1, 1, false, false, "", false);
+ mChanges[4] = new CompatibilityChangeInfo(
+ 5L, "Enabled_Since_SDK_2", -1, 2, false, false, "", false);
when(mPlatformCompat.listUIChanges()).thenReturn(mChanges);
when(mPlatformCompat.getOverrideValidator()).thenReturn(mOverrideValidator);
// By default, allow any change
@@ -208,7 +210,8 @@
for (int i = 0; i < mChanges.length; ++i) {
changesToAdd.add(new CompatibilityChangeInfo(mChanges[i].getId(), mChanges[i].getName(),
-1, mChanges[i].getEnableSinceTargetSdk(), mChanges[i].getDisabled(),
- mChanges[i].getLoggingOnly(), mChanges[i].getDescription()));
+ mChanges[i].getLoggingOnly(), mChanges[i].getDescription(),
+ mChanges[i].getOverridable()));
}
PreferenceCategory category = mDashboard.createChangeCategoryPreference(changesToAdd,
diff --git a/tests/robotests/src/com/android/settings/gestures/PreventRingingParentPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/gestures/PreventRingingParentPreferenceControllerTest.java
index c752eb9..9e4877c 100644
--- a/tests/robotests/src/com/android/settings/gestures/PreventRingingParentPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/gestures/PreventRingingParentPreferenceControllerTest.java
@@ -32,6 +32,8 @@
import android.content.res.Resources;
import android.provider.Settings;
+import androidx.preference.Preference;
+
import com.android.settings.R;
import org.junit.Before;
@@ -50,12 +52,14 @@
private Context mContext;
private PreventRingingParentPreferenceController mController;
+ private Preference mPreference;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
mContext = spy(RuntimeEnvironment.application.getApplicationContext());
mController = new PreventRingingParentPreferenceController(mContext, "test_key");
+ mPreference = new Preference(mContext);
}
@Test
@@ -80,17 +84,43 @@
public void updateState_summaryUpdated() {
Settings.Secure.putInt(mContext.getContentResolver(), VOLUME_HUSH_GESTURE,
VOLUME_HUSH_MUTE);
- assertThat(mController.getSummary()).isEqualTo(mContext.getResources().getText(
+ mController.updateState(mPreference);
+ assertThat(mPreference.getSummary()).isEqualTo(mContext.getResources().getText(
R.string.prevent_ringing_option_mute_summary));
Settings.Secure.putInt(mContext.getContentResolver(), VOLUME_HUSH_GESTURE,
VOLUME_HUSH_VIBRATE);
- assertThat(mController.getSummary()).isEqualTo(mContext.getResources().getText(
+ mController.updateState(mPreference);
+ assertThat(mPreference.getSummary()).isEqualTo(mContext.getResources().getText(
R.string.prevent_ringing_option_vibrate_summary));
Settings.Secure.putInt(mContext.getContentResolver(), VOLUME_HUSH_GESTURE,
VOLUME_HUSH_OFF);
- assertThat(mController.getSummary()).isEqualTo(mContext.getResources().getText(
- R.string.prevent_ringing_option_none_summary));
+ mController.updateState(mPreference);
+ assertThat(mPreference.getSummary()).isEqualTo(null);
+ }
+
+ @Test
+ public void isChecked_vibrate_shouldReturnTrue() {
+ Settings.Secure.putInt(mContext.getContentResolver(), VOLUME_HUSH_GESTURE,
+ VOLUME_HUSH_VIBRATE);
+
+ assertThat(mController.isChecked()).isTrue();
+ }
+
+ @Test
+ public void isChecked_mute_shouldReturnTrue() {
+ Settings.Secure.putInt(mContext.getContentResolver(), VOLUME_HUSH_GESTURE,
+ VOLUME_HUSH_MUTE);
+
+ assertThat(mController.isChecked()).isTrue();
+ }
+
+ @Test
+ public void isChecked_off_shouldReturnFalse() {
+ Settings.Secure.putInt(mContext.getContentResolver(), VOLUME_HUSH_GESTURE,
+ VOLUME_HUSH_OFF);
+
+ assertThat(mController.isChecked()).isFalse();
}
}
diff --git a/tests/robotests/src/com/android/settings/gestures/PreventRingingSwitchPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/gestures/PreventRingingSwitchPreferenceControllerTest.java
index ccb2bf6..5f25759 100644
--- a/tests/robotests/src/com/android/settings/gestures/PreventRingingSwitchPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/gestures/PreventRingingSwitchPreferenceControllerTest.java
@@ -36,8 +36,7 @@
import androidx.preference.Preference;
import androidx.preference.PreferenceScreen;
-import com.android.settings.widget.SwitchBar;
-import com.android.settingslib.widget.LayoutPreference;
+import com.android.settingslib.widget.MainSwitchPreference;
import org.junit.Before;
import org.junit.Test;
@@ -63,7 +62,7 @@
when(mResources.getBoolean(com.android.internal.R.bool.config_volumeHushGestureEnabled))
.thenReturn(true);
mController = new PreventRingingSwitchPreferenceController(mContext);
- mController.mSwitch = mock(SwitchBar.class);
+ mController.mSwitch = mock(MainSwitchPreference.class);
}
@Test
@@ -89,7 +88,7 @@
mController.updateState(mPreference);
- verify(mController.mSwitch, times(1)).setChecked(false);
+ verify(mController.mSwitch, times(1)).updateStatus(false);
}
@Test
@@ -99,7 +98,7 @@
mController.updateState(mPreference);
- verify(mController.mSwitch, times(1)).setChecked(true);
+ verify(mController.mSwitch, times(1)).updateStatus(true);
}
@Test
@@ -109,7 +108,7 @@
mController.updateState(mPreference);
- verify(mController.mSwitch, times(1)).setChecked(true);
+ verify(mController.mSwitch, times(1)).updateStatus(true);
}
@Test
@@ -161,13 +160,13 @@
@Test
public void testPreferenceClickListenerAttached() {
PreferenceScreen preferenceScreen = mock(PreferenceScreen.class);
- LayoutPreference mLayoutPreference = mock(LayoutPreference.class);
+ MainSwitchPreference preference = mock(MainSwitchPreference.class);
when(preferenceScreen.findPreference(mController.getPreferenceKey())).thenReturn(
- mLayoutPreference);
+ preference);
mController.displayPreference(preferenceScreen);
- verify(mLayoutPreference, times(1))
+ verify(preference, times(1))
.setOnPreferenceClickListener(any());
}
}
diff --git a/tests/robotests/src/com/android/settings/media/MediaOutputIndicatorSliceTest.java b/tests/robotests/src/com/android/settings/media/MediaOutputIndicatorSliceTest.java
index 68848af..7248ff6 100644
--- a/tests/robotests/src/com/android/settings/media/MediaOutputIndicatorSliceTest.java
+++ b/tests/robotests/src/com/android/settings/media/MediaOutputIndicatorSliceTest.java
@@ -51,7 +51,7 @@
import com.android.settings.testutils.shadow.ShadowBluetoothUtils;
import com.android.settingslib.bluetooth.LocalBluetoothManager;
import com.android.settingslib.media.MediaDevice;
-import com.android.settingslib.media.MediaOutputSliceConstants;
+import com.android.settingslib.media.MediaOutputConstants;
import org.junit.Before;
import org.junit.Test;
@@ -219,13 +219,13 @@
Intent intent = intentList.get(0);
assertThat(TextUtils.equals(TEST_PACKAGE_NAME, intent.getStringExtra(
- MediaOutputSliceConstants.EXTRA_PACKAGE_NAME))).isTrue();
- assertThat(MediaOutputSliceConstants.ACTION_LAUNCH_MEDIA_OUTPUT_DIALOG).isEqualTo(
+ MediaOutputConstants.EXTRA_PACKAGE_NAME))).isTrue();
+ assertThat(MediaOutputConstants.ACTION_LAUNCH_MEDIA_OUTPUT_DIALOG).isEqualTo(
intent.getAction());
- assertThat(TextUtils.equals(MediaOutputSliceConstants.SYSTEMUI_PACKAGE_NAME,
+ assertThat(TextUtils.equals(MediaOutputConstants.SYSTEMUI_PACKAGE_NAME,
intent.getPackage())).isTrue();
assertThat(mToken == intent.getExtras().getParcelable(
- MediaOutputSliceConstants.KEY_MEDIA_SESSION_TOKEN)).isTrue();
+ MediaOutputConstants.KEY_MEDIA_SESSION_TOKEN)).isTrue();
}
@Test
@@ -240,13 +240,13 @@
Intent intent = intentList.get(0);
assertThat(TextUtils.isEmpty(intent.getStringExtra(
- MediaOutputSliceConstants.EXTRA_PACKAGE_NAME))).isTrue();
- assertThat(MediaOutputSliceConstants.ACTION_LAUNCH_MEDIA_OUTPUT_DIALOG).isEqualTo(
+ MediaOutputConstants.EXTRA_PACKAGE_NAME))).isTrue();
+ assertThat(MediaOutputConstants.ACTION_LAUNCH_MEDIA_OUTPUT_DIALOG).isEqualTo(
intent.getAction());
- assertThat(TextUtils.equals(MediaOutputSliceConstants.SYSTEMUI_PACKAGE_NAME,
+ assertThat(TextUtils.equals(MediaOutputConstants.SYSTEMUI_PACKAGE_NAME,
intent.getPackage())).isTrue();
assertThat(intent.getExtras().getParcelable(
- MediaOutputSliceConstants.KEY_MEDIA_SESSION_TOKEN) == null).isTrue();
+ MediaOutputConstants.KEY_MEDIA_SESSION_TOKEN) == null).isTrue();
}
@Test
diff --git a/tests/robotests/src/com/android/settings/panel/InternetConnectivityPanelTest.java b/tests/robotests/src/com/android/settings/panel/InternetConnectivityPanelTest.java
index d9f56de..eb82d31 100644
--- a/tests/robotests/src/com/android/settings/panel/InternetConnectivityPanelTest.java
+++ b/tests/robotests/src/com/android/settings/panel/InternetConnectivityPanelTest.java
@@ -20,10 +20,12 @@
import static com.google.common.truth.Truth.assertThat;
import android.net.Uri;
+import android.os.SystemProperties;
import com.android.settings.network.AirplaneModePreferenceController;
import com.android.settings.slices.CustomSliceRegistry;
+import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -37,14 +39,25 @@
public class InternetConnectivityPanelTest {
private InternetConnectivityPanel mPanel;
+ private static final String SETTINGS_PROVIDER_MODEL =
+ "persist.sys.fflag.override.settings_provider_model";
+ private boolean mSettingsProviderModelState;
@Before
public void setUp() {
mPanel = InternetConnectivityPanel.create(RuntimeEnvironment.application);
+ mSettingsProviderModelState = SystemProperties.getBoolean(SETTINGS_PROVIDER_MODEL, false);
+ }
+
+ @After
+ public void tearDown() {
+ SystemProperties.set(SETTINGS_PROVIDER_MODEL,
+ mSettingsProviderModelState ? "true" : "false");
}
@Test
- public void getSlices_containsNecessarySlices() {
+ public void getSlices_providerModelDisabled_containsNecessarySlices() {
+ SystemProperties.set(SETTINGS_PROVIDER_MODEL, "false");
final List<Uri> uris = mPanel.getSlices();
assertThat(uris).containsExactly(
@@ -54,6 +67,16 @@
}
@Test
+ public void getSlices_providerModelEnabled_containsNecessarySlices() {
+ SystemProperties.set(SETTINGS_PROVIDER_MODEL, "true");
+ final List<Uri> uris = mPanel.getSlices();
+
+ assertThat(uris).containsExactly(
+ CustomSliceRegistry.PROVIDER_MODEL_SLICE_URI,
+ CustomSliceRegistry.AIRPLANE_SAFE_NETWORKS_SLICE_URI);
+ }
+
+ @Test
public void getSeeMoreIntent_notNull() {
assertThat(mPanel.getSeeMoreIntent()).isNotNull();
}
diff --git a/tests/robotests/src/com/android/settings/sim/SimSelectNotificationTest.java b/tests/robotests/src/com/android/settings/sim/SimSelectNotificationTest.java
index 84e88cb..e08893b 100644
--- a/tests/robotests/src/com/android/settings/sim/SimSelectNotificationTest.java
+++ b/tests/robotests/src/com/android/settings/sim/SimSelectNotificationTest.java
@@ -59,6 +59,7 @@
import android.telephony.SubscriptionInfo;
import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager;
+import android.util.DisplayMetrics;
import com.android.settings.R;
import com.android.settings.testutils.shadow.ShadowAlertDialogCompat;
@@ -89,6 +90,8 @@
private Resources mResources;
@Mock
private SubscriptionInfo mSubInfo;
+ @Mock
+ private DisplayMetrics mDisplayMetrics;
private final String mFakeDisplayName = "fake_display_name";
private final CharSequence mFakeNotificationChannelTitle = "fake_notification_channel_title";
@@ -141,6 +144,9 @@
.thenReturn(mFakeDualCdmaWarningTitle);
when(mResources.getString(R.string.dual_cdma_sim_warning_notification_summary,
mSimCombinationName)).thenReturn(mFakeDualCdmaWarningSummary);
+
+ when(mResources.getDisplayMetrics()).thenReturn(mDisplayMetrics);
+ mDisplayMetrics.density = 1.5f;
}
@Test
@@ -275,4 +281,3 @@
assertThat(notification.getValue().contentIntent).isNotNull();
}
}
-
diff --git a/tests/robotests/src/com/android/settings/sound/MediaOutputPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/sound/MediaOutputPreferenceControllerTest.java
index eb84a4f..f604193 100644
--- a/tests/robotests/src/com/android/settings/sound/MediaOutputPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/sound/MediaOutputPreferenceControllerTest.java
@@ -58,7 +58,7 @@
import com.android.settingslib.bluetooth.HearingAidProfile;
import com.android.settingslib.bluetooth.LocalBluetoothManager;
import com.android.settingslib.bluetooth.LocalBluetoothProfileManager;
-import com.android.settingslib.media.MediaOutputSliceConstants;
+import com.android.settingslib.media.MediaOutputConstants;
import org.junit.After;
import org.junit.Before;
@@ -302,7 +302,7 @@
mController.handlePreferenceTreeClick(mPreference);
verify(mContext).sendBroadcast(intentCaptor.capture());
assertThat(intentCaptor.getValue().getAction())
- .isEqualTo(MediaOutputSliceConstants.ACTION_LAUNCH_MEDIA_OUTPUT_DIALOG);
+ .isEqualTo(MediaOutputConstants.ACTION_LAUNCH_MEDIA_OUTPUT_DIALOG);
}
/**
diff --git a/tests/robotests/src/com/android/settings/wifi/calling/WifiCallingSliceHelperTest.java b/tests/robotests/src/com/android/settings/wifi/calling/WifiCallingSliceHelperTest.java
index 03a63b0..dbe7718 100644
--- a/tests/robotests/src/com/android/settings/wifi/calling/WifiCallingSliceHelperTest.java
+++ b/tests/robotests/src/com/android/settings/wifi/calling/WifiCallingSliceHelperTest.java
@@ -397,14 +397,15 @@
final Intent intent = new Intent(action);
intent.setClass(mContext, SliceBroadcastReceiver.class);
return PendingIntent.getBroadcast(mContext, 0 /* requestCode */, intent,
- PendingIntent.FLAG_CANCEL_CURRENT);
+ PendingIntent.FLAG_CANCEL_CURRENT | PendingIntent.FLAG_IMMUTABLE);
}
private PendingIntent getActivityIntent(String action) {
final Intent intent = new Intent(action);
intent.setPackage(SETTINGS_PACKAGE_NAME);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- return PendingIntent.getActivity(mContext, 0 /* requestCode */, intent, 0 /* flags */);
+ return PendingIntent.getActivity(mContext, 0 /* requestCode */, intent,
+ PendingIntent.FLAG_IMMUTABLE);
}
private void assertTitle(List<SliceItem> sliceItems, String title) {
diff --git a/tests/robotests/src/com/android/settings/wifi/tether/WifiTetherSecurityPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/wifi/tether/WifiTetherSecurityPreferenceControllerTest.java
deleted file mode 100644
index c7d0695..0000000
--- a/tests/robotests/src/com/android/settings/wifi/tether/WifiTetherSecurityPreferenceControllerTest.java
+++ /dev/null
@@ -1,105 +0,0 @@
-package com.android.settings.wifi.tether;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.ArgumentMatchers.anyString;
-import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.when;
-
-import android.content.Context;
-import android.net.ConnectivityManager;
-import android.net.wifi.SoftApConfiguration;
-import android.net.wifi.WifiManager;
-
-import androidx.preference.ListPreference;
-import androidx.preference.PreferenceScreen;
-
-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 WifiTetherSecurityPreferenceControllerTest {
-
- private static final String WPA2_PSK =
- String.valueOf(SoftApConfiguration.SECURITY_TYPE_WPA2_PSK);
- private static final String NONE = String.valueOf(SoftApConfiguration.SECURITY_TYPE_OPEN);
- @Mock
- private WifiTetherBasePreferenceController.OnTetherConfigUpdateListener mListener;
- private Context mContext;
- @Mock
- private ConnectivityManager mConnectivityManager;
- @Mock
- private WifiManager mWifiManager;
- @Mock
- private PreferenceScreen mScreen;
- private WifiTetherSecurityPreferenceController mController;
- private ListPreference mPreference;
- private SoftApConfiguration mConfig;
-
- @Before
- public void setUp() {
- MockitoAnnotations.initMocks(this);
- mConfig = new SoftApConfiguration.Builder().setSsid("test_1234")
- .setPassphrase("test_password",
- SoftApConfiguration.SECURITY_TYPE_WPA2_PSK).build();
- mContext = spy(RuntimeEnvironment.application);
-
- when(mContext.getSystemService(Context.WIFI_SERVICE)).thenReturn(mWifiManager);
- when(mWifiManager.getSoftApConfiguration()).thenReturn(mConfig);
- when(mContext.getSystemService(Context.CONNECTIVITY_SERVICE))
- .thenReturn(mConnectivityManager);
- when(mConnectivityManager.getTetherableWifiRegexs()).thenReturn(new String[]{"1", "2"});
- when(mScreen.findPreference(anyString())).thenReturn(mPreference);
-
- mController = new WifiTetherSecurityPreferenceController(mContext, mListener);
- mPreference = new ListPreference(RuntimeEnvironment.application);
- mController.mPreference = mPreference;
- }
-
- @Test
- public void onPreferenceChange_securityValueUpdated() {
- mController.onPreferenceChange(mPreference, WPA2_PSK);
- assertThat(mController.getSecurityType()).isEqualTo(
- SoftApConfiguration.SECURITY_TYPE_WPA2_PSK);
- assertThat(mPreference.getSummary().toString()).isEqualTo("WPA2-Personal");
-
- mController.onPreferenceChange(mPreference, NONE);
- assertThat(mController.getSecurityType()).isEqualTo(
- SoftApConfiguration.SECURITY_TYPE_OPEN);
- assertThat(mPreference.getSummary().toString()).isEqualTo("None");
- }
-
- @Test
- public void updateDisplay_preferenceUpdated() {
- // test defaulting to WPA2-Personal on new config
- when(mWifiManager.getSoftApConfiguration()).thenReturn(null);
- mController.updateDisplay();
- assertThat(mController.getSecurityType()).isEqualTo(
- SoftApConfiguration.SECURITY_TYPE_WPA2_PSK);
- assertThat(mPreference.getSummary().toString()).isEqualTo("WPA2-Personal");
-
- // test open tether network
- SoftApConfiguration config = new SoftApConfiguration.Builder(mConfig)
- .setPassphrase(null, SoftApConfiguration.SECURITY_TYPE_OPEN).build();
- when(mWifiManager.getSoftApConfiguration()).thenReturn(config);
- mController.updateDisplay();
- assertThat(mController.getSecurityType()).isEqualTo(
- SoftApConfiguration.SECURITY_TYPE_OPEN);
- assertThat(mPreference.getSummary().toString()).isEqualTo("None");
-
- // test WPA2-Personal tether network
- SoftApConfiguration config2 = new SoftApConfiguration.Builder(mConfig)
- .setPassphrase("test_password",
- SoftApConfiguration.SECURITY_TYPE_WPA2_PSK).build();
- when(mWifiManager.getSoftApConfiguration()).thenReturn(config2);
- mController.updateDisplay();
- assertThat(mController.getSecurityType()).isEqualTo(
- SoftApConfiguration.SECURITY_TYPE_WPA2_PSK);
- assertThat(mPreference.getSummary().toString()).isEqualTo("WPA2-Personal");
- }
-}
diff --git a/tests/unit/src/com/android/settings/wifi/WifiUtilsTest.java b/tests/unit/src/com/android/settings/wifi/WifiUtilsTest.java
index 7a75443..1a5e852 100644
--- a/tests/unit/src/com/android/settings/wifi/WifiUtilsTest.java
+++ b/tests/unit/src/com/android/settings/wifi/WifiUtilsTest.java
@@ -21,6 +21,7 @@
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
+import android.net.wifi.SoftApConfiguration;
import android.net.wifi.WifiConfiguration;
import androidx.test.ext.junit.runners.AndroidJUnit4;
@@ -46,12 +47,48 @@
public void testPassword() {
final String longPassword = "123456789012345678901234567890"
+ "1234567890123456789012345678901234567890";
- assertThat(WifiUtils.isHotspotWpa2PasswordValid("123")).isFalse();
- assertThat(WifiUtils.isHotspotWpa2PasswordValid("12345678")).isTrue();
- assertThat(WifiUtils.isHotspotWpa2PasswordValid("1234567890")).isTrue();
- assertThat(WifiUtils.isHotspotWpa2PasswordValid(longPassword)).isFalse();
- assertThat(WifiUtils.isHotspotWpa2PasswordValid("")).isFalse();
- assertThat(WifiUtils.isHotspotWpa2PasswordValid("€¥£")).isFalse();
+ assertThat(WifiUtils.isHotspotPasswordValid("123",
+ SoftApConfiguration.SECURITY_TYPE_WPA2_PSK)).isFalse();
+ assertThat(WifiUtils.isHotspotPasswordValid("12345678",
+ SoftApConfiguration.SECURITY_TYPE_WPA2_PSK)).isTrue();
+ assertThat(WifiUtils.isHotspotPasswordValid("1234567890",
+ SoftApConfiguration.SECURITY_TYPE_WPA2_PSK)).isTrue();
+ assertThat(WifiUtils.isHotspotPasswordValid(longPassword,
+ SoftApConfiguration.SECURITY_TYPE_WPA2_PSK)).isFalse();
+ assertThat(WifiUtils.isHotspotPasswordValid("",
+ SoftApConfiguration.SECURITY_TYPE_WPA2_PSK)).isFalse();
+ assertThat(WifiUtils.isHotspotPasswordValid("€¥£",
+ SoftApConfiguration.SECURITY_TYPE_WPA2_PSK)).isFalse();
+
+ // The WPA3_SAE_TRANSITION password limitation should be same as WPA2_PSK
+ assertThat(WifiUtils.isHotspotPasswordValid("123",
+ SoftApConfiguration.SECURITY_TYPE_WPA3_SAE_TRANSITION)).isFalse();
+ assertThat(WifiUtils.isHotspotPasswordValid("12345678",
+ SoftApConfiguration.SECURITY_TYPE_WPA3_SAE_TRANSITION)).isTrue();
+ assertThat(WifiUtils.isHotspotPasswordValid("1234567890",
+ SoftApConfiguration.SECURITY_TYPE_WPA3_SAE_TRANSITION)).isTrue();
+ assertThat(WifiUtils.isHotspotPasswordValid(longPassword,
+ SoftApConfiguration.SECURITY_TYPE_WPA3_SAE_TRANSITION)).isFalse();
+ assertThat(WifiUtils.isHotspotPasswordValid("",
+ SoftApConfiguration.SECURITY_TYPE_WPA3_SAE_TRANSITION)).isFalse();
+ assertThat(WifiUtils.isHotspotPasswordValid("€¥£",
+ SoftApConfiguration.SECURITY_TYPE_WPA3_SAE_TRANSITION)).isFalse();
+
+ // The WA3_SAE password is requested that length > 1 only.
+ assertThat(WifiUtils.isHotspotPasswordValid("",
+ SoftApConfiguration.SECURITY_TYPE_WPA3_SAE)).isFalse();
+ assertThat(WifiUtils.isHotspotPasswordValid("1",
+ SoftApConfiguration.SECURITY_TYPE_WPA3_SAE)).isTrue();
+ assertThat(WifiUtils.isHotspotPasswordValid("123",
+ SoftApConfiguration.SECURITY_TYPE_WPA3_SAE)).isTrue();
+ assertThat(WifiUtils.isHotspotPasswordValid("12345678",
+ SoftApConfiguration.SECURITY_TYPE_WPA3_SAE)).isTrue();
+ assertThat(WifiUtils.isHotspotPasswordValid("1234567890",
+ SoftApConfiguration.SECURITY_TYPE_WPA3_SAE)).isTrue();
+ assertThat(WifiUtils.isHotspotPasswordValid(longPassword,
+ SoftApConfiguration.SECURITY_TYPE_WPA3_SAE)).isTrue();
+ assertThat(WifiUtils.isHotspotPasswordValid("€¥£",
+ SoftApConfiguration.SECURITY_TYPE_WPA3_SAE)).isTrue();
}
@Test
diff --git a/tests/unit/src/com/android/settings/wifi/tether/WifiTetherSecurityPreferenceControllerTest.java b/tests/unit/src/com/android/settings/wifi/tether/WifiTetherSecurityPreferenceControllerTest.java
new file mode 100644
index 0000000..c86e3e5
--- /dev/null
+++ b/tests/unit/src/com/android/settings/wifi/tether/WifiTetherSecurityPreferenceControllerTest.java
@@ -0,0 +1,206 @@
+/*
+ * 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.wifi.tether;
+
+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.net.wifi.SoftApConfiguration;
+import android.net.wifi.WifiManager;
+import android.os.Looper;
+
+import androidx.preference.ListPreference;
+import androidx.preference.PreferenceManager;
+import androidx.preference.PreferenceScreen;
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.junit.MockitoJUnit;
+import org.mockito.junit.MockitoRule;
+
+@RunWith(AndroidJUnit4.class)
+public class WifiTetherSecurityPreferenceControllerTest {
+
+ private static final String PREF_KEY = "wifi_tether_security";
+ private static final String WPA3_SAE =
+ String.valueOf(SoftApConfiguration.SECURITY_TYPE_WPA3_SAE);
+ private static final String WPA3_SAE_TRANSITION =
+ String.valueOf(SoftApConfiguration.SECURITY_TYPE_WPA3_SAE_TRANSITION);
+ private static final String WPA2_PSK =
+ String.valueOf(SoftApConfiguration.SECURITY_TYPE_WPA2_PSK);
+ private static final String NONE = String.valueOf(SoftApConfiguration.SECURITY_TYPE_OPEN);
+
+ @Rule
+ public final MockitoRule mMockitoRule = MockitoJUnit.rule();
+ @Mock
+ private WifiManager mWifiManager;
+ @Mock
+ private WifiTetherBasePreferenceController.OnTetherConfigUpdateListener mListener;
+
+ private WifiTetherSecurityPreferenceController mController;
+ private ListPreference mPreference;
+ private SoftApConfiguration mConfig;
+
+ @Before
+ public void setUp() {
+ final Context context = spy(ApplicationProvider.getApplicationContext());
+ mConfig = new SoftApConfiguration.Builder().setSsid("test_1234")
+ .setPassphrase(null, SoftApConfiguration.SECURITY_TYPE_OPEN).build();
+ when(context.getSystemService(Context.WIFI_SERVICE)).thenReturn(mWifiManager);
+ when(mWifiManager.getSoftApConfiguration()).thenReturn(mConfig);
+
+ mController = new WifiTetherSecurityPreferenceController(context, mListener);
+ if (Looper.myLooper() == null) {
+ Looper.prepare();
+ }
+ final PreferenceManager preferenceManager = new PreferenceManager(context);
+ final PreferenceScreen screen = preferenceManager.createPreferenceScreen(context);
+ mPreference = new ListPreference(context);
+ mPreference.setKey(PREF_KEY);
+ screen.addPreference(mPreference);
+ mController.displayPreference(screen);
+ }
+
+ @Test
+ public void onPreferenceChange_toWpa3Sae_shouldUpdateSecurityValue() {
+ mController.onPreferenceChange(mPreference, WPA3_SAE);
+
+ assertThat(mController.getSecurityType())
+ .isEqualTo(SoftApConfiguration.SECURITY_TYPE_WPA3_SAE);
+ assertThat(mPreference.getSummary().toString()).isEqualTo("WPA3-Personal");
+ }
+
+ @Test
+ public void onPreferenceChange_toWpa3SaeTransition_shouldUpdateSecurityValue() {
+ mController.onPreferenceChange(mPreference, WPA3_SAE_TRANSITION);
+
+ assertThat(mController.getSecurityType())
+ .isEqualTo(SoftApConfiguration.SECURITY_TYPE_WPA3_SAE_TRANSITION);
+ assertThat(mPreference.getSummary().toString()).isEqualTo("WPA2/WPA3-Personal");
+ }
+
+ @Test
+ public void onPreferenceChange_toWpa2Psk_shouldUpdateSecurityValue() {
+ mController.onPreferenceChange(mPreference, WPA2_PSK);
+
+ assertThat(mController.getSecurityType())
+ .isEqualTo(SoftApConfiguration.SECURITY_TYPE_WPA2_PSK);
+ assertThat(mPreference.getSummary().toString()).isEqualTo("WPA2-Personal");
+ }
+
+ @Test
+ public void onPreferenceChange_toNone_shouldUpdateSecurityValue() {
+ mController.onPreferenceChange(mPreference, NONE);
+
+ assertThat(mController.getSecurityType())
+ .isEqualTo(SoftApConfiguration.SECURITY_TYPE_OPEN);
+ assertThat(mPreference.getSummary().toString()).isEqualTo("None");
+ }
+
+ @Test
+ public void updateDisplay_toWpa3Sae_shouldUpdateSecurityValue() {
+ SoftApConfiguration config = new SoftApConfiguration.Builder(mConfig)
+ .setPassphrase("test_password",
+ SoftApConfiguration.SECURITY_TYPE_WPA3_SAE).build();
+ when(mWifiManager.getSoftApConfiguration()).thenReturn(config);
+
+ mController.updateDisplay();
+
+ assertThat(mController.getSecurityType())
+ .isEqualTo(SoftApConfiguration.SECURITY_TYPE_WPA3_SAE);
+ assertThat(mPreference.getSummary().toString()).isEqualTo("WPA3-Personal");
+ }
+
+ @Test
+ public void updateDisplay_toWpa3SaeTransition_shouldUpdateSecurityValue() {
+ SoftApConfiguration config = new SoftApConfiguration.Builder(mConfig)
+ .setPassphrase("test_password",
+ SoftApConfiguration.SECURITY_TYPE_WPA3_SAE_TRANSITION).build();
+ when(mWifiManager.getSoftApConfiguration()).thenReturn(config);
+
+ mController.updateDisplay();
+
+ assertThat(mController.getSecurityType())
+ .isEqualTo(SoftApConfiguration.SECURITY_TYPE_WPA3_SAE_TRANSITION);
+ assertThat(mPreference.getSummary().toString()).isEqualTo("WPA2/WPA3-Personal");
+ }
+
+ @Test
+ public void updateDisplay_toWpa2Psk_shouldUpdateSecurityValue() {
+ SoftApConfiguration config = new SoftApConfiguration.Builder(mConfig)
+ .setPassphrase("test_password",
+ SoftApConfiguration.SECURITY_TYPE_WPA2_PSK).build();
+ when(mWifiManager.getSoftApConfiguration()).thenReturn(config);
+
+ mController.updateDisplay();
+
+ assertThat(mController.getSecurityType())
+ .isEqualTo(SoftApConfiguration.SECURITY_TYPE_WPA2_PSK);
+ assertThat(mPreference.getSummary().toString()).isEqualTo("WPA2-Personal");
+ }
+
+ @Test
+ public void updateDisplay_toNone_shouldUpdateSecurityValue() {
+ SoftApConfiguration config = new SoftApConfiguration.Builder(mConfig)
+ .setPassphrase(null, SoftApConfiguration.SECURITY_TYPE_OPEN).build();
+ when(mWifiManager.getSoftApConfiguration()).thenReturn(config);
+
+ mController.updateDisplay();
+
+ assertThat(mController.getSecurityType())
+ .isEqualTo(SoftApConfiguration.SECURITY_TYPE_OPEN);
+ assertThat(mPreference.getSummary().toString()).isEqualTo("None");
+ }
+
+ @Test
+ public void updateDisplay_toWpa3SaeButNotSupportWpa3_shouldBeDefaultToWpa2() {
+ mController.mIsWpa3Supported = false;
+ SoftApConfiguration config = new SoftApConfiguration.Builder(mConfig)
+ .setPassphrase("test_password",
+ SoftApConfiguration.SECURITY_TYPE_WPA3_SAE).build();
+ when(mWifiManager.getSoftApConfiguration()).thenReturn(config);
+
+ mController.updateDisplay();
+
+ assertThat(mController.getSecurityType())
+ .isEqualTo(SoftApConfiguration.SECURITY_TYPE_WPA2_PSK);
+ assertThat(mPreference.getSummary().toString()).isEqualTo("WPA2-Personal");
+ }
+
+ @Test
+ public void updateDisplay_toWpa3SaeTransitionButNotSupportWpa3_shouldBeDefaultToWpa2() {
+ mController.mIsWpa3Supported = false;
+ SoftApConfiguration config = new SoftApConfiguration.Builder(mConfig)
+ .setPassphrase("test_password",
+ SoftApConfiguration.SECURITY_TYPE_WPA3_SAE_TRANSITION).build();
+ when(mWifiManager.getSoftApConfiguration()).thenReturn(config);
+
+ mController.updateDisplay();
+
+ assertThat(mController.getSecurityType())
+ .isEqualTo(SoftApConfiguration.SECURITY_TYPE_WPA2_PSK);
+ assertThat(mPreference.getSummary().toString()).isEqualTo("WPA2-Personal");
+ }
+}