Merge "Adding Wifi setting to special_access settings"
diff --git a/Android.mk b/Android.mk
index df85bbc..61851cf 100644
--- a/Android.mk
+++ b/Android.mk
@@ -12,6 +12,7 @@
include $(CLEAR_VARS)
LOCAL_PACKAGE_NAME := Settings
+LOCAL_PRIVATE_PLATFORM_APIS := true
LOCAL_CERTIFICATE := platform
LOCAL_PRIVILEGED_MODULE := true
LOCAL_MODULE_TAGS := optional
@@ -39,6 +40,7 @@
LOCAL_STATIC_JAVA_LIBRARIES := \
android-arch-lifecycle-runtime \
android-arch-lifecycle-extensions \
+ guava \
jsr305 \
settings-logtags \
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index d258c46..2795ba1 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -212,33 +212,6 @@
android:value="true" />
</activity>
- <activity
- android:name=".Settings$ConnectedDeviceDashboardActivityOld"
- android:enabled="false"
- android:label="@string/connected_devices_dashboard_title"
- android:icon="@drawable/ic_homepage_connected_device"
- android:taskAffinity="com.android.settings"
- android:parentActivityName="Settings">
- <intent-filter android:priority="1">
- <action android:name="android.settings.NFC_SETTINGS" />
- <category android:name="android.intent.category.DEFAULT" />
- </intent-filter>
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- <category android:name="android.intent.category.DEFAULT" />
- <category android:name="android.intent.category.VOICE_LAUNCH" />
- </intent-filter>
- <intent-filter android:priority="10">
- <action android:name="com.android.settings.action.SETTINGS"/>
- </intent-filter>
- <meta-data android:name="com.android.settings.FRAGMENT_CLASS"
- android:value="com.android.settings.connecteddevice.ConnectedDeviceDashboardFragmentOld"/>
- <meta-data android:name="com.android.settings.category"
- android:value="com.android.settings.category.ia.homepage"/>
- <meta-data android:name="com.android.settings.PRIMARY_PROFILE_CONTROLLED"
- android:value="true" />
- </activity>
-
<activity android:name="AirplaneModeVoiceActivity"
android:label="@string/wireless_networks_settings_title"
android:theme="@*android:style/Theme.DeviceDefault.Light.Voice"
@@ -281,8 +254,6 @@
android:value="com.android.settings.wifi.WifiSettings" />
<meta-data android:name="com.android.settings.PRIMARY_PROFILE_CONTROLLED"
android:value="true" />
- <meta-data android:name="android.metadata.SLICE_URI"
- android:value="content://com.android.settings.slices/wifi" />
</activity>
<activity
@@ -3215,19 +3186,9 @@
</intent-filter>
</service>
<service
- android:name=".development.qstile.DevelopmentTiles$WindowTrace"
- android:label="@string/window_trace_quick_settings_title"
- android:icon="@drawable/tile_icon_window_trace"
- 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>
- <service
- android:name=".development.qstile.DevelopmentTiles$LayerTrace"
- android:label="@string/layer_trace_quick_settings_title"
- android:icon="@drawable/tile_icon_layer_trace"
+ android:name=".development.qstile.DevelopmentTiles$WinscopeTrace"
+ android:label="@string/winscope_trace_quick_settings_title"
+ android:icon="@drawable/tile_icon_winscope_trace"
android:permission="android.permission.BIND_QUICK_SETTINGS_TILE"
android:enabled="false">
<intent-filter>
@@ -3296,6 +3257,24 @@
</intent-filter>
</receiver>
+ <!-- Couldn't be triggered from outside of settings. Statsd can trigger it because we send
+ PendingIntent to it-->
+ <receiver android:name=".fuelgauge.batterytip.AnomalyDetectionReceiver"
+ android:exported="false" />
+
+ <receiver android:name=".fuelgauge.batterytip.AnomalyConfigReceiver">
+ <intent-filter>
+ <action android:name="android.app.action.STATSD_STARTED"/>
+ <action android:name="android.intent.action.BOOT_COMPLETED"/>
+ </intent-filter>
+ </receiver>
+
+ <service android:name=".fuelgauge.batterytip.AnomalyCleanupJobService"
+ android:permission="android.permission.BIND_JOB_SERVICE" />
+
+ <service android:name=".fuelgauge.batterytip.AnomalyDetectionJobService"
+ android:permission="android.permission.BIND_JOB_SERVICE" />
+
<!-- This is the longest AndroidManifest.xml ever. -->
</application>
</manifest>
diff --git a/color-check-baseline.xml b/color-check-baseline.xml
index 21b9a09..1cf6b20 100644
--- a/color-check-baseline.xml
+++ b/color-check-baseline.xml
@@ -2121,38 +2121,6 @@
priority="4"
summary="Using hardcoded color"
explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
- errorLine1=" android:background="#00ffffff""
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
- <location
- file="res/layout/preference_importance_slider.xml"
- line="59"
- column="17"/>
- </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:progressBackgroundTint="@color/importance_secondary_slider_color""
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
- <location
- file="res/layout/preference_importance_slider.xml"
- line="60"
- column="17"/>
- </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="#000000" />"
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
diff --git a/proguard.flags b/proguard.flags
index 091211d..21c5cfd 100644
--- a/proguard.flags
+++ b/proguard.flags
@@ -4,6 +4,15 @@
# Keep all Fragments in this package, which are used by reflection.
-keep public class com.android.settings.** extends android.app.Fragment
+# Keep all preference controllers needed by slice and DashboardFragment.
+-keep class * extends com.android.settings.core.BasePreferenceController {
+ *;
+}
+
+-keep class * extends com.android.settings.core.TogglePreferenceController {
+ *;
+}
+
# We want to keep methods in Activity that could be used in the XML attribute onClick.
-keepclassmembers class * extends android.app.Activity {
public void *(android.view.View);
diff --git a/res/color/preference_highligh_color.xml b/res/color/preference_highligh_color.xml
index 0a8f770..f8d54d4 100644
--- a/res/color/preference_highligh_color.xml
+++ b/res/color/preference_highligh_color.xml
@@ -16,5 +16,5 @@
-->
<selector xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:alpha="0.1" android:color="?android:attr/colorAccent" />
+ <item android:alpha="0.26" android:color="?android:attr/colorAccent" />
</selector>
\ No newline at end of file
diff --git a/res/drawable/tile_icon_layer_trace.xml b/res/drawable/tile_icon_layer_trace.xml
deleted file mode 100644
index 21dafd3..0000000
--- a/res/drawable/tile_icon_layer_trace.xml
+++ /dev/null
@@ -1,29 +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.
--->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="24dp"
- android:height="24dp"
- android:viewportWidth="24.0"
- android:viewportHeight="24.0"
- android:tint="?android:attr/colorControlNormal">
- <path
- android:pathData="M11.709,11.712 L7.061,8.098 6.039,8.893l5.676,4.415 5.676,-4.415 -1.028,-0.801zM11.716,10.11 L16.357,6.496 17.392,5.695 11.716,1.281 6.039,5.695 7.067,6.496Z"
- android:fillColor="#FFFFFFFF"/>
- <path
- android:pathData="m20.27,15.235c0,0.82 -0.671,1.491 -1.491,1.491 -0.134,0 -0.261,-0.015 -0.38,-0.052l-2.654,2.646C15.782,19.439 15.797,19.573 15.797,19.708c0,0.82 -0.671,1.491 -1.491,1.491 -0.82,0 -1.491,-0.671 -1.491,-1.491 0,-0.134 0.015,-0.268 0.052,-0.388L10.966,17.419C10.847,17.456 10.713,17.471 10.579,17.471 10.444,17.471 10.31,17.456 10.191,17.419L6.799,20.818C6.836,20.938 6.851,21.064 6.851,21.199 6.851,22.019 6.18,22.689 5.36,22.689 4.54,22.689 3.869,22.019 3.869,21.199c0,-0.82 0.671,-1.491 1.491,-1.491 0.134,0 0.261,0.015 0.38,0.052L9.14,16.368C9.103,16.249 9.088,16.114 9.088,15.98 9.088,15.16 9.759,14.489 10.579,14.489c0.82,0 1.491,0.671 1.491,1.491 0,0.134 -0.015,0.268 -0.052,0.388l1.901,1.901C14.038,18.232 14.172,18.217 14.306,18.217c0.134,0 0.268,0.015 0.388,0.052L17.34,15.615C17.303,15.496 17.288,15.369 17.288,15.235c0,-0.82 0.671,-1.491 1.491,-1.491 0.82,0 1.491,0.671 1.491,1.491z"
- android:fillColor="#FFFFFFFF"/>
-</vector>
-
diff --git a/res/drawable/tile_icon_window_trace.xml b/res/drawable/tile_icon_winscope_trace.xml
similarity index 100%
rename from res/drawable/tile_icon_window_trace.xml
rename to res/drawable/tile_icon_winscope_trace.xml
diff --git a/res/layout/choose_lock_pattern_common.xml b/res/layout/choose_lock_pattern_common.xml
index 6aee0f9..b3006a6 100644
--- a/res/layout/choose_lock_pattern_common.xml
+++ b/res/layout/choose_lock_pattern_common.xml
@@ -42,7 +42,7 @@
<ImageView
android:id="@+id/suw_layout_icon"
- style="@style/LockPatternIconStyle"
+ style="@style/SuwGlifIcon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_lock" />
@@ -73,6 +73,7 @@
style="@style/SuwDescription.Glif"
android:layout_width="match_parent"
android:layout_height="wrap_content"
+ android:layout_marginHorizontal="?attr/suwMarginSides"
android:minLines="2" />
<TextView android:id="@+id/headerText"
diff --git a/res/layout/condition_container.xml b/res/layout/condition_container.xml
index 808c4ac..dd91bbb 100644
--- a/res/layout/condition_container.xml
+++ b/res/layout/condition_container.xml
@@ -30,13 +30,13 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:cardUseCompatPadding="true"
- app:cardElevation="2dp">
+ app:cardElevation="2dp"
+ app:cardCornerRadius="@dimen/suggestion_card_corner_radius">
<android.support.v7.widget.RecyclerView
android:id="@+id/data"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:background="@color/material_grey_300"
android:scrollbars="none"/>
</android.support.v7.widget.CardView>
diff --git a/res/layout/condition_tile.xml b/res/layout/condition_tile.xml
index 7d1db40..a31274f 100644
--- a/res/layout/condition_tile.xml
+++ b/res/layout/condition_tile.xml
@@ -19,7 +19,6 @@
android:id="@+id/content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:background="@color/condition_card_background"
android:orientation="vertical">
<LinearLayout
diff --git a/res/layout/confirm_lock_pattern_internal_base.xml b/res/layout/confirm_lock_pattern_internal_base.xml
index 2b09a7e..6773ec0 100644
--- a/res/layout/confirm_lock_pattern_internal_base.xml
+++ b/res/layout/confirm_lock_pattern_internal_base.xml
@@ -34,7 +34,7 @@
<ImageView
android:id="@+id/suw_layout_icon"
- style="@style/LockPatternIconStyle"
+ style="@style/SuwGlifIcon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="?attr/suwGlifHeaderGravity"
diff --git a/res/layout/instant_app_buttons.xml b/res/layout/instant_app_buttons.xml
index 9c2e915..1ef9f41 100644
--- a/res/layout/instant_app_buttons.xml
+++ b/res/layout/instant_app_buttons.xml
@@ -20,24 +20,39 @@
android:id="@+id/instant_app_button_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:paddingTop="4dp"
- android:paddingStart="8dp"
- android:paddingEnd="8dp"
- android:visibility="gone">
- <Button
- android:id="@+id/install"
- style="@style/ActionPrimaryButton"
- android:enabled="false"
+ android:gravity="center"
+ android:paddingTop="24dp"
+ android:paddingStart="68dp"
+ android:paddingEnd="24dp"
+ android:orientation="horizontal">
+
+ <FrameLayout
android:layout_width="0dp"
android:layout_weight="1"
- android:layout_height="wrap_content"
- android:layout_gravity="center"
- android:text="@string/install_text"/>
+ android:layout_height="wrap_content">
+ <Button
+ android:id="@+id/install"
+ style="@style/ActionPrimaryButton"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginBottom="4dp"
+ android:text="@string/install_text"/>
+ <Button
+ android:id="@+id/launch"
+ style="@style/ActionPrimaryButton"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginBottom="4dp"
+ android:text="@string/launch_instant_app"/>
+ </FrameLayout>
+ <Space
+ android:layout_width="16dp"
+ android:layout_height="wrap_content" />
<Button
android:id="@+id/clear_data"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
- android:layout_gravity="center"
+ android:layout_marginBottom="4dp"
android:text="@string/clear_instant_app_data"/>
</LinearLayout>
diff --git a/res/layout/preference_app.xml b/res/layout/preference_app.xml
index f9dd6b2..550ab34 100644
--- a/res/layout/preference_app.xml
+++ b/res/layout/preference_app.xml
@@ -31,6 +31,7 @@
android:gravity="start|center_vertical"
android:minWidth="56dp"
android:orientation="horizontal"
+ android:paddingStart="4dp"
android:paddingEnd="8dp"
android:paddingTop="4dp"
android:paddingBottom="4dp">
diff --git a/res/layout/preference_importance_slider.xml b/res/layout/preference_importance_slider.xml
deleted file mode 100644
index 3861807..0000000
--- a/res/layout/preference_importance_slider.xml
+++ /dev/null
@@ -1,78 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2015 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:minHeight="?android:attr/listPreferredItemHeight"
- android:gravity="center_vertical"
- android:paddingStart="?android:attr/listPreferredItemPaddingStart"
- android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
- android:paddingTop="8dp"
- android:paddingBottom="8dp"
- android:orientation="vertical"
- android:clickable="false"
- android:focusable="false" >
-
- <TextView
- android:id="@android:id/title"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:singleLine="true"
- android:textAppearance="@android:style/TextAppearance.Material.Subhead"
- android:textColor="?android:attr/textColorPrimary"
- android:ellipsize="marquee"
- android:fadingEdge="horizontal" />
-
- <FrameLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content" >
-
- <ImageView
- android:id="@+id/auto_importance"
- android:src="@drawable/notification_auto_importance"
- android:layout_gravity="center_vertical|start"
- android:layout_width="48dp"
- android:layout_height="48dp" />
-
- <SeekBar
- android:id="@*android:id/seekbar"
- android:layout_marginStart="56dp"
- android:layout_marginEnd="32dp"
- android:layout_gravity="center_vertical"
- android:layout_width="match_parent"
- android:layout_height="48dp"
- android:focusable="true"
- android:background="#00ffffff"
- android:progressBackgroundTint="@color/importance_secondary_slider_color"
- android:thumbTint="?android:attr/colorAccent"
- android:progressTint="?android:attr/colorAccent"
- style="@android:style/Widget.Material.SeekBar.Discrete"
- android:tickMarkTint="@android:color/black" />
-
- </FrameLayout>
-
- <TextView
- android:id="@android:id/summary"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_alignStart="@android:id/title"
- android:textAlignment="viewStart"
- android:textAppearance="@android:style/TextAppearance.Material.Body1"
- android:textColor="?android:attr/textColorSecondary"
- android:maxLines="10"
- android:minLines="3" />
-</LinearLayout>
diff --git a/res/layout/suggestion_container.xml b/res/layout/suggestion_container.xml
index 409f39e..95a00cc 100644
--- a/res/layout/suggestion_container.xml
+++ b/res/layout/suggestion_container.xml
@@ -20,7 +20,7 @@
style="@style/SuggestionConditionStyle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:paddingTop="10dp"
+ android:paddingTop="2dp"
android:orientation="vertical">
<LinearLayout
diff --git a/res/layout/wifi_dialog.xml b/res/layout/wifi_dialog.xml
index f18f21b..2c4a1ed 100644
--- a/res/layout/wifi_dialog.xml
+++ b/res/layout/wifi_dialog.xml
@@ -54,9 +54,7 @@
style="@style/wifi_item_edit_content"
android:hint="@string/wifi_ssid_hint"
android:singleLine="true"
- android:inputType="textNoSuggestions">
- <requestFocus/>
- </EditText>
+ android:inputType="textNoSuggestions" />
<LinearLayout android:id="@+id/ssid_too_long_warning"
android:layout_width="match_parent"
diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml
index 843e941..f8b3862 100644
--- a/res/values-af/strings.xml
+++ b/res/values-af/strings.xml
@@ -3358,6 +3358,10 @@
<string name="usb_use_MIDI_desc" msgid="8473936990076693175">"Hierdie toestel as MIDI te gebruik"</string>
<string name="usb_use" msgid="3372728031108932425">"Gebruik USB vir"</string>
<string name="usb_use_also" msgid="557340935190819370">"Gebruik USB ook vir"</string>
+ <!-- no translation found for usb_default_label (4217189967858707974) -->
+ <skip />
+ <!-- no translation found for usb_default_info (8864535445796200695) -->
+ <skip />
<string name="usb_pref" msgid="1400617804525116158">"USB"</string>
<string name="usb_summary_charging_only" msgid="7544327009143659751">"Laai tans hierdie toestel"</string>
<string name="usb_summary_power_only" msgid="1996391096369798526">"Laai tans gekoppelde toestel"</string>
diff --git a/res/values-am/strings.xml b/res/values-am/strings.xml
index 3bc46ba..94a62c3 100644
--- a/res/values-am/strings.xml
+++ b/res/values-am/strings.xml
@@ -3358,6 +3358,10 @@
<string name="usb_use_MIDI_desc" msgid="8473936990076693175">"ይህን መሣሪያ እንደ MIDI ይጠቀሙበት"</string>
<string name="usb_use" msgid="3372728031108932425">"ዩኤስቢ ተጠቀም ለ"</string>
<string name="usb_use_also" msgid="557340935190819370">"እንዲሁም ዩኤስቢን በተጨማሪ ተጠቀም ለ፦"</string>
+ <!-- no translation found for usb_default_label (4217189967858707974) -->
+ <skip />
+ <!-- no translation found for usb_default_info (8864535445796200695) -->
+ <skip />
<string name="usb_pref" msgid="1400617804525116158">"ዩ ኤስ ቢ"</string>
<string name="usb_summary_charging_only" msgid="7544327009143659751">"የዚህን መሣሪያ ኃይል በመሙላት ላይ"</string>
<string name="usb_summary_power_only" msgid="1996391096369798526">"የተገናኘ መሣሪያ ኃይል በመሙላት ላይ"</string>
diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml
index 50b32a1..85669f2 100644
--- a/res/values-ar/strings.xml
+++ b/res/values-ar/strings.xml
@@ -3538,6 +3538,10 @@
<string name="usb_use_MIDI_desc" msgid="8473936990076693175">"يمكنك استخدام هذا الجهاز باعتباره MIDI"</string>
<string name="usb_use" msgid="3372728031108932425">"استخدام USB في"</string>
<string name="usb_use_also" msgid="557340935190819370">"استخدام USB أيضًا من أجل"</string>
+ <!-- no translation found for usb_default_label (4217189967858707974) -->
+ <skip />
+ <!-- no translation found for usb_default_info (8864535445796200695) -->
+ <skip />
<string name="usb_pref" msgid="1400617804525116158">"USB"</string>
<string name="usb_summary_charging_only" msgid="7544327009143659751">"شحن هذا الجهاز"</string>
<string name="usb_summary_power_only" msgid="1996391096369798526">"شحن الجهاز المتصل"</string>
diff --git a/res/values-as-nokeys/strings.xml b/res/values-as-nokeys/strings.xml
new file mode 100644
index 0000000..acab21b
--- /dev/null
+++ b/res/values-as-nokeys/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2007 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="applications_settings_summary" msgid="6616938758022986257">"এপ্লিকেশ্বনবোৰ পৰিচালনা কৰক"</string>
+</resources>
diff --git a/res/values-as/arrays.xml b/res/values-as/arrays.xml
new file mode 100644
index 0000000..e1c748f
--- /dev/null
+++ b/res/values-as/arrays.xml
@@ -0,0 +1,500 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/*
+**
+** Copyright 2007 The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string-array name="timezone_filters">
+ <item msgid="5296756001147094692">"আমেৰিকা"</item>
+ <item msgid="3005562397632768392">"ইউৰোপ"</item>
+ <item msgid="5696915123093701218">"আফ্ৰিকা"</item>
+ <item msgid="4439789052790868249">"এছিয়া"</item>
+ <item msgid="956915953069815961">"অষ্ট্ৰেলিয়া"</item>
+ <item msgid="5345178126174698955">"প্ৰশান্ত মহাসাগৰীয়"</item>
+ <item msgid="8392017019801393511">"সকলো"</item>
+ </string-array>
+ <string-array name="screen_timeout_entries">
+ <item msgid="3342301044271143016">"১৫ ছেকেণ্ড"</item>
+ <item msgid="8881760709354815449">"৩০ ছেকেণ্ড"</item>
+ <item msgid="7589406073232279088">"১ মিনিট"</item>
+ <item msgid="7001195990902244174">"২ মিনিট"</item>
+ <item msgid="7489864775127957179">"৫ মিনিট"</item>
+ <item msgid="2314124409517439288">"১০ মিনিট"</item>
+ <item msgid="6864027152847611413">"৩০ মিনিট"</item>
+ </string-array>
+ <string-array name="dream_timeout_entries">
+ <item msgid="3149294732238283185">"কেতিয়াও নকৰিব"</item>
+ <item msgid="2194151041885903260">"১৫ ছেকেণ্ড"</item>
+ <item msgid="5892295237131074341">"৩০ ছেকেণ্ড"</item>
+ <item msgid="3538441365970038213">"১ মিনিট"</item>
+ <item msgid="412343871668955639">"২ মিনিট"</item>
+ <item msgid="5076853889688991690">"৫ মিনিট"</item>
+ <item msgid="1903860996174927898">"১০ মিনিট"</item>
+ <item msgid="6415509612413178727">"৩০ মিনিট"</item>
+ </string-array>
+ <string-array name="lock_after_timeout_entries">
+ <item msgid="8929270399652145290">"তৎক্ষণাৎ"</item>
+ <item msgid="6736512735606834431">"৫ ছেকেণ্ড"</item>
+ <item msgid="8044619388267891375">"১৫ ছেকেণ্ড"</item>
+ <item msgid="1822002388249545488">"৩০ ছেকেণ্ড"</item>
+ <item msgid="8538071621211916519">"১ মিনিট"</item>
+ <item msgid="5663439580228932882">"২ মিনিট"</item>
+ <item msgid="49888496216106852">"৫ মিনিট"</item>
+ <item msgid="9002737361305019353">"১০ মিনিট"</item>
+ <item msgid="4322676235684793329">"৩০ মিনিট"</item>
+ </string-array>
+ <string-array name="entries_font_size">
+ <item msgid="8166647333858618801">"সৰু"</item>
+ <item msgid="6986443533756848935">"ডিফল্ট"</item>
+ <item msgid="38373998008112077">"ডাঙৰ"</item>
+ <item msgid="7635254317531872272">"সকলোতকৈ ডাঙৰ"</item>
+ </string-array>
+ <string-array name="wifi_status">
+ <item msgid="1922181315419294640"></item>
+ <item msgid="8934131797783724664">"স্কেন কৰি থকা হৈছে…"</item>
+ <item msgid="8513729475867537913">"সংযোগ কৰি থকা হৈছে…"</item>
+ <item msgid="515055375277271756">"বিস্বাশযোগ্যতা প্ৰমাণ কৰি থকা হৈছে …"</item>
+ <item msgid="1943354004029184381">"আইপি ঠিকনা সংগ্ৰহ কৰি থকা হৈছে…"</item>
+ <item msgid="4221763391123233270">"সংযোগ কৰা হ’ল"</item>
+ <item msgid="624838831631122137">"স্থগিত"</item>
+ <item msgid="7979680559596111948">"সংযোগ বিচ্ছিন্ন কৰি থকা হৈছে"</item>
+ <item msgid="1634960474403853625">"সংযোগ বিচ্ছিন্ন"</item>
+ <item msgid="746097431216080650">"অসফল"</item>
+ <item msgid="6367044185730295334">"অৱৰোধিত"</item>
+ <item msgid="503942654197908005">"কিছুসময়ৰ বাবে দুৰ্বল সংযোগ দেখুওৱা হোৱা নাই"</item>
+ </string-array>
+ <string-array name="wifi_status_with_ssid">
+ <item msgid="7714855332363650812"></item>
+ <item msgid="8878186979715711006">"স্কেন কৰি থকা হৈছে…"</item>
+ <item msgid="355508996603873860">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g>ৰ সৈতে সংযোগ কৰি থকা হৈছে…"</item>
+ <item msgid="554971459996405634">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g>ৰ জৰিয়তে সত্যাপন কৰি থকা হৈছে…"</item>
+ <item msgid="7928343808033020343">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g>ৰ আইপি ঠিকনা পৰা সংগ্ৰহ কৰি থকা হৈছে…"</item>
+ <item msgid="8937994881315223448">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g>ৰ সৈতে সংযোগ কৰা হ\'ল"</item>
+ <item msgid="1330262655415760617">"স্থগিত"</item>
+ <item msgid="7698638434317271902">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g>ৰ পৰা সংযোগ বিচ্ছিন্ন কৰি থকা হৈছে…"</item>
+ <item msgid="197508606402264311">"সংযোগ বিচ্ছিন্ন"</item>
+ <item msgid="8578370891960825148">"বিফল হৈছে"</item>
+ <item msgid="5660739516542454527">"অৱৰোধিত"</item>
+ <item msgid="1805837518286731242">"কিছুসময়ৰ বাবে দুৰ্বল সংযোগ দেখুওৱা হোৱা নাই"</item>
+ </string-array>
+ <!-- no translation found for wifi_security:0 (8491993170197127709) -->
+ <!-- no translation found for wifi_security:1 (6524315248437318854) -->
+ <!-- no translation found for wifi_security:2 (1532568756571457140) -->
+ <!-- no translation found for wifi_security:3 (3620707702811709779) -->
+ <!-- no translation found for wifi_security_no_eap:0 (2084555984818107151) -->
+ <!-- no translation found for wifi_security_no_eap:1 (397579322683471524) -->
+ <!-- no translation found for wifi_security_no_eap:2 (1968820975358150484) -->
+ <string-array name="wifi_eap_method">
+ <item msgid="1160193392455075561">"পিইএপি"</item>
+ <item msgid="7981731051382306293">"TLS"</item>
+ <item msgid="2892994535305020162">"TTLS"</item>
+ <item msgid="435667726254379514">"PWD"</item>
+ <item msgid="8549485714107012129">"ছিম"</item>
+ <item msgid="1023893786681286517">"AKA"</item>
+ <item msgid="3030483188676375009">"একে\'এ\'"</item>
+ </string-array>
+ <string-array name="eap_method_without_sim_auth">
+ <item msgid="4047867891913819797">"PEAP"</item>
+ <item msgid="641030570679578504">"TLS"</item>
+ <item msgid="3079489731769553856">"TTLS"</item>
+ <item msgid="35269224158638258">"PWD"</item>
+ </string-array>
+ <!-- no translation found for wifi_ap_band_config_full:0 (1085243288162893079) -->
+ <!-- no translation found for wifi_ap_band_config_full:1 (5531376834915607202) -->
+ <!-- no translation found for wifi_ap_band_config_full:2 (3580217704310339410) -->
+ <!-- no translation found for wifi_ap_band_config_2G_only:0 (7006771583217001015) -->
+ <!-- no translation found for wifi_ap_band_config_2G_only:1 (8904289885593822837) -->
+ <string-array name="wifi_p2p_wps_setup">
+ <item msgid="5085064298144493867">"পুশ্ব বুটাম"</item>
+ <item msgid="1624323946324499595">"সংযুক্ত ডিভাইচৰ পৰা পিন"</item>
+ <item msgid="5366790421523328066">"এই ডিভাইচৰ পিন"</item>
+ </string-array>
+ <string-array name="wifi_p2p_status">
+ <item msgid="1701505390737218306">"সংযোগ কৰা হ’ল"</item>
+ <item msgid="3189211552661432651">"নিমন্ত্ৰিত"</item>
+ <item msgid="3206450250360237549">"অসফল"</item>
+ <item msgid="7785896708926971207">"উপলব্ধ"</item>
+ <item msgid="2330782789550628803">"সীমাৰ বাহিৰত"</item>
+ </string-array>
+ <string-array name="bluetooth_visibility_timeout_entries">
+ <item msgid="8151962652413645395">"২ মিনিট"</item>
+ <item msgid="8675215713017289017">"৫ মিনিট"</item>
+ <item msgid="477015974247590543">"১ ঘণ্টা"</item>
+ <item msgid="5198271470953124739">"কেতিয়াও সময় উকলি নাযায়"</item>
+ </string-array>
+ <string-array name="bluetooth_max_connected_audio_devices">
+ <item msgid="60897909354162249">"ডিফ\'ল্ট"</item>
+ <item msgid="7584056855393485416">"2"</item>
+ <item msgid="844570832050176311">"৩"</item>
+ <item msgid="1896812737336024220">"৪"</item>
+ <item msgid="2664420770707984266">"৫"</item>
+ </string-array>
+ <string-array name="bluetooth_max_connected_audio_devices_values">
+ <item msgid="1992185266918208754">"১"</item>
+ <item msgid="2731443086402670729">"২"</item>
+ <item msgid="74627748729027880">"৩"</item>
+ <item msgid="2654447223197666662">"৪"</item>
+ <item msgid="7026157954713482328">"৫"</item>
+ </string-array>
+ <string-array name="wifi_signal">
+ <item msgid="2245412278046491293">"দুৰ্বল"</item>
+ <item msgid="2042505933058940139">"দুৰ্বল"</item>
+ <item msgid="1344546617235886412">"গ্ৰহণযোগ্য"</item>
+ <item msgid="6019931571712517411">"উচ্চ"</item>
+ <item msgid="8986346415847956850">"উত্তম"</item>
+ </string-array>
+ <string-array name="data_usage_data_range">
+ <item msgid="5013973108901348144">"যোৱা ৩০ দিন"</item>
+ <item msgid="6600989128423965319">"ডেটা ব্যৱহাৰ চক্ৰ..."</item>
+ </string-array>
+ <string-array name="usage_stats_display_order_types">
+ <item msgid="2100172576767439288">"ব্যৱহাৰৰ সময়"</item>
+ <item msgid="4796160515314745154">"অন্তিমবাৰ ব্যৱহাৰ কৰা হৈছিল"</item>
+ <item msgid="2502754479975776899">"এপৰ নাম"</item>
+ </string-array>
+ <string-array name="wifi_eap_entries">
+ <item msgid="8615575908717909498">"পিইএপি"</item>
+ <item msgid="8667872640594311615">"TLS"</item>
+ <item msgid="7182812872984827322">"TTLS"</item>
+ <item msgid="2318274046749286642">"PWD"</item>
+ </string-array>
+ <string-array name="wifi_peap_phase2_entries">
+ <item msgid="2577747762745812488">"নাই"</item>
+ <item msgid="937786527870979616">"MSCHAPV2"</item>
+ <item msgid="5302613883318643629">"GTC"</item>
+ </string-array>
+ <string-array name="wifi_peap_phase2_entries_with_sim_auth">
+ <item msgid="5760470455461128892">"নাই"</item>
+ <item msgid="7480272092408291086">"MSCHAPV2"</item>
+ <item msgid="5881794903338319324">"GTC"</item>
+ <item msgid="5610607665198791980">"ছিম"</item>
+ <item msgid="2860798636241124128">"AKA"</item>
+ <item msgid="8926455723452645935">"AKA\'"</item>
+ </string-array>
+ <string-array name="wifi_phase2_entries">
+ <item msgid="1818786254010764570">"নাই"</item>
+ <item msgid="6189918678874123056">"PAP"</item>
+ <item msgid="1524112260493662517">"MSCHAP"</item>
+ <item msgid="5923246669412752932">"MSCHAPV2"</item>
+ <item msgid="8651992560135239389">"GTC"</item>
+ </string-array>
+ <string-array name="wifi_ip_settings">
+ <item msgid="3906714200993111074">"DHCP"</item>
+ <item msgid="628395202971532382">"নিশ্চল"</item>
+ </string-array>
+ <string-array name="wifi_proxy_settings">
+ <item msgid="4473276491748503377">"নাই"</item>
+ <item msgid="8673874894887358090">"হস্তকৃত"</item>
+ <item msgid="168893341855953140">"প্ৰক্সি স্বয়ং-কনফিগাৰেশ্বন"</item>
+ </string-array>
+ <string-array name="apn_auth_entries">
+ <item msgid="3856896061242872146">"নাই"</item>
+ <item msgid="5756844015743664882">"PAP"</item>
+ <item msgid="535934025797984365">"CHAP"</item>
+ <item msgid="8383098660619805783">"PAP বা CHAP"</item>
+ </string-array>
+ <string-array name="apn_protocol_entries">
+ <item msgid="4852355456199302715">"IPv4"</item>
+ <item msgid="4394161344888484571">"IPv6"</item>
+ <item msgid="8084938354605535381">"IPv4/IPv6"</item>
+ </string-array>
+ <string-array name="bearer_entries">
+ <item msgid="1697455674244601285">"অনিৰ্দিষ্ট"</item>
+ <item msgid="1317061551798123908">"এলটিই"</item>
+ <item msgid="5005435684511894770">"HSPAP"</item>
+ <item msgid="7700603056475539235">"HSPA"</item>
+ <item msgid="245973007602397887">"HSUPA"</item>
+ <item msgid="6291566767651194016">"HSDPA"</item>
+ <item msgid="2005841400859926251">"UMTS"</item>
+ <item msgid="3757385691174882861">"EDGE"</item>
+ <item msgid="2979115073474306864">"জিপিআৰএছ"</item>
+ <item msgid="2271750502778879106">"eHRPD"</item>
+ <item msgid="4173379084783381337">"EVDO_B"</item>
+ <item msgid="2033682802005776093">"EVDO_A"</item>
+ <item msgid="5753917125831466719">"EVDO_0"</item>
+ <item msgid="4713807936577071142">"1xRTT"</item>
+ <item msgid="1142355797022021906">"IS95B"</item>
+ <item msgid="7471182818083460781">"IS95A"</item>
+ </string-array>
+ <string-array name="mvno_type_entries">
+ <item msgid="4367119357633573465">"নাই"</item>
+ <item msgid="6062567900587138000">"SPN"</item>
+ <item msgid="2454085083342423481">"IMSI"</item>
+ <item msgid="2681427309183221543">"GID"</item>
+ </string-array>
+ <string-array name="app_install_location_entries">
+ <item msgid="8151497958991952759">"আভ্যন্তৰীণ ডিভাইচ সঞ্চয়াগাৰ"</item>
+ <item msgid="3738430123799803530">"গুচাব পৰা SD কাৰ্ড"</item>
+ <item msgid="4498124044785815005">"ছিষ্টেমটোক সিদ্ধান্ত ল’বলৈ দিয়ক"</item>
+ </string-array>
+ <string-array name="app_ops_categories">
+ <item msgid="6358963769537892925">"অৱস্থান"</item>
+ <item msgid="255608127647030286">"ব্যক্তিগত"</item>
+ <item msgid="4588829735729884491">"মেছেজিং"</item>
+ <item msgid="886742181977884584">"মিডিয়া"</item>
+ <item msgid="7924928667052300589">"ডিভাইচ"</item>
+ </string-array>
+ <string-array name="app_ops_summaries">
+ <item msgid="4979188868761515915">"আনুমানিক অৱস্থান"</item>
+ <item msgid="5789673140227507995">"সঠিক অৱস্থান"</item>
+ <item msgid="1061584358377390581">"জিপিএছ"</item>
+ <item msgid="5387405117297558954">"কম্পন"</item>
+ <item msgid="3434165993711230924">"সম্পৰ্কসমূহ পঢ়ক"</item>
+ <item msgid="616161687718081936">"সম্পৰ্কসমূহ সংশোধন কৰক"</item>
+ <item msgid="7638002295329050091">"কলৰ লগ পঢ়ক"</item>
+ <item msgid="6546959730920410907">"কলৰ লগ সংশোধন কৰক"</item>
+ <item msgid="446877710771379667">"কেলেণ্ডাৰ পঢ়ক"</item>
+ <item msgid="7674458294386319722">"কেলেণ্ডাৰ সাল-সলনি কৰক"</item>
+ <item msgid="8281201165558093009">"ৱাই-ফাই স্কেন"</item>
+ <item msgid="8694611243479480497">"জাননী"</item>
+ <item msgid="7776439107987345446">"চেল স্কেন"</item>
+ <item msgid="514615766544675057">"ফ\'ন ক\'ল কৰক"</item>
+ <item msgid="8181415497109310680">"এছএমএছ পঢ়ক"</item>
+ <item msgid="6816551144382117307">"এছএমএছ লিখক"</item>
+ <item msgid="4600463921908905030">"SMS পাওক"</item>
+ <item msgid="5958926493289432745">"জৰূৰীকালীন এছএমএছ পাওক"</item>
+ <item msgid="4945269495221089540">"এমএমএছ পাওক"</item>
+ <item msgid="5570472453573929087">"WAP পুশ্ব পাওক"</item>
+ <item msgid="7125408150230860501">"এছএমএছ পঠিয়াওক"</item>
+ <item msgid="7080337936612188061">"আইচিচি এছএমএছ পঢ়ক"</item>
+ <item msgid="587124103118495063">"আইচিচি এছএমএছ লিখক"</item>
+ <item msgid="2320577158869025503">"ছেটিংবোৰ সংশোধন কৰক"</item>
+ <item msgid="1545733463471924009">"ওপৰত আঁকক"</item>
+ <item msgid="3609046903962454582">"জাননীত প্ৰৱেশ কৰক"</item>
+ <item msgid="4671646036128214513">"কেমেৰা"</item>
+ <item msgid="1097324338692486211">"ধ্বনি ৰেকৰ্ড কৰক"</item>
+ <item msgid="5031552983987798163">"অডিঅ’ প্লে কৰক"</item>
+ <item msgid="8374996688066472414">"ক্লিপব\'ৰ্ড পঢ়ক"</item>
+ <item msgid="3045529469061083747">"ক্লিপব\'ৰ্ড সংশোধন কৰক"</item>
+ <item msgid="5124443975763747838">"মিডিয়া বুটামসমূহ"</item>
+ <item msgid="4547883971364273343">"অডিঅ\' ফ\'কাছ"</item>
+ <item msgid="2603878814882344450">"মাষ্টাৰ ভলিউম"</item>
+ <item msgid="7136963238377062018">"ধ্বনিৰ ভলিউম"</item>
+ <item msgid="4270236897655923007">"ৰিঙৰ ভলিউম"</item>
+ <item msgid="6325739889222559394">"মিডিয়াৰ ভলিউম"</item>
+ <item msgid="5762123934816216821">"এলাৰ্মৰ ভলিউম"</item>
+ <item msgid="785049718065337473">"জাননীৰ ভলিউম"</item>
+ <item msgid="6700305533746877052">"ব্লুটুথ ভলিউম"</item>
+ <item msgid="2029227495214047094">"সক্ৰিয় কৰি ৰাখক"</item>
+ <item msgid="26109888160231211">"অৱস্থান নিৰীক্ষণ কৰক"</item>
+ <item msgid="5753382310468855812">"উচ্চ ক্ষমতাসম্পন্ন অৱস্থান নিৰীক্ষণ কৰক"</item>
+ <item msgid="3356591542543137332">"ব্যৱহাৰ পৰিসংখ্যা লাভ কৰক"</item>
+ <item msgid="3073734345226842233">"মাইক্ৰ\'ফ\'ন মিউট/আনমিউট কৰক"</item>
+ <item msgid="2111767435887685265">"ট’ষ্ট দেখুৱাওক"</item>
+ <item msgid="1091168669714823370">"মিডিয়া প্ৰ’জেক্ট কৰক"</item>
+ <item msgid="485564189219029300">"VPN সক্ৰিয় কৰক"</item>
+ <item msgid="7155384795265164395">"ৱালপেপাৰ লিখক"</item>
+ <item msgid="1835836196806147034">"সহায়ৰ গাঁঠনি"</item>
+ <item msgid="5989890403088155055">"সহায়ক স্ক্ৰীণশ্বট"</item>
+ <item msgid="8582699692765917557">"ফ\'নৰ স্থিতি পঢ়ক"</item>
+ <item msgid="1474039653814954902">"ভইচমেইল যোগ কৰক"</item>
+ <item msgid="7222837656938871633">"ছিপ ব্যৱহাৰ কৰক"</item>
+ <item msgid="6108267038969274380">"বৰ্হিগামী কল সম্পাদন কৰক"</item>
+ <item msgid="4823402479973873358">"ফিংগাৰপ্ৰিণ্ট"</item>
+ <item msgid="5895843015407713543">"শৰীৰৰ ছেন্সৰসমূহ"</item>
+ <item msgid="1436446526955010826">"চেল সম্প্ৰচাৰসমূহ পঢ়ক"</item>
+ <item msgid="884172201575690484">"নকল অৱস্থান"</item>
+ <item msgid="3591971310048485247">"সঞ্চয়াগাৰত পঢ়ক"</item>
+ <item msgid="4041187808621866119">"সঞ্চয়াগাৰত লিখক"</item>
+ <item msgid="6628873315024166197">"স্ক্ৰীণ অন কৰক"</item>
+ <item msgid="3253368931113490863">"একাউণ্টবোৰ বিচাৰক"</item>
+ <item msgid="780392378084812901">"নেপথ্যত চলাওক"</item>
+ <item msgid="2629748510881309577">"দিব্যাংসকলৰ বাবে থকা সুবিধাসমূহৰ ভলিউম"</item>
+ </string-array>
+ <string-array name="app_ops_labels">
+ <item msgid="6602854600289714121">"অৱস্থান"</item>
+ <item msgid="8677040780775113033">"অৱস্থান"</item>
+ <item msgid="1660743989948992916">"অৱস্থান"</item>
+ <item msgid="8791172739860195290">"কম্পন"</item>
+ <item msgid="383413555642128046">"সম্পৰ্কসূচী পঢ়ক"</item>
+ <item msgid="3654594895269697313">"সম্পৰ্কসূচী সংশোধন"</item>
+ <item msgid="7928393476362362538">"কল লগ পঢ়ক"</item>
+ <item msgid="6248591205254641116">"কল লগ সলনি কৰক"</item>
+ <item msgid="6093344633066170692">"কেলেণ্ডাৰ পঢ়ক"</item>
+ <item msgid="1334886368750347692">"কেলেণ্ডাৰ সংশোধন কৰক"</item>
+ <item msgid="1638204101698708656">"অৱস্থান"</item>
+ <item msgid="2154671955760380322">"প\'ষ্ট জাননী"</item>
+ <item msgid="4282477730595931828">"অৱস্থান"</item>
+ <item msgid="4891423912898525905">"ফ\'ন নম্বৰত কল কৰক"</item>
+ <item msgid="2623604824935968113">"এছএমএছ/এমএমএছ পঢ়ক"</item>
+ <item msgid="4420177125221176306">"এছএমএছ/এমএমএছ লিখক"</item>
+ <item msgid="3986142739951490025">"SMS/MMS পাওক"</item>
+ <item msgid="3984213795861739778">"এছএমএছ/এমএমএছ পাওক"</item>
+ <item msgid="3656243523752472788">"এছএমএছ/এমএমএছ পাওক"</item>
+ <item msgid="8105802370238551510">"SMS/MMS পাওক"</item>
+ <item msgid="1407766984645388488">"এছএমএছ/এমএমএছ পঠিয়াওক"</item>
+ <item msgid="3527273606643794973">"এছএমএছ/এমএমএছ পঢ়ক"</item>
+ <item msgid="4370895547001583812">"SMS/MMS লিখক"</item>
+ <item msgid="4218544235221631789">"ছেটিংসমূহ সংশোধন কৰক"</item>
+ <item msgid="736541391767350377">"ওপৰত আঁকক"</item>
+ <item msgid="5530815681721654194">"প্ৰৱেশৰ জাননীসমূহ"</item>
+ <item msgid="781213371706962767">"কেমেৰা"</item>
+ <item msgid="1720492593061838172">"ধ্বনি ৰেকৰ্ড কৰক"</item>
+ <item msgid="3493046322001257041">"অডিঅ\' প্লে কৰক"</item>
+ <item msgid="136815868796597058">"ক্লিপব\'ৰ্ড পঢ়ক"</item>
+ <item msgid="5238692940326972503">"ক্লিপব\'ৰ্ড সংশোধন কৰক"</item>
+ <item msgid="5753789168376302997">"মিডিয়া বুটাম"</item>
+ <item msgid="3265262911688671938">"অডিঅ\' ফ\'কাছ"</item>
+ <item msgid="2098976479485046797">"মাষ্টাৰ ভলিউম"</item>
+ <item msgid="5660213838861789350">"কণ্ঠস্বৰৰ ভলিউম"</item>
+ <item msgid="7983336752371254444">"ৰিঙৰ ভলিউম"</item>
+ <item msgid="7878027809189330917">"মধ্যমীয়া ভলিউম"</item>
+ <item msgid="7260546305036218513">"এলাৰ্মৰ ভলিউম"</item>
+ <item msgid="9103719301075748925">"জাননীৰ ভলিউম"</item>
+ <item msgid="7025966722295861512">"ব্লুটুথ ভলিউম"</item>
+ <item msgid="4665183401128289653">"জাগ্ৰত কৰি ৰাখক"</item>
+ <item msgid="8584357129746649222">"অৱস্থান"</item>
+ <item msgid="7669257279311110599">"অৱস্থান"</item>
+ <item msgid="3459320345690097795">"ব্যৱহাৰ পৰিসংখ্যা লাভ কৰক"</item>
+ <item msgid="1312534577834048535">"মাইক্ৰ\'ফ\'ন মিউট/আনমিউট কৰক"</item>
+ <item msgid="427580389823724225">"ট\'ষ্ট দেখুৱাওক"</item>
+ <item msgid="4992007785575926253">"মিডিয়া প্ৰ’জেক্ট কৰক"</item>
+ <item msgid="2482631530338029480">"ভিপিএন সক্ৰিয় কৰক"</item>
+ <item msgid="1662979573471871926">"ৱালপেপাৰ যোৰ দিয়ক"</item>
+ <item msgid="5964768335278263478">"সহায়ৰ গাঁথনি"</item>
+ <item msgid="2657138701132782702">"সহায় স্ক্ৰীণশ্বট"</item>
+ <item msgid="8571369610363539266">"ফ\'নৰ স্থিতি পঢ়ক"</item>
+ <item msgid="4542463358215230845">"ভইচমেইল যোগ কৰক"</item>
+ <item msgid="864565065016166003">"ছিপ ব্যৱহাৰ কৰক"</item>
+ <item msgid="1958009349883195116">"বৰ্হিগামী কল সম্পাদন কৰক"</item>
+ <item msgid="8526563410140613458">"ফিংগাৰপ্ৰিণ্ট"</item>
+ <item msgid="7864822459293570891">"শৰীৰৰ ছেন্সৰসমূহ"</item>
+ <item msgid="6798698496904810960">"চেল সম্প্ৰচাৰবোৰ পঢ়ক"</item>
+ <item msgid="5242052845700875820">"নকল অৱস্থান"</item>
+ <item msgid="1246296877820358565">"সঞ্চয়াগাৰ পঢ়ক"</item>
+ <item msgid="2404067308793740341">"সঞ্চয়াগাৰত লিখক"</item>
+ <item msgid="5832543806893763620">"স্ক্ৰীণ অন কৰক"</item>
+ <item msgid="5258373962467495905">"একাউণ্টবোৰ বিচাৰক"</item>
+ <item msgid="334625385979270703">"নেপথ্যত চলাওক"</item>
+ <item msgid="9039213578110332702">"দিব্যাংসকলৰ বাবে থকা সুবিধাসমূহৰ ভলিউম"</item>
+ </string-array>
+ <string-array name="long_press_timeout_selector_titles">
+ <item msgid="3511504869290423954">"চুটি"</item>
+ <item msgid="2560532955514699713">"মধ্যমীয়া"</item>
+ <item msgid="2372711992605524591">"দীঘল"</item>
+ </string-array>
+ <string-array name="captioning_typeface_selector_titles">
+ <item msgid="1319652728542138112">"ডিফ\'ল্ট"</item>
+ <item msgid="1016452621833735880">"ছানছ-ছেৰিফ"</item>
+ <item msgid="2496277987934654454">"ছানছ-ছেৰিফ ঘনীকৃত"</item>
+ <item msgid="7247838127505318669">"ছান-ছেৰিফ ম\'ন\'স্পেচ"</item>
+ <item msgid="4478414822462359763">"ছেৰিফ"</item>
+ <item msgid="7502451783483660829">"ছেৰিফ ম\'ন\'স্পেচ"</item>
+ <item msgid="639503332147461010">"অনানুষ্ঠানিক"</item>
+ <item msgid="7967169925231332424">"পকোৱা আখৰ"</item>
+ <item msgid="561832997193039673">"সৰু বৰফলাৰ আখৰ"</item>
+ </string-array>
+ <string-array name="captioning_font_size_selector_titles">
+ <item msgid="4800919809575254054">"নিচেই সৰু"</item>
+ <item msgid="6781094565687692782">"সৰু"</item>
+ <item msgid="8222123259497646551">"সাধাৰণ"</item>
+ <item msgid="5813217276778560466">"ডাঙৰ"</item>
+ <item msgid="9044232017390975191">"অতি ডাঙৰ"</item>
+ </string-array>
+ <string-array name="captioning_edge_type_selector_titles">
+ <item msgid="4733815704128258753">"ডিফ\'ল্ট"</item>
+ <item msgid="3217099060748617005">"নাই"</item>
+ <item msgid="7467615139904599420">"ৰূপৰেখা"</item>
+ <item msgid="5623165557468608975">"ছাঁযুক্ত আখৰ"</item>
+ <item msgid="8088451174058214588">"উঠঙা"</item>
+ <item msgid="3821418743395480313">"পোটোকা পৰা"</item>
+ </string-array>
+ <string-array name="captioning_opacity_selector_titles">
+ <item msgid="7622491218136667566">"২৫%"</item>
+ <item msgid="2367156416247936773">"৫০%"</item>
+ <item msgid="5395560410107149298">"৭৫%"</item>
+ <item msgid="8342334626783983353">"১০০%"</item>
+ </string-array>
+ <string-array name="captioning_preset_selector_titles">
+ <item msgid="7009918361545506251">"এপৰ ডিফ\'ল্টসমূহ ব্যৱহাৰ কৰক"</item>
+ <item msgid="1770533843436933500">"ক\'লাৰ ওপৰত বগা"</item>
+ <item msgid="758587126802411846">"বগা ওপৰত ক’লা"</item>
+ <item msgid="1495307195241623402">"ক\'লাৰ ওপৰত হালধীয়া"</item>
+ <item msgid="6039700130994371612">"নীলাৰ ওপৰত হালধীয়া"</item>
+ <item msgid="7169235156349580064">"নিজৰ উপযোগিতা অনুযায়ী তৈয়াৰ কৰা"</item>
+ </string-array>
+ <string-array name="vpn_types_long">
+ <item msgid="2732002039459078847">"পিপিটিপি ভিপিএন"</item>
+ <item msgid="3799752201662127867">"পূৰ্বে ভাগ-বতৰা কৰা কীসমূহৰ সৈতে L2TP/IPSec ভিপিএন"</item>
+ <item msgid="4725504331295252103">"প্ৰমাণপত্ৰসহ L2TP/IPSec ভিপিএন"</item>
+ <item msgid="7526551163264034377">"পূৰ্বতে শ্বেয়াৰ কৰা কী আৰু Xauth সত্যাপনসহ IPSec ভিপিএন"</item>
+ <item msgid="8064740940687465039">"প্ৰমাণপত্ৰ আৰু Xauth বিশ্ৱাসযোগ্যতা প্ৰামাণিকৰণৰ সৈতে IPSec ভিপিএন"</item>
+ <item msgid="4946199982372391490">"প্ৰমাণপত্ৰ আৰু হাইব্ৰিড সত্যাপনসহ IPSec ভিপিএন"</item>
+ </string-array>
+ <string-array name="vpn_states">
+ <item msgid="8621078286418985762">"সংযোগ বিচ্ছিন্ন"</item>
+ <item msgid="6692305604213080515">"আৰম্ভ কৰা হৈছে…"</item>
+ <item msgid="8001704909356800092">"সংযোগ কৰি থকা হৈছে…"</item>
+ <item msgid="4039737283841672166">"সংযোজিত হৈ আছে"</item>
+ <item msgid="4042143101664725090">"সময় উকলিছে"</item>
+ <item msgid="7664124146786465092">"বিফল হৈছে"</item>
+ </string-array>
+ <string-array name="security_settings_premium_sms_values">
+ <item msgid="7389829271787670252">"সোধক"</item>
+ <item msgid="5077768429488260031">"কেতিয়াও অনুমতি নিদিব"</item>
+ <item msgid="1417929597727989746">"চিৰদিনৰ বাবে অনুমোদন"</item>
+ </string-array>
+ <string-array name="ram_states">
+ <item msgid="3944681673818150669">"সাধাৰণ"</item>
+ <item msgid="3256987280393708586">"মজলীয়া"</item>
+ <item msgid="4662917179231875995">"নিম্ন"</item>
+ <item msgid="5264929699714647509">"সংকটপূৰ্ণ"</item>
+ <item msgid="5606155978847838966">"?"</item>
+ </string-array>
+ <string-array name="proc_stats_memory_states">
+ <item msgid="8845855295876909468">"সাধাৰণ"</item>
+ <item msgid="866544120205026771">"মজলীয়া"</item>
+ <item msgid="7851902244436886890">"নিম্ন"</item>
+ <item msgid="3022922196817563960">"জটিল"</item>
+ </string-array>
+ <string-array name="proc_stats_process_states">
+ <item msgid="5069825997142785829">"নেৰানেপেৰা"</item>
+ <item msgid="5779398140277006695">"শীৰ্ষ কাৰ্যকলাপ"</item>
+ <item msgid="1439598363694578255">"গুৰুত্বপূৰ্ণ (নেপথ্য)"</item>
+ <item msgid="3396458970745718652">"গুৰুত্বপূৰ্ণ (নেপথ্য)"</item>
+ <item msgid="5214825238247511992">"বেকআপ"</item>
+ <item msgid="311372689168254967">"অত্য়ধিক"</item>
+ <item msgid="7438189122367820362">"সেৱা (চলিত)"</item>
+ <item msgid="918687422516982498">"সেৱা (ৰিষ্টাৰ্ট কৰা হৈছে)"</item>
+ <item msgid="6807727069641853029">"ৰিচিভাৰ"</item>
+ <item msgid="6782857406100845127">"হ\'ম"</item>
+ <item msgid="2860945127596974299">"অন্তিম কাৰ্যকলাপ"</item>
+ <item msgid="8610560843693675830">"কেশ্ব কৰা হোৱা (কাৰ্যকলাপ)"</item>
+ <item msgid="4338089220026248848">"কেশ্ব কৰা হোৱা (কাৰ্যকলাপ গ্ৰাহক)"</item>
+ <item msgid="6652164677254579050">"কেশ্ব কৰা হোৱা (খালী)"</item>
+ </string-array>
+ <string-array name="color_picker">
+ <item msgid="7631642672260600032">"গাঢ় সেউজ-নীলা"</item>
+ <item msgid="8332294763632946560">"নীলা"</item>
+ <item msgid="2023216417616991392">"ইণ্ডিগ\'"</item>
+ <item msgid="3170497246594232819">"বেঙুনীয়া"</item>
+ <item msgid="4608643045752965568">"গুলপীয়া"</item>
+ <item msgid="6131821495505931173">"ৰঙা"</item>
+ </string-array>
+ <string-array name="automatic_storage_management_days">
+ <item msgid="687318592238852312">"৩০দিনতকৈ অধিক পুৰণি"</item>
+ <item msgid="2900554746706302178">"৬০ দিনতকৈ অধিক পুৰণি"</item>
+ <item msgid="5692284879054004388">"৯০ দিনতকৈ অধিক পুৰণি"</item>
+ </string-array>
+ <string-array name="wifi_metered_entries">
+ <item msgid="2975784243692054526">"নেটৱৰ্ক অগ্ৰাধিকাৰ ব্যৱহাৰ কৰক"</item>
+ <item msgid="8745603368609022803">"মিটাৰ কৰা হিছাপে আচৰণ কৰক"</item>
+ <item msgid="2266114985518865625">"নিৰিখ অনিৰ্দিষ্ট বুলি গণ্য কৰক"</item>
+ </string-array>
+</resources>
diff --git a/res/values-as/config.xml b/res/values-as/config.xml
new file mode 100644
index 0000000..153e247
--- /dev/null
+++ b/res/values-as/config.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2007 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="config_backup_settings_label" msgid="4423938073600296337"></string>
+</resources>
diff --git a/res/values-az/strings.xml b/res/values-az/strings.xml
index 43ce3e2..82ac422 100644
--- a/res/values-az/strings.xml
+++ b/res/values-az/strings.xml
@@ -3358,6 +3358,10 @@
<string name="usb_use_MIDI_desc" msgid="8473936990076693175">"Bu cihazı MIDI kimi istifadə edin"</string>
<string name="usb_use" msgid="3372728031108932425">"USB istifadəsi"</string>
<string name="usb_use_also" msgid="557340935190819370">"USB istifadə edin"</string>
+ <!-- no translation found for usb_default_label (4217189967858707974) -->
+ <skip />
+ <!-- no translation found for usb_default_info (8864535445796200695) -->
+ <skip />
<string name="usb_pref" msgid="1400617804525116158">"USB"</string>
<string name="usb_summary_charging_only" msgid="7544327009143659751">"Enerji dodlurulması"</string>
<string name="usb_summary_power_only" msgid="1996391096369798526">"Qoşulmuş cihaza enerji doldurulur"</string>
diff --git a/res/values-b+sr+Latn/strings.xml b/res/values-b+sr+Latn/strings.xml
index e260cca..6070700 100644
--- a/res/values-b+sr+Latn/strings.xml
+++ b/res/values-b+sr+Latn/strings.xml
@@ -3403,6 +3403,10 @@
<string name="usb_use_MIDI_desc" msgid="8473936990076693175">"Koristite ovaj uređaj kao MIDI"</string>
<string name="usb_use" msgid="3372728031108932425">"Koristi USB za"</string>
<string name="usb_use_also" msgid="557340935190819370">"Koristite USB i za"</string>
+ <!-- no translation found for usb_default_label (4217189967858707974) -->
+ <skip />
+ <!-- no translation found for usb_default_info (8864535445796200695) -->
+ <skip />
<string name="usb_pref" msgid="1400617804525116158">"USB"</string>
<string name="usb_summary_charging_only" msgid="7544327009143659751">"Punjenje uređaja"</string>
<string name="usb_summary_power_only" msgid="1996391096369798526">"Punjenje povezanog uređaja"</string>
diff --git a/res/values-be/strings.xml b/res/values-be/strings.xml
index cfd1152..7734be5 100644
--- a/res/values-be/strings.xml
+++ b/res/values-be/strings.xml
@@ -488,8 +488,7 @@
<string name="setup_lock_settings_picker_title" product="tablet" msgid="90329443364067215">"Абараніце свой планшэт"</string>
<string name="setup_lock_settings_picker_title" product="device" msgid="2399952075134938929">"Абараніце сваю прыладу"</string>
<string name="setup_lock_settings_picker_title" product="default" msgid="1572244299605153324">"Абараніце свой тэлефон"</string>
- <!-- no translation found for lock_settings_picker_fingerprint_added_security_message (5008939545428518367) -->
- <skip />
+ <string name="lock_settings_picker_fingerprint_added_security_message" msgid="5008939545428518367">"Для большай бяспекі наладзьце дадатковы спосаб блакіроўкі экрана"</string>
<string name="setup_lock_settings_picker_message" product="tablet" msgid="8919671129189936210">"Прадухіліце выкарыстанне гэтага планшэта без вашага дазволу, актываваўшы функцыі абароны прылады. Выберыце спосаб блакіроўкі экрана, які вы хочаце выкарыстоўваць."</string>
<string name="setup_lock_settings_picker_message" product="device" msgid="3787276514406353777">"Прадухіліце выкарыстанне гэтай прылады без вашага дазволу, актываваўшы функцыі абароны прылады. Выберыце спосаб блакіроўкі экрана, які вы хочаце выкарыстоўваць."</string>
<string name="setup_lock_settings_picker_message" product="default" msgid="3692856437543730446">"Прадухіліце выкарыстанне гэтага тэлефона без вашага дазволу, актываваўшы функцыі абароны прылады. Выберыце спосаб блакіроўкі экрана, які вы хочаце выкарыстоўваць."</string>
@@ -948,8 +947,7 @@
<string name="wifi_hotspot_configure_ap_text" msgid="5478614731464220432">"Усталёўка пункту доступу Wi‑Fi"</string>
<string name="wifi_hotspot_configure_ap_text_summary" msgid="5560680057727007011">"Хот-спот AndroidAP WPA2 PSK"</string>
<string name="wifi_tether_configure_ssid_default" msgid="8467525402622138547">"AndroidHotspot"</string>
- <!-- no translation found for wifi_tether_disabled_by_airplane (414480185654767932) -->
- <skip />
+ <string name="wifi_tether_disabled_by_airplane" msgid="414480185654767932">"Функцыя недаступная, бо ўключаны рэжым палёту"</string>
<string name="wifi_calling_settings_title" msgid="4102921303993404577">"Wi-Fi-тэлефанія"</string>
<string name="wifi_calling_suggestion_title" msgid="7766895085362824508">"Рабіце выклікі праз Wi‑Fi"</string>
<string name="wifi_calling_suggestion_summary" msgid="6460250990899143406">"Уключыце Wi-Fi-тэлефанію"</string>
@@ -1518,17 +1516,13 @@
<string name="settings_safetylegal_activity_title" msgid="6901214628496951727">"Інфармацыя аб бяспецы"</string>
<string name="settings_safetylegal_activity_unreachable" msgid="142307697309858185">"Падключэнне да інтэрнэту адсутнічае. Каб праглядзець гэтую інфармацыю, наведайце %s з любога камп\'ютара, падключанага да інтэрнэту."</string>
<string name="settings_safetylegal_activity_loading" msgid="8059022597639516348">"Загрузка..."</string>
- <!-- no translation found for lockpassword_choose_your_screen_lock_header (2942199737559900752) -->
- <skip />
- <!-- no translation found for lockpassword_choose_your_password_message (5377842480961577542) -->
- <skip />
+ <string name="lockpassword_choose_your_screen_lock_header" msgid="2942199737559900752">"Наладзьце блакіроўку экрана"</string>
+ <string name="lockpassword_choose_your_password_message" msgid="5377842480961577542">"Задайце пароль, каб абараніць прыладу"</string>
<string name="lockpassword_choose_your_password_header_for_fingerprint" msgid="6624409510609085450">"Перш чым карыстацца адбіткам пальца, задайце пароль"</string>
<string name="lockpassword_choose_your_pattern_header_for_fingerprint" msgid="5901096361617543819">"Спачатку задайце ўзор"</string>
- <!-- no translation found for lockpassword_choose_your_pin_message (6658264750811929338) -->
- <skip />
+ <string name="lockpassword_choose_your_pin_message" msgid="6658264750811929338">"Задайце PIN-код, каб абараніць прыладу"</string>
<string name="lockpassword_choose_your_pin_header_for_fingerprint" msgid="765344692615917183">"Каб карыст. адбіт. пальца, задайце PIN-код"</string>
- <!-- no translation found for lockpassword_choose_your_pattern_message (8631545254345759087) -->
- <skip />
+ <string name="lockpassword_choose_your_pattern_message" msgid="8631545254345759087">"Задайце ўзор разблакіроўкі, каб абараніць прыладу"</string>
<string name="lockpassword_confirm_your_password_header" msgid="1266027268220850931">"Увядзіце пароль яшчэ раз"</string>
<string name="lockpassword_confirm_your_pattern_header" msgid="7543433733032330821">"Пацвердзіце ўзор"</string>
<string name="lockpassword_confirm_your_pin_header" msgid="7744513791910572550">"Увядзіце PIN-код яшчэ раз"</string>
@@ -3456,6 +3450,10 @@
<string name="usb_use_MIDI_desc" msgid="8473936990076693175">"Выкарыстоўваць гэту прыладу ў якасці MIDI"</string>
<string name="usb_use" msgid="3372728031108932425">"Выкарыстоўваць USB для"</string>
<string name="usb_use_also" msgid="557340935190819370">"Іншыя рэжымы працы USB"</string>
+ <!-- no translation found for usb_default_label (4217189967858707974) -->
+ <skip />
+ <!-- no translation found for usb_default_info (8864535445796200695) -->
+ <skip />
<string name="usb_pref" msgid="1400617804525116158">"USB"</string>
<string name="usb_summary_charging_only" msgid="7544327009143659751">"Зарадка гэтай прылады"</string>
<string name="usb_summary_power_only" msgid="1996391096369798526">"Зарадка падключанай прылады"</string>
@@ -3942,8 +3940,7 @@
<string name="storage_percent_full" msgid="6095012055875077036">"занята"</string>
<string name="clear_instant_app_data" msgid="2004222610585890909">"Ачысціць даныя праграмы"</string>
<string name="clear_instant_app_confirmation" msgid="7451671214898856857">"Хочаце выдаліць гэту імгненную праграму?"</string>
- <!-- no translation found for launch_instant_app (391581144859010499) -->
- <skip />
+ <string name="launch_instant_app" msgid="391581144859010499">"Адкрыць"</string>
<string name="game_storage_settings" msgid="3410689937046696557">"Гульні"</string>
<string name="audio_files_title" msgid="4777048870657911307">"Аўдыяфайлы"</string>
<string name="app_info_storage_title" msgid="5554719444625611987">"Занятае месца"</string>
diff --git a/res/values-bg/strings.xml b/res/values-bg/strings.xml
index 7c9fa03..294da2c 100644
--- a/res/values-bg/strings.xml
+++ b/res/values-bg/strings.xml
@@ -3358,6 +3358,10 @@
<string name="usb_use_MIDI_desc" msgid="8473936990076693175">"Използване на това устройство като MIDI"</string>
<string name="usb_use" msgid="3372728031108932425">"Използване на USB за"</string>
<string name="usb_use_also" msgid="557340935190819370">"Използване на USB и за"</string>
+ <!-- no translation found for usb_default_label (4217189967858707974) -->
+ <skip />
+ <!-- no translation found for usb_default_info (8864535445796200695) -->
+ <skip />
<string name="usb_pref" msgid="1400617804525116158">"USB"</string>
<string name="usb_summary_charging_only" msgid="7544327009143659751">"Зареждане на това устройство"</string>
<string name="usb_summary_power_only" msgid="1996391096369798526">"Зареждане на свързаното устройство"</string>
@@ -3810,8 +3814,7 @@
<string name="storage_percent_full" msgid="6095012055875077036">"ползв."</string>
<string name="clear_instant_app_data" msgid="2004222610585890909">"Изчистване на приложението"</string>
<string name="clear_instant_app_confirmation" msgid="7451671214898856857">"Искате ли да премахнете това мигновено приложение?"</string>
- <!-- no translation found for launch_instant_app (391581144859010499) -->
- <skip />
+ <string name="launch_instant_app" msgid="391581144859010499">"Отваряне"</string>
<string name="game_storage_settings" msgid="3410689937046696557">"Игри"</string>
<string name="audio_files_title" msgid="4777048870657911307">"Аудиофайлове"</string>
<string name="app_info_storage_title" msgid="5554719444625611987">"Използвано място"</string>
diff --git a/res/values-bn/strings.xml b/res/values-bn/strings.xml
index 802df7f..e7ab661 100644
--- a/res/values-bn/strings.xml
+++ b/res/values-bn/strings.xml
@@ -482,8 +482,7 @@
<string name="setup_lock_settings_picker_title" product="tablet" msgid="90329443364067215">"আপনার ট্যাবলেটটিকে নিরাপদ করুন"</string>
<string name="setup_lock_settings_picker_title" product="device" msgid="2399952075134938929">"আপনার ডিভাইসটিকে নিরাপদ করুন"</string>
<string name="setup_lock_settings_picker_title" product="default" msgid="1572244299605153324">"আপনার ফোন রক্ষা করুন"</string>
- <!-- no translation found for lock_settings_picker_fingerprint_added_security_message (5008939545428518367) -->
- <skip />
+ <string name="lock_settings_picker_fingerprint_added_security_message" msgid="5008939545428518367">"অতিরিক্ত নিরাপত্তার জন্য একটি ব্যাক-আপ স্ক্রিন লক সেট করুন"</string>
<string name="setup_lock_settings_picker_message" product="tablet" msgid="8919671129189936210">"ডিভাইস সুরক্ষা বৈশিষ্ট্যগুলি সক্রিয় করার দ্বারা আপনার অনুমতি ছাড়া অন্যদের এই ট্যাবলেটটি ব্যবহার করা থেকে আটকান৷ আপনি ব্যবহার করতে চান এমন স্ক্রিন লক বেছে নিন৷"</string>
<string name="setup_lock_settings_picker_message" product="device" msgid="3787276514406353777">"ডিভাইস সুরক্ষা বৈশিষ্ট্যগুলি সক্রিয় করার দ্বারা আপনার অনুমতি ছাড়া অন্যদের এই ডিভাইসটি ব্যবহার করা থেকে আটকান৷ আপনি ব্যবহার করতে চান এমন স্ক্রিন লক বেছে নিন৷"</string>
<string name="setup_lock_settings_picker_message" product="default" msgid="3692856437543730446">"ডিভাইস সুরক্ষা বৈশিষ্ট্যগুলি সক্রিয় করার দ্বারা আপনার অনুমতি ছাড়া অন্যদের এই ফোনটি ব্যবহার করা থেকে আটকান৷ আপনি ব্যবহার করতে চান এমন স্ক্রিন লক বেছে নিন৷"</string>
@@ -924,8 +923,7 @@
<string name="wifi_hotspot_configure_ap_text" msgid="5478614731464220432">"ওয়াই-ফাই হটস্পট সেটআপ"</string>
<string name="wifi_hotspot_configure_ap_text_summary" msgid="5560680057727007011">"AndroidAP WPA2 PSK হটস্পট"</string>
<string name="wifi_tether_configure_ssid_default" msgid="8467525402622138547">"AndroidHotspot"</string>
- <!-- no translation found for wifi_tether_disabled_by_airplane (414480185654767932) -->
- <skip />
+ <string name="wifi_tether_disabled_by_airplane" msgid="414480185654767932">"বিমান মোড চালু থাকার কারণে এটি উপলভ্য নয়"</string>
<string name="wifi_calling_settings_title" msgid="4102921303993404577">"ওয়াই-ফাই কলিং"</string>
<string name="wifi_calling_suggestion_title" msgid="7766895085362824508">"ওয়াই-ফাই দিয়ে কল কভারেজ বাড়ান"</string>
<string name="wifi_calling_suggestion_summary" msgid="6460250990899143406">"ওয়াই-ফাই কলিং চালু করুন"</string>
@@ -1491,17 +1489,13 @@
<string name="settings_safetylegal_activity_title" msgid="6901214628496951727">"নিরাপত্তা তথ্য"</string>
<string name="settings_safetylegal_activity_unreachable" msgid="142307697309858185">"ডেটা সংযোগ নেই। এই তথ্য এখনই দেখার জন্য ইন্টারনেটে সংযুক্ত যে কোনও কম্পিউটার থেকে %s এ যান।"</string>
<string name="settings_safetylegal_activity_loading" msgid="8059022597639516348">"লোড হচ্ছে..."</string>
- <!-- no translation found for lockpassword_choose_your_screen_lock_header (2942199737559900752) -->
- <skip />
- <!-- no translation found for lockpassword_choose_your_password_message (5377842480961577542) -->
- <skip />
+ <string name="lockpassword_choose_your_screen_lock_header" msgid="2942199737559900752">"স্ক্রিন লক সেট করুন"</string>
+ <string name="lockpassword_choose_your_password_message" msgid="5377842480961577542">"নিরাপত্তার জন্য, পাসওয়ার্ড সেট করুন"</string>
<string name="lockpassword_choose_your_password_header_for_fingerprint" msgid="6624409510609085450">"আঙ্গুলের ছাপ ব্যবহার করার জন্য পাসওয়ার্ড সেট করুন"</string>
<string name="lockpassword_choose_your_pattern_header_for_fingerprint" msgid="5901096361617543819">"আঙ্গুলের ছাপ ব্যবহার করার জন্য প্যাটার্ন সেট করুন"</string>
- <!-- no translation found for lockpassword_choose_your_pin_message (6658264750811929338) -->
- <skip />
+ <string name="lockpassword_choose_your_pin_message" msgid="6658264750811929338">"নিরাপত্তার জন্য, পিন সেট করুন"</string>
<string name="lockpassword_choose_your_pin_header_for_fingerprint" msgid="765344692615917183">"আঙ্গুলের ছাপ ব্যবহার করার জন্য পিন সেট করুন"</string>
- <!-- no translation found for lockpassword_choose_your_pattern_message (8631545254345759087) -->
- <skip />
+ <string name="lockpassword_choose_your_pattern_message" msgid="8631545254345759087">"নিরাপত্তার জন্য, প্যাটার্ন সেট করুন"</string>
<string name="lockpassword_confirm_your_password_header" msgid="1266027268220850931">"আপনার পাসওয়ার্ডটি আবার লিখুন"</string>
<string name="lockpassword_confirm_your_pattern_header" msgid="7543433733032330821">"আপনার প্যাটার্ন নিশ্চিত করুন"</string>
<string name="lockpassword_confirm_your_pin_header" msgid="7744513791910572550">"আপনার পিনটি আবার লিখুন"</string>
@@ -3364,6 +3358,10 @@
<string name="usb_use_MIDI_desc" msgid="8473936990076693175">"MIDI হিসেবে এই ডিভাইসটি ব্যবহার করুন"</string>
<string name="usb_use" msgid="3372728031108932425">"এর জন্য USB ব্যবহার করুন"</string>
<string name="usb_use_also" msgid="557340935190819370">"এছাড়া এই সমস্ত কাজেও USB ব্যবহার করুন:"</string>
+ <!-- no translation found for usb_default_label (4217189967858707974) -->
+ <skip />
+ <!-- no translation found for usb_default_info (8864535445796200695) -->
+ <skip />
<string name="usb_pref" msgid="1400617804525116158">"USB"</string>
<string name="usb_summary_charging_only" msgid="7544327009143659751">"এই ডিভাইসটি চার্জ করা হচ্ছে"</string>
<string name="usb_summary_power_only" msgid="1996391096369798526">"সংযুক্ত ডিভাইসে চার্জ দেওয়া"</string>
@@ -3816,8 +3814,7 @@
<string name="storage_percent_full" msgid="6095012055875077036">"ব্যবহৃত"</string>
<string name="clear_instant_app_data" msgid="2004222610585890909">"অ্যাপের ডেটা সাফ করুন"</string>
<string name="clear_instant_app_confirmation" msgid="7451671214898856857">"আপনি কি এই ঝটপট অ্যাপটি সরাতে চান?"</string>
- <!-- no translation found for launch_instant_app (391581144859010499) -->
- <skip />
+ <string name="launch_instant_app" msgid="391581144859010499">"চালু করুন"</string>
<string name="game_storage_settings" msgid="3410689937046696557">"গেম্স"</string>
<string name="audio_files_title" msgid="4777048870657911307">"অডিও ফাইলগুলি"</string>
<string name="app_info_storage_title" msgid="5554719444625611987">"স্টোরেজ ব্যবহার হয়েছে"</string>
diff --git a/res/values-bs/arrays.xml b/res/values-bs/arrays.xml
index 8dd114d..7fea8d8 100644
--- a/res/values-bs/arrays.xml
+++ b/res/values-bs/arrays.xml
@@ -497,4 +497,7 @@
<item msgid="8745603368609022803">"Tretiraj kao vezu s ograničenjem"</item>
<item msgid="2266114985518865625">"Tretiraj kao vezu bez ograničenja"</item>
</string-array>
+ <!-- no translation found for dark_ui_mode_entries:0 (146804192658443142) -->
+ <!-- no translation found for dark_ui_mode_entries:1 (6620560879508595181) -->
+ <!-- no translation found for dark_ui_mode_entries:2 (6385301106124765323) -->
</resources>
diff --git a/res/values-bs/strings.xml b/res/values-bs/strings.xml
index 942999a..8f62501 100644
--- a/res/values-bs/strings.xml
+++ b/res/values-bs/strings.xml
@@ -445,8 +445,8 @@
<string name="crypt_keeper_encrypt_title" product="tablet" msgid="1060273569887301457">"Šifriraj tablet"</string>
<string name="crypt_keeper_encrypt_title" product="default" msgid="1878996487755806122">"Šifriranje telefona"</string>
<string name="crypt_keeper_encrypted_summary" msgid="1868233637888132906">"Šifrirano"</string>
- <string name="crypt_keeper_desc" product="tablet" msgid="503014594435731275">"Možete šifrirati svoje račune, postavke, preuzete aplikacije i njihove podatke, medijske podatke i druge datoteke. Nakon šifriranja tableta, uz pretpostavku da ste postavili zaključavanje ekrana (tj. postavili uzorak, numerički PIN ili lozinku), bit će potrebno da otključate ekran prilikom svakog uključivanja kako biste izvršili dešifriranje. Jedina alternativa dešifriranju je ponovno postavljanje na fabričke postavke uz brisanje svih vaših podataka.\n\nZa šifriranje je potreban jedan sat ili duže. Morate započeti sa napunjenom baterijom, a tablet treba biti priključen na napajanje tokom cijelog postupka. U slučaju prekida, izgubit ćete jedan dio ili sve svoje podatke"</string>
- <string name="crypt_keeper_desc" product="default" msgid="2579929266645543631">"Možete šifrirati svoje račune, postavke, preuzete aplikacije i njihove podatke, medijske sadržaje i druge datoteke. Nakon šifriranja telefona, uz pretpostavku da ste postavili zaključavanje ekrana (tj. postavili uzorak, numerički PIN ili lozinku), bit će potrebno da otključate ekran prilikom svakog uključivanja kako biste izvršili dešifriranje. Jedina alternativa dešifriranju je ponovno postavljanje na fabričke postavke uz brisanje svih vaših podataka.\n\nZa šifriranje je potreban jedan sat ili duže. Morate započeti sa napunjenom baterijom, a telefon treba biti priključen na napajanje tokom cijelog postupka. U slučaju prekida, izgubit ćete jedan dio ili sve svoje podatke."</string>
+ <string name="crypt_keeper_desc" product="tablet" msgid="503014594435731275">"Možete šifrirati svoje račune, postavke, preuzete aplikacije i njihove podatke, medijske podatke i druge fajlove. Nakon šifriranja tableta, uz pretpostavku da ste postavili zaključavanje ekrana (tj. postavili uzorak, numerički PIN ili lozinku), bit će potrebno da otključate ekran prilikom svakog uključivanja kako biste izvršili dešifriranje. Jedina alternativa dešifriranju je ponovno postavljanje na fabričke postavke uz brisanje svih vaših podataka.\n\nZa šifriranje je potreban jedan sat ili duže. Morate započeti sa napunjenom baterijom, a tablet treba biti priključen na napajanje tokom cijelog postupka. U slučaju prekida, izgubit ćete jedan dio ili sve svoje podatke"</string>
+ <string name="crypt_keeper_desc" product="default" msgid="2579929266645543631">"Možete šifrirati svoje račune, postavke, preuzete aplikacije i njihove podatke, medijske sadržaje i druge fajlove. Nakon šifriranja telefona, uz pretpostavku da ste postavili zaključavanje ekrana (tj. postavili uzorak, numerički PIN ili lozinku), bit će potrebno da otključate ekran prilikom svakog uključivanja kako biste izvršili dešifriranje. Jedina alternativa dešifriranju je ponovno postavljanje na fabričke postavke uz brisanje svih vaših podataka.\n\nZa šifriranje je potreban jedan sat ili duže. Morate započeti sa napunjenom baterijom, a telefon treba biti priključen na napajanje tokom cijelog postupka. U slučaju prekida, izgubit ćete jedan dio ili sve svoje podatke."</string>
<string name="crypt_keeper_button_text" product="tablet" msgid="1189623490604750854">"Šifriraj tablet"</string>
<string name="crypt_keeper_button_text" product="default" msgid="2008346408473255519">"Šifriraj telefon"</string>
<string name="crypt_keeper_low_charge_text" msgid="2029407131227814893">"Napunite bateriju i pokušajte ponovo."</string>
@@ -718,6 +718,10 @@
<string name="bluetooth_dock_settings_remember" msgid="5551459057010609115">"Zapamti postavke"</string>
<string name="bluetooth_max_connected_audio_devices_string" msgid="6752690395207847881">"Maksimalan broj povezanih Bluetooth audio uređaja"</string>
<string name="bluetooth_max_connected_audio_devices_dialog_title" msgid="5936561749790095473">"Izaberite maksimalan broj povezanih Bluetooth audio uređaja"</string>
+ <!-- no translation found for bluetooth_enable_avdtp_delay_reports (5101903170688399944) -->
+ <skip />
+ <!-- no translation found for bluetooth_enable_avdtp_delay_reports_summary (7052797876020616399) -->
+ <skip />
<string name="wifi_display_settings_title" msgid="8740852850033480136">"Emitiranje"</string>
<string name="wifi_display_enable_menu_item" msgid="4883036464138167674">"Omogući bežični prikaz"</string>
<string name="wifi_display_no_devices_found" msgid="1382012407154143453">"Nije pronađen nijedan uređaj u blizini."</string>
@@ -1211,7 +1215,7 @@
<string name="memory_downloads_usage" msgid="3755173051677533027">"Preuzimanja"</string>
<string name="memory_dcim_usage" msgid="558887013613822577">"Slike, videozapisi"</string>
<string name="memory_music_usage" msgid="1363785144783011606">"Zvuk (muzika, melodije zvona, podcasti itd.)"</string>
- <string name="memory_media_misc_usage" msgid="6094866738586451683">"Druge datoteke"</string>
+ <string name="memory_media_misc_usage" msgid="6094866738586451683">"Drugi fajlovi"</string>
<string name="memory_media_cache_usage" msgid="6704293333141177910">"Keširani podaci"</string>
<string name="sd_eject" product="nosdcard" msgid="4988563376492400073">"Deaktiviraj dijeljenu pohranu"</string>
<string name="sd_eject" product="default" msgid="6915293408836853020">"Deaktiviraj SD karticu"</string>
@@ -1261,7 +1265,7 @@
<string name="usb_mtp_title" msgid="3399663424394065964">"Medijski uređaj (MTP)"</string>
<string name="usb_mtp_summary" msgid="4617321473211391236">"Omogućava prenošenje medijskih fajlova u Windows ili korištenje Android File Transfer aplikacije za Mac (pogledajte www.android.com/filetransfer)"</string>
<string name="usb_ptp_title" msgid="3852760810622389620">"Kamera (PTP)"</string>
- <string name="usb_ptp_summary" msgid="7406889433172511530">"Omogućava vam da prenesete fotografije pomoću softvera fotoaparata i da prenesete sve datoteke na računare koji ne podržavaju MTP"</string>
+ <string name="usb_ptp_summary" msgid="7406889433172511530">"Omogućava vam da prenesete fotografije pomoću softvera fotoaparata i da prenesete sve fajlove na računare koji ne podržavaju MTP"</string>
<string name="usb_midi_title" msgid="3069990264258413994">"MIDI"</string>
<string name="usb_midi_summary" msgid="539169474810956358">"Omogućava da MIDI omogućene aplikacije rade preko USB-a sa MIDI softverom na vašem računaru."</string>
<string name="storage_other_users" msgid="808708845102611856">"Drugi korisnici"</string>
@@ -1281,8 +1285,8 @@
<string name="storage_dialog_unmounted" msgid="6403320870103261477">"Ovaj uređaj (<xliff:g id="NAME_0">^1</xliff:g>) je uspješno uklonjen, ali je i dalje dostupan. \n\nDa biste koristili uređaj <xliff:g id="NAME_1">^1</xliff:g>, prvo ga morate priključiti."</string>
<string name="storage_dialog_unmountable" msgid="3732209361668282254">"Ovaj <xliff:g id="NAME_0">^1</xliff:g> je oštećen. \n\nDa biste koristili ovaj <xliff:g id="NAME_1">^1</xliff:g>, najprije ga morate postaviti."</string>
<string name="storage_dialog_unsupported" msgid="4503128224360482228">"Ovaj uređaj ne podržava <xliff:g id="NAME_0">^1</xliff:g>. \n\n Da biste koristili <xliff:g id="NAME_1">^1</xliff:g> s ovim uređajem, najprije ga morate postaviti."</string>
- <string name="storage_internal_format_details" msgid="4018647158382548820">"Nakon formatiranja, možete koristiti ovu <xliff:g id="NAME_0">^1</xliff:g> u drugim uređajima. \n\n Svi podaci sa ove <xliff:g id="NAME_1">^1</xliff:g> će biti izbrisani. Razmislite prvo o kreiranju sigurnosne kopije \n\n"<b>" Rezervne kopije za Fotografije i druge medije "</b>\n" Premjestite multimedijalne datoteke u alternativne skladištenje na ovom uređaju, ili ih prenesete na računalo pomoću USB kabla. \n\n"<b>" Sigurnosne kopije za aplikacije"</b>\n" Sve aplikacije pohranjene na ovom <xliff:g id="NAME_6">^1</xliff:g> će biti deinstalirane i njihovi podaci će biti izbrisani. Da bi ove aplikacije sačuvali, premjestite ih u alternativne memorije na ovom uređaju."</string>
- <string name="storage_internal_unmount_details" msgid="3582802571684490057"><b>"Kada izbacite ovaj uređaj (<xliff:g id="NAME_0">^1</xliff:g>), aplikacije pohranjene na njemu će prestati radit, a medijske datoteke pohranjene na njemu neće biti dostupne dok ga ponovo ne umetnete."</b>" \n\nUređaj <xliff:g id="NAME_1">^1</xliff:g> je formatiran tako da funkcionira samo na ovom uređaju. Neće funkcionirati na bilo kojem drugom uređaju."</string>
+ <string name="storage_internal_format_details" msgid="4018647158382548820">"Nakon formatiranja, možete koristiti ovu <xliff:g id="NAME_0">^1</xliff:g> u drugim uređajima. \n\n Svi podaci sa ove <xliff:g id="NAME_1">^1</xliff:g> će biti izbrisani. Razmislite prvo o kreiranju sigurnosne kopije \n\n"<b>" Rezervne kopije za Fotografije i druge medije "</b>\n" Premjestite multimedijalne fajlove u alternativne skladištenje na ovom uređaju, ili ih prenesete na računalo pomoću USB kabla. \n\n"<b>" Sigurnosne kopije za aplikacije"</b>\n" Sve aplikacije pohranjene na ovom <xliff:g id="NAME_6">^1</xliff:g> će biti deinstalirane i njihovi podaci će biti izbrisani. Da bi ove aplikacije sačuvali, premjestite ih u alternativne memorije na ovom uređaju."</string>
+ <string name="storage_internal_unmount_details" msgid="3582802571684490057"><b>"Kada izbacite ovaj uređaj (<xliff:g id="NAME_0">^1</xliff:g>), aplikacije pohranjene na njemu će prestati radit, a medijski fajlovi pohranjeni na njemu neće biti dostupni dok ga ponovo ne umetnete."</b>" \n\nUređaj <xliff:g id="NAME_1">^1</xliff:g> je formatiran tako da funkcionira samo na ovom uređaju. Neće funkcionirati na bilo kojem drugom uređaju."</string>
<string name="storage_internal_forget_details" msgid="9028875424669047327">"Da biste koristili aplikacije, slike ili podatke koje ovaj uređaj (<xliff:g id="NAME">^1</xliff:g>) sadrži, ponovo ga umetnite. \n\nUmjesto toga, možete odabrati da zaboravite ovu memoriju ukoliko uređaj nije dostupan \n\nAko odaberete da zaboravite memoriju, svi podaci koje uređaj sadrži će zauvijek biti izgubljeni \n\nAplikacije možete kasnije ponovo instalirati, ali njihovi podaci pohranjeni na ovom uređaju će biti izgubljeni."</string>
<string name="storage_internal_forget_confirm_title" msgid="1370847944388479245">"Želite li zaboraviti uređaj <xliff:g id="NAME">^1</xliff:g>?"</string>
<string name="storage_internal_forget_confirm" msgid="1148446041396902905">"Sve aplikacije, fotografije i podaci pohranjeni na ovom <xliff:g id="NAME">^1</xliff:g> bit će trajno izgubljeni."</string>
@@ -1310,7 +1314,7 @@
<string name="storage_wizard_format_progress_title" msgid="6487352396450582292">"Formatiranje <xliff:g id="NAME">^1</xliff:g>..."</string>
<string name="storage_wizard_format_progress_body" msgid="4445041233802828430">"Nemojte uklanjati <xliff:g id="NAME">^1</xliff:g> dok se formatira."</string>
<string name="storage_wizard_migrate_title" msgid="1363078147938160407">"Premjestite pod. u novu memoriju"</string>
- <string name="storage_wizard_migrate_body" msgid="890751699549542345">"Možete premjestiti slike, datoteke i neke aplikacije na novi uređaj <xliff:g id="NAME">^1</xliff:g>. \n\nPremještanje traje otprilike <xliff:g id="TIME">^2</xliff:g> te će osloboditi <xliff:g id="SIZE">^3</xliff:g> unutrašnje memorije. Neke aplikacije neće funkcionirati dok je ovo u toku."</string>
+ <string name="storage_wizard_migrate_body" msgid="890751699549542345">"Možete premjestiti slike, fajlove i neke aplikacije na novi uređaj <xliff:g id="NAME">^1</xliff:g>. \n\nPremještanje traje otprilike <xliff:g id="TIME">^2</xliff:g> te će osloboditi <xliff:g id="SIZE">^3</xliff:g> unutrašnje memorije. Neke aplikacije neće funkcionirati dok je ovo u toku."</string>
<string name="storage_wizard_migrate_now" msgid="4523444323744239143">"Premjesti sada"</string>
<string name="storage_wizard_migrate_later" msgid="3173482328116026253">"Premjesti kasnije"</string>
<string name="storage_wizard_migrate_confirm_title" msgid="8564833529613286965">"Premjesti podatke sada"</string>
@@ -1320,7 +1324,7 @@
<string name="storage_wizard_migrate_details" msgid="3709728824651136227">"Za vrijeme premještanja: \n• Nemojte uklanjati uređaj <xliff:g id="NAME">^1</xliff:g>. \n• Neke aplikacije neće funkcionirati ispravno. \n• Uređaj treba biti napunjen."</string>
<string name="storage_wizard_ready_title" msgid="5381632402953258267">"<xliff:g id="NAME">^1</xliff:g> je spreman"</string>
<string name="storage_wizard_ready_external_body" msgid="2879508114260597474">"Uređaj <xliff:g id="NAME">^1</xliff:g> je spreman za korištenje sa slikama i drugim medijima."</string>
- <string name="storage_wizard_ready_internal_body" msgid="122532674037860197">"Novi uređaj (<xliff:g id="NAME">^1</xliff:g>) funkcionira. \n\nDa biste premjestili slike, datoteke i podatke aplikacija na ovaj uređaj, idite na Postavke > Memorija."</string>
+ <string name="storage_wizard_ready_internal_body" msgid="122532674037860197">"Novi uređaj (<xliff:g id="NAME">^1</xliff:g>) funkcionira. \n\nDa biste premjestili slike, fajlove i podatke aplikacija na ovaj uređaj, idite na Postavke > Memorija."</string>
<string name="storage_wizard_move_confirm_title" msgid="292782012677890250">"Premjesti <xliff:g id="APP">^1</xliff:g>"</string>
<string name="storage_wizard_move_confirm_body" msgid="5176432115206478941">"Premještanje <xliff:g id="APP">^1</xliff:g> i njenih podataka na <xliff:g id="NAME_0">^2</xliff:g> će trajati samo nekoliko trenutaka. Nećete biti u mogućnosti koristiti aplikacije sve dok se ne završi premještanje. \n\n Nemojte uklanjati <xliff:g id="NAME_1">^2</xliff:g> tokom premještanja."</string>
<string name="storage_wizard_move_unlock" msgid="1526216561023200694">"Da prebacite podatke, morate otključati korisnika <xliff:g id="APP">^1</xliff:g>."</string>
@@ -1369,9 +1373,9 @@
<string name="error_mcc_not3" msgid="4560171714156251661">"MCC polje mora imati 3 cifre."</string>
<string name="error_mnc_not23" msgid="8418177072458379439">"MNC polje mora imati 2 ili 3 cifre."</string>
<string name="error_adding_apn_type" msgid="4181334016628549645">"Operater ne dozvoljava dodavanje APN-a tipa %s."</string>
- <string name="restore_default_apn" msgid="8178010218751639581">"Obnavljanje zadanih postavki za APN."</string>
+ <string name="restore_default_apn" msgid="8178010218751639581">"Vraćanje zadanih postavki za APN."</string>
<string name="menu_restore" msgid="8260067415075573273">"Vrati na zadane vrijednosti"</string>
- <string name="restore_default_apn_completed" msgid="2824775307377604897">"Obnavljanje zadanih postavki za APN dovršeno."</string>
+ <string name="restore_default_apn_completed" msgid="2824775307377604897">"Vraćanje zadanih postavki za APN dovršeno."</string>
<string name="reset_dashboard_title" msgid="6254873816990678620">"Opcije vraćanja na zadano"</string>
<string name="reset_dashboard_summary" msgid="4851012632493522755">"Mreža, aplikacije ili uređaj mogu se vratiti na zadano"</string>
<string name="reset_network_title" msgid="6166025966016873843">"Vrati Wi-Fi, mobilnu i Bluetooth vezu na zadane postavke"</string>
@@ -1655,7 +1659,7 @@
<string name="sd_card_storage" product="default" msgid="7623513618171928235">"Pohrana na SD kartici"</string>
<string name="recompute_size" msgid="7722567982831691718">"Ponovno izračunavanje veličine…"</string>
<string name="clear_data_dlg_title" msgid="5605258400134511197">"Izbrisati podatke aplikacija?"</string>
- <string name="clear_data_dlg_text" msgid="3951297329833822490">"Svi podaci ove aplikacije će biti trajno izbrisani. To uključuje sve datoteke, postavke, račune, baze podataka itd."</string>
+ <string name="clear_data_dlg_text" msgid="3951297329833822490">"Svi podaci ove aplikacije će biti trajno izbrisani. To uključuje sve fajlove, postavke, račune, baze podataka itd."</string>
<string name="dlg_ok" msgid="2402639055725653590">"Uredu"</string>
<string name="dlg_cancel" msgid="1674753358972975911">"Otkaži"</string>
<string name="app_not_found_dlg_title" msgid="3127123411738434964"></string>
@@ -1894,8 +1898,10 @@
<string name="accessibility_service_master_switch_title" msgid="6835441300276358239">"Koristi uslugu"</string>
<string name="accessibility_daltonizer_master_switch_title" msgid="8655284637968823154">"Koristi ispravku boje"</string>
<string name="accessibility_caption_master_switch_title" msgid="4010227386676077826">"Koristi natpise"</string>
- <string name="accessibility_summary_state_enabled" msgid="8359913912320966304">"UKLJUČENO"</string>
- <string name="accessibility_summary_state_disabled" msgid="2241315620132005595">"ISKLJUČENO"</string>
+ <!-- no translation found for accessibility_summary_state_enabled (7914278500885887763) -->
+ <skip />
+ <!-- no translation found for accessibility_summary_state_disabled (2984230257590246745) -->
+ <skip />
<string name="enable_quick_setting" msgid="2366999897816894536">"Prikaži u Brzim postavkama"</string>
<string name="daltonizer_type" msgid="1124178250809091080">"Način rada za korekciju"</string>
<plurals name="accessibilty_autoclick_preference_subtitle_extremely_short_delay" formatted="false" msgid="7340347830562315800">
@@ -2919,6 +2925,8 @@
<string name="keywords_model_and_hardware" msgid="1459248377212829642">"serijski broj, verzija hardvera"</string>
<string name="keywords_android_version" msgid="9069747153590902819">"nivo sigurnosne zakrpe za android, verzija nemoduliranog signala, osnovna verzija"</string>
<string name="keywords_ambient_display_screen" msgid="5874969496073249362">"Ambijentalni prikaz, Prikaz zaključavanja ekrana"</string>
+ <!-- no translation found for keywords_fingerprint_settings (239222512315619538) -->
+ <skip />
<string name="setup_wifi_nfc_tag" msgid="9028353016222911016">"Postavljanje Wi-Fi NFC taga"</string>
<string name="write_tag" msgid="8571858602896222537">"Pisati"</string>
<string name="status_awaiting_tap" msgid="2130145523773160617">"Dodirnite oznaku da biste pisali..."</string>
@@ -3209,7 +3217,8 @@
<string name="zen_mode_summary_alarms_only_by_time" msgid="7465525754879341907">"Pređi na postavku Samo alarmi do <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_summary_always" msgid="6172985102689237703">"Promijeniti u uvijek prekini"</string>
<string name="zen_mode_screen_on" msgid="8774571998575673502">"Kada je ekran uključen"</string>
- <string name="zen_mode_screen_on_summary" msgid="5385338884695802115">"Dopustite da se obavještenja koja su utišana načinom rada Ne ometaj istaknu na ekranu"</string>
+ <!-- no translation found for zen_mode_screen_on_summary (2208664848367443505) -->
+ <skip />
<string name="zen_mode_screen_off" msgid="3144446765110327937">"Kada je ekran isključen"</string>
<string name="zen_mode_screen_off_summary" msgid="7430034620565812258">"Dopustite da obavještenja koja su utišana načinom rada Ne ometaj uključe ekran i zatrepere svjetlom"</string>
<string name="zen_mode_screen_off_summary_no_led" msgid="2826121465026642017">"Dopustite da obavještenja koja su utišana načinom rada Ne ometaj uključe ekran"</string>
@@ -3397,12 +3406,16 @@
<string name="usb_use_file_transfers" msgid="1223134119354320726">"Prijenos fajlova"</string>
<string name="usb_use_file_transfers_desc" msgid="4235764784331804488">"Prebacite fajlove na drugi uređaj"</string>
<string name="usb_use_photo_transfers" msgid="8192719651229326283">"PTP"</string>
- <string name="usb_use_photo_transfers_desc" msgid="2963034811151325996">"Prebacuje slike ili datoteke ukoliko MTP nije podržan (PTP)"</string>
+ <string name="usb_use_photo_transfers_desc" msgid="2963034811151325996">"Prebacuje slike ili fajlove ukoliko MTP nije podržan (PTP)"</string>
<string name="usb_use_tethering" msgid="3944506882789422118">"Povezivanje mobitela putem USB-a"</string>
<string name="usb_use_MIDI" msgid="5116404702692483166">"MIDI"</string>
<string name="usb_use_MIDI_desc" msgid="8473936990076693175">"Koristite uređaj u MIDI načinu"</string>
<string name="usb_use" msgid="3372728031108932425">"Koristite USB za"</string>
<string name="usb_use_also" msgid="557340935190819370">"Također koristi USB za"</string>
+ <!-- no translation found for usb_default_label (4217189967858707974) -->
+ <skip />
+ <!-- no translation found for usb_default_info (8864535445796200695) -->
+ <skip />
<string name="usb_pref" msgid="1400617804525116158">"USB"</string>
<string name="usb_summary_charging_only" msgid="7544327009143659751">"Punjenje ovog uređaja"</string>
<string name="usb_summary_power_only" msgid="1996391096369798526">"Punjenje povezanog uređaja"</string>
@@ -3525,8 +3538,10 @@
<string name="memory_summary" msgid="8080825904671961872">"<xliff:g id="USED_MEMORY">%1$s</xliff:g> prosječno od ukupno <xliff:g id="TOTAL_MEMORY">%2$s</xliff:g> iskorištene memorije"</string>
<string name="users_summary" msgid="1674864467098487328">"Prijavljeni ste kao korisnik <xliff:g id="USER_NAME">%1$s</xliff:g>"</string>
<string name="payment_summary" msgid="3472482669588561110">"<xliff:g id="APP_NAME">%1$s</xliff:g> je zadana aplikacija"</string>
- <string name="location_on_summary" msgid="4083334422422067511">"UKLJUČENO"</string>
- <string name="location_off_summary" msgid="6474350053215707957">"ISKLJUČENO"</string>
+ <!-- no translation found for location_on_summary (3637699010986988970) -->
+ <skip />
+ <!-- no translation found for location_off_summary (7217264690673949107) -->
+ <skip />
<string name="backup_disabled" msgid="485189128759595412">"Izrada sigurnosnih kopija je onemogućena"</string>
<string name="android_version_summary" msgid="2935995161657697278">"Ažurirano na Android <xliff:g id="VERSION">%1$s</xliff:g>"</string>
<string name="android_version_pending_update_summary" msgid="487831391976523090">"Dostupno je ažuriranje"</string>
@@ -3705,9 +3720,13 @@
<string name="bluetooth_connected_summary" msgid="7672528674593152862">"Povezan s uređajem <xliff:g id="ID_1">%1$s</xliff:g>"</string>
<string name="bluetooth_connected_multiple_devices_summary" msgid="9173661896296663932">"Povezan s više uređaja"</string>
<string name="demo_mode" msgid="2798762752209330277">"Način demonstracije Sistemskog UI-a"</string>
+ <!-- no translation found for dark_ui_mode (2112241426441807273) -->
+ <skip />
+ <!-- no translation found for dark_ui_mode_title (975299966259850992) -->
+ <skip />
<string name="quick_settings_developer_tiles" msgid="5947788063262762448">"Pločice programera za brze postavke"</string>
- <string name="window_trace_quick_settings_title" msgid="3839917000546526898">"Trag prozora"</string>
- <string name="layer_trace_quick_settings_title" msgid="876797401275734018">"Površinsko praćenje"</string>
+ <!-- no translation found for winscope_trace_quick_settings_title (1294290008255732032) -->
+ <skip />
<string name="support_country_format" msgid="4502523713489559595">"<xliff:g id="COUNTRY">%1$s</xliff:g> - <xliff:g id="LANGUAGE">%2$s</xliff:g>"</string>
<string name="managed_profile_settings_title" msgid="2729481936758125054">"Postavke radnog profila"</string>
<string name="managed_profile_contact_search_title" msgid="6034734926815544221">"Pretraživanje kontakata"</string>
diff --git a/res/values-ca/arrays.xml b/res/values-ca/arrays.xml
index c8ba797..0960e6d 100644
--- a/res/values-ca/arrays.xml
+++ b/res/values-ca/arrays.xml
@@ -497,4 +497,7 @@
<item msgid="8745603368609022803">"Tracta com a Wi-Fi amb límit de dades"</item>
<item msgid="2266114985518865625">"Tracta com a Wi-Fi sense límit de dades"</item>
</string-array>
+ <!-- no translation found for dark_ui_mode_entries:0 (146804192658443142) -->
+ <!-- no translation found for dark_ui_mode_entries:1 (6620560879508595181) -->
+ <!-- no translation found for dark_ui_mode_entries:2 (6385301106124765323) -->
</resources>
diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml
index 9d319da..b755982 100644
--- a/res/values-ca/strings.xml
+++ b/res/values-ca/strings.xml
@@ -707,6 +707,10 @@
<string name="bluetooth_dock_settings_remember" msgid="5551459057010609115">"Recorda la configuració"</string>
<string name="bluetooth_max_connected_audio_devices_string" msgid="6752690395207847881">"Nombre màxim de dispositius d\'àudio Bluetooth connectats"</string>
<string name="bluetooth_max_connected_audio_devices_dialog_title" msgid="5936561749790095473">"Selecciona el nombre màxim de dispositius d\'àudio Bluetooth connectats"</string>
+ <!-- no translation found for bluetooth_enable_avdtp_delay_reports (5101903170688399944) -->
+ <skip />
+ <!-- no translation found for bluetooth_enable_avdtp_delay_reports_summary (7052797876020616399) -->
+ <skip />
<string name="wifi_display_settings_title" msgid="8740852850033480136">"Emet"</string>
<string name="wifi_display_enable_menu_item" msgid="4883036464138167674">"Activa pantalla sense fil"</string>
<string name="wifi_display_no_devices_found" msgid="1382012407154143453">"No s\'ha trobat cap dispositiu a prop."</string>
@@ -1880,8 +1884,10 @@
<string name="accessibility_service_master_switch_title" msgid="6835441300276358239">"Utilitza el servei"</string>
<string name="accessibility_daltonizer_master_switch_title" msgid="8655284637968823154">"Utilitza la correcció del color"</string>
<string name="accessibility_caption_master_switch_title" msgid="4010227386676077826">"Utilitza subtítols"</string>
- <string name="accessibility_summary_state_enabled" msgid="8359913912320966304">"ACTIVAT"</string>
- <string name="accessibility_summary_state_disabled" msgid="2241315620132005595">"DESACTIVADA"</string>
+ <!-- no translation found for accessibility_summary_state_enabled (7914278500885887763) -->
+ <skip />
+ <!-- no translation found for accessibility_summary_state_disabled (2984230257590246745) -->
+ <skip />
<string name="enable_quick_setting" msgid="2366999897816894536">"Mostra a configuració ràpida"</string>
<string name="daltonizer_type" msgid="1124178250809091080">"Mode de correcció"</string>
<plurals name="accessibilty_autoclick_preference_subtitle_extremely_short_delay" formatted="false" msgid="7340347830562315800">
@@ -2888,6 +2894,8 @@
<string name="keywords_model_and_hardware" msgid="1459248377212829642">"número de sèrie, versió de maquinari"</string>
<string name="keywords_android_version" msgid="9069747153590902819">"nivell de pedaç de seguretat d\'Android, versió de banda base, versió de kernel"</string>
<string name="keywords_ambient_display_screen" msgid="5874969496073249362">"Pantalla ambient, pantalla de bloqueig"</string>
+ <!-- no translation found for keywords_fingerprint_settings (239222512315619538) -->
+ <skip />
<string name="setup_wifi_nfc_tag" msgid="9028353016222911016">"Configura l\'etiqueta d\'NFC per a Wi-Fi"</string>
<string name="write_tag" msgid="8571858602896222537">"Escriu-hi"</string>
<string name="status_awaiting_tap" msgid="2130145523773160617">"Toca una etiqueta per escriure..."</string>
@@ -3170,7 +3178,8 @@
<string name="zen_mode_summary_alarms_only_by_time" msgid="7465525754879341907">"Canvia al mode Només alarmes fins a les <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_summary_always" msgid="6172985102689237703">"Canvia al mode Interromp sempre"</string>
<string name="zen_mode_screen_on" msgid="8774571998575673502">"Quan la pantalla estigui encesa"</string>
- <string name="zen_mode_screen_on_summary" msgid="5385338884695802115">"Permet que les notificacions silenciades pel mode No molestis obrin finestres emergents"</string>
+ <!-- no translation found for zen_mode_screen_on_summary (2208664848367443505) -->
+ <skip />
<string name="zen_mode_screen_off" msgid="3144446765110327937">"Quan la pantalla estigui apagada"</string>
<string name="zen_mode_screen_off_summary" msgid="7430034620565812258">"Permet que les notificacions silenciades pel mode No molestis encenguin la pantalla i facin parpellejar el llum"</string>
<string name="zen_mode_screen_off_summary_no_led" msgid="2826121465026642017">"Permet que les notificacions silenciades pel mode No molestis encenguin la pantalla"</string>
@@ -3358,6 +3367,10 @@
<string name="usb_use_MIDI_desc" msgid="8473936990076693175">"fer servir aquest dispositiu com a MIDI"</string>
<string name="usb_use" msgid="3372728031108932425">"Funcions de l\'USB"</string>
<string name="usb_use_also" msgid="557340935190819370">"Utilitza la connexió USB també per al següent:"</string>
+ <!-- no translation found for usb_default_label (4217189967858707974) -->
+ <skip />
+ <!-- no translation found for usb_default_info (8864535445796200695) -->
+ <skip />
<string name="usb_pref" msgid="1400617804525116158">"USB"</string>
<string name="usb_summary_charging_only" msgid="7544327009143659751">"S\'està carregant el dispositiu"</string>
<string name="usb_summary_power_only" msgid="1996391096369798526">"Càrrega de dispositius connectats"</string>
@@ -3478,8 +3491,10 @@
<string name="memory_summary" msgid="8080825904671961872">"Memòria utilitzada de mitjana: <xliff:g id="USED_MEMORY">%1$s</xliff:g> de <xliff:g id="TOTAL_MEMORY">%2$s</xliff:g>"</string>
<string name="users_summary" msgid="1674864467098487328">"Sessió iniciada com a <xliff:g id="USER_NAME">%1$s</xliff:g>"</string>
<string name="payment_summary" msgid="3472482669588561110">"Aplicació predeterminada: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
- <string name="location_on_summary" msgid="4083334422422067511">"ACTIVADA"</string>
- <string name="location_off_summary" msgid="6474350053215707957">"DESACTIVADA"</string>
+ <!-- no translation found for location_on_summary (3637699010986988970) -->
+ <skip />
+ <!-- no translation found for location_off_summary (7217264690673949107) -->
+ <skip />
<string name="backup_disabled" msgid="485189128759595412">"Còpia de seguretat desactivada"</string>
<string name="android_version_summary" msgid="2935995161657697278">"Actualitzat a Android <xliff:g id="VERSION">%1$s</xliff:g>"</string>
<string name="android_version_pending_update_summary" msgid="487831391976523090">"Actualització disponible"</string>
@@ -3653,9 +3668,13 @@
<string name="bluetooth_connected_summary" msgid="7672528674593152862">"Connectat a <xliff:g id="ID_1">%1$s</xliff:g>"</string>
<string name="bluetooth_connected_multiple_devices_summary" msgid="9173661896296663932">"Connectat a diversos dispositius"</string>
<string name="demo_mode" msgid="2798762752209330277">"Mode de demostració de la IU del sistema"</string>
+ <!-- no translation found for dark_ui_mode (2112241426441807273) -->
+ <skip />
+ <!-- no translation found for dark_ui_mode_title (975299966259850992) -->
+ <skip />
<string name="quick_settings_developer_tiles" msgid="5947788063262762448">"Mosaics de configuració ràpida per a desenvolupadors"</string>
- <string name="window_trace_quick_settings_title" msgid="3839917000546526898">"Seguiment gestor finestres"</string>
- <string name="layer_trace_quick_settings_title" msgid="876797401275734018">"Captura de superfícies"</string>
+ <!-- no translation found for winscope_trace_quick_settings_title (1294290008255732032) -->
+ <skip />
<string name="support_country_format" msgid="4502523713489559595">"<xliff:g id="COUNTRY">%1$s</xliff:g> - <xliff:g id="LANGUAGE">%2$s</xliff:g>"</string>
<string name="managed_profile_settings_title" msgid="2729481936758125054">"Configuració del perfil professional"</string>
<string name="managed_profile_contact_search_title" msgid="6034734926815544221">"Cerca de contactes"</string>
diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml
index 0ffea2b..a75bfe3 100644
--- a/res/values-cs/strings.xml
+++ b/res/values-cs/strings.xml
@@ -3448,6 +3448,10 @@
<string name="usb_use_MIDI_desc" msgid="8473936990076693175">"Toto zařízení se použije v režimu MIDI"</string>
<string name="usb_use" msgid="3372728031108932425">"Použití USB:"</string>
<string name="usb_use_also" msgid="557340935190819370">"Další využití USB:"</string>
+ <!-- no translation found for usb_default_label (4217189967858707974) -->
+ <skip />
+ <!-- no translation found for usb_default_info (8864535445796200695) -->
+ <skip />
<string name="usb_pref" msgid="1400617804525116158">"USB"</string>
<string name="usb_summary_charging_only" msgid="7544327009143659751">"Nabíjení zařízení"</string>
<string name="usb_summary_power_only" msgid="1996391096369798526">"Nabíjení připojeného zařízení"</string>
diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml
index 8ad4fad..9c40716 100644
--- a/res/values-da/strings.xml
+++ b/res/values-da/strings.xml
@@ -3358,6 +3358,10 @@
<string name="usb_use_MIDI_desc" msgid="8473936990076693175">"Bruge denne enhed som MIDI"</string>
<string name="usb_use" msgid="3372728031108932425">"Brug USB"</string>
<string name="usb_use_also" msgid="557340935190819370">"Brug også USB til"</string>
+ <!-- no translation found for usb_default_label (4217189967858707974) -->
+ <skip />
+ <!-- no translation found for usb_default_info (8864535445796200695) -->
+ <skip />
<string name="usb_pref" msgid="1400617804525116158">"USB"</string>
<string name="usb_summary_charging_only" msgid="7544327009143659751">"Opladning af denne enhed"</string>
<string name="usb_summary_power_only" msgid="1996391096369798526">"Den tilsluttede enhed oplades"</string>
diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml
index 2b8f9a9..2278eaf 100644
--- a/res/values-de/strings.xml
+++ b/res/values-de/strings.xml
@@ -3358,6 +3358,10 @@
<string name="usb_use_MIDI_desc" msgid="8473936990076693175">"Dieses Gerät als MIDI verwenden"</string>
<string name="usb_use" msgid="3372728031108932425">"USB verwenden für"</string>
<string name="usb_use_also" msgid="557340935190819370">"USB auch verwenden für"</string>
+ <!-- no translation found for usb_default_label (4217189967858707974) -->
+ <skip />
+ <!-- no translation found for usb_default_info (8864535445796200695) -->
+ <skip />
<string name="usb_pref" msgid="1400617804525116158">"USB"</string>
<string name="usb_summary_charging_only" msgid="7544327009143659751">"Gerät aufladen"</string>
<string name="usb_summary_power_only" msgid="1996391096369798526">"Verbundenes Gerät wird aufgeladen"</string>
diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml
index ff765ea..5669f35 100644
--- a/res/values-el/strings.xml
+++ b/res/values-el/strings.xml
@@ -3358,6 +3358,10 @@
<string name="usb_use_MIDI_desc" msgid="8473936990076693175">"Χρήση αυτής της συσκευής ως MIDI"</string>
<string name="usb_use" msgid="3372728031108932425">"Χρήση USB για"</string>
<string name="usb_use_also" msgid="557340935190819370">"Χρησιμοποιήστε επίσης το USB για"</string>
+ <!-- no translation found for usb_default_label (4217189967858707974) -->
+ <skip />
+ <!-- no translation found for usb_default_info (8864535445796200695) -->
+ <skip />
<string name="usb_pref" msgid="1400617804525116158">"USB"</string>
<string name="usb_summary_charging_only" msgid="7544327009143659751">"Φόρτιση αυτής της συσκευής"</string>
<string name="usb_summary_power_only" msgid="1996391096369798526">"Φόρτιση συνδεδεμένης συσκευής"</string>
diff --git a/res/values-en-rAU/arrays.xml b/res/values-en-rAU/arrays.xml
index 2b3388b..8b87a4e 100644
--- a/res/values-en-rAU/arrays.xml
+++ b/res/values-en-rAU/arrays.xml
@@ -497,4 +497,7 @@
<item msgid="8745603368609022803">"Treat as metered"</item>
<item msgid="2266114985518865625">"Treat as unmetered"</item>
</string-array>
+ <!-- no translation found for dark_ui_mode_entries:0 (146804192658443142) -->
+ <!-- no translation found for dark_ui_mode_entries:1 (6620560879508595181) -->
+ <!-- no translation found for dark_ui_mode_entries:2 (6385301106124765323) -->
</resources>
diff --git a/res/values-en-rAU/strings.xml b/res/values-en-rAU/strings.xml
index 15e68ae..b2fe946 100644
--- a/res/values-en-rAU/strings.xml
+++ b/res/values-en-rAU/strings.xml
@@ -707,6 +707,10 @@
<string name="bluetooth_dock_settings_remember" msgid="5551459057010609115">"Remember settings"</string>
<string name="bluetooth_max_connected_audio_devices_string" msgid="6752690395207847881">"Maximum connected Bluetooth audio devices"</string>
<string name="bluetooth_max_connected_audio_devices_dialog_title" msgid="5936561749790095473">"Select maximum number of connected Bluetooth audio devices"</string>
+ <!-- no translation found for bluetooth_enable_avdtp_delay_reports (5101903170688399944) -->
+ <skip />
+ <!-- no translation found for bluetooth_enable_avdtp_delay_reports_summary (7052797876020616399) -->
+ <skip />
<string name="wifi_display_settings_title" msgid="8740852850033480136">"Cast"</string>
<string name="wifi_display_enable_menu_item" msgid="4883036464138167674">"Enable wireless display"</string>
<string name="wifi_display_no_devices_found" msgid="1382012407154143453">"No nearby devices were found."</string>
@@ -1880,8 +1884,10 @@
<string name="accessibility_service_master_switch_title" msgid="6835441300276358239">"Use service"</string>
<string name="accessibility_daltonizer_master_switch_title" msgid="8655284637968823154">"Use colour correction"</string>
<string name="accessibility_caption_master_switch_title" msgid="4010227386676077826">"Use captions"</string>
- <string name="accessibility_summary_state_enabled" msgid="8359913912320966304">"ON"</string>
- <string name="accessibility_summary_state_disabled" msgid="2241315620132005595">"OFF"</string>
+ <!-- no translation found for accessibility_summary_state_enabled (7914278500885887763) -->
+ <skip />
+ <!-- no translation found for accessibility_summary_state_disabled (2984230257590246745) -->
+ <skip />
<string name="enable_quick_setting" msgid="2366999897816894536">"Show in Quick Settings"</string>
<string name="daltonizer_type" msgid="1124178250809091080">"Correction mode"</string>
<plurals name="accessibilty_autoclick_preference_subtitle_extremely_short_delay" formatted="false" msgid="7340347830562315800">
@@ -2888,6 +2894,8 @@
<string name="keywords_model_and_hardware" msgid="1459248377212829642">"serial number, hardware version"</string>
<string name="keywords_android_version" msgid="9069747153590902819">"android security patch level, baseband version, kernel version"</string>
<string name="keywords_ambient_display_screen" msgid="5874969496073249362">"Ambient display, Lock screen display"</string>
+ <!-- no translation found for keywords_fingerprint_settings (239222512315619538) -->
+ <skip />
<string name="setup_wifi_nfc_tag" msgid="9028353016222911016">"Set up Wi-Fi NFC Tag"</string>
<string name="write_tag" msgid="8571858602896222537">"Write"</string>
<string name="status_awaiting_tap" msgid="2130145523773160617">"Tap a tag to write..."</string>
@@ -3170,7 +3178,8 @@
<string name="zen_mode_summary_alarms_only_by_time" msgid="7465525754879341907">"Change to alarms only until <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_summary_always" msgid="6172985102689237703">"Change to always interrupt"</string>
<string name="zen_mode_screen_on" msgid="8774571998575673502">"When the screen is on"</string>
- <string name="zen_mode_screen_on_summary" msgid="5385338884695802115">"Let notifications silenced by Do Not Disturb pop on screen"</string>
+ <!-- no translation found for zen_mode_screen_on_summary (2208664848367443505) -->
+ <skip />
<string name="zen_mode_screen_off" msgid="3144446765110327937">"When the screen is off"</string>
<string name="zen_mode_screen_off_summary" msgid="7430034620565812258">"Let notifications silenced by Do Not Disturb turn on the screen and blink the light"</string>
<string name="zen_mode_screen_off_summary_no_led" msgid="2826121465026642017">"Let notifications silenced by Do Not Disturb turn on the screen"</string>
@@ -3358,6 +3367,8 @@
<string name="usb_use_MIDI_desc" msgid="8473936990076693175">"Use this device as MIDI"</string>
<string name="usb_use" msgid="3372728031108932425">"Use USB for"</string>
<string name="usb_use_also" msgid="557340935190819370">"Also use USB for"</string>
+ <string name="usb_default_label" msgid="4217189967858707974">"Default USB Configuration"</string>
+ <string name="usb_default_info" msgid="8864535445796200695">"When another device is connected and your phone is unlocked, these settings will be applied. Only connect to trusted devices."</string>
<string name="usb_pref" msgid="1400617804525116158">"USB"</string>
<string name="usb_summary_charging_only" msgid="7544327009143659751">"Charging this device"</string>
<string name="usb_summary_power_only" msgid="1996391096369798526">"Charging connected device"</string>
@@ -3478,8 +3489,10 @@
<string name="memory_summary" msgid="8080825904671961872">"Avg <xliff:g id="USED_MEMORY">%1$s</xliff:g> of <xliff:g id="TOTAL_MEMORY">%2$s</xliff:g> memory used"</string>
<string name="users_summary" msgid="1674864467098487328">"Signed in as <xliff:g id="USER_NAME">%1$s</xliff:g>"</string>
<string name="payment_summary" msgid="3472482669588561110">"<xliff:g id="APP_NAME">%1$s</xliff:g> is default"</string>
- <string name="location_on_summary" msgid="4083334422422067511">"ON"</string>
- <string name="location_off_summary" msgid="6474350053215707957">"OFF"</string>
+ <!-- no translation found for location_on_summary (3637699010986988970) -->
+ <skip />
+ <!-- no translation found for location_off_summary (7217264690673949107) -->
+ <skip />
<string name="backup_disabled" msgid="485189128759595412">"Backup disabled"</string>
<string name="android_version_summary" msgid="2935995161657697278">"Updated to Android <xliff:g id="VERSION">%1$s</xliff:g>"</string>
<string name="android_version_pending_update_summary" msgid="487831391976523090">"Update available"</string>
@@ -3653,9 +3666,13 @@
<string name="bluetooth_connected_summary" msgid="7672528674593152862">"Connected to <xliff:g id="ID_1">%1$s</xliff:g>"</string>
<string name="bluetooth_connected_multiple_devices_summary" msgid="9173661896296663932">"Connected to multiple devices"</string>
<string name="demo_mode" msgid="2798762752209330277">"System UI demo mode"</string>
+ <!-- no translation found for dark_ui_mode (2112241426441807273) -->
+ <skip />
+ <!-- no translation found for dark_ui_mode_title (975299966259850992) -->
+ <skip />
<string name="quick_settings_developer_tiles" msgid="5947788063262762448">"Quick settings developer tiles"</string>
- <string name="window_trace_quick_settings_title" msgid="3839917000546526898">"Window Trace"</string>
- <string name="layer_trace_quick_settings_title" msgid="876797401275734018">"Surface Trace"</string>
+ <!-- no translation found for winscope_trace_quick_settings_title (1294290008255732032) -->
+ <skip />
<string name="support_country_format" msgid="4502523713489559595">"<xliff:g id="COUNTRY">%1$s</xliff:g> - <xliff:g id="LANGUAGE">%2$s</xliff:g>"</string>
<string name="managed_profile_settings_title" msgid="2729481936758125054">"Work profile settings"</string>
<string name="managed_profile_contact_search_title" msgid="6034734926815544221">"Contact search"</string>
diff --git a/res/values-en-rCA/arrays.xml b/res/values-en-rCA/arrays.xml
index 2b3388b..8b87a4e 100644
--- a/res/values-en-rCA/arrays.xml
+++ b/res/values-en-rCA/arrays.xml
@@ -497,4 +497,7 @@
<item msgid="8745603368609022803">"Treat as metered"</item>
<item msgid="2266114985518865625">"Treat as unmetered"</item>
</string-array>
+ <!-- no translation found for dark_ui_mode_entries:0 (146804192658443142) -->
+ <!-- no translation found for dark_ui_mode_entries:1 (6620560879508595181) -->
+ <!-- no translation found for dark_ui_mode_entries:2 (6385301106124765323) -->
</resources>
diff --git a/res/values-en-rCA/strings.xml b/res/values-en-rCA/strings.xml
index 35a548b..81d4ca8 100644
--- a/res/values-en-rCA/strings.xml
+++ b/res/values-en-rCA/strings.xml
@@ -707,6 +707,10 @@
<string name="bluetooth_dock_settings_remember" msgid="5551459057010609115">"Remember settings"</string>
<string name="bluetooth_max_connected_audio_devices_string" msgid="6752690395207847881">"Maximum connected Bluetooth audio devices"</string>
<string name="bluetooth_max_connected_audio_devices_dialog_title" msgid="5936561749790095473">"Select maximum number of connected Bluetooth audio devices"</string>
+ <!-- no translation found for bluetooth_enable_avdtp_delay_reports (5101903170688399944) -->
+ <skip />
+ <!-- no translation found for bluetooth_enable_avdtp_delay_reports_summary (7052797876020616399) -->
+ <skip />
<string name="wifi_display_settings_title" msgid="8740852850033480136">"Cast"</string>
<string name="wifi_display_enable_menu_item" msgid="4883036464138167674">"Enable wireless display"</string>
<string name="wifi_display_no_devices_found" msgid="1382012407154143453">"No nearby devices were found."</string>
@@ -1880,8 +1884,10 @@
<string name="accessibility_service_master_switch_title" msgid="6835441300276358239">"Use service"</string>
<string name="accessibility_daltonizer_master_switch_title" msgid="8655284637968823154">"Use colour correction"</string>
<string name="accessibility_caption_master_switch_title" msgid="4010227386676077826">"Use captions"</string>
- <string name="accessibility_summary_state_enabled" msgid="8359913912320966304">"ON"</string>
- <string name="accessibility_summary_state_disabled" msgid="2241315620132005595">"OFF"</string>
+ <!-- no translation found for accessibility_summary_state_enabled (7914278500885887763) -->
+ <skip />
+ <!-- no translation found for accessibility_summary_state_disabled (2984230257590246745) -->
+ <skip />
<string name="enable_quick_setting" msgid="2366999897816894536">"Show in Quick Settings"</string>
<string name="daltonizer_type" msgid="1124178250809091080">"Correction mode"</string>
<plurals name="accessibilty_autoclick_preference_subtitle_extremely_short_delay" formatted="false" msgid="7340347830562315800">
@@ -2888,6 +2894,8 @@
<string name="keywords_model_and_hardware" msgid="1459248377212829642">"serial number, hardware version"</string>
<string name="keywords_android_version" msgid="9069747153590902819">"android security patch level, baseband version, kernel version"</string>
<string name="keywords_ambient_display_screen" msgid="5874969496073249362">"Ambient display, Lock screen display"</string>
+ <!-- no translation found for keywords_fingerprint_settings (239222512315619538) -->
+ <skip />
<string name="setup_wifi_nfc_tag" msgid="9028353016222911016">"Set up Wi-Fi NFC Tag"</string>
<string name="write_tag" msgid="8571858602896222537">"Write"</string>
<string name="status_awaiting_tap" msgid="2130145523773160617">"Tap a tag to write..."</string>
@@ -3170,7 +3178,8 @@
<string name="zen_mode_summary_alarms_only_by_time" msgid="7465525754879341907">"Change to alarms only until <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_summary_always" msgid="6172985102689237703">"Change to always interrupt"</string>
<string name="zen_mode_screen_on" msgid="8774571998575673502">"When the screen is on"</string>
- <string name="zen_mode_screen_on_summary" msgid="5385338884695802115">"Let notifications silenced by Do Not Disturb pop on screen"</string>
+ <!-- no translation found for zen_mode_screen_on_summary (2208664848367443505) -->
+ <skip />
<string name="zen_mode_screen_off" msgid="3144446765110327937">"When the screen is off"</string>
<string name="zen_mode_screen_off_summary" msgid="7430034620565812258">"Let notifications silenced by Do Not Disturb turn on the screen and blink the light"</string>
<string name="zen_mode_screen_off_summary_no_led" msgid="2826121465026642017">"Let notifications silenced by Do Not Disturb turn on the screen"</string>
@@ -3358,6 +3367,8 @@
<string name="usb_use_MIDI_desc" msgid="8473936990076693175">"Use this device as MIDI"</string>
<string name="usb_use" msgid="3372728031108932425">"Use USB for"</string>
<string name="usb_use_also" msgid="557340935190819370">"Also use USB for"</string>
+ <string name="usb_default_label" msgid="4217189967858707974">"Default USB Configuration"</string>
+ <string name="usb_default_info" msgid="8864535445796200695">"When another device is connected and your phone is unlocked, these settings will be applied. Only connect to trusted devices."</string>
<string name="usb_pref" msgid="1400617804525116158">"USB"</string>
<string name="usb_summary_charging_only" msgid="7544327009143659751">"Charging this device"</string>
<string name="usb_summary_power_only" msgid="1996391096369798526">"Charging connected device"</string>
@@ -3478,8 +3489,10 @@
<string name="memory_summary" msgid="8080825904671961872">"Avg <xliff:g id="USED_MEMORY">%1$s</xliff:g> of <xliff:g id="TOTAL_MEMORY">%2$s</xliff:g> memory used"</string>
<string name="users_summary" msgid="1674864467098487328">"Signed in as <xliff:g id="USER_NAME">%1$s</xliff:g>"</string>
<string name="payment_summary" msgid="3472482669588561110">"<xliff:g id="APP_NAME">%1$s</xliff:g> is default"</string>
- <string name="location_on_summary" msgid="4083334422422067511">"ON"</string>
- <string name="location_off_summary" msgid="6474350053215707957">"OFF"</string>
+ <!-- no translation found for location_on_summary (3637699010986988970) -->
+ <skip />
+ <!-- no translation found for location_off_summary (7217264690673949107) -->
+ <skip />
<string name="backup_disabled" msgid="485189128759595412">"Backup disabled"</string>
<string name="android_version_summary" msgid="2935995161657697278">"Updated to Android <xliff:g id="VERSION">%1$s</xliff:g>"</string>
<string name="android_version_pending_update_summary" msgid="487831391976523090">"Update available"</string>
@@ -3653,9 +3666,13 @@
<string name="bluetooth_connected_summary" msgid="7672528674593152862">"Connected to <xliff:g id="ID_1">%1$s</xliff:g>"</string>
<string name="bluetooth_connected_multiple_devices_summary" msgid="9173661896296663932">"Connected to multiple devices"</string>
<string name="demo_mode" msgid="2798762752209330277">"System UI demo mode"</string>
+ <!-- no translation found for dark_ui_mode (2112241426441807273) -->
+ <skip />
+ <!-- no translation found for dark_ui_mode_title (975299966259850992) -->
+ <skip />
<string name="quick_settings_developer_tiles" msgid="5947788063262762448">"Quick settings developer tiles"</string>
- <string name="window_trace_quick_settings_title" msgid="3839917000546526898">"Window Trace"</string>
- <string name="layer_trace_quick_settings_title" msgid="876797401275734018">"Surface Trace"</string>
+ <!-- no translation found for winscope_trace_quick_settings_title (1294290008255732032) -->
+ <skip />
<string name="support_country_format" msgid="4502523713489559595">"<xliff:g id="COUNTRY">%1$s</xliff:g> - <xliff:g id="LANGUAGE">%2$s</xliff:g>"</string>
<string name="managed_profile_settings_title" msgid="2729481936758125054">"Work profile settings"</string>
<string name="managed_profile_contact_search_title" msgid="6034734926815544221">"Contact search"</string>
diff --git a/res/values-en-rGB/arrays.xml b/res/values-en-rGB/arrays.xml
index 2b3388b..8b87a4e 100644
--- a/res/values-en-rGB/arrays.xml
+++ b/res/values-en-rGB/arrays.xml
@@ -497,4 +497,7 @@
<item msgid="8745603368609022803">"Treat as metered"</item>
<item msgid="2266114985518865625">"Treat as unmetered"</item>
</string-array>
+ <!-- no translation found for dark_ui_mode_entries:0 (146804192658443142) -->
+ <!-- no translation found for dark_ui_mode_entries:1 (6620560879508595181) -->
+ <!-- no translation found for dark_ui_mode_entries:2 (6385301106124765323) -->
</resources>
diff --git a/res/values-en-rGB/strings.xml b/res/values-en-rGB/strings.xml
index 15e68ae..b2fe946 100644
--- a/res/values-en-rGB/strings.xml
+++ b/res/values-en-rGB/strings.xml
@@ -707,6 +707,10 @@
<string name="bluetooth_dock_settings_remember" msgid="5551459057010609115">"Remember settings"</string>
<string name="bluetooth_max_connected_audio_devices_string" msgid="6752690395207847881">"Maximum connected Bluetooth audio devices"</string>
<string name="bluetooth_max_connected_audio_devices_dialog_title" msgid="5936561749790095473">"Select maximum number of connected Bluetooth audio devices"</string>
+ <!-- no translation found for bluetooth_enable_avdtp_delay_reports (5101903170688399944) -->
+ <skip />
+ <!-- no translation found for bluetooth_enable_avdtp_delay_reports_summary (7052797876020616399) -->
+ <skip />
<string name="wifi_display_settings_title" msgid="8740852850033480136">"Cast"</string>
<string name="wifi_display_enable_menu_item" msgid="4883036464138167674">"Enable wireless display"</string>
<string name="wifi_display_no_devices_found" msgid="1382012407154143453">"No nearby devices were found."</string>
@@ -1880,8 +1884,10 @@
<string name="accessibility_service_master_switch_title" msgid="6835441300276358239">"Use service"</string>
<string name="accessibility_daltonizer_master_switch_title" msgid="8655284637968823154">"Use colour correction"</string>
<string name="accessibility_caption_master_switch_title" msgid="4010227386676077826">"Use captions"</string>
- <string name="accessibility_summary_state_enabled" msgid="8359913912320966304">"ON"</string>
- <string name="accessibility_summary_state_disabled" msgid="2241315620132005595">"OFF"</string>
+ <!-- no translation found for accessibility_summary_state_enabled (7914278500885887763) -->
+ <skip />
+ <!-- no translation found for accessibility_summary_state_disabled (2984230257590246745) -->
+ <skip />
<string name="enable_quick_setting" msgid="2366999897816894536">"Show in Quick Settings"</string>
<string name="daltonizer_type" msgid="1124178250809091080">"Correction mode"</string>
<plurals name="accessibilty_autoclick_preference_subtitle_extremely_short_delay" formatted="false" msgid="7340347830562315800">
@@ -2888,6 +2894,8 @@
<string name="keywords_model_and_hardware" msgid="1459248377212829642">"serial number, hardware version"</string>
<string name="keywords_android_version" msgid="9069747153590902819">"android security patch level, baseband version, kernel version"</string>
<string name="keywords_ambient_display_screen" msgid="5874969496073249362">"Ambient display, Lock screen display"</string>
+ <!-- no translation found for keywords_fingerprint_settings (239222512315619538) -->
+ <skip />
<string name="setup_wifi_nfc_tag" msgid="9028353016222911016">"Set up Wi-Fi NFC Tag"</string>
<string name="write_tag" msgid="8571858602896222537">"Write"</string>
<string name="status_awaiting_tap" msgid="2130145523773160617">"Tap a tag to write..."</string>
@@ -3170,7 +3178,8 @@
<string name="zen_mode_summary_alarms_only_by_time" msgid="7465525754879341907">"Change to alarms only until <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_summary_always" msgid="6172985102689237703">"Change to always interrupt"</string>
<string name="zen_mode_screen_on" msgid="8774571998575673502">"When the screen is on"</string>
- <string name="zen_mode_screen_on_summary" msgid="5385338884695802115">"Let notifications silenced by Do Not Disturb pop on screen"</string>
+ <!-- no translation found for zen_mode_screen_on_summary (2208664848367443505) -->
+ <skip />
<string name="zen_mode_screen_off" msgid="3144446765110327937">"When the screen is off"</string>
<string name="zen_mode_screen_off_summary" msgid="7430034620565812258">"Let notifications silenced by Do Not Disturb turn on the screen and blink the light"</string>
<string name="zen_mode_screen_off_summary_no_led" msgid="2826121465026642017">"Let notifications silenced by Do Not Disturb turn on the screen"</string>
@@ -3358,6 +3367,8 @@
<string name="usb_use_MIDI_desc" msgid="8473936990076693175">"Use this device as MIDI"</string>
<string name="usb_use" msgid="3372728031108932425">"Use USB for"</string>
<string name="usb_use_also" msgid="557340935190819370">"Also use USB for"</string>
+ <string name="usb_default_label" msgid="4217189967858707974">"Default USB Configuration"</string>
+ <string name="usb_default_info" msgid="8864535445796200695">"When another device is connected and your phone is unlocked, these settings will be applied. Only connect to trusted devices."</string>
<string name="usb_pref" msgid="1400617804525116158">"USB"</string>
<string name="usb_summary_charging_only" msgid="7544327009143659751">"Charging this device"</string>
<string name="usb_summary_power_only" msgid="1996391096369798526">"Charging connected device"</string>
@@ -3478,8 +3489,10 @@
<string name="memory_summary" msgid="8080825904671961872">"Avg <xliff:g id="USED_MEMORY">%1$s</xliff:g> of <xliff:g id="TOTAL_MEMORY">%2$s</xliff:g> memory used"</string>
<string name="users_summary" msgid="1674864467098487328">"Signed in as <xliff:g id="USER_NAME">%1$s</xliff:g>"</string>
<string name="payment_summary" msgid="3472482669588561110">"<xliff:g id="APP_NAME">%1$s</xliff:g> is default"</string>
- <string name="location_on_summary" msgid="4083334422422067511">"ON"</string>
- <string name="location_off_summary" msgid="6474350053215707957">"OFF"</string>
+ <!-- no translation found for location_on_summary (3637699010986988970) -->
+ <skip />
+ <!-- no translation found for location_off_summary (7217264690673949107) -->
+ <skip />
<string name="backup_disabled" msgid="485189128759595412">"Backup disabled"</string>
<string name="android_version_summary" msgid="2935995161657697278">"Updated to Android <xliff:g id="VERSION">%1$s</xliff:g>"</string>
<string name="android_version_pending_update_summary" msgid="487831391976523090">"Update available"</string>
@@ -3653,9 +3666,13 @@
<string name="bluetooth_connected_summary" msgid="7672528674593152862">"Connected to <xliff:g id="ID_1">%1$s</xliff:g>"</string>
<string name="bluetooth_connected_multiple_devices_summary" msgid="9173661896296663932">"Connected to multiple devices"</string>
<string name="demo_mode" msgid="2798762752209330277">"System UI demo mode"</string>
+ <!-- no translation found for dark_ui_mode (2112241426441807273) -->
+ <skip />
+ <!-- no translation found for dark_ui_mode_title (975299966259850992) -->
+ <skip />
<string name="quick_settings_developer_tiles" msgid="5947788063262762448">"Quick settings developer tiles"</string>
- <string name="window_trace_quick_settings_title" msgid="3839917000546526898">"Window Trace"</string>
- <string name="layer_trace_quick_settings_title" msgid="876797401275734018">"Surface Trace"</string>
+ <!-- no translation found for winscope_trace_quick_settings_title (1294290008255732032) -->
+ <skip />
<string name="support_country_format" msgid="4502523713489559595">"<xliff:g id="COUNTRY">%1$s</xliff:g> - <xliff:g id="LANGUAGE">%2$s</xliff:g>"</string>
<string name="managed_profile_settings_title" msgid="2729481936758125054">"Work profile settings"</string>
<string name="managed_profile_contact_search_title" msgid="6034734926815544221">"Contact search"</string>
diff --git a/res/values-en-rIN/arrays.xml b/res/values-en-rIN/arrays.xml
index 2b3388b..8b87a4e 100644
--- a/res/values-en-rIN/arrays.xml
+++ b/res/values-en-rIN/arrays.xml
@@ -497,4 +497,7 @@
<item msgid="8745603368609022803">"Treat as metered"</item>
<item msgid="2266114985518865625">"Treat as unmetered"</item>
</string-array>
+ <!-- no translation found for dark_ui_mode_entries:0 (146804192658443142) -->
+ <!-- no translation found for dark_ui_mode_entries:1 (6620560879508595181) -->
+ <!-- no translation found for dark_ui_mode_entries:2 (6385301106124765323) -->
</resources>
diff --git a/res/values-en-rIN/strings.xml b/res/values-en-rIN/strings.xml
index 15e68ae..b2fe946 100644
--- a/res/values-en-rIN/strings.xml
+++ b/res/values-en-rIN/strings.xml
@@ -707,6 +707,10 @@
<string name="bluetooth_dock_settings_remember" msgid="5551459057010609115">"Remember settings"</string>
<string name="bluetooth_max_connected_audio_devices_string" msgid="6752690395207847881">"Maximum connected Bluetooth audio devices"</string>
<string name="bluetooth_max_connected_audio_devices_dialog_title" msgid="5936561749790095473">"Select maximum number of connected Bluetooth audio devices"</string>
+ <!-- no translation found for bluetooth_enable_avdtp_delay_reports (5101903170688399944) -->
+ <skip />
+ <!-- no translation found for bluetooth_enable_avdtp_delay_reports_summary (7052797876020616399) -->
+ <skip />
<string name="wifi_display_settings_title" msgid="8740852850033480136">"Cast"</string>
<string name="wifi_display_enable_menu_item" msgid="4883036464138167674">"Enable wireless display"</string>
<string name="wifi_display_no_devices_found" msgid="1382012407154143453">"No nearby devices were found."</string>
@@ -1880,8 +1884,10 @@
<string name="accessibility_service_master_switch_title" msgid="6835441300276358239">"Use service"</string>
<string name="accessibility_daltonizer_master_switch_title" msgid="8655284637968823154">"Use colour correction"</string>
<string name="accessibility_caption_master_switch_title" msgid="4010227386676077826">"Use captions"</string>
- <string name="accessibility_summary_state_enabled" msgid="8359913912320966304">"ON"</string>
- <string name="accessibility_summary_state_disabled" msgid="2241315620132005595">"OFF"</string>
+ <!-- no translation found for accessibility_summary_state_enabled (7914278500885887763) -->
+ <skip />
+ <!-- no translation found for accessibility_summary_state_disabled (2984230257590246745) -->
+ <skip />
<string name="enable_quick_setting" msgid="2366999897816894536">"Show in Quick Settings"</string>
<string name="daltonizer_type" msgid="1124178250809091080">"Correction mode"</string>
<plurals name="accessibilty_autoclick_preference_subtitle_extremely_short_delay" formatted="false" msgid="7340347830562315800">
@@ -2888,6 +2894,8 @@
<string name="keywords_model_and_hardware" msgid="1459248377212829642">"serial number, hardware version"</string>
<string name="keywords_android_version" msgid="9069747153590902819">"android security patch level, baseband version, kernel version"</string>
<string name="keywords_ambient_display_screen" msgid="5874969496073249362">"Ambient display, Lock screen display"</string>
+ <!-- no translation found for keywords_fingerprint_settings (239222512315619538) -->
+ <skip />
<string name="setup_wifi_nfc_tag" msgid="9028353016222911016">"Set up Wi-Fi NFC Tag"</string>
<string name="write_tag" msgid="8571858602896222537">"Write"</string>
<string name="status_awaiting_tap" msgid="2130145523773160617">"Tap a tag to write..."</string>
@@ -3170,7 +3178,8 @@
<string name="zen_mode_summary_alarms_only_by_time" msgid="7465525754879341907">"Change to alarms only until <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_summary_always" msgid="6172985102689237703">"Change to always interrupt"</string>
<string name="zen_mode_screen_on" msgid="8774571998575673502">"When the screen is on"</string>
- <string name="zen_mode_screen_on_summary" msgid="5385338884695802115">"Let notifications silenced by Do Not Disturb pop on screen"</string>
+ <!-- no translation found for zen_mode_screen_on_summary (2208664848367443505) -->
+ <skip />
<string name="zen_mode_screen_off" msgid="3144446765110327937">"When the screen is off"</string>
<string name="zen_mode_screen_off_summary" msgid="7430034620565812258">"Let notifications silenced by Do Not Disturb turn on the screen and blink the light"</string>
<string name="zen_mode_screen_off_summary_no_led" msgid="2826121465026642017">"Let notifications silenced by Do Not Disturb turn on the screen"</string>
@@ -3358,6 +3367,8 @@
<string name="usb_use_MIDI_desc" msgid="8473936990076693175">"Use this device as MIDI"</string>
<string name="usb_use" msgid="3372728031108932425">"Use USB for"</string>
<string name="usb_use_also" msgid="557340935190819370">"Also use USB for"</string>
+ <string name="usb_default_label" msgid="4217189967858707974">"Default USB Configuration"</string>
+ <string name="usb_default_info" msgid="8864535445796200695">"When another device is connected and your phone is unlocked, these settings will be applied. Only connect to trusted devices."</string>
<string name="usb_pref" msgid="1400617804525116158">"USB"</string>
<string name="usb_summary_charging_only" msgid="7544327009143659751">"Charging this device"</string>
<string name="usb_summary_power_only" msgid="1996391096369798526">"Charging connected device"</string>
@@ -3478,8 +3489,10 @@
<string name="memory_summary" msgid="8080825904671961872">"Avg <xliff:g id="USED_MEMORY">%1$s</xliff:g> of <xliff:g id="TOTAL_MEMORY">%2$s</xliff:g> memory used"</string>
<string name="users_summary" msgid="1674864467098487328">"Signed in as <xliff:g id="USER_NAME">%1$s</xliff:g>"</string>
<string name="payment_summary" msgid="3472482669588561110">"<xliff:g id="APP_NAME">%1$s</xliff:g> is default"</string>
- <string name="location_on_summary" msgid="4083334422422067511">"ON"</string>
- <string name="location_off_summary" msgid="6474350053215707957">"OFF"</string>
+ <!-- no translation found for location_on_summary (3637699010986988970) -->
+ <skip />
+ <!-- no translation found for location_off_summary (7217264690673949107) -->
+ <skip />
<string name="backup_disabled" msgid="485189128759595412">"Backup disabled"</string>
<string name="android_version_summary" msgid="2935995161657697278">"Updated to Android <xliff:g id="VERSION">%1$s</xliff:g>"</string>
<string name="android_version_pending_update_summary" msgid="487831391976523090">"Update available"</string>
@@ -3653,9 +3666,13 @@
<string name="bluetooth_connected_summary" msgid="7672528674593152862">"Connected to <xliff:g id="ID_1">%1$s</xliff:g>"</string>
<string name="bluetooth_connected_multiple_devices_summary" msgid="9173661896296663932">"Connected to multiple devices"</string>
<string name="demo_mode" msgid="2798762752209330277">"System UI demo mode"</string>
+ <!-- no translation found for dark_ui_mode (2112241426441807273) -->
+ <skip />
+ <!-- no translation found for dark_ui_mode_title (975299966259850992) -->
+ <skip />
<string name="quick_settings_developer_tiles" msgid="5947788063262762448">"Quick settings developer tiles"</string>
- <string name="window_trace_quick_settings_title" msgid="3839917000546526898">"Window Trace"</string>
- <string name="layer_trace_quick_settings_title" msgid="876797401275734018">"Surface Trace"</string>
+ <!-- no translation found for winscope_trace_quick_settings_title (1294290008255732032) -->
+ <skip />
<string name="support_country_format" msgid="4502523713489559595">"<xliff:g id="COUNTRY">%1$s</xliff:g> - <xliff:g id="LANGUAGE">%2$s</xliff:g>"</string>
<string name="managed_profile_settings_title" msgid="2729481936758125054">"Work profile settings"</string>
<string name="managed_profile_contact_search_title" msgid="6034734926815544221">"Contact search"</string>
diff --git a/res/values-en-rXC/strings.xml b/res/values-en-rXC/strings.xml
index 1830c30..4e33693 100644
--- a/res/values-en-rXC/strings.xml
+++ b/res/values-en-rXC/strings.xml
@@ -3357,6 +3357,10 @@
<string name="usb_use_MIDI_desc" msgid="8473936990076693175">"Use this device as MIDI"</string>
<string name="usb_use" msgid="3372728031108932425">"Use USB for"</string>
<string name="usb_use_also" msgid="557340935190819370">"Also use USB for"</string>
+ <!-- no translation found for usb_default_label (4217189967858707974) -->
+ <skip />
+ <!-- no translation found for usb_default_info (8864535445796200695) -->
+ <skip />
<string name="usb_pref" msgid="1400617804525116158">"USB"</string>
<string name="usb_summary_charging_only" msgid="7544327009143659751">"Charging this device"</string>
<string name="usb_summary_power_only" msgid="1996391096369798526">"Charging connected device"</string>
diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml
index b51252b..951ecff 100644
--- a/res/values-es-rUS/strings.xml
+++ b/res/values-es-rUS/strings.xml
@@ -3356,6 +3356,10 @@
<string name="usb_use_MIDI_desc" msgid="8473936990076693175">"Usar este dispositivo como MIDI"</string>
<string name="usb_use" msgid="3372728031108932425">"Utilizar USB para lo siguiente:"</string>
<string name="usb_use_also" msgid="557340935190819370">"También usar USB para"</string>
+ <!-- no translation found for usb_default_label (4217189967858707974) -->
+ <skip />
+ <!-- no translation found for usb_default_info (8864535445796200695) -->
+ <skip />
<string name="usb_pref" msgid="1400617804525116158">"USB"</string>
<string name="usb_summary_charging_only" msgid="7544327009143659751">"Cargar este dispositivo"</string>
<string name="usb_summary_power_only" msgid="1996391096369798526">"Cargando dispositivo conectado"</string>
diff --git a/res/values-es/arrays.xml b/res/values-es/arrays.xml
index ce3daf5..7f34311 100644
--- a/res/values-es/arrays.xml
+++ b/res/values-es/arrays.xml
@@ -497,4 +497,7 @@
<item msgid="8745603368609022803">"Tratar como red de uso no medido"</item>
<item msgid="2266114985518865625">"Tratar como red de uso medido"</item>
</string-array>
+ <!-- no translation found for dark_ui_mode_entries:0 (146804192658443142) -->
+ <!-- no translation found for dark_ui_mode_entries:1 (6620560879508595181) -->
+ <!-- no translation found for dark_ui_mode_entries:2 (6385301106124765323) -->
</resources>
diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml
index 9d3ad01..84b1201 100644
--- a/res/values-es/strings.xml
+++ b/res/values-es/strings.xml
@@ -707,6 +707,10 @@
<string name="bluetooth_dock_settings_remember" msgid="5551459057010609115">"Ajustes de recordatorio"</string>
<string name="bluetooth_max_connected_audio_devices_string" msgid="6752690395207847881">"Máximo de dispositivos de audio conectados por Bluetooth"</string>
<string name="bluetooth_max_connected_audio_devices_dialog_title" msgid="5936561749790095473">"Selecciona el número máximo de dispositivos de audio conectados por Bluetooth"</string>
+ <!-- no translation found for bluetooth_enable_avdtp_delay_reports (5101903170688399944) -->
+ <skip />
+ <!-- no translation found for bluetooth_enable_avdtp_delay_reports_summary (7052797876020616399) -->
+ <skip />
<string name="wifi_display_settings_title" msgid="8740852850033480136">"Enviar pantalla"</string>
<string name="wifi_display_enable_menu_item" msgid="4883036464138167674">"Habilitar pantalla inalámbrica"</string>
<string name="wifi_display_no_devices_found" msgid="1382012407154143453">"No hay dispositivos cercanos."</string>
@@ -1880,8 +1884,10 @@
<string name="accessibility_service_master_switch_title" msgid="6835441300276358239">"Utilizar el servicio"</string>
<string name="accessibility_daltonizer_master_switch_title" msgid="8655284637968823154">"Utilizar la corrección de color"</string>
<string name="accessibility_caption_master_switch_title" msgid="4010227386676077826">"Utilizar subtítulos"</string>
- <string name="accessibility_summary_state_enabled" msgid="8359913912320966304">"ACTIVADO"</string>
- <string name="accessibility_summary_state_disabled" msgid="2241315620132005595">"DESACTIVADO"</string>
+ <!-- no translation found for accessibility_summary_state_enabled (7914278500885887763) -->
+ <skip />
+ <!-- no translation found for accessibility_summary_state_disabled (2984230257590246745) -->
+ <skip />
<string name="enable_quick_setting" msgid="2366999897816894536">"Mostrar en ajustes rápidos"</string>
<string name="daltonizer_type" msgid="1124178250809091080">"Modo de corrección"</string>
<plurals name="accessibilty_autoclick_preference_subtitle_extremely_short_delay" formatted="false" msgid="7340347830562315800">
@@ -2888,6 +2894,8 @@
<string name="keywords_model_and_hardware" msgid="1459248377212829642">"número de serie, versión de hardware"</string>
<string name="keywords_android_version" msgid="9069747153590902819">"nivel de parche de seguridad de android, versión de banda base, versión de kernel"</string>
<string name="keywords_ambient_display_screen" msgid="5874969496073249362">"Pantalla ambiente, pantalla de bloqueo"</string>
+ <!-- no translation found for keywords_fingerprint_settings (239222512315619538) -->
+ <skip />
<string name="setup_wifi_nfc_tag" msgid="9028353016222911016">"Configurar etiqueta NFC Wi-Fi"</string>
<string name="write_tag" msgid="8571858602896222537">"Editar"</string>
<string name="status_awaiting_tap" msgid="2130145523773160617">"Toca una etiqueta para editarla..."</string>
@@ -3170,7 +3178,8 @@
<string name="zen_mode_summary_alarms_only_by_time" msgid="7465525754879341907">"Cambiar a Solo alarmas hasta las <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_summary_always" msgid="6172985102689237703">"Cambiar a interrumpir siempre"</string>
<string name="zen_mode_screen_on" msgid="8774571998575673502">"Cuando la pantalla esté encendida"</string>
- <string name="zen_mode_screen_on_summary" msgid="5385338884695802115">"Permitir que las notificaciones silenciadas por el modo No molestar aparezcan en la pantalla"</string>
+ <!-- no translation found for zen_mode_screen_on_summary (2208664848367443505) -->
+ <skip />
<string name="zen_mode_screen_off" msgid="3144446765110327937">"Cuando la pantalla esté apagada"</string>
<string name="zen_mode_screen_off_summary" msgid="7430034620565812258">"Permitir que las notificaciones silenciadas por el modo No molestar activen la pantalla y hagan parpadear la luz"</string>
<string name="zen_mode_screen_off_summary_no_led" msgid="2826121465026642017">"Permitir que las notificaciones silenciadas por el modo No molestar activen la pantalla"</string>
@@ -3358,6 +3367,8 @@
<string name="usb_use_MIDI_desc" msgid="8473936990076693175">"Utilizar este dispositivo como MIDI"</string>
<string name="usb_use" msgid="3372728031108932425">"Utilizar USB para"</string>
<string name="usb_use_also" msgid="557340935190819370">"Utilizar USB también para"</string>
+ <string name="usb_default_label" msgid="4217189967858707974">"Configuración de USB predeterminada"</string>
+ <string name="usb_default_info" msgid="8864535445796200695">"Estos ajustes se aplicarán cuando otro dispositivo esté conectado y tu teléfono esté desbloqueado. Conecta únicamente dispositivos de confianza."</string>
<string name="usb_pref" msgid="1400617804525116158">"USB"</string>
<string name="usb_summary_charging_only" msgid="7544327009143659751">"Cargando el dispositivo"</string>
<string name="usb_summary_power_only" msgid="1996391096369798526">"Cargando dispositivo conectado"</string>
@@ -3478,8 +3489,10 @@
<string name="memory_summary" msgid="8080825904671961872">"Se está usando una media de <xliff:g id="USED_MEMORY">%1$s</xliff:g> de <xliff:g id="TOTAL_MEMORY">%2$s</xliff:g> de memoria"</string>
<string name="users_summary" msgid="1674864467098487328">"Has iniciado sesión como <xliff:g id="USER_NAME">%1$s</xliff:g>"</string>
<string name="payment_summary" msgid="3472482669588561110">"Aplicación predeterminada: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
- <string name="location_on_summary" msgid="4083334422422067511">"ACTIVADA"</string>
- <string name="location_off_summary" msgid="6474350053215707957">"DESACTIVADO"</string>
+ <!-- no translation found for location_on_summary (3637699010986988970) -->
+ <skip />
+ <!-- no translation found for location_off_summary (7217264690673949107) -->
+ <skip />
<string name="backup_disabled" msgid="485189128759595412">"Copia de seguridad inhabilitada"</string>
<string name="android_version_summary" msgid="2935995161657697278">"Actualizado a Android <xliff:g id="VERSION">%1$s</xliff:g>"</string>
<string name="android_version_pending_update_summary" msgid="487831391976523090">"Actualización disponible"</string>
@@ -3653,9 +3666,13 @@
<string name="bluetooth_connected_summary" msgid="7672528674593152862">"Conectado a <xliff:g id="ID_1">%1$s</xliff:g>"</string>
<string name="bluetooth_connected_multiple_devices_summary" msgid="9173661896296663932">"Conectado a varios dispositivos"</string>
<string name="demo_mode" msgid="2798762752209330277">"Modo de demostración de IU del sistema"</string>
+ <!-- no translation found for dark_ui_mode (2112241426441807273) -->
+ <skip />
+ <!-- no translation found for dark_ui_mode_title (975299966259850992) -->
+ <skip />
<string name="quick_settings_developer_tiles" msgid="5947788063262762448">"Ajustes rápidos de mosaicos de desarrolladores"</string>
- <string name="window_trace_quick_settings_title" msgid="3839917000546526898">"Captura de ventanas"</string>
- <string name="layer_trace_quick_settings_title" msgid="876797401275734018">"Captura de superficies"</string>
+ <!-- no translation found for winscope_trace_quick_settings_title (1294290008255732032) -->
+ <skip />
<string name="support_country_format" msgid="4502523713489559595">"<xliff:g id="COUNTRY">%1$s</xliff:g> - <xliff:g id="LANGUAGE">%2$s</xliff:g>"</string>
<string name="managed_profile_settings_title" msgid="2729481936758125054">"Ajustes de perfil de trabajo"</string>
<string name="managed_profile_contact_search_title" msgid="6034734926815544221">"Búsqueda de contactos"</string>
diff --git a/res/values-et/strings.xml b/res/values-et/strings.xml
index 2a002af..12488ae 100644
--- a/res/values-et/strings.xml
+++ b/res/values-et/strings.xml
@@ -3358,6 +3358,10 @@
<string name="usb_use_MIDI_desc" msgid="8473936990076693175">"Kasutage seda seadet MIDI-na"</string>
<string name="usb_use" msgid="3372728031108932425">"USB kasutusviis"</string>
<string name="usb_use_also" msgid="557340935190819370">"Kasutage USB-d ka järgmiseks:"</string>
+ <!-- no translation found for usb_default_label (4217189967858707974) -->
+ <skip />
+ <!-- no translation found for usb_default_info (8864535445796200695) -->
+ <skip />
<string name="usb_pref" msgid="1400617804525116158">"USB"</string>
<string name="usb_summary_charging_only" msgid="7544327009143659751">"Seadme laadimine"</string>
<string name="usb_summary_power_only" msgid="1996391096369798526">"Ühendatud seadme laadimine"</string>
@@ -3810,8 +3814,7 @@
<string name="storage_percent_full" msgid="6095012055875077036">"kasut."</string>
<string name="clear_instant_app_data" msgid="2004222610585890909">"Tühjenda rakendus"</string>
<string name="clear_instant_app_confirmation" msgid="7451671214898856857">"Kas soovite selle installimata avatava rakenduse eemaldada?"</string>
- <!-- no translation found for launch_instant_app (391581144859010499) -->
- <skip />
+ <string name="launch_instant_app" msgid="391581144859010499">"Ava"</string>
<string name="game_storage_settings" msgid="3410689937046696557">"Mängud"</string>
<string name="audio_files_title" msgid="4777048870657911307">"Helifailid"</string>
<string name="app_info_storage_title" msgid="5554719444625611987">"Kasutatav ruum"</string>
diff --git a/res/values-eu/strings.xml b/res/values-eu/strings.xml
index 7c8d312..10c8d31 100644
--- a/res/values-eu/strings.xml
+++ b/res/values-eu/strings.xml
@@ -400,7 +400,7 @@
<string name="lock_screen_intro_skip_dialog_text" product="device" msgid="1466238255429527112">"Ez dira aktibatuko gailuaren babes-eginbideak. Gailua galtzen baduzu edo lapurtzen badizute, ezin izango duzu ekidin beste pertsona batzuek erabiltzea."</string>
<string name="lock_screen_intro_skip_dialog_text" product="default" msgid="3008526710555416125">"Ez dira aktibatuko gailuaren babes-eginbideak. Telefonoa galtzen baduzu edo lapurtzen badizute, ezin izango duzu ekidin beste pertsona batzuek erabiltzea."</string>
<string name="skip_anyway_button_label" msgid="2323522873558834513">"Saltatu halere"</string>
- <string name="go_back_button_label" msgid="4745265266186209467">"Atzera"</string>
+ <string name="go_back_button_label" msgid="4745265266186209467">"Egin atzera"</string>
<string name="security_settings_fingerprint_enroll_find_sensor_title" msgid="3051496861358227199">"Ukitu sentsorea"</string>
<string name="security_settings_fingerprint_enroll_find_sensor_message" msgid="8793966374365960368">"Telefonoaren atzealdean dago. Erabili hatz erakuslea."</string>
<string name="security_settings_fingerprint_enroll_find_sensor_content_description" msgid="2058830032070449160">"Hatz-marken sentsorea gailuan non dagoen erakusten duen ilustrazioa"</string>
@@ -3358,6 +3358,10 @@
<string name="usb_use_MIDI_desc" msgid="8473936990076693175">"Erabili gailua MIDI gisa"</string>
<string name="usb_use" msgid="3372728031108932425">"Erabili USBa honetarako:"</string>
<string name="usb_use_also" msgid="557340935190819370">"Erabili USB konexioa hauetarako ere:"</string>
+ <!-- no translation found for usb_default_label (4217189967858707974) -->
+ <skip />
+ <!-- no translation found for usb_default_info (8864535445796200695) -->
+ <skip />
<string name="usb_pref" msgid="1400617804525116158">"USB"</string>
<string name="usb_summary_charging_only" msgid="7544327009143659751">"Gailua kargatzeko"</string>
<string name="usb_summary_power_only" msgid="1996391096369798526">"Konektatutako gailua kargatzea"</string>
diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml
index 597be58..40af8f4 100644
--- a/res/values-fa/strings.xml
+++ b/res/values-fa/strings.xml
@@ -206,7 +206,7 @@
<string name="radio_info_neighboring_location_label" msgid="5766020323342985397">"اطلاعات شبکه همراه مجاور (منسوخ شده):"</string>
<string name="radio_info_cell_info_refresh_rate" msgid="7062777594049622128">"نرخ بازخوانی اطلاعات شبکه همراه:"</string>
<string name="radio_info_cellinfo_label" msgid="6213223844927623098">"همه اطلاعات اندازهگیری شبکه همراه:"</string>
- <string name="radio_info_dcrtinfo_label" msgid="4062076024399431876">"اطلاعات بیدرنگ اتصال داده:"</string>
+ <string name="radio_info_dcrtinfo_label" msgid="4062076024399431876">"اطلاعات همزمان اتصال داده:"</string>
<string name="radio_info_gprs_service_label" msgid="4209624131644060517">"سرویس داده:"</string>
<string name="radio_info_roaming_label" msgid="6141505430275138647">"رومینگ:"</string>
<string name="radio_info_imei_label" msgid="1220524224732944192">"IMEI:"</string>
@@ -3358,6 +3358,10 @@
<string name="usb_use_MIDI_desc" msgid="8473936990076693175">"استفاده از این دستگاه بهعنوان MIDI"</string>
<string name="usb_use" msgid="3372728031108932425">"استفاده از USB برای"</string>
<string name="usb_use_also" msgid="557340935190819370">"همچنین، استفاده از USB برای"</string>
+ <!-- no translation found for usb_default_label (4217189967858707974) -->
+ <skip />
+ <!-- no translation found for usb_default_info (8864535445796200695) -->
+ <skip />
<string name="usb_pref" msgid="1400617804525116158">"USB"</string>
<string name="usb_summary_charging_only" msgid="7544327009143659751">"شارژ کردن این دستگاه"</string>
<string name="usb_summary_power_only" msgid="1996391096369798526">"شارژ دستگاه متصلشده"</string>
diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml
index 74a553e..bdf0096 100644
--- a/res/values-fi/strings.xml
+++ b/res/values-fi/strings.xml
@@ -3358,6 +3358,10 @@
<string name="usb_use_MIDI_desc" msgid="8473936990076693175">"Käytä tätä laitetta MIDI-tilassa."</string>
<string name="usb_use" msgid="3372728031108932425">"Käytä USB:tä:"</string>
<string name="usb_use_also" msgid="557340935190819370">"Käytä USB:ta myös seuraaviin:"</string>
+ <!-- no translation found for usb_default_label (4217189967858707974) -->
+ <skip />
+ <!-- no translation found for usb_default_info (8864535445796200695) -->
+ <skip />
<string name="usb_pref" msgid="1400617804525116158">"USB"</string>
<string name="usb_summary_charging_only" msgid="7544327009143659751">"Laitteen lataaminen"</string>
<string name="usb_summary_power_only" msgid="1996391096369798526">"Yhdistetyn laitteen lataaminen"</string>
diff --git a/res/values-fr-rCA/strings.xml b/res/values-fr-rCA/strings.xml
index a8f55e6..b8982d3 100644
--- a/res/values-fr-rCA/strings.xml
+++ b/res/values-fr-rCA/strings.xml
@@ -923,7 +923,7 @@
<string name="wifi_hotspot_configure_ap_text" msgid="5478614731464220432">"Configuration point accès Wi‑Fi"</string>
<string name="wifi_hotspot_configure_ap_text_summary" msgid="5560680057727007011">"Point d\'accès AndroidAP WPA2 PSK"</string>
<string name="wifi_tether_configure_ssid_default" msgid="8467525402622138547">"AndroidHotspot"</string>
- <string name="wifi_tether_disabled_by_airplane" msgid="414480185654767932">"Cette option n\'est pas accessible, car le mode Avion n\'est pas activé"</string>
+ <string name="wifi_tether_disabled_by_airplane" msgid="414480185654767932">"Cette option n\'est pas accessible, car le mode Avion est activé"</string>
<string name="wifi_calling_settings_title" msgid="4102921303993404577">"Appels Wi-Fi"</string>
<string name="wifi_calling_suggestion_title" msgid="7766895085362824508">"Prolong. couv. appel avec Wi‑Fi"</string>
<string name="wifi_calling_suggestion_summary" msgid="6460250990899143406">"Activer les appels Wi-Fi"</string>
@@ -1493,7 +1493,7 @@
<string name="lockpassword_choose_your_password_message" msgid="5377842480961577542">"Pour votre sécurité, définissez un mot de passe"</string>
<string name="lockpassword_choose_your_password_header_for_fingerprint" msgid="6624409510609085450">"Pour util. empr. digit., config. m. de passe"</string>
<string name="lockpassword_choose_your_pattern_header_for_fingerprint" msgid="5901096361617543819">"Pour utiliser empreinte digitale, configurer schéma"</string>
- <string name="lockpassword_choose_your_pin_message" msgid="6658264750811929338">"Pour votre de sécurité, définissez un NIP"</string>
+ <string name="lockpassword_choose_your_pin_message" msgid="6658264750811929338">"Pour votre sécurité, définissez un NIP"</string>
<string name="lockpassword_choose_your_pin_header_for_fingerprint" msgid="765344692615917183">"Pour util. empr. digit., config. NIP"</string>
<string name="lockpassword_choose_your_pattern_message" msgid="8631545254345759087">"Pour votre sécurité, définissez un schéma de verrouillage"</string>
<string name="lockpassword_confirm_your_password_header" msgid="1266027268220850931">"Entrez de nouveau votre mot de passe"</string>
@@ -3358,6 +3358,10 @@
<string name="usb_use_MIDI_desc" msgid="8473936990076693175">"Utiliser cet appareil en tant que MIDI"</string>
<string name="usb_use" msgid="3372728031108932425">"Utiliser la connexion USB pour :"</string>
<string name="usb_use_also" msgid="557340935190819370">"Aussi utiliser la connexion USB pour"</string>
+ <!-- no translation found for usb_default_label (4217189967858707974) -->
+ <skip />
+ <!-- no translation found for usb_default_info (8864535445796200695) -->
+ <skip />
<string name="usb_pref" msgid="1400617804525116158">"USB"</string>
<string name="usb_summary_charging_only" msgid="7544327009143659751">"Chargement de l\'appareil"</string>
<string name="usb_summary_power_only" msgid="1996391096369798526">"Chargement de l\'appareil connecté"</string>
diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml
index 8d2f660..93b14fa 100644
--- a/res/values-fr/strings.xml
+++ b/res/values-fr/strings.xml
@@ -3358,6 +3358,10 @@
<string name="usb_use_MIDI_desc" msgid="8473936990076693175">"Utiliser cet appareil en tant que MIDI"</string>
<string name="usb_use" msgid="3372728031108932425">"Utiliser la connexion USB pour"</string>
<string name="usb_use_also" msgid="557340935190819370">"Également utiliser la connexion USB pour"</string>
+ <!-- no translation found for usb_default_label (4217189967858707974) -->
+ <skip />
+ <!-- no translation found for usb_default_info (8864535445796200695) -->
+ <skip />
<string name="usb_pref" msgid="1400617804525116158">"USB"</string>
<string name="usb_summary_charging_only" msgid="7544327009143659751">"Rechargement de l\'appareil"</string>
<string name="usb_summary_power_only" msgid="1996391096369798526">"Rechargement de l\'appareil connecté"</string>
diff --git a/res/values-gl/strings.xml b/res/values-gl/strings.xml
index 6fa422a..fa94c9a 100644
--- a/res/values-gl/strings.xml
+++ b/res/values-gl/strings.xml
@@ -3358,6 +3358,10 @@
<string name="usb_use_MIDI_desc" msgid="8473936990076693175">"Utiliza este dispositivo como MIDI"</string>
<string name="usb_use" msgid="3372728031108932425">"Usar USB para"</string>
<string name="usb_use_also" msgid="557340935190819370">"Usar tamén o USB para"</string>
+ <!-- no translation found for usb_default_label (4217189967858707974) -->
+ <skip />
+ <!-- no translation found for usb_default_info (8864535445796200695) -->
+ <skip />
<string name="usb_pref" msgid="1400617804525116158">"USB"</string>
<string name="usb_summary_charging_only" msgid="7544327009143659751">"Cargar este dispositivo"</string>
<string name="usb_summary_power_only" msgid="1996391096369798526">"Cargando o dispositivo conectado"</string>
diff --git a/res/values-gu/strings.xml b/res/values-gu/strings.xml
index 0b2e4ef..6abb94a 100644
--- a/res/values-gu/strings.xml
+++ b/res/values-gu/strings.xml
@@ -3358,6 +3358,10 @@
<string name="usb_use_MIDI_desc" msgid="8473936990076693175">"MIDI તરીકે આ ઉપકરણનો ઉપયોગ કરો"</string>
<string name="usb_use" msgid="3372728031108932425">"આ માટે USB નો ઉપયોગ કરો"</string>
<string name="usb_use_also" msgid="557340935190819370">"USBનો ઉપયોગ આના માટે પણ કરો"</string>
+ <!-- no translation found for usb_default_label (4217189967858707974) -->
+ <skip />
+ <!-- no translation found for usb_default_info (8864535445796200695) -->
+ <skip />
<string name="usb_pref" msgid="1400617804525116158">"USB"</string>
<string name="usb_summary_charging_only" msgid="7544327009143659751">"આ ઉપકરણને ચાર્જ કરવું"</string>
<string name="usb_summary_power_only" msgid="1996391096369798526">"કનેક્ટેડ ઉપકરણ ચાર્જ કરી રહ્યાં છીએ"</string>
@@ -3810,8 +3814,7 @@
<string name="storage_percent_full" msgid="6095012055875077036">"વપરાયો"</string>
<string name="clear_instant_app_data" msgid="2004222610585890909">"ઍપ્લિકેશન સાફ કરો"</string>
<string name="clear_instant_app_confirmation" msgid="7451671214898856857">"શું તમે આ ઝટપટ ઍપ્લિકેશન દૂર કરવા માંગો છો?"</string>
- <!-- no translation found for launch_instant_app (391581144859010499) -->
- <skip />
+ <string name="launch_instant_app" msgid="391581144859010499">"ખોલો"</string>
<string name="game_storage_settings" msgid="3410689937046696557">"રમતો"</string>
<string name="audio_files_title" msgid="4777048870657911307">"ઑડિઓ ફાઇલો"</string>
<string name="app_info_storage_title" msgid="5554719444625611987">"જગ્યા વપરાઈ"</string>
diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml
index 75b698d..833d1b1 100644
--- a/res/values-hi/strings.xml
+++ b/res/values-hi/strings.xml
@@ -3358,6 +3358,10 @@
<string name="usb_use_MIDI_desc" msgid="8473936990076693175">"इस डिवाइस का उपयोग MIDI के रूप में करें"</string>
<string name="usb_use" msgid="3372728031108932425">"USB का उपयोग इसके लिए करें"</string>
<string name="usb_use_also" msgid="557340935190819370">"यूएसबी का इस्तेमाल इन कामों के लिए भी करें"</string>
+ <!-- no translation found for usb_default_label (4217189967858707974) -->
+ <skip />
+ <!-- no translation found for usb_default_info (8864535445796200695) -->
+ <skip />
<string name="usb_pref" msgid="1400617804525116158">"USB"</string>
<string name="usb_summary_charging_only" msgid="7544327009143659751">"इस डिवाइस को चार्ज करना"</string>
<string name="usb_summary_power_only" msgid="1996391096369798526">"जोड़े गए डिवाइस को चार्ज करना"</string>
@@ -3810,8 +3814,7 @@
<string name="storage_percent_full" msgid="6095012055875077036">"उपयोग की गई"</string>
<string name="clear_instant_app_data" msgid="2004222610585890909">"ऐप्लिकेशन साफ़ करें"</string>
<string name="clear_instant_app_confirmation" msgid="7451671214898856857">"क्या आप इस झटपट ऐप को निकालना चाहते हैं?"</string>
- <!-- no translation found for launch_instant_app (391581144859010499) -->
- <skip />
+ <string name="launch_instant_app" msgid="391581144859010499">"खोलें"</string>
<string name="game_storage_settings" msgid="3410689937046696557">"गेम"</string>
<string name="audio_files_title" msgid="4777048870657911307">"ऑडियो फ़ाइलें"</string>
<string name="app_info_storage_title" msgid="5554719444625611987">"उपयोग की गई जगह"</string>
diff --git a/res/values-hr/strings.xml b/res/values-hr/strings.xml
index ee93d12..6d3ccf2 100644
--- a/res/values-hr/strings.xml
+++ b/res/values-hr/strings.xml
@@ -3403,6 +3403,10 @@
<string name="usb_use_MIDI_desc" msgid="8473936990076693175">"Upotrebljavajte uređaj kao MIDI"</string>
<string name="usb_use" msgid="3372728031108932425">"Svrha upotrebe USB-a"</string>
<string name="usb_use_also" msgid="557340935190819370">"Upotrebljavajte USB i za"</string>
+ <!-- no translation found for usb_default_label (4217189967858707974) -->
+ <skip />
+ <!-- no translation found for usb_default_info (8864535445796200695) -->
+ <skip />
<string name="usb_pref" msgid="1400617804525116158">"USB"</string>
<string name="usb_summary_charging_only" msgid="7544327009143659751">"Punjenje ovog uređaja"</string>
<string name="usb_summary_power_only" msgid="1996391096369798526">"Punjenje povezanog uređaja"</string>
diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml
index 40a96f0..4cb4719 100644
--- a/res/values-hu/strings.xml
+++ b/res/values-hu/strings.xml
@@ -3360,6 +3360,10 @@
<string name="usb_use_MIDI_desc" msgid="8473936990076693175">"A készülék használata MIDI-eszközként"</string>
<string name="usb_use" msgid="3372728031108932425">"USB használata a következő célra:"</string>
<string name="usb_use_also" msgid="557340935190819370">"USB használata a következőhöz is:"</string>
+ <!-- no translation found for usb_default_label (4217189967858707974) -->
+ <skip />
+ <!-- no translation found for usb_default_info (8864535445796200695) -->
+ <skip />
<string name="usb_pref" msgid="1400617804525116158">"USB"</string>
<string name="usb_summary_charging_only" msgid="7544327009143659751">"Az eszköz töltése"</string>
<string name="usb_summary_power_only" msgid="1996391096369798526">"Folyamatban van a csatlakoztatott eszköz töltése"</string>
diff --git a/res/values-hy/strings.xml b/res/values-hy/strings.xml
index 7eee60f..1c65d2e 100644
--- a/res/values-hy/strings.xml
+++ b/res/values-hy/strings.xml
@@ -923,7 +923,7 @@
<string name="wifi_hotspot_configure_ap_text" msgid="5478614731464220432">"Wi-Fi թեժ կետի կարգավորում"</string>
<string name="wifi_hotspot_configure_ap_text_summary" msgid="5560680057727007011">"AndroidAP WPA2 PSK թեժ կետ"</string>
<string name="wifi_tether_configure_ssid_default" msgid="8467525402622138547">"Android թեժ կետ"</string>
- <string name="wifi_tether_disabled_by_airplane" msgid="414480185654767932">"Հասանելի չէ, քանի որ ինքնաթիռի ռեժիմը միացված է"</string>
+ <string name="wifi_tether_disabled_by_airplane" msgid="414480185654767932">"Հասանելի չէ, քանի որ ինքնաթիռի ռեժիմ է միացված"</string>
<string name="wifi_calling_settings_title" msgid="4102921303993404577">"Զանգեր Wi-Fi-ի միջոցով"</string>
<string name="wifi_calling_suggestion_title" msgid="7766895085362824508">"Ընդարձակեք զանգերի ծածկույթը Wi‑Fi-ի միջոցով"</string>
<string name="wifi_calling_suggestion_summary" msgid="6460250990899143406">"Միացրեք Wi-Fi-ի միջոցով զանգերը"</string>
@@ -3358,6 +3358,10 @@
<string name="usb_use_MIDI_desc" msgid="8473936990076693175">"Այս սարքի օգտագործում որպես MIDI"</string>
<string name="usb_use" msgid="3372728031108932425">"Օգտագործել հետևյալ USB կապակցումը՝"</string>
<string name="usb_use_also" msgid="557340935190819370">"USB-ի այլ կիրառումներ"</string>
+ <!-- no translation found for usb_default_label (4217189967858707974) -->
+ <skip />
+ <!-- no translation found for usb_default_info (8864535445796200695) -->
+ <skip />
<string name="usb_pref" msgid="1400617804525116158">"USB"</string>
<string name="usb_summary_charging_only" msgid="7544327009143659751">"Այս սարքի լիցքավորում"</string>
<string name="usb_summary_power_only" msgid="1996391096369798526">"Միացված սարքի լիցքավորում"</string>
diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml
index 4d51617..53088a9 100644
--- a/res/values-in/strings.xml
+++ b/res/values-in/strings.xml
@@ -3358,6 +3358,10 @@
<string name="usb_use_MIDI_desc" msgid="8473936990076693175">"Menggunakan perangkat ini sebagai MIDI"</string>
<string name="usb_use" msgid="3372728031108932425">"Gunakan USB untuk"</string>
<string name="usb_use_also" msgid="557340935190819370">"Gunakan juga USB untuk"</string>
+ <!-- no translation found for usb_default_label (4217189967858707974) -->
+ <skip />
+ <!-- no translation found for usb_default_info (8864535445796200695) -->
+ <skip />
<string name="usb_pref" msgid="1400617804525116158">"USB"</string>
<string name="usb_summary_charging_only" msgid="7544327009143659751">"Mengisi baterai perangkat ini"</string>
<string name="usb_summary_power_only" msgid="1996391096369798526">"Mengisi daya perangkat yang terhubung"</string>
diff --git a/res/values-is/strings.xml b/res/values-is/strings.xml
index c2325e8..7a064e5 100644
--- a/res/values-is/strings.xml
+++ b/res/values-is/strings.xml
@@ -3358,6 +3358,10 @@
<string name="usb_use_MIDI_desc" msgid="8473936990076693175">"Nota þetta tæki sem MIDI"</string>
<string name="usb_use" msgid="3372728031108932425">"Nota USB fyrir"</string>
<string name="usb_use_also" msgid="557340935190819370">"Nota USB einnig fyrir"</string>
+ <!-- no translation found for usb_default_label (4217189967858707974) -->
+ <skip />
+ <!-- no translation found for usb_default_info (8864535445796200695) -->
+ <skip />
<string name="usb_pref" msgid="1400617804525116158">"USB"</string>
<string name="usb_summary_charging_only" msgid="7544327009143659751">"Hleður þetta tæki"</string>
<string name="usb_summary_power_only" msgid="1996391096369798526">"Hlaða tengt tæki"</string>
diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml
index 63b008b..28da700 100644
--- a/res/values-it/strings.xml
+++ b/res/values-it/strings.xml
@@ -3358,6 +3358,10 @@
<string name="usb_use_MIDI_desc" msgid="8473936990076693175">"Utilizzare questo dispositivo per la modalità MIDI"</string>
<string name="usb_use" msgid="3372728031108932425">"Utilizza connessione USB per"</string>
<string name="usb_use_also" msgid="557340935190819370">"Usa USB anche per"</string>
+ <!-- no translation found for usb_default_label (4217189967858707974) -->
+ <skip />
+ <!-- no translation found for usb_default_info (8864535445796200695) -->
+ <skip />
<string name="usb_pref" msgid="1400617804525116158">"USB"</string>
<string name="usb_summary_charging_only" msgid="7544327009143659751">"Ricarica del dispositivo"</string>
<string name="usb_summary_power_only" msgid="1996391096369798526">"Ricarica del dispositivo collegato"</string>
diff --git a/res/values-iw/arrays.xml b/res/values-iw/arrays.xml
index 2da0c1b..1c1927c 100644
--- a/res/values-iw/arrays.xml
+++ b/res/values-iw/arrays.xml
@@ -497,4 +497,7 @@
<item msgid="8745603368609022803">"יש להתייחס כרשת נמדדת"</item>
<item msgid="2266114985518865625">"יש להתייחס כרשת לא נמדדת"</item>
</string-array>
+ <!-- no translation found for dark_ui_mode_entries:0 (146804192658443142) -->
+ <!-- no translation found for dark_ui_mode_entries:1 (6620560879508595181) -->
+ <!-- no translation found for dark_ui_mode_entries:2 (6385301106124765323) -->
</resources>
diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml
index 140ac32..1093e1f 100644
--- a/res/values-iw/strings.xml
+++ b/res/values-iw/strings.xml
@@ -729,6 +729,10 @@
<string name="bluetooth_dock_settings_remember" msgid="5551459057010609115">"זכור הגדרות"</string>
<string name="bluetooth_max_connected_audio_devices_string" msgid="6752690395207847881">"מקסימום התקני אודיו המחוברים באמצעות Bluetooth"</string>
<string name="bluetooth_max_connected_audio_devices_dialog_title" msgid="5936561749790095473">"בחירת מספר מקסימלי של התקני אודיו המחוברים באמצעות Bluetooth"</string>
+ <!-- no translation found for bluetooth_enable_avdtp_delay_reports (5101903170688399944) -->
+ <skip />
+ <!-- no translation found for bluetooth_enable_avdtp_delay_reports_summary (7052797876020616399) -->
+ <skip />
<string name="wifi_display_settings_title" msgid="8740852850033480136">"Cast"</string>
<string name="wifi_display_enable_menu_item" msgid="4883036464138167674">"הפעל תצוגת WiFi"</string>
<string name="wifi_display_no_devices_found" msgid="1382012407154143453">"לא נמצאו מכשירים בקרבת מקום."</string>
@@ -1908,8 +1912,10 @@
<string name="accessibility_service_master_switch_title" msgid="6835441300276358239">"שימוש בשירות"</string>
<string name="accessibility_daltonizer_master_switch_title" msgid="8655284637968823154">"שימוש בתיקון צבע"</string>
<string name="accessibility_caption_master_switch_title" msgid="4010227386676077826">"שימוש בכתוביות"</string>
- <string name="accessibility_summary_state_enabled" msgid="8359913912320966304">"מופעל"</string>
- <string name="accessibility_summary_state_disabled" msgid="2241315620132005595">"כבוי"</string>
+ <!-- no translation found for accessibility_summary_state_enabled (7914278500885887763) -->
+ <skip />
+ <!-- no translation found for accessibility_summary_state_disabled (2984230257590246745) -->
+ <skip />
<string name="enable_quick_setting" msgid="2366999897816894536">"הצג בהגדרות מהירות"</string>
<string name="daltonizer_type" msgid="1124178250809091080">"מצב תיקון"</string>
<plurals name="accessibilty_autoclick_preference_subtitle_extremely_short_delay" formatted="false" msgid="7340347830562315800">
@@ -2951,7 +2957,9 @@
<string name="keywords_sim_status" msgid="1474422416860990564">"רשת, מצב הרשת הסלולרית, מצב השירות, עוצמת האות, סוג הרשת הסלולרית, נדידה, iccid"</string>
<string name="keywords_model_and_hardware" msgid="1459248377212829642">"מספר סידורי, גרסת חומרה"</string>
<string name="keywords_android_version" msgid="9069747153590902819">"רמת תיקון האבטחה ב-Android, גרסת פס בסיס, גרסת ליבה"</string>
- <string name="keywords_ambient_display_screen" msgid="5874969496073249362">"תצוגה סביבתית, תצוגה של מסך נעילה"</string>
+ <string name="keywords_ambient_display_screen" msgid="5874969496073249362">"תצוגה רגישה לסביבה, תצוגה של מסך נעילה"</string>
+ <!-- no translation found for keywords_fingerprint_settings (239222512315619538) -->
+ <skip />
<string name="setup_wifi_nfc_tag" msgid="9028353016222911016">"הגדר תג NFC של Wi-Fi"</string>
<string name="write_tag" msgid="8571858602896222537">"כתוב"</string>
<string name="status_awaiting_tap" msgid="2130145523773160617">"הקש על תג כדי לכתוב..."</string>
@@ -3250,7 +3258,8 @@
<string name="zen_mode_summary_alarms_only_by_time" msgid="7465525754879341907">"עבור למצב \'התראות בלבד\' עד <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_summary_always" msgid="6172985102689237703">"שנה ל\'הפרעות בכל מצב\'"</string>
<string name="zen_mode_screen_on" msgid="8774571998575673502">"כאשר המסך מופעל"</string>
- <string name="zen_mode_screen_on_summary" msgid="5385338884695802115">"הודעות שהושתקו במצב \'נא לא להפריע\' יופיעו במסך"</string>
+ <!-- no translation found for zen_mode_screen_on_summary (2208664848367443505) -->
+ <skip />
<string name="zen_mode_screen_off" msgid="3144446765110327937">"כאשר המסך כבוי"</string>
<string name="zen_mode_screen_off_summary" msgid="7430034620565812258">"הודעות שהושתקו במצב \'נא לא להפריע\' יפעילו את המסך ואת האור המהבהב"</string>
<string name="zen_mode_screen_off_summary_no_led" msgid="2826121465026642017">"הודעות שהושתקו במצב \'נא לא להפריע\' יפעילו את המסך"</string>
@@ -3450,6 +3459,8 @@
<string name="usb_use_MIDI_desc" msgid="8473936990076693175">"שימוש במכשיר זה כהתקן MIDI"</string>
<string name="usb_use" msgid="3372728031108932425">"השתמש ב-USB בשביל"</string>
<string name="usb_use_also" msgid="557340935190819370">"יש להשתמש ב-USB גם בשביל"</string>
+ <string name="usb_default_label" msgid="4217189967858707974">"ברירת המחדל של תצורת USB"</string>
+ <string name="usb_default_info" msgid="8864535445796200695">"כשמכשיר אחר מחובר והטלפון לא נעול, הגדרות אלה יחולו. יש לחבר רק למכשירים מהימנים."</string>
<string name="usb_pref" msgid="1400617804525116158">"USB"</string>
<string name="usb_summary_charging_only" msgid="7544327009143659751">"הטענת המכשיר"</string>
<string name="usb_summary_power_only" msgid="1996391096369798526">"טעינת המכשיר המחובר"</string>
@@ -3574,8 +3585,10 @@
<string name="memory_summary" msgid="8080825904671961872">"ממוצע של <xliff:g id="USED_MEMORY">%1$s</xliff:g> מתוך <xliff:g id="TOTAL_MEMORY">%2$s</xliff:g> זיכרון בשימוש"</string>
<string name="users_summary" msgid="1674864467098487328">"מחובר בתור <xliff:g id="USER_NAME">%1$s</xliff:g>"</string>
<string name="payment_summary" msgid="3472482669588561110">"ברירת המחדל היא <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
- <string name="location_on_summary" msgid="4083334422422067511">"מופעל"</string>
- <string name="location_off_summary" msgid="6474350053215707957">"כבוי"</string>
+ <!-- no translation found for location_on_summary (3637699010986988970) -->
+ <skip />
+ <!-- no translation found for location_off_summary (7217264690673949107) -->
+ <skip />
<string name="backup_disabled" msgid="485189128759595412">"הגיבוי מושבת"</string>
<string name="android_version_summary" msgid="2935995161657697278">"עודכן ל-Android גרסה <xliff:g id="VERSION">%1$s</xliff:g>"</string>
<string name="android_version_pending_update_summary" msgid="487831391976523090">"יש עדכון זמין"</string>
@@ -3759,9 +3772,13 @@
<string name="bluetooth_connected_summary" msgid="7672528674593152862">"מחובר אל <xliff:g id="ID_1">%1$s</xliff:g>"</string>
<string name="bluetooth_connected_multiple_devices_summary" msgid="9173661896296663932">"מחובר לכמה התקנים"</string>
<string name="demo_mode" msgid="2798762752209330277">"מצב הדגמה בממשק המשתמש של המערכת"</string>
+ <!-- no translation found for dark_ui_mode (2112241426441807273) -->
+ <skip />
+ <!-- no translation found for dark_ui_mode_title (975299966259850992) -->
+ <skip />
<string name="quick_settings_developer_tiles" msgid="5947788063262762448">"משבצות מפתח להגדרות מהירות"</string>
- <string name="window_trace_quick_settings_title" msgid="3839917000546526898">"מעקב חלון"</string>
- <string name="layer_trace_quick_settings_title" msgid="876797401275734018">"עקבות על המסך"</string>
+ <!-- no translation found for winscope_trace_quick_settings_title (1294290008255732032) -->
+ <skip />
<string name="support_country_format" msgid="4502523713489559595">"<xliff:g id="COUNTRY">%1$s</xliff:g> - <xliff:g id="LANGUAGE">%2$s</xliff:g>"</string>
<string name="managed_profile_settings_title" msgid="2729481936758125054">"הגדרות של פרופיל עבודה"</string>
<string name="managed_profile_contact_search_title" msgid="6034734926815544221">"חיפוש אנשי קשר"</string>
@@ -3936,8 +3953,7 @@
<string name="storage_percent_full" msgid="6095012055875077036">"בשימוש"</string>
<string name="clear_instant_app_data" msgid="2004222610585890909">"נקה אפליקציה"</string>
<string name="clear_instant_app_confirmation" msgid="7451671214898856857">"האם ברצונך להסיר את אפליקציית האינסטנט הזאת?"</string>
- <!-- no translation found for launch_instant_app (391581144859010499) -->
- <skip />
+ <string name="launch_instant_app" msgid="391581144859010499">"פתיחה"</string>
<string name="game_storage_settings" msgid="3410689937046696557">"משחקים"</string>
<string name="audio_files_title" msgid="4777048870657911307">"קובצי אודיו"</string>
<string name="app_info_storage_title" msgid="5554719444625611987">"שטח אחסון בשימוש"</string>
diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml
index dc74adc..03b63e7 100644
--- a/res/values-ja/strings.xml
+++ b/res/values-ja/strings.xml
@@ -3362,6 +3362,10 @@
<string name="usb_use_MIDI_desc" msgid="8473936990076693175">"この端末を MIDI として利用する際に使用します"</string>
<string name="usb_use" msgid="3372728031108932425">"USBの使用"</string>
<string name="usb_use_also" msgid="557340935190819370">"USB の他の用途"</string>
+ <!-- no translation found for usb_default_label (4217189967858707974) -->
+ <skip />
+ <!-- no translation found for usb_default_info (8864535445796200695) -->
+ <skip />
<string name="usb_pref" msgid="1400617804525116158">"USB"</string>
<string name="usb_summary_charging_only" msgid="7544327009143659751">"この端末を充電する"</string>
<string name="usb_summary_power_only" msgid="1996391096369798526">"接続端末の充電"</string>
@@ -3814,8 +3818,7 @@
<string name="storage_percent_full" msgid="6095012055875077036">"使用"</string>
<string name="clear_instant_app_data" msgid="2004222610585890909">"アプリを削除"</string>
<string name="clear_instant_app_confirmation" msgid="7451671214898856857">"この Instant App を削除してもよろしいですか?"</string>
- <!-- no translation found for launch_instant_app (391581144859010499) -->
- <skip />
+ <string name="launch_instant_app" msgid="391581144859010499">"開く"</string>
<string name="game_storage_settings" msgid="3410689937046696557">"ゲーム"</string>
<string name="audio_files_title" msgid="4777048870657911307">"音声ファイル"</string>
<string name="app_info_storage_title" msgid="5554719444625611987">"使用済み容量"</string>
diff --git a/res/values-ka/strings.xml b/res/values-ka/strings.xml
index 258cac2..0a1dae7 100644
--- a/res/values-ka/strings.xml
+++ b/res/values-ka/strings.xml
@@ -3358,6 +3358,10 @@
<string name="usb_use_MIDI_desc" msgid="8473936990076693175">"ამ მოწყობილობის MIDI-ს სახით გამოყენება"</string>
<string name="usb_use" msgid="3372728031108932425">"USB-ს გამოყენება"</string>
<string name="usb_use_also" msgid="557340935190819370">"USB-ს აგრეთვე გამოყენება"</string>
+ <!-- no translation found for usb_default_label (4217189967858707974) -->
+ <skip />
+ <!-- no translation found for usb_default_info (8864535445796200695) -->
+ <skip />
<string name="usb_pref" msgid="1400617804525116158">"USB"</string>
<string name="usb_summary_charging_only" msgid="7544327009143659751">"ამ მოწყობილობის დატენვა"</string>
<string name="usb_summary_power_only" msgid="1996391096369798526">"დაკავშირებული მოწყობილობის დატენვა"</string>
@@ -3810,8 +3814,7 @@
<string name="storage_percent_full" msgid="6095012055875077036">"გამოყენებული"</string>
<string name="clear_instant_app_data" msgid="2004222610585890909">"აპის გასუფთავება"</string>
<string name="clear_instant_app_confirmation" msgid="7451671214898856857">"გსურთ ამ მყისიერი აპის ამოშლა?"</string>
- <!-- no translation found for launch_instant_app (391581144859010499) -->
- <skip />
+ <string name="launch_instant_app" msgid="391581144859010499">"გახსნა"</string>
<string name="game_storage_settings" msgid="3410689937046696557">"თამაშები"</string>
<string name="audio_files_title" msgid="4777048870657911307">"აუდიო ფაილები"</string>
<string name="app_info_storage_title" msgid="5554719444625611987">"გამოყენებული მეხსიერება"</string>
diff --git a/res/values-kk/strings.xml b/res/values-kk/strings.xml
index c0f456e..4adf855 100644
--- a/res/values-kk/strings.xml
+++ b/res/values-kk/strings.xml
@@ -482,7 +482,7 @@
<string name="setup_lock_settings_picker_title" product="tablet" msgid="90329443364067215">"Планшетті қорғау"</string>
<string name="setup_lock_settings_picker_title" product="device" msgid="2399952075134938929">"Құрылғыны қорғау"</string>
<string name="setup_lock_settings_picker_title" product="default" msgid="1572244299605153324">"Телефонды қорғау"</string>
- <string name="lock_settings_picker_fingerprint_added_security_message" msgid="5008939545428518367">"Қауіпсіздікті күшейту үшін резервтік экран құлпын орнатыңыз"</string>
+ <string name="lock_settings_picker_fingerprint_added_security_message" msgid="5008939545428518367">"Қауіпсіздікті күшейту үшін қосымша экран құлпын орнатыңыз"</string>
<string name="setup_lock_settings_picker_message" product="tablet" msgid="8919671129189936210">"құрылғы қорғау мүмкіндіктерін іске қосу арқылы сіздің рұқсатыңызсыз планшетті басқалардың пайдалануына жол бермеңіз. Пайдаланғыңыз келетін экран құлпын таңдаңыз."</string>
<string name="setup_lock_settings_picker_message" product="device" msgid="3787276514406353777">"Құрылғыны қорғау мүмкіндіктерін белсендіру арқылы басқалардың осы құрылғыны рұқсатыңызсыз пайдалануын болдырмаңыз. Пайдаланғыңыз келетін экран бекітпесін таңдаңыз."</string>
<string name="setup_lock_settings_picker_message" product="default" msgid="3692856437543730446">"Құрылғыны қорғау мүмкіндіктерін белсендіру арқылы басқалардың осы телефонды рұқсатыңызсыз пайдалануын болдырмаңыз. Пайдаланғыңыз келетін экран бекітпесін таңдаңыз."</string>
@@ -2138,7 +2138,7 @@
<string name="usage_type_data_wifi_send" msgid="1847552143597396162">"Wi‑Fi пакеттері жіберілді"</string>
<string name="usage_type_data_wifi_recv" msgid="5678475911549183829">"Wi‑Fi пакеттері қабылданды"</string>
<string name="usage_type_audio" msgid="6957269406840886290">"Aудио"</string>
- <string name="usage_type_video" msgid="4295357792078579944">"Видео"</string>
+ <string name="usage_type_video" msgid="4295357792078579944">"Бейне"</string>
<string name="usage_type_camera" msgid="8299433109956769757">"Камера"</string>
<string name="usage_type_flashlight" msgid="1516392356962208230">"Қалта шамы"</string>
<string name="usage_type_on_time" msgid="3351200096173733159">"Уақыт қосулы"</string>
@@ -3358,6 +3358,10 @@
<string name="usb_use_MIDI_desc" msgid="8473936990076693175">"Осы құрылғыны MIDI ретінде пайдалану"</string>
<string name="usb_use" msgid="3372728031108932425">"USB пайдалану мақсаты"</string>
<string name="usb_use_also" msgid="557340935190819370">"USB байланысын келесілер үшін де пайдалану:"</string>
+ <!-- no translation found for usb_default_label (4217189967858707974) -->
+ <skip />
+ <!-- no translation found for usb_default_info (8864535445796200695) -->
+ <skip />
<string name="usb_pref" msgid="1400617804525116158">"USB"</string>
<string name="usb_summary_charging_only" msgid="7544327009143659751">"Осы құрылғыны зарядтауда"</string>
<string name="usb_summary_power_only" msgid="1996391096369798526">"Жалғанған құрылғыны зарядтау"</string>
@@ -3810,8 +3814,7 @@
<string name="storage_percent_full" msgid="6095012055875077036">"пайдаланылған"</string>
<string name="clear_instant_app_data" msgid="2004222610585890909">"Қолданбаны деректерін өшіру"</string>
<string name="clear_instant_app_confirmation" msgid="7451671214898856857">"Бұл лездік қолданбаны өшіргіңіз келе ме?"</string>
- <!-- no translation found for launch_instant_app (391581144859010499) -->
- <skip />
+ <string name="launch_instant_app" msgid="391581144859010499">"Ашу"</string>
<string name="game_storage_settings" msgid="3410689937046696557">"Ойындар"</string>
<string name="audio_files_title" msgid="4777048870657911307">"Аудиофайлдар"</string>
<string name="app_info_storage_title" msgid="5554719444625611987">"Пайдаланылған орын"</string>
diff --git a/res/values-km/strings.xml b/res/values-km/strings.xml
index f73c233..64514aa 100644
--- a/res/values-km/strings.xml
+++ b/res/values-km/strings.xml
@@ -3364,6 +3364,10 @@
<string name="usb_use_MIDI_desc" msgid="8473936990076693175">"ប្រើឧបករណ៍នេះជាមីឌី"</string>
<string name="usb_use" msgid="3372728031108932425">"ប្រើ USB ដើម្បី"</string>
<string name="usb_use_also" msgid="557340935190819370">"ក៏ប្រើប្រាស់ USB សម្រាប់"</string>
+ <!-- no translation found for usb_default_label (4217189967858707974) -->
+ <skip />
+ <!-- no translation found for usb_default_info (8864535445796200695) -->
+ <skip />
<string name="usb_pref" msgid="1400617804525116158">"USB"</string>
<string name="usb_summary_charging_only" msgid="7544327009143659751">"សាកថ្មឧបករណ៍នេះ"</string>
<string name="usb_summary_power_only" msgid="1996391096369798526">"សាកថ្មឧបករណ៍ដែលបានភ្ជាប់"</string>
diff --git a/res/values-kn/strings.xml b/res/values-kn/strings.xml
index b9b848d..1315347 100644
--- a/res/values-kn/strings.xml
+++ b/res/values-kn/strings.xml
@@ -3358,6 +3358,10 @@
<string name="usb_use_MIDI_desc" msgid="8473936990076693175">"ಈ ಸಾಧನವನ್ನು MIDI ಎಂದು ಬಳಸಿ"</string>
<string name="usb_use" msgid="3372728031108932425">"ಇದಕ್ಕಾಗಿ USB ಬಳಸಿ"</string>
<string name="usb_use_also" msgid="557340935190819370">"ಇದಕ್ಕಾಗಿ USB ಅನ್ನು ಬಳಸಿ"</string>
+ <!-- no translation found for usb_default_label (4217189967858707974) -->
+ <skip />
+ <!-- no translation found for usb_default_info (8864535445796200695) -->
+ <skip />
<string name="usb_pref" msgid="1400617804525116158">"USB"</string>
<string name="usb_summary_charging_only" msgid="7544327009143659751">"ಈ ಸಾಧನವನ್ನು ಚಾರ್ಜ್ ಮಾಡುವುದು"</string>
<string name="usb_summary_power_only" msgid="1996391096369798526">"ಸಂಪರ್ಕಗೊಂಡಿರುವ ಸಾಧನವನ್ನು ಚಾರ್ಜ್ ಮಾಡಲಾಗುತ್ತಿದೆ"</string>
@@ -3810,8 +3814,7 @@
<string name="storage_percent_full" msgid="6095012055875077036">"ಬಳಕೆಯಾಗಿದೆ"</string>
<string name="clear_instant_app_data" msgid="2004222610585890909">"ಅಪ್ಲಿಕೇಶನ್ ತೆರವುಗೊಳಿಸಿ"</string>
<string name="clear_instant_app_confirmation" msgid="7451671214898856857">"ಈ ತತ್ಕ್ಷಣ ಅಪ್ಲಿಕೇಶನ್ ತೆಗೆದುಹಾಕಲು ಬಯಸುವಿರಾ?"</string>
- <!-- no translation found for launch_instant_app (391581144859010499) -->
- <skip />
+ <string name="launch_instant_app" msgid="391581144859010499">"ತೆರೆ"</string>
<string name="game_storage_settings" msgid="3410689937046696557">"ಗೇಮ್ಗಳು"</string>
<string name="audio_files_title" msgid="4777048870657911307">"ಆಡಿಯೋ ಫೈಲ್ಗಳು"</string>
<string name="app_info_storage_title" msgid="5554719444625611987">"ಬಳಸಿರುವ ಸ್ಥಳ"</string>
diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml
index 2426c58..94da39f 100644
--- a/res/values-ko/strings.xml
+++ b/res/values-ko/strings.xml
@@ -3358,6 +3358,10 @@
<string name="usb_use_MIDI_desc" msgid="8473936990076693175">"이 기기를 MIDI로 사용"</string>
<string name="usb_use" msgid="3372728031108932425">"USB 사용"</string>
<string name="usb_use_also" msgid="557340935190819370">"다음 항목에 USB 사용"</string>
+ <!-- no translation found for usb_default_label (4217189967858707974) -->
+ <skip />
+ <!-- no translation found for usb_default_info (8864535445796200695) -->
+ <skip />
<string name="usb_pref" msgid="1400617804525116158">"USB"</string>
<string name="usb_summary_charging_only" msgid="7544327009143659751">"기기 충전 중"</string>
<string name="usb_summary_power_only" msgid="1996391096369798526">"연결된 기기 충전 중"</string>
@@ -3810,8 +3814,7 @@
<string name="storage_percent_full" msgid="6095012055875077036">"사용됨"</string>
<string name="clear_instant_app_data" msgid="2004222610585890909">"앱 삭제"</string>
<string name="clear_instant_app_confirmation" msgid="7451671214898856857">"이 인스턴트 앱을 삭제하시겠습니까?"</string>
- <!-- no translation found for launch_instant_app (391581144859010499) -->
- <skip />
+ <string name="launch_instant_app" msgid="391581144859010499">"열기"</string>
<string name="game_storage_settings" msgid="3410689937046696557">"게임"</string>
<string name="audio_files_title" msgid="4777048870657911307">"오디오 파일"</string>
<string name="app_info_storage_title" msgid="5554719444625611987">"사용 중인 공간"</string>
diff --git a/res/values-ky/strings.xml b/res/values-ky/strings.xml
index 6ea3e98..dacab25 100644
--- a/res/values-ky/strings.xml
+++ b/res/values-ky/strings.xml
@@ -3361,6 +3361,10 @@
<string name="usb_use_MIDI_desc" msgid="8473936990076693175">"Бул түзмөктү MIDI катары колдонуу"</string>
<string name="usb_use" msgid="3372728031108932425">"USB төмөнкү үчүн колдонулсун:"</string>
<string name="usb_use_also" msgid="557340935190819370">"USB төмөнкү функцияларды да аткара алат:"</string>
+ <!-- no translation found for usb_default_label (4217189967858707974) -->
+ <skip />
+ <!-- no translation found for usb_default_info (8864535445796200695) -->
+ <skip />
<string name="usb_pref" msgid="1400617804525116158">"USB"</string>
<string name="usb_summary_charging_only" msgid="7544327009143659751">"Бул түзмөктү кубаттоо"</string>
<string name="usb_summary_power_only" msgid="1996391096369798526">"Туташкан түзмөктү кубаттоо"</string>
@@ -3813,8 +3817,7 @@
<string name="storage_percent_full" msgid="6095012055875077036">"колдонулду"</string>
<string name="clear_instant_app_data" msgid="2004222610585890909">"Колдонмонун дайындарын тазалоо"</string>
<string name="clear_instant_app_confirmation" msgid="7451671214898856857">"Бул ыкчам ачылуучу колдонмо алынып салынсынбы?"</string>
- <!-- no translation found for launch_instant_app (391581144859010499) -->
- <skip />
+ <string name="launch_instant_app" msgid="391581144859010499">"Ачуу"</string>
<string name="game_storage_settings" msgid="3410689937046696557">"Оюндар"</string>
<string name="audio_files_title" msgid="4777048870657911307">"Аудио файлдар"</string>
<string name="app_info_storage_title" msgid="5554719444625611987">"Эстутумдан ээлеген орду"</string>
diff --git a/res/values-lo/strings.xml b/res/values-lo/strings.xml
index 581590f..4480d17 100644
--- a/res/values-lo/strings.xml
+++ b/res/values-lo/strings.xml
@@ -3358,6 +3358,10 @@
<string name="usb_use_MIDI_desc" msgid="8473936990076693175">"ໃຊ້ອຸປະກອນນີ້ເປັນ MIDI"</string>
<string name="usb_use" msgid="3372728031108932425">"ໃຊ້ USB ສຳລັບ"</string>
<string name="usb_use_also" msgid="557340935190819370">"ໃຊ້ USB ສຳລັບ"</string>
+ <!-- no translation found for usb_default_label (4217189967858707974) -->
+ <skip />
+ <!-- no translation found for usb_default_info (8864535445796200695) -->
+ <skip />
<string name="usb_pref" msgid="1400617804525116158">"USB"</string>
<string name="usb_summary_charging_only" msgid="7544327009143659751">"ກຳລັງສາກໄຟອຸປະກອນນີ້"</string>
<string name="usb_summary_power_only" msgid="1996391096369798526">"ການສາກໄຟອຸປະກອນທີ່ເຊື່ອມຕໍ່"</string>
diff --git a/res/values-lt/arrays.xml b/res/values-lt/arrays.xml
index 59c6513..091efc6 100644
--- a/res/values-lt/arrays.xml
+++ b/res/values-lt/arrays.xml
@@ -497,4 +497,7 @@
<item msgid="8745603368609022803">"Laikyti matuojamu"</item>
<item msgid="2266114985518865625">"Laikyti nematuojamu"</item>
</string-array>
+ <!-- no translation found for dark_ui_mode_entries:0 (146804192658443142) -->
+ <!-- no translation found for dark_ui_mode_entries:1 (6620560879508595181) -->
+ <!-- no translation found for dark_ui_mode_entries:2 (6385301106124765323) -->
</resources>
diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml
index e466f90..6b16d7e 100644
--- a/res/values-lt/strings.xml
+++ b/res/values-lt/strings.xml
@@ -488,8 +488,7 @@
<string name="setup_lock_settings_picker_title" product="tablet" msgid="90329443364067215">"Apsaugok. planš. komp."</string>
<string name="setup_lock_settings_picker_title" product="device" msgid="2399952075134938929">"Apsaugokite įrenginį"</string>
<string name="setup_lock_settings_picker_title" product="default" msgid="1572244299605153324">"Apsaugokite savo telefoną"</string>
- <!-- no translation found for lock_settings_picker_fingerprint_added_security_message (5008939545428518367) -->
- <skip />
+ <string name="lock_settings_picker_fingerprint_added_security_message" msgid="5008939545428518367">"Kad dar labiau apsaugotumėte įrenginį, nustatykite atsarginį ekrano užraktą"</string>
<string name="setup_lock_settings_picker_message" product="tablet" msgid="8919671129189936210">"Neleiskite kitiems asmenims naudoti šio planšetinio kompiuterio be leidimo, suaktyvinę įrenginio apsaugos funkcijas. Pasirinkite norimą naudoti užrakinimo ekraną."</string>
<string name="setup_lock_settings_picker_message" product="device" msgid="3787276514406353777">"Neleiskite kitiems asmenims naudoti šio įrenginio be jūsų leidimo, suaktyvinę įrenginio apsaugos funkcijas. Pasirinkite norimą naudoti užrakinimo ekraną."</string>
<string name="setup_lock_settings_picker_message" product="default" msgid="3692856437543730446">"Neleiskite kitiems asmenims naudoti šio telefono be jūsų leidimo, suaktyvinę įrenginio apsaugos funkcijas. Pasirinkite norimą naudoti užrakinimo ekraną."</string>
@@ -730,6 +729,10 @@
<string name="bluetooth_dock_settings_remember" msgid="5551459057010609115">"Atsiminti nustatymus"</string>
<string name="bluetooth_max_connected_audio_devices_string" msgid="6752690395207847881">"Maksimalus prijungtų „Bluetooth“ garso įrenginių skaičius"</string>
<string name="bluetooth_max_connected_audio_devices_dialog_title" msgid="5936561749790095473">"Pasirinkite maksimalų prijungtų „Bluetooth“ garso įrenginių skaičių"</string>
+ <!-- no translation found for bluetooth_enable_avdtp_delay_reports (5101903170688399944) -->
+ <skip />
+ <!-- no translation found for bluetooth_enable_avdtp_delay_reports_summary (7052797876020616399) -->
+ <skip />
<string name="wifi_display_settings_title" msgid="8740852850033480136">"Perdavimas"</string>
<string name="wifi_display_enable_menu_item" msgid="4883036464138167674">"Įgalinti belaidį rodymą"</string>
<string name="wifi_display_no_devices_found" msgid="1382012407154143453">"Nerasta netoliese esančių įrenginių."</string>
@@ -948,8 +951,7 @@
<string name="wifi_hotspot_configure_ap_text" msgid="5478614731464220432">"„Wi‑Fi“ vieš. int. pr. t. sąr."</string>
<string name="wifi_hotspot_configure_ap_text_summary" msgid="5560680057727007011">"„AndroidAP“ WPA2 PSK viešosios interneto prieigos taškas"</string>
<string name="wifi_tether_configure_ssid_default" msgid="8467525402622138547">"„AndroidHotspot“"</string>
- <!-- no translation found for wifi_tether_disabled_by_airplane (414480185654767932) -->
- <skip />
+ <string name="wifi_tether_disabled_by_airplane" msgid="414480185654767932">"Nepasiekiama, nes lėktuvo režimas įjungtas"</string>
<string name="wifi_calling_settings_title" msgid="4102921303993404577">"„Wi-Fi“ skambinimas"</string>
<string name="wifi_calling_suggestion_title" msgid="7766895085362824508">"Skamb. aprėpties išplėtimas naud. „Wi‑Fi“"</string>
<string name="wifi_calling_suggestion_summary" msgid="6460250990899143406">"Įjungti „Wi-Fi“ skambinimą"</string>
@@ -1517,17 +1519,13 @@
<string name="settings_safetylegal_activity_title" msgid="6901214628496951727">"Saugos informacija"</string>
<string name="settings_safetylegal_activity_unreachable" msgid="142307697309858185">"Nėra duomenų ryšio. Jei norite dabar peržiūrėti šią informaciją, bet kuriuo prie interneto prijungtu kompiuteriu eikite į %s."</string>
<string name="settings_safetylegal_activity_loading" msgid="8059022597639516348">"Įkeliama…"</string>
- <!-- no translation found for lockpassword_choose_your_screen_lock_header (2942199737559900752) -->
- <skip />
- <!-- no translation found for lockpassword_choose_your_password_message (5377842480961577542) -->
- <skip />
+ <string name="lockpassword_choose_your_screen_lock_header" msgid="2942199737559900752">"Ekrano užrakto nustatymas"</string>
+ <string name="lockpassword_choose_your_password_message" msgid="5377842480961577542">"Kad apsaugotumėte įrenginį, nustatykite slaptažodį"</string>
<string name="lockpassword_choose_your_password_header_for_fingerprint" msgid="6624409510609085450">"Nust. slapt., kad gal. naud. kont. kodą"</string>
<string name="lockpassword_choose_your_pattern_header_for_fingerprint" msgid="5901096361617543819">"Nust. atrak. pieš., kad gal. naud. kont. kodą"</string>
- <!-- no translation found for lockpassword_choose_your_pin_message (6658264750811929338) -->
- <skip />
+ <string name="lockpassword_choose_your_pin_message" msgid="6658264750811929338">"Kad apsaugotumėte įrenginį, nustatykite PIN kodą"</string>
<string name="lockpassword_choose_your_pin_header_for_fingerprint" msgid="765344692615917183">"Nus. PIN kodą, kad gal. naud. kon. kodą"</string>
- <!-- no translation found for lockpassword_choose_your_pattern_message (8631545254345759087) -->
- <skip />
+ <string name="lockpassword_choose_your_pattern_message" msgid="8631545254345759087">"Kad apsaugotumėte įrenginį, nubrėžkite atrakinimo piešinį"</string>
<string name="lockpassword_confirm_your_password_header" msgid="1266027268220850931">"Įveskite slaptažodį iš naujo"</string>
<string name="lockpassword_confirm_your_pattern_header" msgid="7543433733032330821">"Patvirtinkite piešinį"</string>
<string name="lockpassword_confirm_your_pin_header" msgid="7744513791910572550">"Įveskite PIN kodą iš naujo"</string>
@@ -1914,8 +1912,10 @@
<string name="accessibility_service_master_switch_title" msgid="6835441300276358239">"Naudoti paslaugą"</string>
<string name="accessibility_daltonizer_master_switch_title" msgid="8655284637968823154">"Naudoti spalvų taisymą"</string>
<string name="accessibility_caption_master_switch_title" msgid="4010227386676077826">"Naudoti subtitrus"</string>
- <string name="accessibility_summary_state_enabled" msgid="8359913912320966304">"ĮJUNGTI"</string>
- <string name="accessibility_summary_state_disabled" msgid="2241315620132005595">"IŠJUNGTA"</string>
+ <!-- no translation found for accessibility_summary_state_enabled (7914278500885887763) -->
+ <skip />
+ <!-- no translation found for accessibility_summary_state_disabled (2984230257590246745) -->
+ <skip />
<string name="enable_quick_setting" msgid="2366999897816894536">"Rodyti sparčiuosiuose nustatymuose"</string>
<string name="daltonizer_type" msgid="1124178250809091080">"Koregavimo režimas"</string>
<plurals name="accessibilty_autoclick_preference_subtitle_extremely_short_delay" formatted="false" msgid="7340347830562315800">
@@ -2956,6 +2956,8 @@
<string name="keywords_model_and_hardware" msgid="1459248377212829642">"serijos numeris, aparatinės įrangos versija"</string>
<string name="keywords_android_version" msgid="9069747153590902819">"„Android“ saugos pataisos lygis, nemoduliuotų signalų įrangos versija, branduolio versija"</string>
<string name="keywords_ambient_display_screen" msgid="5874969496073249362">"Aplinkos ekranas, užrakinimo ekranas"</string>
+ <!-- no translation found for keywords_fingerprint_settings (239222512315619538) -->
+ <skip />
<string name="setup_wifi_nfc_tag" msgid="9028353016222911016">"Nustatyti „Wi-Fi“ ALR žymą"</string>
<string name="write_tag" msgid="8571858602896222537">"Rašyti"</string>
<string name="status_awaiting_tap" msgid="2130145523773160617">"Palieskite žymą, kad galėtumėte rašyti..."</string>
@@ -3254,7 +3256,8 @@
<string name="zen_mode_summary_alarms_only_by_time" msgid="7465525754879341907">"Pakeisti tik į signalus iki <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_summary_always" msgid="6172985102689237703">"Pakeisti į pertraukimo nustatymą visam laikui"</string>
<string name="zen_mode_screen_on" msgid="8774571998575673502">"Kai ekranas įjungtas"</string>
- <string name="zen_mode_screen_on_summary" msgid="5385338884695802115">"Leisti, kad gavus pranešimų, nutildytų naudojant režimą „Netrukdyti“, jie būtų rodomi ekrane"</string>
+ <!-- no translation found for zen_mode_screen_on_summary (2208664848367443505) -->
+ <skip />
<string name="zen_mode_screen_off" msgid="3144446765110327937">"Kai ekranas išjungtas"</string>
<string name="zen_mode_screen_off_summary" msgid="7430034620565812258">"Leisti, kad gavus pranešimų, nutildytų naudojant režimą „Netrukdyti“, būtų įjungiamas ekranas ir mirksėtų lemputė"</string>
<string name="zen_mode_screen_off_summary_no_led" msgid="2826121465026642017">"Leisti, kad gavus pranešimų, nutildytų naudojant režimą „Netrukdyti“, būtų įjungiamas ekranas"</string>
@@ -3454,6 +3457,8 @@
<string name="usb_use_MIDI_desc" msgid="8473936990076693175">"Naudoti šį įrenginį kaip MIDI"</string>
<string name="usb_use" msgid="3372728031108932425">"USB naudojimas"</string>
<string name="usb_use_also" msgid="557340935190819370">"Taip pat naudoti USB"</string>
+ <string name="usb_default_label" msgid="4217189967858707974">"Numatytoji USB konfigūracija"</string>
+ <string name="usb_default_info" msgid="8864535445796200695">"Kai prijungiamas kitas įrenginys ir jūsų telefonas yra atrakintas, taikomi šie nustatymai. Prisijunkite tik prie patikimų įrenginių."</string>
<string name="usb_pref" msgid="1400617804525116158">"USB"</string>
<string name="usb_summary_charging_only" msgid="7544327009143659751">"Šio įrenginio įkrovimas"</string>
<string name="usb_summary_power_only" msgid="1996391096369798526">"Įkraunamas prijungtas įrenginys"</string>
@@ -3578,8 +3583,10 @@
<string name="memory_summary" msgid="8080825904671961872">"Vid. naudojama atminties: <xliff:g id="USED_MEMORY">%1$s</xliff:g> iš <xliff:g id="TOTAL_MEMORY">%2$s</xliff:g>"</string>
<string name="users_summary" msgid="1674864467098487328">"Prisijungta kaip <xliff:g id="USER_NAME">%1$s</xliff:g>"</string>
<string name="payment_summary" msgid="3472482669588561110">"Programa „<xliff:g id="APP_NAME">%1$s</xliff:g>“ yra numatytoji"</string>
- <string name="location_on_summary" msgid="4083334422422067511">"ĮJUNGTA"</string>
- <string name="location_off_summary" msgid="6474350053215707957">"IŠJUNGTA"</string>
+ <!-- no translation found for location_on_summary (3637699010986988970) -->
+ <skip />
+ <!-- no translation found for location_off_summary (7217264690673949107) -->
+ <skip />
<string name="backup_disabled" msgid="485189128759595412">"Atsarginės kopijos kūrimas išjungtas"</string>
<string name="android_version_summary" msgid="2935995161657697278">"Atnaujinta į <xliff:g id="VERSION">%1$s</xliff:g> versijos „Android“"</string>
<string name="android_version_pending_update_summary" msgid="487831391976523090">"Pasiekiamas naujinys"</string>
@@ -3763,9 +3770,13 @@
<string name="bluetooth_connected_summary" msgid="7672528674593152862">"Prisijungta prie „<xliff:g id="ID_1">%1$s</xliff:g>“"</string>
<string name="bluetooth_connected_multiple_devices_summary" msgid="9173661896296663932">"Prisijungta prie kelių įrenginių"</string>
<string name="demo_mode" msgid="2798762752209330277">"Sistemos NS demonstracinis režimas"</string>
+ <!-- no translation found for dark_ui_mode (2112241426441807273) -->
+ <skip />
+ <!-- no translation found for dark_ui_mode_title (975299966259850992) -->
+ <skip />
<string name="quick_settings_developer_tiles" msgid="5947788063262762448">"Sparčiųjų nustatymų kūrėjo išklotinės elementai"</string>
- <string name="window_trace_quick_settings_title" msgid="3839917000546526898">"Lango žymė"</string>
- <string name="layer_trace_quick_settings_title" msgid="876797401275734018">"Paviršiaus pėdsakas"</string>
+ <!-- no translation found for winscope_trace_quick_settings_title (1294290008255732032) -->
+ <skip />
<string name="support_country_format" msgid="4502523713489559595">"<xliff:g id="COUNTRY">%1$s</xliff:g> – <xliff:g id="LANGUAGE">%2$s</xliff:g>"</string>
<string name="managed_profile_settings_title" msgid="2729481936758125054">"Darbo profilio nustatymai"</string>
<string name="managed_profile_contact_search_title" msgid="6034734926815544221">"Kontaktų paieška"</string>
diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml
index c0218d3..640d521 100644
--- a/res/values-lv/strings.xml
+++ b/res/values-lv/strings.xml
@@ -485,8 +485,7 @@
<string name="setup_lock_settings_picker_title" product="tablet" msgid="90329443364067215">"Aizsargājiet planšetd."</string>
<string name="setup_lock_settings_picker_title" product="device" msgid="2399952075134938929">"Aizsargājiet ierīci"</string>
<string name="setup_lock_settings_picker_title" product="default" msgid="1572244299605153324">"Aizsargājiet tālruni"</string>
- <!-- no translation found for lock_settings_picker_fingerprint_added_security_message (5008939545428518367) -->
- <skip />
+ <string name="lock_settings_picker_fingerprint_added_security_message" msgid="5008939545428518367">"Papildu drošībai iestatiet rezerves ekrāna bloķēšanu."</string>
<string name="setup_lock_settings_picker_message" product="tablet" msgid="8919671129189936210">"Aktivizējiet ierīces aizsardzības funkcijas, lai neļautu citiem lietot šo planšetdatoru bez jūsu atļaujas. Izvēlieties bloķēšanas ekrānu, kuru vēlaties izmantot."</string>
<string name="setup_lock_settings_picker_message" product="device" msgid="3787276514406353777">"Aktivizējiet ierīces aizsardzības funkcijas, lai neļautu citiem lietot šo ierīci bez jūsu atļaujas. Izvēlieties bloķēšanas ekrānu, kuru vēlaties izmantot."</string>
<string name="setup_lock_settings_picker_message" product="default" msgid="3692856437543730446">"Aktivizējiet ierīces aizsardzības funkcijas, lai neļautu citiem lietot šo tālruni bez jūsu atļaujas. Izvēlieties bloķēšanas ekrānu, kuru vēlaties izmantot."</string>
@@ -936,8 +935,7 @@
<string name="wifi_hotspot_configure_ap_text" msgid="5478614731464220432">"Wi-Fi tīklāja iestatīšana"</string>
<string name="wifi_hotspot_configure_ap_text_summary" msgid="5560680057727007011">"AndroidAP WPA2 PSK tīklājs"</string>
<string name="wifi_tether_configure_ssid_default" msgid="8467525402622138547">"AndroidHotspot"</string>
- <!-- no translation found for wifi_tether_disabled_by_airplane (414480185654767932) -->
- <skip />
+ <string name="wifi_tether_disabled_by_airplane" msgid="414480185654767932">"Nav pieejams, jo ir ieslēgts lidojuma režīms"</string>
<string name="wifi_calling_settings_title" msgid="4102921303993404577">"Wi-Fi zvani"</string>
<string name="wifi_calling_suggestion_title" msgid="7766895085362824508">"Vairāk zvanu iespēju ar Wi‑Fi"</string>
<string name="wifi_calling_suggestion_summary" msgid="6460250990899143406">"Ieslēgt Wi-Fi zvanus"</string>
@@ -1504,17 +1502,13 @@
<string name="settings_safetylegal_activity_title" msgid="6901214628496951727">"Informācija par drošību"</string>
<string name="settings_safetylegal_activity_unreachable" msgid="142307697309858185">"Nav izveidots datu savienojums. Lai skatītu šo informāciju tūlīt, jebkurā datorā ar interneta savienojumu apmeklējiet vietni %s."</string>
<string name="settings_safetylegal_activity_loading" msgid="8059022597639516348">"Notiek ielāde…"</string>
- <!-- no translation found for lockpassword_choose_your_screen_lock_header (2942199737559900752) -->
- <skip />
- <!-- no translation found for lockpassword_choose_your_password_message (5377842480961577542) -->
- <skip />
+ <string name="lockpassword_choose_your_screen_lock_header" msgid="2942199737559900752">"Ekrāna bloķēšanas iestatīšana"</string>
+ <string name="lockpassword_choose_your_password_message" msgid="5377842480961577542">"Drošības nolūkos iestatiet paroli."</string>
<string name="lockpassword_choose_your_password_header_for_fingerprint" msgid="6624409510609085450">"Parole pirksta nosp. lietošanai"</string>
<string name="lockpassword_choose_your_pattern_header_for_fingerprint" msgid="5901096361617543819">"Kombinācijas iestatīšana"</string>
- <!-- no translation found for lockpassword_choose_your_pin_message (6658264750811929338) -->
- <skip />
+ <string name="lockpassword_choose_your_pin_message" msgid="6658264750811929338">"Drošības nolūkos iestatiet PIN kodu."</string>
<string name="lockpassword_choose_your_pin_header_for_fingerprint" msgid="765344692615917183">"PIN pirksta nosp. lietošanai"</string>
- <!-- no translation found for lockpassword_choose_your_pattern_message (8631545254345759087) -->
- <skip />
+ <string name="lockpassword_choose_your_pattern_message" msgid="8631545254345759087">"Drošības nolūkos iestatiet kombināciju."</string>
<string name="lockpassword_confirm_your_password_header" msgid="1266027268220850931">"Atkārtota paroles ievade"</string>
<string name="lockpassword_confirm_your_pattern_header" msgid="7543433733032330821">"Apstipriniet kombināciju"</string>
<string name="lockpassword_confirm_your_pin_header" msgid="7744513791910572550">"Atkārtota PIN ievade"</string>
@@ -3409,6 +3403,10 @@
<string name="usb_use_MIDI_desc" msgid="8473936990076693175">"Izmantot šo ierīci MIDI režīmā"</string>
<string name="usb_use" msgid="3372728031108932425">"USB savienojuma lietošana"</string>
<string name="usb_use_also" msgid="557340935190819370">"USB savienojuma izmantošanas iespējas"</string>
+ <!-- no translation found for usb_default_label (4217189967858707974) -->
+ <skip />
+ <!-- no translation found for usb_default_info (8864535445796200695) -->
+ <skip />
<string name="usb_pref" msgid="1400617804525116158">"USB"</string>
<string name="usb_summary_charging_only" msgid="7544327009143659751">"Šīs ierīces uzlāde"</string>
<string name="usb_summary_power_only" msgid="1996391096369798526">"Pievienotās ierīces uzlāde"</string>
@@ -3878,8 +3876,7 @@
<string name="storage_percent_full" msgid="6095012055875077036">"izmantots"</string>
<string name="clear_instant_app_data" msgid="2004222610585890909">"Notīrīt lietotni"</string>
<string name="clear_instant_app_confirmation" msgid="7451671214898856857">"Vai vēlaties noņemt šo tūlītējo lietotni?"</string>
- <!-- no translation found for launch_instant_app (391581144859010499) -->
- <skip />
+ <string name="launch_instant_app" msgid="391581144859010499">"Atvērt"</string>
<string name="game_storage_settings" msgid="3410689937046696557">"Spēles"</string>
<string name="audio_files_title" msgid="4777048870657911307">"Audio faili"</string>
<string name="app_info_storage_title" msgid="5554719444625611987">"Izmantotā vieta krātuvē"</string>
diff --git a/res/values-mcc262-mnc02-as/strings.xml b/res/values-mcc262-mnc02-as/strings.xml
new file mode 100644
index 0000000..a50914c
--- /dev/null
+++ b/res/values-mcc262-mnc02-as/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2017 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="wifi_calling_off_explanation_2" msgid="741028819102506783">\n\n"আপুনি ৱাই-ফাই কলিং ব্যৱহাৰ কৰি জৰুৰীকালীন কল কৰিব নোৱাৰে। যদিহে আপুনি তেনে কল কৰিবলৈ চেষ্টা কৰে, তেন্তে আপোনাৰ ডিভাইচটৱে স্বয়ংক্ৰিয়ভাৱে ম\'বাইল নেটৱৰ্ক ব্যৱহাৰ কৰিব। জৰুৰীকালীন কল কেৱল ম\'বাইল নেটৱৰ্ক উপলব্ধ থকা ঠাইতহে কৰিব পৰা যায়।"</string>
+</resources>
diff --git a/res/values-mcc262-mnc02-or/strings.xml b/res/values-mcc262-mnc02-or/strings.xml
new file mode 100644
index 0000000..12bac4e
--- /dev/null
+++ b/res/values-mcc262-mnc02-or/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2017 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="wifi_calling_off_explanation_2" msgid="741028819102506783">\n\n"ୱାଇ-ଫାଇ କଲିଙ୍ଗ ମାଧ୍ୟମରେ ଜରୁରୀକାଳୀନ କଲ୍ କରିହେବ ନାହିଁ। ଯଦି ଜରୁରୀକାଳୀନ କଲ୍ କରିବାକୁ ଚେଷ୍ଟା କରନ୍ତି, ତେବେ ଆପଣଙ୍କର ଡିଭାଇସ୍ ସ୍ୱଚାଳିତ ଭାବେ ମୋବାଇଲ୍ ନେଟ୍ୱର୍କ ବ୍ୟବହାର କରିବ। ଜରୁରୀକାଳୀନ କଲ୍ଗୁଡ଼ିକ କେବଳ ମୋବାଇଲ୍ ନେଟ୍ୱର୍କ କଭରେଜ୍ କ୍ଷେତ୍ରଗୁଡ଼ିକରେ ହିଁ କରିହେବ।"</string>
+</resources>
diff --git a/res/values-mk/strings.xml b/res/values-mk/strings.xml
index 1a424c7..d7c0cf3 100644
--- a/res/values-mk/strings.xml
+++ b/res/values-mk/strings.xml
@@ -3358,6 +3358,10 @@
<string name="usb_use_MIDI_desc" msgid="8473936990076693175">"Користете го уредов како MIDI"</string>
<string name="usb_use" msgid="3372728031108932425">"Користи USB за"</string>
<string name="usb_use_also" msgid="557340935190819370">"Користење на USB и за"</string>
+ <!-- no translation found for usb_default_label (4217189967858707974) -->
+ <skip />
+ <!-- no translation found for usb_default_info (8864535445796200695) -->
+ <skip />
<string name="usb_pref" msgid="1400617804525116158">"USB"</string>
<string name="usb_summary_charging_only" msgid="7544327009143659751">"Полнење на уредот"</string>
<string name="usb_summary_power_only" msgid="1996391096369798526">"Се полни поврзаниот уред"</string>
diff --git a/res/values-ml/strings.xml b/res/values-ml/strings.xml
index aac9266..a580443 100644
--- a/res/values-ml/strings.xml
+++ b/res/values-ml/strings.xml
@@ -3358,6 +3358,10 @@
<string name="usb_use_MIDI_desc" msgid="8473936990076693175">"MIDI ആയി ഈ ഉപകരണം ഉപയോഗിക്കുക"</string>
<string name="usb_use" msgid="3372728031108932425">"ഇതിനായി USB ഉപയോഗിക്കുക"</string>
<string name="usb_use_also" msgid="557340935190819370">"ഇതിനും USB ഉപയോഗിക്കുക"</string>
+ <!-- no translation found for usb_default_label (4217189967858707974) -->
+ <skip />
+ <!-- no translation found for usb_default_info (8864535445796200695) -->
+ <skip />
<string name="usb_pref" msgid="1400617804525116158">"USB"</string>
<string name="usb_summary_charging_only" msgid="7544327009143659751">"ഈ ഉപകരണം ചാർജ്ജുചെയ്യൽ"</string>
<string name="usb_summary_power_only" msgid="1996391096369798526">"കണക്റ്റ് ചെയ്ത ഉപകരണം ചാർജ് ചെയ്യുന്നു"</string>
@@ -3810,8 +3814,7 @@
<string name="storage_percent_full" msgid="6095012055875077036">"ഉപയോഗിച്ചത്"</string>
<string name="clear_instant_app_data" msgid="2004222610585890909">"ആപ്പ് മായ്ക്കുക"</string>
<string name="clear_instant_app_confirmation" msgid="7451671214898856857">"ഈ ഇൻസ്റ്റന്റ് ആപ്പ് നീക്കംചെയ്യാൻ ആഗ്രഹിക്കുന്നുണ്ടോ?"</string>
- <!-- no translation found for launch_instant_app (391581144859010499) -->
- <skip />
+ <string name="launch_instant_app" msgid="391581144859010499">"തുറക്കുക"</string>
<string name="game_storage_settings" msgid="3410689937046696557">"ഗെയിമുകള്"</string>
<string name="audio_files_title" msgid="4777048870657911307">"ഓഡിയോ ഫയലുകള്"</string>
<string name="app_info_storage_title" msgid="5554719444625611987">"ഉപയോഗിച്ച ഇടം"</string>
diff --git a/res/values-mn/strings.xml b/res/values-mn/strings.xml
index 060b635..4d647d3 100644
--- a/res/values-mn/strings.xml
+++ b/res/values-mn/strings.xml
@@ -3356,6 +3356,10 @@
<string name="usb_use_MIDI_desc" msgid="8473936990076693175">"Энэ төхөөрөмжийг MIDI горимоор ашиглах"</string>
<string name="usb_use" msgid="3372728031108932425">"USB-ыг ашиглах"</string>
<string name="usb_use_also" msgid="557340935190819370">"Мөн USB-г дараахад ашиглах"</string>
+ <!-- no translation found for usb_default_label (4217189967858707974) -->
+ <skip />
+ <!-- no translation found for usb_default_info (8864535445796200695) -->
+ <skip />
<string name="usb_pref" msgid="1400617804525116158">"USB"</string>
<string name="usb_summary_charging_only" msgid="7544327009143659751">"Энэ төхөөрөмжийг цэнэглэж байна"</string>
<string name="usb_summary_power_only" msgid="1996391096369798526">"Холбосон төхөөрөмжийг цэнэглэж байна"</string>
diff --git a/res/values-mr/strings.xml b/res/values-mr/strings.xml
index dee8eed..ed68e42 100644
--- a/res/values-mr/strings.xml
+++ b/res/values-mr/strings.xml
@@ -3358,6 +3358,10 @@
<string name="usb_use_MIDI_desc" msgid="8473936990076693175">"या डिव्हाइसचा MIDI म्हणून वापर करा"</string>
<string name="usb_use" msgid="3372728031108932425">"यासाठी USB वापरा"</string>
<string name="usb_use_also" msgid="557340935190819370">"यासाठी देखील USB वापरा"</string>
+ <!-- no translation found for usb_default_label (4217189967858707974) -->
+ <skip />
+ <!-- no translation found for usb_default_info (8864535445796200695) -->
+ <skip />
<string name="usb_pref" msgid="1400617804525116158">"USB"</string>
<string name="usb_summary_charging_only" msgid="7544327009143659751">"हे डिव्हाइस चार्ज करणे"</string>
<string name="usb_summary_power_only" msgid="1996391096369798526">"कनेक्ट केलेले डिव्हाइस चार्ज करत आहे"</string>
@@ -3810,8 +3814,7 @@
<string name="storage_percent_full" msgid="6095012055875077036">"वापरलेली"</string>
<string name="clear_instant_app_data" msgid="2004222610585890909">"अॅप साफ करा"</string>
<string name="clear_instant_app_confirmation" msgid="7451671214898856857">"आपल्याला हे इन्स्टंट अॅप काढायचे आहे का?"</string>
- <!-- no translation found for launch_instant_app (391581144859010499) -->
- <skip />
+ <string name="launch_instant_app" msgid="391581144859010499">"उघडा"</string>
<string name="game_storage_settings" msgid="3410689937046696557">"गेम"</string>
<string name="audio_files_title" msgid="4777048870657911307">"ऑडिओ फायली"</string>
<string name="app_info_storage_title" msgid="5554719444625611987">"वापरलेली जागा"</string>
diff --git a/res/values-ms/strings.xml b/res/values-ms/strings.xml
index 5cd7d86..0d2e605 100644
--- a/res/values-ms/strings.xml
+++ b/res/values-ms/strings.xml
@@ -3358,6 +3358,10 @@
<string name="usb_use_MIDI_desc" msgid="8473936990076693175">"Gunakan peranti ini sebagai MIDI"</string>
<string name="usb_use" msgid="3372728031108932425">"Gunakan USB untuk"</string>
<string name="usb_use_also" msgid="557340935190819370">"Turut gunakan USB untuk"</string>
+ <!-- no translation found for usb_default_label (4217189967858707974) -->
+ <skip />
+ <!-- no translation found for usb_default_info (8864535445796200695) -->
+ <skip />
<string name="usb_pref" msgid="1400617804525116158">"USB"</string>
<string name="usb_summary_charging_only" msgid="7544327009143659751">"Mengecas peranti ini"</string>
<string name="usb_summary_power_only" msgid="1996391096369798526">"Mengecas peranti tersambung"</string>
@@ -3810,8 +3814,7 @@
<string name="storage_percent_full" msgid="6095012055875077036">"digunakan"</string>
<string name="clear_instant_app_data" msgid="2004222610585890909">"Kosongkan apl"</string>
<string name="clear_instant_app_confirmation" msgid="7451671214898856857">"Adakah anda mahu mengalih keluar apl segera ini?"</string>
- <!-- no translation found for launch_instant_app (391581144859010499) -->
- <skip />
+ <string name="launch_instant_app" msgid="391581144859010499">"Buka"</string>
<string name="game_storage_settings" msgid="3410689937046696557">"Permainan"</string>
<string name="audio_files_title" msgid="4777048870657911307">"Fail audio"</string>
<string name="app_info_storage_title" msgid="5554719444625611987">"Ruang yang digunakan"</string>
diff --git a/res/values-my/arrays.xml b/res/values-my/arrays.xml
index 9600d50..5cf6a2e 100644
--- a/res/values-my/arrays.xml
+++ b/res/values-my/arrays.xml
@@ -497,4 +497,7 @@
<item msgid="8745603368609022803">"အခမဲ့ မဟုတ်သော အသုံးပြုခြင်းအဖြစ် သတ်မှတ်ရန်"</item>
<item msgid="2266114985518865625">"အခမဲ့ အသုံးပြုခြင်းအဖြစ် သတ်မှတ်ရန်"</item>
</string-array>
+ <!-- no translation found for dark_ui_mode_entries:0 (146804192658443142) -->
+ <!-- no translation found for dark_ui_mode_entries:1 (6620560879508595181) -->
+ <!-- no translation found for dark_ui_mode_entries:2 (6385301106124765323) -->
</resources>
diff --git a/res/values-my/strings.xml b/res/values-my/strings.xml
index b346f2e..a1ab225 100644
--- a/res/values-my/strings.xml
+++ b/res/values-my/strings.xml
@@ -707,6 +707,10 @@
<string name="bluetooth_dock_settings_remember" msgid="5551459057010609115">"ဆက်တင်များအားမှတ်မိစေရန်"</string>
<string name="bluetooth_max_connected_audio_devices_string" msgid="6752690395207847881">"ဘလူးတုသ်စက်ပစ္စည်း အများဆုံးချိတ်ဆက်ထားနိုင်သည့် အရေအတွက်"</string>
<string name="bluetooth_max_connected_audio_devices_dialog_title" msgid="5936561749790095473">"ချိတ်ဆက်ထားနိုင်သည့် ဘလူးတုသ် ချိတ်ဆက်နိုင်သည့် အများဆုံးအရေအတွက်ကို ရွေးပါ"</string>
+ <!-- no translation found for bluetooth_enable_avdtp_delay_reports (5101903170688399944) -->
+ <skip />
+ <!-- no translation found for bluetooth_enable_avdtp_delay_reports_summary (7052797876020616399) -->
+ <skip />
<string name="wifi_display_settings_title" msgid="8740852850033480136">"ကာစ်"</string>
<string name="wifi_display_enable_menu_item" msgid="4883036464138167674">"ကြိုးမဲ့ ပြသမှုကို ဖွင့်ရန်"</string>
<string name="wifi_display_no_devices_found" msgid="1382012407154143453">"အနီးတဝိုက်တွင် စက်ပစ္စည်းများ ရှာမတွေ့ပါ။"</string>
@@ -1880,8 +1884,10 @@
<string name="accessibility_service_master_switch_title" msgid="6835441300276358239">"ဝန်ဆောင်မှုကို သုံးရန်"</string>
<string name="accessibility_daltonizer_master_switch_title" msgid="8655284637968823154">"အရောင်ပြင်ဆင်ခြင်းကို သုံးရန်"</string>
<string name="accessibility_caption_master_switch_title" msgid="4010227386676077826">"စာတန်းကို သုံးရန်"</string>
- <string name="accessibility_summary_state_enabled" msgid="8359913912320966304">"ဖွင့်ပါ"</string>
- <string name="accessibility_summary_state_disabled" msgid="2241315620132005595">"ပိတ်ထားသည်"</string>
+ <!-- no translation found for accessibility_summary_state_enabled (7914278500885887763) -->
+ <skip />
+ <!-- no translation found for accessibility_summary_state_disabled (2984230257590246745) -->
+ <skip />
<string name="enable_quick_setting" msgid="2366999897816894536">"အမြန်ဆက်တင်များတွင်ပြပါ"</string>
<string name="daltonizer_type" msgid="1124178250809091080">"ပြင်ဆင်ရန်နည်းလမ်း"</string>
<plurals name="accessibilty_autoclick_preference_subtitle_extremely_short_delay" formatted="false" msgid="7340347830562315800">
@@ -2888,6 +2894,8 @@
<string name="keywords_model_and_hardware" msgid="1459248377212829642">"အမှတ်စဉ်၊ ဟာ့ဒ်ဝဲ ဗားရှင်း"</string>
<string name="keywords_android_version" msgid="9069747153590902819">"android လုံခြုံရေး ပက်ချ် အဆင့်၊ baseband ဗားရှင်း၊ kernel ဗားရှင်း"</string>
<string name="keywords_ambient_display_screen" msgid="5874969496073249362">"ဝန်းကျင်ကို ပြကွက်၊ လော့ခ်ချထားချိန် မျက်နှာပြင်"</string>
+ <!-- no translation found for keywords_fingerprint_settings (239222512315619538) -->
+ <skip />
<string name="setup_wifi_nfc_tag" msgid="9028353016222911016">"ကြိုးမဲ့ NFC တဲဂ်ကို စဖွင့်သတ်မှတ်ရန်"</string>
<string name="write_tag" msgid="8571858602896222537">"ရေးရန်"</string>
<string name="status_awaiting_tap" msgid="2130145523773160617">"ရေးရန် တဲဂ် တစ်ခုကို ပုပ်ပါ..."</string>
@@ -3170,7 +3178,8 @@
<string name="zen_mode_summary_alarms_only_by_time" msgid="7465525754879341907">"<xliff:g id="FORMATTEDTIME">%1$s</xliff:g> အထိနိုးစက်သာလျှင် သို့ပြောင်းမည်"</string>
<string name="zen_mode_summary_always" msgid="6172985102689237703">"အမြဲတမ်း ကြားဖြတ်ရန်သို့ ပြောင်းမည်"</string>
<string name="zen_mode_screen_on" msgid="8774571998575673502">"မျက်နှာပြင် ဖွင့်ထားချိန်"</string>
- <string name="zen_mode_screen_on_summary" msgid="5385338884695802115">"\"မနှောင့်ယှက်ရ\" က ပိတ်ထားသော အကြောင်းကြားချက်များကို မျက်နှာပြင်တွင်ပေါ်လာခွင့်ပေးပါ"</string>
+ <!-- no translation found for zen_mode_screen_on_summary (2208664848367443505) -->
+ <skip />
<string name="zen_mode_screen_off" msgid="3144446765110327937">"မျက်နှာပြင် ပိတ်ထားချိန်"</string>
<string name="zen_mode_screen_off_summary" msgid="7430034620565812258">"\"မနှောင့်ယှက်ရ\" က ပိတ်ထားသော အကြောင်းကြားချက်များကို မျက်နှာပြင်ကိုဖွင့်၍ မီးမှိတ်တုတ်ပြခွင့်ပေးပါ"</string>
<string name="zen_mode_screen_off_summary_no_led" msgid="2826121465026642017">"\"မနှောင့်ယှက်ရ\" က ပိတ်ထားသော အကြောင်းကြားချက်များကို မျက်နှာပြင်ကိုဖွင့်ခွင့်ပေးပါ"</string>
@@ -3358,6 +3367,8 @@
<string name="usb_use_MIDI_desc" msgid="8473936990076693175">"ဤစက်ပစ္စည်းကို MIDI အဖြစ်အသုံးပြုပါ"</string>
<string name="usb_use" msgid="3372728031108932425">"USB သုံးပါ"</string>
<string name="usb_use_also" msgid="557340935190819370">"USB ကို အောက်ပါအတွက်လည်း သုံးသည်"</string>
+ <string name="usb_default_label" msgid="4217189967858707974">"မူရင်း USB စီစဉ်တ်မှတ်မှု"</string>
+ <string name="usb_default_info" msgid="8864535445796200695">"အခြားစက်ပစ္စည်းတစ်ခုကို ချိတ်ဆက်ထားပြီး သင့်ဖုန်းကို လော့ခ်ဖွင့်ထားသည့်အခါ ဤဆက်တင်များ အကျိုးသက်ရောက်မှု ရှိပါမည်။ ယုံကြည်စိတ်ချရသည့် စက်ပစ္စည်းများသို့သာ ချိတ်ဆက်ပါ။"</string>
<string name="usb_pref" msgid="1400617804525116158">"USB"</string>
<string name="usb_summary_charging_only" msgid="7544327009143659751">"ဤစက်ပစ္စည်းကို အားသွင်းနေသည်"</string>
<string name="usb_summary_power_only" msgid="1996391096369798526">"ချိတ်ဆက်ထားသည့် စက်ကို အားသွင်းခြင်း"</string>
@@ -3478,8 +3489,10 @@
<string name="memory_summary" msgid="8080825904671961872">"Avg သည်ယာယီမှတ်ဉာဏ် <xliff:g id="TOTAL_MEMORY">%2$s</xliff:g> ၏ <xliff:g id="USED_MEMORY">%1$s</xliff:g> ကိုအသုံးပြုထားသည်"</string>
<string name="users_summary" msgid="1674864467098487328">"<xliff:g id="USER_NAME">%1$s</xliff:g> အဖြစ် လက်မှတ်ထိုးဝင်ထားသည်"</string>
<string name="payment_summary" msgid="3472482669588561110">"<xliff:g id="APP_NAME">%1$s</xliff:g> သည်မူရင်းဖြစ်သည်"</string>
- <string name="location_on_summary" msgid="4083334422422067511">"ဖွင့်ပါ"</string>
- <string name="location_off_summary" msgid="6474350053215707957">"ပိတ်ရန်"</string>
+ <!-- no translation found for location_on_summary (3637699010986988970) -->
+ <skip />
+ <!-- no translation found for location_off_summary (7217264690673949107) -->
+ <skip />
<string name="backup_disabled" msgid="485189128759595412">"အရံကူးယူခြင်း ပိတ်ထားသည်"</string>
<string name="android_version_summary" msgid="2935995161657697278">"Android <xliff:g id="VERSION">%1$s</xliff:g> သို့ အပ်ဒိတ်လုပ်ထားသည်"</string>
<string name="android_version_pending_update_summary" msgid="487831391976523090">"အပ်ဒိတ် ရနိုင်သည်"</string>
@@ -3653,9 +3666,13 @@
<string name="bluetooth_connected_summary" msgid="7672528674593152862">"<xliff:g id="ID_1">%1$s</xliff:g> နှင့် ချိတ်ဆက်ထားပါသည်"</string>
<string name="bluetooth_connected_multiple_devices_summary" msgid="9173661896296663932">"စက်ပစ္စည်းအများအပြားနှင့် ချိတ်ဆက်ထားပါသည်"</string>
<string name="demo_mode" msgid="2798762752209330277">"စနစ် UI သရုပ်ပြမုဒ်"</string>
+ <!-- no translation found for dark_ui_mode (2112241426441807273) -->
+ <skip />
+ <!-- no translation found for dark_ui_mode_title (975299966259850992) -->
+ <skip />
<string name="quick_settings_developer_tiles" msgid="5947788063262762448">"ဆော့ဖ်ဝဲအင်ဂျင်နီယာ အကွက်များကို အမြန်သတ်မှတ်ခြင်း"</string>
- <string name="window_trace_quick_settings_title" msgid="3839917000546526898">"ဝင်းဒိုး မျဉ်းဆွဲခြင်း"</string>
- <string name="layer_trace_quick_settings_title" msgid="876797401275734018">"မျက်နှာပြင် မျဉ်းဆွဲခြင်း"</string>
+ <!-- no translation found for winscope_trace_quick_settings_title (1294290008255732032) -->
+ <skip />
<string name="support_country_format" msgid="4502523713489559595">"<xliff:g id="COUNTRY">%1$s</xliff:g> - <xliff:g id="LANGUAGE">%2$s</xliff:g>"</string>
<string name="managed_profile_settings_title" msgid="2729481936758125054">"အလုပ်ပရိုဖိုင်ဆက်တင်များ"</string>
<string name="managed_profile_contact_search_title" msgid="6034734926815544221">"အဆက်အသွယ်ကို ရှာဖွေပါ"</string>
diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml
index 4ee8a88..24f6fe4 100644
--- a/res/values-nb/strings.xml
+++ b/res/values-nb/strings.xml
@@ -3358,6 +3358,10 @@
<string name="usb_use_MIDI_desc" msgid="8473936990076693175">"Bruk denne enheten som MIDI"</string>
<string name="usb_use" msgid="3372728031108932425">"Bruk USB for"</string>
<string name="usb_use_also" msgid="557340935190819370">"Bruk i tillegg USB til"</string>
+ <!-- no translation found for usb_default_label (4217189967858707974) -->
+ <skip />
+ <!-- no translation found for usb_default_info (8864535445796200695) -->
+ <skip />
<string name="usb_pref" msgid="1400617804525116158">"USB"</string>
<string name="usb_summary_charging_only" msgid="7544327009143659751">"Lading av denne enheten"</string>
<string name="usb_summary_power_only" msgid="1996391096369798526">"Lading av den tilkoblede enheten"</string>
diff --git a/res/values-ne/strings.xml b/res/values-ne/strings.xml
index 9f8da0a..83f9376 100644
--- a/res/values-ne/strings.xml
+++ b/res/values-ne/strings.xml
@@ -3358,6 +3358,10 @@
<string name="usb_use_MIDI_desc" msgid="8473936990076693175">"यस यन्त्रलाई MIDI को रूपमा प्रयोग गर्नुहोस्"</string>
<string name="usb_use" msgid="3372728031108932425">"का लागि USB प्रयोग गर्नुहोस्"</string>
<string name="usb_use_also" msgid="557340935190819370">"USB लाई निम्न कार्यका लागि पनि प्रयोग गर्नुहोस्"</string>
+ <!-- no translation found for usb_default_label (4217189967858707974) -->
+ <skip />
+ <!-- no translation found for usb_default_info (8864535445796200695) -->
+ <skip />
<string name="usb_pref" msgid="1400617804525116158">"USB"</string>
<string name="usb_summary_charging_only" msgid="7544327009143659751">"यो यन्त्रलाई चार्ज गर्दै"</string>
<string name="usb_summary_power_only" msgid="1996391096369798526">"जडान गरिएको यन्त्र चार्ज गर्दै"</string>
@@ -3812,8 +3816,7 @@
<string name="storage_percent_full" msgid="6095012055875077036">"प्रयोग भयो"</string>
<string name="clear_instant_app_data" msgid="2004222610585890909">"अनुप्रयोगको डेटा खाली गर्नुहोस्"</string>
<string name="clear_instant_app_confirmation" msgid="7451671214898856857">"तपाईं यो तात्कालिक अनुप्रयोगलाई हटाउन चाहनुहुन्छ?"</string>
- <!-- no translation found for launch_instant_app (391581144859010499) -->
- <skip />
+ <string name="launch_instant_app" msgid="391581144859010499">"खोल्नुहोस्"</string>
<string name="game_storage_settings" msgid="3410689937046696557">"खेलहरू"</string>
<string name="audio_files_title" msgid="4777048870657911307">"अडियो फाइलहरू"</string>
<string name="app_info_storage_title" msgid="5554719444625611987">"प्रयोग गरेको ठाउँ"</string>
diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml
index 8c2c681..9b270ac 100644
--- a/res/values-nl/strings.xml
+++ b/res/values-nl/strings.xml
@@ -3358,6 +3358,10 @@
<string name="usb_use_MIDI_desc" msgid="8473936990076693175">"Dit apparaat gebruiken als MIDI"</string>
<string name="usb_use" msgid="3372728031108932425">"USB gebruiken voor"</string>
<string name="usb_use_also" msgid="557340935190819370">"USB ook gebruiken voor"</string>
+ <!-- no translation found for usb_default_label (4217189967858707974) -->
+ <skip />
+ <!-- no translation found for usb_default_info (8864535445796200695) -->
+ <skip />
<string name="usb_pref" msgid="1400617804525116158">"USB"</string>
<string name="usb_summary_charging_only" msgid="7544327009143659751">"Dit apparaat opladen"</string>
<string name="usb_summary_power_only" msgid="1996391096369798526">"Verbonden apparaat wordt opgeladen"</string>
@@ -3717,7 +3721,7 @@
<string name="web_action_enable_title" msgid="4051513950976670853">"Instant-apps"</string>
<string name="web_action_enable_summary" msgid="3108127559723396382">"Links openen in apps, zelfs als deze niet zijn geïnstalleerd"</string>
<string name="web_action_section_title" msgid="7364647086538399136">"Instant-apps"</string>
- <string name="instant_apps_settings" msgid="8827777916518348213">"Voorkeuren voor instant-apps"</string>
+ <string name="instant_apps_settings" msgid="8827777916518348213">"Voorkeuren Instant-apps"</string>
<string name="domain_url_section_title" msgid="7046835219056428883">"Geïnstalleerde apps"</string>
<string name="automatic_storage_manager_activation_warning" msgid="6353100011690933254">"Je opslag wordt nu beheerd door de opslagbeheerder"</string>
<string name="account_for_section_header" msgid="5356566418548737121">"Accounts voor <xliff:g id="USER_NAME">%1$s</xliff:g>"</string>
diff --git a/res/values-or-nokeys/strings.xml b/res/values-or-nokeys/strings.xml
new file mode 100644
index 0000000..507e47d
--- /dev/null
+++ b/res/values-or-nokeys/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2007 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="applications_settings_summary" msgid="6616938758022986257">"ଆପ୍ଲିକେଶନ୍ଗୁଡ଼ିକର ପରିଚାଳନା କରନ୍ତୁ"</string>
+</resources>
diff --git a/res/values-or/arrays.xml b/res/values-or/arrays.xml
new file mode 100644
index 0000000..4b99711
--- /dev/null
+++ b/res/values-or/arrays.xml
@@ -0,0 +1,500 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/*
+**
+** Copyright 2007 The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string-array name="timezone_filters">
+ <item msgid="5296756001147094692">"ଆମେରିକା"</item>
+ <item msgid="3005562397632768392">"ୟୁରୋପ"</item>
+ <item msgid="5696915123093701218">"ଆଫ୍ରିକା"</item>
+ <item msgid="4439789052790868249">"ଏସିଆ"</item>
+ <item msgid="956915953069815961">"ଅଷ୍ଟ୍ରେଲିଆ"</item>
+ <item msgid="5345178126174698955">"ପେସିଫିକ୍"</item>
+ <item msgid="8392017019801393511">"ସମସ୍ତ"</item>
+ </string-array>
+ <string-array name="screen_timeout_entries">
+ <item msgid="3342301044271143016">"୧୫ ସେକେଣ୍ଡ"</item>
+ <item msgid="8881760709354815449">"୩୦ ସେକେଣ୍ଡ"</item>
+ <item msgid="7589406073232279088">"1 ମିନିଟ୍"</item>
+ <item msgid="7001195990902244174">"2 ମିନିଟ୍"</item>
+ <item msgid="7489864775127957179">"5 ମିନିଟ୍"</item>
+ <item msgid="2314124409517439288">"10 ମିନିଟ୍"</item>
+ <item msgid="6864027152847611413">"30 ମିନିଟ୍"</item>
+ </string-array>
+ <string-array name="dream_timeout_entries">
+ <item msgid="3149294732238283185">"ଆଦୌ ନୁହେଁ"</item>
+ <item msgid="2194151041885903260">"୧୫ ସେକେଣ୍ଡ"</item>
+ <item msgid="5892295237131074341">"୩୦ ସେକେଣ୍ଡ"</item>
+ <item msgid="3538441365970038213">"1 ମିନିଟ୍"</item>
+ <item msgid="412343871668955639">"୨ ମିନିଟ୍"</item>
+ <item msgid="5076853889688991690">"ମିନିଟ୍"</item>
+ <item msgid="1903860996174927898">"10 ମିନିଟ୍"</item>
+ <item msgid="6415509612413178727">"୩୦ ମିନିଟ୍"</item>
+ </string-array>
+ <string-array name="lock_after_timeout_entries">
+ <item msgid="8929270399652145290">"ତୁରନ୍ତ"</item>
+ <item msgid="6736512735606834431">"୫ ସେକେଣ୍ଡ"</item>
+ <item msgid="8044619388267891375">"ସେକେଣ୍ଡ"</item>
+ <item msgid="1822002388249545488">"30 ସେକେଣ୍ଡ"</item>
+ <item msgid="8538071621211916519">"୧ ମିନିଟ୍"</item>
+ <item msgid="5663439580228932882">"2 ମିନିଟ୍"</item>
+ <item msgid="49888496216106852">"5 ମିନିଟ୍"</item>
+ <item msgid="9002737361305019353">"10 ମିନିଟ୍"</item>
+ <item msgid="4322676235684793329">"୩୦ ମିନିଟ୍"</item>
+ </string-array>
+ <string-array name="entries_font_size">
+ <item msgid="8166647333858618801">"ଛୋଟ"</item>
+ <item msgid="6986443533756848935">"ପୂର୍ବ-ନିର୍ଦ୍ଧାରିତ"</item>
+ <item msgid="38373998008112077">"ବହୁତ ବଡ଼"</item>
+ <item msgid="7635254317531872272">"ବୃହତ୍ତମ"</item>
+ </string-array>
+ <string-array name="wifi_status">
+ <item msgid="1922181315419294640"></item>
+ <item msgid="8934131797783724664">"ସ୍କାନ୍ କରୁଛି…"</item>
+ <item msgid="8513729475867537913">"ସଂଯୋଗ କରୁଛି…"</item>
+ <item msgid="515055375277271756">"ପ୍ରାମାଣିକୀକରଣ କରାଯାଉଛି…"</item>
+ <item msgid="1943354004029184381">"IP ଠିକଣା ପ୍ରାପ୍ତ କରୁଛି…"</item>
+ <item msgid="4221763391123233270">"ସଂଯୋଜିତ"</item>
+ <item msgid="624838831631122137">"ନିଲମ୍ବିତ"</item>
+ <item msgid="7979680559596111948">"ବିଚ୍ଛିନ୍ନ ହେଉଛି…"</item>
+ <item msgid="1634960474403853625">"ବିଚ୍ଛିନ୍ନ"</item>
+ <item msgid="746097431216080650">"ଅସଫଳ"</item>
+ <item msgid="6367044185730295334">"ଅବରୋଧିତ"</item>
+ <item msgid="503942654197908005">"ସାମୟିକ ଭାବେ ଖରାପ ସଂଯୋଜନାକୁ ଏଡାଉଛି"</item>
+ </string-array>
+ <string-array name="wifi_status_with_ssid">
+ <item msgid="7714855332363650812"></item>
+ <item msgid="8878186979715711006">"ସ୍କାନ୍ କରୁଛି…"</item>
+ <item msgid="355508996603873860">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g>କୁ ସଂଯୋଗ କରାଯାଉଛି…"</item>
+ <item msgid="554971459996405634">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g> ସହ ପ୍ରମାଣିତ ହେଉଛି…"</item>
+ <item msgid="7928343808033020343">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g>ରୁ IP ଠିକଣା ହାସଲ କରୁଛି…"</item>
+ <item msgid="8937994881315223448">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g> ସହ ସଂଯୁକ୍ତ"</item>
+ <item msgid="1330262655415760617">"କଟିଯାଇଛି"</item>
+ <item msgid="7698638434317271902">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g>ରୁ ବିଚ୍ଛିନ୍ନ ହେଉଛି…"</item>
+ <item msgid="197508606402264311">"ସଂଯୁକ୍ତ ନାହିଁ"</item>
+ <item msgid="8578370891960825148">"ଅସଫଳ"</item>
+ <item msgid="5660739516542454527">"ଅବରୋଧିତ"</item>
+ <item msgid="1805837518286731242">"ଦୁର୍ବଳ ସଂଯୋଗକୂ ସାମୟିକ ଭାବେ ଏଡ଼ାଉଛି"</item>
+ </string-array>
+ <!-- no translation found for wifi_security:0 (8491993170197127709) -->
+ <!-- no translation found for wifi_security:1 (6524315248437318854) -->
+ <!-- no translation found for wifi_security:2 (1532568756571457140) -->
+ <!-- no translation found for wifi_security:3 (3620707702811709779) -->
+ <!-- no translation found for wifi_security_no_eap:0 (2084555984818107151) -->
+ <!-- no translation found for wifi_security_no_eap:1 (397579322683471524) -->
+ <!-- no translation found for wifi_security_no_eap:2 (1968820975358150484) -->
+ <string-array name="wifi_eap_method">
+ <item msgid="1160193392455075561">"PEAP"</item>
+ <item msgid="7981731051382306293">"TLS"</item>
+ <item msgid="2892994535305020162">"TTLS"</item>
+ <item msgid="435667726254379514">"PWD"</item>
+ <item msgid="8549485714107012129">"ସିମ୍"</item>
+ <item msgid="1023893786681286517">"AKA"</item>
+ <item msgid="3030483188676375009">"AKA\'"</item>
+ </string-array>
+ <string-array name="eap_method_without_sim_auth">
+ <item msgid="4047867891913819797">"PEAP"</item>
+ <item msgid="641030570679578504">"TLS"</item>
+ <item msgid="3079489731769553856">"TTLS"</item>
+ <item msgid="35269224158638258">"PWD"</item>
+ </string-array>
+ <!-- no translation found for wifi_ap_band_config_full:0 (1085243288162893079) -->
+ <!-- no translation found for wifi_ap_band_config_full:1 (5531376834915607202) -->
+ <!-- no translation found for wifi_ap_band_config_full:2 (3580217704310339410) -->
+ <!-- no translation found for wifi_ap_band_config_2G_only:0 (7006771583217001015) -->
+ <!-- no translation found for wifi_ap_band_config_2G_only:1 (8904289885593822837) -->
+ <string-array name="wifi_p2p_wps_setup">
+ <item msgid="5085064298144493867">"ପୁଶ୍ ବଟନ୍"</item>
+ <item msgid="1624323946324499595">"ପୀଅର୍ ଡିଭାଇସ୍ରୁ PIN"</item>
+ <item msgid="5366790421523328066">"ଏହି ଡିଭାଇସ୍ରୁ PIN"</item>
+ </string-array>
+ <string-array name="wifi_p2p_status">
+ <item msgid="1701505390737218306">"ସଂଯୁକ୍ତ"</item>
+ <item msgid="3189211552661432651">"ଆମନ୍ତ୍ରିତ"</item>
+ <item msgid="3206450250360237549">"ବିଫଳ"</item>
+ <item msgid="7785896708926971207">"ଉପଲବ୍ଧ"</item>
+ <item msgid="2330782789550628803">"ପରିସୀମା ବାହାରେ"</item>
+ </string-array>
+ <string-array name="bluetooth_visibility_timeout_entries">
+ <item msgid="8151962652413645395">"2 ମିନିଟ୍"</item>
+ <item msgid="8675215713017289017">"୫ ମିନିଟ୍"</item>
+ <item msgid="477015974247590543">"୧ ଘଣ୍ଟା"</item>
+ <item msgid="5198271470953124739">"କେବେବି ବନ୍ଦ କରନାହିଁ"</item>
+ </string-array>
+ <string-array name="bluetooth_max_connected_audio_devices">
+ <item msgid="60897909354162249">"୧ (ପୂର୍ବ-ନିର୍ଦ୍ଧାରିତ)"</item>
+ <item msgid="7584056855393485416">"୨"</item>
+ <item msgid="844570832050176311">"୩"</item>
+ <item msgid="1896812737336024220">"4"</item>
+ <item msgid="2664420770707984266">"5"</item>
+ </string-array>
+ <string-array name="bluetooth_max_connected_audio_devices_values">
+ <item msgid="1992185266918208754">"1"</item>
+ <item msgid="2731443086402670729">"୨"</item>
+ <item msgid="74627748729027880">"3"</item>
+ <item msgid="2654447223197666662">"4"</item>
+ <item msgid="7026157954713482328">"5"</item>
+ </string-array>
+ <string-array name="wifi_signal">
+ <item msgid="2245412278046491293">"ଖରାପ"</item>
+ <item msgid="2042505933058940139">"ଖରାପ"</item>
+ <item msgid="1344546617235886412">"ଠିକଠାକ"</item>
+ <item msgid="6019931571712517411">"ଭଲ"</item>
+ <item msgid="8986346415847956850">"ସର୍ବୋତ୍ତମ"</item>
+ </string-array>
+ <string-array name="data_usage_data_range">
+ <item msgid="5013973108901348144">"ଗତ ୩୦ ଦିନ"</item>
+ <item msgid="6600989128423965319">"ବ୍ୟବହାରର ଚକ୍ର ସେଟ୍ କରନ୍ତୁ…"</item>
+ </string-array>
+ <string-array name="usage_stats_display_order_types">
+ <item msgid="2100172576767439288">"ବ୍ୟବହାରର ସମୟ"</item>
+ <item msgid="4796160515314745154">"ଗତଥର ବ୍ୟବହାର କରାଯାଇଥିବା"</item>
+ <item msgid="2502754479975776899">"ଆପ୍ର ନାମ"</item>
+ </string-array>
+ <string-array name="wifi_eap_entries">
+ <item msgid="8615575908717909498">"PEAP"</item>
+ <item msgid="8667872640594311615">"TLS"</item>
+ <item msgid="7182812872984827322">"TTLS"</item>
+ <item msgid="2318274046749286642">"PWD"</item>
+ </string-array>
+ <string-array name="wifi_peap_phase2_entries">
+ <item msgid="2577747762745812488">"କିଛି ନାହିଁ"</item>
+ <item msgid="937786527870979616">"MSCHAPV2"</item>
+ <item msgid="5302613883318643629">"GTC"</item>
+ </string-array>
+ <string-array name="wifi_peap_phase2_entries_with_sim_auth">
+ <item msgid="5760470455461128892">"କିଛି ନୁହେଁ"</item>
+ <item msgid="7480272092408291086">"MSCHAPV2"</item>
+ <item msgid="5881794903338319324">"GTC"</item>
+ <item msgid="5610607665198791980">"SIM"</item>
+ <item msgid="2860798636241124128">"AKA"</item>
+ <item msgid="8926455723452645935">"AKA\'"</item>
+ </string-array>
+ <string-array name="wifi_phase2_entries">
+ <item msgid="1818786254010764570">"କିଛି ନୁହେଁ"</item>
+ <item msgid="6189918678874123056">"PAP"</item>
+ <item msgid="1524112260493662517">"MSCHAP"</item>
+ <item msgid="5923246669412752932">"MSCHAPV2"</item>
+ <item msgid="8651992560135239389">"GTC"</item>
+ </string-array>
+ <string-array name="wifi_ip_settings">
+ <item msgid="3906714200993111074">"DHCP"</item>
+ <item msgid="628395202971532382">"ଷ୍ଟାଟିକ୍"</item>
+ </string-array>
+ <string-array name="wifi_proxy_settings">
+ <item msgid="4473276491748503377">"କିଛି ନାହିଁ"</item>
+ <item msgid="8673874894887358090">"ମାନୁଆଲ୍"</item>
+ <item msgid="168893341855953140">"ପ୍ରକ୍ସୀ ଅଟୋ-କନ୍ପିଗରେଶନ୍"</item>
+ </string-array>
+ <string-array name="apn_auth_entries">
+ <item msgid="3856896061242872146">"କିଛି ନୁହେଁ"</item>
+ <item msgid="5756844015743664882">"PAP"</item>
+ <item msgid="535934025797984365">"CHAP"</item>
+ <item msgid="8383098660619805783">"PAP କିମ୍ୱା CHAP"</item>
+ </string-array>
+ <string-array name="apn_protocol_entries">
+ <item msgid="4852355456199302715">"IPv4"</item>
+ <item msgid="4394161344888484571">"IPv6"</item>
+ <item msgid="8084938354605535381">"IPv4/IPv6"</item>
+ </string-array>
+ <string-array name="bearer_entries">
+ <item msgid="1697455674244601285">"ଅନିର୍ଦ୍ଦିଷ୍ଟ"</item>
+ <item msgid="1317061551798123908">"LTE"</item>
+ <item msgid="5005435684511894770">"HSPAP"</item>
+ <item msgid="7700603056475539235">"HSPA"</item>
+ <item msgid="245973007602397887">"HSUPA"</item>
+ <item msgid="6291566767651194016">"HSDPA"</item>
+ <item msgid="2005841400859926251">"UMTS"</item>
+ <item msgid="3757385691174882861">"EDGE"</item>
+ <item msgid="2979115073474306864">"GPRS"</item>
+ <item msgid="2271750502778879106">"eHRPD"</item>
+ <item msgid="4173379084783381337">"EVDO_B"</item>
+ <item msgid="2033682802005776093">"EVDO_A"</item>
+ <item msgid="5753917125831466719">"EVDO_0"</item>
+ <item msgid="4713807936577071142">"1xRTT"</item>
+ <item msgid="1142355797022021906">"IS95B"</item>
+ <item msgid="7471182818083460781">"IS95A"</item>
+ </string-array>
+ <string-array name="mvno_type_entries">
+ <item msgid="4367119357633573465">"କିଛି ନୁହେଁ"</item>
+ <item msgid="6062567900587138000">"SPN"</item>
+ <item msgid="2454085083342423481">"IMSI"</item>
+ <item msgid="2681427309183221543">"GID"</item>
+ </string-array>
+ <string-array name="app_install_location_entries">
+ <item msgid="8151497958991952759">"ଇଣ୍ଟର୍ନଲ୍ ଡିଭାଇସ୍ ଷ୍ଟୋରେଜ୍"</item>
+ <item msgid="3738430123799803530">"ଅପସାରଣୀୟ SD କାର୍ଡ"</item>
+ <item msgid="4498124044785815005">"ସିଷ୍ଟମକୁ ନିଷ୍ପତ୍ତି ନେବାକୁ ଦିଅନ୍ତୁ"</item>
+ </string-array>
+ <string-array name="app_ops_categories">
+ <item msgid="6358963769537892925">"ଲୋକେଶନ୍"</item>
+ <item msgid="255608127647030286">"ବ୍ୟକ୍ତିଗତ"</item>
+ <item msgid="4588829735729884491">"ମେସେଜିଙ୍ଗ"</item>
+ <item msgid="886742181977884584">"ମିଡିଆ"</item>
+ <item msgid="7924928667052300589">"ଡିଭାଇସ୍"</item>
+ </string-array>
+ <string-array name="app_ops_summaries">
+ <item msgid="4979188868761515915">"ଆନୁମାନିକ ଲୋକେଶନ୍"</item>
+ <item msgid="5789673140227507995">"ଫାଇନ୍ ଲୋକେଶନ୍"</item>
+ <item msgid="1061584358377390581">"GPS"</item>
+ <item msgid="5387405117297558954">"କମ୍ପନ"</item>
+ <item msgid="3434165993711230924">"ଯୋଗାଯୋଗଗୁଡ଼ିକୁ ପଢ଼ନ୍ତୁ"</item>
+ <item msgid="616161687718081936">"ଯୋଗାଯୋଗଗୁଡିକ ପରିବର୍ତ୍ତନ କରନ୍ତୁ"</item>
+ <item msgid="7638002295329050091">"କଲ୍ ଲଗ୍ ପଢ଼ନ୍ତୁ"</item>
+ <item msgid="6546959730920410907">"କଲ୍ ଲଗ୍ ସଂଶୋଧନ କରନ୍ତୁ"</item>
+ <item msgid="446877710771379667">"କ୍ୟାଲେଣ୍ଡର ପଢ଼ନ୍ତୁ"</item>
+ <item msgid="7674458294386319722">"କ୍ୟାଲେଣ୍ଡର ସଂଶୋଧନ"</item>
+ <item msgid="8281201165558093009">"ୱାଇ-ଫାଇ ସ୍କାନ୍"</item>
+ <item msgid="8694611243479480497">"ବିଜ୍ଞପ୍ତି"</item>
+ <item msgid="7776439107987345446">"ସେଲ୍ ସ୍କାନ୍"</item>
+ <item msgid="514615766544675057">"ଫୋନ୍ ନମ୍ବର୍ କଲ୍ କରନ୍ତୁ"</item>
+ <item msgid="8181415497109310680">"SMS ପଢ଼ନ୍ତୁ"</item>
+ <item msgid="6816551144382117307">"SMS ଲେଖନ୍ତୁ"</item>
+ <item msgid="4600463921908905030">"SMS ଗ୍ରହଣ"</item>
+ <item msgid="5958926493289432745">"ଜରୁରୀକାଳୀନ SMS ପାଆନ୍ତୁ"</item>
+ <item msgid="4945269495221089540">"MMS ପାଆନ୍ତୁ"</item>
+ <item msgid="5570472453573929087">"ୱାପ୍ ପୁଶ୍ ପ୍ରାପ୍ତ କରନ୍ତୁ"</item>
+ <item msgid="7125408150230860501">"SMS ପଠାନ୍ତୁ"</item>
+ <item msgid="7080337936612188061">"ICC SMS ପଢ଼ନ୍ତୁ"</item>
+ <item msgid="587124103118495063">"ICC SMS ଲେଖନ୍ତୁ"</item>
+ <item msgid="2320577158869025503">"ସେଟିଙ୍ଗରେ ସଂଶୋଧନ କରନ୍ତୁ"</item>
+ <item msgid="1545733463471924009">"ସ୍କ୍ରୀନ୍ର ଉପର ଭାଗରେ ଆଙ୍କନ୍ତୁ"</item>
+ <item msgid="3609046903962454582">"ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକୁ ଆକ୍ସେସ୍ କରନ୍ତୁ"</item>
+ <item msgid="4671646036128214513">"କ୍ୟାମେରା"</item>
+ <item msgid="1097324338692486211">"ଅଡିଓ ରେକର୍ଡ କରନ୍ତୁ"</item>
+ <item msgid="5031552983987798163">"ଅଡିଓ ବଜାନ୍ତୁ"</item>
+ <item msgid="8374996688066472414">"କ୍ଲିପବୋର୍ଡ ପଢନ୍ତୁ"</item>
+ <item msgid="3045529469061083747">"କ୍ଲିପ୍ବୋର୍ଡ ବଦଳାନ୍ତୁ"</item>
+ <item msgid="5124443975763747838">"ମିଡିଆର ବଟନ୍"</item>
+ <item msgid="4547883971364273343">"ଅଡିଓ ଫୋକସ୍"</item>
+ <item msgid="2603878814882344450">"ମାଷ୍ଟର୍ ଭଲ୍ୟୁମ୍"</item>
+ <item msgid="7136963238377062018">"ଭଏସ ଭଲ୍ୟୁମ"</item>
+ <item msgid="4270236897655923007">"ରିଙ୍ଗ ଭଲ୍ୟୁମ୍"</item>
+ <item msgid="6325739889222559394">"ମିଡିଆ ଭଲ୍ୟୁମ୍"</item>
+ <item msgid="5762123934816216821">"ଆଲାର୍ମର ଭଲ୍ୟୁମ୍"</item>
+ <item msgid="785049718065337473">"ବିଜ୍ଞପ୍ତି ଭଲ୍ୟୁମ୍"</item>
+ <item msgid="6700305533746877052">"ବ୍ଲୁଟୂଥ୍ ଭଲ୍ୟୁମ୍"</item>
+ <item msgid="2029227495214047094">"ଜାଗ୍ରତ ରଖନ୍ତୁ"</item>
+ <item msgid="26109888160231211">"ଜାଗା ଖୋଜନ୍ତୁ"</item>
+ <item msgid="5753382310468855812">"ମଜବୁତ ସିଗ୍ନାଲ୍ ଥିବା ଜାଗା ଖୋଜନ୍ତୁ"</item>
+ <item msgid="3356591542543137332">"ଉପଯୋଗର ହିସାବ ପାଆନ୍ତୁ"</item>
+ <item msgid="3073734345226842233">"ମାଇକ୍ରୋଫୋନ୍ର ସାଉଣ୍ଡ ବନ୍ଦ/ଚାଲୁ କରନ୍ତୁ"</item>
+ <item msgid="2111767435887685265">"ଟୋଷ୍ଟ୍ ଦେଖାନ୍ତୁ"</item>
+ <item msgid="1091168669714823370">"ପ୍ରୋଜେକ୍ଟ ମିଡିଆ"</item>
+ <item msgid="485564189219029300">"VPN ସକ୍ରିୟ କରନ୍ତୁ"</item>
+ <item msgid="7155384795265164395">"ୱାଲପେପର୍ ଯୋଡ଼ନ୍ତୁ"</item>
+ <item msgid="1835836196806147034">"ସହାୟତାର ସଂରଚନା"</item>
+ <item msgid="5989890403088155055">"ସହାୟକ ସ୍କ୍ରିନ୍ଶଟ୍"</item>
+ <item msgid="8582699692765917557">"ଫୋନ୍ର ସ୍ଥିତି ଜାଣନ୍ତୁ"</item>
+ <item msgid="1474039653814954902">"ଭଏସ୍ମେଲ୍ ଯୋଡ଼ନ୍ତୁ"</item>
+ <item msgid="7222837656938871633">"sip ବ୍ୟବହାର କରନ୍ତୁ"</item>
+ <item msgid="6108267038969274380">"ଆଉଟ୍ଗୋଇଙ୍ଗ କଲ୍ କରନ୍ତୁ"</item>
+ <item msgid="4823402479973873358">"ଆଙ୍ଗୁଠି ଚିହ୍ନ"</item>
+ <item msgid="5895843015407713543">"ବଡୀ ସେନ୍ସର୍"</item>
+ <item msgid="1436446526955010826">"ସେଲ୍ ବ୍ରଡକାଷ୍ଟ ପଢନ୍ତୁ"</item>
+ <item msgid="884172201575690484">"ନକଲି ଅବସ୍ଥାନ"</item>
+ <item msgid="3591971310048485247">"ଷ୍ଟୋରେଜ୍ରୁ ଡାଟା ପଢ଼ିବାର ଅନୁମତି"</item>
+ <item msgid="4041187808621866119">"ଷ୍ଟୋରେଜ୍ରେ ଡାଟା ରଖିବାର ଅନୁମତି"</item>
+ <item msgid="6628873315024166197">"ସ୍କ୍ରୀନ୍ ଅନ୍ କରନ୍ତୁ"</item>
+ <item msgid="3253368931113490863">"ଆକାଉଣ୍ଟଗୁଡିକ ପ୍ରାପ୍ତ କରନ୍ତୁ"</item>
+ <item msgid="780392378084812901">"ବ୍ୟାକ୍ଗ୍ରାଉଣ୍ଡରେ ଚଲାନ୍ତୁ"</item>
+ <item msgid="2629748510881309577">"ଆକ୍ସେସିବିଲିଟୀ ଭଲ୍ୟୁମ୍"</item>
+ </string-array>
+ <string-array name="app_ops_labels">
+ <item msgid="6602854600289714121">"ଲୋକେଶନ୍"</item>
+ <item msgid="8677040780775113033">"ଲୋକେଶନ୍"</item>
+ <item msgid="1660743989948992916">"ଲୋକେଶନ୍"</item>
+ <item msgid="8791172739860195290">"କମ୍ପନ"</item>
+ <item msgid="383413555642128046">"ଯୋଗାଯୋଗଗୁଡ଼ିକ ପଢ଼ନ୍ତୁ"</item>
+ <item msgid="3654594895269697313">"ଯୋଗାଯୋଗ ବଦଳାନ୍ତୁ"</item>
+ <item msgid="7928393476362362538">"କଲ୍ ଲଗ୍ ପଢ଼ନ୍ତୁ"</item>
+ <item msgid="6248591205254641116">"କଲ୍ ଲଗ୍ ସଂଶୋଧନ କରନ୍ତୁ"</item>
+ <item msgid="6093344633066170692">"କ୍ୟାଲେଣ୍ଡର ଦେଖନ୍ତୁ"</item>
+ <item msgid="1334886368750347692">"କ୍ୟାଲେଣ୍ଡରରେ ପରିବର୍ତ୍ତନ କରନ୍ତୁ"</item>
+ <item msgid="1638204101698708656">"ଲୋକେଶନ୍"</item>
+ <item msgid="2154671955760380322">"ପୋଷ୍ଟ ବିଜ୍ଞପ୍ତି"</item>
+ <item msgid="4282477730595931828">"ଲୋକେଶନ୍"</item>
+ <item msgid="4891423912898525905">"ଫୋନ୍କୁ କଲ୍ କରନ୍ତୁ"</item>
+ <item msgid="2623604824935968113">"SMS/MMS ପଢ଼ନ୍ତୁ"</item>
+ <item msgid="4420177125221176306">"SMS/MMS ଲେଖନ୍ତୁ"</item>
+ <item msgid="3986142739951490025">"SMS/MMS ପାଆନ୍ତୁ"</item>
+ <item msgid="3984213795861739778">"SMS/MMS ପାଆନ୍ତୁ"</item>
+ <item msgid="3656243523752472788">"SMS/MMS ପ୍ରାପ୍ତ କରନ୍ତୁ"</item>
+ <item msgid="8105802370238551510">"SMS/MMS ପାଆନ୍ତୁ"</item>
+ <item msgid="1407766984645388488">"SMS/MMS ପଠାନ୍ତୁ"</item>
+ <item msgid="3527273606643794973">"SMS/MMS ପଢ଼ନ୍ତୁ"</item>
+ <item msgid="4370895547001583812">"SMS/MMS ଲେଖନ୍ତୁ"</item>
+ <item msgid="4218544235221631789">"ସେଟିଙ୍ଗଗୁଡ଼ିକ ବଦଳାନ୍ତୁ"</item>
+ <item msgid="736541391767350377">"ଉପର ଭାଗରେ ଆଙ୍କନ୍ତୁ"</item>
+ <item msgid="5530815681721654194">"ବିଜ୍ଞପ୍ତି ଆକସେସ୍ କରନ୍ତୁ"</item>
+ <item msgid="781213371706962767">"କ୍ୟାମେରା"</item>
+ <item msgid="1720492593061838172">"ଅଡିଓ ରେକର୍ଡ କରନ୍ତୁ"</item>
+ <item msgid="3493046322001257041">"ଅଡିଓ ଚଲାନ୍ତୁ"</item>
+ <item msgid="136815868796597058">"କ୍ଲିପ୍ବୋର୍ଡକୁ ପଢ଼ନ୍ତୁ"</item>
+ <item msgid="5238692940326972503">"କ୍ଲିପ୍ବୋର୍ଡରେ ସଂଶୋଧନ କରନ୍ତୁ"</item>
+ <item msgid="5753789168376302997">"ମିଡିଆ ବଟନ୍"</item>
+ <item msgid="3265262911688671938">"ଅଡିଓ ଫୋକସ୍"</item>
+ <item msgid="2098976479485046797">"ମାଷ୍ଟର୍ ଭଲ୍ୟୁମ୍"</item>
+ <item msgid="5660213838861789350">"ଭଏସ୍ ଭଲ୍ୟୁମ୍"</item>
+ <item msgid="7983336752371254444">"ରିଙ୍ଗ ଭଲ୍ୟୁମ୍"</item>
+ <item msgid="7878027809189330917">"ମିଡିଆ ଭଲ୍ୟୁମ୍"</item>
+ <item msgid="7260546305036218513">"ଆଲାର୍ମ ଭଲ୍ୟୁମ୍"</item>
+ <item msgid="9103719301075748925">"ବିଜ୍ଞପ୍ତି ଭଲ୍ୟୁମ୍"</item>
+ <item msgid="7025966722295861512">"ବ୍ଲୁଟୂଥ୍ ଭଲ୍ୟୁମ୍"</item>
+ <item msgid="4665183401128289653">"ଜାଗ୍ରତ କରି ରଖନ୍ତୁ"</item>
+ <item msgid="8584357129746649222">"ଅବସ୍ଥିତି"</item>
+ <item msgid="7669257279311110599">"ଲୋକେଶନ୍"</item>
+ <item msgid="3459320345690097795">"ବ୍ୟବହାର ହିସାବ ପାଆନ୍ତୁ"</item>
+ <item msgid="1312534577834048535">"ମାଇକ୍ରୋଫୋନ୍କୁ ବନ୍ଦ କରନ୍ତୁ/ଖୋଲନ୍ତୁ"</item>
+ <item msgid="427580389823724225">"ଟୋଷ୍ଟ ଦେଖାନ୍ତୁ"</item>
+ <item msgid="4992007785575926253">"ପ୍ରୋଜେକ୍ଟ ମିଡିଆ"</item>
+ <item msgid="2482631530338029480">"VPN ସକ୍ରିୟ କରନ୍ତୁ"</item>
+ <item msgid="1662979573471871926">"ୱାଲପେପର୍ ଯୋଡ଼ନ୍ତୁ"</item>
+ <item msgid="5964768335278263478">"ସହାୟକ ସଂରଚନା"</item>
+ <item msgid="2657138701132782702">"ସହାୟତାର ସ୍କ୍ରିନ୍ଶଟ୍"</item>
+ <item msgid="8571369610363539266">"ଫୋନ୍ର ସ୍ଥିତି ଜାଣନ୍ତୁ"</item>
+ <item msgid="4542463358215230845">"ଭଏସ୍ମେଲ୍ ଯୋଡ଼ନ୍ତୁ"</item>
+ <item msgid="864565065016166003">"ସିପ୍ ବ୍ୟବହାର କରନ୍ତୁ"</item>
+ <item msgid="1958009349883195116">"ଆଉଟ୍ଗୋଇଙ୍ଗ କଲ୍ ପ୍ରୋସେସ୍ କରନ୍ତୁ"</item>
+ <item msgid="8526563410140613458">"ଆଙ୍ଗୁଠି ଚିହ୍ନ"</item>
+ <item msgid="7864822459293570891">"ବଡୀ ସେନ୍ସର୍"</item>
+ <item msgid="6798698496904810960">"ସେଲ୍ର ସମ୍ପ୍ରସାରଣକୁ ପଢ଼ନ୍ତୁ"</item>
+ <item msgid="5242052845700875820">"ନକଲି ଲୋକେଶନ୍"</item>
+ <item msgid="1246296877820358565">"ପଠନ ଷ୍ଟୋରେଜ୍"</item>
+ <item msgid="2404067308793740341">"ଷ୍ଟୋରେଜ୍ରେ ଡାଟା ରଖିବାର ଅନୁମତି"</item>
+ <item msgid="5832543806893763620">"ସ୍କ୍ରୀନ୍କୁ ଅନ୍ କରନ୍ତୁ"</item>
+ <item msgid="5258373962467495905">"ଆକାଉଣ୍ଟଗୁଡିକ ପ୍ରାପ୍ତ କରନ୍ତୁ"</item>
+ <item msgid="334625385979270703">"ବ୍ୟାକ୍ଗ୍ରାଊଣ୍ଡରେ ଚଲାନ୍ତୁ"</item>
+ <item msgid="9039213578110332702">"ଦିବ୍ୟାଙ୍ଗମାନଙ୍କ ପାଇଁ ସୁବିଧାଗୁଡ଼ିକର ଭଲ୍ୟୁମ୍"</item>
+ </string-array>
+ <string-array name="long_press_timeout_selector_titles">
+ <item msgid="3511504869290423954">"ଛୋଟ"</item>
+ <item msgid="2560532955514699713">"ମଧ୍ୟମ"</item>
+ <item msgid="2372711992605524591">"ଲମ୍ଵା"</item>
+ </string-array>
+ <string-array name="captioning_typeface_selector_titles">
+ <item msgid="1319652728542138112">"ପୂର୍ବ-ନିର୍ଦ୍ଧାରିତ"</item>
+ <item msgid="1016452621833735880">"ସାନ୍ସ-ସେରିଫ୍"</item>
+ <item msgid="2496277987934654454">"ସାନ୍ସ-ସେରିଫ୍ କଣ୍ଡେନ୍ସଡ୍"</item>
+ <item msgid="7247838127505318669">"ସାନ୍ସ-ସେରିଫ୍ ମୋନୋସ୍ପେସ୍"</item>
+ <item msgid="4478414822462359763">"Serif"</item>
+ <item msgid="7502451783483660829">"Serif monospace"</item>
+ <item msgid="639503332147461010">"ସାଧାରଣ"</item>
+ <item msgid="7967169925231332424">"କର୍ସିଭ"</item>
+ <item msgid="561832997193039673">"ଛୋଟ ଆକାରର ଅକ୍ଷର"</item>
+ </string-array>
+ <string-array name="captioning_font_size_selector_titles">
+ <item msgid="4800919809575254054">"ବହୁତ ଛୋଟ"</item>
+ <item msgid="6781094565687692782">"ଛୋଟ"</item>
+ <item msgid="8222123259497646551">"ସାଧାରଣ"</item>
+ <item msgid="5813217276778560466">"ବହୁତ ବଡ଼"</item>
+ <item msgid="9044232017390975191">"ବହୁତ ବଡ଼"</item>
+ </string-array>
+ <string-array name="captioning_edge_type_selector_titles">
+ <item msgid="4733815704128258753">"ଡିଫଲ୍ଟ"</item>
+ <item msgid="3217099060748617005">"କିଛି ନୁହେଁ"</item>
+ <item msgid="7467615139904599420">"ଆଉଟ୍ଲାଇନ୍"</item>
+ <item msgid="5623165557468608975">"ଡ୍ରପ୍ ଛାୟା"</item>
+ <item msgid="8088451174058214588">"ଉଠିକରିଥିବା"</item>
+ <item msgid="3821418743395480313">"ସଂକ୍ଷିପ୍ତ"</item>
+ </string-array>
+ <string-array name="captioning_opacity_selector_titles">
+ <item msgid="7622491218136667566">"25%"</item>
+ <item msgid="2367156416247936773">"50%"</item>
+ <item msgid="5395560410107149298">"75%"</item>
+ <item msgid="8342334626783983353">"100%"</item>
+ </string-array>
+ <string-array name="captioning_preset_selector_titles">
+ <item msgid="7009918361545506251">"ଆପ୍ର ପୂର୍ବ-ନିର୍ଦ୍ଧାରିତ ସେଟିଙ୍ଗ ବ୍ୟବହାର କରନ୍ତୁ"</item>
+ <item msgid="1770533843436933500">"କଳା ଉପରେ ଧଳା"</item>
+ <item msgid="758587126802411846">"ଧଳା ଉପରେ କଳା"</item>
+ <item msgid="1495307195241623402">"କଳା ଉପରେ ହଳଦିଆ"</item>
+ <item msgid="6039700130994371612">"ନୀଳ ଉପରେ ହଳଦିଆ"</item>
+ <item msgid="7169235156349580064">"କଷ୍ଟମ୍"</item>
+ </string-array>
+ <string-array name="vpn_types_long">
+ <item msgid="2732002039459078847">"PPTP VPN"</item>
+ <item msgid="3799752201662127867">"ପୂର୍ବରୁ ଶେୟାର୍ ହୋଇଥିବା କୀଗୁଡ଼ିକ ସହ L2TP/IPSec VPN"</item>
+ <item msgid="4725504331295252103">"ସର୍ଟିଫିକେଟ୍ ସହ L2TP/IPSec VPN"</item>
+ <item msgid="7526551163264034377">"ଶେୟାର୍ କରାଯାଇଥିବା କୀ’ଗୁଡ଼ିକ ସହିତ IPSec VPN ଏବଂ Xauth ସତ୍ୟାପନ"</item>
+ <item msgid="8064740940687465039">"ସର୍ଟିଫିକେଟ୍ ଏବଂ Xauth ପ୍ରାମାଣିକୀକରଣ ସହ IPSec VPN"</item>
+ <item msgid="4946199982372391490">"ସର୍ଟିଫିକେଟ୍ ଓ ହାଇବ୍ରିଡ୍ ସତ୍ୟାପନ ସହ IPSec VPN"</item>
+ </string-array>
+ <string-array name="vpn_states">
+ <item msgid="8621078286418985762">"ବିଛିନ୍ନ ହେଲା"</item>
+ <item msgid="6692305604213080515">"ଆରମ୍ଭ କରୁଛି…"</item>
+ <item msgid="8001704909356800092">"ସଂଯୋଗ କରାଯାଉଛି…"</item>
+ <item msgid="4039737283841672166">"ସଂଯୁକ୍ତ"</item>
+ <item msgid="4042143101664725090">"ସମୟ ସମାପ୍ତ"</item>
+ <item msgid="7664124146786465092">"ଅସଫଳ"</item>
+ </string-array>
+ <string-array name="security_settings_premium_sms_values">
+ <item msgid="7389829271787670252">"ପଚାରନ୍ତୁ"</item>
+ <item msgid="5077768429488260031">"ଆଦୌ ଅନୁମତି ଦିଅନାହିଁ"</item>
+ <item msgid="1417929597727989746">"ସର୍ବଦା ଅନୁମତି ଦିଅନ୍ତୁ"</item>
+ </string-array>
+ <string-array name="ram_states">
+ <item msgid="3944681673818150669">"ସାଧାରଣ"</item>
+ <item msgid="3256987280393708586">"ମଧ୍ୟମ ଧରଣର"</item>
+ <item msgid="4662917179231875995">"ନିମ୍ନ"</item>
+ <item msgid="5264929699714647509">"ଜଟିଳ"</item>
+ <item msgid="5606155978847838966">"?"</item>
+ </string-array>
+ <string-array name="proc_stats_memory_states">
+ <item msgid="8845855295876909468">"ସାଧାରଣ"</item>
+ <item msgid="866544120205026771">"ମଧ୍ୟମ"</item>
+ <item msgid="7851902244436886890">"ନିମ୍ନ"</item>
+ <item msgid="3022922196817563960">"ଜଟିଳ"</item>
+ </string-array>
+ <string-array name="proc_stats_process_states">
+ <item msgid="5069825997142785829">"ନିରନ୍ତର"</item>
+ <item msgid="5779398140277006695">"ଶ୍ରେଷ୍ଠ ଗତିବିଧି"</item>
+ <item msgid="1439598363694578255">"ଜରୁରୀ (ଫୋର୍ଗ୍ରାଉଣ୍ଡ)"</item>
+ <item msgid="3396458970745718652">"ଗୁରୁତ୍ଵପୁର୍ଣ୍ଣ (ପୃଷ୍ଠପଟ)"</item>
+ <item msgid="5214825238247511992">"ବ୍ୟାକଅପ୍"</item>
+ <item msgid="311372689168254967">"ଭାରୀ"</item>
+ <item msgid="7438189122367820362">"ସେବା (ଚାଲୁଛି)"</item>
+ <item msgid="918687422516982498">"ସେବା (ରିଷ୍ଟାର୍ଟ ହେଉଛି)"</item>
+ <item msgid="6807727069641853029">"ପ୍ରାପକ"</item>
+ <item msgid="6782857406100845127">"ହୋମ୍"</item>
+ <item msgid="2860945127596974299">"ଶେଷ ଗତିବିଧି"</item>
+ <item msgid="8610560843693675830">"କ୍ୟାଶ୍ ହୋଇଥିବା (କାର୍ଯ୍ୟକଳାପ)"</item>
+ <item msgid="4338089220026248848">"କ୍ୟାଶ୍ ହୋଇଥିବା (କାର୍ଯ୍ୟକଳାପ କ୍ଲାଏଣ୍ଟ)"</item>
+ <item msgid="6652164677254579050">"କ୍ୟାଶ୍ ହୋଇଥିବା (ଖାଲି)"</item>
+ </string-array>
+ <string-array name="color_picker">
+ <item msgid="7631642672260600032">"ଟିଲ୍"</item>
+ <item msgid="8332294763632946560">"ନୀଳ"</item>
+ <item msgid="2023216417616991392">"ଇଣ୍ଡିଗୋ"</item>
+ <item msgid="3170497246594232819">"ବାଇଗଣୀ"</item>
+ <item msgid="4608643045752965568">"ଗୋଲାପୀ"</item>
+ <item msgid="6131821495505931173">"ନାଲି"</item>
+ </string-array>
+ <string-array name="automatic_storage_management_days">
+ <item msgid="687318592238852312">"୩୦ ଦିନରୁ ଅଧିକ ପୁରୁଣା"</item>
+ <item msgid="2900554746706302178">"60 ଦିନରୁ ଅଧିକ ପୁରୁଣା"</item>
+ <item msgid="5692284879054004388">"90 ଦିନରୁ ବି ଅଧିକ ପୁରୁଣା"</item>
+ </string-array>
+ <string-array name="wifi_metered_entries">
+ <item msgid="2975784243692054526">"ନେଟ୍ୱର୍କ ପସନ୍ଦ ବ୍ୟବହାର କରନ୍ତୁ"</item>
+ <item msgid="8745603368609022803">"ମାପ ହୋଇଥିବା ସଂଯୋଗ ରୂପେ ବିବେଚନା କରନ୍ତୁ"</item>
+ <item msgid="2266114985518865625">"ଅପରିମିତ ସଂଯୋଗ ରୂପେ ବିବେଚନା କରନ୍ତୁ"</item>
+ </string-array>
+</resources>
diff --git a/res/values-or/config.xml b/res/values-or/config.xml
new file mode 100644
index 0000000..153e247
--- /dev/null
+++ b/res/values-or/config.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2007 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="config_backup_settings_label" msgid="4423938073600296337"></string>
+</resources>
diff --git a/res/values-pa/strings.xml b/res/values-pa/strings.xml
index 284472f..2b0bc3e 100644
--- a/res/values-pa/strings.xml
+++ b/res/values-pa/strings.xml
@@ -3358,6 +3358,10 @@
<string name="usb_use_MIDI_desc" msgid="8473936990076693175">"ਇਸ ਡੀਵਾਈਸ ਦੀ MIDI ਵਜੋਂ ਵਰਤੋਂ ਕਰੋ"</string>
<string name="usb_use" msgid="3372728031108932425">"ਇਸ ਲਈ USB ਦਾ ਉਪਯੋਗ ਕਰੋ"</string>
<string name="usb_use_also" msgid="557340935190819370">"ਇਸ ਲਈ ਵੀ USB ਵਰਤੋ"</string>
+ <!-- no translation found for usb_default_label (4217189967858707974) -->
+ <skip />
+ <!-- no translation found for usb_default_info (8864535445796200695) -->
+ <skip />
<string name="usb_pref" msgid="1400617804525116158">"USB"</string>
<string name="usb_summary_charging_only" msgid="7544327009143659751">"ਇਸ ਡੀਵਾਈਸ ਨੂੰ ਚਾਰਜ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ"</string>
<string name="usb_summary_power_only" msgid="1996391096369798526">"ਕਨੈਕਟ ਕੀਤੇ ਡੀਵਾਈਸ ਨੂੰ ਚਾਰਜ ਕਰਨਾ"</string>
@@ -3810,8 +3814,7 @@
<string name="storage_percent_full" msgid="6095012055875077036">"ਵਰਤੀ ਗਈ"</string>
<string name="clear_instant_app_data" msgid="2004222610585890909">"ਐਪ ਕਲੀਅਰ ਕਰੋ"</string>
<string name="clear_instant_app_confirmation" msgid="7451671214898856857">"ਕੀ ਤੁਸੀਂ ਇਸ \'ਤਤਕਾਲ ਐਪ\' ਨੂੰ ਹਟਾਉਣਾ ਚਾਹੁੰਦੇ ਹੋ?"</string>
- <!-- no translation found for launch_instant_app (391581144859010499) -->
- <skip />
+ <string name="launch_instant_app" msgid="391581144859010499">"ਖੋਲ੍ਹੋ"</string>
<string name="game_storage_settings" msgid="3410689937046696557">"ਗੇਮਾਂ"</string>
<string name="audio_files_title" msgid="4777048870657911307">"ਆਡੀਓ ਫ਼ਾਈਲਾਂ"</string>
<string name="app_info_storage_title" msgid="5554719444625611987">"ਵਰਤੀ ਗਈ ਜਗ੍ਹਾ"</string>
diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml
index dc516d8..0fbcf1c 100644
--- a/res/values-pl/strings.xml
+++ b/res/values-pl/strings.xml
@@ -3448,6 +3448,10 @@
<string name="usb_use_MIDI_desc" msgid="8473936990076693175">"Użyj tego urządzenia jako MIDI"</string>
<string name="usb_use" msgid="3372728031108932425">"Użyj USB do:"</string>
<string name="usb_use_also" msgid="557340935190819370">"Dodatkowe tryby USB"</string>
+ <!-- no translation found for usb_default_label (4217189967858707974) -->
+ <skip />
+ <!-- no translation found for usb_default_info (8864535445796200695) -->
+ <skip />
<string name="usb_pref" msgid="1400617804525116158">"USB"</string>
<string name="usb_summary_charging_only" msgid="7544327009143659751">"Ładowanie tego urządzenia"</string>
<string name="usb_summary_power_only" msgid="1996391096369798526">"Ładowanie podłączonego urządzenia"</string>
diff --git a/res/values-pt-rBR/strings.xml b/res/values-pt-rBR/strings.xml
index 812e0bc..10e0776 100644
--- a/res/values-pt-rBR/strings.xml
+++ b/res/values-pt-rBR/strings.xml
@@ -3358,6 +3358,10 @@
<string name="usb_use_MIDI_desc" msgid="8473936990076693175">"Usar este dispositivo como MIDI"</string>
<string name="usb_use" msgid="3372728031108932425">"Usar USB para"</string>
<string name="usb_use_also" msgid="557340935190819370">"Também usar o USB para"</string>
+ <!-- no translation found for usb_default_label (4217189967858707974) -->
+ <skip />
+ <!-- no translation found for usb_default_info (8864535445796200695) -->
+ <skip />
<string name="usb_pref" msgid="1400617804525116158">"USB"</string>
<string name="usb_summary_charging_only" msgid="7544327009143659751">"Para carregamento do dispositivo"</string>
<string name="usb_summary_power_only" msgid="1996391096369798526">"Carregando dispositivo conectado"</string>
diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml
index 8d71479..78e85d1 100644
--- a/res/values-pt-rPT/strings.xml
+++ b/res/values-pt-rPT/strings.xml
@@ -3358,6 +3358,10 @@
<string name="usb_use_MIDI_desc" msgid="8473936990076693175">"Utilizar este dispositivo como MIDI"</string>
<string name="usb_use" msgid="3372728031108932425">"Utilizar USB para"</string>
<string name="usb_use_also" msgid="557340935190819370">"Utilizar o USB também para"</string>
+ <!-- no translation found for usb_default_label (4217189967858707974) -->
+ <skip />
+ <!-- no translation found for usb_default_info (8864535445796200695) -->
+ <skip />
<string name="usb_pref" msgid="1400617804525116158">"USB"</string>
<string name="usb_summary_charging_only" msgid="7544327009143659751">"Carregar este dispositivo"</string>
<string name="usb_summary_power_only" msgid="1996391096369798526">"Carregar o dispositivo ligado"</string>
diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml
index 812e0bc..10e0776 100644
--- a/res/values-pt/strings.xml
+++ b/res/values-pt/strings.xml
@@ -3358,6 +3358,10 @@
<string name="usb_use_MIDI_desc" msgid="8473936990076693175">"Usar este dispositivo como MIDI"</string>
<string name="usb_use" msgid="3372728031108932425">"Usar USB para"</string>
<string name="usb_use_also" msgid="557340935190819370">"Também usar o USB para"</string>
+ <!-- no translation found for usb_default_label (4217189967858707974) -->
+ <skip />
+ <!-- no translation found for usb_default_info (8864535445796200695) -->
+ <skip />
<string name="usb_pref" msgid="1400617804525116158">"USB"</string>
<string name="usb_summary_charging_only" msgid="7544327009143659751">"Para carregamento do dispositivo"</string>
<string name="usb_summary_power_only" msgid="1996391096369798526">"Carregando dispositivo conectado"</string>
diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml
index 7fba789..cbe0669 100644
--- a/res/values-ro/strings.xml
+++ b/res/values-ro/strings.xml
@@ -3403,6 +3403,10 @@
<string name="usb_use_MIDI_desc" msgid="8473936990076693175">"Folosiți acest dispozitiv ca MIDI"</string>
<string name="usb_use" msgid="3372728031108932425">"Folosiți conexiunea USB pentru"</string>
<string name="usb_use_also" msgid="557340935190819370">"Folosiți conexiunea USB și pentru"</string>
+ <!-- no translation found for usb_default_label (4217189967858707974) -->
+ <skip />
+ <!-- no translation found for usb_default_info (8864535445796200695) -->
+ <skip />
<string name="usb_pref" msgid="1400617804525116158">"USB"</string>
<string name="usb_summary_charging_only" msgid="7544327009143659751">"Încărcarea acestui dispozitiv"</string>
<string name="usb_summary_power_only" msgid="1996391096369798526">"Se încarcă dispozitivul conectat"</string>
diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml
index d0079cb..b48b8df 100644
--- a/res/values-ru/strings.xml
+++ b/res/values-ru/strings.xml
@@ -3448,6 +3448,10 @@
<string name="usb_use_MIDI_desc" msgid="8473936990076693175">"Использование устройства как MIDI"</string>
<string name="usb_use" msgid="3372728031108932425">"Режим работы USB"</string>
<string name="usb_use_also" msgid="557340935190819370">"Другие способы использования USB"</string>
+ <!-- no translation found for usb_default_label (4217189967858707974) -->
+ <skip />
+ <!-- no translation found for usb_default_info (8864535445796200695) -->
+ <skip />
<string name="usb_pref" msgid="1400617804525116158">"USB"</string>
<string name="usb_summary_charging_only" msgid="7544327009143659751">"Зарядка этого устройства"</string>
<string name="usb_summary_power_only" msgid="1996391096369798526">"Зарядка подключенного устройства"</string>
diff --git a/res/values-si/strings.xml b/res/values-si/strings.xml
index a59ebc4..5302550 100644
--- a/res/values-si/strings.xml
+++ b/res/values-si/strings.xml
@@ -3358,6 +3358,10 @@
<string name="usb_use_MIDI_desc" msgid="8473936990076693175">"මෙම උපාංගය MIDI ලෙස භාවිත කිරිම"</string>
<string name="usb_use" msgid="3372728031108932425">"පහත සඳහා USB භාවිතා කරන්න"</string>
<string name="usb_use_also" msgid="557340935190819370">"USB ද භාවිත කරන්න"</string>
+ <!-- no translation found for usb_default_label (4217189967858707974) -->
+ <skip />
+ <!-- no translation found for usb_default_info (8864535445796200695) -->
+ <skip />
<string name="usb_pref" msgid="1400617804525116158">"USB"</string>
<string name="usb_summary_charging_only" msgid="7544327009143659751">"මෙම උපාංගය ආරෝපණය කරමින්"</string>
<string name="usb_summary_power_only" msgid="1996391096369798526">"සම්බන්ධිත උපාංගය ආරෝපණය කරමින්"</string>
diff --git a/res/values-sk/arrays.xml b/res/values-sk/arrays.xml
index 2c1450e..5bcd9c5 100644
--- a/res/values-sk/arrays.xml
+++ b/res/values-sk/arrays.xml
@@ -497,4 +497,7 @@
<item msgid="8745603368609022803">"Považovať za sieť s meraním dát"</item>
<item msgid="2266114985518865625">"Považovať za sieť bez merania dát"</item>
</string-array>
+ <!-- no translation found for dark_ui_mode_entries:0 (146804192658443142) -->
+ <!-- no translation found for dark_ui_mode_entries:1 (6620560879508595181) -->
+ <!-- no translation found for dark_ui_mode_entries:2 (6385301106124765323) -->
</resources>
diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml
index a9fdc50..849528f 100644
--- a/res/values-sk/strings.xml
+++ b/res/values-sk/strings.xml
@@ -729,6 +729,10 @@
<string name="bluetooth_dock_settings_remember" msgid="5551459057010609115">"Zapamätať nastavenia"</string>
<string name="bluetooth_max_connected_audio_devices_string" msgid="6752690395207847881">"Maximálny počet pripojených zvukových zariadení Bluetooth"</string>
<string name="bluetooth_max_connected_audio_devices_dialog_title" msgid="5936561749790095473">"Výber maximálneho počtu pripojených zvukových zariadení Bluetooth"</string>
+ <!-- no translation found for bluetooth_enable_avdtp_delay_reports (5101903170688399944) -->
+ <skip />
+ <!-- no translation found for bluetooth_enable_avdtp_delay_reports_summary (7052797876020616399) -->
+ <skip />
<string name="wifi_display_settings_title" msgid="8740852850033480136">"Prenos"</string>
<string name="wifi_display_enable_menu_item" msgid="4883036464138167674">"Povoliť bezdrôtové zobrazenie"</string>
<string name="wifi_display_no_devices_found" msgid="1382012407154143453">"V okolí sa nenašli žiadne zariadenia."</string>
@@ -1908,8 +1912,10 @@
<string name="accessibility_service_master_switch_title" msgid="6835441300276358239">"Používať službu"</string>
<string name="accessibility_daltonizer_master_switch_title" msgid="8655284637968823154">"Používať úpravu farieb"</string>
<string name="accessibility_caption_master_switch_title" msgid="4010227386676077826">"Používať titulky"</string>
- <string name="accessibility_summary_state_enabled" msgid="8359913912320966304">"ZAPNUTÉ"</string>
- <string name="accessibility_summary_state_disabled" msgid="2241315620132005595">"VYPNUTÉ"</string>
+ <!-- no translation found for accessibility_summary_state_enabled (7914278500885887763) -->
+ <skip />
+ <!-- no translation found for accessibility_summary_state_disabled (2984230257590246745) -->
+ <skip />
<string name="enable_quick_setting" msgid="2366999897816894536">"Zobraziť v Rýchlych nastaveniach"</string>
<string name="daltonizer_type" msgid="1124178250809091080">"Režim korekcie"</string>
<plurals name="accessibilty_autoclick_preference_subtitle_extremely_short_delay" formatted="false" msgid="7340347830562315800">
@@ -2950,6 +2956,8 @@
<string name="keywords_model_and_hardware" msgid="1459248377212829642">"sériové číslo, hardvérová verzia"</string>
<string name="keywords_android_version" msgid="9069747153590902819">"úroveň opráv zabezpečenia androidu, verzia základného pásma, verzia jadra"</string>
<string name="keywords_ambient_display_screen" msgid="5874969496073249362">"Ambientné zobrazenie, zobrazenie uzamknutej obrazovky"</string>
+ <!-- no translation found for keywords_fingerprint_settings (239222512315619538) -->
+ <skip />
<string name="setup_wifi_nfc_tag" msgid="9028353016222911016">"Nastavenie štítka NFC pre Wi‑Fi"</string>
<string name="write_tag" msgid="8571858602896222537">"Zapísať"</string>
<string name="status_awaiting_tap" msgid="2130145523773160617">"Klepnutím na značku začnete zápis..."</string>
@@ -3248,7 +3256,8 @@
<string name="zen_mode_summary_alarms_only_by_time" msgid="7465525754879341907">"Zmena na možnosť Iba budíky platná do <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_summary_always" msgid="6172985102689237703">"Zmena na možnosť Vždy prerušiť"</string>
<string name="zen_mode_screen_on" msgid="8774571998575673502">"Keď je obrazovka zapnutá"</string>
- <string name="zen_mode_screen_on_summary" msgid="5385338884695802115">"Povoliť, aby sa upozornenia stlmené režimom Nerušiť mohli zobraziť na obrazovke"</string>
+ <!-- no translation found for zen_mode_screen_on_summary (2208664848367443505) -->
+ <skip />
<string name="zen_mode_screen_off" msgid="3144446765110327937">"Keď je obrazovka vypnutá"</string>
<string name="zen_mode_screen_off_summary" msgid="7430034620565812258">"Povoliť, aby upozornenia stlmené režimom Nerušiť mohli zapnúť obrazovku a blikať svetlom"</string>
<string name="zen_mode_screen_off_summary_no_led" msgid="2826121465026642017">"Povoliť, aby upozornenia stlmené režimom Nerušiť mohli zapnúť obrazovku"</string>
@@ -3448,6 +3457,8 @@
<string name="usb_use_MIDI_desc" msgid="8473936990076693175">"Použiť toto zariadenie ako MIDI"</string>
<string name="usb_use" msgid="3372728031108932425">"Použiť rozhranie USB na"</string>
<string name="usb_use_also" msgid="557340935190819370">"USB použiť aj pre"</string>
+ <string name="usb_default_label" msgid="4217189967858707974">"Predvolená konfigurácia USB"</string>
+ <string name="usb_default_info" msgid="8864535445796200695">"Tieto nastavenia sa použijú, keď bude pripojené ďalšie zariadenie a telefón bude odomknutý. Pripájajte sa iba k dôveryhodným zariadeniam."</string>
<string name="usb_pref" msgid="1400617804525116158">"USB"</string>
<string name="usb_summary_charging_only" msgid="7544327009143659751">"Nabíjanie zariadenia"</string>
<string name="usb_summary_power_only" msgid="1996391096369798526">"Nabíja sa pripojené zariadenie"</string>
@@ -3572,8 +3583,10 @@
<string name="memory_summary" msgid="8080825904671961872">"Využíva sa v priemere <xliff:g id="USED_MEMORY">%1$s</xliff:g> z celkovej pamäte <xliff:g id="TOTAL_MEMORY">%2$s</xliff:g>"</string>
<string name="users_summary" msgid="1674864467098487328">"Prihlásený používateľ <xliff:g id="USER_NAME">%1$s</xliff:g>"</string>
<string name="payment_summary" msgid="3472482669588561110">"<xliff:g id="APP_NAME">%1$s</xliff:g> je predvolená aplikácia"</string>
- <string name="location_on_summary" msgid="4083334422422067511">"ZAP."</string>
- <string name="location_off_summary" msgid="6474350053215707957">"VYPNUTÉ"</string>
+ <!-- no translation found for location_on_summary (3637699010986988970) -->
+ <skip />
+ <!-- no translation found for location_off_summary (7217264690673949107) -->
+ <skip />
<string name="backup_disabled" msgid="485189128759595412">"Zálohovanie je zakázané"</string>
<string name="android_version_summary" msgid="2935995161657697278">"Aktualizované na Android <xliff:g id="VERSION">%1$s</xliff:g>"</string>
<string name="android_version_pending_update_summary" msgid="487831391976523090">"K dispozícii je aktualizácia"</string>
@@ -3757,9 +3770,13 @@
<string name="bluetooth_connected_summary" msgid="7672528674593152862">"Pripojené k zariadeniu <xliff:g id="ID_1">%1$s</xliff:g>"</string>
<string name="bluetooth_connected_multiple_devices_summary" msgid="9173661896296663932">"Pripojené k viacerým zariadeniam"</string>
<string name="demo_mode" msgid="2798762752209330277">"Ukážka používateľského rozhrania systému"</string>
+ <!-- no translation found for dark_ui_mode (2112241426441807273) -->
+ <skip />
+ <!-- no translation found for dark_ui_mode_title (975299966259850992) -->
+ <skip />
<string name="quick_settings_developer_tiles" msgid="5947788063262762448">"Dlaždice rýchleho nastavenia pre vývojárov"</string>
- <string name="window_trace_quick_settings_title" msgid="3839917000546526898">"Trasovanie okna"</string>
- <string name="layer_trace_quick_settings_title" msgid="876797401275734018">"Povrchové trasovanie"</string>
+ <!-- no translation found for winscope_trace_quick_settings_title (1294290008255732032) -->
+ <skip />
<string name="support_country_format" msgid="4502523713489559595">"<xliff:g id="COUNTRY">%1$s</xliff:g> – <xliff:g id="LANGUAGE">%2$s</xliff:g>"</string>
<string name="managed_profile_settings_title" msgid="2729481936758125054">"Nastavenia pracovného profilu"</string>
<string name="managed_profile_contact_search_title" msgid="6034734926815544221">"Vyhľadávanie kontaktov"</string>
diff --git a/res/values-sl/strings.xml b/res/values-sl/strings.xml
index b0201ad..1f1e1d2 100644
--- a/res/values-sl/strings.xml
+++ b/res/values-sl/strings.xml
@@ -3448,6 +3448,10 @@
<string name="usb_use_MIDI_desc" msgid="8473936990076693175">"Uporaba te naprave kot vmesnik MIDI"</string>
<string name="usb_use" msgid="3372728031108932425">"Uporaba povezave USB za"</string>
<string name="usb_use_also" msgid="557340935190819370">"Uporabi USB tudi za"</string>
+ <!-- no translation found for usb_default_label (4217189967858707974) -->
+ <skip />
+ <!-- no translation found for usb_default_info (8864535445796200695) -->
+ <skip />
<string name="usb_pref" msgid="1400617804525116158">"USB"</string>
<string name="usb_summary_charging_only" msgid="7544327009143659751">"Polnjenje te naprave"</string>
<string name="usb_summary_power_only" msgid="1996391096369798526">"Polnjenje akumulatorja v povezani napravi"</string>
@@ -3934,8 +3938,7 @@
<string name="storage_percent_full" msgid="6095012055875077036">"uporab."</string>
<string name="clear_instant_app_data" msgid="2004222610585890909">"Počisti aplikacijo"</string>
<string name="clear_instant_app_confirmation" msgid="7451671214898856857">"Ali želite odstraniti to nenamestljivo aplikacijo?"</string>
- <!-- no translation found for launch_instant_app (391581144859010499) -->
- <skip />
+ <string name="launch_instant_app" msgid="391581144859010499">"Odpri"</string>
<string name="game_storage_settings" msgid="3410689937046696557">"Igre"</string>
<string name="audio_files_title" msgid="4777048870657911307">"Zvočne datoteke"</string>
<string name="app_info_storage_title" msgid="5554719444625611987">"Uporabljen prostor"</string>
diff --git a/res/values-sq/strings.xml b/res/values-sq/strings.xml
index 1b579a2..34cca05 100644
--- a/res/values-sq/strings.xml
+++ b/res/values-sq/strings.xml
@@ -3358,6 +3358,10 @@
<string name="usb_use_MIDI_desc" msgid="8473936990076693175">"Përdore këtë pajisje si MIDI"</string>
<string name="usb_use" msgid="3372728031108932425">"Përdore USB-në për"</string>
<string name="usb_use_also" msgid="557340935190819370">"Përdor po ashtu USB-në për"</string>
+ <!-- no translation found for usb_default_label (4217189967858707974) -->
+ <skip />
+ <!-- no translation found for usb_default_info (8864535445796200695) -->
+ <skip />
<string name="usb_pref" msgid="1400617804525116158">"USB"</string>
<string name="usb_summary_charging_only" msgid="7544327009143659751">"Ngarkimi i kësaj pajisjeje"</string>
<string name="usb_summary_power_only" msgid="1996391096369798526">"Pajisja e lidhur po ngarkohet"</string>
@@ -3810,8 +3814,7 @@
<string name="storage_percent_full" msgid="6095012055875077036">"e përdorur"</string>
<string name="clear_instant_app_data" msgid="2004222610585890909">"Pastro aplikacionin"</string>
<string name="clear_instant_app_confirmation" msgid="7451671214898856857">"Dëshiron që ta heqësh këtë aplikacion të çastit?"</string>
- <!-- no translation found for launch_instant_app (391581144859010499) -->
- <skip />
+ <string name="launch_instant_app" msgid="391581144859010499">"Hap"</string>
<string name="game_storage_settings" msgid="3410689937046696557">"Lojëra"</string>
<string name="audio_files_title" msgid="4777048870657911307">"Skedarët audio"</string>
<string name="app_info_storage_title" msgid="5554719444625611987">"Hapësira e përdorur"</string>
diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml
index 18ad45a..7a2be58 100644
--- a/res/values-sr/strings.xml
+++ b/res/values-sr/strings.xml
@@ -3403,6 +3403,10 @@
<string name="usb_use_MIDI_desc" msgid="8473936990076693175">"Користите овај уређај као MIDI"</string>
<string name="usb_use" msgid="3372728031108932425">"Користи USB за"</string>
<string name="usb_use_also" msgid="557340935190819370">"Користите USB и за"</string>
+ <!-- no translation found for usb_default_label (4217189967858707974) -->
+ <skip />
+ <!-- no translation found for usb_default_info (8864535445796200695) -->
+ <skip />
<string name="usb_pref" msgid="1400617804525116158">"USB"</string>
<string name="usb_summary_charging_only" msgid="7544327009143659751">"Пуњење уређаја"</string>
<string name="usb_summary_power_only" msgid="1996391096369798526">"Пуњење повезаног уређаја"</string>
diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml
index db7dc1c..9a56c2a 100644
--- a/res/values-sv/strings.xml
+++ b/res/values-sv/strings.xml
@@ -3358,6 +3358,10 @@
<string name="usb_use_MIDI_desc" msgid="8473936990076693175">"Använd den här enheten som MIDI"</string>
<string name="usb_use" msgid="3372728031108932425">"Använd USB för"</string>
<string name="usb_use_also" msgid="557340935190819370">"Använd även USB för"</string>
+ <!-- no translation found for usb_default_label (4217189967858707974) -->
+ <skip />
+ <!-- no translation found for usb_default_info (8864535445796200695) -->
+ <skip />
<string name="usb_pref" msgid="1400617804525116158">"USB"</string>
<string name="usb_summary_charging_only" msgid="7544327009143659751">"Enheten laddas"</string>
<string name="usb_summary_power_only" msgid="1996391096369798526">"Laddning av ansluten enhet"</string>
@@ -3810,8 +3814,7 @@
<string name="storage_percent_full" msgid="6095012055875077036">"används"</string>
<string name="clear_instant_app_data" msgid="2004222610585890909">"Rensa app"</string>
<string name="clear_instant_app_confirmation" msgid="7451671214898856857">"Vill du ta bort den här snabbappen?"</string>
- <!-- no translation found for launch_instant_app (391581144859010499) -->
- <skip />
+ <string name="launch_instant_app" msgid="391581144859010499">"Öppna"</string>
<string name="game_storage_settings" msgid="3410689937046696557">"Spel"</string>
<string name="audio_files_title" msgid="4777048870657911307">"Ljudfiler"</string>
<string name="app_info_storage_title" msgid="5554719444625611987">"Använt lagringsutrymme"</string>
diff --git a/res/values-sw/strings.xml b/res/values-sw/strings.xml
index b8bc68f..3103f4a 100644
--- a/res/values-sw/strings.xml
+++ b/res/values-sw/strings.xml
@@ -3358,6 +3358,10 @@
<string name="usb_use_MIDI_desc" msgid="8473936990076693175">"Tumia kifaa hiki kama MIDI"</string>
<string name="usb_use" msgid="3372728031108932425">"Tumia USB kwa ajili ya"</string>
<string name="usb_use_also" msgid="557340935190819370">"Pia tumia USB"</string>
+ <!-- no translation found for usb_default_label (4217189967858707974) -->
+ <skip />
+ <!-- no translation found for usb_default_info (8864535445796200695) -->
+ <skip />
<string name="usb_pref" msgid="1400617804525116158">"USB"</string>
<string name="usb_summary_charging_only" msgid="7544327009143659751">"Kuchaji kifaa hiki"</string>
<string name="usb_summary_power_only" msgid="1996391096369798526">"Inachaji kifaa kilichounganishwa"</string>
diff --git a/res/values-sw400dp/styles.xml b/res/values-sw400dp/config.xml
old mode 100755
new mode 100644
similarity index 64%
rename from res/values-sw400dp/styles.xml
rename to res/values-sw400dp/config.xml
index f69f7c3..d791857
--- a/res/values-sw400dp/styles.xml
+++ b/res/values-sw400dp/config.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
- Copyright (C) 2017 The Android Open Source Project
+ Copyright (C) 2018 Google Inc.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
@@ -17,7 +17,9 @@
<resources>
- <!-- Unhide the icon on bigger screens -->
- <style name="LockPatternIconStyle" parent="SuwGlifIcon" />
+ <!-- Whether to use a UI variant that minimizes the number of UI elements on screen. This is
+ typically used when there is not enough space to display everything, because pattern view
+ doesn't interact well with scroll view -->
+ <bool name="config_lock_pattern_minimal_ui">false</bool>
-</resources>
+</resources>
\ No newline at end of file
diff --git a/res/values-ta/strings.xml b/res/values-ta/strings.xml
index 877ff81..53d28fa 100644
--- a/res/values-ta/strings.xml
+++ b/res/values-ta/strings.xml
@@ -3358,6 +3358,10 @@
<string name="usb_use_MIDI_desc" msgid="8473936990076693175">"இந்தச் சாதனத்தை MIDI ஆகப் பயன்படுத்தும்"</string>
<string name="usb_use" msgid="3372728031108932425">"இதற்காக USBஐப் பயன்படுத்து:"</string>
<string name="usb_use_also" msgid="557340935190819370">"USBஐ இதற்கும் பயன்படுத்தலாம்"</string>
+ <!-- no translation found for usb_default_label (4217189967858707974) -->
+ <skip />
+ <!-- no translation found for usb_default_info (8864535445796200695) -->
+ <skip />
<string name="usb_pref" msgid="1400617804525116158">"USB"</string>
<string name="usb_summary_charging_only" msgid="7544327009143659751">"இந்தச் சாதனத்தைச் சார்ஜ் செய்வதற்கு"</string>
<string name="usb_summary_power_only" msgid="1996391096369798526">"இணைக்கப்பட்ட சாதனத்தைச் சார்ஜ் செய்தல்"</string>
@@ -3810,8 +3814,7 @@
<string name="storage_percent_full" msgid="6095012055875077036">"பயன்பாடு"</string>
<string name="clear_instant_app_data" msgid="2004222610585890909">"பயன்பாட்டை அழி"</string>
<string name="clear_instant_app_confirmation" msgid="7451671214898856857">"இந்த இன்ஸ்டண்ட் பயன்பாட்டை அகற்றவா?"</string>
- <!-- no translation found for launch_instant_app (391581144859010499) -->
- <skip />
+ <string name="launch_instant_app" msgid="391581144859010499">"திற"</string>
<string name="game_storage_settings" msgid="3410689937046696557">"கேம்ஸ்"</string>
<string name="audio_files_title" msgid="4777048870657911307">"ஆடியோ ஃபைல்கள்"</string>
<string name="app_info_storage_title" msgid="5554719444625611987">"பயன்படுத்திய இட அளவு"</string>
diff --git a/res/values-te/strings.xml b/res/values-te/strings.xml
index daaa164..f02e704 100644
--- a/res/values-te/strings.xml
+++ b/res/values-te/strings.xml
@@ -3359,6 +3359,10 @@
<string name="usb_use_MIDI_desc" msgid="8473936990076693175">"ఈ పరికరాన్ని MIDI వలె ఉపయోగించడం"</string>
<string name="usb_use" msgid="3372728031108932425">"దీని కోసం USBని ఉపయోగించండి"</string>
<string name="usb_use_also" msgid="557340935190819370">"USBని దీని కోసం కూడా ఉపయోగించండి"</string>
+ <!-- no translation found for usb_default_label (4217189967858707974) -->
+ <skip />
+ <!-- no translation found for usb_default_info (8864535445796200695) -->
+ <skip />
<string name="usb_pref" msgid="1400617804525116158">"USB"</string>
<string name="usb_summary_charging_only" msgid="7544327009143659751">"ఈ పరికరాన్ని ఛార్జ్ చేయడం"</string>
<string name="usb_summary_power_only" msgid="1996391096369798526">"కనెక్ట్ చేయబడిన పరికరాన్ని ఛార్జ్ చేస్తోంది"</string>
@@ -3811,8 +3815,7 @@
<string name="storage_percent_full" msgid="6095012055875077036">"ఉపయోగించబడింది"</string>
<string name="clear_instant_app_data" msgid="2004222610585890909">"యాప్ను క్లియర్ చేయి"</string>
<string name="clear_instant_app_confirmation" msgid="7451671214898856857">"మీరు ఈ తక్షణ అనువర్తనాన్ని తీసివేయాలనుకుంటున్నారా?"</string>
- <!-- no translation found for launch_instant_app (391581144859010499) -->
- <skip />
+ <string name="launch_instant_app" msgid="391581144859010499">"తెరువు"</string>
<string name="game_storage_settings" msgid="3410689937046696557">"గేమ్లు"</string>
<string name="audio_files_title" msgid="4777048870657911307">"ఆడియో ఫైల్లు"</string>
<string name="app_info_storage_title" msgid="5554719444625611987">"ఉపయోగించబడిన నిల్వ"</string>
diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml
index 47562ae..74b21e4 100644
--- a/res/values-th/strings.xml
+++ b/res/values-th/strings.xml
@@ -3358,6 +3358,10 @@
<string name="usb_use_MIDI_desc" msgid="8473936990076693175">"ใช้อุปกรณ์นี้เป็น MIDI"</string>
<string name="usb_use" msgid="3372728031108932425">"ใช้ USB สำหรับ"</string>
<string name="usb_use_also" msgid="557340935190819370">"และใช้ USB สำหรับ"</string>
+ <!-- no translation found for usb_default_label (4217189967858707974) -->
+ <skip />
+ <!-- no translation found for usb_default_info (8864535445796200695) -->
+ <skip />
<string name="usb_pref" msgid="1400617804525116158">"USB"</string>
<string name="usb_summary_charging_only" msgid="7544327009143659751">"ชาร์จอุปกรณ์นี้"</string>
<string name="usb_summary_power_only" msgid="1996391096369798526">"การชาร์จอุปกรณ์ที่เชื่อมต่อ"</string>
diff --git a/res/values-tl/strings.xml b/res/values-tl/strings.xml
index 139a63c..8190657 100644
--- a/res/values-tl/strings.xml
+++ b/res/values-tl/strings.xml
@@ -3358,6 +3358,10 @@
<string name="usb_use_MIDI_desc" msgid="8473936990076693175">"Gamitin ang device na ito bilang MIDI"</string>
<string name="usb_use" msgid="3372728031108932425">"Gamitin ang USB para sa"</string>
<string name="usb_use_also" msgid="557340935190819370">"Gamitin din ang USB para sa"</string>
+ <!-- no translation found for usb_default_label (4217189967858707974) -->
+ <skip />
+ <!-- no translation found for usb_default_info (8864535445796200695) -->
+ <skip />
<string name="usb_pref" msgid="1400617804525116158">"USB"</string>
<string name="usb_summary_charging_only" msgid="7544327009143659751">"Pag-charge sa device na ito"</string>
<string name="usb_summary_power_only" msgid="1996391096369798526">"Pag-charge ng nakakonektang device"</string>
diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml
index 1da5ff4..0e43462 100644
--- a/res/values-tr/strings.xml
+++ b/res/values-tr/strings.xml
@@ -3358,6 +3358,10 @@
<string name="usb_use_MIDI_desc" msgid="8473936990076693175">"Bu cihazı MIDI olarak kullanın"</string>
<string name="usb_use" msgid="3372728031108932425">"USB\'yi şunun için kullan:"</string>
<string name="usb_use_also" msgid="557340935190819370">"Ayrıca USB\'yi şunun için kullan:"</string>
+ <!-- no translation found for usb_default_label (4217189967858707974) -->
+ <skip />
+ <!-- no translation found for usb_default_info (8864535445796200695) -->
+ <skip />
<string name="usb_pref" msgid="1400617804525116158">"USB"</string>
<string name="usb_summary_charging_only" msgid="7544327009143659751">"Bu cihazı şarj et"</string>
<string name="usb_summary_power_only" msgid="1996391096369798526">"Bağlı cihazı şarj etme"</string>
@@ -3810,8 +3814,7 @@
<string name="storage_percent_full" msgid="6095012055875077036">"kullanılan"</string>
<string name="clear_instant_app_data" msgid="2004222610585890909">"Uygulamayı temizle"</string>
<string name="clear_instant_app_confirmation" msgid="7451671214898856857">"Bu hazır uygulamayı kaldırmak istiyor musunuz?"</string>
- <!-- no translation found for launch_instant_app (391581144859010499) -->
- <skip />
+ <string name="launch_instant_app" msgid="391581144859010499">"Aç"</string>
<string name="game_storage_settings" msgid="3410689937046696557">"Oyunlar"</string>
<string name="audio_files_title" msgid="4777048870657911307">"Ses dosyaları"</string>
<string name="app_info_storage_title" msgid="5554719444625611987">"Kullanılan alan"</string>
diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml
index a46de41..60477cf 100644
--- a/res/values-uk/strings.xml
+++ b/res/values-uk/strings.xml
@@ -3448,6 +3448,10 @@
<string name="usb_use_MIDI_desc" msgid="8473936990076693175">"Використовувати цей пристрій як MIDI"</string>
<string name="usb_use" msgid="3372728031108932425">"Використання USB"</string>
<string name="usb_use_also" msgid="557340935190819370">"Інші застосування USB"</string>
+ <!-- no translation found for usb_default_label (4217189967858707974) -->
+ <skip />
+ <!-- no translation found for usb_default_info (8864535445796200695) -->
+ <skip />
<string name="usb_pref" msgid="1400617804525116158">"USB"</string>
<string name="usb_summary_charging_only" msgid="7544327009143659751">"Заряджання пристрою"</string>
<string name="usb_summary_power_only" msgid="1996391096369798526">"Заряджання під’єднаного пристрою"</string>
diff --git a/res/values-ur/strings.xml b/res/values-ur/strings.xml
index e6553e6..8b52059 100644
--- a/res/values-ur/strings.xml
+++ b/res/values-ur/strings.xml
@@ -3356,6 +3356,10 @@
<string name="usb_use_MIDI_desc" msgid="8473936990076693175">"اس آلہ کو بطور MIDI استعمال کریں"</string>
<string name="usb_use" msgid="3372728031108932425">"اس کیلئے USB استعمال کریں"</string>
<string name="usb_use_also" msgid="557340935190819370">"درجہ ذیل کے لئے بھی USB استعمال کریں"</string>
+ <!-- no translation found for usb_default_label (4217189967858707974) -->
+ <skip />
+ <!-- no translation found for usb_default_info (8864535445796200695) -->
+ <skip />
<string name="usb_pref" msgid="1400617804525116158">"USB"</string>
<string name="usb_summary_charging_only" msgid="7544327009143659751">"اس آلہ کو چارج کر رہی ہے"</string>
<string name="usb_summary_power_only" msgid="1996391096369798526">"منسلک آلہ چارج ہو رہا ہے"</string>
@@ -3808,8 +3812,7 @@
<string name="storage_percent_full" msgid="6095012055875077036">"مستعمل"</string>
<string name="clear_instant_app_data" msgid="2004222610585890909">"ایپ صاف کریں"</string>
<string name="clear_instant_app_confirmation" msgid="7451671214898856857">"کیا آپ اس فوری ایپ کو ہٹانا چاہتے ہیں؟"</string>
- <!-- no translation found for launch_instant_app (391581144859010499) -->
- <skip />
+ <string name="launch_instant_app" msgid="391581144859010499">"کھولیں"</string>
<string name="game_storage_settings" msgid="3410689937046696557">"گیمز"</string>
<string name="audio_files_title" msgid="4777048870657911307">"آڈیو فائلز"</string>
<string name="app_info_storage_title" msgid="5554719444625611987">"استعمال شدہ جگہ"</string>
diff --git a/res/values-uz/strings.xml b/res/values-uz/strings.xml
index 936d67a..241134d 100644
--- a/res/values-uz/strings.xml
+++ b/res/values-uz/strings.xml
@@ -923,7 +923,7 @@
<string name="wifi_hotspot_configure_ap_text" msgid="5478614731464220432">"Wi‑Fi ulanish nuqtasini sozlash"</string>
<string name="wifi_hotspot_configure_ap_text_summary" msgid="5560680057727007011">"AndroidAP WPA2 PSK hotspot"</string>
<string name="wifi_tether_configure_ssid_default" msgid="8467525402622138547">"AndroidHotspot"</string>
- <string name="wifi_tether_disabled_by_airplane" msgid="414480185654767932">"Parvoz rejimi yoniqligi uchun funksiya ishlamaydi"</string>
+ <string name="wifi_tether_disabled_by_airplane" msgid="414480185654767932">"Parvoz rejimi yoniqligi uchun bu funksiya ishlamaydi"</string>
<string name="wifi_calling_settings_title" msgid="4102921303993404577">"Wi-Fi qo‘ng‘iroq"</string>
<string name="wifi_calling_suggestion_title" msgid="7766895085362824508">"Wi‑Fi orqali chaqiruv qamrovini kengaytiring"</string>
<string name="wifi_calling_suggestion_summary" msgid="6460250990899143406">"Wi-Fi chaqiruvni yoqing"</string>
@@ -1489,7 +1489,7 @@
<string name="settings_safetylegal_activity_title" msgid="6901214628496951727">"Xavfsizlik qoidalari"</string>
<string name="settings_safetylegal_activity_unreachable" msgid="142307697309858185">"Sizda internet ulanish yo‘q. Bu ma‘lumotni ko‘rish uchun, internetga ulangan kompyuterda %s manziliga kiring."</string>
<string name="settings_safetylegal_activity_loading" msgid="8059022597639516348">"Yuklanmoqda…"</string>
- <string name="lockpassword_choose_your_screen_lock_header" msgid="2942199737559900752">"Ekranni qulfini o‘rnatish"</string>
+ <string name="lockpassword_choose_your_screen_lock_header" msgid="2942199737559900752">"Ekranni qulfini sozlash"</string>
<string name="lockpassword_choose_your_password_message" msgid="5377842480961577542">"Xavfsizlik uchun parol o‘rnating"</string>
<string name="lockpassword_choose_your_password_header_for_fingerprint" msgid="6624409510609085450">"Barmoq izidan foydalanish uchun parol o‘rnating"</string>
<string name="lockpassword_choose_your_pattern_header_for_fingerprint" msgid="5901096361617543819">"Barmoq izidan foydalanish uchun grafik kalit o‘rnating"</string>
@@ -3378,6 +3378,10 @@
<string name="usb_use_MIDI_desc" msgid="8473936990076693175">"Bu qurilmadan MIDI sifatida foydalanish"</string>
<string name="usb_use" msgid="3372728031108932425">"USBdan foydalanish"</string>
<string name="usb_use_also" msgid="557340935190819370">"USB ulanish maqsadi"</string>
+ <!-- no translation found for usb_default_label (4217189967858707974) -->
+ <skip />
+ <!-- no translation found for usb_default_info (8864535445796200695) -->
+ <skip />
<string name="usb_pref" msgid="1400617804525116158">"USB"</string>
<string name="usb_summary_charging_only" msgid="7544327009143659751">"Shu qurilmani quvvatlash"</string>
<string name="usb_summary_power_only" msgid="1996391096369798526">"Ulangan qurilma quvvatlanmoqda"</string>
diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml
index 461c013..42ae0c5 100644
--- a/res/values-vi/strings.xml
+++ b/res/values-vi/strings.xml
@@ -3364,6 +3364,10 @@
<string name="usb_use_MIDI_desc" msgid="8473936990076693175">"Sử dụng thiết bị này làm MIDI"</string>
<string name="usb_use" msgid="3372728031108932425">"Sử dụng USB cho"</string>
<string name="usb_use_also" msgid="557340935190819370">"Ngoài ra, sử dụng USB để"</string>
+ <!-- no translation found for usb_default_label (4217189967858707974) -->
+ <skip />
+ <!-- no translation found for usb_default_info (8864535445796200695) -->
+ <skip />
<string name="usb_pref" msgid="1400617804525116158">"USB"</string>
<string name="usb_summary_charging_only" msgid="7544327009143659751">"Sạc thiết bị này"</string>
<string name="usb_summary_power_only" msgid="1996391096369798526">"Sạc thiết bị được kết nối"</string>
diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml
index 8a7c7a4..1e947f5 100644
--- a/res/values-zh-rCN/strings.xml
+++ b/res/values-zh-rCN/strings.xml
@@ -3358,6 +3358,10 @@
<string name="usb_use_MIDI_desc" msgid="8473936990076693175">"将此设备用作 MIDI 设备"</string>
<string name="usb_use" msgid="3372728031108932425">"USB 的用途"</string>
<string name="usb_use_also" msgid="557340935190819370">"同时将 USB 用于以下用途:"</string>
+ <!-- no translation found for usb_default_label (4217189967858707974) -->
+ <skip />
+ <!-- no translation found for usb_default_info (8864535445796200695) -->
+ <skip />
<string name="usb_pref" msgid="1400617804525116158">"USB"</string>
<string name="usb_summary_charging_only" msgid="7544327009143659751">"为此设备充电"</string>
<string name="usb_summary_power_only" msgid="1996391096369798526">"为连接的设备充电"</string>
@@ -3810,8 +3814,7 @@
<string name="storage_percent_full" msgid="6095012055875077036">"已使用"</string>
<string name="clear_instant_app_data" msgid="2004222610585890909">"清除应用"</string>
<string name="clear_instant_app_confirmation" msgid="7451671214898856857">"要移除这个免安装应用吗?"</string>
- <!-- no translation found for launch_instant_app (391581144859010499) -->
- <skip />
+ <string name="launch_instant_app" msgid="391581144859010499">"打开"</string>
<string name="game_storage_settings" msgid="3410689937046696557">"游戏"</string>
<string name="audio_files_title" msgid="4777048870657911307">"音频文件"</string>
<string name="app_info_storage_title" msgid="5554719444625611987">"已用空间"</string>
diff --git a/res/values-zh-rHK/strings.xml b/res/values-zh-rHK/strings.xml
index b0334ec..f7fe9dc 100644
--- a/res/values-zh-rHK/strings.xml
+++ b/res/values-zh-rHK/strings.xml
@@ -482,8 +482,7 @@
<string name="setup_lock_settings_picker_title" product="tablet" msgid="90329443364067215">"保護您的平板電腦"</string>
<string name="setup_lock_settings_picker_title" product="device" msgid="2399952075134938929">"保護您的裝置"</string>
<string name="setup_lock_settings_picker_title" product="default" msgid="1572244299605153324">"保護您的手機"</string>
- <!-- no translation found for lock_settings_picker_fingerprint_added_security_message (5008939545428518367) -->
- <skip />
+ <string name="lock_settings_picker_fingerprint_added_security_message" msgid="5008939545428518367">"為提升安全性,請設定後備螢幕鎖定方式"</string>
<string name="setup_lock_settings_picker_message" product="tablet" msgid="8919671129189936210">"只要啟用裝置保護功能,即可阻止他人在未經您准許下使用此平板電腦。請選擇您想使用的螢幕鎖定功能。"</string>
<string name="setup_lock_settings_picker_message" product="device" msgid="3787276514406353777">"只要啟用裝置保護功能,即可阻止他人在未經您准許下使用此裝置。請選擇您想使用的螢幕鎖定功能。"</string>
<string name="setup_lock_settings_picker_message" product="default" msgid="3692856437543730446">"只要啟用裝置保護功能,即可阻止他人在未經您准許下使用此手機。請選擇您想使用的螢幕鎖定功能。"</string>
@@ -924,8 +923,7 @@
<string name="wifi_hotspot_configure_ap_text" msgid="5478614731464220432">"Wi‑Fi 熱點設定"</string>
<string name="wifi_hotspot_configure_ap_text_summary" msgid="5560680057727007011">"AndroidAP WPA2 PSK 熱點"</string>
<string name="wifi_tether_configure_ssid_default" msgid="8467525402622138547">"Android 熱點"</string>
- <!-- no translation found for wifi_tether_disabled_by_airplane (414480185654767932) -->
- <skip />
+ <string name="wifi_tether_disabled_by_airplane" msgid="414480185654767932">"由於飛行模式已開啟,因此無法使用"</string>
<string name="wifi_calling_settings_title" msgid="4102921303993404577">"Wi-Fi 通話"</string>
<string name="wifi_calling_suggestion_title" msgid="7766895085362824508">"透過 Wi-Fi 擴大通話覆蓋範圍"</string>
<string name="wifi_calling_suggestion_summary" msgid="6460250990899143406">"開啟 Wi-Fi 通話功能"</string>
@@ -1492,17 +1490,13 @@
<string name="settings_safetylegal_activity_title" msgid="6901214628496951727">"安全資訊"</string>
<string name="settings_safetylegal_activity_unreachable" msgid="142307697309858185">"您沒有數據連線,如要立即查看這項資訊,請使用任何已連接互聯網的電腦前往 %s。"</string>
<string name="settings_safetylegal_activity_loading" msgid="8059022597639516348">"載入中…"</string>
- <!-- no translation found for lockpassword_choose_your_screen_lock_header (2942199737559900752) -->
- <skip />
- <!-- no translation found for lockpassword_choose_your_password_message (5377842480961577542) -->
- <skip />
+ <string name="lockpassword_choose_your_screen_lock_header" msgid="2942199737559900752">"設定螢幕鎖定"</string>
+ <string name="lockpassword_choose_your_password_message" msgid="5377842480961577542">"為安全起見,請設定密碼"</string>
<string name="lockpassword_choose_your_password_header_for_fingerprint" msgid="6624409510609085450">"如要使用指紋,請設定密碼"</string>
<string name="lockpassword_choose_your_pattern_header_for_fingerprint" msgid="5901096361617543819">"如要使用指紋,請設定上鎖圖案"</string>
- <!-- no translation found for lockpassword_choose_your_pin_message (6658264750811929338) -->
- <skip />
+ <string name="lockpassword_choose_your_pin_message" msgid="6658264750811929338">"為安全起見,請設定 PIN"</string>
<string name="lockpassword_choose_your_pin_header_for_fingerprint" msgid="765344692615917183">"如要使用指紋,請設定 PIN"</string>
- <!-- no translation found for lockpassword_choose_your_pattern_message (8631545254345759087) -->
- <skip />
+ <string name="lockpassword_choose_your_pattern_message" msgid="8631545254345759087">"為安全起見,請設定圖案"</string>
<string name="lockpassword_confirm_your_password_header" msgid="1266027268220850931">"請重新輸入密碼"</string>
<string name="lockpassword_confirm_your_pattern_header" msgid="7543433733032330821">"確認圖形"</string>
<string name="lockpassword_confirm_your_pin_header" msgid="7744513791910572550">"請重新輸入 PIN"</string>
@@ -3367,6 +3361,10 @@
<string name="usb_use_MIDI_desc" msgid="8473936990076693175">"在 MIDI 模式下使用此裝置"</string>
<string name="usb_use" msgid="3372728031108932425">"使用 USB 於"</string>
<string name="usb_use_also" msgid="557340935190819370">"使用 USB 時同時開啟以下模式"</string>
+ <!-- no translation found for usb_default_label (4217189967858707974) -->
+ <skip />
+ <!-- no translation found for usb_default_info (8864535445796200695) -->
+ <skip />
<string name="usb_pref" msgid="1400617804525116158">"USB"</string>
<string name="usb_summary_charging_only" msgid="7544327009143659751">"為此裝置充電"</string>
<string name="usb_summary_power_only" msgid="1996391096369798526">"正在為連接的裝置充電"</string>
diff --git a/res/values-zh-rTW/arrays.xml b/res/values-zh-rTW/arrays.xml
index a54945e..831218d 100644
--- a/res/values-zh-rTW/arrays.xml
+++ b/res/values-zh-rTW/arrays.xml
@@ -497,4 +497,7 @@
<item msgid="8745603368609022803">"視為計量付費"</item>
<item msgid="2266114985518865625">"視為非計量付費"</item>
</string-array>
+ <!-- no translation found for dark_ui_mode_entries:0 (146804192658443142) -->
+ <!-- no translation found for dark_ui_mode_entries:1 (6620560879508595181) -->
+ <!-- no translation found for dark_ui_mode_entries:2 (6385301106124765323) -->
</resources>
diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml
index 7a510dd..e8200f4 100644
--- a/res/values-zh-rTW/strings.xml
+++ b/res/values-zh-rTW/strings.xml
@@ -482,8 +482,7 @@
<string name="setup_lock_settings_picker_title" product="tablet" msgid="90329443364067215">"保護你的平板電腦"</string>
<string name="setup_lock_settings_picker_title" product="device" msgid="2399952075134938929">"保護你的裝置"</string>
<string name="setup_lock_settings_picker_title" product="default" msgid="1572244299605153324">"保護你的手機"</string>
- <!-- no translation found for lock_settings_picker_fingerprint_added_security_message (5008939545428518367) -->
- <skip />
+ <string name="lock_settings_picker_fingerprint_added_security_message" msgid="5008939545428518367">"為了進一步提升安全性,請設定備用的螢幕鎖定方式"</string>
<string name="setup_lock_settings_picker_message" product="tablet" msgid="8919671129189936210">"只要啟用裝置保護功能,即可防止他人在未獲你授權的情況下使用這台平板電腦。請選擇你要使用的螢幕鎖定方式。"</string>
<string name="setup_lock_settings_picker_message" product="device" msgid="3787276514406353777">"只要啟用裝置保護功能,即可防止他人在未獲你授權的情況下使用這個裝置。請選擇你要使用的螢幕鎖定方式。"</string>
<string name="setup_lock_settings_picker_message" product="default" msgid="3692856437543730446">"只要啟用裝置保護功能,即可防止他人在未獲你授權的情況下使用這支手機。請選擇你要使用的螢幕鎖定方式。"</string>
@@ -708,6 +707,10 @@
<string name="bluetooth_dock_settings_remember" msgid="5551459057010609115">"記住設定"</string>
<string name="bluetooth_max_connected_audio_devices_string" msgid="6752690395207847881">"已連線藍牙音訊裝置的數量上限"</string>
<string name="bluetooth_max_connected_audio_devices_dialog_title" msgid="5936561749790095473">"選取已連線藍牙音訊裝置的數量上限"</string>
+ <!-- no translation found for bluetooth_enable_avdtp_delay_reports (5101903170688399944) -->
+ <skip />
+ <!-- no translation found for bluetooth_enable_avdtp_delay_reports_summary (7052797876020616399) -->
+ <skip />
<string name="wifi_display_settings_title" msgid="8740852850033480136">"投放"</string>
<string name="wifi_display_enable_menu_item" msgid="4883036464138167674">"啟用無線螢幕分享"</string>
<string name="wifi_display_no_devices_found" msgid="1382012407154143453">"找不到附近的裝置。"</string>
@@ -924,8 +927,7 @@
<string name="wifi_hotspot_configure_ap_text" msgid="5478614731464220432">"Wi‑Fi 無線基地台設定"</string>
<string name="wifi_hotspot_configure_ap_text_summary" msgid="5560680057727007011">"AndroidAP WPA2 PSK 無線基地台"</string>
<string name="wifi_tether_configure_ssid_default" msgid="8467525402622138547">"Android 無線基地台"</string>
- <!-- no translation found for wifi_tether_disabled_by_airplane (414480185654767932) -->
- <skip />
+ <string name="wifi_tether_disabled_by_airplane" msgid="414480185654767932">"已開啟飛航模式,因此無法使用"</string>
<string name="wifi_calling_settings_title" msgid="4102921303993404577">"Wi-Fi 通話"</string>
<string name="wifi_calling_suggestion_title" msgid="7766895085362824508">"透過 Wi‑Fi 擴大通話涵蓋範圍"</string>
<string name="wifi_calling_suggestion_summary" msgid="6460250990899143406">"開啟 Wi-Fi 通話功能"</string>
@@ -1491,17 +1493,13 @@
<string name="settings_safetylegal_activity_title" msgid="6901214628496951727">"安全資訊"</string>
<string name="settings_safetylegal_activity_unreachable" msgid="142307697309858185">"你沒有數據連線,如要立即查看這項資訊,請使用任何已連上網際網路的電腦前往 %s。"</string>
<string name="settings_safetylegal_activity_loading" msgid="8059022597639516348">"載入中…"</string>
- <!-- no translation found for lockpassword_choose_your_screen_lock_header (2942199737559900752) -->
- <skip />
- <!-- no translation found for lockpassword_choose_your_password_message (5377842480961577542) -->
- <skip />
+ <string name="lockpassword_choose_your_screen_lock_header" msgid="2942199737559900752">"設定螢幕鎖定"</string>
+ <string name="lockpassword_choose_your_password_message" msgid="5377842480961577542">"為了安全起見,請設定密碼"</string>
<string name="lockpassword_choose_your_password_header_for_fingerprint" msgid="6624409510609085450">"如要使用指紋,請設定密碼"</string>
<string name="lockpassword_choose_your_pattern_header_for_fingerprint" msgid="5901096361617543819">"如要使用指紋,請設定解鎖圖案"</string>
- <!-- no translation found for lockpassword_choose_your_pin_message (6658264750811929338) -->
- <skip />
+ <string name="lockpassword_choose_your_pin_message" msgid="6658264750811929338">"為了安全起見,請設定 PIN 碼"</string>
<string name="lockpassword_choose_your_pin_header_for_fingerprint" msgid="765344692615917183">"如要使用指紋,請設定 PIN 碼"</string>
- <!-- no translation found for lockpassword_choose_your_pattern_message (8631545254345759087) -->
- <skip />
+ <string name="lockpassword_choose_your_pattern_message" msgid="8631545254345759087">"為了安全起見,請設定解鎖圖案"</string>
<string name="lockpassword_confirm_your_password_header" msgid="1266027268220850931">"請重新輸入你的密碼"</string>
<string name="lockpassword_confirm_your_pattern_header" msgid="7543433733032330821">"確認圖案"</string>
<string name="lockpassword_confirm_your_pin_header" msgid="7744513791910572550">"請重新輸入你的 PIN 碼"</string>
@@ -1886,8 +1884,10 @@
<string name="accessibility_service_master_switch_title" msgid="6835441300276358239">"使用服務"</string>
<string name="accessibility_daltonizer_master_switch_title" msgid="8655284637968823154">"使用色彩校正"</string>
<string name="accessibility_caption_master_switch_title" msgid="4010227386676077826">"使用字幕"</string>
- <string name="accessibility_summary_state_enabled" msgid="8359913912320966304">"開啟"</string>
- <string name="accessibility_summary_state_disabled" msgid="2241315620132005595">"關閉"</string>
+ <!-- no translation found for accessibility_summary_state_enabled (7914278500885887763) -->
+ <skip />
+ <!-- no translation found for accessibility_summary_state_disabled (2984230257590246745) -->
+ <skip />
<string name="enable_quick_setting" msgid="2366999897816894536">"在快速設定中顯示"</string>
<string name="daltonizer_type" msgid="1124178250809091080">"校正模式"</string>
<plurals name="accessibilty_autoclick_preference_subtitle_extremely_short_delay" formatted="false" msgid="7340347830562315800">
@@ -2898,6 +2898,8 @@
<string name="keywords_model_and_hardware" msgid="1459248377212829642">"序號、硬體版本"</string>
<string name="keywords_android_version" msgid="9069747153590902819">"Android 安全性修補程式等級、基頻版本、核心版本"</string>
<string name="keywords_ambient_display_screen" msgid="5874969496073249362">"微光螢幕, 螢幕鎖定畫面"</string>
+ <!-- no translation found for keywords_fingerprint_settings (239222512315619538) -->
+ <skip />
<string name="setup_wifi_nfc_tag" msgid="9028353016222911016">"設定 Wi-Fi NFC 標記"</string>
<string name="write_tag" msgid="8571858602896222537">"寫入"</string>
<string name="status_awaiting_tap" msgid="2130145523773160617">"輕觸標記即可寫入..."</string>
@@ -3180,7 +3182,8 @@
<string name="zen_mode_summary_alarms_only_by_time" msgid="7465525754879341907">"變更為僅允許鬧鐘模式,結束時間為 <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_summary_always" msgid="6172985102689237703">"變更為一律允許干擾模式"</string>
<string name="zen_mode_screen_on" msgid="8774571998575673502">"螢幕開啟時"</string>
- <string name="zen_mode_screen_on_summary" msgid="5385338884695802115">"允許「零打擾」模式設為靜音的通知在畫面上彈出通知"</string>
+ <!-- no translation found for zen_mode_screen_on_summary (2208664848367443505) -->
+ <skip />
<string name="zen_mode_screen_off" msgid="3144446765110327937">"螢幕關閉時"</string>
<string name="zen_mode_screen_off_summary" msgid="7430034620565812258">"允許「零打擾」模式設為靜音的通知開啟螢幕及閃爍燈光"</string>
<string name="zen_mode_screen_off_summary_no_led" msgid="2826121465026642017">"允許「零打擾」模式設為靜音的通知開啟螢幕"</string>
@@ -3358,7 +3361,7 @@
<string name="usb_use_charging_only" msgid="2180443097365214467">"為這個裝置充電"</string>
<string name="usb_use_charging_only_desc" msgid="3066256793008540627">"僅為這個裝置充電"</string>
<string name="usb_use_power_only" msgid="6449381364444187612">"正在為連接的裝置充電"</string>
- <string name="usb_use_power_only_desc" msgid="5674490059427055197">"開啟後無法使用其他設定"</string>
+ <string name="usb_use_power_only_desc" msgid="5674490059427055197">"開啟後停用其他設定"</string>
<string name="usb_use_file_transfers" msgid="1223134119354320726">"檔案傳輸"</string>
<string name="usb_use_file_transfers_desc" msgid="4235764784331804488">"將檔案轉移到另一個裝置"</string>
<string name="usb_use_photo_transfers" msgid="8192719651229326283">"PTP"</string>
@@ -3368,6 +3371,10 @@
<string name="usb_use_MIDI_desc" msgid="8473936990076693175">"將這個裝置用做 MIDI"</string>
<string name="usb_use" msgid="3372728031108932425">"USB 用途"</string>
<string name="usb_use_also" msgid="557340935190819370">"使用 USB 時一併開啟以下模式"</string>
+ <!-- no translation found for usb_default_label (4217189967858707974) -->
+ <skip />
+ <!-- no translation found for usb_default_info (8864535445796200695) -->
+ <skip />
<string name="usb_pref" msgid="1400617804525116158">"USB"</string>
<string name="usb_summary_charging_only" msgid="7544327009143659751">"為這個裝置充電"</string>
<string name="usb_summary_power_only" msgid="1996391096369798526">"正在為連接的裝置充電"</string>
@@ -3378,7 +3385,7 @@
<string name="usb_summary_file_transfers_power" msgid="7700800611455849806">"檔案傳輸和供電"</string>
<string name="usb_summary_tether_power" msgid="5825335393952752238">"USB 數據連線和供電"</string>
<string name="usb_summary_photo_transfers_power" msgid="6826058111908423069">"PTP 和供電"</string>
- <string name="usb_summary_MIDI_power" msgid="3308250484012677596">"MIDI 和供電"</string>
+ <string name="usb_summary_MIDI_power" msgid="3308250484012677596">"MIDI 模式和供電"</string>
<string name="background_check_pref" msgid="7550258400138010979">"背景檢查"</string>
<string name="background_check_title" msgid="4534254315824525593">"完整背景存取權"</string>
<string name="assist_access_context_title" msgid="2269032346698890257">"使用畫面中的文字"</string>
@@ -3488,8 +3495,10 @@
<string name="memory_summary" msgid="8080825904671961872">"平均記憶體用量為 <xliff:g id="USED_MEMORY">%1$s</xliff:g> (共 <xliff:g id="TOTAL_MEMORY">%2$s</xliff:g>)"</string>
<string name="users_summary" msgid="1674864467098487328">"登入身分:<xliff:g id="USER_NAME">%1$s</xliff:g>"</string>
<string name="payment_summary" msgid="3472482669588561110">"預設使用「<xliff:g id="APP_NAME">%1$s</xliff:g>」"</string>
- <string name="location_on_summary" msgid="4083334422422067511">"開啟"</string>
- <string name="location_off_summary" msgid="6474350053215707957">"關閉"</string>
+ <!-- no translation found for location_on_summary (3637699010986988970) -->
+ <skip />
+ <!-- no translation found for location_off_summary (7217264690673949107) -->
+ <skip />
<string name="backup_disabled" msgid="485189128759595412">"備份功能已停用"</string>
<string name="android_version_summary" msgid="2935995161657697278">"已更新至 Android <xliff:g id="VERSION">%1$s</xliff:g>"</string>
<string name="android_version_pending_update_summary" msgid="487831391976523090">"有可用的更新"</string>
@@ -3663,9 +3672,13 @@
<string name="bluetooth_connected_summary" msgid="7672528674593152862">"已連線到「<xliff:g id="ID_1">%1$s</xliff:g>」"</string>
<string name="bluetooth_connected_multiple_devices_summary" msgid="9173661896296663932">"已連線到多個裝置"</string>
<string name="demo_mode" msgid="2798762752209330277">"系統 UI 示範模式"</string>
+ <!-- no translation found for dark_ui_mode (2112241426441807273) -->
+ <skip />
+ <!-- no translation found for dark_ui_mode_title (975299966259850992) -->
+ <skip />
<string name="quick_settings_developer_tiles" msgid="5947788063262762448">"快速設定開發人員圖塊"</string>
- <string name="window_trace_quick_settings_title" msgid="3839917000546526898">"視窗追蹤"</string>
- <string name="layer_trace_quick_settings_title" msgid="876797401275734018">"Surface 追蹤"</string>
+ <!-- no translation found for winscope_trace_quick_settings_title (1294290008255732032) -->
+ <skip />
<string name="support_country_format" msgid="4502523713489559595">"<xliff:g id="COUNTRY">%1$s</xliff:g> - <xliff:g id="LANGUAGE">%2$s</xliff:g>"</string>
<string name="managed_profile_settings_title" msgid="2729481936758125054">"Work 設定檔設定"</string>
<string name="managed_profile_contact_search_title" msgid="6034734926815544221">"聯絡人搜尋"</string>
diff --git a/res/values-zu/strings.xml b/res/values-zu/strings.xml
index 3b014ab..cd05e61 100644
--- a/res/values-zu/strings.xml
+++ b/res/values-zu/strings.xml
@@ -3359,6 +3359,10 @@
<string name="usb_use_MIDI_desc" msgid="8473936990076693175">"Sebenzisa le divayisi njenge-MIDI"</string>
<string name="usb_use" msgid="3372728031108932425">"Sebenzisela i-USB i-"</string>
<string name="usb_use_also" msgid="557340935190819370">"Phinda usebenzise i-USB ku-"</string>
+ <!-- no translation found for usb_default_label (4217189967858707974) -->
+ <skip />
+ <!-- no translation found for usb_default_info (8864535445796200695) -->
+ <skip />
<string name="usb_pref" msgid="1400617804525116158">"I-USB"</string>
<string name="usb_summary_charging_only" msgid="7544327009143659751">"Ishaja le divayisi"</string>
<string name="usb_summary_power_only" msgid="1996391096369798526">"Ishaja idivayisi exhunyiwe"</string>
diff --git a/res/values/arrays.xml b/res/values/arrays.xml
index cb6f9be..e326dbe 100644
--- a/res/values/arrays.xml
+++ b/res/values/arrays.xml
@@ -313,7 +313,8 @@
<!-- Bluetooth developer settings: Titles for maximum number of connected audio devices -->
<string-array name="bluetooth_max_connected_audio_devices">
- <item>1 (Default)</item>
+ <item>Use System Default: <xliff:g id="default_bluetooth_max_connected_audio_devices">%1$d</xliff:g></item>
+ <item>1</item>
<item>2</item>
<item>3</item>
<item>4</item>
@@ -321,7 +322,8 @@
</string-array>
<!-- Bluetooth developer settings: Values for maximum number of connected audio devices -->
- <string-array name="bluetooth_max_connected_audio_devices_values">
+ <string-array translatable="false" name="bluetooth_max_connected_audio_devices_values">
+ <item></item>
<item>1</item>
<item>2</item>
<item>3</item>
@@ -1079,4 +1081,18 @@
<item>2</item>
</string-array>
+ <!-- Titles for ui dark mode preference. -->
+ <string-array name="dark_ui_mode_entries" >
+ <item>Automatic (based on time of day)</item>
+ <item>Always on</item>
+ <item>Always off</item>
+ </string-array>
+
+ <!-- Values for ui dark mode preference. -->
+ <string-array name="dark_ui_mode_values" translatable="false" >
+ <item>auto</item>
+ <item>yes</item>
+ <item>no</item>
+ </string-array>
+
</resources>
diff --git a/res/values/bools.xml b/res/values/bools.xml
index f20b93c..4665f2e 100644
--- a/res/values/bools.xml
+++ b/res/values/bools.xml
@@ -150,15 +150,6 @@
<!-- Whether default_home should be shown or not. -->
<bool name="config_show_default_home">true</bool>
- <!-- Whether color correction preference should be shown or not. -->
- <bool name="config_show_color_correction_preference">true</bool>
-
- <!-- Whether color inversion preference should be shown or not. -->
- <bool name="config_show_color_inversion_preference">true</bool>
-
- <!-- Whether accessibility shortcut preference should be shown or not. -->
- <bool name="config_show_accessibility_shortcut_preference">true</bool>
-
<!-- Whether assist_and_voice_input should be shown or not. -->
<bool name="config_show_assist_and_voice_input">true</bool>
diff --git a/res/values/colors.xml b/res/values/colors.xml
index 3d86208..38ab893 100644
--- a/res/values/colors.xml
+++ b/res/values/colors.xml
@@ -94,9 +94,6 @@
<color name="message_icon_background_outgoing">#4285f4</color>
<color name="message_icon_text_outgoing">#ffffffff</color>
- <color name="importance_disabled_slider_color">@*android:color/material_grey_300</color>
- <color name="importance_secondary_slider_color">#858383</color>
-
<color name="usage_graph_dots">#B0BEC5</color>
<!-- Gestures settings -->
diff --git a/res/values/config.xml b/res/values/config.xml
index ce61164..ec611f0 100755
--- a/res/values/config.xml
+++ b/res/values/config.xml
@@ -122,4 +122,10 @@
<!-- Whether or not new device intro suggestion is supported for this device -->
<bool name="config_new_device_intro_suggestion_supported">false</bool>
+
+ <!-- Whether to use a UI variant that minimizes the number of UI elements on screen. This is
+ typically used when there is not enough space to display everything, because pattern view
+ doesn't interact well with scroll view -->
+ <bool name="config_lock_pattern_minimal_ui">true</bool>
+
</resources>
diff --git a/res/values/ids.xml b/res/values/ids.xml
index 66af163..76322ff 100644
--- a/res/values/ids.xml
+++ b/res/values/ids.xml
@@ -18,6 +18,8 @@
-->
<resources>
<item type="id" name="preference_highlighted" />
+ <item type="id" name="job_anomaly_clean_up" />
+ <item type="id" name="job_anomaly_detection" />
<item type="id" name="lock_none" />
<item type="id" name="lock_pin" />
diff --git a/res/values/strings.xml b/res/values/strings.xml
index de9b8e8..ae89890 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -1655,10 +1655,15 @@
<!-- Bluetooth settings. Dock Setting Dialog - Remember setting and don't ask user again -->
<string name="bluetooth_dock_settings_remember">Remember settings</string>
+ <!-- Bluetooth developer options. -->
<!-- Bluetooth developer settings: Maximum number of connected audio devices -->
<string name="bluetooth_max_connected_audio_devices_string">Maximum connected Bluetooth audio devices</string>
<!-- Bluetooth developer settings: Maximum number of connected audio devices -->
<string name="bluetooth_max_connected_audio_devices_dialog_title">Select maximum number of connected Bluetooth audio devices</string>
+ <!-- Bluetooth developer settings: Checkbox title for enabling Bluetooth receiving AVDTP delay reports -->
+ <string name="bluetooth_enable_avdtp_delay_reports">Enable Bluetooth AVDTP delay reports</string>
+ <!-- Bluetooth developer settings: Summary of checkbox for enabling Bluetooth receiving AVDTP delay reports -->
+ <string name="bluetooth_enable_avdtp_delay_reports_summary">Allow receiving Bluetooth AVDTP delay reports</string>
<!-- Wifi Display settings. The title of the screen. [CHAR LIMIT=40] -->
<string name="wifi_display_settings_title">Cast</string>
@@ -3366,6 +3371,8 @@
<string name="location_app_level_permissions">App-level permissions</string>
<!-- [CHAR LIMIT=42] Location settings screen, sub category for recent location requests -->
<string name="location_category_recent_location_requests">Recent location requests</string>
+ <!-- Location settings screen, displayed when there're more than three recent location requests -->
+ <string name="location_recent_location_requests_see_all">See all</string>
<!-- Location settings screen, displayed when there's no recent app accessing location -->
<string name="location_no_recent_apps">No apps have requested location recently</string>
<!-- [CHAR LIMIT=30] Location settings screen, sub category for location services -->
@@ -4409,10 +4416,10 @@
<!-- Used in the Captions settings screen to control turning on/off the feature entirely -->
<string name="accessibility_caption_master_switch_title">Use captions</string>
- <!-- Preference's state when enabled. Note: UPPERCASE -->
- <string name="accessibility_summary_state_enabled">ON</string>
- <!-- Preference's state when disabled. Note: UPPERCASE -->
- <string name="accessibility_summary_state_disabled">OFF</string>
+ <!-- Preference's state when enabled. -->
+ <string name="accessibility_summary_state_enabled">On</string>
+ <!-- Preference's state when disabled. -->
+ <string name="accessibility_summary_state_disabled">Off</string>
<!-- Title for the preference to show a tile for a particular feature in the Quick Settings pane. [CHAR LIMIT=NONE] -->
<string name="enable_quick_setting">Show in Quick Settings</string>
@@ -5405,7 +5412,7 @@
<string name="usage_access_title">Apps with usage access</string>
<!-- Sound settings screen, setting check box label -->
- <string name="emergency_tone_title">Emergency tone</string>
+ <string name="emergency_tone_title">Emergency dialing signal</string>
<!-- Sound settings screen, setting option summary text -->
<string name="emergency_tone_summary">Set behavior when an emergency call is placed</string>
@@ -6758,6 +6765,8 @@
<string name="keywords_android_version">android security patch level, baseband version, kernel version</string>
<!-- Search keyword for Ambient display settings screen. -->
<string name="keywords_ambient_display_screen">Ambient display, Lock screen display</string>
+ <!-- Search keyword for fingerprint settings. -->
+ <string name="keywords_fingerprint_settings">fingerprint</string>
<!-- NFC Wi-Fi pairing/setup strings-->
@@ -6861,14 +6870,14 @@
<!-- Sound: Other sounds: Value for the dock audio media with value 1: enabled. [CHAR LIMIT=30] -->
<string name="dock_audio_media_enabled">Media audio only</string>
- <!-- Sound: Other sounds: Value for the emergency tone option with value 0: silent. [CHAR LIMIT=30] -->
- <string name="emergency_tone_silent">Silent</string>
+ <!-- Sound: Other sounds: Value for the emergency dialing signal option with value 0: silence. [CHAR LIMIT=30] -->
+ <string name="emergency_tone_silent">Silence</string>
- <!-- Sound: Other sounds: Value for the emergency tone option with value 1: alert. [CHAR LIMIT=30] -->
- <string name="emergency_tone_alert">Alert</string>
+ <!-- Sound: Other sounds: Value for the emergency dialing signal option with value 1: tones. [CHAR LIMIT=30] -->
+ <string name="emergency_tone_alert">Tones</string>
- <!-- Sound: Other sounds: Value for the emergency tone option with value 2: vibrate. [CHAR LIMIT=30] -->
- <string name="emergency_tone_vibrate">Vibrate</string>
+ <!-- Sound: Other sounds: Value for the emergency dialing signal option with value 2: vibrations. [CHAR LIMIT=30] -->
+ <string name="emergency_tone_vibrate">Vibrations</string>
<!-- Sound: Other sounds: Title for the option enabling boot sounds. [CHAR LIMIT=30] -->
<string name="boot_sounds_title">Power on sounds</string>
@@ -7592,7 +7601,7 @@
<!-- [CHAR LIMIT=40] Zen mode settings: visual signals: screen is on: title -->
<string name="zen_mode_screen_on">When the screen is on</string>
<!-- [CHAR LIMIT=130] Zen mode settings: visual signals: screen is on: summary -->
- <string name="zen_mode_screen_on_summary">Let notifications silenced by Do Not Disturb pop on screen</string>
+ <string name="zen_mode_screen_on_summary">Let notifications silenced by Do Not Disturb pop on screen and show a status bar icon</string>
<!-- [CHAR LIMIT=40] Zen mode settings: visual signals: screen is off: title -->
<string name="zen_mode_screen_off">When the screen is off</string>
<!-- [CHAR LIMIT=130] Zen mode settings: visual interruptions: screen is off: summary -->
@@ -8096,6 +8105,10 @@
for this device should be used for. These options are less commonly used.
Choices are usb_use_tethering, usb_use_photo_transfers, usb_use_MIDI, and usb_use_power_only.-->
<string name="usb_use_also">Also use USB for</string>
+ <!-- The label that leads to the Default USB configuration window. -->
+ <string name="usb_default_label">Default USB Configuration</string>
+ <!-- Description at the footer of the default USB configuration window that describes how the setting works. -->
+ <string name="usb_default_info">When another device is connected and your phone is unlocked, these settings will be applied. Only connect to trusted devices.</string>
<!-- Settings item title for USB preference [CHAR LIMIT=35] -->
<string name="usb_pref">USB</string>
@@ -8406,10 +8419,10 @@
<string name="payment_summary"><xliff:g id="app_name" example="Payment App">%1$s</xliff:g> is default</string>
<!-- Summary of location on screen [CHAR LIMIT=NONE] -->
- <string name="location_on_summary">ON</string>
+ <string name="location_on_summary">On</string>
<!-- Location off [CHAR LIMIT=NONE] -->
- <string name="location_off_summary">OFF</string>
+ <string name="location_off_summary">Off</string>
<!-- Backup disabled summary [CHAR LIMIT=NONE] -->
<string name="backup_disabled">Back up disabled</string>
@@ -8878,14 +8891,17 @@
<!-- [CHAR LIMIT=60] Name of dev option called "System UI demo mode" -->
<string name="demo_mode">System UI demo mode</string>
+ <!-- [CHAR LIMIT=60] Name of dev option that changes the UI Mode -->
+ <string name="dark_ui_mode">Night mode</string>
+
+ <!-- [CHAR LIMIT=60] Name of dev option that changes the color of the UI -->
+ <string name="dark_ui_mode_title">Set Night mode</string>
+
<!-- [CHAR LIMIT=60] Name of dev option to enable extra quick settings tiles -->
<string name="quick_settings_developer_tiles">Quick settings developer tiles</string>
- <!-- [CHAR LIMIT=25] Title of developer tile to toggle window trace -->
- <string name="window_trace_quick_settings_title">Window Trace</string>
-
- <!-- [CHAR LIMIT=25] Title of developer tile to toggle layer trace -->
- <string name="layer_trace_quick_settings_title">Surface Trace</string>
+ <!-- [CHAR LIMIT=25] Title of developer tile to toggle winscope trace -->
+ <string name="winscope_trace_quick_settings_title">Winscope Trace</string>
<!-- Template for formatting country and language. eg Canada - French [CHAR LIMIT=NONE]-->
<string name="support_country_format"><xliff:g id="country" example="Canada">%1$s</xliff:g> - <xliff:g id="language" example="French">%2$s</xliff:g></string>
diff --git a/res/values/styles.xml b/res/values/styles.xml
index b436355..86375fa 100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -457,11 +457,6 @@
<item name="*android:successColor">@color/setup_lock_pattern_view_success_color_light</item>
</style>
- <!-- Overridden in sw400dp -->
- <style name="LockPatternIconStyle" parent="SuwGlifIcon">
- <item name="android:visibility">gone</item>
- </style>
-
<style name="SuggestionConditionStyle">
<item name="android:background">@color/suggestion_condition_background</item>
</style>
diff --git a/res/xml/accessibility_vibration_settings.xml b/res/xml/accessibility_vibration_settings.xml
index 17468ea..d24834a 100644
--- a/res/xml/accessibility_vibration_settings.xml
+++ b/res/xml/accessibility_vibration_settings.xml
@@ -16,8 +16,7 @@
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
android:key="accessibility_settings_vibration_screen"
- android:title="@string/accessibility_vibration_settings_title"
- android:persistent="true">
+ android:title="@string/accessibility_vibration_settings_title">
<Preference
android:fragment="com.android.settings.accessibility.NotificationVibrationPreferenceFragment"
diff --git a/res/xml/app_and_notification.xml b/res/xml/app_and_notification.xml
index 3548efb..9fc29c3 100644
--- a/res/xml/app_and_notification.xml
+++ b/res/xml/app_and_notification.xml
@@ -20,7 +20,7 @@
xmlns:settings="http://schemas.android.com/apk/res-auto"
android:key="apps_and_notification_screen"
android:title="@string/app_and_notification_dashboard_title"
- settings:initialExpandedChildrenCount="6">
+ settings:initialExpandedChildrenCount="8">
<PreferenceCategory
android:key="recent_apps_category"
@@ -46,18 +46,20 @@
android:key="all_app_info_divider"
android:order="-190"/>
- <Preference
- android:key="manage_perms"
- android:title="@string/app_permissions"
- android:order="-130"
- settings:keywords="@string/keywords_app_permissions">
- <intent android:action="android.intent.action.MANAGE_PERMISSIONS" />
- </Preference>
-
+ <!-- Notifications (appears before manage_perms), default apps (appears after) -->
<PreferenceCategory
android:key="dashboard_tile_placeholder"
android:order="10" />
+ <Preference
+ android:key="manage_perms"
+ android:title="@string/app_permissions"
+ android:order="12"
+ settings:keywords="@string/keywords_app_permissions"
+ settings:controller="com.android.settings.applications.AppPermissionsPreferenceController">
+ <intent android:action="android.intent.action.MANAGE_PERMISSIONS" />
+ </Preference>
+
<com.android.settingslib.RestrictedPreference
android:key="app_and_notif_cell_broadcast_settings"
android:title="@string/cell_broadcast_settings"
@@ -75,4 +77,4 @@
android:title="@string/special_access"
android:order="20" />
-</PreferenceScreen>
\ No newline at end of file
+</PreferenceScreen>
diff --git a/res/xml/connected_devices_advanced.xml b/res/xml/connected_devices_advanced.xml
index a5d48fd..36eab22 100644
--- a/res/xml/connected_devices_advanced.xml
+++ b/res/xml/connected_devices_advanced.xml
@@ -50,7 +50,7 @@
settings:controller="com.android.settings.connecteddevice.BluetoothOnWhileDrivingPreferenceController"
android:order="-2"/>
- <Preference
+ <com.android.settingslib.RestrictedPreference
android:key="connected_device_printing"
android:title="@string/print_settings"
android:summary="@string/summary_placeholder"
diff --git a/res/xml/connected_devices_old.xml b/res/xml/connected_devices_old.xml
deleted file mode 100644
index 1b69fe1..0000000
--- a/res/xml/connected_devices_old.xml
+++ /dev/null
@@ -1,56 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<PreferenceScreen
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:key="connected_devices_screen"
- android:title="@string/connected_devices_dashboard_title">
-
- <com.android.settings.widget.MasterSwitchPreference
- android:key="toggle_bluetooth"
- android:title="@string/bluetooth_settings_title"
- android:icon="@drawable/ic_settings_bluetooth"
- android:order="-7"/>
-
- <SwitchPreference
- android:key="toggle_nfc"
- android:title="@string/nfc_quick_toggle_title"
- android:icon="@drawable/ic_nfc"
- android:summary="@string/nfc_quick_toggle_summary"
- android:order="-5"/>
-
- <com.android.settingslib.RestrictedPreference
- android:fragment="com.android.settings.nfc.AndroidBeam"
- android:key="android_beam_settings"
- android:title="@string/android_beam_settings_title"
- android:icon="@drawable/ic_android"
- android:order="-4"/>
-
- <Preference
- android:key="usb_mode"
- android:title="@string/usb_pref"
- android:icon="@drawable/ic_usb"
- android:order="-2">
- <intent android:action="android.intent.action.MAIN"
- android:targetPackage="com.android.settings"
- android:targetClass="com.android.settings.connecteddevice.usb.UsbModeChooserActivity"/>
- </Preference>
-
- <PreferenceCategory
- android:key="dashboard_tile_placeholder"
- android:order="50"/>
-
-</PreferenceScreen>
diff --git a/res/xml/development_settings.xml b/res/xml/development_settings.xml
index a88a97b..571f38e 100644
--- a/res/xml/development_settings.xml
+++ b/res/xml/development_settings.xml
@@ -112,6 +112,13 @@
<intent android:action="com.android.settings.action.DEMO_MODE" />
</Preference>
+ <ListPreference
+ android:key="dark_ui_mode"
+ android:title="@string/dark_ui_mode"
+ android:dialogTitle="@string/dark_ui_mode_title"
+ android:entries="@array/dark_ui_mode_entries"
+ android:entryValues="@array/dark_ui_mode_values" />
+
<Preference
android:key="quick_settings_tiles"
android:title="@string/quick_settings_developer_tiles"
@@ -235,12 +242,11 @@
android:title="@string/tethering_hardware_offload"
android:summary="@string/tethering_hardware_offload_summary" />
- <ListPreference
- android:key="select_usb_configuration"
- android:title="@string/select_usb_configuration_title"
- android:dialogTitle="@string/select_usb_configuration_dialog_title"
- android:entries="@array/usb_configuration_titles"
- android:entryValues="@array/usb_configuration_values" />
+ <Preference
+ android:key="default_usb_configuration"
+ android:fragment="com.android.settings.connecteddevice.usb.UsbDefaultFragment"
+ android:icon="@drawable/ic_usb"
+ android:title="@string/usb_default_label"/>
<SwitchPreference
android:key="bluetooth_show_devices_without_names"
@@ -257,6 +263,11 @@
android:title="@string/bluetooth_disable_inband_ringing"
android:summary="@string/bluetooth_disable_inband_ringing_summary" />
+ <SwitchPreference
+ android:key="bluetooth_enable_avdtp_delay_reports"
+ android:title="@string/bluetooth_enable_avdtp_delay_reports"
+ android:summary="@string/bluetooth_enable_avdtp_delay_reports_summary"/>
+
<ListPreference
android:key="bluetooth_select_avrcp_version"
android:title="@string/bluetooth_select_avrcp_version_string"
diff --git a/res/xml/location_recent_requests_see_all.xml b/res/xml/location_recent_requests_see_all.xml
new file mode 100644
index 0000000..38db142
--- /dev/null
+++ b/res/xml/location_recent_requests_see_all.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+
+<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
+ android:title="@string/location_category_recent_location_requests"
+ android:key="recent_location_requests_see_all">
+
+ <PreferenceCategory
+ android:key="all_recent_location_requests"/>
+</PreferenceScreen>
\ No newline at end of file
diff --git a/res/xml/location_settings.xml b/res/xml/location_settings.xml
index c86df68..3f96c58 100644
--- a/res/xml/location_settings.xml
+++ b/res/xml/location_settings.xml
@@ -24,10 +24,18 @@
android:key="recent_location_requests"
android:title="@string/location_category_recent_location_requests"/>
+ <Preference
+ android:key="recent_location_requests_see_all"
+ android:title="@string/location_recent_location_requests_see_all"
+ android:icon="@drawable/ic_chevron_right_24dp"
+ android:selectable="true"
+ android:fragment="com.android.settings.location.RecentLocationRequestSeeAllFragment"/>
+
<!-- This preference category gets removed if new_recent_location_ui is disabled -->
<Preference
android:key="app_level_permissions"
- android:title="@string/location_app_level_permissions">
+ android:title="@string/location_app_level_permissions"
+ settings:allowDividerAbove="true">
<intent android:action="android.intent.action.MANAGE_PERMISSION_APPS">
<extra android:name="android.intent.extra.PERMISSION_NAME"
android:value="android.permission-group.LOCATION" />
diff --git a/res/xml/my_device_info.xml b/res/xml/my_device_info.xml
index dabed8a..8c93f97 100644
--- a/res/xml/my_device_info.xml
+++ b/res/xml/my_device_info.xml
@@ -60,7 +60,8 @@
android:key="legal_container"
android:order="5"
android:title="@string/legal_information"
- android:fragment="com.android.settings.LegalSettings" />
+ android:fragment="com.android.settings.LegalSettings"
+ settings:allowDividerAbove="true"/>
<!-- Regulatory labels -->
<Preference
@@ -76,7 +77,8 @@
android:order="7"
android:title="@string/sim_status_title"
settings:keywords="@string/keywords_sim_status"
- android:summary="@string/summary_placeholder"/>
+ android:summary="@string/summary_placeholder"
+ settings:allowDividerAbove="true"/>
<!-- Model & hardware -->
<Preference
diff --git a/res/xml/power_usage_summary.xml b/res/xml/power_usage_summary.xml
index fbe4e0d..d89653a 100644
--- a/res/xml/power_usage_summary.xml
+++ b/res/xml/power_usage_summary.xml
@@ -36,7 +36,8 @@
<com.android.settings.widget.MasterSwitchPreference
android:fragment="com.android.settings.fuelgauge.batterysaver.BatterySaverSettings"
android:key="battery_saver_summary"
- android:title="@string/battery_saver"/>
+ android:title="@string/battery_saver"
+ settings:controller="com.android.settings.fuelgauge.BatterySaverController"/>
<Preference
android:fragment="com.android.settings.fuelgauge.SmartBatterySettings"
diff --git a/res/xml/security_dashboard_settings.xml b/res/xml/security_dashboard_settings.xml
index 00eaa7e..858cbaf 100644
--- a/res/xml/security_dashboard_settings.xml
+++ b/res/xml/security_dashboard_settings.xml
@@ -53,7 +53,8 @@
<Preference
android:key="fingerprint_settings"
android:title="@string/security_settings_fingerprint_preference_title"
- android:summary="@string/summary_placeholder" />
+ android:summary="@string/summary_placeholder"
+ settings:keywords="@string/keywords_fingerprint_settings"/>
</PreferenceCategory>
diff --git a/res/xml/usb_default_fragment.xml b/res/xml/usb_default_fragment.xml
new file mode 100644
index 0000000..b8d5e53
--- /dev/null
+++ b/res/xml/usb_default_fragment.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+<PreferenceScreen
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:title="@string/usb_pref"
+ android:key="usb_default_fragment">
+</PreferenceScreen>
diff --git a/res/xml/usb_settings.xml b/res/xml/usb_settings.xml
deleted file mode 100644
index 611a1b4..0000000
--- a/res/xml/usb_settings.xml
+++ /dev/null
@@ -1,41 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2011 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
- android:title="@string/storage_title_usb">
-
- <PreferenceCategory
- android:title="@string/usb_connection_category" />
-
- <CheckBoxPreference
- android:key="usb_mtp"
- android:title="@string/usb_mtp_title"
- android:summary="@string/usb_mtp_summary"
- />
-
- <CheckBoxPreference
- android:key="usb_ptp"
- android:title="@string/usb_ptp_title"
- android:summary="@string/usb_ptp_summary"
- />
-
- <CheckBoxPreference
- android:key="usb_midi"
- android:title="@string/usb_midi_title"
- android:summary="@string/usb_midi_summary"
- />
-
-</PreferenceScreen>
diff --git a/src/com/android/settings/ApnPreference.java b/src/com/android/settings/ApnPreference.java
index 9a6eeaf..0111b26 100755
--- a/src/com/android/settings/ApnPreference.java
+++ b/src/com/android/settings/ApnPreference.java
@@ -16,13 +16,11 @@
package com.android.settings;
-import static android.provider.Telephony.Carriers.CONTENT_URI;
-import static android.provider.Telephony.Carriers.FILTERED_URI;
-
import android.content.ContentUris;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
+import android.provider.Telephony;
import android.support.v7.preference.Preference;
import android.support.v7.preference.PreferenceViewHolder;
import android.telephony.SubscriptionManager;
@@ -37,7 +35,6 @@
public class ApnPreference extends Preference implements
CompoundButton.OnCheckedChangeListener, OnClickListener {
final static String TAG = "ApnPreference";
- private boolean mDpcEnforced = false;
private int mSubId = SubscriptionManager.INVALID_SUBSCRIPTION_ID;
@@ -121,8 +118,7 @@
Context context = getContext();
if (context != null) {
int pos = Integer.parseInt(getKey());
- Uri url = ContentUris.withAppendedId(
- mDpcEnforced ? FILTERED_URI : CONTENT_URI, pos);
+ Uri url = ContentUris.withAppendedId(Telephony.Carriers.CONTENT_URI, pos);
Intent editIntent = new Intent(Intent.ACTION_EDIT, url);
editIntent.putExtra(ApnSettings.SUB_ID, mSubId);
context.startActivity(editIntent);
@@ -141,8 +137,4 @@
public void setSubId(int subId) {
mSubId = subId;
}
-
- public void setDpcEnforced(boolean enforced) {
- mDpcEnforced = enforced;
- }
}
diff --git a/src/com/android/settings/ApnSettings.java b/src/com/android/settings/ApnSettings.java
index 2c22a79..d554301 100755
--- a/src/com/android/settings/ApnSettings.java
+++ b/src/com/android/settings/ApnSettings.java
@@ -16,10 +16,6 @@
package com.android.settings;
-import static android.provider.Telephony.Carriers.CONTENT_URI;
-import static android.provider.Telephony.Carriers.ENFORCE_MANAGED_URI;
-import static android.provider.Telephony.Carriers.FILTERED_URI;
-
import android.app.Activity;
import android.app.Dialog;
import android.app.ProgressDialog;
@@ -43,6 +39,7 @@
import android.provider.Telephony;
import android.support.v7.preference.Preference;
import android.support.v7.preference.PreferenceGroup;
+import android.support.v7.preference.PreferenceScreen;
import android.telephony.CarrierConfigManager;
import android.telephony.SubscriptionInfo;
import android.telephony.SubscriptionManager;
@@ -53,6 +50,7 @@
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.MotionEvent;
+import android.widget.TextView;
import android.widget.Toast;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
@@ -248,17 +246,6 @@
return null;
}
- private boolean isDpcApnEnforced() {
- try (Cursor enforceCursor = getContentResolver().query(ENFORCE_MANAGED_URI,
- null, null, null, null)) {
- if (enforceCursor == null || enforceCursor.getCount() != 1) {
- return false;
- }
- enforceCursor.moveToFirst();
- return enforceCursor.getInt(0) > 0;
- }
- }
-
private void fillList() {
final TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
final int subId = mSubscriptionInfo != null ? mSubscriptionInfo.getSubscriptionId()
@@ -272,9 +259,9 @@
where.append(" AND NOT (type='ims')");
}
- Cursor cursor = getContentResolver().query(FILTERED_URI,
- new String[] {"_id", "name", "apn", "type", "mvno_type", "mvno_match_data"},
- where.toString(), null, Telephony.Carriers.DEFAULT_SORT_ORDER);
+ Cursor cursor = getContentResolver().query(Telephony.Carriers.CONTENT_URI, new String[] {
+ "_id", "name", "apn", "type", "mvno_type", "mvno_match_data"}, where.toString(),
+ null, Telephony.Carriers.DEFAULT_SORT_ORDER);
if (cursor != null) {
IccRecords r = null;
@@ -292,7 +279,6 @@
mSelectedKey = getSelectedApnKey();
cursor.moveToFirst();
- boolean enforced = isDpcApnEnforced();
while (!cursor.isAfterLast()) {
String name = cursor.getString(NAME_INDEX);
String apn = cursor.getString(APN_INDEX);
@@ -309,7 +295,6 @@
pref.setPersistent(false);
pref.setOnPreferenceChangeListener(this);
pref.setSubId(subId);
- pref.setDpcEnforced(enforced);
boolean selectable = ((type == null) || !type.equals("mms"));
pref.setSelectable(selectable);
@@ -358,14 +343,15 @@
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
- if (!mUnavailable && !isDpcApnEnforced()) {
+ if (!mUnavailable) {
if (mAllowAddingApns) {
menu.add(0, MENU_NEW, 0,
getResources().getString(R.string.menu_new))
.setIcon(R.drawable.ic_menu_add_white)
.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
}
- menu.add(0, MENU_RESTORE, 0, getResources().getString(R.string.menu_restore))
+ menu.add(0, MENU_RESTORE, 0,
+ getResources().getString(R.string.menu_restore))
.setIcon(android.R.drawable.ic_menu_upload);
}
@@ -401,7 +387,7 @@
@Override
public boolean onPreferenceTreeClick(Preference preference) {
int pos = Integer.parseInt(preference.getKey());
- Uri url = ContentUris.withAppendedId(isDpcApnEnforced() ? FILTERED_URI : CONTENT_URI, pos);
+ Uri url = ContentUris.withAppendedId(Telephony.Carriers.CONTENT_URI, pos);
startActivity(new Intent(Intent.ACTION_EDIT, url));
return true;
}
diff --git a/src/com/android/settings/DateTimeSettings.java b/src/com/android/settings/DateTimeSettings.java
index 18a7ee1..2a4934c 100644
--- a/src/com/android/settings/DateTimeSettings.java
+++ b/src/com/android/settings/DateTimeSettings.java
@@ -73,7 +73,7 @@
}
@Override
- protected List<AbstractPreferenceController> getPreferenceControllers(Context context) {
+ protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
final List<AbstractPreferenceController> controllers = new ArrayList<>();
final Activity activity = getActivity();
final Intent intent = activity.getIntent();
@@ -112,10 +112,10 @@
public Dialog onCreateDialog(int id) {
switch (id) {
case DatePreferenceController.DIALOG_DATEPICKER:
- return getPreferenceController(DatePreferenceController.class)
+ return use(DatePreferenceController.class)
.buildDatePicker(getActivity());
case TimePreferenceController.DIALOG_TIMEPICKER:
- return getPreferenceController(TimePreferenceController.class)
+ return use(TimePreferenceController.class)
.buildTimePicker(getActivity());
default:
throw new IllegalArgumentException();
diff --git a/src/com/android/settings/DisplaySettings.java b/src/com/android/settings/DisplaySettings.java
index e726c63..88fc8b6 100644
--- a/src/com/android/settings/DisplaySettings.java
+++ b/src/com/android/settings/DisplaySettings.java
@@ -23,7 +23,6 @@
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.settings.dashboard.DashboardFragment;
import com.android.settings.display.AmbientDisplayPreferenceController;
-import com.android.settings.display.AutoBrightnessPreferenceController;
import com.android.settings.display.AutoRotatePreferenceController;
import com.android.settings.display.BrightnessLevelPreferenceController;
import com.android.settings.display.CameraGesturePreferenceController;
@@ -50,7 +49,6 @@
public class DisplaySettings extends DashboardFragment {
private static final String TAG = "DisplaySettings";
- public static final String KEY_AUTO_BRIGHTNESS = "auto_brightness";
public static final String KEY_DISPLAY_SIZE = "display_settings_screen_zoom";
private static final String KEY_SCREEN_TIMEOUT = "screen_timeout";
@@ -74,7 +72,7 @@
}
@Override
- protected List<AbstractPreferenceController> getPreferenceControllers(Context context) {
+ protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
return buildPreferenceControllers(context, getLifecycle());
}
@@ -86,7 +84,6 @@
private static List<AbstractPreferenceController> buildPreferenceControllers(
Context context, Lifecycle lifecycle) {
final List<AbstractPreferenceController> controllers = new ArrayList<>();
- controllers.add(new AutoBrightnessPreferenceController(context, KEY_AUTO_BRIGHTNESS));
controllers.add(new AutoRotatePreferenceController(context, lifecycle));
controllers.add(new CameraGesturePreferenceController(context));
controllers.add(new FontSizePreferenceController(context));
@@ -133,7 +130,8 @@
}
@Override
- public List<AbstractPreferenceController> getPreferenceControllers(Context context) {
+ public List<AbstractPreferenceController> createPreferenceControllers(
+ Context context) {
return buildPreferenceControllers(context, null);
}
};
diff --git a/src/com/android/settings/MasterClear.java b/src/com/android/settings/MasterClear.java
index f66b1f9..9ad32e2 100644
--- a/src/com/android/settings/MasterClear.java
+++ b/src/com/android/settings/MasterClear.java
@@ -73,7 +73,7 @@
*
* This is the initial screen.
*/
-public class MasterClear extends InstrumentedFragment {
+public class MasterClear extends InstrumentedFragment implements OnGlobalLayoutListener {
private static final String TAG = "MasterClear";
@VisibleForTesting static final int KEYGUARD_REQUEST = 55;
@@ -86,20 +86,17 @@
static final String ERASE_ESIMS_EXTRA = "erase_esim";
private View mContentView;
- private Button mInitiateButton;
+ @VisibleForTesting Button mInitiateButton;
private View mExternalStorageContainer;
@VisibleForTesting CheckBox mExternalStorage;
private View mEsimStorageContainer;
@VisibleForTesting CheckBox mEsimStorage;
- private ScrollView mScrollView;
+ @VisibleForTesting ScrollView mScrollView;
- private final OnGlobalLayoutListener mOnGlobalLayoutListener = new OnGlobalLayoutListener() {
- @Override
- public void onGlobalLayout() {
- mScrollView.getViewTreeObserver().removeOnGlobalLayoutListener(mOnGlobalLayoutListener);
- mInitiateButton.setEnabled(hasReachedBottom(mScrollView));
- }
- };
+ @Override
+ public void onGlobalLayout() {
+ mInitiateButton.setEnabled(hasReachedBottom(mScrollView));
+ }
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
@@ -259,13 +256,16 @@
*/
@VisibleForTesting
void establishInitialState() {
- mInitiateButton = (Button) mContentView.findViewById(R.id.initiate_master_clear);
+ mInitiateButton = mContentView.findViewById(R.id.initiate_master_clear);
mInitiateButton.setOnClickListener(mInitiateListener);
mExternalStorageContainer = mContentView.findViewById(R.id.erase_external_container);
- mExternalStorage = (CheckBox) mContentView.findViewById(R.id.erase_external);
+ mExternalStorage = mContentView.findViewById(R.id.erase_external);
mEsimStorageContainer = mContentView.findViewById(R.id.erase_esim_container);
- mEsimStorage = (CheckBox) mContentView.findViewById(R.id.erase_esim);
- mScrollView = (ScrollView) mContentView.findViewById(R.id.master_clear_scrollview);
+ mEsimStorage = mContentView.findViewById(R.id.erase_esim);
+ if (mScrollView != null) {
+ mScrollView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
+ }
+ mScrollView = mContentView.findViewById(R.id.master_clear_scrollview);
/*
* If the external storage is emulated, it will be erased with a factory
@@ -322,8 +322,8 @@
final UserManager um = (UserManager) getActivity().getSystemService(Context.USER_SERVICE);
loadAccountList(um);
- StringBuffer contentDescription = new StringBuffer();
- View masterClearContainer = mContentView.findViewById(R.id.master_clear_container);
+ final StringBuffer contentDescription = new StringBuffer();
+ final View masterClearContainer = mContentView.findViewById(R.id.master_clear_container);
getContentDescription(masterClearContainer, contentDescription);
masterClearContainer.setContentDescription(contentDescription);
@@ -334,12 +334,13 @@
int oldScrollY) {
if (v instanceof ScrollView && hasReachedBottom((ScrollView) v)) {
mInitiateButton.setEnabled(true);
+ mScrollView.setOnScrollChangeListener(null);
}
}
});
// Set the initial state of the initiateButton
- mScrollView.getViewTreeObserver().addOnGlobalLayoutListener(mOnGlobalLayoutListener);
+ mScrollView.getViewTreeObserver().addOnGlobalLayoutListener(this);
}
/**
diff --git a/src/com/android/settings/Settings.java b/src/com/android/settings/Settings.java
index e6dc48e..d2d9166 100644
--- a/src/com/android/settings/Settings.java
+++ b/src/com/android/settings/Settings.java
@@ -16,10 +16,7 @@
package com.android.settings;
-import static com.android.settings.core.FeatureFlags.CONNECTED_DEVICE_V2;
-
import android.os.Bundle;
-import android.util.FeatureFlagUtils;
import com.android.settings.enterprise.EnterprisePrivacySettings;
@@ -158,11 +155,7 @@
// Top level categories for new IA
public static class NetworkDashboardActivity extends SettingsActivity {}
- public static class ConnectedDeviceDashboardActivity extends SettingsActivity {
- public static final boolean isEnabled() {
- return FeatureFlagUtils.isEnabled(null /* context */, CONNECTED_DEVICE_V2);
- }
- }
+ public static class ConnectedDeviceDashboardActivity extends SettingsActivity {}
public static class ConnectedDeviceDashboardActivityOld extends SettingsActivity {}
public static class PowerUsageSummaryActivity extends SettingsActivity { /* empty */ }
public static class PowerUsageSummaryLegacyActivity extends SettingsActivity { /* empty */ }
@@ -170,10 +163,6 @@
public static class StorageDashboardActivity extends SettingsActivity {}
public static class AccountDashboardActivity extends SettingsActivity {}
public static class SystemDashboardActivity extends SettingsActivity {}
- public static class AdvancedConnectedDeviceActivity extends SettingsActivity {
- public static final boolean isEnabled() {
- return FeatureFlagUtils.isEnabled(null /* context */, CONNECTED_DEVICE_V2);
- }
- }
+ public static class AdvancedConnectedDeviceActivity extends SettingsActivity {}
}
diff --git a/src/com/android/settings/SettingsActivity.java b/src/com/android/settings/SettingsActivity.java
index 3144ae2..0f50d71 100644
--- a/src/com/android/settings/SettingsActivity.java
+++ b/src/com/android/settings/SettingsActivity.java
@@ -631,19 +631,10 @@
Utils.isBandwidthControlEnabled() /* enabled */,
isAdmin) || somethingChanged;
- final boolean isConnectedDeviceV2Enabled =
- Settings.ConnectedDeviceDashboardActivity.isEnabled();
- // Enable new connected page if v2 enabled
somethingChanged = setTileEnabled(
new ComponentName(packageName,
Settings.ConnectedDeviceDashboardActivity.class.getName()),
- isConnectedDeviceV2Enabled && !UserManager.isDeviceInDemoMode(this) /* enabled */,
- isAdmin) || somethingChanged;
- // Enable old connected page if v2 disabled
- somethingChanged = setTileEnabled(
- new ComponentName(packageName,
- Settings.ConnectedDeviceDashboardActivityOld.class.getName()),
- !isConnectedDeviceV2Enabled && !UserManager.isDeviceInDemoMode(this) /* enabled */,
+ !UserManager.isDeviceInDemoMode(this) /* enabled */,
isAdmin) || somethingChanged;
somethingChanged = setTileEnabled(new ComponentName(packageName,
@@ -711,16 +702,16 @@
|| somethingChanged;
// Enable/disable the Me Card page.
- final boolean isMeCardEnabled = featureFactory
+ final boolean aboutPhoneV2Enabled = featureFactory
.getAccountFeatureProvider()
- .isMeCardEnabled(this);
+ .isAboutPhoneV2Enabled(this);
somethingChanged = setTileEnabled(new ComponentName(packageName,
Settings.MyDeviceInfoActivity.class.getName()),
- isMeCardEnabled, isAdmin)
+ aboutPhoneV2Enabled, isAdmin)
|| somethingChanged;
somethingChanged = setTileEnabled(new ComponentName(packageName,
Settings.DeviceInfoSettingsActivity.class.getName()),
- !isMeCardEnabled, isAdmin)
+ !aboutPhoneV2Enabled, isAdmin)
|| somethingChanged;
if (UserHandle.MU_ENABLED && !isAdmin) {
diff --git a/src/com/android/settings/SettingsPreferenceFragment.java b/src/com/android/settings/SettingsPreferenceFragment.java
index 0374d0b..bf4da66 100644
--- a/src/com/android/settings/SettingsPreferenceFragment.java
+++ b/src/com/android/settings/SettingsPreferenceFragment.java
@@ -135,19 +135,7 @@
if (icicle != null) {
mPreferenceHighlighted = icicle.getBoolean(SAVE_HIGHLIGHTED_KEY);
}
- final Bundle arguments = getArguments();
-
- // Check if we should keep the preferences expanded.
- if (arguments != null) {
- final String highlightKey =
- arguments.getString(SettingsActivity.EXTRA_FRAGMENT_ARG_KEY);
- if (!TextUtils.isEmpty(highlightKey)) {
- final PreferenceScreen screen = getPreferenceScreen();
- if (screen != null) {
- screen.setInitialExpandedChildrenCount(Integer.MAX_VALUE);
- }
- }
- }
+ HighlightablePreferenceGroupAdapter.adjustInitialExpandedChildCount(this /* host */);
}
@Override
@@ -264,6 +252,15 @@
}
}
+ /**
+ * Returns initial expanded child count.
+ * <p/>
+ * Only override this method if the initial expanded child must be determined at run time.
+ */
+ public int getInitialExpandedChildCount() {
+ return 0;
+ }
+
protected void onDataSetChanged() {
highlightPreferenceIfNeeded();
updateEmptyView();
diff --git a/src/com/android/settings/Utils.java b/src/com/android/settings/Utils.java
index 0e0e08d..2a55829 100644
--- a/src/com/android/settings/Utils.java
+++ b/src/com/android/settings/Utils.java
@@ -389,39 +389,6 @@
}
/**
- * Build an Intent to launch a new activity showing the selected fragment.
- * The implementation constructs an Intent that re-launches the current activity with the
- * appropriate arguments to display the fragment.
- *
- *
- * @param context The Context.
- * @param fragmentName The name of the fragment to display.
- * @param args Optional arguments to supply to the fragment.
- * @param titleResPackageName Optional package name for the resource id of the title.
- * @param titleResId Optional title resource id to show for this item.
- * @param title Optional title to show for this item.
- * @param isShortcut tell if this is a Launcher Shortcut or not
- * @param sourceMetricsCategory The context (source) from which an action is performed
- * @return Returns an Intent that can be launched to display the given
- * fragment.
- */
- public static Intent onBuildStartFragmentIntent(Context context, String fragmentName,
- Bundle args, String titleResPackageName, int titleResId, CharSequence title,
- boolean isShortcut, int sourceMetricsCategory) {
- Intent intent = new Intent(Intent.ACTION_MAIN);
- intent.setClass(context, SubSettings.class);
- intent.putExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT, fragmentName);
- intent.putExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT_ARGUMENTS, args);
- intent.putExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT_TITLE_RES_PACKAGE_NAME,
- titleResPackageName);
- intent.putExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT_TITLE_RESID, titleResId);
- intent.putExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT_TITLE, title);
- intent.putExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT_AS_SHORTCUT, isShortcut);
- intent.putExtra(VisibilityLoggerMixin.EXTRA_SOURCE_METRICS_CATEGORY, sourceMetricsCategory);
- return intent;
- }
-
- /**
* Returns the managed profile of the current user or {@code null} if none is found or a profile
* exists but it is disabled.
*/
@@ -550,45 +517,6 @@
return null;
}
- /**
- * Returns the target user for a Settings activity.
- *
- * The target user can be either the current user, the user that launched this activity or
- * the user contained as an extra in the arguments or intent extras.
- *
- * You should use {@link #getSecureTargetUser(IBinder, UserManager, Bundle, Bundle)} if
- * possible.
- *
- * @see #getInsecureTargetUser(IBinder, Bundle, Bundle)
- */
- public static UserHandle getInsecureTargetUser(IBinder activityToken, @Nullable Bundle arguments,
- @Nullable Bundle intentExtras) {
- UserHandle currentUser = new UserHandle(UserHandle.myUserId());
- IActivityManager am = ActivityManager.getService();
- try {
- UserHandle launchedFromUser = new UserHandle(UserHandle.getUserId(
- am.getLaunchedFromUid(activityToken)));
- if (launchedFromUser != null && !launchedFromUser.equals(currentUser)) {
- return launchedFromUser;
- }
- UserHandle extrasUser = intentExtras != null
- ? (UserHandle) intentExtras.getParcelable(EXTRA_USER) : null;
- if (extrasUser != null && !extrasUser.equals(currentUser)) {
- return extrasUser;
- }
- UserHandle argumentsUser = arguments != null
- ? (UserHandle) arguments.getParcelable(EXTRA_USER) : null;
- if (argumentsUser != null && !argumentsUser.equals(currentUser)) {
- return argumentsUser;
- }
- } catch (RemoteException e) {
- // Should not happen
- Log.v(TAG, "Could not talk to activity manager.", e);
- return null;
- }
- return currentUser;
- }
-
/**
* Returns true if the user provided is in the same profiles group as the current user.
*/
@@ -637,28 +565,6 @@
return inflater.inflate(resId, parent, false);
}
- /**
- * Return if we are running low on storage space or not.
- *
- * @param context The context
- * @return true if we are running low on storage space
- */
- public static boolean isLowStorage(Context context) {
- final StorageManager sm = StorageManager.from(context);
- return (sm.getStorageBytesUntilLow(context.getFilesDir()) < 0);
- }
-
-
- public static boolean hasPreferredActivities(PackageManager pm, String packageName) {
- // Get list of preferred activities
- List<ComponentName> prefActList = new ArrayList<>();
- // Intent list cannot be null. so pass empty list
- List<IntentFilter> intentList = new ArrayList<>();
- pm.getPreferredActivities(intentList, prefActList, packageName);
- Log.d(TAG, "Have " + prefActList.size() + " number of activities in preferred list");
- return prefActList.size() > 0;
- }
-
public static ArraySet<String> getHandledDomains(PackageManager pm, String packageName) {
List<IntentFilterVerificationInfo> iviList = pm.getIntentFilterVerifications(packageName);
List<IntentFilter> filters = pm.getAllIntentFilters(packageName);
@@ -808,12 +714,6 @@
return um.getCredentialOwnerProfile(userId);
}
- public static int resolveResource(Context context, int attr) {
- TypedValue value = new TypedValue();
- context.getTheme().resolveAttribute(attr, value, true);
- return value.resourceId;
- }
-
private static final StringBuilder sBuilder = new StringBuilder(50);
private static final java.util.Formatter sFormatter = new java.util.Formatter(
sBuilder, Locale.getDefault());
@@ -828,47 +728,6 @@
}
}
- public static List<String> getNonIndexable(int xml, Context context) {
- if (Looper.myLooper() == null) {
- // Hack to make sure Preferences can initialize. Prefs expect a looper, but
- // don't actually use it for the basic stuff here.
- Looper.prepare();
- }
- final List<String> ret = new ArrayList<>();
- PreferenceManager manager = new PreferenceManager(context);
- PreferenceScreen screen = manager.inflateFromResource(context, xml, null);
- checkPrefs(screen, ret);
-
- return ret;
- }
-
- private static void checkPrefs(PreferenceGroup group, List<String> ret) {
- if (group == null) return;
- for (int i = 0; i < group.getPreferenceCount(); i++) {
- Preference pref = group.getPreference(i);
- if (pref instanceof SelfAvailablePreference
- && !((SelfAvailablePreference) pref).isAvailable(group.getContext())) {
- ret.add(pref.getKey());
- if (pref instanceof PreferenceGroup) {
- addAll((PreferenceGroup) pref, ret);
- }
- } else if (pref instanceof PreferenceGroup) {
- checkPrefs((PreferenceGroup) pref, ret);
- }
- }
- }
-
- private static void addAll(PreferenceGroup group, List<String> ret) {
- if (group == null) return;
- for (int i = 0; i < group.getPreferenceCount(); i++) {
- Preference pref = group.getPreference(i);
- ret.add(pref.getKey());
- if (pref instanceof PreferenceGroup) {
- addAll((PreferenceGroup) pref, ret);
- }
- }
- }
-
public static boolean isDeviceProvisioned(Context context) {
return Settings.Global.getInt(context.getContentResolver(),
Settings.Global.DEVICE_PROVISIONED, 0) != 0;
@@ -899,14 +758,6 @@
return confirmWorkProfileCredentials(context, userId);
}
- public static boolean confirmWorkProfileCredentialsIfNecessary(Context context, int userId) {
- KeyguardManager km = (KeyguardManager) context.getSystemService(Context.KEYGUARD_SERVICE);
- if (!km.isDeviceLocked(userId)) {
- return false;
- }
- return confirmWorkProfileCredentials(context, userId);
- }
-
private static boolean confirmWorkProfileCredentials(Context context, int userId) {
final KeyguardManager km = (KeyguardManager) context.getSystemService(
Context.KEYGUARD_SERVICE);
diff --git a/src/com/android/settings/accessibility/AccessibilitySettings.java b/src/com/android/settings/accessibility/AccessibilitySettings.java
index bd63225..2292ca2 100644
--- a/src/com/android/settings/accessibility/AccessibilitySettings.java
+++ b/src/com/android/settings/accessibility/AccessibilitySettings.java
@@ -33,7 +33,6 @@
import android.os.Vibrator;
import android.provider.SearchIndexableResource;
import android.provider.Settings;
-import android.support.annotation.VisibleForTesting;
import android.support.v14.preference.SwitchPreference;
import android.support.v4.content.ContextCompat;
import android.support.v7.preference.ListPreference;
@@ -93,6 +92,8 @@
// Preferences
private static final String TOGGLE_HIGH_TEXT_CONTRAST_PREFERENCE =
"toggle_high_text_contrast_preference";
+ private static final String TOGGLE_INVERSION_PREFERENCE =
+ "toggle_inversion_preference";
private static final String TOGGLE_POWER_BUTTON_ENDS_CALL_PREFERENCE =
"toggle_power_button_ends_call_preference";
private static final String TOGGLE_LOCK_SCREEN_ROTATION_PREFERENCE =
@@ -104,6 +105,8 @@
"toggle_master_mono";
private static final String SELECT_LONG_PRESS_TIMEOUT_PREFERENCE =
"select_long_press_timeout_preference";
+ private static final String ACCESSIBILITY_SHORTCUT_PREFERENCE =
+ "accessibility_shortcut_preference";
private static final String CAPTIONING_PREFERENCE_SCREEN =
"captioning_preference_screen";
private static final String DISPLAY_MAGNIFICATION_PREFERENCE_SCREEN =
@@ -116,13 +119,8 @@
"autoclick_preference_screen";
private static final String VIBRATION_PREFERENCE_SCREEN =
"vibration_preference_screen";
-
- @VisibleForTesting static final String TOGGLE_INVERSION_PREFERENCE =
- "toggle_inversion_preference";
- @VisibleForTesting static final String DISPLAY_DALTONIZER_PREFERENCE_SCREEN =
+ private static final String DISPLAY_DALTONIZER_PREFERENCE_SCREEN =
"daltonizer_preference_screen";
- @VisibleForTesting static final String ACCESSIBILITY_SHORTCUT_PREFERENCE =
- "accessibility_shortcut_preference";
// Extras passed to sub-fragments.
static final String EXTRA_PREFERENCE_KEY = "preference_key";
@@ -627,8 +625,6 @@
displayCategory.addPreference(mToggleInversionPreference);
displayCategory.addPreference(mDisplayDaltonizerPreferenceScreen);
}
- checkColorCorrectionVisibility(mDisplayDaltonizerPreferenceScreen);
- checkColorInversionVisibility(mToggleInversionPreference);
// Text contrast.
mToggleHighTextContrastPreference.setChecked(
@@ -683,7 +679,6 @@
updateAutoclickSummary(mAutoclickPreferenceScreen);
updateAccessibilityShortcut(mAccessibilityShortcutPreferenceScreen);
- checkAccessibilityShortcutVisibility(mAccessibilityShortcutPreferenceScreen);
}
private void updateMagnificationSummary(Preference pref) {
@@ -804,27 +799,6 @@
}
}
- @VisibleForTesting void checkColorCorrectionVisibility(Preference preference) {
- if (!getContext().getResources().getBoolean(
- R.bool.config_show_color_correction_preference)) {
- removePreference(DISPLAY_DALTONIZER_PREFERENCE_SCREEN);
- }
- }
-
- @VisibleForTesting void checkColorInversionVisibility(Preference preference) {
- if (!getContext().getResources().getBoolean(
- R.bool.config_show_color_inversion_preference)) {
- removePreference(TOGGLE_INVERSION_PREFERENCE);
- }
- }
-
- @VisibleForTesting void checkAccessibilityShortcutVisibility(Preference preference) {
- if (!getContext().getResources().getBoolean(
- R.bool.config_show_accessibility_shortcut_preference)) {
- removePreference(ACCESSIBILITY_SHORTCUT_PREFERENCE);
- }
- }
-
private static void configureMagnificationPreferenceIfNeeded(Preference preference) {
// Some devices support only a single magnification mode. In these cases, we redirect to
// the magnification mode's UI directly, rather than showing a PreferenceScreen with a
@@ -860,12 +834,6 @@
keys.add(FONT_SIZE_PREFERENCE_SCREEN);
keys.add(KEY_DISPLAY_SIZE);
- // Remove Accessibility Shortcuts if it's not visible
- if (!context.getResources().getBoolean(
- R.bool.config_show_accessibility_shortcut_preference)) {
- keys.add(ACCESSIBILITY_SHORTCUT_PREFERENCE);
- }
-
// Duplicates in Language & Input
keys.add(TTS_SETTINGS_PREFERENCE);
diff --git a/src/com/android/settings/accessibility/HapticFeedbackIntensityPreferenceController.java b/src/com/android/settings/accessibility/HapticFeedbackIntensityPreferenceController.java
new file mode 100644
index 0000000..020c2a6
--- /dev/null
+++ b/src/com/android/settings/accessibility/HapticFeedbackIntensityPreferenceController.java
@@ -0,0 +1,43 @@
+/*
+ * 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.accessibility;
+
+import android.content.Context;
+import android.provider.Settings;
+import android.support.annotation.VisibleForTesting;
+
+public class HapticFeedbackIntensityPreferenceController
+ extends VibrationIntensityPreferenceController {
+
+ @VisibleForTesting
+ static final String PREF_KEY = "touch_vibration_preference_screen";
+
+ public HapticFeedbackIntensityPreferenceController(Context context) {
+ super(context, PREF_KEY, Settings.System.HAPTIC_FEEDBACK_INTENSITY);
+ }
+
+ @Override
+ public int getAvailabilityStatus() {
+ return AVAILABLE;
+ }
+
+ @Override
+ protected int getDefaultIntensity() {
+ return mVibrator.getDefaultHapticFeedbackIntensity();
+ }
+
+}
diff --git a/src/com/android/settings/accessibility/NotificationVibrationIntensityPreferenceController.java b/src/com/android/settings/accessibility/NotificationVibrationIntensityPreferenceController.java
new file mode 100644
index 0000000..a016478
--- /dev/null
+++ b/src/com/android/settings/accessibility/NotificationVibrationIntensityPreferenceController.java
@@ -0,0 +1,42 @@
+/*
+ * 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.accessibility;
+
+import android.content.Context;
+import android.provider.Settings;
+import android.support.annotation.VisibleForTesting;
+
+public class NotificationVibrationIntensityPreferenceController
+ extends VibrationIntensityPreferenceController {
+
+ @VisibleForTesting
+ static final String PREF_KEY = "notification_vibration_preference_screen";
+
+ public NotificationVibrationIntensityPreferenceController(Context context) {
+ super(context, PREF_KEY, Settings.System.NOTIFICATION_VIBRATION_INTENSITY);
+ }
+
+ @Override
+ public int getAvailabilityStatus() {
+ return AVAILABLE;
+ }
+
+ @Override
+ protected int getDefaultIntensity() {
+ return mVibrator.getDefaultNotificationVibrationIntensity();
+ }
+}
diff --git a/src/com/android/settings/accessibility/ShortcutServicePickerFragment.java b/src/com/android/settings/accessibility/ShortcutServicePickerFragment.java
index 52c1a0d..5b45cfa 100644
--- a/src/com/android/settings/accessibility/ShortcutServicePickerFragment.java
+++ b/src/com/android/settings/accessibility/ShortcutServicePickerFragment.java
@@ -22,13 +22,10 @@
import android.accessibilityservice.AccessibilityServiceInfo;
import android.app.Activity;
import android.app.Dialog;
-import android.app.DialogFragment;
import android.app.Fragment;
import android.content.ComponentName;
import android.content.Context;
import android.content.DialogInterface;
-import android.content.pm.ApplicationInfo;
-import android.content.pm.ComponentInfo;
import android.content.pm.PackageManager;
import android.graphics.drawable.Drawable;
import android.os.Binder;
@@ -44,13 +41,12 @@
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.internal.accessibility.AccessibilityShortcutController.ToggleableFrameworkFeatureInfo;
import com.android.settings.R;
-import com.android.settings.applications.defaultapps.DefaultAppInfo;
-import com.android.settings.applications.defaultapps.DefaultAppPickerFragment;
import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
import com.android.settings.widget.RadioButtonPickerFragment;
import com.android.settings.widget.RadioButtonPreference;
-import com.android.settings.wrapper.IPackageManagerWrapper;
import com.android.settingslib.accessibility.AccessibilityUtils;
+import com.android.settingslib.applications.DefaultAppInfo;
+import com.android.settingslib.widget.CandidateInfo;
import com.android.settingslib.wrapper.PackageManagerWrapper;
import java.util.ArrayList;
diff --git a/src/com/android/settings/accessibility/VibrationIntensityPreferenceController.java b/src/com/android/settings/accessibility/VibrationIntensityPreferenceController.java
new file mode 100644
index 0000000..ea212cf
--- /dev/null
+++ b/src/com/android/settings/accessibility/VibrationIntensityPreferenceController.java
@@ -0,0 +1,106 @@
+/*
+ * 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.accessibility;
+
+import android.content.Context;
+import android.database.ContentObserver;
+import android.net.Uri;
+import android.os.Handler;
+import android.os.Looper;
+import android.os.Vibrator;
+import android.provider.Settings;
+import android.support.v7.preference.Preference;
+import android.support.v7.preference.PreferenceScreen;
+
+import com.android.settings.R;
+import com.android.settings.core.BasePreferenceController;
+import com.android.settingslib.core.lifecycle.LifecycleObserver;
+import com.android.settingslib.core.lifecycle.events.OnStart;
+import com.android.settingslib.core.lifecycle.events.OnStop;
+
+public abstract class VibrationIntensityPreferenceController extends BasePreferenceController
+ implements LifecycleObserver, OnStart, OnStop {
+
+ protected final Vibrator mVibrator;
+ private final SettingObserver mSettingsContentObserver;
+ private final String mSettingKey;
+
+ private Preference mPreference;
+
+ public VibrationIntensityPreferenceController(Context context, String prefkey,
+ String settingKey) {
+ super(context, prefkey);
+ mVibrator = mContext.getSystemService(Vibrator.class);
+ mSettingKey = settingKey;
+ mSettingsContentObserver = new SettingObserver(settingKey) {
+ @Override
+ public void onChange(boolean selfChange, Uri uri) {
+ updateState(mPreference);
+ }
+ };
+ }
+
+ @Override
+ public void onStart() {
+ mContext.getContentResolver().registerContentObserver(
+ mSettingsContentObserver.uri,
+ false /* notifyForDescendants */,
+ mSettingsContentObserver);
+ }
+
+ @Override
+ public void onStop() {
+ mContext.getContentResolver().unregisterContentObserver(mSettingsContentObserver);
+ }
+
+ @Override
+ public void displayPreference(PreferenceScreen screen) {
+ super.displayPreference(screen);
+ mPreference = screen.findPreference(getPreferenceKey());
+ }
+
+ @Override
+ public CharSequence getSummary() {
+ final int intensity = Settings.System.getInt(mContext.getContentResolver(),
+ mSettingKey, getDefaultIntensity());
+
+ switch (intensity) {
+ case Vibrator.VIBRATION_INTENSITY_OFF:
+ return mContext.getText(R.string.accessibility_vibration_intensity_off);
+ case Vibrator.VIBRATION_INTENSITY_LOW:
+ return mContext.getText(R.string.accessibility_vibration_intensity_low);
+ case Vibrator.VIBRATION_INTENSITY_MEDIUM:
+ return mContext.getText(R.string.accessibility_vibration_intensity_medium);
+ case Vibrator.VIBRATION_INTENSITY_HIGH:
+ return mContext.getText(R.string.accessibility_vibration_intensity_high);
+ default:
+ return "";
+ }
+ }
+
+ protected abstract int getDefaultIntensity();
+
+ private static class SettingObserver extends ContentObserver {
+
+ public final Uri uri;
+
+ public SettingObserver(String settingKey) {
+ super(new Handler(Looper.getMainLooper()));
+ uri = Settings.System.getUriFor(settingKey);
+ }
+ }
+}
diff --git a/src/com/android/settings/accessibility/VibrationPreferenceFragment.java b/src/com/android/settings/accessibility/VibrationPreferenceFragment.java
index f81208f..e911b61 100644
--- a/src/com/android/settings/accessibility/VibrationPreferenceFragment.java
+++ b/src/com/android/settings/accessibility/VibrationPreferenceFragment.java
@@ -32,6 +32,7 @@
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.settings.R;
import com.android.settings.widget.RadioButtonPickerFragment;
+import com.android.settingslib.widget.CandidateInfo;
import java.util.ArrayList;
import java.util.Comparator;
diff --git a/src/com/android/settings/accessibility/VibrationSettings.java b/src/com/android/settings/accessibility/VibrationSettings.java
index 8aa4513..4b19d93 100644
--- a/src/com/android/settings/accessibility/VibrationSettings.java
+++ b/src/com/android/settings/accessibility/VibrationSettings.java
@@ -17,54 +17,24 @@
package com.android.settings.accessibility;
import android.content.Context;
-import android.net.Uri;
-import android.os.Bundle;
-import android.os.Handler;
-import android.os.Vibrator;
import android.provider.SearchIndexableResource;
-import android.provider.Settings;
-import android.support.annotation.VisibleForTesting;
-import android.support.v7.preference.Preference;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.settings.R;
-import com.android.settings.SettingsPreferenceFragment;
+import com.android.settings.dashboard.DashboardFragment;
import com.android.settings.search.BaseSearchIndexProvider;
-import com.android.settings.search.Indexable;
+import com.android.settingslib.core.AbstractPreferenceController;
+import com.android.settingslib.core.lifecycle.Lifecycle;
import java.util.ArrayList;
import java.util.List;
/**
- * Activity with the accessibility settings.
+ * Accessibility settings for the vibration.
*/
-public class VibrationSettings extends SettingsPreferenceFragment implements Indexable {
+public class VibrationSettings extends DashboardFragment {
- // Preferences
- @VisibleForTesting
- static final String NOTIFICATION_VIBRATION_PREFERENCE_SCREEN =
- "notification_vibration_preference_screen";
- @VisibleForTesting
- static final String TOUCH_VIBRATION_PREFERENCE_SCREEN =
- "touch_vibration_preference_screen";
-
- private final Handler mHandler = new Handler();
- private final SettingsContentObserver mSettingsContentObserver;
-
- private Preference mNotificationVibrationPreferenceScreen;
- private Preference mTouchVibrationPreferenceScreen;
-
- public VibrationSettings() {
- List<String> vibrationSettings = new ArrayList<>();
- vibrationSettings.add(Settings.System.HAPTIC_FEEDBACK_INTENSITY);
- vibrationSettings.add(Settings.System.NOTIFICATION_VIBRATION_INTENSITY);
- mSettingsContentObserver = new SettingsContentObserver(mHandler, vibrationSettings) {
- @Override
- public void onChange(boolean selfChange, Uri uri) {
- updatePreferences();
- }
- };
- }
+ private static final String TAG = "VibrationSettings";
@Override
public int getMetricsCategory() {
@@ -72,70 +42,35 @@
}
@Override
- public void onCreate(Bundle icicle) {
- super.onCreate(icicle);
- addPreferencesFromResource(R.xml.accessibility_vibration_settings);
- initializePreferences();
+ protected int getPreferenceScreenResId() {
+ return R.xml.accessibility_vibration_settings;
}
@Override
- public void onResume() {
- super.onResume();
- updatePreferences();
- mSettingsContentObserver.register(getContentResolver());
+ protected String getLogTag() {
+ return TAG;
}
@Override
- public void onPause() {
- mSettingsContentObserver.unregister(getContentResolver());
- super.onPause();
+ protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
+ return buildControllers(context, getLifecycle());
}
- private void initializePreferences() {
- // Notification and notification vibration strength adjustments.
- mNotificationVibrationPreferenceScreen =
- findPreference(NOTIFICATION_VIBRATION_PREFERENCE_SCREEN);
+ public static List<AbstractPreferenceController> buildControllers(Context context,
+ Lifecycle lifecycle) {
- // Touch feedback strength adjustments.
- mTouchVibrationPreferenceScreen = findPreference(TOUCH_VIBRATION_PREFERENCE_SCREEN);
- }
-
- private void updatePreferences() {
- updateNotificationVibrationSummary(mNotificationVibrationPreferenceScreen);
- updateTouchVibrationSummary(mTouchVibrationPreferenceScreen);
- }
-
- private void updateNotificationVibrationSummary(Preference pref) {
- Vibrator vibrator = getContext().getSystemService(Vibrator.class);
- final int intensity = Settings.System.getInt(getContext().getContentResolver(),
- Settings.System.NOTIFICATION_VIBRATION_INTENSITY,
- vibrator.getDefaultNotificationVibrationIntensity());
- CharSequence summary = getVibrationIntensitySummary(getContext(), intensity);
- mNotificationVibrationPreferenceScreen.setSummary(summary);
- }
-
- private void updateTouchVibrationSummary(Preference pref) {
- Vibrator vibrator = getContext().getSystemService(Vibrator.class);
- final int intensity = Settings.System.getInt(getContext().getContentResolver(),
- Settings.System.HAPTIC_FEEDBACK_INTENSITY,
- vibrator.getDefaultHapticFeedbackIntensity());
- CharSequence summary = getVibrationIntensitySummary(getContext(), intensity);
- mTouchVibrationPreferenceScreen.setSummary(summary);
- }
-
- public static String getVibrationIntensitySummary(Context context, int intensity) {
- switch (intensity) {
- case Vibrator.VIBRATION_INTENSITY_OFF:
- return context.getString(R.string.accessibility_vibration_intensity_off);
- case Vibrator.VIBRATION_INTENSITY_LOW:
- return context.getString(R.string.accessibility_vibration_intensity_low);
- case Vibrator.VIBRATION_INTENSITY_MEDIUM:
- return context.getString(R.string.accessibility_vibration_intensity_medium);
- case Vibrator.VIBRATION_INTENSITY_HIGH:
- return context.getString(R.string.accessibility_vibration_intensity_high);
- default:
- return "";
+ final List<AbstractPreferenceController> controllers = new ArrayList<>();
+ final NotificationVibrationIntensityPreferenceController notifVibPrefController =
+ new NotificationVibrationIntensityPreferenceController(context);
+ final HapticFeedbackIntensityPreferenceController hapticPreferenceController =
+ new HapticFeedbackIntensityPreferenceController(context);
+ controllers.add(hapticPreferenceController);
+ controllers.add(notifVibPrefController);
+ if (lifecycle != null) {
+ lifecycle.addObserver(hapticPreferenceController);
+ lifecycle.addObserver(notifVibPrefController);
}
+ return controllers;
}
public static final SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
@@ -149,5 +84,11 @@
indexables.add(indexable);
return indexables;
}
+
+ @Override
+ public List<AbstractPreferenceController> createPreferenceControllers(
+ Context context) {
+ return buildControllers(context, null /* lifecycle */);
+ }
};
}
diff --git a/src/com/android/settings/accounts/AccountDashboardFragment.java b/src/com/android/settings/accounts/AccountDashboardFragment.java
index 9702102..cab5dab 100644
--- a/src/com/android/settings/accounts/AccountDashboardFragment.java
+++ b/src/com/android/settings/accounts/AccountDashboardFragment.java
@@ -62,7 +62,7 @@
}
@Override
- protected List<AbstractPreferenceController> getPreferenceControllers(Context context) {
+ protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
final List<AbstractPreferenceController> controllers = new ArrayList<>();
final String[] authorities = getIntent().getStringArrayExtra(EXTRA_AUTHORITIES);
final AccountPreferenceController accountPrefController =
diff --git a/src/com/android/settings/accounts/AccountDetailDashboardFragment.java b/src/com/android/settings/accounts/AccountDetailDashboardFragment.java
index 9239b8e..109e782 100644
--- a/src/com/android/settings/accounts/AccountDetailDashboardFragment.java
+++ b/src/com/android/settings/accounts/AccountDetailDashboardFragment.java
@@ -109,7 +109,7 @@
}
@Override
- protected List<AbstractPreferenceController> getPreferenceControllers(Context context) {
+ protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
final List<AbstractPreferenceController> controllers = new ArrayList<>();
mAccountSynController = new AccountSyncPreferenceController(context);
controllers.add(mAccountSynController);
diff --git a/src/com/android/settings/accounts/AccountFeatureProvider.java b/src/com/android/settings/accounts/AccountFeatureProvider.java
index bbfc48a..ecde8fe 100644
--- a/src/com/android/settings/accounts/AccountFeatureProvider.java
+++ b/src/com/android/settings/accounts/AccountFeatureProvider.java
@@ -28,7 +28,7 @@
/**
* Checks whether or not to display the new About Phone page.
*/
- default boolean isMeCardEnabled(Context context) {
+ default boolean isAboutPhoneV2Enabled(Context context) {
return FeatureFlagUtils.isEnabled(context, FeatureFlags.ABOUT_PHONE_V2);
}
}
diff --git a/src/com/android/settings/applications/AppAndNotificationDashboardFragment.java b/src/com/android/settings/applications/AppAndNotificationDashboardFragment.java
index 7d6bdbb..eb74fb1 100644
--- a/src/com/android/settings/applications/AppAndNotificationDashboardFragment.java
+++ b/src/com/android/settings/applications/AppAndNotificationDashboardFragment.java
@@ -58,7 +58,7 @@
}
@Override
- protected List<AbstractPreferenceController> getPreferenceControllers(Context context) {
+ protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
final Activity activity = getActivity();
final Application app;
if (activity != null) {
@@ -75,7 +75,6 @@
controllers.add(new EmergencyBroadcastPreferenceController(context,
"app_and_notif_cell_broadcast_settings"));
controllers.add(new SpecialAppAccessPreferenceController(context));
- controllers.add(new AppPermissionsPreferenceController(context));
controllers.add(new RecentAppsPreferenceController(context, app, host));
return controllers;
}
@@ -91,7 +90,7 @@
}
@Override
- public List<AbstractPreferenceController> getPreferenceControllers(
+ public List<AbstractPreferenceController> createPreferenceControllers(
Context context) {
return buildPreferenceControllers(context, null, null /* host */);
}
diff --git a/src/com/android/settings/applications/AppInfoBase.java b/src/com/android/settings/applications/AppInfoBase.java
index 8c26988..fb63df2 100644
--- a/src/com/android/settings/applications/AppInfoBase.java
+++ b/src/com/android/settings/applications/AppInfoBase.java
@@ -43,8 +43,8 @@
import com.android.internal.logging.nano.MetricsProto;
import com.android.settings.SettingsActivity;
import com.android.settings.SettingsPreferenceFragment;
-import com.android.settings.Utils;
import com.android.settings.applications.manageapplications.ManageApplications;
+import com.android.settings.core.SubSettingLauncher;
import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
import com.android.settings.overlay.FeatureFactory;
import com.android.settings.wrapper.DevicePolicyManagerWrapper;
@@ -128,23 +128,27 @@
protected String retrieveAppEntry() {
final Bundle args = getArguments();
mPackageName = (args != null) ? args.getString(ARG_PACKAGE_NAME) : null;
+ Intent intent = (args == null) ?
+ getIntent() : (Intent) args.getParcelable("intent");
if (mPackageName == null) {
- Intent intent = (args == null) ?
- getActivity().getIntent() : (Intent) args.getParcelable("intent");
if (intent != null && intent.getData() != null) {
mPackageName = intent.getData().getSchemeSpecificPart();
}
}
- mUserId = UserHandle.myUserId();
+ if (intent != null && intent.hasExtra(Intent.EXTRA_USER_HANDLE)) {
+ mUserId = ((UserHandle) intent.getParcelableExtra(
+ Intent.EXTRA_USER_HANDLE)).getIdentifier();
+ } else {
+ mUserId = UserHandle.myUserId();
+ }
mAppEntry = mState.getEntry(mPackageName, mUserId);
if (mAppEntry != null) {
// Get application info again to refresh changed properties of application
try {
- mPackageInfo = mPm.getPackageInfo(mAppEntry.info.packageName,
+ mPackageInfo = mPm.getPackageInfoAsUser(mAppEntry.info.packageName,
PackageManager.MATCH_DISABLED_COMPONENTS |
- PackageManager.MATCH_ANY_USER |
- PackageManager.GET_SIGNATURES |
- PackageManager.GET_PERMISSIONS);
+ PackageManager.GET_SIGNING_CERTIFICATES |
+ PackageManager.GET_PERMISSIONS, mUserId);
} catch (NameNotFoundException e) {
Log.e(TAG, "Exception when retrieving package:" + mAppEntry.info.packageName, e);
}
@@ -218,20 +222,18 @@
public static void startAppInfoFragment(Class<?> fragment, int titleRes,
String pkg, int uid, Fragment source, int request, int sourceMetricsCategory) {
- startAppInfoFragment(fragment, titleRes, pkg, uid, source.getActivity(), request,
- sourceMetricsCategory);
- }
-
- public static void startAppInfoFragment(Class<?> fragment, int titleRes,
- String pkg, int uid, Activity source, int request, int sourceMetricsCategory) {
- Bundle args = new Bundle();
+ final Bundle args = new Bundle();
args.putString(AppInfoBase.ARG_PACKAGE_NAME, pkg);
args.putInt(AppInfoBase.ARG_PACKAGE_UID, uid);
- Intent intent = Utils.onBuildStartFragmentIntent(source, fragment.getName(),
- args, null, titleRes, null, false, sourceMetricsCategory);
- source.startActivityForResultAsUser(intent, request,
- new UserHandle(UserHandle.getUserId(uid)));
+ new SubSettingLauncher(source.getContext())
+ .setDestination(fragment.getName())
+ .setSourceMetricsCategory(sourceMetricsCategory)
+ .setTitle(titleRes)
+ .setArguments(args)
+ .setUserHandle(new UserHandle(UserHandle.getUserId(uid)))
+ .setResultListener(source, request)
+ .launch();
}
public static class MyAlertDialogFragment extends InstrumentedDialogFragment {
diff --git a/src/com/android/settings/applications/AppPermissionsPreferenceController.java b/src/com/android/settings/applications/AppPermissionsPreferenceController.java
index 6100123..206ef33 100644
--- a/src/com/android/settings/applications/AppPermissionsPreferenceController.java
+++ b/src/com/android/settings/applications/AppPermissionsPreferenceController.java
@@ -19,55 +19,40 @@
import android.content.pm.PackageManager.NameNotFoundException;
import android.content.pm.PermissionGroupInfo;
import android.content.pm.PermissionInfo;
-import android.support.v7.preference.Preference;
import android.text.TextUtils;
import android.util.ArraySet;
import android.util.Log;
+
import com.android.settings.R;
-import com.android.settings.core.PreferenceControllerMixin;
-import com.android.settingslib.core.AbstractPreferenceController;
+import com.android.settings.core.BasePreferenceController;
import java.util.List;
import java.util.Set;
-public class AppPermissionsPreferenceController extends AbstractPreferenceController
- implements PreferenceControllerMixin {
+public class AppPermissionsPreferenceController extends BasePreferenceController {
private static final String TAG = "AppPermissionPrefCtrl";
private static final String KEY_APP_PERMISSION_GROUPS = "manage_perms";
private static final String[] PERMISSION_GROUPS = new String[] {
- "android.permission-group.LOCATION",
- "android.permission-group.MICROPHONE",
- "android.permission-group.CAMERA",
- "android.permission-group.SMS",
- "android.permission-group.CONTACTS",
- "android.permission-group.PHONE"};
+ "android.permission-group.LOCATION",
+ "android.permission-group.MICROPHONE",
+ "android.permission-group.CAMERA",
+ "android.permission-group.SMS",
+ "android.permission-group.CONTACTS",
+ "android.permission-group.PHONE"};
private static final int NUM_PERMISSION_TO_USE = 3;
private final PackageManager mPackageManager;
public AppPermissionsPreferenceController(Context context) {
- super(context);
+ super(context, KEY_APP_PERMISSION_GROUPS);
mPackageManager = context.getPackageManager();
}
@Override
- public boolean isAvailable() {
- return true;
- }
-
- @Override
- public String getPreferenceKey() {
- return KEY_APP_PERMISSION_GROUPS;
- }
-
- @Override
- public void updateState(Preference preference) {
- final String summary = getSummary();
- if (summary != null) {
- preference.setSummary(summary);
- }
+ public int getAvailabilityStatus() {
+ return AVAILABLE;
}
/*
@@ -76,7 +61,7 @@
Location, Microphone, Camera, Sms, Contacts, and Phone
*/
@Override
- public String getSummary() {
+ public CharSequence getSummary() {
final Set<String> permissions = getAllPermissionsInGroups();
Set<String> grantedPermissionGroups = getGrantedPermissionGroups(permissions);
CharSequence summary = null;
@@ -96,7 +81,7 @@
private Set<String> getGrantedPermissionGroups(Set<String> permissions) {
ArraySet<String> grantedPermissionGroups = new ArraySet<>();
List<PackageInfo> installedPackages =
- mPackageManager.getInstalledPackages(PackageManager.GET_PERMISSIONS);
+ mPackageManager.getInstalledPackages(PackageManager.GET_PERMISSIONS);
for (PackageInfo installedPackage : installedPackages) {
if (installedPackage.permissions == null) {
continue;
@@ -134,12 +119,12 @@
for (String group : PERMISSION_GROUPS) {
try {
final List<PermissionInfo> permissions =
- mPackageManager.queryPermissionsByGroup(group, 0);
+ mPackageManager.queryPermissionsByGroup(group, 0);
for (PermissionInfo permissionInfo : permissions) {
result.add(permissionInfo.name);
}
} catch (NameNotFoundException e) {
- Log.e(TAG, "Error getting permissions in group "+group, e);
+ Log.e(TAG, "Error getting permissions in group " + group, e);
}
}
return result;
diff --git a/src/com/android/settings/applications/ApplicationFeatureProvider.java b/src/com/android/settings/applications/ApplicationFeatureProvider.java
index eae23d1..3ffacb0 100644
--- a/src/com/android/settings/applications/ApplicationFeatureProvider.java
+++ b/src/com/android/settings/applications/ApplicationFeatureProvider.java
@@ -17,11 +17,7 @@
package com.android.settings.applications;
import android.annotation.UserIdInt;
-import android.app.Fragment;
import android.content.Intent;
-import android.view.View;
-
-import com.android.settings.applications.instantapps.InstantAppButtonsController;
import java.util.List;
import java.util.Set;
@@ -29,13 +25,6 @@
public interface ApplicationFeatureProvider {
/**
- * Returns a new {@link InstantAppButtonsController} instance for showing buttons
- * only relevant to instant apps.
- */
- InstantAppButtonsController newInstantAppButtonsController(Fragment fragment,
- View view, InstantAppButtonsController.ShowDialogDelegate showDialogDelegate);
-
- /**
* Calculates the total number of apps installed on the device via policy in the current user
* and all its managed profiles.
*
diff --git a/src/com/android/settings/applications/ApplicationFeatureProviderImpl.java b/src/com/android/settings/applications/ApplicationFeatureProviderImpl.java
index 5323cd5..e1f434e 100644
--- a/src/com/android/settings/applications/ApplicationFeatureProviderImpl.java
+++ b/src/com/android/settings/applications/ApplicationFeatureProviderImpl.java
@@ -16,7 +16,6 @@
package com.android.settings.applications;
-import android.app.Fragment;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ComponentInfo;
@@ -26,9 +25,7 @@
import android.os.RemoteException;
import android.os.UserManager;
import android.util.ArraySet;
-import android.view.View;
-import com.android.settings.applications.instantapps.InstantAppButtonsController;
import com.android.settings.wrapper.DevicePolicyManagerWrapper;
import com.android.settings.wrapper.IPackageManagerWrapper;
import com.android.settingslib.wrapper.PackageManagerWrapper;
@@ -55,12 +52,6 @@
}
@Override
- public InstantAppButtonsController newInstantAppButtonsController(Fragment fragment,
- View view, InstantAppButtonsController.ShowDialogDelegate showDialogDelegate) {
- return new InstantAppButtonsController(mContext, fragment, view, showDialogDelegate);
- }
-
- @Override
public void calculateNumberOfPolicyInstalledApps(boolean async, NumberOfAppsCallback callback) {
final CurrentUserAndManagedProfilePolicyInstalledAppCounter counter =
new CurrentUserAndManagedProfilePolicyInstalledAppCounter(mContext, mPm, callback);
diff --git a/src/com/android/settings/applications/DefaultAppSettings.java b/src/com/android/settings/applications/DefaultAppSettings.java
index 34b635b..7d74fbd 100644
--- a/src/com/android/settings/applications/DefaultAppSettings.java
+++ b/src/com/android/settings/applications/DefaultAppSettings.java
@@ -60,7 +60,7 @@
}
@Override
- protected List<AbstractPreferenceController> getPreferenceControllers(Context context) {
+ protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
return buildPreferenceControllers(context);
}
@@ -109,7 +109,7 @@
}
@Override
- public List<AbstractPreferenceController> getPreferenceControllers(
+ public List<AbstractPreferenceController> createPreferenceControllers(
Context context) {
return buildPreferenceControllers(context);
}
diff --git a/src/com/android/settings/applications/SpecialAccessSettings.java b/src/com/android/settings/applications/SpecialAccessSettings.java
index 4e43c05..6387ec7 100644
--- a/src/com/android/settings/applications/SpecialAccessSettings.java
+++ b/src/com/android/settings/applications/SpecialAccessSettings.java
@@ -61,7 +61,7 @@
}
@Override
- protected List<AbstractPreferenceController> getPreferenceControllers(Context context) {
+ protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
return buildPreferenceControllers(context);
}
@@ -95,7 +95,7 @@
}
@Override
- public List<AbstractPreferenceController> getPreferenceControllers(
+ public List<AbstractPreferenceController> createPreferenceControllers(
Context context) {
return buildPreferenceControllers(context);
}
diff --git a/src/com/android/settings/applications/appinfo/AppInfoDashboardFragment.java b/src/com/android/settings/applications/appinfo/AppInfoDashboardFragment.java
index 90df547..b878bc8 100755
--- a/src/com/android/settings/applications/appinfo/AppInfoDashboardFragment.java
+++ b/src/com/android/settings/applications/appinfo/AppInfoDashboardFragment.java
@@ -86,6 +86,7 @@
@VisibleForTesting static final int UNINSTALL_ALL_USERS_MENU = 1;
@VisibleForTesting static final int UNINSTALL_UPDATES = 2;
static final int FORCE_STOP_MENU = 3;
+ static final int INSTALL_INSTANT_APP_MENU = 4;
// Result code identifiers
@VisibleForTesting
@@ -103,6 +104,7 @@
static final int DLG_FORCE_STOP = DLG_BASE + 1;
private static final int DLG_DISABLE = DLG_BASE + 2;
private static final int DLG_SPECIAL_DISABLE = DLG_BASE + 3;
+ static final int DLG_CLEAR_INSTANT_APP = DLG_BASE + 4;
private static final String KEY_ADVANCED_APP_INFO_CATEGORY = "advanced_app_info";
@@ -210,7 +212,7 @@
}
@Override
- protected List<AbstractPreferenceController> getPreferenceControllers(Context context) {
+ protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
retrieveAppEntry();
if (mPackageInfo == null) {
return null;
@@ -244,7 +246,7 @@
// The following are controllers for preferences that don't need to refresh the preference
// state when app state changes.
mInstantAppButtonPreferenceController =
- new InstantAppButtonsPreferenceController(context, this, packageName);
+ new InstantAppButtonsPreferenceController(context, this, packageName, lifecycle);
controllers.add(mInstantAppButtonPreferenceController);
controllers.add(new AppBatteryPreferenceController(context, this, packageName, lifecycle));
controllers.add(new AppMemoryPreferenceController(context, this, lifecycle));
diff --git a/src/com/android/settings/applications/appinfo/DefaultAppShortcutPreferenceControllerBase.java b/src/com/android/settings/applications/appinfo/DefaultAppShortcutPreferenceControllerBase.java
index 7d3f946..cf1731d 100644
--- a/src/com/android/settings/applications/appinfo/DefaultAppShortcutPreferenceControllerBase.java
+++ b/src/com/android/settings/applications/appinfo/DefaultAppShortcutPreferenceControllerBase.java
@@ -50,14 +50,9 @@
}
@Override
- public void updateState(Preference preference) {
- preference.setSummary(getSummary());
- }
-
- @Override
- public String getSummary() {
+ public CharSequence getSummary() {
int summaryResId = isDefaultApp() ? R.string.yes : R.string.no;
- return mContext.getString(summaryResId);
+ return mContext.getText(summaryResId);
}
@Override
diff --git a/src/com/android/settings/applications/appinfo/DrawOverlayDetailPreferenceController.java b/src/com/android/settings/applications/appinfo/DrawOverlayDetailPreferenceController.java
index 02f52b6..ca63575 100644
--- a/src/com/android/settings/applications/appinfo/DrawOverlayDetailPreferenceController.java
+++ b/src/com/android/settings/applications/appinfo/DrawOverlayDetailPreferenceController.java
@@ -21,7 +21,6 @@
import android.content.Context;
import android.content.pm.PackageInfo;
import android.os.UserManager;
-import android.support.v7.preference.Preference;
import com.android.settings.SettingsPreferenceFragment;
@@ -51,17 +50,12 @@
}
@Override
- public void updateState(Preference preference) {
- preference.setSummary(getSummary());
- }
-
- @Override
protected Class<? extends SettingsPreferenceFragment> getDetailFragmentClass() {
return DrawOverlayDetails.class;
}
@Override
- public String getSummary() {
- return DrawOverlayDetails.getSummary(mContext, mParent.getAppEntry()).toString();
+ public CharSequence getSummary() {
+ return DrawOverlayDetails.getSummary(mContext, mParent.getAppEntry());
}
}
diff --git a/src/com/android/settings/applications/appinfo/DrawOverlayDetails.java b/src/com/android/settings/applications/appinfo/DrawOverlayDetails.java
index e8400a0..5cdc47e 100644
--- a/src/com/android/settings/applications/appinfo/DrawOverlayDetails.java
+++ b/src/com/android/settings/applications/appinfo/DrawOverlayDetails.java
@@ -15,6 +15,8 @@
*/
package com.android.settings.applications.appinfo;
+import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS;
+
import android.app.AlertDialog;
import android.app.AppOpsManager;
import android.content.ActivityNotFoundException;
@@ -30,8 +32,9 @@
import android.support.v7.preference.Preference.OnPreferenceChangeListener;
import android.support.v7.preference.Preference.OnPreferenceClickListener;
import android.util.Log;
-
+import android.view.Window;
import android.view.WindowManager;
+
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.settings.R;
@@ -86,15 +89,16 @@
@Override
public void onResume() {
super.onResume();
- getActivity().getWindow().addFlags(
- WindowManager.LayoutParams.PRIVATE_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS);
+ getActivity().getWindow().addPrivateFlags(PRIVATE_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS);
}
@Override
public void onPause() {
- getActivity().getWindow().clearFlags(
- WindowManager.LayoutParams.PRIVATE_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS);
super.onPause();
+ Window window = getActivity().getWindow();
+ WindowManager.LayoutParams attrs = window.getAttributes();
+ attrs.privateFlags &= ~PRIVATE_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS;
+ window.setAttributes(attrs);
}
@Override
diff --git a/src/com/android/settings/applications/appinfo/InstantAppButtonsPreferenceController.java b/src/com/android/settings/applications/appinfo/InstantAppButtonsPreferenceController.java
index b9fe003..df64d76 100644
--- a/src/com/android/settings/applications/appinfo/InstantAppButtonsPreferenceController.java
+++ b/src/com/android/settings/applications/appinfo/InstantAppButtonsPreferenceController.java
@@ -18,30 +18,62 @@
import android.app.AlertDialog;
import android.content.Context;
+import android.content.DialogInterface;
+import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
+import android.net.Uri;
+import android.os.Bundle;
+import android.os.UserHandle;
import android.support.annotation.VisibleForTesting;
import android.support.v7.preference.PreferenceScreen;
+import android.text.TextUtils;
+import android.view.Menu;
+import android.view.MenuInflater;
+import android.view.MenuItem;
+import android.view.View;
+import android.widget.Button;
+import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.settings.R;
-import com.android.settings.applications.ApplicationFeatureProvider;
+import com.android.settings.applications.AppStoreUtil;
import com.android.settings.applications.LayoutPreference;
-import com.android.settings.applications.instantapps.InstantAppButtonsController;
import com.android.settings.core.BasePreferenceController;
import com.android.settings.overlay.FeatureFactory;
import com.android.settingslib.applications.AppUtils;
+import com.android.settingslib.core.lifecycle.Lifecycle;
+import com.android.settingslib.core.lifecycle.LifecycleObserver;
+import com.android.settingslib.core.lifecycle.events.OnCreateOptionsMenu;
+import com.android.settingslib.core.lifecycle.events.OnOptionsItemSelected;
+import com.android.settingslib.core.lifecycle.events.OnPrepareOptionsMenu;
+import com.android.settingslib.wrapper.PackageManagerWrapper;
-public class InstantAppButtonsPreferenceController extends BasePreferenceController {
+import java.util.List;
+
+public class InstantAppButtonsPreferenceController extends BasePreferenceController implements
+ LifecycleObserver, OnCreateOptionsMenu, OnPrepareOptionsMenu, OnOptionsItemSelected,
+ DialogInterface.OnClickListener {
private static final String KEY_INSTANT_APP_BUTTONS = "instant_app_buttons";
+ private static final String META_DATA_DEFAULT_URI = "default-url";
private final AppInfoDashboardFragment mParent;
private final String mPackageName;
- private InstantAppButtonsController mInstantAppButtonsController;
+ private final PackageManagerWrapper mPackageManagerWrapper;
+ private String mLaunchUri;
+ private LayoutPreference mPreference;
+ private MenuItem mInstallMenu;
public InstantAppButtonsPreferenceController(Context context, AppInfoDashboardFragment parent,
- String packageName) {
+ String packageName, Lifecycle lifecycle) {
super(context, KEY_INSTANT_APP_BUTTONS);
mParent = parent;
mPackageName = packageName;
+ mPackageManagerWrapper = new PackageManagerWrapper(context.getPackageManager());
+ mLaunchUri = getDefaultLaunchUri();
+ if (lifecycle != null) {
+ lifecycle.addObserver(this);
+ }
}
@Override
@@ -53,22 +85,99 @@
@Override
public void displayPreference(PreferenceScreen screen) {
super.displayPreference(screen);
- LayoutPreference buttons =
- (LayoutPreference) screen.findPreference(KEY_INSTANT_APP_BUTTONS);
- mInstantAppButtonsController = getApplicationFeatureProvider()
- .newInstantAppButtonsController(mParent,
- buttons.findViewById(R.id.instant_app_button_container),
- id -> mParent.showDialogInner(id, 0))
- .setPackageName(mPackageName)
- .show();
+ mPreference = (LayoutPreference) screen.findPreference(KEY_INSTANT_APP_BUTTONS);
+ initButtons(mPreference.findViewById(R.id.instant_app_button_container));
}
- public AlertDialog createDialog(int id) {
- return mInstantAppButtonsController.createDialog(id);
+ @Override
+ public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
+ if (!TextUtils.isEmpty(mLaunchUri)) {
+ menu.add(0, AppInfoDashboardFragment.INSTALL_INSTANT_APP_MENU, 2, R.string.install_text)
+ .setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);
+ }
}
- @VisibleForTesting
- ApplicationFeatureProvider getApplicationFeatureProvider() {
- return FeatureFactory.getFactory(mContext).getApplicationFeatureProvider(mContext);
+ @Override
+ public boolean onOptionsItemSelected(MenuItem menuItem) {
+ if (menuItem.getItemId() == AppInfoDashboardFragment.INSTALL_INSTANT_APP_MENU) {
+ final Intent appStoreIntent = AppStoreUtil.getAppStoreLink(mContext, mPackageName);
+ if (appStoreIntent != null) {
+ mParent.startActivity(appStoreIntent);
+ }
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public void onPrepareOptionsMenu(Menu menu) {
+ mInstallMenu = menu.findItem(AppInfoDashboardFragment.INSTALL_INSTANT_APP_MENU);
+ if (mInstallMenu != null) {
+ if (AppStoreUtil.getAppStoreLink(mContext, mPackageName) == null) {
+ mInstallMenu.setEnabled(false);
+ }
+ }
+ }
+
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ FeatureFactory.getFactory(mContext).getMetricsFeatureProvider()
+ .action(mContext, MetricsEvent.ACTION_SETTINGS_CLEAR_INSTANT_APP, mPackageName);
+ mPackageManagerWrapper.deletePackageAsUser(
+ mPackageName, null, 0, UserHandle.myUserId());
+ }
+
+ AlertDialog createDialog(int id) {
+ if (id == AppInfoDashboardFragment.DLG_CLEAR_INSTANT_APP) {
+ AlertDialog confirmDialog = new AlertDialog.Builder(mContext)
+ .setPositiveButton(R.string.clear_instant_app_data, this)
+ .setNegativeButton(R.string.cancel, null)
+ .setTitle(R.string.clear_instant_app_data)
+ .setMessage(mContext.getString(R.string.clear_instant_app_confirmation))
+ .create();
+ return confirmDialog;
+ }
+ return null;
+ }
+
+ private void initButtons(View view) {
+ final Button installButton = view.findViewById(R.id.install);
+ final Button clearDataButton = view.findViewById(R.id.clear_data);
+ final Button launchButton = view.findViewById(R.id.launch);
+ if (!TextUtils.isEmpty(mLaunchUri)) {
+ installButton.setVisibility(View.GONE);
+ final Intent intent = new Intent(Intent.ACTION_VIEW);
+ intent.setData(Uri.parse(mLaunchUri));
+ launchButton.setOnClickListener(v -> mParent.startActivity(intent));
+ } else {
+ launchButton.setVisibility(View.GONE);
+ final Intent appStoreIntent = AppStoreUtil.getAppStoreLink(mContext, mPackageName);
+ if (appStoreIntent != null) {
+ installButton.setOnClickListener(v -> mParent.startActivity(appStoreIntent));
+ } else {
+ installButton.setEnabled(false);
+ }
+ }
+ clearDataButton.setOnClickListener(
+ v -> mParent.showDialogInner(mParent.DLG_CLEAR_INSTANT_APP, 0));
+ }
+
+ private String getDefaultLaunchUri() {
+ final PackageManager manager = mContext.getPackageManager();
+ final Intent intent = new Intent(Intent.ACTION_MAIN);
+ intent.addCategory(Intent.CATEGORY_LAUNCHER);
+ intent.setPackage(mPackageName);
+ final List<ResolveInfo> infos = manager.queryIntentActivities(
+ intent, PackageManager.GET_META_DATA | PackageManager.MATCH_INSTANT);
+ for (ResolveInfo info : infos) {
+ final Bundle metaData = info.activityInfo.metaData;
+ if (metaData != null) {
+ final String launchUri = metaData.getString(META_DATA_DEFAULT_URI);
+ if (!TextUtils.isEmpty(launchUri)) {
+ return launchUri;
+ }
+ }
+ }
+ return null;
}
}
diff --git a/src/com/android/settings/applications/appinfo/PictureInPictureDetailPreferenceController.java b/src/com/android/settings/applications/appinfo/PictureInPictureDetailPreferenceController.java
index 1873683..202317a 100644
--- a/src/com/android/settings/applications/appinfo/PictureInPictureDetailPreferenceController.java
+++ b/src/com/android/settings/applications/appinfo/PictureInPictureDetailPreferenceController.java
@@ -20,7 +20,6 @@
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.os.UserHandle;
-import android.os.UserManager;
import android.support.annotation.VisibleForTesting;
import android.support.v7.preference.Preference;
import android.util.Log;
@@ -44,9 +43,6 @@
@Override
public int getAvailabilityStatus() {
- if (UserManager.get(mContext).isManagedProfile()) {
- return DISABLED_FOR_USER;
- }
return hasPictureInPictureActivites() ? AVAILABLE : DISABLED_FOR_USER;
}
diff --git a/src/com/android/settings/applications/appinfo/WriteSystemSettingsPreferenceController.java b/src/com/android/settings/applications/appinfo/WriteSystemSettingsPreferenceController.java
index 73e7675..71532ea 100644
--- a/src/com/android/settings/applications/appinfo/WriteSystemSettingsPreferenceController.java
+++ b/src/com/android/settings/applications/appinfo/WriteSystemSettingsPreferenceController.java
@@ -21,7 +21,6 @@
import android.content.Context;
import android.content.pm.PackageInfo;
import android.os.UserManager;
-import android.support.v7.preference.Preference;
import com.android.settings.SettingsPreferenceFragment;
@@ -52,18 +51,13 @@
}
@Override
- public void updateState(Preference preference) {
- preference.setSummary(getSummary());
- }
-
- @Override
protected Class<? extends SettingsPreferenceFragment> getDetailFragmentClass() {
return WriteSettingsDetails.class;
}
@Override
- public String getSummary() {
- return WriteSettingsDetails.getSummary(mContext, mParent.getAppEntry()).toString();
+ public CharSequence getSummary() {
+ return WriteSettingsDetails.getSummary(mContext, mParent.getAppEntry());
}
}
diff --git a/src/com/android/settings/applications/assist/DefaultAssistPicker.java b/src/com/android/settings/applications/assist/DefaultAssistPicker.java
index 01ca25a..d54e6d1 100644
--- a/src/com/android/settings/applications/assist/DefaultAssistPicker.java
+++ b/src/com/android/settings/applications/assist/DefaultAssistPicker.java
@@ -31,9 +31,11 @@
import com.android.internal.app.AssistUtils;
import com.android.internal.logging.nano.MetricsProto;
import com.android.settings.R;
-import com.android.settings.applications.defaultapps.DefaultAppInfo;
import com.android.settings.applications.defaultapps.DefaultAppPickerFragment;
+import com.android.settingslib.applications.DefaultAppInfo;
+import com.android.settingslib.widget.CandidateInfo;
+
import java.util.ArrayList;
import java.util.List;
diff --git a/src/com/android/settings/applications/assist/DefaultAssistPreferenceController.java b/src/com/android/settings/applications/assist/DefaultAssistPreferenceController.java
index f78548b..9c87984 100644
--- a/src/com/android/settings/applications/assist/DefaultAssistPreferenceController.java
+++ b/src/com/android/settings/applications/assist/DefaultAssistPreferenceController.java
@@ -27,8 +27,8 @@
import com.android.internal.app.AssistUtils;
import com.android.settings.R;
-import com.android.settings.applications.defaultapps.DefaultAppInfo;
import com.android.settings.applications.defaultapps.DefaultAppPreferenceController;
+import com.android.settingslib.applications.DefaultAppInfo;
import java.util.List;
diff --git a/src/com/android/settings/applications/assist/DefaultVoiceInputPicker.java b/src/com/android/settings/applications/assist/DefaultVoiceInputPicker.java
index 7a5c13d..84c1f76 100644
--- a/src/com/android/settings/applications/assist/DefaultVoiceInputPicker.java
+++ b/src/com/android/settings/applications/assist/DefaultVoiceInputPicker.java
@@ -25,8 +25,8 @@
import com.android.internal.app.AssistUtils;
import com.android.internal.logging.nano.MetricsProto;
import com.android.settings.R;
-import com.android.settings.applications.defaultapps.DefaultAppInfo;
import com.android.settings.applications.defaultapps.DefaultAppPickerFragment;
+import com.android.settingslib.applications.DefaultAppInfo;
import com.android.settingslib.wrapper.PackageManagerWrapper;
import java.util.ArrayList;
diff --git a/src/com/android/settings/applications/assist/DefaultVoiceInputPreferenceController.java b/src/com/android/settings/applications/assist/DefaultVoiceInputPreferenceController.java
index c305ccf..09f0b21 100644
--- a/src/com/android/settings/applications/assist/DefaultVoiceInputPreferenceController.java
+++ b/src/com/android/settings/applications/assist/DefaultVoiceInputPreferenceController.java
@@ -25,8 +25,8 @@
import android.text.TextUtils;
import com.android.internal.app.AssistUtils;
-import com.android.settings.applications.defaultapps.DefaultAppInfo;
import com.android.settings.applications.defaultapps.DefaultAppPreferenceController;
+import com.android.settingslib.applications.DefaultAppInfo;
import com.android.settingslib.core.lifecycle.Lifecycle;
import com.android.settingslib.core.lifecycle.LifecycleObserver;
import com.android.settingslib.core.lifecycle.events.OnPause;
diff --git a/src/com/android/settings/applications/assist/ManageAssist.java b/src/com/android/settings/applications/assist/ManageAssist.java
index 4126aaf..f5a3838 100644
--- a/src/com/android/settings/applications/assist/ManageAssist.java
+++ b/src/com/android/settings/applications/assist/ManageAssist.java
@@ -51,7 +51,7 @@
}
@Override
- protected List<AbstractPreferenceController> getPreferenceControllers(Context context) {
+ protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
return buildPreferenceControllers(context, getLifecycle());
}
@@ -93,7 +93,7 @@
}
@Override
- public List<AbstractPreferenceController> getPreferenceControllers(
+ public List<AbstractPreferenceController> createPreferenceControllers(
Context context) {
return buildPreferenceControllers(context, null /* lifecycle */);
}
diff --git a/src/com/android/settings/applications/defaultapps/DefaultAppInfo.java b/src/com/android/settings/applications/defaultapps/DefaultAppInfo.java
deleted file mode 100644
index 71b5ec4..0000000
--- a/src/com/android/settings/applications/defaultapps/DefaultAppInfo.java
+++ /dev/null
@@ -1,153 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settings.applications.defaultapps;
-
-import android.app.AppGlobals;
-import android.content.ComponentName;
-import android.content.Context;
-import android.content.pm.ApplicationInfo;
-import android.content.pm.ComponentInfo;
-import android.content.pm.PackageItemInfo;
-import android.content.pm.PackageManager;
-import android.graphics.drawable.Drawable;
-import android.os.RemoteException;
-import android.os.UserHandle;
-import android.util.IconDrawableFactory;
-
-import com.android.settings.widget.RadioButtonPickerFragment;
-import com.android.settingslib.wrapper.PackageManagerWrapper;
-
-/**
- * Data model representing an app in DefaultAppPicker UI.
- */
-public class DefaultAppInfo extends RadioButtonPickerFragment.CandidateInfo {
-
- public final int userId;
- public final ComponentName componentName;
- public final PackageItemInfo packageItemInfo;
- public final String summary;
- protected final PackageManagerWrapper mPm;
- private final Context mContext;
-
- public DefaultAppInfo(Context context, PackageManagerWrapper pm, int uid, ComponentName cn) {
- this(context, pm, uid, cn, null /* summary */, true /* enabled */);
- }
-
- public DefaultAppInfo(Context context, PackageManagerWrapper pm, PackageItemInfo info) {
- this(context, pm, info, null /* summary */, true /* enabled */);
- }
-
- public DefaultAppInfo(Context context, PackageManagerWrapper pm, int uid, ComponentName cn,
- String summary, boolean enabled) {
- super(enabled);
- mContext = context;
- mPm = pm;
- packageItemInfo = null;
- userId = uid;
- componentName = cn;
- this.summary = summary;
- }
-
- public DefaultAppInfo(Context context, PackageManagerWrapper pm, PackageItemInfo info,
- String summary, boolean enabled) {
- super(enabled);
- mContext = context;
- mPm = pm;
- userId = UserHandle.myUserId();
- packageItemInfo = info;
- componentName = null;
- this.summary = summary;
- }
-
- @Override
- public CharSequence loadLabel() {
- if (componentName != null) {
- try {
- final ComponentInfo componentInfo = getComponentInfo();
- if (componentInfo != null) {
- return componentInfo.loadLabel(mPm.getPackageManager());
- } else {
- final ApplicationInfo appInfo = mPm.getApplicationInfoAsUser(
- componentName.getPackageName(), 0, userId);
- return appInfo.loadLabel(mPm.getPackageManager());
- }
- } catch (PackageManager.NameNotFoundException e) {
- return null;
- }
- } else if (packageItemInfo != null) {
- return packageItemInfo.loadLabel(mPm.getPackageManager());
- } else {
- return null;
- }
-
- }
-
- @Override
- public Drawable loadIcon() {
- final IconDrawableFactory factory = IconDrawableFactory.newInstance(mContext);
- if (componentName != null) {
- try {
- final ComponentInfo componentInfo = getComponentInfo();
- final ApplicationInfo appInfo = mPm.getApplicationInfoAsUser(
- componentName.getPackageName(), 0, userId);
- if (componentInfo != null) {
- return factory.getBadgedIcon(componentInfo, appInfo, userId);
- } else {
- return factory.getBadgedIcon(appInfo);
- }
- } catch (PackageManager.NameNotFoundException e) {
- return null;
- }
- }
- if (packageItemInfo != null) {
- try {
- final ApplicationInfo appInfo = mPm.getApplicationInfoAsUser(
- packageItemInfo.packageName, 0, userId);
- return factory.getBadgedIcon(packageItemInfo, appInfo, userId);
- } catch (PackageManager.NameNotFoundException e) {
- return null;
- }
- } else {
- return null;
- }
- }
-
- @Override
- public String getKey() {
- if (componentName != null) {
- return componentName.flattenToString();
- } else if (packageItemInfo != null) {
- return packageItemInfo.packageName;
- } else {
- return null;
- }
- }
-
- private ComponentInfo getComponentInfo() {
- try {
- ComponentInfo componentInfo = AppGlobals.getPackageManager().getActivityInfo(
- componentName, 0, userId);
- if (componentInfo == null) {
- componentInfo = AppGlobals.getPackageManager().getServiceInfo(
- componentName, 0, userId);
- }
- return componentInfo;
- } catch (RemoteException e) {
- return null;
- }
- }
-}
diff --git a/src/com/android/settings/applications/defaultapps/DefaultAppPickerFragment.java b/src/com/android/settings/applications/defaultapps/DefaultAppPickerFragment.java
index 7b27516..cc3b3d1 100644
--- a/src/com/android/settings/applications/defaultapps/DefaultAppPickerFragment.java
+++ b/src/com/android/settings/applications/defaultapps/DefaultAppPickerFragment.java
@@ -32,6 +32,8 @@
import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
import com.android.settings.widget.RadioButtonPickerFragment;
import com.android.settings.widget.RadioButtonPreference;
+import com.android.settingslib.applications.DefaultAppInfo;
+import com.android.settingslib.widget.CandidateInfo;
import com.android.settingslib.wrapper.PackageManagerWrapper;
/**
diff --git a/src/com/android/settings/applications/defaultapps/DefaultAppPreferenceController.java b/src/com/android/settings/applications/defaultapps/DefaultAppPreferenceController.java
index d016567..6d4d3b2 100644
--- a/src/com/android/settings/applications/defaultapps/DefaultAppPreferenceController.java
+++ b/src/com/android/settings/applications/defaultapps/DefaultAppPreferenceController.java
@@ -29,6 +29,7 @@
import com.android.settings.Utils;
import com.android.settings.core.PreferenceControllerMixin;
import com.android.settings.widget.GearPreference;
+import com.android.settingslib.applications.DefaultAppInfo;
import com.android.settingslib.TwoTargetPreference;
import com.android.settingslib.core.AbstractPreferenceController;
import com.android.settingslib.wrapper.PackageManagerWrapper;
diff --git a/src/com/android/settings/applications/defaultapps/DefaultAutofillPicker.java b/src/com/android/settings/applications/defaultapps/DefaultAutofillPicker.java
index 30835fb..50c6d02 100644
--- a/src/com/android/settings/applications/defaultapps/DefaultAutofillPicker.java
+++ b/src/com/android/settings/applications/defaultapps/DefaultAutofillPicker.java
@@ -38,7 +38,9 @@
import com.android.internal.content.PackageMonitor;
import com.android.internal.logging.nano.MetricsProto;
import com.android.settings.R;
+import com.android.settingslib.applications.DefaultAppInfo;
import com.android.settingslib.utils.ThreadUtils;
+import com.android.settingslib.widget.CandidateInfo;
import java.util.ArrayList;
import java.util.List;
@@ -186,8 +188,8 @@
@Override
protected List<DefaultAppInfo> getCandidates() {
final List<DefaultAppInfo> candidates = new ArrayList<>();
- final List<ResolveInfo> resolveInfos = mPm.getPackageManager()
- .queryIntentServices(AUTOFILL_PROBE, PackageManager.GET_META_DATA);
+ final List<ResolveInfo> resolveInfos = mPm.queryIntentServices(
+ AUTOFILL_PROBE, PackageManager.GET_META_DATA);
final Context context = getContext();
for (ResolveInfo info : resolveInfos) {
final String permission = info.serviceInfo.permission;
diff --git a/src/com/android/settings/applications/defaultapps/DefaultAutofillPreferenceController.java b/src/com/android/settings/applications/defaultapps/DefaultAutofillPreferenceController.java
index b159d1d..787fbfa 100644
--- a/src/com/android/settings/applications/defaultapps/DefaultAutofillPreferenceController.java
+++ b/src/com/android/settings/applications/defaultapps/DefaultAutofillPreferenceController.java
@@ -24,6 +24,7 @@
import android.view.autofill.AutofillManager;
import com.android.settings.wrapper.AutofillManagerWrapper;
+import com.android.settingslib.applications.DefaultAppInfo;
public class DefaultAutofillPreferenceController extends DefaultAppPreferenceController {
private AutofillManagerWrapper mAutofillManager;
diff --git a/src/com/android/settings/applications/defaultapps/DefaultBrowserPicker.java b/src/com/android/settings/applications/defaultapps/DefaultBrowserPicker.java
index 2639c8d..8153be2 100644
--- a/src/com/android/settings/applications/defaultapps/DefaultBrowserPicker.java
+++ b/src/com/android/settings/applications/defaultapps/DefaultBrowserPicker.java
@@ -23,6 +23,8 @@
import com.android.internal.logging.nano.MetricsProto;
import com.android.settings.R;
+import com.android.settingslib.applications.DefaultAppInfo;
+
import java.util.ArrayList;
import java.util.List;
diff --git a/src/com/android/settings/applications/defaultapps/DefaultBrowserPreferenceController.java b/src/com/android/settings/applications/defaultapps/DefaultBrowserPreferenceController.java
index 916f9422..c762917 100644
--- a/src/com/android/settings/applications/defaultapps/DefaultBrowserPreferenceController.java
+++ b/src/com/android/settings/applications/defaultapps/DefaultBrowserPreferenceController.java
@@ -29,6 +29,8 @@
import android.util.IconDrawableFactory;
import android.util.Log;
+import com.android.settingslib.applications.DefaultAppInfo;
+
import java.util.List;
public class DefaultBrowserPreferenceController extends DefaultAppPreferenceController {
diff --git a/src/com/android/settings/applications/defaultapps/DefaultEmergencyPicker.java b/src/com/android/settings/applications/defaultapps/DefaultEmergencyPicker.java
index bafd56f..c20c0df 100644
--- a/src/com/android/settings/applications/defaultapps/DefaultEmergencyPicker.java
+++ b/src/com/android/settings/applications/defaultapps/DefaultEmergencyPicker.java
@@ -28,6 +28,8 @@
import com.android.internal.logging.nano.MetricsProto;
import com.android.settings.R;
import com.android.settings.Utils;
+import com.android.settingslib.applications.DefaultAppInfo;
+import com.android.settingslib.widget.CandidateInfo;
import java.util.ArrayList;
import java.util.List;
diff --git a/src/com/android/settings/applications/defaultapps/DefaultEmergencyPreferenceController.java b/src/com/android/settings/applications/defaultapps/DefaultEmergencyPreferenceController.java
index 7713dbd..d9f3320 100644
--- a/src/com/android/settings/applications/defaultapps/DefaultEmergencyPreferenceController.java
+++ b/src/com/android/settings/applications/defaultapps/DefaultEmergencyPreferenceController.java
@@ -22,6 +22,8 @@
import android.provider.Settings;
import android.telephony.TelephonyManager;
+import com.android.settingslib.applications.DefaultAppInfo;
+
import java.util.List;
public class DefaultEmergencyPreferenceController extends DefaultAppPreferenceController {
diff --git a/src/com/android/settings/applications/defaultapps/DefaultHomePicker.java b/src/com/android/settings/applications/defaultapps/DefaultHomePicker.java
index 7da390f..8617e85 100644
--- a/src/com/android/settings/applications/defaultapps/DefaultHomePicker.java
+++ b/src/com/android/settings/applications/defaultapps/DefaultHomePicker.java
@@ -30,6 +30,7 @@
import com.android.internal.logging.nano.MetricsProto;
import com.android.settings.R;
+import com.android.settingslib.applications.DefaultAppInfo;
import java.util.ArrayList;
import java.util.List;
diff --git a/src/com/android/settings/applications/defaultapps/DefaultHomePreferenceController.java b/src/com/android/settings/applications/defaultapps/DefaultHomePreferenceController.java
index fa6ddff..6f37797 100644
--- a/src/com/android/settings/applications/defaultapps/DefaultHomePreferenceController.java
+++ b/src/com/android/settings/applications/defaultapps/DefaultHomePreferenceController.java
@@ -25,6 +25,7 @@
import android.content.pm.ResolveInfo;
import com.android.settings.R;
+import com.android.settingslib.applications.DefaultAppInfo;
import com.android.settingslib.wrapper.PackageManagerWrapper;
import java.util.ArrayList;
diff --git a/src/com/android/settings/applications/defaultapps/DefaultPhonePicker.java b/src/com/android/settings/applications/defaultapps/DefaultPhonePicker.java
index 6a1d919..e462ab8 100644
--- a/src/com/android/settings/applications/defaultapps/DefaultPhonePicker.java
+++ b/src/com/android/settings/applications/defaultapps/DefaultPhonePicker.java
@@ -24,6 +24,7 @@
import com.android.internal.logging.nano.MetricsProto;
import com.android.settings.R;
+import com.android.settingslib.applications.DefaultAppInfo;
import java.util.ArrayList;
import java.util.List;
diff --git a/src/com/android/settings/applications/defaultapps/DefaultPhonePreferenceController.java b/src/com/android/settings/applications/defaultapps/DefaultPhonePreferenceController.java
index 92c9386..37d7192 100644
--- a/src/com/android/settings/applications/defaultapps/DefaultPhonePreferenceController.java
+++ b/src/com/android/settings/applications/defaultapps/DefaultPhonePreferenceController.java
@@ -23,6 +23,8 @@
import android.telecom.DefaultDialerManager;
import android.telephony.TelephonyManager;
+import com.android.settingslib.applications.DefaultAppInfo;
+
import java.util.List;
public class DefaultPhonePreferenceController extends DefaultAppPreferenceController {
diff --git a/src/com/android/settings/applications/defaultapps/DefaultSmsPicker.java b/src/com/android/settings/applications/defaultapps/DefaultSmsPicker.java
index 4c6c9ce..91f9caf 100644
--- a/src/com/android/settings/applications/defaultapps/DefaultSmsPicker.java
+++ b/src/com/android/settings/applications/defaultapps/DefaultSmsPicker.java
@@ -25,6 +25,8 @@
import com.android.internal.telephony.SmsApplication;
import com.android.settings.R;
import com.android.settings.Utils;
+import com.android.settingslib.applications.DefaultAppInfo;
+import com.android.settingslib.widget.CandidateInfo;
import java.util.ArrayList;
import java.util.Collection;
diff --git a/src/com/android/settings/applications/defaultapps/DefaultSmsPreferenceController.java b/src/com/android/settings/applications/defaultapps/DefaultSmsPreferenceController.java
index c3b7ac4..cb86b2e 100644
--- a/src/com/android/settings/applications/defaultapps/DefaultSmsPreferenceController.java
+++ b/src/com/android/settings/applications/defaultapps/DefaultSmsPreferenceController.java
@@ -21,6 +21,7 @@
import android.telephony.TelephonyManager;
import com.android.internal.telephony.SmsApplication;
+import com.android.settingslib.applications.DefaultAppInfo;
import java.util.Collection;
diff --git a/src/com/android/settings/applications/defaultapps/DefaultWorkBrowserPreferenceController.java b/src/com/android/settings/applications/defaultapps/DefaultWorkBrowserPreferenceController.java
index 4dc984b..4652855 100644
--- a/src/com/android/settings/applications/defaultapps/DefaultWorkBrowserPreferenceController.java
+++ b/src/com/android/settings/applications/defaultapps/DefaultWorkBrowserPreferenceController.java
@@ -21,6 +21,7 @@
import com.android.settings.Utils;
+
public class DefaultWorkBrowserPreferenceController extends DefaultBrowserPreferenceController {
public static final String KEY = "work_default_browser";
diff --git a/src/com/android/settings/applications/instantapps/InstantAppButtonsController.java b/src/com/android/settings/applications/instantapps/InstantAppButtonsController.java
deleted file mode 100644
index 42474a8..0000000
--- a/src/com/android/settings/applications/instantapps/InstantAppButtonsController.java
+++ /dev/null
@@ -1,113 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settings.applications.instantapps;
-
-import android.app.AlertDialog;
-import android.app.Fragment;
-import android.content.Context;
-import android.content.DialogInterface;
-import android.content.Intent;
-import android.os.UserHandle;
-import android.view.View;
-import android.widget.Button;
-
-import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
-import com.android.settings.R;
-import com.android.settings.applications.AppStoreUtil;
-import com.android.settings.overlay.FeatureFactory;
-import com.android.settingslib.wrapper.PackageManagerWrapper;
-
-/** Encapsulates a container for buttons relevant to instant apps */
-public class InstantAppButtonsController implements DialogInterface.OnClickListener {
-
- public interface ShowDialogDelegate {
- /**
- * Delegate that should be called when this controller wants to show a dialog.
- */
- void showDialog(int id);
- }
-
- private final Context mContext;
- private final Fragment mFragment;
- private final View mView;
- private final PackageManagerWrapper mPackageManagerWrapper;
- private final ShowDialogDelegate mShowDialogDelegate;
- private String mPackageName;
-
- public static final int DLG_BASE = 0x5032;
- public static final int DLG_CLEAR_APP = DLG_BASE + 1;
-
- public InstantAppButtonsController(
- Context context,
- Fragment fragment,
- View view,
- ShowDialogDelegate showDialogDelegate) {
- mContext = context;
- mFragment = fragment;
- mView = view;
- mShowDialogDelegate = showDialogDelegate;
- mPackageManagerWrapper = new PackageManagerWrapper(context.getPackageManager());
- }
-
- public InstantAppButtonsController setPackageName(String packageName) {
- mPackageName = packageName;
- return this;
- }
-
- public void bindButtons() {
- Button installButton = (Button)mView.findViewById(R.id.install);
- Button clearDataButton = (Button)mView.findViewById(R.id.clear_data);
- Intent appStoreIntent = AppStoreUtil.getAppStoreLink(mContext, mPackageName);
- if (appStoreIntent != null) {
- installButton.setEnabled(true);
- installButton.setOnClickListener(v -> mFragment.startActivity(appStoreIntent));
- }
-
- clearDataButton.setOnClickListener(v -> mShowDialogDelegate.showDialog(DLG_CLEAR_APP));
- }
-
- public AlertDialog createDialog(int id) {
- if (id == DLG_CLEAR_APP) {
- AlertDialog dialog = new AlertDialog.Builder(mFragment.getActivity())
- .setPositiveButton(R.string.clear_instant_app_data, this)
- .setNegativeButton(R.string.cancel, null)
- .setTitle(R.string.clear_instant_app_data)
- .setMessage(mContext.getString(R.string.clear_instant_app_confirmation))
- .create();
- return dialog;
- }
- return null;
- }
-
- public void onClick(DialogInterface dialog, int which) {
- if (which == DialogInterface.BUTTON_POSITIVE) {
- FeatureFactory.getFactory(mContext)
- .getMetricsFeatureProvider()
- .action(mContext,
- MetricsEvent.ACTION_SETTINGS_CLEAR_INSTANT_APP,
- mPackageName);
- mPackageManagerWrapper.deletePackageAsUser(
- mPackageName, null, 0, UserHandle.myUserId());
- }
- }
-
- public InstantAppButtonsController show() {
- bindButtons();
- mView.setVisibility(View.VISIBLE);
- return this;
- }
-}
diff --git a/src/com/android/settings/backup/BackupSettingsActivityPreferenceController.java b/src/com/android/settings/backup/BackupSettingsActivityPreferenceController.java
index dccc310..183d13f 100644
--- a/src/com/android/settings/backup/BackupSettingsActivityPreferenceController.java
+++ b/src/com/android/settings/backup/BackupSettingsActivityPreferenceController.java
@@ -19,7 +19,6 @@
import android.app.backup.BackupManager;
import android.content.Context;
import android.os.UserManager;
-import android.support.v7.preference.Preference;
import com.android.settings.R;
import com.android.settings.core.BasePreferenceController;
@@ -46,16 +45,11 @@
}
@Override
- public void updateState(Preference preference) {
- preference.setSummary(getSummary());
- }
-
- @Override
- public String getSummary() {
+ public CharSequence getSummary() {
final boolean backupEnabled = mBackupManager.isBackupEnabled();
return backupEnabled
- ? mContext.getString(R.string.accessibility_feature_state_on)
- : mContext.getString(R.string.accessibility_feature_state_off);
+ ? mContext.getText(R.string.accessibility_feature_state_on)
+ : mContext.getText(R.string.accessibility_feature_state_off);
}
}
\ No newline at end of file
diff --git a/src/com/android/settings/backup/BackupSettingsFragment.java b/src/com/android/settings/backup/BackupSettingsFragment.java
index e6bb12d..e9bcc6f 100644
--- a/src/com/android/settings/backup/BackupSettingsFragment.java
+++ b/src/com/android/settings/backup/BackupSettingsFragment.java
@@ -61,7 +61,7 @@
* Get a list of {@link AbstractPreferenceController} for this fragment.
*/
@Override
- protected List<AbstractPreferenceController> getPreferenceControllers(Context context) {
+ protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
final List<AbstractPreferenceController> controllers = new ArrayList<>();
controllers.add(new BackupSettingsPreferenceController(context));
return controllers;
diff --git a/src/com/android/settings/bluetooth/BluetoothDetailsMacAddressController.java b/src/com/android/settings/bluetooth/BluetoothDetailsMacAddressController.java
index dbcc5d6..b976561 100644
--- a/src/com/android/settings/bluetooth/BluetoothDetailsMacAddressController.java
+++ b/src/com/android/settings/bluetooth/BluetoothDetailsMacAddressController.java
@@ -45,14 +45,18 @@
protected void init(PreferenceScreen screen) {
mFooterPreference = mFooterPreferenceMixin.createFooterPreference();
mFooterPreference.setTitle(mContext.getString(
- R.string.bluetooth_device_mac_address, mCachedDevice.getAddress()));
+ R.string.bluetooth_device_mac_address, mCachedDevice.getAddress()));
}
@Override
- protected void refresh() {}
+ protected void refresh() {
+ }
@Override
public String getPreferenceKey() {
+ if (mFooterPreference == null) {
+ return null;
+ }
return mFooterPreference.getKey();
}
}
diff --git a/src/com/android/settings/bluetooth/BluetoothDeviceDetailsFragment.java b/src/com/android/settings/bluetooth/BluetoothDeviceDetailsFragment.java
index a762fa1..b9cfa00 100644
--- a/src/com/android/settings/bluetooth/BluetoothDeviceDetailsFragment.java
+++ b/src/com/android/settings/bluetooth/BluetoothDeviceDetailsFragment.java
@@ -136,7 +136,7 @@
}
@Override
- protected List<AbstractPreferenceController> getPreferenceControllers(Context context) {
+ protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
ArrayList<AbstractPreferenceController> controllers = new ArrayList<>();
if (mCachedDevice != null) {
diff --git a/src/com/android/settings/bluetooth/BluetoothDeviceNamePreferenceController.java b/src/com/android/settings/bluetooth/BluetoothDeviceNamePreferenceController.java
index bf13e07..f2f220a 100644
--- a/src/com/android/settings/bluetooth/BluetoothDeviceNamePreferenceController.java
+++ b/src/com/android/settings/bluetooth/BluetoothDeviceNamePreferenceController.java
@@ -113,7 +113,7 @@
}
@Override
- public String getSummary() {
+ public CharSequence getSummary() {
String deviceName = getDeviceName();
if (TextUtils.isEmpty(deviceName)) {
return super.getSummary();
diff --git a/src/com/android/settings/bluetooth/BluetoothDeviceRenamePreferenceController.java b/src/com/android/settings/bluetooth/BluetoothDeviceRenamePreferenceController.java
index cea0147..262d6b3 100644
--- a/src/com/android/settings/bluetooth/BluetoothDeviceRenamePreferenceController.java
+++ b/src/com/android/settings/bluetooth/BluetoothDeviceRenamePreferenceController.java
@@ -72,7 +72,7 @@
}
@Override
- public String getSummary() {
+ public CharSequence getSummary() {
return getDeviceName();
}
diff --git a/src/com/android/settings/bluetooth/BluetoothDeviceUpdater.java b/src/com/android/settings/bluetooth/BluetoothDeviceUpdater.java
index dbe2c1b..6376347 100644
--- a/src/com/android/settings/bluetooth/BluetoothDeviceUpdater.java
+++ b/src/com/android/settings/bluetooth/BluetoothDeviceUpdater.java
@@ -185,14 +185,6 @@
@Override
public void onActiveDeviceChanged(CachedBluetoothDevice activeDevice, int bluetoothProfile) {
- Collection<CachedBluetoothDevice> cachedDevices =
- mLocalManager.getCachedDeviceManager().getCachedDevicesCopy();
- // TODO: The state update of the Cached Bluetooth Devices should be
- // moved to the device manager: b/72316092
- for (CachedBluetoothDevice cachedBluetoothDevice : cachedDevices) {
- boolean isActive = Objects.equals(cachedBluetoothDevice, activeDevice);
- cachedBluetoothDevice.setActiveDevice(isActive, bluetoothProfile);
- }
}
/**
diff --git a/src/com/android/settings/bluetooth/BluetoothPairingDetail.java b/src/com/android/settings/bluetooth/BluetoothPairingDetail.java
index 5e003fe..0e556c4 100644
--- a/src/com/android/settings/bluetooth/BluetoothPairingDetail.java
+++ b/src/com/android/settings/bluetooth/BluetoothPairingDetail.java
@@ -193,7 +193,7 @@
}
@Override
- protected List<AbstractPreferenceController> getPreferenceControllers(Context context) {
+ protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
final List<AbstractPreferenceController> controllers = new ArrayList<>();
controllers.add(
new BluetoothDeviceRenamePreferenceController(context, KEY_RENAME_DEVICES, this,
diff --git a/src/com/android/settings/bluetooth/BluetoothSettings.java b/src/com/android/settings/bluetooth/BluetoothSettings.java
index 7ec0a67..47952c6 100644
--- a/src/com/android/settings/bluetooth/BluetoothSettings.java
+++ b/src/com/android/settings/bluetooth/BluetoothSettings.java
@@ -363,7 +363,7 @@
}
@Override
- protected List<AbstractPreferenceController> getPreferenceControllers(Context context) {
+ protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
final List<AbstractPreferenceController> controllers = new ArrayList<>();
final Lifecycle lifecycle = getLifecycle();
mDeviceNamePrefController = new BluetoothDeviceNamePreferenceController(context, lifecycle);
diff --git a/src/com/android/settings/bluetooth/DevicePickerFragment.java b/src/com/android/settings/bluetooth/DevicePickerFragment.java
index 847a9c9..07cda3d 100644
--- a/src/com/android/settings/bluetooth/DevicePickerFragment.java
+++ b/src/com/android/settings/bluetooth/DevicePickerFragment.java
@@ -170,7 +170,7 @@
}
@Override
- protected List<AbstractPreferenceController> getPreferenceControllers(Context context) {
+ protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
return null;
}
diff --git a/src/com/android/settings/connecteddevice/AdvancedConnectedDeviceDashboardFragment.java b/src/com/android/settings/connecteddevice/AdvancedConnectedDeviceDashboardFragment.java
index 32c2af7..f06b35a 100644
--- a/src/com/android/settings/connecteddevice/AdvancedConnectedDeviceDashboardFragment.java
+++ b/src/com/android/settings/connecteddevice/AdvancedConnectedDeviceDashboardFragment.java
@@ -24,11 +24,8 @@
import com.android.settings.bluetooth.BluetoothFilesPreferenceController;
import com.android.settings.bluetooth.BluetoothMasterSwitchPreferenceController;
import com.android.settings.bluetooth.BluetoothSwitchPreferenceController;
-import com.android.settings.connecteddevice.usb.UsbBackend;
-import com.android.settings.connecteddevice.usb.UsbModePreferenceController;
import com.android.settings.dashboard.DashboardFragment;
import com.android.settings.nfc.NfcPreferenceController;
-import com.android.settings.overlay.FeatureFactory;
import com.android.settings.print.PrintSettingPreferenceController;
import com.android.settings.search.BaseSearchIndexProvider;
import com.android.settingslib.core.AbstractPreferenceController;
@@ -66,7 +63,7 @@
}
@Override
- protected List<AbstractPreferenceController> getPreferenceControllers(Context context) {
+ protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
return buildControllers(context, getLifecycle());
}
@@ -76,8 +73,6 @@
final NfcPreferenceController nfcPreferenceController =
new NfcPreferenceController(context);
controllers.add(nfcPreferenceController);
- controllers.add(new UsbModePreferenceController(
- context, new UsbBackend(context), lifecycle));
final BluetoothSwitchPreferenceController bluetoothPreferenceController =
new BluetoothSwitchPreferenceController(context);
controllers.add(bluetoothPreferenceController);
@@ -123,7 +118,7 @@
}
@Override
- public List<AbstractPreferenceController> getPreferenceControllers(
+ public List<AbstractPreferenceController> createPreferenceControllers(
Context context) {
return buildControllers(context, null /* lifecycle */);
}
diff --git a/src/com/android/settings/connecteddevice/ConnectedDeviceDashboardFragment.java b/src/com/android/settings/connecteddevice/ConnectedDeviceDashboardFragment.java
index e9ae11e..8aab3cf 100644
--- a/src/com/android/settings/connecteddevice/ConnectedDeviceDashboardFragment.java
+++ b/src/com/android/settings/connecteddevice/ConnectedDeviceDashboardFragment.java
@@ -58,7 +58,7 @@
}
@Override
- protected List<AbstractPreferenceController> getPreferenceControllers(Context context) {
+ protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
final List<AbstractPreferenceController> controllers = new ArrayList<>();
final Lifecycle lifecycle = getLifecycle();
@@ -119,15 +119,7 @@
@Override
public List<String> getNonIndexableKeys(Context context) {
-
return new ArrayList<>();
}
-
- @Override
- public List<AbstractPreferenceController> getPreferenceControllers(
- Context context) {
- //TODO(b/69333961): update the index for controllers
- return super.getPreferenceControllers(context);
- }
};
}
diff --git a/src/com/android/settings/connecteddevice/ConnectedDeviceDashboardFragmentOld.java b/src/com/android/settings/connecteddevice/ConnectedDeviceDashboardFragmentOld.java
deleted file mode 100644
index a9ba6e5..0000000
--- a/src/com/android/settings/connecteddevice/ConnectedDeviceDashboardFragmentOld.java
+++ /dev/null
@@ -1,155 +0,0 @@
-/*
- * Copyright (C) 2016 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.connecteddevice;
-
-import android.app.Activity;
-import android.content.Context;
-import android.content.pm.PackageManager;
-import android.provider.SearchIndexableResource;
-import android.support.annotation.VisibleForTesting;
-
-import com.android.internal.logging.nano.MetricsProto;
-import com.android.settings.R;
-import com.android.settings.bluetooth.BluetoothMasterSwitchPreferenceController;
-import com.android.settings.bluetooth.Utils;
-import com.android.settings.connecteddevice.usb.UsbBackend;
-import com.android.settings.connecteddevice.usb.UsbModePreferenceController;
-import com.android.settings.dashboard.DashboardFragment;
-import com.android.settings.dashboard.SummaryLoader;
-import com.android.settings.nfc.NfcPreferenceController;
-import com.android.settings.search.BaseSearchIndexProvider;
-import com.android.settingslib.core.AbstractPreferenceController;
-import com.android.settingslib.core.lifecycle.Lifecycle;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-/**
- * This is the previous {@link ConnectedDeviceDashboardFragment} in Android O, in Android P the
- * main entry will be {@link ConnectedDeviceDashboardFragment}
- *
- * @deprecated
- */
-@Deprecated
-public class ConnectedDeviceDashboardFragmentOld extends DashboardFragment {
-
- private static final String TAG = "ConnectedDeviceFrag2";
- private UsbModePreferenceController mUsbPrefController;
-
- @Override
- public int getMetricsCategory() {
- return MetricsProto.MetricsEvent.SETTINGS_CONNECTED_DEVICE_CATEGORY;
- }
-
- @Override
- protected String getLogTag() {
- return TAG;
- }
-
- @Override
- public int getHelpResource() {
- return R.string.help_url_connected_devices;
- }
-
- @Override
- protected int getPreferenceScreenResId() {
- return R.xml.connected_devices_old;
- }
-
- @Override
- protected List<AbstractPreferenceController> getPreferenceControllers(Context context) {
- final List<AbstractPreferenceController> controllers = new ArrayList<>();
- final Lifecycle lifecycle = getLifecycle();
- final NfcPreferenceController nfcPreferenceController =
- new NfcPreferenceController(context);
- lifecycle.addObserver(nfcPreferenceController);
- controllers.add(nfcPreferenceController);
- mUsbPrefController = new UsbModePreferenceController(context, new UsbBackend(context),
- lifecycle);
- controllers.add(mUsbPrefController);
- final BluetoothMasterSwitchPreferenceController bluetoothPreferenceController =
- new BluetoothMasterSwitchPreferenceController(
- context, Utils.getLocalBtManager(context), this);
- lifecycle.addObserver(bluetoothPreferenceController);
- controllers.add(bluetoothPreferenceController);
-
- return controllers;
- }
-
- @VisibleForTesting
- static class SummaryProvider implements SummaryLoader.SummaryProvider {
-
- private final Context mContext;
- private final SummaryLoader mSummaryLoader;
- private final NfcPreferenceController mNfcPreferenceController;
-
- public SummaryProvider(Context context, SummaryLoader summaryLoader) {
- mContext = context;
- mSummaryLoader = summaryLoader;
- mNfcPreferenceController = new NfcPreferenceController(context);
- }
-
- @Override
- public void setListening(boolean listening) {
- if (listening) {
- if (mNfcPreferenceController.isAvailable()) {
- mSummaryLoader.setSummary(this,
- mContext.getString(R.string.connected_devices_dashboard_summary));
- } else {
- mSummaryLoader.setSummary(this, mContext.getString(
- R.string.connected_devices_dashboard_no_nfc_summary));
- }
- }
- }
- }
-
- public static final SummaryLoader.SummaryProviderFactory SUMMARY_PROVIDER_FACTORY
- = new SummaryLoader.SummaryProviderFactory() {
- @Override
- public SummaryLoader.SummaryProvider createSummaryProvider(Activity activity,
- SummaryLoader summaryLoader) {
- return new SummaryProvider(activity, summaryLoader);
- }
- };
-
- /**
- * For Search.
- */
- public static final SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
- new BaseSearchIndexProvider() {
- @Override
- public List<SearchIndexableResource> getXmlResourcesToIndex(
- Context context, boolean enabled) {
- final SearchIndexableResource sir = new SearchIndexableResource(context);
- sir.xmlResId = R.xml.connected_devices_old;
- return Arrays.asList(sir);
- }
-
- @Override
- public List<String> getNonIndexableKeys(Context context) {
- final List<String> keys = super.getNonIndexableKeys(context);
- PackageManager pm = context.getPackageManager();
- if (!pm.hasSystemFeature(PackageManager.FEATURE_NFC)) {
- keys.add(NfcPreferenceController.KEY_TOGGLE_NFC);
- keys.add(NfcPreferenceController.KEY_ANDROID_BEAM_SETTINGS);
- }
- keys.add(BluetoothMasterSwitchPreferenceController.KEY_TOGGLE_BLUETOOTH);
-
- return keys;
- }
- };
-}
diff --git a/src/com/android/settings/connecteddevice/usb/ConnectedUsbDeviceUpdater.java b/src/com/android/settings/connecteddevice/usb/ConnectedUsbDeviceUpdater.java
index b637e35..1201b85 100644
--- a/src/com/android/settings/connecteddevice/usb/ConnectedUsbDeviceUpdater.java
+++ b/src/com/android/settings/connecteddevice/usb/ConnectedUsbDeviceUpdater.java
@@ -40,8 +40,7 @@
UsbConnectionBroadcastReceiver.UsbConnectionListener mUsbConnectionListener =
(connected, newMode) -> {
if (connected) {
- mUsbPreference.setSummary(
- UsbModePreferenceController.getSummary(mUsbBackend.getCurrentMode()));
+ mUsbPreference.setSummary(getSummary(mUsbBackend.getCurrentMode()));
mDevicePreferenceCallback.onDeviceAdded(mUsbPreference);
} else {
mDevicePreferenceCallback.onDeviceRemoved(mUsbPreference);
@@ -94,4 +93,31 @@
//TODO(b/70336520): Use an API to get data instead of sticky intent
mUsbReceiver.register();
}
+
+ public static int getSummary(int mode) {
+ switch (mode) {
+ case UsbBackend.MODE_POWER_SINK | UsbBackend.MODE_DATA_NONE:
+ return R.string.usb_summary_charging_only;
+ case UsbBackend.MODE_POWER_SOURCE | UsbBackend.MODE_DATA_NONE:
+ return R.string.usb_summary_power_only;
+ case UsbBackend.MODE_POWER_SINK | UsbBackend.MODE_DATA_MTP:
+ return R.string.usb_summary_file_transfers;
+ case UsbBackend.MODE_POWER_SINK | UsbBackend.MODE_DATA_PTP:
+ return R.string.usb_summary_photo_transfers;
+ case UsbBackend.MODE_POWER_SINK | UsbBackend.MODE_DATA_MIDI:
+ return R.string.usb_summary_MIDI;
+ case UsbBackend.MODE_POWER_SINK | UsbBackend.MODE_DATA_TETHER:
+ return R.string.usb_summary_tether;
+ case UsbBackend.MODE_POWER_SOURCE | UsbBackend.MODE_DATA_MTP:
+ return R.string.usb_summary_file_transfers_power;
+ case UsbBackend.MODE_POWER_SOURCE | UsbBackend.MODE_DATA_PTP:
+ return R.string.usb_summary_photo_transfers_power;
+ case UsbBackend.MODE_POWER_SOURCE | UsbBackend.MODE_DATA_MIDI:
+ return R.string.usb_summary_MIDI_power;
+ case UsbBackend.MODE_POWER_SOURCE | UsbBackend.MODE_DATA_TETHER:
+ return R.string.usb_summary_tether_power;
+ default:
+ return R.string.usb_summary_charging_only;
+ }
+ }
}
diff --git a/src/com/android/settings/connecteddevice/usb/UsbBackend.java b/src/com/android/settings/connecteddevice/usb/UsbBackend.java
index cdfb6b0..d204c17 100644
--- a/src/com/android/settings/connecteddevice/usb/UsbBackend.java
+++ b/src/com/android/settings/connecteddevice/usb/UsbBackend.java
@@ -21,10 +21,12 @@
import android.hardware.usb.UsbPort;
import android.hardware.usb.UsbPortStatus;
import android.net.ConnectivityManager;
-import android.os.UserHandle;
import android.os.UserManager;
import android.support.annotation.VisibleForTesting;
+import com.android.settings.wrapper.UsbManagerWrapper;
+import com.android.settings.wrapper.UserManagerWrapper;
+
public class UsbBackend {
public static final int MODE_POWER_MASK = 0x01;
@@ -47,31 +49,31 @@
private UsbManager mUsbManager;
@VisibleForTesting
- UsbManagerPassThrough mUsbManagerPassThrough;
+ UsbManagerWrapper mUsbManagerWrapper;
private UsbPort mPort;
private UsbPortStatus mPortStatus;
private Context mContext;
public UsbBackend(Context context) {
- this(context, new UserRestrictionUtil(context), null);
+ this(context, new UserManagerWrapper(UserManager.get(context)), null);
}
@VisibleForTesting
- public UsbBackend(Context context, UserRestrictionUtil userRestrictionUtil,
- UsbManagerPassThrough usbManagerPassThrough) {
+ public UsbBackend(Context context, UserManagerWrapper userManagerWrapper,
+ UsbManagerWrapper usbManagerWrapper) {
mContext = context;
mUsbManager = context.getSystemService(UsbManager.class);
- mUsbManagerPassThrough = usbManagerPassThrough;
- if (mUsbManagerPassThrough == null) {
- mUsbManagerPassThrough = new UsbManagerPassThrough(mUsbManager);
+ mUsbManagerWrapper = usbManagerWrapper;
+ if (mUsbManagerWrapper == null) {
+ mUsbManagerWrapper = new UsbManagerWrapper(mUsbManager);
}
- mFileTransferRestricted = userRestrictionUtil.isUsbFileTransferRestricted();
- mFileTransferRestrictedBySystem = userRestrictionUtil.isUsbFileTransferRestrictedBySystem();
- mTetheringRestricted = userRestrictionUtil.isUsbTetheringRestricted();
- mTetheringRestrictedBySystem = userRestrictionUtil.isUsbTetheringRestrictedBySystem();
+ mFileTransferRestricted = userManagerWrapper.isUsbFileTransferRestricted();
+ mFileTransferRestrictedBySystem = userManagerWrapper.isUsbFileTransferRestrictedBySystem();
+ mTetheringRestricted = userManagerWrapper.isUsbTetheringRestricted();
+ mTetheringRestrictedBySystem = userManagerWrapper.isUsbTetheringRestrictedBySystem();
mMidiSupported = context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_MIDI);
ConnectivityManager cm =
@@ -106,37 +108,15 @@
}
public int getUsbDataMode() {
- long functions = mUsbManagerPassThrough.getCurrentFunctions();
- if (functions == UsbManager.FUNCTION_MTP) {
- return MODE_DATA_MTP;
- } else if (functions == UsbManager.FUNCTION_PTP) {
- return MODE_DATA_PTP;
- } else if (functions == UsbManager.FUNCTION_MIDI) {
- return MODE_DATA_MIDI;
- } else if (functions == UsbManager.FUNCTION_RNDIS) {
- return MODE_DATA_TETHER;
- }
- return MODE_DATA_NONE;
+ return usbFunctionToMode(mUsbManagerWrapper.getCurrentFunctions());
}
- private void setUsbFunction(int mode) {
- switch (mode) {
- case MODE_DATA_MTP:
- mUsbManager.setCurrentFunctions(UsbManager.FUNCTION_MTP);
- break;
- case MODE_DATA_PTP:
- mUsbManager.setCurrentFunctions(UsbManager.FUNCTION_PTP);
- break;
- case MODE_DATA_MIDI:
- mUsbManager.setCurrentFunctions(UsbManager.FUNCTION_MIDI);
- break;
- case MODE_DATA_TETHER:
- mUsbManager.setCurrentFunctions(UsbManager.FUNCTION_RNDIS);
- break;
- default:
- mUsbManager.setCurrentFunctions(UsbManager.FUNCTION_NONE);
- break;
- }
+ public void setDefaultUsbMode(int mode) {
+ mUsbManager.setScreenUnlockedFunctions(modeToUsbFunction(mode & MODE_DATA_MASK));
+ }
+
+ public int getDefaultUsbMode() {
+ return usbFunctionToMode(mUsbManager.getScreenUnlockedFunctions());
}
public void setMode(int mode) {
@@ -153,11 +133,6 @@
setUsbFunction(mode & MODE_DATA_MASK);
}
- private int modeToPower(int mode) {
- return (mode & MODE_POWER_MASK) == MODE_POWER_SOURCE
- ? UsbPort.POWER_ROLE_SOURCE : UsbPort.POWER_ROLE_SINK;
- }
-
public boolean isModeDisallowed(int mode) {
if (mFileTransferRestricted && ((mode & MODE_DATA_MASK) == MODE_DATA_MTP
|| (mode & MODE_DATA_MASK) == MODE_DATA_PTP)) {
@@ -201,47 +176,40 @@
return (mode & MODE_POWER_MASK) != MODE_POWER_SOURCE;
}
- // Wrapper class to enable testing with UserManager APIs
- public static class UserRestrictionUtil {
- private UserManager mUserManager;
-
- public UserRestrictionUtil(Context context) {
- mUserManager = UserManager.get(context);
+ private static int usbFunctionToMode(long functions) {
+ if (functions == UsbManager.FUNCTION_MTP) {
+ return MODE_DATA_MTP;
+ } else if (functions == UsbManager.FUNCTION_PTP) {
+ return MODE_DATA_PTP;
+ } else if (functions == UsbManager.FUNCTION_MIDI) {
+ return MODE_DATA_MIDI;
+ } else if (functions == UsbManager.FUNCTION_RNDIS) {
+ return MODE_DATA_TETHER;
}
+ return MODE_DATA_NONE;
+ }
- public boolean isUsbFileTransferRestricted() {
- return mUserManager.hasUserRestriction(UserManager.DISALLOW_USB_FILE_TRANSFER);
- }
-
- public boolean isUsbTetheringRestricted() {
- return mUserManager.hasUserRestriction(UserManager.DISALLOW_CONFIG_TETHERING);
- }
-
- public boolean isUsbFileTransferRestrictedBySystem() {
- return mUserManager.hasBaseUserRestriction(
- UserManager.DISALLOW_USB_FILE_TRANSFER, UserHandle.of(UserHandle.myUserId()));
- }
-
- public boolean isUsbTetheringRestrictedBySystem() {
- return mUserManager.hasBaseUserRestriction(
- UserManager.DISALLOW_CONFIG_TETHERING, UserHandle.of(UserHandle.myUserId()));
+ private static long modeToUsbFunction(int mode) {
+ switch (mode) {
+ case MODE_DATA_MTP:
+ return UsbManager.FUNCTION_MTP;
+ case MODE_DATA_PTP:
+ return UsbManager.FUNCTION_PTP;
+ case MODE_DATA_MIDI:
+ return UsbManager.FUNCTION_MIDI;
+ case MODE_DATA_TETHER:
+ return UsbManager.FUNCTION_RNDIS;
+ default:
+ return UsbManager.FUNCTION_NONE;
}
}
- // Temporary pass-through to allow roboelectric to use getCurrentFunctions()
- public static class UsbManagerPassThrough {
- private UsbManager mUsbManager;
+ private static int modeToPower(int mode) {
+ return (mode & MODE_POWER_MASK) == MODE_POWER_SOURCE
+ ? UsbPort.POWER_ROLE_SOURCE : UsbPort.POWER_ROLE_SINK;
+ }
- public UsbManagerPassThrough(UsbManager manager) {
- mUsbManager = manager;
- }
-
- public long getCurrentFunctions() {
- return mUsbManager.getCurrentFunctions();
- }
-
- public long usbFunctionsFromString(String str) {
- return UsbManager.usbFunctionsFromString(str);
- }
+ private void setUsbFunction(int mode) {
+ mUsbManager.setCurrentFunctions(modeToUsbFunction(mode));
}
}
diff --git a/src/com/android/settings/connecteddevice/usb/UsbDefaultFragment.java b/src/com/android/settings/connecteddevice/usb/UsbDefaultFragment.java
new file mode 100644
index 0000000..4c2a9b1
--- /dev/null
+++ b/src/com/android/settings/connecteddevice/usb/UsbDefaultFragment.java
@@ -0,0 +1,160 @@
+/*
+ * 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.connecteddevice.usb;
+
+import android.content.Context;
+import android.graphics.drawable.Drawable;
+import android.hardware.usb.UsbManager;
+import android.os.Bundle;
+
+import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.logging.nano.MetricsProto;
+import com.android.settings.R;
+import com.android.settings.Utils;
+import com.android.settings.widget.RadioButtonPickerFragment;
+import com.android.settingslib.widget.CandidateInfo;
+import com.android.settingslib.widget.FooterPreference;
+import com.android.settingslib.widget.FooterPreferenceMixin;
+
+import com.google.android.collect.Lists;
+
+import java.util.List;
+
+/**
+ * Provides options for selecting the default USB mode.
+ */
+public class UsbDefaultFragment extends RadioButtonPickerFragment {
+ @VisibleForTesting
+ UsbBackend mUsbBackend;
+
+ private static final String[] FUNCTIONS_LIST = {
+ UsbManager.USB_FUNCTION_NONE,
+ UsbManager.USB_FUNCTION_MTP,
+ UsbManager.USB_FUNCTION_RNDIS,
+ UsbManager.USB_FUNCTION_MIDI,
+ UsbManager.USB_FUNCTION_PTP
+ };
+
+ @Override
+ public void onAttach(Context context) {
+ super.onAttach(context);
+ mUsbBackend = new UsbBackend(context);
+ }
+
+ @Override
+ public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
+ super.onCreatePreferences(savedInstanceState, rootKey);
+ FooterPreferenceMixin footer = new FooterPreferenceMixin(this, this.getLifecycle());
+ FooterPreference pref = footer.createFooterPreference();
+ pref.setTitle(R.string.usb_default_info);
+ }
+
+ @Override
+ public int getMetricsCategory() {
+ return MetricsProto.MetricsEvent.USB_DEFAULT;
+ }
+
+ @Override
+ protected int getPreferenceScreenResId() {
+ return R.xml.usb_default_fragment;
+ }
+
+ @Override
+ protected List<? extends CandidateInfo> getCandidates() {
+ List<CandidateInfo> ret = Lists.newArrayList();
+ for (final String option : FUNCTIONS_LIST) {
+ int newMode = 0;
+ final String title;
+ final Context context = getContext();
+ if (option.equals(UsbManager.USB_FUNCTION_MTP)) {
+ newMode = UsbBackend.MODE_DATA_MTP;
+ title = context.getString(R.string.usb_use_file_transfers);
+ } else if (option.equals(UsbManager.USB_FUNCTION_PTP)) {
+ newMode = UsbBackend.MODE_DATA_PTP;
+ title = context.getString(R.string.usb_use_photo_transfers);
+ } else if (option.equals(UsbManager.USB_FUNCTION_MIDI)) {
+ newMode = UsbBackend.MODE_DATA_MIDI;
+ title = context.getString(R.string.usb_use_MIDI);
+ } else if (option.equals(UsbManager.USB_FUNCTION_RNDIS)) {
+ newMode = UsbBackend.MODE_DATA_TETHER;
+ title = context.getString(R.string.usb_use_tethering);
+ } else if (option.equals(UsbManager.USB_FUNCTION_NONE)) {
+ newMode = UsbBackend.MODE_DATA_NONE;
+ title = context.getString(R.string.usb_use_charging_only);
+ } else {
+ title = "";
+ }
+
+ // Only show supported and allowed options
+ if (mUsbBackend.isModeSupported(newMode)
+ && !mUsbBackend.isModeDisallowedBySystem(newMode)
+ && !mUsbBackend.isModeDisallowed(newMode)) {
+ ret.add(new CandidateInfo(true /* enabled */) {
+ @Override
+ public CharSequence loadLabel() {
+ return title;
+ }
+
+ @Override
+ public Drawable loadIcon() {
+ return null;
+ }
+
+ @Override
+ public String getKey() {
+ return option;
+ }
+ });
+ }
+ }
+ return ret;
+ }
+
+ @Override
+ protected String getDefaultKey() {
+ switch (mUsbBackend.getDefaultUsbMode()) {
+ case UsbBackend.MODE_DATA_MTP:
+ return UsbManager.USB_FUNCTION_MTP;
+ case UsbBackend.MODE_DATA_PTP:
+ return UsbManager.USB_FUNCTION_PTP;
+ case UsbBackend.MODE_DATA_TETHER:
+ return UsbManager.USB_FUNCTION_RNDIS;
+ case UsbBackend.MODE_DATA_MIDI:
+ return UsbManager.USB_FUNCTION_MIDI;
+ default:
+ return UsbManager.USB_FUNCTION_NONE;
+ }
+ }
+
+ @Override
+ protected boolean setDefaultKey(String key) {
+ int thisMode = UsbBackend.MODE_DATA_NONE;
+ if (key.equals(UsbManager.USB_FUNCTION_MTP)) {
+ thisMode = UsbBackend.MODE_DATA_MTP;
+ } else if (key.equals(UsbManager.USB_FUNCTION_PTP)) {
+ thisMode = UsbBackend.MODE_DATA_PTP;
+ } else if (key.equals(UsbManager.USB_FUNCTION_RNDIS)) {
+ thisMode = UsbBackend.MODE_DATA_TETHER;
+ } else if (key.equals(UsbManager.USB_FUNCTION_MIDI)) {
+ thisMode = UsbBackend.MODE_DATA_MIDI;
+ }
+ if (!Utils.isMonkeyRunning()) {
+ mUsbBackend.setDefaultUsbMode(thisMode);
+ }
+ return true;
+ }
+}
\ No newline at end of file
diff --git a/src/com/android/settings/connecteddevice/usb/UsbDetailsFragment.java b/src/com/android/settings/connecteddevice/usb/UsbDetailsFragment.java
index c861188..f758e23 100644
--- a/src/com/android/settings/connecteddevice/usb/UsbDetailsFragment.java
+++ b/src/com/android/settings/connecteddevice/usb/UsbDetailsFragment.java
@@ -79,7 +79,7 @@
}
@Override
- protected List<AbstractPreferenceController> getPreferenceControllers(Context context) {
+ protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
mUsbBackend = new UsbBackend(context);
mControllers = createControllerList(context, mUsbBackend, this);
mUsbReceiver = new UsbConnectionBroadcastReceiver(context, mUsbConnectionListener,
@@ -121,7 +121,7 @@
}
@Override
- public List<AbstractPreferenceController> getPreferenceControllers(
+ public List<AbstractPreferenceController> createPreferenceControllers(
Context context) {
List<AbstractPreferenceController> ret = new ArrayList<>();
ret.addAll(createControllerList(context, new UsbBackend(context), null));
diff --git a/src/com/android/settings/connecteddevice/usb/UsbDetailsHeaderController.java b/src/com/android/settings/connecteddevice/usb/UsbDetailsHeaderController.java
index 7ac0235..6605be8 100644
--- a/src/com/android/settings/connecteddevice/usb/UsbDetailsHeaderController.java
+++ b/src/com/android/settings/connecteddevice/usb/UsbDetailsHeaderController.java
@@ -53,7 +53,7 @@
mHeaderController.setLabel(mContext.getString(R.string.usb_pref));
mHeaderController.setIcon(mContext.getDrawable(R.drawable.ic_usb));
mHeaderController.setSummary(
- mContext.getString(UsbModePreferenceController.getSummary(newMode)));
+ mContext.getString(ConnectedUsbDeviceUpdater.getSummary(newMode)));
mHeaderController.done(mFragment.getActivity(), true /* rebindActions */);
}
diff --git a/src/com/android/settings/connecteddevice/usb/UsbModeChooserActivity.java b/src/com/android/settings/connecteddevice/usb/UsbModeChooserActivity.java
deleted file mode 100644
index b3b0718..0000000
--- a/src/com/android/settings/connecteddevice/usb/UsbModeChooserActivity.java
+++ /dev/null
@@ -1,204 +0,0 @@
-/*
- * Copyright (C) 2015 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.connecteddevice.usb;
-
-import android.annotation.Nullable;
-import android.app.Activity;
-import android.app.ActivityManager;
-import android.app.AlertDialog;
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.DialogInterface;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.graphics.drawable.Drawable;
-import android.graphics.PorterDuff;
-import android.hardware.usb.UsbManager;
-import android.os.Bundle;
-import android.os.UserHandle;
-import android.os.UserManager;
-import android.support.annotation.VisibleForTesting;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.View.OnClickListener;
-import android.widget.Checkable;
-import android.widget.LinearLayout;
-import android.widget.TextView;
-
-import com.android.settings.R;
-import com.android.settingslib.RestrictedLockUtils;
-
-import static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
-
-/**
- * UI for the USB chooser dialog.
- *
- */
-public class UsbModeChooserActivity extends Activity {
-
- public static final int[] DEFAULT_MODES = {
- UsbBackend.MODE_POWER_SINK | UsbBackend.MODE_DATA_NONE,
- UsbBackend.MODE_POWER_SOURCE | UsbBackend.MODE_DATA_NONE,
- UsbBackend.MODE_POWER_SINK | UsbBackend.MODE_DATA_MTP,
- UsbBackend.MODE_POWER_SINK | UsbBackend.MODE_DATA_PTP,
- UsbBackend.MODE_POWER_SINK | UsbBackend.MODE_DATA_MIDI
- };
-
- private UsbBackend mBackend;
- private AlertDialog mDialog;
- private LayoutInflater mLayoutInflater;
- private EnforcedAdmin mEnforcedAdmin;
-
- private BroadcastReceiver mDisconnectedReceiver = new BroadcastReceiver() {
- @Override
- public void onReceive(Context context, Intent intent) {
- String action = intent.getAction();
- if (UsbManager.ACTION_USB_STATE.equals(action)) {
- boolean connected = intent.getBooleanExtra(UsbManager.USB_CONNECTED, false);
- boolean hostConnected =
- intent.getBooleanExtra(UsbManager.USB_HOST_CONNECTED, false);
- if (!connected && !hostConnected) {
- mDialog.dismiss();
- }
- }
- }
- };
-
- @Override
- protected void onCreate(@Nullable Bundle savedInstanceState) {
-
- super.onCreate(savedInstanceState);
-
- mLayoutInflater = LayoutInflater.from(this);
-
- mDialog = new AlertDialog.Builder(this)
- .setTitle(R.string.usb_use)
- .setView(R.layout.usb_dialog_container)
- .setOnDismissListener(new DialogInterface.OnDismissListener() {
- @Override
- public void onDismiss(DialogInterface dialog) {
- finish();
- }
- })
- .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int which) {
- finish();
- }
- }).create();
- mDialog.show();
-
- LinearLayout container = (LinearLayout) mDialog.findViewById(R.id.container);
-
- mEnforcedAdmin = RestrictedLockUtils.checkIfRestrictionEnforced(this,
- UserManager.DISALLOW_USB_FILE_TRANSFER, UserHandle.myUserId());
- mBackend = new UsbBackend(this);
- int current = mBackend.getCurrentMode();
- for (int i = 0; i < DEFAULT_MODES.length; i++) {
- if (mBackend.isModeSupported(DEFAULT_MODES[i])
- && !mBackend.isModeDisallowedBySystem(DEFAULT_MODES[i])) {
- inflateOption(DEFAULT_MODES[i], current == DEFAULT_MODES[i], container,
- mBackend.isModeDisallowed(DEFAULT_MODES[i]));
- }
- }
- }
-
- @Override
- public void onStart() {
- super.onStart();
-
- IntentFilter filter = new IntentFilter(UsbManager.ACTION_USB_STATE);
- registerReceiver(mDisconnectedReceiver, filter);
- }
-
- @Override
- protected void onStop() {
- unregisterReceiver(mDisconnectedReceiver);
- super.onStop();
- }
-
- private void inflateOption(final int mode, boolean selected, LinearLayout container,
- final boolean disallowedByAdmin) {
- View v = mLayoutInflater.inflate(R.layout.restricted_radio_with_summary, container, false);
-
- TextView titleView = (TextView) v.findViewById(android.R.id.title);
- titleView.setText(getTitle(mode));
- TextView summaryView = (TextView) v.findViewById(android.R.id.summary);
- updateSummary(summaryView, mode);
-
- if (disallowedByAdmin) {
- if (mEnforcedAdmin != null) {
- setDisabledByAdmin(v, titleView, summaryView);
- } else {
- return;
- }
- }
-
- v.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- if (disallowedByAdmin && mEnforcedAdmin != null) {
- RestrictedLockUtils.sendShowAdminSupportDetailsIntent(
- UsbModeChooserActivity.this, mEnforcedAdmin);
- return;
- }
- if (!ActivityManager.isUserAMonkey()) {
- mBackend.setMode(mode);
- }
- mDialog.dismiss();
- finish();
- }
- });
- ((Checkable) v).setChecked(selected);
- container.addView(v);
- }
-
- private void setDisabledByAdmin(View rootView, TextView titleView, TextView summaryView) {
- if (mEnforcedAdmin != null) {
- titleView.setEnabled(false);
- summaryView.setEnabled(false);
- rootView.findViewById(R.id.restricted_icon).setVisibility(View.VISIBLE);
- Drawable[] compoundDrawables = titleView.getCompoundDrawablesRelative();
- compoundDrawables[0 /* start */].mutate().setColorFilter(
- getColor(R.color.disabled_text_color), PorterDuff.Mode.MULTIPLY);
- }
- }
-
- @VisibleForTesting
- static void updateSummary(TextView summaryView, int mode) {
- if (mode == (UsbBackend.MODE_POWER_SOURCE | UsbBackend.MODE_DATA_NONE)) {
- summaryView.setText(R.string.usb_use_power_only_desc);
- }
- }
-
- @VisibleForTesting
- static int getTitle(int mode) {
- switch (mode) {
- case UsbBackend.MODE_POWER_SINK | UsbBackend.MODE_DATA_NONE:
- return R.string.usb_use_charging_only;
- case UsbBackend.MODE_POWER_SOURCE | UsbBackend.MODE_DATA_NONE:
- return R.string.usb_use_power_only;
- case UsbBackend.MODE_POWER_SINK | UsbBackend.MODE_DATA_MTP:
- return R.string.usb_use_file_transfers;
- case UsbBackend.MODE_POWER_SINK | UsbBackend.MODE_DATA_PTP:
- return R.string.usb_use_photo_transfers;
- case UsbBackend.MODE_POWER_SINK | UsbBackend.MODE_DATA_MIDI:
- return R.string.usb_use_MIDI;
- }
- return 0;
- }
-}
diff --git a/src/com/android/settings/connecteddevice/usb/UsbModePreferenceController.java b/src/com/android/settings/connecteddevice/usb/UsbModePreferenceController.java
deleted file mode 100644
index d7624f0..0000000
--- a/src/com/android/settings/connecteddevice/usb/UsbModePreferenceController.java
+++ /dev/null
@@ -1,122 +0,0 @@
-/*
- * Copyright (C) 2016 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.connecteddevice.usb;
-
-import android.content.Context;
-import android.support.v7.preference.Preference;
-import android.support.v7.preference.PreferenceScreen;
-
-import com.android.internal.annotations.VisibleForTesting;
-import com.android.settings.R;
-import com.android.settings.core.PreferenceControllerMixin;
-import com.android.settingslib.core.AbstractPreferenceController;
-import com.android.settingslib.core.lifecycle.Lifecycle;
-import com.android.settingslib.core.lifecycle.LifecycleObserver;
-import com.android.settingslib.core.lifecycle.events.OnPause;
-import com.android.settingslib.core.lifecycle.events.OnResume;
-
-public class UsbModePreferenceController extends AbstractPreferenceController
- implements PreferenceControllerMixin, LifecycleObserver, OnResume, OnPause {
-
- private static final String KEY_USB_MODE = "usb_mode";
-
- private UsbBackend mUsbBackend;
- @VisibleForTesting
- UsbConnectionBroadcastReceiver mUsbReceiver;
- private Preference mUsbPreference;
-
- public UsbModePreferenceController(Context context, UsbBackend usbBackend,
- Lifecycle lifecycle) {
- super(context);
- mUsbBackend = usbBackend;
- mUsbReceiver = new UsbConnectionBroadcastReceiver(mContext, (connected, newMode) -> {
- updateSummary(mUsbPreference, connected, newMode);
- }, mUsbBackend);
- if (lifecycle != null) {
- lifecycle.addObserver(this);
- }
- }
-
- @Override
- public void displayPreference(PreferenceScreen screen) {
- super.displayPreference(screen);
- mUsbPreference = screen.findPreference(KEY_USB_MODE);
- }
-
- @Override
- public void updateState(Preference preference) {
- updateSummary(preference, mUsbReceiver.isConnected(), mUsbBackend.getCurrentMode());
- }
-
- @Override
- public boolean isAvailable() {
- return true;
- }
-
- @Override
- public String getPreferenceKey() {
- return KEY_USB_MODE;
- }
-
- @Override
- public void onPause() {
- mUsbReceiver.unregister();
- }
-
- @Override
- public void onResume() {
- mUsbReceiver.register();
- }
-
- public static int getSummary(int mode) {
- switch (mode) {
- case UsbBackend.MODE_POWER_SINK | UsbBackend.MODE_DATA_NONE:
- return R.string.usb_summary_charging_only;
- case UsbBackend.MODE_POWER_SOURCE | UsbBackend.MODE_DATA_NONE:
- return R.string.usb_summary_power_only;
- case UsbBackend.MODE_POWER_SINK | UsbBackend.MODE_DATA_MTP:
- return R.string.usb_summary_file_transfers;
- case UsbBackend.MODE_POWER_SINK | UsbBackend.MODE_DATA_PTP:
- return R.string.usb_summary_photo_transfers;
- case UsbBackend.MODE_POWER_SINK | UsbBackend.MODE_DATA_MIDI:
- return R.string.usb_summary_MIDI;
- case UsbBackend.MODE_POWER_SINK | UsbBackend.MODE_DATA_TETHER:
- return R.string.usb_summary_tether;
- case UsbBackend.MODE_POWER_SOURCE | UsbBackend.MODE_DATA_MTP:
- return R.string.usb_summary_file_transfers_power;
- case UsbBackend.MODE_POWER_SOURCE | UsbBackend.MODE_DATA_PTP:
- return R.string.usb_summary_photo_transfers_power;
- case UsbBackend.MODE_POWER_SOURCE | UsbBackend.MODE_DATA_MIDI:
- return R.string.usb_summary_MIDI_power;
- case UsbBackend.MODE_POWER_SOURCE | UsbBackend.MODE_DATA_TETHER:
- return R.string.usb_summary_tether_power;
- default:
- return R.string.usb_summary_charging_only;
- }
- }
-
- private void updateSummary(Preference preference, boolean connected, int mode) {
- if (preference != null) {
- if (connected) {
- preference.setEnabled(true);
- preference.setSummary(getSummary(mode));
- } else {
- preference.setSummary(R.string.disconnected);
- preference.setEnabled(false);
- }
- }
- }
-}
diff --git a/src/com/android/settings/core/BasePreferenceController.java b/src/com/android/settings/core/BasePreferenceController.java
index 777f3dd..76250fa 100644
--- a/src/com/android/settings/core/BasePreferenceController.java
+++ b/src/com/android/settings/core/BasePreferenceController.java
@@ -25,6 +25,8 @@
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
+import java.lang.reflect.Constructor;
+import java.lang.reflect.InvocationTargetException;
import java.util.List;
/**
@@ -73,9 +75,50 @@
protected Lifecycle mLifecycle;
+ /**
+ * Instantiate a controller as specified controller type and user-defined key.
+ * <p/>
+ * This is done through reflection. Do not use this method unless you know what you are doing.
+ */
+ public static BasePreferenceController createInstance(Context context,
+ String controllerName, String key) {
+ try {
+ final Class<?> clazz = Class.forName(controllerName);
+ final Constructor<?> preferenceConstructor =
+ clazz.getConstructor(Context.class, String.class);
+ final Object[] params = new Object[] {context, key};
+ return (BasePreferenceController) preferenceConstructor.newInstance(params);
+ } catch (ClassNotFoundException | NoSuchMethodException | InstantiationException |
+ IllegalArgumentException | InvocationTargetException | IllegalAccessException e) {
+ throw new IllegalStateException(
+ "Invalid preference controller: " + controllerName, e);
+ }
+ }
+
+ /**
+ * Instantiate a controller as specified controller type.
+ * <p/>
+ * This is done through reflection. Do not use this method unless you know what you are doing.
+ */
+ public static BasePreferenceController createInstance(Context context, String controllerName) {
+ try {
+ final Class<?> clazz = Class.forName(controllerName);
+ final Constructor<?> preferenceConstructor = clazz.getConstructor(Context.class);
+ final Object[] params = new Object[] {context};
+ return (BasePreferenceController) preferenceConstructor.newInstance(params);
+ } catch (ClassNotFoundException | NoSuchMethodException | InstantiationException |
+ IllegalArgumentException | InvocationTargetException | IllegalAccessException e) {
+ throw new IllegalStateException(
+ "Invalid preference controller: " + controllerName, e);
+ }
+ }
+
public BasePreferenceController(Context context, String preferenceKey) {
super(context);
mPreferenceKey = preferenceKey;
+ if (TextUtils.isEmpty(mPreferenceKey)) {
+ throw new IllegalArgumentException("Preference key must be set");
+ }
}
/**
diff --git a/src/com/android/settings/core/FeatureFlags.java b/src/com/android/settings/core/FeatureFlags.java
index fd756df..a5edf3c 100644
--- a/src/com/android/settings/core/FeatureFlags.java
+++ b/src/com/android/settings/core/FeatureFlags.java
@@ -20,7 +20,6 @@
* This class keeps track of all feature flags in Settings.
*/
public class FeatureFlags {
- public static final String CONNECTED_DEVICE_V2 = "settings_connected_device_v2";
public static final String BATTERY_SETTINGS_V2 = "settings_battery_v2";
public static final String BATTERY_DISPLAY_APP_LIST = "settings_battery_display_app_list";
public static final String ZONE_PICKER_V2 = "settings_zone_picker_v2";
diff --git a/src/com/android/settings/core/PreferenceControllerListHelper.java b/src/com/android/settings/core/PreferenceControllerListHelper.java
new file mode 100644
index 0000000..bec7c09
--- /dev/null
+++ b/src/com/android/settings/core/PreferenceControllerListHelper.java
@@ -0,0 +1,123 @@
+/*
+ * 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.core;
+
+import static com.android.settings.core.PreferenceXmlParserUtils.METADATA_CONTROLLER;
+import static com.android.settings.core.PreferenceXmlParserUtils.METADATA_KEY;
+
+import android.annotation.NonNull;
+import android.annotation.XmlRes;
+import android.content.Context;
+import android.os.Bundle;
+import android.text.TextUtils;
+import android.util.Log;
+
+import com.android.settingslib.core.AbstractPreferenceController;
+
+import org.xmlpull.v1.XmlPullParserException;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Set;
+import java.util.TreeSet;
+
+/**
+ * Helper to load {@link BasePreferenceController} lists from Xml.
+ */
+public class PreferenceControllerListHelper {
+
+ private static final String TAG = "PrefCtrlListHelper";
+
+ /**
+ * Instantiates a list of controller based on xml definition.
+ */
+ @NonNull
+ public static List<BasePreferenceController> getPreferenceControllersFromXml(Context context,
+ @XmlRes int xmlResId) {
+ final List<BasePreferenceController> controllers = new ArrayList<>();
+ List<Bundle> preferenceMetadata;
+ try {
+ preferenceMetadata = PreferenceXmlParserUtils.extractMetadata(context, xmlResId);
+ } catch (IOException | XmlPullParserException e) {
+ Log.e(TAG, "Failed to parse preference xml for getting controllers");
+ return controllers;
+ }
+
+ for (Bundle metadata : preferenceMetadata) {
+ final String controllerName = metadata.getString(METADATA_CONTROLLER);
+ if (TextUtils.isEmpty(controllerName)) {
+ continue;
+ }
+ BasePreferenceController controller;
+ try {
+ controller = BasePreferenceController.createInstance(context, controllerName);
+ } catch (IllegalStateException e) {
+ Log.d(TAG, "Could not find Context-only controller for pref: " + controllerName);
+ final String key = metadata.getString(METADATA_KEY);
+ if (TextUtils.isEmpty(key)) {
+ Log.w(TAG, "Controller requires key but it's not defined in xml: "
+ + controllerName);
+ continue;
+ }
+ try {
+ controller = BasePreferenceController.createInstance(context, controllerName,
+ key);
+ } catch (IllegalStateException e2) {
+ Log.w(TAG, "Cannot instantiate controller from reflection: " + controllerName);
+ continue;
+ }
+ }
+ controllers.add(controller);
+ }
+ return controllers;
+ }
+
+ /**
+ * Return a sub list of {@link AbstractPreferenceController} to only contain controller that
+ * doesn't exist in filter.
+ *
+ * @param filter The filter. This list will be unchanged.
+ * @param input This list will be filtered into a sublist and element is kept
+ * IFF the controller key is not used by anything from {@param filter}.
+ */
+ @NonNull
+ public static List<BasePreferenceController> filterControllers(
+ @NonNull List<BasePreferenceController> input,
+ List<AbstractPreferenceController> filter) {
+ if (input == null || filter == null) {
+ return input;
+ }
+ final Set<String> keys = new TreeSet<>();
+ final List<BasePreferenceController> filteredList = new ArrayList<>();
+ for (AbstractPreferenceController controller : filter) {
+ final String key = controller.getPreferenceKey();
+ if (key != null) {
+ keys.add(key);
+ }
+ }
+ for (BasePreferenceController controller : input) {
+ if (keys.contains(controller.getPreferenceKey())) {
+ Log.w(TAG, controller.getPreferenceKey() + " already has a controller");
+ continue;
+ }
+ filteredList.add(controller);
+ }
+ return filteredList;
+ }
+
+}
diff --git a/src/com/android/settings/search/XmlParserUtils.java b/src/com/android/settings/core/PreferenceXmlParserUtils.java
similarity index 63%
rename from src/com/android/settings/search/XmlParserUtils.java
rename to src/com/android/settings/core/PreferenceXmlParserUtils.java
index 27c5cd3..e07ca9b 100644
--- a/src/com/android/settings/search/XmlParserUtils.java
+++ b/src/com/android/settings/core/PreferenceXmlParserUtils.java
@@ -12,22 +12,43 @@
* 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.search;
+package com.android.settings.core;
+import android.annotation.NonNull;
import android.annotation.Nullable;
import android.content.Context;
import android.content.res.TypedArray;
+import android.content.res.XmlResourceParser;
+import android.os.Bundle;
import android.util.AttributeSet;
+import android.util.Log;
import android.util.TypedValue;
+import android.util.Xml;
+
import com.android.settings.R;
+import org.xmlpull.v1.XmlPullParser;
+import org.xmlpull.v1.XmlPullParserException;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
/**
* Utility class to parse elements of XML preferences
*/
-public class XmlParserUtils {
+public class PreferenceXmlParserUtils {
+
+ private static final String TAG = "PreferenceXmlParserUtil";
+
+ private static final List<String> SUPPORTED_PREF_TYPES = Arrays.asList(
+ "Preference", "PreferenceCategory", "PreferenceScreen");
+
+ public static final String METADATA_KEY = "key";
+ public static final String METADATA_CONTROLLER = "controller";
private static final String ENTRIES_SEPARATOR = "|";
@@ -84,6 +105,47 @@
}
/**
+ * Extracts metadata from preference xml and put them into a {@link Bundle}.
+ *
+ * TODO(zhfan): Similar logic exists in {@link SliceBuilderUtils} and
+ * {@link UniquePreferenceTest}. Need refactoring to consolidate them all.
+ */
+ @NonNull
+ public static List<Bundle> extractMetadata(Context context, int xmlResId)
+ throws IOException, XmlPullParserException {
+ final List<Bundle> metadata = new ArrayList<>();
+ if (xmlResId <= 0) {
+ Log.d(TAG, xmlResId + " is invalid.");
+ return metadata;
+ }
+ final XmlResourceParser parser = context.getResources().getXml(xmlResId);
+
+ int type;
+ while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
+ && type != XmlPullParser.START_TAG) {
+ // Parse next until start tag is found
+ }
+ final int outerDepth = parser.getDepth();
+
+ do {
+ if (type != XmlPullParser.START_TAG) {
+ continue;
+ }
+ final String nodeName = parser.getName();
+ if (!SUPPORTED_PREF_TYPES.contains(nodeName) && !nodeName.endsWith("Preference")) {
+ continue;
+ }
+ final Bundle preferenceMetadata = new Bundle();
+ final AttributeSet attrs = Xml.asAttributeSet(parser);
+ preferenceMetadata.putString(METADATA_KEY, getDataKey(context, attrs));
+ preferenceMetadata.putString(METADATA_CONTROLLER, getController(context, attrs));
+ metadata.add(preferenceMetadata);
+ } while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
+ && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth));
+ return metadata;
+ }
+
+ /**
* Returns the fragment name if this preference launches a child fragment.
*/
public static String getDataChildFragment(Context context, AttributeSet attrs) {
@@ -99,7 +161,8 @@
return data;
}
- private static String getDataEntries(Context context, AttributeSet set, int[] attrs, int resId) {
+ private static String getDataEntries(Context context, AttributeSet set, int[] attrs,
+ int resId) {
final TypedArray sa = context.obtainStyledAttributes(set, attrs);
final TypedValue tv = sa.peekValue(resId);
sa.recycle();
@@ -109,7 +172,7 @@
data = context.getResources().getStringArray(tv.resourceId);
}
}
- final int count = (data == null ) ? 0 : data.length;
+ final int count = (data == null) ? 0 : data.length;
if (count == 0) {
return null;
}
diff --git a/src/com/android/settings/core/SubSettingLauncher.java b/src/com/android/settings/core/SubSettingLauncher.java
index bc79cf8..91bd452 100644
--- a/src/com/android/settings/core/SubSettingLauncher.java
+++ b/src/com/android/settings/core/SubSettingLauncher.java
@@ -101,6 +101,25 @@
"This launcher has already been executed. Do not reuse");
}
mLaunched = true;
+
+ final Intent intent = toIntent();
+
+ boolean launchAsUser = mLaunchRequest.userHandle != null
+ && mLaunchRequest.userHandle.getIdentifier() != UserHandle.myUserId();
+ boolean launchForResult = mLaunchRequest.mResultListener != null;
+ if (launchAsUser && launchForResult) {
+ launchForResultAsUser(intent, mLaunchRequest.userHandle, mLaunchRequest.mResultListener,
+ mLaunchRequest.mRequestCode);
+ } else if (launchAsUser && !launchForResult) {
+ launchAsUser(intent, mLaunchRequest.userHandle);
+ } else if (!launchAsUser && launchForResult) {
+ launchForResult(mLaunchRequest.mResultListener, intent, mLaunchRequest.mRequestCode);
+ } else {
+ launch(intent);
+ }
+ }
+
+ public Intent toIntent() {
final Intent intent = new Intent(Intent.ACTION_MAIN);
intent.setClass(mContext, SubSettings.class);
if (TextUtils.isEmpty(mLaunchRequest.destinationName)) {
@@ -123,15 +142,7 @@
intent.putExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT_AS_SHORTCUT,
mLaunchRequest.isShortCut);
intent.addFlags(mLaunchRequest.flags);
-
- if (mLaunchRequest.userHandle != null
- && mLaunchRequest.userHandle.getIdentifier() != UserHandle.myUserId()) {
- launchAsUser(mContext, intent, mLaunchRequest.userHandle);
- } else if (mLaunchRequest.mResultListener != null) {
- launchForResult(mLaunchRequest.mResultListener, intent, mLaunchRequest.mRequestCode);
- } else {
- launch(intent);
- }
+ return intent;
}
@VisibleForTesting
@@ -139,14 +150,21 @@
mContext.startActivity(intent);
}
- private static void launchForResult(Fragment listener, Intent intent, int requestCode) {
- listener.getActivity().startActivityForResult(intent, requestCode);
- }
-
- private static void launchAsUser(Context context, Intent intent, UserHandle userHandle) {
+ @VisibleForTesting
+ void launchAsUser(Intent intent, UserHandle userHandle) {
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
- context.startActivityAsUser(intent, userHandle);
+ mContext.startActivityAsUser(intent, userHandle);
+ }
+
+ @VisibleForTesting
+ void launchForResultAsUser(Intent intent, UserHandle userHandle,
+ Fragment resultListener, int requestCode) {
+ resultListener.getActivity().startActivityForResultAsUser(intent, requestCode, userHandle);
+ }
+
+ private void launchForResult(Fragment listener, Intent intent, int requestCode) {
+ listener.startActivityForResult(intent, requestCode);
}
/**
diff --git a/src/com/android/settings/core/TogglePreferenceController.java b/src/com/android/settings/core/TogglePreferenceController.java
index 5431f4d..1cf4289 100644
--- a/src/com/android/settings/core/TogglePreferenceController.java
+++ b/src/com/android/settings/core/TogglePreferenceController.java
@@ -17,6 +17,8 @@
import android.support.v7.preference.Preference;
import android.support.v7.preference.TwoStatePreference;
+import com.android.settings.widget.MasterSwitchPreference;
+
/**
* Abstract class that consolidates logic for updating toggle controllers.
* It automatically handles the getting and setting of the switch UI element.
@@ -46,7 +48,11 @@
@Override
public final void updateState(Preference preference) {
- ((TwoStatePreference) preference).setChecked(isChecked());
+ if (preference instanceof TwoStatePreference) {
+ ((TwoStatePreference) preference).setChecked(isChecked());
+ } if (preference instanceof MasterSwitchPreference) {
+ ((MasterSwitchPreference) preference).setChecked(isChecked());
+ }
}
@Override
diff --git a/src/com/android/settings/core/gateway/SettingsGateway.java b/src/com/android/settings/core/gateway/SettingsGateway.java
index c75b0c6..51e151e 100644
--- a/src/com/android/settings/core/gateway/SettingsGateway.java
+++ b/src/com/android/settings/core/gateway/SettingsGateway.java
@@ -28,6 +28,7 @@
import com.android.settings.TestingSettings;
import com.android.settings.TetherSettings;
import com.android.settings.TrustedCredentialsSettings;
+import com.android.settings.deviceinfo.aboutphone.MyDeviceInfoFragment;
import com.android.settings.wifi.calling.WifiCallingSettings;
import com.android.settings.accessibility.AccessibilitySettings;
import com.android.settings.accessibility.AccessibilitySettingsForSetupWizard;
@@ -55,9 +56,7 @@
import com.android.settings.applications.manageapplications.ManageApplications;
import com.android.settings.bluetooth.BluetoothDeviceDetailsFragment;
import com.android.settings.bluetooth.BluetoothSettings;
-import com.android.settings.connecteddevice.AdvancedConnectedDeviceDashboardFragment;
import com.android.settings.connecteddevice.ConnectedDeviceDashboardFragment;
-import com.android.settings.connecteddevice.ConnectedDeviceDashboardFragmentOld;
import com.android.settings.connecteddevice.usb.UsbDetailsFragment;
import com.android.settings.datausage.DataUsageList;
import com.android.settings.datausage.DataUsageSummary;
@@ -156,6 +155,7 @@
UserDictionarySettings.class.getName(),
DisplaySettings.class.getName(),
DeviceInfoSettings.class.getName(),
+ MyDeviceInfoFragment.class.getName(),
ManageApplications.class.getName(),
ManageAssist.class.getName(),
ProcessStatsUi.class.getName(),
@@ -242,7 +242,6 @@
SystemDashboardFragment.class.getName(),
NetworkDashboardFragment.class.getName(),
ConnectedDeviceDashboardFragment.class.getName(),
- ConnectedDeviceDashboardFragmentOld.class.getName(),
UsbDetailsFragment.class.getName(),
AppAndNotificationDashboardFragment.class.getName(),
AccountDashboardFragment.class.getName(),
@@ -252,7 +251,6 @@
BluetoothDeviceDetailsFragment.class.getName(),
DataUsageList.class.getName(),
DirectoryAccessDetails.class.getName(),
- AdvancedConnectedDeviceDashboardFragment.class.getName()
};
public static final String[] SETTINGS_FOR_RESTRICTED = {
diff --git a/src/com/android/settings/dashboard/DashboardAdapter.java b/src/com/android/settings/dashboard/DashboardAdapter.java
index 007b66b..f04c3c9 100644
--- a/src/com/android/settings/dashboard/DashboardAdapter.java
+++ b/src/com/android/settings/dashboard/DashboardAdapter.java
@@ -51,6 +51,7 @@
import com.android.settingslib.drawer.DashboardCategory;
import com.android.settingslib.drawer.Tile;
import com.android.settingslib.suggestions.SuggestionControllerMixin;
+import com.android.settingslib.utils.IconCache;
import java.util.List;
@@ -365,31 +366,6 @@
mRecyclerView.scrollToPosition(mDashboardData.hasSuggestion() ? 1 : 0);
}
- public static class IconCache {
- private final Context mContext;
- private final ArrayMap<Icon, Drawable> mMap = new ArrayMap<>();
-
- public IconCache(Context context) {
- mContext = context;
- }
-
- public Drawable getIcon(Icon icon) {
- if (icon == null) {
- return null;
- }
- Drawable drawable = mMap.get(icon);
- if (drawable == null) {
- drawable = icon.loadDrawable(mContext);
- updateIcon(icon, drawable);
- }
- return drawable;
- }
-
- public void updateIcon(Icon icon, Drawable drawable) {
- mMap.put(icon, drawable);
- }
- }
-
public static class DashboardItemHolder extends RecyclerView.ViewHolder {
public final ImageView icon;
public final TextView title;
diff --git a/src/com/android/settings/dashboard/DashboardFragment.java b/src/com/android/settings/dashboard/DashboardFragment.java
index 6a88a38..90c781b 100644
--- a/src/com/android/settings/dashboard/DashboardFragment.java
+++ b/src/com/android/settings/dashboard/DashboardFragment.java
@@ -27,14 +27,15 @@
import android.util.ArrayMap;
import android.util.ArraySet;
import android.util.Log;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
import com.android.settings.SettingsPreferenceFragment;
+import com.android.settings.core.BasePreferenceController;
+import com.android.settings.core.PreferenceControllerListHelper;
import com.android.settings.overlay.FeatureFactory;
import com.android.settings.search.Indexable;
import com.android.settingslib.core.AbstractPreferenceController;
+import com.android.settingslib.core.lifecycle.Lifecycle;
+import com.android.settingslib.core.lifecycle.LifecycleObserver;
import com.android.settingslib.drawer.DashboardCategory;
import com.android.settingslib.drawer.SettingsDrawerActivity;
import com.android.settingslib.drawer.Tile;
@@ -58,7 +59,7 @@
new ArrayMap<>();
private final Set<String> mDashboardTilePrefKeys = new ArraySet<>();
- protected DashboardFeatureProvider mDashboardFeatureProvider;
+ private DashboardFeatureProvider mDashboardFeatureProvider;
private DashboardTilePlaceholderPreferenceController mPlaceholderPreferenceController;
private boolean mListeningToCategoryChange;
private SummaryLoader mSummaryLoader;
@@ -66,13 +67,34 @@
@Override
public void onAttach(Context context) {
super.onAttach(context);
- mDashboardFeatureProvider =
- FeatureFactory.getFactory(context).getDashboardFeatureProvider(context);
+ mDashboardFeatureProvider = FeatureFactory.getFactory(context).
+ getDashboardFeatureProvider(context);
+ final List<AbstractPreferenceController> controllers = new ArrayList<>();
+ // Load preference controllers from code
+ final List<AbstractPreferenceController> controllersFromCode =
+ createPreferenceControllers(context);
+ // Load preference controllers from xml definition
+ final List<BasePreferenceController> controllersFromXml = PreferenceControllerListHelper
+ .getPreferenceControllersFromXml(context, getPreferenceScreenResId());
+ // Filter xml-based controllers in case a similar controller is created from code already.
+ final List<BasePreferenceController> uniqueControllerFromXml =
+ PreferenceControllerListHelper.filterControllers(
+ controllersFromXml, controllersFromCode);
- List<AbstractPreferenceController> controllers = getPreferenceControllers(context);
- if (controllers == null) {
- controllers = new ArrayList<>();
+ // Add unique controllers to list.
+ if (controllersFromCode != null) {
+ controllers.addAll(controllersFromCode);
}
+ controllers.addAll(uniqueControllerFromXml);
+
+ // And wire up with lifecycle.
+ final Lifecycle lifecycle = getLifecycle();
+ uniqueControllerFromXml
+ .stream()
+ .filter(controller -> controller instanceof LifecycleObserver)
+ .forEach(
+ controller -> lifecycle.addObserver((LifecycleObserver) controller));
+
mPlaceholderPreferenceController =
new DashboardTilePlaceholderPreferenceController(context);
controllers.add(mPlaceholderPreferenceController);
@@ -95,13 +117,6 @@
}
@Override
- public View onCreateView(LayoutInflater inflater, ViewGroup container,
- Bundle savedInstanceState) {
- final View view = super.onCreateView(inflater, container, savedInstanceState);
- return view;
- }
-
- @Override
public void onCategoriesChanged() {
final DashboardCategory category =
mDashboardFeatureProvider.getTilesForCategory(getCategoryKey());
@@ -191,7 +206,7 @@
@Override
protected abstract int getPreferenceScreenResId();
- protected <T extends AbstractPreferenceController> T getPreferenceController(Class<T> clazz) {
+ protected <T extends AbstractPreferenceController> T use(Class<T> clazz) {
List<AbstractPreferenceController> controllerList = mPreferenceControllers.get(clazz);
if (controllerList != null) {
if (controllerList.size() > 1) {
@@ -227,7 +242,9 @@
/**
* Get a list of {@link AbstractPreferenceController} for this fragment.
*/
- protected abstract List<AbstractPreferenceController> getPreferenceControllers(Context context);
+ protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
+ return null;
+ }
/**
* Returns true if this tile should be displayed
@@ -337,7 +354,7 @@
final Context context = getContext();
mSummaryLoader = new SummaryLoader(getActivity(), getCategoryKey());
mSummaryLoader.setSummaryConsumer(this);
- final TypedArray a = context.obtainStyledAttributes(new int[]{
+ final TypedArray a = context.obtainStyledAttributes(new int[] {
android.R.attr.colorControlNormal});
final int tintColor = a.getColor(0, context.getColor(android.R.color.white));
a.recycle();
diff --git a/src/com/android/settings/dashboard/conditional/BackgroundDataCondition.java b/src/com/android/settings/dashboard/conditional/BackgroundDataCondition.java
index cbac86f..34172c2 100644
--- a/src/com/android/settings/dashboard/conditional/BackgroundDataCondition.java
+++ b/src/com/android/settings/dashboard/conditional/BackgroundDataCondition.java
@@ -18,9 +18,12 @@
import android.content.Intent;
import android.graphics.drawable.Icon;
import android.net.NetworkPolicyManager;
+import android.util.FeatureFlagUtils;
+
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.settings.R;
import com.android.settings.Settings;
+import com.android.settings.core.FeatureFlags;
public class BackgroundDataCondition extends Condition {
@@ -55,8 +58,12 @@
@Override
public void onPrimaryClick() {
- mManager.getContext().startActivity(new Intent(mManager.getContext(),
- Settings.DataUsageSummaryActivity.class).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK));
+ final Class activityClass = FeatureFlagUtils.isEnabled(mManager.getContext(),
+ FeatureFlags.DATA_USAGE_SETTINGS_V2)
+ ? Settings.DataUsageSummaryActivity.class
+ : Settings.DataUsageSummaryLegacyActivity.class;
+ mManager.getContext().startActivity(new Intent(mManager.getContext(), activityClass)
+ .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK));
}
@Override
diff --git a/src/com/android/settings/dashboard/conditional/WorkModeCondition.java b/src/com/android/settings/dashboard/conditional/WorkModeCondition.java
index 5c47be6..cb1b60a 100644
--- a/src/com/android/settings/dashboard/conditional/WorkModeCondition.java
+++ b/src/com/android/settings/dashboard/conditional/WorkModeCondition.java
@@ -85,7 +85,7 @@
@Override
public void onPrimaryClick() {
mManager.getContext().startActivity(new Intent(mManager.getContext(),
- Settings.UserSettingsActivity.class)
+ Settings.AccountDashboardActivity.class)
.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK));
}
diff --git a/src/com/android/settings/dashboard/suggestions/SuggestionAdapter.java b/src/com/android/settings/dashboard/suggestions/SuggestionAdapter.java
index b24a914..87b3f4b 100644
--- a/src/com/android/settings/dashboard/suggestions/SuggestionAdapter.java
+++ b/src/com/android/settings/dashboard/suggestions/SuggestionAdapter.java
@@ -38,7 +38,6 @@
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.settings.R;
import com.android.settings.dashboard.DashboardAdapter.DashboardItemHolder;
-import com.android.settings.dashboard.DashboardAdapter.IconCache;
import com.android.settings.overlay.FeatureFactory;
import com.android.settingslib.Utils;
import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
@@ -46,6 +45,7 @@
import com.android.settingslib.core.lifecycle.LifecycleObserver;
import com.android.settingslib.core.lifecycle.events.OnSaveInstanceState;
import com.android.settingslib.suggestions.SuggestionControllerMixin;
+import com.android.settingslib.utils.IconCache;
import java.util.ArrayList;
import java.util.List;
@@ -127,7 +127,7 @@
holder.title.setText(suggestion.getTitle());
holder.title.setSingleLine(suggestionCount == 1);
holder.title.setTypeface(Typeface.create(
- mContext.getString(com.android.internal.R.string.config_headlineFontFamilyMedium),
+ mContext.getString(com.android.internal.R.string.config_headlineFontFamily),
Typeface.NORMAL));
if (suggestionCount == 1) {
diff --git a/src/com/android/settings/datausage/BillingCyclePreference.java b/src/com/android/settings/datausage/BillingCyclePreference.java
index 202dc80..ce043ce 100644
--- a/src/com/android/settings/datausage/BillingCyclePreference.java
+++ b/src/com/android/settings/datausage/BillingCyclePreference.java
@@ -26,7 +26,7 @@
import com.android.internal.logging.nano.MetricsProto;
import com.android.settings.R;
-import com.android.settings.Utils;
+import com.android.settings.core.SubSettingLauncher;
import com.android.settings.datausage.CellDataPreference.DataStateListener;
public class BillingCyclePreference extends Preference implements TemplatePreference {
@@ -80,8 +80,12 @@
public Intent getIntent() {
Bundle args = new Bundle();
args.putParcelable(DataUsageList.EXTRA_NETWORK_TEMPLATE, mTemplate);
- return Utils.onBuildStartFragmentIntent(getContext(), BillingCycleSettings.class.getName(),
- args, null, 0, getTitle(), false, MetricsProto.MetricsEvent.VIEW_UNKNOWN);
+ return new SubSettingLauncher(getContext())
+ .setDestination(BillingCycleSettings.class.getName())
+ .setArguments(args)
+ .setTitle(getTitle())
+ .setSourceMetricsCategory(MetricsProto.MetricsEvent.VIEW_UNKNOWN)
+ .toIntent();
}
private final DataStateListener mListener = new DataStateListener() {
diff --git a/src/com/android/settings/datausage/DataUsagePreference.java b/src/com/android/settings/datausage/DataUsagePreference.java
index 32c7011..ecc5be6 100644
--- a/src/com/android/settings/datausage/DataUsagePreference.java
+++ b/src/com/android/settings/datausage/DataUsagePreference.java
@@ -23,10 +23,10 @@
import android.support.v7.preference.Preference;
import android.text.format.Formatter;
import android.util.AttributeSet;
+
import com.android.internal.logging.nano.MetricsProto;
import com.android.settings.R;
-import com.android.settings.Utils;
-import com.android.settings.core.InstrumentedPreferenceFragment;
+import com.android.settings.core.SubSettingLauncher;
import com.android.settingslib.net.DataUsageController;
public class DataUsagePreference extends Preference implements TemplatePreference {
@@ -38,7 +38,7 @@
public DataUsagePreference(Context context, AttributeSet attrs) {
super(context, attrs);
final TypedArray a = context.obtainStyledAttributes(
- attrs, new int[] { com.android.internal.R.attr.title },
+ attrs, new int[] {com.android.internal.R.attr.title},
TypedArrayUtils.getAttr(
context, android.support.v7.preference.R.attr.preferenceStyle,
android.R.attr.preferenceStyle), 0);
@@ -60,16 +60,18 @@
@Override
public Intent getIntent() {
- Bundle args = new Bundle();
+ final Bundle args = new Bundle();
args.putParcelable(DataUsageList.EXTRA_NETWORK_TEMPLATE, mTemplate);
args.putInt(DataUsageList.EXTRA_SUB_ID, mSubId);
+ final SubSettingLauncher launcher = new SubSettingLauncher(getContext())
+ .setArguments(args)
+ .setDestination(DataUsageList.class.getName())
+ .setSourceMetricsCategory(MetricsProto.MetricsEvent.VIEW_UNKNOWN);
if (mTitleRes > 0) {
- return Utils.onBuildStartFragmentIntent(getContext(), DataUsageList.class.getName(),
- args, getContext().getPackageName(), mTitleRes, null, false,
- MetricsProto.MetricsEvent.VIEW_UNKNOWN);
+ launcher.setTitle(mTitleRes);
+ } else {
+ launcher.setTitle(getTitle());
}
- return Utils.onBuildStartFragmentIntent(getContext(), DataUsageList.class.getName(), args,
- getContext().getPackageName(), 0, getTitle(), false,
- MetricsProto.MetricsEvent.VIEW_UNKNOWN);
+ return launcher.toIntent();
}
}
diff --git a/src/com/android/settings/datausage/DataUsageSummary.java b/src/com/android/settings/datausage/DataUsageSummary.java
index 339de7c..2d50589 100644
--- a/src/com/android/settings/datausage/DataUsageSummary.java
+++ b/src/com/android/settings/datausage/DataUsageSummary.java
@@ -169,7 +169,7 @@
}
@Override
- protected List<AbstractPreferenceController> getPreferenceControllers(Context context) {
+ protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
final ArrayList<AbstractPreferenceController> controllers = new ArrayList<>();
mSummaryController =
new DataUsageSummaryPreferenceController(context);
diff --git a/src/com/android/settings/datausage/DataUsageSummaryLegacy.java b/src/com/android/settings/datausage/DataUsageSummaryLegacy.java
index 6a241eb..f46c91e 100644
--- a/src/com/android/settings/datausage/DataUsageSummaryLegacy.java
+++ b/src/com/android/settings/datausage/DataUsageSummaryLegacy.java
@@ -188,7 +188,7 @@
}
@Override
- protected List<AbstractPreferenceController> getPreferenceControllers(Context context) {
+ protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
return null;
}
diff --git a/src/com/android/settings/deletionhelper/AutomaticStorageManagerSettings.java b/src/com/android/settings/deletionhelper/AutomaticStorageManagerSettings.java
index 22ecb09..5902545 100644
--- a/src/com/android/settings/deletionhelper/AutomaticStorageManagerSettings.java
+++ b/src/com/android/settings/deletionhelper/AutomaticStorageManagerSettings.java
@@ -110,7 +110,7 @@
}
@Override
- protected List<AbstractPreferenceController> getPreferenceControllers(Context context) {
+ protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
return buildPreferenceControllers(context);
}
@@ -168,7 +168,7 @@
}
@Override
- public List<AbstractPreferenceController> getPreferenceControllers(
+ public List<AbstractPreferenceController> createPreferenceControllers(
Context context) {
return buildPreferenceControllers(context);
}
diff --git a/src/com/android/settings/development/BluetoothDelayReportsPreferenceController.java b/src/com/android/settings/development/BluetoothDelayReportsPreferenceController.java
new file mode 100644
index 0000000..5dc6e52
--- /dev/null
+++ b/src/com/android/settings/development/BluetoothDelayReportsPreferenceController.java
@@ -0,0 +1,85 @@
+/*
+ * 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.development;
+
+import android.content.Context;
+import android.os.SystemProperties;
+import android.support.annotation.VisibleForTesting;
+import android.support.v14.preference.SwitchPreference;
+import android.support.v7.preference.Preference;
+import android.support.v7.preference.PreferenceScreen;
+
+import com.android.settings.core.PreferenceControllerMixin;
+import com.android.settingslib.development.DeveloperOptionsPreferenceController;
+
+public class BluetoothDelayReportsPreferenceController extends
+ DeveloperOptionsPreferenceController implements Preference.OnPreferenceChangeListener,
+ PreferenceControllerMixin {
+
+ private static final String BLUETOOTH_ENABLE_AVDTP_DELAY_REPORT_KEY =
+ "bluetooth_enable_avdtp_delay_reports";
+ @VisibleForTesting
+ static final String BLUETOOTH_ENABLE_AVDTP_DELAY_REPORTS_PROPERTY =
+ "persist.bluetooth.enabledelayreports";
+
+ private SwitchPreference mPreference;
+
+ public BluetoothDelayReportsPreferenceController(Context context) {
+ super(context);
+ }
+
+ @Override
+ public String getPreferenceKey() {
+ return BLUETOOTH_ENABLE_AVDTP_DELAY_REPORT_KEY;
+ }
+
+ @Override
+ public void displayPreference(PreferenceScreen screen) {
+ super.displayPreference(screen);
+
+ mPreference = (SwitchPreference) screen.findPreference(getPreferenceKey());
+ }
+
+ @Override
+ public boolean onPreferenceChange(Preference preference, Object newValue) {
+ final boolean isEnabled = (Boolean) newValue;
+ SystemProperties.set(BLUETOOTH_ENABLE_AVDTP_DELAY_REPORTS_PROPERTY,
+ isEnabled ? "true" : "false");
+ return true;
+ }
+
+ @Override
+ public void updateState(Preference preference) {
+ final boolean isEnabled = SystemProperties.getBoolean(
+ BLUETOOTH_ENABLE_AVDTP_DELAY_REPORTS_PROPERTY, false /* default */);
+ mPreference.setChecked(isEnabled);
+ }
+
+ @Override
+ protected void onDeveloperOptionsSwitchEnabled() {
+ mPreference.setEnabled(true);
+ }
+
+ @Override
+ protected void onDeveloperOptionsSwitchDisabled() {
+ mPreference.setEnabled(false);
+ // the default setting for this preference is the disabled state
+ mPreference.setChecked(false);
+ SystemProperties.set(BLUETOOTH_ENABLE_AVDTP_DELAY_REPORTS_PROPERTY, "false");
+ }
+
+}
diff --git a/src/com/android/settings/development/BluetoothMaxConnectedAudioDevicesPreferenceController.java b/src/com/android/settings/development/BluetoothMaxConnectedAudioDevicesPreferenceController.java
index 5512685..79187f5 100644
--- a/src/com/android/settings/development/BluetoothMaxConnectedAudioDevicesPreferenceController.java
+++ b/src/com/android/settings/development/BluetoothMaxConnectedAudioDevicesPreferenceController.java
@@ -22,9 +22,7 @@
import android.support.v7.preference.ListPreference;
import android.support.v7.preference.Preference;
import android.support.v7.preference.PreferenceScreen;
-import android.text.TextUtils;
-import com.android.settings.R;
import com.android.settings.core.PreferenceControllerMixin;
import com.android.settingslib.development.DeveloperOptionsPreferenceController;
@@ -32,58 +30,65 @@
DeveloperOptionsPreferenceController implements Preference.OnPreferenceChangeListener,
PreferenceControllerMixin {
- private static final String BLUETOOTH_MAX_CONNECTED_AUDIO_DEVICES_KEY =
+ private static final String MAX_CONNECTED_AUDIO_DEVICES_PREFERENCE_KEY =
"bluetooth_max_connected_audio_devices";
@VisibleForTesting
- static final String BLUETOOTH_MAX_CONNECTED_AUDIO_DEVICES_PROPERTY =
+ static final String MAX_CONNECTED_AUDIO_DEVICES_PROPERTY =
"persist.bluetooth.maxconnectedaudiodevices";
- private final String[] mListValues;
- private final String[] mListSummaries;
+ private final int mDefaultMaxConnectedAudioDevices;
private ListPreference mPreference;
public BluetoothMaxConnectedAudioDevicesPreferenceController(Context context) {
super(context);
-
- mListValues = context.getResources()
- .getStringArray(R.array.bluetooth_max_connected_audio_devices_values);
- mListSummaries = context.getResources()
- .getStringArray(R.array.bluetooth_max_connected_audio_devices);
+ mDefaultMaxConnectedAudioDevices = mContext.getResources().getInteger(
+ com.android.internal.R.integer.config_bluetooth_max_connected_audio_devices);
}
@Override
public String getPreferenceKey() {
- return BLUETOOTH_MAX_CONNECTED_AUDIO_DEVICES_KEY;
+ return MAX_CONNECTED_AUDIO_DEVICES_PREFERENCE_KEY;
}
@Override
public void displayPreference(PreferenceScreen screen) {
super.displayPreference(screen);
-
mPreference = (ListPreference) screen.findPreference(getPreferenceKey());
+ final CharSequence[] entries = mPreference.getEntries();
+ entries[0] = String.format(entries[0].toString(), mDefaultMaxConnectedAudioDevices);
+ mPreference.setEntries(entries);
}
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
- SystemProperties.set(BLUETOOTH_MAX_CONNECTED_AUDIO_DEVICES_PROPERTY, newValue.toString());
+ String newValueString = newValue.toString();
+ final ListPreference listPreference = (ListPreference) preference;
+ if (listPreference.findIndexOfValue(newValueString) <= 0) {
+ // Reset property value when default is chosen or when value is illegal
+ newValueString = "";
+ }
+ SystemProperties.set(MAX_CONNECTED_AUDIO_DEVICES_PROPERTY, newValueString);
updateState(preference);
return true;
}
@Override
public void updateState(Preference preference) {
- final String currentValue = SystemProperties.get(
- BLUETOOTH_MAX_CONNECTED_AUDIO_DEVICES_PROPERTY);
- int index = 0; // Defaults to 1 device
- for (int i = 0; i < mListValues.length; i++) {
- if (TextUtils.equals(currentValue, mListValues[i])) {
- index = i;
- break;
+ final ListPreference listPreference = (ListPreference) preference;
+ final CharSequence[] entries = listPreference.getEntries();
+ final String currentValue = SystemProperties.get(MAX_CONNECTED_AUDIO_DEVICES_PROPERTY);
+ int index = 0;
+ if (!currentValue.isEmpty()) {
+ index = listPreference.findIndexOfValue(currentValue);
+ if (index < 0) {
+ // Reset property value when value is illegal
+ SystemProperties.set(MAX_CONNECTED_AUDIO_DEVICES_PROPERTY, "");
+ index = 0;
}
}
- mPreference.setValue(mListValues[index]);
- mPreference.setSummary(mListSummaries[index]);
+ listPreference.setValueIndex(index);
+ listPreference.setSummary(entries[index]);
}
@Override
@@ -95,9 +100,8 @@
@Override
protected void onDeveloperOptionsSwitchDisabled() {
mPreference.setEnabled(false);
- SystemProperties.set(BLUETOOTH_MAX_CONNECTED_AUDIO_DEVICES_PROPERTY, mListValues[0]);
- mPreference.setValue(mListValues[0]);
- mPreference.setSummary(mListSummaries[0]);
+ SystemProperties.set(MAX_CONNECTED_AUDIO_DEVICES_PROPERTY, "");
+ updateState(mPreference);
}
}
diff --git a/src/com/android/settings/development/DarkUIPreferenceController.java b/src/com/android/settings/development/DarkUIPreferenceController.java
new file mode 100644
index 0000000..a35397b
--- /dev/null
+++ b/src/com/android/settings/development/DarkUIPreferenceController.java
@@ -0,0 +1,107 @@
+/*
+ * 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.development;
+
+import android.app.UiModeManager;
+import android.content.Context;
+import android.support.annotation.VisibleForTesting;
+import android.support.v7.preference.ListPreference;
+import android.support.v7.preference.Preference;
+
+import com.android.settings.R;
+import com.android.settings.core.PreferenceControllerMixin;
+import com.android.settingslib.development.DeveloperOptionsPreferenceController;
+
+public class DarkUIPreferenceController extends
+ DeveloperOptionsPreferenceController implements Preference.OnPreferenceChangeListener,
+ PreferenceControllerMixin {
+
+ private static final String DARK_UI_KEY = "dark_ui_mode";
+ private final UiModeManager mUiModeManager;
+
+ public DarkUIPreferenceController(Context context) {
+ this(context, context.getSystemService(UiModeManager.class));
+ }
+
+ @VisibleForTesting
+ DarkUIPreferenceController(Context context, UiModeManager uiModeManager) {
+ super(context);
+ mUiModeManager = uiModeManager;
+ }
+
+ @Override
+ public String getPreferenceKey() {
+ return DARK_UI_KEY;
+ }
+
+ @Override
+ public boolean onPreferenceChange(Preference preference, Object newValue) {
+ mUiModeManager.setNightMode(modeToInt((String) newValue));
+ updateSummary(preference);
+ return true;
+ }
+
+ @Override
+ public void updateState(Preference preference) {
+ updateSummary(preference);
+ }
+
+ private void updateSummary(Preference preference) {
+ int mode = mUiModeManager.getNightMode();
+ ((ListPreference) preference).setValue(modeToString(mode));
+ preference.setSummary(modeToDescription(mode));
+ }
+
+ private String modeToDescription(int mode) {
+ String[] values = mContext.getResources().getStringArray(R.array.dark_ui_mode_entries);
+ switch (mode) {
+ case UiModeManager.MODE_NIGHT_AUTO:
+ return values[0];
+ case UiModeManager.MODE_NIGHT_YES:
+ return values[1];
+ case UiModeManager.MODE_NIGHT_NO:
+ default:
+ return values[2];
+
+ }
+ }
+
+ private String modeToString(int mode) {
+ switch (mode) {
+ case UiModeManager.MODE_NIGHT_AUTO:
+ return "auto";
+ case UiModeManager.MODE_NIGHT_YES:
+ return "yes";
+ case UiModeManager.MODE_NIGHT_NO:
+ default:
+ return "no";
+
+ }
+ }
+
+ private int modeToInt(String mode) {
+ switch (mode) {
+ case "auto":
+ return UiModeManager.MODE_NIGHT_AUTO;
+ case "yes":
+ return UiModeManager.MODE_NIGHT_YES;
+ case "no":
+ default:
+ return UiModeManager.MODE_NIGHT_NO;
+ }
+ }
+}
diff --git a/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java b/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java
index 395d230..e2495f0 100644
--- a/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java
+++ b/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java
@@ -302,7 +302,7 @@
}
@Override
- protected List<AbstractPreferenceController> getPreferenceControllers(Context context) {
+ protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
if (Utils.isMonkeyRunning()) {
mPreferenceControllers = new ArrayList<>();
return null;
@@ -375,6 +375,7 @@
controllers.add(new LocalBackupPasswordPreferenceController(context));
controllers.add(new StayAwakePreferenceController(context, lifecycle));
controllers.add(new HdcpCheckingPreferenceController(context));
+ controllers.add(new DarkUIPreferenceController(context));
controllers.add(new BluetoothSnoopLogPreferenceController(context));
controllers.add(new OemUnlockPreferenceController(context, activity, fragment));
controllers.add(new FileEncryptionPreferenceController(context));
@@ -401,10 +402,10 @@
controllers.add(new WifiConnectedMacRandomizationPreferenceController(context));
controllers.add(new MobileDataAlwaysOnPreferenceController(context));
controllers.add(new TetheringHardwareAccelPreferenceController(context));
- controllers.add(new SelectUsbConfigPreferenceController(context, lifecycle));
controllers.add(new BluetoothDeviceNoNamePreferenceController(context));
controllers.add(new BluetoothAbsoluteVolumePreferenceController(context));
controllers.add(new BluetoothInbandRingingPreferenceController(context));
+ controllers.add(new BluetoothDelayReportsPreferenceController(context));
controllers.add(new BluetoothAvrcpVersionPreferenceController(context));
controllers.add(new BluetoothAudioCodecPreferenceController(context, lifecycle,
bluetoothA2dpConfigStore));
@@ -453,7 +454,7 @@
@VisibleForTesting
<T extends AbstractPreferenceController> T getDevelopmentOptionsController(Class<T> clazz) {
- return getPreferenceController(clazz);
+ return use(clazz);
}
/**
@@ -477,7 +478,7 @@
}
@Override
- public List<AbstractPreferenceController> getPreferenceControllers(Context
+ public List<AbstractPreferenceController> createPreferenceControllers(Context
context) {
return buildPreferenceControllers(context, null /* activity */,
null /* lifecycle */, null /* devOptionsDashboardFragment */,
diff --git a/src/com/android/settings/development/SelectUsbConfigPreferenceController.java b/src/com/android/settings/development/SelectUsbConfigPreferenceController.java
deleted file mode 100644
index 63eb24c..0000000
--- a/src/com/android/settings/development/SelectUsbConfigPreferenceController.java
+++ /dev/null
@@ -1,156 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settings.development;
-
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.content.pm.PackageManager;
-import android.hardware.usb.UsbManager;
-import android.os.Bundle;
-import android.support.annotation.VisibleForTesting;
-import android.support.v7.preference.ListPreference;
-import android.support.v7.preference.Preference;
-import android.support.v7.preference.PreferenceScreen;
-
-import com.android.settings.R;
-import com.android.settings.Utils;
-import com.android.settings.core.PreferenceControllerMixin;
-import com.android.settings.connecteddevice.usb.UsbBackend;
-import com.android.settingslib.core.lifecycle.Lifecycle;
-import com.android.settingslib.core.lifecycle.LifecycleObserver;
-import com.android.settingslib.core.lifecycle.events.OnCreate;
-import com.android.settingslib.core.lifecycle.events.OnDestroy;
-import com.android.settingslib.development.DeveloperOptionsPreferenceController;
-
-public class SelectUsbConfigPreferenceController extends
- DeveloperOptionsPreferenceController implements
- Preference.OnPreferenceChangeListener, LifecycleObserver, OnCreate, OnDestroy,
- PreferenceControllerMixin {
-
- private static final String USB_CONFIGURATION_KEY = "select_usb_configuration";
-
- private final String[] mListValues;
- private final String[] mListSummaries;
- private final UsbManager mUsbManager;
- @VisibleForTesting
- UsbBackend.UsbManagerPassThrough mUsbManagerPassThrough;
- private BroadcastReceiver mUsbReceiver;
- private ListPreference mPreference;
-
- public SelectUsbConfigPreferenceController(Context context, Lifecycle lifecycle) {
- super(context);
-
- mListValues = context.getResources().getStringArray(R.array.usb_configuration_values);
- mListSummaries = context.getResources().getStringArray(R.array.usb_configuration_titles);
- mUsbManager = (UsbManager) context.getSystemService(Context.USB_SERVICE);
- mUsbManagerPassThrough = new UsbBackend.UsbManagerPassThrough(mUsbManager);
- mUsbReceiver = new BroadcastReceiver() {
- @Override
- public void onReceive(Context context, Intent intent) {
- if (mPreference != null) {
- updateUsbConfigurationValues();
- }
- }
- };
- if (lifecycle != null) {
- lifecycle.addObserver(this);
- }
- }
-
- @Override
- public void onCreate(Bundle savedInstanceState) {
- IntentFilter filter = new IntentFilter();
- filter.addAction(UsbManager.ACTION_USB_STATE);
- mContext.registerReceiver(mUsbReceiver, filter);
- }
-
- @Override
- public String getPreferenceKey() {
- return USB_CONFIGURATION_KEY;
- }
-
- @Override
- public void displayPreference(PreferenceScreen screen) {
- super.displayPreference(screen);
-
- mPreference = (ListPreference) screen.findPreference(getPreferenceKey());
- }
-
- @Override
- public boolean onPreferenceChange(Preference preference, Object newValue) {
- if (Utils.isMonkeyRunning()) {
- return false;
- }
-
- writeUsbConfigurationOption(mUsbManagerPassThrough
- .usbFunctionsFromString(newValue.toString()));
- updateUsbConfigurationValues();
- return true;
- }
-
- @Override
- public void updateState(Preference preference) {
- updateUsbConfigurationValues();
- }
-
- @Override
- public void onDestroy() {
- mContext.unregisterReceiver(mUsbReceiver);
- }
-
- @Override
- public boolean isAvailable() {
- final PackageManager packageManager = mContext.getPackageManager();
-
- return packageManager.hasSystemFeature(PackageManager.FEATURE_USB_HOST)
- || packageManager.hasSystemFeature(PackageManager.FEATURE_USB_ACCESSORY);
- }
-
- @Override
- protected void onDeveloperOptionsSwitchEnabled() {
- mPreference.setEnabled(true);
- }
-
- @Override
- protected void onDeveloperOptionsSwitchDisabled() {
- mPreference.setEnabled(false);
- }
-
- @VisibleForTesting
- void setCurrentFunctions(long functions) {
- mUsbManager.setCurrentFunctions(functions);
- }
-
- private void updateUsbConfigurationValues() {
- long functions = mUsbManagerPassThrough.getCurrentFunctions();
- int index = 0;
- for (int i = 0; i < mListValues.length; i++) {
- if (functions == mUsbManagerPassThrough.usbFunctionsFromString(mListValues[i])) {
- index = i;
- break;
- }
- }
- mPreference.setValue(mListValues[index]);
- mPreference.setSummary(mListSummaries[index]);
- }
-
- private void writeUsbConfigurationOption(long newValue) {
- setCurrentFunctions(newValue);
- }
-}
diff --git a/src/com/android/settings/development/WebViewAppPreferenceController.java b/src/com/android/settings/development/WebViewAppPreferenceController.java
index 9ccb20b..4f35910 100644
--- a/src/com/android/settings/development/WebViewAppPreferenceController.java
+++ b/src/com/android/settings/development/WebViewAppPreferenceController.java
@@ -25,9 +25,9 @@
import android.util.Log;
import com.android.settings.R;
-import com.android.settings.applications.defaultapps.DefaultAppInfo;
import com.android.settings.core.PreferenceControllerMixin;
import com.android.settings.webview.WebViewUpdateServiceWrapper;
+import com.android.settingslib.applications.DefaultAppInfo;
import com.android.settingslib.development.DeveloperOptionsPreferenceController;
import com.android.settingslib.wrapper.PackageManagerWrapper;
diff --git a/src/com/android/settings/development/featureflags/FeatureFlagsDashboard.java b/src/com/android/settings/development/featureflags/FeatureFlagsDashboard.java
index 8f37c67..32bc0ab 100644
--- a/src/com/android/settings/development/featureflags/FeatureFlagsDashboard.java
+++ b/src/com/android/settings/development/featureflags/FeatureFlagsDashboard.java
@@ -51,7 +51,7 @@
}
@Override
- protected List<AbstractPreferenceController> getPreferenceControllers(Context context) {
+ protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
final List<AbstractPreferenceController> controllers = new ArrayList<>();
controllers.add(new FeatureFlagsPreferenceController(context, getLifecycle()));
return controllers;
diff --git a/src/com/android/settings/development/qstile/DevelopmentTileConfigFragment.java b/src/com/android/settings/development/qstile/DevelopmentTileConfigFragment.java
index ca4181e..24bb5d1 100644
--- a/src/com/android/settings/development/qstile/DevelopmentTileConfigFragment.java
+++ b/src/com/android/settings/development/qstile/DevelopmentTileConfigFragment.java
@@ -40,7 +40,7 @@
}
@Override
- protected List<AbstractPreferenceController> getPreferenceControllers(Context context) {
+ protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
final List<AbstractPreferenceController> controllers = new ArrayList<>();
controllers.add(new DevelopmentTilePreferenceController(context));
return controllers;
diff --git a/src/com/android/settings/development/qstile/DevelopmentTilePreferenceController.java b/src/com/android/settings/development/qstile/DevelopmentTilePreferenceController.java
index 083a719..51fcb2c 100644
--- a/src/com/android/settings/development/qstile/DevelopmentTilePreferenceController.java
+++ b/src/com/android/settings/development/qstile/DevelopmentTilePreferenceController.java
@@ -22,17 +22,23 @@
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.content.pm.ServiceInfo;
+import android.os.RemoteException;
+import android.os.ServiceManager;
import android.service.quicksettings.TileService;
+import android.support.annotation.VisibleForTesting;
import android.support.v14.preference.SwitchPreference;
import android.support.v7.preference.Preference;
import android.support.v7.preference.PreferenceScreen;
+import android.util.Log;
+import com.android.internal.statusbar.IStatusBarService;
import com.android.settingslib.core.AbstractPreferenceController;
import java.util.List;
public class DevelopmentTilePreferenceController extends AbstractPreferenceController {
+ private static final String TAG = "DevTilePrefController";
private final OnChangeHandler mOnChangeHandler;
private final PackageManager mPackageManager;
@@ -78,24 +84,42 @@
}
}
- private static class OnChangeHandler implements Preference.OnPreferenceChangeListener {
+ @VisibleForTesting
+ static class OnChangeHandler implements Preference.OnPreferenceChangeListener {
private final Context mContext;
private final PackageManager mPackageManager;
+ private IStatusBarService mStatusBarService;
public OnChangeHandler(Context context) {
mContext = context;
mPackageManager = context.getPackageManager();
+ mStatusBarService = IStatusBarService.Stub.asInterface(
+ ServiceManager.checkService(Context.STATUS_BAR_SERVICE));
}
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
- ComponentName cn = new ComponentName(
+ boolean enabled = ((Boolean) newValue).booleanValue();
+ ComponentName componentName = new ComponentName(
mContext.getPackageName(), preference.getKey());
- mPackageManager.setComponentEnabledSetting(cn, (Boolean) newValue
+ mPackageManager.setComponentEnabledSetting(componentName, enabled
? PackageManager.COMPONENT_ENABLED_STATE_ENABLED
: PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
PackageManager.DONT_KILL_APP);
+
+ try {
+ if (mStatusBarService != null) {
+ if (enabled) {
+ mStatusBarService.addTile(componentName);
+ } else {
+ mStatusBarService.remTile(componentName);
+ }
+ }
+ } catch (RemoteException e) {
+ Log.e(TAG, "Failed to modify QS tile for component " +
+ componentName.toString(), e);
+ }
return true;
}
}
diff --git a/src/com/android/settings/development/qstile/DevelopmentTiles.java b/src/com/android/settings/development/qstile/DevelopmentTiles.java
index 38f9565..736c40c 100644
--- a/src/com/android/settings/development/qstile/DevelopmentTiles.java
+++ b/src/com/android/settings/development/qstile/DevelopmentTiles.java
@@ -142,26 +142,29 @@
}
/**
- * Tile to toggle Window Trace.
+ * Tile to toggle Winscope trace which consists of Window and Layer traces.
*/
- public static class WindowTrace extends DevelopmentTiles {
+ public static class WinscopeTrace extends DevelopmentTiles {
@VisibleForTesting
- IWindowManagerWrapper mWindowManager;
+ static final int SURFACE_FLINGER_LAYER_TRACE_CONTROL_CODE = 1025;
@VisibleForTesting
- Toast mToast;
+ static final int SURFACE_FLINGER_LAYER_TRACE_STATUS_CODE = 1026;
+ private IBinder mSurfaceFlinger;
+ private IWindowManagerWrapper mWindowManager;
+ private Toast mToast;
@Override
public void onCreate() {
super.onCreate();
mWindowManager = new IWindowManagerWrapper(WindowManagerGlobal
.getWindowManagerService());
+ mSurfaceFlinger = ServiceManager.getService("SurfaceFlinger");
Context context = getApplicationContext();
- CharSequence text = "Trace written to /data/misc/wmtrace/wm_trace.pb";
+ CharSequence text = "Trace files written to /data/misc/wmtrace";
mToast = Toast.makeText(context, text, Toast.LENGTH_LONG);
}
- @Override
- protected boolean isEnabled() {
+ private boolean isWindowTraceEnabled() {
try {
return mWindowManager.isWindowTraceEnabled();
} catch (RemoteException e) {
@@ -171,46 +174,8 @@
return false;
}
- @Override
- protected void setIsEnabled(boolean isEnabled) {
- try {
- if (isEnabled) {
- mWindowManager.startWindowTrace();
- } else {
- mWindowManager.stopWindowTrace();
- mToast.show();
- }
- } catch (RemoteException e) {
- Log.e(TAG, "Could not set window trace status." + e.toString());
- }
- }
- }
-
- /**
- * Tile to toggle Layer Trace.
- */
- public static class LayerTrace extends DevelopmentTiles {
- @VisibleForTesting
- static final int SURFACE_FLINGER_LAYER_TRACE_CONTROL_CODE = 1025;
- @VisibleForTesting
- static final int SURFACE_FLINGER_LAYER_TRACE_STATUS_CODE = 1026;
- @VisibleForTesting
- IBinder mSurfaceFlinger;
- @VisibleForTesting
- Toast mToast;
-
- @Override
- public void onCreate() {
- super.onCreate();
- mSurfaceFlinger = ServiceManager.getService("SurfaceFlinger");
- Context context = getApplicationContext();
- CharSequence text = "Trace written to /data/misc/wmtrace/layers_trace.pb";
- mToast = Toast.makeText(context, text, Toast.LENGTH_LONG);
- }
-
- @Override
- protected boolean isEnabled() {
- boolean surfaceTraceEnabled = false;
+ private boolean isLayerTraceEnabled() {
+ boolean layerTraceEnabled = false;
Parcel reply = null;
Parcel data = null;
try {
@@ -219,8 +184,8 @@
data = Parcel.obtain();
data.writeInterfaceToken("android.ui.ISurfaceComposer");
mSurfaceFlinger.transact(SURFACE_FLINGER_LAYER_TRACE_STATUS_CODE,
- data, reply, 0 /* flags */ );
- surfaceTraceEnabled = reply.readBoolean();
+ data, reply, 0 /* flags */);
+ layerTraceEnabled = reply.readBoolean();
}
} catch (RemoteException e) {
Log.e(TAG, "Could not get layer trace status, defaulting to false." + e.toString());
@@ -230,11 +195,27 @@
reply.recycle();
}
}
- return surfaceTraceEnabled;
+ return layerTraceEnabled;
}
@Override
- protected void setIsEnabled(boolean isEnabled) {
+ protected boolean isEnabled() {
+ return isWindowTraceEnabled() || isLayerTraceEnabled();
+ }
+
+ private void setWindowTraceEnabled(boolean isEnabled) {
+ try {
+ if (isEnabled) {
+ mWindowManager.startWindowTrace();
+ } else {
+ mWindowManager.stopWindowTrace();
+ }
+ } catch (RemoteException e) {
+ Log.e(TAG, "Could not set window trace status." + e.toString());
+ }
+ }
+
+ private void setLayerTraceEnabled(boolean isEnabled) {
Parcel data = null;
try {
if (mSurfaceFlinger != null) {
@@ -243,9 +224,6 @@
data.writeInt(isEnabled ? 1 : 0);
mSurfaceFlinger.transact(SURFACE_FLINGER_LAYER_TRACE_CONTROL_CODE,
data, null, 0 /* flags */);
- if (!isEnabled){
- mToast.show();
- }
}
} catch (RemoteException e) {
Log.e(TAG, "Could not set layer tracing." + e.toString());
@@ -255,5 +233,14 @@
}
}
}
+
+ @Override
+ protected void setIsEnabled(boolean isEnabled) {
+ setWindowTraceEnabled(isEnabled);
+ setLayerTraceEnabled(isEnabled);
+ if (!isEnabled) {
+ mToast.show();
+ }
+ }
}
}
\ No newline at end of file
diff --git a/src/com/android/settings/deviceinfo/DeviceInfoSettings.java b/src/com/android/settings/deviceinfo/DeviceInfoSettings.java
index 9b99e8b..164bf8a 100644
--- a/src/com/android/settings/deviceinfo/DeviceInfoSettings.java
+++ b/src/com/android/settings/deviceinfo/DeviceInfoSettings.java
@@ -20,14 +20,12 @@
import android.app.Fragment;
import android.content.Context;
import android.content.Intent;
-import android.os.Bundle;
import android.provider.SearchIndexableResource;
import android.support.annotation.VisibleForTesting;
import android.telephony.TelephonyManager;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.settings.R;
-import com.android.settings.SettingsActivity;
import com.android.settings.dashboard.DashboardFragment;
import com.android.settings.dashboard.SummaryLoader;
import com.android.settings.deviceinfo.firmwareversion.FirmwareVersionPreferenceController;
@@ -64,29 +62,18 @@
}
@Override
- public void onCreate(Bundle icicle) {
- super.onCreate(icicle);
- final Bundle arguments = getArguments();
- // Do not override initial expand children count if we come from
- // search (EXTRA_FRAGMENT_ARG_KEY is set) - we need to display every if entry point
- // is search.
- if (arguments == null
- || !arguments.containsKey(SettingsActivity.EXTRA_FRAGMENT_ARG_KEY)) {
-
- // Increase the number of children when the device contains more than 1 sim.
- final TelephonyManager telephonyManager = (TelephonyManager) getContext()
- .getSystemService(Context.TELEPHONY_SERVICE);
- final int numberOfChildren = Math.max(SIM_PREFERENCES_COUNT,
- SIM_PREFERENCES_COUNT * telephonyManager.getPhoneCount())
- + NON_SIM_PREFERENCES_COUNT;
- getPreferenceScreen().setInitialExpandedChildrenCount(numberOfChildren);
- }
+ public int getInitialExpandedChildCount() {
+ final TelephonyManager telephonyManager = (TelephonyManager) getContext()
+ .getSystemService(Context.TELEPHONY_SERVICE);
+ return Math.max(SIM_PREFERENCES_COUNT,
+ SIM_PREFERENCES_COUNT * telephonyManager.getPhoneCount())
+ + NON_SIM_PREFERENCES_COUNT;
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
final BuildNumberPreferenceController buildNumberPreferenceController =
- getPreferenceController(BuildNumberPreferenceController.class);
+ use(BuildNumberPreferenceController.class);
if (buildNumberPreferenceController.onActivityResult(requestCode, resultCode, data)) {
return;
}
@@ -104,7 +91,7 @@
}
@Override
- protected List<AbstractPreferenceController> getPreferenceControllers(Context context) {
+ protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
return buildPreferenceControllers(context, getActivity(), this /* fragment */,
getLifecycle());
}
@@ -171,7 +158,7 @@
}
@Override
- public List<AbstractPreferenceController> getPreferenceControllers(
+ public List<AbstractPreferenceController> createPreferenceControllers(
Context context) {
return buildPreferenceControllers(context, null /*activity */,
null /* fragment */, null /* lifecycle */);
diff --git a/src/com/android/settings/deviceinfo/DeviceNamePreferenceController.java b/src/com/android/settings/deviceinfo/DeviceNamePreferenceController.java
index 0f1dea1..6d0302f 100644
--- a/src/com/android/settings/deviceinfo/DeviceNamePreferenceController.java
+++ b/src/com/android/settings/deviceinfo/DeviceNamePreferenceController.java
@@ -67,7 +67,7 @@
}
@Override
- public String getSummary() {
+ public CharSequence getSummary() {
return mDeviceName;
}
diff --git a/src/com/android/settings/deviceinfo/PrivateVolumeSettings.java b/src/com/android/settings/deviceinfo/PrivateVolumeSettings.java
index c2a72e6..7958b37 100644
--- a/src/com/android/settings/deviceinfo/PrivateVolumeSettings.java
+++ b/src/com/android/settings/deviceinfo/PrivateVolumeSettings.java
@@ -484,9 +484,12 @@
args.putInt(
ManageApplications.EXTRA_STORAGE_TYPE,
ManageApplications.STORAGE_TYPE_LEGACY);
- intent = Utils.onBuildStartFragmentIntent(getActivity(),
- ManageApplications.class.getName(), args, null, R.string.apps_storage, null,
- false, getMetricsCategory());
+ intent = new SubSettingLauncher(getActivity())
+ .setDestination(ManageApplications.class.getName())
+ .setArguments(args)
+ .setTitle(R.string.apps_storage)
+ .setSourceMetricsCategory(getMetricsCategory())
+ .toIntent();
} break;
case R.string.storage_detail_images: {
diff --git a/src/com/android/settings/deviceinfo/StorageDashboardFragment.java b/src/com/android/settings/deviceinfo/StorageDashboardFragment.java
index 341c76f..9c872a4 100644
--- a/src/com/android/settings/deviceinfo/StorageDashboardFragment.java
+++ b/src/com/android/settings/deviceinfo/StorageDashboardFragment.java
@@ -58,7 +58,8 @@
import java.util.List;
public class StorageDashboardFragment extends DashboardFragment
- implements LoaderManager.LoaderCallbacks<SparseArray<StorageAsyncLoader.AppsStorageResult>> {
+ implements
+ LoaderManager.LoaderCallbacks<SparseArray<StorageAsyncLoader.AppsStorageResult>> {
private static final String TAG = "StorageDashboardFrag";
private static final int STORAGE_JOB_ID = 0;
private static final int ICON_JOB_ID = 1;
@@ -166,7 +167,7 @@
}
@Override
- protected List<AbstractPreferenceController> getPreferenceControllers(Context context) {
+ protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
final List<AbstractPreferenceController> controllers = new ArrayList<>();
mSummaryController = new StorageSummaryDonutPreferenceController(context);
controllers.add(mSummaryController);
@@ -223,7 +224,8 @@
}
@Override
- public List<AbstractPreferenceController> getPreferenceControllers(Context context) {
+ public List<AbstractPreferenceController> createPreferenceControllers(
+ Context context) {
final StorageManager sm = context.getSystemService(StorageManager.class);
final UserManagerWrapper userManager =
new UserManagerWrapper(context.getSystemService(UserManager.class));
@@ -354,7 +356,8 @@
}
@Override
- public void onLoaderReset(Loader<SparseArray<Drawable>> loader) {}
+ public void onLoaderReset(Loader<SparseArray<Drawable>> loader) {
+ }
}
public final class VolumeSizeCallbacks
@@ -369,7 +372,8 @@
}
@Override
- public void onLoaderReset(Loader<PrivateStorageInfo> loader) {}
+ public void onLoaderReset(Loader<PrivateStorageInfo> loader) {
+ }
@Override
public void onLoadFinished(
diff --git a/src/com/android/settings/deviceinfo/StorageProfileFragment.java b/src/com/android/settings/deviceinfo/StorageProfileFragment.java
index f2383de..3f75f5c 100644
--- a/src/com/android/settings/deviceinfo/StorageProfileFragment.java
+++ b/src/com/android/settings/deviceinfo/StorageProfileFragment.java
@@ -98,7 +98,7 @@
}
@Override
- protected List<AbstractPreferenceController> getPreferenceControllers(Context context) {
+ protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
final List<AbstractPreferenceController> controllers = new ArrayList<>();
final StorageManager sm = context.getSystemService(StorageManager.class);
mPreferenceController =
diff --git a/src/com/android/settings/deviceinfo/StorageSettings.java b/src/com/android/settings/deviceinfo/StorageSettings.java
index 17a06df..adc35a6 100644
--- a/src/com/android/settings/deviceinfo/StorageSettings.java
+++ b/src/com/android/settings/deviceinfo/StorageSettings.java
@@ -47,7 +47,6 @@
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.settings.R;
import com.android.settings.SettingsPreferenceFragment;
-import com.android.settings.Utils;
import com.android.settings.core.SubSettingLauncher;
import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
import com.android.settings.dashboard.SummaryLoader;
@@ -232,10 +231,12 @@
mHasLaunchedPrivateVolumeSettings = true;
final Bundle args = new Bundle();
args.putString(VolumeInfo.EXTRA_VOLUME_ID, VolumeInfo.ID_PRIVATE_INTERNAL);
- Intent intent = Utils.onBuildStartFragmentIntent(getActivity(),
- StorageDashboardFragment.class.getName(), args, null,
- R.string.storage_settings, null, false, getMetricsCategory());
- getActivity().startActivity(intent);
+ new SubSettingLauncher(getActivity())
+ .setDestination(StorageDashboardFragment.class.getName())
+ .setArguments(args)
+ .setTitle(R.string.storage_settings)
+ .setSourceMetricsCategory(getMetricsCategory())
+ .launch();
finish();
}
}
diff --git a/src/com/android/settings/deviceinfo/aboutphone/MyDeviceInfoFragment.java b/src/com/android/settings/deviceinfo/aboutphone/MyDeviceInfoFragment.java
index 03b69a5..8a2d5e3 100644
--- a/src/com/android/settings/deviceinfo/aboutphone/MyDeviceInfoFragment.java
+++ b/src/com/android/settings/deviceinfo/aboutphone/MyDeviceInfoFragment.java
@@ -62,7 +62,7 @@
import java.util.List;
public class MyDeviceInfoFragment extends DashboardFragment {
- private static final String LOG_TAG = "MeCardFragment";
+ private static final String LOG_TAG = "MyDeviceInfoFragment";
private static final String KEY_MY_DEVICE_INFO_HEADER = "my_device_info_header";
private static final String KEY_LEGAL_CONTAINER = "legal_container";
@@ -94,7 +94,7 @@
}
@Override
- protected List<AbstractPreferenceController> getPreferenceControllers(Context context) {
+ protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
return buildPreferenceControllers(context, getActivity(), this /* fragment */,
getLifecycle());
}
@@ -130,7 +130,7 @@
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
final BuildNumberPreferenceController buildNumberPreferenceController =
- getPreferenceController(BuildNumberPreferenceController.class);
+ use(BuildNumberPreferenceController.class);
if (buildNumberPreferenceController.onActivityResult(requestCode, resultCode, data)) {
return;
}
@@ -198,7 +198,7 @@
}
@Override
- public List<AbstractPreferenceController> getPreferenceControllers(
+ public List<AbstractPreferenceController> createPreferenceControllers(
Context context) {
return buildPreferenceControllers(context, null /*activity */,
null /* fragment */, null /* lifecycle */);
diff --git a/src/com/android/settings/deviceinfo/storage/StorageItemPreferenceController.java b/src/com/android/settings/deviceinfo/storage/StorageItemPreferenceController.java
index 3623298..6b51be3 100644
--- a/src/com/android/settings/deviceinfo/storage/StorageItemPreferenceController.java
+++ b/src/com/android/settings/deviceinfo/storage/StorageItemPreferenceController.java
@@ -35,9 +35,9 @@
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.settings.R;
import com.android.settings.Settings;
-import com.android.settings.Utils;
import com.android.settings.applications.manageapplications.ManageApplications;
import com.android.settings.core.PreferenceControllerMixin;
+import com.android.settings.core.SubSettingLauncher;
import com.android.settings.deviceinfo.PrivateVolumeSettings.SystemInfoFragment;
import com.android.settings.deviceinfo.StorageItemPreference;
import com.android.settings.overlay.FeatureFactory;
@@ -319,15 +319,12 @@
args.putInt(
ManageApplications.EXTRA_STORAGE_TYPE,
ManageApplications.STORAGE_TYPE_PHOTOS_VIDEOS);
- return Utils.onBuildStartFragmentIntent(
- mContext,
- ManageApplications.class.getName(),
- args,
- null,
- R.string.storage_photos_videos,
- null,
- false,
- mMetricsFeatureProvider.getMetricsCategory(mFragment));
+ return new SubSettingLauncher(mContext)
+ .setDestination(ManageApplications.class.getName())
+ .setTitle(R.string.storage_photos_videos)
+ .setArguments(args)
+ .setSourceMetricsCategory(mMetricsFeatureProvider.getMetricsCategory(mFragment))
+ .toIntent();
}
private Intent getAudioIntent() {
@@ -341,46 +338,57 @@
args.putString(ManageApplications.EXTRA_VOLUME_UUID, mVolume.getFsUuid());
args.putString(ManageApplications.EXTRA_VOLUME_NAME, mVolume.getDescription());
args.putInt(ManageApplications.EXTRA_STORAGE_TYPE, ManageApplications.STORAGE_TYPE_MUSIC);
- return Utils.onBuildStartFragmentIntent(mContext,
- ManageApplications.class.getName(), args, null, R.string.storage_music_audio, null,
- false, mMetricsFeatureProvider.getMetricsCategory(mFragment));
+ return new SubSettingLauncher(mContext)
+ .setDestination(ManageApplications.class.getName())
+ .setTitle(R.string.storage_music_audio)
+ .setArguments(args)
+ .setSourceMetricsCategory(mMetricsFeatureProvider.getMetricsCategory(mFragment))
+ .toIntent();
}
private Intent getAppsIntent() {
if (mVolume == null) {
return null;
}
-
- Bundle args = getWorkAnnotatedBundle(3);
+ final Bundle args = getWorkAnnotatedBundle(3);
args.putString(ManageApplications.EXTRA_CLASSNAME,
Settings.StorageUseActivity.class.getName());
args.putString(ManageApplications.EXTRA_VOLUME_UUID, mVolume.getFsUuid());
args.putString(ManageApplications.EXTRA_VOLUME_NAME, mVolume.getDescription());
- return Utils.onBuildStartFragmentIntent(mContext,
- ManageApplications.class.getName(), args, null, R.string.apps_storage, null,
- false, mMetricsFeatureProvider.getMetricsCategory(mFragment));
+ return new SubSettingLauncher(mContext)
+ .setDestination(ManageApplications.class.getName())
+ .setTitle(R.string.apps_storage)
+ .setArguments(args)
+ .setSourceMetricsCategory(mMetricsFeatureProvider.getMetricsCategory(mFragment))
+ .toIntent();
}
private Intent getGamesIntent() {
- Bundle args = getWorkAnnotatedBundle(1);
+ final Bundle args = getWorkAnnotatedBundle(1);
args.putString(ManageApplications.EXTRA_CLASSNAME,
Settings.GamesStorageActivity.class.getName());
- return Utils.onBuildStartFragmentIntent(mContext,
- ManageApplications.class.getName(), args, null, R.string.game_storage_settings,
- null, false, mMetricsFeatureProvider.getMetricsCategory(mFragment));
+ return new SubSettingLauncher(mContext)
+ .setDestination(ManageApplications.class.getName())
+ .setTitle(R.string.game_storage_settings)
+ .setArguments(args)
+ .setSourceMetricsCategory(mMetricsFeatureProvider.getMetricsCategory(mFragment))
+ .toIntent();
}
private Intent getMoviesIntent() {
- Bundle args = getWorkAnnotatedBundle(1);
+ final Bundle args = getWorkAnnotatedBundle(1);
args.putString(ManageApplications.EXTRA_CLASSNAME,
Settings.MoviesStorageActivity.class.getName());
- return Utils.onBuildStartFragmentIntent(mContext,
- ManageApplications.class.getName(), args, null, R.string.storage_movies_tv,
- null, false, mMetricsFeatureProvider.getMetricsCategory(mFragment));
+ return new SubSettingLauncher(mContext)
+ .setDestination(ManageApplications.class.getName())
+ .setTitle(R.string.storage_movies_tv)
+ .setArguments(args)
+ .setSourceMetricsCategory(mMetricsFeatureProvider.getMetricsCategory(mFragment))
+ .toIntent();
}
private Bundle getWorkAnnotatedBundle(int additionalCapacity) {
- Bundle args = new Bundle(2 + additionalCapacity);
+ final Bundle args = new Bundle(2 + additionalCapacity);
args.putBoolean(ManageApplications.EXTRA_WORK_ONLY, mIsWorkProfile);
args.putInt(ManageApplications.EXTRA_WORK_ID, mUserId);
return args;
diff --git a/src/com/android/settings/deviceinfo/storage/UserProfileController.java b/src/com/android/settings/deviceinfo/storage/UserProfileController.java
index c9fe54e..081a0be 100644
--- a/src/com/android/settings/deviceinfo/storage/UserProfileController.java
+++ b/src/com/android/settings/deviceinfo/storage/UserProfileController.java
@@ -17,9 +17,7 @@
package com.android.settings.deviceinfo.storage;
import android.content.Context;
-import android.content.Intent;
import android.content.pm.UserInfo;
-import android.content.res.TypedArray;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.os.storage.VolumeInfo;
@@ -31,14 +29,16 @@
import com.android.internal.util.Preconditions;
import com.android.settings.Utils;
import com.android.settings.core.PreferenceControllerMixin;
+import com.android.settings.core.SubSettingLauncher;
import com.android.settings.deviceinfo.StorageItemPreference;
import com.android.settings.deviceinfo.StorageProfileFragment;
import com.android.settings.wrapper.UserManagerWrapper;
import com.android.settingslib.core.AbstractPreferenceController;
-import com.android.settingslib.drawer.SettingsDrawerActivity;
-/** Defines a {@link AbstractPreferenceController} which handles a single profile of the primary
- * user. */
+/**
+ * Defines a {@link AbstractPreferenceController} which handles a single profile of the primary
+ * user.
+ */
public class UserProfileController extends AbstractPreferenceController implements
PreferenceControllerMixin, StorageAsyncLoader.ResultHandler,
UserIconLoader.UserIconHandler {
@@ -79,13 +79,16 @@
@Override
public boolean handlePreferenceTreeClick(Preference preference) {
if (preference != null && mStoragePreference == preference) {
- Bundle args = new Bundle(2);
+ final Bundle args = new Bundle();
args.putInt(StorageProfileFragment.USER_ID_EXTRA, mUser.id);
args.putString(VolumeInfo.EXTRA_VOLUME_ID, VolumeInfo.ID_PRIVATE_INTERNAL);
- Intent intent = Utils.onBuildStartFragmentIntent(mContext,
- StorageProfileFragment.class.getName(), args, null, 0,
- mUser.name, false, MetricsProto.MetricsEvent.DEVICEINFO_STORAGE);
- mContext.startActivity(intent);
+
+ new SubSettingLauncher(mContext)
+ .setDestination(StorageProfileFragment.class.getName())
+ .setArguments(args)
+ .setTitle(mUser.name)
+ .setSourceMetricsCategory(MetricsProto.MetricsEvent.DEVICEINFO_STORAGE)
+ .launch();
return true;
}
@@ -99,8 +102,7 @@
int userId = mUser.id;
StorageAsyncLoader.AppsStorageResult result = stats.get(userId);
if (result != null) {
- setSize(
- result.externalStats.totalBytes
+ setSize(result.externalStats.totalBytes
+ result.otherAppsSize
+ result.videoAppsSize
+ result.musicAppsSize
diff --git a/src/com/android/settings/display/AmbientDisplaySettings.java b/src/com/android/settings/display/AmbientDisplaySettings.java
index 3cac078..02db6f1 100644
--- a/src/com/android/settings/display/AmbientDisplaySettings.java
+++ b/src/com/android/settings/display/AmbientDisplaySettings.java
@@ -76,7 +76,7 @@
}
@Override
- protected List<AbstractPreferenceController> getPreferenceControllers(Context context) {
+ protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
return buildPreferenceControllers(context, getLifecycle(),
new AmbientDisplayConfiguration(context), mMetricsFeatureProvider,
this::updatePreferenceStates);
@@ -101,7 +101,8 @@
}
@Override
- public List<AbstractPreferenceController> getPreferenceControllers(Context context) {
+ public List<AbstractPreferenceController> createPreferenceControllers(
+ Context context) {
return buildPreferenceControllers(context, null,
new AmbientDisplayConfiguration(context), null, null);
}
diff --git a/src/com/android/settings/display/ColorModePreferenceController.java b/src/com/android/settings/display/ColorModePreferenceController.java
index 2ab2ec9..7fa9782 100644
--- a/src/com/android/settings/display/ColorModePreferenceController.java
+++ b/src/com/android/settings/display/ColorModePreferenceController.java
@@ -21,31 +21,47 @@
import android.util.Log;
import com.android.internal.annotations.VisibleForTesting;
-import com.android.settings.core.PreferenceControllerMixin;
-import com.android.settingslib.core.AbstractPreferenceController;
+import com.android.internal.app.ColorDisplayController;
+import com.android.settings.R;
+import com.android.settings.core.BasePreferenceController;
-public class ColorModePreferenceController extends AbstractPreferenceController implements
- PreferenceControllerMixin {
+public class ColorModePreferenceController extends BasePreferenceController {
private static final String TAG = "ColorModePreference";
private static final String KEY_COLOR_MODE = "color_mode";
private static final int SURFACE_FLINGER_TRANSACTION_QUERY_WIDE_COLOR = 1024;
private final ConfigurationWrapper mConfigWrapper;
+ private ColorDisplayController mColorDisplayController;
public ColorModePreferenceController(Context context) {
- super(context);
+ super(context, KEY_COLOR_MODE);
mConfigWrapper = new ConfigurationWrapper();
}
@Override
- public String getPreferenceKey() {
- return KEY_COLOR_MODE;
+ public int getAvailabilityStatus() {
+ return mConfigWrapper.isScreenWideColorGamut() ? AVAILABLE : DISABLED_FOR_USER;
}
@Override
- public boolean isAvailable() {
- return mConfigWrapper.isScreenWideColorGamut();
+ public CharSequence getSummary() {
+ final int colorMode = getColorDisplayController().getColorMode();
+ if (colorMode == ColorDisplayController.COLOR_MODE_SATURATED) {
+ return mContext.getText(R.string.color_mode_option_saturated);
+ }
+ if (colorMode == ColorDisplayController.COLOR_MODE_BOOSTED) {
+ return mContext.getText(R.string.color_mode_option_boosted);
+ }
+ return mContext.getText(R.string.color_mode_option_natural);
+ }
+
+ @VisibleForTesting
+ ColorDisplayController getColorDisplayController() {
+ if (mColorDisplayController == null) {
+ mColorDisplayController = new ColorDisplayController(mContext);
+ }
+ return mColorDisplayController;
}
@VisibleForTesting
diff --git a/src/com/android/settings/display/ColorModePreferenceFragment.java b/src/com/android/settings/display/ColorModePreferenceFragment.java
index e3fb65d..ea8dd6a 100644
--- a/src/com/android/settings/display/ColorModePreferenceFragment.java
+++ b/src/com/android/settings/display/ColorModePreferenceFragment.java
@@ -22,6 +22,7 @@
import com.android.settings.R;
import com.android.settings.widget.RadioButtonPickerFragment;
+import com.android.settingslib.widget.CandidateInfo;
import java.util.Arrays;
import java.util.List;
diff --git a/src/com/android/settings/display/VrDisplayPreferencePicker.java b/src/com/android/settings/display/VrDisplayPreferencePicker.java
index 5487c46..5f99be9 100644
--- a/src/com/android/settings/display/VrDisplayPreferencePicker.java
+++ b/src/com/android/settings/display/VrDisplayPreferencePicker.java
@@ -24,6 +24,7 @@
import com.android.internal.logging.nano.MetricsProto;
import com.android.settings.R;
import com.android.settings.widget.RadioButtonPickerFragment;
+import com.android.settingslib.widget.CandidateInfo;
import java.util.ArrayList;
import java.util.List;
diff --git a/src/com/android/settings/dream/CurrentDreamPicker.java b/src/com/android/settings/dream/CurrentDreamPicker.java
index f0d520c..3ebce1c 100644
--- a/src/com/android/settings/dream/CurrentDreamPicker.java
+++ b/src/com/android/settings/dream/CurrentDreamPicker.java
@@ -24,6 +24,7 @@
import com.android.settings.widget.RadioButtonPickerFragment;
import com.android.settingslib.dream.DreamBackend;
import com.android.settingslib.dream.DreamBackend.DreamInfo;
+import com.android.settingslib.widget.CandidateInfo;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
diff --git a/src/com/android/settings/dream/DreamSettings.java b/src/com/android/settings/dream/DreamSettings.java
index c3eaa7f..c0d4c40 100644
--- a/src/com/android/settings/dream/DreamSettings.java
+++ b/src/com/android/settings/dream/DreamSettings.java
@@ -109,7 +109,7 @@
}
@Override
- protected List<AbstractPreferenceController> getPreferenceControllers(Context context) {
+ protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
return buildPreferenceControllers(context);
}
@@ -137,18 +137,18 @@
public static final SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER
= new BaseSearchIndexProvider() {
- @Override
- public List<SearchIndexableResource> getXmlResourcesToIndex(
- Context context, boolean enabled) {
- final SearchIndexableResource sir = new SearchIndexableResource(context);
- sir.xmlResId = R.xml.dream_fragment_overview;
- return Arrays.asList(sir);
- }
+ @Override
+ public List<SearchIndexableResource> getXmlResourcesToIndex(
+ Context context, boolean enabled) {
+ final SearchIndexableResource sir = new SearchIndexableResource(context);
+ sir.xmlResId = R.xml.dream_fragment_overview;
+ return Arrays.asList(sir);
+ }
- @Override
- public List<AbstractPreferenceController> getPreferenceControllers(Context context) {
- return buildPreferenceControllers(context);
- }
- };
+ @Override
+ public List<AbstractPreferenceController> createPreferenceControllers(Context context) {
+ return buildPreferenceControllers(context);
+ }
+ };
}
diff --git a/src/com/android/settings/dream/WhenToDreamPicker.java b/src/com/android/settings/dream/WhenToDreamPicker.java
index 7031bdf..f6f89a8 100644
--- a/src/com/android/settings/dream/WhenToDreamPicker.java
+++ b/src/com/android/settings/dream/WhenToDreamPicker.java
@@ -22,6 +22,7 @@
import com.android.settings.R;
import com.android.settings.widget.RadioButtonPickerFragment;
import com.android.settingslib.dream.DreamBackend;
+import com.android.settingslib.widget.CandidateInfo;
import java.util.ArrayList;
import java.util.List;
diff --git a/src/com/android/settings/enterprise/ApplicationListFragment.java b/src/com/android/settings/enterprise/ApplicationListFragment.java
index 7425a30..1b41f03 100644
--- a/src/com/android/settings/enterprise/ApplicationListFragment.java
+++ b/src/com/android/settings/enterprise/ApplicationListFragment.java
@@ -49,7 +49,7 @@
}
@Override
- protected List<AbstractPreferenceController> getPreferenceControllers(Context context) {
+ protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
final List<AbstractPreferenceController> controllers = new ArrayList<>();
ApplicationListPreferenceController controller = new ApplicationListPreferenceController(
context, this, context.getPackageManager(), this);
diff --git a/src/com/android/settings/enterprise/EnterprisePrivacySettings.java b/src/com/android/settings/enterprise/EnterprisePrivacySettings.java
index 0628dbb..a0ad551 100644
--- a/src/com/android/settings/enterprise/EnterprisePrivacySettings.java
+++ b/src/com/android/settings/enterprise/EnterprisePrivacySettings.java
@@ -51,7 +51,7 @@
}
@Override
- protected List<AbstractPreferenceController> getPreferenceControllers(Context context) {
+ protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
return buildPreferenceControllers(context, true /* async */);
}
@@ -112,7 +112,7 @@
}
@Override
- public List<AbstractPreferenceController> getPreferenceControllers(
+ public List<AbstractPreferenceController> createPreferenceControllers(
Context context) {
return buildPreferenceControllers(context, false /* async */);
}
diff --git a/src/com/android/settings/enterprise/EnterpriseSetDefaultAppsListFragment.java b/src/com/android/settings/enterprise/EnterpriseSetDefaultAppsListFragment.java
index a1c61de..1788c33 100644
--- a/src/com/android/settings/enterprise/EnterpriseSetDefaultAppsListFragment.java
+++ b/src/com/android/settings/enterprise/EnterpriseSetDefaultAppsListFragment.java
@@ -48,7 +48,7 @@
}
@Override
- protected List<AbstractPreferenceController> getPreferenceControllers(Context context) {
+ protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
final List<AbstractPreferenceController> controllers = new ArrayList<>();
final EnterpriseSetDefaultAppsListPreferenceController controller =
new EnterpriseSetDefaultAppsListPreferenceController(
diff --git a/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java b/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java
index 1bbb035..1ecb2a8 100644
--- a/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java
+++ b/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java
@@ -327,7 +327,7 @@
}
@Override
- protected List<AbstractPreferenceController> getPreferenceControllers(Context context) {
+ protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
final List<AbstractPreferenceController> controllers = new ArrayList<>();
final Bundle bundle = getArguments();
final int uid = bundle.getInt(EXTRA_UID, 0);
diff --git a/src/com/android/settings/fuelgauge/BatterySaverController.java b/src/com/android/settings/fuelgauge/BatterySaverController.java
index 85fb9f5..f139f31 100644
--- a/src/com/android/settings/fuelgauge/BatterySaverController.java
+++ b/src/com/android/settings/fuelgauge/BatterySaverController.java
@@ -18,45 +18,40 @@
import android.content.Context;
import android.database.ContentObserver;
import android.os.Handler;
+import android.os.Looper;
import android.os.PowerManager;
import android.provider.Settings;
import android.support.annotation.VisibleForTesting;
-import android.support.v7.preference.Preference;
import android.support.v7.preference.PreferenceScreen;
+
import com.android.settings.R;
import com.android.settings.Utils;
-import com.android.settings.core.PreferenceControllerMixin;
+import com.android.settings.core.TogglePreferenceController;
import com.android.settings.dashboard.conditional.BatterySaverCondition;
import com.android.settings.dashboard.conditional.ConditionManager;
import com.android.settings.widget.MasterSwitchPreference;
-import com.android.settingslib.core.AbstractPreferenceController;
-import com.android.settingslib.core.lifecycle.Lifecycle;
import com.android.settingslib.core.lifecycle.LifecycleObserver;
import com.android.settingslib.core.lifecycle.events.OnStart;
import com.android.settingslib.core.lifecycle.events.OnStop;
-import static android.os.PowerManager.ACTION_POWER_SAVE_MODE_CHANGING;
-
-public class BatterySaverController extends AbstractPreferenceController
- implements PreferenceControllerMixin, Preference.OnPreferenceChangeListener,
- LifecycleObserver, OnStart, OnStop, BatterySaverReceiver.BatterySaverListener {
+public class BatterySaverController extends TogglePreferenceController
+ implements LifecycleObserver, OnStart, OnStop, BatterySaverReceiver.BatterySaverListener {
private static final String KEY_BATTERY_SAVER = "battery_saver_summary";
private final BatterySaverReceiver mBatteryStateChangeReceiver;
private final PowerManager mPowerManager;
private MasterSwitchPreference mBatterySaverPref;
- public BatterySaverController(Context context, Lifecycle lifecycle) {
- super(context);
+ public BatterySaverController(Context context) {
+ super(context, KEY_BATTERY_SAVER);
- lifecycle.addObserver(this);
mPowerManager = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE);
mBatteryStateChangeReceiver = new BatterySaverReceiver(context);
mBatteryStateChangeReceiver.setBatterySaverListener(this);
}
@Override
- public boolean isAvailable() {
- return true;
+ public int getAvailabilityStatus() {
+ return AVAILABLE;
}
@Override
@@ -71,17 +66,9 @@
}
@Override
- public void updateState(Preference preference) {
- mBatterySaverPref.setChecked(mPowerManager.isPowerSaveMode());
- updateSummary();
- }
-
- @Override
- public boolean onPreferenceChange(Preference preference, Object newValue) {
- final boolean saverOn = (Boolean) newValue;
- if (saverOn != mPowerManager.isPowerSaveMode()
- && !mPowerManager.setPowerSaveMode(saverOn)) {
- // Do nothing if power save mode doesn't set correctly
+ public boolean setChecked(boolean isChecked) {
+ mBatterySaverPref.setChecked(isChecked);
+ if (!mPowerManager.setPowerSaveMode(isChecked)) {
return false;
}
@@ -91,6 +78,11 @@
}
@Override
+ public boolean isChecked() {
+ return mPowerManager.isPowerSaveMode();
+ }
+
+ @Override
public void onStart() {
mContext.getContentResolver().registerContentObserver(
Settings.Global.getUriFor(Settings.Global.LOW_POWER_MODE_TRIGGER_LEVEL)
@@ -110,7 +102,8 @@
ConditionManager.get(mContext).getCondition(BatterySaverCondition.class).refreshState();
}
- private void updateSummary() {
+ @Override
+ public CharSequence getSummary() {
final boolean mode = mPowerManager.isPowerSaveMode();
final int format = mode ? R.string.battery_saver_on_summary
: R.string.battery_saver_off_summary;
@@ -119,13 +112,16 @@
final int percentFormat = percent > 0 ? R.string.battery_saver_desc_turn_on_auto_pct
: R.string.battery_saver_desc_turn_on_auto_never;
- final String summary = mContext.getString(format, mContext.getString(percentFormat,
+ return mContext.getString(format, mContext.getString(percentFormat,
Utils.formatPercentage(percent)));
-
- mBatterySaverPref.setSummary(summary);
}
- private final ContentObserver mObserver = new ContentObserver(new Handler()) {
+ private void updateSummary() {
+ mBatterySaverPref.setSummary(getSummary());
+ }
+
+ private final ContentObserver mObserver = new ContentObserver(
+ new Handler(Looper.getMainLooper())) {
@Override
public void onChange(boolean selfChange) {
updateSummary();
diff --git a/src/com/android/settings/fuelgauge/BatteryUtils.java b/src/com/android/settings/fuelgauge/BatteryUtils.java
index da9b705..10bc853 100644
--- a/src/com/android/settings/fuelgauge/BatteryUtils.java
+++ b/src/com/android/settings/fuelgauge/BatteryUtils.java
@@ -44,6 +44,7 @@
import com.android.settings.overlay.FeatureFactory;
import com.android.settingslib.utils.PowerUtil;
+
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.Collections;
@@ -69,6 +70,7 @@
int BACKGROUND = 2;
int ALL = 3;
}
+
private static final String TAG = "BatteryUtils";
private static final int MIN_POWER_THRESHOLD_MILLI_AMP = 5;
@@ -81,6 +83,7 @@
private Context mContext;
@VisibleForTesting
PowerUsageFeatureProvider mPowerUsageFeatureProvider;
+
public static BatteryUtils getInstance(Context context) {
if (sInstance == null || sInstance.isDataCorrupted()) {
sInstance = new BatteryUtils(context);
@@ -153,8 +156,7 @@
private long getProcessForegroundTimeMs(BatteryStats.Uid uid, int which) {
final long rawRealTimeUs = PowerUtil.convertMsToUs(SystemClock.elapsedRealtime());
return getScreenUsageTimeMs(uid, which, rawRealTimeUs)
- + PowerUtil.convertUsToMs(
- getForegroundServiceTotalTimeUs(uid, rawRealTimeUs));
+ + PowerUtil.convertUsToMs(getForegroundServiceTotalTimeUs(uid, rawRealTimeUs));
}
/**
@@ -349,6 +351,7 @@
/**
* Calculate the screen usage time since last full charge.
+ *
* @param batteryStatsHelper utility class that contains the screen usage data
* @return time in millis
*/
@@ -500,5 +503,35 @@
return false;
}
+ /**
+ * Check if the app represented by {@code uid} has battery usage more than {@code threshold}
+ *
+ * @param batteryStatsHelper used to check the battery usage
+ * @param userManager used to init the {@code batteryStatsHelper}
+ * @param uid represent the app
+ * @param threshold battery percentage threshold(e.g. 10 means 10% battery usage )
+ * @return {@code true} if battery drain is more than the threshold
+ */
+ public boolean isAppHeavilyUsed(BatteryStatsHelper batteryStatsHelper, UserManager userManager,
+ int uid, int threshold) {
+ initBatteryStatsHelper(batteryStatsHelper, null /* bundle */, userManager);
+ final int dischargeAmount = batteryStatsHelper.getStats().getDischargeAmount(
+ BatteryStats.STATS_SINCE_CHARGED);
+ List<BatterySipper> batterySippers = batteryStatsHelper.getUsageList();
+ final double hiddenAmount = removeHiddenBatterySippers(batterySippers);
+
+ for (int i = 0, size = batterySippers.size(); i < size; i++) {
+ final BatterySipper batterySipper = batterySippers.get(i);
+ if (batterySipper.getUid() == uid) {
+ final int percent = (int) calculateBatteryPercent(
+ batterySipper.totalPowerMah, batteryStatsHelper.getTotalPower(),
+ hiddenAmount,
+ dischargeAmount);
+ return percent >= threshold;
+ }
+ }
+
+ return false;
+ }
}
diff --git a/src/com/android/settings/fuelgauge/PowerUsageAdvanced.java b/src/com/android/settings/fuelgauge/PowerUsageAdvanced.java
index 25351d3..2e94e2c 100644
--- a/src/com/android/settings/fuelgauge/PowerUsageAdvanced.java
+++ b/src/com/android/settings/fuelgauge/PowerUsageAdvanced.java
@@ -167,7 +167,7 @@
}
@Override
- protected List<AbstractPreferenceController> getPreferenceControllers(Context context) {
+ protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
return null;
}
diff --git a/src/com/android/settings/fuelgauge/PowerUsageAnomalyDetails.java b/src/com/android/settings/fuelgauge/PowerUsageAnomalyDetails.java
index 2e771bd..abfb22b 100644
--- a/src/com/android/settings/fuelgauge/PowerUsageAnomalyDetails.java
+++ b/src/com/android/settings/fuelgauge/PowerUsageAnomalyDetails.java
@@ -123,7 +123,7 @@
}
@Override
- protected List<AbstractPreferenceController> getPreferenceControllers(Context context) {
+ protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
return null;
}
diff --git a/src/com/android/settings/fuelgauge/PowerUsageSummary.java b/src/com/android/settings/fuelgauge/PowerUsageSummary.java
index 659166a..d3a48a2 100644
--- a/src/com/android/settings/fuelgauge/PowerUsageSummary.java
+++ b/src/com/android/settings/fuelgauge/PowerUsageSummary.java
@@ -25,7 +25,6 @@
import android.os.Bundle;
import android.provider.SearchIndexableResource;
import android.support.annotation.VisibleForTesting;
-import android.support.v7.preference.Preference;
import android.support.v7.preference.PreferenceGroup;
import android.text.format.Formatter;
import android.util.SparseArray;
@@ -33,17 +32,14 @@
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
-import android.view.View.OnClickListener;
import android.view.View.OnLongClickListener;
import android.widget.TextView;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.settings.R;
-import com.android.settings.Settings.HighPowerApplicationsActivity;
import com.android.settings.SettingsActivity;
import com.android.settings.Utils;
import com.android.settings.applications.LayoutPreference;
-import com.android.settings.applications.manageapplications.ManageApplications;
import com.android.settings.dashboard.SummaryLoader;
import com.android.settings.display.BatteryPercentagePreferenceController;
import com.android.settings.fuelgauge.anomaly.Anomaly;
@@ -56,9 +52,9 @@
import com.android.settingslib.core.AbstractPreferenceController;
import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
import com.android.settingslib.core.lifecycle.Lifecycle;
-
import com.android.settingslib.utils.PowerUtil;
import com.android.settingslib.utils.StringUtil;
+
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
@@ -227,22 +223,21 @@
}
@Override
- protected List<AbstractPreferenceController> getPreferenceControllers(Context context) {
+ protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
final Lifecycle lifecycle = getLifecycle();
final SettingsActivity activity = (SettingsActivity) getActivity();
final List<AbstractPreferenceController> controllers = new ArrayList<>();
mBatteryHeaderPreferenceController = new BatteryHeaderPreferenceController(
- context, activity, this /* host */, getLifecycle());
+ context, activity, this /* host */, lifecycle);
controllers.add(mBatteryHeaderPreferenceController);
mBatteryAppListPreferenceController = new BatteryAppListPreferenceController(context,
KEY_APP_LIST, lifecycle, activity, this);
controllers.add(mBatteryAppListPreferenceController);
mBatteryTipPreferenceController = new BatteryTipPreferenceController(context,
- KEY_BATTERY_TIP, (SettingsActivity) getActivity(), this, this);
+ KEY_BATTERY_TIP, (SettingsActivity) getActivity(), this /* fragment */, this /*
+ BatteryTipListener */);
controllers.add(mBatteryTipPreferenceController);
- controllers.add(new BatterySaverController(context, getLifecycle()));
controllers.add(new BatteryPercentagePreferenceController(context));
-
return controllers;
}
@@ -322,7 +317,8 @@
@VisibleForTesting
void updateLastFullChargePreference(long timeMs) {
- final CharSequence timeSequence = StringUtil.formatRelativeTime(getContext(), timeMs, false);
+ final CharSequence timeSequence = StringUtil.formatRelativeTime(getContext(), timeMs,
+ false);
mLastFullChargePref.setSubtitle(timeSequence);
}
diff --git a/src/com/android/settings/fuelgauge/PowerUsageSummaryLegacy.java b/src/com/android/settings/fuelgauge/PowerUsageSummaryLegacy.java
index 1ca8626..ab7863c 100644
--- a/src/com/android/settings/fuelgauge/PowerUsageSummaryLegacy.java
+++ b/src/com/android/settings/fuelgauge/PowerUsageSummaryLegacy.java
@@ -307,19 +307,21 @@
}
@Override
- protected List<AbstractPreferenceController> getPreferenceControllers(Context context) {
+ protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
final List<AbstractPreferenceController> controllers = new ArrayList<>();
mBatteryHeaderPreferenceController = new BatteryHeaderPreferenceController(
context, getActivity(), this /* host */, getLifecycle());
controllers.add(mBatteryHeaderPreferenceController);
controllers.add(new AutoBrightnessPreferenceController(context, KEY_AUTO_BRIGHTNESS));
controllers.add(new TimeoutPreferenceController(context, KEY_SCREEN_TIMEOUT));
- controllers.add(new BatterySaverController(context, getLifecycle()));
controllers.add(new BatteryPercentagePreferenceController(context));
controllers.add(new AmbientDisplayPreferenceController(
context,
new AmbientDisplayConfiguration(context),
KEY_AMBIENT_DISPLAY));
+ BatterySaverController batterySaverController = new BatterySaverController(context);
+ controllers.add(batterySaverController);
+ getLifecycle().addObserver(batterySaverController);
return controllers;
}
diff --git a/src/com/android/settings/fuelgauge/RestrictAppPreferenceController.java b/src/com/android/settings/fuelgauge/RestrictAppPreferenceController.java
index 92ecd4b..1433008 100644
--- a/src/com/android/settings/fuelgauge/RestrictAppPreferenceController.java
+++ b/src/com/android/settings/fuelgauge/RestrictAppPreferenceController.java
@@ -22,11 +22,14 @@
import android.support.annotation.VisibleForTesting;
import android.support.v7.preference.Preference;
+import com.android.internal.util.CollectionUtils;
import com.android.settings.R;
import com.android.settings.SettingsActivity;
import com.android.settings.core.BasePreferenceController;
import com.android.settings.core.InstrumentedPreferenceFragment;
+import com.android.settings.fuelgauge.batterytip.AppInfo;
+import java.util.ArrayList;
import java.util.List;
/**
@@ -37,7 +40,7 @@
static final String KEY_RESTRICT_APP = "restricted_app";
private AppOpsManager mAppOpsManager;
- private List<AppOpsManager.PackageOps> mPackageOps;
+ private List<AppInfo> mAppInfos;
private SettingsActivity mSettingsActivity;
private InstrumentedPreferenceFragment mPreferenceFragment;
@@ -62,9 +65,17 @@
public void updateState(Preference preference) {
super.updateState(preference);
- mPackageOps = mAppOpsManager.getPackagesForOps(
+ final List<AppOpsManager.PackageOps> packageOpsList = mAppOpsManager.getPackagesForOps(
new int[]{AppOpsManager.OP_RUN_ANY_IN_BACKGROUND});
- final int num = mPackageOps != null ? mPackageOps.size() : 0;
+ final int num = CollectionUtils.size(packageOpsList);
+ mAppInfos = new ArrayList<>();
+
+ for (int i = 0; i < num; i++) {
+ final AppOpsManager.PackageOps packageOps = packageOpsList.get(i);
+ mAppInfos.add(new AppInfo.Builder()
+ .setPackageName(packageOps.getPackageName())
+ .build());
+ }
// Enable the preference if some apps already been restricted, otherwise disable it
preference.setEnabled(num > 0);
@@ -78,7 +89,7 @@
if (getPreferenceKey().equals(preference.getKey())) {
// start fragment
RestrictedAppDetails.startRestrictedAppDetails(mSettingsActivity, mPreferenceFragment,
- mPackageOps);
+ mAppInfos);
return true;
}
diff --git a/src/com/android/settings/fuelgauge/RestrictedAppDetails.java b/src/com/android/settings/fuelgauge/RestrictedAppDetails.java
index 26386b6..0843c98 100644
--- a/src/com/android/settings/fuelgauge/RestrictedAppDetails.java
+++ b/src/com/android/settings/fuelgauge/RestrictedAppDetails.java
@@ -17,6 +17,7 @@
package com.android.settings.fuelgauge;
import android.app.AppOpsManager;
+import android.app.Fragment;
import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
@@ -35,6 +36,7 @@
import com.android.settings.core.InstrumentedPreferenceFragment;
import com.android.settings.core.SubSettingLauncher;
import com.android.settings.dashboard.DashboardFragment;
+import com.android.settings.fuelgauge.batterytip.AppInfo;
import com.android.settings.widget.AppCheckBoxPreference;
import com.android.settingslib.core.AbstractPreferenceController;
@@ -47,11 +49,12 @@
public static final String TAG = "RestrictedAppDetails";
- private static final String EXTRA_PACKAGE_OPS_LIST = "package_ops_list";
+ @VisibleForTesting
+ static final String EXTRA_APP_INFO_LIST = "app_info_list";
private static final String KEY_PREF_RESTRICTED_APP_LIST = "restrict_app_list";
@VisibleForTesting
- List<AppOpsManager.PackageOps> mPackageOpsList;
+ List<AppInfo> mAppInfos;
@VisibleForTesting
IconDrawableFactory mIconDrawableFactory;
@VisibleForTesting
@@ -62,9 +65,9 @@
PackageManager mPackageManager;
public static void startRestrictedAppDetails(SettingsActivity caller,
- InstrumentedPreferenceFragment fragment, List<AppOpsManager.PackageOps> packageOpsList) {
+ InstrumentedPreferenceFragment fragment, List<AppInfo> appInfos) {
final Bundle args = new Bundle();
- args.putParcelableList(EXTRA_PACKAGE_OPS_LIST, packageOpsList);
+ args.putParcelableList(EXTRA_APP_INFO_LIST, appInfos);
new SubSettingLauncher(caller)
.setDestination(RestrictedAppDetails.class.getName())
@@ -80,7 +83,7 @@
final Context context = getContext();
mRestrictedAppListGroup = (PreferenceGroup) findPreference(KEY_PREF_RESTRICTED_APP_LIST);
- mPackageOpsList = getArguments().getParcelableArrayList(EXTRA_PACKAGE_OPS_LIST);
+ mAppInfos = getArguments().getParcelableArrayList(EXTRA_APP_INFO_LIST);
mPackageManager = context.getPackageManager();
mIconDrawableFactory = IconDrawableFactory.newInstance(context);
mBatteryUtils = BatteryUtils.getInstance(context);
@@ -105,7 +108,7 @@
}
@Override
- protected List<AbstractPreferenceController> getPreferenceControllers(Context context) {
+ protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
return null;
}
@@ -119,19 +122,20 @@
mRestrictedAppListGroup.removeAll();
final Context context = getPrefContext();
- for (int i = 0, size = mPackageOpsList.size(); i < size; i++) {
+ for (int i = 0, size = mAppInfos.size(); i < size; i++) {
final CheckBoxPreference checkBoxPreference = new AppCheckBoxPreference(context);
- final AppOpsManager.PackageOps packageOps = mPackageOpsList.get(i);
+ final AppInfo appInfo = mAppInfos.get(i);
try {
final ApplicationInfo applicationInfo = mPackageManager.getApplicationInfo(
- packageOps.getPackageName(), 0 /* flags */);
+ appInfo.packageName, 0 /* flags */);
checkBoxPreference.setChecked(true);
checkBoxPreference.setTitle(mPackageManager.getApplicationLabel(applicationInfo));
- checkBoxPreference.setKey(packageOps.getPackageName());
+ checkBoxPreference.setKey(appInfo.packageName);
checkBoxPreference.setIcon(
Utils.getBadgedIcon(mIconDrawableFactory, mPackageManager,
- packageOps.getPackageName(),
- UserHandle.getUserId(packageOps.getUid())));
+ appInfo.packageName,
+ UserHandle.getUserId(
+ mBatteryUtils.getPackageUid(appInfo.packageName))));
checkBoxPreference.setOnPreferenceChangeListener((pref, value) -> {
// change the toggle
final int mode = (Boolean) value ? AppOpsManager.MODE_IGNORED
diff --git a/src/com/android/settings/fuelgauge/SmartBatterySettings.java b/src/com/android/settings/fuelgauge/SmartBatterySettings.java
index 6aeb8a3..34f930a 100644
--- a/src/com/android/settings/fuelgauge/SmartBatterySettings.java
+++ b/src/com/android/settings/fuelgauge/SmartBatterySettings.java
@@ -64,7 +64,7 @@
}
@Override
- protected List<AbstractPreferenceController> getPreferenceControllers(Context context) {
+ protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
return buildPreferenceControllers(context, (SettingsActivity) getActivity(), this);
}
@@ -99,7 +99,7 @@
}
@Override
- public List<AbstractPreferenceController> getPreferenceControllers(
+ public List<AbstractPreferenceController> createPreferenceControllers(
Context context) {
return buildPreferenceControllers(context, null, null);
}
diff --git a/src/com/android/settings/fuelgauge/batterysaver/AutoBatterySaverPreferenceController.java b/src/com/android/settings/fuelgauge/batterysaver/AutoBatterySaverPreferenceController.java
index 4d3dd31..bf8cd07 100644
--- a/src/com/android/settings/fuelgauge/batterysaver/AutoBatterySaverPreferenceController.java
+++ b/src/com/android/settings/fuelgauge/batterysaver/AutoBatterySaverPreferenceController.java
@@ -29,13 +29,15 @@
*/
public class AutoBatterySaverPreferenceController extends TogglePreferenceController implements
Preference.OnPreferenceChangeListener {
- private static final int LOW_POWER_MODE_TRIGGER_THRESHOLD = 15;
+ private final int mDefWarnLevel;
@VisibleForTesting
static final String KEY_AUTO_BATTERY_SAVER = "auto_battery_saver";
public AutoBatterySaverPreferenceController(Context context) {
super(context, KEY_AUTO_BATTERY_SAVER);
+ mDefWarnLevel = mContext.getResources().getInteger(
+ com.android.internal.R.integer.config_lowBatteryWarningLevel);
}
@Override
@@ -46,7 +48,7 @@
@Override
public boolean isChecked() {
return Settings.Global.getInt(mContext.getContentResolver(),
- Settings.Global.LOW_POWER_MODE_TRIGGER_LEVEL, 0) != 0;
+ Settings.Global.LOW_POWER_MODE_TRIGGER_LEVEL, mDefWarnLevel) != 0;
}
@Override
@@ -54,7 +56,7 @@
Settings.Global.putInt(mContext.getContentResolver(),
Settings.Global.LOW_POWER_MODE_TRIGGER_LEVEL,
isChecked
- ? LOW_POWER_MODE_TRIGGER_THRESHOLD
+ ? mDefWarnLevel
: 0);
return true;
}
diff --git a/src/com/android/settings/fuelgauge/batterysaver/AutoBatterySeekBarPreferenceController.java b/src/com/android/settings/fuelgauge/batterysaver/AutoBatterySeekBarPreferenceController.java
index 1cc72a7..05b3503 100644
--- a/src/com/android/settings/fuelgauge/batterysaver/AutoBatterySeekBarPreferenceController.java
+++ b/src/com/android/settings/fuelgauge/batterysaver/AutoBatterySeekBarPreferenceController.java
@@ -42,12 +42,15 @@
LifecycleObserver, OnStart, OnStop, SeekBarPreference.OnPreferenceChangeListener {
@VisibleForTesting
static final String KEY_AUTO_BATTERY_SEEK_BAR = "battery_saver_seek_bar";
+ private final int mDefWarnLevel;
private SeekBarPreference mPreference;
private AutoBatterySaverSettingObserver mContentObserver;
public AutoBatterySeekBarPreferenceController(Context context, Lifecycle lifecycle) {
super(context, KEY_AUTO_BATTERY_SEEK_BAR);
mContentObserver = new AutoBatterySaverSettingObserver(new Handler(Looper.getMainLooper()));
+ mDefWarnLevel = mContext.getResources().getInteger(
+ com.android.internal.R.integer.config_lowBatteryWarningLevel);
if (lifecycle != null) {
lifecycle.addObserver(this);
}
@@ -94,7 +97,7 @@
void updatePreference(Preference preference) {
final ContentResolver contentResolver = mContext.getContentResolver();
final int level = Settings.Global.getInt(contentResolver,
- Settings.Global.LOW_POWER_MODE_TRIGGER_LEVEL, 0);
+ Settings.Global.LOW_POWER_MODE_TRIGGER_LEVEL, mDefWarnLevel);
if (level == 0) {
preference.setVisible(false);
} else {
diff --git a/src/com/android/settings/fuelgauge/batterysaver/BatterySaverSettings.java b/src/com/android/settings/fuelgauge/batterysaver/BatterySaverSettings.java
index 2340675..8009e95 100644
--- a/src/com/android/settings/fuelgauge/batterysaver/BatterySaverSettings.java
+++ b/src/com/android/settings/fuelgauge/batterysaver/BatterySaverSettings.java
@@ -18,14 +18,9 @@
import android.content.Context;
import android.os.Bundle;
-import android.os.PowerManager;
import android.provider.SearchIndexableResource;
-import android.provider.Settings.Global;
-import android.support.annotation.VisibleForTesting;
-import android.util.Log;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
-import com.android.internal.util.ArrayUtils;
import com.android.settings.R;
import com.android.settings.dashboard.DashboardFragment;
import com.android.settings.search.BaseSearchIndexProvider;
@@ -64,7 +59,7 @@
}
@Override
- protected List<AbstractPreferenceController> getPreferenceControllers(Context context) {
+ protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
return buildPreferenceControllers(context, getLifecycle());
}
@@ -96,7 +91,8 @@
}
@Override
- public List<AbstractPreferenceController> getPreferenceControllers(Context context) {
+ public List<AbstractPreferenceController> createPreferenceControllers(
+ Context context) {
return buildPreferenceControllers(context, null);
}
};
diff --git a/src/com/android/settings/fuelgauge/batterytip/AnomalyCleanupJobService.java b/src/com/android/settings/fuelgauge/batterytip/AnomalyCleanupJobService.java
new file mode 100644
index 0000000..17aba2b
--- /dev/null
+++ b/src/com/android/settings/fuelgauge/batterytip/AnomalyCleanupJobService.java
@@ -0,0 +1,75 @@
+/*
+ * 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.fuelgauge.batterytip;
+
+import android.app.job.JobInfo;
+import android.app.job.JobParameters;
+import android.app.job.JobScheduler;
+import android.app.job.JobService;
+import android.content.ComponentName;
+import android.content.Context;
+import android.support.annotation.VisibleForTesting;
+import android.util.Log;
+
+import com.android.settings.R;
+import com.android.settingslib.utils.ThreadUtils;
+
+import java.util.concurrent.TimeUnit;
+
+/** A JobService to clean up obsolete data in anomaly database */
+public class AnomalyCleanupJobService extends JobService {
+ private static final String TAG = "AnomalyCleanUpJobService";
+
+ @VisibleForTesting
+ static final long CLEAN_UP_FREQUENCY_MS = TimeUnit.DAYS.toMillis(1);
+
+ public static void scheduleCleanUp(Context context) {
+ final JobScheduler jobScheduler = context.getSystemService(JobScheduler.class);
+
+ final ComponentName component = new ComponentName(context, AnomalyCleanupJobService.class);
+ final JobInfo.Builder jobBuilder =
+ new JobInfo.Builder(R.id.job_anomaly_clean_up, component)
+ .setPeriodic(CLEAN_UP_FREQUENCY_MS)
+ .setRequiresDeviceIdle(true)
+ .setRequiresCharging(true)
+ .setPersisted(true);
+
+ if (jobScheduler.schedule(jobBuilder.build()) != JobScheduler.RESULT_SUCCESS) {
+ Log.i(TAG, "Anomaly clean up job service schedule failed.");
+ }
+ }
+
+ @Override
+ public boolean onStartJob(JobParameters params) {
+ final BatteryDatabaseManager batteryDatabaseManager = BatteryDatabaseManager
+ .getInstance(this);
+ final BatteryTipPolicy policy = new BatteryTipPolicy(this);
+ ThreadUtils.postOnBackgroundThread(() -> {
+ batteryDatabaseManager.deleteAllAnomaliesBeforeTimeStamp(
+ System.currentTimeMillis() - TimeUnit.HOURS.toMillis(
+ policy.dataHistoryRetainDay));
+ jobFinished(params, false /* wantsReschedule */);
+ });
+
+ return true;
+ }
+
+ @Override
+ public boolean onStopJob(JobParameters jobParameters) {
+ return false;
+ }
+}
diff --git a/src/com/android/settings/fuelgauge/batterytip/AnomalyConfigReceiver.java b/src/com/android/settings/fuelgauge/batterytip/AnomalyConfigReceiver.java
new file mode 100644
index 0000000..d81dc34
--- /dev/null
+++ b/src/com/android/settings/fuelgauge/batterytip/AnomalyConfigReceiver.java
@@ -0,0 +1,98 @@
+/*
+ * 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.fuelgauge.batterytip;
+
+import android.app.PendingIntent;
+import android.app.StatsManager;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.SharedPreferences;
+import android.provider.Settings;
+import android.util.Base64;
+import android.util.Log;
+
+import com.android.internal.annotations.VisibleForTesting;
+
+/**
+ * Receive broadcast when {@link StatsManager} restart, then check the anomaly config and
+ * prepare info for {@link StatsManager}
+ */
+public class AnomalyConfigReceiver extends BroadcastReceiver {
+ private static final String TAG = "AnomalyConfigReceiver";
+ private static final int REQUEST_CODE = 0;
+ private static final String PREF_DB = "anomaly_pref";
+ private static final String KEY_ANOMALY_CONFIG_VERSION = "anomaly_config_version";
+ private static final int DEFAULT_VERSION = 0;
+
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ if (StatsManager.ACTION_STATSD_STARTED.equals(intent.getAction())
+ || Intent.ACTION_BOOT_COMPLETED.equals(intent.getAction())) {
+ final StatsManager statsManager = context.getSystemService(StatsManager.class);
+
+ // Check whether to update the config
+ checkAnomalyConfig(context, statsManager);
+
+ // Upload PendingIntent to StatsManager
+ final Intent extraIntent = new Intent(context, AnomalyDetectionReceiver.class);
+ final PendingIntent pendingIntent = PendingIntent.getBroadcast(context, REQUEST_CODE,
+ extraIntent, PendingIntent.FLAG_UPDATE_CURRENT);
+
+ uploadPendingIntent(statsManager, pendingIntent);
+
+ if (Intent.ACTION_BOOT_COMPLETED.equals(intent.getAction())) {
+ AnomalyCleanupJobService.scheduleCleanUp(context);
+ }
+ }
+ }
+
+ @VisibleForTesting
+ void uploadPendingIntent(StatsManager statsManager, PendingIntent pendingIntent) {
+ Log.i(TAG, "Upload PendingIntent to StatsManager. configKey: "
+ + StatsManagerConfig.ANOMALY_CONFIG_KEY + " subId: "
+ + StatsManagerConfig.SUBSCRIBER_ID);
+ statsManager.setBroadcastSubscriber(StatsManagerConfig.ANOMALY_CONFIG_KEY,
+ StatsManagerConfig.SUBSCRIBER_ID, pendingIntent);
+ }
+
+ private void checkAnomalyConfig(Context context, StatsManager statsManager) {
+ final SharedPreferences sharedPreferences = context.getSharedPreferences(PREF_DB,
+ Context.MODE_PRIVATE);
+ final int currentVersion = sharedPreferences.getInt(KEY_ANOMALY_CONFIG_VERSION,
+ DEFAULT_VERSION);
+ final int newVersion = Settings.Global.getInt(context.getContentResolver(),
+ Settings.Global.ANOMALY_CONFIG_VERSION, DEFAULT_VERSION);
+ Log.i(TAG, "CurrentVersion: " + currentVersion + " new version: " + newVersion);
+
+ if (newVersion > currentVersion) {
+ final byte[] config = Base64.decode(
+ Settings.Global.getString(context.getContentResolver(),
+ Settings.Global.ANOMALY_CONFIG), Base64.DEFAULT);
+ if (statsManager.addConfiguration(StatsManagerConfig.ANOMALY_CONFIG_KEY, config)) {
+ Log.i(TAG, "Upload the anomaly config. configKey: "
+ + StatsManagerConfig.ANOMALY_CONFIG_KEY);
+ SharedPreferences.Editor editor = sharedPreferences.edit();
+ editor.putInt(KEY_ANOMALY_CONFIG_VERSION, newVersion);
+ editor.apply();
+ } else {
+ Log.i(TAG, "Upload the anomaly config failed. configKey: "
+ + StatsManagerConfig.ANOMALY_CONFIG_KEY);
+ }
+ }
+ }
+}
diff --git a/src/com/android/settings/fuelgauge/batterytip/AnomalyDetectionJobService.java b/src/com/android/settings/fuelgauge/batterytip/AnomalyDetectionJobService.java
new file mode 100644
index 0000000..9d4f86f
--- /dev/null
+++ b/src/com/android/settings/fuelgauge/batterytip/AnomalyDetectionJobService.java
@@ -0,0 +1,177 @@
+/*
+ * 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.fuelgauge.batterytip;
+
+import static android.os.StatsDimensionsValue.INT_VALUE_TYPE;
+import static android.os.StatsDimensionsValue.TUPLE_VALUE_TYPE;
+
+import android.app.AppOpsManager;
+import android.app.StatsManager;
+import android.app.job.JobInfo;
+import android.app.job.JobParameters;
+import android.app.job.JobScheduler;
+import android.app.job.JobService;
+import android.app.job.JobWorkItem;
+import android.content.ComponentName;
+import android.content.ContentResolver;
+import android.content.Context;
+import android.content.Intent;
+import android.os.Bundle;
+import android.os.StatsDimensionsValue;
+import android.os.SystemPropertiesProto;
+import android.os.UserManager;
+import android.provider.Settings;
+import android.support.annotation.VisibleForTesting;
+import android.util.Log;
+
+import com.android.internal.os.BatteryStatsHelper;
+import com.android.settings.R;
+import com.android.settings.fuelgauge.BatteryUtils;
+import com.android.settingslib.utils.ThreadUtils;
+
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+
+/** A JobService to store anomaly data to anomaly database */
+public class AnomalyDetectionJobService extends JobService {
+ private static final String TAG = "AnomalyDetectionService";
+ private static final int UID_NULL = 0;
+ private static final int STATSD_UID_FILED = 1;
+ private static final int ON = 1;
+
+ @VisibleForTesting
+ static final long MAX_DELAY_MS = TimeUnit.MINUTES.toMillis(30);
+
+ public static void scheduleAnomalyDetection(Context context, Intent intent) {
+ final JobScheduler jobScheduler = context.getSystemService(JobScheduler.class);
+ final ComponentName component = new ComponentName(context,
+ AnomalyDetectionJobService.class);
+ final JobInfo.Builder jobBuilder =
+ new JobInfo.Builder(R.id.job_anomaly_detection, component)
+ .setOverrideDeadline(MAX_DELAY_MS);
+
+ if (jobScheduler.enqueue(jobBuilder.build(), new JobWorkItem(intent))
+ != JobScheduler.RESULT_SUCCESS) {
+ Log.i(TAG, "Anomaly detection job service enqueue failed.");
+ }
+ }
+
+ @Override
+ public boolean onStartJob(JobParameters params) {
+ ThreadUtils.postOnBackgroundThread(() -> {
+ final BatteryDatabaseManager batteryDatabaseManager =
+ BatteryDatabaseManager.getInstance(this);
+ final BatteryTipPolicy policy = new BatteryTipPolicy(this);
+ final BatteryUtils batteryUtils = BatteryUtils.getInstance(this);
+ final ContentResolver contentResolver = getContentResolver();
+ final BatteryStatsHelper batteryStatsHelper = new BatteryStatsHelper(this,
+ true /* collectBatteryBroadcast */);
+ final UserManager userManager = getSystemService(UserManager.class);
+
+ for (JobWorkItem item = params.dequeueWork(); item != null;
+ item = params.dequeueWork()) {
+ saveAnomalyToDatabase(batteryStatsHelper, userManager, batteryDatabaseManager,
+ batteryUtils, policy, contentResolver,
+ item.getIntent().getExtras());
+ }
+ jobFinished(params, false /* wantsReschedule */);
+ });
+
+ return true;
+ }
+
+ @Override
+ public boolean onStopJob(JobParameters jobParameters) {
+ return false;
+ }
+
+ @VisibleForTesting
+ void saveAnomalyToDatabase(BatteryStatsHelper batteryStatsHelper, UserManager userManager,
+ BatteryDatabaseManager databaseManager, BatteryUtils batteryUtils,
+ BatteryTipPolicy policy, ContentResolver contentResolver, Bundle bundle) {
+ // The Example of intentDimsValue is: 35:{1:{1:{1:10013|}|}|}
+ final StatsDimensionsValue intentDimsValue =
+ bundle.getParcelable(StatsManager.EXTRA_STATS_DIMENSIONS_VALUE);
+ final long subscriptionId = bundle.getLong(StatsManager.EXTRA_STATS_SUBSCRIPTION_ID,
+ -1);
+ final long timeMs = bundle.getLong(AnomalyDetectionReceiver.KEY_ANOMALY_TIMESTAMP,
+ System.currentTimeMillis());
+ Log.i(TAG, "Extra stats value: " + intentDimsValue.toString());
+
+ try {
+ final int uid = extractUidFromStatsDimensionsValue(intentDimsValue);
+ final int anomalyType = StatsManagerConfig.getAnomalyTypeFromSubscriptionId(
+ subscriptionId);
+ final boolean smartBatteryOn = Settings.Global.getInt(contentResolver,
+ Settings.Global.APP_STANDBY_ENABLED, ON) == ON;
+ final String packageName = batteryUtils.getPackageName(uid);
+
+ if (anomalyType == StatsManagerConfig.AnomalyType.EXCESSIVE_BG) {
+ // TODO(b/72385333): check battery percentage draining in batterystats
+ if (batteryUtils.isLegacyApp(packageName) && batteryUtils.isAppHeavilyUsed(
+ batteryStatsHelper, userManager, uid,
+ policy.excessiveBgDrainPercentage)) {
+ Log.e(TAG, "Excessive detected uid=" + uid);
+ batteryUtils.setForceAppStandby(uid, packageName,
+ AppOpsManager.MODE_IGNORED);
+ databaseManager.insertAnomaly(packageName, anomalyType,
+ smartBatteryOn
+ ? AnomalyDatabaseHelper.State.AUTO_HANDLED
+ : AnomalyDatabaseHelper.State.NEW,
+ timeMs);
+ }
+ } else {
+ databaseManager.insertAnomaly(packageName, anomalyType,
+ AnomalyDatabaseHelper.State.NEW, timeMs);
+ }
+ } catch (NullPointerException | IndexOutOfBoundsException e) {
+ Log.e(TAG, "Parse stats dimensions value error.", e);
+ }
+ }
+
+ /**
+ * Extract the uid from {@link StatsDimensionsValue}
+ *
+ * The uid dimension has the format: 1:<int> inside the tuple list. Here are some examples:
+ * 1. Excessive bg anomaly: 27:{1:10089|}
+ * 2. Wakeup alarm anomaly: 35:{1:{1:{1:10013|}|}|}
+ * 3. Bluetooth anomaly: 3:{1:{1:{1:10140|}|}|}
+ */
+ @VisibleForTesting
+ final int extractUidFromStatsDimensionsValue(StatsDimensionsValue statsDimensionsValue) {
+ //TODO(b/73172999): Add robo test for this method
+ if (statsDimensionsValue == null) {
+ return UID_NULL;
+ }
+ if (statsDimensionsValue.isValueType(INT_VALUE_TYPE)
+ && statsDimensionsValue.getField() == STATSD_UID_FILED) {
+ // Find out the real uid
+ return statsDimensionsValue.getIntValue();
+ }
+ if (statsDimensionsValue.isValueType(TUPLE_VALUE_TYPE)) {
+ final List<StatsDimensionsValue> values = statsDimensionsValue.getTupleValueList();
+ for (int i = 0, size = values.size(); i < size; i++) {
+ int uid = extractUidFromStatsDimensionsValue(values.get(i));
+ if (uid != UID_NULL) {
+ return uid;
+ }
+ }
+ }
+
+ return UID_NULL;
+ }
+}
diff --git a/src/com/android/settings/fuelgauge/batterytip/AnomalyDetectionReceiver.java b/src/com/android/settings/fuelgauge/batterytip/AnomalyDetectionReceiver.java
new file mode 100644
index 0000000..4f21e11
--- /dev/null
+++ b/src/com/android/settings/fuelgauge/batterytip/AnomalyDetectionReceiver.java
@@ -0,0 +1,48 @@
+/*
+ * 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.fuelgauge.batterytip;
+
+import android.app.StatsManager;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.os.Bundle;
+import android.util.Log;
+
+/**
+ * Receive the anomaly info from {@link StatsManager}
+ */
+public class AnomalyDetectionReceiver extends BroadcastReceiver {
+ private static final String TAG = "SettingsAnomalyReceiver";
+
+ public static final String KEY_ANOMALY_TIMESTAMP = "key_anomaly_timestamp";
+
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ final long configUid = intent.getLongExtra(StatsManager.EXTRA_STATS_CONFIG_UID, -1);
+ final long configKey = intent.getLongExtra(StatsManager.EXTRA_STATS_CONFIG_KEY, -1);
+ final long subscriptionId = intent.getLongExtra(StatsManager.EXTRA_STATS_SUBSCRIPTION_ID,
+ -1);
+ Log.i(TAG, "Anomaly intent received. configUid = " + configUid + " configKey = "
+ + configKey + " subscriptionId = " + subscriptionId);
+
+ final Bundle bundle = intent.getExtras();
+ bundle.putLong(KEY_ANOMALY_TIMESTAMP, System.currentTimeMillis());
+
+ AnomalyDetectionJobService.scheduleAnomalyDetection(context, intent);
+ }
+}
diff --git a/src/com/android/settings/fuelgauge/batterytip/BatteryDatabaseManager.java b/src/com/android/settings/fuelgauge/batterytip/BatteryDatabaseManager.java
index 87c2488..935d493 100644
--- a/src/com/android/settings/fuelgauge/batterytip/BatteryDatabaseManager.java
+++ b/src/com/android/settings/fuelgauge/batterytip/BatteryDatabaseManager.java
@@ -60,18 +60,19 @@
/**
* Insert an anomaly log to database.
- *
- * @param packageName the package name of the app
- * @param type the type of the anomaly
- * @param timestampMs the time when it is happened
+ * @param packageName the package name of the app
+ * @param type the type of the anomaly
+ * @param anomalyState the state of the anomaly
+ * @param timestampMs the time when it is happened
*/
- public synchronized void insertAnomaly(String packageName, int type, long timestampMs) {
+ public synchronized void insertAnomaly(String packageName, int type, int anomalyState,
+ long timestampMs) {
try (SQLiteDatabase db = mDatabaseHelper.getWritableDatabase()) {
ContentValues values = new ContentValues();
values.put(PACKAGE_NAME, packageName);
values.put(ANOMALY_TYPE, type);
+ values.put(ANOMALY_STATE, anomalyState);
values.put(TIME_STAMP_MS, timestampMs);
- values.put(ANOMALY_STATE, AnomalyDatabaseHelper.State.NEW);
db.insert(TABLE_ANOMALY, null, values);
}
}
diff --git a/src/com/android/settings/fuelgauge/batterytip/BatteryTipDialogFragment.java b/src/com/android/settings/fuelgauge/batterytip/BatteryTipDialogFragment.java
index d93b589..9e172de 100644
--- a/src/com/android/settings/fuelgauge/batterytip/BatteryTipDialogFragment.java
+++ b/src/com/android/settings/fuelgauge/batterytip/BatteryTipDialogFragment.java
@@ -26,9 +26,11 @@
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
+import com.android.internal.logging.nano.MetricsProto;
import com.android.settings.R;
import com.android.settings.SettingsActivity;
import com.android.settings.Utils;
+import com.android.settings.core.InstrumentedPreferenceFragment;
import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
import com.android.settings.fuelgauge.batterytip.BatteryTipPreferenceController.BatteryTipListener;
import com.android.settings.fuelgauge.batterytip.actions.BatteryTipAction;
@@ -130,8 +132,7 @@
@Override
public int getMetricsCategory() {
- //TODO(b/70570352): add correct metric id
- return 0;
+ return MetricsProto.MetricsEvent.FUELGAUGE_BATTERY_TIP_DIALOG;
}
@Override
@@ -141,7 +142,8 @@
return;
}
final BatteryTipAction action = BatteryTipUtils.getActionForBatteryTip(mBatteryTip,
- (SettingsActivity) getActivity(), this);
+ (SettingsActivity) getActivity(),
+ (InstrumentedPreferenceFragment) getTargetFragment());
if (action != null) {
action.handlePositiveAction();
}
diff --git a/src/com/android/settings/fuelgauge/batterytip/BatteryTipPolicy.java b/src/com/android/settings/fuelgauge/batterytip/BatteryTipPolicy.java
index a580db1..17284a0 100644
--- a/src/com/android/settings/fuelgauge/batterytip/BatteryTipPolicy.java
+++ b/src/com/android/settings/fuelgauge/batterytip/BatteryTipPolicy.java
@@ -19,11 +19,11 @@
import android.content.Context;
import android.provider.Settings;
import android.support.annotation.VisibleForTesting;
-import android.text.format.DateUtils;
import android.util.KeyValueListParser;
import android.util.Log;
import java.time.Duration;
+import java.util.concurrent.TimeUnit;
/**
* Class to store the policy for battery tips, which comes from
@@ -44,6 +44,8 @@
private static final String KEY_REDUCED_BATTERY_PERCENT = "reduced_battery_percent";
private static final String KEY_LOW_BATTERY_ENABLED = "low_battery_enabled";
private static final String KEY_LOW_BATTERY_HOUR = "low_battery_hour";
+ private static final String KEY_DATA_HISTORY_RETAIN_DAY = "data_history_retain_day";
+ private static final String KEY_EXCESSIVE_BG_DRAIN_PERCENTAGE = "excessive_bg_drain_percentage";
/**
* {@code true} if general battery tip is enabled
@@ -143,6 +145,25 @@
*/
public final int lowBatteryHour;
+ /**
+ * TTL day for anomaly data stored in database
+ *
+ * @see Settings.Global#BATTERY_TIP_CONSTANTS
+ * @see #KEY_DATA_HISTORY_RETAIN_DAY
+ */
+ public final int dataHistoryRetainDay;
+
+ /**
+ * Battery drain percentage threshold for excessive background anomaly(i.e. 10%)
+ *
+ * This is an additional check for excessive background, to check whether battery drain
+ * for an app is larger than x%
+ *
+ * @see Settings.Global#BATTERY_TIP_CONSTANTS
+ * @see #KEY_EXCESSIVE_BG_DRAIN_PERCENTAGE
+ */
+ public final int excessiveBgDrainPercentage;
+
private final KeyValueListParser mParser;
public BatteryTipPolicy(Context context) {
@@ -174,6 +195,8 @@
reducedBatteryPercent = mParser.getInt(KEY_REDUCED_BATTERY_PERCENT, 50);
lowBatteryEnabled = mParser.getBoolean(KEY_LOW_BATTERY_ENABLED, false);
lowBatteryHour = mParser.getInt(KEY_LOW_BATTERY_HOUR, 16);
+ dataHistoryRetainDay = mParser.getInt(KEY_DATA_HISTORY_RETAIN_DAY, 30);
+ excessiveBgDrainPercentage = mParser.getInt(KEY_EXCESSIVE_BG_DRAIN_PERCENTAGE, 10);
}
}
diff --git a/src/com/android/settings/fuelgauge/batterytip/BatteryTipPreferenceController.java b/src/com/android/settings/fuelgauge/batterytip/BatteryTipPreferenceController.java
index 9ab4c51..2702bb6 100644
--- a/src/com/android/settings/fuelgauge/batterytip/BatteryTipPreferenceController.java
+++ b/src/com/android/settings/fuelgauge/batterytip/BatteryTipPreferenceController.java
@@ -23,11 +23,15 @@
import android.support.v7.preference.PreferenceGroup;
import android.support.v7.preference.PreferenceScreen;
+import com.android.internal.logging.nano.MetricsProto;
import com.android.settings.SettingsActivity;
import com.android.settings.core.BasePreferenceController;
+import com.android.settings.core.InstrumentedPreferenceFragment;
import com.android.settings.fuelgauge.batterytip.actions.BatteryTipAction;
import com.android.settings.fuelgauge.batterytip.tips.BatteryTip;
import com.android.settings.fuelgauge.batterytip.tips.SummaryTip;
+import com.android.settings.overlay.FeatureFactory;
+import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
import java.util.HashMap;
import java.util.List;
@@ -44,24 +48,26 @@
private List<BatteryTip> mBatteryTips;
private Map<String, BatteryTip> mBatteryTipMap;
private SettingsActivity mSettingsActivity;
+ private MetricsFeatureProvider mMetricsFeatureProvider;
@VisibleForTesting
PreferenceGroup mPreferenceGroup;
@VisibleForTesting
Context mPrefContext;
- PreferenceFragment mFragment;
+ InstrumentedPreferenceFragment mFragment;
public BatteryTipPreferenceController(Context context, String preferenceKey) {
this(context, preferenceKey, null, null, null);
}
public BatteryTipPreferenceController(Context context, String preferenceKey,
- SettingsActivity settingsActivity, PreferenceFragment fragment,
+ SettingsActivity settingsActivity, InstrumentedPreferenceFragment fragment,
BatteryTipListener batteryTipListener) {
super(context, preferenceKey);
mBatteryTipListener = batteryTipListener;
mBatteryTipMap = new HashMap<>();
mFragment = fragment;
mSettingsActivity = settingsActivity;
+ mMetricsFeatureProvider = FeatureFactory.getFactory(context).getMetricsFeatureProvider();
}
@Override
@@ -98,6 +104,9 @@
final Preference preference = batteryTip.buildPreference(mPrefContext);
mBatteryTipMap.put(preference.getKey(), batteryTip);
mPreferenceGroup.addPreference(preference);
+ mMetricsFeatureProvider.action(mContext,
+ MetricsProto.MetricsEvent.ACTION_BATTERY_TIP_SHOWN,
+ batteryTip.getType());
break;
}
}
diff --git a/src/com/android/settings/fuelgauge/batterytip/BatteryTipUtils.java b/src/com/android/settings/fuelgauge/batterytip/BatteryTipUtils.java
index 5eec322..5c0147a 100644
--- a/src/com/android/settings/fuelgauge/batterytip/BatteryTipUtils.java
+++ b/src/com/android/settings/fuelgauge/batterytip/BatteryTipUtils.java
@@ -17,11 +17,12 @@
package com.android.settings.fuelgauge.batterytip;
import android.app.Fragment;
-import android.content.Context;
import com.android.settings.SettingsActivity;
+import com.android.settings.core.InstrumentedPreferenceFragment;
import com.android.settings.fuelgauge.batterytip.actions.BatterySaverAction;
import com.android.settings.fuelgauge.batterytip.actions.BatteryTipAction;
+import com.android.settings.fuelgauge.batterytip.actions.OpenRestrictAppFragmentAction;
import com.android.settings.fuelgauge.batterytip.actions.RestrictAppAction;
import com.android.settings.fuelgauge.batterytip.actions.SmartBatteryAction;
import com.android.settings.fuelgauge.batterytip.actions.UnrestrictAppAction;
@@ -42,14 +43,19 @@
* @return an action for {@code batteryTip}
*/
public static BatteryTipAction getActionForBatteryTip(BatteryTip batteryTip,
- SettingsActivity settingsActivity, Fragment fragment) {
+ SettingsActivity settingsActivity, InstrumentedPreferenceFragment fragment) {
switch (batteryTip.getType()) {
case BatteryTip.TipType.SMART_BATTERY_MANAGER:
return new SmartBatteryAction(settingsActivity, fragment);
case BatteryTip.TipType.BATTERY_SAVER:
return new BatterySaverAction(settingsActivity);
case BatteryTip.TipType.APP_RESTRICTION:
- return new RestrictAppAction(settingsActivity, (RestrictAppTip) batteryTip);
+ if (batteryTip.getState() == BatteryTip.StateType.HANDLED) {
+ return new OpenRestrictAppFragmentAction(settingsActivity, fragment,
+ (RestrictAppTip) batteryTip);
+ } else {
+ return new RestrictAppAction(settingsActivity, (RestrictAppTip) batteryTip);
+ }
case BatteryTip.TipType.REMOVE_APP_RESTRICTION:
return new UnrestrictAppAction(settingsActivity, (UnrestrictAppTip) batteryTip);
default:
diff --git a/src/com/android/settings/fuelgauge/batterytip/HighUsageDataParser.java b/src/com/android/settings/fuelgauge/batterytip/HighUsageDataParser.java
index cc5aed6..d5710c2 100644
--- a/src/com/android/settings/fuelgauge/batterytip/HighUsageDataParser.java
+++ b/src/com/android/settings/fuelgauge/batterytip/HighUsageDataParser.java
@@ -51,7 +51,7 @@
@Override
public void onDataPoint(long time, BatteryStats.HistoryItem record) {
- if (record.currentTime <= mEndTimeMs - mTimePeriodMs) {
+ if (time == 0 || record.currentTime <= mEndTimeMs - mTimePeriodMs) {
// Since onDataPoint is invoked sorted by time, so we could use this way to get the
// closet battery level 'mTimePeriodMs' time ago.
mLastPeriodBatteryLevel = record.batteryLevel;
diff --git a/src/com/android/settings/fuelgauge/batterytip/StatsManagerConfig.java b/src/com/android/settings/fuelgauge/batterytip/StatsManagerConfig.java
new file mode 100644
index 0000000..62eb7ee
--- /dev/null
+++ b/src/com/android/settings/fuelgauge/batterytip/StatsManagerConfig.java
@@ -0,0 +1,81 @@
+/*
+ * 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.fuelgauge.batterytip;
+
+import android.support.annotation.IntDef;
+
+import com.google.common.hash.HashFunction;
+import com.google.common.hash.Hashing;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * This class provides all the configs needed if we want to use {@link android.app.StatsManager}
+ */
+public class StatsManagerConfig {
+ /**
+ * The key that represents the anomaly config.
+ * This value is used in {@link android.app.StatsManager#addConfiguration(long, byte[])}
+ */
+ public static final long ANOMALY_CONFIG_KEY = 1;
+
+ /**
+ * The key that represents subscriber, which is settings app.
+ */
+ public static final long SUBSCRIBER_ID = 1;
+
+ private static final Map<Long, Integer> ANOMALY_TYPE;
+
+ private static final HashFunction HASH_FUNCTION = Hashing.sha256();
+
+ static {
+ ANOMALY_TYPE = new HashMap<>();
+ ANOMALY_TYPE.put(hash("SUBSCRIPTION:SETTINGS_EXCESSIVE_BACKGROUND_SERVICE"),
+ AnomalyType.EXCESSIVE_BG);
+ ANOMALY_TYPE.put(hash("SUBSCRIPTION:SETTINGS_LONG_UNOPTIMIZED_BLE_SCAN"),
+ AnomalyType.BLUETOOTH_SCAN);
+ ANOMALY_TYPE.put(hash("SUBSCRIPTION:SETTINGS_EXCESSIVE_WAKEUPS_IN_BACKGROUND"),
+ AnomalyType.WAKEUP_ALARM);
+ ANOMALY_TYPE.put(hash("SUBSCRIPTION:SETTINGS_EXCESSIVE_WAKELOCK_ALL_SCREEN_OFF"),
+ AnomalyType.WAKE_LOCK);
+ }
+
+ @Retention(RetentionPolicy.SOURCE)
+ @IntDef({AnomalyType.NULL,
+ AnomalyType.WAKE_LOCK,
+ AnomalyType.WAKEUP_ALARM,
+ AnomalyType.BLUETOOTH_SCAN,
+ AnomalyType.EXCESSIVE_BG})
+ public @interface AnomalyType {
+ int NULL = -1;
+ int WAKE_LOCK = 0;
+ int WAKEUP_ALARM = 1;
+ int BLUETOOTH_SCAN = 2;
+ int EXCESSIVE_BG = 3;
+ }
+
+ public static int getAnomalyTypeFromSubscriptionId(long subscriptionId) {
+ return ANOMALY_TYPE.getOrDefault(subscriptionId, AnomalyType.NULL);
+ }
+
+ private static long hash(CharSequence value) {
+ return HASH_FUNCTION.hashUnencodedChars(value).asLong();
+ }
+}
diff --git a/src/com/android/settings/fuelgauge/batterytip/actions/OpenRestrictAppFragmentAction.java b/src/com/android/settings/fuelgauge/batterytip/actions/OpenRestrictAppFragmentAction.java
new file mode 100644
index 0000000..77bf861
--- /dev/null
+++ b/src/com/android/settings/fuelgauge/batterytip/actions/OpenRestrictAppFragmentAction.java
@@ -0,0 +1,57 @@
+/*
+ * 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.fuelgauge.batterytip.actions;
+
+import android.app.Fragment;
+
+import com.android.settings.SettingsActivity;
+import com.android.settings.core.InstrumentedPreferenceFragment;
+import com.android.settings.fuelgauge.BatteryUtils;
+import com.android.settings.fuelgauge.RestrictedAppDetails;
+import com.android.settings.fuelgauge.batterytip.AppInfo;
+import com.android.settings.fuelgauge.batterytip.tips.RestrictAppTip;
+
+import java.util.List;
+
+/**
+ * Action to open the {@link com.android.settings.fuelgauge.RestrictedAppDetails}
+ */
+public class OpenRestrictAppFragmentAction extends BatteryTipAction {
+ private final RestrictAppTip mRestrictAppTip;
+ private final BatteryUtils mBatteryUtils;
+ private final SettingsActivity mSettingsActivity;
+ private final InstrumentedPreferenceFragment mFragment;
+
+ public OpenRestrictAppFragmentAction(SettingsActivity settingsActivity,
+ InstrumentedPreferenceFragment fragment, RestrictAppTip tip) {
+ super(fragment.getContext());
+ mSettingsActivity = settingsActivity;
+ mFragment = fragment;
+ mRestrictAppTip = tip;
+ mBatteryUtils = BatteryUtils.getInstance(mContext);
+ }
+
+ /**
+ * Handle the action when user clicks positive button
+ */
+ @Override
+ public void handlePositiveAction() {
+ final List<AppInfo> mAppInfos = mRestrictAppTip.getRestrictAppList();
+ RestrictedAppDetails.startRestrictedAppDetails(mSettingsActivity, mFragment,
+ mAppInfos);
+ }
+}
diff --git a/src/com/android/settings/fuelgauge/batterytip/tips/EarlyWarningTip.java b/src/com/android/settings/fuelgauge/batterytip/tips/EarlyWarningTip.java
index f8d8fa1..7b8f624 100644
--- a/src/com/android/settings/fuelgauge/batterytip/tips/EarlyWarningTip.java
+++ b/src/com/android/settings/fuelgauge/batterytip/tips/EarlyWarningTip.java
@@ -62,13 +62,17 @@
@Override
public void updateState(BatteryTip tip) {
- final EarlyWarningTip earlyHeadsUpTip = (EarlyWarningTip) tip;
- if (mPowerSaveModeOn != earlyHeadsUpTip.mPowerSaveModeOn) {
- mPowerSaveModeOn = earlyHeadsUpTip.mPowerSaveModeOn;
- mState = earlyHeadsUpTip.mPowerSaveModeOn ? StateType.HANDLED : StateType.NEW;
- } else if (mState != StateType.HANDLED) {
- mState = earlyHeadsUpTip.getState();
+ final EarlyWarningTip earlyWarningTip = (EarlyWarningTip) tip;
+ if (earlyWarningTip.mState == StateType.NEW) {
+ // Display it if there is early warning
+ mState = StateType.NEW;
+ } else if (mState == StateType.NEW && earlyWarningTip.mState == StateType.INVISIBLE) {
+ // If powerSaveMode is really on, show it as handled, otherwise just dismiss it.
+ mState = earlyWarningTip.mPowerSaveModeOn ? StateType.HANDLED : StateType.INVISIBLE;
+ } else {
+ mState = earlyWarningTip.getState();
}
+ mPowerSaveModeOn = earlyWarningTip.mPowerSaveModeOn;
}
@Override
diff --git a/src/com/android/settings/fuelgauge/batterytip/tips/RestrictAppTip.java b/src/com/android/settings/fuelgauge/batterytip/tips/RestrictAppTip.java
index a40f292..4d286be 100644
--- a/src/com/android/settings/fuelgauge/batterytip/tips/RestrictAppTip.java
+++ b/src/com/android/settings/fuelgauge/batterytip/tips/RestrictAppTip.java
@@ -35,12 +35,12 @@
private List<AppInfo> mRestrictAppList;
public RestrictAppTip(@StateType int state, List<AppInfo> restrictApps) {
- super(TipType.APP_RESTRICTION, state, true /* showDialog */);
+ super(TipType.APP_RESTRICTION, state, state == StateType.NEW /* showDialog */);
mRestrictAppList = restrictApps;
}
public RestrictAppTip(@StateType int state, AppInfo appInfo) {
- super(TipType.APP_RESTRICTION, state, true /* showDialog */);
+ super(TipType.APP_RESTRICTION, state, state == StateType.NEW /* showDialog */);
mRestrictAppList = new ArrayList<>();
mRestrictAppList.add(appInfo);
}
@@ -85,9 +85,11 @@
// Display it if new anomaly comes
mState = StateType.NEW;
mRestrictAppList = ((RestrictAppTip) tip).mRestrictAppList;
+ mShowDialog = true;
} else if (mState == StateType.NEW && tip.mState == StateType.INVISIBLE) {
// If anomaly becomes invisible, show it as handled
mState = StateType.HANDLED;
+ mShowDialog = false;
}
}
diff --git a/src/com/android/settings/gestures/AssistGestureSettings.java b/src/com/android/settings/gestures/AssistGestureSettings.java
index 8878f47..84f4ab2 100644
--- a/src/com/android/settings/gestures/AssistGestureSettings.java
+++ b/src/com/android/settings/gestures/AssistGestureSettings.java
@@ -51,7 +51,7 @@
}
@Override
- protected List<AbstractPreferenceController> getPreferenceControllers(Context context) {
+ protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
return buildPreferenceControllers(context, getLifecycle());
}
@@ -75,7 +75,7 @@
}
@Override
- public List<AbstractPreferenceController> getPreferenceControllers(
+ public List<AbstractPreferenceController> createPreferenceControllers(
Context context) {
return buildPreferenceControllers(context, null /* lifecycle */);
}
diff --git a/src/com/android/settings/gestures/DoubleTapPowerSettings.java b/src/com/android/settings/gestures/DoubleTapPowerSettings.java
index 0dca805..6b15923 100644
--- a/src/com/android/settings/gestures/DoubleTapPowerSettings.java
+++ b/src/com/android/settings/gestures/DoubleTapPowerSettings.java
@@ -66,7 +66,7 @@
}
@Override
- protected List<AbstractPreferenceController> getPreferenceControllers(Context context) {
+ protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
return buildPreferenceControllers(context, getLifecycle());
}
@@ -89,7 +89,8 @@
}
@Override
- public List<AbstractPreferenceController> getPreferenceControllers(Context context) {
+ public List<AbstractPreferenceController> createPreferenceControllers(
+ Context context) {
return buildPreferenceControllers(context, null /* lifecycle */);
}
};
diff --git a/src/com/android/settings/gestures/DoubleTapScreenSettings.java b/src/com/android/settings/gestures/DoubleTapScreenSettings.java
index f2148b4..1f0ff03 100644
--- a/src/com/android/settings/gestures/DoubleTapScreenSettings.java
+++ b/src/com/android/settings/gestures/DoubleTapScreenSettings.java
@@ -73,7 +73,7 @@
}
@Override
- protected List<AbstractPreferenceController> getPreferenceControllers(Context context) {
+ protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
return buildPreferenceControllers(context, getLifecycle());
}
@@ -97,7 +97,8 @@
}
@Override
- public List<AbstractPreferenceController> getPreferenceControllers(Context context) {
+ public List<AbstractPreferenceController> createPreferenceControllers(
+ Context context) {
return buildPreferenceControllers(context, null /* lifecycle */);
}
};
diff --git a/src/com/android/settings/gestures/DoubleTwistGestureSettings.java b/src/com/android/settings/gestures/DoubleTwistGestureSettings.java
index ac9de88..69517fe 100644
--- a/src/com/android/settings/gestures/DoubleTwistGestureSettings.java
+++ b/src/com/android/settings/gestures/DoubleTwistGestureSettings.java
@@ -66,7 +66,7 @@
}
@Override
- protected List<AbstractPreferenceController> getPreferenceControllers(Context context) {
+ protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
return buildPreferenceControllers(context, getLifecycle());
}
@@ -88,7 +88,7 @@
}
@Override
- public List<AbstractPreferenceController> getPreferenceControllers(Context context) {
+ public List<AbstractPreferenceController> createPreferenceControllers(Context context) {
return buildPreferenceControllers(context, null /* lifecycle */);
}
};
diff --git a/src/com/android/settings/gestures/GestureSettings.java b/src/com/android/settings/gestures/GestureSettings.java
index 4d38b09..1efac5b 100644
--- a/src/com/android/settings/gestures/GestureSettings.java
+++ b/src/com/android/settings/gestures/GestureSettings.java
@@ -63,7 +63,7 @@
}
@Override
- protected List<AbstractPreferenceController> getPreferenceControllers(Context context) {
+ protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
if (mAmbientDisplayConfig == null) {
mAmbientDisplayConfig = new AmbientDisplayConfiguration(context);
}
@@ -100,7 +100,7 @@
}
@Override
- public List<AbstractPreferenceController> getPreferenceControllers(
+ public List<AbstractPreferenceController> createPreferenceControllers(
Context context) {
return buildPreferenceControllers(context, null,
new AmbientDisplayConfiguration(context));
diff --git a/src/com/android/settings/gestures/GesturesSettingPreferenceController.java b/src/com/android/settings/gestures/GesturesSettingPreferenceController.java
index 8b2fcc0..1df5b90 100644
--- a/src/com/android/settings/gestures/GesturesSettingPreferenceController.java
+++ b/src/com/android/settings/gestures/GesturesSettingPreferenceController.java
@@ -19,7 +19,6 @@
import android.content.ContentResolver;
import android.content.Context;
import android.provider.Settings;
-import android.support.v7.preference.Preference;
import com.android.internal.hardware.AmbientDisplayConfiguration;
import com.android.settings.R;
@@ -56,12 +55,7 @@
}
@Override
- public void updateState(Preference preference) {
- preference.setSummary(getSummary());
- }
-
- @Override
- public String getSummary() {
+ public CharSequence getSummary() {
if (!mFeatureProvider.isSensorAvailable(mContext)) {
return "";
}
@@ -72,13 +66,13 @@
contentResolver, Settings.Secure.ASSIST_GESTURE_SILENCE_ALERTS_ENABLED, 1) != 0;
if (mFeatureProvider.isSupported(mContext) && assistGestureEnabled) {
- return mContext.getString(
+ return mContext.getText(
R.string.language_input_gesture_summary_on_with_assist);
}
if (assistGestureSilenceEnabled) {
- return mContext.getString(
+ return mContext.getText(
R.string.language_input_gesture_summary_on_non_assist);
}
- return mContext.getString(R.string.language_input_gesture_summary_off);
+ return mContext.getText(R.string.language_input_gesture_summary_off);
}
}
\ No newline at end of file
diff --git a/src/com/android/settings/gestures/PickupGestureSettings.java b/src/com/android/settings/gestures/PickupGestureSettings.java
index 1762ba8..78ae9c4 100644
--- a/src/com/android/settings/gestures/PickupGestureSettings.java
+++ b/src/com/android/settings/gestures/PickupGestureSettings.java
@@ -73,7 +73,7 @@
}
@Override
- protected List<AbstractPreferenceController> getPreferenceControllers(Context context) {
+ protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
return buildPreferenceControllers(context, getLifecycle());
}
@@ -96,7 +96,8 @@
}
@Override
- public List<AbstractPreferenceController> getPreferenceControllers(Context context) {
+ public List<AbstractPreferenceController> createPreferenceControllers(
+ Context context) {
return buildPreferenceControllers(context, null /* lifecycle */);
}
};
diff --git a/src/com/android/settings/gestures/SwipeToNotificationSettings.java b/src/com/android/settings/gestures/SwipeToNotificationSettings.java
index c6f346a..9ddf0d4 100644
--- a/src/com/android/settings/gestures/SwipeToNotificationSettings.java
+++ b/src/com/android/settings/gestures/SwipeToNotificationSettings.java
@@ -67,7 +67,7 @@
}
@Override
- protected List<AbstractPreferenceController> getPreferenceControllers(Context context) {
+ protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
return buildPreferenceControllers(context, getLifecycle());
}
@@ -89,7 +89,8 @@
}
@Override
- public List<AbstractPreferenceController> getPreferenceControllers(Context context) {
+ public List<AbstractPreferenceController> createPreferenceControllers(
+ Context context) {
return buildPreferenceControllers(context, null /* lifecycle */);
}
};
diff --git a/src/com/android/settings/language/LanguageAndInputSettings.java b/src/com/android/settings/language/LanguageAndInputSettings.java
index cb60ef5..c69938c 100644
--- a/src/com/android/settings/language/LanguageAndInputSettings.java
+++ b/src/com/android/settings/language/LanguageAndInputSettings.java
@@ -21,7 +21,6 @@
import android.content.ContentResolver;
import android.content.Context;
import android.content.pm.PackageManager;
-import android.os.Bundle;
import android.provider.SearchIndexableResource;
import android.provider.Settings;
import android.speech.tts.TtsEngines;
@@ -88,7 +87,7 @@
}
@Override
- protected List<AbstractPreferenceController> getPreferenceControllers(Context context) {
+ protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
return buildPreferenceControllers(context, getLifecycle());
}
@@ -188,7 +187,7 @@
}
@Override
- public List<AbstractPreferenceController> getPreferenceControllers(
+ public List<AbstractPreferenceController> createPreferenceControllers(
Context context) {
return buildPreferenceControllers(context, null);
}
diff --git a/src/com/android/settings/location/LocationSettings.java b/src/com/android/settings/location/LocationSettings.java
index 510c162..a6feacc 100644
--- a/src/com/android/settings/location/LocationSettings.java
+++ b/src/com/android/settings/location/LocationSettings.java
@@ -67,15 +67,15 @@
private LocationSwitchBarController mSwitchBarController;
@Override
- public void onCreate(Bundle icicle) {
- super.onCreate(icicle);
+ public int getInitialExpandedChildCount() {
final RecentLocationApps recentLocationApps = new RecentLocationApps(getActivity());
- int locationRequestsApps = recentLocationApps.getAppList().size();
- int locationRequestsPrefs = locationRequestsApps == 0 ? 1 : locationRequestsApps;
- getPreferenceScreen().setInitialExpandedChildrenCount(locationRequestsPrefs + 2);
+ final int locationRequestsApps = recentLocationApps.getAppList().size();
+ final int locationRequestsPrefs =
+ locationRequestsApps == 0
+ ? 1 : (locationRequestsApps > 3 ? 4 : locationRequestsApps);
+ return locationRequestsPrefs + 1;
}
-
@Override
public int getMetricsCategory() {
return MetricsEvent.LOCATION;
@@ -102,7 +102,7 @@
}
@Override
- protected List<AbstractPreferenceController> getPreferenceControllers(Context context) {
+ protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
return buildPreferenceControllers(context, this, getLifecycle());
}
@@ -180,7 +180,7 @@
}
@Override
- public List<AbstractPreferenceController> getPreferenceControllers(Context
+ public List<AbstractPreferenceController> createPreferenceControllers(Context
context) {
return buildPreferenceControllers(context, null /* fragment */,
null /* lifecycle */);
diff --git a/src/com/android/settings/location/RecentLocationRequestPreferenceController.java b/src/com/android/settings/location/RecentLocationRequestPreferenceController.java
index 8238a9b..b017ec1 100644
--- a/src/com/android/settings/location/RecentLocationRequestPreferenceController.java
+++ b/src/com/android/settings/location/RecentLocationRequestPreferenceController.java
@@ -20,32 +20,33 @@
import android.support.v7.preference.Preference;
import android.support.v7.preference.PreferenceCategory;
import android.support.v7.preference.PreferenceScreen;
-
import com.android.settings.R;
import com.android.settings.applications.appinfo.AppInfoDashboardFragment;
import com.android.settings.core.SubSettingLauncher;
+import com.android.settings.dashboard.DashboardFragment;
import com.android.settings.widget.AppPreference;
import com.android.settingslib.core.lifecycle.Lifecycle;
import com.android.settingslib.location.RecentLocationApps;
-
-import java.util.ArrayList;
import java.util.List;
public class RecentLocationRequestPreferenceController extends LocationBasePreferenceController {
/** Key for preference category "Recent location requests" */
private static final String KEY_RECENT_LOCATION_REQUESTS = "recent_location_requests";
+ @VisibleForTesting
+ static final String KEY_SEE_ALL = "recent_location_requests_see_all";
private final LocationSettings mFragment;
private final RecentLocationApps mRecentLocationApps;
private PreferenceCategory mCategoryRecentLocationRequests;
+ private Preference mSeeAllButton;
- @VisibleForTesting
+ /** Used in this class and {@link RecentLocationRequestSeeAllPreferenceController}*/
static class PackageEntryClickedListener implements Preference.OnPreferenceClickListener {
- private final LocationSettings mFragment;
+ private final DashboardFragment mFragment;
private final String mPackage;
private final UserHandle mUserHandle;
- public PackageEntryClickedListener(LocationSettings fragment, String packageName,
+ public PackageEntryClickedListener(DashboardFragment fragment, String packageName,
UserHandle userHandle) {
mFragment = fragment;
mPackage = packageName;
@@ -92,24 +93,32 @@
super.displayPreference(screen);
mCategoryRecentLocationRequests =
(PreferenceCategory) screen.findPreference(KEY_RECENT_LOCATION_REQUESTS);
+ mSeeAllButton = screen.findPreference(KEY_SEE_ALL);
+
}
@Override
public void updateState(Preference preference) {
mCategoryRecentLocationRequests.removeAll();
+ mSeeAllButton.setVisible(false);
final Context prefContext = preference.getContext();
final List<RecentLocationApps.Request> recentLocationRequests =
mRecentLocationApps.getAppListSorted();
- final List<Preference> recentLocationPrefs = new ArrayList<>(recentLocationRequests.size());
- for (final RecentLocationApps.Request request : recentLocationRequests) {
- recentLocationPrefs.add(createAppPreference(prefContext, request));
- }
- if (recentLocationRequests.size() > 0) {
+ if (recentLocationRequests.size() > 3) {
+ // Display the top 3 preferences to container in original order.
+ for (int i = 0; i < 3; i ++) {
+ mCategoryRecentLocationRequests.addPreference(
+ createAppPreference(prefContext, recentLocationRequests.get(i)));
+ }
+ // Display a button to list all requests
+ mSeeAllButton.setVisible(true);
+ } else if (recentLocationRequests.size() > 0) {
// Add preferences to container in original order (already sorted by recency).
- for (Preference entry : recentLocationPrefs) {
- mCategoryRecentLocationRequests.addPreference(entry);
+ for (RecentLocationApps.Request request : recentLocationRequests) {
+ mCategoryRecentLocationRequests.addPreference(
+ createAppPreference(prefContext, request));
}
} else {
// If there's no item to display, add a "No recent apps" item.
@@ -132,7 +141,7 @@
@VisibleForTesting
AppPreference createAppPreference(Context prefContext, RecentLocationApps.Request request) {
- final AppPreference pref = createAppPreference(prefContext);
+ final AppPreference pref = createAppPreference(prefContext);
pref.setSummary(request.contentDescription);
pref.setIcon(request.icon);
pref.setTitle(request.label);
diff --git a/src/com/android/settings/location/RecentLocationRequestSeeAllFragment.java b/src/com/android/settings/location/RecentLocationRequestSeeAllFragment.java
new file mode 100644
index 0000000..0b7614c
--- /dev/null
+++ b/src/com/android/settings/location/RecentLocationRequestSeeAllFragment.java
@@ -0,0 +1,89 @@
+/*
+ * Copyright 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.location;
+
+
+import android.content.Context;
+import android.provider.SearchIndexableResource;
+import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
+import com.android.settings.R;
+import com.android.settings.dashboard.DashboardFragment;
+import com.android.settings.search.BaseSearchIndexProvider;
+import com.android.settings.search.Indexable;
+import com.android.settingslib.core.AbstractPreferenceController;
+import com.android.settingslib.core.lifecycle.Lifecycle;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+/** Dashboard Fragment to display all recent location requests, sorted by recency. */
+public class RecentLocationRequestSeeAllFragment extends DashboardFragment {
+
+ private static final String TAG = "RecentLocationReqAll";
+
+ public static final String PATH =
+ "com.android.settings.location.RecentLocationRequestSeeAllFragment";
+
+ @Override
+ public int getMetricsCategory() {
+ return MetricsEvent.RECENT_LOCATION_REQUESTS_ALL;
+ }
+
+ @Override
+ protected int getPreferenceScreenResId() {
+ return R.xml.location_recent_requests_see_all;
+ }
+
+ @Override
+ protected String getLogTag() {
+ return TAG;
+ }
+
+ @Override
+ protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
+ return buildPreferenceControllers(context, getLifecycle(), this);
+ }
+
+ private static List<AbstractPreferenceController> buildPreferenceControllers(
+ Context context, Lifecycle lifecycle, RecentLocationRequestSeeAllFragment fragment) {
+ final List<AbstractPreferenceController> controllers = new ArrayList<>();
+ controllers.add(
+ new RecentLocationRequestSeeAllPreferenceController(context, lifecycle, fragment));
+ return controllers;
+ }
+
+ /**
+ * For Search.
+ */
+ public static final Indexable.SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
+ new BaseSearchIndexProvider() {
+ @Override
+ public List<SearchIndexableResource> getXmlResourcesToIndex(
+ Context context, boolean enabled) {
+ final SearchIndexableResource sir = new SearchIndexableResource(context);
+ sir.xmlResId = R.xml.location_recent_requests_see_all;
+ return Arrays.asList(sir);
+ }
+
+ @Override
+ public List<AbstractPreferenceController> getPreferenceControllers(Context
+ context) {
+ return buildPreferenceControllers(
+ context, /* lifecycle = */ null, /* fragment = */ null);
+ }
+ };
+}
diff --git a/src/com/android/settings/location/RecentLocationRequestSeeAllPreferenceController.java b/src/com/android/settings/location/RecentLocationRequestSeeAllPreferenceController.java
new file mode 100644
index 0000000..4b59df2
--- /dev/null
+++ b/src/com/android/settings/location/RecentLocationRequestSeeAllPreferenceController.java
@@ -0,0 +1,95 @@
+/*
+ * Copyright 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.location;
+
+import android.content.Context;
+import android.support.annotation.VisibleForTesting;
+import android.support.v7.preference.Preference;
+import android.support.v7.preference.PreferenceCategory;
+import android.support.v7.preference.PreferenceScreen;
+import com.android.settings.widget.AppPreference;
+import com.android.settingslib.core.lifecycle.Lifecycle;
+import com.android.settingslib.location.RecentLocationApps;
+import java.util.List;
+
+/** Preference controller for preference category displaying all recent location requests. */
+public class RecentLocationRequestSeeAllPreferenceController
+ extends LocationBasePreferenceController {
+
+ /** Key for preference category "All recent location requests" */
+ private static final String KEY_ALL_RECENT_LOCATION_REQUESTS = "all_recent_location_requests";
+ private final RecentLocationRequestSeeAllFragment mFragment;
+ private PreferenceCategory mCategoryAllRecentLocationRequests;
+ private RecentLocationApps mRecentLocationApps;
+
+ public RecentLocationRequestSeeAllPreferenceController(
+ Context context, Lifecycle lifecycle, RecentLocationRequestSeeAllFragment fragment) {
+ this(context, lifecycle, fragment, new RecentLocationApps(context));
+ }
+
+ @VisibleForTesting
+ RecentLocationRequestSeeAllPreferenceController(
+ Context context,
+ Lifecycle lifecycle,
+ RecentLocationRequestSeeAllFragment fragment,
+ RecentLocationApps recentLocationApps) {
+ super(context, lifecycle);
+ mFragment = fragment;
+ mRecentLocationApps = recentLocationApps;
+ }
+
+ @Override
+ public String getPreferenceKey() {
+ return KEY_ALL_RECENT_LOCATION_REQUESTS;
+ }
+
+ @Override
+ public void onLocationModeChanged(int mode, boolean restricted) {
+ mCategoryAllRecentLocationRequests.setEnabled(mLocationEnabler.isEnabled(mode));
+ }
+
+ @Override
+ public void displayPreference(PreferenceScreen screen) {
+ super.displayPreference(screen);
+ mCategoryAllRecentLocationRequests =
+ (PreferenceCategory) screen.findPreference(KEY_ALL_RECENT_LOCATION_REQUESTS);
+
+ }
+
+ @Override
+ public void updateState(Preference preference) {
+ mCategoryAllRecentLocationRequests.removeAll();
+ List<RecentLocationApps.Request> requests = mRecentLocationApps.getAppListSorted();
+ for (RecentLocationApps.Request request : requests) {
+ Preference appPreference = createAppPreference(preference.getContext(), request);
+ mCategoryAllRecentLocationRequests.addPreference(appPreference);
+ }
+ }
+
+ @VisibleForTesting
+ AppPreference createAppPreference(
+ Context prefContext, RecentLocationApps.Request request) {
+ final AppPreference pref = new AppPreference(prefContext);
+ pref.setSummary(request.contentDescription);
+ pref.setIcon(request.icon);
+ pref.setTitle(request.label);
+ pref.setOnPreferenceClickListener(
+ new RecentLocationRequestPreferenceController.PackageEntryClickedListener(
+ mFragment, request.packageName, request.userHandle));
+ return pref;
+ }
+}
diff --git a/src/com/android/settings/location/ScanningSettings.java b/src/com/android/settings/location/ScanningSettings.java
index 4585870..91359520 100644
--- a/src/com/android/settings/location/ScanningSettings.java
+++ b/src/com/android/settings/location/ScanningSettings.java
@@ -52,7 +52,7 @@
}
@Override
- protected List<AbstractPreferenceController> getPreferenceControllers(Context context) {
+ protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
return buildPreferenceControllers(context);
}
@@ -77,7 +77,7 @@
}
@Override
- public List<AbstractPreferenceController> getPreferenceControllers(Context
+ public List<AbstractPreferenceController> createPreferenceControllers(Context
context) {
return buildPreferenceControllers(context);
}
diff --git a/src/com/android/settings/network/MobileNetworkPreferenceController.java b/src/com/android/settings/network/MobileNetworkPreferenceController.java
index 1670b0d..09f0f8b 100644
--- a/src/com/android/settings/network/MobileNetworkPreferenceController.java
+++ b/src/com/android/settings/network/MobileNetworkPreferenceController.java
@@ -32,11 +32,11 @@
import com.android.settingslib.Utils;
import com.android.settingslib.core.AbstractPreferenceController;
import com.android.settingslib.core.lifecycle.LifecycleObserver;
-import com.android.settingslib.core.lifecycle.events.OnPause;
-import com.android.settingslib.core.lifecycle.events.OnResume;
+import com.android.settingslib.core.lifecycle.events.OnStart;
+import com.android.settingslib.core.lifecycle.events.OnStop;
public class MobileNetworkPreferenceController extends AbstractPreferenceController
- implements PreferenceControllerMixin, LifecycleObserver, OnResume, OnPause {
+ implements PreferenceControllerMixin, LifecycleObserver, OnStart, OnStop {
private static final String KEY_MOBILE_NETWORK_SETTINGS = "mobile_network_settings";
@@ -71,9 +71,7 @@
@Override
public void displayPreference(PreferenceScreen screen) {
super.displayPreference(screen);
- if (isAvailable()) {
- mPreference = screen.findPreference(getPreferenceKey());
- }
+ mPreference = screen.findPreference(getPreferenceKey());
}
@Override
@@ -82,15 +80,13 @@
}
@Override
- public void onResume() {
+ public void onStart() {
if (isAvailable()) {
if (mPhoneStateListener == null) {
mPhoneStateListener = new PhoneStateListener() {
@Override
public void onServiceStateChanged(ServiceState serviceState) {
- if (mPreference != null) {
- mPreference.setSummary(mTelephonyManager.getNetworkOperatorName());
- }
+ updateState(mPreference);
}
};
}
@@ -99,9 +95,14 @@
}
@Override
- public void onPause() {
+ public void onStop() {
if (mPhoneStateListener != null) {
mTelephonyManager.listen(mPhoneStateListener, PhoneStateListener.LISTEN_NONE);
}
}
+
+ @Override
+ public CharSequence getSummary() {
+ return mTelephonyManager.getNetworkOperatorName();
+ }
}
diff --git a/src/com/android/settings/network/NetworkDashboardFragment.java b/src/com/android/settings/network/NetworkDashboardFragment.java
index 74c1910..7d8ea18 100644
--- a/src/com/android/settings/network/NetworkDashboardFragment.java
+++ b/src/com/android/settings/network/NetworkDashboardFragment.java
@@ -90,7 +90,7 @@
}
@Override
- protected List<AbstractPreferenceController> getPreferenceControllers(Context context) {
+ protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
return buildPreferenceControllers(context, getLifecycle(), mMetricsFeatureProvider, this
/* fragment */,
this /* mobilePlanHost */);
@@ -140,7 +140,7 @@
switch (dialogId) {
case MANAGE_MOBILE_PLAN_DIALOG_ID:
final MobilePlanPreferenceController controller =
- getPreferenceController(MobilePlanPreferenceController.class);
+ use(MobilePlanPreferenceController.class);
return new AlertDialog.Builder(getActivity())
.setMessage(controller.getMobilePlanDialogMessage())
.setCancelable(false)
@@ -230,7 +230,7 @@
}
@Override
- public List<AbstractPreferenceController> getPreferenceControllers(Context
+ public List<AbstractPreferenceController> createPreferenceControllers(Context
context) {
return buildPreferenceControllers(context, null /* lifecycle */,
null /* metricsFeatureProvider */, null /* fragment */,
diff --git a/src/com/android/settings/notification/AppNotificationSettings.java b/src/com/android/settings/notification/AppNotificationSettings.java
index 78139dc..d334b92 100644
--- a/src/com/android/settings/notification/AppNotificationSettings.java
+++ b/src/com/android/settings/notification/AppNotificationSettings.java
@@ -110,7 +110,7 @@
}
@Override
- protected List<AbstractPreferenceController> getPreferenceControllers(Context context) {
+ protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
mControllers = new ArrayList<>();
mControllers.add(new HeaderPreferenceController(context, this));
mControllers.add(new BlockPreferenceController(context, mImportanceListener, mBackend));
diff --git a/src/com/android/settings/notification/ChannelGroupNotificationSettings.java b/src/com/android/settings/notification/ChannelGroupNotificationSettings.java
index 707a559..d641df7 100644
--- a/src/com/android/settings/notification/ChannelGroupNotificationSettings.java
+++ b/src/com/android/settings/notification/ChannelGroupNotificationSettings.java
@@ -65,7 +65,7 @@
}
@Override
- protected List<AbstractPreferenceController> getPreferenceControllers(Context context) {
+ protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
mControllers = new ArrayList<>();
mControllers.add(new HeaderPreferenceController(context, this));
mControllers.add(new BlockPreferenceController(context, mImportanceListener, mBackend));
diff --git a/src/com/android/settings/notification/ChannelNotificationSettings.java b/src/com/android/settings/notification/ChannelNotificationSettings.java
index 23451ec..a138429 100644
--- a/src/com/android/settings/notification/ChannelNotificationSettings.java
+++ b/src/com/android/settings/notification/ChannelNotificationSettings.java
@@ -75,7 +75,7 @@
}
@Override
- protected List<AbstractPreferenceController> getPreferenceControllers(Context context) {
+ protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
mControllers = new ArrayList<>();
mControllers.add(new HeaderPreferenceController(context, this));
mControllers.add(new BlockPreferenceController(context, mImportanceListener, mBackend));
diff --git a/src/com/android/settings/notification/ConfigureNotificationSettings.java b/src/com/android/settings/notification/ConfigureNotificationSettings.java
index a3af471..0e47ed8 100644
--- a/src/com/android/settings/notification/ConfigureNotificationSettings.java
+++ b/src/com/android/settings/notification/ConfigureNotificationSettings.java
@@ -76,7 +76,7 @@
}
@Override
- protected List<AbstractPreferenceController> getPreferenceControllers(Context context) {
+ protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
final Activity activity = getActivity();
final Application app;
if (activity != null) {
@@ -165,7 +165,7 @@
}
@Override
- public List<AbstractPreferenceController> getPreferenceControllers(
+ public List<AbstractPreferenceController> createPreferenceControllers(
Context context) {
return buildPreferenceControllers(context, null, null, null);
}
diff --git a/src/com/android/settings/notification/HeaderPreferenceController.java b/src/com/android/settings/notification/HeaderPreferenceController.java
index 5ec60c2..f30abf4 100644
--- a/src/com/android/settings/notification/HeaderPreferenceController.java
+++ b/src/com/android/settings/notification/HeaderPreferenceController.java
@@ -51,6 +51,7 @@
return mAppRow != null;
}
+ @Override
public void updateState(Preference preference) {
if (mAppRow != null && mFragment != null) {
LayoutPreference pref = (LayoutPreference) preference;
@@ -78,7 +79,7 @@
}
@Override
- public String getSummary() {
+ public CharSequence getSummary() {
if (mChannel != null) {
if (mChannelGroup != null && mChannelGroup.getGroup() != null
&& !TextUtils.isEmpty(mChannelGroup.getGroup().getName())) {
diff --git a/src/com/android/settings/notification/NotificationSettingsBase.java b/src/com/android/settings/notification/NotificationSettingsBase.java
index 09789f3..a4310a1 100644
--- a/src/com/android/settings/notification/NotificationSettingsBase.java
+++ b/src/com/android/settings/notification/NotificationSettingsBase.java
@@ -16,65 +16,42 @@
package com.android.settings.notification;
-import static android.app.NotificationManager.IMPORTANCE_DEFAULT;
import static android.app.NotificationManager.IMPORTANCE_LOW;
import static android.app.NotificationManager.IMPORTANCE_NONE;
-import static android.app.NotificationManager.IMPORTANCE_UNSPECIFIED;
-
-import com.android.internal.widget.LockPatternUtils;
-import com.android.settings.R;
-import com.android.settings.SettingsPreferenceFragment;
-import com.android.settings.Utils;
-import com.android.settings.applications.AppInfoBase;
-import com.android.settings.applications.LayoutPreference;
-import com.android.settings.dashboard.DashboardFragment;
-import com.android.settings.search.BaseSearchIndexProvider;
-import com.android.settings.search.Indexable;
-import com.android.settings.widget.MasterCheckBoxPreference;
-import com.android.settings.widget.MasterSwitchPreference;
-import com.android.settings.widget.SwitchBar;
-import com.android.settings.wrapper.NotificationChannelGroupWrapper;
-import com.android.settingslib.RestrictedLockUtils;
-import com.android.settingslib.RestrictedSwitchPreference;
-import com.android.settingslib.core.AbstractPreferenceController;
-import com.android.settingslib.widget.FooterPreference;
+import static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
import android.app.Notification;
import android.app.NotificationChannel;
import android.app.NotificationChannelGroup;
import android.app.NotificationManager;
-import android.app.admin.DevicePolicyManager;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.ActivityInfo;
-import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.content.pm.ResolveInfo;
-import android.content.pm.UserInfo;
-import android.net.Uri;
import android.os.Bundle;
import android.os.UserHandle;
-import android.os.UserManager;
-import android.provider.SearchIndexableResource;
import android.provider.Settings;
-import android.service.notification.NotificationListenerService;
-import android.support.v14.preference.SwitchPreference;
import android.support.v7.preference.Preference;
import android.support.v7.preference.PreferenceGroup;
import android.support.v7.preference.PreferenceScreen;
import android.text.TextUtils;
-import android.util.ArrayMap;
import android.util.Log;
import android.widget.Toast;
-import static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
+import com.android.settings.R;
+import com.android.settings.applications.AppInfoBase;
+import com.android.settings.core.SubSettingLauncher;
+import com.android.settings.dashboard.DashboardFragment;
+import com.android.settings.widget.MasterCheckBoxPreference;
+import com.android.settings.wrapper.NotificationChannelGroupWrapper;
+import com.android.settingslib.RestrictedLockUtils;
import java.util.ArrayList;
-import java.util.Collections;
import java.util.Comparator;
import java.util.List;
@@ -268,11 +245,12 @@
channelArgs.putInt(AppInfoBase.ARG_PACKAGE_UID, mUid);
channelArgs.putString(AppInfoBase.ARG_PACKAGE_NAME, mPkg);
channelArgs.putString(Settings.EXTRA_CHANNEL_ID, channel.getId());
- Intent channelIntent = Utils.onBuildStartFragmentIntent(getActivity(),
- ChannelNotificationSettings.class.getName(),
- channelArgs, null, R.string.notification_channel_title, null, false,
- getMetricsCategory());
- channelPref.setIntent(channelIntent);
+ channelPref.setIntent(new SubSettingLauncher(getActivity())
+ .setDestination(ChannelNotificationSettings.class.getName())
+ .setArguments(channelArgs)
+ .setTitle(R.string.notification_channel_title)
+ .setSourceMetricsCategory(getMetricsCategory())
+ .toIntent());
channelPref.setOnPreferenceChangeListener(
new Preference.OnPreferenceChangeListener() {
diff --git a/src/com/android/settings/notification/RecentNotifyingAppsPreferenceController.java b/src/com/android/settings/notification/RecentNotifyingAppsPreferenceController.java
index ce5e1d1..6cc99f7 100644
--- a/src/com/android/settings/notification/RecentNotifyingAppsPreferenceController.java
+++ b/src/com/android/settings/notification/RecentNotifyingAppsPreferenceController.java
@@ -33,16 +33,13 @@
import android.util.ArraySet;
import android.util.IconDrawableFactory;
import android.util.Log;
-import android.widget.Switch;
import com.android.internal.logging.nano.MetricsProto;
import com.android.settings.R;
-import com.android.settings.Utils;
import com.android.settings.applications.AppInfoBase;
import com.android.settings.applications.InstalledAppCounter;
import com.android.settings.core.PreferenceControllerMixin;
-import com.android.settings.widget.AppPreference;
-import com.android.settings.widget.MasterSwitchPreference;
+import com.android.settings.core.SubSettingLauncher;
import com.android.settingslib.applications.AppUtils;
import com.android.settingslib.applications.ApplicationsState;
import com.android.settingslib.core.AbstractPreferenceController;
@@ -237,10 +234,13 @@
args.putString(AppInfoBase.ARG_PACKAGE_NAME, pkgName);
args.putInt(AppInfoBase.ARG_PACKAGE_UID, appEntry.info.uid);
- pref.setIntent(Utils.onBuildStartFragmentIntent(mHost.getActivity(),
- AppNotificationSettings.class.getName(), args, null,
- R.string.notifications_title, null, false,
- MetricsProto.MetricsEvent.MANAGE_APPLICATIONS_NOTIFICATIONS));
+ pref.setIntent(new SubSettingLauncher(mHost.getActivity())
+ .setDestination(AppNotificationSettings.class.getName())
+ .setTitle(R.string.notifications_title)
+ .setArguments(args)
+ .setSourceMetricsCategory(
+ MetricsProto.MetricsEvent.MANAGE_APPLICATIONS_NOTIFICATIONS)
+ .toIntent());
pref.setOnPreferenceChangeListener((preference, newValue) -> {
boolean blocked = !(Boolean) newValue;
mNotificationBackend.setNotificationsEnabledForPackage(
diff --git a/src/com/android/settings/notification/SoundSettings.java b/src/com/android/settings/notification/SoundSettings.java
index 032a5cb..239bb49 100644
--- a/src/com/android/settings/notification/SoundSettings.java
+++ b/src/com/android/settings/notification/SoundSettings.java
@@ -107,7 +107,7 @@
}
@Override
- protected List<AbstractPreferenceController> getPreferenceControllers(Context context) {
+ protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
return buildPreferenceControllers(context, this, mVolumeCallback, getLifecycle());
}
@@ -255,7 +255,8 @@
}
@Override
- public List<AbstractPreferenceController> getPreferenceControllers(Context context) {
+ public List<AbstractPreferenceController> createPreferenceControllers(
+ Context context) {
return buildPreferenceControllers(context, null /* fragment */,
null /* callback */, null /* lifecycle */);
}
@@ -273,7 +274,7 @@
void enableWorkSync() {
final WorkSoundPreferenceController workSoundController =
- getPreferenceController(WorkSoundPreferenceController.class);
+ use(WorkSoundPreferenceController.class);
if (workSoundController != null) {
workSoundController.enableWorkSync();
}
diff --git a/src/com/android/settings/notification/ZenModeAutomationSettings.java b/src/com/android/settings/notification/ZenModeAutomationSettings.java
index 6ce13c1..1bb6fc6 100644
--- a/src/com/android/settings/notification/ZenModeAutomationSettings.java
+++ b/src/com/android/settings/notification/ZenModeAutomationSettings.java
@@ -37,7 +37,7 @@
protected final ManagedServiceSettings.Config CONFIG = getConditionProviderConfig();
@Override
- protected List<AbstractPreferenceController> getPreferenceControllers(Context context) {
+ protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
ZenServiceListing serviceListing = new ZenServiceListing(getContext(), CONFIG);
serviceListing.reloadApprovedServices();
return buildPreferenceControllers(context, this, serviceListing, getLifecycle());
@@ -98,7 +98,7 @@
}
@Override
- public List<AbstractPreferenceController> getPreferenceControllers(
+ public List<AbstractPreferenceController> createPreferenceControllers(
Context context) {
return buildPreferenceControllers(context, null, null, null);
}
diff --git a/src/com/android/settings/notification/ZenModeBehaviorSettings.java b/src/com/android/settings/notification/ZenModeBehaviorSettings.java
index e2e85f3..2dd5ebd 100644
--- a/src/com/android/settings/notification/ZenModeBehaviorSettings.java
+++ b/src/com/android/settings/notification/ZenModeBehaviorSettings.java
@@ -32,7 +32,7 @@
public class ZenModeBehaviorSettings extends ZenModeSettingsBase implements Indexable {
@Override
- protected List<AbstractPreferenceController> getPreferenceControllers(Context context) {
+ protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
return buildPreferenceControllers(context, getLifecycle());
}
@@ -97,7 +97,7 @@
}
@Override
- public List<AbstractPreferenceController> getPreferenceControllers(Context context) {
+ public List<AbstractPreferenceController> createPreferenceControllers(Context context) {
return buildPreferenceControllers(context, null);
}
};
diff --git a/src/com/android/settings/notification/ZenModeEventRuleSettings.java b/src/com/android/settings/notification/ZenModeEventRuleSettings.java
index cf6d7b5..9263d3a 100644
--- a/src/com/android/settings/notification/ZenModeEventRuleSettings.java
+++ b/src/com/android/settings/notification/ZenModeEventRuleSettings.java
@@ -78,7 +78,7 @@
}
@Override
- protected List<AbstractPreferenceController> getPreferenceControllers(Context context) {
+ protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
List<AbstractPreferenceController> controllers = new ArrayList<>();
mHeader = new ZenAutomaticRuleHeaderPreferenceController(context, this,
getLifecycle());
diff --git a/src/com/android/settings/notification/ZenModeScheduleRuleSettings.java b/src/com/android/settings/notification/ZenModeScheduleRuleSettings.java
index 9ef1128..4633f88 100644
--- a/src/com/android/settings/notification/ZenModeScheduleRuleSettings.java
+++ b/src/com/android/settings/notification/ZenModeScheduleRuleSettings.java
@@ -196,7 +196,7 @@
@Override
- protected List<AbstractPreferenceController> getPreferenceControllers(Context context) {
+ protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
List<AbstractPreferenceController> controllers = new ArrayList<>();
mHeader = new ZenAutomaticRuleHeaderPreferenceController(context, this,
getLifecycle());
diff --git a/src/com/android/settings/notification/ZenModeSettings.java b/src/com/android/settings/notification/ZenModeSettings.java
index 2b48301..272bb41 100644
--- a/src/com/android/settings/notification/ZenModeSettings.java
+++ b/src/com/android/settings/notification/ZenModeSettings.java
@@ -50,7 +50,7 @@
}
@Override
- protected List<AbstractPreferenceController> getPreferenceControllers(Context context) {
+ protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
return buildPreferenceControllers(context, getLifecycle(), getFragmentManager());
}
@@ -230,7 +230,7 @@
}
@Override
- public List<AbstractPreferenceController> getPreferenceControllers(Context
+ public List<AbstractPreferenceController> createPreferenceControllers(Context
context) {
return buildPreferenceControllers(context, null, null);
}
diff --git a/src/com/android/settings/password/ChooseLockPassword.java b/src/com/android/settings/password/ChooseLockPassword.java
index a9c5c03..38fdbce 100644
--- a/src/com/android/settings/password/ChooseLockPassword.java
+++ b/src/com/android/settings/password/ChooseLockPassword.java
@@ -279,7 +279,7 @@
0,
0,
0,
- R.string.next_label);
+ R.string.lockpassword_confirm_label);
Stage(int hintInAlpha, int hintInAlphaForFingerprint,
int hintInNumeric, int hintInNumericForFingerprint,
@@ -885,7 +885,7 @@
// Hide password requirement view when we are just asking user to confirm the pw.
mPasswordRestrictionView.setVisibility(View.GONE);
setHeaderText(getString(mUiStage.getHint(mIsAlphaMode, mForFingerprint)));
- setNextEnabled(canInput && length > 0);
+ setNextEnabled(canInput && length >= mPasswordMinLength);
mClearButton.setEnabled(canInput && length > 0);
}
int message = mUiStage.getMessage(mIsAlphaMode, mForFingerprint);
diff --git a/src/com/android/settings/password/ChooseLockPattern.java b/src/com/android/settings/password/ChooseLockPattern.java
index 0df1a11..75a78f8 100644
--- a/src/com/android/settings/password/ChooseLockPattern.java
+++ b/src/com/android/settings/password/ChooseLockPattern.java
@@ -452,8 +452,15 @@
final GlifLayout layout = (GlifLayout) inflater.inflate(
R.layout.choose_lock_pattern, container, false);
layout.setHeaderText(getActivity().getTitle());
- if (mForFingerprint) {
- layout.setIcon(getActivity().getDrawable(R.drawable.ic_fingerprint_header));
+ if (getResources().getBoolean(R.bool.config_lock_pattern_minimal_ui)) {
+ View iconView = layout.findViewById(R.id.suw_layout_icon);
+ if (iconView != null) {
+ iconView.setVisibility(View.GONE);
+ }
+ } else {
+ if (mForFingerprint) {
+ layout.setIcon(getActivity().getDrawable(R.drawable.ic_fingerprint_header));
+ }
}
return layout;
}
diff --git a/src/com/android/settings/password/SetupChooseLockPattern.java b/src/com/android/settings/password/SetupChooseLockPattern.java
index 4ae5839..864c5c2 100644
--- a/src/com/android/settings/password/SetupChooseLockPattern.java
+++ b/src/com/android/settings/password/SetupChooseLockPattern.java
@@ -57,11 +57,13 @@
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
- Button optionsButton = (Button) view.findViewById(R.id.screen_lock_options);
- optionsButton.setVisibility(View.VISIBLE);
- optionsButton.setOnClickListener((btn) ->
- ChooseLockTypeDialogFragment.newInstance(mUserId)
- .show(getChildFragmentManager(), null));
+ if (!getResources().getBoolean(R.bool.config_lock_pattern_minimal_ui)) {
+ Button optionsButton = view.findViewById(R.id.screen_lock_options);
+ optionsButton.setVisibility(View.VISIBLE);
+ optionsButton.setOnClickListener((btn) ->
+ ChooseLockTypeDialogFragment.newInstance(mUserId)
+ .show(getChildFragmentManager(), null));
+ }
}
@Override
diff --git a/src/com/android/settings/print/PrintSettingPreferenceController.java b/src/com/android/settings/print/PrintSettingPreferenceController.java
index bb8a81e..a589770 100644
--- a/src/com/android/settings/print/PrintSettingPreferenceController.java
+++ b/src/com/android/settings/print/PrintSettingPreferenceController.java
@@ -18,6 +18,7 @@
import android.content.Context;
import android.content.pm.PackageManager;
+import android.os.UserManager;
import android.print.PrintJob;
import android.print.PrintJobId;
import android.print.PrintJobInfo;
@@ -29,6 +30,7 @@
import com.android.settings.R;
import com.android.settings.core.BasePreferenceController;
import com.android.settings.wrapper.PrintManagerWrapper;
+import com.android.settingslib.RestrictedPreference;
import com.android.settingslib.core.lifecycle.LifecycleObserver;
import com.android.settingslib.core.lifecycle.events.OnStart;
import com.android.settingslib.core.lifecycle.events.OnStop;
@@ -41,12 +43,14 @@
public class PrintSettingPreferenceController extends BasePreferenceController implements
LifecycleObserver, OnStart, OnStop, PrintManager.PrintJobStateChangeListener {
+ private static final String KEY_PRINTING_SETTINGS = "connected_device_printing";
+
private final PackageManager mPackageManager;
private PrintManagerWrapper mPrintManager;
private Preference mPreference;
public PrintSettingPreferenceController(Context context) {
- super(context, "connected_device_printing" /* preferenceKey */);
+ super(context, KEY_PRINTING_SETTINGS);
mPackageManager = context.getPackageManager();
mPrintManager = new PrintManagerWrapper(context);
}
@@ -80,14 +84,13 @@
@Override
public void updateState(Preference preference) {
- if (preference == null) {
- return;
- }
- preference.setSummary(getSummary());
+ super.updateState(preference);
+ ((RestrictedPreference) preference).checkRestrictionAndSetDisabled(
+ UserManager.DISALLOW_PRINTING);
}
@Override
- public String getSummary() {
+ public CharSequence getSummary() {
final List<PrintJob> printJobs = mPrintManager.getPrintJobs();
int numActivePrintJobs = 0;
@@ -106,7 +109,7 @@
final List<PrintServiceInfo> services =
mPrintManager.getPrintServices(PrintManager.ENABLED_SERVICES);
if (services == null || services.isEmpty()) {
- return mContext.getString(R.string.print_settings_summary_no_service);
+ return mContext.getText(R.string.print_settings_summary_no_service);
} else {
final int count = services.size();
return mContext.getResources().getQuantityString(
diff --git a/src/com/android/settings/search/BaseSearchIndexProvider.java b/src/com/android/settings/search/BaseSearchIndexProvider.java
index 5723300..dbd28a3 100644
--- a/src/com/android/settings/search/BaseSearchIndexProvider.java
+++ b/src/com/android/settings/search/BaseSearchIndexProvider.java
@@ -28,7 +28,9 @@
import android.util.Xml;
import com.android.settings.core.BasePreferenceController;
+import com.android.settings.core.PreferenceControllerListHelper;
import com.android.settings.core.PreferenceControllerMixin;
+import com.android.settings.core.PreferenceXmlParserUtils;
import com.android.settingslib.core.AbstractPreferenceController;
import org.xmlpull.v1.XmlPullParser;
@@ -76,8 +78,10 @@
((BasePreferenceController) controller).updateNonIndexableKeys(
nonIndexableKeys);
} else {
- throw new IllegalStateException(controller.getClass().getName()
- + " must implement " + PreferenceControllerMixin.class.getName());
+ Log.e(TAG, controller.getClass().getName()
+ + " must implement " + PreferenceControllerMixin.class.getName()
+ + " treating the key non-indexable");
+ nonIndexableKeys.add(controller.getPreferenceKey());
}
}
return nonIndexableKeys;
@@ -88,6 +92,33 @@
@Override
public List<AbstractPreferenceController> getPreferenceControllers(Context context) {
+ final List<AbstractPreferenceController> controllersFromCode =
+ createPreferenceControllers(context);
+ final List<SearchIndexableResource> res = getXmlResourcesToIndex(context, true);
+ if (res == null || res.isEmpty()) {
+ return controllersFromCode;
+ }
+ List<BasePreferenceController> controllersFromXml = new ArrayList<>();
+ for (SearchIndexableResource sir : res) {
+ controllersFromXml.addAll(PreferenceControllerListHelper
+ .getPreferenceControllersFromXml(context, sir.xmlResId));
+ }
+ controllersFromXml = PreferenceControllerListHelper.filterControllers(controllersFromXml,
+ controllersFromCode);
+ final List<AbstractPreferenceController> allControllers = new ArrayList<>();
+ if (controllersFromCode != null) {
+ allControllers.addAll(controllersFromCode);
+ }
+ allControllers.addAll(controllersFromXml);
+ return allControllers;
+ }
+
+ /**
+ * Creates a list of {@link AbstractPreferenceController} programatically.
+ * <p/>
+ * This list should create controllers that are not defined in xml as a Slice controller.
+ */
+ public List<AbstractPreferenceController> createPreferenceControllers(Context context) {
return null;
}
@@ -119,7 +150,7 @@
final AttributeSet attrs = Xml.asAttributeSet(parser);
try {
while (parser.next() != XmlPullParser.END_DOCUMENT) {
- final String key = XmlParserUtils.getDataKey(context, attrs);
+ final String key = PreferenceXmlParserUtils.getDataKey(context, attrs);
if (!TextUtils.isEmpty(key)) {
nonIndexableKeys.add(key);
}
diff --git a/src/com/android/settings/search/DatabaseIndexingUtils.java b/src/com/android/settings/search/DatabaseIndexingUtils.java
index 94ec650..eaf69b7 100644
--- a/src/com/android/settings/search/DatabaseIndexingUtils.java
+++ b/src/com/android/settings/search/DatabaseIndexingUtils.java
@@ -26,9 +26,9 @@
import com.android.internal.logging.nano.MetricsProto;
import com.android.settings.SettingsActivity;
-import com.android.settings.Utils;
import com.android.settings.core.BasePreferenceController;
import com.android.settings.core.PreferenceControllerMixin;
+import com.android.settings.core.SubSettingLauncher;
import com.android.settingslib.core.AbstractPreferenceController;
import java.lang.reflect.Field;
@@ -59,8 +59,12 @@
String screenTitle, int sourceMetricsCategory) {
final Bundle args = new Bundle();
args.putString(SettingsActivity.EXTRA_FRAGMENT_ARG_KEY, key);
- final Intent searchDestination = Utils.onBuildStartFragmentIntent(context,
- className, args, null, 0, screenTitle, false, sourceMetricsCategory);
+ final Intent searchDestination = new SubSettingLauncher(context)
+ .setDestination(className)
+ .setArguments(args)
+ .setTitle(screenTitle)
+ .setSourceMetricsCategory(sourceMetricsCategory)
+ .toIntent();
searchDestination.putExtra(SettingsActivity.EXTRA_FRAGMENT_ARG_KEY, key)
.setAction("com.android.settings.SEARCH_RESULT_TRAMPOLINE")
.setComponent(null);
@@ -73,8 +77,7 @@
* @return A map between {@link Uri}s and {@link PreferenceControllerMixin}s to get the payload
* types for Settings.
*/
- public static Map<String, ResultPayload> getPayloadKeyMap(
- String className, Context context) {
+ public static Map<String, ResultPayload> getPayloadKeyMap(String className, Context context) {
ArrayMap<String, ResultPayload> map = new ArrayMap<>();
if (context == null) {
return map;
@@ -92,7 +95,7 @@
// SEARCH_INDEX_DATA_PROVIDER field
final Indexable.SearchIndexProvider provider = getSearchIndexProvider(clazz);
- List<AbstractPreferenceController> controllers =
+ final List<AbstractPreferenceController> controllers =
provider.getPreferenceControllers(context);
if (controllers == null) {
diff --git a/src/com/android/settings/search/Indexable.java b/src/com/android/settings/search/Indexable.java
index 505f41b..e157fac 100644
--- a/src/com/android/settings/search/Indexable.java
+++ b/src/com/android/settings/search/Indexable.java
@@ -18,7 +18,7 @@
import android.content.Context;
import android.provider.SearchIndexableResource;
-import com.android.settings.core.PreferenceControllerMixin;
+
import com.android.settingslib.core.AbstractPreferenceController;
import java.util.List;
@@ -31,7 +31,6 @@
* {@link Indexable.SearchIndexProvider} interface.
*
* See {@link android.provider.SearchIndexableResource} and {@link SearchIndexableRaw}.
- *
*/
public interface Indexable {
@@ -41,12 +40,11 @@
*
* See {@link android.provider.SearchIndexableResource}
*
- *
* @param context the context.
* @param enabled hint telling if the data needs to be considered into the search results
* or not.
* @return a list of {@link android.provider.SearchIndexableResource} references.
- * Can be null.
+ * Can be null.
*/
List<SearchIndexableResource> getXmlResourcesToIndex(Context context, boolean enabled);
@@ -69,7 +67,6 @@
List<String> getNonIndexableKeys(Context context);
/**
- * @param context
* @return a list of {@link AbstractPreferenceController} for ResultPayload data during
* Indexing.
*/
diff --git a/src/com/android/settings/search/SearchIndexableResourcesImpl.java b/src/com/android/settings/search/SearchIndexableResourcesImpl.java
index 55235a4..87c2a91 100644
--- a/src/com/android/settings/search/SearchIndexableResourcesImpl.java
+++ b/src/com/android/settings/search/SearchIndexableResourcesImpl.java
@@ -21,7 +21,7 @@
import com.android.settings.DateTimeSettings;
import com.android.settings.DisplaySettings;
import com.android.settings.LegalSettings;
-import com.android.settings.connecteddevice.ConnectedDeviceDashboardFragmentOld;
+import com.android.settings.connecteddevice.AdvancedConnectedDeviceDashboardFragment;
import com.android.settings.datausage.DataUsageSummaryLegacy;
import com.android.settings.deviceinfo.aboutphone.MyDeviceInfoFragment;
import com.android.settings.accessibility.AccessibilitySettings;
@@ -36,7 +36,6 @@
import com.android.settings.backup.BackupSettingsActivity;
import com.android.settings.backup.BackupSettingsFragment;
import com.android.settings.bluetooth.BluetoothSettings;
-import com.android.settings.connecteddevice.AdvancedConnectedDeviceDashboardFragment;
import com.android.settings.connecteddevice.ConnectedDeviceDashboardFragment;
import com.android.settings.connecteddevice.usb.UsbDetailsFragment;
import com.android.settings.datausage.DataUsageSummary;
@@ -45,7 +44,6 @@
import com.android.settings.deviceinfo.DeviceInfoSettings;
import com.android.settings.deviceinfo.StorageDashboardFragment;
import com.android.settings.deviceinfo.StorageSettings;
-import com.android.settings.deviceinfo.aboutphone.MyDeviceInfoFragment;
import com.android.settings.display.AmbientDisplaySettings;
import com.android.settings.display.NightDisplaySettings;
import com.android.settings.display.ScreenZoomSettings;
@@ -67,6 +65,7 @@
import com.android.settings.inputmethod.VirtualKeyboardFragment;
import com.android.settings.language.LanguageAndInputSettings;
import com.android.settings.location.LocationSettings;
+import com.android.settings.location.RecentLocationRequestSeeAllFragment;
import com.android.settings.location.ScanningSettings;
import com.android.settings.network.NetworkDashboardFragment;
import com.android.settings.nfc.PaymentSettings;
@@ -157,7 +156,6 @@
addIndex(ResetDashboardFragment.class);
addIndex(StorageDashboardFragment.class);
addIndex(ConnectedDeviceDashboardFragment.class);
- addIndex(ConnectedDeviceDashboardFragmentOld.class);
addIndex(AdvancedConnectedDeviceDashboardFragment.class);
addIndex(EnterprisePrivacySettings.class);
addIndex(PaymentSettings.class);
@@ -180,6 +178,7 @@
addIndex(SmartBatterySettings.class);
addIndex(MyDeviceInfoFragment.class);
addIndex(VibrationSettings.class);
+ addIndex(RecentLocationRequestSeeAllFragment.class);
}
@Override
diff --git a/src/com/android/settings/search/indexing/IndexDataConverter.java b/src/com/android/settings/search/indexing/IndexDataConverter.java
index c40a466..5d20704 100644
--- a/src/com/android/settings/search/indexing/IndexDataConverter.java
+++ b/src/com/android/settings/search/indexing/IndexDataConverter.java
@@ -29,11 +29,10 @@
import android.util.Log;
import android.util.Xml;
-import com.android.settings.core.PreferenceControllerMixin;
import com.android.settings.search.DatabaseIndexingUtils;
+import com.android.settings.core.PreferenceXmlParserUtils;
import com.android.settings.search.ResultPayload;
import com.android.settings.search.SearchIndexableRaw;
-import com.android.settings.search.XmlParserUtils;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
@@ -161,8 +160,8 @@
final int outerDepth = parser.getDepth();
final AttributeSet attrs = Xml.asAttributeSet(parser);
- final String screenTitle = XmlParserUtils.getDataTitle(context, attrs);
- String key = XmlParserUtils.getDataKey(context, attrs);
+ final String screenTitle = PreferenceXmlParserUtils.getDataTitle(context, attrs);
+ String key = PreferenceXmlParserUtils.getDataKey(context, attrs);
String title;
String headerTitle;
@@ -186,9 +185,9 @@
.getPayloadKeyMap(fragmentName, context);
}
- headerTitle = XmlParserUtils.getDataTitle(context, attrs);
- headerSummary = XmlParserUtils.getDataSummary(context, attrs);
- headerKeywords = XmlParserUtils.getDataKeywords(context, attrs);
+ headerTitle = PreferenceXmlParserUtils.getDataTitle(context, attrs);
+ headerSummary = PreferenceXmlParserUtils.getDataSummary(context, attrs);
+ headerKeywords = PreferenceXmlParserUtils.getDataKeywords(context, attrs);
enabled = !nonIndexableKeys.contains(key);
// TODO: Set payload type for header results
@@ -217,11 +216,11 @@
nodeName = parser.getName();
- title = XmlParserUtils.getDataTitle(context, attrs);
- key = XmlParserUtils.getDataKey(context, attrs);
+ title = PreferenceXmlParserUtils.getDataTitle(context, attrs);
+ key = PreferenceXmlParserUtils.getDataKey(context, attrs);
enabled = !nonIndexableKeys.contains(key);
- keywords = XmlParserUtils.getDataKeywords(context, attrs);
- iconResId = XmlParserUtils.getDataIcon(context, attrs);
+ keywords = PreferenceXmlParserUtils.getDataKeywords(context, attrs);
+ iconResId = PreferenceXmlParserUtils.getDataIcon(context, attrs);
if (isHeaderUnique && TextUtils.equals(headerTitle, title)) {
isHeaderUnique = false;
@@ -241,17 +240,17 @@
.setUserId(-1 /* default user id */);
if (!nodeName.equals(NODE_NAME_CHECK_BOX_PREFERENCE)) {
- summary = XmlParserUtils.getDataSummary(context, attrs);
+ summary = PreferenceXmlParserUtils.getDataSummary(context, attrs);
String entries = null;
if (nodeName.endsWith(NODE_NAME_LIST_PREFERENCE)) {
- entries = XmlParserUtils.getDataEntries(context, attrs);
+ entries = PreferenceXmlParserUtils.getDataEntries(context, attrs);
}
// TODO (b/62254931) index primitives instead of payload
payload = controllerUriMap.get(key);
- childFragment = XmlParserUtils.getDataChildFragment(context, attrs);
+ childFragment = PreferenceXmlParserUtils.getDataChildFragment(context, attrs);
builder.setSummaryOn(summary)
.setEntries(entries)
@@ -263,11 +262,11 @@
// TODO (b/33577327) We removed summary off here. We should check if we can
// merge this 'else' section with the one above. Put a break point to
// investigate.
- String summaryOn = XmlParserUtils.getDataSummaryOn(context, attrs);
- String summaryOff = XmlParserUtils.getDataSummaryOff(context, attrs);
+ String summaryOn = PreferenceXmlParserUtils.getDataSummaryOn(context, attrs);
+ String summaryOff = PreferenceXmlParserUtils.getDataSummaryOff(context, attrs);
if (TextUtils.isEmpty(summaryOn) && TextUtils.isEmpty(summaryOff)) {
- summaryOn = XmlParserUtils.getDataSummary(context, attrs);
+ summaryOn = PreferenceXmlParserUtils.getDataSummary(context, attrs);
}
builder.setSummaryOn(summaryOn);
diff --git a/src/com/android/settings/security/EncryptionAndCredential.java b/src/com/android/settings/security/EncryptionAndCredential.java
index 627cf3e..6dae9b7 100644
--- a/src/com/android/settings/security/EncryptionAndCredential.java
+++ b/src/com/android/settings/security/EncryptionAndCredential.java
@@ -53,7 +53,7 @@
}
@Override
- protected List<AbstractPreferenceController> getPreferenceControllers(Context context) {
+ protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
return buildPreferenceControllers(context, getLifecycle());
}
@@ -101,7 +101,7 @@
}
@Override
- public List<AbstractPreferenceController> getPreferenceControllers(Context context) {
+ public List<AbstractPreferenceController> createPreferenceControllers(Context context) {
return buildPreferenceControllers(context, null /* lifecycle */);
}
diff --git a/src/com/android/settings/security/LockscreenDashboardFragment.java b/src/com/android/settings/security/LockscreenDashboardFragment.java
index c400645..c438d81 100644
--- a/src/com/android/settings/security/LockscreenDashboardFragment.java
+++ b/src/com/android/settings/security/LockscreenDashboardFragment.java
@@ -76,7 +76,7 @@
}
@Override
- protected List<AbstractPreferenceController> getPreferenceControllers(Context context) {
+ protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
final List<AbstractPreferenceController> controllers = new ArrayList<>();
final Lifecycle lifecycle = getLifecycle();
final LockScreenNotificationPreferenceController notificationController =
@@ -114,7 +114,7 @@
}
@Override
- public List<AbstractPreferenceController> getPreferenceControllers(
+ public List<AbstractPreferenceController> createPreferenceControllers(
Context context) {
final List<AbstractPreferenceController> controllers = new ArrayList<>();
controllers.add(new LockScreenNotificationPreferenceController(context));
diff --git a/src/com/android/settings/security/ScreenPinningPreferenceController.java b/src/com/android/settings/security/ScreenPinningPreferenceController.java
index 305d076..a90746e 100644
--- a/src/com/android/settings/security/ScreenPinningPreferenceController.java
+++ b/src/com/android/settings/security/ScreenPinningPreferenceController.java
@@ -18,7 +18,6 @@
import android.content.Context;
import android.provider.Settings;
-import android.support.v7.preference.Preference;
import com.android.settings.R;
import com.android.settings.core.BasePreferenceController;
@@ -38,16 +37,10 @@
}
@Override
- public String getSummary() {
+ public CharSequence getSummary() {
return Settings.System.getInt(mContext.getContentResolver(),
Settings.System.LOCK_TO_APP_ENABLED, 0) != 0
- ? mContext.getString(R.string.switch_on_text)
- : mContext.getString(R.string.switch_off_text);
- }
-
- @Override
- public void updateState(Preference preference) {
- super.updateState(preference);
- preference.setSummary(getSummary());
+ ? mContext.getText(R.string.switch_on_text)
+ : mContext.getText(R.string.switch_off_text);
}
}
diff --git a/src/com/android/settings/security/SecuritySettings.java b/src/com/android/settings/security/SecuritySettings.java
index 7298cd6..e4d5ef5 100644
--- a/src/com/android/settings/security/SecuritySettings.java
+++ b/src/com/android/settings/security/SecuritySettings.java
@@ -48,6 +48,8 @@
public class SecuritySettings extends DashboardFragment {
private static final String TAG = "SecuritySettings";
+ private static final String SECURITY_CATEGORY = "security_category";
+ private static final String WORK_PROFILE_SECURITY_CATEGORY = "security_category_profile";
public static final int CHANGE_TRUST_AGENT_SETTINGS = 126;
public static final int UNIFY_LOCK_CONFIRM_DEVICE_REQUEST = 128;
@@ -75,7 +77,7 @@
}
@Override
- protected List<AbstractPreferenceController> getPreferenceControllers(Context context) {
+ protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
return buildPreferenceControllers(context, getLifecycle(), this /* host*/);
}
@@ -84,11 +86,11 @@
*/
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
- if (getPreferenceController(TrustAgentListPreferenceController.class)
+ if (use(TrustAgentListPreferenceController.class)
.handleActivityResult(requestCode, resultCode)) {
return;
}
- if (getPreferenceController(LockUnificationPreferenceController.class)
+ if (use(LockUnificationPreferenceController.class)
.handleActivityResult(requestCode, resultCode, data)) {
return;
}
@@ -96,16 +98,16 @@
}
void launchConfirmDeviceLockForUnification() {
- getPreferenceController(LockUnificationPreferenceController.class)
+ use(LockUnificationPreferenceController.class)
.launchConfirmDeviceLockForUnification();
}
void unifyUncompliantLocks() {
- getPreferenceController(LockUnificationPreferenceController.class).unifyUncompliantLocks();
+ use(LockUnificationPreferenceController.class).unifyUncompliantLocks();
}
void updateUnificationPreference() {
- getPreferenceController(LockUnificationPreferenceController.class).updateState(null);
+ use(LockUnificationPreferenceController.class).updateState(null);
}
private static List<AbstractPreferenceController> buildPreferenceControllers(Context context,
@@ -118,12 +120,17 @@
controllers.add(new ScreenPinningPreferenceController(context));
controllers.add(new SimLockPreferenceController(context));
controllers.add(new ShowPasswordPreferenceController(context));
- controllers.add(new FingerprintStatusPreferenceController(context));
controllers.add(new EncryptionStatusPreferenceController(context,
PREF_KEY_ENCRYPTION_SECURITY_PAGE));
controllers.add(new TrustAgentListPreferenceController(context, host, lifecycle));
- controllers.add(new LockScreenPreferenceController(context, lifecycle));
- controllers.add(new ChangeScreenLockPreferenceController(context, host));
+
+ final List<AbstractPreferenceController> securityPreferenceControllers = new ArrayList<>();
+ securityPreferenceControllers.add(new FingerprintStatusPreferenceController(context));
+ securityPreferenceControllers.add(new LockScreenPreferenceController(context, lifecycle));
+ securityPreferenceControllers.add(new ChangeScreenLockPreferenceController(context, host));
+ controllers.add(new PreferenceCategoryController(context, SECURITY_CATEGORY,
+ securityPreferenceControllers));
+ controllers.addAll(securityPreferenceControllers);
final List<AbstractPreferenceController> profileSecurityControllers = new ArrayList<>();
profileSecurityControllers.add(new ChangeProfileScreenLockPreferenceController(
@@ -132,7 +139,7 @@
profileSecurityControllers.add(new VisiblePatternProfilePreferenceController(
context, lifecycle));
profileSecurityControllers.add(new FingerprintProfileStatusPreferenceController(context));
- controllers.add(new PreferenceCategoryController(context, "security_category_profile",
+ controllers.add(new PreferenceCategoryController(context, WORK_PROFILE_SECURITY_CATEGORY,
profileSecurityControllers));
controllers.addAll(profileSecurityControllers);
@@ -157,7 +164,7 @@
}
@Override
- public List<AbstractPreferenceController> getPreferenceControllers(Context
+ public List<AbstractPreferenceController> createPreferenceControllers(Context
context) {
return buildPreferenceControllers(context, null /* lifecycle */,
null /* host*/);
diff --git a/src/com/android/settings/security/screenlock/ScreenLockSettings.java b/src/com/android/settings/security/screenlock/ScreenLockSettings.java
index 7a01aa2..2fa4124 100644
--- a/src/com/android/settings/security/screenlock/ScreenLockSettings.java
+++ b/src/com/android/settings/security/screenlock/ScreenLockSettings.java
@@ -60,7 +60,7 @@
}
@Override
- protected List<AbstractPreferenceController> getPreferenceControllers(Context context) {
+ protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
mLockPatternUtils = new LockPatternUtils(context);
return buildPreferenceControllers(context, this /* parent */, getLifecycle(),
mLockPatternUtils);
@@ -68,7 +68,7 @@
@Override
public void onOwnerInfoUpdated() {
- getPreferenceController(OwnerInfoPreferenceController.class).updateSummary();
+ use(OwnerInfoPreferenceController.class).updateSummary();
}
private static List<AbstractPreferenceController> buildPreferenceControllers(Context context,
@@ -99,7 +99,7 @@
}
@Override
- public List<AbstractPreferenceController> getPreferenceControllers(
+ public List<AbstractPreferenceController> createPreferenceControllers(
Context context) {
return buildPreferenceControllers(context, null /* parent */,
null /* lifecycle */, new LockPatternUtils(context));
diff --git a/src/com/android/settings/shortcut/CreateShortcut.java b/src/com/android/settings/shortcut/CreateShortcut.java
index 2bd9b761..b078740 100644
--- a/src/com/android/settings/shortcut/CreateShortcut.java
+++ b/src/com/android/settings/shortcut/CreateShortcut.java
@@ -71,7 +71,7 @@
@VisibleForTesting
Intent createResultIntent(Intent shortcutIntent, ResolveInfo resolveInfo,
CharSequence label) {
- shortcutIntent.setFlags(Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
+ shortcutIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
ShortcutManager sm = getSystemService(ShortcutManager.class);
ActivityInfo activityInfo = resolveInfo.activityInfo;
diff --git a/src/com/android/settings/slices/SliceBuilderUtils.java b/src/com/android/settings/slices/SliceBuilderUtils.java
index 11ff1c1..35bc07e 100644
--- a/src/com/android/settings/slices/SliceBuilderUtils.java
+++ b/src/com/android/settings/slices/SliceBuilderUtils.java
@@ -33,9 +33,6 @@
import com.android.settings.search.DatabaseIndexingUtils;
import com.android.settingslib.core.AbstractPreferenceController;
-import java.lang.reflect.Constructor;
-import java.lang.reflect.InvocationTargetException;
-
import androidx.app.slice.Slice;
import androidx.app.slice.builders.ListBuilder;
import androidx.app.slice.builders.ListBuilder.RowBuilder;
@@ -60,7 +57,7 @@
final Icon icon = Icon.createWithResource(context, sliceData.getIconResource());
final BasePreferenceController controller = getPreferenceController(context, sliceData);
- final String subtitleText = getSubtitleText(context, controller, sliceData);
+ final CharSequence subtitleText = getSubtitleText(context, controller, sliceData);
final RowBuilder builder = new RowBuilder(context, sliceData.getUri())
.setTitle(sliceData.getTitle())
@@ -87,46 +84,16 @@
public static BasePreferenceController getPreferenceController(Context context,
SliceData sliceData) {
try {
- return getController(context, sliceData, true /* isContextOnly */);
+ return BasePreferenceController.createInstance(context,
+ sliceData.getPreferenceController());
} catch (IllegalStateException e) {
// Do nothing
Log.d(TAG, "Could not find Context-only controller for preference controller: "
+ sliceData.getKey());
}
- return getController(context, sliceData, false /* isContextOnly */);
- }
-
- /**
- * Attempts to build a {@link BasePreferenceController} from {@param SliceData}.
- *
- * @param sliceData Backing data for the Slice.
- * @param contextOnlyCtor {@code true} when the constructor for the
- * {@link BasePreferenceController}
- * only takes a {@link Context}. Else the constructor will be ({@link
- * Context}, {@code String}.
- */
- private static BasePreferenceController getController(Context context, SliceData sliceData,
- boolean contextOnlyCtor) {
- try {
- Class<?> clazz = Class.forName(sliceData.getPreferenceController());
- Constructor<?> preferenceConstructor;
- Object[] params;
-
- if (contextOnlyCtor) {
- preferenceConstructor = clazz.getConstructor(Context.class);
- params = new Object[]{context};
- } else {
- preferenceConstructor = clazz.getConstructor(Context.class, String.class);
- params = new Object[]{context, sliceData.getKey()};
- }
-
- return (BasePreferenceController) preferenceConstructor.newInstance(params);
- } catch (ClassNotFoundException | NoSuchMethodException | InstantiationException |
- IllegalArgumentException | InvocationTargetException | IllegalAccessException e) {
- throw new IllegalStateException(
- "Invalid preference controller: " + sliceData.getPreferenceController(), e);
- }
+ return BasePreferenceController.createInstance(context, sliceData.getPreferenceController(),
+ sliceData.getKey());
}
private static void addToggleAction(Context context, RowBuilder builder, boolean isChecked,
@@ -153,9 +120,9 @@
}
@VisibleForTesting
- static String getSubtitleText(Context context, AbstractPreferenceController controller,
+ static CharSequence getSubtitleText(Context context, AbstractPreferenceController controller,
SliceData sliceData) {
- String summaryText = sliceData.getSummary();
+ CharSequence summaryText = sliceData.getSummary();
if (isValidSummary(context, summaryText)) {
return summaryText;
}
@@ -171,13 +138,14 @@
return sliceData.getScreenTitle();
}
- private static boolean isValidSummary(Context context, String summary) {
- if (summary == null || TextUtils.isEmpty(summary.trim())) {
+ private static boolean isValidSummary(Context context, CharSequence summary) {
+ if (summary == null || TextUtils.isEmpty(summary.toString().trim())) {
return false;
}
- final String placeHolder = context.getString(R.string.summary_placeholder);
- final String doublePlaceHolder = context.getString(R.string.summary_two_lines_placeholder);
+ final CharSequence placeHolder = context.getText(R.string.summary_placeholder);
+ final CharSequence doublePlaceHolder =
+ context.getText(R.string.summary_two_lines_placeholder);
return !(TextUtils.equals(summary, placeHolder)
|| TextUtils.equals(summary, doublePlaceHolder));
diff --git a/src/com/android/settings/slices/SliceDataConverter.java b/src/com/android/settings/slices/SliceDataConverter.java
index e5a21e4..a023b16 100644
--- a/src/com/android/settings/slices/SliceDataConverter.java
+++ b/src/com/android/settings/slices/SliceDataConverter.java
@@ -30,7 +30,7 @@
import com.android.settings.overlay.FeatureFactory;
import com.android.settings.search.DatabaseIndexingUtils;
import com.android.settings.search.Indexable.SearchIndexProvider;
-import com.android.settings.search.XmlParserUtils;
+import com.android.settings.core.PreferenceXmlParserUtils;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
@@ -151,7 +151,7 @@
final int outerDepth = parser.getDepth();
final AttributeSet attrs = Xml.asAttributeSet(parser);
- final String screenTitle = XmlParserUtils.getDataTitle(mContext, attrs);
+ final String screenTitle = PreferenceXmlParserUtils.getDataTitle(mContext, attrs);
// TODO (b/67996923) Investigate if we need headers for Slices, since they never
// correspond to an actual setting.
@@ -168,15 +168,15 @@
// TODO (b/67996923) This will not work if preferences have nested intents:
// <pref ....>
// <intent action="blab"/> </pref>
- controllerClassName = XmlParserUtils.getController(mContext, attrs);
+ controllerClassName = PreferenceXmlParserUtils.getController(mContext, attrs);
if (TextUtils.isEmpty(controllerClassName)) {
continue;
}
- title = XmlParserUtils.getDataTitle(mContext, attrs);
- key = XmlParserUtils.getDataKey(mContext, attrs);
- iconResId = XmlParserUtils.getDataIcon(mContext, attrs);
- summary = XmlParserUtils.getDataSummary(mContext, attrs);
+ title = PreferenceXmlParserUtils.getDataTitle(mContext, attrs);
+ key = PreferenceXmlParserUtils.getDataKey(mContext, attrs);
+ iconResId = PreferenceXmlParserUtils.getDataIcon(mContext, attrs);
+ summary = PreferenceXmlParserUtils.getDataSummary(mContext, attrs);
xmlSlice = new SliceData.Builder()
.setKey(key)
diff --git a/src/com/android/settings/system/ResetDashboardFragment.java b/src/com/android/settings/system/ResetDashboardFragment.java
index b7b6b77..03543cc 100644
--- a/src/com/android/settings/system/ResetDashboardFragment.java
+++ b/src/com/android/settings/system/ResetDashboardFragment.java
@@ -52,7 +52,7 @@
}
@Override
- protected List<AbstractPreferenceController> getPreferenceControllers(Context context) {
+ protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
return buildPreferenceControllers(context, getLifecycle());
}
@@ -79,7 +79,8 @@
}
@Override
- public List<AbstractPreferenceController> getPreferenceControllers(Context context) {
+ public List<AbstractPreferenceController> createPreferenceControllers(
+ Context context) {
return buildPreferenceControllers(context, null /* lifecycle */);
}
};
diff --git a/src/com/android/settings/system/SystemDashboardFragment.java b/src/com/android/settings/system/SystemDashboardFragment.java
index deabf54..1556659 100644
--- a/src/com/android/settings/system/SystemDashboardFragment.java
+++ b/src/com/android/settings/system/SystemDashboardFragment.java
@@ -26,12 +26,9 @@
import com.android.settings.R;
import com.android.settings.backup.BackupSettingsActivityPreferenceController;
import com.android.settings.dashboard.DashboardFragment;
-import com.android.settings.gestures.GesturesSettingPreferenceController;
import com.android.settings.search.BaseSearchIndexProvider;
import com.android.settings.search.Indexable;
-import com.android.settingslib.core.AbstractPreferenceController;
-import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
@@ -72,20 +69,6 @@
return R.string.help_url_system_dashboard;
}
- @Override
- protected List<AbstractPreferenceController> getPreferenceControllers(Context context) {
- return buildPreferenceControllers(context);
- }
-
- private static List<AbstractPreferenceController> buildPreferenceControllers(Context context) {
- final List<AbstractPreferenceController> controllers = new ArrayList<>();
- controllers.add(new SystemUpdatePreferenceController(context));
- controllers.add(new AdditionalSystemUpdatePreferenceController(context));
- controllers.add(new BackupSettingsActivityPreferenceController(context));
- controllers.add(new GesturesSettingPreferenceController(context));
- return controllers;
- }
-
private int getVisiblePreferenceCount(PreferenceGroup group) {
int visibleCount = 0;
for (int i = 0; i < group.getPreferenceCount(); i++) {
@@ -113,12 +96,6 @@
}
@Override
- public List<AbstractPreferenceController> getPreferenceControllers(
- Context context) {
- return buildPreferenceControllers(context);
- }
-
- @Override
public List<String> getNonIndexableKeys(Context context) {
List<String> keys = super.getNonIndexableKeys(context);
keys.add((new BackupSettingsActivityPreferenceController(
diff --git a/src/com/android/settings/system/SystemUpdatePreferenceController.java b/src/com/android/settings/system/SystemUpdatePreferenceController.java
index 20f43ef..80d4ecb 100644
--- a/src/com/android/settings/system/SystemUpdatePreferenceController.java
+++ b/src/com/android/settings/system/SystemUpdatePreferenceController.java
@@ -83,21 +83,16 @@
}
@Override
- public void updateState(Preference preference) {
- preference.setSummary(getSummary());
- }
-
- @Override
- public String getSummary() {
+ public CharSequence getSummary() {
final Bundle updateInfo = mUpdateManager.retrieveSystemUpdateInfo();
- String summary = mContext.getString(R.string.android_version_summary,
+ CharSequence summary = mContext.getString(R.string.android_version_summary,
Build.VERSION.RELEASE);
switch (updateInfo.getInt(SystemUpdateManager.KEY_STATUS)) {
case SystemUpdateManager.STATUS_WAITING_DOWNLOAD:
case SystemUpdateManager.STATUS_IN_PROGRESS:
case SystemUpdateManager.STATUS_WAITING_INSTALL:
case SystemUpdateManager.STATUS_WAITING_REBOOT:
- summary = mContext.getString(R.string.android_version_pending_update_summary);
+ summary = mContext.getText(R.string.android_version_pending_update_summary);
break;
case SystemUpdateManager.STATUS_UNKNOWN:
Log.d(TAG, "Update statue unknown");
diff --git a/src/com/android/settings/webview/WebViewAppPicker.java b/src/com/android/settings/webview/WebViewAppPicker.java
index 0e9fc39..a5fef46 100644
--- a/src/com/android/settings/webview/WebViewAppPicker.java
+++ b/src/com/android/settings/webview/WebViewAppPicker.java
@@ -30,9 +30,9 @@
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.settings.R;
-import com.android.settings.applications.defaultapps.DefaultAppInfo;
import com.android.settings.applications.defaultapps.DefaultAppPickerFragment;
import com.android.settings.wrapper.UserPackageWrapper;
+import com.android.settingslib.applications.DefaultAppInfo;
import com.android.settingslib.wrapper.PackageManagerWrapper;
import java.util.ArrayList;
diff --git a/src/com/android/settings/widget/HighlightablePreferenceGroupAdapter.java b/src/com/android/settings/widget/HighlightablePreferenceGroupAdapter.java
index e1999ef..d2deda1 100644
--- a/src/com/android/settings/widget/HighlightablePreferenceGroupAdapter.java
+++ b/src/com/android/settings/widget/HighlightablePreferenceGroupAdapter.java
@@ -16,31 +16,81 @@
package com.android.settings.widget;
+import static com.android.settings.SettingsActivity.EXTRA_FRAGMENT_ARG_KEY;
+
+import android.animation.Animator;
+import android.animation.AnimatorListenerAdapter;
+import android.animation.ArgbEvaluator;
+import android.animation.ValueAnimator;
import android.content.Context;
+import android.graphics.Color;
+import android.os.Bundle;
import android.support.annotation.VisibleForTesting;
import android.support.v7.preference.PreferenceGroup;
import android.support.v7.preference.PreferenceGroupAdapter;
+import android.support.v7.preference.PreferenceScreen;
import android.support.v7.preference.PreferenceViewHolder;
import android.support.v7.widget.RecyclerView;
import android.text.TextUtils;
+import android.util.Log;
import android.util.TypedValue;
import android.view.View;
import com.android.settings.R;
+import com.android.settings.SettingsPreferenceFragment;
public class HighlightablePreferenceGroupAdapter extends PreferenceGroupAdapter {
+ private static final String TAG = "HighlightableAdapter";
@VisibleForTesting
static final long DELAY_HIGHLIGHT_DURATION_MILLIS = 600L;
- private static final long HIGHLIGHT_DURATION = 5000L;
+ private static final long HIGHLIGHT_DURATION = 15000L;
+ private static final long HIGHLIGHT_FADE_OUT_DURATION = 500L;
+ private static final long HIGHLIGHT_FADE_IN_DURATION = 200L;
- private final int mHighlightColor;
+ @VisibleForTesting
+ final int mHighlightColor;
+ @VisibleForTesting
+ boolean mFadeInAnimated;
+
private final int mNormalBackgroundRes;
private final String mHighlightKey;
-
private boolean mHighlightRequested;
private int mHighlightPosition = RecyclerView.NO_POSITION;
+
+ /**
+ * Tries to override initial expanded child count.
+ * <p/>
+ * Initial expanded child count will be ignored if:
+ * 1. fragment contains request to highlight a particular row.
+ * 2. count value is invalid.
+ */
+ public static void adjustInitialExpandedChildCount(SettingsPreferenceFragment host) {
+ if (host == null) {
+ return;
+ }
+ final PreferenceScreen screen = host.getPreferenceScreen();
+ if (screen == null) {
+ return;
+ }
+ final Bundle arguments = host.getArguments();
+ if (arguments != null) {
+ final String highlightKey = arguments.getString(EXTRA_FRAGMENT_ARG_KEY);
+ if (!TextUtils.isEmpty(highlightKey)) {
+ // Has highlight row - expand everything
+ screen.setInitialExpandedChildrenCount(Integer.MAX_VALUE);
+ return;
+ }
+ }
+
+ final int initialCount = host.getInitialExpandedChildCount();
+ if (initialCount <= 0) {
+ return;
+ }
+ screen.setInitialExpandedChildrenCount(initialCount);
+ }
+
public HighlightablePreferenceGroupAdapter(PreferenceGroup preferenceGroup, String key,
boolean highlightRequested) {
super(preferenceGroup);
@@ -64,14 +114,11 @@
void updateBackground(PreferenceViewHolder holder, int position) {
View v = holder.itemView;
if (position == mHighlightPosition) {
- v.setBackgroundColor(mHighlightColor);
- v.setTag(R.id.preference_highlighted, true);
- v.postDelayed(() -> {
- mHighlightPosition = RecyclerView.NO_POSITION;
- removeHighlightBackground(v);
- }, HIGHLIGHT_DURATION);
+ // This position should be highlighted. If it's highlighted before - skip animation.
+ addHighlightBackground(v, !mFadeInAnimated);
} else if (Boolean.TRUE.equals(v.getTag(R.id.preference_highlighted))) {
- removeHighlightBackground(v);
+ // View with highlight is reused for a view that should not have highlight
+ removeHighlightBackground(v, false /* animate */);
}
}
@@ -85,7 +132,7 @@
return;
}
mHighlightRequested = true;
- recyclerView.getLayoutManager().scrollToPosition(position);
+ recyclerView.smoothScrollToPosition(position);
mHighlightPosition = position;
notifyItemChanged(position);
}, DELAY_HIGHLIGHT_DURATION_MILLIS);
@@ -95,8 +142,68 @@
return mHighlightRequested;
}
- private void removeHighlightBackground(View v) {
- v.setBackgroundResource(mNormalBackgroundRes);
+ @VisibleForTesting
+ void requestRemoveHighlightDelayed(View v) {
+ v.postDelayed(() -> {
+ mHighlightPosition = RecyclerView.NO_POSITION;
+ removeHighlightBackground(v, true /* animate */);
+ }, HIGHLIGHT_DURATION);
+ }
+
+ private void addHighlightBackground(View v, boolean animate) {
+ v.setTag(R.id.preference_highlighted, true);
+ if (!animate) {
+ v.setBackgroundColor(mHighlightColor);
+ Log.d(TAG, "AddHighlight: Not animation requested - setting highlight background");
+ requestRemoveHighlightDelayed(v);
+ return;
+ }
+ mFadeInAnimated = true;
+ final int colorFrom = Color.WHITE;
+ final int colorTo = mHighlightColor;
+ final ValueAnimator fadeInLoop = ValueAnimator.ofObject(
+ new ArgbEvaluator(), colorFrom, colorTo);
+ fadeInLoop.setDuration(HIGHLIGHT_FADE_IN_DURATION);
+ fadeInLoop.addUpdateListener(
+ animator -> v.setBackgroundColor((int) animator.getAnimatedValue()));
+ fadeInLoop.setRepeatMode(ValueAnimator.REVERSE);
+ fadeInLoop.setRepeatCount(4);
+ fadeInLoop.start();
+ Log.d(TAG, "AddHighlight: starting fade in animation");
+ requestRemoveHighlightDelayed(v);
+ }
+
+ private void removeHighlightBackground(View v, boolean animate) {
+ if (!animate) {
+ v.setTag(R.id.preference_highlighted, false);
+ v.setBackgroundResource(mNormalBackgroundRes);
+ Log.d(TAG, "RemoveHighlight: No animation requested - setting normal background");
+ return;
+ }
+
+ if (!Boolean.TRUE.equals(v.getTag(R.id.preference_highlighted))) {
+ // Not highlighted, no-op
+ Log.d(TAG, "RemoveHighlight: Not highlighted - skipping");
+ return;
+ }
+ int colorFrom = mHighlightColor;
+ int colorTo = Color.WHITE;
+
v.setTag(R.id.preference_highlighted, false);
+ final ValueAnimator colorAnimation = ValueAnimator.ofObject(
+ new ArgbEvaluator(), colorFrom, colorTo);
+ colorAnimation.setDuration(HIGHLIGHT_FADE_OUT_DURATION);
+ colorAnimation.addUpdateListener(
+ animator -> v.setBackgroundColor((int) animator.getAnimatedValue()));
+ colorAnimation.addListener(new AnimatorListenerAdapter() {
+ @Override
+ public void onAnimationEnd(Animator animation) {
+ // Animation complete - the background is now white. Change to mNormalBackgroundRes
+ // so it is white and has ripple on touch.
+ v.setBackgroundResource(mNormalBackgroundRes);
+ }
+ });
+ colorAnimation.start();
+ Log.d(TAG, "Starting fade out animation");
}
}
diff --git a/src/com/android/settings/widget/RadioButtonPickerFragment.java b/src/com/android/settings/widget/RadioButtonPickerFragment.java
index b3e8746..069d461 100644
--- a/src/com/android/settings/widget/RadioButtonPickerFragment.java
+++ b/src/com/android/settings/widget/RadioButtonPickerFragment.java
@@ -17,7 +17,6 @@
package com.android.settings.widget;
import android.content.Context;
-import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.os.UserHandle;
import android.os.UserManager;
@@ -34,6 +33,7 @@
import com.android.settings.R;
import com.android.settings.Utils;
import com.android.settings.core.InstrumentedPreferenceFragment;
+import com.android.settingslib.widget.CandidateInfo;
import java.util.List;
import java.util.Map;
@@ -223,19 +223,4 @@
return 0;
}
- public static abstract class CandidateInfo {
-
- public final boolean enabled;
-
- public CandidateInfo(boolean enabled) {
- this.enabled = enabled;
- }
-
- public abstract CharSequence loadLabel();
-
- public abstract Drawable loadIcon();
-
- public abstract String getKey();
- }
-
}
diff --git a/src/com/android/settings/wifi/ConfigureWifiSettings.java b/src/com/android/settings/wifi/ConfigureWifiSettings.java
index 1607b74..b7e01c8 100644
--- a/src/com/android/settings/wifi/ConfigureWifiSettings.java
+++ b/src/com/android/settings/wifi/ConfigureWifiSettings.java
@@ -23,7 +23,6 @@
import android.net.NetworkInfo;
import android.net.NetworkScoreManager;
import android.net.wifi.WifiManager;
-import android.os.Bundle;
import android.provider.SearchIndexableResource;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
@@ -44,7 +43,6 @@
private static final String TAG = "ConfigureWifiSettings";
- public static final String KEY_WIFI_CONFIGURE = "wifi_configure_settings_screen";
public static final String KEY_IP_ADDRESS = "current_ip_address";
private WifiWakeupPreferenceController mWifiWakeupPreferenceController;
@@ -61,13 +59,12 @@
}
@Override
- public void onCreate(Bundle icicle) {
- super.onCreate(icicle);
+ public int getInitialExpandedChildCount() {
int tileLimit = 2;
if (mUseOpenWifiPreferenceController.isAvailable()) {
tileLimit++;
}
- getPreferenceScreen().setInitialExpandedChildrenCount(tileLimit);
+ return tileLimit;
}
@Override
@@ -76,7 +73,7 @@
}
@Override
- protected List<AbstractPreferenceController> getPreferenceControllers(Context context) {
+ protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
final NetworkScoreManagerWrapper networkScoreManagerWrapper =
new NetworkScoreManagerWrapper(context.getSystemService(NetworkScoreManager.class));
mWifiWakeupPreferenceController = new WifiWakeupPreferenceController(context);
diff --git a/src/com/android/settings/wifi/WifiConfigController.java b/src/com/android/settings/wifi/WifiConfigController.java
index 5e5d5ff..d7b4299 100644
--- a/src/com/android/settings/wifi/WifiConfigController.java
+++ b/src/com/android/settings/wifi/WifiConfigController.java
@@ -517,6 +517,7 @@
mAccessPoint.getSsidStr());
} else {
config.networkId = mAccessPoint.getConfig().networkId;
+ config.hiddenSSID = mAccessPoint.getConfig().hiddenSSID;
}
config.shared = mSharedCheckBox.isChecked();
diff --git a/src/com/android/settings/wifi/WifiSettings.java b/src/com/android/settings/wifi/WifiSettings.java
index 9fbeabe..3972b85 100644
--- a/src/com/android/settings/wifi/WifiSettings.java
+++ b/src/com/android/settings/wifi/WifiSettings.java
@@ -353,32 +353,6 @@
}
/**
- * Only update the AP list if there are not any APs currently shown.
- *
- * <p>Thus forceUpdate will only be called during cold start or when toggling between wifi on
- * and off. In other use cases, the previous APs will remain until the next update is received
- * from {@link WifiTracker}.
- */
- private void conditionallyForceUpdateAPs() {
- if (mAccessPointsPreferenceCategory.getPreferenceCount() > 0
- && mAccessPointsPreferenceCategory.getPreference(0) instanceof
- AccessPointPreference) {
- // Make sure we don't update due to callbacks initiated by sticky broadcasts in
- // WifiTracker.
- Log.d(TAG, "Did not force update APs due to existing APs displayed");
- getView().removeCallbacks(mUpdateAccessPointsRunnable);
- return;
- }
- setProgressBarVisible(true);
- mWifiTracker.forceUpdate();
- if (isVerboseLoggingEnabled()) {
- Log.i(TAG, "WifiSettings force update APs: " + mWifiTracker.getAccessPoints());
- }
- getView().removeCallbacks(mUpdateAccessPointsRunnable);
- updateAccessPointPreferences();
- }
-
- /**
* @return new WifiEnabler or null (as overridden by WifiSettingsForSetupWizard)
*/
private WifiEnabler createWifiEnabler() {
@@ -682,7 +656,7 @@
final int wifiState = mWifiManager.getWifiState();
switch (wifiState) {
case WifiManager.WIFI_STATE_ENABLED:
- conditionallyForceUpdateAPs();
+ updateAccessPointPreferences();
break;
case WifiManager.WIFI_STATE_ENABLING:
diff --git a/src/com/android/settings/wifi/details/WifiNetworkDetailsFragment.java b/src/com/android/settings/wifi/details/WifiNetworkDetailsFragment.java
index 9a5430b..b2e56b9 100644
--- a/src/com/android/settings/wifi/details/WifiNetworkDetailsFragment.java
+++ b/src/com/android/settings/wifi/details/WifiNetworkDetailsFragment.java
@@ -124,7 +124,7 @@
}
@Override
- protected List<AbstractPreferenceController> getPreferenceControllers(Context context) {
+ protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
final List<AbstractPreferenceController> controllers = new ArrayList<>();
ConnectivityManager cm = context.getSystemService(ConnectivityManager.class);
mWifiDetailPreferenceController = WifiDetailPreferenceController.newInstance(
diff --git a/src/com/android/settings/wifi/p2p/WifiP2pSettings.java b/src/com/android/settings/wifi/p2p/WifiP2pSettings.java
index fa276d9..b8710c9 100644
--- a/src/com/android/settings/wifi/p2p/WifiP2pSettings.java
+++ b/src/com/android/settings/wifi/p2p/WifiP2pSettings.java
@@ -168,7 +168,7 @@
}
@Override
- protected List<AbstractPreferenceController> getPreferenceControllers(Context context) {
+ protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
final List<AbstractPreferenceController> controllers = new ArrayList<>();
mPersistentCategoryController =
new P2pPersistentCategoryPreferenceController(context);
diff --git a/src/com/android/settings/wifi/tether/WifiTetherSettings.java b/src/com/android/settings/wifi/tether/WifiTetherSettings.java
index e9533b1..996c73c 100644
--- a/src/com/android/settings/wifi/tether/WifiTetherSettings.java
+++ b/src/com/android/settings/wifi/tether/WifiTetherSettings.java
@@ -125,7 +125,7 @@
}
@Override
- protected List<AbstractPreferenceController> getPreferenceControllers(Context context) {
+ protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
final List<AbstractPreferenceController> controllers = new ArrayList<>();
mSSIDPreferenceController = new WifiTetherSSIDPreferenceController(context, this);
mPasswordPreferenceController = new WifiTetherPasswordPreferenceController(context, this);
@@ -174,11 +174,11 @@
}
private void updateDisplayWithNewConfig() {
- getPreferenceController(WifiTetherSSIDPreferenceController.class)
+ use(WifiTetherSSIDPreferenceController.class)
.updateDisplay();
- getPreferenceController(WifiTetherPasswordPreferenceController.class)
+ use(WifiTetherPasswordPreferenceController.class)
.updateDisplay();
- getPreferenceController(WifiTetherApBandPreferenceController.class)
+ use(WifiTetherApBandPreferenceController.class)
.updateDisplay();
}
diff --git a/src/com/android/settings/wrapper/UsbManagerWrapper.java b/src/com/android/settings/wrapper/UsbManagerWrapper.java
new file mode 100644
index 0000000..5626660
--- /dev/null
+++ b/src/com/android/settings/wrapper/UsbManagerWrapper.java
@@ -0,0 +1,34 @@
+/*
+ * 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.wrapper;
+
+import android.hardware.usb.UsbManager;
+
+public class UsbManagerWrapper {
+ private UsbManager mUsbManager;
+
+ public UsbManagerWrapper(UsbManager manager) {
+ mUsbManager = manager;
+ }
+
+ public long getCurrentFunctions() {
+ return mUsbManager.getCurrentFunctions();
+ }
+
+ public long usbFunctionsFromString(String str) {
+ return UsbManager.usbFunctionsFromString(str);
+ }
+}
diff --git a/src/com/android/settings/wrapper/UserManagerWrapper.java b/src/com/android/settings/wrapper/UserManagerWrapper.java
index 4b4d2f4..8c3a01d 100644
--- a/src/com/android/settings/wrapper/UserManagerWrapper.java
+++ b/src/com/android/settings/wrapper/UserManagerWrapper.java
@@ -17,6 +17,7 @@
package com.android.settings.wrapper;
import android.content.pm.UserInfo;
+import android.os.UserHandle;
import android.os.UserManager;
import java.util.List;
@@ -45,4 +46,22 @@
public List<UserInfo> getProfiles(int userHandle) {
return mUserManager.getProfiles(userHandle);
}
+
+ public boolean isUsbFileTransferRestricted() {
+ return mUserManager.hasUserRestriction(UserManager.DISALLOW_USB_FILE_TRANSFER);
+ }
+
+ public boolean isUsbTetheringRestricted() {
+ return mUserManager.hasUserRestriction(UserManager.DISALLOW_CONFIG_TETHERING);
+ }
+
+ public boolean isUsbFileTransferRestrictedBySystem() {
+ return mUserManager.hasBaseUserRestriction(
+ UserManager.DISALLOW_USB_FILE_TRANSFER, UserHandle.of(UserHandle.myUserId()));
+ }
+
+ public boolean isUsbTetheringRestrictedBySystem() {
+ return mUserManager.hasBaseUserRestriction(
+ UserManager.DISALLOW_CONFIG_TETHERING, UserHandle.of(UserHandle.myUserId()));
+ }
}
diff --git a/tests/anomaly-tester/Android.mk b/tests/anomaly-tester/Android.mk
index ade37db..9a0a875 100644
--- a/tests/anomaly-tester/Android.mk
+++ b/tests/anomaly-tester/Android.mk
@@ -4,7 +4,7 @@
LOCAL_MODULE_TAGS := tests
LOCAL_CERTIFICATE := platform
-LOCAL_JAVA_LIBRARIES := android.test.runner bouncycastle
+LOCAL_JAVA_LIBRARIES := android.test.runner
LOCAL_STATIC_JAVA_LIBRARIES := \
android-support-test \
@@ -17,9 +17,10 @@
LOCAL_PROGUARD_ENABLED := disabled
LOCAL_PACKAGE_NAME := AnomalyTester
+LOCAL_PRIVATE_PLATFORM_APIS := true
LOCAL_INSTRUMENTATION_FOR := Settings
LOCAL_USE_AAPT2 := true
-include $(BUILD_PACKAGE)
\ No newline at end of file
+include $(BUILD_PACKAGE)
diff --git a/tests/robotests/assets/grandfather_not_in_search_index_provider_registry b/tests/robotests/assets/grandfather_not_in_search_index_provider_registry
index 666b224..be3507c 100644
--- a/tests/robotests/assets/grandfather_not_in_search_index_provider_registry
+++ b/tests/robotests/assets/grandfather_not_in_search_index_provider_registry
@@ -1,2 +1,2 @@
com.android.settings.display.ScreenZoomPreferenceFragmentForSetupWizard
-com.android.settings.search.indexing.FakeSettingsFragment
\ No newline at end of file
+com.android.settings.search.indexing.FakeSettingsFragment
diff --git a/tests/robotests/assets/grandfather_not_sharing_pref_controllers_with_search_provider b/tests/robotests/assets/grandfather_not_sharing_pref_controllers_with_search_provider
index a71b040..b329072 100644
--- a/tests/robotests/assets/grandfather_not_sharing_pref_controllers_with_search_provider
+++ b/tests/robotests/assets/grandfather_not_sharing_pref_controllers_with_search_provider
@@ -1 +1 @@
-com.android.settings.fuelgauge.PowerUsageSummary
\ No newline at end of file
+com.android.settings.fuelgauge.PowerUsageSummary
diff --git a/tests/robotests/res/values-mcc999/config.xml b/tests/robotests/res/values-mcc999/config.xml
index 01bfa51..788c593 100644
--- a/tests/robotests/res/values-mcc999/config.xml
+++ b/tests/robotests/res/values-mcc999/config.xml
@@ -47,7 +47,6 @@
<bool name="config_show_trust_agent_click_intent">false</bool>
<bool name="config_show_wallpaper_attribution">false</bool>
<bool name="config_show_default_home">false</bool>
- <bool name="config_show_accessibility_shortcut_preference">false</bool>
<bool name="config_show_assist_and_voice_input">false</bool>
<bool name="config_show_phone_language">false</bool>
<bool name="config_show_virtual_keyboard_pref">false</bool>
@@ -55,8 +54,6 @@
<bool name="config_show_tts_settings_summary">false</bool>
<bool name="config_show_pointer_speed">false</bool>
<bool name="config_show_vibrate_input_devices">false</bool>
- <bool name="config_show_color_correction_preference">false</bool>
- <bool name="config_show_color_inversion_preference">false</bool>
<bool name="config_show_system_update_settings">false</bool>
<bool name="config_wifi_support_connected_mac_randomization">false</bool>
<bool name="config_show_device_model">false</bool>
diff --git a/tests/robotests/res/xml-mcc998/location_settings.xml b/tests/robotests/res/xml-mcc998/location_settings.xml
new file mode 100644
index 0000000..993af86
--- /dev/null
+++ b/tests/robotests/res/xml-mcc998/location_settings.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:settings="http://schemas.android.com/apk/res-auto"
+ android:key="fake_title_key"
+ android:title="screen_title"
+ settings:controller="com.android.settings.slices.FakePreferenceController">
+
+ <Preference
+ android:key="key"
+ android:title="title"
+ android:icon="@drawable/ic_android"
+ android:summary="summary"
+ settings:controller="com.android.settings.core.BadPreferenceController"/>
+
+</PreferenceScreen>
\ No newline at end of file
diff --git a/tests/robotests/res/xml-mcc999/location_settings.xml b/tests/robotests/res/xml-mcc999/location_settings.xml
index de77bfa..5619c77 100644
--- a/tests/robotests/res/xml-mcc999/location_settings.xml
+++ b/tests/robotests/res/xml-mcc999/location_settings.xml
@@ -17,7 +17,8 @@
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:settings="http://schemas.android.com/apk/res-auto"
android:key="fake_title_key"
- android:title="screen_title">
+ android:title="screen_title"
+ settings:controller="com.android.settings.slices.FakePreferenceController">
<Preference
android:key="key"
diff --git a/tests/robotests/src/com/android/internal/accessibility/AccessibilityShortcutController.java b/tests/robotests/src/com/android/internal/accessibility/AccessibilityShortcutController.java
deleted file mode 100644
index aae2f8d..0000000
--- a/tests/robotests/src/com/android/internal/accessibility/AccessibilityShortcutController.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.internal.accessibility;
-
-import android.content.ComponentName;
-
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * Fake controller to make robolectric test compile. Should be removed when Robolectric supports
- * API 25.
- */
-public class AccessibilityShortcutController {
-
- public static Map<ComponentName, AccessibilityShortcutController.ToggleableFrameworkFeatureInfo>
- getFrameworkShortcutFeaturesMap() {
- return new HashMap<>();
- }
-
- public static class ToggleableFrameworkFeatureInfo {
- private String mSettingKey;
-
- public String getSettingKey() {
- return mSettingKey;
- }
- }
-}
diff --git a/tests/robotests/src/com/android/settings/DisplaySettingsTest.java b/tests/robotests/src/com/android/settings/DisplaySettingsTest.java
index 6f34a2e..6274373 100644
--- a/tests/robotests/src/com/android/settings/DisplaySettingsTest.java
+++ b/tests/robotests/src/com/android/settings/DisplaySettingsTest.java
@@ -32,7 +32,7 @@
fragment.getPreferenceScreenResId());
final List<String> preferenceKeys = new ArrayList<>();
- for (AbstractPreferenceController controller : fragment.getPreferenceControllers(context)) {
+ for (AbstractPreferenceController controller : fragment.createPreferenceControllers(context)) {
preferenceKeys.add(controller.getPreferenceKey());
}
// Nightmode is currently hidden
diff --git a/tests/robotests/src/com/android/settings/MasterClearTest.java b/tests/robotests/src/com/android/settings/MasterClearTest.java
index c9efe8e..7d76444 100644
--- a/tests/robotests/src/com/android/settings/MasterClearTest.java
+++ b/tests/robotests/src/com/android/settings/MasterClearTest.java
@@ -24,6 +24,7 @@
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
@@ -33,7 +34,6 @@
import android.accounts.Account;
import android.accounts.AccountManager;
import android.app.Activity;
-import android.app.Fragment;
import android.content.ComponentName;
import android.content.ContentResolver;
import android.content.Context;
@@ -41,11 +41,11 @@
import android.content.pm.ActivityInfo;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
-import android.os.Bundle;
import android.provider.Settings;
import android.view.LayoutInflater;
import android.view.View;
-import android.widget.CheckBox;
+import android.view.ViewTreeObserver;
+import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.ScrollView;
@@ -61,7 +61,6 @@
import org.mockito.MockitoAnnotations;
import org.robolectric.Robolectric;
import org.robolectric.annotation.Config;
-import org.robolectric.shadows.ShadowAccountManager;
import org.robolectric.shadows.ShadowActivity;
@RunWith(SettingsRobolectricTestRunner.class)
@@ -77,8 +76,6 @@
private static final String TEST_ACCOUNT_NAME = "test@example.com";
@Mock
- private MasterClear mMasterClear;
- @Mock
private ScrollView mScrollView;
@Mock
private LinearLayout mLinearLayout;
@@ -95,8 +92,8 @@
@Mock
private Intent mMockIntent;
+ private MasterClear mMasterClear;
private ShadowActivity mShadowActivity;
- private ShadowAccountManager mShadowAccountManager;
private Activity mActivity;
private View mContentView;
@@ -355,6 +352,7 @@
assertEquals(TEST_CONFIRMATION_CLASS, actualIntent.getComponent().getClassName());
}
+ @Test
public void testShowAccountCredentialConfirmation() {
// Finally mock out the startActivityForResultCall
doNothing().when(mMasterClear)
@@ -371,6 +369,19 @@
assertThat(mMasterClear.isValidRequestCode(0)).isFalse();
}
+ @Test
+ public void testOnGlobalLayout_shouldNotRemoveListener() {
+ final ViewTreeObserver viewTreeObserver = mock(ViewTreeObserver.class);
+ mMasterClear.mScrollView = mScrollView;
+ mMasterClear.mInitiateButton = mock(Button.class);
+ doReturn(true).when(mMasterClear).hasReachedBottom(any());
+ when(mScrollView.getViewTreeObserver()).thenReturn(viewTreeObserver);
+
+ mMasterClear.onGlobalLayout();
+
+ verify(viewTreeObserver, never()).removeOnGlobalLayoutListener(mMasterClear);
+ }
+
private void initScrollView(int height, int scrollY, int childBottom) {
when(mScrollView.getHeight()).thenReturn(height);
when(mScrollView.getScrollY()).thenReturn(scrollY);
diff --git a/tests/robotests/src/com/android/settings/accessibility/AccessibilitySettingsTest.java b/tests/robotests/src/com/android/settings/accessibility/AccessibilitySettingsTest.java
index 96ce183..fb32da1 100644
--- a/tests/robotests/src/com/android/settings/accessibility/AccessibilitySettingsTest.java
+++ b/tests/robotests/src/com/android/settings/accessibility/AccessibilitySettingsTest.java
@@ -16,137 +16,35 @@
package com.android.settings.accessibility;
-import static com.google.common.truth.Truth.assertThat;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.spy;
-
import android.content.Context;
-import android.support.v7.preference.Preference;
import com.android.settings.R;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
import com.android.settings.TestConfig;
import com.android.settings.testutils.XmlTestUtils;
-
-import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
-import org.mockito.MockitoAnnotations;
import org.robolectric.RuntimeEnvironment;
import org.robolectric.annotation.Config;
import java.util.ArrayList;
import java.util.List;
+import static com.google.common.truth.Truth.assertThat;
+
@RunWith(SettingsRobolectricTestRunner.class)
@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
public class AccessibilitySettingsTest {
- private Context mContext;
- private AccessibilitySettings mFragment;
- private boolean mAccessibilityShortcutPreferenceRemoved;
- private boolean mColorInversionPreferenceRemoved;
- private boolean mColorCorrectionPreferenceRemoved;
-
- @Before
- public void setUp() {
- MockitoAnnotations.initMocks(this);
- mContext = spy(RuntimeEnvironment.application);
- mFragment = new AccessibilitySettings() {
- @Override
- public Context getContext() {
- return mContext;
- }
-
- @Override
- protected boolean removePreference(String key) {
- if (AccessibilitySettings.ACCESSIBILITY_SHORTCUT_PREFERENCE.equals(key)) {
- mAccessibilityShortcutPreferenceRemoved = true;
- return true;
- }
-
- if (AccessibilitySettings.TOGGLE_INVERSION_PREFERENCE.equals(key)) {
- mColorInversionPreferenceRemoved = true;
- return true;
- }
-
- if (AccessibilitySettings.DISPLAY_DALTONIZER_PREFERENCE_SCREEN.equals(key)) {
- mColorCorrectionPreferenceRemoved = true;
- return true;
- }
- return false;
- }
- };
- }
-
@Test
public void testNonIndexableKeys_existInXmlLayout() {
+ final Context context = RuntimeEnvironment.application;
final List<String> niks = AccessibilitySettings.SEARCH_INDEX_DATA_PROVIDER
- .getNonIndexableKeys(mContext);
+ .getNonIndexableKeys(context);
final List<String> keys = new ArrayList<>();
- keys.addAll(XmlTestUtils.getKeysFromPreferenceXml(mContext, R.xml.accessibility_settings));
+ keys.addAll(XmlTestUtils.getKeysFromPreferenceXml(context, R.xml.accessibility_settings));
assertThat(keys).containsAllIn(niks);
}
-
- @Test
- public void testAccessibilityShortcutPreference_byDefault_shouldBeShown() {
- final Preference preference = new Preference(mContext);
- mFragment.checkAccessibilityShortcutVisibility(preference);
-
- assertThat(mAccessibilityShortcutPreferenceRemoved).isFalse();
- }
-
- @Test
- @Config(qualifiers = "mcc999")
- public void testAccessibilityShortcutPreference_ifDisabled_shouldNotBeShown() {
- final Preference preference = new Preference(mContext);
- mFragment.checkAccessibilityShortcutVisibility(preference);
-
- assertThat(mAccessibilityShortcutPreferenceRemoved).isTrue();
- }
-
- @Test
- @Config(qualifiers = "mcc999")
- public void testNonIndexableKeys_ifAccessibilityShortcutNotVisible_containsKey() {
- final List<String> niks = AccessibilitySettings.SEARCH_INDEX_DATA_PROVIDER
- .getNonIndexableKeys(mContext);
-
- assertThat(niks).contains(AccessibilitySettings.ACCESSIBILITY_SHORTCUT_PREFERENCE);
- }
-
- @Test
- public void testColorInversionPreference_byDefault_shouldBeShown() {
- final Preference preference = new Preference(mContext);
- mFragment.checkColorInversionVisibility(preference);
-
- assertThat(mColorInversionPreferenceRemoved).isEqualTo(false);
- }
-
- @Test
- @Config(qualifiers = "mcc999")
- public void testColorInversionPreference_ifDisabled_shouldNotBeShown() {
- final Preference preference = new Preference(mContext);
- mFragment.checkColorInversionVisibility(preference);
-
- assertThat(mColorInversionPreferenceRemoved).isEqualTo(true);
- }
-
- @Test
- public void testColorCorrectionPreference_byDefault_shouldBeShown() {
- final Preference preference = new Preference(mContext);
- mFragment.checkColorCorrectionVisibility(preference);
-
- assertThat(mColorCorrectionPreferenceRemoved).isEqualTo(false);
- }
-
- @Test
- @Config(qualifiers = "mcc999")
- public void testColorCorrectionPreference_ifDisabled_shouldNotBeShown() {
- final Preference preference = new Preference(mContext);
- mFragment.checkColorCorrectionVisibility(preference);
-
- assertThat(mColorCorrectionPreferenceRemoved).isEqualTo(true);
- }
}
diff --git a/tests/robotests/src/com/android/settings/accessibility/HapticFeedbackIntensityPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/accessibility/HapticFeedbackIntensityPreferenceControllerTest.java
new file mode 100644
index 0000000..b0246b9
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/accessibility/HapticFeedbackIntensityPreferenceControllerTest.java
@@ -0,0 +1,61 @@
+/*
+ * 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.accessibility;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.arch.lifecycle.LifecycleOwner;
+import android.content.Context;
+
+import com.android.settings.TestConfig;
+import com.android.settings.core.BasePreferenceController;
+import com.android.settings.testutils.SettingsRobolectricTestRunner;
+import com.android.settingslib.core.lifecycle.Lifecycle;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
+
+@RunWith(SettingsRobolectricTestRunner.class)
+@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
+public class HapticFeedbackIntensityPreferenceControllerTest {
+
+ private LifecycleOwner mLifecycleOwner;
+ private Lifecycle mLifecycle;
+ private Context mContext;
+ private HapticFeedbackIntensityPreferenceController mController;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ mLifecycleOwner = () -> mLifecycle;
+ mLifecycle = new Lifecycle(mLifecycleOwner);
+ mContext = RuntimeEnvironment.application;
+ mController = new HapticFeedbackIntensityPreferenceController(mContext);
+ }
+
+ @Test
+ public void verifyConstants() {
+ assertThat(mController.getPreferenceKey())
+ .isEqualTo(HapticFeedbackIntensityPreferenceController.PREF_KEY);
+ assertThat(mController.getAvailabilityStatus())
+ .isEqualTo(BasePreferenceController.AVAILABLE);
+ }
+}
diff --git a/tests/robotests/src/com/android/settings/accessibility/NotificationVibrationIntensityPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/accessibility/NotificationVibrationIntensityPreferenceControllerTest.java
new file mode 100644
index 0000000..32e17b9
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/accessibility/NotificationVibrationIntensityPreferenceControllerTest.java
@@ -0,0 +1,111 @@
+/*
+ * 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.accessibility;
+
+import static android.provider.Settings.System.NOTIFICATION_VIBRATION_INTENSITY;
+import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.Mockito.when;
+
+import android.arch.lifecycle.LifecycleOwner;
+import android.content.Context;
+import android.os.Vibrator;
+import android.provider.Settings;
+import android.support.v7.preference.Preference;
+import android.support.v7.preference.PreferenceScreen;
+
+import com.android.settings.R;
+import com.android.settings.TestConfig;
+import com.android.settings.core.BasePreferenceController;
+import com.android.settings.testutils.SettingsRobolectricTestRunner;
+import com.android.settingslib.core.lifecycle.Lifecycle;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
+
+@RunWith(SettingsRobolectricTestRunner.class)
+@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
+public class NotificationVibrationIntensityPreferenceControllerTest {
+
+ @Mock
+ private PreferenceScreen mScreen;
+
+ private LifecycleOwner mLifecycleOwner;
+ private Lifecycle mLifecycle;
+ private Context mContext;
+ private NotificationVibrationIntensityPreferenceController mController;
+ private Preference mPreference;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ mLifecycleOwner = () -> mLifecycle;
+ mLifecycle = new Lifecycle(mLifecycleOwner);
+ mContext = RuntimeEnvironment.application;
+ mController = new NotificationVibrationIntensityPreferenceController(mContext) {
+ @Override
+ protected int getDefaultIntensity() {
+ return 10;
+ }
+ };
+ mLifecycle.addObserver(mController);
+ mPreference = new Preference(mContext);
+ mPreference.setSummary("Test");
+ when(mScreen.findPreference(mController.getPreferenceKey()))
+ .thenReturn(mPreference);
+ mController.displayPreference(mScreen);
+ }
+
+ @Test
+ public void verifyConstants() {
+ assertThat(mController.getPreferenceKey())
+ .isEqualTo(NotificationVibrationIntensityPreferenceController.PREF_KEY);
+ assertThat(mController.getAvailabilityStatus())
+ .isEqualTo(BasePreferenceController.AVAILABLE);
+ }
+
+ @Test
+ public void updateState_shouldRefreshSummary() {
+ Settings.System.putInt(mContext.getContentResolver(),
+ NOTIFICATION_VIBRATION_INTENSITY, Vibrator.VIBRATION_INTENSITY_LOW);
+ mController.updateState(mPreference);
+ assertThat(mPreference.getSummary())
+ .isEqualTo(mContext.getString(R.string.accessibility_vibration_intensity_low));
+
+ Settings.System.putInt(mContext.getContentResolver(),
+ NOTIFICATION_VIBRATION_INTENSITY, Vibrator.VIBRATION_INTENSITY_HIGH);
+ mController.updateState(mPreference);
+ assertThat(mPreference.getSummary())
+ .isEqualTo(mContext.getString(R.string.accessibility_vibration_intensity_high));
+
+ Settings.System.putInt(mContext.getContentResolver(),
+ NOTIFICATION_VIBRATION_INTENSITY, Vibrator.VIBRATION_INTENSITY_MEDIUM);
+ mController.updateState(mPreference);
+ assertThat(mPreference.getSummary())
+ .isEqualTo(mContext.getString(R.string.accessibility_vibration_intensity_medium));
+
+ Settings.System.putInt(mContext.getContentResolver(),
+ NOTIFICATION_VIBRATION_INTENSITY, Vibrator.VIBRATION_INTENSITY_OFF);
+ mController.updateState(mPreference);
+ assertThat(mPreference.getSummary())
+ .isEqualTo(mContext.getString(R.string.accessibility_vibration_intensity_off));
+ }
+}
diff --git a/tests/robotests/src/com/android/settings/accessibility/VibrationPreferenceFragmentTest.java b/tests/robotests/src/com/android/settings/accessibility/VibrationPreferenceFragmentTest.java
index f6a5a82..9729d66 100644
--- a/tests/robotests/src/com/android/settings/accessibility/VibrationPreferenceFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/accessibility/VibrationPreferenceFragmentTest.java
@@ -35,7 +35,7 @@
import com.android.settings.accessibility.VibrationPreferenceFragment.VibrationIntensityCandidateInfo;
import com.android.settings.testutils.FakeFeatureFactory;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
-import com.android.settings.widget.RadioButtonPickerFragment.CandidateInfo;
+import com.android.settingslib.widget.CandidateInfo;
import org.junit.Before;
import org.junit.Test;
diff --git a/tests/robotests/src/com/android/settings/applications/AppInfoWithHeaderTest.java b/tests/robotests/src/com/android/settings/applications/AppInfoWithHeaderTest.java
index 50cd979..99e662b 100644
--- a/tests/robotests/src/com/android/settings/applications/AppInfoWithHeaderTest.java
+++ b/tests/robotests/src/com/android/settings/applications/AppInfoWithHeaderTest.java
@@ -30,6 +30,8 @@
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.net.Uri;
+import android.os.Bundle;
+import android.os.UserHandle;
import android.support.v7.preference.PreferenceManager;
import android.support.v7.preference.PreferenceScreen;
@@ -116,12 +118,66 @@
assertThat(mAppInfoWithHeader.mPackageRemovedCalled).isTrue();
}
+ @Test
+ public void noExtraUserHandleInIntent_retrieveAppEntryWithMyUsedId()
+ throws PackageManager.NameNotFoundException {
+ final String packageName = "com.android.settings";
+
+ mAppInfoWithHeader.mIntent.setData(Uri.fromParts("package",
+ packageName, null));
+ final ApplicationsState.AppEntry entry = mock(ApplicationsState.AppEntry.class);
+ entry.info = new ApplicationInfo();
+ entry.info.packageName = packageName;
+
+ when(mAppInfoWithHeader.mState.getEntry(packageName,
+ UserHandle.myUserId())).thenReturn(entry);
+ when(mAppInfoWithHeader.mPm.getPackageInfoAsUser(entry.info.packageName,
+ PackageManager.MATCH_DISABLED_COMPONENTS |
+ PackageManager.GET_SIGNING_CERTIFICATES |
+ PackageManager.GET_PERMISSIONS, UserHandle.myUserId())).thenReturn(
+ mAppInfoWithHeader.mPackageInfo);
+
+ mAppInfoWithHeader.retrieveAppEntry();
+
+ assertThat(mAppInfoWithHeader.mUserId).isEqualTo(UserHandle.myUserId());
+ assertThat(mAppInfoWithHeader.mPackageInfo).isNotNull();
+ assertThat(mAppInfoWithHeader.mAppEntry).isNotNull();
+ }
+
+ @Test
+ public void extraUserHandleInIntent_retrieveAppEntryWithMyUsedId()
+ throws PackageManager.NameNotFoundException {
+ final int USER_ID = 1002;
+ final String packageName = "com.android.settings";
+
+ mAppInfoWithHeader.mIntent.putExtra(Intent.EXTRA_USER_HANDLE, new UserHandle(USER_ID));
+ mAppInfoWithHeader.mIntent.setData(Uri.fromParts("package",
+ packageName, null));
+ final ApplicationsState.AppEntry entry = mock(ApplicationsState.AppEntry.class);
+ entry.info = new ApplicationInfo();
+ entry.info.packageName = packageName;
+
+ when(mAppInfoWithHeader.mState.getEntry(packageName, USER_ID)).thenReturn(entry);
+ when(mAppInfoWithHeader.mPm.getPackageInfoAsUser(entry.info.packageName,
+ PackageManager.MATCH_DISABLED_COMPONENTS |
+ PackageManager.GET_SIGNING_CERTIFICATES |
+ PackageManager.GET_PERMISSIONS, USER_ID)).thenReturn(
+ mAppInfoWithHeader.mPackageInfo);
+
+ mAppInfoWithHeader.retrieveAppEntry();
+
+ assertThat(mAppInfoWithHeader.mUserId).isEqualTo(USER_ID);
+ assertThat(mAppInfoWithHeader.mPackageInfo).isNotNull();
+ assertThat(mAppInfoWithHeader.mAppEntry).isNotNull();
+ }
+
public static class TestFragment extends AppInfoWithHeader {
PreferenceManager mManager;
PreferenceScreen mScreen;
Context mShadowContext;
boolean mPackageRemovedCalled;
+ Intent mIntent;
public TestFragment() {
mPm = mock(PackageManager.class);
@@ -129,6 +185,8 @@
mScreen = mock(PreferenceScreen.class);
mPackageInfo = new PackageInfo();
mPackageInfo.applicationInfo = new ApplicationInfo();
+ mState = mock(ApplicationsState.class);
+ mIntent = new Intent();
mShadowContext = ShadowApplication.getInstance().getApplicationContext();
ReflectionHelpers.setStaticField(AppUtils.class, "sInstantAppDataProvider",
(InstantAppDataProvider) (info -> false));
@@ -169,6 +227,8 @@
protected void onPackageRemoved() {
mPackageRemovedCalled = true;
}
- }
+ @Override
+ protected Intent getIntent() { return mIntent; }
+ }
}
diff --git a/tests/robotests/src/com/android/settings/applications/appinfo/AppInfoDashboardFragmentTest.java b/tests/robotests/src/com/android/settings/applications/appinfo/AppInfoDashboardFragmentTest.java
index 1abbed5..a9dc472 100644
--- a/tests/robotests/src/com/android/settings/applications/appinfo/AppInfoDashboardFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/applications/appinfo/AppInfoDashboardFragmentTest.java
@@ -24,8 +24,6 @@
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.anyInt;
-import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.ArgumentMatchers.nullable;
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.doReturn;
@@ -255,7 +253,7 @@
public void getPreferenceControllers_noPackageInfo_shouldReturnNull() {
doNothing().when(mFragment).retrieveAppEntry();
- assertThat(mFragment.getPreferenceControllers(mShadowContext)).isNull();
+ assertThat(mFragment.createPreferenceControllers(mShadowContext)).isNull();
}
@Test
@@ -337,7 +335,6 @@
public void startAppInfoFragment_includesNewAndOldArgs() {
final SettingsPreferenceFragment caller = mock(SettingsPreferenceFragment.class);
final SettingsActivity sa = mock (SettingsActivity.class);
- when(caller.getActivity()).thenReturn(sa);
when(caller.getContext()).thenReturn(sa);
final AppEntry appEntry = mock(AppEntry.class);
appEntry.info = mock(ApplicationInfo.class);
@@ -350,7 +347,7 @@
final ArgumentCaptor<Intent> intent = ArgumentCaptor.forClass(Intent.class);
- verify(sa).startActivityForResult(intent.capture(), any(Integer.class));
+ verify(caller).startActivityForResult(intent.capture(), any(Integer.class));
assertThat(intent.getValue().getBundleExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT_ARGUMENTS)
.containsKey("test"))
.isTrue();
diff --git a/tests/robotests/src/com/android/settings/applications/appinfo/AppInfoPreferenceControllerBaseTest.java b/tests/robotests/src/com/android/settings/applications/appinfo/AppInfoPreferenceControllerBaseTest.java
index 0715724..aadcb3e 100644
--- a/tests/robotests/src/com/android/settings/applications/appinfo/AppInfoPreferenceControllerBaseTest.java
+++ b/tests/robotests/src/com/android/settings/applications/appinfo/AppInfoPreferenceControllerBaseTest.java
@@ -93,7 +93,7 @@
mController.handlePreferenceTreeClick(mPreference);
final ArgumentCaptor<Intent> intentCaptor = ArgumentCaptor.forClass(Intent.class);
- verify(mActivity).startActivityForResult(intentCaptor.capture(), eq(SUB_INFO_FRAGMENT));
+ verify(mFragment).startActivityForResult(intentCaptor.capture(), eq(SUB_INFO_FRAGMENT));
assertThat(intentCaptor.getValue().getStringExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT))
.isEqualTo(mController.getDetailFragmentClass().getName());
}
diff --git a/tests/robotests/src/com/android/settings/applications/appinfo/DrawOverlayDetailsTest.java b/tests/robotests/src/com/android/settings/applications/appinfo/DrawOverlayDetailsTest.java
index a33a6b8..7ac112a 100644
--- a/tests/robotests/src/com/android/settings/applications/appinfo/DrawOverlayDetailsTest.java
+++ b/tests/robotests/src/com/android/settings/applications/appinfo/DrawOverlayDetailsTest.java
@@ -16,6 +16,7 @@
package com.android.settings.applications.appinfo;
+import static org.junit.Assert.assertEquals;
import static org.mockito.Matchers.eq;
import static org.mockito.Matchers.nullable;
import static org.mockito.Mockito.verify;
@@ -27,6 +28,8 @@
import android.content.Context;
import android.view.Window;
+import android.view.WindowManager.LayoutParams;
+
import com.android.internal.logging.nano.MetricsProto;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
import com.android.settings.TestConfig;
@@ -37,9 +40,8 @@
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Answers;
-import org.mockito.InOrder;
+import org.mockito.ArgumentCaptor;
import org.mockito.Mock;
-import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
import org.mockito.Spy;
import org.robolectric.annotation.Config;
@@ -55,6 +57,8 @@
@Mock
private Window mWindow;
+ private LayoutParams layoutParams;
+
private FakeFeatureFactory mFeatureFactory;
@Spy
@@ -65,6 +69,7 @@
MockitoAnnotations.initMocks(this);
mFeatureFactory = FakeFeatureFactory.setupForTest();
+ layoutParams = new LayoutParams();
}
@Test
@@ -86,13 +91,17 @@
public void hideNonSystemOverlaysWhenResumed() {
when(mFragment.getActivity()).thenReturn(mActivity);
when(mActivity.getWindow()).thenReturn(mWindow);
+ when(mWindow.getAttributes()).thenReturn(layoutParams);
mFragment.onResume();
+ verify(mWindow).addPrivateFlags(PRIVATE_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS);
+
mFragment.onPause();
- InOrder inOrder = Mockito.inOrder(mWindow);
- inOrder.verify(mWindow).addFlags(PRIVATE_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS);
- inOrder.verify(mWindow).clearFlags(PRIVATE_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS);
- inOrder.verifyNoMoreInteractions();
+ // There's no Window.clearPrivateFlags() method, so the Window.attributes are updated.
+ ArgumentCaptor<LayoutParams> paramCaptor = ArgumentCaptor.forClass(LayoutParams.class);
+ verify(mWindow).setAttributes(paramCaptor.capture());
+ assertEquals(0,
+ paramCaptor.getValue().privateFlags & PRIVATE_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS);
}
}
diff --git a/tests/robotests/src/com/android/settings/applications/appinfo/InstantAppButtonsPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/applications/appinfo/InstantAppButtonsPreferenceControllerTest.java
index eb8a082..24823fe 100644
--- a/tests/robotests/src/com/android/settings/applications/appinfo/InstantAppButtonsPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/applications/appinfo/InstantAppButtonsPreferenceControllerTest.java
@@ -18,28 +18,40 @@
import static com.google.common.truth.Truth.assertThat;
-import static org.mockito.ArgumentMatchers.nullable;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.argThat;
+import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
-import android.app.AlertDialog;
-import android.app.Fragment;
+import android.content.ComponentName;
import android.content.Context;
+import android.content.DialogInterface;
+import android.content.Intent;
+import android.content.pm.ActivityInfo;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
+import android.support.v7.preference.PreferenceManager;
import android.support.v7.preference.PreferenceScreen;
+import android.text.TextUtils;
+import android.view.Menu;
+import android.view.MenuItem;
import android.view.View;
+import android.widget.Button;
+import com.android.settings.R;
import com.android.settings.TestConfig;
import com.android.settings.applications.LayoutPreference;
-import com.android.settings.applications.instantapps.InstantAppButtonsController;
-import com.android.settings.testutils.FakeFeatureFactory;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
import com.android.settingslib.applications.AppUtils;
import com.android.settingslib.applications.instantapps.InstantAppDataProvider;
+import com.android.settingslib.wrapper.PackageManagerWrapper;
import org.junit.Before;
import org.junit.Test;
@@ -54,27 +66,48 @@
@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
public class InstantAppButtonsPreferenceControllerTest {
+ private static final String TEST_INSTALLER_PACKAGE_NAME = "com.installer";
+ private static final String TEST_INSTALLER_ACTIVITY_NAME = "com.installer.InstallerActivity";
+ private static final String TEST_AIA_PACKAGE_NAME = "test.aia.package";
+
@Mock
private PackageManager mPackageManager;
@Mock
private ApplicationInfo mAppInfo;
@Mock
private AppInfoDashboardFragment mFragment;
+ @Mock
+ private LayoutPreference mPreference;
private Context mContext;
+ private PreferenceScreen mScreen;
+ private PreferenceManager mPreferenceManager;
+ private Button mLaunchButton;
+ private Button mInstallButton;
+ private Button mClearAppButton;
private InstantAppButtonsPreferenceController mController;
- private FakeFeatureFactory mFeatureFactory;
@Before
public void setUp() throws PackageManager.NameNotFoundException {
MockitoAnnotations.initMocks(this);
- mFeatureFactory = FakeFeatureFactory.setupForTest();
mContext = spy(RuntimeEnvironment.application);
+ when(mContext.getPackageManager()).thenReturn(mPackageManager);
final PackageInfo packageInfo = mock(PackageInfo.class);
packageInfo.applicationInfo = mAppInfo;
when(mFragment.getPackageInfo()).thenReturn(packageInfo);
- mController =
- spy(new InstantAppButtonsPreferenceController(mContext, mFragment, "Package1"));
+ mPreferenceManager = new PreferenceManager(mContext);
+ mScreen = mPreferenceManager.createPreferenceScreen(mContext);
+ when(mFragment.getPreferenceManager()).thenReturn(mPreferenceManager);
+ final View buttons = View.inflate(
+ RuntimeEnvironment.application, R.layout.instant_app_buttons, null /* parent */);
+ mLaunchButton = buttons.findViewById(R.id.launch);
+ mInstallButton = buttons.findViewById(R.id.install);
+ mClearAppButton = buttons.findViewById(R.id.clear_data);
+ mController = spy(new InstantAppButtonsPreferenceController(
+ mContext, mFragment, TEST_AIA_PACKAGE_NAME, null /* lifecycle */));
+ when(mPreference.getKey()).thenReturn("instant_app_buttons");
+ mScreen.addPreference(mPreference);
+ when(mPreference.findViewById(R.id.instant_app_button_container)).thenReturn(buttons);
}
@Test
@@ -94,39 +127,173 @@
}
@Test
- public void displayPreference_shouldSetPreferenceTitle() {
- final PreferenceScreen screen = mock(PreferenceScreen.class);
- final LayoutPreference preference = mock(LayoutPreference.class);
- when(screen.findPreference(mController.getPreferenceKey())).thenReturn(preference);
- when(mController.getApplicationFeatureProvider())
- .thenReturn(mFeatureFactory.applicationFeatureProvider);
- final InstantAppButtonsController buttonsController =
- mock(InstantAppButtonsController.class);
- when(buttonsController.setPackageName(nullable(String.class)))
- .thenReturn(buttonsController);
- when(mFeatureFactory.applicationFeatureProvider.newInstantAppButtonsController(
- nullable(Fragment.class), nullable(View.class),
- nullable(InstantAppButtonsController.ShowDialogDelegate.class)))
- .thenReturn(buttonsController);
+ public void onCreateOptionsMenu_noLaunchUri_shouldNotAddInstallInstantAppMenu() {
+ final Menu menu = mock(Menu.class);
+ when(menu.add(anyInt(), anyInt(), anyInt(), anyInt())).thenReturn(mock(MenuItem.class));
- mController.displayPreference(screen);
+ mController.onCreateOptionsMenu(menu, null /* inflater */);
- verify(buttonsController).setPackageName(nullable(String.class));
- verify(buttonsController).show();
+ verify(menu, never()).add(anyInt(), eq(AppInfoDashboardFragment.INSTALL_INSTANT_APP_MENU),
+ anyInt(), eq(R.string.install_text));
}
@Test
- public void createDialog_shouldReturnDialogFromButtonController() {
- final InstantAppButtonsController buttonsController =
- mock(InstantAppButtonsController.class);
- ReflectionHelpers.setField(
- mController, "mInstantAppButtonsController", buttonsController);
- final AlertDialog mockDialog = mock(AlertDialog.class);
- when(buttonsController.createDialog(InstantAppButtonsController.DLG_CLEAR_APP))
- .thenReturn(mockDialog);
+ public void onCreateOptionsMenu_hasLaunchUri_shouldAddForceStop() {
+ ReflectionHelpers.setField(mController, "mLaunchUri", "www.test.launch");
+ final Menu menu = mock(Menu.class);
+ when(menu.add(anyInt(), anyInt(), anyInt(), anyInt())).thenReturn(mock(MenuItem.class));
- assertThat(mController.createDialog(InstantAppButtonsController.DLG_CLEAR_APP))
- .isEqualTo(mockDialog);
+ mController.onCreateOptionsMenu(menu, null /* inflater */);
+
+ verify(menu).add(anyInt(), eq(AppInfoDashboardFragment.INSTALL_INSTANT_APP_MENU),
+ anyInt(), eq(R.string.install_text));
+ }
+
+ @Test
+ public void onPrepareOptionsMenu_noAppStoreLink_shoulDisableInstallInstantAppMenu() {
+ ReflectionHelpers.setField(mController, "mLaunchUri", "www.test.launch");
+ final Menu menu = mock(Menu.class);
+ final MenuItem menuItem = mock(MenuItem.class);
+ when(menu.findItem(AppInfoDashboardFragment.INSTALL_INSTANT_APP_MENU)).thenReturn(menuItem);
+
+ mController.onPrepareOptionsMenu(menu);
+
+ verify(menuItem).setEnabled(false);
+ }
+
+ @Test
+ public void onPrepareOptionsMenu_hasAppStoreLink_shoulNotDisableInstallInstantAppMenu() {
+ ReflectionHelpers.setField(mController, "mLaunchUri", "www.test.launch");
+ final ResolveInfo resolveInfo = mock(ResolveInfo.class);
+ final ActivityInfo activityInfo = mock(ActivityInfo.class);
+ resolveInfo.activityInfo = activityInfo;
+ activityInfo.packageName = TEST_INSTALLER_PACKAGE_NAME;
+ activityInfo.name = TEST_INSTALLER_ACTIVITY_NAME;
+ when(mPackageManager.resolveActivity(any(), anyInt())).thenReturn(resolveInfo);
+ final Menu menu = mock(Menu.class);
+ final MenuItem menuItem = mock(MenuItem.class);
+ when(menu.findItem(AppInfoDashboardFragment.INSTALL_INSTANT_APP_MENU)).thenReturn(menuItem);
+
+ mController.onPrepareOptionsMenu(menu);
+
+ verify(menuItem, never()).setEnabled(false);
+ }
+
+ @Test
+ public void onPrepareOptionsMenu_installMenuNotFound_shoulNotCrash() {
+ final Menu menu = mock(Menu.class);
+
+ mController.onPrepareOptionsMenu(menu);
+
+ // no crash
+ }
+
+ @Test
+ public void onOptionsItemSelected_shouldOpenAppStore() {
+ final ResolveInfo resolveInfo = mock(ResolveInfo.class);
+ final ActivityInfo activityInfo = mock(ActivityInfo.class);
+ resolveInfo.activityInfo = activityInfo;
+ activityInfo.packageName = TEST_INSTALLER_PACKAGE_NAME;
+ activityInfo.name = TEST_INSTALLER_ACTIVITY_NAME;
+ when(mPackageManager.resolveActivity(any(), anyInt())).thenReturn(resolveInfo);
+ mController.displayPreference(mScreen);
+ final ComponentName componentName =
+ new ComponentName(TEST_INSTALLER_PACKAGE_NAME, TEST_INSTALLER_ACTIVITY_NAME);
+ final MenuItem menu = mock(MenuItem.class);
+ when(menu.getItemId()).thenReturn(AppInfoDashboardFragment.INSTALL_INSTANT_APP_MENU);
+
+ mController.onOptionsItemSelected(menu);
+
+ verify(mFragment).startActivity(argThat(intent-> intent != null
+ && intent.getAction().equals(Intent.ACTION_SHOW_APP_INFO)
+ && intent.getComponent().equals(componentName)));
+ }
+
+ @Test
+ public void displayPreference_noLaunchUri_shouldShowHideLaunchButton() {
+ mController.displayPreference(mScreen);
+
+ assertThat(mLaunchButton.getVisibility()).isEqualTo(View.GONE);
+ }
+
+ @Test
+ public void displayPreference_hasLaunchUri_shouldShowHideInstallButton() {
+ ReflectionHelpers.setField(mController, "mLaunchUri", "www.test.launch");
+
+ mController.displayPreference(mScreen);
+
+ assertThat(mInstallButton.getVisibility()).isEqualTo(View.GONE);
+ }
+
+ @Test
+ public void displayPreference_noAppStoreLink_shoulDisableInstallButton() {
+ mController.displayPreference(mScreen);
+
+ assertThat(mInstallButton.isEnabled()).isFalse();
+ }
+
+ @Test
+ public void displayPreference_hasAppStoreLink_shoulSetClickListenerForInstallButton() {
+ final ResolveInfo resolveInfo = mock(ResolveInfo.class);
+ final ActivityInfo activityInfo = mock(ActivityInfo.class);
+ resolveInfo.activityInfo = activityInfo;
+ activityInfo.packageName = TEST_INSTALLER_PACKAGE_NAME;
+ activityInfo.name = TEST_INSTALLER_ACTIVITY_NAME;
+ when(mPackageManager.resolveActivity(any(), anyInt())).thenReturn(resolveInfo);
+
+ mController.displayPreference(mScreen);
+
+ assertThat(mInstallButton.hasOnClickListeners()).isTrue();
+ }
+
+ @Test
+ public void displayPreference_shoulSetClickListenerForClearButton() {
+ mController.displayPreference(mScreen);
+
+ assertThat(mClearAppButton.hasOnClickListeners()).isTrue();
+ }
+
+ @Test
+ public void clickLaunchButton_shouldLaunchViewIntent() {
+ final String launchUri = "www.test.launch";
+ ReflectionHelpers.setField(mController, "mLaunchUri", launchUri);
+ mController.displayPreference(mScreen);
+
+ mLaunchButton.callOnClick();
+
+ verify(mFragment).startActivity(argThat(intent-> intent != null
+ && intent.getAction().equals(Intent.ACTION_VIEW)
+ && TextUtils.equals(intent.getDataString(), launchUri)));
+ }
+
+ @Test
+ public void clickInstallButton_shouldOpenAppStore() {
+ final ResolveInfo resolveInfo = mock(ResolveInfo.class);
+ final ActivityInfo activityInfo = mock(ActivityInfo.class);
+ resolveInfo.activityInfo = activityInfo;
+ activityInfo.packageName = TEST_INSTALLER_PACKAGE_NAME;
+ activityInfo.name = TEST_INSTALLER_ACTIVITY_NAME;
+ when(mPackageManager.resolveActivity(any(), anyInt())).thenReturn(resolveInfo);
+ mController.displayPreference(mScreen);
+ final ComponentName componentName =
+ new ComponentName(TEST_INSTALLER_PACKAGE_NAME, TEST_INSTALLER_ACTIVITY_NAME);
+
+ mInstallButton.callOnClick();
+
+ verify(mFragment).startActivity(argThat(intent-> intent != null
+ && intent.getAction().equals(Intent.ACTION_SHOW_APP_INFO)
+ && intent.getComponent().equals(componentName)));
+ }
+
+ @Test
+ public void onClick_shouldDeleteApp() {
+ PackageManagerWrapper packageManagerWrapper = mock(PackageManagerWrapper.class);
+ ReflectionHelpers.setField(mController, "mPackageManagerWrapper", packageManagerWrapper);
+
+ mController.onClick(mock(DialogInterface.class), DialogInterface.BUTTON_POSITIVE);
+
+ verify(packageManagerWrapper)
+ .deletePackageAsUser(eq(TEST_AIA_PACKAGE_NAME), any(), anyInt(),anyInt());
}
}
diff --git a/tests/robotests/src/com/android/settings/applications/appinfo/PictureInPictureDetailPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/applications/appinfo/PictureInPictureDetailPreferenceControllerTest.java
index cf37b36..9322966 100644
--- a/tests/robotests/src/com/android/settings/applications/appinfo/PictureInPictureDetailPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/applications/appinfo/PictureInPictureDetailPreferenceControllerTest.java
@@ -24,7 +24,6 @@
import static org.mockito.Mockito.when;
import android.content.Context;
-import android.os.UserManager;
import android.support.v7.preference.Preference;
import com.android.settings.R;
@@ -44,8 +43,6 @@
public class PictureInPictureDetailPreferenceControllerTest {
@Mock
- private UserManager mUserManager;
- @Mock
private AppInfoDashboardFragment mFragment;
@Mock
private Preference mPreference;
@@ -57,7 +54,6 @@
public void setUp() {
MockitoAnnotations.initMocks(this);
mContext = spy(RuntimeEnvironment.application);
- when(mContext.getSystemService(Context.USER_SERVICE)).thenReturn(mUserManager);
mController = spy(
new PictureInPictureDetailPreferenceController(mContext, mFragment, "Package1"));
@@ -66,15 +62,7 @@
}
@Test
- public void getAvailabilityStatus_managedProfile_shouldReturnDisabled() {
- when(mUserManager.isManagedProfile()).thenReturn(true);
-
- assertThat(mController.getAvailabilityStatus()).isEqualTo(mController.DISABLED_FOR_USER);
- }
-
- @Test
public void getAvailabilityStatus_noPictureInPictureActivities_shouldReturnDisabled() {
- when(mUserManager.isManagedProfile()).thenReturn(false);
doReturn(false).when(mController).hasPictureInPictureActivites();
assertThat(mController.getAvailabilityStatus()).isEqualTo(mController.DISABLED_FOR_USER);
@@ -82,7 +70,6 @@
@Test
public void getAvailabilityStatus_hasPictureInPictureActivities_shouldReturnAvailable() {
- when(mUserManager.isManagedProfile()).thenReturn(false);
doReturn(true).when(mController).hasPictureInPictureActivites();
assertThat(mController.getAvailabilityStatus()).isEqualTo(mController.AVAILABLE);
diff --git a/tests/robotests/src/com/android/settings/applications/appinfo/PictureInPictureSettingsTest.java b/tests/robotests/src/com/android/settings/applications/appinfo/PictureInPictureSettingsTest.java
index 2ec9c96..26453cd 100644
--- a/tests/robotests/src/com/android/settings/applications/appinfo/PictureInPictureSettingsTest.java
+++ b/tests/robotests/src/com/android/settings/applications/appinfo/PictureInPictureSettingsTest.java
@@ -34,7 +34,10 @@
import com.android.settings.wrapper.UserManagerWrapper;
import com.android.settingslib.wrapper.PackageManagerWrapper;
+import com.google.common.collect.ImmutableList;
+
import org.junit.Before;
+import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
@@ -59,7 +62,6 @@
private UserManagerWrapper mUserManager;
private ArrayList<PackageInfo> mPrimaryUserPackages;
private ArrayList<PackageInfo> mProfileUserPackages;
- private ArrayList<UserInfo> mUsers;
@Before
public void setUp() {
@@ -68,12 +70,18 @@
mFragment = new PictureInPictureSettings(mPackageManager, mUserManager);
mPrimaryUserPackages = new ArrayList<>();
mProfileUserPackages = new ArrayList<>();
- mUsers = new ArrayList<>();
when(mPackageManager.getInstalledPackagesAsUser(anyInt(), eq(PRIMARY_USER_ID)))
.thenReturn(mPrimaryUserPackages);
when(mPackageManager.getInstalledPackagesAsUser(anyInt(), eq(PROFILE_USER_ID)))
.thenReturn(mProfileUserPackages);
- when(mUserManager.getProfiles(anyInt())).thenReturn(mUsers);
+
+ UserInfo primaryUserInfo = new UserInfo();
+ primaryUserInfo.id = PRIMARY_USER_ID;
+ UserInfo profileUserInfo = new UserInfo();
+ profileUserInfo.id = PROFILE_USER_ID;
+
+ when(mUserManager.getProfiles(PRIMARY_USER_ID)).thenReturn(
+ ImmutableList.of(primaryUserInfo, profileUserInfo));
}
@Test
@@ -89,8 +97,8 @@
mProfileUserPackages.add(profileP2);
ArrayList<Pair<ApplicationInfo, Integer>> apps = mFragment.collectPipApps(PRIMARY_USER_ID);
- assertThat(containsPackages(apps, primaryP1, profileP2));
- assertThat(!containsPackages(apps, primaryP2, profileP1));
+ assertThat(containsPackages(apps, primaryP1, profileP2)).isTrue();
+ assertThat(containsPackages(apps, primaryP2, profileP1)).isFalse();
}
@Test
@@ -111,7 +119,7 @@
ArrayList<Pair<ApplicationInfo, Integer>> apps = mFragment.collectPipApps(PRIMARY_USER_ID);
Collections.sort(apps, new PictureInPictureSettings.AppComparator(null));
- assertThat(isOrdered(apps, primaryP1, profileP1, primaryP2, profileP2));
+ assertThat(isOrdered(apps, primaryP1, profileP1, primaryP2, profileP2, primaryP3)).isTrue();
}
private boolean containsPackages(ArrayList<Pair<ApplicationInfo, Integer>> apps,
diff --git a/tests/robotests/src/com/android/settings/applications/assist/DefaultAssistPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/applications/assist/DefaultAssistPreferenceControllerTest.java
index eeaba21..fc1adef 100644
--- a/tests/robotests/src/com/android/settings/applications/assist/DefaultAssistPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/applications/assist/DefaultAssistPreferenceControllerTest.java
@@ -40,9 +40,9 @@
import com.android.internal.app.AssistUtils;
import com.android.settings.TestConfig;
-import com.android.settings.applications.defaultapps.DefaultAppInfo;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
import com.android.settings.testutils.shadow.ShadowSecureSettings;
+import com.android.settingslib.applications.DefaultAppInfo;
import org.junit.Before;
import org.junit.Test;
diff --git a/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultAppInfoTest.java b/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultAppInfoTest.java
deleted file mode 100644
index 8d28e05..0000000
--- a/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultAppInfoTest.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settings.applications.defaultapps;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.ArgumentMatchers.anyInt;
-import static org.mockito.ArgumentMatchers.anyString;
-import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-import android.content.ComponentName;
-import android.content.Context;
-import android.content.pm.ApplicationInfo;
-import android.content.pm.PackageItemInfo;
-import android.content.pm.PackageManager;
-import android.graphics.drawable.Drawable;
-
-import com.android.settings.TestConfig;
-import com.android.settings.testutils.SettingsRobolectricTestRunner;
-import com.android.settingslib.wrapper.PackageManagerWrapper;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-import org.robolectric.RuntimeEnvironment;
-import org.robolectric.annotation.Config;
-
-@RunWith(SettingsRobolectricTestRunner.class)
-@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
-public class DefaultAppInfoTest {
-
- @Mock
- private PackageItemInfo mPackageItemInfo;
- @Mock
- private ComponentName mComponentName;
- @Mock
- private PackageManager mPackageManager;
- @Mock
- private PackageManagerWrapper mPackageManagerWrapper;
- @Mock
- private ApplicationInfo mApplicationInfo;
- @Mock
- private Drawable mIcon;
-
- private Context mContext;
- private DefaultAppInfo mInfo;
-
- @Before
- public void setUp() throws PackageManager.NameNotFoundException {
- MockitoAnnotations.initMocks(this);
- mContext = spy(RuntimeEnvironment.application);
- doReturn(mPackageManager).when(mContext).getPackageManager();
- when(mPackageManagerWrapper.getPackageManager()).thenReturn(mPackageManager);
- when(mPackageManagerWrapper.getApplicationInfoAsUser(anyString(), anyInt(),
- anyInt())).thenReturn(mApplicationInfo);
- when(mPackageManager.loadUnbadgedItemIcon(mPackageItemInfo, mApplicationInfo)).thenReturn(
- mIcon);
- }
-
- @Test
- public void initInfoWithActivityInfo_shouldLoadInfo() {
- mPackageItemInfo.packageName = "test";
- mInfo = new DefaultAppInfo(mContext, mPackageManagerWrapper, mPackageItemInfo);
- mInfo.loadLabel();
- Drawable icon = mInfo.loadIcon();
-
- assertThat(mInfo.getKey()).isEqualTo(mPackageItemInfo.packageName);
- assertThat(icon).isNotNull();
- verify(mPackageItemInfo).loadLabel(mPackageManager);
- }
-
- @Test
- public void initInfoWithComponent_shouldLoadInfo() {
- when(mComponentName.getPackageName()).thenReturn("com.android.settings");
-
- mInfo = new DefaultAppInfo(mContext, mPackageManagerWrapper, 0 /* uid */, mComponentName);
- mInfo.getKey();
-
- verify(mComponentName).flattenToString();
- }
-}
diff --git a/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultAppPickerFragmentTest.java b/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultAppPickerFragmentTest.java
index 2cbe19f..26802ee 100644
--- a/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultAppPickerFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultAppPickerFragmentTest.java
@@ -37,6 +37,7 @@
import com.android.settings.testutils.FakeFeatureFactory;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
import com.android.settings.widget.RadioButtonPreference;
+import com.android.settingslib.applications.DefaultAppInfo;
import org.junit.Before;
import org.junit.Test;
diff --git a/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultAppPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultAppPreferenceControllerTest.java
index a02a2de..7a82f30 100644
--- a/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultAppPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultAppPreferenceControllerTest.java
@@ -28,6 +28,7 @@
import com.android.settings.R;
import com.android.settings.TestConfig;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
+import com.android.settingslib.applications.DefaultAppInfo;
import com.android.settingslib.TwoTargetPreference;
import org.junit.Before;
diff --git a/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultAutofillPickerTest.java b/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultAutofillPickerTest.java
index 11323c4..5b8807c 100644
--- a/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultAutofillPickerTest.java
+++ b/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultAutofillPickerTest.java
@@ -29,6 +29,7 @@
import com.android.settings.TestConfig;
import com.android.settings.testutils.FakeFeatureFactory;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
+import com.android.settingslib.applications.DefaultAppInfo;
import com.android.settingslib.wrapper.PackageManagerWrapper;
import org.junit.Before;
diff --git a/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultAutofillPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultAutofillPreferenceControllerTest.java
index 4e8a79e..4adebe0 100644
--- a/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultAutofillPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultAutofillPreferenceControllerTest.java
@@ -27,6 +27,7 @@
import com.android.settings.testutils.SettingsRobolectricTestRunner;
import com.android.settings.TestConfig;
import com.android.settings.wrapper.AutofillManagerWrapper;
+import com.android.settingslib.applications.DefaultAppInfo;
import com.android.settingslib.wrapper.PackageManagerWrapper;
import org.junit.Before;
diff --git a/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultHomePickerTest.java b/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultHomePickerTest.java
index eeed152..0aab5fb 100644
--- a/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultHomePickerTest.java
+++ b/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultHomePickerTest.java
@@ -31,6 +31,7 @@
import com.android.settings.testutils.SettingsRobolectricTestRunner;
import com.android.settings.TestConfig;
+import com.android.settingslib.applications.DefaultAppInfo;
import com.android.settingslib.wrapper.PackageManagerWrapper;
import org.junit.Before;
diff --git a/tests/robotests/src/com/android/settings/applications/instantapps/InstantAppButtonsControllerTest.java b/tests/robotests/src/com/android/settings/applications/instantapps/InstantAppButtonsControllerTest.java
deleted file mode 100644
index f85d43a..0000000
--- a/tests/robotests/src/com/android/settings/applications/instantapps/InstantAppButtonsControllerTest.java
+++ /dev/null
@@ -1,181 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settings.applications.instantapps;
-
-import static com.android.settings.applications.instantapps.InstantAppButtonsController
- .ShowDialogDelegate;
-import static com.google.common.truth.Truth.assertThat;
-import static org.mockito.Matchers.any;
-import static org.mockito.Matchers.anyInt;
-import static org.mockito.Matchers.eq;
-import static org.mockito.Mockito.doAnswer;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.verifyZeroInteractions;
-import static org.mockito.Mockito.when;
-
-import android.annotation.SuppressLint;
-import android.app.Fragment;
-import android.content.ComponentName;
-import android.content.Context;
-import android.content.DialogInterface;
-import android.content.Intent;
-import android.content.pm.ActivityInfo;
-import android.content.pm.PackageManager;
-import android.content.pm.ResolveInfo;
-import android.view.View;
-import android.widget.Button;
-
-import com.android.settings.R;
-import com.android.settings.TestConfig;
-import com.android.settings.testutils.FakeFeatureFactory;
-import com.android.settings.testutils.SettingsRobolectricTestRunner;
-import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
-import com.android.settingslib.wrapper.PackageManagerWrapper;
-
-import org.junit.Before;
-import org.junit.BeforeClass;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Answers;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-import org.robolectric.annotation.Config;
-import org.robolectric.util.ReflectionHelpers;
-
-/** Tests for the InstantAppButtonsController. */
-@RunWith(SettingsRobolectricTestRunner.class)
-@Config(manifest = TestConfig.MANIFEST_PATH, sdk = 23)
-public class InstantAppButtonsControllerTest {
-
- private static final String TEST_INSTALLER_PACKAGE_NAME = "com.installer";
- private static final String TEST_INSTALLER_ACTIVITY_NAME = "com.installer.InstallerActivity";
- private static final String TEST_AIA_PACKAGE_NAME = "test.aia.package";
- private static ComponentName sTestInstallerComponent;
-
- @BeforeClass
- public static void beforeClass() {
- sTestInstallerComponent =
- new ComponentName(
- TEST_INSTALLER_PACKAGE_NAME,
- TEST_INSTALLER_ACTIVITY_NAME);
- }
-
- @Mock(answer = Answers.RETURNS_DEEP_STUBS)
- Context mockContext;
- @Mock
- PackageManager mockPackageManager;
- @Mock
- PackageManagerWrapper mockPackageManagerWrapper;
- @Mock
- View mockView;
- @Mock
- ShowDialogDelegate mockShowDialogDelegate;
- @Mock
- Button mockInstallButton;
- @Mock
- Button mockClearButton;
- @Mock
- MetricsFeatureProvider mockMetricsFeatureProvider;
- @Mock
- ResolveInfo mockResolveInfo;
- @Mock
- ActivityInfo mockActivityInfo;
-
- private PackageManager stubPackageManager;
-
- private FakeFeatureFactory fakeFeatureFactory;
- private TestFragment testFragment;
- private InstantAppButtonsController controller;
-
-
- private View.OnClickListener receivedListener;
-
- @Before
- public void init() {
- MockitoAnnotations.initMocks(this);
- testFragment = new TestFragment();
- when(mockView.findViewById(R.id.install)).thenReturn(mockInstallButton);
- when(mockView.findViewById(R.id.clear_data)).thenReturn(mockClearButton);
- mockResolveInfo.activityInfo = mockActivityInfo;
- mockActivityInfo.packageName = TEST_INSTALLER_PACKAGE_NAME;
- mockActivityInfo.name = TEST_INSTALLER_ACTIVITY_NAME;
- when(mockContext.getPackageManager()).thenReturn(mockPackageManager);
- when(mockPackageManager.resolveActivity(any(), anyInt())).thenReturn(mockResolveInfo);
- controller = new InstantAppButtonsController(
- mockContext, testFragment, mockView, mockShowDialogDelegate);
- controller.setPackageName(TEST_AIA_PACKAGE_NAME);
- ReflectionHelpers.setField(
- controller, "mPackageManagerWrapper", mockPackageManagerWrapper);
- FakeFeatureFactory.setupForTest();
- }
-
- @Test
- public void testInstallListenerTriggersInstall() {
- doAnswer(invocation -> {
- receivedListener = (View.OnClickListener) invocation.getArguments()[0];
- return null;
- }).when(mockInstallButton).setOnClickListener(any());
- controller.bindButtons();
-
- assertThat(receivedListener).isNotNull();
- receivedListener.onClick(mockInstallButton);
- assertThat(testFragment.getStartActivityIntent()).isNotNull();
- assertThat(testFragment.getStartActivityIntent().getComponent())
- .isEqualTo(sTestInstallerComponent);
- }
-
- @Test
- public void testClearListenerShowsDialog() {
- doAnswer(invocation -> {
- receivedListener = (View.OnClickListener) invocation.getArguments()[0];
- return null;
- }).when(mockClearButton).setOnClickListener(any());
- controller.bindButtons();
- assertThat(receivedListener).isNotNull();
- receivedListener.onClick(mockClearButton);
- verify(mockShowDialogDelegate).showDialog(InstantAppButtonsController.DLG_CLEAR_APP);
- }
-
- @Test
- public void testDialogInterfaceOnClick_positiveClearsApp() {
- controller.onClick(mock(DialogInterface.class), DialogInterface.BUTTON_POSITIVE);
- verify(mockPackageManagerWrapper)
- .deletePackageAsUser(eq(TEST_AIA_PACKAGE_NAME), any(), anyInt(),anyInt());
- }
-
- @Test
- public void testDialogInterfaceOnClick_nonPositiveDoesNothing() {
- controller.onClick(mock(DialogInterface.class), DialogInterface.BUTTON_NEGATIVE);
- controller.onClick(mock(DialogInterface.class), DialogInterface.BUTTON_NEUTRAL);
- verifyZeroInteractions(mockPackageManagerWrapper);
- }
- @SuppressLint("ValidFragment")
- private class TestFragment extends Fragment {
-
- private Intent startActivityIntent;
-
- public Intent getStartActivityIntent() {
- return startActivityIntent;
- }
-
- @Override
- public void startActivity(Intent intent) {
- startActivityIntent = intent;
- }
- }
-}
diff --git a/tests/robotests/src/com/android/settings/applications/manageapplications/AppFilterItemTest.java b/tests/robotests/src/com/android/settings/applications/manageapplications/AppFilterItemTest.java
index 982fb56..7e19d57 100644
--- a/tests/robotests/src/com/android/settings/applications/manageapplications/AppFilterItemTest.java
+++ b/tests/robotests/src/com/android/settings/applications/manageapplications/AppFilterItemTest.java
@@ -47,7 +47,8 @@
R.string.filter_all_apps);
// Same instance, should be same
- assertThat(item).isEqualTo(item);
+ // (Use isTrue as isEqualsTo will prioritize reference equality!)
+ assertThat(item.equals(item)).isTrue();
// Same content, should be same
assertThat(item).isEqualTo(item2);
diff --git a/tests/robotests/src/com/android/settings/bluetooth/BluetoothPairingDialogTest.java b/tests/robotests/src/com/android/settings/bluetooth/BluetoothPairingDialogTest.java
index 80b4810..a617fc4 100644
--- a/tests/robotests/src/com/android/settings/bluetooth/BluetoothPairingDialogTest.java
+++ b/tests/robotests/src/com/android/settings/bluetooth/BluetoothPairingDialogTest.java
@@ -155,7 +155,8 @@
// check that showSoftInput was called to make input method appear when the dialog was shown
assertThat(view.isFocused()).isTrue();
- assertThat(imm.isActive());
+ // TODO(b/73892004): Figure out why this is failing.
+ // assertThat(imm.isActive()).isTrue();
verify(imm).showSoftInput(view, InputMethodManager.SHOW_IMPLICIT);
}
diff --git a/tests/robotests/src/com/android/settings/bluetooth/DeviceListPreferenceFragmentTest.java b/tests/robotests/src/com/android/settings/bluetooth/DeviceListPreferenceFragmentTest.java
index 49efecb..94c6add 100644
--- a/tests/robotests/src/com/android/settings/bluetooth/DeviceListPreferenceFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/bluetooth/DeviceListPreferenceFragmentTest.java
@@ -208,7 +208,7 @@
}
@Override
- protected List<AbstractPreferenceController> getPreferenceControllers(Context context) {
+ protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
return null;
}
}
diff --git a/tests/robotests/src/com/android/settings/connecteddevice/AdvancedConnectedDeviceDashboardFragmentTest.java b/tests/robotests/src/com/android/settings/connecteddevice/AdvancedConnectedDeviceDashboardFragmentTest.java
index 9f1409c..5c1c132 100644
--- a/tests/robotests/src/com/android/settings/connecteddevice/AdvancedConnectedDeviceDashboardFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/connecteddevice/AdvancedConnectedDeviceDashboardFragmentTest.java
@@ -16,10 +16,8 @@
package com.android.settings.connecteddevice;
import static com.google.common.truth.Truth.assertThat;
-import static org.mockito.Mockito.when;
import android.content.Context;
-import android.content.pm.PackageManager;
import android.provider.SearchIndexableResource;
import com.android.settings.TestConfig;
@@ -30,8 +28,6 @@
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.RuntimeEnvironment;
import org.robolectric.annotation.Config;
@@ -41,13 +37,6 @@
@RunWith(SettingsRobolectricTestRunner.class)
@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
public class AdvancedConnectedDeviceDashboardFragmentTest {
-
- @Mock(answer = Answers.RETURNS_DEEP_STUBS)
- private Context mContext;
-
- @Mock
- private PackageManager mManager;
-
private AdvancedConnectedDeviceDashboardFragment mFragment;
@Before
@@ -55,7 +44,6 @@
MockitoAnnotations.initMocks(this);
mFragment = new AdvancedConnectedDeviceDashboardFragment();
- when(mContext.getApplicationContext().getPackageManager()).thenReturn(mManager);
}
@Test
@@ -66,7 +54,8 @@
@Test
public void testSearchIndexProvider_shouldIndexResource() {
final List<SearchIndexableResource> indexRes =
- mFragment.SEARCH_INDEX_DATA_PROVIDER.getXmlResourcesToIndex(mContext,
+ mFragment.SEARCH_INDEX_DATA_PROVIDER.getXmlResourcesToIndex(
+ RuntimeEnvironment.application,
true /* enabled */);
assertThat(indexRes).isNotNull();
@@ -81,9 +70,8 @@
@Test
public void testNonIndexableKeys_existInXmlLayout() {
final Context context = RuntimeEnvironment.application;
- when(mManager.hasSystemFeature(PackageManager.FEATURE_NFC)).thenReturn(false);
final List<String> niks = ConnectedDeviceDashboardFragment.SEARCH_INDEX_DATA_PROVIDER
- .getNonIndexableKeys(mContext);
+ .getNonIndexableKeys(context);
final int xmlId = (new ConnectedDeviceDashboardFragment()).getPreferenceScreenResId();
final List<String> keys = XmlTestUtils.getKeysFromPreferenceXml(context, xmlId);
diff --git a/tests/robotests/src/com/android/settings/connecteddevice/ConnectedDeviceDashboardFragment2Test.java b/tests/robotests/src/com/android/settings/connecteddevice/ConnectedDeviceDashboardFragment2Test.java
deleted file mode 100644
index 5aa3933..0000000
--- a/tests/robotests/src/com/android/settings/connecteddevice/ConnectedDeviceDashboardFragment2Test.java
+++ /dev/null
@@ -1,158 +0,0 @@
-/*
- * Copyright (C) 2016 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.connecteddevice;
-
-import static android.content.Context.NFC_SERVICE;
-import static com.google.common.truth.Truth.assertThat;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.verifyZeroInteractions;
-import static org.mockito.Mockito.when;
-
-import android.content.Context;
-import android.content.pm.PackageManager;
-import android.nfc.NfcAdapter;
-import android.nfc.NfcManager;
-import android.provider.SearchIndexableResource;
-
-import com.android.settings.R;
-import com.android.settings.TestConfig;
-import com.android.settings.core.PreferenceControllerMixin;
-import com.android.settings.dashboard.SummaryLoader;
-import com.android.settings.nfc.NfcPreferenceController;
-import com.android.settings.testutils.FakeFeatureFactory;
-import com.android.settings.testutils.SettingsRobolectricTestRunner;
-import com.android.settings.testutils.XmlTestUtils;
-import com.android.settingslib.drawer.CategoryKey;
-
-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.RuntimeEnvironment;
-import org.robolectric.annotation.Config;
-
-import java.util.List;
-
-@RunWith(SettingsRobolectricTestRunner.class)
-@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
-public class ConnectedDeviceDashboardFragment2Test {
-
- @Mock(answer = Answers.RETURNS_DEEP_STUBS)
- Context mContext;
-
- @Mock
- private PackageManager mManager;
-
- private FakeFeatureFactory mFeatureFactory;
- private ConnectedDeviceDashboardFragmentOld mFragment;
-
- @Before
- public void setUp() {
- MockitoAnnotations.initMocks(this);
- mFeatureFactory = FakeFeatureFactory.setupForTest();
-
- mFragment = new ConnectedDeviceDashboardFragmentOld();
- when(mContext.getPackageManager()).thenReturn(mManager);
- }
-
- @Test
- public void testSearchIndexProvider_shouldIndexResource() {
- final List<SearchIndexableResource> indexRes =
- mFragment.SEARCH_INDEX_DATA_PROVIDER.getXmlResourcesToIndex(mContext,
- true /* enabled */);
-
- assertThat(indexRes).isNotNull();
- assertThat(indexRes.get(0).xmlResId).isEqualTo(mFragment.getPreferenceScreenResId());
- }
-
- @Test
- public void testSearchIndexProvider_NoNfc_KeyAdded() {
- when(mManager.hasSystemFeature(PackageManager.FEATURE_NFC)).thenReturn(false);
- final List<String> keys = mFragment.SEARCH_INDEX_DATA_PROVIDER.getNonIndexableKeys(
- mContext);
-
- assertThat(keys).isNotNull();
- assertThat(keys).contains(NfcPreferenceController.KEY_TOGGLE_NFC);
- assertThat(keys).contains(NfcPreferenceController.KEY_ANDROID_BEAM_SETTINGS);
- }
-
- @Test
- public void testSearchIndexProvider_NFC_KeyNotAdded() {
- when(mManager.hasSystemFeature(PackageManager.FEATURE_NFC)).thenReturn(true);
- final List<String> keys = mFragment.SEARCH_INDEX_DATA_PROVIDER.getNonIndexableKeys(
- mContext);
-
- assertThat(keys).isNotNull();
- assertThat(keys).doesNotContain(NfcPreferenceController.KEY_TOGGLE_NFC);
- assertThat(keys).doesNotContain(NfcPreferenceController.KEY_ANDROID_BEAM_SETTINGS);
- }
-
- @Test
- public void testNonIndexableKeys_existInXmlLayout() {
- final Context context = RuntimeEnvironment.application;
- when(mManager.hasSystemFeature(PackageManager.FEATURE_NFC)).thenReturn(false);
- final List<String> niks = ConnectedDeviceDashboardFragment.SEARCH_INDEX_DATA_PROVIDER
- .getNonIndexableKeys(mContext);
- final int xmlId = (new ConnectedDeviceDashboardFragment()).getPreferenceScreenResId();
-
- final List<String> keys = XmlTestUtils.getKeysFromPreferenceXml(context, xmlId);
-
- assertThat(keys).containsAllIn(niks);
- }
-
- @Test
- public void testSummaryProvider_hasNfc_shouldReturnNfcSummary() {
- final NfcManager nfcManager = mock(NfcManager.class);
- final SummaryLoader summaryLoader = mock(SummaryLoader.class);
-
- when(mContext.getApplicationContext()).thenReturn(mContext);
- when(mContext.getSystemService(NFC_SERVICE)).thenReturn(nfcManager);
- when(nfcManager.getDefaultAdapter()).thenReturn(mock(NfcAdapter.class));
-
- SummaryLoader.SummaryProvider provider =
- new ConnectedDeviceDashboardFragment.SummaryProvider(mContext, summaryLoader);
-
- provider.setListening(false);
-
- verifyZeroInteractions(summaryLoader);
-
- provider.setListening(true);
-
- verify(mContext).getString(R.string.connected_devices_dashboard_summary);
- }
-
- @Test
- public void testSummaryProvider_noNfc_shouldReturnNoNfcSummary() {
- final SummaryLoader summaryLoader = mock(SummaryLoader.class);
-
- when(mContext.getApplicationContext()).thenReturn(mContext);
- when(mContext.getSystemService(NFC_SERVICE)).thenReturn(null);
-
- SummaryLoader.SummaryProvider provider =
- new ConnectedDeviceDashboardFragment.SummaryProvider(mContext, summaryLoader);
-
- provider.setListening(false);
-
- verifyZeroInteractions(summaryLoader);
-
- provider.setListening(true);
-
- verify(mContext).getString(R.string.connected_devices_dashboard_no_nfc_summary);
- }
-}
diff --git a/tests/robotests/src/com/android/settings/connecteddevice/usb/UsbBackendTest.java b/tests/robotests/src/com/android/settings/connecteddevice/usb/UsbBackendTest.java
index 40cfd73..01d4b82 100644
--- a/tests/robotests/src/com/android/settings/connecteddevice/usb/UsbBackendTest.java
+++ b/tests/robotests/src/com/android/settings/connecteddevice/usb/UsbBackendTest.java
@@ -27,9 +27,9 @@
import android.hardware.usb.UsbManager;
import android.net.ConnectivityManager;
-import com.android.settings.connecteddevice.usb.UsbBackend;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
import com.android.settings.TestConfig;
+import com.android.settings.wrapper.UserManagerWrapper;
import org.junit.Before;
import org.junit.Test;
@@ -47,7 +47,7 @@
@Mock
private UsbManager mUsbManager;
@Mock
- private UsbBackend.UserRestrictionUtil mUserRestrictionUtil;
+ private UserManagerWrapper mUserManagerWrapper;
@Mock
private ConnectivityManager mConnectivityManager;
@@ -63,7 +63,7 @@
@Test
public void constructor_noUsbPort_shouldNotCrash() {
- UsbBackend usbBackend = new UsbBackend(mContext, mUserRestrictionUtil, null);
+ UsbBackend usbBackend = new UsbBackend(mContext, mUserManagerWrapper, null);
// Should not crash
}
}
diff --git a/tests/robotests/src/com/android/settings/connecteddevice/usb/UsbDefaultFragmentTest.java b/tests/robotests/src/com/android/settings/connecteddevice/usb/UsbDefaultFragmentTest.java
new file mode 100644
index 0000000..0f6adbe
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/connecteddevice/usb/UsbDefaultFragmentTest.java
@@ -0,0 +1,111 @@
+/*
+ * 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.connecteddevice.usb;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.hardware.usb.UsbManager;
+
+import com.android.settings.TestConfig;
+import com.android.settings.testutils.SettingsRobolectricTestRunner;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.annotation.Config;
+
+@RunWith(SettingsRobolectricTestRunner.class)
+@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
+public class UsbDefaultFragmentTest {
+
+ @Mock
+ private UsbBackend mUsbBackend;
+
+ private UsbDefaultFragment mFragment;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ mFragment = new UsbDefaultFragment();
+ mFragment.mUsbBackend = mUsbBackend;
+ }
+
+ @Test
+ public void testGetDefaultKey_isNone_shouldReturnNone() {
+ when(mUsbBackend.getDefaultUsbMode()).thenReturn(UsbBackend.MODE_DATA_NONE);
+ assertThat(mFragment.getDefaultKey()).isEqualTo(UsbManager.USB_FUNCTION_NONE);
+ }
+
+ @Test
+ public void testGetDefaultKey_isMtp_shouldReturnMtp() {
+ when(mUsbBackend.getDefaultUsbMode()).thenReturn(UsbBackend.MODE_DATA_MTP);
+ assertThat(mFragment.getDefaultKey()).isEqualTo(UsbManager.USB_FUNCTION_MTP);
+ }
+
+ @Test
+ public void testGetDefaultKey_isPtp_shouldReturnPtp() {
+ when(mUsbBackend.getDefaultUsbMode()).thenReturn(UsbBackend.MODE_DATA_PTP);
+ assertThat(mFragment.getDefaultKey()).isEqualTo(UsbManager.USB_FUNCTION_PTP);
+ }
+
+ @Test
+ public void testGetDefaultKey_isRndis_shouldReturnRndis() {
+ when(mUsbBackend.getDefaultUsbMode()).thenReturn(UsbBackend.MODE_DATA_TETHER);
+ assertThat(mFragment.getDefaultKey()).isEqualTo(UsbManager.USB_FUNCTION_RNDIS);
+ }
+
+ @Test
+ public void testGetDefaultKey_isMidi_shouldReturnMidi() {
+ when(mUsbBackend.getDefaultUsbMode()).thenReturn(UsbBackend.MODE_DATA_MIDI);
+ assertThat(mFragment.getDefaultKey()).isEqualTo(UsbManager.USB_FUNCTION_MIDI);
+ }
+
+ @Test
+ public void testSetDefaultKey_isNone_shouldSetNone() {
+ mFragment.setDefaultKey(UsbManager.USB_FUNCTION_NONE);
+ verify(mUsbBackend).setDefaultUsbMode(UsbBackend.MODE_DATA_NONE);
+ }
+
+ @Test
+ public void testSetDefaultKey_isMtp_shouldSetMtp() {
+ mFragment.setDefaultKey(UsbManager.USB_FUNCTION_MTP);
+ verify(mUsbBackend).setDefaultUsbMode(UsbBackend.MODE_DATA_MTP);
+ }
+
+ @Test
+ public void testSetDefaultKey_isPtp_shouldSetPtp() {
+ mFragment.setDefaultKey(UsbManager.USB_FUNCTION_PTP);
+ verify(mUsbBackend).setDefaultUsbMode(UsbBackend.MODE_DATA_PTP);
+ }
+
+ @Test
+ public void testSetDefaultKey_isRndis_shouldSetRndis() {
+ mFragment.setDefaultKey(UsbManager.USB_FUNCTION_RNDIS);
+ verify(mUsbBackend).setDefaultUsbMode(UsbBackend.MODE_DATA_TETHER);
+ }
+
+ @Test
+ public void testSetDefaultKey_isMidi_shouldSetMidi() {
+ mFragment.setDefaultKey(UsbManager.USB_FUNCTION_MIDI);
+ verify(mUsbBackend).setDefaultUsbMode(UsbBackend.MODE_DATA_MIDI);
+ }
+}
diff --git a/tests/robotests/src/com/android/settings/connecteddevice/usb/UsbDetailsProfilesControllerTest.java b/tests/robotests/src/com/android/settings/connecteddevice/usb/UsbDetailsProfilesControllerTest.java
index c733078..234be88 100644
--- a/tests/robotests/src/com/android/settings/connecteddevice/usb/UsbDetailsProfilesControllerTest.java
+++ b/tests/robotests/src/com/android/settings/connecteddevice/usb/UsbDetailsProfilesControllerTest.java
@@ -108,7 +108,7 @@
List<SwitchPreference> switches = getProfileSwitches();
for (int i = 0; i < switches.size(); i++) {
- assertThat(switches.get(i).getKey().equals(mOptions.get(i)));
+ assertThat(switches.get(i).getKey()).isEqualTo(mOptions.get(i));
}
}
@@ -138,8 +138,8 @@
mDetailsProfilesController.refresh(UsbBackend.MODE_DATA_MTP);
List<SwitchPreference> switches = getProfileSwitches();
- assertThat(switches.get(0).getKey().equals(UsbManager.USB_FUNCTION_MTP));
- assertThat(switches.get(0).isChecked());
+ assertThat(switches.get(0).getKey()).isEqualTo(UsbManager.USB_FUNCTION_MTP);
+ assertThat(switches.get(0).isChecked()).isTrue();
}
@Test
@@ -153,9 +153,9 @@
List<SwitchPreference> switches = getProfileSwitches();
assertThat(switches.get(0).getKey()).isEqualTo(UsbManager.USB_FUNCTION_MTP);
- assertThat(switches.get(0).isChecked());
+ assertThat(switches.get(0).isChecked()).isTrue();
assertThat(switches.get(3).getKey()).isEqualTo(UsbDetailsProfilesController.KEY_POWER);
- assertThat(switches.get(3).isChecked());
+ assertThat(switches.get(3).isChecked()).isTrue();
}
@Test
@@ -171,7 +171,7 @@
assertThat(switches.get(0).getKey()).isEqualTo(UsbManager.USB_FUNCTION_MTP);
verify(mUsbBackend).setMode(UsbBackend.MODE_DATA_MTP);
- assertThat(switches.get(0).isChecked());
+ assertThat(switches.get(0).isChecked()).isTrue();
}
@Test
@@ -188,9 +188,9 @@
assertThat(switches.get(0).getKey()).isEqualTo(UsbManager.USB_FUNCTION_MTP);
verify(mUsbBackend).setMode(UsbBackend.MODE_DATA_MTP | UsbBackend.MODE_POWER_SOURCE);
- assertThat(switches.get(0).isChecked());
+ assertThat(switches.get(0).isChecked()).isTrue();
assertThat(switches.get(3).getKey()).isEqualTo(UsbDetailsProfilesController.KEY_POWER);
- assertThat(switches.get(3).isChecked());
+ assertThat(switches.get(3).isChecked()).isTrue();
}
@Test
@@ -207,9 +207,10 @@
assertThat(switches.get(0).getKey()).isEqualTo(UsbManager.USB_FUNCTION_MTP);
verify(mUsbBackend).setMode(UsbBackend.MODE_DATA_MTP);
- assertThat(switches.get(0).isChecked());
+ mDetailsProfilesController.refresh(UsbBackend.MODE_DATA_MTP);
+ assertThat(switches.get(0).isChecked()).isTrue();
assertThat(switches.get(1).getKey()).isEqualTo(UsbManager.USB_FUNCTION_PTP);
- assertThat(!switches.get(1).isChecked());
+ assertThat(switches.get(1).isChecked()).isFalse();
}
@Test
@@ -226,7 +227,7 @@
assertThat(switches.get(0).getKey()).isEqualTo(UsbManager.USB_FUNCTION_MTP);
verify(mUsbBackend).setMode(UsbBackend.MODE_DATA_NONE);
- assertThat(!switches.get(0).isChecked());
+ assertThat(switches.get(0).isChecked()).isFalse();
}
@Test
diff --git a/tests/robotests/src/com/android/settings/connecteddevice/usb/UsbModeChooserActivityTest.java b/tests/robotests/src/com/android/settings/connecteddevice/usb/UsbModeChooserActivityTest.java
deleted file mode 100644
index c02212b..0000000
--- a/tests/robotests/src/com/android/settings/connecteddevice/usb/UsbModeChooserActivityTest.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.settings.connecteddevice.usb;
-
-import static com.google.common.truth.Truth.assertThat;
-import static org.mockito.Matchers.anyInt;
-import static org.mockito.Mockito.never;
-import static org.mockito.Mockito.verify;
-
-import android.widget.TextView;
-import com.android.settings.R;
-import com.android.settings.connecteddevice.usb.UsbModeChooserActivity;
-import com.android.settings.testutils.SettingsRobolectricTestRunner;
-import com.android.settings.TestConfig;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-import org.robolectric.annotation.Config;
-
-@RunWith(SettingsRobolectricTestRunner.class)
-@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
-public class UsbModeChooserActivityTest {
-
- @Mock
- private TextView mTextView;
-
- @Before
- public void setUp() {
- MockitoAnnotations.initMocks(this);
- }
-
- @Test
- public void updateSummary_chargeDevice_shouldNotSetSummary() {
- UsbModeChooserActivity.updateSummary(mTextView, UsbModeChooserActivity.DEFAULT_MODES[0]);
- verify(mTextView, never()).setText(anyInt());
- }
-
- @Test
- public void updateSummary_supplyPower_shouldSetSummary() {
- UsbModeChooserActivity.updateSummary(mTextView, UsbModeChooserActivity.DEFAULT_MODES[1]);
- verify(mTextView).setText(R.string.usb_use_power_only_desc);
- }
-
- @Test
- public void updateSummary_transferFiles_shouldNotSetSummary() {
- UsbModeChooserActivity.updateSummary(mTextView, UsbModeChooserActivity.DEFAULT_MODES[2]);
- verify(mTextView, never()).setText(anyInt());
- }
-
- @Test
- public void updateSummary_transferPhoto_shouldNotSetSummary() {
- UsbModeChooserActivity.updateSummary(mTextView, UsbModeChooserActivity.DEFAULT_MODES[3]);
- verify(mTextView, never()).setText(anyInt());
- }
-
- @Test
- public void updateSummary_MIDI_shouldNotSetSummary() {
- UsbModeChooserActivity.updateSummary(mTextView, UsbModeChooserActivity.DEFAULT_MODES[4]);
- verify(mTextView, never()).setText(anyInt());
- }
-
- @Test
- public void getTitle_shouldReturnCorrectTitle() {
- assertThat(UsbModeChooserActivity.getTitle(UsbModeChooserActivity.DEFAULT_MODES[0]))
- .isEqualTo(R.string.usb_use_charging_only);
-
- assertThat(UsbModeChooserActivity.getTitle(UsbModeChooserActivity.DEFAULT_MODES[1]))
- .isEqualTo(R.string.usb_use_power_only);
-
- assertThat(UsbModeChooserActivity.getTitle(UsbModeChooserActivity.DEFAULT_MODES[2]))
- .isEqualTo(R.string.usb_use_file_transfers);
-
- assertThat(UsbModeChooserActivity.getTitle(UsbModeChooserActivity.DEFAULT_MODES[3]))
- .isEqualTo(R.string.usb_use_photo_transfers);
-
- assertThat(UsbModeChooserActivity.getTitle(UsbModeChooserActivity.DEFAULT_MODES[4]))
- .isEqualTo(R.string.usb_use_MIDI);
- }
-
-}
\ No newline at end of file
diff --git a/tests/robotests/src/com/android/settings/connecteddevice/usb/UsbModePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/connecteddevice/usb/UsbModePreferenceControllerTest.java
deleted file mode 100644
index a1c599f..0000000
--- a/tests/robotests/src/com/android/settings/connecteddevice/usb/UsbModePreferenceControllerTest.java
+++ /dev/null
@@ -1,105 +0,0 @@
-package com.android.settings.connecteddevice.usb;
-
-import static com.google.common.truth.Truth.assertThat;
-import static org.mockito.Answers.RETURNS_DEEP_STUBS;
-import static org.mockito.Mockito.when;
-
-import android.content.Context;
-import android.support.v7.preference.Preference;
-
-import com.android.settings.R;
-import com.android.settings.TestConfig;
-import com.android.settings.testutils.SettingsRobolectricTestRunner;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-import org.robolectric.annotation.Config;
-import org.robolectric.shadows.ShadowApplication;
-
-@RunWith(SettingsRobolectricTestRunner.class)
-@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
-public class UsbModePreferenceControllerTest {
-
- @Mock(answer = RETURNS_DEEP_STUBS)
- private UsbBackend mUsbBackend;
- @Mock
- private UsbConnectionBroadcastReceiver mUsbConnectionBroadcastReceiver;
-
- private Context mContext;
- private UsbModePreferenceController mController;
-
- @Before
- public void setUp() {
- MockitoAnnotations.initMocks(this);
- mContext = ShadowApplication.getInstance().getApplicationContext();
- mController = new UsbModePreferenceController(mContext, mUsbBackend, null /* lifecycle */);
- mController.mUsbReceiver = mUsbConnectionBroadcastReceiver;
- }
-
- @Test
- public void testGetSummary_chargeDevice() {
- assertThat(mController.getSummary(0))
- .isEqualTo(R.string.usb_summary_charging_only);
- }
-
- @Test
- public void testGetSummary_supplyPower() {
- assertThat(mController.getSummary(UsbBackend.MODE_POWER_SOURCE))
- .isEqualTo(R.string.usb_summary_power_only);
- }
-
- @Test
- public void testGetSummary_TransferFiles() {
- assertThat(mController.getSummary(UsbBackend.MODE_DATA_MTP))
- .isEqualTo(R.string.usb_summary_file_transfers);
- }
-
- @Test
- public void testGetSummary_TransferPhoto() {
- assertThat(mController.getSummary(UsbBackend.MODE_DATA_PTP))
- .isEqualTo(R.string.usb_summary_photo_transfers);
- }
-
- @Test
- public void testGetSummary_MIDI() {
- assertThat(mController.getSummary(UsbBackend.MODE_DATA_MIDI))
- .isEqualTo(R.string.usb_summary_MIDI);
- }
-
- @Test
- public void testGetSummary_Tethering() {
- assertThat(mController.getSummary(UsbBackend.MODE_DATA_TETHER))
- .isEqualTo(R.string.usb_summary_tether);
- }
-
- @Test
- public void testPreferenceSummary_usbDisconnected() {
- final Preference preference = new Preference(mContext);
- preference.setKey("usb_mode");
- preference.setEnabled(true);
- when(mUsbBackend.getCurrentMode()).thenReturn(UsbBackend.MODE_POWER_SINK);
- when(mUsbConnectionBroadcastReceiver.isConnected()).thenReturn(false);
- mController.updateState(preference);
-
- assertThat(preference.getKey()).isEqualTo("usb_mode");
- assertThat(preference.getSummary()).isEqualTo(
- mContext.getString(R.string.disconnected));
- }
-
- @Test
- public void testUsbBroadcastReceiver_usbConnected_shouldUpdateSummary() {
- final Preference preference = new Preference(mContext);
- preference.setKey("usb_mode");
- preference.setEnabled(true);
- when(mUsbBackend.getCurrentMode()).thenReturn(UsbBackend.MODE_POWER_SINK);
- when(mUsbConnectionBroadcastReceiver.isConnected()).thenReturn(true);
- mController.updateState(preference);
-
- assertThat(preference.getSummary()).isEqualTo(
- mContext.getString(R.string.usb_summary_charging_only));
- }
-
-}
\ No newline at end of file
diff --git a/tests/robotests/src/com/android/settings/core/BadPreferenceController.java b/tests/robotests/src/com/android/settings/core/BadPreferenceController.java
new file mode 100644
index 0000000..e636723
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/core/BadPreferenceController.java
@@ -0,0 +1,32 @@
+/*
+ * 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.core;
+
+import android.content.Context;
+
+public class BadPreferenceController extends BasePreferenceController {
+
+ public BadPreferenceController(Context context, String preferenceKey) {
+ super(context, preferenceKey);
+ throw new IllegalArgumentException("error");
+ }
+
+ @Override
+ public int getAvailabilityStatus() {
+ return AVAILABLE;
+ }
+}
diff --git a/tests/robotests/src/com/android/settings/core/BasePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/core/BasePreferenceControllerTest.java
index c0ac961..3c0740b 100644
--- a/tests/robotests/src/com/android/settings/core/BasePreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/core/BasePreferenceControllerTest.java
@@ -31,6 +31,7 @@
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
+import org.robolectric.RuntimeEnvironment;
import org.robolectric.annotation.Config;
@RunWith(SettingsRobolectricTestRunner.class)
@@ -45,6 +46,17 @@
MockitoAnnotations.initMocks(this);
}
+
+ @Test(expected = IllegalArgumentException.class)
+ public void newController_noKey_shouldCrash() {
+ new BasePreferenceController(RuntimeEnvironment.application, null /* key */) {
+ @Override
+ public int getAvailabilityStatus() {
+ return AVAILABLE;
+ }
+ };
+ }
+
@Test
public void isAvailable_availableStatusAvailable_returnsTrue() {
when(mPreferenceController.getAvailabilityStatus()).thenReturn(AVAILABLE);
diff --git a/tests/robotests/src/com/android/settings/core/PreferenceControllerListHelperTest.java b/tests/robotests/src/com/android/settings/core/PreferenceControllerListHelperTest.java
new file mode 100644
index 0000000..4361f78
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/core/PreferenceControllerListHelperTest.java
@@ -0,0 +1,129 @@
+/*
+ * 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.core;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.content.Context;
+
+import com.android.settings.R;
+import com.android.settings.TestConfig;
+import com.android.settings.slices.FakePreferenceController;
+import com.android.settings.testutils.SettingsRobolectricTestRunner;
+import com.android.settingslib.core.AbstractPreferenceController;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@RunWith(SettingsRobolectricTestRunner.class)
+@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
+public class PreferenceControllerListHelperTest {
+
+ private Context mContext;
+
+ @Before
+ public void setUp() {
+ mContext = RuntimeEnvironment.application;
+ }
+
+ @Test
+ @Config(qualifiers = "mcc999")
+ public void getControllers_shouldReturnAList() {
+ final List<BasePreferenceController> controllers =
+ PreferenceControllerListHelper.getPreferenceControllersFromXml(mContext,
+ R.xml.location_settings);
+
+ assertThat(controllers).isNotEmpty();
+ for (BasePreferenceController controller : controllers) {
+ assertThat(controller).isInstanceOf(FakePreferenceController.class);
+ }
+ }
+
+ @Test
+ @Config(qualifiers = "mcc998")
+ public void getControllers_partialFailure_shouldReturnTheRest() {
+ final List<BasePreferenceController> controllers =
+ PreferenceControllerListHelper.getPreferenceControllersFromXml(mContext,
+ R.xml.location_settings);
+
+ assertThat(controllers).hasSize(1);
+ assertThat(controllers.get(0)).isInstanceOf(FakePreferenceController.class);
+ }
+
+ @Test
+ public void filterControllers_noFilter_shouldReturnSameList() {
+ final List<BasePreferenceController> controllers = new ArrayList<>();
+ controllers.add(new BasePreferenceController(mContext, "key") {
+ @Override
+ public int getAvailabilityStatus() {
+ return AVAILABLE;
+ }
+ });
+ final List<BasePreferenceController> result = PreferenceControllerListHelper
+ .filterControllers(controllers, null /* filter */);
+ assertThat(result).containsExactlyElementsIn(controllers);
+ }
+
+ @Test
+ public void filterControllers_noDuplicationFromFilter_shouldReturnSameList() {
+ final List<BasePreferenceController> controllers = new ArrayList<>();
+ controllers.add(new BasePreferenceController(mContext, "key") {
+ @Override
+ public int getAvailabilityStatus() {
+ return AVAILABLE;
+ }
+ });
+ final List<AbstractPreferenceController> filter = new ArrayList<>();
+ filter.add(new BasePreferenceController(mContext, "key2") {
+ @Override
+ public int getAvailabilityStatus() {
+ return AVAILABLE;
+ }
+ });
+ final List<BasePreferenceController> result = PreferenceControllerListHelper
+ .filterControllers(controllers, filter);
+ assertThat(result).containsExactlyElementsIn(controllers);
+ }
+
+ @Test
+ public void filterControllers_hasDuplicationFromFilter_shouldReturnSameList() {
+ final List<BasePreferenceController> controllers = new ArrayList<>();
+ controllers.add(new BasePreferenceController(mContext, "key") {
+ @Override
+ public int getAvailabilityStatus() {
+ return AVAILABLE;
+ }
+ });
+ final List<AbstractPreferenceController> filter = new ArrayList<>();
+ filter.add(new BasePreferenceController(mContext, "key") {
+ @Override
+ public int getAvailabilityStatus() {
+ return AVAILABLE;
+ }
+ });
+ final List<BasePreferenceController> result = PreferenceControllerListHelper
+ .filterControllers(controllers, filter);
+ assertThat(result).isEmpty();
+ }
+
+}
diff --git a/tests/robotests/src/com/android/settings/core/SubSettingLauncherTest.java b/tests/robotests/src/com/android/settings/core/SubSettingLauncherTest.java
index 91d8f7b..3143381 100644
--- a/tests/robotests/src/com/android/settings/core/SubSettingLauncherTest.java
+++ b/tests/robotests/src/com/android/settings/core/SubSettingLauncherTest.java
@@ -18,12 +18,18 @@
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+import android.app.Activity;
+import android.app.Fragment;
import android.content.Context;
import android.content.Intent;
+import android.os.UserHandle;
import com.android.settings.SettingsActivity;
import com.android.settings.TestConfig;
@@ -34,6 +40,8 @@
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
import org.robolectric.RuntimeEnvironment;
import org.robolectric.annotation.Config;
@@ -41,10 +49,16 @@
@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
public class SubSettingLauncherTest {
+ @Mock
+ private Fragment mFragment;
+ @Mock
+ private Activity mActivity;
+
private Context mContext;
@Before
public void setUp() {
+ MockitoAnnotations.initMocks(this);
mContext = RuntimeEnvironment.application;
}
@@ -93,4 +107,58 @@
assertThat(intent.getIntExtra(VisibilityLoggerMixin.EXTRA_SOURCE_METRICS_CATEGORY, -1))
.isEqualTo(123);
}
+
+ @Test
+ public void launch_hasRequestListener_shouldStartActivityForResult() {
+ final int requestCode = 123123;
+ when(mFragment.getActivity()).thenReturn(mActivity);
+
+ final SubSettingLauncher launcher = spy(new SubSettingLauncher(mContext));
+ launcher.setTitle("123")
+ .setDestination(SubSettingLauncherTest.class.getName())
+ .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
+ .setSourceMetricsCategory(123)
+ .setResultListener(mFragment, requestCode)
+ .launch();
+
+ verify(mFragment).startActivityForResult(any(Intent.class), eq(requestCode));
+ }
+
+ @Test
+ public void launch_hasUserHandle_shouldStartActivityAsUser() {
+ final UserHandle userHandle = new UserHandle(1234);
+
+ final SubSettingLauncher launcher = spy(new SubSettingLauncher(mContext));
+ doNothing().when(launcher).launchAsUser(any(Intent.class), any(UserHandle.class));
+
+ launcher.setTitle("123")
+ .setDestination(SubSettingLauncherTest.class.getName())
+ .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
+ .setSourceMetricsCategory(123)
+ .setUserHandle(userHandle)
+ .launch();
+
+ verify(launcher).launchAsUser(any(Intent.class), eq(userHandle));
+ }
+
+ @Test
+ public void launch_hasUserHandleAndRequestCode_shouldStartActivityForResultAsUser() {
+ final int requestCode = 123123;
+ final UserHandle userHandle = new UserHandle(1234);
+
+ final SubSettingLauncher launcher = spy(new SubSettingLauncher(mContext));
+ doNothing().when(launcher).launchForResultAsUser(
+ any(Intent.class), any(UserHandle.class), any(Fragment.class), anyInt());
+
+ launcher.setTitle("123")
+ .setDestination(SubSettingLauncherTest.class.getName())
+ .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
+ .setSourceMetricsCategory(123)
+ .setUserHandle(userHandle)
+ .setResultListener(mFragment, requestCode)
+ .launch();
+
+ verify(launcher).launchForResultAsUser(any(Intent.class), eq(userHandle), eq(mFragment),
+ eq(requestCode));
+ }
}
diff --git a/tests/robotests/src/com/android/settings/core/XmlControllerAttributeTest.java b/tests/robotests/src/com/android/settings/core/XmlControllerAttributeTest.java
index e69b97e..4939cca 100644
--- a/tests/robotests/src/com/android/settings/core/XmlControllerAttributeTest.java
+++ b/tests/robotests/src/com/android/settings/core/XmlControllerAttributeTest.java
@@ -17,7 +17,6 @@
import com.android.settings.search.Indexable;
import com.android.settings.search.SearchFeatureProvider;
import com.android.settings.search.SearchFeatureProviderImpl;
-import com.android.settings.search.XmlParserUtils;
import com.android.settings.security.SecuritySettings;
import com.android.settings.testutils.FakeFeatureFactory;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
@@ -183,7 +182,7 @@
continue;
}
- controllerClassName = XmlParserUtils.getController(mContext, attrs);
+ controllerClassName = PreferenceXmlParserUtils.getController(mContext, attrs);
// If controller is not indexed, then it is not compatible with
if (!TextUtils.isEmpty(controllerClassName)) {
xmlControllers.add(controllerClassName);
diff --git a/tests/robotests/src/com/android/settings/dashboard/DashboardAdapterTest.java b/tests/robotests/src/com/android/settings/dashboard/DashboardAdapterTest.java
index cc25b5d..b85afaa 100644
--- a/tests/robotests/src/com/android/settings/dashboard/DashboardAdapterTest.java
+++ b/tests/robotests/src/com/android/settings/dashboard/DashboardAdapterTest.java
@@ -47,6 +47,7 @@
import com.android.settings.testutils.SettingsRobolectricTestRunner;
import com.android.settings.testutils.shadow.SettingsShadowResources;
import com.android.settingslib.drawer.Tile;
+import com.android.settingslib.utils.IconCache;
import org.junit.Before;
import org.junit.Test;
@@ -244,7 +245,7 @@
new DashboardAdapter.DashboardItemHolder(view);
final Tile tile = new Tile();
tile.icon = Icon.createWithResource(context, R.drawable.ic_settings);
- final DashboardAdapter.IconCache iconCache = mock(DashboardAdapter.IconCache.class);
+ final IconCache iconCache = mock(IconCache.class);
when(iconCache.getIcon(tile.icon)).thenReturn(context.getDrawable(R.drawable.ic_settings));
mDashboardAdapter = new DashboardAdapter(context, null /* savedInstanceState */,
@@ -265,7 +266,7 @@
tile.icon = mock(Icon.class);
when(tile.icon.getResPackage()).thenReturn("another.package");
- final DashboardAdapter.IconCache iconCache = mock(DashboardAdapter.IconCache.class);
+ final IconCache iconCache = mock(IconCache.class);
when(iconCache.getIcon(tile.icon)).thenReturn(context.getDrawable(R.drawable.ic_settings));
mDashboardAdapter = new DashboardAdapter(context, null /* savedInstanceState */,
diff --git a/tests/robotests/src/com/android/settings/dashboard/DashboardFragmentSearchIndexProviderInspector.java b/tests/robotests/src/com/android/settings/dashboard/DashboardFragmentSearchIndexProviderInspector.java
index 3d9783d..83579b4 100644
--- a/tests/robotests/src/com/android/settings/dashboard/DashboardFragmentSearchIndexProviderInspector.java
+++ b/tests/robotests/src/com/android/settings/dashboard/DashboardFragmentSearchIndexProviderInspector.java
@@ -19,6 +19,8 @@
import android.app.Fragment;
import android.content.Context;
+import com.android.settings.core.BasePreferenceController;
+import com.android.settings.core.PreferenceControllerListHelper;
import com.android.settings.search.DatabaseIndexingUtils;
import com.android.settings.search.Indexable;
import com.android.settingslib.core.AbstractPreferenceController;
@@ -57,7 +59,15 @@
}
try {
controllersFromFragment =
- ((DashboardFragment) fragment).getPreferenceControllers(context);
+ ((DashboardFragment) fragment).createPreferenceControllers(context);
+ List<BasePreferenceController> controllersFromXml = PreferenceControllerListHelper
+ .getPreferenceControllersFromXml(context,
+ ((DashboardFragment) fragment).getPreferenceScreenResId());
+ final List<BasePreferenceController> uniqueControllerFromXml =
+ PreferenceControllerListHelper.filterControllers(
+ controllersFromXml, controllersFromFragment);
+ controllersFromFragment.addAll(uniqueControllerFromXml);
+
} catch (Throwable e) {
// Can't do much with exception, assume the test passed.
return true;
diff --git a/tests/robotests/src/com/android/settings/dashboard/DashboardFragmentTest.java b/tests/robotests/src/com/android/settings/dashboard/DashboardFragmentTest.java
index 40e590a..49734b6 100644
--- a/tests/robotests/src/com/android/settings/dashboard/DashboardFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/dashboard/DashboardFragmentTest.java
@@ -19,6 +19,8 @@
import static org.mockito.ArgumentMatchers.nullable;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@@ -44,11 +46,10 @@
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.RuntimeEnvironment;
import org.robolectric.annotation.Config;
-import org.robolectric.shadows.ShadowApplication;
import org.robolectric.util.ReflectionHelpers;
import java.util.ArrayList;
@@ -58,24 +59,25 @@
@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
public class DashboardFragmentTest {
- @Mock(answer = Answers.RETURNS_DEEP_STUBS)
- private Context mContext;
+
@Mock
private FakeFeatureFactory mFakeFeatureFactory;
private DashboardCategory mDashboardCategory;
+ private Context mContext;
private TestFragment mTestFragment;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
+ mContext = spy(RuntimeEnvironment.application);
mFakeFeatureFactory = FakeFeatureFactory.setupForTest();
mDashboardCategory = new DashboardCategory();
mDashboardCategory.addTile(new Tile());
- mTestFragment = new TestFragment(ShadowApplication.getInstance().getApplicationContext());
+ mTestFragment = new TestFragment(mContext);
when(mFakeFeatureFactory.dashboardFeatureProvider
.getTilesForCategory(nullable(String.class)))
.thenReturn(mDashboardCategory);
- mTestFragment.onAttach(ShadowApplication.getInstance().getApplicationContext());
+ mTestFragment.onAttach(mContext);
when(mContext.getPackageName()).thenReturn("TestPackage");
}
@@ -84,7 +86,7 @@
final TestPreferenceController controller = new TestPreferenceController(mContext);
mTestFragment.addPreferenceController(controller);
- final TestPreferenceController retrievedController = mTestFragment.getPreferenceController
+ final TestPreferenceController retrievedController = mTestFragment.use
(TestPreferenceController.class);
assertThat(controller).isSameAs(retrievedController);
@@ -97,7 +99,7 @@
final TestPreferenceController controller2 = new TestPreferenceController(mContext);
mTestFragment.addPreferenceController(controller2);
- final TestPreferenceController retrievedController = mTestFragment.getPreferenceController
+ final TestPreferenceController retrievedController = mTestFragment.use
(TestPreferenceController.class);
assertThat(controller1).isSameAs(retrievedController);
@@ -133,7 +135,7 @@
@Test
public void onAttach_shouldCreatePlaceholderPreferenceController() {
- final AbstractPreferenceController controller = mTestFragment.getPreferenceController(
+ final AbstractPreferenceController controller = mTestFragment.use(
DashboardTilePlaceholderPreferenceController.class);
assertThat(controller).isNotNull();
@@ -146,16 +148,18 @@
mock(AbstractPreferenceController.class);
final AbstractPreferenceController mockController2 =
mock(AbstractPreferenceController.class);
+ when(mockController1.getPreferenceKey()).thenReturn("key1");
+ when(mockController2.getPreferenceKey()).thenReturn("key2");
preferenceControllers.add(mockController1);
preferenceControllers.add(mockController2);
when(mockController1.isAvailable()).thenReturn(false);
when(mockController2.isAvailable()).thenReturn(true);
- mTestFragment.onAttach(ShadowApplication.getInstance().getApplicationContext());
+ mTestFragment.onAttach(mContext);
mTestFragment.onResume();
- verify(mockController1, never()).getPreferenceKey();
- verify(mockController2).getPreferenceKey();
+ verify(mockController1).getPreferenceKey();
+ verify(mockController2, times(2)).getPreferenceKey();
}
@Test
@@ -205,9 +209,7 @@
final Intent intent = new Intent();
tile.intent = intent;
- intent.setComponent(new ComponentName(
- ShadowApplication.getInstance().getApplicationContext().getPackageName(),
- "TestClass"));
+ intent.setComponent(new ComponentName(mContext.getPackageName(), "TestClass"));
assertThat(mTestFragment.tintTileIcon(tile)).isFalse();
intent.setComponent(new ComponentName("OtherPackage", "TestClass"));
@@ -287,7 +289,7 @@
}
@Override
- protected List<AbstractPreferenceController> getPreferenceControllers(Context context) {
+ protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
return mControllers;
}
diff --git a/tests/robotests/src/com/android/settings/dashboard/conditional/BackgroundDataConditionTest.java b/tests/robotests/src/com/android/settings/dashboard/conditional/BackgroundDataConditionTest.java
new file mode 100644
index 0000000..be0da83
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/dashboard/conditional/BackgroundDataConditionTest.java
@@ -0,0 +1,88 @@
+/*
+ * 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.dashboard.conditional;
+
+import android.content.Context;
+import android.content.Intent;
+import android.util.FeatureFlagUtils;
+
+import com.android.settings.Settings;
+import com.android.settings.TestConfig;
+import com.android.settings.core.FeatureFlags;
+import com.android.settings.testutils.SettingsRobolectricTestRunner;
+import com.android.settings.testutils.shadow.SettingsShadowSystemProperties;
+import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
+
+import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+@RunWith(SettingsRobolectricTestRunner.class)
+@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION, shadows =
+ SettingsShadowSystemProperties.class)
+public class BackgroundDataConditionTest {
+ @Mock
+ private ConditionManager mConditionManager;
+
+ private Context mContext;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ mContext = spy(RuntimeEnvironment.application);
+ when(mConditionManager.getContext()).thenReturn(mContext);
+ }
+
+ @Test
+ public void onPrimaryClick_v2enabled_shouldReturnv2SummaryActivity() {
+ FeatureFlagUtils.setEnabled(mContext, FeatureFlags.DATA_USAGE_SETTINGS_V2, true);
+
+ final ArgumentCaptor<Intent> argumentCaptor = ArgumentCaptor.forClass(Intent.class);
+ BackgroundDataCondition backgroundDataCondition
+ = new BackgroundDataCondition(mConditionManager);
+ backgroundDataCondition.onPrimaryClick();
+ verify(mContext).startActivity(argumentCaptor.capture());
+ Intent intent = argumentCaptor.getValue();
+
+ assertThat(intent.getComponent().getClassName()).isEqualTo(
+ Settings.DataUsageSummaryActivity.class.getName());
+ }
+
+ @Test
+ public void onPrimaryClick_v2disabled_shouldReturnLegacySummaryActivity() {
+ FeatureFlagUtils.setEnabled(mContext, FeatureFlags.DATA_USAGE_SETTINGS_V2, false);
+
+ final ArgumentCaptor<Intent> argumentCaptor = ArgumentCaptor.forClass(Intent.class);
+ BackgroundDataCondition backgroundDataCondition
+ = new BackgroundDataCondition(mConditionManager);
+ backgroundDataCondition.onPrimaryClick();
+ verify(mContext).startActivity(argumentCaptor.capture());
+ Intent intent = argumentCaptor.getValue();
+
+ assertThat(intent.getComponent().getClassName()).isEqualTo(
+ Settings.DataUsageSummaryLegacyActivity.class.getName());
+ }
+}
diff --git a/tests/robotests/src/com/android/settings/dashboard/conditional/WorkModeConditionTest.java b/tests/robotests/src/com/android/settings/dashboard/conditional/WorkModeConditionTest.java
new file mode 100644
index 0000000..dff7700
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/dashboard/conditional/WorkModeConditionTest.java
@@ -0,0 +1,68 @@
+/*
+ * 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.dashboard.conditional;
+
+import static org.mockito.ArgumentMatchers.argThat;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.content.ComponentName;
+import android.content.Context;
+
+import com.android.settings.Settings;
+import com.android.settings.TestConfig;
+import com.android.settings.testutils.FakeFeatureFactory;
+import com.android.settings.testutils.SettingsRobolectricTestRunner;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
+
+@RunWith(SettingsRobolectricTestRunner.class)
+@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
+public class WorkModeConditionTest {
+
+ @Mock
+ private ConditionManager mConditionManager;
+
+ private Context mContext;
+ private WorkModeCondition mCondition;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ mContext = spy(RuntimeEnvironment.application);
+ FakeFeatureFactory.setupForTest();
+ when(mConditionManager.getContext()).thenReturn(mContext);
+ mCondition = new WorkModeCondition(mConditionManager);
+ }
+
+ @Test
+ public void onPrimaryClick_shouldLaunchAccountsSetting() {
+ final ComponentName componentName =
+ new ComponentName(mContext, Settings.AccountDashboardActivity.class);
+
+ mCondition.onPrimaryClick();
+
+ verify(mContext).startActivity(
+ argThat(intent-> intent.getComponent().equals(componentName)));
+ }
+}
diff --git a/tests/robotests/src/com/android/settings/dashboard/suggestions/SuggestionAdapterTest.java b/tests/robotests/src/com/android/settings/dashboard/suggestions/SuggestionAdapterTest.java
index 4ff09c1..512ac64 100644
--- a/tests/robotests/src/com/android/settings/dashboard/suggestions/SuggestionAdapterTest.java
+++ b/tests/robotests/src/com/android/settings/dashboard/suggestions/SuggestionAdapterTest.java
@@ -48,6 +48,7 @@
import com.android.settings.testutils.FakeFeatureFactory;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
import com.android.settingslib.suggestions.SuggestionControllerMixin;
+import com.android.settingslib.utils.IconCache;
import org.junit.Before;
import org.junit.Test;
@@ -252,7 +253,7 @@
mSuggestionHolder = mSuggestionAdapter.onCreateViewHolder(
new FrameLayout(RuntimeEnvironment.application),
mSuggestionAdapter.getItemViewType(0));
- DashboardAdapter.IconCache cache = mock(DashboardAdapter.IconCache.class);
+ IconCache cache = mock(IconCache.class);
final Drawable drawable = mock(Drawable.class);
when(cache.getIcon(icon)).thenReturn(drawable);
ReflectionHelpers.setField(mSuggestionAdapter, "mCache", cache);
@@ -280,7 +281,7 @@
mSuggestionHolder = mSuggestionAdapter.onCreateViewHolder(
new FrameLayout(RuntimeEnvironment.application),
mSuggestionAdapter.getItemViewType(0));
- DashboardAdapter.IconCache cache = mock(DashboardAdapter.IconCache.class);
+ IconCache cache = mock(IconCache.class);
final Drawable drawable = mock(Drawable.class);
when(cache.getIcon(icon)).thenReturn(drawable);
ReflectionHelpers.setField(mSuggestionAdapter, "mCache", cache);
diff --git a/tests/robotests/src/com/android/settings/development/BluetoothDelayReportsPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/development/BluetoothDelayReportsPreferenceControllerTest.java
new file mode 100644
index 0000000..e8dfba3
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/development/BluetoothDelayReportsPreferenceControllerTest.java
@@ -0,0 +1,129 @@
+/*
+ * 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.development;
+
+
+import static com.android.settings.development.BluetoothDelayReportsPreferenceController
+ .BLUETOOTH_ENABLE_AVDTP_DELAY_REPORTS_PROPERTY;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.support.v14.preference.SwitchPreference;
+import android.support.v7.preference.PreferenceScreen;
+
+import com.android.settings.TestConfig;
+import com.android.settings.testutils.SettingsRobolectricTestRunner;
+import com.android.settings.testutils.shadow.SettingsShadowSystemProperties;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
+
+@RunWith(SettingsRobolectricTestRunner.class)
+@Config(manifest = TestConfig.MANIFEST_PATH,
+ sdk = TestConfig.SDK_VERSION,
+ shadows = {SettingsShadowSystemProperties.class})
+public class BluetoothDelayReportsPreferenceControllerTest {
+
+ @Mock
+ private PreferenceScreen mPreferenceScreen;
+
+ private Context mContext;
+ private SwitchPreference mPreference;
+ private BluetoothDelayReportsPreferenceController mController;
+
+ @Before
+ public void setup() {
+ MockitoAnnotations.initMocks(this);
+ mContext = RuntimeEnvironment.application;
+ mPreference = new SwitchPreference(mContext);
+ mController = spy(new BluetoothDelayReportsPreferenceController(mContext));
+ when(mPreferenceScreen.findPreference(mController.getPreferenceKey())).thenReturn(
+ mPreference);
+ mController.displayPreference(mPreferenceScreen);
+ }
+
+ @Test
+ public void onPreferenceChanged_settingEnabled_turnOnDelayReports() {
+ mController.onPreferenceChange(mPreference, true /* new value */);
+
+ final boolean mode = SettingsShadowSystemProperties.getBoolean(
+ BLUETOOTH_ENABLE_AVDTP_DELAY_REPORTS_PROPERTY, false /* default */);
+
+ assertThat(mode).isTrue();
+ }
+
+ @Test
+ public void onPreferenceChanged_settingDisabled_turnOffDelayReports() {
+ mController.onPreferenceChange(mPreference, false /* new value */);
+
+ final boolean mode = SettingsShadowSystemProperties.getBoolean(
+ BLUETOOTH_ENABLE_AVDTP_DELAY_REPORTS_PROPERTY, false /* default */);
+
+ assertThat(mode).isFalse();
+ }
+
+ @Test
+ public void updateState_settingEnabled_preferenceShouldBeChecked() {
+ SettingsShadowSystemProperties.set(BLUETOOTH_ENABLE_AVDTP_DELAY_REPORTS_PROPERTY,
+ Boolean.toString(true));
+ mController.updateState(mPreference);
+
+ assertThat(mPreference.isChecked()).isTrue();
+ }
+
+ @Test
+ public void updateState_settingDisabled_preferenceShouldNotBeChecked() {
+ SettingsShadowSystemProperties.set(BLUETOOTH_ENABLE_AVDTP_DELAY_REPORTS_PROPERTY,
+ Boolean.toString(false));
+ mController.updateState(mPreference);
+
+ assertThat(mPreference.isChecked()).isFalse();
+ }
+
+ @Test
+ public void onDeveloperOptionsDisabled_shouldDisablePreference() {
+ mController.onDeveloperOptionsDisabled();
+
+ final boolean mode = SettingsShadowSystemProperties.getBoolean(
+ BLUETOOTH_ENABLE_AVDTP_DELAY_REPORTS_PROPERTY, false /* default */);
+
+ assertThat(mode).isFalse();
+ assertThat(mPreference.isEnabled()).isFalse();
+ assertThat(mPreference.isChecked()).isFalse();
+ }
+
+ @Test
+ public void onDeveloperOptionsEnabled_shouldEnablePreference() {
+ mController.onDeveloperOptionsEnabled();
+
+ final boolean mode = SettingsShadowSystemProperties.getBoolean(
+ BLUETOOTH_ENABLE_AVDTP_DELAY_REPORTS_PROPERTY, false /* default */);
+
+ assertThat(mode).isFalse();
+ assertThat(mPreference.isEnabled()).isTrue();
+ assertThat(mPreference.isChecked()).isFalse();
+ }
+}
\ No newline at end of file
diff --git a/tests/robotests/src/com/android/settings/development/BluetoothMaxConnectedAudioDevicesPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/development/BluetoothMaxConnectedAudioDevicesPreferenceControllerTest.java
index cf892f8..cd56b78 100644
--- a/tests/robotests/src/com/android/settings/development/BluetoothMaxConnectedAudioDevicesPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/development/BluetoothMaxConnectedAudioDevicesPreferenceControllerTest.java
@@ -17,13 +17,15 @@
package com.android.settings.development;
import static com.android.settings.development.BluetoothMaxConnectedAudioDevicesPreferenceController
- .BLUETOOTH_MAX_CONNECTED_AUDIO_DEVICES_PROPERTY;
+ .MAX_CONNECTED_AUDIO_DEVICES_PROPERTY;
import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.when;
import android.content.Context;
+import android.content.res.Resources;
import android.os.SystemProperties;
import android.support.v7.preference.ListPreference;
import android.support.v7.preference.PreferenceScreen;
@@ -39,6 +41,7 @@
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
+import org.mockito.Spy;
import org.robolectric.RuntimeEnvironment;
import org.robolectric.annotation.Config;
@@ -47,37 +50,41 @@
sdk = TestConfig.SDK_VERSION,
shadows = {SettingsShadowSystemProperties.class})
public class BluetoothMaxConnectedAudioDevicesPreferenceControllerTest {
+ private static final int TEST_MAX_CONNECTED_AUDIO_DEVICES = 3;
@Mock
private PreferenceScreen mPreferenceScreen;
+ @Spy
+ private Context mSpyContext = RuntimeEnvironment.application;
+ @Spy
+ private Resources mSpyResources = RuntimeEnvironment.application.getResources();
- private Context mContext;
private ListPreference mPreference;
private BluetoothMaxConnectedAudioDevicesPreferenceController mController;
- /**
- * 0: 1 device maximum (Default)
- * 1: 2 devices maximum
- * 2: 3 devices maximum
- * 3: 4 devices maximum
- * 4: 5 devices maximum
- */
- private String[] mListValues;
- private String[] mListSummaries;
+ private CharSequence[] mListValues;
+ private CharSequence[] mListEntries;
@Before
public void setup() {
MockitoAnnotations.initMocks(this);
- mContext = RuntimeEnvironment.application;
- mPreference = new ListPreference(mContext);
- mListValues = mContext.getResources().getStringArray(
- R.array.bluetooth_max_connected_audio_devices_values);
- mListSummaries = mContext.getResources().getStringArray(
- R.array.bluetooth_max_connected_audio_devices);
- mController = new BluetoothMaxConnectedAudioDevicesPreferenceController(mContext);
+ doReturn(mSpyResources).when(mSpyContext).getResources();
+ // Get XML values without mock
+ // Setup test list preference using XML values
+ mPreference = new ListPreference(mSpyContext);
+ mPreference.setEntries(R.array.bluetooth_max_connected_audio_devices);
+ mPreference.setEntryValues(R.array.bluetooth_max_connected_audio_devices_values);
+ // Stub default max connected audio devices to a test controlled value
+ doReturn(TEST_MAX_CONNECTED_AUDIO_DEVICES).when(mSpyResources).getInteger(
+ com.android.internal.R.integer.config_bluetooth_max_connected_audio_devices);
+ // Init the actual controller
+ mController = new BluetoothMaxConnectedAudioDevicesPreferenceController(mSpyContext);
+ // Construct preference in the controller via a mocked preference screen object
when(mPreferenceScreen.findPreference(mController.getPreferenceKey())).thenReturn(
mPreference);
mController.displayPreference(mPreferenceScreen);
+ mListValues = mPreference.getEntryValues();
+ mListEntries = mPreference.getEntries();
}
@After
@@ -86,39 +93,67 @@
}
@Test
+ public void verifyResourceSizeAndRange() {
+ // Verify normal list entries and default preference entries have the same size
+ assertThat(mListEntries.length).isEqualTo(mListValues.length);
+ // Verify that list entries are formatted correctly
+ final String defaultEntry = String.format(mListEntries[0].toString(),
+ TEST_MAX_CONNECTED_AUDIO_DEVICES);
+ assertThat(mListEntries[0]).isEqualTo(defaultEntry);
+ // Update the preference
+ mController.updateState(mPreference);
+ // Verify default preference value, entry and summary
+ assertThat(mPreference.getValue()).isEqualTo(mListValues[0]);
+ assertThat(mPreference.getEntry()).isEqualTo(mListEntries[0]);
+ assertThat(mPreference.getSummary()).isEqualTo(mListEntries[0]);
+ // Verify that default system property is empty
+ assertThat(SystemProperties.get(MAX_CONNECTED_AUDIO_DEVICES_PROPERTY)).isEmpty();
+ // Verify default property integer value
+ assertThat(SystemProperties.getInt(MAX_CONNECTED_AUDIO_DEVICES_PROPERTY,
+ TEST_MAX_CONNECTED_AUDIO_DEVICES)).isEqualTo(TEST_MAX_CONNECTED_AUDIO_DEVICES);
+ }
+
+ @Test
public void onPreferenceChange_setNumberOfDevices() {
- for (int numberOfDevices = 0; numberOfDevices < mListValues.length; numberOfDevices++) {
- mController.onPreferenceChange(mPreference, mListValues[numberOfDevices]);
-
- final String currentValue = SystemProperties.get(
- BLUETOOTH_MAX_CONNECTED_AUDIO_DEVICES_PROPERTY);
-
- assertThat(currentValue).isEqualTo(mListValues[numberOfDevices]);
- assertThat(mPreference.getValue()).isEqualTo(mListValues[numberOfDevices]);
- assertThat(mPreference.getSummary()).isEqualTo(mListSummaries[numberOfDevices]);
+ for (final CharSequence newValue : mListValues) {
+ // Change preference using a list value
+ mController.onPreferenceChange(mPreference, newValue);
+ // Verify that value is set on the preference
+ assertThat(mPreference.getValue()).isEqualTo(newValue);
+ int index = mPreference.findIndexOfValue(newValue.toString());
+ assertThat(mPreference.getEntry()).isEqualTo(mListEntries[index]);
+ // Verify that system property is set correctly after the change
+ final String currentValue = SystemProperties.get(MAX_CONNECTED_AUDIO_DEVICES_PROPERTY);
+ assertThat(currentValue).isEqualTo(mListValues[index]);
}
}
@Test
public void updateState_NumberOfDevicesUpdated_shouldSetPreference() {
- for (int numberOfDevices = 0; numberOfDevices < mListValues.length; numberOfDevices++) {
- SystemProperties.set(BLUETOOTH_MAX_CONNECTED_AUDIO_DEVICES_PROPERTY,
- mListValues[numberOfDevices]);
-
+ for (int i = 0; i < mListValues.length; ++i) {
+ final String propertyValue = mListValues[i].toString();
+ SystemProperties.set(MAX_CONNECTED_AUDIO_DEVICES_PROPERTY, propertyValue);
+ // Verify that value is set on the preference
mController.updateState(mPreference);
-
- assertThat(mPreference.getValue()).isEqualTo(mListValues[numberOfDevices]);
- assertThat(mPreference.getSummary()).isEqualTo(mListSummaries[numberOfDevices]);
+ assertThat(mPreference.getValue()).isEqualTo(mListValues[i]);
+ assertThat(mPreference.getEntry()).isEqualTo(mListEntries[i]);
+ assertThat(mPreference.getSummary()).isEqualTo(mListEntries[i]);
+ // Verify that property value remain unchanged
+ assertThat(SystemProperties.get(MAX_CONNECTED_AUDIO_DEVICES_PROPERTY))
+ .isEqualTo(propertyValue);
}
}
@Test
public void updateState_noValueSet_shouldSetDefaultTo1device() {
- SystemProperties.set(BLUETOOTH_MAX_CONNECTED_AUDIO_DEVICES_PROPERTY, "garbage");
+ SystemProperties.set(MAX_CONNECTED_AUDIO_DEVICES_PROPERTY, "garbage");
mController.updateState(mPreference);
+ // Verify that preference is reset back to default and property is reset to default
assertThat(mPreference.getValue()).isEqualTo(mListValues[0]);
- assertThat(mPreference.getSummary()).isEqualTo(mListSummaries[0]);
+ assertThat(mPreference.getEntry()).isEqualTo(mListEntries[0]);
+ assertThat(mPreference.getSummary()).isEqualTo(mListEntries[0]);
+ assertThat(SystemProperties.get(MAX_CONNECTED_AUDIO_DEVICES_PROPERTY)).isEmpty();
}
@Test
@@ -126,26 +161,30 @@
mController.onDeveloperOptionsSwitchDisabled();
assertThat(mPreference.isEnabled()).isFalse();
+ // Verify that preference is reset back to default and property is reset to default
assertThat(mPreference.getValue()).isEqualTo(mListValues[0]);
- assertThat(mPreference.getSummary()).isEqualTo(mListSummaries[0]);
- final String currentValue = SystemProperties.get(
- BLUETOOTH_MAX_CONNECTED_AUDIO_DEVICES_PROPERTY);
- assertThat(currentValue).isEqualTo(mListValues[0]);
+ assertThat(mPreference.getEntry()).isEqualTo(mListEntries[0]);
+ assertThat(mPreference.getSummary()).isEqualTo(mListEntries[0]);
+ assertThat(SystemProperties.get(MAX_CONNECTED_AUDIO_DEVICES_PROPERTY)).isEmpty();
}
@Test
public void onDeveloperOptionsSwitchEnabled_shouldEnablePreference() {
- for (int numberOfDevices = 0; numberOfDevices < mListValues.length; numberOfDevices++) {
+ for (int i = 0; i < mListValues.length; ++i) {
+ final String initialValue = mListValues[i].toString();
mController.onDeveloperOptionsSwitchDisabled();
assertThat(mPreference.isEnabled()).isFalse();
- SystemProperties.set(BLUETOOTH_MAX_CONNECTED_AUDIO_DEVICES_PROPERTY,
- mListValues[numberOfDevices]);
+ SystemProperties.set(MAX_CONNECTED_AUDIO_DEVICES_PROPERTY, initialValue);
mController.onDeveloperOptionsSwitchEnabled();
assertThat(mPreference.isEnabled()).isTrue();
- assertThat(mPreference.getValue()).isEqualTo(mListValues[numberOfDevices]);
- assertThat(mPreference.getSummary()).isEqualTo(mListSummaries[numberOfDevices]);
+ assertThat(mPreference.getValue()).isEqualTo(mListValues[i]);
+ assertThat(mPreference.getEntry()).isEqualTo(mListEntries[i]);
+ assertThat(mPreference.getSummary()).isEqualTo(mListEntries[i]);
+ // Verify that property value remain unchanged
+ assertThat(SystemProperties.get(MAX_CONNECTED_AUDIO_DEVICES_PROPERTY))
+ .isEqualTo(initialValue);
}
}
}
diff --git a/tests/robotests/src/com/android/settings/development/DarkUIPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/development/DarkUIPreferenceControllerTest.java
new file mode 100644
index 0000000..47b966a
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/development/DarkUIPreferenceControllerTest.java
@@ -0,0 +1,85 @@
+/*
+ * 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.development;
+
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.app.UiModeManager;
+import android.content.Context;
+import android.support.v7.preference.ListPreference;
+import android.support.v7.preference.PreferenceScreen;
+
+import com.android.settings.TestConfig;
+import com.android.settings.testutils.SettingsRobolectricTestRunner;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
+
+@RunWith(SettingsRobolectricTestRunner.class)
+@Config(manifest = TestConfig.MANIFEST_PATH,
+ sdk = TestConfig.SDK_VERSION)
+public class DarkUIPreferenceControllerTest {
+
+ private Context mContext;
+ @Mock
+ private ListPreference mPreference;
+ @Mock
+ private PreferenceScreen mPreferenceScreen;
+ @Mock
+ private UiModeManager mUiModeManager;
+ private DarkUIPreferenceController mController;
+
+ @Before
+ public void setup() {
+ MockitoAnnotations.initMocks(this);
+ mContext = RuntimeEnvironment.application;
+ mController = new DarkUIPreferenceController(mContext, mUiModeManager);
+ when(mPreferenceScreen.findPreference(mController.getPreferenceKey())).thenReturn(
+ mPreference);
+ mController.displayPreference(mPreferenceScreen);
+ }
+
+ @Test
+ public void onPreferenceChanged_setAuto() {
+ mController.onPreferenceChange(mPreference, "auto");
+ verify(mUiModeManager).setNightMode(eq(UiModeManager.MODE_NIGHT_AUTO));
+ }
+
+ @Test
+ public void onPreferenceChanged_setNightMode() {
+ mController.onPreferenceChange(mPreference, "yes");
+ verify(mUiModeManager).setNightMode(eq(UiModeManager.MODE_NIGHT_YES));
+ }
+
+ @Test
+ public void onPreferenceChanged_setDayMode() {
+ mController.onPreferenceChange(mPreference, "no");
+ verify(mUiModeManager).setNightMode(eq(UiModeManager.MODE_NIGHT_NO));
+ }
+
+ public int getCurrentMode() {
+ final UiModeManager uiModeManager = mContext.getSystemService(UiModeManager.class);
+ return uiModeManager.getNightMode();
+ }
+}
diff --git a/tests/robotests/src/com/android/settings/development/SelectUsbConfigPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/development/SelectUsbConfigPreferenceControllerTest.java
deleted file mode 100644
index 67a6d6b..0000000
--- a/tests/robotests/src/com/android/settings/development/SelectUsbConfigPreferenceControllerTest.java
+++ /dev/null
@@ -1,244 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settings.development;
-
-import static android.arch.lifecycle.Lifecycle.Event.ON_CREATE;
-import static android.arch.lifecycle.Lifecycle.Event.ON_DESTROY;
-import static com.google.common.truth.Truth.assertThat;
-
-import static junit.framework.Assert.assertFalse;
-import static junit.framework.Assert.assertTrue;
-
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.anyBoolean;
-import static org.mockito.ArgumentMatchers.anyLong;
-import static org.mockito.ArgumentMatchers.anyString;
-import static org.mockito.Mockito.doNothing;
-import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.never;
-import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-import android.arch.lifecycle.LifecycleOwner;
-import android.content.Context;
-import android.content.pm.PackageManager;
-import android.hardware.usb.UsbManager;
-import android.hardware.usb.UsbManagerExtras;
-import android.support.v7.preference.ListPreference;
-import android.support.v7.preference.PreferenceScreen;
-
-import com.android.settings.R;
-import com.android.settings.TestConfig;
-import com.android.settings.connecteddevice.usb.UsbBackend;
-import com.android.settings.testutils.SettingsRobolectricTestRunner;
-import com.android.settings.testutils.shadow.ShadowUtils;
-import com.android.settingslib.core.lifecycle.Lifecycle;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-import org.robolectric.RuntimeEnvironment;
-import org.robolectric.annotation.Config;
-
-@RunWith(SettingsRobolectricTestRunner.class)
-@Config(manifest = TestConfig.MANIFEST_PATH,
- sdk = TestConfig.SDK_VERSION,
- shadows = {ShadowUtils.class})
-public class SelectUsbConfigPreferenceControllerTest {
-
- @Mock
- private ListPreference mPreference;
- @Mock
- private PreferenceScreen mScreen;
- @Mock
- private UsbManager mUsbManager;
- @Mock
- private PackageManager mPackageManager;
- @Mock
- private UsbBackend.UsbManagerPassThrough mUsbManagerPassThrough;
-
- private Context mContext;
- private LifecycleOwner mLifecycleOwner;
- private Lifecycle mLifecycle;
- private SelectUsbConfigPreferenceController mController;
-
- /**
- * Array Values Key
- *
- * 0: Charging
- * 1: MTP
- * 2: PTP
- * 3: RNDIS
- * 4: Audio Source
- * 5: MIDI
- */
- private String[] mValues;
- private String[] mSummaries;
-
- @Before
- public void setup() {
- MockitoAnnotations.initMocks(this);
- mLifecycleOwner = () -> mLifecycle;
- mLifecycle = new Lifecycle(mLifecycleOwner);
- mContext = spy(RuntimeEnvironment.application);
- doReturn(mUsbManager).when(mContext).getSystemService(Context.USB_SERVICE);
- doReturn(mPackageManager).when(mContext).getPackageManager();
- mValues = mContext.getResources().getStringArray(R.array.usb_configuration_values);
- mSummaries = mContext.getResources().getStringArray(R.array.usb_configuration_titles);
- mController = spy(new SelectUsbConfigPreferenceController(mContext, mLifecycle));
- when(mScreen.findPreference(mController.getPreferenceKey())).thenReturn(mPreference);
- mController.displayPreference(mScreen);
- mController.mUsbManagerPassThrough = mUsbManagerPassThrough;
-
- when(mUsbManagerPassThrough.usbFunctionsFromString("mtp")).thenReturn(UsbManagerExtras.MTP);
- when(mUsbManagerPassThrough.usbFunctionsFromString("rndis"))
- .thenReturn(UsbManagerExtras.RNDIS);
- when(mUsbManagerPassThrough.usbFunctionsFromString("none"))
- .thenReturn(UsbManagerExtras.NONE);
-
- }
-
- @After
- public void teardown() {
- ShadowUtils.reset();
- }
-
- @Test
- public void onPreferenceChange_setCharging_shouldEnableCharging() {
- when(mUsbManagerPassThrough.getCurrentFunctions()).thenReturn(
- UsbManagerExtras.usbFunctionsFromString(mValues[0]));
- doNothing().when(mController).setCurrentFunctions(anyLong());
- mController.onPreferenceChange(mPreference, mValues[0]);
-
- verify(mController).setCurrentFunctions(
- UsbManagerExtras.usbFunctionsFromString(mValues[0]));
- }
-
- @Test
- public void onUsbAccessoryAndHostDisabled_shouldNotBeAvailable() {
- when(mPackageManager.hasSystemFeature(PackageManager.FEATURE_USB_HOST)).thenReturn(false);
- when(mPackageManager.hasSystemFeature(PackageManager.FEATURE_USB_ACCESSORY)).thenReturn(
- false);
- assertFalse(mController.isAvailable());
- }
-
- @Test
- public void onUsbHostEnabled_shouldBeAvailable() {
- when(mPackageManager.hasSystemFeature(PackageManager.FEATURE_USB_HOST)).thenReturn(true);
- when(mPackageManager.hasSystemFeature(PackageManager.FEATURE_USB_ACCESSORY)).thenReturn(
- false);
- assertTrue(mController.isAvailable());
- }
-
- @Test
- public void onUsbAccessoryEnabled_shouldBeAvailable() {
- when(mPackageManager.hasSystemFeature(PackageManager.FEATURE_USB_HOST)).thenReturn(false);
- when(mPackageManager.hasSystemFeature(PackageManager.FEATURE_USB_ACCESSORY)).thenReturn(
- true);
- assertTrue(mController.isAvailable());
- }
-
- @Test
- public void onPreferenceChange_setMtp_shouldEnableMtp() {
- when(mUsbManagerPassThrough.getCurrentFunctions())
- .thenReturn(UsbManagerExtras.usbFunctionsFromString(mValues[1]));
- doNothing().when(mController).setCurrentFunctions(anyLong());
- mController.onPreferenceChange(mPreference, mValues[1]);
-
- verify(mController).setCurrentFunctions(
- UsbManagerExtras.usbFunctionsFromString(mValues[1]));
- }
-
- @Test
- public void onPreferenceChange_monkeyUser_shouldReturnFalse() {
- when(mUsbManagerPassThrough.getCurrentFunctions())
- .thenReturn(UsbManagerExtras.usbFunctionsFromString(mValues[1]));
- ShadowUtils.setIsUserAMonkey(true);
- doNothing().when(mController).setCurrentFunctions(anyLong());
-
- final boolean isHandled = mController.onPreferenceChange(mPreference, mValues[1]);
-
- assertThat(isHandled).isFalse();
- verify(mController, never()).setCurrentFunctions(anyLong());
- }
-
- @Test
- public void updateState_chargingEnabled_shouldSetPreferenceToCharging() {
- when(mUsbManagerPassThrough.getCurrentFunctions())
- .thenReturn(UsbManagerExtras.usbFunctionsFromString(mValues[0]));
-
- mController.updateState(mPreference);
-
- verify(mPreference).setValue(mValues[0]);
- verify(mPreference).setSummary(mSummaries[0]);
- }
-
- @Test
- public void updateState_RndisEnabled_shouldEnableRndis() {
- when(mUsbManagerPassThrough.getCurrentFunctions())
- .thenReturn(UsbManagerExtras.usbFunctionsFromString(mValues[3]));
-
- mController.updateState(mPreference);
-
- verify(mPreference).setValue(mValues[3]);
- verify(mPreference).setSummary(mSummaries[3]);
- }
-
- @Test
- public void updateState_noValueSet_shouldEnableChargingAsDefault() {
- when(mUsbManagerPassThrough.getCurrentFunctions()).thenReturn(UsbManagerExtras.NONE);
- mController.updateState(mPreference);
-
- verify(mPreference).setValue(mValues[0]);
- verify(mPreference).setSummary(mSummaries[0]);
- }
-
- @Test
- public void onDeveloperOptionsSwitchDisabled_shouldDisablePreference() {
- mController.onDeveloperOptionsSwitchDisabled();
-
- verify(mPreference).setEnabled(false);
- }
-
- @Test
- public void onDeveloperOptionsSwitchEnabled_shouldEnablePreference() {
- mController.onDeveloperOptionsSwitchEnabled();
-
- verify(mPreference).setEnabled(true);
- }
-
- @Test
- public void onCreate_shouldRegisterReceiver() {
- mLifecycle.onCreate(null /* bundle */);
- mLifecycle.handleLifecycleEvent(ON_CREATE);
-
- verify(mContext).registerReceiver(any(), any());
- }
-
- @Test
- public void onDestroy_shouldUnregisterReceiver() {
- doNothing().when(mContext).unregisterReceiver(any());
- mLifecycle.handleLifecycleEvent(ON_CREATE);
- mLifecycle.handleLifecycleEvent(ON_DESTROY);
-
- verify(mContext).unregisterReceiver(any());
- }
-}
diff --git a/tests/robotests/src/com/android/settings/development/WebViewAppPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/development/WebViewAppPreferenceControllerTest.java
index 59f6e35..c2727cc 100644
--- a/tests/robotests/src/com/android/settings/development/WebViewAppPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/development/WebViewAppPreferenceControllerTest.java
@@ -27,9 +27,9 @@
import com.android.settings.R;
import com.android.settings.TestConfig;
-import com.android.settings.applications.defaultapps.DefaultAppInfo;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
import com.android.settings.webview.WebViewUpdateServiceWrapper;
+import com.android.settingslib.applications.DefaultAppInfo;
import com.android.settingslib.wrapper.PackageManagerWrapper;
import org.junit.Before;
diff --git a/tests/robotests/src/com/android/settings/development/qstile/DevelopmentTilePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/development/qstile/DevelopmentTilePreferenceControllerTest.java
index 1cdff20..e107344 100644
--- a/tests/robotests/src/com/android/settings/development/qstile/DevelopmentTilePreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/development/qstile/DevelopmentTilePreferenceControllerTest.java
@@ -17,19 +17,25 @@
package com.android.settings.development.qstile;
import static com.google.common.truth.Truth.assertThat;
+
import static org.mockito.Matchers.any;
+import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
+import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.content.pm.ServiceInfo;
+import android.os.RemoteException;
import android.service.quicksettings.TileService;
+import android.support.v14.preference.SwitchPreference;
import android.support.v7.preference.Preference;
import android.support.v7.preference.PreferenceScreen;
+import com.android.internal.statusbar.IStatusBarService;
import com.android.settings.R;
import com.android.settings.TestConfig;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
@@ -37,22 +43,28 @@
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.robolectric.RuntimeEnvironment;
import org.robolectric.Shadows;
import org.robolectric.annotation.Config;
import org.robolectric.shadows.ShadowPackageManager;
+import org.robolectric.util.ReflectionHelpers;
@RunWith(SettingsRobolectricTestRunner.class)
@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
public class DevelopmentTilePreferenceControllerTest {
+ private static final String SERVICE_INFO_NAME = "TestName";
@Mock
private PreferenceScreen mScreen;
+ @Mock
+ private IStatusBarService mStatusBarService;
private Context mContext;
private DevelopmentTilePreferenceController mController;
private ShadowPackageManager mShadowPackageManager;
+ private DevelopmentTilePreferenceController.OnChangeHandler mOnChangeHandler;
@Before
public void setUp() {
@@ -63,6 +75,9 @@
mController = new DevelopmentTilePreferenceController(mContext);
assertThat(mController.getPreferenceKey()).isNull();
+
+ mOnChangeHandler = spy(new DevelopmentTilePreferenceController.OnChangeHandler(mContext));
+ ReflectionHelpers.setField(mOnChangeHandler, "mStatusBarService", mStatusBarService);
}
@Test
@@ -86,6 +101,38 @@
verify(mScreen).addPreference(any(Preference.class));
}
+ @Test
+ public void preferenceChecked_shouldAddTile() throws RemoteException {
+ SwitchPreference preference = createPreference(/* defaultCheckedState = */ false);
+ preference.performClick();
+
+ ArgumentCaptor<ComponentName> argument = ArgumentCaptor.forClass(ComponentName.class);
+ verify(mStatusBarService).addTile(argument.capture());
+ assertThat(argument.getValue().getClassName()).isEqualTo(SERVICE_INFO_NAME);
+ assertThat(argument.getValue().getPackageName()).isEqualTo(mContext.getPackageName());
+ }
+
+ @Test
+ public void preferenceUnchecked_shouldRemoveTile() throws RemoteException {
+ SwitchPreference preference = createPreference(/* defaultCheckedState = */ true);
+ preference.performClick();
+
+ ArgumentCaptor<ComponentName> argument = ArgumentCaptor.forClass(ComponentName.class);
+ verify(mStatusBarService).remTile(argument.capture());
+ assertThat(argument.getValue().getClassName()).isEqualTo(SERVICE_INFO_NAME);
+ assertThat(argument.getValue().getPackageName()).isEqualTo(mContext.getPackageName());
+ }
+
+ private SwitchPreference createPreference(boolean defaultCheckedState) {
+ SwitchPreference preference = new SwitchPreference(mContext);
+ preference.setTitle("Test Pref");
+ preference.setIcon(R.drawable.ic_settings_24dp);
+ preference.setKey(SERVICE_INFO_NAME);
+ preference.setChecked(defaultCheckedState);
+ preference.setOnPreferenceChangeListener(mOnChangeHandler);
+ return preference;
+ }
+
public static class FakeServiceInfo extends ServiceInfo {
public String loadLabel(PackageManager mgr) {
diff --git a/tests/robotests/src/com/android/settings/development/qstile/LayerTraceTest.java b/tests/robotests/src/com/android/settings/development/qstile/LayerTraceTest.java
deleted file mode 100644
index 0e42759..0000000
--- a/tests/robotests/src/com/android/settings/development/qstile/LayerTraceTest.java
+++ /dev/null
@@ -1,128 +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.development.qstile;
-
-import static com.android.settings.development.qstile.DevelopmentTiles.LayerTrace
- .SURFACE_FLINGER_LAYER_TRACE_CONTROL_CODE;
-import static com.android.settings.development.qstile.DevelopmentTiles.LayerTrace
- .SURFACE_FLINGER_LAYER_TRACE_STATUS_CODE;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.eq;
-import static org.mockito.ArgumentMatchers.isNull;
-
-import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.verifyNoMoreInteractions;
-
-import android.os.IBinder;
-import android.os.RemoteException;
-import android.widget.Toast;
-
-import com.android.settings.TestConfig;
-import com.android.settings.testutils.shadow.ShadowParcel;
-import com.android.settings.testutils.SettingsRobolectricTestRunner;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-import org.robolectric.annotation.Config;
-import org.robolectric.util.ReflectionHelpers;
-
-@RunWith(SettingsRobolectricTestRunner.class)
-@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
-public class LayerTraceTest {
- @Mock
- private IBinder mSurfaceFlinger;
- @Mock
- private Toast mToast;
-
- private DevelopmentTiles.LayerTrace mLayerTraceTile;
-
- @Before
- public void setUp() {
- MockitoAnnotations.initMocks(this);
- mLayerTraceTile = spy(new DevelopmentTiles.LayerTrace());
- ReflectionHelpers.setField(mLayerTraceTile, "mSurfaceFlinger", mSurfaceFlinger);
- ReflectionHelpers.setField(mLayerTraceTile, "mToast", mToast);
- }
-
- @After
- public void after() {
- verifyNoMoreInteractions(mSurfaceFlinger);
- verifyNoMoreInteractions(mToast);
- }
-
- @Test
- @Config(shadows = {ShadowParcel.class})
- public void sfReturnsTraceEnabled_shouldReturnEnabled() throws RemoteException {
- ShadowParcel.sReadBoolResult = true;
- assertThat(mLayerTraceTile.isEnabled()).isTrue();
- verify(mSurfaceFlinger)
- .transact(eq(SURFACE_FLINGER_LAYER_TRACE_STATUS_CODE), any(), any(),
- eq(0 /* flags */));
- }
-
- @Test
- @Config(shadows = {ShadowParcel.class})
- public void sfReturnsTraceDisabled_shouldReturnDisabled() throws RemoteException {
- ShadowParcel.sReadBoolResult = false;
- assertThat(mLayerTraceTile.isEnabled()).isFalse();
- verify(mSurfaceFlinger)
- .transact(eq(SURFACE_FLINGER_LAYER_TRACE_STATUS_CODE), any(), any(),
- eq(0 /* flags */));
- }
-
- @Test
- public void sfUnavailable_shouldReturnDisabled() throws RemoteException {
- ReflectionHelpers.setField(mLayerTraceTile, "mSurfaceFlinger", null);
- assertThat(mLayerTraceTile.isEnabled()).isFalse();
- }
-
- @Test
- @Config(shadows = {ShadowParcel.class})
- public void setIsEnableTrue_shouldEnableLayerTrace() throws RemoteException {
- mLayerTraceTile.setIsEnabled(true);
- assertThat(ShadowParcel.sWriteIntResult).isEqualTo(1);
- verify(mSurfaceFlinger)
- .transact(eq(SURFACE_FLINGER_LAYER_TRACE_CONTROL_CODE), any(), isNull(),
- eq(0 /* flags */));
- }
-
- @Test
- @Config(shadows = {ShadowParcel.class})
- public void setIsEnableFalse_shouldDisableLayerTraceAndShowToast() throws RemoteException {
- mLayerTraceTile.setIsEnabled(false);
- assertThat(ShadowParcel.sWriteIntResult).isEqualTo(0);
- verify(mSurfaceFlinger)
- .transact(eq(SURFACE_FLINGER_LAYER_TRACE_CONTROL_CODE), any(), isNull(),
- eq(0 /* flags */));
- verify(mToast).show();
- }
-
- @Test
- public void setIsEnableAndSfUnavailable_shouldDoNothing() throws RemoteException {
- ReflectionHelpers.setField(mLayerTraceTile, "mSurfaceFlinger", null);
- mLayerTraceTile.setIsEnabled(true);
- mLayerTraceTile.setIsEnabled(false);
- }
-}
diff --git a/tests/robotests/src/com/android/settings/development/qstile/WindowTraceTest.java b/tests/robotests/src/com/android/settings/development/qstile/WindowTraceTest.java
deleted file mode 100644
index d8a8084..0000000
--- a/tests/robotests/src/com/android/settings/development/qstile/WindowTraceTest.java
+++ /dev/null
@@ -1,107 +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.development.qstile;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.doThrow;
-import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.verifyNoMoreInteractions;
-
-import android.os.RemoteException;
-import android.widget.Toast;
-
-import com.android.settings.TestConfig;
-import com.android.settings.testutils.shadow.ShadowParcel;
-import com.android.settings.testutils.SettingsRobolectricTestRunner;
-import com.android.settings.wrapper.IWindowManagerWrapper;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-import org.robolectric.annotation.Config;
-import org.robolectric.util.ReflectionHelpers;
-
-@RunWith(SettingsRobolectricTestRunner.class)
-@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
-public class WindowTraceTest {
- @Mock
- private IWindowManagerWrapper mWindowManager;
- @Mock
- private Toast mToast;
-
- private DevelopmentTiles.WindowTrace mWindowTrace;
-
- @Before
- public void setUp() {
- MockitoAnnotations.initMocks(this);
- mWindowTrace = spy(new DevelopmentTiles.WindowTrace());
- ReflectionHelpers.setField(mWindowTrace, "mWindowManager", mWindowManager);
- ReflectionHelpers.setField(mWindowTrace, "mToast", mToast);
- }
-
- @After
- public void teardown() {
- verifyNoMoreInteractions(mToast);
- }
-
- @Test
- public void wmReturnsTraceEnabled_shouldReturnEnabled() throws RemoteException {
- doReturn(true).when(mWindowManager).isWindowTraceEnabled();
- assertThat(mWindowTrace.isEnabled()).isTrue();
- }
-
- @Test
- public void wmReturnsTraceDisabled_shouldReturnDisabled() throws RemoteException {
- doReturn(false).when(mWindowManager).isWindowTraceEnabled();
- assertThat(mWindowTrace.isEnabled()).isFalse();
- }
-
- @Test
- public void wmThrowsRemoteException_shouldReturnDisabled() throws RemoteException {
- doThrow(new RemoteException("Unknown"))
- .when(mWindowManager).isWindowTraceEnabled();
- assertThat(mWindowTrace.isEnabled()).isFalse();
- }
-
- @Test
- public void setIsEnableTrue_shouldEnableWindowTrace() throws RemoteException {
- mWindowTrace.setIsEnabled(true);
- verify(mWindowManager).startWindowTrace();
- verifyNoMoreInteractions(mWindowManager);
- }
-
- @Test
- @Config(shadows = {ShadowParcel.class})
- public void setIsEnableFalse_shouldDisableWindowTraceAndShowToast() throws RemoteException {
- mWindowTrace.setIsEnabled(false);
- verify(mWindowManager).stopWindowTrace();
- verify(mToast).show();
- verifyNoMoreInteractions(mWindowManager);
- }
-
- @Test
- public void setIsEnableAndWmThrowsRemoteException_shouldDoNothing() throws RemoteException {
- doThrow(new RemoteException("Unknown")).when(mWindowManager).isWindowTraceEnabled();
- mWindowTrace.setIsEnabled(true);
- }
-}
diff --git a/tests/robotests/src/com/android/settings/development/qstile/WinscopeTraceTest.java b/tests/robotests/src/com/android/settings/development/qstile/WinscopeTraceTest.java
new file mode 100644
index 0000000..92f5c22
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/development/qstile/WinscopeTraceTest.java
@@ -0,0 +1,204 @@
+/*
+ * 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.development.qstile;
+
+import static com.android.settings.development.qstile.DevelopmentTiles.WinscopeTrace
+ .SURFACE_FLINGER_LAYER_TRACE_CONTROL_CODE;
+import static com.android.settings.development.qstile.DevelopmentTiles.WinscopeTrace
+ .SURFACE_FLINGER_LAYER_TRACE_STATUS_CODE;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.ArgumentMatchers.isNull;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.doThrow;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
+
+import android.os.IBinder;
+import android.os.RemoteException;
+import android.widget.Toast;
+
+import com.android.settings.TestConfig;
+import com.android.settings.testutils.shadow.ShadowParcel;
+import com.android.settings.testutils.SettingsRobolectricTestRunner;
+import com.android.settings.wrapper.IWindowManagerWrapper;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.annotation.Config;
+import org.robolectric.util.ReflectionHelpers;
+
+@RunWith(SettingsRobolectricTestRunner.class)
+@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
+public class WinscopeTraceTest {
+ @Mock
+ private IWindowManagerWrapper mWindowManager;
+ @Mock
+ private IBinder mSurfaceFlinger;
+ @Mock
+ private Toast mToast;
+
+ private DevelopmentTiles.WinscopeTrace mWinscopeTrace;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ mWinscopeTrace = spy(new DevelopmentTiles.WinscopeTrace());
+ ReflectionHelpers.setField(mWinscopeTrace, "mWindowManager", mWindowManager);
+ ReflectionHelpers.setField(mWinscopeTrace, "mSurfaceFlinger", mSurfaceFlinger);
+ ReflectionHelpers.setField(mWinscopeTrace, "mToast", mToast);
+ }
+
+ @After
+ public void teardown() {
+ verifyNoMoreInteractions(mToast);
+ }
+
+ @Test
+ @Config(shadows = {ShadowParcel.class})
+ public void wmReturnsTraceEnabled_shouldReturnEnabled() throws RemoteException {
+ // Assume Surface Trace is disabled.
+ ShadowParcel.sReadBoolResult = false;
+ doReturn(true).when(mWindowManager).isWindowTraceEnabled();
+ assertThat(mWinscopeTrace.isEnabled()).isTrue();
+ }
+
+ @Test
+ @Config(shadows = {ShadowParcel.class})
+ public void sfReturnsTraceEnabled_shouldReturnEnabled() throws RemoteException {
+ // Assume Window Trace is disabled.
+ doReturn(false).when(mWindowManager).isWindowTraceEnabled();
+ ShadowParcel.sReadBoolResult = true;
+ assertThat(mWinscopeTrace.isEnabled()).isTrue();
+ verify(mSurfaceFlinger)
+ .transact(eq(SURFACE_FLINGER_LAYER_TRACE_STATUS_CODE), any(), any(),
+ eq(0 /* flags */));
+ verifyNoMoreInteractions(mSurfaceFlinger);
+ }
+
+ @Test
+ @Config(shadows = {ShadowParcel.class})
+ public void sfAndWmReturnsTraceEnabled_shouldReturnEnabled() throws RemoteException {
+ ShadowParcel.sReadBoolResult = true;
+ doReturn(true).when(mWindowManager).isWindowTraceEnabled();
+ assertThat(mWinscopeTrace.isEnabled()).isTrue();
+ }
+
+ @Test
+ public void wmAndSfReturnsTraceDisabled_shouldReturnDisabled() throws RemoteException {
+ ShadowParcel.sReadBoolResult = false;
+ doReturn(false).when(mWindowManager).isWindowTraceEnabled();
+ assertThat(mWinscopeTrace.isEnabled()).isFalse();
+ verify(mSurfaceFlinger)
+ .transact(eq(SURFACE_FLINGER_LAYER_TRACE_STATUS_CODE), any(), any(),
+ eq(0 /* flags */));
+ verifyNoMoreInteractions(mSurfaceFlinger);
+ }
+
+ @Test
+ @Config(shadows = {ShadowParcel.class})
+ public void wmThrowsRemoteExAndSfReturnsTraceDisabled_shouldReturnDisabled()
+ throws RemoteException {
+ ShadowParcel.sReadBoolResult = false;
+ doThrow(new RemoteException("Unknown"))
+ .when(mWindowManager).isWindowTraceEnabled();
+ assertThat(mWinscopeTrace.isEnabled()).isFalse();
+ }
+
+ @Test
+ public void sfUnavailableAndWmReturnsTraceDisabled_shouldReturnDisabled()
+ throws RemoteException {
+ doReturn(false).when(mWindowManager).isWindowTraceEnabled();
+ ReflectionHelpers.setField(mWinscopeTrace, "mSurfaceFlinger", null);
+ assertThat(mWinscopeTrace.isEnabled()).isFalse();
+ }
+
+
+ @Test
+ public void setIsEnableTrue_shouldEnableWindowTrace() throws RemoteException {
+ mWinscopeTrace.setIsEnabled(true);
+ verify(mWindowManager).startWindowTrace();
+ verifyNoMoreInteractions(mWindowManager);
+ }
+
+ @Test
+ @Config(shadows = {ShadowParcel.class})
+ public void setIsEnableTrue_shouldEnableLayerTrace() throws RemoteException {
+ mWinscopeTrace.setIsEnabled(true);
+ assertThat(ShadowParcel.sWriteIntResult).isEqualTo(1);
+ verify(mSurfaceFlinger)
+ .transact(eq(SURFACE_FLINGER_LAYER_TRACE_CONTROL_CODE), any(), isNull(),
+ eq(0 /* flags */));
+ verifyNoMoreInteractions(mSurfaceFlinger);
+ }
+
+ @Test
+ @Config(shadows = {ShadowParcel.class})
+ public void setIsEnableFalse_shouldDisableWindowTrace() throws RemoteException {
+ mWinscopeTrace.setIsEnabled(false);
+ verify(mWindowManager).stopWindowTrace();
+ verifyNoMoreInteractions(mWindowManager);
+ verify(mToast).show();
+ }
+
+ @Test
+ @Config(shadows = {ShadowParcel.class})
+ public void setIsEnableFalse_shouldDisableLayerTrace() throws RemoteException {
+ mWinscopeTrace.setIsEnabled(false);
+ assertThat(ShadowParcel.sWriteIntResult).isEqualTo(0);
+ verify(mSurfaceFlinger)
+ .transact(eq(SURFACE_FLINGER_LAYER_TRACE_CONTROL_CODE), any(), isNull(),
+ eq(0 /* flags */));
+ verifyNoMoreInteractions(mSurfaceFlinger);
+ verify(mToast).show();
+ }
+
+ @Test
+ public void setIsEnableFalse_shouldShowToast() throws RemoteException {
+ mWinscopeTrace.setIsEnabled(false);
+ verify(mToast).show();
+ }
+
+ /**
+ * Verify when window manager call throws a remote exception, it is handled without
+ * re-throwing the exception.
+ */
+ @Test
+ public void setIsEnableAndWmThrowsRemoteException_shouldFailGracefully()
+ throws RemoteException {
+ doThrow(new RemoteException("Unknown")).when(mWindowManager).isWindowTraceEnabled();
+ mWinscopeTrace.setIsEnabled(true);
+ }
+
+ /**
+ * Verify is surface flinger is not available not calls are made to it.
+ */
+ @Test
+ public void setIsEnableAndSfUnavailable_shouldFailGracefully() throws RemoteException {
+ ReflectionHelpers.setField(mWinscopeTrace, "mSurfaceFlinger", null);
+ mWinscopeTrace.setIsEnabled(true);
+ verifyNoMoreInteractions(mSurfaceFlinger);
+ }
+}
diff --git a/tests/robotests/src/com/android/settings/display/ColorModePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/display/ColorModePreferenceControllerTest.java
new file mode 100644
index 0000000..567b200
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/display/ColorModePreferenceControllerTest.java
@@ -0,0 +1,90 @@
+/*
+ * 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.display;
+
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.support.v7.preference.Preference;
+
+import com.android.internal.app.ColorDisplayController;
+import com.android.settings.R;
+import com.android.settings.TestConfig;
+import com.android.settings.testutils.SettingsRobolectricTestRunner;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
+
+@RunWith(SettingsRobolectricTestRunner.class)
+@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
+public class ColorModePreferenceControllerTest {
+
+ @Mock
+ private Preference mPreference;
+ @Mock
+ private ColorDisplayController mColorDisplayController;
+
+ private Context mContext;
+ private ColorModePreferenceController mController;
+
+ @Before
+ public void setup() {
+ MockitoAnnotations.initMocks(this);
+ mContext = RuntimeEnvironment.application;
+ mController = spy(new ColorModePreferenceController(mContext));
+ doReturn(mColorDisplayController).when(mController).getColorDisplayController();
+ }
+
+ @Test
+ public void updateState_colorModeSaturated_shouldSetSummaryToSaturated() {
+ when(mColorDisplayController.getColorMode())
+ .thenReturn(ColorDisplayController.COLOR_MODE_SATURATED);
+
+ mController.updateState(mPreference);
+
+ verify(mPreference).setSummary(mContext.getString(R.string.color_mode_option_saturated));
+ }
+
+ @Test
+ public void updateState_colorModeBoosted_shouldSetSummaryToBoosted() {
+ when(mColorDisplayController.getColorMode())
+ .thenReturn(ColorDisplayController.COLOR_MODE_BOOSTED);
+
+ mController.updateState(mPreference);
+
+ verify(mPreference).setSummary(mContext.getString(R.string.color_mode_option_boosted));
+ }
+
+ @Test
+ public void updateState_colorModeNatural_shouldSetSummaryToNatural() {
+ when(mColorDisplayController.getColorMode())
+ .thenReturn(ColorDisplayController.COLOR_MODE_NATURAL);
+
+ mController.updateState(mPreference);
+
+ verify(mPreference).setSummary(mContext.getString(R.string.color_mode_option_natural));
+ }
+
+}
diff --git a/tests/robotests/src/com/android/settings/display/ColorModePreferenceFragmentTest.java b/tests/robotests/src/com/android/settings/display/ColorModePreferenceFragmentTest.java
index dc3d27a..68937b2 100644
--- a/tests/robotests/src/com/android/settings/display/ColorModePreferenceFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/display/ColorModePreferenceFragmentTest.java
@@ -32,6 +32,7 @@
import com.android.settings.testutils.SettingsRobolectricTestRunner;
import com.android.settings.testutils.shadow.SettingsShadowSystemProperties;
import com.android.settings.widget.RadioButtonPickerFragment;
+import com.android.settingslib.widget.CandidateInfo;
import org.junit.Before;
import org.junit.Test;
@@ -72,8 +73,7 @@
@Test
public void getCandidates() {
when(mFragment.getContext()).thenReturn(RuntimeEnvironment.application);
- List<? extends RadioButtonPickerFragment.CandidateInfo> candidates =
- mFragment.getCandidates();
+ List<? extends CandidateInfo> candidates = mFragment.getCandidates();
assertThat(candidates.size()).isEqualTo(3);
assertThat(candidates.get(0).getKey())
diff --git a/tests/robotests/src/com/android/settings/enterprise/ApplicationListFragmentTest.java b/tests/robotests/src/com/android/settings/enterprise/ApplicationListFragmentTest.java
index 80d4aaf..7d1aecd 100644
--- a/tests/robotests/src/com/android/settings/enterprise/ApplicationListFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/enterprise/ApplicationListFragmentTest.java
@@ -84,7 +84,7 @@
@Test
public void getPreferenceControllers() {
- final List<AbstractPreferenceController> controllers = mFragment.getPreferenceControllers(
+ final List<AbstractPreferenceController> controllers = mFragment.createPreferenceControllers(
mContext);
assertThat(controllers).isNotNull();
assertThat(controllers.size()).isEqualTo(1);
diff --git a/tests/robotests/src/com/android/settings/enterprise/EnterprisePrivacySettingsTest.java b/tests/robotests/src/com/android/settings/enterprise/EnterprisePrivacySettingsTest.java
index b38b0f0..5e80f66 100644
--- a/tests/robotests/src/com/android/settings/enterprise/EnterprisePrivacySettingsTest.java
+++ b/tests/robotests/src/com/android/settings/enterprise/EnterprisePrivacySettingsTest.java
@@ -90,7 +90,7 @@
@Test
public void getPreferenceControllers() throws Exception {
- final List<AbstractPreferenceController> controllers = mSettings.getPreferenceControllers(
+ final List<AbstractPreferenceController> controllers = mSettings.createPreferenceControllers(
ShadowApplication.getInstance().getApplicationContext());
verifyPreferenceControllers(controllers);
}
diff --git a/tests/robotests/src/com/android/settings/enterprise/EnterpriseSetDefaultAppsListFragmentTest.java b/tests/robotests/src/com/android/settings/enterprise/EnterpriseSetDefaultAppsListFragmentTest.java
index 567c06f..033d399 100644
--- a/tests/robotests/src/com/android/settings/enterprise/EnterpriseSetDefaultAppsListFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/enterprise/EnterpriseSetDefaultAppsListFragmentTest.java
@@ -80,7 +80,7 @@
@Test
public void getPreferenceControllers() {
- final List<AbstractPreferenceController> controllers = mFragment.getPreferenceControllers(mContext);
+ final List<AbstractPreferenceController> controllers = mFragment.createPreferenceControllers(mContext);
assertThat(controllers).isNotNull();
assertThat(controllers.size()).isEqualTo(1);
int position = 0;
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BatteryDatabaseManagerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BatteryDatabaseManagerTest.java
index e835e65..498cd58 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/BatteryDatabaseManagerTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/BatteryDatabaseManagerTest.java
@@ -51,6 +51,7 @@
private static long NOW = System.currentTimeMillis();
private static long ONE_DAY_BEFORE = NOW - DateUtils.DAY_IN_MILLIS;
private static long TWO_DAYS_BEFORE = NOW - 2 * DateUtils.DAY_IN_MILLIS;
+
private Context mContext;
private BatteryDatabaseManager mBatteryDatabaseManager;
@@ -69,8 +70,10 @@
@Test
public void testAllFunctions() {
- mBatteryDatabaseManager.insertAnomaly(PACKAGE_NAME_NEW, TYPE_NEW, NOW);
- mBatteryDatabaseManager.insertAnomaly(PACKAGE_NAME_OLD, TYPE_OLD, TWO_DAYS_BEFORE);
+ mBatteryDatabaseManager.insertAnomaly(PACKAGE_NAME_NEW, TYPE_NEW,
+ AnomalyDatabaseHelper.State.NEW, NOW);
+ mBatteryDatabaseManager.insertAnomaly(PACKAGE_NAME_OLD, TYPE_OLD,
+ AnomalyDatabaseHelper.State.NEW, TWO_DAYS_BEFORE);
// In database, it contains two record
List<AppInfo> totalAppInfos = mBatteryDatabaseManager.queryAllAnomalies(0 /* timeMsAfter */,
@@ -96,8 +99,10 @@
@Test
public void testUpdateAnomalies_updateSuccessfully() {
- mBatteryDatabaseManager.insertAnomaly(PACKAGE_NAME_NEW, TYPE_NEW, NOW);
- mBatteryDatabaseManager.insertAnomaly(PACKAGE_NAME_OLD, TYPE_OLD, NOW);
+ mBatteryDatabaseManager.insertAnomaly(PACKAGE_NAME_NEW, TYPE_NEW,
+ AnomalyDatabaseHelper.State.NEW, NOW);
+ mBatteryDatabaseManager.insertAnomaly(PACKAGE_NAME_OLD, TYPE_OLD,
+ AnomalyDatabaseHelper.State.NEW, NOW);
final AppInfo appInfo = new AppInfo.Builder().setPackageName(PACKAGE_NAME_OLD).build();
final List<AppInfo> updateAppInfos = new ArrayList<>();
updateAppInfos.add(appInfo);
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BatteryInfoTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BatteryInfoTest.java
index 45edb47..b613bb3 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/BatteryInfoTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/BatteryInfoTest.java
@@ -71,7 +71,7 @@
private static final int PLUGGED_IN = 1;
private static final long REMAINING_TIME_NULL = -1;
private static final long REMAINING_TIME = 2;
- public static final String ENHANCED_STRING_SUFFIX = "left based on your usage";
+ public static final String ENHANCED_STRING_SUFFIX = "based on your usage";
public static final long TEST_CHARGE_TIME_REMAINING = TimeUnit.MINUTES.toMicros(1);
public static final String TEST_CHARGE_TIME_REMAINING_STRINGIFIED =
"1m left until fully charged";
@@ -183,7 +183,7 @@
// Check that strings are showing less than 15 minutes remaining regardless of exact time.
assertThat(info.chargeLabel.toString()).isEqualTo(
mContext.getString(R.string.power_remaining_less_than_duration,
- TEST_BATTERY_LEVEL_10, FIFTEEN_MIN_FORMATTED));
+ FIFTEEN_MIN_FORMATTED, TEST_BATTERY_LEVEL_10));
assertThat(info.remainingLabel.toString()).isEqualTo(
mContext.getString(R.string.power_remaining_less_than_duration_only,
FIFTEEN_MIN_FORMATTED));
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BatterySaverControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BatterySaverControllerTest.java
index c75a6a6..6cc3310 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/BatterySaverControllerTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/BatterySaverControllerTest.java
@@ -53,7 +53,7 @@
public void setUp() {
MockitoAnnotations.initMocks(this);
- mBatterySaverController = spy(new BatterySaverController(mContext, mLifecycle));
+ mBatterySaverController = spy(new BatterySaverController(mContext));
ReflectionHelpers.setField(mBatterySaverController, "mPowerManager", mPowerManager);
ReflectionHelpers.setField(mBatterySaverController, "mBatterySaverPref", mBatterySaverPref);
doNothing().when(mBatterySaverController).refreshConditionManager();
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BatteryUtilsTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BatteryUtilsTest.java
index 6bc6ee7..9d3fb7a 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/BatteryUtilsTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/BatteryUtilsTest.java
@@ -177,9 +177,9 @@
mHighApplicationInfo.targetSdkVersion = Build.VERSION_CODES.O;
mLowApplicationInfo.targetSdkVersion = Build.VERSION_CODES.L;
-
mNormalBatterySipper.drainType = BatterySipper.DrainType.APP;
mNormalBatterySipper.totalPowerMah = TOTAL_BATTERY_USAGE;
+ doReturn(UID).when(mNormalBatterySipper).getUid();
mWifiBatterySipper.drainType = BatterySipper.DrainType.WIFI;
mWifiBatterySipper.totalPowerMah = BATTERY_WIFI_USAGE;
@@ -216,6 +216,10 @@
mUsageList.add(mScreenBatterySipper);
mUsageList.add(mCellBatterySipper);
doReturn(mUsageList).when(mBatteryStatsHelper).getUsageList();
+ doReturn(TOTAL_BATTERY_USAGE + BATTERY_SCREEN_USAGE).when(
+ mBatteryStatsHelper).getTotalPower();
+ when(mBatteryStatsHelper.getStats().getDischargeAmount(anyInt())).thenReturn(
+ DISCHARGE_AMOUNT);
}
@Test
@@ -547,4 +551,16 @@
verify(mAppOpsManager).setMode(AppOpsManager.OP_RUN_ANY_IN_BACKGROUND, UID,
HIGH_SDK_PACKAGE, AppOpsManager.MODE_IGNORED);
}
+
+ @Test
+ public void testIsAppHeavilyUsed_usageMoreThanThreshold_returnTrue() {
+ assertThat(mBatteryUtils.isAppHeavilyUsed(mBatteryStatsHelper, mUserManager, UID,
+ 10 /* threshold */ )).isTrue();
+ }
+
+ @Test
+ public void testIsAppHeavilyUsed_usageLessThanThreshold_returnFalse() {
+ assertThat(mBatteryUtils.isAppHeavilyUsed(mBatteryStatsHelper, mUserManager, UID,
+ DISCHARGE_AMOUNT /* threshold */ )).isFalse();
+ }
}
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageBaseTest.java b/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageBaseTest.java
index eb5d8cf..9a55ef0 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageBaseTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageBaseTest.java
@@ -94,7 +94,7 @@
}
@Override
- protected List<AbstractPreferenceController> getPreferenceControllers(Context context) {
+ protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
return null;
}
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageSummaryLegacyTest.java b/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageSummaryLegacyTest.java
index a3786c2..329665b 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageSummaryLegacyTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageSummaryLegacyTest.java
@@ -67,6 +67,7 @@
import com.android.settingslib.utils.StringUtil;
import org.junit.Before;
import org.junit.BeforeClass;
+import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Answers;
@@ -408,7 +409,7 @@
fragment.getPreferenceScreenResId());
final List<String> preferenceKeys = new ArrayList<>();
- for (AbstractPreferenceController controller : fragment.getPreferenceControllers(context)) {
+ for (AbstractPreferenceController controller : fragment.createPreferenceControllers(context)) {
preferenceKeys.add(controller.getPreferenceKey());
}
@@ -445,18 +446,6 @@
}
@Test
- public void testShowBothEstimates_summariesAreBothModified() {
- doReturn(new TextView(mRealContext)).when(mBatteryLayoutPref).findViewById(R.id.summary2);
- doReturn(new TextView(mRealContext)).when(mBatteryLayoutPref).findViewById(R.id.summary1);
- mFragment.onLongClick(new View(mRealContext));
- TextView summary1 = mFragment.mBatteryLayoutPref.findViewById(R.id.summary1);
- TextView summary2 = mFragment.mBatteryLayoutPref.findViewById(R.id.summary2);
- Robolectric.flushBackgroundThreadScheduler();
- assertThat(summary2.getText().toString().contains(NEW_ML_EST_SUFFIX));
- assertThat(summary1.getText().toString().contains(OLD_EST_SUFFIX));
- }
-
- @Test
public void testSaveInstanceState_showAllAppsRestored() {
Bundle bundle = new Bundle();
mFragment.mShowAllApps = true;
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageSummaryTest.java b/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageSummaryTest.java
index 32e2b0b..336df87 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageSummaryTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageSummaryTest.java
@@ -37,19 +37,14 @@
import android.os.PowerManager;
import android.support.v7.preference.PreferenceScreen;
import android.util.SparseArray;
-import android.view.Menu;
-import android.view.MenuInflater;
-import android.view.MenuItem;
import android.view.View;
import android.widget.TextView;
-import com.android.internal.logging.nano.MetricsProto;
import com.android.internal.os.BatterySipper;
import com.android.internal.os.BatteryStatsHelper;
import com.android.settings.R;
import com.android.settings.SettingsActivity;
import com.android.settings.TestConfig;
-import com.android.settings.Utils;
import com.android.settings.applications.LayoutPreference;
import com.android.settings.fuelgauge.anomaly.Anomaly;
import com.android.settings.fuelgauge.anomaly.AnomalyDetectionPolicy;
@@ -61,6 +56,7 @@
import org.junit.Before;
import org.junit.BeforeClass;
+import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Answers;
@@ -222,7 +218,7 @@
fragment.getPreferenceScreenResId());
final List<String> preferenceKeys = new ArrayList<>();
- for (AbstractPreferenceController controller : fragment.getPreferenceControllers(context)) {
+ for (AbstractPreferenceController controller : fragment.createPreferenceControllers(context)) {
preferenceKeys.add(controller.getPreferenceKey());
}
@@ -257,6 +253,7 @@
eq(Bundle.EMPTY), any());
}
+ @Ignore("b/73892008")
@Test
public void testShowBothEstimates_summariesAreBothModified() {
doReturn(new TextView(mRealContext)).when(mBatteryLayoutPref).findViewById(R.id.summary2);
@@ -265,8 +262,8 @@
TextView summary1 = mFragment.mBatteryLayoutPref.findViewById(R.id.summary1);
TextView summary2 = mFragment.mBatteryLayoutPref.findViewById(R.id.summary2);
Robolectric.flushBackgroundThreadScheduler();
- assertThat(summary2.getText().toString().contains(NEW_ML_EST_SUFFIX));
- assertThat(summary1.getText().toString().contains(OLD_EST_SUFFIX));
+ assertThat(summary2.getText().toString()).contains(NEW_ML_EST_SUFFIX);
+ assertThat(summary1.getText().toString()).contains(OLD_EST_SUFFIX);
}
@Test
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/RestrictedAppDetailsTest.java b/tests/robotests/src/com/android/settings/fuelgauge/RestrictedAppDetailsTest.java
index 521ead4..1d4d71e 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/RestrictedAppDetailsTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/RestrictedAppDetailsTest.java
@@ -18,24 +18,30 @@
import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.spy;
-import android.app.AppOpsManager;
import android.content.Context;
+import android.content.Intent;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
+import android.os.Bundle;
import android.support.v7.preference.Preference;
import android.support.v7.preference.PreferenceCategory;
import android.support.v7.preference.PreferenceManager;
import android.util.IconDrawableFactory;
+import com.android.settings.SettingsActivity;
import com.android.settings.TestConfig;
+import com.android.settings.core.InstrumentedPreferenceFragment;
+import com.android.settings.fuelgauge.batterytip.AppInfo;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Answers;
+import org.mockito.ArgumentCaptor;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.robolectric.RobolectricTestRunner;
@@ -43,13 +49,13 @@
import org.robolectric.annotation.Config;
import java.util.ArrayList;
+import java.util.List;
@RunWith(RobolectricTestRunner.class)
@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
public class RestrictedAppDetailsTest {
private static final String PACKAGE_NAME = "com.android.app";
private static final String APP_NAME = "app";
- private static final int UID = 1234;
@Mock
private PackageManager mPackageManager;
@Mock
@@ -58,25 +64,33 @@
private IconDrawableFactory mIconDrawableFactory;
@Mock(answer = Answers.RETURNS_DEEP_STUBS)
private PreferenceManager mPreferenceManager;
- private RestrictedAppDetails mFragment;
+ @Mock
+ private SettingsActivity mSettingsActivity;
+ @Mock
+ private InstrumentedPreferenceFragment mFragment;
+ private RestrictedAppDetails mRestrictedAppDetails;
private Context mContext;
+ private Intent mIntent;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
mContext = spy(RuntimeEnvironment.application);
- mFragment = spy(new RestrictedAppDetails());
+ mRestrictedAppDetails = spy(new RestrictedAppDetails());
- doReturn(mPreferenceManager).when(mFragment).getPreferenceManager();
+ doReturn(mPreferenceManager).when(mRestrictedAppDetails).getPreferenceManager();
doReturn(mContext).when(mPreferenceManager).getContext();
- mFragment.mPackageManager = mPackageManager;
- mFragment.mIconDrawableFactory = mIconDrawableFactory;
- mFragment.mPackageOpsList = new ArrayList<>();
- mFragment.mPackageOpsList.add(
- new AppOpsManager.PackageOps(PACKAGE_NAME, UID, null /* entries */));
- mFragment.mRestrictedAppListGroup = spy(new PreferenceCategory(mContext));
- doReturn(mPreferenceManager).when(mFragment.mRestrictedAppListGroup).getPreferenceManager();
+ mRestrictedAppDetails.mPackageManager = mPackageManager;
+ mRestrictedAppDetails.mIconDrawableFactory = mIconDrawableFactory;
+ mRestrictedAppDetails.mAppInfos = new ArrayList<>();
+ mRestrictedAppDetails.mAppInfos.add(new AppInfo.Builder()
+ .setPackageName(PACKAGE_NAME)
+ .build());
+ mRestrictedAppDetails.mRestrictedAppListGroup = spy(new PreferenceCategory(mContext));
+ mRestrictedAppDetails.mBatteryUtils = new BatteryUtils(mContext);
+ doReturn(mPreferenceManager).when(
+ mRestrictedAppDetails.mRestrictedAppListGroup).getPreferenceManager();
}
@Test
@@ -84,12 +98,33 @@
doReturn(mApplicationInfo).when(mPackageManager).getApplicationInfo(PACKAGE_NAME, 0);
doReturn(APP_NAME).when(mPackageManager).getApplicationLabel(mApplicationInfo);
- mFragment.refreshUi();
+ mRestrictedAppDetails.refreshUi();
- assertThat(mFragment.mRestrictedAppListGroup.getPreferenceCount()).isEqualTo(1);
- final Preference preference = mFragment.mRestrictedAppListGroup.getPreference(0);
+ assertThat(mRestrictedAppDetails.mRestrictedAppListGroup.getPreferenceCount()).isEqualTo(1);
+ final Preference preference = mRestrictedAppDetails.mRestrictedAppListGroup.getPreference(
+ 0);
assertThat(preference.getKey()).isEqualTo(PACKAGE_NAME);
assertThat(preference.getTitle()).isEqualTo(APP_NAME);
}
+ @Test
+ public void testStartRestrictedAppDetails_startWithCorrectData() {
+ final ArgumentCaptor<Intent> captor = ArgumentCaptor.forClass(Intent.class);
+ doAnswer(invocation -> {
+ // Get the intent in which it has the app info bundle
+ mIntent = captor.getValue();
+ return true;
+ }).when(mSettingsActivity).startActivity(captor.capture());
+
+ RestrictedAppDetails.startRestrictedAppDetails(mSettingsActivity, mFragment,
+ mRestrictedAppDetails.mAppInfos);
+
+ final Bundle bundle = mIntent.getBundleExtra(
+ SettingsActivity.EXTRA_SHOW_FRAGMENT_ARGUMENTS);
+ // Verify the bundle has the correct info
+ final List<AppInfo> appInfos = bundle.getParcelableArrayList(
+ RestrictedAppDetails.EXTRA_APP_INFO_LIST);
+ assertThat(appInfos).hasSize(1);
+ assertThat(appInfos.get(0).packageName).isEqualTo(PACKAGE_NAME);
+ }
}
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batterysaver/AutoBatterySaverPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batterysaver/AutoBatterySaverPreferenceControllerTest.java
index cabcdcf..af0f855 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batterysaver/AutoBatterySaverPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batterysaver/AutoBatterySaverPreferenceControllerTest.java
@@ -25,6 +25,7 @@
import com.android.settings.TestConfig;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
+import com.android.settings.testutils.shadow.SettingsShadowResources;
import org.junit.Before;
import org.junit.Test;
@@ -34,7 +35,8 @@
import org.robolectric.annotation.Config;
@RunWith(SettingsRobolectricTestRunner.class)
-@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
+@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION, shadows =
+ SettingsShadowResources.class)
public class AutoBatterySaverPreferenceControllerTest {
private AutoBatterySaverPreferenceController mController;
@@ -45,6 +47,8 @@
public void setUp() {
MockitoAnnotations.initMocks(this);
+ SettingsShadowResources.overrideResource(
+ com.android.internal.R.integer.config_lowBatteryWarningLevel, 15);
mContext = RuntimeEnvironment.application;
mPreference = new SwitchPreference(mContext);
mController = new AutoBatterySaverPreferenceController(mContext);
@@ -84,4 +88,9 @@
Settings.Global.LOW_POWER_MODE_TRIGGER_LEVEL, 0)).isEqualTo(0);
}
+ @Test
+ public void testIsChecked_useDefaultValue_returnTrue() {
+ assertThat(mController.isChecked()).isTrue();
+ }
+
}
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batterysaver/AutoBatterySeekBarPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batterysaver/AutoBatterySeekBarPreferenceControllerTest.java
index 32a4fac..d3c2752 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batterysaver/AutoBatterySeekBarPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batterysaver/AutoBatterySeekBarPreferenceControllerTest.java
@@ -24,6 +24,7 @@
import com.android.settings.TestConfig;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
+import com.android.settings.testutils.shadow.SettingsShadowResources;
import com.android.settings.widget.SeekBarPreference;
import com.android.settingslib.core.lifecycle.Lifecycle;
@@ -35,9 +36,11 @@
import org.robolectric.annotation.Config;
@RunWith(SettingsRobolectricTestRunner.class)
-@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
+@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION, shadows =
+ SettingsShadowResources.class)
public class AutoBatterySeekBarPreferenceControllerTest {
- private static final int TRIGGER_LEVEL = 15;
+ private static final int TRIGGER_LEVEL = 20;
+ private static final int DEFAULT_LEVEL = 15;
private AutoBatterySeekBarPreferenceController mController;
private Context mContext;
@@ -51,6 +54,8 @@
mLifecycleOwner = () -> mLifecycle;
mLifecycle = new Lifecycle(mLifecycleOwner);
+ SettingsShadowResources.overrideResource(
+ com.android.internal.R.integer.config_lowBatteryWarningLevel, DEFAULT_LEVEL);
mContext = RuntimeEnvironment.application;
mPreference = new SeekBarPreference(mContext);
mPreference.setMax(100);
@@ -68,13 +73,21 @@
}
@Test
+ public void testPreference_defaultValue_preferenceVisible() {
+ mController.updateState(mPreference);
+
+ assertThat(mPreference.isVisible()).isTrue();
+ assertThat(mPreference.getProgress()).isEqualTo(DEFAULT_LEVEL);
+ }
+
+ @Test
public void testPreference_lowPowerLevelNotZero_updatePreference() {
Settings.Global.putInt(mContext.getContentResolver(),
Settings.Global.LOW_POWER_MODE_TRIGGER_LEVEL, TRIGGER_LEVEL);
mController.updateState(mPreference);
assertThat(mPreference.isVisible()).isTrue();
- assertThat(mPreference.getTitle()).isEqualTo("Turn on automatically at 15%");
+ assertThat(mPreference.getTitle()).isEqualTo("Turn on automatically at 20%");
assertThat(mPreference.getProgress()).isEqualTo(TRIGGER_LEVEL);
}
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/AnomalyCleanupJobServiceTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/AnomalyCleanupJobServiceTest.java
new file mode 100644
index 0000000..4682d15
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/AnomalyCleanupJobServiceTest.java
@@ -0,0 +1,64 @@
+/*
+ * 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.fuelgauge.batterytip;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.junit.Assert.assertEquals;
+import static org.robolectric.RuntimeEnvironment.application;
+
+import android.app.job.JobInfo;
+import android.app.job.JobScheduler;
+
+import com.android.settings.R;
+import com.android.settings.TestConfig;
+import com.android.settings.testutils.SettingsRobolectricTestRunner;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.Shadows;
+import org.robolectric.annotation.Config;
+import org.robolectric.shadows.ShadowJobScheduler;
+
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+
+@RunWith(SettingsRobolectricTestRunner.class)
+@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
+public class AnomalyCleanupJobServiceTest {
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ }
+
+ @Test
+ public void testScheduleCleanUp() {
+ AnomalyCleanupJobService.scheduleCleanUp(application);
+
+ ShadowJobScheduler shadowJobScheduler = Shadows.shadowOf(
+ application.getSystemService(JobScheduler.class));
+ List<JobInfo> pendingJobs = shadowJobScheduler.getAllPendingJobs();
+ assertEquals(1, pendingJobs.size());
+ JobInfo pendingJob = pendingJobs.get(0);
+ assertThat(pendingJob.getId()).isEqualTo(R.id.job_anomaly_clean_up);
+ assertThat(pendingJob.getIntervalMillis()).isEqualTo(TimeUnit.DAYS.toMillis(1));
+ assertThat(pendingJob.isRequireDeviceIdle()).isTrue();
+ assertThat(pendingJob.isRequireCharging()).isTrue();
+ }
+}
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/AnomalyDetectionJobServiceTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/AnomalyDetectionJobServiceTest.java
new file mode 100644
index 0000000..48c99c5
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/AnomalyDetectionJobServiceTest.java
@@ -0,0 +1,59 @@
+/*
+ * 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.fuelgauge.batterytip;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.junit.Assert.assertEquals;
+import static org.robolectric.RuntimeEnvironment.application;
+
+import android.app.job.JobInfo;
+import android.app.job.JobScheduler;
+import android.content.Intent;
+
+import com.android.settings.R;
+import com.android.settings.TestConfig;
+import com.android.settings.testutils.SettingsRobolectricTestRunner;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.Shadows;
+import org.robolectric.annotation.Config;
+import org.robolectric.shadows.ShadowJobScheduler;
+
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+
+@RunWith(SettingsRobolectricTestRunner.class)
+@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
+public class AnomalyDetectionJobServiceTest {
+
+ @Test
+ public void testScheduleCleanUp() {
+ AnomalyDetectionJobService.scheduleAnomalyDetection(application,
+ new Intent());
+
+ ShadowJobScheduler shadowJobScheduler = Shadows.shadowOf(
+ application.getSystemService(JobScheduler.class));
+ List<JobInfo> pendingJobs = shadowJobScheduler.getAllPendingJobs();
+ assertThat(pendingJobs).hasSize(1);
+ JobInfo pendingJob = pendingJobs.get(0);
+ assertThat(pendingJob.getId()).isEqualTo(R.id.job_anomaly_detection);
+ assertThat(pendingJob.getMaxExecutionDelayMillis()).isEqualTo(
+ TimeUnit.MINUTES.toMillis(30));
+ }
+}
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryTipPolicyTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryTipPolicyTest.java
index 78c86f8..188fe77 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryTipPolicyTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryTipPolicyTest.java
@@ -49,7 +49,9 @@
+ ",reduced_battery_enabled=true"
+ ",reduced_battery_percent=30"
+ ",low_battery_enabled=false"
- + ",low_battery_hour=10";
+ + ",low_battery_hour=10"
+ + ",data_history_retain_day=24"
+ + ",excessive_bg_drain_percentage=25";
private Context mContext;
@Before
@@ -76,6 +78,8 @@
assertThat(batteryTipPolicy.reducedBatteryPercent).isEqualTo(30);
assertThat(batteryTipPolicy.lowBatteryEnabled).isFalse();
assertThat(batteryTipPolicy.lowBatteryHour).isEqualTo(10);
+ assertThat(batteryTipPolicy.dataHistoryRetainDay).isEqualTo(24);
+ assertThat(batteryTipPolicy.excessiveBgDrainPercentage).isEqualTo(25);
}
@Test
@@ -97,6 +101,7 @@
assertThat(batteryTipPolicy.reducedBatteryPercent).isEqualTo(50);
assertThat(batteryTipPolicy.lowBatteryEnabled).isFalse();
assertThat(batteryTipPolicy.lowBatteryHour).isEqualTo(16);
+ assertThat(batteryTipPolicy.dataHistoryRetainDay).isEqualTo(30);
+ assertThat(batteryTipPolicy.excessiveBgDrainPercentage).isEqualTo(10);
}
-
}
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryTipPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryTipPreferenceControllerTest.java
index b4149c1..66be3e2 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryTipPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryTipPreferenceControllerTest.java
@@ -21,6 +21,7 @@
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
@@ -32,10 +33,12 @@
import android.support.v7.preference.PreferenceManager;
import android.support.v7.preference.PreferenceScreen;
+import com.android.internal.logging.nano.MetricsProto;
import com.android.settings.SettingsActivity;
import com.android.settings.TestConfig;
import com.android.settings.fuelgauge.batterytip.tips.BatteryTip;
import com.android.settings.fuelgauge.batterytip.tips.SummaryTip;
+import com.android.settings.testutils.FakeFeatureFactory;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
import org.junit.Before;
@@ -72,6 +75,7 @@
private List<BatteryTip> mOldBatteryTips;
private List<BatteryTip> mNewBatteryTips;
private Preference mPreference;
+ private FakeFeatureFactory mFeatureFactory;
@Before
public void setUp() {
@@ -84,6 +88,7 @@
doReturn(mPreferenceGroup).when(mPreferenceScreen).findPreference(KEY_PREF);
mPreference = new Preference(mContext);
mPreference.setKey(KEY_TIP);
+ mFeatureFactory = FakeFeatureFactory.setupForTest();
mOldBatteryTips = new ArrayList<>();
mOldBatteryTips.add(new SummaryTip(BatteryTip.StateType.NEW));
@@ -104,7 +109,7 @@
}
@Test
- public void updateBatteryTips_updateTwice_firstShowSummaryTipThenRemoveIt() {
+ public void testUpdateBatteryTips_updateTwice_firstShowSummaryTipThenRemoveIt() {
// Display summary tip because its state is new
mBatteryTipPreferenceController.updateBatteryTips(mOldBatteryTips);
assertOnlyContainsSummaryTip(mPreferenceGroup);
@@ -115,6 +120,15 @@
}
@Test
+ public void testUpdateBatteryTips_logBatteryTip() {
+ mBatteryTipPreferenceController.updateBatteryTips(mOldBatteryTips);
+
+ verify(mFeatureFactory.metricsFeatureProvider).action(any(Context.class),
+ eq(MetricsProto.MetricsEvent.ACTION_BATTERY_TIP_SHOWN),
+ eq(BatteryTip.TipType.SUMMARY));
+ }
+
+ @Test
public void testHandlePreferenceTreeClick_noDialog_invokeCallback() {
doReturn(SMART_BATTERY_MANAGER).when(mBatteryTip).getType();
List<BatteryTip> batteryTips = new ArrayList<>();
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryTipUtilsTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryTipUtilsTest.java
new file mode 100644
index 0000000..c7865d8
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryTipUtilsTest.java
@@ -0,0 +1,78 @@
+/*
+ * 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.fuelgauge.batterytip;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.spy;
+
+import com.android.settings.SettingsActivity;
+import com.android.settings.TestConfig;
+import com.android.settings.core.InstrumentedPreferenceFragment;
+import com.android.settings.fuelgauge.batterytip.actions.OpenRestrictAppFragmentAction;
+import com.android.settings.fuelgauge.batterytip.actions.RestrictAppAction;
+import com.android.settings.fuelgauge.batterytip.tips.BatteryTip;
+import com.android.settings.fuelgauge.batterytip.tips.RestrictAppTip;
+import com.android.settings.testutils.FakeFeatureFactory;
+import com.android.settings.testutils.SettingsRobolectricTestRunner;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
+
+import java.util.ArrayList;
+
+@RunWith(SettingsRobolectricTestRunner.class)
+@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
+public class BatteryTipUtilsTest {
+ @Mock
+ private SettingsActivity mSettingsActivity;
+ @Mock
+ private InstrumentedPreferenceFragment mFragment;
+ private RestrictAppTip mRestrictAppTip;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+
+ FakeFeatureFactory.setupForTest();
+ doReturn(RuntimeEnvironment.application).when(mFragment).getContext();
+ mRestrictAppTip = spy(new RestrictAppTip(BatteryTip.StateType.NEW, new ArrayList<>()));
+ }
+
+ @Test
+ public void testGetActionForBatteryTip_typeRestrictStateNew_returnActionRestrict() {
+ doReturn(BatteryTip.StateType.NEW).when(mRestrictAppTip).getState();
+
+ assertThat(BatteryTipUtils.getActionForBatteryTip(mRestrictAppTip, mSettingsActivity,
+ mFragment)).isInstanceOf(RestrictAppAction.class);
+ }
+
+ @Test
+ public void testGetActionForBatteryTip_typeRestrictStateHandled_returnActionOpen() {
+ doReturn(BatteryTip.StateType.HANDLED).when(mRestrictAppTip).getState();
+
+ assertThat(BatteryTipUtils.getActionForBatteryTip(mRestrictAppTip, mSettingsActivity,
+ mFragment)).isInstanceOf(OpenRestrictAppFragmentAction.class);
+ }
+
+}
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/HighUsageDataParserTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/HighUsageDataParserTest.java
index 5bdae0c..fdac12e 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/HighUsageDataParserTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/HighUsageDataParserTest.java
@@ -36,6 +36,7 @@
@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
public class HighUsageDataParserTest {
private static final long PERIOD_ONE_MINUTE_MS = Duration.ofMinutes(1).toMillis();
+ private static final long PERIOD_ONE_HOUR_MS = Duration.ofHours(1).toMillis();
private static final long END_TIME_MS = 2 * PERIOD_ONE_MINUTE_MS;
private static final int THRESHOLD_LOW = 10;
private static final int THRESHOLD_HIGH = 20;
@@ -75,7 +76,17 @@
assertThat(mDataParser.isDeviceHeavilyUsed()).isFalse();
}
+ @Test
+ public void testDataParser_heavilyUsedInShortTime_stillReportHeavilyUsed() {
+ // Set threshold to 1 hour however device only used for 2 minutes
+ mDataParser = new HighUsageDataParser(PERIOD_ONE_HOUR_MS, THRESHOLD_LOW);
+ parseData();
+
+ assertThat(mDataParser.isDeviceHeavilyUsed()).isTrue();
+ }
+
private void parseData() {
+ // Report the battery usage in END_TIME_MS(2 minutes)
mDataParser.onParsingStarted(0, END_TIME_MS);
mDataParser.onDataPoint(0, mFirstItem);
mDataParser.onDataPoint(PERIOD_ONE_MINUTE_MS, mSecondItem);
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/tips/EarlyWarningTipTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/tips/EarlyWarningTipTest.java
index 66d5f81..7dfe42e 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/tips/EarlyWarningTipTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/tips/EarlyWarningTipTest.java
@@ -83,4 +83,38 @@
assertThat(mEarlyWarningTip.getState()).isEqualTo(BatteryTip.StateType.HANDLED);
}
+
+ @Test
+ public void testUpdate_devicePluggedIn_typeBecomeInvisible() {
+ final EarlyWarningTip nextTip = new EarlyWarningTip(BatteryTip.StateType.INVISIBLE,
+ false /* powerModeOn */);
+
+ mEarlyWarningTip.updateState(nextTip);
+
+ assertThat(mEarlyWarningTip.getState()).isEqualTo(BatteryTip.StateType.INVISIBLE);
+ }
+
+ @Test
+ public void testUpdate_turnOnLowPowerModeExplicitly_typeStillInvisible() {
+ final EarlyWarningTip earlyWarningTip = new EarlyWarningTip(BatteryTip.StateType.INVISIBLE,
+ false /* powerModeOn */);
+ final EarlyWarningTip nextTip = new EarlyWarningTip(BatteryTip.StateType.INVISIBLE,
+ true /* powerModeOn */);
+
+ earlyWarningTip.updateState(nextTip);
+
+ assertThat(earlyWarningTip.getState()).isEqualTo(BatteryTip.StateType.INVISIBLE);
+ }
+
+ @Test
+ public void testUpdate_turnOffLowPowerModeExplicitly_typeBecomeInvisible() {
+ final EarlyWarningTip earlyWarningTip = new EarlyWarningTip(BatteryTip.StateType.HANDLED,
+ true /* powerModeOn */);
+ final EarlyWarningTip nextTip = new EarlyWarningTip(BatteryTip.StateType.INVISIBLE,
+ false /* powerModeOn */);
+
+ earlyWarningTip.updateState(nextTip);
+
+ assertThat(earlyWarningTip.getState()).isEqualTo(BatteryTip.StateType.INVISIBLE);
+ }
}
diff --git a/tests/robotests/src/com/android/settings/gestures/GesturesSettingsPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/gestures/GesturesSettingsPreferenceControllerTest.java
index d2333ba..5fc787b 100644
--- a/tests/robotests/src/com/android/settings/gestures/GesturesSettingsPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/gestures/GesturesSettingsPreferenceControllerTest.java
@@ -106,17 +106,17 @@
Settings.Secure.putInt(cr, Settings.Secure.ASSIST_GESTURE_ENABLED, 0);
Settings.Secure.putInt(cr, Settings.Secure.ASSIST_GESTURE_SILENCE_ALERTS_ENABLED, 0);
mController.updateState(mPreference);
- verify(mActivity).getString(R.string.language_input_gesture_summary_off);
+ verify(mActivity).getText(R.string.language_input_gesture_summary_off);
Settings.Secure.putInt(cr, Settings.Secure.ASSIST_GESTURE_ENABLED, 1);
Settings.Secure.putInt(cr, Settings.Secure.ASSIST_GESTURE_SILENCE_ALERTS_ENABLED, 0);
mController.updateState(mPreference);
- verify(mActivity).getString(R.string.language_input_gesture_summary_on_with_assist);
+ verify(mActivity).getText(R.string.language_input_gesture_summary_on_with_assist);
Settings.Secure.putInt(cr, Settings.Secure.ASSIST_GESTURE_ENABLED, 0);
Settings.Secure.putInt(cr, Settings.Secure.ASSIST_GESTURE_SILENCE_ALERTS_ENABLED, 1);
mController.updateState(mPreference);
- verify(mActivity).getString(R.string.language_input_gesture_summary_on_non_assist);
+ verify(mActivity).getText(R.string.language_input_gesture_summary_on_non_assist);
}
@Test
diff --git a/tests/robotests/src/com/android/settings/gestures/SwipeToNotificationSettingsTest.java b/tests/robotests/src/com/android/settings/gestures/SwipeToNotificationSettingsTest.java
index 0b329d3..d6ecb1c 100644
--- a/tests/robotests/src/com/android/settings/gestures/SwipeToNotificationSettingsTest.java
+++ b/tests/robotests/src/com/android/settings/gestures/SwipeToNotificationSettingsTest.java
@@ -59,7 +59,7 @@
@Test
public void testGetPreferenceControllers_shouldAllBeCreated() {
final List<AbstractPreferenceController> controllers =
- mFragment.getPreferenceControllers(mContext);
+ mFragment.createPreferenceControllers(mContext);
assertThat(controllers.isEmpty()).isFalse();
}
diff --git a/tests/robotests/src/com/android/settings/language/LanguageAndInputSettingsTest.java b/tests/robotests/src/com/android/settings/language/LanguageAndInputSettingsTest.java
index 905d2d6..4d82356 100644
--- a/tests/robotests/src/com/android/settings/language/LanguageAndInputSettingsTest.java
+++ b/tests/robotests/src/com/android/settings/language/LanguageAndInputSettingsTest.java
@@ -107,7 +107,7 @@
@Test
public void testGetPreferenceControllers_shouldRegisterLifecycleObservers() {
final List<AbstractPreferenceController> controllers =
- mFragment.getPreferenceControllers(mActivity);
+ mFragment.createPreferenceControllers(mActivity);
int lifecycleObserverCount = 0;
for (AbstractPreferenceController controller : controllers) {
if (controller instanceof LifecycleObserver) {
@@ -121,7 +121,7 @@
@Test
public void testGetPreferenceControllers_shouldAllBeCreated() {
final List<AbstractPreferenceController> controllers =
- mFragment.getPreferenceControllers(mActivity);
+ mFragment.createPreferenceControllers(mActivity);
assertThat(controllers.isEmpty()).isFalse();
}
@@ -189,7 +189,7 @@
fragment.getPreferenceScreenResId());
final List<String> preferenceKeys = new ArrayList<>();
- for (AbstractPreferenceController controller : fragment.getPreferenceControllers(context)) {
+ for (AbstractPreferenceController controller : fragment.createPreferenceControllers(context)) {
preferenceKeys.add(controller.getPreferenceKey());
}
diff --git a/tests/robotests/src/com/android/settings/location/RecentLocationRequestPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/location/RecentLocationRequestPreferenceControllerTest.java
index a339451..1bacd5b 100644
--- a/tests/robotests/src/com/android/settings/location/RecentLocationRequestPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/location/RecentLocationRequestPreferenceControllerTest.java
@@ -22,6 +22,7 @@
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@@ -34,7 +35,6 @@
import android.support.v7.preference.PreferenceCategory;
import android.support.v7.preference.PreferenceScreen;
import android.text.TextUtils;
-
import com.android.settings.R;
import com.android.settings.TestConfig;
import com.android.settings.applications.appinfo.AppInfoDashboardFragment;
@@ -43,7 +43,8 @@
import com.android.settingslib.core.lifecycle.Lifecycle;
import com.android.settingslib.location.RecentLocationApps;
import com.android.settingslib.location.RecentLocationApps.Request;
-
+import java.util.ArrayList;
+import java.util.List;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -56,9 +57,6 @@
import org.robolectric.RuntimeEnvironment;
import org.robolectric.annotation.Config;
-import java.util.ArrayList;
-import java.util.List;
-
@RunWith(SettingsRobolectricTestRunner.class)
@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
public class RecentLocationRequestPreferenceControllerTest {
@@ -71,6 +69,8 @@
private PreferenceScreen mScreen;
@Mock
private RecentLocationApps mRecentLocationApps;
+ @Mock
+ private Preference mSeeAllButton;
private Context mContext;
private RecentLocationRequestPreferenceController mController;
@@ -86,6 +86,7 @@
mController = spy(new RecentLocationRequestPreferenceController(
mContext, mFragment, mLifecycle, mRecentLocationApps));
when(mScreen.findPreference(mController.getPreferenceKey())).thenReturn(mCategory);
+ when(mScreen.findPreference(mController.KEY_SEE_ALL)).thenReturn(mSeeAllButton);
final String key = mController.getPreferenceKey();
when(mCategory.getKey()).thenReturn(key);
when(mCategory.getContext()).thenReturn(mContext);
@@ -123,38 +124,43 @@
@Test
public void updateState_hasRecentRequest_shouldRemoveAllAndAddInjectedSettings() {
- final List<RecentLocationApps.Request> requests = new ArrayList<>();
- final Request req1 = mock(Request.class);
- final Request req2 = mock(Request.class);
- requests.add(req1);
- requests.add(req2);
+ List<Request> requests = createMockRequests(2);
doReturn(requests).when(mRecentLocationApps).getAppListSorted();
- final String title1 = "testTitle1";
- final String title2 = "testTitle2";
- final AppPreference preference1 = mock(AppPreference.class);
- final AppPreference preference2 = mock(AppPreference.class);
- when(preference1.getTitle()).thenReturn(title1);
- when(preference2.getTitle()).thenReturn(title2);
- doReturn(preference1).when(mController)
- .createAppPreference(any(Context.class), eq(req1));
- doReturn(preference2).when(mController)
- .createAppPreference(any(Context.class), eq(req2));
+
mController.displayPreference(mScreen);
mController.updateState(mCategory);
verify(mCategory).removeAll();
// Verifies two preferences are added in original order
InOrder inOrder = Mockito.inOrder(mCategory);
- inOrder.verify(mCategory).addPreference(argThat(titleMatches(title1)));
- inOrder.verify(mCategory).addPreference(argThat(titleMatches(title2)));
+ inOrder.verify(mCategory).addPreference(argThat(titleMatches("appTitle0")));
+ inOrder.verify(mCategory).addPreference(argThat(titleMatches("appTitle1")));
+ }
+
+ @Test
+ public void updateState_hasOverThreeRequests_shouldDisplaySeeAllButton() {
+ List<Request> requests = createMockRequests(6);
+ when(mRecentLocationApps.getAppListSorted()).thenReturn(requests);
+
+ mController.displayPreference(mScreen);
+ mController.updateState(mCategory);
+
+ verify(mCategory).removeAll();
+ // Verifies the first three preferences are added
+ InOrder inOrder = Mockito.inOrder(mCategory);
+ inOrder.verify(mCategory).addPreference(argThat(titleMatches("appTitle0")));
+ inOrder.verify(mCategory).addPreference(argThat(titleMatches("appTitle1")));
+ inOrder.verify(mCategory).addPreference(argThat(titleMatches("appTitle2")));
+ verify(mCategory, never()).addPreference(argThat(titleMatches("appTitle3")));
+ // Verifies the "See all" preference is visible
+ verify(mSeeAllButton).setVisible(true);
}
@Test
public void createAppPreference_shouldAddClickListener() {
final Request request = mock(Request.class);
final AppPreference preference = mock(AppPreference.class);
- doReturn(preference).when(mController)
- .createAppPreference(any(Context.class));
+ doReturn(preference).when(mController).createAppPreference(any(Context.class));
mController.createAppPreference(mContext, request);
@@ -190,4 +196,19 @@
return preference -> TextUtils.equals(expected, preference.getTitle());
}
-}
+ private List<RecentLocationApps.Request> createMockRequests(int count) {
+ List<RecentLocationApps.Request> requests = new ArrayList<>();
+ for (int i = 0; i < count; i++) {
+ // Add mock requests
+ Request req = mock(Request.class, "request" + i);
+ requests.add(req);
+ // Map mock AppPreferences with mock requests
+ String title = "appTitle" + i;
+ AppPreference appPreference = mock(AppPreference.class, "AppPreference" + i);
+ doReturn(title).when(appPreference).getTitle();
+ doReturn(appPreference)
+ .when(mController).createAppPreference(any(Context.class), eq(req));
+ }
+ return requests;
+ }
+}
\ No newline at end of file
diff --git a/tests/robotests/src/com/android/settings/location/RecentLocationRequestSeeAllPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/location/RecentLocationRequestSeeAllPreferenceControllerTest.java
new file mode 100644
index 0000000..2b64dbc
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/location/RecentLocationRequestSeeAllPreferenceControllerTest.java
@@ -0,0 +1,126 @@
+/*
+ * Copyright 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.location;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.arch.lifecycle.LifecycleOwner;
+import android.content.Context;
+import android.provider.Settings.Secure;
+import android.support.v7.preference.PreferenceCategory;
+import android.support.v7.preference.PreferenceScreen;
+import com.android.settings.TestConfig;
+import com.android.settings.testutils.SettingsRobolectricTestRunner;
+import com.android.settings.widget.AppPreference;
+import com.android.settingslib.core.lifecycle.Lifecycle;
+import com.android.settingslib.location.RecentLocationApps;
+import com.android.settingslib.location.RecentLocationApps.Request;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
+
+/** Unit tests for {@link RecentLocationRequestSeeAllPreferenceController} */
+@RunWith(SettingsRobolectricTestRunner.class)
+@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
+public class RecentLocationRequestSeeAllPreferenceControllerTest {
+
+ @Mock
+ RecentLocationRequestSeeAllFragment mFragment;
+ @Mock
+ private PreferenceScreen mScreen;
+ @Mock
+ private PreferenceCategory mCategory;
+ @Mock
+ private RecentLocationApps mRecentLocationApps;
+
+ private Context mContext;
+ private LifecycleOwner mLifecycleOwner;
+ private Lifecycle mLifecycle;
+ private RecentLocationRequestSeeAllPreferenceController mController;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ mContext = spy(RuntimeEnvironment.application);
+ mLifecycleOwner = () -> mLifecycle;
+ mLifecycle = new Lifecycle(mLifecycleOwner);
+ mController = spy(
+ new RecentLocationRequestSeeAllPreferenceController(
+ mContext, mLifecycle, mFragment, mRecentLocationApps));
+ when(mScreen.findPreference(mController.getPreferenceKey())).thenReturn(mCategory);
+ final String key = mController.getPreferenceKey();
+ when(mCategory.getKey()).thenReturn(key);
+ when(mCategory.getContext()).thenReturn(mContext);
+ }
+
+ @Test
+ public void onLocationModeChanged_locationOn_shouldEnablePreference() {
+ mController.displayPreference(mScreen);
+
+ mController.onLocationModeChanged(Secure.LOCATION_MODE_HIGH_ACCURACY, false);
+
+ verify(mCategory).setEnabled(true);
+ }
+
+ @Test
+ public void onLocationModeChanged_locationOff_shouldDisablePreference() {
+ mController.displayPreference(mScreen);
+
+ mController.onLocationModeChanged(Secure.LOCATION_MODE_OFF, false);
+
+ verify(mCategory).setEnabled(false);
+ }
+
+ @Test
+ public void updateState_shouldRemoveAll() {
+ doReturn(Collections.EMPTY_LIST).when(mRecentLocationApps).getAppListSorted();
+
+ mController.displayPreference(mScreen);
+ mController.updateState(mCategory);
+
+ verify(mCategory).removeAll();
+ }
+
+ @Test
+ public void updateState_hasRecentLocationRequest_shouldAddPreference() {
+ Request request = mock(Request.class);
+ AppPreference appPreference = mock(AppPreference.class);
+ doReturn(appPreference)
+ .when(mController).createAppPreference(any(Context.class), eq(request));
+ when(mRecentLocationApps.getAppListSorted())
+ .thenReturn(new ArrayList<>(Arrays.asList(request)));
+
+ mController.displayPreference(mScreen);
+ mController.updateState(mCategory);
+
+ verify(mCategory).removeAll();
+ verify(mCategory).addPreference(appPreference);
+ }
+}
diff --git a/tests/robotests/src/com/android/settings/network/MobileNetworkPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/network/MobileNetworkPreferenceControllerTest.java
index f070f7a..bd55051 100644
--- a/tests/robotests/src/com/android/settings/network/MobileNetworkPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/network/MobileNetworkPreferenceControllerTest.java
@@ -15,11 +15,9 @@
*/
package com.android.settings.network;
-import static android.arch.lifecycle.Lifecycle.Event.ON_PAUSE;
-import static android.arch.lifecycle.Lifecycle.Event.ON_RESUME;
-
+import static android.arch.lifecycle.Lifecycle.Event.ON_START;
+import static android.arch.lifecycle.Lifecycle.Event.ON_STOP;
import static com.google.common.truth.Truth.assertThat;
-
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.spy;
@@ -53,10 +51,10 @@
@RunWith(SettingsRobolectricTestRunner.class)
@Config(
- manifest = TestConfig.MANIFEST_PATH,
- sdk = TestConfig.SDK_VERSION,
- shadows = {ShadowRestrictedLockUtilsWrapper.class, ShadowConnectivityManager.class,
- ShadowUserManager.class}
+ manifest = TestConfig.MANIFEST_PATH,
+ sdk = TestConfig.SDK_VERSION,
+ shadows = {ShadowRestrictedLockUtilsWrapper.class, ShadowConnectivityManager.class,
+ ShadowUserManager.class}
)
public class MobileNetworkPreferenceControllerTest {
@@ -110,11 +108,11 @@
mLifecycle.addObserver(mController);
doReturn(true).when(mController).isAvailable();
- mLifecycle.handleLifecycleEvent(ON_RESUME);
+ mLifecycle.handleLifecycleEvent(ON_START);
verify(mTelephonyManager).listen(mController.mPhoneStateListener,
PhoneStateListener.LISTEN_SERVICE_STATE);
- mLifecycle.handleLifecycleEvent(ON_PAUSE);
+ mLifecycle.handleLifecycleEvent(ON_STOP);
verify(mTelephonyManager).listen(mController.mPhoneStateListener,
PhoneStateListener.LISTEN_NONE);
}
@@ -131,8 +129,8 @@
// Display pref and go through lifecycle to set up listener.
mController.displayPreference(mScreen);
- mLifecycle.handleLifecycleEvent(ON_RESUME);
- verify(mController).onResume();
+ mLifecycle.handleLifecycleEvent(ON_START);
+ verify(mController).onStart();
verify(mTelephonyManager).listen(mController.mPhoneStateListener,
PhoneStateListener.LISTEN_SERVICE_STATE);
diff --git a/tests/robotests/src/com/android/settings/password/ChooseLockPatternTest.java b/tests/robotests/src/com/android/settings/password/ChooseLockPatternTest.java
index e17136e..f3af2df 100644
--- a/tests/robotests/src/com/android/settings/password/ChooseLockPatternTest.java
+++ b/tests/robotests/src/com/android/settings/password/ChooseLockPatternTest.java
@@ -22,6 +22,7 @@
import android.content.Intent;
import android.os.UserHandle;
+import android.view.View;
import com.android.settings.R;
import com.android.settings.TestConfig;
@@ -102,15 +103,27 @@
.isEqualTo(123);
}
+ @Config(qualifiers = "sw400dp")
@Test
- public void assertThat_chooseLockIconChanged_WhenFingerprintExtraSet() {
+ public void fingerprintExtraSet_shouldDisplayFingerprintIcon() {
ChooseLockPattern activity = createActivity(true);
ChooseLockPatternFragment fragment = (ChooseLockPatternFragment)
activity.getFragmentManager().findFragmentById(R.id.main_content);
+
ShadowDrawable drawable = Shadows.shadowOf(((GlifLayout) fragment.getView()).getIcon());
assertThat(drawable.getCreatedFromResId()).isEqualTo(R.drawable.ic_fingerprint_header);
}
+ @Test
+ public void smallScreens_shouldHideIcon() {
+ ChooseLockPattern activity = createActivity(true);
+ ChooseLockPatternFragment fragment = (ChooseLockPatternFragment)
+ activity.getFragmentManager().findFragmentById(R.id.main_content);
+
+ View iconView = fragment.getView().findViewById(R.id.suw_layout_icon);
+ assertThat(iconView.getVisibility()).isEqualTo(View.GONE);
+ }
+
private ChooseLockPattern createActivity(boolean addFingerprintExtra) {
return Robolectric.buildActivity(
ChooseLockPattern.class,
diff --git a/tests/robotests/src/com/android/settings/SetupChooseLockPatternTest.java b/tests/robotests/src/com/android/settings/password/SetupChooseLockPatternTest.java
similarity index 91%
rename from tests/robotests/src/com/android/settings/SetupChooseLockPatternTest.java
rename to tests/robotests/src/com/android/settings/password/SetupChooseLockPatternTest.java
index 81a6bb31..ea32641 100644
--- a/tests/robotests/src/com/android/settings/SetupChooseLockPatternTest.java
+++ b/tests/robotests/src/com/android/settings/password/SetupChooseLockPatternTest.java
@@ -14,7 +14,7 @@
* limitations under the License
*/
-package com.android.settings;
+package com.android.settings.password;
import static com.google.common.truth.Truth.assertThat;
@@ -28,9 +28,11 @@
import android.view.View;
import android.widget.Button;
+import com.android.settings.R;
+import com.android.settings.SetupRedactionInterstitial;
+import com.android.settings.TestConfig;
import com.android.settings.password.ChooseLockPattern.ChooseLockPatternFragment;
import com.android.settings.password.ChooseLockPattern.IntentBuilder;
-import com.android.settings.password.SetupChooseLockPattern;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
import com.android.settings.testutils.shadow.SettingsShadowResources;
import com.android.settings.testutils.shadow.SettingsShadowResourcesImpl;
@@ -89,8 +91,9 @@
.isEqualTo(PackageManager.COMPONENT_ENABLED_STATE_ENABLED);
}
+ @Config(qualifiers = "sw400dp")
@Test
- public void screenLockOptions_shouldBeVisible() {
+ public void sw400dp_shouldShowScreenLockOptions() {
Button button = mActivity.findViewById(R.id.screen_lock_options);
assertThat(button).isNotNull();
assertThat(button.getVisibility()).isEqualTo(View.VISIBLE);
@@ -103,6 +106,13 @@
}
@Test
+ public void smallScreens_shouldHideScreenLockOptions() {
+ Button button = mActivity.findViewById(R.id.screen_lock_options);
+ assertThat(button).isNotNull();
+ assertThat(button.getVisibility()).isEqualTo(View.GONE);
+ }
+
+ @Test
public void skipButton_shouldBeVisible_duringNonFingerprintFlow() {
Button button = mActivity.findViewById(R.id.footerLeftButton);
assertThat(button).isNotNull();
diff --git a/tests/robotests/src/com/android/settings/print/PrintSettingsPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/print/PrintSettingsPreferenceControllerTest.java
index de1625b..bf4733a 100644
--- a/tests/robotests/src/com/android/settings/print/PrintSettingsPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/print/PrintSettingsPreferenceControllerTest.java
@@ -20,26 +20,29 @@
import static android.arch.lifecycle.Lifecycle.Event.ON_STOP;
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import android.arch.lifecycle.LifecycleOwner;
import android.content.Context;
+import android.os.UserManager;
import android.print.PrintJob;
import android.print.PrintJobInfo;
import android.print.PrintManager;
import android.printservice.PrintServiceInfo;
-import android.support.v7.preference.Preference;
import com.android.settings.R;
import com.android.settings.TestConfig;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
import com.android.settings.wrapper.PrintManagerWrapper;
+import com.android.settingslib.RestrictedPreference;
import com.android.settingslib.core.lifecycle.Lifecycle;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
+import org.mockito.Answers;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
@@ -57,8 +60,11 @@
@Mock
private PrintManagerWrapper mPrintManager;
+ @Mock
+ private UserManager mUserManager;
private Context mContext;
- private Preference mPreference;
+ @Mock
+ private RestrictedPreference mPreference;
private PrintSettingPreferenceController mController;
private LifecycleOwner mLifecycleOwner;
private Lifecycle mLifecycle;
@@ -66,8 +72,9 @@
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
- mContext = RuntimeEnvironment.application;
- mPreference = new Preference(mContext);
+ mContext = spy(RuntimeEnvironment.application);
+ when(mContext.getSystemService(Context.USER_SERVICE)).thenReturn(mUserManager);
+ mPreference = spy(new RestrictedPreference(mContext));
mController = new PrintSettingPreferenceController(mContext);
mLifecycleOwner = () -> mLifecycle;
mLifecycle = new Lifecycle(mLifecycleOwner);
@@ -122,4 +129,10 @@
assertThat(mPreference.getSummary())
.isEqualTo(mContext.getString(R.string.print_settings_summary_no_service));
}
+
+ @Test
+ public void updateState_shouldCheckRestriction() {
+ mController.updateState(mPreference);
+ verify(mPreference).checkRestrictionAndSetDisabled(UserManager.DISALLOW_PRINTING);
+ }
}
diff --git a/tests/robotests/src/com/android/settings/search/BaseSearchIndexProviderTest.java b/tests/robotests/src/com/android/settings/search/BaseSearchIndexProviderTest.java
index 260e3ae..f5d3793 100644
--- a/tests/robotests/src/com/android/settings/search/BaseSearchIndexProviderTest.java
+++ b/tests/robotests/src/com/android/settings/search/BaseSearchIndexProviderTest.java
@@ -18,7 +18,6 @@
import static com.google.common.truth.Truth.assertThat;
-
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.spy;
@@ -26,15 +25,15 @@
import android.provider.SearchIndexableResource;
import com.android.settings.R;
-import com.android.settings.testutils.SettingsRobolectricTestRunner;
import com.android.settings.TestConfig;
+import com.android.settings.core.BasePreferenceController;
import com.android.settings.core.PreferenceControllerMixin;
+import com.android.settings.testutils.SettingsRobolectricTestRunner;
import com.android.settingslib.core.AbstractPreferenceController;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
-import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.robolectric.RuntimeEnvironment;
import org.robolectric.annotation.Config;
@@ -50,13 +49,13 @@
private static final String TEST_PREF_KEY = "test_pref_key";
- @Mock
private Context mContext;
private BaseSearchIndexProvider mIndexProvider;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
+ mContext = RuntimeEnvironment.application;
mIndexProvider = spy(BaseSearchIndexProvider.class);
}
@@ -86,11 +85,43 @@
public void getNonIndexableKeys_preferenceIsAvailable_shouldReturnEmptyList() {
List<AbstractPreferenceController> controllers = new ArrayList<>();
controllers.add(new AvailablePreferenceController(mContext));
- doReturn(controllers).when(mIndexProvider).getPreferenceControllers(mContext);
+ doReturn(controllers).when(mIndexProvider).createPreferenceControllers(mContext);
assertThat(mIndexProvider.getNonIndexableKeys(mContext)).isEqualTo(Collections.EMPTY_LIST);
}
+ @Test
+ @Config(qualifiers = "mcc999")
+ public void getAllPreferenceControllers_shouldCreateControllerFromCodeAndXml() {
+
+ final BaseSearchIndexProvider provider = new BaseSearchIndexProvider() {
+ @Override
+ public List<SearchIndexableResource> getXmlResourcesToIndex(Context context,
+ boolean enabled) {
+ final SearchIndexableResource sir = new SearchIndexableResource(context);
+ sir.xmlResId = R.xml.location_settings;
+ return Arrays.asList(sir);
+ }
+
+ @Override
+ public List<AbstractPreferenceController> createPreferenceControllers(Context context) {
+ final List<AbstractPreferenceController> controllersFromCode = new ArrayList<>();
+ controllersFromCode.add(new BasePreferenceController(mContext, "TEST_KEY") {
+ @Override
+ public int getAvailabilityStatus() {
+ return AVAILABLE;
+ }
+ });
+ return controllersFromCode;
+ }
+ };
+
+ final List<AbstractPreferenceController> controllers =
+ provider.getPreferenceControllers(mContext);
+
+ assertThat(controllers).hasSize(3);
+ }
+
public static class NotAvailablePreferenceController extends AbstractPreferenceController
implements PreferenceControllerMixin {
public NotAvailablePreferenceController(Context context) {
@@ -112,7 +143,7 @@
public void getNonIndexableKeys_preferenceIsNotAvailable_shouldReturnKey() {
List<AbstractPreferenceController> controllers = new ArrayList<>();
controllers.add(new NotAvailablePreferenceController(mContext));
- doReturn(controllers).when(mIndexProvider).getPreferenceControllers(mContext);
+ doReturn(controllers).when(mIndexProvider).createPreferenceControllers(mContext);
assertThat(mIndexProvider.getNonIndexableKeys(mContext)).contains(TEST_PREF_KEY);
}
diff --git a/tests/robotests/src/com/android/settings/search/FakeIndexProvider.java b/tests/robotests/src/com/android/settings/search/FakeIndexProvider.java
index 466f5a9..e5f1631 100644
--- a/tests/robotests/src/com/android/settings/search/FakeIndexProvider.java
+++ b/tests/robotests/src/com/android/settings/search/FakeIndexProvider.java
@@ -21,7 +21,6 @@
import android.provider.SearchIndexableResource;
import com.android.settings.R;
-import com.android.settingslib.core.AbstractPreferenceController;
import java.util.ArrayList;
import java.util.List;
@@ -48,12 +47,6 @@
result.add(KEY);
return result;
}
-
- @Override
- public List<AbstractPreferenceController> getPreferenceControllers(
- Context context) {
- return null;
- }
};
}
diff --git a/tests/robotests/src/com/android/settings/search/XmlParserUtilTest.java b/tests/robotests/src/com/android/settings/search/PreferenceXmlParserUtilTest.java
similarity index 78%
rename from tests/robotests/src/com/android/settings/search/XmlParserUtilTest.java
rename to tests/robotests/src/com/android/settings/search/PreferenceXmlParserUtilTest.java
index af7a462..999e93a 100644
--- a/tests/robotests/src/com/android/settings/search/XmlParserUtilTest.java
+++ b/tests/robotests/src/com/android/settings/search/PreferenceXmlParserUtilTest.java
@@ -21,19 +21,25 @@
import android.content.Context;
import android.content.res.XmlResourceParser;
+import android.os.Bundle;
import android.util.AttributeSet;
import android.util.Xml;
import com.android.settings.R;
import com.android.settings.TestConfig;
+import com.android.settings.core.PreferenceXmlParserUtils;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
+import org.robolectric.RuntimeEnvironment;
import org.robolectric.annotation.Config;
-import org.robolectric.shadows.ShadowApplication;
import org.xmlpull.v1.XmlPullParser;
+import org.xmlpull.v1.XmlPullParserException;
+
+import java.io.IOException;
+import java.util.List;
/**
* These tests use a series of preferences that have specific attributes which are sometimes
@@ -44,13 +50,13 @@
*/
@RunWith(SettingsRobolectricTestRunner.class)
@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
-public class XmlParserUtilTest {
+public class PreferenceXmlParserUtilTest {
private Context mContext;
@Before
public void setUp() {
- mContext = ShadowApplication.getInstance().getApplicationContext();
+ mContext = RuntimeEnvironment.application;
}
@Test
@@ -58,7 +64,7 @@
XmlResourceParser parser = getChildByType(R.xml.display_settings,
"com.android.settings.TimeoutListPreference");
final AttributeSet attrs = Xml.asAttributeSet(parser);
- String title = XmlParserUtils.getDataTitle(mContext, attrs);
+ String title = PreferenceXmlParserUtils.getDataTitle(mContext, attrs);
String expTitle = mContext.getString(R.string.screen_timeout);
assertThat(title).isEqualTo(expTitle);
}
@@ -67,7 +73,7 @@
public void testDataKeywordsValid_ReturnsPreferenceKeywords() {
XmlResourceParser parser = getParentPrimedParser(R.xml.display_settings);
final AttributeSet attrs = Xml.asAttributeSet(parser);
- String keywords = XmlParserUtils.getDataKeywords(mContext, attrs);
+ String keywords = PreferenceXmlParserUtils.getDataKeywords(mContext, attrs);
String expKeywords = mContext.getString(R.string.keywords_display);
assertThat(keywords).isEqualTo(expKeywords);
}
@@ -77,7 +83,7 @@
XmlResourceParser parser = getChildByType(R.xml.display_settings,
"com.android.settings.TimeoutListPreference");
final AttributeSet attrs = Xml.asAttributeSet(parser);
- String key = XmlParserUtils.getDataKey(mContext, attrs);
+ String key = PreferenceXmlParserUtils.getDataKey(mContext, attrs);
String expKey = "screen_timeout";
assertThat(key).isEqualTo(expKey);
}
@@ -87,10 +93,9 @@
XmlResourceParser parser = getChildByType(R.xml.display_settings,
"com.android.settings.TimeoutListPreference");
final AttributeSet attrs = Xml.asAttributeSet(parser);
- String summary = XmlParserUtils.getDataSummary(mContext, attrs);
+ String summary = PreferenceXmlParserUtils.getDataSummary(mContext, attrs);
String expSummary = mContext.getString(R.string.summary_placeholder);
assertThat(summary).isEqualTo(expSummary);
-
}
@Test
@@ -99,9 +104,9 @@
XmlResourceParser parser = getChildByType(R.xml.display_settings, "CheckBoxPreference");
final AttributeSet attrs = Xml.asAttributeSet(parser);
- assertThat(XmlParserUtils.getDataSummaryOn(mContext, attrs))
+ assertThat(PreferenceXmlParserUtils.getDataSummaryOn(mContext, attrs))
.isEqualTo("summary_on");
- assertThat(XmlParserUtils.getDataSummaryOff(mContext, attrs))
+ assertThat(PreferenceXmlParserUtils.getDataSummaryOff(mContext, attrs))
.isEqualTo("summary_off");
}
@@ -110,7 +115,7 @@
public void testDataEntriesValid_ReturnsPreferenceEntries() {
XmlResourceParser parser = getChildByType(R.xml.display_settings, "ListPreference");
final AttributeSet attrs = Xml.asAttributeSet(parser);
- String entries = XmlParserUtils.getDataEntries(mContext, attrs);
+ String entries = PreferenceXmlParserUtils.getDataEntries(mContext, attrs);
String[] expEntries = mContext.getResources()
.getStringArray(R.array.app_install_location_entries);
for (int i = 0; i < expEntries.length; i++) {
@@ -124,7 +129,7 @@
public void testDataKeyInvalid_ReturnsNull() {
XmlResourceParser parser = getParentPrimedParser(R.xml.display_settings);
final AttributeSet attrs = Xml.asAttributeSet(parser);
- String key = XmlParserUtils.getDataKey(mContext, attrs);
+ String key = PreferenceXmlParserUtils.getDataKey(mContext, attrs);
assertThat(key).isNull();
}
@@ -134,7 +139,7 @@
XmlResourceParser parser = getChildByType(R.xml.about_legal, "Preference");
final AttributeSet attrs = Xml.asAttributeSet(parser);
- String controller = XmlParserUtils.getController(mContext, attrs);
+ String controller = PreferenceXmlParserUtils.getController(mContext, attrs);
assertThat(controller).isEqualTo("mind_flayer");
}
@@ -142,7 +147,7 @@
public void testDataSummaryInvalid_ReturnsNull() {
XmlResourceParser parser = getParentPrimedParser(R.xml.display_settings);
final AttributeSet attrs = Xml.asAttributeSet(parser);
- String summary = XmlParserUtils.getDataSummary(mContext, attrs);
+ String summary = PreferenceXmlParserUtils.getDataSummary(mContext, attrs);
assertThat(summary).isNull();
}
@@ -150,7 +155,7 @@
public void testDataSummaryOffInvalid_ReturnsNull() {
XmlResourceParser parser = getParentPrimedParser(R.xml.display_settings);
final AttributeSet attrs = Xml.asAttributeSet(parser);
- String summaryOff = XmlParserUtils.getDataSummaryOff(mContext, attrs);
+ String summaryOff = PreferenceXmlParserUtils.getDataSummaryOff(mContext, attrs);
assertThat(summaryOff).isNull();
}
@@ -158,10 +163,24 @@
public void testDataEntriesInvalid_ReturnsNull() {
XmlResourceParser parser = getParentPrimedParser(R.xml.display_settings);
final AttributeSet attrs = Xml.asAttributeSet(parser);
- String entries = XmlParserUtils.getDataEntries(mContext, attrs);
+ String entries = PreferenceXmlParserUtils.getDataEntries(mContext, attrs);
assertThat(entries).isNull();
}
+ @Test
+ @Config(qualifiers = "mcc999")
+ public void extractMetadata_shouldContainKeyAndControllerName()
+ throws IOException, XmlPullParserException {
+ final List<Bundle> metadata = PreferenceXmlParserUtils.extractMetadata(mContext,
+ R.xml.location_settings);
+
+ assertThat(metadata).isNotEmpty();
+ for (Bundle bundle : metadata) {
+ assertThat(bundle.getString(PreferenceXmlParserUtils.METADATA_KEY)).isNotNull();
+ assertThat(bundle.getString(PreferenceXmlParserUtils.METADATA_CONTROLLER)).isNotNull();
+ }
+ }
+
/**
* @param resId the ID for the XML preference
* @return an XML resource parser that points to the start tag
diff --git a/tests/robotests/src/com/android/settings/search/SearchIndexableResourcesTest.java b/tests/robotests/src/com/android/settings/search/SearchIndexableResourcesTest.java
index 72dd94c..5aa2a24 100644
--- a/tests/robotests/src/com/android/settings/search/SearchIndexableResourcesTest.java
+++ b/tests/robotests/src/com/android/settings/search/SearchIndexableResourcesTest.java
@@ -18,9 +18,8 @@
import static android.provider.SearchIndexablesContract.COLUMN_INDEX_NON_INDEXABLE_KEYS_KEY_VALUE;
import static com.google.common.truth.Truth.assertThat;
-
import static junit.framework.Assert.fail;
-
+import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.spy;
@@ -36,6 +35,7 @@
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
+import org.robolectric.RuntimeEnvironment;
import org.robolectric.annotation.Config;
@RunWith(SettingsRobolectricTestRunner.class)
@@ -67,7 +67,7 @@
final int beforeCount =
mSearchProvider.getSearchIndexableResources().getProviderValues().size();
- ( (SearchIndexableResourcesImpl) mSearchProvider.getSearchIndexableResources())
+ ((SearchIndexableResourcesImpl) mSearchProvider.getSearchIndexableResources())
.addIndex(java.lang.String.class);
assertThat(mSearchProvider.getSearchIndexableResources().getProviderValues())
@@ -86,11 +86,13 @@
@Test
public void testNonIndexableKeys_GetsKeyFromProvider() {
mSearchProvider.getSearchIndexableResources().getProviderValues().clear();
- ( (SearchIndexableResourcesImpl) mSearchProvider.getSearchIndexableResources())
+ ((SearchIndexableResourcesImpl) mSearchProvider.getSearchIndexableResources())
.addIndex(FakeIndexProvider.class);
SettingsSearchIndexablesProvider provider = spy(new SettingsSearchIndexablesProvider());
+ doReturn(RuntimeEnvironment.application).when(provider).getContext();
+
Cursor cursor = provider.queryNonIndexableKeys(null);
boolean hasTestKey = false;
while (cursor.moveToNext()) {
@@ -106,8 +108,8 @@
@Test
public void testAllClassNamesHaveProviders() {
- for (Class clazz: mSearchProvider.getSearchIndexableResources().getProviderValues()) {
- if(DatabaseIndexingUtils.getSearchIndexProvider(clazz) == null) {
+ for (Class clazz : mSearchProvider.getSearchIndexableResources().getProviderValues()) {
+ if (DatabaseIndexingUtils.getSearchIndexProvider(clazz) == null) {
fail(clazz.getName() + "is not an index provider");
}
}
diff --git a/tests/robotests/src/com/android/settings/search/SettingsSearchIndexablesProviderTest.java b/tests/robotests/src/com/android/settings/search/SettingsSearchIndexablesProviderTest.java
index cca2794..389b0aa 100644
--- a/tests/robotests/src/com/android/settings/search/SettingsSearchIndexablesProviderTest.java
+++ b/tests/robotests/src/com/android/settings/search/SettingsSearchIndexablesProviderTest.java
@@ -104,6 +104,7 @@
}
@Test
+ @Config(qualifiers = "mcc999")
public void testNonIndexablesColumnFetched() {
Uri rawUri = Uri.parse("content://" + BASE_AUTHORITY + "/" +
SearchIndexablesContract.NON_INDEXABLES_KEYS_PATH);
diff --git a/tests/robotests/src/com/android/settings/search/indexing/FakeSettingsFragment.java b/tests/robotests/src/com/android/settings/search/indexing/FakeSettingsFragment.java
index e857ae4..c314fc2 100644
--- a/tests/robotests/src/com/android/settings/search/indexing/FakeSettingsFragment.java
+++ b/tests/robotests/src/com/android/settings/search/indexing/FakeSettingsFragment.java
@@ -68,7 +68,7 @@
}
@Override
- protected List<AbstractPreferenceController> getPreferenceControllers(Context context) {
+ protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
return null;
}
@@ -116,11 +116,5 @@
keys.add("pref_key_3");
return keys;
}
-
- @Override
- public List<AbstractPreferenceController>
- getPreferenceControllers(Context context) {
- return null;
- }
};
}
\ No newline at end of file
diff --git a/tests/robotests/src/com/android/settings/slices/SliceBuilderUtilsTest.java b/tests/robotests/src/com/android/settings/slices/SliceBuilderUtilsTest.java
index 88e4695..184be5f 100644
--- a/tests/robotests/src/com/android/settings/slices/SliceBuilderUtilsTest.java
+++ b/tests/robotests/src/com/android/settings/slices/SliceBuilderUtilsTest.java
@@ -89,7 +89,7 @@
SliceData data = getDummyData();
FakePreferenceController controller = new FakePreferenceController(mContext, KEY);
- String summary = SliceBuilderUtils.getSubtitleText(mContext, controller, data);
+ CharSequence summary = SliceBuilderUtils.getSubtitleText(mContext, controller, data);
assertThat(summary).isEqualTo(data.getSummary());
}
@@ -101,7 +101,7 @@
String controllerSummary = "new_Summary";
doReturn(controllerSummary).when(controller).getSummary();
- String summary = SliceBuilderUtils.getSubtitleText(mContext, controller, data);
+ CharSequence summary = SliceBuilderUtils.getSubtitleText(mContext, controller, data);
assertThat(summary).isEqualTo(controllerSummary);
}
@@ -111,7 +111,7 @@
SliceData data = getDummyData((String) null);
FakePreferenceController controller = new FakePreferenceController(mContext, KEY);
- String summary = SliceBuilderUtils.getSubtitleText(mContext, controller, data);
+ CharSequence summary = SliceBuilderUtils.getSubtitleText(mContext, controller, data);
assertThat(summary).isEqualTo(data.getScreenTitle());
}
@@ -120,7 +120,7 @@
public void testDynamicSummary_placeHolderString_returnsScreenTitle() {
SliceData data = getDummyData(mContext.getString(R.string.summary_placeholder));
FakePreferenceController controller = new FakePreferenceController(mContext, KEY);
- String summary = SliceBuilderUtils.getSubtitleText(mContext, controller, data);
+ CharSequence summary = SliceBuilderUtils.getSubtitleText(mContext, controller, data);
assertThat(summary).isEqualTo(data.getScreenTitle());
}
@@ -132,7 +132,7 @@
FakePreferenceController controller = spy(new FakePreferenceController(mContext, KEY));
doReturn(summaryPlaceholder).when(controller).getSummary();
- String summary = SliceBuilderUtils.getSubtitleText(mContext, controller, data);
+ CharSequence summary = SliceBuilderUtils.getSubtitleText(mContext, controller, data);
assertThat(summary).isEqualTo(data.getScreenTitle());
}
diff --git a/tests/robotests/src/com/android/settings/slices/SliceControllerInXmlTest.java b/tests/robotests/src/com/android/settings/slices/SliceControllerInXmlTest.java
index 66ed459..9c079a7 100644
--- a/tests/robotests/src/com/android/settings/slices/SliceControllerInXmlTest.java
+++ b/tests/robotests/src/com/android/settings/slices/SliceControllerInXmlTest.java
@@ -38,7 +38,7 @@
import com.android.settings.search.Indexable;
import com.android.settings.search.SearchFeatureProvider;
import com.android.settings.search.SearchFeatureProviderImpl;
-import com.android.settings.search.XmlParserUtils;
+import com.android.settings.core.PreferenceXmlParserUtils;
import com.android.settings.testutils.FakeFeatureFactory;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
@@ -111,7 +111,7 @@
if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
continue;
}
- controllerClassName = XmlParserUtils.getController(mContext, attrs);
+ controllerClassName = PreferenceXmlParserUtils.getController(mContext, attrs);
if (!TextUtils.isEmpty(controllerClassName)) {
mXmlDeclaredControllers.add(controllerClassName);
diff --git a/tests/robotests/src/com/android/settings/system/FactoryResetPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/system/FactoryResetPreferenceControllerTest.java
index b986e4f..f71ae93 100644
--- a/tests/robotests/src/com/android/settings/system/FactoryResetPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/system/FactoryResetPreferenceControllerTest.java
@@ -16,15 +16,14 @@
package com.android.settings.system;
import static com.google.common.truth.Truth.assertThat;
-import static org.mockito.Answers.RETURNS_DEEP_STUBS;
import static org.mockito.Mockito.when;
import android.accounts.AccountManager;
import android.content.Context;
import android.os.UserManager;
-import com.android.settings.testutils.SettingsRobolectricTestRunner;
import com.android.settings.TestConfig;
+import com.android.settings.testutils.SettingsRobolectricTestRunner;
import com.android.settings.testutils.shadow.ShadowSecureSettings;
import com.android.settings.testutils.shadow.ShadowUtils;
@@ -34,7 +33,9 @@
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
+import org.robolectric.RuntimeEnvironment;
import org.robolectric.annotation.Config;
+import org.robolectric.shadows.ShadowApplication;
@RunWith(SettingsRobolectricTestRunner.class)
@Config(
@@ -46,20 +47,20 @@
private static final String FACTORY_RESET_KEY = "factory_reset";
- @Mock(answer = RETURNS_DEEP_STUBS)
- private Context mContext;
@Mock
private UserManager mUserManager;
@Mock
private AccountManager mAccountManager;
+ private Context mContext;
private FactoryResetPreferenceController mController;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
- when(mContext.getSystemService(Context.USER_SERVICE)).thenReturn(mUserManager);
- when(mContext.getSystemService(Context.ACCOUNT_SERVICE)).thenReturn(mAccountManager);
+ mContext = RuntimeEnvironment.application;
+ ShadowApplication.getInstance().setSystemService(Context.USER_SERVICE, mUserManager);
+ ShadowApplication.getInstance().setSystemService(Context.ACCOUNT_SERVICE, mAccountManager);
mController = new FactoryResetPreferenceController(mContext);
}
diff --git a/tests/robotests/src/com/android/settings/testutils/XmlTestUtils.java b/tests/robotests/src/com/android/settings/testutils/XmlTestUtils.java
index 4f560022..2b27649 100644
--- a/tests/robotests/src/com/android/settings/testutils/XmlTestUtils.java
+++ b/tests/robotests/src/com/android/settings/testutils/XmlTestUtils.java
@@ -7,7 +7,7 @@
import android.text.TextUtils;
import android.util.AttributeSet;
import android.util.Xml;
-import com.android.settings.search.XmlParserUtils;
+import com.android.settings.core.PreferenceXmlParserUtils;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
@@ -35,7 +35,7 @@
try {
while (parser.next() != XmlPullParser.END_DOCUMENT) {
try {
- key = XmlParserUtils.getDataKey(context, attrs);
+ key = PreferenceXmlParserUtils.getDataKey(context, attrs);
if (!TextUtils.isEmpty(key)) {
keys.add(key);
}
diff --git a/tests/robotests/src/com/android/settings/webview/WebViewAppPickerTest.java b/tests/robotests/src/com/android/settings/webview/WebViewAppPickerTest.java
index 59a08ae..a381075 100644
--- a/tests/robotests/src/com/android/settings/webview/WebViewAppPickerTest.java
+++ b/tests/robotests/src/com/android/settings/webview/WebViewAppPickerTest.java
@@ -43,10 +43,10 @@
import android.os.UserManager;
import com.android.settings.TestConfig;
-import com.android.settings.applications.defaultapps.DefaultAppInfo;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
import com.android.settings.widget.RadioButtonPreference;
import com.android.settings.wrapper.UserPackageWrapper;
+import com.android.settingslib.applications.DefaultAppInfo;
import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
import com.android.settingslib.wrapper.PackageManagerWrapper;
diff --git a/tests/robotests/src/com/android/settings/widget/EntityHeaderControllerTest.java b/tests/robotests/src/com/android/settings/widget/EntityHeaderControllerTest.java
index 06b4d55..7b47f97 100644
--- a/tests/robotests/src/com/android/settings/widget/EntityHeaderControllerTest.java
+++ b/tests/robotests/src/com/android/settings/widget/EntityHeaderControllerTest.java
@@ -270,7 +270,7 @@
mController = EntityHeaderController.newInstance(mActivity, mFragment, appLinks);
mController.setPackageName("123")
- .setUid(UserHandle.USER_SYSTEM)
+ .setUid(123321)
.setHasAppInfoLink(true)
.setButtonActions(
EntityHeaderController.ActionType.ACTION_NOTIF_PREFERENCE,
diff --git a/tests/robotests/src/com/android/settings/widget/HighlightablePreferenceGroupAdapterTest.java b/tests/robotests/src/com/android/settings/widget/HighlightablePreferenceGroupAdapterTest.java
index e2fb6c1..8869c30 100644
--- a/tests/robotests/src/com/android/settings/widget/HighlightablePreferenceGroupAdapterTest.java
+++ b/tests/robotests/src/com/android/settings/widget/HighlightablePreferenceGroupAdapterTest.java
@@ -21,18 +21,24 @@
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyZeroInteractions;
import static org.mockito.Mockito.when;
import android.content.Context;
import android.graphics.drawable.ColorDrawable;
+import android.os.Bundle;
import android.support.v7.preference.PreferenceCategory;
+import android.support.v7.preference.PreferenceScreen;
import android.support.v7.preference.PreferenceViewHolder;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import com.android.settings.R;
+import com.android.settings.SettingsActivity;
+import com.android.settings.SettingsPreferenceFragment;
import com.android.settings.TestConfig;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
@@ -55,6 +61,9 @@
private View mRoot;
@Mock
private PreferenceCategory mPreferenceCatetory;
+ @Mock
+ private SettingsPreferenceFragment mFragment;
+
private Context mContext;
private HighlightablePreferenceGroupAdapter mAdapter;
private PreferenceViewHolder mViewHolder;
@@ -64,8 +73,8 @@
MockitoAnnotations.initMocks(this);
mContext = RuntimeEnvironment.application;
when(mPreferenceCatetory.getContext()).thenReturn(mContext);
- mAdapter = new HighlightablePreferenceGroupAdapter(mPreferenceCatetory, TEST_KEY,
- false /* highlighted*/);
+ mAdapter = spy(new HighlightablePreferenceGroupAdapter(mPreferenceCatetory, TEST_KEY,
+ false /* highlighted*/));
mViewHolder = PreferenceViewHolder.createInstanceForTests(
View.inflate(mContext, R.layout.app_preference_item, null));
}
@@ -96,6 +105,57 @@
}
@Test
+ public void adjustInitialExpandedChildCount_invalidInput_shouldNotadjust() {
+ HighlightablePreferenceGroupAdapter.adjustInitialExpandedChildCount(null /* host */);
+ HighlightablePreferenceGroupAdapter.adjustInitialExpandedChildCount(mFragment);
+ final Bundle args = new Bundle();
+ when(mFragment.getArguments()).thenReturn(args);
+ HighlightablePreferenceGroupAdapter.adjustInitialExpandedChildCount(mFragment);
+ final PreferenceScreen screen = mock(PreferenceScreen.class);
+ when(mFragment.getArguments()).thenReturn(null);
+ when(mFragment.getPreferenceScreen()).thenReturn(screen);
+ HighlightablePreferenceGroupAdapter.adjustInitialExpandedChildCount(mFragment);
+ verifyZeroInteractions(screen);
+ }
+
+ @Test
+ public void adjustInitialExpandedChildCount_hasHightlightKey_shouldExpandAllChildren() {
+ final Bundle args = new Bundle();
+ when(mFragment.getArguments()).thenReturn(args);
+ args.putString(SettingsActivity.EXTRA_FRAGMENT_ARG_KEY, "testkey");
+ final PreferenceScreen screen = mock(PreferenceScreen.class);
+ when(mFragment.getPreferenceScreen()).thenReturn(screen);
+ HighlightablePreferenceGroupAdapter.adjustInitialExpandedChildCount(mFragment);
+
+ verify(screen).setInitialExpandedChildrenCount(Integer.MAX_VALUE);
+ }
+
+ @Test
+ public void adjustInitialExpandedChildCount_noKeyOrChildCountOverride_shouldDoNothing() {
+ final Bundle args = new Bundle();
+ when(mFragment.getArguments()).thenReturn(args);
+ when(mFragment.getInitialExpandedChildCount()).thenReturn(-1);
+ final PreferenceScreen screen = mock(PreferenceScreen.class);
+ when(mFragment.getPreferenceScreen()).thenReturn(screen);
+ HighlightablePreferenceGroupAdapter.adjustInitialExpandedChildCount(mFragment);
+
+ verify(mFragment).getInitialExpandedChildCount();
+ verifyZeroInteractions(screen);
+ }
+
+ @Test
+ public void adjustInitialExpandedChildCount_hasCountOverride_shouldDoNothing() {
+ when(mFragment.getInitialExpandedChildCount()).thenReturn(10);
+ final PreferenceScreen screen = mock(PreferenceScreen.class);
+ when(mFragment.getPreferenceScreen()).thenReturn(screen);
+ HighlightablePreferenceGroupAdapter.adjustInitialExpandedChildCount(mFragment);
+
+ verify(mFragment).getInitialExpandedChildCount();
+
+ verify(screen).setInitialExpandedChildrenCount(10);
+ }
+
+ @Test
public void updateBackground_notHighlightedRow_shouldNotSetHighlightedTag() {
ReflectionHelpers.setField(mAdapter, "mHighlightPosition", 10);
@@ -105,12 +165,36 @@
}
@Test
- public void updateBackground_highlight_shouldChangeBackgroundAndSetHighlightedTag() {
+ public void updateBackground_highlight_shouldAnimateBackgroundAndSetHighlightedTag() {
ReflectionHelpers.setField(mAdapter, "mHighlightPosition", 10);
+ assertThat(mAdapter.mFadeInAnimated).isFalse();
mAdapter.updateBackground(mViewHolder, 10);
+
+ assertThat(mAdapter.mFadeInAnimated).isTrue();
assertThat(mViewHolder.itemView.getBackground()).isInstanceOf(ColorDrawable.class);
assertThat(mViewHolder.itemView.getTag(R.id.preference_highlighted)).isEqualTo(true);
+ verify(mAdapter).requestRemoveHighlightDelayed(mViewHolder.itemView);
+ }
+
+ @Test
+ public void updateBackgroundTwice_highlight_shouldAnimateOnce() {
+ ReflectionHelpers.setField(mAdapter, "mHighlightPosition", 10);
+ ReflectionHelpers.setField(mViewHolder, "itemView", spy(mViewHolder.itemView));
+ assertThat(mAdapter.mFadeInAnimated).isFalse();
+ mAdapter.updateBackground(mViewHolder, 10);
+ // mFadeInAnimated change from false to true - indicating background change is scheduled
+ // through animation.
+ assertThat(mAdapter.mFadeInAnimated).isTrue();
+ // remove highlight should be requested.
+ verify(mAdapter).requestRemoveHighlightDelayed(mViewHolder.itemView);
+
+ ReflectionHelpers.setField(mAdapter, "mHighlightPosition", 10);
+ mAdapter.updateBackground(mViewHolder, 10);
+ // only sets background color once - if it's animation this would be called many times
+ verify(mViewHolder.itemView).setBackgroundColor(mAdapter.mHighlightColor);
+ // remove highlight should be requested.
+ verify(mAdapter, times(2)).requestRemoveHighlightDelayed(mViewHolder.itemView);
}
@Test
diff --git a/tests/robotests/src/com/android/settings/widget/RadioButtonPickerFragmentTest.java b/tests/robotests/src/com/android/settings/widget/RadioButtonPickerFragmentTest.java
index fd1d79e..c8b3ef6 100644
--- a/tests/robotests/src/com/android/settings/widget/RadioButtonPickerFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/widget/RadioButtonPickerFragmentTest.java
@@ -28,9 +28,9 @@
import android.support.v7.preference.PreferenceScreen;
import com.android.settings.TestConfig;
-import com.android.settings.applications.defaultapps.DefaultAppInfo;
import com.android.settings.testutils.FakeFeatureFactory;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
+import com.android.settingslib.applications.DefaultAppInfo;
import org.junit.Before;
import org.junit.Test;
diff --git a/tests/robotests/src/com/android/settings/wifi/WifiConfigControllerTest.java b/tests/robotests/src/com/android/settings/wifi/WifiConfigControllerTest.java
index b200639..e9b6146 100644
--- a/tests/robotests/src/com/android/settings/wifi/WifiConfigControllerTest.java
+++ b/tests/robotests/src/com/android/settings/wifi/WifiConfigControllerTest.java
@@ -199,15 +199,6 @@
assertThat(mView.findViewById(R.id.eap).getVisibility()).isEqualTo(View.GONE);
}
- @Test
- public void ssidGetFocus_addNewNetwork_shouldReturnTrue() {
- mController = new TestWifiConfigController(mConfigUiBase, mView, null /* accessPoint */,
- WifiConfigUiBase.MODE_CONNECT);
- final TextView ssid = mView.findViewById(R.id.ssid);
- // Verify ssid text get focus when add new network
- assertThat(ssid.isFocused()).isTrue();
- }
-
public class TestWifiConfigController extends WifiConfigController {
public TestWifiConfigController(WifiConfigUiBase parent, View view,
diff --git a/tests/uitests/Android.mk b/tests/uitests/Android.mk
index d52911d..6f03b3f 100644
--- a/tests/uitests/Android.mk
+++ b/tests/uitests/Android.mk
@@ -16,6 +16,7 @@
include $(CLEAR_VARS)
LOCAL_PACKAGE_NAME := SettingsUITests
+LOCAL_PRIVATE_PLATFORM_APIS := true
LOCAL_COMPATIBILITY_SUITE := device-tests
LOCAL_SRC_FILES := $(call all-java-files-under, src)
LOCAL_MODULE_TAGS := tests
diff --git a/tests/uitests/src/com/android/settings/ui/AboutPhoneSettingsTests.java b/tests/uitests/src/com/android/settings/ui/AboutPhoneSettingsTests.java
index b92a707..738d710 100644
--- a/tests/uitests/src/com/android/settings/ui/AboutPhoneSettingsTests.java
+++ b/tests/uitests/src/com/android/settings/ui/AboutPhoneSettingsTests.java
@@ -52,10 +52,8 @@
// TODO: retrieve using name/ids from com.android.settings package
private static final String[] sResourceTexts = {
"Phone number",
- "SIM status",
- "Model & hardware",
- "MEID",
- "Android version"
+ "Legal information",
+ "Regulatory labels"
};
private UiDevice mDevice;
@@ -94,11 +92,11 @@
}
@Test
- public void testAllMenuEntriesExist() throws Exception {
+ public void testAllMenuEntriesExist() {
searchForItemsAndTakeAction(mDevice, sResourceTexts);
}
- private void launchAboutPhoneSettings(String aboutSetting) throws Exception {
+ private void launchAboutPhoneSettings(String aboutSetting) {
Intent aboutIntent = new Intent(aboutSetting);
aboutIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
InstrumentationRegistry.getTargetContext().startActivity(aboutIntent);
@@ -107,8 +105,7 @@
/**
* Removes items found in the view and optionally takes some action.
*/
- private void removeItemsAndTakeAction(UiDevice device, ArrayList<String> itemsLeftToFind)
- throws Exception {
+ private void removeItemsAndTakeAction(UiDevice device, ArrayList<String> itemsLeftToFind) {
for (Iterator<String> iterator = itemsLeftToFind.iterator(); iterator.hasNext(); ) {
String itemText = iterator.next();
UiObject2 item = device.wait(Until.findObject(By.text(itemText)), TIMEOUT);
@@ -124,8 +121,7 @@
* <p>Will scroll down the screen until it has found all elements or reached the bottom.
* This allows elements to be found and acted on even if they change order.
*/
- private void searchForItemsAndTakeAction(UiDevice device, String[] itemsToFind)
- throws Exception {
+ private void searchForItemsAndTakeAction(UiDevice device, String[] itemsToFind) {
ArrayList<String> itemsLeftToFind = new ArrayList<>(Arrays.asList(itemsToFind));
assertWithMessage("There must be at least one item to search for on the screen!")
diff --git a/tests/unit/Android.mk b/tests/unit/Android.mk
index cbf91db..1981a63 100644
--- a/tests/unit/Android.mk
+++ b/tests/unit/Android.mk
@@ -27,6 +27,7 @@
LOCAL_SRC_FILES := $(call all-java-files-under, src)
LOCAL_PACKAGE_NAME := SettingsUnitTests
+LOCAL_PRIVATE_PLATFORM_APIS := true
LOCAL_COMPATIBILITY_SUITE := device-tests
LOCAL_INSTRUMENTATION_FOR := Settings
diff --git a/tests/unit/src/com/android/settings/core/PreferenceControllerContractTest.java b/tests/unit/src/com/android/settings/core/PreferenceControllerContractTest.java
index b16c700..802a3a7 100644
--- a/tests/unit/src/com/android/settings/core/PreferenceControllerContractTest.java
+++ b/tests/unit/src/com/android/settings/core/PreferenceControllerContractTest.java
@@ -20,7 +20,6 @@
import android.content.Context;
import android.platform.test.annotations.Presubmit;
-import android.provider.SearchIndexableResource;
import android.support.test.InstrumentationRegistry;
import android.support.test.filters.MediumTest;
import android.support.test.runner.AndroidJUnit4;
diff --git a/tests/unit/src/com/android/settings/core/UniquePreferenceTest.java b/tests/unit/src/com/android/settings/core/UniquePreferenceTest.java
index dd27591..e208709 100644
--- a/tests/unit/src/com/android/settings/core/UniquePreferenceTest.java
+++ b/tests/unit/src/com/android/settings/core/UniquePreferenceTest.java
@@ -36,7 +36,6 @@
import com.android.settings.search.Indexable;
import com.android.settings.search.SearchIndexableRaw;
import com.android.settings.search.SearchIndexableResources;
-import com.android.settings.search.XmlParserUtils;
import org.junit.Before;
import org.junit.Test;
@@ -203,7 +202,7 @@
continue;
}
final AttributeSet attrs = Xml.asAttributeSet(parser);
- final String key = XmlParserUtils.getDataKey(mContext, attrs);
+ final String key = PreferenceXmlParserUtils.getDataKey(mContext, attrs);
if (TextUtils.isEmpty(key)) {
Log.e(TAG, "Every preference must have an key; found null key"
+ " in " + className
diff --git a/tests/unit/src/com/android/settings/development/BluetoothMaxConnectedAudioDevicesPreferenceControllerInstrumentationTest.java b/tests/unit/src/com/android/settings/development/BluetoothMaxConnectedAudioDevicesPreferenceControllerInstrumentationTest.java
new file mode 100644
index 0000000..ce81667
--- /dev/null
+++ b/tests/unit/src/com/android/settings/development/BluetoothMaxConnectedAudioDevicesPreferenceControllerInstrumentationTest.java
@@ -0,0 +1,64 @@
+/*
+ * 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.development;
+
+import android.content.Context;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+
+import com.android.settings.R;
+
+import org.hamcrest.CoreMatchers;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.util.Arrays;
+
+@RunWith(AndroidJUnit4.class)
+@SmallTest
+public class BluetoothMaxConnectedAudioDevicesPreferenceControllerInstrumentationTest {
+
+ private Context mTargetContext;
+ private String[] mListValues;
+ private String[] mListEntries;
+ private String mDefaultMaxConnectedAudioDevices;
+
+ @Before
+ public void setUp() throws Exception {
+ mTargetContext = InstrumentationRegistry.getTargetContext();
+ // Get XML values without mock
+ mListValues = mTargetContext.getResources()
+ .getStringArray(R.array.bluetooth_max_connected_audio_devices_values);
+ mListEntries = mTargetContext.getResources()
+ .getStringArray(R.array.bluetooth_max_connected_audio_devices);
+ mDefaultMaxConnectedAudioDevices = String.valueOf(mTargetContext.getResources()
+ .getInteger(
+ com.android.internal.R.integer
+ .config_bluetooth_max_connected_audio_devices));
+ }
+
+ @Test
+ public void verifyResource() {
+ // Verify normal list entries and default preference entries have the same size
+ Assert.assertEquals(mListEntries.length, mListValues.length);
+ Assert.assertThat(Arrays.asList(mListValues),
+ CoreMatchers.hasItem(mDefaultMaxConnectedAudioDevices));
+ }
+}
diff --git a/tests/unit/src/com/android/settings/wifi/WifiSettingsUiTest.java b/tests/unit/src/com/android/settings/wifi/WifiSettingsUiTest.java
index e44a596..bc6caf6 100644
--- a/tests/unit/src/com/android/settings/wifi/WifiSettingsUiTest.java
+++ b/tests/unit/src/com/android/settings/wifi/WifiSettingsUiTest.java
@@ -51,6 +51,7 @@
import android.support.test.runner.AndroidJUnit4;
import com.android.settings.Settings.WifiSettingsActivity;
+import com.android.settingslib.utils.ThreadUtils;
import com.android.settingslib.wifi.AccessPoint;
import com.android.settingslib.wifi.TestAccessPointBuilder;
import com.android.settingslib.wifi.WifiTracker;
@@ -60,6 +61,7 @@
import com.google.common.collect.Lists;
import org.junit.Before;
+import org.junit.Ignore;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -261,26 +263,6 @@
}
@Test
- public void resumingAp_shouldNotForceUpdateWhenExistingAPsAreListed() {
- setWifiState(WifiManager.WIFI_STATE_ENABLED);
- setupConnectedAccessPoint();
- when(mWifiTracker.isConnected()).thenReturn(true);
-
- launchActivity();
-
- onView(withText(resourceString(WIFI_DISPLAY_STATUS_CONNECTED))).check(
- matches(isDisplayed()));
- verify(mWifiTracker).forceUpdate();
-
- Activity activity = mActivityRule.getActivity();
- activity.finish();
- getInstrumentation().waitForIdleSync();
-
- getInstrumentation().callActivityOnStart(activity);
- verify(mWifiTracker, atMost(1)).forceUpdate();
- }
-
- @Test
public void changingSecurityStateOnApShouldNotCauseMultipleListItems() {
setWifiState(WifiManager.WIFI_STATE_ENABLED);
TestAccessPointBuilder builder = new TestAccessPointBuilder(mContext)
@@ -305,10 +287,10 @@
onView(withText(TEST_SSID)).check(matches(isDisplayed()));
- mWifiListener.onAccessPointsChanged();
+ ThreadUtils.postOnMainThread(() -> mWifiListener.onAccessPointsChanged());
onView(withText(TEST_SSID)).check(matches(isDisplayed()));
- mWifiListener.onAccessPointsChanged();
+ ThreadUtils.postOnMainThread(() -> mWifiListener.onAccessPointsChanged());
onView(withText(TEST_SSID)).check(matches(isDisplayed()));
}
@@ -361,13 +343,14 @@
onView(withId(resourceId(ID, PASSWORD))).check(matches(isDisplayed()));
}
+ @Ignore("b/73796195")
+ @Test
public void onConnectedChanged_shouldNotFetchAPs() {
setWifiState(WifiManager.WIFI_STATE_ENABLED);
when(mWifiTracker.isConnected()).thenReturn(true);
launchActivity();
- verify(mWifiTracker, atMost(1)).forceUpdate();
verify(mWifiTracker, times(1)).getAccessPoints();
onView(withText(WIFI_DISPLAY_STATUS_CONNECTED)).check(matches(isDisplayed()));