Merge "[Network Connection] Don't dismiss dialog when touching outside of dialog"
diff --git a/Android.mk b/Android.mk
index 283575d..e385b34 100644
--- a/Android.mk
+++ b/Android.mk
@@ -49,7 +49,6 @@
settings-contextual-card-protos-lite \
contextualcards \
settings-logtags \
- statsdprotolite \
zxing-core-1.7
LOCAL_PROGUARD_FLAG_FILES := proguard.flags
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 5b78681..92a1066 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -340,7 +340,7 @@
android:clearTaskOnLaunch="true"
android:excludeFromRecents="true"
android:exported="true"
- android:permission="android.permission.CONNECTIVITY_INTERNAL"
+ android:permission="android.permission.NETWORK_STACK"
android:theme="@*android:style/Theme.DeviceDefault.Light.Dialog.Alert">
<intent-filter>
<action android:name="android.net.conn.PROMPT_UNVALIDATED" />
@@ -1648,7 +1648,7 @@
<action android:name="android.intent.action.MAIN" />
<category android:name="com.android.settings.suggested.category.FIRST_IMPRESSION" />
</intent-filter>
- <meta-data android:name="com.android.settings.dismiss" android:value="2," />
+ <meta-data android:name="com.android.settings.dismiss" android:value="14" />
<meta-data android:name="com.android.settings.require_feature"
android:value="android.hardware.fingerprint" />
<meta-data android:name="com.android.settings.title"
@@ -2622,6 +2622,8 @@
android:name=".wifi.NetworkRequestDialogActivity"
android:theme="@style/Transparent"
android:excludeFromRecents="true"
+ android:launchMode="singleTop"
+ android:taskAffinity=".wifi.NetworkRequestDialogActivity"
android:exported="true"
android:permission="android.permission.NETWORK_SETTINGS">
<intent-filter>
@@ -2971,6 +2973,17 @@
</intent-filter>
</service>
+ <service
+ android:name=".development.qstile.DevelopmentTiles$SensorsOff"
+ android:label="@string/sensors_off_quick_settings_title"
+ android:icon="@drawable/tile_icon_sensors_off"
+ android:permission="android.permission.BIND_QUICK_SETTINGS_TILE"
+ android:enabled="false">
+ <intent-filter>
+ <action android:name="android.service.quicksettings.action.QS_TILE" />
+ </intent-filter>
+ </service>
+
<activity
android:name=".HelpTrampoline"
android:exported="true"
diff --git a/color-check-baseline.xml b/color-check-baseline.xml
index 7074481..7ab18a4 100644
--- a/color-check-baseline.xml
+++ b/color-check-baseline.xml
@@ -965,7 +965,7 @@
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_about_background">#9FA8DA</color>"
+ errorLine1=" <color name="homepage_about_background">#6F86DA</color>"
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
@@ -1317,6 +1317,230 @@
priority="4"
summary="Using hardcoded color"
explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="bt_color_icon_1">#48a50e0e</color> <!-- 72% Material Red 900 -->"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="res/values/colors.xml"
+ line="144"
+ 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="bt_color_icon_2">#480d652d</color> <!-- 72% Material Green 900 -->"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="res/values/colors.xml"
+ line="145"
+ 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="bt_color_icon_3">#48e37400</color> <!-- 72% Material Yellow 900 -->"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="res/values/colors.xml"
+ line="146"
+ 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="bt_color_icon_4">#48b06000</color> <!-- 72% Material Orange 900 -->"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="res/values/colors.xml"
+ line="147"
+ 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="bt_color_icon_5">#489c166b</color> <!-- 72% Material Pink 900 -->"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="res/values/colors.xml"
+ line="148"
+ 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="bt_color_icon_6">#48681da8</color> <!-- 72% Material Purple 900 -->"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="res/values/colors.xml"
+ line="149"
+ 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="bt_color_icon_7">#48007b83</color> <!-- 72% Material Cyan 900 -->"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="res/values/colors.xml"
+ line="150"
+ 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="bt_color_bg_1">#fad2cf</color> <!-- Material Red 100 -->"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="res/values/colors.xml"
+ line="152"
+ 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="bt_color_bg_2">#ceead6</color> <!-- Material Green 100 -->"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="res/values/colors.xml"
+ line="153"
+ 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="bt_color_bg_3">#feefc3</color> <!-- Material Yellow 100 -->"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="res/values/colors.xml"
+ line="154"
+ 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="bt_color_bg_4">#fedfc8</color> <!-- Material Orange 100 -->"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="res/values/colors.xml"
+ line="155"
+ 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="bt_color_bg_5">#fdcfe8</color> <!-- Material Pink 100 -->"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="res/values/colors.xml"
+ line="156"
+ 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="bt_color_bg_6">#e9d2fd</color> <!-- Material Purple 100 -->"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="res/values/colors.xml"
+ line="157"
+ 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="bt_color_bg_7">#cbf0f8</color> <!-- Material Cyan 100 -->"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="res/values/colors.xml"
+ line="158"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
errorLine1=" android:background="@color/lock_pattern_background" />"
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
@@ -2537,7 +2761,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/strings.xml"
- line="6026"
+ line="6020"
column="36"/>
</issue>
diff --git a/res/drawable/face_enroll_introduction.xml b/res/drawable/face_enroll_introduction.xml
index 4493d66..6065f23 100644
--- a/res/drawable/face_enroll_introduction.xml
+++ b/res/drawable/face_enroll_introduction.xml
@@ -1,3 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
<!--
~ Copyright (C) 2018 The Android Open Source Project
~
@@ -15,9 +16,29 @@
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:height="24dp"
- android:width="24dp"
- android:viewportWidth="24"
- android:viewportHeight="24">
- <path android:fillColor="#000" android:pathData="M9,11.75A1.25,1.25 0 0,0 7.75,13A1.25,1.25 0 0,0 9,14.25A1.25,1.25 0 0,0 10.25,13A1.25,1.25 0 0,0 9,11.75M15,11.75A1.25,1.25 0 0,0 13.75,13A1.25,1.25 0 0,0 15,14.25A1.25,1.25 0 0,0 16.25,13A1.25,1.25 0 0,0 15,11.75M12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12A10,10 0 0,0 12,2M12,20C7.59,20 4,16.41 4,12C4,11.71 4,11.42 4.05,11.14C6.41,10.09 8.28,8.16 9.26,5.77C11.07,8.33 14.05,10 17.42,10C18.2,10 18.95,9.91 19.67,9.74C19.88,10.45 20,11.21 20,12C20,16.41 16.41,20 12,20Z" />
+ android:width="240dp"
+ android:height="240dp"
+ android:viewportWidth="300"
+ android:viewportHeight="300">
+
+ <path
+ android:fillColor="#DADCE0"
+ android:fillType="evenOdd"
+ android:pathData="M150,0C67.16,0,0,67.16,0,150s67.16,150,150,150 s150-67.16,150-150S232.84,0,150,0 M150,4c39,0,75.66,15.19,103.24,42.76C280.81,74.34,296,111,296,150s-15.19,75.66-42.76,103.24 C225.66,280.81,189,296,150,296s-75.66-15.19-103.24-42.76C19.19,225.66,4,189,4,150S19.19,74.34,46.76,46.76 C74.34,19.19,111,4,150,4" />
+ <path
+ android:fillColor="?android:attr/colorAccent"
+ android:fillType="evenOdd"
+ android:pathData="M220,120c0,5.52-4.48,10-10,10s-10-4.48-10-10 s4.48-10,10-10S220,114.48,220,120" />
+ <path
+ android:fillColor="?android:attr/colorAccent"
+ android:fillType="evenOdd"
+ android:pathData="M90,130c-5.52,0-10-4.48-10-10s4.48-10,10-10 s10,4.48,10,10S95.52,130,90,130" />
+ <path
+ android:fillColor="?android:attr/colorAccent"
+ android:fillType="evenOdd"
+ android:pathData="M164.2,215.88c-3.83,3.25-8.79,5.22-14.2,5.22 c-12.13,0-22-9.87-22-22c0-0.03,0-0.06,0-0.09l-8-0.03c0,0.04,0,0.08,0,0.13c0,6.24,1.9,12.03,5.16,16.83 c5.4,7.95,14.51,13.17,24.84,13.17c1.04,0,2.06-0.05,3.08-0.15c6.18-0.63,11.81-3.14,16.3-6.95L164.2,215.88z" />
+ <path
+ android:fillColor="?android:attr/colorAccent"
+ android:fillType="evenOdd"
+ android:pathData="M 153 140 L 153 166 L 137 166 L 137 174 L 161 174 L 161 140 Z" />
</vector>
\ No newline at end of file
diff --git a/res/drawable/ic_face_enroll_introduction_detail.xml b/res/drawable/ic_face_enroll_introduction_detail.xml
new file mode 100644
index 0000000..7159148
--- /dev/null
+++ b/res/drawable/ic_face_enroll_introduction_detail.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2019 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="24dp"
+ android:height="24dp"
+ android:tint="?android:attr/colorControlNormal"
+ android:viewportWidth="24"
+ android:viewportHeight="24">
+
+ <path
+ android:pathData="M0 0h24v24H0V0z" />
+ <path
+ android:fillColor="#000000"
+ android:pathData="M11 15h2v2h-2zm0-8h2v6h-2zm0.99-5C6.47 2 2 6.48 2 12s4.47 10 9.99 10C17.52 22 22 17.52 22 12S17.52 2 11.99 2zM12 20c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8z" />
+</vector>
\ No newline at end of file
diff --git a/res/drawable/tile_icon_sensors_off.xml b/res/drawable/tile_icon_sensors_off.xml
new file mode 100644
index 0000000..890fa83
--- /dev/null
+++ b/res/drawable/tile_icon_sensors_off.xml
@@ -0,0 +1,39 @@
+<!--
+ Copyright (C) 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ <path
+ android:pathData="M21.966,2 L2,22"
+ android:strokeLineCap="round"
+ android:strokeColor="#000000"
+ android:fillColor="#00000000"
+ android:strokeWidth="1.6521436"
+ android:strokeLineJoin="miter"
+ android:strokeAlpha="1"/>
+ <path
+ android:pathData="M0.752,12L4.496,12l2.496,-6.25 2.496,12.5 2.496,-15 2.496,12.5 2.496,-7.5 1.248,3.75h4.992"
+ android:strokeLineCap="round"
+ android:strokeColor="#000000"
+ android:fillColor="#00000000"
+ android:strokeWidth="1.25090861"
+ android:strokeLineJoin="round"
+ android:strokeAlpha="1"/>
+</vector>
+
diff --git a/res/layout/face_enroll_introduction.xml b/res/layout/face_enroll_introduction.xml
index b5f13db..b55041a 100644
--- a/res/layout/face_enroll_introduction.xml
+++ b/res/layout/face_enroll_introduction.xml
@@ -27,7 +27,7 @@
<LinearLayout
style="@style/SudContentFrame"
android:layout_width="match_parent"
- android:layout_height="wrap_content"
+ android:layout_height="match_parent"
android:clipChildren="false"
android:clipToPadding="false"
android:orientation="vertical">
@@ -45,50 +45,87 @@
android:layout_width="match_parent"
android:layout_height="wrap_content" />
- <com.google.android.setupdesign.view.FillContentLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_weight="1">
-
- <com.google.android.setupdesign.view.IllustrationVideoView
- xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:app="http://schemas.android.com/apk/res-auto"
- android:id="@+id/face_enroll_introduction_animation"
- style="@style/SudContentIllustration"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- app:sudVideo="@raw/face_enroll_introduction_animation" />
-
- </com.google.android.setupdesign.view.FillContentLayout>
+ <Space
+ android:layout_width="0dp"
+ android:layout_height="0dp"
+ android:layout_weight="1"/>
<FrameLayout
android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_gravity="center">
- <Button
- android:id="@+id/accessibility_button"
- style="@style/SudGlifButton.Secondary"
- android:layout_gravity="center"
+ android:layout_height="wrap_content">
+
+ <com.google.android.setupdesign.view.IllustrationVideoView
+ android:id="@+id/illustration_normal"
+ style="@style/SudContentIllustration"
+ android:layout_width="240dp"
+ android:layout_height="240dp"
+ app:sudVideo="@raw/face_enroll_introduction_animation" />
+
+ <ImageView
+ android:id="@+id/illustration_accessibility"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:text="@string/security_settings_face_enroll_introduction_accessibility" />
-
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
android:layout_gravity="center"
- android:id="@+id/accessibility_layout"
- android:orientation="vertical"
- android:visibility="invisible">
+ android:visibility="invisible"
+ android:background="@drawable/face_enroll_introduction" />
+
+ </FrameLayout>
+
+ <Space
+ android:layout_width="0dp"
+ android:layout_height="0dp"
+ android:layout_weight="2"/>
+
+ <!-- Contains the buttons and extra information text at the bottom -->
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="vertical"
+ android:layout_gravity="center_horizontal|bottom">
+
+ <FrameLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content">
+ <Button
+ android:id="@+id/accessibility_button"
+ style="@style/SudGlifButton.Secondary"
+ android:layout_gravity="center"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/security_settings_face_enroll_introduction_accessibility" />
<com.android.settings.biometrics.face.FaceEnrollAccessibilityToggle
android:id="@+id/toggle_diversity"
android:layout_width="match_parent"
android:layout_height="wrap_content"
+ android:visibility="invisible"
FaceEnrollAccessibilitySwitch:messageText="@string/security_settings_face_enroll_introduction_accessibility_diversity"/>
+ </FrameLayout>
+
+ <LinearLayout
+ android:id="@+id/footer_layout"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal"
+ android:paddingStart="16dp"
+ android:paddingEnd="16dp">
+
+ <ImageView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:background="@drawable/ic_face_enroll_introduction_detail">
+ </ImageView>
+ <Space
+ android:layout_width="8dp"
+ android:layout_height="wrap_content" />
+ <TextView
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/security_settings_face_enroll_introduction_footer_message"/>
</LinearLayout>
- </FrameLayout>
+
+ </LinearLayout>
</LinearLayout>
diff --git a/res/layout/homepage_slice_tile.xml b/res/layout/homepage_slice_tile.xml
index b2badf5..ca8791f 100644
--- a/res/layout/homepage_slice_tile.xml
+++ b/res/layout/homepage_slice_tile.xml
@@ -31,7 +31,6 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
- android:animateLayoutChanges="true"
android:importantForAccessibility="no"
style="@style/SliceViewStyle"/>
diff --git a/res/layout/preference.xml b/res/layout/preference.xml
index 195671b..db96139 100644
--- a/res/layout/preference.xml
+++ b/res/layout/preference.xml
@@ -54,6 +54,10 @@
</RelativeLayout>
+ <include
+ layout="@layout/preference_two_target_divider"
+ android:visibility="gone"/>
+
<LinearLayout
android:id="@android:id/widget_frame"
android:layout_width="wrap_content"
diff --git a/res/layout/settings_homepage.xml b/res/layout/settings_homepage.xml
index e04b372..6e2b302 100644
--- a/res/layout/settings_homepage.xml
+++ b/res/layout/settings_homepage.xml
@@ -21,7 +21,7 @@
android:layout_height="wrap_content"
android:orientation="vertical">
- <androidx.recyclerview.widget.RecyclerView
+ <com.android.settings.homepage.contextualcards.FocusRecyclerView
android:id="@+id/card_container"
android:layout_width="match_parent"
android:layout_height="match_parent"
diff --git a/res/layout/slice_preference_layout.xml b/res/layout/slice_preference_layout.xml
index ae58901..4cea9c0 100644
--- a/res/layout/slice_preference_layout.xml
+++ b/res/layout/slice_preference_layout.xml
@@ -25,5 +25,5 @@
<androidx.slice.widget.SliceView
android:id="@+id/slice_view"
android:layout_width="match_parent"
- android:layout_height="@dimen/slice_preference_group_height"/>
+ android:layout_height="wrap_content"/>
</FrameLayout>
diff --git a/res/values/arrays.xml b/res/values/arrays.xml
index 7e0ba10..521d709 100644
--- a/res/values/arrays.xml
+++ b/res/values/arrays.xml
@@ -1378,4 +1378,25 @@
<item>@string/wifi_calling_mode_cellular_preferred_summary</item>
</string-array>
+ <!-- Bluetooth icon foreground colors -->
+ <integer-array name="bt_icon_fg_colors">
+ <item>@color/bt_color_icon_1</item>
+ <item>@color/bt_color_icon_2</item>
+ <item>@color/bt_color_icon_3</item>
+ <item>@color/bt_color_icon_4</item>
+ <item>@color/bt_color_icon_5</item>
+ <item>@color/bt_color_icon_6</item>
+ <item>@color/bt_color_icon_7</item>
+ </integer-array>
+
+ <!-- Bluetooth icon background colors -->
+ <integer-array name="bt_icon_bg_colors">
+ <item>@color/bt_color_bg_1</item>
+ <item>@color/bt_color_bg_2</item>
+ <item>@color/bt_color_bg_3</item>
+ <item>@color/bt_color_bg_4</item>
+ <item>@color/bt_color_bg_5</item>
+ <item>@color/bt_color_bg_6</item>
+ <item>@color/bt_color_bg_7</item>
+ </integer-array>
</resources>
diff --git a/res/values/colors.xml b/res/values/colors.xml
index 0afd288..59ed4c4 100644
--- a/res/values/colors.xml
+++ b/res/values/colors.xml
@@ -96,7 +96,7 @@
<color name="homepage_support_background">#26459C</color>
<color name="homepage_generic_icon_background">#1A73E8</color>
<color name="homepage_location_background">#2EC7DC</color>
- <color name="homepage_about_background">#9FA8DA</color>
+ <color name="homepage_about_background">#6F86DA</color>
<color name="homepage_privacy_background">#5E97F6</color>
<color name="homepage_card_stroke_color">#1f000000</color>
@@ -140,4 +140,20 @@
<color name="qr_focused_corner_line_color">#ff1a73e8</color>
<color name="qr_background_color">#b3ffffff</color> <!-- 70% white transparency -->
<!-- End of QR code scanner colors -->
+
+ <color name="bt_color_icon_1">#48a50e0e</color> <!-- 72% Material Red 900 -->
+ <color name="bt_color_icon_2">#480d652d</color> <!-- 72% Material Green 900 -->
+ <color name="bt_color_icon_3">#48e37400</color> <!-- 72% Material Yellow 900 -->
+ <color name="bt_color_icon_4">#48b06000</color> <!-- 72% Material Orange 900 -->
+ <color name="bt_color_icon_5">#489c166b</color> <!-- 72% Material Pink 900 -->
+ <color name="bt_color_icon_6">#48681da8</color> <!-- 72% Material Purple 900 -->
+ <color name="bt_color_icon_7">#48007b83</color> <!-- 72% Material Cyan 900 -->
+
+ <color name="bt_color_bg_1">#fad2cf</color> <!-- Material Red 100 -->
+ <color name="bt_color_bg_2">#ceead6</color> <!-- Material Green 100 -->
+ <color name="bt_color_bg_3">#feefc3</color> <!-- Material Yellow 100 -->
+ <color name="bt_color_bg_4">#fedfc8</color> <!-- Material Orange 100 -->
+ <color name="bt_color_bg_5">#fdcfe8</color> <!-- Material Pink 100 -->
+ <color name="bt_color_bg_6">#e9d2fd</color> <!-- Material Purple 100 -->
+ <color name="bt_color_bg_7">#cbf0f8</color> <!-- Material Cyan 100 -->
</resources>
\ No newline at end of file
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index ef6fc4f..248fb81 100755
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -404,7 +404,4 @@
<!-- Wi-Fi DPP fragment icon size -->
<dimen name="wifi_dpp_fragment_icon_width_height">48dp</dimen>
-
- <!-- Height for slice preference, which contains 6 items at most -->
- <dimen name="slice_preference_group_height">360dp</dimen>
</resources>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 631d912..194b6c5 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -898,8 +898,10 @@
<string name="security_settings_face_enroll_introduction_message">Use your face to unlock your phone, authorize purchases, or sign in to apps.</string>
<!-- Introduction detail message shown in face enrollment dialog, when face unlock is disabled by device admin [CHAR LIMIT=NONE] -->
<string name="security_settings_face_enroll_introduction_message_unlock_disabled">Use your face to unlock your phone or approve purchases.\n\nNote: You can\u2019t use your face to unlock this device. For more information, contact your organization\u2019s admin.</string>
- <!-- Introduction detail message shwon in face enrollment screen in setup wizard. [CHAR LIMIT=NONE] -->
+ <!-- Introduction detail message shown in face enrollment screen in setup wizard. [CHAR LIMIT=NONE] -->
<string name="security_settings_face_enroll_introduction_message_setup">Use your face to unlock your phone, authorize purchases, or sign in to apps</string>
+ <!-- Introduction detail message shown in face enrollment that provides extra detais. [CHAR LIMIT=NONE] -->
+ <string name="security_settings_face_enroll_introduction_footer_message"></string>
<!-- Title shown in face enrollment dialog [CHAR LIMIT=40] -->
<string name="security_settings_face_enroll_repeat_title">Center your face in the circle</string>
<!-- Button text to skip enrollment of face [CHAR LIMIT=40] -->
@@ -941,6 +943,11 @@
<!-- Text shown in face settings explaining what your face can be used for. [CHAR LIMIT=NONE] -->
<string name="security_settings_face_settings_footer">Your face can be used to unlock your device and access apps.
<annotation id="url">Learn more</annotation></string>
+ <!-- Dialog title shown when the user removes an enrollment [CHAR LIMIT=35] -->
+ <string name="security_settings_face_settings_remove_dialog_title">Delete face data?</string>
+ <!-- Dialog contents shown when the user removes an enrollment [CHAR LIMIT=NONE] -->
+ <string name="security_settings_face_settings_remove_dialog_details">Data recorded by face unlock will be permanently and securely deleted. After removal, you will need your PIN, pattern, or password to unlock your phone, sign in to apps, and confirm payments.</string>
+
<!-- Fingerprint enrollment and settings --><skip />
<!-- Title shown for menu item that launches fingerprint settings or enrollment [CHAR LIMIT=22] -->
@@ -2213,6 +2220,8 @@
<!-- Dialog text to tell the user that the selected network does not have Internet access. -->
<string name="no_internet_access_text">This network has no internet access. Stay connected?</string>
+ <!-- Dialog text to tell the user that the selected network has incomplete Internet access. [CHAR LIMIT=100] -->
+ <string name="partial_connectivity_text">Some apps and services may not work due to limited connectivity. Use anyway?</string>
<string name="no_internet_access_remember">Don\u2019t ask again for this network</string>
<!-- Dialog text to tell the user that the selected network has lost Internet access, and asking the user whether they want to avoid this network. -->
@@ -2235,6 +2244,8 @@
<string name="wifi_disconnect">@string/bluetooth_device_context_disconnect</string>
<!-- Failured notification for connect -->
<string name="wifi_failed_connect_message">Failed to connect to network</string>
+ <!-- Not in range notification for connect [CHAR LIMIT=40] -->
+ <string name="wifi_not_in_range_message">Network not in range</string>
<!-- Button label to delete a Wi-Fi network -->
<string name="wifi_forget">Forget</string>
<!-- Button label to modify a Wi-Fi network -->
@@ -2986,6 +2997,8 @@
<string name="device_status_summary" product="default">Phone number, signal, etc.</string>
<!-- Main settings screen item's title to go into the storage settings screen [CHAR LIMIT=25] -->
<string name="storage_settings" >Storage</string>
+ <!-- Settings title that shows user how much storage and cache space an App is taking [CHAR LIMIT=50] -->
+ <string name="storage_settings_for_app" >Storage & cache</string>
<!-- Main settings screen item's title to go into the storage & USB settings screen [CHAR LIMIT=25] -->
<string name="storage_usb_settings" >Storage</string>
<!-- Storage settings screen title -->
@@ -4183,6 +4196,8 @@
<string name="uninstall_all_users_text">Uninstall for all users</string>
<!-- [CHAR LIMIT=NONE] Manage applications, individual application info screen, button label under Storage heading. Button to install an application for the user. -->
<string name="install_text">Install</string>
+ <!-- [CHAR LIMIT=25] Manage applications, individual application info screen, button label under Storage heading. Button to disable an existing application. -->
+ <string name="disable_text">Disable</string>
<!-- [CHAR LIMIT=25] Manage applications, individual application info screen, button label under Storage heading. Button to re-enable an existing application. -->
<string name="enable_text">Enable</string>
<!-- Manage applications, individual application info screen, button label under Storage heading. Button to clear all data associated with tis app (for example, remove all cached emails for an Email app) -->
@@ -4321,9 +4336,9 @@
<!-- Manage applications. application installation location summary -->
<string name="app_install_location_summary">Change the preferred installation location for new apps</string>
<!-- [CHAR LIMIT=30] Manage applications, label for option to disable app -->
- <string name="app_disable_dlg_positive">Uninstall app</string>
- <!-- [CHAR LIMIT=200] Manage applications, text for dialog when disabling apps -->
- <string name="app_disable_dlg_text">If you uninstall this app, Android and other apps may no longer function as intended.</string>
+ <string name="app_disable_dlg_positive">Disable app</string>
+ <!-- [CHAR LIMIT=NONE] Manage applications, text for dialog when disabling apps -->
+ <string name="app_disable_dlg_text">If you disable this app, Android and other apps may no longer function as intended. Keep in mind, you can\u2019t delete this app since it came pre-installed on your device. By disabling, you turn this app off and hide it on your device.</string>
<!-- [CHAR LIMIT=30] Manage applications, title for dialog when disabling notifications for an app -->
<string name="app_disable_notifications_dlg_title">Turn off notifications?</string>
<!-- Manage applications, individual application info screen, section heading for information about the app installer [CHAR_LIMIT=25] -->
@@ -5253,11 +5268,13 @@
<!-- Summary for the battery high usage tip, which presents battery may run out earlier [CHAR LIMIT=NONE] -->
<string name="battery_tip_high_usage_summary">Battery may run out earlier than usual</string>
<!-- Message for battery tip dialog to show the status about the battery [CHAR LIMIT=NONE] -->
- <string name="battery_tip_dialog_message" product="default">Your phone has been used more than usual. Your battery may run out sooner than expected.\n\nTop <xliff:g id="number">%1$d</xliff:g> apps you used since full charge:</string>
+ <string name="battery_tip_dialog_message" product="default">Your phone has been used more than usual. Your battery may run out sooner than expected.\n\nMost used apps since full charge:</string>
<!-- Message for battery tip dialog to show the status about the battery [CHAR LIMIT=NONE] -->
- <string name="battery_tip_dialog_message" product="tablet">Your tablet has been used more than usual. Your battery may run out sooner than expected.\n\nTop <xliff:g id="number">%1$d</xliff:g> apps you used since full charge:</string>
+ <string name="battery_tip_dialog_message" product="tablet">Your tablet has been used more than usual. Your battery may run out sooner than expected.\n\nMost used apps since full charge:</string>
<!-- Message for battery tip dialog to show the status about the battery [CHAR LIMIT=NONE] -->
- <string name="battery_tip_dialog_message" product="device">Your device has been used more than usual. Your battery may run out sooner than expected.\n\nTop <xliff:g id="number">%1$d</xliff:g> apps you used since full charge:</string>
+ <string name="battery_tip_dialog_message" product="device">Your device has been used more than usual. Your battery may run out sooner than expected.\n\nMost used apps since full charge:</string>
+ <!-- Footer message for battery tip dialog to show the status about the battery [CHAR LIMIT=NONE] -->
+ <string name="battery_tip_dialog_message_footer">Includes high-power background activity</string>
<!-- Title for restricted app preference, showing how many app need to be restricted [CHAR LIMIT=NONE] -->
<plurals name="battery_tip_restrict_title">
<item quantity="one">Restrict %1$d app</item>
@@ -7050,7 +7067,7 @@
handle actions such as open web page, making phone calls, default SMS apps [CHAR LIMIT=40]-->
<string name="app_default_dashboard_title">Default apps</string>
<!-- Summary text for system preference tile, showing important setting items under system setting [CHAR LIMIT=NONE]-->
- <string name="system_dashboard_summary">Languages, time, backup, updates</string>
+ <string name="system_dashboard_summary">Languages, gestures, time, backup</string>
<!-- Search strings -->
<!-- Text to describe the search results fragment title [CHAR LIMIT=16] -->
@@ -7152,7 +7169,7 @@
<string name="keywords_screen_timeout">screen, lock time, timeout, lockscreen</string>
<!-- List of synonyms for Storage settings (everything related to storage on the device), used to match in settings search [CHAR LIMIT=NONE] -->
- <string name="keywords_storage_settings">memory, data, delete, clear, free, space</string>
+ <string name="keywords_storage_settings">memory, cache, data, delete, clear, free, space</string>
<!-- List of synonyms for the Bluetooth setting, used to match in settings search [CHAR LIMIT=NONE] -->
<string name="keywords_bluetooth_settings">connected, device, headphones, headset, speaker, wireless, pair, earbuds, music, media </string>
@@ -7669,6 +7686,18 @@
<string name="profile_section_header">Work notifications</string>
<!-- Configure Notifications: setting title [CHAR LIMIT=80] -->
+ <string name="asst_capability_prioritizer_title">Automatic Notification Prioritizer</string>
+
+ <!-- Configure Notifications: setting summary [CHAR LIMIT=200] -->
+ <string name="asst_capability_prioritizer_summary">Automatically silence and demote less important notifications</string>
+
+ <!-- Configure Notifications: setting title [CHAR LIMIT=80] -->
+ <string name="asst_capabilities_actions_replies_title">Smart actions and replies</string>
+
+ <!-- Configure Notifications: setting summary [CHAR LIMIT=200] -->
+ <string name="asst_capabilities_actions_replies_summary">Automatically add contextual notification actions and quick replies to notifications</string>
+
+ <!-- Configure Notifications: setting title [CHAR LIMIT=80] -->
<string name="hide_silent_icons_title">Hide silent notification status icons</string>
<!-- Configure Notifications: setting summary [CHAR LIMIT=NONE] -->
@@ -7678,7 +7707,9 @@
<string name="notification_badging_title">Allow notification dots</string>
<!-- Configure Notifications: Title for the notification bubbles option. [CHAR LIMIT=60] -->
- <string name="notification_bubbles_title">Allow notification bubbles</string>
+ <string name="notification_bubbles_title">Allow bubbles</string>
+ <!-- Configure Notifications: Summary for the notification bubbles option. [CHAR LIMIT=NONE] -->
+ <string name="notification_bubbles_summary">Allow apps to show some notifications as bubbles</string>
<!-- Configure notifications: title for swipe direction [CHAR LIMIT=60] -->
<string name="swipe_direction_title">Swipe actions</string>
@@ -9772,6 +9803,9 @@
<!-- [CHAR LIMIT=25] Title of developer tile to toggle winscope trace -->
<string name="winscope_trace_quick_settings_title">Winscope Trace</string>
+ <!-- [CHAR LIMIT=25] Title of developer tile to toggle sensors -->
+ <string name="sensors_off_quick_settings_title">Sensors Off</string>
+
<!-- [CHAR LIMIT=60] Title of work profile setting page -->
<string name="managed_profile_settings_title">Work profile settings</string>
<!-- [CHAR LIMIT=60] The preference title for enabling cross-profile remote contact search -->
diff --git a/res/xml/app_info_settings.xml b/res/xml/app_info_settings.xml
index 506686a..435a7ef 100644
--- a/res/xml/app_info_settings.xml
+++ b/res/xml/app_info_settings.xml
@@ -55,7 +55,7 @@
<Preference
android:key="storage_settings"
- android:title="@string/storage_settings"
+ android:title="@string/storage_settings_for_app"
android:summary="@string/summary_placeholder"
settings:controller="com.android.settings.applications.appinfo.AppStoragePreferenceController" />
diff --git a/res/xml/configure_notification_settings.xml b/res/xml/configure_notification_settings.xml
index 38fa060..e48ddc1 100644
--- a/res/xml/configure_notification_settings.xml
+++ b/res/xml/configure_notification_settings.xml
@@ -27,6 +27,18 @@
settings:controller="com.android.settings.notification.NotificationAssistantPreferenceController"/>
<SwitchPreference
+ android:key="asst_capability_prioritizer"
+ android:title="@string/asst_capability_prioritizer_title"
+ android:summary="@string/asst_capability_prioritizer_summary"
+ settings:controller="com.android.settings.notification.AssistantCapabilityPreferenceController" />
+
+ <SwitchPreference
+ android:key="asst_capabilities_actions_replies"
+ android:title="@string/asst_capabilities_actions_replies_title"
+ android:summary="@string/asst_capabilities_actions_replies_summary"
+ settings:controller="com.android.settings.notification.AssistantCapabilityPreferenceController" />
+
+ <SwitchPreference
android:key="hide_silent_icons"
android:title="@string/hide_silent_icons_title"
android:summary="@string/hide_silent_icons_summary"
@@ -61,6 +73,7 @@
<SwitchPreference
android:key="notification_bubbles"
android:title="@string/notification_bubbles_title"
+ android:summary="@string/notification_bubbles_summary"
settings:controller="com.android.settings.notification.BubbleNotificationPreferenceController"/>
<!-- Pulse notification light -->
diff --git a/res/xml/development_settings.xml b/res/xml/development_settings.xml
index 032f622..a9af2d4 100644
--- a/res/xml/development_settings.xml
+++ b/res/xml/development_settings.xml
@@ -113,7 +113,8 @@
<Preference
android:key="quick_settings_tiles"
android:title="@string/quick_settings_developer_tiles"
- android:fragment="com.android.settings.development.qstile.DevelopmentTileConfigFragment" />
+ android:fragment="com.android.settings.development.qstile.DevelopmentTileConfigFragment"
+ settings:searchable="false" />
<!-- Configure trust agent behavior -->
<SwitchPreference
diff --git a/src/com/android/settings/RadioInfo.java b/src/com/android/settings/RadioInfo.java
index 495d35c..6f6e6c4 100644
--- a/src/com/android/settings/RadioInfo.java
+++ b/src/com/android/settings/RadioInfo.java
@@ -1571,7 +1571,8 @@
}
private static boolean isDsdsSupported() {
- return TelephonyManager.getDefault().isMultisimSupported();
+ return (TelephonyManager.getDefault().isMultiSimSupported()
+ == TelephonyManager.MULTISIM_ALLOWED);
}
private static boolean isDsdsEnabled() {
diff --git a/src/com/android/settings/accessibility/AccessibilityHearingAidPreferenceController.java b/src/com/android/settings/accessibility/AccessibilityHearingAidPreferenceController.java
index 1881ca7..641d8ca 100644
--- a/src/com/android/settings/accessibility/AccessibilityHearingAidPreferenceController.java
+++ b/src/com/android/settings/accessibility/AccessibilityHearingAidPreferenceController.java
@@ -31,6 +31,9 @@
import androidx.annotation.VisibleForTesting;
import androidx.fragment.app.FragmentManager;
+import androidx.lifecycle.Lifecycle.Event;
+import androidx.lifecycle.LifecycleObserver;
+import androidx.lifecycle.OnLifecycleEvent;
import androidx.preference.Preference;
import androidx.preference.PreferenceScreen;
@@ -40,9 +43,6 @@
import com.android.settings.core.SubSettingLauncher;
import com.android.settingslib.bluetooth.CachedBluetoothDevice;
import com.android.settingslib.bluetooth.LocalBluetoothManager;
-import com.android.settingslib.core.lifecycle.LifecycleObserver;
-import com.android.settingslib.core.lifecycle.events.OnPause;
-import com.android.settingslib.core.lifecycle.events.OnResume;
import java.util.Iterator;
import java.util.List;
@@ -53,7 +53,7 @@
* Controller that shows and updates the bluetooth device name
*/
public class AccessibilityHearingAidPreferenceController extends BasePreferenceController
- implements LifecycleObserver, OnResume, OnPause {
+ implements LifecycleObserver {
private static final String TAG = "AccessibilityHearingAidPreferenceController";
private Preference mHearingAidPreference;
@@ -104,7 +104,7 @@
return mHearingAidProfileSupported ? AVAILABLE : UNSUPPORTED_ON_DEVICE;
}
- @Override
+ @OnLifecycleEvent(Event.ON_RESUME)
public void onResume() {
if (mHearingAidProfileSupported) {
IntentFilter filter = new IntentFilter();
@@ -114,7 +114,7 @@
}
}
- @Override
+ @OnLifecycleEvent(Event.ON_PAUSE)
public void onPause() {
if (mHearingAidProfileSupported) {
mContext.unregisterReceiver(mHearingAidChangedReceiver);
diff --git a/src/com/android/settings/applications/appinfo/AppButtonsPreferenceController.java b/src/com/android/settings/applications/appinfo/AppButtonsPreferenceController.java
index c661890..e118ed6 100644
--- a/src/com/android/settings/applications/appinfo/AppButtonsPreferenceController.java
+++ b/src/com/android/settings/applications/appinfo/AppButtonsPreferenceController.java
@@ -559,15 +559,15 @@
if (mHomePackages.contains(mAppEntry.info.packageName)
|| isSystemPackage(mActivity.getResources(), mPm, mPackageInfo)) {
// Disable button for core system applications.
- mButtonsPref.setButton2Text(R.string.uninstall_text)
+ mButtonsPref.setButton2Text(R.string.disable_text)
.setButton2Icon(R.drawable.ic_settings_delete);
} else if (mAppEntry.info.enabled && !isDisabledUntilUsed()) {
- mButtonsPref.setButton2Text(R.string.uninstall_text)
+ mButtonsPref.setButton2Text(R.string.disable_text)
.setButton2Icon(R.drawable.ic_settings_delete);
disableable = !mApplicationFeatureProvider.getKeepEnabledPackages()
.contains(mAppEntry.info.packageName);
} else {
- mButtonsPref.setButton2Text(R.string.install_text)
+ mButtonsPref.setButton2Text(R.string.enable_text)
.setButton2Icon(R.drawable.ic_settings_install);
disableable = true;
}
diff --git a/src/com/android/settings/applications/manageapplications/ApplicationViewHolder.java b/src/com/android/settings/applications/manageapplications/ApplicationViewHolder.java
index e46f294..bd08236 100644
--- a/src/com/android/settings/applications/manageapplications/ApplicationViewHolder.java
+++ b/src/com/android/settings/applications/manageapplications/ApplicationViewHolder.java
@@ -19,7 +19,6 @@
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.graphics.drawable.Drawable;
-import android.text.TextUtils;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
@@ -41,10 +40,6 @@
private final TextView mAppName;
private final ImageView mAppIcon;
- private final boolean mKeepStableHeight;
-
- @VisibleForTesting
- View mSummaryContainer;
@VisibleForTesting
final TextView mSummary;
@VisibleForTesting
@@ -54,20 +49,18 @@
@VisibleForTesting
final Switch mSwitch;
- ApplicationViewHolder(View itemView, boolean keepStableHeight) {
+ ApplicationViewHolder(View itemView) {
super(itemView);
mAppName = itemView.findViewById(android.R.id.title);
mAppIcon = itemView.findViewById(android.R.id.icon);
- mSummaryContainer = itemView.findViewById(R.id.summary_container);
mSummary = itemView.findViewById(android.R.id.summary);
mDisabled = itemView.findViewById(R.id.appendix);
- mKeepStableHeight = keepStableHeight;
mSwitch = itemView.findViewById(R.id.switchWidget);
mWidgetContainer = itemView.findViewById(android.R.id.widget_frame);
}
static View newView(ViewGroup parent) {
- return newView(parent, false);
+ return newView(parent, false /* twoTarget */);
}
static View newView(ViewGroup parent, boolean twoTarget) {
@@ -76,13 +69,13 @@
final ViewGroup widgetFrame = view.findViewById(android.R.id.widget_frame);
if (twoTarget) {
if (widgetFrame != null) {
- LayoutInflater.from(parent.getContext())
- .inflate(R.layout.preference_widget_master_switch, widgetFrame, true);
+ LayoutInflater.from(parent.getContext())
+ .inflate(R.layout.preference_widget_master_switch, widgetFrame, true);
- View divider = LayoutInflater.from(parent.getContext()).inflate(
- R.layout.preference_two_target_divider, view, false);
- // second to last, before widget frame
- view.addView(divider, view.getChildCount() - 1);
+ View divider = LayoutInflater.from(parent.getContext()).inflate(
+ R.layout.preference_two_target_divider, view, false);
+ // second to last, before widget frame
+ view.addView(divider, view.getChildCount() - 1);
}
} else if (widgetFrame != null) {
widgetFrame.setVisibility(View.GONE);
@@ -92,12 +85,10 @@
void setSummary(CharSequence summary) {
mSummary.setText(summary);
- updateSummaryContainer();
}
void setSummary(@StringRes int summary) {
mSummary.setText(summary);
- updateSummaryContainer();
}
void setEnabled(boolean isEnabled) {
@@ -133,17 +124,6 @@
} else {
mDisabled.setVisibility(View.GONE);
}
- updateSummaryContainer();
- }
-
- void updateSummaryContainer() {
- if (mKeepStableHeight) {
- mSummaryContainer.setVisibility(View.VISIBLE);
- return;
- }
- final boolean hasContent =
- !TextUtils.isEmpty(mDisabled.getText()) || !TextUtils.isEmpty(mSummary.getText());
- mSummaryContainer.setVisibility(hasContent ? View.VISIBLE : View.GONE);
}
void updateSizeText(AppEntry entry, CharSequence invalidSizeStr, int whichSize) {
diff --git a/src/com/android/settings/applications/manageapplications/ManageApplications.java b/src/com/android/settings/applications/manageapplications/ManageApplications.java
index 9586be0..9839934 100644
--- a/src/com/android/settings/applications/manageapplications/ManageApplications.java
+++ b/src/com/android/settings/applications/manageapplications/ManageApplications.java
@@ -33,7 +33,6 @@
import android.annotation.Nullable;
import android.annotation.StringRes;
import android.app.Activity;
-import android.app.ActivityManager;
import android.app.settings.SettingsEnums;
import android.app.usage.IUsageStatsManager;
import android.content.Context;
@@ -50,22 +49,18 @@
import android.util.ArraySet;
import android.util.IconDrawableFactory;
import android.util.Log;
-import android.util.TypedValue;
-import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
-import android.view.ViewGroup.LayoutParams;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.Filter;
import android.widget.FrameLayout;
import android.widget.SearchView;
import android.widget.Spinner;
-import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.VisibleForTesting;
@@ -1059,14 +1054,13 @@
@Override
public ApplicationViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
- View view;
+ final View view;
if (mManageApplications.mListType == LIST_TYPE_NOTIFICATION) {
view = ApplicationViewHolder.newView(parent, true /* twoTarget */);
} else {
view = ApplicationViewHolder.newView(parent, false /* twoTarget */);
}
- return new ApplicationViewHolder(view,
- shouldUseStableItemHeight(mManageApplications.mListType));
+ return new ApplicationViewHolder(view);
}
@Override
@@ -1153,11 +1147,6 @@
mSearchFilter.filter(query);
}
- @VisibleForTesting
- static boolean shouldUseStableItemHeight(int listType) {
- return true;
- }
-
private static boolean packageNameEquals(PackageItemInfo info1, PackageItemInfo info2) {
if (info1 == null || info2 == null) {
return false;
diff --git a/src/com/android/settings/applications/managedomainurls/DomainAppPreference.java b/src/com/android/settings/applications/managedomainurls/DomainAppPreference.java
index 94d2818..bc7b855 100644
--- a/src/com/android/settings/applications/managedomainurls/DomainAppPreference.java
+++ b/src/com/android/settings/applications/managedomainurls/DomainAppPreference.java
@@ -47,12 +47,6 @@
setState();
}
- @Override
- public void onBindViewHolder(PreferenceViewHolder holder) {
- super.onBindViewHolder(holder);
- holder.itemView.findViewById(R.id.appendix).setVisibility(View.GONE);
- }
-
public void reuse() {
setState();
notifyChanged();
diff --git a/src/com/android/settings/backup/BackupSettingsHelper.java b/src/com/android/settings/backup/BackupSettingsHelper.java
index b836e55..1d3455b 100644
--- a/src/com/android/settings/backup/BackupSettingsHelper.java
+++ b/src/com/android/settings/backup/BackupSettingsHelper.java
@@ -25,6 +25,7 @@
import android.os.ServiceManager;
import android.os.UserHandle;
import android.os.UserManager;
+import android.text.TextUtils;
import android.util.Log;
import androidx.annotation.VisibleForTesting;
@@ -91,9 +92,9 @@
*
* @return Label for the backup settings item.
*/
- public String getLabelForBackupSettings() {
- String label = getLabelFromBackupTransport();
- if (label == null || label.isEmpty()) {
+ public CharSequence getLabelForBackupSettings() {
+ CharSequence label = getLabelFromBackupTransport();
+ if (TextUtils.isEmpty(label)) {
label = mContext.getString(R.string.privacy_settings_title);
}
return label;
@@ -222,10 +223,11 @@
}
@VisibleForTesting
- String getLabelFromBackupTransport() {
+ CharSequence getLabelFromBackupTransport() {
try {
- String label =
- mBackupManager.getDataManagementLabel(mBackupManager.getCurrentTransport());
+ CharSequence label =
+ mBackupManager.getDataManagementLabelForUser(
+ UserHandle.myUserId(), mBackupManager.getCurrentTransport());
if (Log.isLoggable(TAG, Log.DEBUG)) {
Log.d(TAG, "Received the backup settings label from backup transport: " + label);
}
diff --git a/src/com/android/settings/backup/BackupSettingsPreferenceController.java b/src/com/android/settings/backup/BackupSettingsPreferenceController.java
index 2a657ea..4e0e3b4 100644
--- a/src/com/android/settings/backup/BackupSettingsPreferenceController.java
+++ b/src/com/android/settings/backup/BackupSettingsPreferenceController.java
@@ -31,7 +31,7 @@
private static final String BACKUP_SETTINGS = "backup_settings";
private static final String MANUFACTURER_SETTINGS = "manufacturer_backup";
private Intent mBackupSettingsIntent;
- private String mBackupSettingsTitle;
+ private CharSequence mBackupSettingsTitle;
private String mBackupSettingsSummary;
private Intent mManufacturerIntent;
private String mManufacturerLabel;
diff --git a/src/com/android/settings/backup/DataManagementPreferenceController.java b/src/com/android/settings/backup/DataManagementPreferenceController.java
index d19b866..34d51ac 100644
--- a/src/com/android/settings/backup/DataManagementPreferenceController.java
+++ b/src/com/android/settings/backup/DataManagementPreferenceController.java
@@ -48,7 +48,7 @@
return;
}
preference.setIntent(mPSCD.getManageIntent());
- final String manageLabel = mPSCD.getManageLabel();
+ final CharSequence manageLabel = mPSCD.getManageLabel();
if (manageLabel != null) {
preference.setTitle(manageLabel);
}
diff --git a/src/com/android/settings/backup/PrivacySettingsConfigData.java b/src/com/android/settings/backup/PrivacySettingsConfigData.java
index ffe05b8..8bea11b 100644
--- a/src/com/android/settings/backup/PrivacySettingsConfigData.java
+++ b/src/com/android/settings/backup/PrivacySettingsConfigData.java
@@ -27,7 +27,7 @@
private Intent mConfigIntent;
private String mConfigSummary;
private Intent mManageIntent;
- private String mManageLabel;
+ private CharSequence mManageLabel;
private PrivacySettingsConfigData() {
mBackupEnabled = false;
@@ -85,11 +85,11 @@
mManageIntent = manageIntent;
}
- public String getManageLabel() {
+ public CharSequence getManageLabel() {
return mManageLabel;
}
- public void setManageLabel(final String manageLabel) {
+ public void setManageLabel(final CharSequence manageLabel) {
mManageLabel = manageLabel;
}
}
diff --git a/src/com/android/settings/backup/PrivacySettingsUtils.java b/src/com/android/settings/backup/PrivacySettingsUtils.java
index f8f21dd..bb1108c 100644
--- a/src/com/android/settings/backup/PrivacySettingsUtils.java
+++ b/src/com/android/settings/backup/PrivacySettingsUtils.java
@@ -97,7 +97,8 @@
data.setConfigSummary(backupManager.getDestinationString(transport));
data.setManageIntent(validatedActivityIntent(context,
backupManager.getDataManagementIntent(transport), "management"));
- data.setManageLabel(backupManager.getDataManagementLabel(transport));
+ data.setManageLabel(
+ backupManager.getDataManagementLabelForUser(UserHandle.myUserId(), transport));
data.setBackupGray(false);
} catch (RemoteException e) {
// leave it 'false' and disable the UI; there's no backup manager
diff --git a/src/com/android/settings/biometrics/BiometricEnrollIntroduction.java b/src/com/android/settings/biometrics/BiometricEnrollIntroduction.java
index 097ffe2..81b70b5 100644
--- a/src/com/android/settings/biometrics/BiometricEnrollIntroduction.java
+++ b/src/com/android/settings/biometrics/BiometricEnrollIntroduction.java
@@ -140,7 +140,7 @@
if (!mHasPassword) {
// No password registered, launch into enrollment wizard.
launchChooseLock();
- } else {
+ } else if (!mLaunchedConfirmLock || mToken == null) {
launchConfirmLock(getConfirmLockTitleResId(), getChallenge());
}
}
diff --git a/src/com/android/settings/biometrics/face/FaceEnrollAccessibilityToggle.java b/src/com/android/settings/biometrics/face/FaceEnrollAccessibilityToggle.java
index 2db654b..dffc67d 100644
--- a/src/com/android/settings/biometrics/face/FaceEnrollAccessibilityToggle.java
+++ b/src/com/android/settings/biometrics/face/FaceEnrollAccessibilityToggle.java
@@ -20,6 +20,7 @@
import android.content.res.TypedArray;
import android.util.AttributeSet;
import android.view.LayoutInflater;
+import android.widget.CompoundButton;
import android.widget.LinearLayout;
import android.widget.Switch;
import android.widget.TextView;
@@ -68,4 +69,12 @@
public void setChecked(boolean checked) {
mSwitch.setChecked(checked);
}
+
+ public void setListener(CompoundButton.OnCheckedChangeListener listener) {
+ mSwitch.setOnCheckedChangeListener(listener);
+ }
+
+ public Switch getSwitch() {
+ return mSwitch;
+ }
}
diff --git a/src/com/android/settings/biometrics/face/FaceEnrollIntroduction.java b/src/com/android/settings/biometrics/face/FaceEnrollIntroduction.java
index c7966f2..d923e55 100644
--- a/src/com/android/settings/biometrics/face/FaceEnrollIntroduction.java
+++ b/src/com/android/settings/biometrics/face/FaceEnrollIntroduction.java
@@ -25,7 +25,7 @@
import android.text.TextUtils;
import android.view.View;
import android.widget.Button;
-import android.widget.LinearLayout;
+import android.widget.CompoundButton;
import android.widget.TextView;
import com.android.settings.R;
@@ -38,6 +38,7 @@
import com.google.android.setupcompat.template.FooterButton;
import com.google.android.setupcompat.util.WizardManagerHelper;
import com.google.android.setupdesign.span.LinkSpan;
+import com.google.android.setupdesign.view.IllustrationVideoView;
public class FaceEnrollIntroduction extends BiometricEnrollIntroduction {
@@ -46,19 +47,44 @@
private FaceManager mFaceManager;
private FaceEnrollAccessibilityToggle mSwitchDiversity;
+ private IllustrationVideoView mIllustrationNormal;
+ private View mIllustrationAccessibility;
+
+ private CompoundButton.OnCheckedChangeListener mSwitchDiversityListener =
+ new CompoundButton.OnCheckedChangeListener() {
+ @Override
+ public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
+ if (isChecked) {
+ mIllustrationNormal.stop();
+ mIllustrationNormal.setVisibility(View.INVISIBLE);
+ mIllustrationAccessibility.setVisibility(View.VISIBLE);
+ } else {
+ mIllustrationNormal.setVisibility(View.VISIBLE);
+ mIllustrationNormal.start();
+ mIllustrationAccessibility.setVisibility(View.INVISIBLE);
+ }
+ }
+ };
+
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
+
mFaceManager = Utils.getFaceManagerOrNull(this);
- final LinearLayout accessibilityLayout = findViewById(R.id.accessibility_layout);
final Button accessibilityButton = findViewById(R.id.accessibility_button);
+ final View footerView = findViewById(R.id.footer_layout);
accessibilityButton.setOnClickListener(view -> {
mSwitchDiversity.setChecked(true);
- accessibilityButton.setVisibility(View.INVISIBLE);
- accessibilityLayout.setVisibility(View.VISIBLE);
+ accessibilityButton.setVisibility(View.GONE);
+ mSwitchDiversity.setVisibility(View.VISIBLE);
+ footerView.setVisibility(View.GONE);
});
mSwitchDiversity = findViewById(R.id.toggle_diversity);
+ mSwitchDiversity.setListener(mSwitchDiversityListener);
+
+ mIllustrationNormal = findViewById(R.id.illustration_normal);
+ mIllustrationAccessibility = findViewById(R.id.illustration_accessibility);
mFooterBarMixin = getLayout().getMixin(FooterBarMixin.class);
if (WizardManagerHelper.isAnySetupWizard(getIntent())) {
@@ -92,6 +118,13 @@
}
@Override
+ protected void onResume() {
+ super.onResume();
+ mSwitchDiversityListener.onCheckedChanged(mSwitchDiversity.getSwitch(),
+ mSwitchDiversity.isChecked());
+ }
+
+ @Override
protected boolean isDisabledByAdmin() {
return RestrictedLockUtilsInternal.checkIfKeyguardFeaturesDisabled(
this, DevicePolicyManager.KEYGUARD_DISABLE_FACE, mUserId) != null;
@@ -114,7 +147,7 @@
@Override
protected int getDescriptionResDisabledByAdmin() {
- return R.string.security_settings_fingerprint_enroll_introduction_message_unlock_disabled;
+ return R.string.security_settings_face_enroll_introduction_message_unlock_disabled;
}
@Override
diff --git a/src/com/android/settings/biometrics/face/FaceSettings.java b/src/com/android/settings/biometrics/face/FaceSettings.java
index ea5a303..9651eec 100644
--- a/src/com/android/settings/biometrics/face/FaceSettings.java
+++ b/src/com/android/settings/biometrics/face/FaceSettings.java
@@ -31,6 +31,7 @@
import android.util.Log;
import com.android.settings.R;
+import com.android.settings.SettingsActivity;
import com.android.settings.Utils;
import com.android.settings.dashboard.DashboardFragment;
import com.android.settings.password.ChooseLockSettingsHelper;
@@ -56,6 +57,7 @@
private int mUserId;
private byte[] mToken;
private FaceSettingsAttentionPreferenceController mAttentionController;
+ private FaceSettingsRemoveButtonPreferenceController mRemoveController;
private final FaceSettingsRemoveButtonPreferenceController.Listener mRemovalListener = () -> {
if (getActivity() != null) {
@@ -166,8 +168,9 @@
if (controller instanceof FaceSettingsAttentionPreferenceController) {
mAttentionController = (FaceSettingsAttentionPreferenceController) controller;
} else if (controller instanceof FaceSettingsRemoveButtonPreferenceController) {
- ((FaceSettingsRemoveButtonPreferenceController) controller)
- .setListener(mRemovalListener);
+ mRemoveController = (FaceSettingsRemoveButtonPreferenceController) controller;
+ mRemoveController.setListener(mRemovalListener);
+ mRemoveController.setActivity((SettingsActivity) getActivity());
}
}
diff --git a/src/com/android/settings/biometrics/face/FaceSettingsRemoveButtonPreferenceController.java b/src/com/android/settings/biometrics/face/FaceSettingsRemoveButtonPreferenceController.java
index baab391..5174482 100644
--- a/src/com/android/settings/biometrics/face/FaceSettingsRemoveButtonPreferenceController.java
+++ b/src/com/android/settings/biometrics/face/FaceSettingsRemoveButtonPreferenceController.java
@@ -16,9 +16,14 @@
package com.android.settings.biometrics.face;
+import android.app.AlertDialog;
+import android.app.Dialog;
+import android.app.settings.SettingsEnums;
import android.content.Context;
+import android.content.DialogInterface;
import android.hardware.face.Face;
import android.hardware.face.FaceManager;
+import android.os.Bundle;
import android.os.UserHandle;
import android.util.Log;
import android.view.View;
@@ -28,7 +33,9 @@
import androidx.preference.Preference;
import com.android.settings.R;
+import com.android.settings.SettingsActivity;
import com.android.settings.core.BasePreferenceController;
+import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
import com.android.settingslib.widget.LayoutPreference;
import java.util.List;
@@ -43,6 +50,33 @@
private static final String TAG = "FaceSettings/Remove";
private static final String KEY = "security_settings_face_delete_faces_container";
+ public static class ConfirmRemoveDialog extends InstrumentedDialogFragment {
+
+ private DialogInterface.OnClickListener mOnClickListener;
+
+ @Override
+ public int getMetricsCategory() {
+ return SettingsEnums.DIALOG_FACE_REMOVE;
+ }
+
+ @Override
+ public Dialog onCreateDialog(Bundle savedInstanceState) {
+ AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
+
+ builder.setTitle(R.string.security_settings_face_settings_remove_dialog_title)
+ .setMessage(R.string.security_settings_face_settings_remove_dialog_details)
+ .setPositiveButton(R.string.okay, mOnClickListener)
+ .setNegativeButton(R.string.cancel, mOnClickListener);
+ AlertDialog dialog = builder.create();
+ dialog.setCanceledOnTouchOutside(false);
+ return dialog;
+ }
+
+ public void setOnClickListener(DialogInterface.OnClickListener listener) {
+ mOnClickListener = listener;
+ }
+ }
+
interface Listener {
void onRemoved();
}
@@ -50,6 +84,7 @@
private Button mButton;
private List<Face> mFaces;
private Listener mListener;
+ private SettingsActivity mActivity;
private final Context mContext;
private final int mUserId;
@@ -77,6 +112,27 @@
}
};
+ private final DialogInterface.OnClickListener mOnClickListener
+ = new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ if (which == DialogInterface.BUTTON_POSITIVE) {
+ if (mFaces.isEmpty()) {
+ Log.e(TAG, "No faces");
+ return;
+ }
+ if (mFaces.size() > 1) {
+ Log.e(TAG, "Multiple enrollments: " + mFaces.size());
+ }
+
+ // Remove the first/only face
+ mFaceManager.remove(mFaces.get(0), mUserId, mRemovalCallback);
+ } else {
+ mButton.setEnabled(true);
+ }
+ }
+ };
+
public FaceSettingsRemoveButtonPreferenceController(Context context, String preferenceKey) {
super(context, preferenceKey);
mContext = context;
@@ -115,20 +171,17 @@
public void onClick(View v) {
if (v == mButton) {
mButton.setEnabled(false);
- if (mFaces.isEmpty()) {
- Log.e(TAG, "No faces");
- return;
- }
- if (mFaces.size() > 1) {
- Log.e(TAG, "Multiple enrollments: " + mFaces.size());
- }
-
- // Remove the first/only face
- mFaceManager.remove(mFaces.get(0), mUserId, mRemovalCallback);
+ ConfirmRemoveDialog dialog = new ConfirmRemoveDialog();
+ dialog.setOnClickListener(mOnClickListener);
+ dialog.show(mActivity.getSupportFragmentManager(), ConfirmRemoveDialog.class.getName());
}
}
public void setListener(Listener listener) {
mListener = listener;
}
+
+ public void setActivity(SettingsActivity activity) {
+ mActivity = activity;
+ }
}
diff --git a/src/com/android/settings/bluetooth/BluetoothDetailsHeaderController.java b/src/com/android/settings/bluetooth/BluetoothDetailsHeaderController.java
index fd805b8..3860352 100644
--- a/src/com/android/settings/bluetooth/BluetoothDetailsHeaderController.java
+++ b/src/com/android/settings/bluetooth/BluetoothDetailsHeaderController.java
@@ -26,7 +26,6 @@
import com.android.settings.R;
import com.android.settings.widget.EntityHeaderController;
-import com.android.settingslib.bluetooth.BluetoothUtils;
import com.android.settingslib.bluetooth.CachedBluetoothDevice;
import com.android.settingslib.bluetooth.CachedBluetoothDeviceManager;
import com.android.settingslib.bluetooth.LocalBluetoothManager;
@@ -66,10 +65,8 @@
}
protected void setHeaderProperties() {
- final Pair<Drawable, String> pair = BluetoothUtils
- .getBtClassDrawableWithDescription(mContext, mCachedDevice,
- mContext.getResources().getFraction(R.fraction.bt_battery_scale_fraction, 1,
- 1));
+ final Pair<Drawable, String> pair = Utils.getBtRainbowDrawableWithDescription(mContext,
+ mCachedDevice);
String summaryText = mCachedDevice.getConnectionSummary();
// If both the hearing aids are connected, two device status should be shown.
// If Second Summary is unavailable, to set it to null.
diff --git a/src/com/android/settings/bluetooth/BluetoothDevicePreference.java b/src/com/android/settings/bluetooth/BluetoothDevicePreference.java
index d4c0ed0..8d727eb 100644
--- a/src/com/android/settings/bluetooth/BluetoothDevicePreference.java
+++ b/src/com/android/settings/bluetooth/BluetoothDevicePreference.java
@@ -38,7 +38,6 @@
import com.android.settings.R;
import com.android.settings.overlay.FeatureFactory;
import com.android.settings.widget.GearPreference;
-import com.android.settingslib.bluetooth.BluetoothUtils;
import com.android.settingslib.bluetooth.CachedBluetoothDevice;
import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
@@ -130,8 +129,8 @@
// Null check is done at the framework
setSummary(mCachedDevice.getConnectionSummary());
- final Pair<Drawable, String> pair = BluetoothUtils
- .getBtClassDrawableWithDescription(getContext(), mCachedDevice);
+ final Pair<Drawable, String> pair = Utils
+ .getBtRainbowDrawableWithDescription(getContext(), mCachedDevice);
if (pair.first != null) {
setIcon(pair.first);
contentDescription = pair.second;
@@ -246,5 +245,4 @@
R.string.bluetooth_pairing_error_message);
}
}
-
}
diff --git a/src/com/android/settings/bluetooth/Utils.java b/src/com/android/settings/bluetooth/Utils.java
index ff4a98f..e02ddc4 100755
--- a/src/com/android/settings/bluetooth/Utils.java
+++ b/src/com/android/settings/bluetooth/Utils.java
@@ -21,8 +21,12 @@
import android.bluetooth.BluetoothProfile;
import android.content.Context;
import android.content.DialogInterface;
+import android.content.res.Resources;
+import android.graphics.PorterDuff;
+import android.graphics.drawable.Drawable;
import android.provider.Settings;
import android.util.Log;
+import android.util.Pair;
import android.widget.Toast;
import androidx.annotation.VisibleForTesting;
@@ -30,8 +34,10 @@
import com.android.settings.R;
import com.android.settings.overlay.FeatureFactory;
+import com.android.settings.widget.AdaptiveIcon;
import com.android.settingslib.bluetooth.BluetoothUtils;
import com.android.settingslib.bluetooth.BluetoothUtils.ErrorListener;
+import com.android.settingslib.bluetooth.CachedBluetoothDevice;
import com.android.settingslib.bluetooth.LocalBluetoothManager;
import com.android.settingslib.bluetooth.LocalBluetoothManager.BluetoothManagerCallback;
@@ -179,4 +185,25 @@
return META_INT_ERROR;
}
}
+
+ /**
+ * Get colorful bluetooth icon with description
+ */
+ public static Pair<Drawable, String> getBtRainbowDrawableWithDescription(Context context,
+ CachedBluetoothDevice cachedDevice) {
+ final Pair<Drawable, String> pair = BluetoothUtils.getBtClassDrawableWithDescription(
+ context, cachedDevice);
+ final Resources resources = context.getResources();
+ final int[] iconFgColors = resources.getIntArray(R.array.bt_icon_fg_colors);
+ final int[] iconBgColors = resources.getIntArray(R.array.bt_icon_bg_colors);
+
+ // get color index based on mac address
+ final int index = Math.abs(cachedDevice.getAddress().hashCode()) % iconBgColors.length;
+ pair.first.setColorFilter(iconFgColors[index], PorterDuff.Mode.SRC_ATOP);
+ final Drawable adaptiveIcon = new AdaptiveIcon(context, pair.first);
+ ((AdaptiveIcon) adaptiveIcon).setBackgroundColor(iconBgColors[index]);
+
+ return new Pair<>(adaptiveIcon, pair.second);
+ }
+
}
diff --git a/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java b/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java
index 6348b91..744cbd2 100644
--- a/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java
+++ b/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java
@@ -46,7 +46,7 @@
import com.android.settings.SettingsActivity;
import com.android.settings.dashboard.profileselector.ProfileSelectDialog;
import com.android.settings.overlay.FeatureFactory;
-import com.android.settings.widget.AdaptiveHomepageIcon;
+import com.android.settings.widget.AdaptiveIcon;
import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
import com.android.settingslib.drawer.DashboardCategory;
import com.android.settingslib.drawer.Tile;
@@ -197,8 +197,8 @@
Drawable iconDrawable = tileIcon.loadDrawable(preference.getContext());
if (forceRoundedIcon
&& !TextUtils.equals(mContext.getPackageName(), tile.getPackageName())) {
- iconDrawable = new AdaptiveHomepageIcon(mContext, iconDrawable);
- ((AdaptiveHomepageIcon) iconDrawable).setBackgroundColor(mContext, tile);
+ iconDrawable = new AdaptiveIcon(mContext, iconDrawable);
+ ((AdaptiveIcon) iconDrawable).setBackgroundColor(mContext, tile);
}
preference.setIcon(iconDrawable);
} else if (tile.getMetaData() != null
diff --git a/src/com/android/settings/development/qstile/DevelopmentTiles.java b/src/com/android/settings/development/qstile/DevelopmentTiles.java
index 5edbc70..bb791ab 100644
--- a/src/com/android/settings/development/qstile/DevelopmentTiles.java
+++ b/src/com/android/settings/development/qstile/DevelopmentTiles.java
@@ -16,9 +16,12 @@
package com.android.settings.development.qstile;
+import android.app.settings.SettingsEnums;
import android.content.ComponentName;
import android.content.Context;
import android.content.pm.PackageManager;
+import android.hardware.SensorPrivacyManager;
+import android.app.KeyguardManager;
import android.os.IBinder;
import android.os.Parcel;
import android.os.RemoteException;
@@ -38,6 +41,8 @@
import com.android.internal.app.LocalePicker;
import com.android.internal.statusbar.IStatusBarService;
+import com.android.settings.overlay.FeatureFactory;
+import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
import com.android.settingslib.development.DevelopmentSettingsEnabler;
import com.android.settingslib.development.SystemPropPoker;
@@ -273,4 +278,45 @@
}
}
}
-}
\ No newline at end of file
+
+ /**
+ * Tile to toggle sensors off to control camera, mic, and sensors managed by the SensorManager.
+ */
+ public static class SensorsOff extends DevelopmentTiles {
+ private Context mContext;
+ private SensorPrivacyManager mSensorPrivacyManager;
+ private KeyguardManager mKeyguardManager;
+ private MetricsFeatureProvider mMetricsFeatureProvider;
+ private boolean mIsEnabled;
+
+ @Override
+ public void onCreate() {
+ super.onCreate();
+ mContext = getApplicationContext();
+ mSensorPrivacyManager = (SensorPrivacyManager) mContext.getSystemService(
+ Context.SENSOR_PRIVACY_SERVICE);
+ mIsEnabled = mSensorPrivacyManager.isSensorPrivacyEnabled();
+ mMetricsFeatureProvider = FeatureFactory.getFactory(
+ mContext).getMetricsFeatureProvider();
+ mKeyguardManager = (KeyguardManager) mContext.getSystemService(
+ Context.KEYGUARD_SERVICE);
+ }
+
+ @Override
+ protected boolean isEnabled() {
+ return mIsEnabled;
+ }
+
+ @Override
+ public void setIsEnabled(boolean isEnabled) {
+ // Don't allow sensors to be reenabled from the lock screen.
+ if (mIsEnabled && mKeyguardManager.isKeyguardLocked()) {
+ return;
+ }
+ mMetricsFeatureProvider.action(getApplicationContext(), SettingsEnums.QS_SENSOR_PRIVACY,
+ isEnabled);
+ mIsEnabled = isEnabled;
+ mSensorPrivacyManager.setSensorPrivacy(isEnabled);
+ }
+ }
+}
diff --git a/src/com/android/settings/deviceinfo/simstatus/SimStatusDialogController.java b/src/com/android/settings/deviceinfo/simstatus/SimStatusDialogController.java
index d95320f..a014c29 100644
--- a/src/com/android/settings/deviceinfo/simstatus/SimStatusDialogController.java
+++ b/src/com/android/settings/deviceinfo/simstatus/SimStatusDialogController.java
@@ -174,7 +174,8 @@
return;
}
- mTelephonyManager.listen(mPhoneStateListener,
+ mTelephonyManager.createForSubscriptionId(mSubscriptionInfo.getSubscriptionId())
+ .listen(mPhoneStateListener,
PhoneStateListener.LISTEN_DATA_CONNECTION_STATE
| PhoneStateListener.LISTEN_SIGNAL_STRENGTHS
| PhoneStateListener.LISTEN_SERVICE_STATE);
@@ -197,8 +198,8 @@
return;
}
- mTelephonyManager.listen(mPhoneStateListener,
- PhoneStateListener.LISTEN_NONE);
+ mTelephonyManager.createForSubscriptionId(mSubscriptionInfo.getSubscriptionId())
+ .listen(mPhoneStateListener, PhoneStateListener.LISTEN_NONE);
if (mShowLatestAreaInfo) {
mContext.unregisterReceiver(mAreaInfoReceiver);
@@ -432,8 +433,7 @@
@VisibleForTesting
PhoneStateListener getPhoneStateListener() {
- return new PhoneStateListener(
- mSubscriptionInfo.getSubscriptionId()) {
+ return new PhoneStateListener() {
@Override
public void onDataConnectionStateChanged(int state) {
updateDataState(state);
diff --git a/src/com/android/settings/fuelgauge/batterytip/BatteryDatabaseManager.java b/src/com/android/settings/fuelgauge/batterytip/BatteryDatabaseManager.java
index f75588c..bb69999 100644
--- a/src/com/android/settings/fuelgauge/batterytip/BatteryDatabaseManager.java
+++ b/src/com/android/settings/fuelgauge/batterytip/BatteryDatabaseManager.java
@@ -59,7 +59,7 @@
mDatabaseHelper = AnomalyDatabaseHelper.getInstance(context);
}
- public static BatteryDatabaseManager getInstance(Context context) {
+ public static synchronized BatteryDatabaseManager getInstance(Context context) {
if (sSingleton == null) {
sSingleton = new BatteryDatabaseManager(context);
}
@@ -84,15 +84,15 @@
public synchronized boolean insertAnomaly(int uid, String packageName, int type,
int anomalyState,
long timestampMs) {
- try (SQLiteDatabase db = mDatabaseHelper.getWritableDatabase()) {
- ContentValues values = new ContentValues();
- values.put(UID, uid);
- values.put(PACKAGE_NAME, packageName);
- values.put(ANOMALY_TYPE, type);
- values.put(ANOMALY_STATE, anomalyState);
- values.put(TIME_STAMP_MS, timestampMs);
- return db.insertWithOnConflict(TABLE_ANOMALY, null, values, CONFLICT_IGNORE) != -1;
- }
+ final SQLiteDatabase db = mDatabaseHelper.getWritableDatabase();
+ ContentValues values = new ContentValues();
+ values.put(UID, uid);
+ values.put(PACKAGE_NAME, packageName);
+ values.put(ANOMALY_TYPE, type);
+ values.put(ANOMALY_STATE, anomalyState);
+ values.put(TIME_STAMP_MS, timestampMs);
+
+ return db.insertWithOnConflict(TABLE_ANOMALY, null, values, CONFLICT_IGNORE) != -1;
}
/**
@@ -100,43 +100,41 @@
*/
public synchronized List<AppInfo> queryAllAnomalies(long timestampMsAfter, int state) {
final List<AppInfo> appInfos = new ArrayList<>();
- try (SQLiteDatabase db = mDatabaseHelper.getReadableDatabase()) {
- final String[] projection = {PACKAGE_NAME, ANOMALY_TYPE, UID};
- final String orderBy = AnomalyDatabaseHelper.AnomalyColumns.TIME_STAMP_MS + " DESC";
- final Map<Integer, AppInfo.Builder> mAppInfoBuilders = new ArrayMap<>();
- final String selection = TIME_STAMP_MS + " > ? AND " + ANOMALY_STATE + " = ? ";
- final String[] selectionArgs = new String[]{String.valueOf(timestampMsAfter),
- String.valueOf(state)};
+ final SQLiteDatabase db = mDatabaseHelper.getReadableDatabase();
+ final String[] projection = {PACKAGE_NAME, ANOMALY_TYPE, UID};
+ final String orderBy = AnomalyDatabaseHelper.AnomalyColumns.TIME_STAMP_MS + " DESC";
+ final Map<Integer, AppInfo.Builder> mAppInfoBuilders = new ArrayMap<>();
+ final String selection = TIME_STAMP_MS + " > ? AND " + ANOMALY_STATE + " = ? ";
+ final String[] selectionArgs = new String[]{String.valueOf(timestampMsAfter),
+ String.valueOf(state)};
- try (Cursor cursor = db.query(TABLE_ANOMALY, projection, selection, selectionArgs,
- null /* groupBy */, null /* having */, orderBy)) {
- while (cursor.moveToNext()) {
- final int uid = cursor.getInt(cursor.getColumnIndex(UID));
- if (!mAppInfoBuilders.containsKey(uid)) {
- final AppInfo.Builder builder = new AppInfo.Builder()
- .setUid(uid)
- .setPackageName(
- cursor.getString(cursor.getColumnIndex(PACKAGE_NAME)));
- mAppInfoBuilders.put(uid, builder);
- }
- mAppInfoBuilders.get(uid).addAnomalyType(
- cursor.getInt(cursor.getColumnIndex(ANOMALY_TYPE)));
+ try (Cursor cursor = db.query(TABLE_ANOMALY, projection, selection, selectionArgs,
+ null /* groupBy */, null /* having */, orderBy)) {
+ while (cursor.moveToNext()) {
+ final int uid = cursor.getInt(cursor.getColumnIndex(UID));
+ if (!mAppInfoBuilders.containsKey(uid)) {
+ final AppInfo.Builder builder = new AppInfo.Builder()
+ .setUid(uid)
+ .setPackageName(
+ cursor.getString(cursor.getColumnIndex(PACKAGE_NAME)));
+ mAppInfoBuilders.put(uid, builder);
}
+ mAppInfoBuilders.get(uid).addAnomalyType(
+ cursor.getInt(cursor.getColumnIndex(ANOMALY_TYPE)));
}
+ }
- for (Integer uid : mAppInfoBuilders.keySet()) {
- appInfos.add(mAppInfoBuilders.get(uid).build());
- }
+ for (Integer uid : mAppInfoBuilders.keySet()) {
+ appInfos.add(mAppInfoBuilders.get(uid).build());
}
return appInfos;
}
public synchronized void deleteAllAnomaliesBeforeTimeStamp(long timestampMs) {
- try (SQLiteDatabase db = mDatabaseHelper.getWritableDatabase()) {
- db.delete(TABLE_ANOMALY, TIME_STAMP_MS + " < ?",
- new String[]{String.valueOf(timestampMs)});
- }
+ final SQLiteDatabase db = mDatabaseHelper.getWritableDatabase();
+ db.delete(TABLE_ANOMALY, TIME_STAMP_MS + " < ?",
+ new String[]{String.valueOf(timestampMs)});
}
/**
@@ -152,12 +150,12 @@
for (int i = 0; i < size; i++) {
whereArgs[i] = appInfos.get(i).packageName;
}
- try (SQLiteDatabase db = mDatabaseHelper.getWritableDatabase()) {
- final ContentValues values = new ContentValues();
- values.put(ANOMALY_STATE, state);
- db.update(TABLE_ANOMALY, values, PACKAGE_NAME + " IN (" + TextUtils.join(",",
- Collections.nCopies(appInfos.size(), "?")) + ")", whereArgs);
- }
+
+ final SQLiteDatabase db = mDatabaseHelper.getWritableDatabase();
+ final ContentValues values = new ContentValues();
+ values.put(ANOMALY_STATE, state);
+ db.update(TABLE_ANOMALY, values, PACKAGE_NAME + " IN (" + TextUtils.join(",",
+ Collections.nCopies(appInfos.size(), "?")) + ")", whereArgs);
}
}
@@ -170,21 +168,20 @@
public synchronized SparseLongArray queryActionTime(
@AnomalyDatabaseHelper.ActionType int type) {
final SparseLongArray timeStamps = new SparseLongArray();
- try (SQLiteDatabase db = mDatabaseHelper.getReadableDatabase()) {
- final String[] projection = {ActionColumns.UID, ActionColumns.TIME_STAMP_MS};
- final String selection = ActionColumns.ACTION_TYPE + " = ? ";
- final String[] selectionArgs = new String[]{String.valueOf(type)};
+ final SQLiteDatabase db = mDatabaseHelper.getReadableDatabase();
+ final String[] projection = {ActionColumns.UID, ActionColumns.TIME_STAMP_MS};
+ final String selection = ActionColumns.ACTION_TYPE + " = ? ";
+ final String[] selectionArgs = new String[]{String.valueOf(type)};
- try (Cursor cursor = db.query(TABLE_ACTION, projection, selection, selectionArgs,
- null /* groupBy */, null /* having */, null /* orderBy */)) {
- final int uidIndex = cursor.getColumnIndex(ActionColumns.UID);
- final int timestampIndex = cursor.getColumnIndex(ActionColumns.TIME_STAMP_MS);
+ try (Cursor cursor = db.query(TABLE_ACTION, projection, selection, selectionArgs,
+ null /* groupBy */, null /* having */, null /* orderBy */)) {
+ final int uidIndex = cursor.getColumnIndex(ActionColumns.UID);
+ final int timestampIndex = cursor.getColumnIndex(ActionColumns.TIME_STAMP_MS);
- while (cursor.moveToNext()) {
- final int uid = cursor.getInt(uidIndex);
- final long timeStamp = cursor.getLong(timestampIndex);
- timeStamps.append(uid, timeStamp);
- }
+ while (cursor.moveToNext()) {
+ final int uid = cursor.getInt(uidIndex);
+ final long timeStamp = cursor.getLong(timestampIndex);
+ timeStamps.append(uid, timeStamp);
}
}
@@ -196,14 +193,14 @@
*/
public synchronized boolean insertAction(@AnomalyDatabaseHelper.ActionType int type,
int uid, String packageName, long timestampMs) {
- try (SQLiteDatabase db = mDatabaseHelper.getWritableDatabase()) {
- final ContentValues values = new ContentValues();
- values.put(ActionColumns.UID, uid);
- values.put(ActionColumns.PACKAGE_NAME, packageName);
- values.put(ActionColumns.ACTION_TYPE, type);
- values.put(ActionColumns.TIME_STAMP_MS, timestampMs);
- return db.insertWithOnConflict(TABLE_ACTION, null, values, CONFLICT_REPLACE) != -1;
- }
+ final SQLiteDatabase db = mDatabaseHelper.getWritableDatabase();
+ final ContentValues values = new ContentValues();
+ values.put(ActionColumns.UID, uid);
+ values.put(ActionColumns.PACKAGE_NAME, packageName);
+ values.put(ActionColumns.ACTION_TYPE, type);
+ values.put(ActionColumns.TIME_STAMP_MS, timestampMs);
+
+ return db.insertWithOnConflict(TABLE_ACTION, null, values, CONFLICT_REPLACE) != -1;
}
/**
@@ -211,14 +208,13 @@
*/
public synchronized boolean deleteAction(@AnomalyDatabaseHelper.ActionType int type,
int uid, String packageName) {
- try (SQLiteDatabase db = mDatabaseHelper.getWritableDatabase()) {
- final String where =
- ActionColumns.ACTION_TYPE + " = ? AND " + ActionColumns.UID + " = ? AND "
- + ActionColumns.PACKAGE_NAME + " = ? ";
- final String[] whereArgs = new String[]{String.valueOf(type), String.valueOf(uid),
- String.valueOf(packageName)};
+ SQLiteDatabase db = mDatabaseHelper.getWritableDatabase();
+ final String where =
+ ActionColumns.ACTION_TYPE + " = ? AND " + ActionColumns.UID + " = ? AND "
+ + ActionColumns.PACKAGE_NAME + " = ? ";
+ final String[] whereArgs = new String[]{String.valueOf(type), String.valueOf(uid),
+ String.valueOf(packageName)};
- return db.delete(TABLE_ACTION, where, whereArgs) != 0;
- }
+ return db.delete(TABLE_ACTION, where, whereArgs) != 0;
}
}
diff --git a/src/com/android/settings/gestures/WakeScreenGesturePreferenceController.java b/src/com/android/settings/gestures/WakeScreenGesturePreferenceController.java
deleted file mode 100644
index e9d03d7..0000000
--- a/src/com/android/settings/gestures/WakeScreenGesturePreferenceController.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- * 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.
- */
-
-package com.android.settings.gestures;
-
-import static android.provider.Settings.Secure.DOZE_WAKE_SCREEN_GESTURE;
-
-import android.annotation.UserIdInt;
-import android.content.Context;
-import android.hardware.display.AmbientDisplayConfiguration;
-import android.os.UserHandle;
-import android.provider.Settings;
-import android.text.TextUtils;
-
-import com.android.internal.annotations.VisibleForTesting;
-import com.android.settings.aware.AwareFeatureProvider;
-import com.android.settings.overlay.FeatureFactory;
-
-public class WakeScreenGesturePreferenceController extends GesturePreferenceController {
-
- private static final int ON = 1;
- private static final int OFF = 0;
-
- private static final String PREF_KEY_VIDEO = "gesture_wake_screen_video";
-
- private final AwareFeatureProvider mFeatureProvider;
- private AmbientDisplayConfiguration mAmbientConfig;
- @UserIdInt
- private final int mUserId;
-
- public WakeScreenGesturePreferenceController(Context context, String key) {
- super(context, key);
- mUserId = UserHandle.myUserId();
- mFeatureProvider = FeatureFactory.getFactory(context).getAwareFeatureProvider();
- }
-
- @Override
- public int getAvailabilityStatus() {
- if (!getAmbientConfig().wakeScreenGestureAvailable()
- || !mFeatureProvider.isSupported(mContext)) {
- return UNSUPPORTED_ON_DEVICE;
- }
-
- if (!mFeatureProvider.isEnabled(mContext)) {
- return CONDITIONALLY_UNAVAILABLE;
- }
-
- return getAmbientConfig().alwaysOnEnabled(mUserId)
- ? AVAILABLE : DISABLED_DEPENDENT_SETTING;
- }
-
- @Override
- protected boolean canHandleClicks() {
- return getAmbientConfig().alwaysOnEnabled(mUserId);
- }
-
- @Override
- public boolean isSliceable() {
- return TextUtils.equals(getPreferenceKey(), "gesture_wake_screen");
- }
-
- @Override
- protected String getVideoPrefKey() {
- return PREF_KEY_VIDEO;
- }
-
- @Override
- public boolean isChecked() {
- return getAmbientConfig().wakeScreenGestureEnabled(mUserId);
- }
-
- @Override
- public boolean setChecked(boolean isChecked) {
- return Settings.Secure.putInt(mContext.getContentResolver(), DOZE_WAKE_SCREEN_GESTURE,
- isChecked ? ON : OFF);
- }
-
- private AmbientDisplayConfiguration getAmbientConfig() {
- if (mAmbientConfig == null) {
- mAmbientConfig = new AmbientDisplayConfiguration(mContext);
- }
-
- return mAmbientConfig;
- }
-
- @VisibleForTesting
- public void setConfig(AmbientDisplayConfiguration config) {
- mAmbientConfig = config;
- }
-}
diff --git a/src/com/android/settings/homepage/contextualcards/ContextualCardLoader.java b/src/com/android/settings/homepage/contextualcards/ContextualCardLoader.java
index 1f5f7dd..32f505e 100644
--- a/src/com/android/settings/homepage/contextualcards/ContextualCardLoader.java
+++ b/src/com/android/settings/homepage/contextualcards/ContextualCardLoader.java
@@ -17,8 +17,8 @@
package com.android.settings.homepage.contextualcards;
import static com.android.settings.slices.CustomSliceRegistry.BLUETOOTH_DEVICES_SLICE_URI;
+import static com.android.settings.slices.CustomSliceRegistry.CONTEXTUAL_NOTIFICATION_CHANNEL_SLICE_URI;
import static com.android.settings.slices.CustomSliceRegistry.CONTEXTUAL_WIFI_SLICE_URI;
-import static com.android.settings.slices.CustomSliceRegistry.NOTIFICATION_CHANNEL_SLICE_URI;
import android.content.Context;
import android.database.ContentObserver;
@@ -208,7 +208,7 @@
private boolean isLargeCard(ContextualCard card) {
return card.getSliceUri().equals(CONTEXTUAL_WIFI_SLICE_URI)
|| card.getSliceUri().equals(BLUETOOTH_DEVICES_SLICE_URI)
- || card.getSliceUri().equals(NOTIFICATION_CHANNEL_SLICE_URI);
+ || card.getSliceUri().equals(CONTEXTUAL_NOTIFICATION_CHANNEL_SLICE_URI);
}
public interface CardContentLoaderListener {
diff --git a/src/com/android/settings/homepage/contextualcards/ContextualCardManager.java b/src/com/android/settings/homepage/contextualcards/ContextualCardManager.java
index 7df322d..92108f0 100644
--- a/src/com/android/settings/homepage/contextualcards/ContextualCardManager.java
+++ b/src/com/android/settings/homepage/contextualcards/ContextualCardManager.java
@@ -43,6 +43,8 @@
import com.android.settingslib.core.lifecycle.Lifecycle;
import com.android.settingslib.core.lifecycle.LifecycleObserver;
import com.android.settingslib.core.lifecycle.events.OnSaveInstanceState;
+import com.android.settingslib.core.lifecycle.events.OnStart;
+import com.android.settingslib.core.lifecycle.events.OnStop;
import java.util.ArrayList;
import java.util.List;
@@ -98,7 +100,6 @@
mLifecycleObservers = new ArrayList<>();
mControllerRendererPool = new ControllerRendererPool();
mLifecycle.addObserver(this);
-
if (savedInstanceState == null) {
mIsFirstLaunch = true;
mSavedCards = null;
@@ -240,6 +241,21 @@
outState.putStringArrayList(KEY_CONTEXTUAL_CARDS, cards);
}
+ public void onWindowFocusChanged(boolean hasWindowFocus) {
+ // Duplicate a list to avoid java.util.ConcurrentModificationException.
+ final List<ContextualCard> cards = new ArrayList<>(mContextualCards);
+ for (ContextualCard card : cards) {
+ final ContextualCardController controller = mControllerRendererPool
+ .getController(mContext, card.getCardType());
+ if (hasWindowFocus && controller instanceof OnStart) {
+ ((OnStart) controller).onStart();
+ }
+ if (!hasWindowFocus && controller instanceof OnStop) {
+ ((OnStop) controller).onStop();
+ }
+ }
+ }
+
public ControllerRendererPool getControllerRendererPool() {
return mControllerRendererPool;
}
diff --git a/src/com/android/settings/homepage/contextualcards/ContextualCardsFragment.java b/src/com/android/settings/homepage/contextualcards/ContextualCardsFragment.java
index 72ddb50..bd25866 100644
--- a/src/com/android/settings/homepage/contextualcards/ContextualCardsFragment.java
+++ b/src/com/android/settings/homepage/contextualcards/ContextualCardsFragment.java
@@ -27,17 +27,17 @@
import androidx.loader.app.LoaderManager;
import androidx.recyclerview.widget.GridLayoutManager;
-import androidx.recyclerview.widget.RecyclerView;
import com.android.settings.R;
import com.android.settings.core.InstrumentedFragment;
import com.android.settings.overlay.FeatureFactory;
-public class ContextualCardsFragment extends InstrumentedFragment {
+public class ContextualCardsFragment extends InstrumentedFragment implements
+ FocusRecyclerView.FocusListener {
private static final String TAG = "ContextualCardsFragment";
- private RecyclerView mCardsContainer;
+ private FocusRecyclerView mCardsContainer;
private GridLayoutManager mLayoutManager;
private ContextualCardsAdapter mContextualCardsAdapter;
private ContextualCardManager mContextualCardManager;
@@ -72,11 +72,17 @@
this /* lifecycleOwner */, mContextualCardManager);
mCardsContainer.setAdapter(mContextualCardsAdapter);
mContextualCardManager.setListener(mContextualCardsAdapter);
+ mCardsContainer.setListener(this);
return rootView;
}
@Override
+ public void onWindowFocusChanged(boolean hasWindowFocus) {
+ mContextualCardManager.onWindowFocusChanged(hasWindowFocus);
+ }
+
+ @Override
public int getMetricsCategory() {
return SettingsEnums.SETTINGS_HOMEPAGE;
}
diff --git a/src/com/android/settings/homepage/contextualcards/FocusRecyclerView.java b/src/com/android/settings/homepage/contextualcards/FocusRecyclerView.java
new file mode 100644
index 0000000..a2ec9af
--- /dev/null
+++ b/src/com/android/settings/homepage/contextualcards/FocusRecyclerView.java
@@ -0,0 +1,36 @@
+package com.android.settings.homepage.contextualcards;
+
+import android.content.Context;
+import android.util.AttributeSet;
+
+import androidx.annotation.Nullable;
+import androidx.recyclerview.widget.RecyclerView;
+
+public class FocusRecyclerView extends RecyclerView {
+
+ private FocusListener mListener;
+
+ public FocusRecyclerView(Context context) {
+ super(context);
+ }
+
+ public FocusRecyclerView(Context context, @Nullable AttributeSet attrs) {
+ super(context, attrs);
+ }
+
+ @Override
+ public void onWindowFocusChanged(boolean hasWindowFocus) {
+ super.onWindowFocusChanged(hasWindowFocus);
+ if (mListener != null) {
+ mListener.onWindowFocusChanged(hasWindowFocus);
+ }
+ }
+
+ public void setListener(FocusListener listener) {
+ mListener = listener;
+ }
+
+ public interface FocusListener {
+ void onWindowFocusChanged(boolean hasWindowFocus);
+ }
+}
diff --git a/src/com/android/settings/homepage/contextualcards/SettingsContextualCardProvider.java b/src/com/android/settings/homepage/contextualcards/SettingsContextualCardProvider.java
index 7bbe430..86fee03 100644
--- a/src/com/android/settings/homepage/contextualcards/SettingsContextualCardProvider.java
+++ b/src/com/android/settings/homepage/contextualcards/SettingsContextualCardProvider.java
@@ -56,10 +56,12 @@
.setCardName(CustomSliceRegistry.BATTERY_FIX_SLICE_URI.toString())
.setCardCategory(ContextualCard.Category.IMPORTANT)
.build();
+ final String contextualNotificationChannelSliceUri =
+ CustomSliceRegistry.CONTEXTUAL_NOTIFICATION_CHANNEL_SLICE_URI.toString();
final ContextualCard notificationChannelCard =
ContextualCard.newBuilder()
- .setSliceUri(CustomSliceRegistry.NOTIFICATION_CHANNEL_SLICE_URI.toString())
- .setCardName(CustomSliceRegistry.NOTIFICATION_CHANNEL_SLICE_URI.toString())
+ .setSliceUri(contextualNotificationChannelSliceUri)
+ .setCardName(contextualNotificationChannelSliceUri)
.setCardCategory(ContextualCard.Category.POSSIBLE)
.build();
final ContextualCardList cards = ContextualCardList.newBuilder()
@@ -72,4 +74,4 @@
return cards;
}
-}
\ No newline at end of file
+}
diff --git a/src/com/android/settings/homepage/contextualcards/slices/BluetoothDevicesSlice.java b/src/com/android/settings/homepage/contextualcards/slices/BluetoothDevicesSlice.java
index 99fe219..a760eff 100644
--- a/src/com/android/settings/homepage/contextualcards/slices/BluetoothDevicesSlice.java
+++ b/src/com/android/settings/homepage/contextualcards/slices/BluetoothDevicesSlice.java
@@ -46,7 +46,6 @@
import com.android.settings.slices.CustomSliceable;
import com.android.settings.slices.SliceBroadcastReceiver;
import com.android.settings.slices.SliceBuilderUtils;
-import com.android.settingslib.bluetooth.BluetoothUtils;
import com.android.settingslib.bluetooth.CachedBluetoothDevice;
import com.android.settingslib.bluetooth.LocalBluetoothManager;
@@ -211,8 +210,9 @@
@VisibleForTesting
IconCompat getBluetoothDeviceIcon(CachedBluetoothDevice device) {
- final Pair<Drawable, String> pair = BluetoothUtils
- .getBtClassDrawableWithDescription(mContext, device);
+ final Pair<Drawable, String> pair =
+ com.android.settings.bluetooth.Utils.getBtRainbowDrawableWithDescription(mContext,
+ device);
final Drawable drawable = pair.first;
// Use default bluetooth icon if can't get icon.
@@ -221,14 +221,6 @@
com.android.internal.R.drawable.ic_settings_bluetooth);
}
- // Tint icon: Accent color for connected state; Disable color for busy state.
- @ColorInt int color = Utils.getColorAccentDefaultColor(mContext);
- if (device.isBusy()) {
- color = Utils.getDisabled(mContext,
- Utils.getColorAttrDefaultColor(mContext, android.R.attr.colorControlNormal));
- }
- drawable.setColorFilter(new PorterDuffColorFilter(color, PorterDuff.Mode.SRC_IN));
-
return Utils.createIconWithDrawable(drawable);
}
diff --git a/src/com/android/settings/homepage/contextualcards/slices/ContextualNotificationChannelSlice.java b/src/com/android/settings/homepage/contextualcards/slices/ContextualNotificationChannelSlice.java
new file mode 100644
index 0000000..2025a06
--- /dev/null
+++ b/src/com/android/settings/homepage/contextualcards/slices/ContextualNotificationChannelSlice.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.homepage.contextualcards.slices;
+
+import android.content.Context;
+import android.net.Uri;
+
+import com.android.settings.R;
+import com.android.settings.slices.CustomSliceRegistry;
+
+public class ContextualNotificationChannelSlice extends NotificationChannelSlice {
+
+ public ContextualNotificationChannelSlice(Context context) {
+ super(context);
+ }
+
+ @Override
+ public Uri getUri() {
+ return CustomSliceRegistry.CONTEXTUAL_NOTIFICATION_CHANNEL_SLICE_URI;
+ }
+
+ @Override
+ protected CharSequence getSubTitle(String packageName, int uid) {
+ return mContext.getText(R.string.recently_installed_app);
+ }
+}
diff --git a/src/com/android/settings/homepage/contextualcards/slices/NotificationChannelSlice.java b/src/com/android/settings/homepage/contextualcards/slices/NotificationChannelSlice.java
index ae8b80a..c319dca 100644
--- a/src/com/android/settings/homepage/contextualcards/slices/NotificationChannelSlice.java
+++ b/src/com/android/settings/homepage/contextualcards/slices/NotificationChannelSlice.java
@@ -128,7 +128,7 @@
return leftChannel.getId().compareTo(rightChannel.getId());
};
- private final Context mContext;
+ protected final Context mContext;
@VisibleForTesting
NotificationBackend mNotificationBackend;
private String mPackageName;
@@ -413,7 +413,7 @@
return maxSentCountPackage;
}
- private CharSequence getSubTitle(String packageName, int uid) {
+ protected CharSequence getSubTitle(String packageName, int uid) {
final int channelCount = mNotificationBackend.getChannelCount(packageName, uid);
if (channelCount > DEFAULT_EXPANDED_ROW_COUNT) {
diff --git a/src/com/android/settings/homepage/contextualcards/slices/SliceFullCardRendererHelper.java b/src/com/android/settings/homepage/contextualcards/slices/SliceFullCardRendererHelper.java
index ee63536..ef0a67d 100644
--- a/src/com/android/settings/homepage/contextualcards/slices/SliceFullCardRendererHelper.java
+++ b/src/com/android/settings/homepage/contextualcards/slices/SliceFullCardRendererHelper.java
@@ -16,7 +16,6 @@
package com.android.settings.homepage.contextualcards.slices;
-import android.animation.LayoutTransition;
import android.content.Context;
import android.view.View;
@@ -95,7 +94,6 @@
public SliceViewHolder(View view) {
super(view);
sliceView = view.findViewById(R.id.slice_view);
- sliceView.getLayoutTransition().enableTransitionType(LayoutTransition.CHANGING);
}
}
}
diff --git a/src/com/android/settings/location/RecentLocationAccessPreferenceController.java b/src/com/android/settings/location/RecentLocationAccessPreferenceController.java
index a76d381..e4c64f7 100644
--- a/src/com/android/settings/location/RecentLocationAccessPreferenceController.java
+++ b/src/com/android/settings/location/RecentLocationAccessPreferenceController.java
@@ -104,7 +104,7 @@
.setOnClickListener((v) -> {
final Intent intent = new Intent(Intent.ACTION_MANAGE_APP_PERMISSION);
intent.putExtra(Intent.EXTRA_PERMISSION_NAME,
- Manifest.permission_group.LOCATION);
+ Manifest.permission.ACCESS_FINE_LOCATION);
intent.putExtra(Intent.EXTRA_PACKAGE_NAME, access.packageName);
intent.putExtra(Intent.EXTRA_USER, access.userHandle);
mContext.startActivity(intent);
diff --git a/src/com/android/settings/notification/AssistantCapabilityPreferenceController.java b/src/com/android/settings/notification/AssistantCapabilityPreferenceController.java
new file mode 100644
index 0000000..be90a04
--- /dev/null
+++ b/src/com/android/settings/notification/AssistantCapabilityPreferenceController.java
@@ -0,0 +1,75 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.notification;
+
+import android.content.Context;
+import android.os.UserHandle;
+import android.service.notification.Adjustment;
+
+import com.android.settings.core.TogglePreferenceController;
+
+import com.google.common.annotations.VisibleForTesting;
+
+import java.util.List;
+
+public class AssistantCapabilityPreferenceController extends TogglePreferenceController {
+
+ static final String PRIORITIZER_KEY = "asst_capability_prioritizer";
+ static final String SMART_KEY = "asst_capabilities_actions_replies";
+ private NotificationBackend mBackend;
+
+ public AssistantCapabilityPreferenceController(Context context, String key) {
+ super(context, key);
+ mBackend = new NotificationBackend();
+ }
+
+ @VisibleForTesting
+ void setBackend(NotificationBackend backend) {
+ mBackend = backend;
+ }
+
+ @Override
+ public boolean isChecked() {
+ List<String> capabilities = mBackend.getAssistantCapabilities(mContext.getPackageName());
+ if (PRIORITIZER_KEY.equals(getPreferenceKey())) {
+ return capabilities.contains(Adjustment.KEY_IMPORTANCE);
+ } else if (SMART_KEY.equals(getPreferenceKey())) {
+ return capabilities.contains(Adjustment.KEY_CONTEXTUAL_ACTIONS)
+ && capabilities.contains(Adjustment.KEY_TEXT_REPLIES);
+ }
+ return false;
+ }
+
+ @Override
+ public boolean setChecked(boolean isChecked) {
+ if (PRIORITIZER_KEY.equals(getPreferenceKey())) {
+ mBackend.allowAssistantCapability(Adjustment.KEY_IMPORTANCE, isChecked);
+ } else if (SMART_KEY.equals(getPreferenceKey())) {
+ mBackend.allowAssistantCapability(Adjustment.KEY_CONTEXTUAL_ACTIONS, isChecked);
+ mBackend.allowAssistantCapability(Adjustment.KEY_TEXT_REPLIES, isChecked);
+ }
+ return true;
+ }
+
+ @Override
+ public int getAvailabilityStatus() {
+ return mBackend.getAllowedNotificationAssistant() != null
+ ? AVAILABLE : DISABLED_DEPENDENT_SETTING;
+ }
+}
+
+
diff --git a/src/com/android/settings/notification/NotificationBackend.java b/src/com/android/settings/notification/NotificationBackend.java
index ba07438..4227050 100644
--- a/src/com/android/settings/notification/NotificationBackend.java
+++ b/src/com/android/settings/notification/NotificationBackend.java
@@ -339,6 +339,27 @@
}
}
+ public void allowAssistantCapability(String capability, boolean allowed) {
+ try {
+ if (allowed) {
+ sINM.allowAssistantCapability(capability);
+ } else {
+ sINM.disallowAssistantCapability(capability);
+ }
+ } catch (Exception e) {
+ Log.w(TAG, "Error calling NoMan", e);
+ }
+ }
+
+ public List<String> getAssistantCapabilities(String pkg) {
+ try {
+ return sINM.getAllowedAssistantCapabilities(pkg);
+ } catch (Exception e) {
+ Log.w(TAG, "Error calling NoMan", e);
+ }
+ return new ArrayList<>();
+ }
+
protected void recordAggregatedUsageEvents(Context context, AppRow appRow) {
long now = System.currentTimeMillis();
long startTime = now - (DateUtils.DAY_IN_MILLIS * DAYS_TO_CHECK);
diff --git a/src/com/android/settings/panel/PanelFragment.java b/src/com/android/settings/panel/PanelFragment.java
index a222d36..20421d0 100644
--- a/src/com/android/settings/panel/PanelFragment.java
+++ b/src/com/android/settings/panel/PanelFragment.java
@@ -48,16 +48,11 @@
private RecyclerView mPanelSlices;
private PanelContent mPanel;
- private final MetricsFeatureProvider mMetricsProvider;
+ private MetricsFeatureProvider mMetricsProvider;
@VisibleForTesting
PanelSlicesAdapter mAdapter;
- public PanelFragment() {
- final Context context = getActivity();
- mMetricsProvider = FeatureFactory.getFactory(context).getMetricsFeatureProvider();
- }
-
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
@@ -83,6 +78,7 @@
.getPanelFeatureProvider()
.getPanel(activity, panelType, mediaPackageName);
+ mMetricsProvider = FeatureFactory.getFactory(activity).getMetricsFeatureProvider();
// Log panel opened.
mMetricsProvider.action(
0 /* attribution */,
diff --git a/src/com/android/settings/privacy/PermissionBarChartPreferenceController.java b/src/com/android/settings/privacy/PermissionBarChartPreferenceController.java
index 704d1e5..7c55b51 100644
--- a/src/com/android/settings/privacy/PermissionBarChartPreferenceController.java
+++ b/src/com/android/settings/privacy/PermissionBarChartPreferenceController.java
@@ -182,10 +182,10 @@
return barViewInfos;
}
- private Drawable getPermissionGroupIcon(CharSequence permissionGroup) {
+ private Drawable getPermissionGroupIcon(String permissionGroup) {
Drawable icon = null;
try {
- icon = mPackageManager.getPermissionGroupInfo(permissionGroup.toString(), 0)
+ icon = mPackageManager.getPermissionGroupInfo(permissionGroup, 0)
.loadIcon(mPackageManager);
icon.setTintList(Utils.getColorAttr(mContext, android.R.attr.textColorSecondary));
} catch (PackageManager.NameNotFoundException e) {
@@ -195,10 +195,10 @@
return icon;
}
- private CharSequence getPermissionGroupLabel(CharSequence permissionGroup) {
+ private CharSequence getPermissionGroupLabel(String permissionGroup) {
CharSequence label = null;
try {
- label = mPackageManager.getPermissionGroupInfo(permissionGroup.toString(), 0)
+ label = mPackageManager.getPermissionGroupInfo(permissionGroup, 0)
.loadLabel(mPackageManager);
} catch (PackageManager.NameNotFoundException e) {
Log.w(TAG, "Cannot find group label for " + permissionGroup, e);
diff --git a/src/com/android/settings/sim/SimSettings.java b/src/com/android/settings/sim/SimSettings.java
index b646b3b..e43c6a5 100644
--- a/src/com/android/settings/sim/SimSettings.java
+++ b/src/com/android/settings/sim/SimSettings.java
@@ -220,7 +220,7 @@
Log.d(TAG, "Register for call state change");
for (int i = 0; i < mPhoneCount; i++) {
int subId = mSelectableSubInfos.get(i).getSubscriptionId();
- tm.listen(getPhoneStateListener(i, subId),
+ tm.createForSubscriptionId(subId).listen(getPhoneStateListener(i),
PhoneStateListener.LISTEN_CALL_STATE);
}
}
@@ -239,13 +239,13 @@
}
}
- private PhoneStateListener getPhoneStateListener(int phoneId, int subId) {
+ private PhoneStateListener getPhoneStateListener(int phoneId) {
// Disable Sim selection for Data when voice call is going on as changing the default data
// sim causes a modem reset currently and call gets disconnected
// ToDo : Add subtext on disabled preference to let user know that default data sim cannot
// be changed while call is going on
final int i = phoneId;
- mPhoneStateListener[phoneId] = new PhoneStateListener(subId) {
+ mPhoneStateListener[phoneId] = new PhoneStateListener() {
@Override
public void onCallStateChanged(int state, String incomingNumber) {
if (DBG) log("PhoneStateListener.onCallStateChanged: state=" + state);
diff --git a/src/com/android/settings/slices/CustomSliceRegistry.java b/src/com/android/settings/slices/CustomSliceRegistry.java
index 6b1ead7..fe000d1 100644
--- a/src/com/android/settings/slices/CustomSliceRegistry.java
+++ b/src/com/android/settings/slices/CustomSliceRegistry.java
@@ -36,6 +36,7 @@
import com.android.settings.homepage.contextualcards.deviceinfo.StorageSlice;
import com.android.settings.homepage.contextualcards.slices.BatteryFixSlice;
import com.android.settings.homepage.contextualcards.slices.BluetoothDevicesSlice;
+import com.android.settings.homepage.contextualcards.slices.ContextualNotificationChannelSlice;
import com.android.settings.homepage.contextualcards.slices.LowStorageSlice;
import com.android.settings.homepage.contextualcards.slices.NotificationChannelSlice;
import com.android.settings.location.LocationSlice;
@@ -95,6 +96,16 @@
.build();
/**
+ * Backing Uri for Contextual Notification channel Slice.
+ */
+ public static final Uri CONTEXTUAL_NOTIFICATION_CHANNEL_SLICE_URI = new Uri.Builder()
+ .scheme(ContentResolver.SCHEME_CONTENT)
+ .authority(SettingsSliceProvider.SLICE_AUTHORITY)
+ .appendPath(SettingsSlicesContract.PATH_SETTING_ACTION)
+ .appendPath("contextual_notification_channel")
+ .build();
+
+ /**
* Backing Uri for the Wifi Slice.
*/
public static final Uri CONTEXTUAL_WIFI_SLICE_URI = new Uri.Builder()
@@ -318,6 +329,8 @@
sUriToSlice.put(BATTERY_FIX_SLICE_URI, BatteryFixSlice.class);
sUriToSlice.put(BLUETOOTH_DEVICES_SLICE_URI, BluetoothDevicesSlice.class);
+ sUriToSlice.put(CONTEXTUAL_NOTIFICATION_CHANNEL_SLICE_URI,
+ ContextualNotificationChannelSlice.class);
sUriToSlice.put(CONTEXTUAL_WIFI_SLICE_URI, ContextualWifiSlice.class);
sUriToSlice.put(DATA_USAGE_SLICE_URI, DataUsageSlice.class);
sUriToSlice.put(DEVICE_INFO_SLICE_URI, DeviceInfoSlice.class);
diff --git a/src/com/android/settings/slices/SettingsSliceProvider.java b/src/com/android/settings/slices/SettingsSliceProvider.java
index 3187d10..3bdcb13 100644
--- a/src/com/android/settings/slices/SettingsSliceProvider.java
+++ b/src/com/android/settings/slices/SettingsSliceProvider.java
@@ -28,12 +28,12 @@
import android.provider.SettingsSlicesContract;
import android.text.TextUtils;
import android.util.ArrayMap;
-import android.util.ArraySet;
import android.util.KeyValueListParser;
import android.util.Log;
import android.util.Pair;
import androidx.annotation.VisibleForTesting;
+import androidx.collection.ArraySet;
import androidx.slice.Slice;
import androidx.slice.SliceProvider;
@@ -53,7 +53,6 @@
import java.util.Map;
import java.util.Set;
import java.util.WeakHashMap;
-import java.util.concurrent.ConcurrentHashMap;
/**
* A {@link SliceProvider} for Settings to enabled inline results in system apps.
@@ -123,9 +122,6 @@
@VisibleForTesting
Map<Uri, SliceData> mSliceWeakDataCache;
- @VisibleForTesting
- Map<Uri, SliceData> mSliceDataCache;
-
final Map<Uri, SliceBackgroundWorker> mPinnedWorkers = new ArrayMap<>();
public SettingsSliceProvider() {
@@ -135,7 +131,6 @@
@Override
public boolean onCreateSliceProvider() {
mSlicesDatabaseAccessor = new SlicesDatabaseAccessor(getContext());
- mSliceDataCache = new ConcurrentHashMap<>();
mSliceWeakDataCache = new WeakHashMap<>();
return true;
}
@@ -170,7 +165,6 @@
public void onSliceUnpinned(Uri sliceUri) {
SliceBroadcastRelay.unregisterReceivers(getContext(), sliceUri);
ThreadUtils.postOnMainThread(() -> stopBackgroundWorker(sliceUri));
- mSliceDataCache.remove(sliceUri);
}
@Override
@@ -226,7 +220,7 @@
}
// Remove the SliceData from the cache after it has been used to prevent a memory-leak.
- if (!mSliceDataCache.containsKey(sliceUri)) {
+ if (!getPinnedSlices().contains(sliceUri)) {
mSliceWeakDataCache.remove(sliceUri);
}
return SliceBuilderUtils.buildSlice(getContext(), cachedSliceData);
@@ -396,11 +390,6 @@
ThreadUtils.postOnMainThread(() -> startBackgroundWorker(controller, uri));
- final List<Uri> pinnedSlices = getContext().getSystemService(
- SliceManager.class).getPinnedSlices();
- if (pinnedSlices.contains(uri)) {
- mSliceDataCache.put(uri, sliceData);
- }
mSliceWeakDataCache.put(uri, sliceData);
getContext().getContentResolver().notifyChange(uri, null /* content observer */);
diff --git a/src/com/android/settings/widget/AdaptiveHomepageIcon.java b/src/com/android/settings/widget/AdaptiveIcon.java
similarity index 76%
rename from src/com/android/settings/widget/AdaptiveHomepageIcon.java
rename to src/com/android/settings/widget/AdaptiveIcon.java
index bc7aaa7..04b33ae 100644
--- a/src/com/android/settings/widget/AdaptiveHomepageIcon.java
+++ b/src/com/android/settings/widget/AdaptiveIcon.java
@@ -35,14 +35,15 @@
import com.android.settings.homepage.AdaptiveIconShapeDrawable;
import com.android.settingslib.drawer.Tile;
-public class AdaptiveHomepageIcon extends LayerDrawable {
+public class AdaptiveIcon extends LayerDrawable {
private static final String TAG = "AdaptiveHomepageIcon";
@VisibleForTesting(otherwise = NONE)
int mBackgroundColor = -1;
+ private AdaptiveConstantState mAdaptiveConstantState;
- public AdaptiveHomepageIcon(Context context, Drawable foreground) {
+ public AdaptiveIcon(Context context, Drawable foreground) {
super(new Drawable[]{
new AdaptiveIconShapeDrawable(context.getResources()),
foreground
@@ -50,6 +51,7 @@
final int insetPx = context.getResources()
.getDimensionPixelSize(R.dimen.dashboard_tile_foreground_image_inset);
setLayerInset(1 /* index */, insetPx, insetPx, insetPx, insetPx);
+ mAdaptiveConstantState = new AdaptiveConstantState(context, foreground);
}
public void setBackgroundColor(Context context, Tile tile) {
@@ -85,5 +87,36 @@
mBackgroundColor = color;
getDrawable(0).setColorFilter(color, PorterDuff.Mode.SRC_ATOP);
Log.d(TAG, "Setting background color " + mBackgroundColor);
+ mAdaptiveConstantState.color = color;
+ }
+
+ @Override
+ public ConstantState getConstantState() {
+ return mAdaptiveConstantState;
+ }
+
+ @VisibleForTesting
+ static class AdaptiveConstantState extends ConstantState {
+ Context context;
+ Drawable drawable;
+ int color;
+
+ public AdaptiveConstantState(Context context, Drawable drawable) {
+ this.context = context;
+ this.drawable = drawable;
+ }
+
+ @Override
+ public Drawable newDrawable() {
+ final AdaptiveIcon icon = new AdaptiveIcon(context, drawable);
+ icon.setBackgroundColor(color);
+
+ return icon;
+ }
+
+ @Override
+ public int getChangingConfigurations() {
+ return 0;
+ }
}
}
diff --git a/src/com/android/settings/widget/AppCheckBoxPreference.java b/src/com/android/settings/widget/AppCheckBoxPreference.java
index e56efd9..3ce67eb 100644
--- a/src/com/android/settings/widget/AppCheckBoxPreference.java
+++ b/src/com/android/settings/widget/AppCheckBoxPreference.java
@@ -21,7 +21,6 @@
import android.util.AttributeSet;
import android.view.View;
import android.widget.LinearLayout;
-import android.widget.TextView;
import androidx.preference.CheckBoxPreference;
import androidx.preference.PreferenceViewHolder;
@@ -46,11 +45,6 @@
public void onBindViewHolder(PreferenceViewHolder holder) {
super.onBindViewHolder(holder);
- final TextView appendix = (TextView) holder.findViewById(R.id.appendix);
- if (appendix != null) {
- appendix.setVisibility(View.GONE);
- }
-
final LinearLayout layout = (LinearLayout) holder.findViewById(R.id.summary_container);
if (layout != null) {
// If summary doesn't exist, make it gone
diff --git a/src/com/android/settings/widget/AppSwitchPreference.java b/src/com/android/settings/widget/AppSwitchPreference.java
index 288096e..506ab76 100644
--- a/src/com/android/settings/widget/AppSwitchPreference.java
+++ b/src/com/android/settings/widget/AppSwitchPreference.java
@@ -17,10 +17,7 @@
package com.android.settings.widget;
import android.content.Context;
-import android.text.TextUtils;
-import android.view.View;
-import androidx.preference.PreferenceViewHolder;
import androidx.preference.SwitchPreference;
import com.android.settings.R;
@@ -31,12 +28,4 @@
super(context);
setLayoutResource(R.layout.preference_app);
}
-
- @Override
- public void onBindViewHolder(PreferenceViewHolder view) {
- super.onBindViewHolder(view);
-
- view.findViewById(R.id.summary_container)
- .setVisibility(TextUtils.isEmpty(getSummary()) ? View.GONE : View.VISIBLE);
- }
}
diff --git a/src/com/android/settings/wifi/AddWifiNetworkPreference.java b/src/com/android/settings/wifi/AddWifiNetworkPreference.java
index cd2e4a8..e49f2ab 100644
--- a/src/com/android/settings/wifi/AddWifiNetworkPreference.java
+++ b/src/com/android/settings/wifi/AddWifiNetworkPreference.java
@@ -20,7 +20,6 @@
import android.content.res.Resources;
import android.graphics.drawable.Drawable;
import android.util.Log;
-import android.view.View;
import android.widget.ImageButton;
import androidx.annotation.DrawableRes;
@@ -63,10 +62,6 @@
getContext().startActivity(
WifiDppUtils.getEnrolleeQrCodeScannerIntent(/* ssid */ null));
});
-
- final View divider = (View) holder.findViewById(
- com.android.settingslib.R.id.two_target_divider);
- divider.setVisibility(View.INVISIBLE);
}
}
diff --git a/src/com/android/settings/wifi/NetworkRequestDialogFragment.java b/src/com/android/settings/wifi/NetworkRequestDialogFragment.java
index bfd8d1c..e9057e6 100644
--- a/src/com/android/settings/wifi/NetworkRequestDialogFragment.java
+++ b/src/com/android/settings/wifi/NetworkRequestDialogFragment.java
@@ -124,7 +124,7 @@
final AlertDialog.Builder builder = new AlertDialog.Builder(context)
.setCustomTitle(customTitle)
.setAdapter(mDialogAdapter, this)
- .setNegativeButton(R.string.cancel, (dialog, which) -> getActivity().finish())
+ .setNegativeButton(R.string.cancel, (dialog, which) -> onCancel(dialog))
// Do nothings, will replace the onClickListener to avoid auto closing dialog.
.setNeutralButton(R.string.network_connection_request_dialog_showall,
null /* OnClickListener */);
@@ -225,6 +225,9 @@
if (getActivity() != null) {
getActivity().finish();
}
+ if (mUserSelectionCallback != null) {
+ mUserSelectionCallback.reject();
+ }
}
@Override
diff --git a/src/com/android/settings/wifi/WifiNoInternetDialog.java b/src/com/android/settings/wifi/WifiNoInternetDialog.java
index e12529d..e33cab6 100644
--- a/src/com/android/settings/wifi/WifiNoInternetDialog.java
+++ b/src/com/android/settings/wifi/WifiNoInternetDialog.java
@@ -17,6 +17,7 @@
package com.android.settings.wifi;
import static android.net.ConnectivityManager.ACTION_PROMPT_LOST_VALIDATION;
+import static android.net.ConnectivityManager.ACTION_PROMPT_PARTIAL_CONNECTIVITY;
import static android.net.ConnectivityManager.ACTION_PROMPT_UNVALIDATED;
import static android.net.NetworkCapabilities.NET_CAPABILITY_VALIDATED;
@@ -53,8 +54,9 @@
private String mAction;
private boolean isKnownAction(Intent intent) {
- return intent.getAction().equals(ACTION_PROMPT_UNVALIDATED) ||
- intent.getAction().equals(ACTION_PROMPT_LOST_VALIDATION);
+ return intent.getAction().equals(ACTION_PROMPT_UNVALIDATED)
+ || intent.getAction().equals(ACTION_PROMPT_LOST_VALIDATION)
+ || intent.getAction().equals(ACTION_PROMPT_PARTIAL_CONNECTIVITY);
}
@Override
@@ -131,6 +133,11 @@
ap.mMessage = getString(R.string.no_internet_access_text);
ap.mPositiveButtonText = getString(R.string.yes);
ap.mNegativeButtonText = getString(R.string.no);
+ } else if (ACTION_PROMPT_PARTIAL_CONNECTIVITY.equals(mAction)) {
+ ap.mTitle = mNetworkName;
+ ap.mMessage = getString(R.string.partial_connectivity_text);
+ ap.mPositiveButtonText = getString(R.string.yes);
+ ap.mNegativeButtonText = getString(R.string.no);
} else {
ap.mTitle = getString(R.string.lost_internet_access_title);
ap.mMessage = getString(R.string.lost_internet_access_text);
@@ -146,7 +153,8 @@
ap.mView = checkbox;
mAlwaysAllow = (CheckBox) checkbox.findViewById(com.android.internal.R.id.alwaysUse);
- if (ACTION_PROMPT_UNVALIDATED.equals(mAction)) {
+ if (ACTION_PROMPT_UNVALIDATED.equals(mAction)
+ || ACTION_PROMPT_PARTIAL_CONNECTIVITY.equals(mAction)) {
mAlwaysAllow.setText(getString(R.string.no_internet_access_remember));
} else {
mAlwaysAllow.setText(getString(R.string.lost_internet_access_persist));
@@ -174,6 +182,11 @@
final boolean accept = (which == BUTTON_POSITIVE);
action = (accept ? "Connect" : "Ignore");
mCM.setAcceptUnvalidated(mNetwork, accept, always);
+ } else if (ACTION_PROMPT_PARTIAL_CONNECTIVITY.equals(mAction)) {
+ what = "PARTIAL_CONNECTIVITY";
+ final boolean accept = (which == BUTTON_POSITIVE);
+ action = (accept ? "Connect" : "Ignore");
+ mCM.setAcceptPartialConnectivity(mNetwork, accept, always);
} else {
what = "LOST_INTERNET";
final boolean avoid = (which == BUTTON_POSITIVE);
diff --git a/src/com/android/settings/wifi/details/WifiDetailPreferenceController.java b/src/com/android/settings/wifi/details/WifiDetailPreferenceController.java
index 5588977..f328dba 100644
--- a/src/com/android/settings/wifi/details/WifiDetailPreferenceController.java
+++ b/src/com/android/settings/wifi/details/WifiDetailPreferenceController.java
@@ -16,6 +16,7 @@
package com.android.settings.wifi.details;
import static android.net.NetworkCapabilities.NET_CAPABILITY_CAPTIVE_PORTAL;
+import static android.net.NetworkCapabilities.NET_CAPABILITY_PARTIAL_CONNECTIVITY;
import static android.net.NetworkCapabilities.NET_CAPABILITY_VALIDATED;
import static android.net.NetworkCapabilities.TRANSPORT_WIFI;
@@ -210,12 +211,14 @@
@Override
public void onCapabilitiesChanged(Network network, NetworkCapabilities nc) {
- // If the network just validated or lost Internet access, refresh network state.
- // Don't do this on every NetworkCapabilities change because update accesspoint notify
- // changed for accesspoint changed on the main thread, which can cause jank.
+ // If the network just validated or lost Internet access or detected partial internet
+ // connectivity, refresh network state. Don't do this on every NetworkCapabilities
+ // change because refreshNetworkState sends IPCs to the system server from the UI
+ // thread, which can cause jank.
if (network.equals(mNetwork) && !nc.equals(mNetworkCapabilities)) {
- if (hasCapabilityChanged(nc, NET_CAPABILITY_VALIDATED) ||
- hasCapabilityChanged(nc, NET_CAPABILITY_CAPTIVE_PORTAL)) {
+ if (hasCapabilityChanged(nc, NET_CAPABILITY_VALIDATED)
+ || hasCapabilityChanged(nc, NET_CAPABILITY_CAPTIVE_PORTAL)
+ || hasCapabilityChanged(nc, NET_CAPABILITY_PARTIAL_CONNECTIVITY)) {
mAccessPoint.update(mWifiConfig, mWifiInfo, mNetworkInfo);
refreshEntityHeader();
}
diff --git a/src/com/android/settings/wifi/slice/WifiSlice.java b/src/com/android/settings/wifi/slice/WifiSlice.java
index 1c44204..0c95a23 100644
--- a/src/com/android/settings/wifi/slice/WifiSlice.java
+++ b/src/com/android/settings/wifi/slice/WifiSlice.java
@@ -33,6 +33,7 @@
import android.graphics.drawable.Drawable;
import android.net.NetworkInfo;
import android.net.NetworkInfo.State;
+import android.net.NetworkInfo.DetailedState;
import android.net.Uri;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
@@ -93,26 +94,7 @@
mContext.getTheme().applyStyle(R.style.Theme_Settings_Home, true /* force */);
final boolean isWifiEnabled = isWifiEnabled();
-
- final IconCompat icon = IconCompat.createWithResource(mContext,
- R.drawable.ic_settings_wireless);
- final String title = mContext.getString(R.string.wifi_settings);
- final CharSequence summary = getSummary();
- final PendingIntent toggleAction = getBroadcastIntent(mContext);
- final PendingIntent primaryAction = getPrimaryAction();
- final SliceAction primarySliceAction = SliceAction.createDeeplink(primaryAction, icon,
- ListBuilder.ICON_IMAGE, title);
- final SliceAction toggleSliceAction = SliceAction.createToggle(toggleAction,
- null /* actionTitle */, isWifiEnabled);
-
- final ListBuilder listBuilder = new ListBuilder(mContext, getUri(), ListBuilder.INFINITY)
- .setAccentColor(COLOR_NOT_TINTED)
- .addRow(new ListBuilder.RowBuilder()
- .setTitle(title)
- .setSubtitle(summary)
- .addEndItem(toggleSliceAction)
- .setPrimaryAction(primarySliceAction));
-
+ ListBuilder listBuilder = getListBuilder(isWifiEnabled, null /* accessPoint */);
if (!isWifiEnabled) {
return listBuilder.build();
}
@@ -137,7 +119,12 @@
final CharSequence placeholder = mContext.getText(R.string.summary_placeholder);
for (int i = 0; i < DEFAULT_EXPANDED_ROW_COUNT; i++) {
if (i < apCount) {
- listBuilder.addRow(getAccessPointRow(results.get(i)));
+ final AccessPoint accessPoint = results.get(i);
+ if (accessPoint.isActive()) {
+ // update summary
+ listBuilder = getListBuilder(isWifiEnabled, accessPoint);
+ }
+ listBuilder.addRow(getAccessPointRow(accessPoint));
} else if (needLoadingRow) {
listBuilder.addRow(getLoadingRow());
needLoadingRow = false;
@@ -149,6 +136,27 @@
return listBuilder.build();
}
+ private ListBuilder getListBuilder(boolean isWifiEnabled, AccessPoint accessPoint) {
+ final IconCompat icon = IconCompat.createWithResource(mContext,
+ R.drawable.ic_settings_wireless);
+ final String title = mContext.getString(R.string.wifi_settings);
+ final CharSequence summary = getSummary(accessPoint);
+ final PendingIntent toggleAction = getBroadcastIntent(mContext);
+ final PendingIntent primaryAction = getPrimaryAction();
+ final SliceAction primarySliceAction = SliceAction.createDeeplink(primaryAction, icon,
+ ListBuilder.ICON_IMAGE, title);
+ final SliceAction toggleSliceAction = SliceAction.createToggle(toggleAction,
+ null /* actionTitle */, isWifiEnabled);
+
+ return new ListBuilder(mContext, getUri(), ListBuilder.INFINITY)
+ .setAccentColor(COLOR_NOT_TINTED)
+ .addRow(new ListBuilder.RowBuilder()
+ .setTitle(title)
+ .setSubtitle(summary)
+ .addEndItem(toggleSliceAction)
+ .setPrimaryAction(primarySliceAction));
+ }
+
private ListBuilder.RowBuilder getAccessPointRow(AccessPoint accessPoint) {
final CharSequence title = getAccessPointName(accessPoint);
final IconCompat levelIcon = getAccessPointLevelIcon(accessPoint);
@@ -167,7 +175,7 @@
}
private CharSequence getAccessPointName(AccessPoint accessPoint) {
- final CharSequence name = accessPoint.getConfigName();
+ final CharSequence name = accessPoint.getTitle();
final Spannable span = new SpannableString(name);
@ColorInt final int color = Utils.getColorAttrDefaultColor(mContext,
android.R.attr.textColorPrimary);
@@ -306,6 +314,32 @@
}
}
+ private CharSequence getSummary(AccessPoint accessPoint) {
+ if (accessPoint == null) {
+ return getSummary();
+ }
+
+ final NetworkInfo networkInfo = accessPoint.getNetworkInfo();
+ if (networkInfo == null) {
+ return getSummary();
+ }
+
+ final State state = networkInfo.getState();
+ DetailedState detailedState;
+ if (state == State.CONNECTING) {
+ detailedState = DetailedState.CONNECTING;
+ } else if (state == State.CONNECTED) {
+ detailedState = DetailedState.CONNECTED;
+ } else {
+ return getSummary();
+ }
+
+ final String[] formats = mContext.getResources().getStringArray(
+ R.array.wifi_status_with_ssid);
+ final int index = detailedState.ordinal();
+ return String.format(formats[index], accessPoint.getTitle());
+ }
+
private PendingIntent getPrimaryAction() {
final Intent intent = getIntent();
return PendingIntent.getActivity(mContext, 0 /* requestCode */,
diff --git a/src/com/android/settings/wifi/tether/WifiTetherSsidPreference.java b/src/com/android/settings/wifi/tether/WifiTetherSsidPreference.java
index 64014d9..e2566d0 100644
--- a/src/com/android/settings/wifi/tether/WifiTetherSsidPreference.java
+++ b/src/com/android/settings/wifi/tether/WifiTetherSsidPreference.java
@@ -39,6 +39,7 @@
private ImageButton mImageButton;
private Drawable mButtonIcon;
+ private View mDivider;
private View.OnClickListener mClickListener;
private boolean mVisible;
@@ -68,6 +69,8 @@
}
private void initialize() {
+ // TODO(b/129019971): use methods of divider line in parent object
+ setLayoutResource(R.layout.preference);
setWidgetLayoutResource(R.layout.wifi_button_preference_widget);
}
@@ -82,13 +85,17 @@
getContext().getString(R.string.wifi_dpp_share_hotspot));
setButtonIcon(R.drawable.ic_qrcode_24dp);
mImageButton.setImageDrawable(mButtonIcon);
+
+ mDivider = holder.findViewById(R.id.two_target_divider);
}
if (mVisible) {
mImageButton.setOnClickListener(mClickListener);
mImageButton.setVisibility(View.VISIBLE);
+ mDivider.setVisibility(View.VISIBLE);
} else {
mImageButton.setVisibility(View.GONE);
+ mDivider.setVisibility(View.GONE);
}
}
diff --git a/tests/robotests/src/com/android/settings/applications/manageapplications/ApplicationViewHolderTest.java b/tests/robotests/src/com/android/settings/applications/manageapplications/ApplicationViewHolderTest.java
index b8d0f20..c3ae904 100644
--- a/tests/robotests/src/com/android/settings/applications/manageapplications/ApplicationViewHolderTest.java
+++ b/tests/robotests/src/com/android/settings/applications/manageapplications/ApplicationViewHolderTest.java
@@ -46,7 +46,7 @@
public void seUp() {
mContext = RuntimeEnvironment.application;
mView = ApplicationViewHolder.newView(new FrameLayout(mContext));
- mHolder = new ApplicationViewHolder(mView, false /* useStableHeight */);
+ mHolder = new ApplicationViewHolder(mView);
}
@Test
@@ -67,10 +67,6 @@
mHolder.setSummary(R.string.disabled);
assertThat(mHolder.mSummary.getText()).isEqualTo(mContext.getText(R.string.disabled));
- assertThat(mHolder.mSummaryContainer.getVisibility()).isEqualTo(View.VISIBLE);
-
- mHolder.setSummary(null);
- assertThat(mHolder.mSummaryContainer.getVisibility()).isEqualTo(View.GONE);
}
@Test
@@ -104,7 +100,7 @@
@Test
public void twoTouchTarget() {
mView = ApplicationViewHolder.newView(new FrameLayout(mContext), true);
- mHolder = new ApplicationViewHolder(mView, false /* useStableHeight */);
+ mHolder = new ApplicationViewHolder(mView);
assertThat(mHolder.mSwitch).isNotNull();
assertThat(mHolder.mWidgetContainer.getChildCount()).isEqualTo(1);
}
@@ -112,8 +108,9 @@
@Test
public void updateSwitch() {
mView = ApplicationViewHolder.newView(new FrameLayout(mContext), true);
- mHolder = new ApplicationViewHolder(mView, false /* useStableHeight */);
- mHolder.updateSwitch(v -> {}, true, true);
+ mHolder = new ApplicationViewHolder(mView);
+ mHolder.updateSwitch(v -> {
+ } /* listener */, true, true);
assertThat(mHolder.mSwitch.isChecked()).isTrue();
assertThat(mHolder.mSwitch.isEnabled()).isTrue();
diff --git a/tests/robotests/src/com/android/settings/applications/manageapplications/ManageApplicationsTest.java b/tests/robotests/src/com/android/settings/applications/manageapplications/ManageApplicationsTest.java
index 419fc49..27c3e7d 100644
--- a/tests/robotests/src/com/android/settings/applications/manageapplications/ManageApplicationsTest.java
+++ b/tests/robotests/src/com/android/settings/applications/manageapplications/ManageApplicationsTest.java
@@ -235,16 +235,6 @@
}
@Test
- public void shouldUseStableItemHeight() {
- assertThat(ManageApplications.ApplicationsAdapter.shouldUseStableItemHeight(
- LIST_TYPE_MAIN))
- .isTrue();
- assertThat(ManageApplications.ApplicationsAdapter.shouldUseStableItemHeight(
- LIST_TYPE_NOTIFICATION))
- .isTrue();
- }
-
- @Test
public void onRebuildComplete_shouldHideLoadingView() {
final Context context = RuntimeEnvironment.application;
final RecyclerView recyclerView = mock(RecyclerView.class);
diff --git a/tests/robotests/src/com/android/settings/applications/manageapplications/MusicViewHolderControllerTest.java b/tests/robotests/src/com/android/settings/applications/manageapplications/MusicViewHolderControllerTest.java
index 8f5b0ab..74fb98f 100644
--- a/tests/robotests/src/com/android/settings/applications/manageapplications/MusicViewHolderControllerTest.java
+++ b/tests/robotests/src/com/android/settings/applications/manageapplications/MusicViewHolderControllerTest.java
@@ -64,7 +64,7 @@
mController = new MusicViewHolderController(mContext, mSource, fsUuid, new UserHandle(0));
View view = ApplicationViewHolder.newView(new FrameLayout(mContext));
- mHolder = new ApplicationViewHolder(view, false /* useStableHeight */);
+ mHolder = new ApplicationViewHolder(view);
}
@Test
diff --git a/tests/robotests/src/com/android/settings/applications/manageapplications/PhotosViewHolderControllerTest.java b/tests/robotests/src/com/android/settings/applications/manageapplications/PhotosViewHolderControllerTest.java
index c453474..5475b9c 100644
--- a/tests/robotests/src/com/android/settings/applications/manageapplications/PhotosViewHolderControllerTest.java
+++ b/tests/robotests/src/com/android/settings/applications/manageapplications/PhotosViewHolderControllerTest.java
@@ -63,7 +63,7 @@
mController = new PhotosViewHolderController(mContext, mSource, fsUuid, new UserHandle(0));
final View view = ApplicationViewHolder.newView(new FrameLayout(mContext));
- mHolder = new ApplicationViewHolder(view, false /* useStableHeight */);
+ mHolder = new ApplicationViewHolder(view);
}
@Test
@@ -71,19 +71,19 @@
mController.setupView(mHolder);
assertThat(mHolder.mSummary.getText().toString())
- .isEqualTo(Formatter.formatFileSize(mContext, 0));
+ .isEqualTo(Formatter.formatFileSize(mContext, 0));
}
@Test
public void storageShouldRepresentStorageStatsQuery() throws Exception {
when(mSource.getExternalStorageStats(nullable(String.class), nullable(UserHandle.class)))
- .thenReturn(new StorageStatsSource.ExternalStorageStats(1, 0, 1, 10, 0));
+ .thenReturn(new StorageStatsSource.ExternalStorageStats(1, 0, 1, 10, 0));
mController.queryStats();
mController.setupView(mHolder);
assertThat(mHolder.mSummary.getText().toString())
- .isEqualTo(Formatter.formatFileSize(mContext, 11));
+ .isEqualTo(Formatter.formatFileSize(mContext, 11));
}
@Test
diff --git a/tests/robotests/src/com/android/settings/backup/BackupSettingsHelperTest.java b/tests/robotests/src/com/android/settings/backup/BackupSettingsHelperTest.java
index 5587783..b6ef32c 100644
--- a/tests/robotests/src/com/android/settings/backup/BackupSettingsHelperTest.java
+++ b/tests/robotests/src/com/android/settings/backup/BackupSettingsHelperTest.java
@@ -256,20 +256,21 @@
@Test
public void testGetLabelBackupTransport() throws Exception {
- String label = "test_label";
+ CharSequence label = "test_label";
- when(mBackupManager.getDataManagementLabel(anyString())).thenReturn(label);
+ when(mBackupManager.getDataManagementLabelForUser(anyInt(), anyString())).thenReturn(label);
- String backupLabel = mBackupSettingsHelper.getLabelFromBackupTransport();
+ CharSequence backupLabel = mBackupSettingsHelper.getLabelFromBackupTransport();
assertThat(backupLabel).isEqualTo(label);
}
@Test
public void testGetLabelBackupTransport_RemoteException() throws Exception {
- when(mBackupManager.getDataManagementLabel(anyString())).thenThrow(new RemoteException());
+ when(mBackupManager.getDataManagementLabelForUser(anyInt(), anyString()))
+ .thenThrow(new RemoteException());
- String backupLabel = mBackupSettingsHelper.getLabelFromBackupTransport();
+ CharSequence backupLabel = mBackupSettingsHelper.getLabelFromBackupTransport();
assertThat(backupLabel).isNull();
}
@@ -291,31 +292,31 @@
@Test
public void testGetLabelForBackupSettings_WithLabelFromTransport() throws Exception {
- String label = "test_label";
+ CharSequence label = "test_label";
- when(mBackupManager.getDataManagementLabel(anyString())).thenReturn(label);
+ when(mBackupManager.getDataManagementLabelForUser(anyInt(), anyString())).thenReturn(label);
- String backupLabel = mBackupSettingsHelper.getLabelForBackupSettings();
+ CharSequence backupLabel = mBackupSettingsHelper.getLabelForBackupSettings();
assertThat(backupLabel).isEqualTo(label);
}
@Test
public void testGetLabelForBackupSettings_WithEmptyLabelFromTransport() throws Exception {
- String label = "";
+ CharSequence label = "";
- when(mBackupManager.getDataManagementLabel(anyString())).thenReturn(label);
+ when(mBackupManager.getDataManagementLabelForUser(anyInt(), anyString())).thenReturn(label);
- String backupLabel = mBackupSettingsHelper.getLabelForBackupSettings();
+ CharSequence backupLabel = mBackupSettingsHelper.getLabelForBackupSettings();
assertThat(backupLabel).isEqualTo(mContext.getString(DEFAULT_LABEL_RESOURCE));
}
@Test
public void testGetLabelForBackupSettings_WithoutLabelFromTransport() throws Exception {
- when(mBackupManager.getDataManagementLabel(anyString())).thenReturn(null);
+ when(mBackupManager.getDataManagementLabelForUser(anyInt(), anyString())).thenReturn(null);
- String backupLabel = mBackupSettingsHelper.getLabelForBackupSettings();
+ CharSequence backupLabel = mBackupSettingsHelper.getLabelForBackupSettings();
assertThat(backupLabel).isEqualTo(mContext.getString(DEFAULT_LABEL_RESOURCE));
}
diff --git a/tests/robotests/src/com/android/settings/backup/DataManagementPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/backup/DataManagementPreferenceControllerTest.java
index ac92fb7..d3688d3 100644
--- a/tests/robotests/src/com/android/settings/backup/DataManagementPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/backup/DataManagementPreferenceControllerTest.java
@@ -43,7 +43,7 @@
private DataManagementPreferenceController mController;
private PrivacySettingsConfigData mPSCD;
private Preference mPreference;
- private String mTitle;
+ private CharSequence mTitle;
@Mock
private Intent mIntent;
diff --git a/tests/robotests/src/com/android/settings/gestures/WakeScreenGesturePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/gestures/WakeScreenGesturePreferenceControllerTest.java
deleted file mode 100644
index 471914a..0000000
--- a/tests/robotests/src/com/android/settings/gestures/WakeScreenGesturePreferenceControllerTest.java
+++ /dev/null
@@ -1,130 +0,0 @@
-/*
- * 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.
- */
-
-package com.android.settings.gestures;
-
-import static com.android.settings.core.BasePreferenceController.AVAILABLE;
-import static com.android.settings.core.BasePreferenceController.DISABLED_DEPENDENT_SETTING;
-import static com.android.settings.core.BasePreferenceController.UNSUPPORTED_ON_DEVICE;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.anyInt;
-import static org.mockito.Mockito.reset;
-import static org.mockito.Mockito.when;
-
-import android.content.Context;
-import android.hardware.display.AmbientDisplayConfiguration;
-
-import com.android.settings.aware.AwareFeatureProvider;
-import com.android.settings.testutils.FakeFeatureFactory;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Answers;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-import org.robolectric.RobolectricTestRunner;
-
-@RunWith(RobolectricTestRunner.class)
-public class WakeScreenGesturePreferenceControllerTest {
-
- private static final String KEY_WAKE_SCREEN = "gesture_wake_screen";
-
- @Mock(answer = Answers.RETURNS_DEEP_STUBS)
- private Context mContext;
- @Mock
- private AmbientDisplayConfiguration mAmbientDisplayConfiguration;
- private WakeScreenGesturePreferenceController mController;
-
- @Before
- public void setUp() {
- MockitoAnnotations.initMocks(this);
- AwareFeatureProvider featureProvider =
- FakeFeatureFactory.setupForTest().getAwareFeatureProvider();
- when(featureProvider.isSupported(any())).thenReturn(true);
- when(featureProvider.isEnabled(any())).thenReturn(true);
- mController = new WakeScreenGesturePreferenceController(mContext, KEY_WAKE_SCREEN);
- mController.setConfig(mAmbientDisplayConfiguration);
- }
-
- @Test
- public void testIsChecked_configIsSet_shouldReturnTrue() {
- // Set the setting to be enabled.
- when(mAmbientDisplayConfiguration.wakeScreenGestureEnabled(anyInt())).thenReturn(true);
- assertThat(mController.isChecked()).isTrue();
- }
-
- @Test
- public void testIsChecked_configIsNotSet_shouldReturnFalse() {
- // Set the setting to be disabled.
- when(mAmbientDisplayConfiguration.wakeScreenGestureEnabled(anyInt())).thenReturn(false);
- assertThat(mController.isChecked()).isFalse();
- }
-
- @Test
- public void getAvailabilityStatus_gestureNotSupported_UNSUPPORTED_ON_DEVICE() {
- when(mAmbientDisplayConfiguration.alwaysOnEnabled(anyInt())).thenReturn(true);
- when(mAmbientDisplayConfiguration.wakeScreenGestureAvailable()).thenReturn(false);
- final int availabilityStatus = mController.getAvailabilityStatus();
-
- assertThat(availabilityStatus).isEqualTo(UNSUPPORTED_ON_DEVICE);
- }
-
- @Test
- public void getAvailabilityStatus_gestureSupported_AVAILABLE() {
- when(mAmbientDisplayConfiguration.alwaysOnEnabled(anyInt())).thenReturn(true);
- when(mAmbientDisplayConfiguration.wakeScreenGestureAvailable()).thenReturn(true);
- final int availabilityStatus = mController.getAvailabilityStatus();
-
- assertThat(availabilityStatus).isEqualTo(AVAILABLE);
- }
-
- @Test
- public void getAvailabilityStatus_gestureSupported_DISABLED_DEPENDENT_SETTING() {
- when(mAmbientDisplayConfiguration.alwaysOnEnabled(anyInt())).thenReturn(false);
- when(mAmbientDisplayConfiguration.wakeScreenGestureAvailable()).thenReturn(true);
- final int availabilityStatus = mController.getAvailabilityStatus();
-
- assertThat(availabilityStatus).isEqualTo(DISABLED_DEPENDENT_SETTING);
- }
-
- @Test
- public void canHandleClicks_onlyWhenAlwaysOn() {
- when(mAmbientDisplayConfiguration.alwaysOnEnabled(anyInt())).thenReturn(false);
- assertThat(mController.canHandleClicks()).isEqualTo(false);
-
- reset(mAmbientDisplayConfiguration);
- when(mAmbientDisplayConfiguration.alwaysOnEnabled(anyInt())).thenReturn(true);
- assertThat(mController.canHandleClicks()).isEqualTo(true);
- }
-
- @Test
- public void isSliceableCorrectKey_returnsTrue() {
- final WakeScreenGesturePreferenceController controller =
- new WakeScreenGesturePreferenceController(mContext, "gesture_wake_screen");
- assertThat(controller.isSliceable()).isTrue();
- }
-
- @Test
- public void isSliceableIncorrectKey_returnsFalse() {
- final WakeScreenGesturePreferenceController controller =
- new WakeScreenGesturePreferenceController(mContext, "bad_key");
- assertThat(controller.isSliceable()).isFalse();
- }
-}
diff --git a/tests/robotests/src/com/android/settings/homepage/contextualcards/slices/ContextualNotificationChannelSliceTest.java b/tests/robotests/src/com/android/settings/homepage/contextualcards/slices/ContextualNotificationChannelSliceTest.java
new file mode 100644
index 0000000..f2b87be
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/homepage/contextualcards/slices/ContextualNotificationChannelSliceTest.java
@@ -0,0 +1,58 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.homepage.contextualcards.slices;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.content.Context;
+import android.net.Uri;
+
+import com.android.settings.R;
+import com.android.settings.slices.CustomSliceRegistry;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
+import org.robolectric.RuntimeEnvironment;
+
+@RunWith(RobolectricTestRunner.class)
+public class ContextualNotificationChannelSliceTest {
+
+ private Context mContext;
+ private ContextualNotificationChannelSlice mNotificationChannelSlice;
+
+ @Before
+ public void setUp() {
+ mContext = RuntimeEnvironment.application;
+ mNotificationChannelSlice = new ContextualNotificationChannelSlice(mContext);
+ }
+
+ @Test
+ public void getUri_shouldBeContextualNotificationChannelSliceUri() {
+ final Uri uri = mNotificationChannelSlice.getUri();
+
+ assertThat(uri).isEqualTo(CustomSliceRegistry.CONTEXTUAL_NOTIFICATION_CHANNEL_SLICE_URI);
+ }
+
+ @Test
+ public void getSubTitle_shouldBeRecentlyInstalledApp() {
+ final CharSequence subTitle = mNotificationChannelSlice.getSubTitle("com.test.package", 0);
+
+ assertThat(subTitle).isEqualTo(mContext.getText(R.string.recently_installed_app));
+ }
+}
diff --git a/tests/robotests/src/com/android/settings/notification/AssistantCapabilityPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/AssistantCapabilityPreferenceControllerTest.java
new file mode 100644
index 0000000..182ce8a
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/notification/AssistantCapabilityPreferenceControllerTest.java
@@ -0,0 +1,169 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.notification;
+
+import static com.android.settings.core.BasePreferenceController.AVAILABLE;
+import static com.android.settings.core.BasePreferenceController.DISABLED_DEPENDENT_SETTING;
+import static com.android.settings.notification.AssistantCapabilityPreferenceController.PRIORITIZER_KEY;
+import static com.android.settings.notification.AssistantCapabilityPreferenceController.SMART_KEY;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.content.ComponentName;
+import android.content.Context;
+import android.service.notification.Adjustment;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
+import org.robolectric.RuntimeEnvironment;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import androidx.preference.Preference;
+import androidx.preference.PreferenceScreen;
+
+@RunWith(RobolectricTestRunner.class)
+public class AssistantCapabilityPreferenceControllerTest {
+
+ @Mock
+ private NotificationBackend mBackend;
+ @Mock
+ private PreferenceScreen mScreen;
+
+ private Context mContext;
+ private AssistantCapabilityPreferenceController mPrioritizerController;
+ private AssistantCapabilityPreferenceController mChipController;
+ private Preference mPrioritizerPreference;
+ private Preference mChipPreference;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ mContext = RuntimeEnvironment.application;
+ mPrioritizerController = new AssistantCapabilityPreferenceController(
+ mContext, PRIORITIZER_KEY);
+ mPrioritizerController.setBackend(mBackend);
+ mPrioritizerPreference = new Preference(mContext);
+ mPrioritizerPreference.setKey(mPrioritizerController.getPreferenceKey());
+ when(mScreen.findPreference(
+ mPrioritizerController.getPreferenceKey())).thenReturn(mPrioritizerPreference);
+ mChipController = new AssistantCapabilityPreferenceController(mContext, SMART_KEY);
+ mChipController.setBackend(mBackend);
+ mChipPreference = new Preference(mContext);
+ mChipPreference.setKey(mChipController.getPreferenceKey());
+ when(mScreen.findPreference(
+ mChipController.getPreferenceKey())).thenReturn(mChipPreference);
+ }
+
+ @Test
+ public void getAvailabilityStatus_NAS() {
+ when(mBackend.getAllowedNotificationAssistant()).thenReturn(mock(ComponentName.class));
+ assertThat(mPrioritizerController.getAvailabilityStatus())
+ .isEqualTo(AVAILABLE);
+ assertThat(mChipController.getAvailabilityStatus())
+ .isEqualTo(AVAILABLE);
+ }
+
+ @Test
+ public void getAvailabilityStatus_noNAS() {
+ when(mBackend.getAllowedNotificationAssistant()).thenReturn(null);
+ assertThat(mPrioritizerController.getAvailabilityStatus())
+ .isEqualTo(DISABLED_DEPENDENT_SETTING);
+ assertThat(mChipController.getAvailabilityStatus())
+ .isEqualTo(DISABLED_DEPENDENT_SETTING);
+ }
+
+ @Test
+ public void isChecked_prioritizerSettingIsOff_false() {
+ List<String> capabilities = new ArrayList<>();
+ capabilities.add(Adjustment.KEY_USER_SENTIMENT);
+ when(mBackend.getAssistantCapabilities(anyString())).thenReturn(capabilities);
+ assertThat(mPrioritizerController.isChecked()).isFalse();
+ }
+
+ @Test
+ public void isChecked_prioritizerSettingIsOn_true() {
+ List<String> capabilities = new ArrayList<>();
+ capabilities.add(Adjustment.KEY_IMPORTANCE);
+ when(mBackend.getAssistantCapabilities(anyString())).thenReturn(capabilities);
+ assertThat(mPrioritizerController.isChecked()).isTrue();
+ }
+
+ @Test
+ public void isChecked_chipSettingIsOff_false() {
+ List<String> capabilities = new ArrayList<>();
+ capabilities.add(Adjustment.KEY_IMPORTANCE);
+ when(mBackend.getAssistantCapabilities(anyString())).thenReturn(capabilities);
+ assertThat(mChipController.isChecked()).isFalse();
+
+ capabilities = new ArrayList<>();
+ capabilities.add(Adjustment.KEY_CONTEXTUAL_ACTIONS);
+ when(mBackend.getAssistantCapabilities(anyString())).thenReturn(capabilities);
+ assertThat(mChipController.isChecked()).isFalse();
+
+ capabilities = new ArrayList<>();
+ capabilities.add(Adjustment.KEY_TEXT_REPLIES);
+ when(mBackend.getAssistantCapabilities(anyString())).thenReturn(capabilities);
+ assertThat(mChipController.isChecked()).isFalse();
+ }
+
+ @Test
+ public void isChecked_chipSettingIsOn_true() {
+ List<String> capabilities = new ArrayList<>();
+ capabilities.add(Adjustment.KEY_TEXT_REPLIES);
+ capabilities.add(Adjustment.KEY_CONTEXTUAL_ACTIONS);
+ when(mBackend.getAssistantCapabilities(anyString())).thenReturn(capabilities);
+ assertThat(mChipController.isChecked()).isTrue();
+ }
+
+ @Test
+ public void onPreferenceChange_prioritizerOn() {
+ mPrioritizerController.onPreferenceChange(mPrioritizerPreference, true);
+ verify(mBackend).allowAssistantCapability(Adjustment.KEY_IMPORTANCE, true);
+ }
+
+ @Test
+ public void onPreferenceChange_prioritizerOff() {
+ mPrioritizerController.onPreferenceChange(mPrioritizerPreference, false);
+ verify(mBackend).allowAssistantCapability(Adjustment.KEY_IMPORTANCE, false);
+ }
+
+ @Test
+ public void onPreferenceChange_chipsOn() {
+ mChipController.onPreferenceChange(mChipPreference, true);
+ verify(mBackend).allowAssistantCapability(Adjustment.KEY_CONTEXTUAL_ACTIONS, true);
+ verify(mBackend).allowAssistantCapability(Adjustment.KEY_TEXT_REPLIES, true);
+ }
+
+ @Test
+ public void onPreferenceChange_chipsOff() {
+ mChipController.onPreferenceChange(mChipPreference, false);
+ verify(mBackend).allowAssistantCapability(Adjustment.KEY_CONTEXTUAL_ACTIONS, false);
+ verify(mBackend).allowAssistantCapability(Adjustment.KEY_TEXT_REPLIES, false);
+ }
+}
+
diff --git a/tests/robotests/src/com/android/settings/slices/SettingsSliceProviderTest.java b/tests/robotests/src/com/android/settings/slices/SettingsSliceProviderTest.java
index 23025b2..005ffbe 100644
--- a/tests/robotests/src/com/android/settings/slices/SettingsSliceProviderTest.java
+++ b/tests/robotests/src/com/android/settings/slices/SettingsSliceProviderTest.java
@@ -133,7 +133,6 @@
mProvider = spy(new SettingsSliceProvider());
ShadowStrictMode.reset();
mProvider.mSliceWeakDataCache = new HashMap<>();
- mProvider.mSliceDataCache = new HashMap<>();
mProvider.mSlicesDatabaseAccessor = new SlicesDatabaseAccessor(mContext);
when(mProvider.getContext()).thenReturn(mContext);
@@ -198,30 +197,6 @@
}
@Test
- public void testLoadSlice_doesNotCacheWithoutPin() {
- insertSpecialCase(KEY);
- final Uri uri = SliceBuilderUtils.getUri(INTENT_PATH, false);
-
- mProvider.loadSlice(uri);
- SliceData data = mProvider.mSliceDataCache.get(uri);
-
- assertThat(data).isNull();
- }
-
- @Test
- public void testLoadSlice_cachesWithPin() {
- insertSpecialCase(KEY);
- final Uri uri = SliceBuilderUtils.getUri(INTENT_PATH, false);
- when(mManager.getPinnedSlices()).thenReturn(Arrays.asList(uri));
-
- mProvider.loadSlice(uri);
- SliceData data = mProvider.mSliceDataCache.get(uri);
-
- assertThat(data.getKey()).isEqualTo(KEY);
- assertThat(data.getTitle()).isEqualTo(TITLE);
- }
-
- @Test
public void testLoadSlice_cachedEntryRemovedOnBuild() {
SliceData data = getDummyData();
mProvider.mSliceWeakDataCache.put(data.getUri(), data);
@@ -277,18 +252,6 @@
}
@Test
- public void testLoadSlice_cachedEntryRemovedOnUnpin() {
- SliceData data = getDummyData();
- mProvider.mSliceDataCache.put(data.getUri(), data);
- mProvider.onSliceUnpinned(data.getUri());
- insertSpecialCase(data.getKey());
-
- SliceData cachedData = mProvider.mSliceWeakDataCache.get(data.getUri());
-
- assertThat(cachedData).isNull();
- }
-
- @Test
public void getDescendantUris_fullActionUri_returnsSelf() {
final Uri uri = SliceBuilderUtils.getUri(
SettingsSlicesContract.PATH_SETTING_ACTION + "/key", true);
diff --git a/tests/robotests/src/com/android/settings/widget/AdaptiveHomepageIconTest.java b/tests/robotests/src/com/android/settings/widget/AdaptiveIconTest.java
similarity index 80%
rename from tests/robotests/src/com/android/settings/widget/AdaptiveHomepageIconTest.java
rename to tests/robotests/src/com/android/settings/widget/AdaptiveIconTest.java
index 05a9cfb..1be3332 100644
--- a/tests/robotests/src/com/android/settings/widget/AdaptiveHomepageIconTest.java
+++ b/tests/robotests/src/com/android/settings/widget/AdaptiveIconTest.java
@@ -48,7 +48,7 @@
import org.robolectric.RuntimeEnvironment;
@RunWith(RobolectricTestRunner.class)
-public class AdaptiveHomepageIconTest {
+public class AdaptiveIconTest {
private Context mContext;
private ActivityInfo mActivityInfo;
@@ -64,8 +64,8 @@
@Test
public void createIcon_shouldSetBackgroundAndInset() {
- final AdaptiveHomepageIcon icon =
- new AdaptiveHomepageIcon(mContext, new ColorDrawable(Color.BLACK));
+ final AdaptiveIcon icon =
+ new AdaptiveIcon(mContext, new ColorDrawable(Color.BLACK));
assertThat(icon.getNumberOfLayers()).isEqualTo(2);
assertThat(icon.getDrawable(0)).isInstanceOf(AdaptiveIconShapeDrawable.class);
@@ -73,8 +73,8 @@
@Test
public void setBackgroundColor_shouldUpdateColorFilter() {
- final AdaptiveHomepageIcon icon =
- spy(new AdaptiveHomepageIcon(mContext, new ColorDrawable(Color.BLACK)));
+ final AdaptiveIcon icon =
+ spy(new AdaptiveIcon(mContext, new ColorDrawable(Color.BLACK)));
final ShapeDrawable background = mock(ShapeDrawable.class);
when(icon.getDrawable(0)).thenReturn(background);
@@ -89,8 +89,8 @@
mActivityInfo.metaData.putInt(META_DATA_PREFERENCE_ICON_BACKGROUND_ARGB, 0xff0000);
doReturn(Icon.createWithResource(mContext, R.drawable.ic_settings_accent))
.when(tile).getIcon(mContext);
- final AdaptiveHomepageIcon icon =
- new AdaptiveHomepageIcon(mContext, new ColorDrawable(Color.BLACK));
+ final AdaptiveIcon icon =
+ new AdaptiveIcon(mContext, new ColorDrawable(Color.BLACK));
icon.setBackgroundColor(mContext, tile);
assertThat(icon.mBackgroundColor).isEqualTo(0xff0000);
@@ -101,8 +101,8 @@
final Tile tile = spy(new Tile(mActivityInfo, CategoryKey.CATEGORY_HOMEPAGE));
doReturn(Icon.createWithResource(mContext, R.drawable.ic_settings_accent))
.when(tile).getIcon(mContext);
- final AdaptiveHomepageIcon icon =
- new AdaptiveHomepageIcon(mContext, new ColorDrawable(Color.BLACK));
+ final AdaptiveIcon icon =
+ new AdaptiveIcon(mContext, new ColorDrawable(Color.BLACK));
icon.setBackgroundColor(mContext, tile);
@@ -118,11 +118,24 @@
doReturn(Icon.createWithResource(mContext, R.drawable.ic_settings_accent))
.when(tile).getIcon(mContext);
- final AdaptiveHomepageIcon icon =
- new AdaptiveHomepageIcon(mContext, new ColorDrawable(Color.BLACK));
+ final AdaptiveIcon icon =
+ new AdaptiveIcon(mContext, new ColorDrawable(Color.BLACK));
icon.setBackgroundColor(mContext, tile);
assertThat(icon.mBackgroundColor)
.isEqualTo(mContext.getColor(R.color.material_blue_500));
}
+
+ @Test
+ public void getConstantState_returnCorrectState() {
+ final AdaptiveIcon icon =
+ new AdaptiveIcon(mContext, new ColorDrawable(Color.BLACK));
+ icon.setBackgroundColor(Color.YELLOW);
+
+ final AdaptiveIcon.AdaptiveConstantState state =
+ (AdaptiveIcon.AdaptiveConstantState) icon.getConstantState();
+
+ assertThat(state.color).isEqualTo(Color.YELLOW);
+ assertThat(state.context).isEqualTo(mContext);
+ }
}
diff --git a/tests/robotests/src/com/android/settings/wifi/NetworkRequestDialogFragmentTest.java b/tests/robotests/src/com/android/settings/wifi/NetworkRequestDialogFragmentTest.java
index d2403b9..4202143 100644
--- a/tests/robotests/src/com/android/settings/wifi/NetworkRequestDialogFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/wifi/NetworkRequestDialogFragmentTest.java
@@ -330,4 +330,21 @@
// Check
assertThat(button.getVisibility()).isEqualTo(View.GONE);
}
+
+ @Test
+ public void cancelDialog_callsReject() {
+ // Assert
+ networkRequestDialogFragment.show(mActivity.getSupportFragmentManager(), /* tag */ null);
+ final AlertDialog alertDialog = ShadowAlertDialogCompat.getLatestAlertDialog();
+ final NetworkRequestUserSelectionCallback selectionCallback = mock(
+ NetworkRequestUserSelectionCallback.class);
+ networkRequestDialogFragment.onUserSelectionCallbackRegistration(selectionCallback);
+
+ // Action
+ final Button button = alertDialog.getButton(AlertDialog.BUTTON_NEGATIVE);
+ button.performClick();
+
+ // Check
+ verify(selectionCallback, times(1)).reject();
+ }
}
diff --git a/tests/robotests/src/com/android/settings/wifi/details/WifiDetailPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/wifi/details/WifiDetailPreferenceControllerTest.java
index db76722..574d0d6 100644
--- a/tests/robotests/src/com/android/settings/wifi/details/WifiDetailPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/wifi/details/WifiDetailPreferenceControllerTest.java
@@ -649,6 +649,19 @@
nc.removeCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED);
updateNetworkCapabilities(nc);
inOrder.verify(mockHeaderController).setSummary(summary);
+
+ // UI will be refreshed when device connects to a partial connectivity network.
+ summary = "Limited connection";
+ when(mockAccessPoint.getSettingsSummary()).thenReturn(summary);
+ nc.addCapability(NetworkCapabilities.NET_CAPABILITY_PARTIAL_CONNECTIVITY);
+ updateNetworkCapabilities(nc);
+ inOrder.verify(mockHeaderController).setSummary(summary);
+
+ // Although UI will be refreshed when network become validated. The Settings should
+ // continue to display "Limited connection" if network still provides partial connectivity.
+ nc.addCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED);
+ updateNetworkCapabilities(nc);
+ inOrder.verify(mockHeaderController).setSummary(summary);
}
@Test