Snap for 7076087 from 12797dc986 to sc-release
Change-Id: I2244f97e1ad275ab3e89f57de3aaf02e2233591e
This commit is contained in:
@@ -1025,6 +1025,22 @@
|
||||
column="5"/>
|
||||
</issue>
|
||||
|
||||
<issue
|
||||
id="HardCodedColor"
|
||||
severity="Error"
|
||||
message="Avoid using hardcoded color"
|
||||
category="Correctness"
|
||||
priority="4"
|
||||
summary="Using hardcoded color"
|
||||
explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
|
||||
errorLine1=" <color name="homepage_wallpaper_background">#E51AD1</color>"
|
||||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
|
||||
<location
|
||||
file="res/values/colors.xml"
|
||||
line="102"
|
||||
column="5"/>
|
||||
</issue>
|
||||
|
||||
<issue
|
||||
id="HardCodedColor"
|
||||
severity="Error"
|
||||
@@ -1037,7 +1053,7 @@
|
||||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
|
||||
<location
|
||||
file="res/values/colors.xml"
|
||||
line="103"
|
||||
line="104"
|
||||
column="5"/>
|
||||
</issue>
|
||||
|
||||
@@ -1053,7 +1069,7 @@
|
||||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
|
||||
<location
|
||||
file="res/values/colors.xml"
|
||||
line="109"
|
||||
line="110"
|
||||
column="5"/>
|
||||
</issue>
|
||||
|
||||
@@ -1069,7 +1085,7 @@
|
||||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
|
||||
<location
|
||||
file="res/values/colors.xml"
|
||||
line="112"
|
||||
line="113"
|
||||
column="5"/>
|
||||
</issue>
|
||||
|
||||
@@ -1085,7 +1101,7 @@
|
||||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
|
||||
<location
|
||||
file="res/values/colors.xml"
|
||||
line="113"
|
||||
line="114"
|
||||
column="5"/>
|
||||
</issue>
|
||||
|
||||
@@ -1101,7 +1117,7 @@
|
||||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
|
||||
<location
|
||||
file="res/values/colors.xml"
|
||||
line="114"
|
||||
line="115"
|
||||
column="5"/>
|
||||
</issue>
|
||||
|
||||
@@ -1117,7 +1133,7 @@
|
||||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
|
||||
<location
|
||||
file="res/values/colors.xml"
|
||||
line="115"
|
||||
line="116"
|
||||
column="5"/>
|
||||
</issue>
|
||||
|
||||
@@ -1133,7 +1149,7 @@
|
||||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
|
||||
<location
|
||||
file="res/values/colors.xml"
|
||||
line="116"
|
||||
line="117"
|
||||
column="5"/>
|
||||
</issue>
|
||||
|
||||
@@ -1149,7 +1165,7 @@
|
||||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
|
||||
<location
|
||||
file="res/values/colors.xml"
|
||||
line="117"
|
||||
line="118"
|
||||
column="5"/>
|
||||
</issue>
|
||||
|
||||
@@ -1165,7 +1181,7 @@
|
||||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
|
||||
<location
|
||||
file="res/values/colors.xml"
|
||||
line="120"
|
||||
line="121"
|
||||
column="5"/>
|
||||
</issue>
|
||||
|
||||
@@ -1181,7 +1197,7 @@
|
||||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
|
||||
<location
|
||||
file="res/values/colors.xml"
|
||||
line="121"
|
||||
line="122"
|
||||
column="5"/>
|
||||
</issue>
|
||||
|
||||
@@ -1197,7 +1213,7 @@
|
||||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
|
||||
<location
|
||||
file="res/values/colors.xml"
|
||||
line="122"
|
||||
line="123"
|
||||
column="5"/>
|
||||
</issue>
|
||||
|
||||
@@ -1213,7 +1229,7 @@
|
||||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
|
||||
<location
|
||||
file="res/values/colors.xml"
|
||||
line="123"
|
||||
line="124"
|
||||
column="5"/>
|
||||
</issue>
|
||||
|
||||
@@ -1229,7 +1245,7 @@
|
||||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
|
||||
<location
|
||||
file="res/values/colors.xml"
|
||||
line="124"
|
||||
line="125"
|
||||
column="5"/>
|
||||
</issue>
|
||||
|
||||
@@ -1245,7 +1261,7 @@
|
||||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
|
||||
<location
|
||||
file="res/values/colors.xml"
|
||||
line="127"
|
||||
line="128"
|
||||
column="5"/>
|
||||
</issue>
|
||||
|
||||
@@ -1261,7 +1277,7 @@
|
||||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
|
||||
<location
|
||||
file="res/values/colors.xml"
|
||||
line="128"
|
||||
line="129"
|
||||
column="5"/>
|
||||
</issue>
|
||||
|
||||
@@ -1277,7 +1293,7 @@
|
||||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
|
||||
<location
|
||||
file="res/values/colors.xml"
|
||||
line="129"
|
||||
line="130"
|
||||
column="5"/>
|
||||
</issue>
|
||||
|
||||
@@ -1293,7 +1309,7 @@
|
||||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
|
||||
<location
|
||||
file="res/values/colors.xml"
|
||||
line="130"
|
||||
line="131"
|
||||
column="5"/>
|
||||
</issue>
|
||||
|
||||
@@ -1309,7 +1325,7 @@
|
||||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
|
||||
<location
|
||||
file="res/values/colors.xml"
|
||||
line="131"
|
||||
line="132"
|
||||
column="5"/>
|
||||
</issue>
|
||||
|
||||
@@ -1325,7 +1341,7 @@
|
||||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
|
||||
<location
|
||||
file="res/values/colors.xml"
|
||||
line="132"
|
||||
line="133"
|
||||
column="5"/>
|
||||
</issue>
|
||||
|
||||
@@ -1341,7 +1357,7 @@
|
||||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
|
||||
<location
|
||||
file="res/values/colors.xml"
|
||||
line="139"
|
||||
line="140"
|
||||
column="5"/>
|
||||
</issue>
|
||||
|
||||
@@ -1357,7 +1373,7 @@
|
||||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
|
||||
<location
|
||||
file="res/values/colors.xml"
|
||||
line="140"
|
||||
line="141"
|
||||
column="5"/>
|
||||
</issue>
|
||||
|
||||
@@ -1373,7 +1389,7 @@
|
||||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
|
||||
<location
|
||||
file="res/values/colors.xml"
|
||||
line="141"
|
||||
line="142"
|
||||
column="5"/>
|
||||
</issue>
|
||||
|
||||
@@ -1389,7 +1405,7 @@
|
||||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
|
||||
<location
|
||||
file="res/values/colors.xml"
|
||||
line="150"
|
||||
line="151"
|
||||
column="5"/>
|
||||
</issue>
|
||||
|
||||
@@ -1405,7 +1421,7 @@
|
||||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
|
||||
<location
|
||||
file="res/values/colors.xml"
|
||||
line="152"
|
||||
line="153"
|
||||
column="5"/>
|
||||
</issue>
|
||||
|
||||
@@ -1421,7 +1437,7 @@
|
||||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
|
||||
<location
|
||||
file="res/values/colors.xml"
|
||||
line="156"
|
||||
line="157"
|
||||
column="5"/>
|
||||
</issue>
|
||||
|
||||
@@ -1437,7 +1453,7 @@
|
||||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
|
||||
<location
|
||||
file="res/values/colors.xml"
|
||||
line="157"
|
||||
line="158"
|
||||
column="5"/>
|
||||
</issue>
|
||||
|
||||
@@ -1453,7 +1469,7 @@
|
||||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
|
||||
<location
|
||||
file="res/values/colors.xml"
|
||||
line="158"
|
||||
line="159"
|
||||
column="5"/>
|
||||
</issue>
|
||||
|
||||
@@ -1469,7 +1485,7 @@
|
||||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
|
||||
<location
|
||||
file="res/values/colors.xml"
|
||||
line="159"
|
||||
line="160"
|
||||
column="5"/>
|
||||
</issue>
|
||||
|
||||
@@ -1485,7 +1501,7 @@
|
||||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
|
||||
<location
|
||||
file="res/values/colors.xml"
|
||||
line="160"
|
||||
line="161"
|
||||
column="5"/>
|
||||
</issue>
|
||||
|
||||
@@ -1501,7 +1517,7 @@
|
||||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
|
||||
<location
|
||||
file="res/values/colors.xml"
|
||||
line="161"
|
||||
line="162"
|
||||
column="5"/>
|
||||
</issue>
|
||||
|
||||
@@ -1517,7 +1533,7 @@
|
||||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
|
||||
<location
|
||||
file="res/values/colors.xml"
|
||||
line="162"
|
||||
line="163"
|
||||
column="5"/>
|
||||
</issue>
|
||||
|
||||
@@ -1533,7 +1549,7 @@
|
||||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
|
||||
<location
|
||||
file="res/values/colors.xml"
|
||||
line="163"
|
||||
line="164"
|
||||
column="5"/>
|
||||
</issue>
|
||||
|
||||
@@ -1549,7 +1565,7 @@
|
||||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
|
||||
<location
|
||||
file="res/values/colors.xml"
|
||||
line="166"
|
||||
line="167"
|
||||
column="5"/>
|
||||
</issue>
|
||||
|
||||
@@ -1565,7 +1581,7 @@
|
||||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
|
||||
<location
|
||||
file="res/values/colors.xml"
|
||||
line="167"
|
||||
line="168"
|
||||
column="5"/>
|
||||
</issue>
|
||||
|
||||
@@ -1581,7 +1597,7 @@
|
||||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
|
||||
<location
|
||||
file="res/values/colors.xml"
|
||||
line="168"
|
||||
line="169"
|
||||
column="5"/>
|
||||
</issue>
|
||||
|
||||
@@ -1597,7 +1613,7 @@
|
||||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
|
||||
<location
|
||||
file="res/values/colors.xml"
|
||||
line="169"
|
||||
line="170"
|
||||
column="5"/>
|
||||
</issue>
|
||||
|
||||
@@ -1613,7 +1629,7 @@
|
||||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
|
||||
<location
|
||||
file="res/values/colors.xml"
|
||||
line="170"
|
||||
line="171"
|
||||
column="5"/>
|
||||
</issue>
|
||||
|
||||
@@ -1629,7 +1645,7 @@
|
||||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
|
||||
<location
|
||||
file="res/values/colors.xml"
|
||||
line="171"
|
||||
line="172"
|
||||
column="5"/>
|
||||
</issue>
|
||||
|
||||
@@ -1645,7 +1661,7 @@
|
||||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
|
||||
<location
|
||||
file="res/values/colors.xml"
|
||||
line="172"
|
||||
line="173"
|
||||
column="5"/>
|
||||
</issue>
|
||||
|
||||
@@ -1661,7 +1677,7 @@
|
||||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
|
||||
<location
|
||||
file="res/values/colors.xml"
|
||||
line="173"
|
||||
line="174"
|
||||
column="5"/>
|
||||
</issue>
|
||||
|
||||
@@ -1677,7 +1693,7 @@
|
||||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
|
||||
<location
|
||||
file="res/values/colors.xml"
|
||||
line="176"
|
||||
line="177"
|
||||
column="5"/>
|
||||
</issue>
|
||||
|
||||
@@ -1693,7 +1709,7 @@
|
||||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
|
||||
<location
|
||||
file="res/values/colors.xml"
|
||||
line="177"
|
||||
line="178"
|
||||
column="5"/>
|
||||
</issue>
|
||||
|
||||
@@ -1709,7 +1725,7 @@
|
||||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
|
||||
<location
|
||||
file="res/values/colors.xml"
|
||||
line="178"
|
||||
line="179"
|
||||
column="5"/>
|
||||
</issue>
|
||||
|
||||
@@ -1725,7 +1741,7 @@
|
||||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
|
||||
<location
|
||||
file="res/values/colors.xml"
|
||||
line="179"
|
||||
line="180"
|
||||
column="5"/>
|
||||
</issue>
|
||||
|
||||
@@ -1741,7 +1757,7 @@
|
||||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
|
||||
<location
|
||||
file="res/values/colors.xml"
|
||||
line="180"
|
||||
line="181"
|
||||
column="5"/>
|
||||
</issue>
|
||||
|
||||
@@ -1757,7 +1773,7 @@
|
||||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
|
||||
<location
|
||||
file="res/values/colors.xml"
|
||||
line="181"
|
||||
line="182"
|
||||
column="5"/>
|
||||
</issue>
|
||||
|
||||
@@ -1773,7 +1789,7 @@
|
||||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
|
||||
<location
|
||||
file="res/values/colors.xml"
|
||||
line="184"
|
||||
line="185"
|
||||
column="5"/>
|
||||
</issue>
|
||||
|
||||
@@ -1789,7 +1805,7 @@
|
||||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
|
||||
<location
|
||||
file="res/values/colors.xml"
|
||||
line="185"
|
||||
line="186"
|
||||
column="5"/>
|
||||
</issue>
|
||||
|
||||
@@ -1805,7 +1821,7 @@
|
||||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
|
||||
<location
|
||||
file="res/values/colors.xml"
|
||||
line="186"
|
||||
line="187"
|
||||
column="5"/>
|
||||
</issue>
|
||||
|
||||
@@ -1821,7 +1837,7 @@
|
||||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
|
||||
<location
|
||||
file="res/values/colors.xml"
|
||||
line="187"
|
||||
line="188"
|
||||
column="5"/>
|
||||
</issue>
|
||||
|
||||
@@ -1837,7 +1853,7 @@
|
||||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
|
||||
<location
|
||||
file="res/values/colors.xml"
|
||||
line="188"
|
||||
line="189"
|
||||
column="5"/>
|
||||
</issue>
|
||||
|
||||
@@ -1853,7 +1869,7 @@
|
||||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
|
||||
<location
|
||||
file="res/values/colors.xml"
|
||||
line="189"
|
||||
line="190"
|
||||
column="5"/>
|
||||
</issue>
|
||||
|
||||
@@ -2561,6 +2577,22 @@
|
||||
column="13"/>
|
||||
</issue>
|
||||
|
||||
<issue
|
||||
id="HardCodedColor"
|
||||
severity="Error"
|
||||
message="Avoid using hardcoded color"
|
||||
category="Correctness"
|
||||
priority="4"
|
||||
summary="Using hardcoded color"
|
||||
explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
|
||||
errorLine1=" android:color="@color/homepage_wallpaper_background" />"
|
||||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
|
||||
<location
|
||||
file="res/drawable/ic_homepage_wallpaper.xml"
|
||||
line="24"
|
||||
column="13"/>
|
||||
</issue>
|
||||
|
||||
<issue
|
||||
id="HardCodedColor"
|
||||
severity="Error"
|
||||
@@ -3181,7 +3213,7 @@
|
||||
errorLine2=" ~~~~~~~~~~~~~~~~~~~">
|
||||
<location
|
||||
file="res/values/strings.xml"
|
||||
line="6537"
|
||||
line="6533"
|
||||
column="36"/>
|
||||
</issue>
|
||||
|
||||
|
||||
33
res/drawable/ic_homepage_wallpaper.xml
Normal file
33
res/drawable/ic_homepage_wallpaper.xml
Normal file
@@ -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>
|
||||
25
res/drawable/ic_settings_wallpaper_white.xml
Normal file
25
res/drawable/ic_settings_wallpaper_white.xml
Normal file
@@ -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>
|
||||
@@ -222,6 +222,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. -->
|
||||
@@ -230,6 +234,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. -->
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -93,7 +93,7 @@
|
||||
settings:controller="com.android.settings.display.TopLevelDisplayPreferenceController"/>
|
||||
|
||||
<com.android.settingslib.RestrictedTopLevelPreference
|
||||
android:icon="@drawable/ic_homepage_display"
|
||||
android:icon="@drawable/ic_homepage_wallpaper"
|
||||
android:key="top_level_wallpaper"
|
||||
android:order="-60"
|
||||
android:title="@string/wallpaper_settings_title"
|
||||
|
||||
@@ -355,7 +355,7 @@ public class AllInOneTetherSettings extends RestrictedDashboardFragment
|
||||
@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) {
|
||||
|
||||
@@ -30,6 +30,7 @@ import android.widget.ImageView;
|
||||
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 @@ public class ToggleAutoclickCustomSeekbarController extends BasePreferenceContro
|
||||
|
||||
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 @@ public class ToggleAutoclickCustomSeekbarController extends BasePreferenceContro
|
||||
|
||||
// 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 @@ public class ToggleAutoclickCustomSeekbarController extends BasePreferenceContro
|
||||
private SeekBar mSeekBar;
|
||||
private TextView mDelayLabel;
|
||||
|
||||
private final SeekBar.OnSeekBarChangeListener mSeekBarChangeListener =
|
||||
@VisibleForTesting
|
||||
final SeekBar.OnSeekBarChangeListener mSeekBarChangeListener =
|
||||
new SeekBar.OnSeekBarChangeListener() {
|
||||
|
||||
@Override
|
||||
|
||||
@@ -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 @@ public abstract class DefaultAppShortcutPreferenceControllerBase extends BasePre
|
||||
|
||||
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();
|
||||
|
||||
@@ -44,7 +44,7 @@ public class EmergencyDashboardFragment extends DashboardFragment {
|
||||
|
||||
@Override
|
||||
public int getMetricsCategory() {
|
||||
return SettingsEnums.EMERGENCY_SOS_GESTURE_SETTINGS;
|
||||
return SettingsEnums.EMERGENCY_SETTINGS;
|
||||
}
|
||||
|
||||
public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
|
||||
|
||||
@@ -143,7 +143,7 @@ public class FaceSetupSlice implements CustomSliceable {
|
||||
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,
|
||||
PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_MUTABLE_UNAUDITED), icon, ListBuilder.ICON_IMAGE,
|
||||
title);
|
||||
return new RowBuilder()
|
||||
.setTitleItem(icon, ListBuilder.ICON_IMAGE)
|
||||
|
||||
@@ -25,7 +25,7 @@ import android.text.TextUtils;
|
||||
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 @@ import com.android.settingslib.media.MediaOutputSliceConstants;
|
||||
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())
|
||||
|
||||
@@ -36,7 +36,7 @@ import com.android.settings.R;
|
||||
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 @@ public class MediaOutputIndicatorSlice implements CustomSliceable {
|
||||
}
|
||||
// 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));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -48,7 +48,7 @@ import com.android.settings.slices.CustomSliceable;
|
||||
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 @@ public class RemoteMediaSlice implements CustomSliceable {
|
||||
// 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));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -99,7 +99,7 @@ public abstract class EuiccOperationSidecar extends SidecarFragment {
|
||||
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_MUTABLE_UNAUDITED);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -173,7 +173,7 @@ public class MobileDataSlice implements CustomSliceable {
|
||||
private PendingIntent getPrimaryAction() {
|
||||
final Intent intent = getIntent();
|
||||
return PendingIntent.getActivity(mContext, 0 /* requestCode */,
|
||||
intent, 0 /* flags */);
|
||||
intent, PendingIntent.FLAG_MUTABLE_UNAUDITED /* flags */);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -34,7 +34,7 @@ import com.android.settingslib.core.lifecycle.LifecycleObserver;
|
||||
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 @@ public class RemoteVolumeGroupController extends BasePreferenceController implem
|
||||
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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -38,7 +38,7 @@ import androidx.lifecycle.LifecycleObserver;
|
||||
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 @@ public class VolumePanel implements PanelContent, LifecycleObserver {
|
||||
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 @@ public class VolumePanel implements PanelContent, LifecycleObserver {
|
||||
@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);
|
||||
}
|
||||
|
||||
|
||||
@@ -226,7 +226,7 @@ public class SimSelectNotification extends BroadcastReceiver {
|
||||
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_MUTABLE_UNAUDITED);
|
||||
builder.setContentIntent(resultPendingIntent);
|
||||
NotificationManager notificationManager =
|
||||
(NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
|
||||
@@ -264,7 +264,7 @@ public class SimSelectNotification extends BroadcastReceiver {
|
||||
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_MUTABLE_UNAUDITED);
|
||||
builder.setContentIntent(resultPendingIntent);
|
||||
|
||||
// Notify the notification.
|
||||
@@ -312,7 +312,7 @@ public class SimSelectNotification extends BroadcastReceiver {
|
||||
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_MUTABLE_UNAUDITED);
|
||||
builder.setContentIntent(resultPendingIntent);
|
||||
|
||||
NotificationManager notificationManager =
|
||||
|
||||
@@ -46,7 +46,7 @@ import com.android.settings.notification.zen.ZenModeButtonPreferenceController;
|
||||
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 @@ public class CustomSliceRegistry {
|
||||
.scheme(ContentResolver.SCHEME_CONTENT)
|
||||
.authority(SettingsSliceProvider.SLICE_AUTHORITY)
|
||||
.appendPath(SettingsSlicesContract.PATH_SETTING_ACTION)
|
||||
.appendPath(MediaOutputSliceConstants.KEY_REMOTE_MEDIA)
|
||||
.appendPath(MediaOutputConstants.KEY_REMOTE_MEDIA)
|
||||
.build();
|
||||
|
||||
/**
|
||||
|
||||
@@ -32,7 +32,7 @@ import com.android.settings.media.MediaOutputUtils;
|
||||
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 class MediaOutputPreferenceController extends AudioSwitchPreferenceContro
|
||||
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;
|
||||
}
|
||||
|
||||
@@ -56,12 +56,12 @@ public class WifiUtils {
|
||||
}
|
||||
|
||||
/**
|
||||
* 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;
|
||||
}
|
||||
|
||||
@@ -539,7 +539,7 @@ public class WifiCallingSliceHelper {
|
||||
*/
|
||||
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_MUTABLE_UNAUDITED /* flags */);
|
||||
}
|
||||
|
||||
private PendingIntent getBroadcastIntent(String action) {
|
||||
@@ -547,7 +547,7 @@ public class WifiCallingSliceHelper {
|
||||
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_MUTABLE_UNAUDITED);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -557,7 +557,7 @@ public class WifiCallingSliceHelper {
|
||||
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_MUTABLE_UNAUDITED /* flags */);
|
||||
}
|
||||
|
||||
private Resources getResourcesForSubId(int subId) {
|
||||
|
||||
@@ -301,7 +301,11 @@ public class WifiDppUtils {
|
||||
|
||||
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 @@ public class WifiDppUtils {
|
||||
|
||||
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) {
|
||||
|
||||
@@ -37,12 +37,16 @@ import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
|
||||
|
||||
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 @@ public class WifiTetherPasswordPreferenceController extends WifiTetherBasePrefer
|
||||
@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 @@ public class WifiTetherPasswordPreferenceController extends WifiTetherBasePrefer
|
||||
// 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() {
|
||||
|
||||
@@ -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 @@ public class WifiTetherSecurityPreferenceController extends WifiTetherBasePrefer
|
||||
|
||||
@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];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -192,7 +192,7 @@ public class WifiTetherSettings extends RestrictedDashboardFragment
|
||||
@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 @@ public class WifiTetherSettings extends RestrictedDashboardFragment
|
||||
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();
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -25,6 +25,7 @@ import static org.mockito.Mockito.when;
|
||||
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 @@ public class DefaultAppShortcutPreferenceControllerBaseTest {
|
||||
@Mock
|
||||
private RoleManager mRoleManager;
|
||||
@Mock
|
||||
private RoleControllerManager mRoleControllerManager;
|
||||
@Mock
|
||||
private Preference mPreference;
|
||||
|
||||
private Activity mActivity;
|
||||
@@ -74,6 +77,7 @@ public class DefaultAppShortcutPreferenceControllerBaseTest {
|
||||
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 @@ public class DefaultAppShortcutPreferenceControllerBaseTest {
|
||||
|
||||
@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 @@ public class DefaultAppShortcutPreferenceControllerBaseTest {
|
||||
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 @@ public class DefaultAppShortcutPreferenceControllerBaseTest {
|
||||
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);
|
||||
|
||||
@@ -18,7 +18,7 @@ package com.android.settings.applications.appinfo;
|
||||
|
||||
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 @@ import org.robolectric.shadows.ShadowApplication;
|
||||
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");
|
||||
}
|
||||
|
||||
@@ -18,7 +18,7 @@ package com.android.settings.applications.appinfo;
|
||||
|
||||
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 @@ import org.robolectric.shadows.ShadowApplication;
|
||||
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");
|
||||
}
|
||||
|
||||
@@ -18,7 +18,7 @@ package com.android.settings.applications.appinfo;
|
||||
|
||||
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 @@ import org.robolectric.shadows.ShadowApplication;
|
||||
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");
|
||||
}
|
||||
|
||||
@@ -18,7 +18,7 @@ package com.android.settings.applications.appinfo;
|
||||
|
||||
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 @@ public class DefaultPhoneShortcutPreferenceControllerTest {
|
||||
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);
|
||||
}
|
||||
|
||||
@@ -18,6 +18,7 @@ package com.android.settings.applications.appinfo;
|
||||
|
||||
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 @@ public class DefaultSmsShortcutPreferenceControllerTest {
|
||||
|
||||
@Mock
|
||||
private RoleManager mRoleManager;
|
||||
@Mock
|
||||
private RoleControllerManager mRoleControllerManager;
|
||||
|
||||
private DefaultSmsShortcutPreferenceController mController;
|
||||
|
||||
@@ -46,6 +49,7 @@ public class DefaultSmsShortcutPreferenceControllerTest {
|
||||
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);
|
||||
}
|
||||
|
||||
@@ -51,7 +51,7 @@ import com.android.settings.slices.SliceBackgroundWorker;
|
||||
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 @@ public class MediaOutputIndicatorSliceTest {
|
||||
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 @@ public class MediaOutputIndicatorSliceTest {
|
||||
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
|
||||
|
||||
@@ -58,7 +58,7 @@ import com.android.settingslib.bluetooth.BluetoothEventManager;
|
||||
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 @@ public class MediaOutputPreferenceControllerTest {
|
||||
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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -397,14 +397,14 @@ public class WifiCallingSliceHelperTest {
|
||||
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_MUTABLE_UNAUDITED);
|
||||
}
|
||||
|
||||
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_MUTABLE_UNAUDITED /* flags */);
|
||||
}
|
||||
|
||||
private void assertTitle(List<SliceItem> sliceItems, String title) {
|
||||
|
||||
@@ -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");
|
||||
}
|
||||
}
|
||||
@@ -21,6 +21,7 @@ import static com.google.common.truth.Truth.assertThat;
|
||||
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 class WifiUtilsTest {
|
||||
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
|
||||
|
||||
@@ -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");
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user