Merge "Use BatteryStatsLoader in InstalledAppDetails" into oc-dev
diff --git a/res/drawable-hdpi/empty_search_results.png b/res/drawable-hdpi/empty_search_results.png
new file mode 100644
index 0000000..290f0ed
--- /dev/null
+++ b/res/drawable-hdpi/empty_search_results.png
Binary files differ
diff --git a/res/drawable-mdpi/empty_search_results.png b/res/drawable-mdpi/empty_search_results.png
new file mode 100644
index 0000000..9ef49a6
--- /dev/null
+++ b/res/drawable-mdpi/empty_search_results.png
Binary files differ
diff --git a/res/drawable-xhdpi/empty_search_results.png b/res/drawable-xhdpi/empty_search_results.png
new file mode 100644
index 0000000..92a9392
--- /dev/null
+++ b/res/drawable-xhdpi/empty_search_results.png
Binary files differ
diff --git a/res/drawable-xxhdpi/empty_search_results.png b/res/drawable-xxhdpi/empty_search_results.png
new file mode 100644
index 0000000..894ed7b
--- /dev/null
+++ b/res/drawable-xxhdpi/empty_search_results.png
Binary files differ
diff --git a/res/drawable-xxxhdpi/empty_search_results.png b/res/drawable-xxxhdpi/empty_search_results.png
new file mode 100644
index 0000000..8f12e96
--- /dev/null
+++ b/res/drawable-xxxhdpi/empty_search_results.png
Binary files differ
diff --git a/res/drawable/no_search_results.xml b/res/drawable/no_search_results.xml
deleted file mode 100644
index a75a443..0000000
--- a/res/drawable/no_search_results.xml
+++ /dev/null
@@ -1,59 +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.
-
- -->
-
-<vector android:height="24dp" android:viewportHeight="267.9"
- android:viewportWidth="236.3" android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
- <path android:fillAlpha="0.9" android:fillColor="#00000000"
- android:pathData="M18,-19c0,-0.4 0,-0.5 -0.3,-0.3l-12,7c-0.3,0.2 -0.2,0.5 0.1,0.6l11.9,7C18,-4.5 18,-4.7 18,-5V-19z"
- android:strokeColor="#FFFFFF" android:strokeWidth="2"/>
- <path android:fillAlpha="0.9" android:fillColor="#00000000"
- android:pathData="M18.9,-12c0,-3.8 -3.1,-6.9 -6.9,-6.9c-3.8,0 -6.9,3.1 -6.9,6.9c0,3.8 3.1,6.9 6.9,6.9C15.8,-5.1 18.9,-8.2 18.9,-12z"
- android:strokeColor="#FFFFFF" android:strokeWidth="1.8033"/>
- <path android:fillAlpha="0.9" android:fillColor="#00000000"
- android:pathData="M19,-5.7C19,-5.4 18.6,-5 18.2,-5H5.8C5.4,-5 5,-5.4 5,-5.7v-12.6C5,-18.6 5.4,-19 5.8,-19h12.4c0.4,0 0.8,0.4 0.8,0.7V-5.7z"
- android:strokeColor="#FFFFFF" android:strokeWidth="2"/>
- <path android:fillColor="#FAFAFA" android:pathData="M118.2,134.4m-118.2,0a118.2,118.2 0,1 1,236.4 0a118.2,118.2 0,1 1,-236.4 0"/>
- <path android:fillColor="#F5F5F5" android:pathData="M22.8,239L96,206.2c0.2,-0.1 0.3,-0.1 0.5,-0.1l117.3,23c0.7,0.2 0.9,1.2 0.2,1.5l-75.9,37.2c-0.2,0.1 -0.3,0.1 -0.5,0.1L23,240.5C22.2,240.3 22.1,239.3 22.8,239z"/>
- <path android:fillColor="#E8E8E8" android:pathData="M35.6,76.5l102,17.3l0,167.4l-102,-23.2z"/>
- <path android:fillColor="#E8E8E8" android:pathData="M35.7,19.6l102,17.3l0,79.2l-102,-23.2z"/>
- <path android:fillColor="#EFEFEF" android:pathData="M35.7,19.6l66.6,-19.6l100.5,19.1l-65.1,18.5z"/>
- <path android:fillColor="#00000000"
- android:pathData="M37.6,131.9L135.2,150"
- android:strokeColor="#E0E0E0" android:strokeWidth="0.1816"/>
- <path android:fillAlpha="0.5" android:fillColor="#00000000"
- android:pathData="M39.1,185.3L132.3,204.8"
- android:strokeColor="#C1C1C1" android:strokeWidth="0.1816"/>
- <path android:fillColor="#00000000"
- android:pathData="M137.7,147.6L116.5,154.5"
- android:strokeColor="#E0E0E0" android:strokeWidth="0.1816"/>
- <path android:fillColor="#00000000" android:pathData="M35.7,142.2"
- android:strokeColor="#E0E0E0" android:strokeWidth="0.1816"/>
- <path android:fillAlpha="5.000000e-02" android:fillColor="#FF000000" android:pathData="M35.7,140.9l101.7,9.2l0,33.1l-101.8,-21.3z"/>
- <path android:fillColor="#CECECE" android:pathData="M71,36.9l28.8,5l0,5.8l-28.8,-5.3z"/>
- <path android:fillAlpha="0.1" android:fillColor="#1F1F1F" android:pathData="M71,36.9l28.8,5l0,1.7l-28.8,-5.3z"/>
- <path android:fillAlpha="0.5" android:fillColor="#CECECE" android:pathData="M68.4,147.3l28.8,5.1l0,5.8l-28.8,-5.4z"/>
- <path android:fillAlpha="0.1" android:fillColor="#1F1F1F" android:pathData="M68.4,147.3l28.8,5.1l0,1.7l-28.8,-5.4z"/>
- <path android:fillAlpha="0.7" android:fillColor="#CECECE" android:pathData="M68.4,201.2l28.8,5.4l0,5.8l-28.8,-5.7z"/>
- <path android:fillAlpha="0.1" android:fillColor="#1F1F1F" android:pathData="M68.4,201.2l28.8,5.4l0,1.6l-28.8,-5.6z"/>
- <path android:fillColor="#EAEAEA" android:pathData="M16.2,80.3l100.3,18.1l0,58.5l-100.3,-20.2z"/>
- <path android:fillColor="#EFEFEF" android:pathData="M137.7,37.6l0,53.9l-21.2,6.9l0,58.5l21.2,-6.9l0,111.1l65.1,-30l0,-212z"/>
- <path android:fillColor="#E57373" android:pathData="M16.2,80.3l19.5,-8.2l0,11.7z"/>
- <path android:fillAlpha="0.6" android:fillColor="#E57373" android:pathData="M137.7,91.5l-102,-19.4l0,11.7l80.8,14.6z"/>
- <path android:fillColor="#CECECE" android:pathData="M47.2,95.5l28.8,5l0,5.8l-28.8,-5.2z"/>
- <path android:fillAlpha="0.1" android:fillColor="#1F1F1F" android:pathData="M47.2,95.5l28.8,5l0,1.7l-28.8,-5.2z"/>
- <path android:fillColor="#EAEAEA" android:pathData="M35.7,72.1L35.7,72.1l-19.6,8.1l0,0.1l0,0l100.3,18.1l0,0l0,0l21.6,-7L35.7,72.1zM116.5,97.5L19.4,80l16.4,-6.8L134,91.8L116.5,97.5z"/>
-</vector>
diff --git a/res/layout/search_panel.xml b/res/layout/search_panel.xml
index 8f72847..9445e0c 100644
--- a/res/layout/search_panel.xml
+++ b/res/layout/search_panel.xml
@@ -61,18 +61,20 @@
android:id="@+id/no_results_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
- android:gravity="center"
+ android:paddingTop="80dp"
android:orientation="vertical"
android:visibility="gone">
<ImageView
- android:layout_height="112dp"
- android:layout_width="112dp"
- android:src="@drawable/no_search_results"/>
+ android:layout_height="160dp"
+ android:layout_width="160dp"
+ android:layout_gravity="center_horizontal"
+ android:src="@drawable/empty_search_results"/>
<TextView
android:layout_height="wrap_content"
android:layout_width="match_parent"
+ android:paddingTop="24dp"
android:textSize="18sp"
android:text="@string/search_settings_no_results"
android:gravity="center"/>
diff --git a/res/values-b+sr+Latn/strings.xml b/res/values-b+sr+Latn/strings.xml
index 9416bfe..f6d7562 100644
--- a/res/values-b+sr+Latn/strings.xml
+++ b/res/values-b+sr+Latn/strings.xml
@@ -34,7 +34,7 @@
<string name="header_category_wireless_networks" msgid="5110914332313954940">"Bežična veza i mreže"</string>
<string name="header_category_connections" msgid="6471513040815680662">"Veze"</string>
<string name="header_category_device" msgid="4544026001618307754">"Uređaj"</string>
- <string name="header_category_personal" msgid="3310195187905720823">"Lično"</string>
+ <string name="header_category_personal" msgid="3310195187905720823">"Lični"</string>
<string name="header_category_access" msgid="7580499097416970962">"Pristup"</string>
<string name="header_category_system" msgid="2816866961183068977">"Sistem"</string>
<string name="radio_info_data_connection_enable" msgid="8656750679353982712">"Omogući vezu za prenos podataka"</string>
@@ -584,7 +584,7 @@
<item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> aktivne aplikacije</item>
<item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> aktivnih aplikacija</item>
</plurals>
- <string name="manage_trust_agents" msgid="4629279457536987768">"Trust agents"</string>
+ <string name="manage_trust_agents" msgid="4629279457536987768">"Pouzdani agenti"</string>
<string name="disabled_because_no_backup_security" msgid="6877660253409580377">"Da biste ga koristili, prvo podesite zaključavanje ekrana"</string>
<string name="manage_trust_agents_summary" msgid="1475819820389620546">"Ništa"</string>
<plurals name="manage_trust_agents_summary_on" formatted="false" msgid="3935182396726101824">
@@ -962,7 +962,7 @@
<string name="search_settings" msgid="1910951467596035063">"Pretraga"</string>
<string name="search_settings_summary" msgid="9205656546570654169">"Upravljanje podešavanjima pretrage i istorijom"</string>
<string name="search_settings_no_results" msgid="8799027492641230999">"Nema rezultata"</string>
- <string name="display_settings" msgid="7965901687241669598">"Prikaz"</string>
+ <string name="display_settings" msgid="7965901687241669598">"Ekran"</string>
<string name="accelerometer_title" msgid="7854608399547349157">"Automatsko rotiranje ekrana"</string>
<string name="accelerometer_summary_on" product="tablet" msgid="429982132339828942">"Promeni položaj automatski prilikom rotiranja tableta"</string>
<string name="accelerometer_summary_on" product="default" msgid="1133737282813048021">"Automatska promena položaja prilikom rotacije telefona"</string>
@@ -2190,7 +2190,7 @@
<string name="no_device_admins" msgid="4846602835339095768">"Nema dostupnih aplikacija za administratora uređaja"</string>
<string name="personal_device_admin_title" msgid="2849617316347669861">"Lični"</string>
<string name="managed_device_admin_title" msgid="7853955652864478435">"Posao"</string>
- <string name="no_trust_agents" msgid="7450273545568977523">"Trust agents - Nedostupno"</string>
+ <string name="no_trust_agents" msgid="7450273545568977523">"Nema dostupnih pouzdanih agenata"</string>
<string name="add_device_admin_msg" msgid="1501847129819382149">"Aktiviraj aplikaciju za administratore?"</string>
<string name="add_device_admin" msgid="4192055385312215731">"Aktiviraj ovu aplikaciju za administratore uređaja"</string>
<string name="device_admin_add_title" msgid="3140663753671809044">"Administrator uređaja"</string>
@@ -3035,7 +3035,7 @@
<string name="storage_used" msgid="7128074132917008743">"Memorijski prostor u upotrebi"</string>
<string name="change" msgid="6657848623929839991">"Promeni"</string>
<string name="change_storage" msgid="600475265207060436">"Promenite memoriju"</string>
- <string name="notifications_label" msgid="8543457911148619898">"Obaveštenja aplikacije"</string>
+ <string name="notifications_label" msgid="8543457911148619898">"Obaveštenja o aplikaciji"</string>
<string name="notifications_enabled" msgid="6983396130566021385">"Uključena"</string>
<string name="notifications_disabled" msgid="334416731283131597">"Sve je isključeno"</string>
<string name="notifications_partly_blocked" msgid="592071133950126656">"Uključenih kategorija: <xliff:g id="COUNT_0">%1$d</xliff:g> od <xliff:g id="COUNT_1">%2$d</xliff:g>"</string>
@@ -3155,12 +3155,12 @@
<string name="usb_use_power_only" msgid="6426550616883919530">"Napajanje"</string>
<string name="usb_use_power_only_desc" msgid="3461232831015575152">"Punite povezani uređaj. Radi samo sa uređajima koji podržavaju punjenje preko USB-a."</string>
<string name="usb_use_file_transfers" msgid="7409600791007250137">"Prenos datoteka"</string>
- <string name="usb_use_file_transfers_desc" msgid="4235764784331804488">"Prenosi datoteke na drugi uređaj"</string>
+ <string name="usb_use_file_transfers_desc" msgid="4235764784331804488">"Prenosite datoteke na drugi uređaj"</string>
<string name="usb_use_photo_transfers" msgid="7794775645350330454">"Prenos slika (PTP)"</string>
- <string name="usb_use_photo_transfers_desc" msgid="2963034811151325996">"Prenosi slike ili datoteke ako MTP nije podržan (PTP)"</string>
+ <string name="usb_use_photo_transfers_desc" msgid="2963034811151325996">"Prenosite slike ili datoteke ako MTP nije podržan (PTP)"</string>
<string name="usb_use_MIDI" msgid="870922185938298263">"Korišćenje uređaja u MIDI režimu"</string>
- <string name="usb_use_MIDI_desc" msgid="8473936990076693175">"Koristi ovaj uređaj kao MIDI"</string>
- <string name="usb_use" msgid="3256040963685055320">"Upotrebite USB za:"</string>
+ <string name="usb_use_MIDI_desc" msgid="8473936990076693175">"Koristite ovaj uređaj kao MIDI"</string>
+ <string name="usb_use" msgid="3256040963685055320">"Koristite USB za:"</string>
<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="3629517713817003738">"Napajanje"</string>
@@ -3264,7 +3264,7 @@
<string name="screen_zoom_conversation_timestamp_3" msgid="3785674344762707688">"Uto 18:02"</string>
<string name="screen_zoom_conversation_timestamp_4" msgid="2511469395448561259">"Uto 18:03"</string>
<string name="disconnected" msgid="4836600637485526329">"Nije povezano"</string>
- <string name="data_usage_summary_format" msgid="7507047900192160585">"Koristi se <xliff:g id="AMOUNT">%1$s</xliff:g> podataka"</string>
+ <string name="data_usage_summary_format" msgid="7507047900192160585">"Iskorišćeno je <xliff:g id="AMOUNT">%1$s</xliff:g> podataka"</string>
<plurals name="notification_summary" formatted="false" msgid="3941492005316143599">
<item quantity="one">Isključeno za <xliff:g id="COUNT">%d</xliff:g> aplikaciju</item>
<item quantity="few">Isključeno za <xliff:g id="COUNT">%d</xliff:g> aplikacije</item>
diff --git a/res/values-bn/strings.xml b/res/values-bn/strings.xml
index dcf1762..d36f152 100644
--- a/res/values-bn/strings.xml
+++ b/res/values-bn/strings.xml
@@ -2777,8 +2777,7 @@
<string name="configure_notification_settings" msgid="7616737397127242615">"বিজ্ঞপ্তি"</string>
<string name="advanced_section_header" msgid="8833934850242546903">"উন্নত"</string>
<string name="profile_section_header" msgid="2320848161066912001">"কর্মস্থলের বিজ্ঞপ্তিগুলি"</string>
- <!-- no translation found for notification_badging_title (5125022693565388760) -->
- <skip />
+ <string name="notification_badging_title" msgid="5125022693565388760">"আইকন ব্যাজের অনুমতি দিন"</string>
<string name="notification_pulse_title" msgid="1905382958860387030">"মিটমিট করা আলো"</string>
<string name="lock_screen_notifications_title" msgid="6173076173408887213">"লক স্ক্রীনে"</string>
<string name="lock_screen_notifications_summary_show" msgid="6407527697810672847">"সমস্ত বিজ্ঞপ্তির সামগ্রীগুলি দেখান"</string>
diff --git a/res/values-bs/strings.xml b/res/values-bs/strings.xml
index 7007974..e48441f 100644
--- a/res/values-bs/strings.xml
+++ b/res/values-bs/strings.xml
@@ -1759,12 +1759,12 @@
<string name="allow_bind_app_widget_activity_allow_bind_title" msgid="2538303018392590627">"Kreirati vidžet i omogućiti pristup?"</string>
<string name="allow_bind_app_widget_activity_allow_bind" msgid="1584388129273282080">"Nakon što kreirate vidžet, <xliff:g id="WIDGET_HOST_NAME">%1$s</xliff:g> može pristupiti svim podacima koje prikazuje."</string>
<string name="allow_bind_app_widget_activity_always_allow_bind" msgid="7037503685859688034">"Uvijek dopusti da aplikacija <xliff:g id="WIDGET_HOST_NAME">%1$s</xliff:g> kreira vidžete i koristi njihove podatke"</string>
- <string name="battery_history_days" msgid="7110262897769622564">"<xliff:g id="DAYS">%1$d</xliff:g>d <xliff:g id="HOURS">%2$d</xliff:g>h <xliff:g id="MINUTES">%3$d</xliff:g>m <xliff:g id="SECONDS">%4$d</xliff:g>s"</string>
- <string name="battery_history_hours" msgid="7525170329826274999">"<xliff:g id="HOURS">%1$d</xliff:g>h <xliff:g id="MINUTES">%2$d</xliff:g>m <xliff:g id="SECONDS">%3$d</xliff:g>s"</string>
- <string name="battery_history_minutes" msgid="1467775596084148610">"<xliff:g id="MINUTES">%1$d</xliff:g>m <xliff:g id="SECONDS">%2$d</xliff:g>s"</string>
- <string name="battery_history_seconds" msgid="4283492130945761685">"<xliff:g id="SECONDS">%1$d</xliff:g>s"</string>
- <string name="battery_history_days_no_seconds" msgid="703063770554334710">"<xliff:g id="DAYS">%1$d</xliff:g>d <xliff:g id="HOURS">%2$d</xliff:g>h <xliff:g id="MINUTES">%3$d</xliff:g>m"</string>
- <string name="battery_history_hours_no_seconds" msgid="663342892615646712">"<xliff:g id="HOURS">%1$d</xliff:g> s <xliff:g id="MINUTES">%2$d</xliff:g> min"</string>
+ <string name="battery_history_days" msgid="7110262897769622564">"<xliff:g id="DAYS">%1$d</xliff:g> d, <xliff:g id="HOURS">%2$d</xliff:g> h, <xliff:g id="MINUTES">%3$d</xliff:g> min, <xliff:g id="SECONDS">%4$d</xliff:g> s"</string>
+ <string name="battery_history_hours" msgid="7525170329826274999">"<xliff:g id="HOURS">%1$d</xliff:g> h, <xliff:g id="MINUTES">%2$d</xliff:g> min, <xliff:g id="SECONDS">%3$d</xliff:g> s"</string>
+ <string name="battery_history_minutes" msgid="1467775596084148610">"<xliff:g id="MINUTES">%1$d</xliff:g> min, <xliff:g id="SECONDS">%2$d</xliff:g> s"</string>
+ <string name="battery_history_seconds" msgid="4283492130945761685">"<xliff:g id="SECONDS">%1$d</xliff:g> s"</string>
+ <string name="battery_history_days_no_seconds" msgid="703063770554334710">"<xliff:g id="DAYS">%1$d</xliff:g> d, <xliff:g id="HOURS">%2$d</xliff:g> h, <xliff:g id="MINUTES">%3$d</xliff:g> min"</string>
+ <string name="battery_history_hours_no_seconds" msgid="663342892615646712">"<xliff:g id="HOURS">%1$d</xliff:g> h, <xliff:g id="MINUTES">%2$d</xliff:g> min"</string>
<string name="battery_history_minutes_no_seconds" msgid="7780294302606853082">"<xliff:g id="MINUTES">%1$d</xliff:g> min"</string>
<string name="usage_stats_label" msgid="5890846333487083609">"Statistika korištenja"</string>
<string name="testing_usage_stats" msgid="7823048598893937339">"Statistika korištenja"</string>
@@ -1950,7 +1950,7 @@
<string name="battery_stats_screen_on_label" msgid="7150221809877509708">"Ekran uključen"</string>
<string name="battery_stats_gps_on_label" msgid="1193657533641951256">"GPS uključen"</string>
<string name="battery_stats_camera_on_label" msgid="4935637383628414968">"Kamera je uključena"</string>
- <string name="battery_stats_flashlight_on_label" msgid="4319637669889411307">"Lampa je uključena"</string>
+ <string name="battery_stats_flashlight_on_label" msgid="4319637669889411307">"Svjetiljka je uključena"</string>
<string name="battery_stats_wifi_running_label" msgid="1845839195549226252">"Wi-Fi"</string>
<string name="battery_stats_wake_lock_label" msgid="1908942681902324095">"Aktivan"</string>
<!-- no translation found for battery_stats_phone_signal_label (4137799310329041341) -->
@@ -1967,7 +1967,7 @@
<string name="controls_subtitle" msgid="390468421138288702">"Podesite potrošnju energije"</string>
<string name="packages_subtitle" msgid="4736416171658062768">"Uključeni paketi"</string>
<string name="power_screen" msgid="3023346080675904613">"Ekran"</string>
- <string name="power_flashlight" msgid="7794409781003567614">"Lampa"</string>
+ <string name="power_flashlight" msgid="7794409781003567614">"Svjetiljka"</string>
<string name="power_camera" msgid="4976286950934622605">"Fotoaparat"</string>
<string name="power_wifi" msgid="1135085252964054957">"Wi‑Fi"</string>
<string name="power_bluetooth" msgid="4373329044379008289">"Bluetooth"</string>
@@ -1996,7 +1996,7 @@
<string name="usage_type_audio" msgid="6957269406840886290">"Zvuk"</string>
<string name="usage_type_video" msgid="4295357792078579944">"Video"</string>
<string name="usage_type_camera" msgid="8299433109956769757">"Kamera"</string>
- <string name="usage_type_flashlight" msgid="1516392356962208230">"Lampa"</string>
+ <string name="usage_type_flashlight" msgid="1516392356962208230">"Svjetiljka"</string>
<string name="usage_type_on_time" msgid="3351200096173733159">"Vrijeme rada"</string>
<string name="usage_type_no_coverage" msgid="3797004252954385053">"Vrijeme bez signala"</string>
<string name="usage_type_total_battery_capacity" msgid="3798285287848675346">"Ukupni kapacitet baterije"</string>
@@ -2013,7 +2013,7 @@
<string name="battery_desc_standby" product="default" msgid="3009080001948091424">"Potrošnja baterije kada je telefon u stanju pripravnosti"</string>
<string name="battery_desc_radio" msgid="5479196477223185367">"Potrošnja baterije za mobilni radio"</string>
<string name="battery_sugg_radio" msgid="8211336978326295047">"Prebacite se na način rada u avionu kako biste štedili napajanje na područjima u kojima nema pokrivenosti mobilnom mrežom"</string>
- <string name="battery_desc_flashlight" msgid="2908579430841025494">"Potrošnja baterije upotrebom baterijske lampe"</string>
+ <string name="battery_desc_flashlight" msgid="2908579430841025494">"Potrošnja baterije upotrebom svjetiljke"</string>
<string name="battery_desc_camera" msgid="7375389919760613499">"Potrošnja baterije upotrebom kamere"</string>
<string name="battery_desc_display" msgid="5432795282958076557">"Potrošnja baterije na prikaz i pozadinsko osvjetljenje"</string>
<string name="battery_sugg_display" msgid="3370202402045141760">"Smanjite osvjetljenje ekrana i/ili trajanje perioda do isključivanja ekrana"</string>
diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml
index c33d5a9..84db437 100644
--- a/res/values-ca/strings.xml
+++ b/res/values-ca/strings.xml
@@ -1488,7 +1488,7 @@
<string name="applications_settings" msgid="5281808652705396152">"Informació d\'aplicacions"</string>
<string name="applications_settings_summary" msgid="6683465446264515367">"Gestiona les aplicacions i configura les dreceres d\'inici ràpid"</string>
<string name="applications_settings_header" msgid="1014813055054356646">"Configuració de l\'aplicació"</string>
- <string name="install_applications" msgid="4872012136210802181">"Orígens desconeguts"</string>
+ <string name="install_applications" msgid="4872012136210802181">"Fonts desconegudes"</string>
<string name="install_applications_title" msgid="4987712352256508946">"Permet totes les fonts d\'apl."</string>
<string name="install_all_warning" product="tablet" msgid="8310489909586138165">"La tauleta i les dades personals són més vulnerables a atacs d\'aplicacions desconegudes. En instal·lar aplicacions d\'aquesta font, acceptes que ets responsable de qualsevol dany a la tauleta i qualsevol pèrdua de dades que es pugui produir per l\'ús d\'aquestes aplicacions."</string>
<string name="install_all_warning" product="default" msgid="1952257127370115988">"El telèfon i les dades personals són més vulnerables a atacs d\'aplicacions desconegudes. En instal·lar aplicacions d\'aquesta font, acceptes que ets responsable de qualsevol dany al telèfon i qualsevol pèrdua de dades que es pugui produir per l\'ús d\'aquestes aplicacions."</string>
@@ -2859,7 +2859,7 @@
<string name="app_notification_block_summary" msgid="4744020456943215352">"No mostris mai aquestes notificacions"</string>
<string name="notification_content_block_title" msgid="5854232570963006360">"Mostra notificacions"</string>
<string name="notification_content_block_summary" msgid="7746185794438882389">"No mostris mai notificacions a l\'àrea de notificacions ni en dispositius perifèrics"</string>
- <string name="notification_badge_title" msgid="7734903868300369178">"Permet l\'etiqueta de la icona"</string>
+ <string name="notification_badge_title" msgid="7734903868300369178">"Permet el símbol de la icona"</string>
<string name="app_notification_override_dnd_title" msgid="7867458246395884830">"Fes prioritària"</string>
<string name="app_notification_override_dnd_summary" msgid="3516007157020189746">"Permet que aquestes notificacions continuïn interrompent quan el mode No molestis estigui configurat com a Només amb prioritat"</string>
<string name="app_notification_visibility_override_title" msgid="2187232730902430718">"A la pantalla de bloqueig"</string>
@@ -3189,7 +3189,7 @@
<string name="system_alert_window_on" msgid="2939489395109048888">"Sí"</string>
<string name="system_alert_window_off" msgid="6189115687233061992">"No"</string>
<string name="install_other_apps" msgid="6986686991775883017">"Instal·lar aplicacions desconegudes"</string>
- <string name="keywords_install_other_apps" msgid="761078076051006558">"instal·lar aplicacions orígens desconeguts"</string>
+ <string name="keywords_install_other_apps" msgid="761078076051006558">"instal·lar aplicacions fonts desconegudes"</string>
<string name="write_settings" msgid="4797457275727195681">"Modificar configuració sistema"</string>
<string name="keywords_write_settings" msgid="6415597272561105138">"modifica la configuració del sistema i hi escriu"</string>
<string name="write_settings_summary" msgid="4302268998611412696">"<xliff:g id="COUNT_0">%1$d</xliff:g> de: <xliff:g id="COUNT_1">%2$d</xliff:g> aplicacions poden modificar configuració del sistema"</string>
diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml
index faad3b8..5cab08b 100644
--- a/res/values-da/strings.xml
+++ b/res/values-da/strings.xml
@@ -733,7 +733,7 @@
<string name="wifi_more" msgid="3195296805089107950">"Mere"</string>
<string name="wifi_setup_wps" msgid="8128702488486283957">"Automatisk konfig. (WPS)"</string>
<string name="wifi_show_advanced" msgid="3409422789616520979">"Avancerede valgmuligheder"</string>
- <string name="wifi_advanced_toggle_description_expanded" msgid="2380600578544493084">"Rullelisten Avancerede indstillinger. Tryk to gange for at skjule listen."</string>
+ <string name="wifi_advanced_toggle_description_expanded" msgid="2380600578544493084">"Rullelisten Avancerede valgmuligheder. Tryk to gange for at skjule listen."</string>
<string name="wifi_advanced_toggle_description_collapsed" msgid="1463812308429197263">"Rullelisten Avancerede valgmuligheder. Tryk to gange for at udvide listen."</string>
<string name="wifi_wps_setup_title" msgid="8207552222481570175">"Wi-Fi Protected Setup"</string>
<string name="wifi_wps_setup_msg" msgid="315174329121275092">"Starter WPS..."</string>
@@ -1012,7 +1012,7 @@
<string name="screensaver_settings_summary_dock" msgid="2072657401664633283">"Når enheden er tilsluttet en dockingstation"</string>
<string name="screensaver_settings_summary_never" msgid="5165622985174349585">"Aldrig"</string>
<string name="screensaver_settings_summary_off" msgid="2481581696365146473">"Fra"</string>
- <string name="screensaver_settings_disabled_prompt" msgid="1239088321034437608">"Aktivér pauseskærmen for at kontrollere, hvad der sker, når telefonen er sat i dockingstationen og/eller går i dvale."</string>
+ <string name="screensaver_settings_disabled_prompt" msgid="1239088321034437608">"Aktivér pauseskærmen for at administrere, hvad der sker, når telefonen er sat i dockingstationen og/eller går i dvale."</string>
<string name="screensaver_settings_when_to_dream" msgid="7262410541382890146">"Starttidspunkt"</string>
<string name="screensaver_settings_current" msgid="4663846038247130023">"Aktuel pauseskærm"</string>
<string name="screensaver_settings_dream_start" msgid="4998187847985120168">"Start nu"</string>
@@ -1527,7 +1527,7 @@
<string name="always_allow_bind_appwidgets_text" msgid="566822577792032925">"Du har valgt at tillade, at denne app opretter widgets og får adgang til deres data."</string>
<string name="auto_launch_disable_text" msgid="7800385822185540166">"Der er ikke angivet nogen standarder."</string>
<string name="clear_activities" msgid="7408923511535174430">"Ryd standarder"</string>
- <string name="screen_compatibility_text" msgid="1616155457673106022">"Denne app er muligvis ikke beregnet til din skærm. Her kan du kontrollere, hvordan den skal tilpasses til din skærm."</string>
+ <string name="screen_compatibility_text" msgid="1616155457673106022">"Denne app er muligvis ikke beregnet til din skærm. Her kan du administrere, hvordan den skal tilpasses til din skærm."</string>
<string name="ask_compatibility" msgid="7225195569089607846">"Spørg, når der startes"</string>
<string name="enable_compatibility" msgid="5806819252068617811">"Skaler app"</string>
<string name="unknown" msgid="1592123443519355854">"Ukendt"</string>
@@ -2374,7 +2374,7 @@
<string name="vpn_ipsec_user_cert" msgid="6880651510020187230">"IPSec-brugercertifikat"</string>
<string name="vpn_ipsec_ca_cert" msgid="91338213449148229">"IPSec CA-certifikat"</string>
<string name="vpn_ipsec_server_cert" msgid="6599276718456935010">"IPSec-servercertifikat"</string>
- <string name="vpn_show_options" msgid="7182688955890457003">"Vis avancerede indstillinger"</string>
+ <string name="vpn_show_options" msgid="7182688955890457003">"Vis avancerede valgmuligheder"</string>
<string name="vpn_search_domains" msgid="5391995501541199624">"DNS-søgedomæner"</string>
<string name="vpn_dns_servers" msgid="5570715561245741829">"DNS-servere (f.eks. 8.8.8.8)"</string>
<string name="vpn_routes" msgid="3818655448226312232">"Videresendelsesruter (f.eks. 10.0.0.0/8)"</string>
@@ -3380,7 +3380,7 @@
<string name="button_confirm_convert_fbe" msgid="7101855374850373091">"Ryd og konvertér"</string>
<string name="reset_shortcut_manager_throttling" msgid="6495066467198668994">"Nulstil antalsbegrænsning i ShortcutManager"</string>
<string name="reset_shortcut_manager_throttling_complete" msgid="1826770872063707900">"Antalsbegrænsning i ShortcutManager er nulstillet"</string>
- <string name="notification_suggestion_title" msgid="4506524937307816475">"Kontrollér underretninger for låseskærm"</string>
+ <string name="notification_suggestion_title" msgid="4506524937307816475">"Konfigurer underretninger for låseskærm"</string>
<string name="notification_suggestion_summary" msgid="8521159741445416875">"Vis eller skjul indhold i underretninger"</string>
<string name="page_tab_title_summary" msgid="4070309266374993258">"Alle"</string>
<string name="page_tab_title_support" msgid="6330657582897417458">"Support"</string>
diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml
index da22430..2eada5e 100644
--- a/res/values-fr/strings.xml
+++ b/res/values-fr/strings.xml
@@ -1294,7 +1294,7 @@
<string name="master_clear_desc" product="default" msgid="4800386183314202571">"Cette action effacera toutes les données du "<b>"stockage interne"</b>" de votre téléphone, y compris :\n\n"<li>"Votre compte Google"</li>\n<li>"Les données et paramètres du système et des applications"</li>\n<li>"Les applications téléchargées"</li></string>
<string name="master_clear_accounts" product="default" msgid="6412857499147999073">\n\n"Vous êtes actuellement connecté aux comptes suivants :\n"</string>
<string name="master_clear_other_users_present" product="default" msgid="5161423070702470742">\n\n"D\'autres personnes utilisent cet appareil.\n"</string>
- <string name="master_clear_desc_also_erases_external" msgid="1903185203791274237"><li>"Musique"</li>\n<li>"Photos"</li>\n<li>"Autres données utilisateur"</li></string>
+ <string name="master_clear_desc_also_erases_external" msgid="1903185203791274237"><li>"La musique"</li>\n<li>"Les photos"</li>\n<li>"Les autres données utilisateur"</li>"."</string>
<string name="master_clear_desc_erase_external_storage" product="nosdcard" msgid="7744115866662613411">\n\n"Pour supprimer la musique, les photos et les autres données utilisateur, vous devez effacer la "<b>"mémoire de stockage USB"</b>"."</string>
<string name="master_clear_desc_erase_external_storage" product="default" msgid="4801026652617377093">\n\n"Pour supprimer la musique, les photos et les autres données utilisateur, vous devez formater la "<b>"carte SD"</b>"."</string>
<string name="erase_external_storage" product="nosdcard" msgid="969364037450286809">"Effacer la mémoire USB"</string>
diff --git a/res/values-gl/strings.xml b/res/values-gl/strings.xml
index 3c9d43d..f693ad8 100644
--- a/res/values-gl/strings.xml
+++ b/res/values-gl/strings.xml
@@ -1485,7 +1485,7 @@
<string name="lock_settings_profile_unified_summary" msgid="9008819078132993492">"O mesmo que o bloqueo da pantalla do dispositivo"</string>
<string name="manageapplications_settings_title" msgid="7041951105633616745">"Xestionar aplicacións"</string>
<string name="manageapplications_settings_summary" msgid="1794401500935451259">"Xestiona e elimina as aplicacións instaladas"</string>
- <string name="applications_settings" msgid="5281808652705396152">"Información da aplicación"</string>
+ <string name="applications_settings" msgid="5281808652705396152">"Información das aplicacións"</string>
<string name="applications_settings_summary" msgid="6683465446264515367">"Xestiona aplicacións e configura atallos de inicio rápido"</string>
<string name="applications_settings_header" msgid="1014813055054356646">"Configuración da aplicación"</string>
<string name="install_applications" msgid="4872012136210802181">"Fontes descoñecidas"</string>
diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml
index 64f77ea..e968c5c 100644
--- a/res/values-ja/strings.xml
+++ b/res/values-ja/strings.xml
@@ -2537,7 +2537,7 @@
<string name="user_enable_calling_confirm_message" msgid="8061594235219352787">"発信履歴がこのユーザーと共有されます。"</string>
<string name="user_enable_calling_and_sms_confirm_title" msgid="7243308401401932681">"通話とSMSをONにしますか?"</string>
<string name="user_enable_calling_and_sms_confirm_message" msgid="4025082715546544967">"通話とSMSの履歴がこのユーザーと共有されます。"</string>
- <string name="emergency_info_title" msgid="208607506217060337">"緊急情報"</string>
+ <string name="emergency_info_title" msgid="208607506217060337">"緊急時情報"</string>
<string name="emergency_info_summary" msgid="5062945162967838521">"<xliff:g id="USER_NAME">%1$s</xliff:g>の情報と連絡先"</string>
<string name="application_restrictions" msgid="8207332020898004394">"アプリとコンテンツの許可"</string>
<string name="apps_with_restrictions_header" msgid="3660449891478534440">"制限のあるアプリ"</string>
diff --git a/res/values-kn/strings.xml b/res/values-kn/strings.xml
index 556c72d..97e01ab 100644
--- a/res/values-kn/strings.xml
+++ b/res/values-kn/strings.xml
@@ -2777,8 +2777,7 @@
<string name="configure_notification_settings" msgid="7616737397127242615">"ಅಧಿಸೂಚನೆಗಳು"</string>
<string name="advanced_section_header" msgid="8833934850242546903">"ಸುಧಾರಿತ"</string>
<string name="profile_section_header" msgid="2320848161066912001">"ಕೆಲಸದ ಅಧಿಸೂಚನೆಗಳು"</string>
- <!-- no translation found for notification_badging_title (5125022693565388760) -->
- <skip />
+ <string name="notification_badging_title" msgid="5125022693565388760">"ಐಕಾನ್ ಬ್ಯಾಡ್ಜ್ಗಳಿಗೆ ಅನುಮತಿಸಿ"</string>
<string name="notification_pulse_title" msgid="1905382958860387030">"ಮಿನುಗುವ ಬೆಳಕು"</string>
<string name="lock_screen_notifications_title" msgid="6173076173408887213">"ಲಾಕ್ ಸ್ಕ್ರೀನ್ನಲ್ಲಿ"</string>
<string name="lock_screen_notifications_summary_show" msgid="6407527697810672847">"ಅಧಿಸೂಚನೆ ವಿಷಯವನ್ನು ಪೂರ್ತಿ ತೋರಿಸು"</string>
diff --git a/res/values-ml/strings.xml b/res/values-ml/strings.xml
index d8141a5..5b47d8d 100644
--- a/res/values-ml/strings.xml
+++ b/res/values-ml/strings.xml
@@ -2777,8 +2777,7 @@
<string name="configure_notification_settings" msgid="7616737397127242615">"അറിയിപ്പുകൾ"</string>
<string name="advanced_section_header" msgid="8833934850242546903">"വിപുലമായത്"</string>
<string name="profile_section_header" msgid="2320848161066912001">"ഔദ്യോഗിക അറിയിപ്പുകൾ"</string>
- <!-- no translation found for notification_badging_title (5125022693565388760) -->
- <skip />
+ <string name="notification_badging_title" msgid="5125022693565388760">"ഐക്കൺ ബാഡ്ജുകൾ അനുവദിക്കുക"</string>
<string name="notification_pulse_title" msgid="1905382958860387030">"ലൈറ്റ് മിന്നുക"</string>
<string name="lock_screen_notifications_title" msgid="6173076173408887213">"ലോക്ക് സ്ക്രീനിൽ"</string>
<string name="lock_screen_notifications_summary_show" msgid="6407527697810672847">"എല്ലാ അറിയിപ്പുകളും കാണിക്കുക"</string>
diff --git a/res/values-ne/strings.xml b/res/values-ne/strings.xml
index b82e4b6..23a89e5 100644
--- a/res/values-ne/strings.xml
+++ b/res/values-ne/strings.xml
@@ -2777,8 +2777,7 @@
<string name="configure_notification_settings" msgid="7616737397127242615">"सूचनाहरू"</string>
<string name="advanced_section_header" msgid="8833934850242546903">"उन्नत"</string>
<string name="profile_section_header" msgid="2320848161066912001">"कार्यका सूचनाहरू"</string>
- <!-- no translation found for notification_badging_title (5125022693565388760) -->
- <skip />
+ <string name="notification_badging_title" msgid="5125022693565388760">"आइकनका ब्याजहरूलाई अनुमति दिनुहोस्"</string>
<string name="notification_pulse_title" msgid="1905382958860387030">"झिम झिम गर्ने बत्ती"</string>
<string name="lock_screen_notifications_title" msgid="6173076173408887213">"लक स्क्रिनमा"</string>
<string name="lock_screen_notifications_summary_show" msgid="6407527697810672847">"सबै सूचना सामग्री देखाउनुहोस्"</string>
diff --git a/res/values-pa/strings.xml b/res/values-pa/strings.xml
index dcb5ef1..8dd5f70 100644
--- a/res/values-pa/strings.xml
+++ b/res/values-pa/strings.xml
@@ -2777,8 +2777,7 @@
<string name="configure_notification_settings" msgid="7616737397127242615">"ਸੂਚਨਾਵਾਂ"</string>
<string name="advanced_section_header" msgid="8833934850242546903">"ਉੱਨਤ"</string>
<string name="profile_section_header" msgid="2320848161066912001">"ਕੰਮ ਸਬੰਧੀ ਸੂਚਨਾਵਾਂ"</string>
- <!-- no translation found for notification_badging_title (5125022693565388760) -->
- <skip />
+ <string name="notification_badging_title" msgid="5125022693565388760">"ਪ੍ਰਤੀਕ ਬੈਜਾਂ ਨੂੰ ਇਜਾਜ਼ਤ ਦਿਓ"</string>
<string name="notification_pulse_title" msgid="1905382958860387030">"ਲਾਈਟ ਨੂੰ ਟਿਮ-ਟਿਮਾਓ"</string>
<string name="lock_screen_notifications_title" msgid="6173076173408887213">"ਲੌਕ ਸਕ੍ਰੀਨ \'ਤੇ"</string>
<string name="lock_screen_notifications_summary_show" msgid="6407527697810672847">"ਸਾਰੀ ਸੂਚਨਾ ਸਮੱਗਰੀ ਦਿਖਾਓ"</string>
diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml
index 76d5435..5a70258 100644
--- a/res/values-sk/strings.xml
+++ b/res/values-sk/strings.xml
@@ -2831,8 +2831,7 @@
<string name="configure_notification_settings" msgid="7616737397127242615">"Upozornenia"</string>
<string name="advanced_section_header" msgid="8833934850242546903">"Rozšírené"</string>
<string name="profile_section_header" msgid="2320848161066912001">"Pracovné upozornenia"</string>
- <!-- no translation found for notification_badging_title (5125022693565388760) -->
- <skip />
+ <string name="notification_badging_title" msgid="5125022693565388760">"Povoliť odznaky na ikonách"</string>
<string name="notification_pulse_title" msgid="1905382958860387030">"Blikanie"</string>
<string name="lock_screen_notifications_title" msgid="6173076173408887213">"Na uzamknutej obrazovke"</string>
<string name="lock_screen_notifications_summary_show" msgid="6407527697810672847">"Zobrazovať všetok obsah upozornení"</string>
diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml
index 5de847b..8519b16 100644
--- a/res/values-sr/strings.xml
+++ b/res/values-sr/strings.xml
@@ -34,7 +34,7 @@
<string name="header_category_wireless_networks" msgid="5110914332313954940">"Бежична веза и мреже"</string>
<string name="header_category_connections" msgid="6471513040815680662">"Везе"</string>
<string name="header_category_device" msgid="4544026001618307754">"Уређај"</string>
- <string name="header_category_personal" msgid="3310195187905720823">"Лично"</string>
+ <string name="header_category_personal" msgid="3310195187905720823">"Лични"</string>
<string name="header_category_access" msgid="7580499097416970962">"Приступ"</string>
<string name="header_category_system" msgid="2816866961183068977">"Систем"</string>
<string name="radio_info_data_connection_enable" msgid="8656750679353982712">"Омогући везу за пренос података"</string>
@@ -584,7 +584,7 @@
<item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> активне апликације</item>
<item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> активних апликација</item>
</plurals>
- <string name="manage_trust_agents" msgid="4629279457536987768">"Trust agents"</string>
+ <string name="manage_trust_agents" msgid="4629279457536987768">"Поуздани агенти"</string>
<string name="disabled_because_no_backup_security" msgid="6877660253409580377">"Да бисте га користили, прво подесите закључавање екрана"</string>
<string name="manage_trust_agents_summary" msgid="1475819820389620546">"Ништа"</string>
<plurals name="manage_trust_agents_summary_on" formatted="false" msgid="3935182396726101824">
@@ -962,7 +962,7 @@
<string name="search_settings" msgid="1910951467596035063">"Претрага"</string>
<string name="search_settings_summary" msgid="9205656546570654169">"Управљање подешавањима претраге и историјом"</string>
<string name="search_settings_no_results" msgid="8799027492641230999">"Нема резултата"</string>
- <string name="display_settings" msgid="7965901687241669598">"Приказ"</string>
+ <string name="display_settings" msgid="7965901687241669598">"Екран"</string>
<string name="accelerometer_title" msgid="7854608399547349157">"Аутоматско ротирање екрана"</string>
<string name="accelerometer_summary_on" product="tablet" msgid="429982132339828942">"Промени положај аутоматски приликом ротирања таблета"</string>
<string name="accelerometer_summary_on" product="default" msgid="1133737282813048021">"Аутоматска промена положаја приликом ротације телефона"</string>
@@ -2190,7 +2190,7 @@
<string name="no_device_admins" msgid="4846602835339095768">"Нема доступних апликација за администратора уређаја"</string>
<string name="personal_device_admin_title" msgid="2849617316347669861">"Лични"</string>
<string name="managed_device_admin_title" msgid="7853955652864478435">"Посао"</string>
- <string name="no_trust_agents" msgid="7450273545568977523">"Trust agents - Недоступно"</string>
+ <string name="no_trust_agents" msgid="7450273545568977523">"Нема доступних поузданих агената"</string>
<string name="add_device_admin_msg" msgid="1501847129819382149">"Активирај апликацију за администраторе?"</string>
<string name="add_device_admin" msgid="4192055385312215731">"Активирај ову апликацију за администраторе уређаја"</string>
<string name="device_admin_add_title" msgid="3140663753671809044">"Администратор уређаја"</string>
@@ -3035,7 +3035,7 @@
<string name="storage_used" msgid="7128074132917008743">"Меморијски простор у употреби"</string>
<string name="change" msgid="6657848623929839991">"Промени"</string>
<string name="change_storage" msgid="600475265207060436">"Промените меморију"</string>
- <string name="notifications_label" msgid="8543457911148619898">"Обавештења апликације"</string>
+ <string name="notifications_label" msgid="8543457911148619898">"Обавештења о апликацији"</string>
<string name="notifications_enabled" msgid="6983396130566021385">"Укључена"</string>
<string name="notifications_disabled" msgid="334416731283131597">"Све је искључено"</string>
<string name="notifications_partly_blocked" msgid="592071133950126656">"Укључених категорија: <xliff:g id="COUNT_0">%1$d</xliff:g> од <xliff:g id="COUNT_1">%2$d</xliff:g>"</string>
@@ -3155,12 +3155,12 @@
<string name="usb_use_power_only" msgid="6426550616883919530">"Напајање"</string>
<string name="usb_use_power_only_desc" msgid="3461232831015575152">"Пуните повезани уређај. Ради само са уређајима који подржавају пуњење преко USB-а."</string>
<string name="usb_use_file_transfers" msgid="7409600791007250137">"Пренос датотека"</string>
- <string name="usb_use_file_transfers_desc" msgid="4235764784331804488">"Преноси датотеке на други уређај"</string>
+ <string name="usb_use_file_transfers_desc" msgid="4235764784331804488">"Преносите датотеке на други уређај"</string>
<string name="usb_use_photo_transfers" msgid="7794775645350330454">"Пренос слика (PTP)"</string>
- <string name="usb_use_photo_transfers_desc" msgid="2963034811151325996">"Преноси слике или датотеке ако MTP није подржан (PTP)"</string>
+ <string name="usb_use_photo_transfers_desc" msgid="2963034811151325996">"Преносите слике или датотеке ако MTP није подржан (PTP)"</string>
<string name="usb_use_MIDI" msgid="870922185938298263">"Коришћење уређаја у MIDI режиму"</string>
- <string name="usb_use_MIDI_desc" msgid="8473936990076693175">"Користи овај уређај као MIDI"</string>
- <string name="usb_use" msgid="3256040963685055320">"Употребите USB за:"</string>
+ <string name="usb_use_MIDI_desc" msgid="8473936990076693175">"Користите овај уређај као MIDI"</string>
+ <string name="usb_use" msgid="3256040963685055320">"Користите USB за:"</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="3629517713817003738">"Напајање"</string>
@@ -3264,7 +3264,7 @@
<string name="screen_zoom_conversation_timestamp_3" msgid="3785674344762707688">"Уто 18:02"</string>
<string name="screen_zoom_conversation_timestamp_4" msgid="2511469395448561259">"Уто 18:03"</string>
<string name="disconnected" msgid="4836600637485526329">"Није повезано"</string>
- <string name="data_usage_summary_format" msgid="7507047900192160585">"Користи се <xliff:g id="AMOUNT">%1$s</xliff:g> података"</string>
+ <string name="data_usage_summary_format" msgid="7507047900192160585">"Искоришћено је <xliff:g id="AMOUNT">%1$s</xliff:g> података"</string>
<plurals name="notification_summary" formatted="false" msgid="3941492005316143599">
<item quantity="one">Искључено за <xliff:g id="COUNT">%d</xliff:g> апликацију</item>
<item quantity="few">Искључено за <xliff:g id="COUNT">%d</xliff:g> апликације</item>
diff --git a/res/values-te/strings.xml b/res/values-te/strings.xml
index d300f72..ad2adc2 100644
--- a/res/values-te/strings.xml
+++ b/res/values-te/strings.xml
@@ -2777,8 +2777,7 @@
<string name="configure_notification_settings" msgid="7616737397127242615">"నోటిఫికేషన్లు"</string>
<string name="advanced_section_header" msgid="8833934850242546903">"అధునాతనం"</string>
<string name="profile_section_header" msgid="2320848161066912001">"కార్యాలయ నోటిఫికేషన్లు"</string>
- <!-- no translation found for notification_badging_title (5125022693565388760) -->
- <skip />
+ <string name="notification_badging_title" msgid="5125022693565388760">"చిహ్నం బ్యాడ్జ్లను అనుమతించండి"</string>
<string name="notification_pulse_title" msgid="1905382958860387030">"కాంతి మిణుకుమిణుకు అనేలా ఉంచు"</string>
<string name="lock_screen_notifications_title" msgid="6173076173408887213">"లాక్ స్క్రీన్పై"</string>
<string name="lock_screen_notifications_summary_show" msgid="6407527697810672847">"మొత్తం నోటిఫికేషన్ కంటెంట్ను చూపు"</string>
diff --git a/res/values-ur/strings.xml b/res/values-ur/strings.xml
index 199bf64..d1fc04c 100644
--- a/res/values-ur/strings.xml
+++ b/res/values-ur/strings.xml
@@ -2775,8 +2775,7 @@
<string name="configure_notification_settings" msgid="7616737397127242615">"اطلاعات"</string>
<string name="advanced_section_header" msgid="8833934850242546903">"جدید ترین"</string>
<string name="profile_section_header" msgid="2320848161066912001">"دفتری اطلاعات"</string>
- <!-- no translation found for notification_badging_title (5125022693565388760) -->
- <skip />
+ <string name="notification_badging_title" msgid="5125022693565388760">"آئیکن بیجز کی اجازت دیں"</string>
<string name="notification_pulse_title" msgid="1905382958860387030">"بلنک لائٹ"</string>
<string name="lock_screen_notifications_title" msgid="6173076173408887213">"قفل اسکرین پر"</string>
<string name="lock_screen_notifications_summary_show" msgid="6407527697810672847">"سبھی اطلاعی مواد دکھائیں"</string>
diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml
index b179ffa..1dbf691 100644
--- a/res/values-zh-rCN/strings.xml
+++ b/res/values-zh-rCN/strings.xml
@@ -1735,9 +1735,9 @@
<string name="builtin_keyboard_settings_title" msgid="7688732909551116798">"物理键盘"</string>
<string name="builtin_keyboard_settings_summary" msgid="2392531685358035899">"物理键盘设置"</string>
<string name="gadget_picker_title" msgid="98374951396755811">"选择小工具"</string>
- <string name="widget_picker_title" msgid="9130684134213467557">"选择小部件"</string>
- <string name="allow_bind_app_widget_activity_allow_bind_title" msgid="2538303018392590627">"是否允许该应用创建小部件并查看其数据?"</string>
- <string name="allow_bind_app_widget_activity_allow_bind" msgid="1584388129273282080">"当您创建小部件后,“<xliff:g id="WIDGET_HOST_NAME">%1$s</xliff:g>”将能查看其显示的所有数据。"</string>
+ <string name="widget_picker_title" msgid="9130684134213467557">"选择微件"</string>
+ <string name="allow_bind_app_widget_activity_allow_bind_title" msgid="2538303018392590627">"是否允许该应用创建微件并查看其数据?"</string>
+ <string name="allow_bind_app_widget_activity_allow_bind" msgid="1584388129273282080">"当您创建微件后,“<xliff:g id="WIDGET_HOST_NAME">%1$s</xliff:g>”将能查看其显示的所有数据。"</string>
<string name="allow_bind_app_widget_activity_always_allow_bind" msgid="7037503685859688034">"始终允许“<xliff:g id="WIDGET_HOST_NAME">%1$s</xliff:g>”创建微件并查看其数据"</string>
<string name="battery_history_days" msgid="7110262897769622564">"<xliff:g id="DAYS">%1$d</xliff:g>天<xliff:g id="HOURS">%2$d</xliff:g>小时<xliff:g id="MINUTES">%3$d</xliff:g>分<xliff:g id="SECONDS">%4$d</xliff:g>秒"</string>
<string name="battery_history_hours" msgid="7525170329826274999">"<xliff:g id="HOURS">%1$d</xliff:g>小时<xliff:g id="MINUTES">%2$d</xliff:g>分<xliff:g id="SECONDS">%3$d</xliff:g>秒"</string>
@@ -2777,8 +2777,7 @@
<string name="configure_notification_settings" msgid="7616737397127242615">"通知"</string>
<string name="advanced_section_header" msgid="8833934850242546903">"高级"</string>
<string name="profile_section_header" msgid="2320848161066912001">"工作通知"</string>
- <!-- no translation found for notification_badging_title (5125022693565388760) -->
- <skip />
+ <string name="notification_badging_title" msgid="5125022693565388760">"允许在图标上显示标记"</string>
<string name="notification_pulse_title" msgid="1905382958860387030">"闪烁指示灯"</string>
<string name="lock_screen_notifications_title" msgid="6173076173408887213">"屏幕锁定时"</string>
<string name="lock_screen_notifications_summary_show" msgid="6407527697810672847">"显示所有通知内容"</string>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 8e3fbe2..dc7e567 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -4686,6 +4686,8 @@
<!-- Description for battery usage time for an app, i.e. Used for 30min. Note: ^1 should be used in all translations [CHAR LIMIT=60] -->
<string name="battery_used_for">Used for <xliff:g id="time">^1</xliff:g></string>
+ <!-- Description for battery screen usage time for an app, i.e. Screen usage 30min. Note: ^1 should be used in all translations [CHAR LIMIT=60] -->
+ <string name="battery_screen_usage">Screen usage <xliff:g id="time">^1</xliff:g></string>
<!-- Description for battery usage info for an app, i.e. 60% used by facebook. [CHAR LIMIT=60] -->
<string name="battery_used_by"><xliff:g id="percent">%1$s</xliff:g> used by <xliff:g id="app">%2$s</xliff:g></string>
<!-- Description for percentage of battery usage for an app, i.e. Screen: 30% of overall battery. [CHAR LIMIT=60] -->
@@ -8618,10 +8620,6 @@
<!-- Preference label for the Files storage section. [CHAR LIMIT=50] -->
<string name="storage_files">Files</string>
- <!-- Main settings screen item's title to go into the storage settings screen [CHAR LIMIT=25] -->
- <string name="storage_settings_2" product="tablet">Tablet storage</string>
- <string name="storage_settings_2" product="default">Phone storage</string>
-
<!-- Summary of a single storage volume used space. [CHAR LIMIT=24] -->
<string name="storage_size_large_alternate"><xliff:g id="number" example="128">^1</xliff:g><small> <xliff:g id="unit" example="KB">^2</xliff:g></small></string>
<!-- Summary of a single storage volume total space. [CHAR LIMIT=48]-->
diff --git a/res/xml/about_legal.xml b/res/xml/about_legal.xml
index 596effe..55faad3 100644
--- a/res/xml/about_legal.xml
+++ b/res/xml/about_legal.xml
@@ -15,7 +15,8 @@
-->
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
- android:title="@string/legal_information">
+ android:title="@string/legal_information"
+ android:key="legal_screen">
<!-- Note: The titles given here probably won't be used. Instead, we programmatically
fill the title with the label of the activity with the corresponding action.
diff --git a/res/xml/battery_saver_settings.xml b/res/xml/battery_saver_settings.xml
index 52f6793..1720c73 100644
--- a/res/xml/battery_saver_settings.xml
+++ b/res/xml/battery_saver_settings.xml
@@ -22,6 +22,6 @@
<DropDownPreference
android:key="turn_on_automatically"
android:title="@string/battery_saver_turn_on_automatically_title"
- android:summary="@string/summary_placeholder" />
+ android:summary="%s" />
</PreferenceScreen>
diff --git a/res/xml/configure_notification_settings.xml b/res/xml/configure_notification_settings.xml
index bed3aa6..718bb23 100644
--- a/res/xml/configure_notification_settings.xml
+++ b/res/xml/configure_notification_settings.xml
@@ -39,7 +39,7 @@
android:summary="@string/summary_placeholder"/>
<SwitchPreference
- android:key="gesture_swipe_down_fingerprint"
+ android:key="gesture_swipe_down_fingerprint_notifications"
android:title="@string/fingerprint_swipe_for_notifications_title"
android:summary="@string/fingerprint_swipe_for_notifications_summary"/>
diff --git a/res/xml/display_settings.xml b/res/xml/display_settings.xml
index 7f740f3..50e6891 100644
--- a/res/xml/display_settings.xml
+++ b/res/xml/display_settings.xml
@@ -97,12 +97,12 @@
android:title="@string/lift_to_wake_title" />
<Preference
- android:key="gesture_double_tap_screen"
+ android:key="gesture_double_tap_screen_display_summary"
android:title="@string/ambient_display_title"
android:fragment="com.android.settings.gestures.DoubleTapScreenSettings" />
<Preference
- android:key="gesture_pick_up"
+ android:key="gesture_pick_up_display_summary"
android:title="@string/ambient_display_pickup_title"
android:fragment="com.android.settings.gestures.PickupGestureSettings" />
diff --git a/res/xml/language_and_input.xml b/res/xml/language_and_input.xml
index ca5ce45..6e65da6 100644
--- a/res/xml/language_and_input.xml
+++ b/res/xml/language_and_input.xml
@@ -66,32 +66,32 @@
android:title="@string/gesture_preference_title">
<Preference
- android:key="gesture_assist"
+ android:key="gesture_assist_input_summary"
android:title="@string/assist_gesture_title"
android:fragment="com.android.settings.gestures.AssistGestureSettings"/>
<Preference
- android:key="gesture_swipe_down_fingerprint"
+ android:key="gesture_swipe_down_fingerprint_input_summary"
android:title="@string/fingerprint_swipe_for_notifications_title"
android:fragment="com.android.settings.gestures.SwipeToNotificationSettings"/>
<Preference
- android:key="gesture_double_tap_power"
+ android:key="gesture_double_tap_power_input_summary"
android:title="@string/double_tap_power_for_camera_title"
android:fragment="com.android.settings.gestures.DoubleTapPowerSettings"/>
<Preference
- android:key="gesture_double_twist"
+ android:key="gesture_double_twist_input_summary"
android:title="@string/double_twist_for_camera_mode_title"
android:fragment="com.android.settings.gestures.DoubleTwistGestureSettings"/>
<Preference
- android:key="gesture_double_tap_screen"
+ android:key="gesture_double_tap_screen_input_summary"
android:title="@string/ambient_display_title"
android:fragment="com.android.settings.gestures.DoubleTapScreenSettings"/>
<Preference
- android:key="gesture_pick_up"
+ android:key="gesture_pick_up_input_summary"
android:title="@string/ambient_display_pickup_title"
android:fragment="com.android.settings.gestures.PickupGestureSettings"/>
@@ -105,7 +105,7 @@
android:dialogTitle="@string/pointer_speed"/>
<Preference
- android:key="tts_settings"
+ android:key="tts_settings_summary"
android:title="@string/tts_settings_title"
android:fragment="com.android.settings.tts.TextToSpeechSettings"/>
diff --git a/res/xml/manage_assist.xml b/res/xml/manage_assist.xml
index eadf45f..a96fb6b 100644
--- a/res/xml/manage_assist.xml
+++ b/res/xml/manage_assist.xml
@@ -26,7 +26,7 @@
android:fragment="com.android.settings.applications.assist.DefaultAssistPicker"/>
<Preference
- android:key="gesture_assist"
+ android:key="gesture_assist_application"
android:title="@string/assist_gesture_title"
android:fragment="com.android.settings.gestures.AssistGestureSettings"/>
diff --git a/res/xml/reset_dashboard_fragment.xml b/res/xml/reset_dashboard_fragment.xml
index c769d5d..1fd45db 100644
--- a/res/xml/reset_dashboard_fragment.xml
+++ b/res/xml/reset_dashboard_fragment.xml
@@ -18,7 +18,8 @@
<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:settings="http://schemas.android.com/apk/res/com.android.settings"
- android:title="@string/reset_dashboard_title">
+ android:title="@string/reset_dashboard_title"
+ android:key="reset_dashboard_fragment_screen">
<!-- Network reset -->
<com.android.settingslib.RestrictedPreference
diff --git a/res/xml/sound_settings.xml b/res/xml/sound_settings.xml
index 33c1b0a..d288a9d 100644
--- a/res/xml/sound_settings.xml
+++ b/res/xml/sound_settings.xml
@@ -124,7 +124,7 @@
<DropDownPreference
android:key="dock_audio_media"
android:title="@string/dock_audio_media_title"
- android:summary="@string/summary_placeholder" />
+ android:summary="%s" />
<!-- Boot sounds -->
<SwitchPreference
@@ -135,7 +135,7 @@
<DropDownPreference
android:key="emergency_tone"
android:title="@string/emergency_tone_title"
- android:summary="@string/summary_placeholder" />
+ android:summary="%s" />
<com.android.settingslib.RestrictedPreference
android:key="cell_broadcast_settings"
diff --git a/res/xml/zen_mode_visual_interruptions_settings.xml b/res/xml/zen_mode_visual_interruptions_settings.xml
index 012dd95..64c79ec 100644
--- a/res/xml/zen_mode_visual_interruptions_settings.xml
+++ b/res/xml/zen_mode_visual_interruptions_settings.xml
@@ -16,7 +16,8 @@
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:settings="http://schemas.android.com/apk/res/com.android.settings"
- android:title="@string/zen_mode_visual_interruptions_settings_title" >
+ android:title="@string/zen_mode_visual_interruptions_settings_title"
+ android:key="zen_mode_visual_interruptions_screen">
<SwitchPreference android:key="screenOn"
android:title="@string/zen_mode_screen_on"
diff --git a/src/com/android/settings/ChooseLockGeneric.java b/src/com/android/settings/ChooseLockGeneric.java
index 546b11e..49784f6 100644
--- a/src/com/android/settings/ChooseLockGeneric.java
+++ b/src/com/android/settings/ChooseLockGeneric.java
@@ -722,15 +722,16 @@
@Override
public void onRemovalError(Fingerprint fp, int errMsgId,
CharSequence errString) {
- Log.v(TAG, "Fingerprint removed: " + fp.getFingerId());
- if (fp.getFingerId() == 0) {
- removeManagedProfileFingerprintsAndFinishIfNecessary(userId);
- }
+ Log.e(TAG, String.format(
+ "Can't remove fingerprint %d in group %d. Reason: %s",
+ fp.getFingerId(), fp.getGroupId(), errString));
+ // TODO: need to proceed with the removal of managed profile
+ // fingerprints and finish() gracefully.
}
@Override
- public void onRemovalSucceeded(Fingerprint fingerprint) {
- if (fingerprint.getFingerId() == 0) {
+ public void onRemovalSucceeded(Fingerprint fp, int remaining) {
+ if (remaining == 0) {
removeManagedProfileFingerprintsAndFinishIfNecessary(userId);
}
}
diff --git a/src/com/android/settings/DeviceInfoSettings.java b/src/com/android/settings/DeviceInfoSettings.java
index 109fb0e..8dfb02b 100644
--- a/src/com/android/settings/DeviceInfoSettings.java
+++ b/src/com/android/settings/DeviceInfoSettings.java
@@ -51,6 +51,8 @@
private static final String LOG_TAG = "DeviceInfoSettings";
+ private static final String KEY_LEGAL_CONTAINER = "legal_container";
+
@Override
public int getMetricsCategory() {
return MetricsEvent.DEVICEINFO;
@@ -151,5 +153,12 @@
return buildPreferenceControllers(context, null /*activity */,
null /* fragment */, null /* lifecycle */);
}
+
+ @Override
+ public List<String> getNonIndexableKeys(Context context) {
+ List<String> keys = super.getNonIndexableKeys(context);
+ keys.add(KEY_LEGAL_CONTAINER);
+ return keys;
+ }
};
}
diff --git a/src/com/android/settings/DisplaySettings.java b/src/com/android/settings/DisplaySettings.java
index 98844fa..b70a133 100644
--- a/src/com/android/settings/DisplaySettings.java
+++ b/src/com/android/settings/DisplaySettings.java
@@ -54,6 +54,8 @@
private static final String KEY_AUTO_BRIGHTNESS = "auto_brightness";
private static final String KEY_SCREEN_TIMEOUT = "screen_timeout";
+ private static final String KEY_PICK_UP = "gesture_pick_up_display_summary";
+ private static final String KEY_DOUBLE_TAP_SCREEN = "gesture_double_tap_screen_display_summary";
@Override
public int getMetricsCategory() {
@@ -100,9 +102,10 @@
controllers.add(new ScreenSaverPreferenceController(context));
AmbientDisplayConfiguration ambientDisplayConfig = new AmbientDisplayConfiguration(context);
controllers.add(new PickupGesturePreferenceController(
- context, lifecycle, ambientDisplayConfig, UserHandle.myUserId()));
+ context, lifecycle, ambientDisplayConfig, UserHandle.myUserId(), KEY_PICK_UP));
controllers.add(new DoubleTapScreenPreferenceController(
- context, lifecycle, ambientDisplayConfig, UserHandle.myUserId()));
+ context, lifecycle, ambientDisplayConfig, UserHandle.myUserId(),
+ KEY_DOUBLE_TAP_SCREEN));
controllers.add(new TapToWakePreferenceController(context));
controllers.add(new TimeoutPreferenceController(context, KEY_SCREEN_TIMEOUT));
controllers.add(new VrDisplayPreferenceController(context));
diff --git a/src/com/android/settings/LegalSettings.java b/src/com/android/settings/LegalSettings.java
index e40152a..d5b9988 100644
--- a/src/com/android/settings/LegalSettings.java
+++ b/src/com/android/settings/LegalSettings.java
@@ -40,6 +40,7 @@
private static final String KEY_LICENSE = "license";
private static final String KEY_COPYRIGHT = "copyright";
private static final String KEY_WEBVIEW_LICENSE = "webview_license";
+ private static final String KEY_WALLPAPER_ATTRIBUTIONS = "wallpaper_attributions";
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
@@ -76,7 +77,7 @@
@Override
public List<String> getNonIndexableKeys(Context context) {
- final List<String> keys = new ArrayList<String>();
+ final List<String> keys = super.getNonIndexableKeys(context);
if (!checkIntentAction(context, "android.settings.TERMS")) {
keys.add(KEY_TERMS);
}
@@ -89,6 +90,7 @@
if (!checkIntentAction(context, "android.settings.WEBVIEW_LICENSE")) {
keys.add(KEY_WEBVIEW_LICENSE);
}
+ keys.add(KEY_WALLPAPER_ATTRIBUTIONS);
return keys;
}
diff --git a/src/com/android/settings/SettingsInitialize.java b/src/com/android/settings/SettingsInitialize.java
index 66fc4d6..6b15770 100644
--- a/src/com/android/settings/SettingsInitialize.java
+++ b/src/com/android/settings/SettingsInitialize.java
@@ -35,7 +35,7 @@
import static android.content.pm.PackageManager.MATCH_DISABLED_COMPONENTS;
/**
- * Listens to {@link Intent.ACTION_BOOT_COMPLETED} and {@link Intent.ACTION_PRE_BOOT_COMPLETED}
+ * Listens to {@link Intent.ACTION_PRE_BOOT_COMPLETED} and {@link Intent.ACTION_USER_INITIALIZED}
* performs setup steps for a managed profile (disables the launcher icon of the Settings app,
* adds cross-profile intent filters for the appropriate Settings activities), and disables the
* webview setting for non-admin users.
@@ -89,11 +89,13 @@
}
// Disable launcher icon
- // Note: This needs to happen after forwarding intents, otherwise the main Settings
- // intent gets lost
ComponentName settingsComponentName = new ComponentName(context, Settings.class);
pm.setComponentEnabledSetting(settingsComponentName,
PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);
+ // Disable shortcut picker.
+ ComponentName shortcutComponentName = new ComponentName(context, CreateShortcut.class);
+ pm.setComponentEnabledSetting(shortcutComponentName,
+ PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);
}
// Disable WebView Setting if the current user is not an admin
diff --git a/src/com/android/settings/accounts/AccountPreferenceController.java b/src/com/android/settings/accounts/AccountPreferenceController.java
index a782a7d..6ed2c34 100644
--- a/src/com/android/settings/accounts/AccountPreferenceController.java
+++ b/src/com/android/settings/accounts/AccountPreferenceController.java
@@ -123,9 +123,9 @@
*/
public boolean pendingRemoval;
/**
- * The map from account name to account preference
+ * The map from account key to account preference
*/
- public ArrayMap<CharSequence, AccountTypePreference> accountPreferences = new ArrayMap<>();
+ public ArrayMap<String, AccountTypePreference> accountPreferences = new ArrayMap<>();
}
public AccountPreferenceController(Context context, SettingsPreferenceFragment parent,
@@ -426,7 +426,7 @@
return;
}
if (profileData.userInfo.isEnabled()) {
- final ArrayMap<CharSequence, AccountTypePreference> preferenceToRemove =
+ final ArrayMap<String, AccountTypePreference> preferenceToRemove =
new ArrayMap<>(profileData.accountPreferences);
final ArrayList<AccountTypePreference> preferences = getAccountTypePreferences(
profileData.authenticatorHelper, profileData.userInfo.getUserHandle(),
@@ -435,18 +435,19 @@
for (int i = 0; i < count; i++) {
final AccountTypePreference preference = preferences.get(i);
preference.setOrder(i);
- if (!profileData.accountPreferences.containsValue(preference)) {
- profileData.preferenceGroup.addPreference(preferences.get(i));
- profileData.accountPreferences.put(preference.getTitle(), preference);
+ final String key = preference.getKey();
+ if (!profileData.accountPreferences.containsKey(key)) {
+ profileData.preferenceGroup.addPreference(preference);
+ profileData.accountPreferences.put(key, preference);
}
}
if (profileData.addAccountPreference != null) {
profileData.preferenceGroup.addPreference(profileData.addAccountPreference);
}
- for (CharSequence name : preferenceToRemove.keySet()) {
+ for (String key : preferenceToRemove.keySet()) {
profileData.preferenceGroup.removePreference(
- profileData.accountPreferences.get(name));
- profileData.accountPreferences.remove(name);
+ profileData.accountPreferences.get(key));
+ profileData.accountPreferences.remove(key);
}
} else {
profileData.preferenceGroup.removeAll();
@@ -471,8 +472,7 @@
}
private ArrayList<AccountTypePreference> getAccountTypePreferences(AuthenticatorHelper helper,
- UserHandle userHandle,
- ArrayMap<CharSequence, AccountTypePreference> preferenceToRemove) {
+ UserHandle userHandle, ArrayMap<String, AccountTypePreference> preferenceToRemove) {
final String[] accountTypes = helper.getEnabledAccountTypes();
final ArrayList<AccountTypePreference> accountTypePreferences =
new ArrayList<>(accountTypes.length);
@@ -497,7 +497,8 @@
// Add a preference row for each individual account
for (Account account : accounts) {
- final AccountTypePreference preference = preferenceToRemove.remove(account.name);
+ final AccountTypePreference preference =
+ preferenceToRemove.remove(AccountTypePreference.buildKey(account));
if (preference != null) {
accountTypePreferences.add(preference);
continue;
@@ -521,7 +522,7 @@
fragmentArguments.putParcelable(EXTRA_USER, userHandle);
accountTypePreferences.add(new AccountTypePreference(
prefContext, mMetricsFeatureProvider.getMetricsCategory(mParent),
- account.name, titleResPackageName, titleResId, label,
+ account, titleResPackageName, titleResId, label,
AccountDetailDashboardFragment.class.getName(), fragmentArguments, icon));
}
helper.preloadDrawableForType(mContext, accountType);
diff --git a/src/com/android/settings/accounts/AccountTypePreference.java b/src/com/android/settings/accounts/AccountTypePreference.java
index 0abfb50..4f92829 100644
--- a/src/com/android/settings/accounts/AccountTypePreference.java
+++ b/src/com/android/settings/accounts/AccountTypePreference.java
@@ -16,6 +16,7 @@
package com.android.settings.accounts;
+import android.accounts.Account;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
@@ -67,18 +68,11 @@
private final int mMetricsCategory;
- public AccountTypePreference(Context context, int metricsCategory, CharSequence title,
- String titleResPackageName, int titleResId, String fragment, Bundle fragmentArguments,
- Drawable icon) {
- this(context, metricsCategory, title, titleResPackageName, titleResId, null, fragment,
- fragmentArguments, icon);
- }
-
- public AccountTypePreference(Context context, int metricsCategory, CharSequence title,
+ public AccountTypePreference(Context context, int metricsCategory, Account account,
String titleResPackageName, int titleResId, CharSequence summary, String fragment,
Bundle fragmentArguments, Drawable icon) {
super(context);
- mTitle = title;
+ mTitle = account.name;
mTitleResPackageName = titleResPackageName;
mTitleResId = titleResId;
mSummary = summary;
@@ -87,7 +81,8 @@
mMetricsCategory = metricsCategory;
setWidgetLayoutResource(R.layout.account_type_preference);
- setTitle(title);
+ setKey(buildKey(account));
+ setTitle(mTitle);
setSummary(summary);
setIcon(icon);
@@ -115,6 +110,13 @@
return false;
}
+ /**
+ * Build a unique preference key based on account.
+ */
+ public static String buildKey(Account account) {
+ return String.valueOf(account.hashCode());
+ }
+
public CharSequence getTitle() {
return mTitle;
}
@@ -122,5 +124,4 @@
public CharSequence getSummary() {
return mSummary;
}
-
}
diff --git a/src/com/android/settings/applications/AdvancedAppSettings.java b/src/com/android/settings/applications/AdvancedAppSettings.java
index caa9da1..cce8b7d 100644
--- a/src/com/android/settings/applications/AdvancedAppSettings.java
+++ b/src/com/android/settings/applications/AdvancedAppSettings.java
@@ -43,6 +43,8 @@
static final String TAG = "AdvancedAppSettings";
+ private static final String KEY_ASSIST_VOICE_INPUT = "assist_and_voice_input";
+
@Override
protected String getLogTag() {
return TAG;
@@ -80,6 +82,18 @@
sir.xmlResId = R.xml.app_default_settings;
return Arrays.asList(sir);
}
+
+ @Override
+ public List<String> getNonIndexableKeys(Context context) {
+ List<String> keys = super.getNonIndexableKeys(context);
+ keys.add(KEY_ASSIST_VOICE_INPUT);
+ // TODO (b/38230148) Remove these keys when we can differentiate work results
+ keys.add((new DefaultWorkPhonePreferenceController(context))
+ .getPreferenceKey());
+ keys.add((new DefaultWorkBrowserPreferenceController(context))
+ .getPreferenceKey());
+ return keys;
+ }
};
static class SummaryProvider implements SummaryLoader.SummaryProvider {
diff --git a/src/com/android/settings/applications/assist/ManageAssist.java b/src/com/android/settings/applications/assist/ManageAssist.java
index 824c0b1..aa71c9a 100644
--- a/src/com/android/settings/applications/assist/ManageAssist.java
+++ b/src/com/android/settings/applications/assist/ManageAssist.java
@@ -38,6 +38,7 @@
public class ManageAssist extends DashboardFragment {
private static final String TAG = "ManageAssist";
+ private static final String KEY_ASSIST = "gesture_assist_application";
@Override
protected String getLogTag() {
@@ -71,7 +72,7 @@
Lifecycle lifecycle) {
final List<PreferenceController> controllers = new ArrayList<>();
controllers.add(new DefaultAssistPreferenceController(context));
- controllers.add(new AssistGesturePreferenceController(context, lifecycle));
+ controllers.add(new AssistGesturePreferenceController(context, lifecycle, KEY_ASSIST));
controllers.add(new AssistContextPreferenceController(context, lifecycle));
controllers.add(new AssistScreenshotPreferenceController(context, lifecycle));
controllers.add(new AssistFlashScreenPreferenceController(context, lifecycle));
@@ -94,5 +95,13 @@
public List<PreferenceController> getPreferenceControllers(Context context) {
return buildPreferenceControllers(context, null /* lifecycle */);
}
+
+ @Override
+ public List<String> getNonIndexableKeys(Context context) {
+ List<String> keys = super.getNonIndexableKeys(context);
+ keys.add(KEY_ASSIST);
+ return keys;
+ }
+
};
}
diff --git a/src/com/android/settings/bluetooth/BluetoothPermissionRequest.java b/src/com/android/settings/bluetooth/BluetoothPermissionRequest.java
index 7eb7fdd..59496dd 100644
--- a/src/com/android/settings/bluetooth/BluetoothPermissionRequest.java
+++ b/src/com/android/settings/bluetooth/BluetoothPermissionRequest.java
@@ -17,6 +17,7 @@
package com.android.settings.bluetooth;
import android.app.Notification;
+import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.bluetooth.BluetoothDevice;
@@ -45,6 +46,12 @@
private static final String NOTIFICATION_TAG_PBAP = "Phonebook Access" ;
private static final String NOTIFICATION_TAG_MAP = "Message Access";
private static final String NOTIFICATION_TAG_SAP = "SIM Access";
+ /* TODO: Consolidate this multiple defined but common channel ID with other
+ * handlers that declare and use the same channel ID */
+ private static final String BLUETOOTH_NOTIFICATION_CHANNEL =
+ "bluetooth_notification_channel";
+
+ private NotificationChannel mNotificationChannel = null;
Context mContext;
int mRequestType;
@@ -151,7 +158,16 @@
deviceAlias, deviceAlias);
break;
}
- Notification notification = new Notification.Builder(context)
+ NotificationManager notificationManager =
+ (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
+ if (mNotificationChannel == null) {
+ mNotificationChannel = new NotificationChannel(BLUETOOTH_NOTIFICATION_CHANNEL,
+ context.getString(R.string.bluetooth),
+ NotificationManager.IMPORTANCE_HIGH);
+ notificationManager.createNotificationChannel(mNotificationChannel);
+ }
+ Notification notification = new Notification.Builder(context,
+ BLUETOOTH_NOTIFICATION_CHANNEL)
.setContentTitle(title)
.setTicker(message)
.setContentText(message)
@@ -169,9 +185,6 @@
notification.flags |= Notification.FLAG_NO_CLEAR; // Cannot be set with the builder.
- NotificationManager notificationManager =
- (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
-
notificationManager.notify(getNotificationTag(mRequestType), NOTIFICATION_ID,
notification);
}
diff --git a/src/com/android/settings/bluetooth/DeviceProfilesSettings.java b/src/com/android/settings/bluetooth/DeviceProfilesSettings.java
index a6dfa9b..a76ed46 100755
--- a/src/com/android/settings/bluetooth/DeviceProfilesSettings.java
+++ b/src/com/android/settings/bluetooth/DeviceProfilesSettings.java
@@ -23,6 +23,7 @@
import android.content.Context;
import android.content.DialogInterface;
import android.os.Bundle;
+import android.support.annotation.VisibleForTesting;
import android.text.Html;
import android.text.TextUtils;
import android.util.Log;
@@ -37,6 +38,7 @@
import com.android.internal.logging.nano.MetricsProto;
import com.android.settings.R;
import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
+import com.android.settingslib.bluetooth.A2dpProfile;
import com.android.settingslib.bluetooth.CachedBluetoothDevice;
import com.android.settingslib.bluetooth.CachedBluetoothDeviceManager;
import com.android.settingslib.bluetooth.LocalBluetoothManager;
@@ -55,6 +57,8 @@
private static final String KEY_PROFILE_CONTAINER = "profile_container";
private static final String KEY_UNPAIR = "unpair";
private static final String KEY_PBAP_SERVER = "PBAP Server";
+ @VisibleForTesting
+ static final String HIGH_QUALITY_AUDIO_PREF_TAG = "A2dpProfileHighQualityAudio";
private CachedBluetoothDevice mCachedDevice;
private LocalBluetoothManager mManager;
@@ -169,6 +173,21 @@
for (LocalBluetoothProfile profile : mCachedDevice.getConnectableProfiles()) {
CheckBox pref = createProfilePreference(profile);
mProfileContainer.addView(pref);
+
+ if (profile instanceof A2dpProfile) {
+ BluetoothDevice device = mCachedDevice.getDevice();
+ A2dpProfile a2dpProfile = (A2dpProfile) profile;
+ if (a2dpProfile.supportsHighQualityAudio(device)) {
+ CheckBox highQualityPref = new CheckBox(getActivity());
+ highQualityPref.setTag(HIGH_QUALITY_AUDIO_PREF_TAG);
+ highQualityPref.setOnClickListener(v -> {
+ a2dpProfile.setHighQualityAudioEnabled(device, highQualityPref.isChecked());
+ });
+ highQualityPref.setVisibility(View.GONE);
+ mProfileContainer.addView(highQualityPref);
+ }
+ refreshProfilePreference(pref, profile);
+ }
}
final int pbapPermission = mCachedDevice.getPhonebookPermissionChoice();
@@ -356,6 +375,22 @@
} else {
profilePref.setChecked(profile.isPreferred(device));
}
+ if (profile instanceof A2dpProfile) {
+ A2dpProfile a2dpProfile = (A2dpProfile) profile;
+ View v = mProfileContainer.findViewWithTag(HIGH_QUALITY_AUDIO_PREF_TAG);
+ if (v instanceof CheckBox) {
+ CheckBox highQualityPref = (CheckBox) v;
+ highQualityPref.setText(a2dpProfile.getHighQualityAudioOptionLabel(device));
+ highQualityPref.setChecked(a2dpProfile.isHighQualityAudioEnabled(device));
+
+ if (a2dpProfile.isPreferred(device)) {
+ v.setVisibility(View.VISIBLE);
+ v.setEnabled(!mCachedDevice.isBusy());
+ } else {
+ v.setVisibility(View.GONE);
+ }
+ }
+ }
}
private LocalBluetoothProfile getProfileOf(View v) {
diff --git a/src/com/android/settings/core/instrumentation/SharedPreferencesLogger.java b/src/com/android/settings/core/instrumentation/SharedPreferencesLogger.java
index 69f174b..d1c7c7a 100644
--- a/src/com/android/settings/core/instrumentation/SharedPreferencesLogger.java
+++ b/src/com/android/settings/core/instrumentation/SharedPreferencesLogger.java
@@ -111,6 +111,9 @@
mPreferenceKeySet.add(prefKey);
return;
}
+ // TODO: Remove count logging to save some resource.
+ mMetricsFeature.count(mContext, prefKey + "|" + value, 1);
+
// Pref key exists in set, log it's change in metrics.
mMetricsFeature.action(mContext, MetricsEvent.ACTION_SETTINGS_PREFERENCE_CHANGE,
Pair.create(MetricsEvent.FIELD_SETTINGS_PREFERENCE_CHANGE_NAME, prefKey),
diff --git a/src/com/android/settings/datausage/DataUsageSummary.java b/src/com/android/settings/datausage/DataUsageSummary.java
index 16172bd..5a84d13 100644
--- a/src/com/android/settings/datausage/DataUsageSummary.java
+++ b/src/com/android/settings/datausage/DataUsageSummary.java
@@ -71,10 +71,11 @@
public static final boolean TEST_RADIOS = false;
public static final String TEST_RADIOS_PROP = "test.radios";
+ public static final String KEY_RESTRICT_BACKGROUND = "restrict_background";
+ public static final String KEY_NETWORK_RESTRICTIONS = "network_restrictions";
+
private static final String KEY_STATUS_HEADER = "status_header";
private static final String KEY_LIMIT_SUMMARY = "limit_summary";
- private static final String KEY_RESTRICT_BACKGROUND = "restrict_background";
- private static final String KEY_NETWORK_RESTRICTIONS = "network_restrictions";
private static final String KEY_WIFI_USAGE_TITLE = "wifi_category";
private DataUsageController mDataUsageController;
@@ -465,7 +466,7 @@
@Override
public List<SearchIndexableResource> getXmlResourcesToIndex(Context context,
boolean enabled) {
- ArrayList<SearchIndexableResource> resources = new ArrayList<>();
+ List<SearchIndexableResource> resources = new ArrayList<>();
SearchIndexableResource resource = new SearchIndexableResource(context);
resource.xmlResId = R.xml.data_usage;
resources.add(resource);
@@ -485,13 +486,14 @@
@Override
public List<String> getNonIndexableKeys(Context context) {
- ArrayList<String> keys = new ArrayList<>();
- boolean hasMobileData = ConnectivityManager.from(context).isNetworkSupported(
- ConnectivityManager.TYPE_MOBILE);
+ List<String> keys = super.getNonIndexableKeys(context);
- if (hasMobileData) {
+ if (hasMobileData(context)) {
keys.add(KEY_RESTRICT_BACKGROUND);
}
+ if (hasWifiRadio(context)) {
+ keys.add(KEY_NETWORK_RESTRICTIONS);
+ }
keys.add(KEY_WIFI_USAGE_TITLE);
return keys;
diff --git a/src/com/android/settings/development/TelephonyMonitorPreferenceController.java b/src/com/android/settings/development/TelephonyMonitorPreferenceController.java
index 135af7d..c21ccda 100644
--- a/src/com/android/settings/development/TelephonyMonitorPreferenceController.java
+++ b/src/com/android/settings/development/TelephonyMonitorPreferenceController.java
@@ -23,15 +23,27 @@
import android.support.v7.preference.PreferenceScreen;
import android.widget.Toast;
+import com.android.internal.annotations.VisibleForTesting;
import com.android.settings.core.PreferenceController;
import com.android.settings.R;
public class TelephonyMonitorPreferenceController extends PreferenceController {
private static final String KEY_TELEPHONY_MONITOR_SWITCH = "telephony_monitor_switch";
+ @VisibleForTesting
static final String BUILD_TYPE = "ro.build.type";
+ @VisibleForTesting
static final String PROPERTY_TELEPHONY_MONITOR = "persist.radio.enable_tel_mon";
+ @VisibleForTesting
+ static final String ENABLED_STATUS = "enabled";
+ @VisibleForTesting
+ static final String DISABLED_STATUS = "disabled";
+ @VisibleForTesting
+ static final String USER_ENABLED_STATUS = "user_enabled";
+ @VisibleForTesting
+ static final String USER_DISABLED_STATUS = "user_disabled";
+
private SwitchPreference mPreference;
public TelephonyMonitorPreferenceController(Context context) {
@@ -43,7 +55,7 @@
super.displayPreference(screen);
if (isAvailable()) {
mPreference = (SwitchPreference) screen.findPreference(KEY_TELEPHONY_MONITOR_SWITCH);
- mPreference.setChecked(SystemProperties.getBoolean(PROPERTY_TELEPHONY_MONITOR, false));
+ mPreference.setChecked(isTelephonyMonitorEnabled());
}
}
@@ -69,7 +81,7 @@
if (KEY_TELEPHONY_MONITOR_SWITCH.equals(preference.getKey())) {
final SwitchPreference switchPreference = (SwitchPreference) preference;
SystemProperties.set(PROPERTY_TELEPHONY_MONITOR,
- switchPreference.isChecked() ? "true" : "false");
+ switchPreference.isChecked() ? USER_ENABLED_STATUS : USER_DISABLED_STATUS);
Toast.makeText(mContext, R.string.telephony_monitor_toast,
Toast.LENGTH_LONG).show();
return true;
@@ -87,9 +99,14 @@
if (!isAvailable()) {
return false;
}
- final boolean enabled = SystemProperties.getBoolean(PROPERTY_TELEPHONY_MONITOR, false);
+ final boolean enabled = isTelephonyMonitorEnabled();
mPreference.setChecked(enabled);
return enabled;
}
+ private boolean isTelephonyMonitorEnabled() {
+ final String tmStatus = SystemProperties.get(PROPERTY_TELEPHONY_MONITOR, DISABLED_STATUS);
+ return ENABLED_STATUS.equals(tmStatus) || USER_ENABLED_STATUS.equals(tmStatus);
+ }
+
}
diff --git a/src/com/android/settings/deviceinfo/StorageSettings.java b/src/com/android/settings/deviceinfo/StorageSettings.java
index b2bad3a..ce9ea9b 100644
--- a/src/com/android/settings/deviceinfo/StorageSettings.java
+++ b/src/com/android/settings/deviceinfo/StorageSettings.java
@@ -235,7 +235,7 @@
args.putString(VolumeInfo.EXTRA_VOLUME_ID, VolumeInfo.ID_PRIVATE_INTERNAL);
Intent intent = Utils.onBuildStartFragmentIntent(getActivity(),
StorageDashboardFragment.class.getName(), args, null,
- R.string.storage_settings_2, null, false, getMetricsCategory());
+ R.string.storage_settings, null, false, getMetricsCategory());
intent.putExtra(SettingsDrawerActivity.EXTRA_SHOW_MENU, true);
getActivity().startActivity(intent);
finish();
@@ -280,7 +280,7 @@
if (VolumeInfo.ID_PRIVATE_INTERNAL.equals(vol.getId())) {
startFragment(this, StorageDashboardFragment.class.getCanonicalName(),
- R.string.storage_settings_2, 0, args);
+ R.string.storage_settings, 0, args);
} else {
// TODO: Go to the StorageDashboardFragment once it fully handles all of the
// SD card cases and other private internal storage cases.
diff --git a/src/com/android/settings/fingerprint/FingerprintEnrollEnrolling.java b/src/com/android/settings/fingerprint/FingerprintEnrollEnrolling.java
index e6e6bcd..8078ad6 100644
--- a/src/com/android/settings/fingerprint/FingerprintEnrollEnrolling.java
+++ b/src/com/android/settings/fingerprint/FingerprintEnrollEnrolling.java
@@ -159,6 +159,14 @@
startIconAnimation();
}
+ @Override
+ protected void onPause() {
+ super.onPause();
+ if (mSidecar != null) {
+ mSidecar.setListener(null);
+ }
+ }
+
private void startIconAnimation() {
mIconAnimationDrawable.start();
}
diff --git a/src/com/android/settings/fingerprint/FingerprintEnrollFindSensor.java b/src/com/android/settings/fingerprint/FingerprintEnrollFindSensor.java
index 107838c..5152d31 100644
--- a/src/com/android/settings/fingerprint/FingerprintEnrollFindSensor.java
+++ b/src/com/android/settings/fingerprint/FingerprintEnrollFindSensor.java
@@ -134,7 +134,7 @@
return;
}
}
- getFragmentManager().beginTransaction().remove(mSidecar).commit();
+ getFragmentManager().beginTransaction().remove(mSidecar).commitAllowingStateLoss();
mSidecar = null;
startActivityForResult(getEnrollingIntent(), ENROLLING);
}
diff --git a/src/com/android/settings/fingerprint/FingerprintEnrollSidecar.java b/src/com/android/settings/fingerprint/FingerprintEnrollSidecar.java
index 7fc7a04..cbfec0c 100644
--- a/src/com/android/settings/fingerprint/FingerprintEnrollSidecar.java
+++ b/src/com/android/settings/fingerprint/FingerprintEnrollSidecar.java
@@ -31,6 +31,8 @@
import com.android.settings.core.InstrumentedFragment;
import com.android.settings.password.IFingerprintManager;
+import java.util.ArrayList;
+
/**
* Sidecar fragment to handle the state around fingerprint enrollment.
*/
@@ -46,6 +48,57 @@
private boolean mDone;
private int mUserId;
private IFingerprintManager mFingerprintManager;
+ private ArrayList<QueuedEvent> mQueuedEvents;
+
+ private abstract class QueuedEvent {
+ public abstract void send(Listener listener);
+ }
+
+ private class QueuedEnrollmentProgress extends QueuedEvent {
+ int enrollmentSteps;
+ int remaining;
+ public QueuedEnrollmentProgress(int enrollmentSteps, int remaining) {
+ this.enrollmentSteps = enrollmentSteps;
+ this.remaining = remaining;
+ }
+
+ @Override
+ public void send(Listener listener) {
+ listener.onEnrollmentProgressChange(enrollmentSteps, remaining);
+ }
+ }
+
+ private class QueuedEnrollmentHelp extends QueuedEvent {
+ int helpMsgId;
+ CharSequence helpString;
+ public QueuedEnrollmentHelp(int helpMsgId, CharSequence helpString) {
+ this.helpMsgId = helpMsgId;
+ this.helpString = helpString;
+ }
+
+ @Override
+ public void send(Listener listener) {
+ listener.onEnrollmentHelp(helpString);
+ }
+ }
+
+ private class QueuedEnrollmentError extends QueuedEvent {
+ int errMsgId;
+ CharSequence errString;
+ public QueuedEnrollmentError(int errMsgId, CharSequence errString) {
+ this.errMsgId = errMsgId;
+ this.errString = errString;
+ }
+
+ @Override
+ public void send(Listener listener) {
+ listener.onEnrollmentError(errMsgId, errString);
+ }
+ }
+
+ public FingerprintEnrollSidecar() {
+ mQueuedEvents = new ArrayList<>();
+ }
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
@@ -103,6 +156,13 @@
public void setListener(Listener listener) {
mListener = listener;
+ if (mListener != null) {
+ for (int i=0; i<mQueuedEvents.size(); i++) {
+ QueuedEvent event = mQueuedEvents.get(i);
+ event.send(mListener);
+ }
+ mQueuedEvents.clear();
+ }
}
public int getEnrollmentSteps() {
@@ -129,6 +189,8 @@
mDone = remaining == 0;
if (mListener != null) {
mListener.onEnrollmentProgressChange(mEnrollmentSteps, remaining);
+ } else {
+ mQueuedEvents.add(new QueuedEnrollmentProgress(mEnrollmentSteps, remaining));
}
}
@@ -136,6 +198,8 @@
public void onEnrollmentHelp(int helpMsgId, CharSequence helpString) {
if (mListener != null) {
mListener.onEnrollmentHelp(helpString);
+ } else {
+ mQueuedEvents.add(new QueuedEnrollmentHelp(helpMsgId, helpString));
}
}
@@ -143,6 +207,8 @@
public void onEnrollmentError(int errMsgId, CharSequence errString) {
if (mListener != null) {
mListener.onEnrollmentError(errMsgId, errString);
+ } else {
+ mQueuedEvents.add(new QueuedEnrollmentError(errMsgId, errString));
}
mEnrolling = false;
}
diff --git a/src/com/android/settings/fingerprint/FingerprintRemoveSidecar.java b/src/com/android/settings/fingerprint/FingerprintRemoveSidecar.java
index eda4c82..462d09e 100644
--- a/src/com/android/settings/fingerprint/FingerprintRemoveSidecar.java
+++ b/src/com/android/settings/fingerprint/FingerprintRemoveSidecar.java
@@ -53,7 +53,7 @@
private FingerprintManager.RemovalCallback
mRemoveCallback = new FingerprintManager.RemovalCallback() {
@Override
- public void onRemovalSucceeded(Fingerprint fingerprint) {
+ public void onRemovalSucceeded(Fingerprint fingerprint, int remaining) {
if (mListener != null) {
mListener.onRemovalSucceeded(fingerprint);
} else {
diff --git a/src/com/android/settings/fuelgauge/BatteryMeterView.java b/src/com/android/settings/fuelgauge/BatteryMeterView.java
index 969f886..c450b90 100644
--- a/src/com/android/settings/fuelgauge/BatteryMeterView.java
+++ b/src/com/android/settings/fuelgauge/BatteryMeterView.java
@@ -38,8 +38,6 @@
@VisibleForTesting
ColorFilter mAccentColorFilter;
- private int mLevel;
-
public BatteryMeterView(Context context) {
this(context, null, 0);
}
@@ -66,7 +64,6 @@
}
public void setBatteryLevel(int level) {
- mLevel = level;
mDrawable.setBatteryLevel(level);
if (level < mDrawable.getCriticalLevel()) {
mDrawable.setBatteryColorFilter(mErrorColorFilter);
@@ -75,10 +72,6 @@
}
}
- public int getBatteryLevel() {
- return mLevel;
- }
-
public void setCharging(boolean charging) {
mDrawable.setCharging(charging);
}
diff --git a/src/com/android/settings/fuelgauge/BatterySaverSettings.java b/src/com/android/settings/fuelgauge/BatterySaverSettings.java
index 45d0db2..6b7ddf9 100644
--- a/src/com/android/settings/fuelgauge/BatterySaverSettings.java
+++ b/src/com/android/settings/fuelgauge/BatterySaverSettings.java
@@ -99,6 +99,7 @@
}
};
mTriggerPref.init(this);
+
mPowerManager = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE);
}
diff --git a/src/com/android/settings/fuelgauge/BatteryUtils.java b/src/com/android/settings/fuelgauge/BatteryUtils.java
index 86cb203..849144a 100644
--- a/src/com/android/settings/fuelgauge/BatteryUtils.java
+++ b/src/com/android/settings/fuelgauge/BatteryUtils.java
@@ -22,7 +22,9 @@
import android.support.annotation.IntDef;
import android.support.annotation.Nullable;
import android.support.annotation.VisibleForTesting;
+import android.text.format.DateUtils;
import android.util.Log;
+import android.util.SparseLongArray;
import com.android.internal.os.BatterySipper;
import com.android.settings.overlay.FeatureFactory;
@@ -115,25 +117,64 @@
}
/**
- * Remove the {@link BatterySipper} that we should hide.
+ * Remove the {@link BatterySipper} that we should hide and smear the screen usage based on
+ * foreground activity time.
*
* @param sippers sipper list that need to check and remove
* @return the total power of the hidden items of {@link BatterySipper}
+ * for proportional smearing
*/
public double removeHiddenBatterySippers(List<BatterySipper> sippers) {
- double totalPowerMah = 0;
+ double proportionalSmearPowerMah = 0;
+ BatterySipper screenSipper = null;
for (int i = sippers.size() - 1; i >= 0; i--) {
final BatterySipper sipper = sippers.get(i);
if (shouldHideSipper(sipper)) {
sippers.remove(i);
- if (sipper.drainType != BatterySipper.DrainType.OVERCOUNTED) {
- // Don't add it if it is overcounted
- totalPowerMah += sipper.totalPowerMah;
+ if (sipper.drainType != BatterySipper.DrainType.OVERCOUNTED
+ && sipper.drainType != BatterySipper.DrainType.SCREEN
+ && sipper.drainType != BatterySipper.DrainType.UNACCOUNTED) {
+ // Don't add it if it is overcounted, unaccounted or screen
+ proportionalSmearPowerMah += sipper.totalPowerMah;
}
}
+
+ if (sipper.drainType == BatterySipper.DrainType.SCREEN) {
+ screenSipper = sipper;
+ }
}
- return totalPowerMah;
+ smearScreenBatterySipper(sippers, screenSipper);
+
+ return proportionalSmearPowerMah;
+ }
+
+ /**
+ * Smear the screen on power usage among {@code sippers}, based on ratio of foreground activity
+ * time.
+ */
+ @VisibleForTesting
+ void smearScreenBatterySipper(List<BatterySipper> sippers, BatterySipper screenSipper) {
+ final long rawRealtimeMs = SystemClock.elapsedRealtime();
+ long totalActivityTimeMs = 0;
+ final SparseLongArray activityTimeArray = new SparseLongArray();
+ for (int i = 0, size = sippers.size(); i < size; i++) {
+ final BatteryStats.Uid uid = sippers.get(i).uidObj;
+ if (uid != null) {
+ final long timeMs = getForegroundActivityTotalTimeMs(uid, rawRealtimeMs);
+ activityTimeArray.put(uid.getUid(), timeMs);
+ totalActivityTimeMs += timeMs;
+ }
+ }
+
+ if (totalActivityTimeMs >= 10 * DateUtils.MINUTE_IN_MILLIS) {
+ final double screenPowerMah = screenSipper.totalPowerMah;
+ for (int i = 0, size = sippers.size(); i < size; i++) {
+ final BatterySipper sipper = sippers.get(i);
+ sipper.totalPowerMah += screenPowerMah * activityTimeArray.get(sipper.getUid(), 0)
+ / totalActivityTimeMs;
+ }
+ }
}
/**
@@ -144,9 +185,7 @@
return drainType == BatterySipper.DrainType.IDLE
|| drainType == BatterySipper.DrainType.CELL
- || drainType == BatterySipper.DrainType.WIFI
|| drainType == BatterySipper.DrainType.SCREEN
- || drainType == BatterySipper.DrainType.BLUETOOTH
|| drainType == BatterySipper.DrainType.UNACCOUNTED
|| drainType == BatterySipper.DrainType.OVERCOUNTED
|| (sipper.totalPowerMah * SECONDS_IN_HOUR) < MIN_POWER_THRESHOLD_MILLI_AMP
@@ -186,5 +225,15 @@
return mPackageManager == null;
}
+ @VisibleForTesting
+ long getForegroundActivityTotalTimeMs(BatteryStats.Uid uid, long rawRealtimeMs) {
+ final BatteryStats.Timer timer = uid.getForegroundActivityTimer();
+ if (timer != null) {
+ return timer.getTotalTimeLocked(rawRealtimeMs, BatteryStats.STATS_SINCE_CHARGED);
+ }
+
+ return 0;
+ }
+
}
diff --git a/src/com/android/settings/fuelgauge/FakeUid.java b/src/com/android/settings/fuelgauge/FakeUid.java
index 6f92b3d..6cb5c64 100644
--- a/src/com/android/settings/fuelgauge/FakeUid.java
+++ b/src/com/android/settings/fuelgauge/FakeUid.java
@@ -45,6 +45,11 @@
}
@Override
+ public Timer getAggregatedPartialWakelockTimer() {
+ return null;
+ }
+
+ @Override
public ArrayMap<String, ? extends Timer> getSyncStats() {
return null;
}
diff --git a/src/com/android/settings/fuelgauge/PowerUsageBase.java b/src/com/android/settings/fuelgauge/PowerUsageBase.java
index aee55d6..060abdd 100644
--- a/src/com/android/settings/fuelgauge/PowerUsageBase.java
+++ b/src/com/android/settings/fuelgauge/PowerUsageBase.java
@@ -57,7 +57,7 @@
mBatteryBroadcastReceiver = new BatteryBroadcastReceiver(getContext());
mBatteryBroadcastReceiver.setBatteryChangedListener(() -> {
- getLoaderManager().restartLoader(0, null, this);
+ restartBatteryStatsLoader();
});
getLoaderManager().initLoader(0, icicle, this);
@@ -95,6 +95,10 @@
}
}
+ protected void restartBatteryStatsLoader() {
+ getLoaderManager().restartLoader(0, Bundle.EMPTY, this);
+ }
+
protected abstract void refreshUi();
protected void updatePreference(BatteryHistoryPreference historyPref) {
diff --git a/src/com/android/settings/fuelgauge/PowerUsageSummary.java b/src/com/android/settings/fuelgauge/PowerUsageSummary.java
index 0309296..b3d07b8 100644
--- a/src/com/android/settings/fuelgauge/PowerUsageSummary.java
+++ b/src/com/android/settings/fuelgauge/PowerUsageSummary.java
@@ -16,8 +16,6 @@
package com.android.settings.fuelgauge;
-import android.animation.Animator;
-import android.animation.ValueAnimator;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
@@ -43,7 +41,6 @@
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
-import android.view.animation.AnimationUtils;
import android.widget.TextView;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
@@ -87,10 +84,6 @@
private static final String KEY_BATTERY_HEADER = "battery_header";
private static final int MAX_ITEMS_TO_LIST = USE_FAKE_DATA ? 30 : 10;
private static final int MIN_AVERAGE_POWER_THRESHOLD_MILLI_AMP = 10;
- private static final int BATTERY_ANIMATION_DURATION_MS_PER_LEVEL = 30;
-
- @VisibleForTesting
- static final String ARG_BATTERY_LEVEL = "key_battery_level";
private static final String KEY_SCREEN_USAGE = "screen_usage";
private static final String KEY_TIME_SINCE_LAST_FULL_CHARGE = "last_full_charge";
@@ -112,8 +105,6 @@
new FooterPreferenceMixin(this, getLifecycle());
@VisibleForTesting
- int mBatteryLevel;
- @VisibleForTesting
boolean mShowAllApps = false;
@VisibleForTesting
PowerGaugePreference mScreenUsagePref;
@@ -133,8 +124,6 @@
super.onCreate(icicle);
setAnimationAllowed(true);
- mBatteryLevel = getContext().getResources().getInteger(
- com.android.internal.R.integer.config_criticalBatteryWarningLevel) + 1;
mBatteryLayoutPref = (LayoutPreference) findPreference(KEY_BATTERY_HEADER);
mAppListGroup = (PreferenceGroup) findPreference(KEY_APP_LIST);
mScreenUsagePref = (PowerGaugePreference) findPreference(KEY_SCREEN_USAGE);
@@ -148,14 +137,6 @@
}
@Override
- public void onActivityCreated(Bundle savedInstanceState) {
- super.onActivityCreated(savedInstanceState);
- if (savedInstanceState != null) {
- mBatteryLevel = savedInstanceState.getInt(ARG_BATTERY_LEVEL);
- }
- }
-
- @Override
public int getMetricsCategory() {
return MetricsEvent.FUELGAUGE_POWER_USAGE_SUMMARY;
}
@@ -163,8 +144,6 @@
@Override
public void onResume() {
super.onResume();
-
- initHeaderPreference();
}
@Override
@@ -183,12 +162,6 @@
}
@Override
- public void onSaveInstanceState(Bundle outState) {
- super.onSaveInstanceState(outState);
- outState.putInt(ARG_BATTERY_LEVEL, mBatteryLevel);
- }
-
- @Override
public boolean onPreferenceTreeClick(Preference preference) {
if (KEY_BATTERY_HEADER.equals(preference.getKey())) {
performBatteryHeaderClick();
@@ -287,7 +260,7 @@
item.setTitle(mShowAllApps ? R.string.hide_extra_apps : R.string.show_all_apps);
metricsFeatureProvider.action(context,
MetricsEvent.ACTION_SETTINGS_MENU_BATTERY_APPS_TOGGLE, mShowAllApps);
- refreshUi();
+ restartBatteryStatsLoader();
return true;
default:
return super.onOptionsItemSelected(item);
@@ -596,46 +569,15 @@
.findViewById(R.id.battery_header_icon);
final TextView timeText = (TextView) mBatteryLayoutPref.findViewById(R.id.battery_percent);
final TextView summary1 = (TextView) mBatteryLayoutPref.findViewById(R.id.summary1);
+ timeText.setText(Utils.formatPercentage(info.batteryLevel));
if (info.remainingLabel == null ) {
summary1.setText(info.statusLabel);
} else {
summary1.setText(info.remainingLabel);
}
+
+ batteryView.setBatteryLevel(info.batteryLevel);
batteryView.setCharging(!info.discharging);
- startBatteryHeaderAnimationIfNecessary(batteryView, timeText, mBatteryLevel,
- info.batteryLevel);
- }
-
- @VisibleForTesting
- void initHeaderPreference() {
- final BatteryMeterView batteryView = (BatteryMeterView) mBatteryLayoutPref
- .findViewById(R.id.battery_header_icon);
- final TextView timeText = (TextView) mBatteryLayoutPref.findViewById(R.id.battery_percent);
-
- batteryView.setBatteryLevel(mBatteryLevel);
- timeText.setText(Utils.formatPercentage(mBatteryLevel));
- }
-
- @VisibleForTesting
- void startBatteryHeaderAnimationIfNecessary(BatteryMeterView batteryView, TextView timeTextView,
- int prevLevel, int currentLevel) {
- mBatteryLevel = currentLevel;
- final int diff = Math.abs(prevLevel - currentLevel);
- if (diff != 0) {
- final ValueAnimator animator = ValueAnimator.ofInt(prevLevel, currentLevel);
- animator.setDuration(BATTERY_ANIMATION_DURATION_MS_PER_LEVEL * diff);
- animator.setInterpolator(AnimationUtils.loadInterpolator(getContext(),
- android.R.interpolator.fast_out_slow_in));
- animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
- @Override
- public void onAnimationUpdate(ValueAnimator animation) {
- final Integer level = (Integer) animation.getAnimatedValue();
- batteryView.setBatteryLevel(level);
- timeTextView.setText(Utils.formatPercentage(level));
- }
- });
- animator.start();
- }
}
@VisibleForTesting
@@ -652,7 +594,7 @@
final CharSequence timeSequence = Utils.formatElapsedTime(getContext(), usageTimeMs,
false);
preference.setSummary(
- TextUtils.expandTemplate(getText(R.string.battery_used_for), timeSequence));
+ TextUtils.expandTemplate(getText(R.string.battery_screen_usage), timeSequence));
}
}
diff --git a/src/com/android/settings/gestures/AssistGesturePreferenceController.java b/src/com/android/settings/gestures/AssistGesturePreferenceController.java
index f0ba888..c858511 100644
--- a/src/com/android/settings/gestures/AssistGesturePreferenceController.java
+++ b/src/com/android/settings/gestures/AssistGesturePreferenceController.java
@@ -35,7 +35,7 @@
implements OnPause, OnResume {
private static final String PREF_KEY_VIDEO = "gesture_assist_video";
- private static final String PREF_KEY_ASSIST_GESTURE = "gesture_assist";
+ private final String mAssistGesturePrefKey;
private final AssistGestureFeatureProvider mFeatureProvider;
private final SettingObserver mSettingObserver;
@@ -44,11 +44,12 @@
private PreferenceScreen mScreen;
private Preference mPreference;
- public AssistGesturePreferenceController(Context context, Lifecycle lifecycle) {
+ public AssistGesturePreferenceController(Context context, Lifecycle lifecycle, String key) {
super(context, lifecycle);
mFeatureProvider = FeatureFactory.getFactory(context).getAssistGestureFeatureProvider();
mSettingObserver = new SettingObserver();
mWasAvailable = isAvailable();
+ mAssistGesturePrefKey = key;
}
@Override
@@ -110,7 +111,7 @@
@Override
public String getPreferenceKey() {
- return PREF_KEY_ASSIST_GESTURE;
+ return mAssistGesturePrefKey;
}
@Override
diff --git a/src/com/android/settings/gestures/AssistGestureSettings.java b/src/com/android/settings/gestures/AssistGestureSettings.java
index 238b8b6..0c4f278 100644
--- a/src/com/android/settings/gestures/AssistGestureSettings.java
+++ b/src/com/android/settings/gestures/AssistGestureSettings.java
@@ -34,6 +34,8 @@
private static final String TAG = "AssistGesture";
+ private static final String KEY_ASSIST = "gesture_assist";
+
@Override
public int getMetricsCategory() {
return MetricsProto.MetricsEvent.VIEW_UNKNOWN;
@@ -57,7 +59,7 @@
private static List<PreferenceController> buildPreferenceControllers(Context context,
Lifecycle lifecycle) {
final List<PreferenceController> controllers = new ArrayList<>();
- controllers.add(new AssistGesturePreferenceController(context, lifecycle));
+ controllers.add(new AssistGesturePreferenceController(context, lifecycle, KEY_ASSIST));
controllers.add(new AssistGestureSensitivityPreferenceController(context, lifecycle));
return controllers;
}
diff --git a/src/com/android/settings/gestures/DoubleTapPowerPreferenceController.java b/src/com/android/settings/gestures/DoubleTapPowerPreferenceController.java
index d38902e..ba1d0f6 100644
--- a/src/com/android/settings/gestures/DoubleTapPowerPreferenceController.java
+++ b/src/com/android/settings/gestures/DoubleTapPowerPreferenceController.java
@@ -20,18 +20,16 @@
import android.provider.Settings;
import android.support.v7.preference.Preference;
-import android.util.ArrayMap;
import com.android.settings.core.lifecycle.Lifecycle;
-import com.android.settings.search2.InlineSwitchPayload;
-import com.android.settings.search2.ResultPayload;
public class DoubleTapPowerPreferenceController extends GesturePreferenceController {
private static final String PREF_KEY_VIDEO = "gesture_double_tap_power_video";
- private static final String PREF_KEY_DOUBLE_TAP_POWER = "gesture_double_tap_power";
+ private final String mDoubleTapPowerKey;
- public DoubleTapPowerPreferenceController(Context context, Lifecycle lifecycle) {
+ public DoubleTapPowerPreferenceController(Context context, Lifecycle lifecycle, String key) {
super(context, lifecycle);
+ mDoubleTapPowerKey = key;
}
@Override
@@ -47,7 +45,7 @@
@Override
public String getPreferenceKey() {
- return PREF_KEY_DOUBLE_TAP_POWER;
+ return mDoubleTapPowerKey;
}
@Override
diff --git a/src/com/android/settings/gestures/DoubleTapPowerSettings.java b/src/com/android/settings/gestures/DoubleTapPowerSettings.java
index 467cec8..a880c32 100644
--- a/src/com/android/settings/gestures/DoubleTapPowerSettings.java
+++ b/src/com/android/settings/gestures/DoubleTapPowerSettings.java
@@ -33,6 +33,7 @@
public class DoubleTapPowerSettings extends DashboardFragment {
private static final String TAG = "DoubleTapPower";
+ private static final String KEY_DOUBLE_TAP_POWER = "gesture_double_tap_power";
@Override
public int getMetricsCategory() {
@@ -57,7 +58,8 @@
private static List<PreferenceController> buildPreferenceControllers(Context context,
Lifecycle lifecycle) {
final List<PreferenceController> controllers = new ArrayList<>();
- controllers.add(new DoubleTapPowerPreferenceController(context, lifecycle));
+ controllers.add(new DoubleTapPowerPreferenceController(context, lifecycle,
+ KEY_DOUBLE_TAP_POWER));
return controllers;
}
diff --git a/src/com/android/settings/gestures/DoubleTapScreenPreferenceController.java b/src/com/android/settings/gestures/DoubleTapScreenPreferenceController.java
index 49e8f51..5f8dfb4 100644
--- a/src/com/android/settings/gestures/DoubleTapScreenPreferenceController.java
+++ b/src/com/android/settings/gestures/DoubleTapScreenPreferenceController.java
@@ -21,26 +21,24 @@
import android.provider.Settings;
import android.support.v7.preference.Preference;
-import android.util.ArrayMap;
import com.android.internal.hardware.AmbientDisplayConfiguration;
import com.android.settings.core.lifecycle.Lifecycle;
-import com.android.settings.search2.InlineSwitchPayload;
-import com.android.settings.search2.ResultPayload;
public class DoubleTapScreenPreferenceController extends GesturePreferenceController {
private static final String PREF_KEY_VIDEO = "gesture_double_tap_screen_video";
- private static final String PREF_KEY_DOUBLE_TAP_SCREEN = "gesture_double_tap_screen";
+ private final String mDoubleTapScreenPrefKey;
private final AmbientDisplayConfiguration mAmbientConfig;
@UserIdInt
private final int mUserId;
public DoubleTapScreenPreferenceController(Context context, Lifecycle lifecycle,
- AmbientDisplayConfiguration config, @UserIdInt int userId) {
+ AmbientDisplayConfiguration config, @UserIdInt int userId, String key) {
super(context, lifecycle);
mAmbientConfig = config;
mUserId = userId;
+ mDoubleTapScreenPrefKey = key;
}
@Override
@@ -50,7 +48,7 @@
@Override
public String getPreferenceKey() {
- return PREF_KEY_DOUBLE_TAP_SCREEN;
+ return mDoubleTapScreenPrefKey;
}
@Override
diff --git a/src/com/android/settings/gestures/DoubleTapScreenSettings.java b/src/com/android/settings/gestures/DoubleTapScreenSettings.java
index 887ac80..0804e7b 100644
--- a/src/com/android/settings/gestures/DoubleTapScreenSettings.java
+++ b/src/com/android/settings/gestures/DoubleTapScreenSettings.java
@@ -35,6 +35,7 @@
public class DoubleTapScreenSettings extends DashboardFragment {
private static final String TAG = "DoubleTapScreen";
+ private static final String KEY_DOUBLE_TAP_SCREEN = "gesture_double_tap_screen";
@Override
public int getMetricsCategory() {
@@ -60,7 +61,8 @@
Lifecycle lifecycle) {
final List<PreferenceController> controllers = new ArrayList<>();
controllers.add(new DoubleTapScreenPreferenceController(context, lifecycle,
- new AmbientDisplayConfiguration(context), UserHandle.myUserId()));
+ new AmbientDisplayConfiguration(context), UserHandle.myUserId(),
+ KEY_DOUBLE_TAP_SCREEN));
return controllers;
}
diff --git a/src/com/android/settings/gestures/DoubleTwistGestureSettings.java b/src/com/android/settings/gestures/DoubleTwistGestureSettings.java
index 46a8cbb..cf5cfab 100644
--- a/src/com/android/settings/gestures/DoubleTwistGestureSettings.java
+++ b/src/com/android/settings/gestures/DoubleTwistGestureSettings.java
@@ -33,6 +33,7 @@
public class DoubleTwistGestureSettings extends DashboardFragment {
private static final String TAG = "DoubleTwistGesture";
+ private static final String KEY_DOUBLE_TWIST = "gesture_double_twist";
@Override
public int getMetricsCategory() {
@@ -57,7 +58,7 @@
private static List<PreferenceController> buildPreferenceControllers(Context context,
Lifecycle lifecycle) {
final List<PreferenceController> controllers = new ArrayList<>();
- controllers.add(new DoubleTwistPreferenceController(context, lifecycle));
+ controllers.add(new DoubleTwistPreferenceController(context, lifecycle, KEY_DOUBLE_TWIST));
return controllers;
}
diff --git a/src/com/android/settings/gestures/DoubleTwistPreferenceController.java b/src/com/android/settings/gestures/DoubleTwistPreferenceController.java
index c5174fd..f1c7455 100644
--- a/src/com/android/settings/gestures/DoubleTwistPreferenceController.java
+++ b/src/com/android/settings/gestures/DoubleTwistPreferenceController.java
@@ -24,19 +24,17 @@
import android.support.v7.preference.Preference;
import android.text.TextUtils;
-import android.util.ArrayMap;
import com.android.settings.R;
import com.android.settings.core.lifecycle.Lifecycle;
-import com.android.settings.search2.InlineSwitchPayload;
-import com.android.settings.search2.ResultPayload;
public class DoubleTwistPreferenceController extends GesturePreferenceController {
private static final String PREF_KEY_VIDEO = "gesture_double_twist_video";
- private static final String PREF_KEY_DOUBLE_TWIST = "gesture_double_twist";
+ private final String mDoubleTwistPrefKey;
- public DoubleTwistPreferenceController(Context context, Lifecycle lifecycle) {
+ public DoubleTwistPreferenceController(Context context, Lifecycle lifecycle, String key) {
super(context, lifecycle);
+ mDoubleTwistPrefKey = key;
}
@Override
@@ -52,7 +50,7 @@
@Override
public String getPreferenceKey() {
- return PREF_KEY_DOUBLE_TWIST;
+ return mDoubleTwistPrefKey;
}
@Override
diff --git a/src/com/android/settings/gestures/PickupGesturePreferenceController.java b/src/com/android/settings/gestures/PickupGesturePreferenceController.java
index ce20f15..c0e6009 100644
--- a/src/com/android/settings/gestures/PickupGesturePreferenceController.java
+++ b/src/com/android/settings/gestures/PickupGesturePreferenceController.java
@@ -21,26 +21,24 @@
import android.provider.Settings;
import android.support.v7.preference.Preference;
-import android.util.ArrayMap;
import com.android.internal.hardware.AmbientDisplayConfiguration;
import com.android.settings.core.lifecycle.Lifecycle;
-import com.android.settings.search2.InlineSwitchPayload;
-import com.android.settings.search2.ResultPayload;
public class PickupGesturePreferenceController extends GesturePreferenceController {
private static final String PREF_VIDEO_KEY = "gesture_pick_up_video";
- private static final String PREF_KEY_PICK_UP = "gesture_pick_up";
+ private final String mPickUpPrefKey;
private final AmbientDisplayConfiguration mAmbientConfig;
@UserIdInt
private final int mUserId;
public PickupGesturePreferenceController(Context context, Lifecycle lifecycle,
- AmbientDisplayConfiguration config, @UserIdInt int userId) {
+ AmbientDisplayConfiguration config, @UserIdInt int userId, String key) {
super(context, lifecycle);
mAmbientConfig = config;
mUserId = userId;
+ mPickUpPrefKey = key;
}
@Override
@@ -60,7 +58,7 @@
@Override
public String getPreferenceKey() {
- return PREF_KEY_PICK_UP;
+ return mPickUpPrefKey;
}
@Override
diff --git a/src/com/android/settings/gestures/PickupGestureSettings.java b/src/com/android/settings/gestures/PickupGestureSettings.java
index 0fe6097..874f690 100644
--- a/src/com/android/settings/gestures/PickupGestureSettings.java
+++ b/src/com/android/settings/gestures/PickupGestureSettings.java
@@ -35,6 +35,7 @@
public class PickupGestureSettings extends DashboardFragment {
private static final String TAG = "PickupGestureSettings";
+ private static final String KEY_PICK_UP = "gesture_pick_up";
@Override
public int getMetricsCategory() {
@@ -60,7 +61,7 @@
Lifecycle lifecycle) {
final List<PreferenceController> controllers = new ArrayList<>();
controllers.add(new PickupGesturePreferenceController(context, lifecycle,
- new AmbientDisplayConfiguration(context), UserHandle.myUserId()));
+ new AmbientDisplayConfiguration(context), UserHandle.myUserId(), KEY_PICK_UP));
return controllers;
}
diff --git a/src/com/android/settings/gestures/SwipeToNotificationPreferenceController.java b/src/com/android/settings/gestures/SwipeToNotificationPreferenceController.java
index 22b88fc..2a62674 100644
--- a/src/com/android/settings/gestures/SwipeToNotificationPreferenceController.java
+++ b/src/com/android/settings/gestures/SwipeToNotificationPreferenceController.java
@@ -20,23 +20,22 @@
import android.provider.Settings;
import android.support.v7.preference.Preference;
-import android.util.ArrayMap;
import com.android.settings.core.lifecycle.Lifecycle;
-import com.android.settings.search2.InlineSwitchPayload;
-import com.android.settings.search2.ResultPayload;
public class SwipeToNotificationPreferenceController extends GesturePreferenceController {
private static final String PREF_KEY_VIDEO = "gesture_swipe_down_fingerprint_video";
- private static final String PREF_KEY_SWIPE_DOWN_FINGERPRINT = "gesture_swipe_down_fingerprint";
+ private final String mSwipeDownFingerPrefKey;
- public SwipeToNotificationPreferenceController(Context context, Lifecycle lifecycle) {
+ public SwipeToNotificationPreferenceController(Context context, Lifecycle lifecycle,
+ String key) {
super(context, lifecycle);
+ mSwipeDownFingerPrefKey = key;
}
@Override
public String getPreferenceKey() {
- return PREF_KEY_SWIPE_DOWN_FINGERPRINT;
+ return mSwipeDownFingerPrefKey;
}
@Override
diff --git a/src/com/android/settings/gestures/SwipeToNotificationSettings.java b/src/com/android/settings/gestures/SwipeToNotificationSettings.java
index 6c136c2..f19565a 100644
--- a/src/com/android/settings/gestures/SwipeToNotificationSettings.java
+++ b/src/com/android/settings/gestures/SwipeToNotificationSettings.java
@@ -34,6 +34,8 @@
private static final String TAG = "SwipeToNotifSettings";
+ private static final String KEY = "gesture_swipe_down_fingerprint";
+
@Override
public int getMetricsCategory() {
return MetricsProto.MetricsEvent.SETTINGS_GESTURE_SWIPE_TO_NOTIFICATION;
@@ -57,7 +59,7 @@
private static List<PreferenceController> buildPreferenceControllers(Context context,
Lifecycle lifecycle) {
final List<PreferenceController> controllers = new ArrayList<>();
- controllers.add(new SwipeToNotificationPreferenceController(context, lifecycle));
+ controllers.add(new SwipeToNotificationPreferenceController(context, lifecycle, KEY));
return controllers;
}
diff --git a/src/com/android/settings/language/LanguageAndInputSettings.java b/src/com/android/settings/language/LanguageAndInputSettings.java
index 1999970..1c4d642 100644
--- a/src/com/android/settings/language/LanguageAndInputSettings.java
+++ b/src/com/android/settings/language/LanguageAndInputSettings.java
@@ -58,6 +58,14 @@
private static final String TAG = "LangAndInputSettings";
+ private static final String KEY_TEXT_TO_SPEECH = "tts_settings_summary";
+ private static final String KEY_ASSIST = "gesture_assist_input_summary";
+ private static final String KEY_SWIPE_DOWN = "gesture_swipe_down_fingerprint_input_summary";
+ private static final String KEY_DOUBLE_TAP_POWER = "gesture_double_tap_power_input_summary";
+ private static final String KEY_DOUBLE_TWIST = "gesture_double_twist_input_summary";
+ private static final String KEY_DOUBLE_TAP_SCREEN = "gesture_double_tap_screen_input_summary";
+ private static final String KEY_PICK_UP = "gesture_pick_up_input_summary";
+
private AmbientDisplayConfiguration mAmbientDisplayConfig;
@Override
@@ -110,14 +118,16 @@
controllers.add(gameControllerPreferenceController);
// Gestures
- controllers.add(new AssistGesturePreferenceController(context, lifecycle));
- controllers.add(new SwipeToNotificationPreferenceController(context, lifecycle));
- controllers.add(new DoubleTwistPreferenceController(context, lifecycle));
- controllers.add(new DoubleTapPowerPreferenceController(context, lifecycle));
- controllers.add(new PickupGesturePreferenceController(
- context, lifecycle, ambientDisplayConfiguration, UserHandle.myUserId()));
- controllers.add(new DoubleTapScreenPreferenceController(
- context, lifecycle, ambientDisplayConfiguration, UserHandle.myUserId()));
+ controllers.add(new AssistGesturePreferenceController(context, lifecycle, KEY_ASSIST));
+ controllers.add(new SwipeToNotificationPreferenceController(context, lifecycle,
+ KEY_SWIPE_DOWN));
+ controllers.add(new DoubleTwistPreferenceController(context, lifecycle, KEY_DOUBLE_TWIST));
+ controllers.add(new DoubleTapPowerPreferenceController(context, lifecycle,
+ KEY_DOUBLE_TAP_POWER));
+ controllers.add(new PickupGesturePreferenceController(context, lifecycle,
+ ambientDisplayConfiguration, UserHandle.myUserId(), KEY_PICK_UP));
+ controllers.add(new DoubleTapScreenPreferenceController(context, lifecycle,
+ ambientDisplayConfiguration, UserHandle.myUserId(), KEY_DOUBLE_TAP_SCREEN));
controllers.add(new DefaultAutofillPreferenceController(context));
return controllers;
}
@@ -179,5 +189,20 @@
return buildPreferenceControllers(context, null,
new AmbientDisplayConfiguration(context));
}
+
+ @Override
+ public List<String> getNonIndexableKeys(Context context) {
+ List<String> keys = super.getNonIndexableKeys(context);
+ // Duplicates in summary and details pages.
+ keys.add(KEY_TEXT_TO_SPEECH);
+ keys.add(KEY_ASSIST);
+ keys.add(KEY_SWIPE_DOWN);
+ keys.add(KEY_DOUBLE_TAP_POWER);
+ keys.add(KEY_DOUBLE_TWIST);
+ keys.add(KEY_DOUBLE_TAP_SCREEN);
+ keys.add(KEY_PICK_UP);
+
+ return keys;
+ }
};
}
diff --git a/src/com/android/settings/language/TtsPreferenceController.java b/src/com/android/settings/language/TtsPreferenceController.java
index 0d1c753..a734e4b 100644
--- a/src/com/android/settings/language/TtsPreferenceController.java
+++ b/src/com/android/settings/language/TtsPreferenceController.java
@@ -23,7 +23,8 @@
public class TtsPreferenceController extends PreferenceController {
- private static final String KEY_TTS_SETTINGS = "tts_settings";
+ private static final String KEY_VOICE_CATEGORY = "voice_category";
+ private static final String KEY_TTS_SETTINGS = "tts_settings_summary";
private final TtsEngines mTtsEngines;
diff --git a/src/com/android/settings/notification/ConfigureNotificationSettings.java b/src/com/android/settings/notification/ConfigureNotificationSettings.java
index a1c5263..d9da051 100644
--- a/src/com/android/settings/notification/ConfigureNotificationSettings.java
+++ b/src/com/android/settings/notification/ConfigureNotificationSettings.java
@@ -35,6 +35,8 @@
public class ConfigureNotificationSettings extends DashboardFragment {
private static final String TAG = "ConfigNotiSettings";
+ private static final String KEY_SWIPE_DOWN = "gesture_swipe_down_fingerprint_notifications";
+
@Override
public int getMetricsCategory() {
return MetricsEvent.CONFIGURE_NOTIFICATION;
@@ -68,7 +70,8 @@
lifecycle.addObserver(pulseController);
lifecycle.addObserver(lockScreenNotificationController);
}
- controllers.add(new SwipeToNotificationPreferenceController(context, lifecycle));
+ controllers.add(new SwipeToNotificationPreferenceController(context, lifecycle,
+ KEY_SWIPE_DOWN));
controllers.add(badgeController);
controllers.add(pulseController);
controllers.add(lockScreenNotificationController);
diff --git a/src/com/android/settings/notification/SettingPref.java b/src/com/android/settings/notification/SettingPref.java
index cdbd5b3..18efc33 100644
--- a/src/com/android/settings/notification/SettingPref.java
+++ b/src/com/android/settings/notification/SettingPref.java
@@ -121,19 +121,6 @@
if (mTwoState != null) {
mTwoState.setChecked(val != 0);
} else if (mDropDown != null) {
- if (mValues != null) {
- int index = 0;
- for (int len = mValues.length; index < len; index++) {
- if (mValues[index] == val) {
- break;
- }
- }
-
- if (index < mValues.length) {
- CharSequence entry = mDropDown.getEntries()[index];
- mDropDown.setSummary(entry);
- }
- }
mDropDown.setValue(Integer.toString(val));
}
}
diff --git a/src/com/android/settings/notification/SoundSettings.java b/src/com/android/settings/notification/SoundSettings.java
index a92c5dd..ec7351a 100644
--- a/src/com/android/settings/notification/SoundSettings.java
+++ b/src/com/android/settings/notification/SoundSettings.java
@@ -43,6 +43,7 @@
public class SoundSettings extends DashboardFragment {
private static final String TAG = "SoundSettings";
+ private static final String KEY_CELL_BROADCAST_SETTINGS = "cell_broadcast_settings";
private static final String SELECTED_PREFERENCE_KEY = "selected_preference";
private static final int REQUEST_CODE = 200;
@@ -187,7 +188,7 @@
final List<PreferenceController> controllers = new ArrayList<>();
controllers.add(new ZenModePreferenceController(context));
controllers.add(new EmergencyBroadcastPreferenceController(
- context, "cell_broadcast_settings"));
+ context, KEY_CELL_BROADCAST_SETTINGS));
controllers.add(new VibrateWhenRingPreferenceController(context));
// === Volumes ===
@@ -236,6 +237,16 @@
return buildPreferenceControllers(context, null /* fragment */,
null /* callback */, null /* lifecycle */);
}
+
+ @Override
+ public List<String> getNonIndexableKeys(Context context) {
+ List<String> keys = super.getNonIndexableKeys(context);
+ // Duplicate results
+ keys.add((new ZenModePreferenceController(context)).getPreferenceKey());
+ keys.add(ZenModeSettings.KEY_VISUAL_SETTINGS);
+ keys.add(KEY_CELL_BROADCAST_SETTINGS);
+ return keys;
+ }
};
// === Work Sound Settings ===
diff --git a/src/com/android/settings/notification/ZenModeSettings.java b/src/com/android/settings/notification/ZenModeSettings.java
index bbcaa9c..854857a 100644
--- a/src/com/android/settings/notification/ZenModeSettings.java
+++ b/src/com/android/settings/notification/ZenModeSettings.java
@@ -53,8 +53,10 @@
import java.util.Map.Entry;
public class ZenModeSettings extends ZenModeSettingsBase {
+
+ public static final String KEY_VISUAL_SETTINGS = "visual_interruptions_settings";
+
private static final String KEY_PRIORITY_SETTINGS = "priority_settings";
- private static final String KEY_VISUAL_SETTINGS = "visual_interruptions_settings";
private static final String KEY_AUTOMATIC_RULES = "automatic_rules";
static final ManagedServiceSettings.Config CONFIG = getConditionProviderConfig();
diff --git a/src/com/android/settings/search/BaseSearchIndexProvider.java b/src/com/android/settings/search/BaseSearchIndexProvider.java
index 8732227..f5e06ca 100644
--- a/src/com/android/settings/search/BaseSearchIndexProvider.java
+++ b/src/com/android/settings/search/BaseSearchIndexProvider.java
@@ -72,7 +72,7 @@
}
return nonIndexableKeys;
} else {
- return EMPTY_LIST;
+ return new ArrayList<>();
}
}
diff --git a/src/com/android/settings/system/SystemDashboardFragment.java b/src/com/android/settings/system/SystemDashboardFragment.java
index 4c4ed21..1a5a182 100644
--- a/src/com/android/settings/system/SystemDashboardFragment.java
+++ b/src/com/android/settings/system/SystemDashboardFragment.java
@@ -37,6 +37,8 @@
private static final String TAG = "SystemDashboardFrag";
+ private static final String KEY_RESET = "reset_dashboard";
+
@Override
public int getMetricsCategory() {
return MetricsProto.MetricsEvent.SETTINGS_SYSTEM_CATEGORY;
@@ -82,5 +84,14 @@
public List<PreferenceController> getPreferenceControllers(Context context) {
return buildPreferenceControllers(context);
}
+
+ @Override
+ public List<String> getNonIndexableKeys(Context context) {
+ List<String> keys = super.getNonIndexableKeys(context);
+ keys.add((new BackupSettingsActivityPreferenceController(context)
+ .getPreferenceKey()));
+ keys.add(KEY_RESET);
+ return keys;
+ }
};
}
diff --git a/src/com/android/settings/wifi/details/WifiDetailPreferenceController.java b/src/com/android/settings/wifi/details/WifiDetailPreferenceController.java
index dd1e4a4..a5d922d 100644
--- a/src/com/android/settings/wifi/details/WifiDetailPreferenceController.java
+++ b/src/com/android/settings/wifi/details/WifiDetailPreferenceController.java
@@ -225,7 +225,7 @@
mButtonsPref = (LayoutPreference) screen.findPreference(KEY_BUTTONS_PREF);
mSignInButton = (Button) mButtonsPref.findViewById(R.id.right_button);
- mSignInButton.setText(com.android.internal.R.string.network_available_sign_in);
+ mSignInButton.setText(R.string.support_sign_in_button_text);
mSignInButton.setOnClickListener(
view -> mConnectivityManagerWrapper.startCaptivePortalApp(mNetwork));
diff --git a/tests/robotests/assets/whitelist_duplicate_index_key b/tests/robotests/assets/whitelist_duplicate_index_key
index 5b5153c..6ced706 100644
--- a/tests/robotests/assets/whitelist_duplicate_index_key
+++ b/tests/robotests/assets/whitelist_duplicate_index_key
@@ -1,12 +1,6 @@
add_users_when_locked
additional_system_update_settings
dashboard_tile_placeholder
-gesture_assist
-gesture_double_tap_power
-gesture_double_tap_screen
-gesture_double_twist
-gesture_pick_up
-gesture_swipe_down_fingerprint
lock_screen_notifications
screen_zoom
usage_access
\ No newline at end of file
diff --git a/tests/robotests/src/android/bluetooth/BluetoothCodecConfig.java b/tests/robotests/src/android/bluetooth/BluetoothCodecConfig.java
new file mode 100644
index 0000000..40b76df
--- /dev/null
+++ b/tests/robotests/src/android/bluetooth/BluetoothCodecConfig.java
@@ -0,0 +1,23 @@
+/*
+ * 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 android.bluetooth;
+
+/**
+ * A placeholder class to prevent ClassNotFound exceptions caused by lack of visibility.
+ */
+public class BluetoothCodecConfig {
+}
diff --git a/tests/robotests/src/com/android/settings/DeviceInfoSettingsTest.java b/tests/robotests/src/com/android/settings/DeviceInfoSettingsTest.java
index c43ad3c..c64e582 100644
--- a/tests/robotests/src/com/android/settings/DeviceInfoSettingsTest.java
+++ b/tests/robotests/src/com/android/settings/DeviceInfoSettingsTest.java
@@ -28,6 +28,8 @@
import android.support.v7.preference.PreferenceScreen;
import com.android.settings.dashboard.SummaryLoader;
+import com.android.settings.testutils.XmlTestUtils;
+import com.android.settings.testutils.shadow.ShadowUtils;
import com.android.settingslib.DeviceInfoUtils;
import org.junit.Before;
@@ -36,8 +38,11 @@
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 DeviceInfoSettingsTest {
@@ -75,4 +80,17 @@
verify(mSummaryLoader).setSummary(mProvider, Build.MODEL + DeviceInfoUtils.getMsvSuffix());
}
+
+ @Test
+ @Config(shadows = ShadowUtils.class)
+ public void testNonIndexableKeys_existInXmlLayout() {
+ final Context context = RuntimeEnvironment.application;
+ final List<String> niks = DeviceInfoSettings.SEARCH_INDEX_DATA_PROVIDER
+ .getNonIndexableKeys(context);
+ final int xmlId = (new DeviceInfoSettings()).getPreferenceScreenResId();
+
+ final List<String> keys = XmlTestUtils.getKeysFromPreferenceXml(context, xmlId);
+
+ assertThat(keys).containsAllIn(niks);
+ }
}
diff --git a/tests/robotests/src/com/android/settings/DisplaySettingsTest.java b/tests/robotests/src/com/android/settings/DisplaySettingsTest.java
new file mode 100644
index 0000000..f0c87cf
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/DisplaySettingsTest.java
@@ -0,0 +1,36 @@
+package com.android.settings;
+
+import android.content.Context;
+import com.android.settings.core.PreferenceController;
+import com.android.settings.testutils.XmlTestUtils;
+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;
+
+import static com.google.common.truth.Truth.assertThat;
+
+@RunWith(SettingsRobolectricTestRunner.class)
+@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
+public class DisplaySettingsTest {
+
+ @Test
+ public void testPreferenceControllers_getPreferenceKeys_existInPreferenceScreen() {
+ final Context context = RuntimeEnvironment.application;
+ final DisplaySettings fragment = new DisplaySettings();
+ final List<String> preferenceScreenKeys = XmlTestUtils.getKeysFromPreferenceXml(context,
+ fragment.getPreferenceScreenResId());
+ final List<String> preferenceKeys = new ArrayList<>();
+
+ for (PreferenceController controller : fragment.getPreferenceControllers(context)) {
+ preferenceKeys.add(controller.getPreferenceKey());
+ }
+ // Nightmode is currently hidden
+ preferenceKeys.remove("night_mode");
+
+ assertThat(preferenceScreenKeys).containsAllIn(preferenceKeys);
+ }
+}
diff --git a/tests/robotests/src/com/android/settings/LegalSettingsTest.java b/tests/robotests/src/com/android/settings/LegalSettingsTest.java
new file mode 100644
index 0000000..6cfe211
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/LegalSettingsTest.java
@@ -0,0 +1,46 @@
+/*
+ * 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;
+
+import android.content.Context;
+
+import com.android.settings.testutils.XmlTestUtils;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
+
+import java.util.List;
+
+import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.Mockito.spy;
+
+@RunWith(SettingsRobolectricTestRunner.class)
+@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
+public class LegalSettingsTest {
+
+ @Test
+ public void testNonIndexableKeys_existInXmlLayout() {
+ final Context context = RuntimeEnvironment.application;
+ final List<String> niks = LegalSettings.SEARCH_INDEX_DATA_PROVIDER
+ .getNonIndexableKeys(context);
+
+ final List<String> keys = XmlTestUtils.getKeysFromPreferenceXml(context,
+ R.xml.about_legal);
+
+ assertThat(keys).containsAllIn(niks);
+ }
+}
\ No newline at end of file
diff --git a/tests/robotests/src/com/android/settings/accounts/AccountPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/accounts/AccountPreferenceControllerTest.java
index 8453da5..66f5549 100644
--- a/tests/robotests/src/com/android/settings/accounts/AccountPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/accounts/AccountPreferenceControllerTest.java
@@ -26,8 +26,8 @@
import android.support.v7.preference.PreferenceGroup;
import android.support.v7.preference.PreferenceManager;
import android.support.v7.preference.PreferenceScreen;
-
import android.text.TextUtils;
+
import com.android.settings.AccessiblePreferenceCategory;
import com.android.settings.R;
import com.android.settings.SettingsPreferenceFragment;
@@ -92,7 +92,7 @@
when(mFragment.getPreferenceScreen()).thenReturn(mScreen);
when(mFragment.getPreferenceManager().getContext()).thenReturn(mContext);
when(mAccountManager.getAuthenticatorTypesAsUser(anyInt())).thenReturn(
- new AuthenticatorDescription[0]);
+ new AuthenticatorDescription[0]);
when(mAccountManager.getAccountsAsUser(anyInt())).thenReturn(new Account[0]);
mController = new AccountPreferenceController(mContext, mFragment, null, mAccountHelper);
}
@@ -367,6 +367,51 @@
@Test
@Config(shadows = {ShadowAccountManager.class, ShadowContentResolver.class})
+ public void onResume_twoAccountsOfSameName_shouldAddFivePreferences() {
+ final List<UserInfo> infos = new ArrayList<>();
+ infos.add(new UserInfo(1, "user 1", 0));
+ when(mUserManager.isManagedProfile()).thenReturn(false);
+ when(mUserManager.isLinkedUser()).thenReturn(false);
+ when(mUserManager.getProfiles(anyInt())).thenReturn(infos);
+
+ final Account[] accountType1 = new Account[2];
+ accountType1[0] = new Account("Account1", "com.acct1");
+ accountType1[1] = new Account("Account2", "com.acct1");
+ final Account[] accountType2 = new Account[2];
+ accountType2[0] = new Account("Account1", "com.acct2");
+ accountType2[1] = new Account("Account2", "com.acct2");
+ final Account[] allAccounts = new Account[4];
+ allAccounts[0] = accountType1[0];
+ allAccounts[1] = accountType1[1];
+ allAccounts[2] = accountType2[0];
+ allAccounts[3] = accountType2[1];
+ final AuthenticatorDescription[] authDescs = {
+ new AuthenticatorDescription("com.acct1", "com.android.settings",
+ R.string.account_settings_title, 0, 0, 0, false),
+ new AuthenticatorDescription("com.acct2", "com.android.settings",
+ R.string.account_settings_title, 0, 0, 0, false)
+ };
+
+ when(mAccountManager.getAccountsAsUser(anyInt())).thenReturn(allAccounts);
+ when(mAccountManager.getAccountsByTypeAsUser(eq("com.acct1"), any(UserHandle.class)))
+ .thenReturn(accountType1);
+ when(mAccountManager.getAccountsByTypeAsUser(eq("com.acct2"), any(UserHandle.class)))
+ .thenReturn(accountType2);
+ when(mAccountManager.getAuthenticatorTypesAsUser(anyInt())).thenReturn(authDescs);
+
+ AccessiblePreferenceCategory preferenceGroup = mock(AccessiblePreferenceCategory.class);
+ when(preferenceGroup.getPreferenceManager()).thenReturn(mock(PreferenceManager.class));
+ when(mAccountHelper.createAccessiblePreferenceCategory(any(Context.class))).thenReturn(
+ preferenceGroup);
+
+ mController.onResume();
+
+ // should add 4 individual account and the Add account preference
+ verify(preferenceGroup, times(5)).addPreference(any(Preference.class));
+ }
+
+ @Test
+ @Config(shadows = {ShadowAccountManager.class, ShadowContentResolver.class})
public void onResume_noAccountChange_shouldNotAddAccountPreference() {
final List<UserInfo> infos = new ArrayList<>();
infos.add(new UserInfo(1, "user 1", 0));
diff --git a/tests/robotests/src/com/android/settings/applications/AdvancedAppSettingsTest.java b/tests/robotests/src/com/android/settings/applications/AdvancedAppSettingsTest.java
index bedb0a5..0c3c160 100644
--- a/tests/robotests/src/com/android/settings/applications/AdvancedAppSettingsTest.java
+++ b/tests/robotests/src/com/android/settings/applications/AdvancedAppSettingsTest.java
@@ -26,6 +26,7 @@
import com.android.settings.applications.defaultapps.DefaultPhonePreferenceController;
import com.android.settings.applications.defaultapps.DefaultSmsPreferenceController;
import com.android.settings.dashboard.SummaryLoader;
+import com.android.settings.testutils.XmlTestUtils;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -34,11 +35,14 @@
import org.robolectric.annotation.Config;
import org.robolectric.util.ReflectionHelpers;
+import java.util.List;
+
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Matchers.anyString;
import static org.mockito.Matchers.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;
@@ -136,4 +140,16 @@
}
+
+ @Test
+ public void testNonIndexableKeys_existInXmlLayout() {
+ final Context context = spy(RuntimeEnvironment.application);
+ final List<String> niks = AdvancedAppSettings.SEARCH_INDEX_DATA_PROVIDER
+ .getNonIndexableKeys(context);
+ final int xmlId = (new AdvancedAppSettings()).getPreferenceScreenResId();
+
+ final List<String> keys = XmlTestUtils.getKeysFromPreferenceXml(context, xmlId);
+
+ assertThat(keys).containsAllIn(niks);
+ }
}
diff --git a/tests/robotests/src/com/android/settings/bluetooth/DeviceProfilesSettingsTest.java b/tests/robotests/src/com/android/settings/bluetooth/DeviceProfilesSettingsTest.java
new file mode 100644
index 0000000..c61823c
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/bluetooth/DeviceProfilesSettingsTest.java
@@ -0,0 +1,206 @@
+/*
+ * 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.bluetooth;
+
+import android.app.Activity;
+import android.content.Context;
+import android.os.Bundle;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.CheckBox;
+
+import com.android.settings.SettingsRobolectricTestRunner;
+import com.android.settings.TestConfig;
+import com.android.settings.testutils.shadow.ShadowEventLogWriter;
+import com.android.settingslib.R;
+import com.android.settingslib.bluetooth.A2dpProfile;
+import com.android.settingslib.bluetooth.CachedBluetoothDevice;
+import com.android.settingslib.bluetooth.CachedBluetoothDeviceManager;
+import com.android.settingslib.bluetooth.LocalBluetoothAdapter;
+import com.android.settingslib.bluetooth.LocalBluetoothManager;
+import com.android.settingslib.bluetooth.LocalBluetoothProfile;
+import com.android.settingslib.bluetooth.LocalBluetoothProfileManager;
+
+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.FragmentTestUtil;
+import org.robolectric.util.ReflectionHelpers;
+import org.robolectric.RuntimeEnvironment;
+
+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.when;
+import static org.mockito.Mockito.verify;
+
+import java.util.ArrayList;
+
+
+@RunWith(SettingsRobolectricTestRunner.class)
+@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION, shadows = {
+ ShadowEventLogWriter.class
+})
+public class DeviceProfilesSettingsTest {
+ Context mContext;
+ @Mock Activity mActivity;
+ @Mock LocalBluetoothManager mManager;
+ @Mock LocalBluetoothAdapter mAdapter;
+ @Mock LocalBluetoothProfileManager mProfileManager;
+ @Mock CachedBluetoothDeviceManager mDeviceManager;
+ @Mock CachedBluetoothDevice mCachedDevice;
+ @Mock A2dpProfile mProfile;
+
+ ArrayList<LocalBluetoothProfile> mProfiles;
+ DeviceProfilesSettings mFragment;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ mContext = RuntimeEnvironment.application;
+
+ when(mProfile.getNameResource(any())).thenReturn(R.string.bluetooth_profile_a2dp);
+ mProfiles = new ArrayList<>();
+ mProfiles.add(mProfile);
+ when(mCachedDevice.getConnectableProfiles()).thenReturn(mProfiles);
+
+ mFragment = new DeviceProfilesSettings();
+ mFragment.setArguments(new Bundle());
+
+ ReflectionHelpers.setStaticField(LocalBluetoothManager.class, "sInstance", mManager);
+ when(mManager.getCachedDeviceManager()).thenReturn(mDeviceManager);
+ when(mManager.getBluetoothAdapter()).thenReturn(mAdapter);
+ when(mManager.getProfileManager()).thenReturn(mProfileManager);
+ when(mProfileManager.getMapProfile()).thenReturn(null);
+ when(mDeviceManager.findDevice(any())).thenReturn(mCachedDevice);
+ }
+
+ @Test
+ public void deviceHasHighQualityAudio() {
+ when(mProfile.supportsHighQualityAudio(any())).thenReturn(true);
+ when(mProfile.isHighQualityAudioEnabled(any())).thenReturn(true);
+ when(mProfile.isPreferred(any())).thenReturn(true);
+ FragmentTestUtil.startFragment(mFragment);
+
+ ViewGroup profilesGroup = mFragment.getDialog().findViewById(R.id.profiles_section);
+ CheckBox box = (CheckBox) profilesGroup.findViewWithTag(
+ DeviceProfilesSettings.HIGH_QUALITY_AUDIO_PREF_TAG);
+ assertThat(box).isNotNull();
+ assertThat(box.getVisibility()).isEqualTo(View.VISIBLE);
+ assertThat(box.isEnabled()).isTrue();
+ assertThat(box.isChecked()).isTrue();
+
+ box.performClick();
+ verify(mProfile).setHighQualityAudioEnabled(any(), eq(false));
+ box.performClick();
+ verify(mProfile).setHighQualityAudioEnabled(any(), eq(true));
+ }
+
+ @Test
+ public void busyDeviceDisablesControl() {
+ when(mProfile.supportsHighQualityAudio(any())).thenReturn(true);
+ when(mProfile.isHighQualityAudioEnabled(any())).thenReturn(true);
+ when(mProfile.isPreferred(any())).thenReturn(true);
+ when(mCachedDevice.isBusy()).thenReturn(true);
+ FragmentTestUtil.startFragment(mFragment);
+
+ // Make sure that the high quality audio option is present but disabled when the device
+ // is busy.
+ ViewGroup profilesGroup = mFragment.getDialog().findViewById(R.id.profiles_section);
+ CheckBox box = (CheckBox) profilesGroup.findViewWithTag(
+ DeviceProfilesSettings.HIGH_QUALITY_AUDIO_PREF_TAG);
+ assertThat(box).isNotNull();
+ assertThat(box.getVisibility()).isEqualTo(View.VISIBLE);
+ assertThat(box.isEnabled()).isFalse();
+ }
+
+ @Test
+ public void mediaAudioGetsDisabledAndReEnabled() {
+ when(mProfile.supportsHighQualityAudio(any())).thenReturn(true);
+ when(mProfile.isHighQualityAudioEnabled(any())).thenReturn(true);
+ when(mProfile.isPreferred(any())).thenReturn(true);
+ FragmentTestUtil.startFragment(mFragment);
+
+ ViewGroup profilesGroup = mFragment.getDialog().findViewById(R.id.profiles_section);
+ CheckBox audioBox = profilesGroup.findViewWithTag(mProfile.toString());
+ CheckBox highQualityAudioBox = profilesGroup.findViewWithTag(
+ DeviceProfilesSettings.HIGH_QUALITY_AUDIO_PREF_TAG);
+ assertThat(audioBox).isNotNull();
+ assertThat(audioBox.isChecked()).isTrue();
+ assertThat(highQualityAudioBox).isNotNull();
+ assertThat(highQualityAudioBox.isChecked()).isTrue();
+
+ // Disabling media audio should cause the high quality audio box to disappear.
+ when(mProfile.isPreferred(any())).thenReturn(false);
+ mFragment.onDeviceAttributesChanged();
+ audioBox = profilesGroup.findViewWithTag(mProfile.toString());
+ highQualityAudioBox = profilesGroup.findViewWithTag(
+ DeviceProfilesSettings.HIGH_QUALITY_AUDIO_PREF_TAG);
+ assertThat(audioBox).isNotNull();
+ assertThat(audioBox.isChecked()).isFalse();
+ assertThat(highQualityAudioBox).isNotNull();
+ assertThat(highQualityAudioBox.getVisibility()).isEqualTo(View.GONE);
+
+ // And re-enabling media audio should make it reappear.
+ when(mProfile.isPreferred(any())).thenReturn(true);
+ mFragment.onDeviceAttributesChanged();
+ audioBox = profilesGroup.findViewWithTag(mProfile.toString());
+ highQualityAudioBox = profilesGroup.findViewWithTag(
+ DeviceProfilesSettings.HIGH_QUALITY_AUDIO_PREF_TAG);
+ assertThat(audioBox).isNotNull();
+ assertThat(audioBox.isChecked()).isTrue();
+ assertThat(highQualityAudioBox).isNotNull();
+ assertThat(highQualityAudioBox.isChecked()).isTrue();
+ }
+
+ @Test
+ public void mediaAudioStartsDisabled() {
+ when(mProfile.supportsHighQualityAudio(any())).thenReturn(true);
+ when(mProfile.isHighQualityAudioEnabled(any())).thenReturn(true);
+ when(mProfile.isPreferred(any())).thenReturn(false);
+
+ FragmentTestUtil.startFragment(mFragment);
+ ViewGroup profilesGroup = mFragment.getDialog().findViewById(R.id.profiles_section);
+ CheckBox audioBox = profilesGroup.findViewWithTag(mProfile.toString());
+ CheckBox highQualityAudioBox = profilesGroup.findViewWithTag(
+ DeviceProfilesSettings.HIGH_QUALITY_AUDIO_PREF_TAG);
+
+ assertThat(audioBox).isNotNull();
+ assertThat(audioBox.isChecked()).isFalse();
+ assertThat(highQualityAudioBox).isNotNull();
+ assertThat(highQualityAudioBox.getVisibility()).isEqualTo(View.GONE);
+ }
+
+ @Test
+ public void deviceDoesntHaveHighQualityAudio() {
+ when(mProfile.supportsHighQualityAudio(any())).thenReturn(false);
+ when(mProfile.isPreferred(any())).thenReturn(true);
+ FragmentTestUtil.startFragment(mFragment);
+
+ // A device that doesn't support high quality audio shouldn't have the checkbox for
+ // high quality audio support.
+ ViewGroup profilesGroup = mFragment.getDialog().findViewById(R.id.profiles_section);
+ CheckBox box = (CheckBox) profilesGroup.findViewWithTag(
+ DeviceProfilesSettings.HIGH_QUALITY_AUDIO_PREF_TAG);
+ assertThat(box).isNull();
+ }
+
+}
diff --git a/tests/robotests/src/com/android/settings/datausage/DataUsageSummaryTest.java b/tests/robotests/src/com/android/settings/datausage/DataUsageSummaryTest.java
index e1572ab..92ded0d 100644
--- a/tests/robotests/src/com/android/settings/datausage/DataUsageSummaryTest.java
+++ b/tests/robotests/src/com/android/settings/datausage/DataUsageSummaryTest.java
@@ -25,8 +25,8 @@
import com.android.settings.R;
import com.android.settings.SettingsRobolectricTestRunner;
import com.android.settings.TestConfig;
-import com.android.settings.connecteddevice.ConnectedDeviceDashboardFragment;
import com.android.settings.testutils.XmlTestUtils;
+import com.android.settings.testutils.shadow.ShadowConnectivityManager;
import com.android.settingslib.NetworkPolicyEditor;
import org.junit.Before;
@@ -160,4 +160,16 @@
assertThat(keys).containsAllIn(niks);
}
+
+ @Test
+ @Config(shadows = ShadowConnectivityManager.class)
+ public void testNonIndexableKeys_hasMobileData_restrictedAccessesAdded() {
+ ShadowConnectivityManager.setIsNetworkSupported(true);
+ List<String> keys = DataUsageSummary.SEARCH_INDEX_DATA_PROVIDER
+ .getNonIndexableKeys(mContext);
+
+ assertThat(keys).contains(DataUsageSummary.KEY_RESTRICT_BACKGROUND);
+ assertThat(keys).contains(DataUsageSummary.KEY_NETWORK_RESTRICTIONS);
+ ShadowConnectivityManager.setIsNetworkSupported(false);
+ }
}
diff --git a/tests/robotests/src/com/android/settings/development/TelephonyMonitorPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/development/TelephonyMonitorPreferenceControllerTest.java
index 5167c68..9a1a3b6 100644
--- a/tests/robotests/src/com/android/settings/development/TelephonyMonitorPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/development/TelephonyMonitorPreferenceControllerTest.java
@@ -134,7 +134,24 @@
when(mContext.getResources().getBoolean(R.bool.config_show_telephony_monitor))
.thenReturn(true);
SettingsShadowSystemProperties.set(
- TelephonyMonitorPreferenceController.PROPERTY_TELEPHONY_MONITOR, "true");
+ TelephonyMonitorPreferenceController.PROPERTY_TELEPHONY_MONITOR,
+ TelephonyMonitorPreferenceController.ENABLED_STATUS);
+ SettingsShadowSystemProperties.set(
+ TelephonyMonitorPreferenceController.BUILD_TYPE, "userdebug");
+
+ mController.displayPreference(mScreen);
+
+ verify(mPreference).setChecked(true);
+ }
+
+ @Config(shadows = {SettingsShadowSystemProperties.class})
+ @Test
+ public void displayPreference_telephonyMonitorUserEnabled_shouldCheckedPreference() {
+ when(mContext.getResources().getBoolean(R.bool.config_show_telephony_monitor))
+ .thenReturn(true);
+ SettingsShadowSystemProperties.set(
+ TelephonyMonitorPreferenceController.PROPERTY_TELEPHONY_MONITOR,
+ TelephonyMonitorPreferenceController.USER_ENABLED_STATUS);
SettingsShadowSystemProperties.set(
TelephonyMonitorPreferenceController.BUILD_TYPE, "userdebug");
@@ -149,7 +166,24 @@
when(mContext.getResources().getBoolean(R.bool.config_show_telephony_monitor))
.thenReturn(true);
SettingsShadowSystemProperties.set(
- TelephonyMonitorPreferenceController.PROPERTY_TELEPHONY_MONITOR, "false");
+ TelephonyMonitorPreferenceController.PROPERTY_TELEPHONY_MONITOR,
+ TelephonyMonitorPreferenceController.DISABLED_STATUS);
+ SettingsShadowSystemProperties.set(
+ TelephonyMonitorPreferenceController.BUILD_TYPE, "userdebug");
+
+ mController.displayPreference(mScreen);
+
+ verify(mPreference).setChecked(false);
+ }
+
+ @Config(shadows = {SettingsShadowSystemProperties.class})
+ @Test
+ public void displayPreference_telephonyMonitorUserDisabled_shouldUncheckedPreference() {
+ when(mContext.getResources().getBoolean(R.bool.config_show_telephony_monitor))
+ .thenReturn(true);
+ SettingsShadowSystemProperties.set(
+ TelephonyMonitorPreferenceController.PROPERTY_TELEPHONY_MONITOR,
+ TelephonyMonitorPreferenceController.USER_DISABLED_STATUS);
SettingsShadowSystemProperties.set(
TelephonyMonitorPreferenceController.BUILD_TYPE, "userdebug");
@@ -168,8 +202,10 @@
mController.handlePreferenceTreeClick(mPreference);
- assertThat(SystemProperties.getBoolean(
- TelephonyMonitorPreferenceController.PROPERTY_TELEPHONY_MONITOR, false)).isTrue();
+ assertThat(TelephonyMonitorPreferenceController.USER_ENABLED_STATUS.equals(
+ SystemProperties.get(
+ TelephonyMonitorPreferenceController.PROPERTY_TELEPHONY_MONITOR,
+ TelephonyMonitorPreferenceController.DISABLED_STATUS))).isTrue();
}
@Config(shadows = {SettingsShadowSystemProperties.class})
@@ -182,8 +218,10 @@
mController.handlePreferenceTreeClick(mPreference);
- assertThat(SystemProperties.getBoolean(
- TelephonyMonitorPreferenceController.PROPERTY_TELEPHONY_MONITOR, false)).isFalse();
+ assertThat(TelephonyMonitorPreferenceController.USER_DISABLED_STATUS.equals(
+ SystemProperties.get(
+ TelephonyMonitorPreferenceController.PROPERTY_TELEPHONY_MONITOR,
+ TelephonyMonitorPreferenceController.DISABLED_STATUS))).isTrue();
}
}
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BatteryUtilsTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BatteryUtilsTest.java
index fd89558..03759ec 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/BatteryUtilsTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/BatteryUtilsTest.java
@@ -18,6 +18,7 @@
import android.content.Context;
import android.os.BatteryStats;
import android.os.Process;
+import android.text.format.DateUtils;
import com.android.internal.os.BatterySipper;
import com.android.settings.SettingsRobolectricTestRunner;
@@ -47,8 +48,11 @@
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyInt;
import static org.mockito.Matchers.anyLong;
+import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
+import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import static org.mockito.Mockito.spy;
@@ -62,6 +66,8 @@
private static final long TIME_STATE_TOP_SLEEPING = 2500 * UNIT;
private static final long TIME_STATE_FOREGROUND = 3000 * UNIT;
private static final long TIME_STATE_BACKGROUND = 6000 * UNIT;
+ private static final long TIME_FOREGROUND_ACTIVITY_ZERO = 0;
+ private static final long TIME_FOREGROUND_ACTIVITY = 100 * DateUtils.MINUTE_IN_MILLIS;
private static final int UID = 123;
private static final long TIME_EXPECTED_FOREGROUND = 1500;
@@ -71,6 +77,7 @@
private static final double BATTERY_SYSTEM_USAGE = 600;
private static final double BATTERY_OVERACCOUNTED_USAGE = 500;
private static final double BATTERY_UNACCOUNTED_USAGE = 700;
+ private static final double BATTERY_APP_USAGE = 100;
private static final double TOTAL_BATTERY_USAGE = 1000;
private static final double HIDDEN_USAGE = 200;
private static final int DISCHARGE_AMOUNT = 80;
@@ -180,11 +187,12 @@
sippers.add(mUnaccountedBatterySipper);
when(mProvider.isTypeSystem(mSystemBatterySipper))
.thenReturn(true);
+ doNothing().when(mBatteryUtils).smearScreenBatterySipper(any(), any());
final double totalUsage = mBatteryUtils.removeHiddenBatterySippers(sippers);
+
assertThat(sippers).containsExactly(mNormalBatterySipper);
- assertThat(totalUsage).isWithin(PRECISION).of(
- BATTERY_SCREEN_USAGE + BATTERY_SYSTEM_USAGE + BATTERY_UNACCOUNTED_USAGE);
+ assertThat(totalUsage).isWithin(PRECISION).of(BATTERY_SYSTEM_USAGE);
}
@Test
@@ -206,12 +214,6 @@
}
@Test
- public void testShouldHideSipper_TypeWifi_ReturnTrue() {
- mNormalBatterySipper.drainType = BatterySipper.DrainType.WIFI;
- assertThat(mBatteryUtils.shouldHideSipper(mNormalBatterySipper)).isTrue();
- }
-
- @Test
public void testShouldHideSipper_TypeCell_ReturnTrue() {
mNormalBatterySipper.drainType = BatterySipper.DrainType.CELL;
assertThat(mBatteryUtils.shouldHideSipper(mNormalBatterySipper)).isTrue();
@@ -224,12 +226,6 @@
}
@Test
- public void testShouldHideSipper_TypeBluetooth_ReturnTrue() {
- mNormalBatterySipper.drainType = BatterySipper.DrainType.BLUETOOTH;
- assertThat(mBatteryUtils.shouldHideSipper(mNormalBatterySipper)).isTrue();
- }
-
- @Test
public void testShouldHideSipper_TypeSystem_ReturnTrue() {
mNormalBatterySipper.drainType = BatterySipper.DrainType.APP;
when(mNormalBatterySipper.getUid()).thenReturn(Process.ROOT_UID);
@@ -259,4 +255,43 @@
HIDDEN_USAGE, DISCHARGE_AMOUNT))
.isWithin(PRECISION).of(PERCENT_SYSTEM_USAGE);
}
+
+ @Test
+ public void testSmearScreenBatterySipper() {
+ final BatterySipper sipperNull = createTestSmearBatterySipper(TIME_FOREGROUND_ACTIVITY_ZERO,
+ BATTERY_APP_USAGE, 0 /* uid */, true /* isUidNull */);
+ final BatterySipper sipperBg = createTestSmearBatterySipper(TIME_FOREGROUND_ACTIVITY_ZERO,
+ BATTERY_APP_USAGE, 1 /* uid */, false /* isUidNull */);
+ final BatterySipper sipperFg = createTestSmearBatterySipper(TIME_FOREGROUND_ACTIVITY,
+ BATTERY_APP_USAGE, 2 /* uid */, false /* isUidNull */);
+
+ final List<BatterySipper> sippers = new ArrayList<>();
+ sippers.add(sipperNull);
+ sippers.add(sipperBg);
+ sippers.add(sipperFg);
+
+ mBatteryUtils.smearScreenBatterySipper(sippers, mScreenBatterySipper);
+
+ assertThat(sipperNull.totalPowerMah).isWithin(PRECISION).of(BATTERY_APP_USAGE);
+ assertThat(sipperBg.totalPowerMah).isWithin(PRECISION).of(BATTERY_APP_USAGE);
+ assertThat(sipperFg.totalPowerMah).isWithin(PRECISION).of(
+ BATTERY_APP_USAGE + BATTERY_SCREEN_USAGE);
+ }
+
+ private BatterySipper createTestSmearBatterySipper(long activityTime, double totalPowerMah,
+ int uidCode, boolean isUidNull) {
+ final BatterySipper sipper = mock(BatterySipper.class);
+ sipper.drainType = BatterySipper.DrainType.APP;
+ sipper.totalPowerMah = totalPowerMah;
+ doReturn(uidCode).when(sipper).getUid();
+ if (!isUidNull) {
+ final BatteryStats.Uid uid = mock(BatteryStats.Uid.class, RETURNS_DEEP_STUBS);
+ doReturn(activityTime).when(mBatteryUtils).getForegroundActivityTotalTimeMs(eq(uid),
+ anyLong());
+ doReturn(uidCode).when(uid).getUid();
+ sipper.uidObj = uid;
+ }
+
+ return sipper;
+ }
}
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageSummaryTest.java b/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageSummaryTest.java
index 3d5d5dc..615424c 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageSummaryTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageSummaryTest.java
@@ -17,7 +17,6 @@
import android.content.Context;
import android.content.Intent;
-import android.os.Bundle;
import android.os.PowerManager;
import android.os.Process;
import android.text.TextUtils;
@@ -68,6 +67,7 @@
import static org.mockito.Matchers.anyLong;
import static org.mockito.Matchers.anyString;
import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.spy;
@@ -129,6 +129,8 @@
@Mock
private LayoutPreference mBatteryLayoutPref;
@Mock
+ private TextView mBatteryPercentText;
+ @Mock
private TextView mSummary1;
@Mock
private BatteryInfo mBatteryInfo;
@@ -139,7 +141,6 @@
@Mock
private SettingsActivity mSettingsActivity;
- private TextView mBatteryPercentText;
private List<BatterySipper> mUsageList;
private Context mRealContext;
private TestFragment mFragment;
@@ -163,8 +164,9 @@
mLastFullChargePref = new PowerGaugePreference(mRealContext);
mFragment = spy(new TestFragment(mContext));
mFragment.initFeatureProvider();
- mBatteryMeterView = spy(new BatteryMeterView(mRealContext));
+ mBatteryMeterView = new BatteryMeterView(mRealContext);
mBatteryMeterView.mDrawable = new BatteryMeterView.BatteryMeterDrawable(mRealContext, 0);
+ doNothing().when(mFragment).restartBatteryStatsLoader();
when(mFragment.getActivity()).thenReturn(mSettingsActivity);
when(mAdditionalBatteryInfoMenu.getItemId())
@@ -185,7 +187,6 @@
mCellBatterySipper.drainType = BatterySipper.DrainType.CELL;
mCellBatterySipper.totalPowerMah = POWER_MAH;
- mBatteryPercentText = new TextView(mRealContext);
when(mBatteryLayoutPref.findViewById(R.id.summary1)).thenReturn(mSummary1);
when(mBatteryLayoutPref.findViewById(R.id.battery_percent)).thenReturn(mBatteryPercentText);
when(mBatteryLayoutPref.findViewById(R.id.battery_header_icon))
@@ -279,50 +280,6 @@
}
@Test
- public void testInitHeaderPreference_initCorrectly() {
- mFragment.mBatteryLevel = 100;
-
- mFragment.initHeaderPreference();
-
- assertThat(mBatteryMeterView.getBatteryLevel()).isEqualTo(100);
- assertThat(mBatteryPercentText.getText().toString()).isEqualTo("100%");
- }
-
- @Test
- public void testStartBatteryHeaderAnimationIfNecessary_batteryLevelChanged_animationStarted() {
- final int prevLevel = 100;
- final int curLevel = 80;
-
- mFragment.startBatteryHeaderAnimationIfNecessary(mBatteryMeterView, mBatteryPercentText,
- prevLevel, curLevel);
-
- assertThat(mBatteryMeterView.getBatteryLevel()).isEqualTo(curLevel);
- assertThat(mBatteryPercentText.getText().toString()).isEqualTo("80%");
- }
-
- @Test
- public void testOnSaveInstanceState_saveBatteryLevel() {
- Bundle bundle = new Bundle();
- mFragment.mBatteryLevel = BATTERY_LEVEL;
- // mock it to stop crash in getPreferenceScreen
- doReturn(null).when(mFragment).getPreferenceScreen();
-
- mFragment.onSaveInstanceState(bundle);
-
- assertThat(bundle.getInt(PowerUsageSummary.ARG_BATTERY_LEVEL)).isEqualTo(BATTERY_LEVEL);
- }
-
- @Test
- public void testOnActivityCreated_setBatteryLevel() {
- Bundle bundle = new Bundle();
- bundle.putInt(PowerUsageSummary.ARG_BATTERY_LEVEL, BATTERY_LEVEL);
-
- mFragment.onActivityCreated(bundle);
-
- assertThat(mFragment.mBatteryLevel).isEqualTo(BATTERY_LEVEL);
- }
-
- @Test
public void testExtractKeyFromSipper_typeAPPUidObjectNull_returnPackageNames() {
mNormalBatterySipper.uidObj = null;
mNormalBatterySipper.drainType = BatterySipper.DrainType.APP;
@@ -360,10 +317,10 @@
@Test
public void testSetUsageSummary_timeMoreThanOneMinute_setSummary() {
final long usageTimeMs = 2 * DateUtils.MINUTE_IN_MILLIS;
- doReturn(mRealContext.getText(R.string.battery_used_for)).when(mFragment).getText(
- R.string.battery_used_for);
+ doReturn(mRealContext.getText(R.string.battery_screen_usage)).when(mFragment).getText(
+ R.string.battery_screen_usage);
doReturn(mRealContext).when(mFragment).getContext();
- final String expectedSummary = "Used for 2m";
+ final String expectedSummary = "Screen usage 2m";
mFragment.setUsageSummary(mPreference, usageTimeMs);
diff --git a/tests/robotests/src/com/android/settings/gestures/AssistGesturePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/gestures/AssistGesturePreferenceControllerTest.java
index 9862f83..e83e237 100644
--- a/tests/robotests/src/com/android/settings/gestures/AssistGesturePreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/gestures/AssistGesturePreferenceControllerTest.java
@@ -52,12 +52,14 @@
private FakeFeatureFactory mFactory;
private AssistGesturePreferenceController mController;
+ private static final String KEY_ASSIST = "gesture_assist";
+
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
FakeFeatureFactory.setupForTest(mContext);
mFactory = (FakeFeatureFactory) FakeFeatureFactory.getFactory(mContext);
- mController = new AssistGesturePreferenceController(mContext, null);
+ mController = new AssistGesturePreferenceController(mContext, null, KEY_ASSIST);
}
@Test
@@ -77,7 +79,7 @@
// Set the setting to be enabled.
final Context context = ShadowApplication.getInstance().getApplicationContext();
Settings.System.putInt(context.getContentResolver(), ASSIST_GESTURE_ENABLED, 1);
- mController = new AssistGesturePreferenceController(context, null);
+ mController = new AssistGesturePreferenceController(context, null, KEY_ASSIST);
assertThat(mController.isSwitchPrefEnabled()).isTrue();
}
@@ -87,7 +89,7 @@
// Set the setting to be disabled.
final Context context = ShadowApplication.getInstance().getApplicationContext();
Settings.System.putInt(context.getContentResolver(), ASSIST_GESTURE_ENABLED, 0);
- mController = new AssistGesturePreferenceController(context, null);
+ mController = new AssistGesturePreferenceController(context, null, KEY_ASSIST);
assertThat(mController.isSwitchPrefEnabled()).isFalse();
}
diff --git a/tests/robotests/src/com/android/settings/gestures/DoubleTapPowerPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/gestures/DoubleTapPowerPreferenceControllerTest.java
index bdb3522..d7961e3 100644
--- a/tests/robotests/src/com/android/settings/gestures/DoubleTapPowerPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/gestures/DoubleTapPowerPreferenceControllerTest.java
@@ -47,11 +47,12 @@
@Mock(answer = Answers.RETURNS_DEEP_STUBS)
private PreferenceScreen mScreen;
private DoubleTapPowerPreferenceController mController;
+ private static final String KEY_DOUBLE_TAP_POWER = "gesture_double_tap_power";
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
- mController = new DoubleTapPowerPreferenceController(mContext, null);
+ mController = new DoubleTapPowerPreferenceController(mContext, null, KEY_DOUBLE_TAP_POWER);
}
@Test
@@ -78,7 +79,7 @@
final Context context = ShadowApplication.getInstance().getApplicationContext();
Settings.System.putInt(context.getContentResolver(),
CAMERA_DOUBLE_TAP_POWER_GESTURE_DISABLED, 0);
- mController = new DoubleTapPowerPreferenceController(context, null);
+ mController = new DoubleTapPowerPreferenceController(context, null, KEY_DOUBLE_TAP_POWER);
assertThat(mController.isSwitchPrefEnabled()).isTrue();
}
@@ -89,7 +90,7 @@
final Context context = ShadowApplication.getInstance().getApplicationContext();
Settings.System.putInt(context.getContentResolver(),
CAMERA_DOUBLE_TAP_POWER_GESTURE_DISABLED, 1);
- mController = new DoubleTapPowerPreferenceController(context, null);
+ mController = new DoubleTapPowerPreferenceController(context, null, KEY_DOUBLE_TAP_POWER);
assertThat(mController.isSwitchPrefEnabled()).isFalse();
}
diff --git a/tests/robotests/src/com/android/settings/gestures/DoubleTapScreenPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/gestures/DoubleTapScreenPreferenceControllerTest.java
index adf8b75..442d11d 100644
--- a/tests/robotests/src/com/android/settings/gestures/DoubleTapScreenPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/gestures/DoubleTapScreenPreferenceControllerTest.java
@@ -46,11 +46,13 @@
private AmbientDisplayConfiguration mAmbientDisplayConfiguration;
private DoubleTapScreenPreferenceController mController;
+ private static final String KEY_DOUBLE_TAP_SCREEN = "gesture_double_tap_screen";
+
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
mController = new DoubleTapScreenPreferenceController(
- mContext, null, mAmbientDisplayConfiguration, 0);
+ mContext, null, mAmbientDisplayConfiguration, 0, KEY_DOUBLE_TAP_SCREEN);
}
@Test
diff --git a/tests/robotests/src/com/android/settings/gestures/DoubleTwistPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/gestures/DoubleTwistPreferenceControllerTest.java
index 9bf6655..8393fc3 100644
--- a/tests/robotests/src/com/android/settings/gestures/DoubleTwistPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/gestures/DoubleTwistPreferenceControllerTest.java
@@ -53,11 +53,12 @@
@Mock(answer = Answers.RETURNS_DEEP_STUBS)
private SensorManager mSensorManager;
private DoubleTwistPreferenceController mController;
+ private static final String KEY_DOUBLE_TWIST = "gesture_double_twist";
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
- mController = new DoubleTwistPreferenceController(mContext, null);
+ mController = new DoubleTwistPreferenceController(mContext, null, KEY_DOUBLE_TWIST);
}
@Test
@@ -98,7 +99,7 @@
final Context context = ShadowApplication.getInstance().getApplicationContext();
Settings.System.putInt(context.getContentResolver(),
CAMERA_DOUBLE_TWIST_TO_FLIP_ENABLED, 1);
- mController = new DoubleTwistPreferenceController(context, null);
+ mController = new DoubleTwistPreferenceController(context, null, KEY_DOUBLE_TWIST);
assertThat(mController.isSwitchPrefEnabled()).isTrue();
}
@@ -109,7 +110,7 @@
final Context context = ShadowApplication.getInstance().getApplicationContext();
Settings.System.putInt(context.getContentResolver(),
CAMERA_DOUBLE_TWIST_TO_FLIP_ENABLED, 0);
- mController = new DoubleTwistPreferenceController(context, null);
+ mController = new DoubleTwistPreferenceController(context, null, KEY_DOUBLE_TWIST);
assertThat(mController.isSwitchPrefEnabled()).isFalse();
}
diff --git a/tests/robotests/src/com/android/settings/gestures/PIckupGesturePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/gestures/PIckupGesturePreferenceControllerTest.java
index 9dce074..46c0f65 100644
--- a/tests/robotests/src/com/android/settings/gestures/PIckupGesturePreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/gestures/PIckupGesturePreferenceControllerTest.java
@@ -47,11 +47,13 @@
private PickupGesturePreferenceController mController;
+ private static final String KEY_PICK_UP = "gesture_pick_up";
+
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
mController = new PickupGesturePreferenceController(
- mContext, null, mAmbientDisplayConfiguration, 0);
+ mContext, null, mAmbientDisplayConfiguration, 0, KEY_PICK_UP);
}
@Test
diff --git a/tests/robotests/src/com/android/settings/gestures/SwipeToNotificationPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/gestures/SwipeToNotificationPreferenceControllerTest.java
index e909667..cf26cb2 100644
--- a/tests/robotests/src/com/android/settings/gestures/SwipeToNotificationPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/gestures/SwipeToNotificationPreferenceControllerTest.java
@@ -45,11 +45,12 @@
private Context mContext;
private SwipeToNotificationPreferenceController mController;
+ private static final String KEY_SWIPE_DOWN = "gesture_swipe_down_fingerprint";
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
- mController = new SwipeToNotificationPreferenceController(mContext, null);
+ mController = new SwipeToNotificationPreferenceController(mContext, null, KEY_SWIPE_DOWN);
}
@Test
@@ -75,7 +76,7 @@
// Set the setting to be enabled.
final Context context = ShadowApplication.getInstance().getApplicationContext();
Settings.System.putInt(context.getContentResolver(), SYSTEM_NAVIGATION_KEYS_ENABLED, 1);
- mController = new SwipeToNotificationPreferenceController(context, null);
+ mController = new SwipeToNotificationPreferenceController(context, null, KEY_SWIPE_DOWN);
assertThat(mController.isSwitchPrefEnabled()).isTrue();
}
@@ -85,7 +86,7 @@
// Set the setting to be disabled.
final Context context = ShadowApplication.getInstance().getApplicationContext();
Settings.System.putInt(context.getContentResolver(), SYSTEM_NAVIGATION_KEYS_ENABLED, 0);
- mController = new SwipeToNotificationPreferenceController(context, null);
+ mController = new SwipeToNotificationPreferenceController(context, null, KEY_SWIPE_DOWN);
assertThat(mController.isSwitchPrefEnabled()).isFalse();
}
diff --git a/tests/robotests/src/com/android/settings/language/LanguageAndInputSettingsTest.java b/tests/robotests/src/com/android/settings/language/LanguageAndInputSettingsTest.java
index 8c23cbf..527b1cd 100644
--- a/tests/robotests/src/com/android/settings/language/LanguageAndInputSettingsTest.java
+++ b/tests/robotests/src/com/android/settings/language/LanguageAndInputSettingsTest.java
@@ -18,7 +18,9 @@
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Matchers.any;
+import static org.mockito.Mockito.doReturn;
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.when;
@@ -44,6 +46,8 @@
import com.android.settings.core.lifecycle.Lifecycle;
import com.android.settings.core.lifecycle.LifecycleObserver;
import com.android.settings.dashboard.SummaryLoader;
+import com.android.settings.fuelgauge.PowerUsageSummary;
+import com.android.settings.testutils.XmlTestUtils;
import com.android.settings.testutils.shadow.ShadowSecureSettings;
import org.junit.Before;
@@ -52,6 +56,7 @@
import org.mockito.Answers;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
+import org.robolectric.RuntimeEnvironment;
import org.robolectric.annotation.Config;
import java.util.ArrayList;
@@ -144,6 +149,37 @@
verify(loader).setSummary(provider, null);
}
+ @Test
+ public void testNonIndexableKeys_existInXmlLayout() {
+ final Context context = spy(RuntimeEnvironment.application);
+ //(InputManager) context.getSystemService(Context.INPUT_SERVICE);
+ InputManager manager = mock(InputManager.class);
+ when(manager.getInputDeviceIds()).thenReturn(new int[]{});
+ doReturn(manager).when(context).getSystemService(Context.INPUT_SERVICE);
+ final List<String> niks = LanguageAndInputSettings.SEARCH_INDEX_DATA_PROVIDER
+ .getNonIndexableKeys(context);
+ final int xmlId = (new LanguageAndInputSettings()).getPreferenceScreenResId();
+
+ final List<String> keys = XmlTestUtils.getKeysFromPreferenceXml(context, xmlId);
+
+ assertThat(keys).containsAllIn(niks);
+ }
+
+ @Test
+ public void testPreferenceControllers_getPreferenceKeys_existInPreferenceScreen() {
+ final Context context = RuntimeEnvironment.application;
+ final LanguageAndInputSettings fragment = new LanguageAndInputSettings();
+ final List<String> preferenceScreenKeys = XmlTestUtils.getKeysFromPreferenceXml(context,
+ fragment.getPreferenceScreenResId());
+ final List<String> preferenceKeys = new ArrayList<>();
+
+ for (PreferenceController controller : fragment.getPreferenceControllers(context)) {
+ preferenceKeys.add(controller.getPreferenceKey());
+ }
+
+ assertThat(preferenceScreenKeys).containsAllIn(preferenceKeys);
+ }
+
/**
* Test fragment to expose lifecycle and context so we can verify behavior for observables.
*/
diff --git a/tests/robotests/src/com/android/settings/notification/SettingPrefTest.java b/tests/robotests/src/com/android/settings/notification/SettingPrefTest.java
deleted file mode 100644
index 39f1377..0000000
--- a/tests/robotests/src/com/android/settings/notification/SettingPrefTest.java
+++ /dev/null
@@ -1,67 +0,0 @@
-package com.android.settings.notification;
-
-import android.content.res.Resources;
-
-import android.content.Context;
-import android.provider.Settings;
-import android.support.v7.preference.DropDownPreference;
-import com.android.settings.SettingsRobolectricTestRunner;
-import com.android.settings.TestConfig;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.robolectric.RuntimeEnvironment;
-import org.robolectric.annotation.Config;
-
-import static com.google.common.truth.Truth.assertThat;
-import static org.mockito.Mockito.spy;
-
-@RunWith(SettingsRobolectricTestRunner.class)
-@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
-public class SettingPrefTest {
-
- @Test
- public void update_setsDropDownSummaryText() {
- Context context = RuntimeEnvironment.application;
- String testSetting = "test_setting";
- int[] values = new int[] {1,2,3};
- String[] entries = new String[] {"one", "two", "three"};
- SettingPref settingPref =
- spy(new SettingPref(SettingPref.TYPE_GLOBAL, "key", testSetting, 0, values) {
- @Override
- protected String getCaption(Resources res, int value) {
- return "temp";
- }
- });
- DropDownPreference dropdownPref = spy(new DropDownPreference(context));
- dropdownPref.setEntries(entries);
- settingPref.mDropDown = dropdownPref;
- Settings.Global.putInt(context.getContentResolver(), testSetting, values[2]);
-
- settingPref.update(context);
-
- assertThat(settingPref.mDropDown.getSummary()).isEqualTo(entries[2]);
- }
-
- @Test
- public void update_setsDropDownSummaryText_noMatch_noError() {
- Context context = RuntimeEnvironment.application;
- String testSetting = "test_setting";
- int[] values = new int[] {1,2,3};
- String[] entries = new String[] {"one", "two", "three"};
- SettingPref settingPref =
- spy(new SettingPref(SettingPref.TYPE_GLOBAL, "key", testSetting, 0, values) {
- @Override
- protected String getCaption(Resources res, int value) {
- return "temp";
- }
- });
- DropDownPreference dropdownPref = spy(new DropDownPreference(context));
- dropdownPref.setEntries(entries);
- settingPref.mDropDown = dropdownPref;
- Settings.Global.putInt(context.getContentResolver(), testSetting, -1);
-
- settingPref.update(context);
-
- assertThat(settingPref.mDropDown.getSummary()).isNull();
- }
-}
diff --git a/tests/robotests/src/com/android/settings/notification/SoundSettingsTest.java b/tests/robotests/src/com/android/settings/notification/SoundSettingsTest.java
new file mode 100644
index 0000000..547117b
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/notification/SoundSettingsTest.java
@@ -0,0 +1,73 @@
+/*
+ * 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.notification;
+
+import android.content.Context;
+
+import android.media.AudioManager;
+import android.os.UserManager;
+import com.android.settings.R;
+import com.android.settings.SettingsRobolectricTestRunner;
+import com.android.settings.TestConfig;
+import com.android.settings.testutils.XmlTestUtils;
+import com.android.settings.testutils.shadow.ShadowAudioHelper;
+import com.android.settings.testutils.shadow.ShadowUserManager;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
+
+import java.util.List;
+
+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;
+import static org.mockito.Mockito.when;
+
+@RunWith(SettingsRobolectricTestRunner.class)
+@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
+public class SoundSettingsTest {
+
+ @Test
+ @Config( shadows = {
+ ShadowUserManager.class,
+ ShadowAudioHelper.class,
+ })
+ public void testNonIndexableKeys_existInXmlLayout() {
+ final Context context = spy(RuntimeEnvironment.application);
+ AudioManager audioManager = mock(AudioManager.class);
+ doReturn(audioManager).when(context).getSystemService(Context.AUDIO_SERVICE);
+
+ UserManager userManager = mock(UserManager.class);
+ when(userManager.isAdminUser()).thenReturn(false);
+ doReturn(userManager).when(context).getSystemService(Context.USER_SERVICE);
+
+ final List<String> niks = SoundSettings.SEARCH_INDEX_DATA_PROVIDER
+ .getNonIndexableKeys(context);
+ final int xmlId = (new SoundSettings()).getPreferenceScreenResId();
+ final List<String> keys = XmlTestUtils.getKeysFromPreferenceXml(context, xmlId);
+ keys.addAll(XmlTestUtils.getKeysFromPreferenceXml(context,
+ R.xml.zen_mode_settings));
+ // Add keys with hidden resources
+ keys.add("alarm_volume");
+ keys.add("ring_volume");
+ keys.add("notification_volume");
+
+ assertThat(keys).containsAllIn(niks);
+ }
+}
\ No newline at end of file
diff --git a/tests/robotests/src/com/android/settings/search/BaseSearchIndexProviderTest.java b/tests/robotests/src/com/android/settings/search/BaseSearchIndexProviderTest.java
index 6175093..42c5301 100644
--- a/tests/robotests/src/com/android/settings/search/BaseSearchIndexProviderTest.java
+++ b/tests/robotests/src/com/android/settings/search/BaseSearchIndexProviderTest.java
@@ -108,7 +108,7 @@
public List<SearchIndexableResource> getXmlResourcesToIndex(Context context,
boolean enabled) {
final SearchIndexableResource sir = new SearchIndexableResource(context);
- sir.xmlResId = R.xml.language_and_input;
+ sir.xmlResId = R.xml.data_usage;
return Arrays.asList(sir);
}
@@ -121,13 +121,7 @@
final List<String> nonIndexableKeys = provider
.getNonIndexableKeys(RuntimeEnvironment.application);
- assertThat(nonIndexableKeys).containsAllOf("phone_language", "spellcheckers_settings",
- "key_user_dictionary_settings", "gesture_settings_category", "gesture_assist",
- "gesture_swipe_down_fingerprint", "gesture_double_tap_power",
- "gesture_double_twist", "gesture_double_tap_screen", "gesture_pick_up",
- "pointer_speed", "tts_settings",
- "game_controller_settings_category", "vibrate_input_devices");
+ assertThat(nonIndexableKeys).containsAllOf("status_header", "limit_summary",
+ "restrict_background");
}
-
-
}
diff --git a/tests/robotests/src/com/android/settings/search2/DatabaseIndexingManagerTest.java b/tests/robotests/src/com/android/settings/search2/DatabaseIndexingManagerTest.java
index b76feff1..6844be5 100644
--- a/tests/robotests/src/com/android/settings/search2/DatabaseIndexingManagerTest.java
+++ b/tests/robotests/src/com/android/settings/search2/DatabaseIndexingManagerTest.java
@@ -671,9 +671,9 @@
new HashMap<String, Set<String>>());
Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index WHERE enabled = 1", null);
- assertThat(cursor.getCount()).isEqualTo(2);
+ assertThat(cursor.getCount()).isEqualTo(1);
cursor = mDb.rawQuery("SELECT * FROM prefs_index WHERE enabled = 0", null);
- assertThat(cursor.getCount()).isEqualTo(4);
+ assertThat(cursor.getCount()).isEqualTo(5);
}
@Test
diff --git a/tests/robotests/src/com/android/settings/system/SystemDashboardFragmentTest.java b/tests/robotests/src/com/android/settings/system/SystemDashboardFragmentTest.java
new file mode 100644
index 0000000..483dee7
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/system/SystemDashboardFragmentTest.java
@@ -0,0 +1,61 @@
+/*
+ * 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.system;
+
+import android.content.Context;
+import android.os.UserManager;
+
+import com.android.settings.SettingsRobolectricTestRunner;
+import com.android.settings.TestConfig;
+import com.android.settings.testutils.XmlTestUtils;
+import com.android.settings.testutils.shadow.ShadowUserManager;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
+
+import java.util.List;
+
+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;
+import static org.mockito.Mockito.when;
+
+@RunWith(SettingsRobolectricTestRunner.class)
+@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION,
+ shadows = {
+ ShadowUserManager.class
+ })
+public class SystemDashboardFragmentTest {
+
+ @Test
+ public void testNonIndexableKeys_existInXmlLayout() {
+ final Context context = spy(RuntimeEnvironment.application);
+ UserManager manager = mock(UserManager.class);
+ when(manager.isAdminUser()).thenReturn(false);
+ doReturn(manager).when(context).getSystemService(Context.USER_SERVICE);
+ final List<String> niks = SystemDashboardFragment.SEARCH_INDEX_DATA_PROVIDER
+ .getNonIndexableKeys(context);
+ final int xmlId = (new SystemDashboardFragment()).getPreferenceScreenResId();
+
+ final List<String> keys = XmlTestUtils.getKeysFromPreferenceXml(context, xmlId);
+
+ assertThat(keys).containsAllIn(niks);
+ }
+}
diff --git a/tests/robotests/src/com/android/settings/testutils/shadow/ShadowAudioHelper.java b/tests/robotests/src/com/android/settings/testutils/shadow/ShadowAudioHelper.java
new file mode 100644
index 0000000..886f941
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/testutils/shadow/ShadowAudioHelper.java
@@ -0,0 +1,37 @@
+/*
+ * 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.testutils.shadow;
+
+import android.os.UserHandle;
+import android.os.UserManager;
+import com.android.settings.notification.AudioHelper;
+import org.robolectric.annotation.Implementation;
+import org.robolectric.annotation.Implements;
+
+@Implements(AudioHelper.class)
+public class ShadowAudioHelper {
+
+ @Implementation
+ public boolean isSingleVolume() {
+ return true;
+ }
+
+ @Implementation
+ public int getManagedProfileId(UserManager um) {
+ return UserHandle.USER_CURRENT;
+ }
+}
diff --git a/tests/robotests/src/com/android/settings/testutils/shadow/ShadowConnectivityManager.java b/tests/robotests/src/com/android/settings/testutils/shadow/ShadowConnectivityManager.java
index dbf1a65..4c05665 100644
--- a/tests/robotests/src/com/android/settings/testutils/shadow/ShadowConnectivityManager.java
+++ b/tests/robotests/src/com/android/settings/testutils/shadow/ShadowConnectivityManager.java
@@ -24,9 +24,14 @@
@Implements(ConnectivityManager.class)
public class ShadowConnectivityManager extends org.robolectric.shadows.ShadowConnectivityManager {
+ private static boolean mIsNetworkSupported;
+
@Implementation
public boolean isNetworkSupported(int networkType) {
- return false;
+ return mIsNetworkSupported;
}
+ public static void setIsNetworkSupported(boolean isNetworkSupported) {
+ mIsNetworkSupported = isNetworkSupported;
+ }
}
diff --git a/tests/robotests/src/com/android/settings/testutils/shadow/ShadowUtils.java b/tests/robotests/src/com/android/settings/testutils/shadow/ShadowUtils.java
index eb82362..87b9103 100644
--- a/tests/robotests/src/com/android/settings/testutils/shadow/ShadowUtils.java
+++ b/tests/robotests/src/com/android/settings/testutils/shadow/ShadowUtils.java
@@ -46,4 +46,9 @@
public static void reset() {
sFingerprintManager = null;
}
+
+ @Implementation
+ public static boolean isWifiOnly(Context context) {
+ return true;
+ }
}