Merge "Distinguish multiple PendingIntents via requestCode"
diff --git a/res/drawable-nodpi/gesture_ambient_wake_lock_screen b/res/drawable-nodpi/gesture_ambient_wake_lock_screen
deleted file mode 100644
index e69de29..0000000
--- a/res/drawable-nodpi/gesture_ambient_wake_lock_screen
+++ /dev/null
diff --git a/res/drawable-nodpi/system_nav_2_button.png b/res/drawable-nodpi/system_nav_2_button.png
deleted file mode 100644
index a041f9b..0000000
--- a/res/drawable-nodpi/system_nav_2_button.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-nodpi/system_nav_3_button.png b/res/drawable-nodpi/system_nav_3_button.png
deleted file mode 100644
index e78fc8b..0000000
--- a/res/drawable-nodpi/system_nav_3_button.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-nodpi/system_nav_fully_gestural.png b/res/drawable-nodpi/system_nav_fully_gestural.png
deleted file mode 100644
index b301608..0000000
--- a/res/drawable-nodpi/system_nav_fully_gestural.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable/color_bar_progress.xml b/res/drawable/color_bar_progress.xml
index d277467..9f3a199 100644
--- a/res/drawable/color_bar_progress.xml
+++ b/res/drawable/color_bar_progress.xml
@@ -21,7 +21,7 @@
<size android:height="10dp" />
<solid android:color="@*android:color/white_disabled_material" />
</shape>
- </item>r
+ </item>
<item android:id="@android:id/secondaryProgress">
<scale android:scaleWidth="100%">
<shape android:shape="rectangle"
diff --git a/res/layout/battery_header.xml b/res/layout/battery_header.xml
index 574d7d4..486f594 100644
--- a/res/layout/battery_header.xml
+++ b/res/layout/battery_header.xml
@@ -47,7 +47,6 @@
android:layout_marginTop="8dp"
android:minLines="3"
android:textAppearance="@android:style/TextAppearance.DeviceDefault.Small"/>
- android:textColor="?android:attr/textColorPrimary"/>
</LinearLayout>
@@ -57,4 +56,4 @@
android:layout_height="@dimen/battery_meter_height"
android:layout_gravity="center"/>
-</LinearLayout>
\ No newline at end of file
+</LinearLayout>
diff --git a/res/raw/face_settings.mp4 b/res/raw/face_settings.mp4
deleted file mode 100644
index e69de29..0000000
--- a/res/raw/face_settings.mp4
+++ /dev/null
diff --git a/res/raw/gesture_ambient_wake_lock_screen.mp4 b/res/raw/gesture_ambient_wake_lock_screen.mp4
deleted file mode 100644
index e69de29..0000000
--- a/res/raw/gesture_ambient_wake_lock_screen.mp4
+++ /dev/null
diff --git a/res/raw/system_nav_2_button.mp4 b/res/raw/system_nav_2_button.mp4
deleted file mode 100644
index 2f65292..0000000
--- a/res/raw/system_nav_2_button.mp4
+++ /dev/null
Binary files differ
diff --git a/res/raw/system_nav_3_button.mp4 b/res/raw/system_nav_3_button.mp4
deleted file mode 100644
index 86fb236..0000000
--- a/res/raw/system_nav_3_button.mp4
+++ /dev/null
Binary files differ
diff --git a/res/raw/system_nav_fully_gestural.mp4 b/res/raw/system_nav_fully_gestural.mp4
deleted file mode 100644
index ae9c6d7..0000000
--- a/res/raw/system_nav_fully_gestural.mp4
+++ /dev/null
Binary files differ
diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml
index a316316..d78547b 100644
--- a/res/values-af/strings.xml
+++ b/res/values-af/strings.xml
@@ -2924,6 +2924,8 @@
<string name="battery_not_usage" msgid="1472275761547230196">"Geen gebruik sedert dit laas volgelaai is nie"</string>
<string name="battery_not_usage_24hr" msgid="8397519536160741248">"Nie in afgelope 24 uur gebruik nie"</string>
<string name="battery_usage_without_time" msgid="1346894834339420538"></string>
+ <!-- no translation found for battery_usage_other_users (9002643295562500693) -->
+ <skip />
<string name="advanced_battery_graph_subtext" msgid="6816737986172678550">"Skatting van oorblywende batterytyd word op jou toestelgebruik gegrond"</string>
<string name="estimated_time_left" msgid="948717045180211777">"Geskatte tyd oor"</string>
<string name="estimated_charging_time_left" msgid="2287135413363961246">"Tot battery volgelaai is"</string>
diff --git a/res/values-am/strings.xml b/res/values-am/strings.xml
index fadf559..b991d95 100644
--- a/res/values-am/strings.xml
+++ b/res/values-am/strings.xml
@@ -2419,8 +2419,8 @@
<string name="accessibility_button_fade_title" msgid="8081993897680588829">"ጥቅም ላይ በማይውልበት ጊዜ ይደበዝዛል"</string>
<string name="accessibility_button_fade_summary" msgid="7865950833524973709">"ከጥቂት ሰከንዶች በኋላ ይደበዝዛል ስለዚህ ማያ ገጽዎን ማየት ይበልጥ ቀላል ነው"</string>
<string name="accessibility_button_opacity_title" msgid="4727355657530362289">"ጥቅም ላይ በማይውልበት ጊዜ ግልፅነት"</string>
- <string name="accessibility_button_low_label" msgid="4193015407828927741">"ግልጽ"</string>
- <string name="accessibility_button_high_label" msgid="9138077512008190896">"ግልጽ አይደልም"</string>
+ <string name="accessibility_button_low_label" msgid="4193015407828927741">"ግልፅ"</string>
+ <string name="accessibility_button_high_label" msgid="9138077512008190896">"ግልፅ አይደልም"</string>
<string name="accessibility_toggle_high_text_contrast_preference_title" msgid="1830189632458752698">"ከፍተኛ ንጽጽር ጽሁፍ"</string>
<string name="accessibility_toggle_high_text_contrast_preference_summary" msgid="5286411556836346180">"የጽሑፍ ቀለም ወደ ጥቁር ወይም ነጭ ይቀይሩ። ከዳራ ንፅፅርን ከፍ ያደርገዋል።"</string>
<string name="accessibility_toggle_screen_magnification_auto_update_preference_title" msgid="4987009529235165664">"ማጉላትን በራስ-አዘምን"</string>
@@ -2924,6 +2924,8 @@
<string name="battery_not_usage" msgid="1472275761547230196">"ካለፈው ሙሉ ኃይል ሙሌት በኋላ ጥቅም ላይ አልዋለም"</string>
<string name="battery_not_usage_24hr" msgid="8397519536160741248">"ላለፉት 24 ሰዓታት ጥቅም ላይ አልዋለም"</string>
<string name="battery_usage_without_time" msgid="1346894834339420538"></string>
+ <!-- no translation found for battery_usage_other_users (9002643295562500693) -->
+ <skip />
<string name="advanced_battery_graph_subtext" msgid="6816737986172678550">"የቀረው የባትሪ ዕድሜ ግምት በእርስዎ የመሣሪያ አጠቃቀም ላይ የተመረኮዘ ነው"</string>
<string name="estimated_time_left" msgid="948717045180211777">"የተገመተው ቀሪ ጊዜ"</string>
<string name="estimated_charging_time_left" msgid="2287135413363961246">"ኃይሉ ሙሉ እስኪሞላ ድረስ"</string>
@@ -4606,7 +4608,7 @@
<string name="allow_overlay_description" msgid="1607235723669496298">"ይህን መተግበሪያ እየተጠቀሙ ባሉ ሌሎች መተግበሪያዎች ላይ እንዲያሳይ ይፍቀዱለት። ይህ መተግበሪያ የት መታ እንደሚያደርጉ ማየት ወይም በማያ ገጽ ላይ የሚታየውን ነገር መቀየር ይችላል።"</string>
<string name="manage_external_storage_title" msgid="8024521099838816100">"የሁሉም ፋይሎች መዳረሻ"</string>
<string name="permit_manage_external_storage" msgid="6928847280689401761">"ሁሉንም ፋይሎች ለማስተዳደር መዳረሻ ፍቀድ"</string>
- <string name="allow_manage_external_storage_description" msgid="5707948153603253225">"ይህ መተግበሪያ በዚህ መሣሪያ ላይ ወይም በማናቸውም የተገናኙ የማከማቻ መጠኖች ላይ ሁሉንም ፋይሎች እንዲያነብ፣ እንዲያሻሽል እና እንዲሰርዝ ይፍቀዱ። ፈቃድ ከተሰጠ፣ መተግበሪያ ያለ የእርስዎ ግልጽ የሆነ ዕውቀት ፋይሎችን መድረስ ይችላል።"</string>
+ <string name="allow_manage_external_storage_description" msgid="5707948153603253225">"ይህ መተግበሪያ በዚህ መሣሪያ ላይ ወይም በማናቸውም የተገናኙ የማከማቻ መጠኖች ላይ ሁሉንም ፋይሎች እንዲያነብ፣ እንዲያሻሽል እና እንዲሰርዝ ይፍቀዱ። ፈቃድ ከተሰጠ፣ መተግበሪያ ያለ የእርስዎ ግልፅ የሆነ ዕውቀት ፋይሎችን መድረስ ይችላል።"</string>
<string name="filter_manage_external_storage" msgid="6751640571715343804">"ሁሉንም ፋይሎች መድረስ ይችላል"</string>
<string name="media_management_apps_title" msgid="8222942355578724582">"የሚዲያ አስተዳደር መተግበሪያዎች"</string>
<string name="media_management_apps_toggle_label" msgid="166724270857067456">"መተግበሪያው ሚዲያን እንዲያቀናብር ፍቀድ"</string>
diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml
index 908d2c2..2112eaf 100644
--- a/res/values-ar/strings.xml
+++ b/res/values-ar/strings.xml
@@ -3076,6 +3076,8 @@
<string name="battery_not_usage" msgid="1472275761547230196">"لم يتم استخدام البطارية منذ آخر عملية شحن كاملة."</string>
<string name="battery_not_usage_24hr" msgid="8397519536160741248">"لم يتم استخدام البطارية في آخر 24 ساعة."</string>
<string name="battery_usage_without_time" msgid="1346894834339420538"></string>
+ <!-- no translation found for battery_usage_other_users (9002643295562500693) -->
+ <skip />
<string name="advanced_battery_graph_subtext" msgid="6816737986172678550">"يستند تقدير شحن البطارية المتبقي على استخدام الجهاز"</string>
<string name="estimated_time_left" msgid="948717045180211777">"الوقت التقديري المتبقي"</string>
<string name="estimated_charging_time_left" msgid="2287135413363961246">"إلى أن يتم الشحن بالكامل"</string>
diff --git a/res/values-as/strings.xml b/res/values-as/strings.xml
index fec30d6..2c68cd0 100644
--- a/res/values-as/strings.xml
+++ b/res/values-as/strings.xml
@@ -2924,6 +2924,8 @@
<string name="battery_not_usage" msgid="1472275761547230196">"শেষবাৰ সম্পূৰ্ণ চাৰ্জ হোৱাৰ পৰা ব্যৱহাৰ কৰা নাই"</string>
<string name="battery_not_usage_24hr" msgid="8397519536160741248">"যোৱা ২৪ ঘণ্টাত ব্যৱহাৰ কৰা নাই"</string>
<string name="battery_usage_without_time" msgid="1346894834339420538"></string>
+ <!-- no translation found for battery_usage_other_users (9002643295562500693) -->
+ <skip />
<string name="advanced_battery_graph_subtext" msgid="6816737986172678550">"আপোনাৰ ডিভাইচৰ ব্যৱহাৰৰ ভিত্তিত বাকী থকা বেটাৰিৰ পৰিমাণ নিৰ্ণয় হয়"</string>
<string name="estimated_time_left" msgid="948717045180211777">"বাকী থকা মোটামুটি সময়"</string>
<string name="estimated_charging_time_left" msgid="2287135413363961246">"সম্পূৰ্ণৰূপে চ্চাৰ্জ নোহোৱা পৰ্যন্ত"</string>
diff --git a/res/values-az/strings.xml b/res/values-az/strings.xml
index 1fe3f9c..d599205 100644
--- a/res/values-az/strings.xml
+++ b/res/values-az/strings.xml
@@ -2924,6 +2924,7 @@
<string name="battery_not_usage" msgid="1472275761547230196">"Sonuncu tam şarjdan etibarən istifadə edilməyib"</string>
<string name="battery_not_usage_24hr" msgid="8397519536160741248">"Son 24 saat ərzində istifadə edilməyib"</string>
<string name="battery_usage_without_time" msgid="1346894834339420538"></string>
+ <string name="battery_usage_other_users" msgid="9002643295562500693">"Digər istifadəçilər"</string>
<string name="advanced_battery_graph_subtext" msgid="6816737986172678550">"Qalan enerji səviyyəsi cihazı işlətməkdən asılıdır"</string>
<string name="estimated_time_left" msgid="948717045180211777">"Təxmini qalan vaxt"</string>
<string name="estimated_charging_time_left" msgid="2287135413363961246">"Tam enerji yığana kimi"</string>
diff --git a/res/values-b+sr+Latn/strings.xml b/res/values-b+sr+Latn/strings.xml
index 4fe1199..dbc3dc2 100644
--- a/res/values-b+sr+Latn/strings.xml
+++ b/res/values-b+sr+Latn/strings.xml
@@ -2962,6 +2962,7 @@
<string name="battery_not_usage" msgid="1472275761547230196">"Nema korišćenja od poslednjeg potpunog punjenja"</string>
<string name="battery_not_usage_24hr" msgid="8397519536160741248">"Nema korišćenja u poslednja 24 sata"</string>
<string name="battery_usage_without_time" msgid="1346894834339420538"></string>
+ <string name="battery_usage_other_users" msgid="9002643295562500693">"Ostali korisnici"</string>
<string name="advanced_battery_graph_subtext" msgid="6816737986172678550">"Procena preostalog nivoa napunjenosti baterije je zasnovana na korišćenju uređaja"</string>
<string name="estimated_time_left" msgid="948717045180211777">"Procenjeno preostalo vreme"</string>
<string name="estimated_charging_time_left" msgid="2287135413363961246">"Do potpunog punjenja"</string>
diff --git a/res/values-be/strings.xml b/res/values-be/strings.xml
index 3841b8f..e455b56 100644
--- a/res/values-be/strings.xml
+++ b/res/values-be/strings.xml
@@ -3002,6 +3002,8 @@
<string name="battery_not_usage" msgid="1472275761547230196">"Не выкарыстоўваўся з моманту апошняй поўнай зарадкі"</string>
<string name="battery_not_usage_24hr" msgid="8397519536160741248">"Не выкарыстоўваўся ў апошнія 24 гадз"</string>
<string name="battery_usage_without_time" msgid="1346894834339420538"></string>
+ <!-- no translation found for battery_usage_other_users (9002643295562500693) -->
+ <skip />
<string name="advanced_battery_graph_subtext" msgid="6816737986172678550">"Ацэнка стану акумулятара заснавана на выкарыстанні прылады"</string>
<string name="estimated_time_left" msgid="948717045180211777">"Прыблзіны час, які застаўся"</string>
<string name="estimated_charging_time_left" msgid="2287135413363961246">"Да поўнай зарадкі"</string>
diff --git a/res/values-bg/strings.xml b/res/values-bg/strings.xml
index 6b24c74..8f0323c 100644
--- a/res/values-bg/strings.xml
+++ b/res/values-bg/strings.xml
@@ -2926,6 +2926,8 @@
<string name="battery_not_usage" msgid="1472275761547230196">"Батерията не е използвана след последното пълно зареждане"</string>
<string name="battery_not_usage_24hr" msgid="8397519536160741248">"Батерията не е използвана през последните 24 ч"</string>
<string name="battery_usage_without_time" msgid="1346894834339420538"></string>
+ <!-- no translation found for battery_usage_other_users (9002643295562500693) -->
+ <skip />
<string name="advanced_battery_graph_subtext" msgid="6816737986172678550">"Прогнозата за оставащата батерия е въз основа на използването на устройството ви"</string>
<string name="estimated_time_left" msgid="948717045180211777">"Приблизително оставащо време"</string>
<string name="estimated_charging_time_left" msgid="2287135413363961246">"До пълно зареждане"</string>
diff --git a/res/values-bn/strings.xml b/res/values-bn/strings.xml
index aa6cf7e..eb85825 100644
--- a/res/values-bn/strings.xml
+++ b/res/values-bn/strings.xml
@@ -339,7 +339,7 @@
<string name="safety_center_title" msgid="7732397372178774777">"নিরাপত্তা এবং গোপনীয়তা"</string>
<string name="safety_center_summary" msgid="3554867379951053869">"অ্যাপের নিরাপত্তা, ডিভাইস লক, অনুমতি"</string>
<string name="security_settings_face_preference_summary" msgid="6675126437396914838">"ফেস যোগ করা হয়েছে"</string>
- <string name="security_settings_face_preference_summary_none" msgid="5952752252122581846">"মুখ সেট আপ করতে ট্যাপ করুন"</string>
+ <string name="security_settings_face_preference_summary_none" msgid="5952752252122581846">"ফেস সেট আপ করতে ট্যাপ করুন"</string>
<string name="security_settings_face_preference_title" msgid="2126625155005348417">"ফেস আনলক"</string>
<string name="security_settings_face_profile_preference_title" msgid="7519527436266375005">"অফিসের জন্য \'ফেস আনলক\'"</string>
<string name="security_settings_face_enroll_education_title" msgid="6448806884597691208">"\'ফেস আনলক\' কীভাবে সেট আপ করবেন"</string>
@@ -2924,6 +2924,8 @@
<string name="battery_not_usage" msgid="1472275761547230196">"শেষ বার সম্পূর্ণ চার্জ করার পরে আর ব্যাটারি ব্যবহার করা হয়নি"</string>
<string name="battery_not_usage_24hr" msgid="8397519536160741248">"গত ২৪ ঘন্টায় ব্যাটারি আর ব্যবহার করা হয়নি"</string>
<string name="battery_usage_without_time" msgid="1346894834339420538"></string>
+ <!-- no translation found for battery_usage_other_users (9002643295562500693) -->
+ <skip />
<string name="advanced_battery_graph_subtext" msgid="6816737986172678550">"আপনার ডিভাইসের ব্যবহারের উপর ভিত্তি করে ব্যাটারি কতক্ষণ চলবে তার আনুমানিক হিসাব"</string>
<string name="estimated_time_left" msgid="948717045180211777">"আনুমানিক কতক্ষণ বাকি"</string>
<string name="estimated_charging_time_left" msgid="2287135413363961246">"সম্পূর্ণ চার্জ না হওয়া পর্যন্ত"</string>
diff --git a/res/values-bs/strings.xml b/res/values-bs/strings.xml
index 1d82c36..1efb6a6 100644
--- a/res/values-bs/strings.xml
+++ b/res/values-bs/strings.xml
@@ -2962,6 +2962,7 @@
<string name="battery_not_usage" msgid="1472275761547230196">"Nema korištenja od posljednje potpune napunjenosti"</string>
<string name="battery_not_usage_24hr" msgid="8397519536160741248">"Nema korištenja za posljednja 24 h"</string>
<string name="battery_usage_without_time" msgid="1346894834339420538"></string>
+ <string name="battery_usage_other_users" msgid="9002643295562500693">"Drugi korisnici"</string>
<string name="advanced_battery_graph_subtext" msgid="6816737986172678550">"Procjena preostalog trajanja baterije zasnovana je na korištenju uređaja"</string>
<string name="estimated_time_left" msgid="948717045180211777">"Procjena preostalog vremena"</string>
<string name="estimated_charging_time_left" msgid="2287135413363961246">"Do potpune napunjenosti"</string>
diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml
index e5c6640..75d99fb 100644
--- a/res/values-ca/strings.xml
+++ b/res/values-ca/strings.xml
@@ -433,7 +433,7 @@
<string name="security_settings_fingerprint_enroll_introduction_title" msgid="7931650601996313070">"Configura l\'empremta digital"</string>
<string name="security_settings_fingerprint_enroll_consent_introduction_title" msgid="2278592030102282364">"Permet desbloqueig amb empremta"</string>
<string name="security_settings_fingerprint_enroll_introduction_title_unlock_disabled" msgid="1911710308293783998">"Utilitzar l\'empremta digital"</string>
- <string name="security_settings_fingerprint_enroll_introduction_v2_message" product="tablet" msgid="1533352560544756928">"Utilitza l\'empremta digital per desbloquejar la tauleta o verificar la teva identitat, com ara quan inicies la sessió en aplicacions o aproves una compra."</string>
+ <string name="security_settings_fingerprint_enroll_introduction_v2_message" product="tablet" msgid="1533352560544756928">"Utilitza l\'empremta digital per desbloquejar la tauleta o verificar que ets tu, com ara quan inicies la sessió en aplicacions o aproves una compra."</string>
<string name="security_settings_fingerprint_enroll_introduction_v2_message" product="device" msgid="3570866595300511932">"Utilitza l\'empremta digital per desbloquejar el dispositiu o verificar la teva identitat, com ara quan inicies la sessió en aplicacions o aproves una compra."</string>
<string name="security_settings_fingerprint_enroll_introduction_v2_message" product="default" msgid="8539442240212670385">"Utilitza l\'empremta digital per desbloquejar el telèfon o verificar la teva identitat, com ara quan inicies la sessió en aplicacions o aproves una compra."</string>
<string name="security_settings_fingerprint_enroll_introduction_consent_message" msgid="1833139688278350628">"Permet que el teu fill utilitzi l\'empremta digital per desbloquejar el telèfon o verificar la seva identitat. Ho podrà fer quan iniciï la sessió en aplicacions, aprovi una compra, etc."</string>
@@ -473,7 +473,7 @@
<string name="security_settings_fingerprint_v2_enroll_acquire_too_fast" msgid="5891227328100822018">"Aixeca el dit quan notis una vibració"</string>
<string name="security_settings_fingerprint_v2_enroll_acquire_too_bright" msgid="769646735950329315">"Ves a un lloc menys il·luminat i torna-ho a provar"</string>
<string name="security_settings_fingerprint_v2_enroll_error_max_attempts" msgid="1464972470750764128">"Has arribat al nombre màxim d\'intents"</string>
- <string name="security_settings_fingerprint_v2_home_screen_text" product="tablet" msgid="179325591887291180">"Utilitza l\'empremta digital per desbloquejar la tauleta o verificar la teva identitat, com quan inicies la sessió en aplicacions"</string>
+ <string name="security_settings_fingerprint_v2_home_screen_text" product="tablet" msgid="179325591887291180">"Utilitza l\'empremta digital per desbloquejar la tauleta o verificar que ets tu, com quan inicies la sessió en aplicacions"</string>
<string name="security_settings_fingerprint_v2_home_screen_text" product="device" msgid="2503218139575057099">"Utilitza l\'empremta digital per desbloquejar el dispositiu o verificar la teva identitat, com quan inicies la sessió en aplicacions"</string>
<string name="security_settings_fingerprint_v2_home_screen_text" product="default" msgid="481286891358925579">"Utilitza l\'empremta digital per desbloquejar el telèfon o verificar la teva identitat, com quan inicies la sessió en aplicacions"</string>
<string name="security_settings_biometric_preference_title" msgid="298146483579539448">"Desbloqueig facial i amb empremta digital"</string>
@@ -529,7 +529,7 @@
<string name="security_settings_udfps_enroll_repeat_a11y_message" msgid="2785464357615568197">"Això ajuda a capturar millor l\'empremta digital"</string>
<string name="security_settings_udfps_enroll_progress_a11y_message" msgid="6183535114682369699">"Registre de l\'empremta digital <xliff:g id="PERCENTAGE">%d</xliff:g> per cent"</string>
<string name="security_settings_fingerprint_enroll_finish_title" msgid="3606325177406951457">"S\'ha afegit l\'empremta digital"</string>
- <string name="security_settings_fingerprint_enroll_finish_v2_message" product="tablet" msgid="5918110416185820480">"La funció Desbloqueig amb empremta digital millora com més la utilitzes per desbloquejar la tauleta o verificar la teva identitat en aplicacions"</string>
+ <string name="security_settings_fingerprint_enroll_finish_v2_message" product="tablet" msgid="5918110416185820480">"La funció Desbloqueig amb empremta digital millora com més la utilitzes per desbloquejar la tauleta o verificar que ets tu en aplicacions"</string>
<string name="security_settings_fingerprint_enroll_finish_v2_message" product="device" msgid="2989276789236025675">"La funció Desbloqueig amb empremta digital millora com més la utilitzes per desbloquejar el dispositiu o verificar la teva identitat en aplicacions"</string>
<string name="security_settings_fingerprint_enroll_finish_v2_message" product="default" msgid="6506437402392739879">"La funció Desbloqueig amb empremta digital millora com més la utilitzes per desbloquejar el telèfon o verificar la teva identitat en aplicacions"</string>
<string name="security_settings_fingerprint_enroll_enrolling_skip" msgid="3004786457919122854">"Fes-ho més tard"</string>
@@ -2924,6 +2924,8 @@
<string name="battery_not_usage" msgid="1472275761547230196">"Sense ús des de la darrera càrrega completa"</string>
<string name="battery_not_usage_24hr" msgid="8397519536160741248">"Sense ús durant les 24 darreres hores"</string>
<string name="battery_usage_without_time" msgid="1346894834339420538"></string>
+ <!-- no translation found for battery_usage_other_users (9002643295562500693) -->
+ <skip />
<string name="advanced_battery_graph_subtext" msgid="6816737986172678550">"L\'estimació de la bateria restant es basa en l\'ús del teu dispositiu"</string>
<string name="estimated_time_left" msgid="948717045180211777">"Temps estimat restant"</string>
<string name="estimated_charging_time_left" msgid="2287135413363961246">"Fins a completar la càrrega"</string>
diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml
index bf358d7..f4683f6 100644
--- a/res/values-cs/strings.xml
+++ b/res/values-cs/strings.xml
@@ -3000,6 +3000,8 @@
<string name="battery_not_usage" msgid="1472275761547230196">"Od posledního nabití žádné využití"</string>
<string name="battery_not_usage_24hr" msgid="8397519536160741248">"Za posledních 24 hodin žádné využití"</string>
<string name="battery_usage_without_time" msgid="1346894834339420538"></string>
+ <!-- no translation found for battery_usage_other_users (9002643295562500693) -->
+ <skip />
<string name="advanced_battery_graph_subtext" msgid="6816737986172678550">"Odhad zbývající výdrže baterie vychází z vašeho používání zařízení"</string>
<string name="estimated_time_left" msgid="948717045180211777">"Odhadovaný zbývající čas"</string>
<string name="estimated_charging_time_left" msgid="2287135413363961246">"Do úplného nabití"</string>
@@ -3355,7 +3357,7 @@
<string name="vpn_mppe" msgid="7366657055055114239">"Šifrování PPP (MPPE)"</string>
<string name="vpn_l2tp_secret" msgid="2356744369959140121">"Tajný klíč L2TP"</string>
<string name="vpn_ipsec_identifier" msgid="8511842694369254801">"Identifikátor protokolu IPSec"</string>
- <string name="vpn_ipsec_secret" msgid="532007567355505963">"Předsdílený klíč IPSec"</string>
+ <string name="vpn_ipsec_secret" msgid="532007567355505963">"Předem sdílený klíč IPSec"</string>
<string name="vpn_ipsec_user_cert" msgid="2714372103705048405">"Uživatelský certifikát IPSec"</string>
<string name="vpn_ipsec_ca_cert" msgid="5558498943577474987">"Certifikát CA protokolu IPSec"</string>
<string name="vpn_ipsec_server_cert" msgid="1411390470454731396">"Certifikát serveru IPSec"</string>
diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml
index 23baf55..0db0ad4 100644
--- a/res/values-da/strings.xml
+++ b/res/values-da/strings.xml
@@ -2924,6 +2924,8 @@
<string name="battery_not_usage" msgid="1472275761547230196">"Ikke brugt i baggrunden siden sidste fulde opladning"</string>
<string name="battery_not_usage_24hr" msgid="8397519536160741248">"Ikke brugt i løbet af de seneste 24 timer"</string>
<string name="battery_usage_without_time" msgid="1346894834339420538"></string>
+ <!-- no translation found for battery_usage_other_users (9002643295562500693) -->
+ <skip />
<string name="advanced_battery_graph_subtext" msgid="6816737986172678550">"Den resterende batteritid er et skøn, der baseres på din brug af enheden"</string>
<string name="estimated_time_left" msgid="948717045180211777">"Estimeret resterende tid"</string>
<string name="estimated_charging_time_left" msgid="2287135413363961246">"Indtil den er fuldt opladet"</string>
diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml
index fabc4c4..64a115e 100644
--- a/res/values-de/strings.xml
+++ b/res/values-de/strings.xml
@@ -2927,6 +2927,8 @@
<string name="battery_not_usage" msgid="1472275761547230196">"Keine Nutzung seit der letzten vollständigen Aufladung"</string>
<string name="battery_not_usage_24hr" msgid="8397519536160741248">"Keine Nutzung in den letzten 24 Stunden"</string>
<string name="battery_usage_without_time" msgid="1346894834339420538"></string>
+ <!-- no translation found for battery_usage_other_users (9002643295562500693) -->
+ <skip />
<string name="advanced_battery_graph_subtext" msgid="6816737986172678550">"Die verbleibende Akkulaufzeit wird anhand der Gerätenutzung geschätzt"</string>
<string name="estimated_time_left" msgid="948717045180211777">"Geschätzte verbleibende Akkulaufzeit"</string>
<string name="estimated_charging_time_left" msgid="2287135413363961246">"Bis zur vollständigen Aufladung"</string>
@@ -5142,7 +5144,7 @@
<string name="app_info_storage_title" msgid="4076977173803093808">"Belegter Speicherplatz"</string>
<string name="webview_uninstalled_for_user" msgid="627352948986275488">"(für Nutzer <xliff:g id="USER">%s</xliff:g> deinstalliert)"</string>
<string name="webview_disabled_for_user" msgid="5809886172032644498">"(für Nutzer <xliff:g id="USER">%s</xliff:g> deaktiviert)"</string>
- <string name="autofill_app" msgid="7595308061826307921">"Dienst für automatisches Ausfüllen"</string>
+ <string name="autofill_app" msgid="7595308061826307921">"Autofill-Service"</string>
<string name="autofill_passwords" msgid="6708057251459761083">"Passwörter"</string>
<plurals name="autofill_passwords_count" formatted="false" msgid="7715009165029452622">
<item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> Passwörter</item>
diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml
index 7ebfb84..3618a2f 100644
--- a/res/values-el/strings.xml
+++ b/res/values-el/strings.xml
@@ -476,7 +476,7 @@
<string name="security_settings_fingerprint_v2_home_screen_text" product="tablet" msgid="179325591887291180">"Χρησιμοποιήστε το δακτυλικό σας αποτύπωμα για να ξεκλειδώνετε το tablet σας ή να επαληθεύετε την ταυτότητά σας, για παράδειγμα, όταν συνδέεστε σε εφαρμογές"</string>
<string name="security_settings_fingerprint_v2_home_screen_text" product="device" msgid="2503218139575057099">"Χρησιμοποιήστε το δακτυλικό σας αποτύπωμα για να ξεκλειδώνετε τη συσκευή σας ή να επαληθεύετε την ταυτότητά σας, για παράδειγμα, όταν συνδέεστε σε εφαρμογές"</string>
<string name="security_settings_fingerprint_v2_home_screen_text" product="default" msgid="481286891358925579">"Χρησιμοποιήστε το δακτυλικό σας αποτύπωμα για να ξεκλειδώνετε το τηλέφωνό σας ή να επαληθεύετε την ταυτότητά σας, για παράδειγμα, όταν συνδέεστε σε εφαρμογές"</string>
- <string name="security_settings_biometric_preference_title" msgid="298146483579539448">"Ξεκλείδωμα με το πρόσωπο και με δακτυλικό αποτύπωμα"</string>
+ <string name="security_settings_biometric_preference_title" msgid="298146483579539448">"Ξεκλείδωμα με πρόσωπο/δακτυλ. αποτύπωμα"</string>
<string name="security_settings_biometric_preference_summary_none_enrolled" msgid="6941188982863819389">"Πατήστε για ρύθμιση"</string>
<string name="security_settings_biometric_preference_summary_both_fp_multiple" msgid="4821859306609955966">"Προστέθηκε πρόσωπο και δακτυλικά αποτυπώματα"</string>
<string name="security_settings_biometric_preference_summary_both_fp_single" msgid="684409535278676426">"Προστέθηκε πρόσωπο και δακτυλικό αποτύπωμα"</string>
@@ -2924,6 +2924,8 @@
<string name="battery_not_usage" msgid="1472275761547230196">"Καμία χρήση από την τελευταία πλήρη φόρτιση"</string>
<string name="battery_not_usage_24hr" msgid="8397519536160741248">"Καμία χρήση τις τελευταίες 24 ώρες"</string>
<string name="battery_usage_without_time" msgid="1346894834339420538"></string>
+ <!-- no translation found for battery_usage_other_users (9002643295562500693) -->
+ <skip />
<string name="advanced_battery_graph_subtext" msgid="6816737986172678550">"Η εκτίμηση της μπαταρίας που απομένει βασίζεται στη χρήση της συσκευής σας"</string>
<string name="estimated_time_left" msgid="948717045180211777">"Εκτιμώμενος υπολειπόμενος χρόνος"</string>
<string name="estimated_charging_time_left" msgid="2287135413363961246">"Μέχρι την πλήρη φόρτιση"</string>
diff --git a/res/values-en-rAU/strings.xml b/res/values-en-rAU/strings.xml
index e5bdbd0..2b4621e 100644
--- a/res/values-en-rAU/strings.xml
+++ b/res/values-en-rAU/strings.xml
@@ -476,7 +476,7 @@
<string name="security_settings_fingerprint_v2_home_screen_text" product="tablet" msgid="179325591887291180">"Use your fingerprint to unlock your tablet or verify that it’s you, like when you sign in to apps"</string>
<string name="security_settings_fingerprint_v2_home_screen_text" product="device" msgid="2503218139575057099">"Use your fingerprint to unlock your device or verify that it’s you, like when you sign in to apps"</string>
<string name="security_settings_fingerprint_v2_home_screen_text" product="default" msgid="481286891358925579">"Use your fingerprint to unlock your phone or verify that it’s you, like when you sign in to apps"</string>
- <string name="security_settings_biometric_preference_title" msgid="298146483579539448">"Face & Fingerprint Unlock"</string>
+ <string name="security_settings_biometric_preference_title" msgid="298146483579539448">"Face and Fingerprint Unlock"</string>
<string name="security_settings_biometric_preference_summary_none_enrolled" msgid="6941188982863819389">"Tap to set up"</string>
<string name="security_settings_biometric_preference_summary_both_fp_multiple" msgid="4821859306609955966">"Face and fingerprints added"</string>
<string name="security_settings_biometric_preference_summary_both_fp_single" msgid="684409535278676426">"Face and fingerprint added"</string>
@@ -2924,6 +2924,7 @@
<string name="battery_not_usage" msgid="1472275761547230196">"No usage from last full charge"</string>
<string name="battery_not_usage_24hr" msgid="8397519536160741248">"No usage for past 24 hr"</string>
<string name="battery_usage_without_time" msgid="1346894834339420538"></string>
+ <string name="battery_usage_other_users" msgid="9002643295562500693">"Other users"</string>
<string name="advanced_battery_graph_subtext" msgid="6816737986172678550">"Battery left estimate is based on your device usage"</string>
<string name="estimated_time_left" msgid="948717045180211777">"Estimated time left"</string>
<string name="estimated_charging_time_left" msgid="2287135413363961246">"Until fully charged"</string>
diff --git a/res/values-en-rCA/strings.xml b/res/values-en-rCA/strings.xml
index d45ca3b..25a5f9d 100644
--- a/res/values-en-rCA/strings.xml
+++ b/res/values-en-rCA/strings.xml
@@ -476,7 +476,7 @@
<string name="security_settings_fingerprint_v2_home_screen_text" product="tablet" msgid="179325591887291180">"Use your fingerprint to unlock your tablet or verify that it’s you, like when you sign in to apps"</string>
<string name="security_settings_fingerprint_v2_home_screen_text" product="device" msgid="2503218139575057099">"Use your fingerprint to unlock your device or verify that it’s you, like when you sign in to apps"</string>
<string name="security_settings_fingerprint_v2_home_screen_text" product="default" msgid="481286891358925579">"Use your fingerprint to unlock your phone or verify that it’s you, like when you sign in to apps"</string>
- <string name="security_settings_biometric_preference_title" msgid="298146483579539448">"Face & Fingerprint Unlock"</string>
+ <string name="security_settings_biometric_preference_title" msgid="298146483579539448">"Face and Fingerprint Unlock"</string>
<string name="security_settings_biometric_preference_summary_none_enrolled" msgid="6941188982863819389">"Tap to set up"</string>
<string name="security_settings_biometric_preference_summary_both_fp_multiple" msgid="4821859306609955966">"Face and fingerprints added"</string>
<string name="security_settings_biometric_preference_summary_both_fp_single" msgid="684409535278676426">"Face and fingerprint added"</string>
@@ -2924,6 +2924,7 @@
<string name="battery_not_usage" msgid="1472275761547230196">"No usage from last full charge"</string>
<string name="battery_not_usage_24hr" msgid="8397519536160741248">"No usage for past 24 hr"</string>
<string name="battery_usage_without_time" msgid="1346894834339420538"></string>
+ <string name="battery_usage_other_users" msgid="9002643295562500693">"Other users"</string>
<string name="advanced_battery_graph_subtext" msgid="6816737986172678550">"Battery left estimate is based on your device usage"</string>
<string name="estimated_time_left" msgid="948717045180211777">"Estimated time left"</string>
<string name="estimated_charging_time_left" msgid="2287135413363961246">"Until fully charged"</string>
diff --git a/res/values-en-rGB/strings.xml b/res/values-en-rGB/strings.xml
index 8c9ec41..5e2458d 100644
--- a/res/values-en-rGB/strings.xml
+++ b/res/values-en-rGB/strings.xml
@@ -476,7 +476,7 @@
<string name="security_settings_fingerprint_v2_home_screen_text" product="tablet" msgid="179325591887291180">"Use your fingerprint to unlock your tablet or verify that it’s you, like when you sign in to apps"</string>
<string name="security_settings_fingerprint_v2_home_screen_text" product="device" msgid="2503218139575057099">"Use your fingerprint to unlock your device or verify that it’s you, like when you sign in to apps"</string>
<string name="security_settings_fingerprint_v2_home_screen_text" product="default" msgid="481286891358925579">"Use your fingerprint to unlock your phone or verify that it’s you, like when you sign in to apps"</string>
- <string name="security_settings_biometric_preference_title" msgid="298146483579539448">"Face & Fingerprint Unlock"</string>
+ <string name="security_settings_biometric_preference_title" msgid="298146483579539448">"Face and Fingerprint Unlock"</string>
<string name="security_settings_biometric_preference_summary_none_enrolled" msgid="6941188982863819389">"Tap to set up"</string>
<string name="security_settings_biometric_preference_summary_both_fp_multiple" msgid="4821859306609955966">"Face and fingerprints added"</string>
<string name="security_settings_biometric_preference_summary_both_fp_single" msgid="684409535278676426">"Face and fingerprint added"</string>
@@ -2924,6 +2924,7 @@
<string name="battery_not_usage" msgid="1472275761547230196">"No usage from last full charge"</string>
<string name="battery_not_usage_24hr" msgid="8397519536160741248">"No usage for past 24 hr"</string>
<string name="battery_usage_without_time" msgid="1346894834339420538"></string>
+ <string name="battery_usage_other_users" msgid="9002643295562500693">"Other users"</string>
<string name="advanced_battery_graph_subtext" msgid="6816737986172678550">"Battery left estimate is based on your device usage"</string>
<string name="estimated_time_left" msgid="948717045180211777">"Estimated time left"</string>
<string name="estimated_charging_time_left" msgid="2287135413363961246">"Until fully charged"</string>
diff --git a/res/values-en-rIN/strings.xml b/res/values-en-rIN/strings.xml
index 65a28e7..bd0db03 100644
--- a/res/values-en-rIN/strings.xml
+++ b/res/values-en-rIN/strings.xml
@@ -476,7 +476,7 @@
<string name="security_settings_fingerprint_v2_home_screen_text" product="tablet" msgid="179325591887291180">"Use your fingerprint to unlock your tablet or verify that it’s you, like when you sign in to apps"</string>
<string name="security_settings_fingerprint_v2_home_screen_text" product="device" msgid="2503218139575057099">"Use your fingerprint to unlock your device or verify that it’s you, like when you sign in to apps"</string>
<string name="security_settings_fingerprint_v2_home_screen_text" product="default" msgid="481286891358925579">"Use your fingerprint to unlock your phone or verify that it’s you, like when you sign in to apps"</string>
- <string name="security_settings_biometric_preference_title" msgid="298146483579539448">"Face & Fingerprint Unlock"</string>
+ <string name="security_settings_biometric_preference_title" msgid="298146483579539448">"Face and Fingerprint Unlock"</string>
<string name="security_settings_biometric_preference_summary_none_enrolled" msgid="6941188982863819389">"Tap to set up"</string>
<string name="security_settings_biometric_preference_summary_both_fp_multiple" msgid="4821859306609955966">"Face and fingerprints added"</string>
<string name="security_settings_biometric_preference_summary_both_fp_single" msgid="684409535278676426">"Face and fingerprint added"</string>
@@ -2924,6 +2924,7 @@
<string name="battery_not_usage" msgid="1472275761547230196">"No usage from last full charge"</string>
<string name="battery_not_usage_24hr" msgid="8397519536160741248">"No usage for past 24 hr"</string>
<string name="battery_usage_without_time" msgid="1346894834339420538"></string>
+ <string name="battery_usage_other_users" msgid="9002643295562500693">"Other users"</string>
<string name="advanced_battery_graph_subtext" msgid="6816737986172678550">"Battery left estimate is based on your device usage"</string>
<string name="estimated_time_left" msgid="948717045180211777">"Estimated time left"</string>
<string name="estimated_charging_time_left" msgid="2287135413363961246">"Until fully charged"</string>
diff --git a/res/values-en-rXC/strings.xml b/res/values-en-rXC/strings.xml
index c52d451..0620de0 100644
--- a/res/values-en-rXC/strings.xml
+++ b/res/values-en-rXC/strings.xml
@@ -2924,6 +2924,7 @@
<string name="battery_not_usage" msgid="1472275761547230196">"No usage from last full charge"</string>
<string name="battery_not_usage_24hr" msgid="8397519536160741248">"No usage for past 24 hr"</string>
<string name="battery_usage_without_time" msgid="1346894834339420538"></string>
+ <string name="battery_usage_other_users" msgid="9002643295562500693">"Other users"</string>
<string name="advanced_battery_graph_subtext" msgid="6816737986172678550">"Battery left estimate is based on your device usage"</string>
<string name="estimated_time_left" msgid="948717045180211777">"Estimated time left"</string>
<string name="estimated_charging_time_left" msgid="2287135413363961246">"Until fully charged"</string>
diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml
index b76b6bc..ffe680d 100644
--- a/res/values-es-rUS/strings.xml
+++ b/res/values-es-rUS/strings.xml
@@ -473,10 +473,10 @@
<string name="security_settings_fingerprint_v2_enroll_acquire_too_fast" msgid="5891227328100822018">"Levanta el dedo cuando sientas una vibración"</string>
<string name="security_settings_fingerprint_v2_enroll_acquire_too_bright" msgid="769646735950329315">"Ve a un lugar donde la luz sea menos brillante y vuelve a intentarlo"</string>
<string name="security_settings_fingerprint_v2_enroll_error_max_attempts" msgid="1464972470750764128">"Alcanzaste la cantidad máxima de intentos"</string>
- <string name="security_settings_fingerprint_v2_home_screen_text" product="tablet" msgid="179325591887291180">"Usa tu huella dactilar para desbloquear la tablet o verificar tu identidad, por ejemplo, cuando accedes a apps"</string>
+ <string name="security_settings_fingerprint_v2_home_screen_text" product="tablet" msgid="179325591887291180">"Usa tu huella dactilar para desbloquear la tablet o verificar tu identidad, por ejemplo, cuando accedes a apps."</string>
<string name="security_settings_fingerprint_v2_home_screen_text" product="device" msgid="2503218139575057099">"Usa tu huella dactilar para desbloquear el dispositivo o verificar tu identidad, por ejemplo, cuando accedes a apps"</string>
<string name="security_settings_fingerprint_v2_home_screen_text" product="default" msgid="481286891358925579">"Usa tu huella dactilar para desbloquear el teléfono o verificar tu identidad, como cuando accedes a apps"</string>
- <string name="security_settings_biometric_preference_title" msgid="298146483579539448">"Desbloqueo facial y con huellas dactilares"</string>
+ <string name="security_settings_biometric_preference_title" msgid="298146483579539448">"Desbloqueo facial y con huella dactilar"</string>
<string name="security_settings_biometric_preference_summary_none_enrolled" msgid="6941188982863819389">"Presionar para configurar"</string>
<string name="security_settings_biometric_preference_summary_both_fp_multiple" msgid="4821859306609955966">"Se agregaron huellas dactilares y el rostro"</string>
<string name="security_settings_biometric_preference_summary_both_fp_single" msgid="684409535278676426">"Se agregaron el rostro y la huella dactilar"</string>
@@ -2926,6 +2926,7 @@
<string name="battery_not_usage" msgid="1472275761547230196">"Se se usó desde la última carga completa"</string>
<string name="battery_not_usage_24hr" msgid="8397519536160741248">"Sin uso durante las últimas 24 h"</string>
<string name="battery_usage_without_time" msgid="1346894834339420538"></string>
+ <string name="battery_usage_other_users" msgid="9002643295562500693">"Otros usuarios"</string>
<string name="advanced_battery_graph_subtext" msgid="6816737986172678550">"El cálculo de batería restante se basa en el uso del dispositivo"</string>
<string name="estimated_time_left" msgid="948717045180211777">"Tiempo restante estimado"</string>
<string name="estimated_charging_time_left" msgid="2287135413363961246">"Para completar la carga"</string>
diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml
index 576f46b..f727329 100644
--- a/res/values-es/strings.xml
+++ b/res/values-es/strings.xml
@@ -339,7 +339,7 @@
<string name="safety_center_title" msgid="7732397372178774777">"Seguridad y privacidad"</string>
<string name="safety_center_summary" msgid="3554867379951053869">"Seguridad de aplicaciones, bloqueo del dispositivo, permisos"</string>
<string name="security_settings_face_preference_summary" msgid="6675126437396914838">"Cara añadida"</string>
- <string name="security_settings_face_preference_summary_none" msgid="5952752252122581846">"Toca para configurar cara"</string>
+ <string name="security_settings_face_preference_summary_none" msgid="5952752252122581846">"Toca para configurar la cara"</string>
<string name="security_settings_face_preference_title" msgid="2126625155005348417">"Desbloqueo facial"</string>
<string name="security_settings_face_profile_preference_title" msgid="7519527436266375005">"Desbloqueo facial para el trabajo"</string>
<string name="security_settings_face_enroll_education_title" msgid="6448806884597691208">"Cómo configurar Desbloqueo facial"</string>
@@ -483,7 +483,7 @@
<string name="biometric_settings_intro" msgid="4263069383955676756">"Cuando configures Desbloqueo facial y Desbloqueo con huella digital, el teléfono te pedirá la huella digital si llevas mascarilla o estás en un lugar oscuro"</string>
<string name="biometric_settings_category_ways_to_unlock" msgid="3384767901580915266">"Formas de desbloqueo"</string>
<string name="biometric_settings_use_biometric_unlock_phone" msgid="8180914579885804358">"Desbloquear teléfono"</string>
- <string name="biometric_settings_use_biometric_for_apps" msgid="6201168728906364189">"Verificar que eres tú"</string>
+ <string name="biometric_settings_use_biometric_for_apps" msgid="6201168728906364189">"Verificar que eres tú en aplicaciones"</string>
<string name="biometric_settings_use_face_preference_summary" msgid="1821648836899408477">"Usar la cara"</string>
<string name="biometric_settings_use_fingerprint_preference_summary" msgid="6077762097826050165">"Usar la huella digital"</string>
<string name="biometric_settings_use_face_or_fingerprint_preference_summary" msgid="3029102492674234728">"Usar la cara o la huella digital"</string>
@@ -2924,6 +2924,8 @@
<string name="battery_not_usage" msgid="1472275761547230196">"Sin uso desde la última carga completa"</string>
<string name="battery_not_usage_24hr" msgid="8397519536160741248">"Sin uso durante las últimas 24 horas"</string>
<string name="battery_usage_without_time" msgid="1346894834339420538"></string>
+ <!-- no translation found for battery_usage_other_users (9002643295562500693) -->
+ <skip />
<string name="advanced_battery_graph_subtext" msgid="6816737986172678550">"La estimación de la batería restante se basa en el uso de tu dispositivo"</string>
<string name="estimated_time_left" msgid="948717045180211777">"Tiempo restante estimado"</string>
<string name="estimated_charging_time_left" msgid="2287135413363961246">"Hasta completar la carga"</string>
@@ -3680,12 +3682,12 @@
<string name="keywords_ambient_display" msgid="3149287105145443697">"notificación entrante"</string>
<string name="keywords_hotspot_tethering" msgid="3688439689671232627">"conexión compartida por usb, conexión compartida por bluetooth, punto de acceso wi‑fi"</string>
<string name="keywords_accessibility_vibration_primary_switch" msgid="730692154347231253">"vibración al pulsar, vibrar, vibración"</string>
- <string name="keywords_touch_vibration" msgid="1125291201902251273">"háptica, vibrar, pantalla, sensibilidad"</string>
- <string name="keywords_ring_vibration" msgid="1736301626537417541">"háptica, vibrar, teléfono, llamada, sensibilidad, tono"</string>
- <string name="keywords_ramping_ringer_vibration" msgid="3678966746742257366">"vibración, vibrar, teléfono, llamada, tono, gradual"</string>
- <string name="keywords_notification_vibration" msgid="2620799301276142183">"háptica, vibrar, sensibilidad, notificación"</string>
- <string name="keywords_alarm_vibration" msgid="4833220371621521817">"háptica, vibrar, sensibilidad, alarma"</string>
- <string name="keywords_media_vibration" msgid="723896490102792327">"háptica, vibrar, sensibilidad, multimedia"</string>
+ <string name="keywords_touch_vibration" msgid="1125291201902251273">"vibración al pulsar, vibrar, pantalla, sensibilidad"</string>
+ <string name="keywords_ring_vibration" msgid="1736301626537417541">"vibración al pulsar, vibrar, teléfono, llamada, sensibilidad, tono"</string>
+ <string name="keywords_ramping_ringer_vibration" msgid="3678966746742257366">"vibración al pulsar, vibrar, teléfono, llamada, tono, gradual"</string>
+ <string name="keywords_notification_vibration" msgid="2620799301276142183">"vibración al pulsar, vibrar, sensibilidad, notificación"</string>
+ <string name="keywords_alarm_vibration" msgid="4833220371621521817">"vibración al pulsar, vibrar, sensibilidad, alarma"</string>
+ <string name="keywords_media_vibration" msgid="723896490102792327">"vibración al pulsar, vibrar, sensibilidad, multimedia"</string>
<string name="keywords_vibration" msgid="670455132028025952">"vibración al pulsar, vibrar, vibración"</string>
<string name="keywords_battery_saver_sticky" msgid="1646191718840975110">"ahorro de batería, batería fija, duradera, ahorro de batería, batería"</string>
<string name="keywords_battery_saver_schedule" msgid="8240483934368455930">"rutina, horario, ahorro de batería, ahorro de corriente, batería, automático, porcentaje"</string>
diff --git a/res/values-et/strings.xml b/res/values-et/strings.xml
index 7e0560e..020cdb8 100644
--- a/res/values-et/strings.xml
+++ b/res/values-et/strings.xml
@@ -2926,6 +2926,8 @@
<string name="battery_not_usage" msgid="1472275761547230196">"Pole alates viimasest täislaadimisest kasutatud"</string>
<string name="battery_not_usage_24hr" msgid="8397519536160741248">"Pole viimase 24 tunni jooksul kasutatud"</string>
<string name="battery_usage_without_time" msgid="1346894834339420538"></string>
+ <!-- no translation found for battery_usage_other_users (9002643295562500693) -->
+ <skip />
<string name="advanced_battery_graph_subtext" msgid="6816737986172678550">"Aku järelejäänud tööaja prognoos põhineb seadme kasutusel"</string>
<string name="estimated_time_left" msgid="948717045180211777">"Hinnanguline järelejäänud aeg"</string>
<string name="estimated_charging_time_left" msgid="2287135413363961246">"Täislaadimiseni"</string>
diff --git a/res/values-eu/strings.xml b/res/values-eu/strings.xml
index 4323345..6c605b0 100644
--- a/res/values-eu/strings.xml
+++ b/res/values-eu/strings.xml
@@ -340,7 +340,7 @@
<string name="safety_center_summary" msgid="3554867379951053869">"Aplikazioen segurtasuna, gailuaren blokeoa, baimenak"</string>
<string name="security_settings_face_preference_summary" msgid="6675126437396914838">"Gehitu da aurpegia"</string>
<string name="security_settings_face_preference_summary_none" msgid="5952752252122581846">"Sakatu aurpegi bidez desblokeatzeko eginbidea konfiguratzeko"</string>
- <string name="security_settings_face_preference_title" msgid="2126625155005348417">"Aurpegi bidez desblokeatzeko eginbidea"</string>
+ <string name="security_settings_face_preference_title" msgid="2126625155005348417">"Aurpegi bidez desblokeatzea"</string>
<string name="security_settings_face_profile_preference_title" msgid="7519527436266375005">"Aurpegi bidez desblokeatzeko eginbidea lanerako"</string>
<string name="security_settings_face_enroll_education_title" msgid="6448806884597691208">"Aurpegi bidez desblokeatzeko eginbidea konfiguratzeko argibideak"</string>
<string name="security_settings_face_enroll_education_title_accessibility" msgid="3701874093226957891">"Konfiguratu aurpegi bidez desblokeatzeko eginbidea"</string>
@@ -476,7 +476,7 @@
<string name="security_settings_fingerprint_v2_home_screen_text" product="tablet" msgid="179325591887291180">"Erabili hatz-marka tableta desblokeatzeko edo zeu zarela egiaztatzeko, hala nola aplikazioetan saioa hastean"</string>
<string name="security_settings_fingerprint_v2_home_screen_text" product="device" msgid="2503218139575057099">"Erabili hatz-marka gailua blokeatzeko edo zeu zarela egiaztatzeko, hala nola aplikazioetan saioa hastean"</string>
<string name="security_settings_fingerprint_v2_home_screen_text" product="default" msgid="481286891358925579">"Erabili hatz-marka telefonoa desblokeatzeko edo zeu zarela egiaztatzeko, hala nola aplikazioetan saioa hastean"</string>
- <string name="security_settings_biometric_preference_title" msgid="298146483579539448">"Aurpegi eta hatz-marka bidez desblokeatzeko eginbidea"</string>
+ <string name="security_settings_biometric_preference_title" msgid="298146483579539448">"Aurpegi eta hatz-marka bidez desblokeatzea"</string>
<string name="security_settings_biometric_preference_summary_none_enrolled" msgid="6941188982863819389">"Sakatu konfiguratzeko"</string>
<string name="security_settings_biometric_preference_summary_both_fp_multiple" msgid="4821859306609955966">"Aurpegia eta hatz-markak gehitu dira"</string>
<string name="security_settings_biometric_preference_summary_both_fp_single" msgid="684409535278676426">"Aurpegia eta hatz-marka gehitu dira"</string>
@@ -736,7 +736,7 @@
<string name="unlock_change_lock_pattern_title" msgid="8234523589333929193">"Aldatu desblokeatzeko eredua"</string>
<string name="unlock_change_lock_pin_title" msgid="2324077520816477479">"Aldatu desblokeo PINa"</string>
<string name="unlock_change_lock_password_title" msgid="873517913969091074">"Aldatu desblokeatzeko pasahitza"</string>
- <string name="unlock_footer_high_complexity_requested" msgid="4471274783909915352">"<xliff:g id="APP_NAME">%1$s</xliff:g> aplikazioak PIN edo pasahitz seguru bat erabiltzea gomendatzen du, eta baliteke ez funtzionatzea behar bezala halakorik gabe"</string>
+ <string name="unlock_footer_high_complexity_requested" msgid="4471274783909915352">"<xliff:g id="APP_NAME">%1$s</xliff:g> aplikazioak PIN edo pasahitz konplexu bat erabiltzea gomendatzen du, eta baliteke ez funtzionatzea behar bezala halakorik gabe"</string>
<string name="unlock_footer_medium_complexity_requested" msgid="5515870066751600640">"<xliff:g id="APP_NAME">%1$s</xliff:g> aplikazioak beste PIN edo pasahitz bat erabiltzea gomendatzen du, eta baliteke ez funtzionatzea behar bezala halakorik gabe"</string>
<string name="unlock_footer_low_complexity_requested" msgid="2517656037576567971">"<xliff:g id="APP_NAME">%1$s</xliff:g> aplikazioak beste eredu, PIN edo pasahitz bat erabiltzea gomendatzen du, eta baliteke ez funtzionatzea behar bezala halakorik gabe"</string>
<string name="unlock_footer_none_complexity_requested" msgid="8534900170428140529">"<xliff:g id="APP_NAME">%1$s</xliff:g> aplikazioak pantailaren beste blokeo bat erabiltzea gomendatzen du"</string>
@@ -2042,9 +2042,9 @@
</plurals>
<string name="forgot_password_title" msgid="3967873480875239885">"Galdetu IKT saileko administratzaileari"</string>
<string name="forgot_password_text" msgid="2583194470767613163">"PINa, eredua edo pasahitza berrezartzen lagunduko dizu"</string>
- <string name="install_all_warning" product="tablet" msgid="7010749217925069520">"Tabletak eta datu pertsonalek aplikazio ezezagunen erasoak jaso ditzakete. Iturburu honetako aplikazioak instalatzen badituzu, onartu egingo duzu haiek erabiltzeagatik tabletari gerta dakizkiokeen kalteen edo datu-galeren erantzulea zeu zarela."</string>
+ <string name="install_all_warning" product="tablet" msgid="7010749217925069520">"Baliteke tabletak eta datu pertsonalek aplikazio ezezagunen erasoak jasatea. Iturburu honetako aplikazioak instalatzen badituzu, onartu egingo duzu haiek erabiltzeagatik tabletari agian gertatuko zaizkion kalteen edo datu-galeren erantzulea zeu zarela."</string>
<string name="install_all_warning" product="default" msgid="652516435709047343">"Baliteke telefonoak eta datu pertsonalek aplikazio ezezagunen erasoak jasatea. Iturburu honetako aplikazioak instalatzen badituzu, onartu egingo duzu zeu zarela haiek erabiltzeagatik telefonoari agian gertatuko zaizkion kalteen edo datu-galeren erantzulea."</string>
- <string name="install_all_warning" product="device" msgid="2348262609815354500">"Gailuak eta datu pertsonalek aplikazio ezezagunen erasoak jaso ditzakete. Iturburu honetako aplikazioak instalatzen badituzu, onartu egingo duzu haiek erabiltzeagatik gailuari agian gertatuko zaizkion kalteen edo datu-galeren erantzulea zeu izango zarela."</string>
+ <string name="install_all_warning" product="device" msgid="2348262609815354500">"Baliteke gailuak eta datu pertsonalek aplikazio ezezagunen erasoak jasatea. Iturburu honetako aplikazioak instalatzen badituzu, onartu egingo duzu haiek erabiltzeagatik gailuari agian gertatuko zaizkion kalteen edo datu-galeren erantzulea zeu izango zarela."</string>
<string name="advanced_settings" msgid="2368905204839169094">"Ezarpen aurreratuak"</string>
<string name="advanced_settings_summary" msgid="1823765348195530035">"Gaitu ezarpenen aukera gehiago"</string>
<string name="application_info_label" msgid="1015706497694165866">"Aplikazioen informazioa"</string>
@@ -2924,6 +2924,8 @@
<string name="battery_not_usage" msgid="1472275761547230196">"Erabilerarik ez bateria guztiz kargatu zenetik"</string>
<string name="battery_not_usage_24hr" msgid="8397519536160741248">"Erabilerarik ez azken 24 orduetan"</string>
<string name="battery_usage_without_time" msgid="1346894834339420538"></string>
+ <!-- no translation found for battery_usage_other_users (9002643295562500693) -->
+ <skip />
<string name="advanced_battery_graph_subtext" msgid="6816737986172678550">"Gailuaren erabileran oinarritzen da gelditzen den bateriaren aurreikuspena"</string>
<string name="estimated_time_left" msgid="948717045180211777">"Geratzen den denbora, gutxi gorabehera"</string>
<string name="estimated_charging_time_left" msgid="2287135413363961246">"guztiz kargatu arte"</string>
diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml
index 2b396bb..3106e91 100644
--- a/res/values-fa/strings.xml
+++ b/res/values-fa/strings.xml
@@ -1469,7 +1469,7 @@
<string name="sim_lock_settings" msgid="4493069398250139205">"تنظیمات قفل سیم کارت"</string>
<string name="sim_lock_settings_category" msgid="4280307997492851625">"قفل سیم کارت"</string>
<string name="sim_lock_settings_summary_off" msgid="4570941250786847095">"خاموش"</string>
- <string name="sim_lock_settings_summary_on" msgid="1562184566830887925">"قفل شد"</string>
+ <string name="sim_lock_settings_summary_on" msgid="1562184566830887925">"قفلشده"</string>
<string name="sim_lock_settings_title" msgid="1401619059761012696">"قفل سیم کارت"</string>
<string name="sim_pin_toggle" msgid="98754920202404425">"قفل کردن سیم کارت"</string>
<string name="sim_lock_on" product="tablet" msgid="5857965768682972363">"درخواست پین برای استفاده از رایانهٔ لوحی"</string>
@@ -2924,6 +2924,8 @@
<string name="battery_not_usage" msgid="1472275761547230196">"از آخرین شارژ کامل استفاده نشده است"</string>
<string name="battery_not_usage_24hr" msgid="8397519536160741248">"در ۲۴ ساعت گذشته استفاده نشده است"</string>
<string name="battery_usage_without_time" msgid="1346894834339420538"></string>
+ <!-- no translation found for battery_usage_other_users (9002643295562500693) -->
+ <skip />
<string name="advanced_battery_graph_subtext" msgid="6816737986172678550">"شارژ باتری باقیمانده براساس مصرف دستگاه تخمین زده میشود"</string>
<string name="estimated_time_left" msgid="948717045180211777">"زمان باقیمانده تخمینی"</string>
<string name="estimated_charging_time_left" msgid="2287135413363961246">"مانده تا شارژ کامل"</string>
@@ -3681,8 +3683,8 @@
<string name="keywords_hotspot_tethering" msgid="3688439689671232627">"اشتراکگذاری اینترنت با USB، اتصال اینترنت به بلوتوث تلفن همراه، نقطه اتصال Wi-Fi"</string>
<string name="keywords_accessibility_vibration_primary_switch" msgid="730692154347231253">"لمس، لرزیدن، لرزش"</string>
<string name="keywords_touch_vibration" msgid="1125291201902251273">"لمسی، لرزش، صفحه نمایش، حساسیت"</string>
- <string name="keywords_ring_vibration" msgid="1736301626537417541">"لمس، لرزش، تلفن، تماس، حساسیت، به صدا در آوردن زنگ"</string>
- <string name="keywords_ramping_ringer_vibration" msgid="3678966746742257366">"لمس، لرزش، تلفن، تماس، به صدا در آوردن زنگ، بهتدریج"</string>
+ <string name="keywords_ring_vibration" msgid="1736301626537417541">"لمس، لرزش، تلفن، تماس، حساسیت، زنگ"</string>
+ <string name="keywords_ramping_ringer_vibration" msgid="3678966746742257366">"لمس، لرزش، تلفن، تماس، زنگ، بهتدریج"</string>
<string name="keywords_notification_vibration" msgid="2620799301276142183">"لمس، لرزش، حساسیت، اعلان"</string>
<string name="keywords_alarm_vibration" msgid="4833220371621521817">"لمس، لرزش، حساسیت، هشدار"</string>
<string name="keywords_media_vibration" msgid="723896490102792327">"لمس، لرزش، حساسیت، رسانه"</string>
@@ -4050,7 +4052,7 @@
<string name="notif_type_silent" msgid="6273951794420331010">"بیصدا"</string>
<string name="notif_type_silent_summary" msgid="7820923063105060844">"اعلانهایی که همیشه بیصدا هستند و نمیلرزند"</string>
<string name="notification_listener_allowed" msgid="5536962633536318551">"مجاز"</string>
- <string name="notification_listener_not_allowed" msgid="3352962779597846538">"مجاز نیست"</string>
+ <string name="notification_listener_not_allowed" msgid="3352962779597846538">"اجازه ندادن"</string>
<string name="notif_listener_excluded_app_title" msgid="6679316209330349730">"مشاهده همه برنامهها"</string>
<string name="notif_listener_excluded_app_summary" msgid="2914567678047195396">"تغییر دادن تنظیمات هر برنامهای که اعلان ارسال میکند"</string>
<string name="notif_listener_excluded_app_screen_title" msgid="8636196723227432994">"برنامههایی که در دستگاه نشان داده میشوند"</string>
diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml
index 768c1a4..b9dc8ae 100644
--- a/res/values-fi/strings.xml
+++ b/res/values-fi/strings.xml
@@ -1293,7 +1293,7 @@
<string name="volume_alarm_mute" msgid="3730895630530980760">"Mykistä herätykset"</string>
<string name="dock_settings" msgid="4654404127402812514">"Telakointi"</string>
<string name="dock_settings_title" msgid="1276956575555480214">"Telakointiasetukset"</string>
- <string name="dock_audio_settings_title" msgid="8294821925086965934">"Ääni"</string>
+ <string name="dock_audio_settings_title" msgid="8294821925086965934">"Audio"</string>
<string name="dock_audio_summary_desk" msgid="4158593887711452737">"Yhdistetyn työpöytätelakan asetukset"</string>
<string name="dock_audio_summary_car" msgid="292911654994476080">"Yhdistetyn autotelakan asetukset"</string>
<string name="dock_audio_summary_none" product="tablet" msgid="7758416095500202500">"Tablet-laitetta ei ole telakoitu"</string>
@@ -1795,7 +1795,7 @@
<string name="main_clear_final_desc_esim" msgid="440406836793824969">"Kaikki henkilökohtaiset tietosi poistetaan, mukaan lukien ladatut sovellukset ja SIM-kortit. Toimintoa ei voi kumota."</string>
<string name="main_clear_confirm_title" msgid="6577071819657853713">"Poistetaanko kaikki data?"</string>
<string name="main_clear_not_available" msgid="3433795327146684827">"Tämä käyttäjä ei voi palauttaa tehdasasetuksia"</string>
- <string name="main_clear_progress_title" msgid="7239741132015617719">"Poistetaan"</string>
+ <string name="main_clear_progress_title" msgid="7239741132015617719">"Tyhjennetään"</string>
<string name="main_clear_progress_text" msgid="4636695115176327972">"Odota…"</string>
<string name="call_settings_title" msgid="2531072044177194164">"Puheluasetukset"</string>
<string name="call_settings_summary" msgid="8244293779053318053">"Ota käyttöön puhelinvastaaja, soitonsiirrot, koputuspalvelu, soittajan tunnus"</string>
@@ -2855,7 +2855,7 @@
<string name="usage_type_radio_active" msgid="1876069445855950097">"Mobiiliradio aktiivinen"</string>
<string name="usage_type_data_wifi_send" msgid="6154038607322769558">"Lähetetyt Wi-Fi-paketit"</string>
<string name="usage_type_data_wifi_recv" msgid="4821128213012023100">"Vastaanotetut Wi-Fi-paketit"</string>
- <string name="usage_type_audio" msgid="1100651355357912864">"Ääni"</string>
+ <string name="usage_type_audio" msgid="1100651355357912864">"Audio"</string>
<string name="usage_type_video" msgid="1068481638906679035">"Video"</string>
<string name="usage_type_camera" msgid="3999579307204257822">"Kamera"</string>
<string name="usage_type_flashlight" msgid="5629235220169383309">"Taskulamppu"</string>
@@ -2924,6 +2924,8 @@
<string name="battery_not_usage" msgid="1472275761547230196">"Ei käyttöä viimeisimmän täyteen lataamisen jälkeen"</string>
<string name="battery_not_usage_24hr" msgid="8397519536160741248">"Ei käyttöä 24 viime tunnin aikana"</string>
<string name="battery_usage_without_time" msgid="1346894834339420538"></string>
+ <!-- no translation found for battery_usage_other_users (9002643295562500693) -->
+ <skip />
<string name="advanced_battery_graph_subtext" msgid="6816737986172678550">"Arvio akun kestosta perustuu aiempaan laitteen käyttöön."</string>
<string name="estimated_time_left" msgid="948717045180211777">"Arvioitu jäljellä oleva aika"</string>
<string name="estimated_charging_time_left" msgid="2287135413363961246">"Täyteen lataukseen"</string>
diff --git a/res/values-fr-rCA/strings.xml b/res/values-fr-rCA/strings.xml
index 26e1fa3..37eda41 100644
--- a/res/values-fr-rCA/strings.xml
+++ b/res/values-fr-rCA/strings.xml
@@ -476,7 +476,7 @@
<string name="security_settings_fingerprint_v2_home_screen_text" product="tablet" msgid="179325591887291180">"Utilisez votre empreinte digitale pour déverrouiller votre tablette ou vérifier que c\'est bien vous"</string>
<string name="security_settings_fingerprint_v2_home_screen_text" product="device" msgid="2503218139575057099">"Utilisez votre empreinte digitale pour déverrouiller votre appareil ou vérifier que c\'est bien vous"</string>
<string name="security_settings_fingerprint_v2_home_screen_text" product="default" msgid="481286891358925579">"Utilisez votre empreinte digitale pour déverrouiller votre téléphone ou vérifier que c\'est bien vous"</string>
- <string name="security_settings_biometric_preference_title" msgid="298146483579539448">"Déverrouillage par reconnaissance faciale et empreinte digitale"</string>
+ <string name="security_settings_biometric_preference_title" msgid="298146483579539448">"Déverrouillage par recon. faciale et empreinte digitale"</string>
<string name="security_settings_biometric_preference_summary_none_enrolled" msgid="6941188982863819389">"Touchez pour configurer"</string>
<string name="security_settings_biometric_preference_summary_both_fp_multiple" msgid="4821859306609955966">"Empreintes digitales et visage ajoutés"</string>
<string name="security_settings_biometric_preference_summary_both_fp_single" msgid="684409535278676426">"Empreinte digitale et visage ajoutés"</string>
@@ -2924,6 +2924,8 @@
<string name="battery_not_usage" msgid="1472275761547230196">"Aucune utilisation depuis la dernière recharge complète"</string>
<string name="battery_not_usage_24hr" msgid="8397519536160741248">"Aucune utilisation au cours des dernières 24 heures"</string>
<string name="battery_usage_without_time" msgid="1346894834339420538"></string>
+ <!-- no translation found for battery_usage_other_users (9002643295562500693) -->
+ <skip />
<string name="advanced_battery_graph_subtext" msgid="6816737986172678550">"L\'estimation de l\'autonomie restante est basée sur l\'utilisation de l\'appareil"</string>
<string name="estimated_time_left" msgid="948717045180211777">"Temps restant estimé"</string>
<string name="estimated_charging_time_left" msgid="2287135413363961246">"Jusqu\'à la charge complète"</string>
diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml
index 2577f43..c6743e7 100644
--- a/res/values-fr/strings.xml
+++ b/res/values-fr/strings.xml
@@ -412,7 +412,7 @@
<string name="security_settings_face_settings_require_confirmation" msgid="6603039421004198334">"Toujours demander confirmation"</string>
<string name="security_settings_face_settings_require_confirmation_details" msgid="3498729789625461914">"Toujours confirmer le déverrouillage par reco. faciale dans applis"</string>
<string name="security_settings_face_settings_remove_face_model" msgid="812920481303980846">"Supprimer l\'empreinte faciale"</string>
- <string name="security_settings_face_settings_enroll" msgid="3726313826693825029">"Configurer déverr. par reconn. faciale."</string>
+ <string name="security_settings_face_settings_enroll" msgid="3726313826693825029">"Configurer déverr. par reconn. faciale"</string>
<string name="security_settings_face_settings_footer" msgid="625696606490947189">"Utilisez votre visage pour déverrouiller votre téléphone ou valider votre identité dans les applis (pour vous connecter ou approuver un achat, par exemple).\n\nÀ savoir :\nVous ne pouvez configurer qu\'un seul visage à la fois. Supprimez le visage actuel pour en ajouter un.\n\nVous pouvez déverrouiller votre téléphone sans le vouloir, en le regardant.\n\nUne autre personne peut le déverrouiller en le tenant devant votre visage.\n\nQuelqu\'un qui vous ressemble beaucoup, comme votre jumeau/jumelle, peut aussi déverrouiller votre téléphone."</string>
<string name="security_settings_face_settings_footer_attention_not_supported" msgid="2071065435536235622">"Utilisez votre visage pour déverrouiller votre téléphone ou valider votre identité dans les applis (pour vous connecter ou approuver un achat, par exemple).\n\nÀ savoir :\nVous ne pouvez configurer qu\'un seul visage à la fois. Supprimez le visage actuel pour en ajouter un.\n\nVous pouvez déverrouiller votre téléphone sans le vouloir, en le regardant.\n\nUne autre personne peut le déverrouiller en le tenant devant votre visage, même si vous fermez les yeux.\n\nQuelqu\'un qui vous ressemble beaucoup, comme votre jumeau/jumelle, peut aussi déverrouiller votre téléphone."</string>
<string name="security_settings_face_settings_remove_dialog_title" msgid="2899669764446232715">"Supprimer l\'empreinte faciale ?"</string>
@@ -476,7 +476,7 @@
<string name="security_settings_fingerprint_v2_home_screen_text" product="tablet" msgid="179325591887291180">"Utilisez votre empreinte digitale pour déverrouiller votre tablette ou confirmer votre identité, par exemple pour vous connecter à des applis"</string>
<string name="security_settings_fingerprint_v2_home_screen_text" product="device" msgid="2503218139575057099">"Utilisez votre empreinte digitale pour déverrouiller votre appareil ou confirmer votre identité, par exemple pour vous connecter à des applis"</string>
<string name="security_settings_fingerprint_v2_home_screen_text" product="default" msgid="481286891358925579">"Utilisez votre empreinte digitale pour déverrouiller votre téléphone ou confirmer votre identité, par exemple pour vous connecter à des applis"</string>
- <string name="security_settings_biometric_preference_title" msgid="298146483579539448">"Déverrouillage par reconnaissance faciale et empreinte digitale"</string>
+ <string name="security_settings_biometric_preference_title" msgid="298146483579539448">"Déverrouillage par reco. faciale et empreinte digitale"</string>
<string name="security_settings_biometric_preference_summary_none_enrolled" msgid="6941188982863819389">"Appuyer pour configurer"</string>
<string name="security_settings_biometric_preference_summary_both_fp_multiple" msgid="4821859306609955966">"Visage et empreintes digitales ajoutés"</string>
<string name="security_settings_biometric_preference_summary_both_fp_single" msgid="684409535278676426">"Reconnaissance faciale et empreinte digitale ajoutées"</string>
@@ -1323,7 +1323,8 @@
<string name="auto_rotate_link_a11y" msgid="5146188567212233286">"En savoir plus sur la rotation automatique"</string>
<string name="auto_rotate_summary_a11y" msgid="1505094100328581685">"Quand vous basculez votre téléphone en mode portrait ou paysage"</string>
<string name="screen_resolution_title" msgid="2690518693139811486">"Résolution d\'écran"</string>
- <string name="screen_resolution_option_high" msgid="2617496842852992853">"Haute résolution"</string>
+ <!-- no translation found for screen_resolution_option_high (2617496842852992853) -->
+ <skip />
<string name="screen_resolution_option_highest" msgid="9134161136319625840">"Pleine résolution"</string>
<string name="screen_resolution_summary_high" msgid="5611896959631297437">"FHD+ 1080p"</string>
<string name="screen_resolution_summary_highest" msgid="2609112310453953756">"QHD+ 1440p"</string>
@@ -2924,6 +2925,8 @@
<string name="battery_not_usage" msgid="1472275761547230196">"Pas d\'utilisation depuis la dernière charge complète"</string>
<string name="battery_not_usage_24hr" msgid="8397519536160741248">"Pas d\'utilisation au cours des dernières 24 h"</string>
<string name="battery_usage_without_time" msgid="1346894834339420538"></string>
+ <!-- no translation found for battery_usage_other_users (9002643295562500693) -->
+ <skip />
<string name="advanced_battery_graph_subtext" msgid="6816737986172678550">"L\'estimation de l\'autonomie restante est basée sur l\'utilisation de l\'appareil"</string>
<string name="estimated_time_left" msgid="948717045180211777">"Temps restant estimé"</string>
<string name="estimated_charging_time_left" msgid="2287135413363961246">"Jusqu\'à la charge complète"</string>
diff --git a/res/values-gl/strings.xml b/res/values-gl/strings.xml
index 2f1cb79..889769b 100644
--- a/res/values-gl/strings.xml
+++ b/res/values-gl/strings.xml
@@ -2924,6 +2924,8 @@
<string name="battery_not_usage" msgid="1472275761547230196">"Sen uso da batería desde a última carga completa"</string>
<string name="battery_not_usage_24hr" msgid="8397519536160741248">"Sen uso da batería nas últimas 24 horas"</string>
<string name="battery_usage_without_time" msgid="1346894834339420538"></string>
+ <!-- no translation found for battery_usage_other_users (9002643295562500693) -->
+ <skip />
<string name="advanced_battery_graph_subtext" msgid="6816737986172678550">"A estimación do nivel de batería baséase no uso do dispositivo"</string>
<string name="estimated_time_left" msgid="948717045180211777">"Tempo restante estimado"</string>
<string name="estimated_charging_time_left" msgid="2287135413363961246">"Para completar a carga"</string>
diff --git a/res/values-gu/strings.xml b/res/values-gu/strings.xml
index 0e52331..572eb86 100644
--- a/res/values-gu/strings.xml
+++ b/res/values-gu/strings.xml
@@ -2924,6 +2924,8 @@
<string name="battery_not_usage" msgid="1472275761547230196">"છેલ્લે પૂર્ણ ચાર્જ કરાયા પછી બિલકુલ વપરાશ થયો નથી"</string>
<string name="battery_not_usage_24hr" msgid="8397519536160741248">"છેલ્લા 24 કલાકમાં બિલકુલ વપરાશ થયો નથી"</string>
<string name="battery_usage_without_time" msgid="1346894834339420538"></string>
+ <!-- no translation found for battery_usage_other_users (9002643295562500693) -->
+ <skip />
<string name="advanced_battery_graph_subtext" msgid="6816737986172678550">"બાકી રહેલી બૅટરીનો અંદાજ ડિવાઇસના તમારા ઉપયોગ પર આધારિત છે"</string>
<string name="estimated_time_left" msgid="948717045180211777">"અંદાજિત બાકી સમય"</string>
<string name="estimated_charging_time_left" msgid="2287135413363961246">"સંપૂર્ણપણે ચાર્જ થવામાં"</string>
diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml
index 9117263..c41ee6e 100644
--- a/res/values-hi/strings.xml
+++ b/res/values-hi/strings.xml
@@ -483,7 +483,7 @@
<string name="biometric_settings_intro" msgid="4263069383955676756">"अगर आपके फ़ोन में फ़िंगरप्रिंट अनलॉक और फ़ेस अनलॉक की सुविधा सेट अप है, तो चेहरे पर मास्क होने पर या आस-पास रोशनी न होने पर, फ़ोन आपका फ़िंगरप्रिंट मांगेगा"</string>
<string name="biometric_settings_category_ways_to_unlock" msgid="3384767901580915266">"फ़ोन को अनलॉक करने के तरीके"</string>
<string name="biometric_settings_use_biometric_unlock_phone" msgid="8180914579885804358">"अपना फ़ोन अनलॉक करें"</string>
- <string name="biometric_settings_use_biometric_for_apps" msgid="6201168728906364189">"पुष्टि करें कि आप ही ऐप्लिकेशन इस्तेमाल कर रहे हैं"</string>
+ <string name="biometric_settings_use_biometric_for_apps" msgid="6201168728906364189">"पुष्टि करें कि ऐप्लिकेशन आपके इस्तेमाल में ही है"</string>
<string name="biometric_settings_use_face_preference_summary" msgid="1821648836899408477">"अपने चेहरे का इस्तेमाल करके"</string>
<string name="biometric_settings_use_fingerprint_preference_summary" msgid="6077762097826050165">"अपने फ़िंगरप्रिंट का इस्तेमाल करके"</string>
<string name="biometric_settings_use_face_or_fingerprint_preference_summary" msgid="3029102492674234728">"अपने फ़िंगरप्रिंट या चेहरे का इस्तेमाल करके"</string>
@@ -2924,6 +2924,8 @@
<string name="battery_not_usage" msgid="1472275761547230196">"पिछली बार पूरी चार्ज होने के बाद, बैटरी का इस्तेमाल नहीं हुआ"</string>
<string name="battery_not_usage_24hr" msgid="8397519536160741248">"पिछले 24 घंटे में, बैटरी का इस्तेमाल नहीं हुआ"</string>
<string name="battery_usage_without_time" msgid="1346894834339420538"></string>
+ <!-- no translation found for battery_usage_other_users (9002643295562500693) -->
+ <skip />
<string name="advanced_battery_graph_subtext" msgid="6816737986172678550">"डिवाइस के इस्तेमाल के हिसाब से अनुमान लगाया गया है कि फ़ोन की बैटरी और कितनी देर चलेगी"</string>
<string name="estimated_time_left" msgid="948717045180211777">"अनुमानित बचा हुआ समय"</string>
<string name="estimated_charging_time_left" msgid="2287135413363961246">"पूरी तरह चार्ज होने तक"</string>
@@ -3937,7 +3939,7 @@
<string name="lock_screen_notifs_redact_work_summary" msgid="3238238380405430156">"स्क्रीन लॉक होने पर वर्क प्रोफ़ाइल का संवेदनशील कॉन्टेंट दिखाएं"</string>
<string name="lock_screen_notifications_summary_show" msgid="6540443483088311328">"सारी सूचनाएं दिखाएं"</string>
<string name="lock_screen_notifications_summary_hide" msgid="7837303171531166789">"संवेदनशील कॉन्टेंट को अनलॉक होने पर ही दिखाएं"</string>
- <string name="lock_screen_notifications_summary_disable" msgid="3388290397947365744">"सूचनाएं बिल्कुल न दिखाएं"</string>
+ <string name="lock_screen_notifications_summary_disable" msgid="3388290397947365744">"सूचनाएं बिलकुल न दिखाएं"</string>
<string name="lock_screen_notifications_interstitial_message" msgid="4688399629301178487">"आपकी लॉक स्क्रीन कैसी दिखनी चाहिए?"</string>
<string name="lock_screen_notifications_interstitial_title" msgid="1360388192096354315">"लॉक स्क्रीन"</string>
<string name="lock_screen_notifications_summary_show_profile" msgid="8373401288962523946">"ऑफ़िस के काम से जुड़ी सभी सूचनाएं दिखाएं"</string>
@@ -4645,7 +4647,7 @@
<string name="screen_zoom_conversation_icon_pete" msgid="4873109337506890558">"P"</string>
<string name="screen_zoom_conversation_message_1" msgid="2641317981482545659">"नमस्ते पीट!"</string>
<string name="screen_zoom_conversation_message_2" msgid="6528272610590915790">"क्यों न आज मिलकर कॉफ़ी पिएं और बातें करें?"</string>
- <string name="screen_zoom_conversation_message_3" msgid="6930848361702066106">"हां बिल्कुल. मुझे एक अच्छी जगह भी मालूम है और वह यहां से बहुत दूर भी नहीं है."</string>
+ <string name="screen_zoom_conversation_message_3" msgid="6930848361702066106">"हां बिलकुल. मुझे एक अच्छी जगह भी मालूम है और वह यहां से बहुत दूर भी नहीं है."</string>
<string name="screen_zoom_conversation_message_4" msgid="2501043894465807210">"बढ़िया!"</string>
<string name="screen_zoom_conversation_timestamp_1" msgid="512353741016062507">"मंगलवार शाम 6:00 बजे"</string>
<string name="screen_zoom_conversation_timestamp_2" msgid="472183807915497199">"मंगलवार शाम 6:01 बजे"</string>
diff --git a/res/values-hr/strings.xml b/res/values-hr/strings.xml
index 305fc8e..c4c777a 100644
--- a/res/values-hr/strings.xml
+++ b/res/values-hr/strings.xml
@@ -2964,6 +2964,7 @@
<string name="battery_not_usage" msgid="1472275761547230196">"Nema potrošnje od posljednjeg potpunog punjenja"</string>
<string name="battery_not_usage_24hr" msgid="8397519536160741248">"Nema potrošnje u posljednja 24 h"</string>
<string name="battery_usage_without_time" msgid="1346894834339420538"></string>
+ <string name="battery_usage_other_users" msgid="9002643295562500693">"Drugi korisnici"</string>
<string name="advanced_battery_graph_subtext" msgid="6816737986172678550">"Procjena stanja baterije temelji se na upotrebi uređaja"</string>
<string name="estimated_time_left" msgid="948717045180211777">"Procijenjeno preostalo vrijeme"</string>
<string name="estimated_charging_time_left" msgid="2287135413363961246">"Do potpune napunjenosti"</string>
diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml
index a0f19d2..ca15057 100644
--- a/res/values-hu/strings.xml
+++ b/res/values-hu/strings.xml
@@ -2924,6 +2924,8 @@
<string name="battery_not_usage" msgid="1472275761547230196">"Nincs használat az utolsó teljes feltöltés óta"</string>
<string name="battery_not_usage_24hr" msgid="8397519536160741248">"Nem volt használatban az elmúlt 24 órában"</string>
<string name="battery_usage_without_time" msgid="1346894834339420538"></string>
+ <!-- no translation found for battery_usage_other_users (9002643295562500693) -->
+ <skip />
<string name="advanced_battery_graph_subtext" msgid="6816737986172678550">"Az akkumulátor becsült töltöttsége az eszközhasználaton alapszik"</string>
<string name="estimated_time_left" msgid="948717045180211777">"Becsült hátralévő idő"</string>
<string name="estimated_charging_time_left" msgid="2287135413363961246">"A teljes feltöltésig"</string>
diff --git a/res/values-hy/strings.xml b/res/values-hy/strings.xml
index 08ad4c3..0ec1130 100644
--- a/res/values-hy/strings.xml
+++ b/res/values-hy/strings.xml
@@ -2924,6 +2924,8 @@
<string name="battery_not_usage" msgid="1472275761547230196">"Մարտկոցը չի օգտագործվել վերջին լրիվ լիցքավորումից հետո"</string>
<string name="battery_not_usage_24hr" msgid="8397519536160741248">"Մարտկոցը չի օգտագործվել վերջին 24 ժամվա ընթացքում"</string>
<string name="battery_usage_without_time" msgid="1346894834339420538"></string>
+ <!-- no translation found for battery_usage_other_users (9002643295562500693) -->
+ <skip />
<string name="advanced_battery_graph_subtext" msgid="6816737986172678550">"Մարտկոցի աշխատանքի տևողությունը մոտավոր է և կախված է սարքի օգտագործումից"</string>
<string name="estimated_time_left" msgid="948717045180211777">"Մոտավոր մնացած ժամանակը"</string>
<string name="estimated_charging_time_left" msgid="2287135413363961246">"Մինչև լրիվ լիցքավորումը"</string>
diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml
index 309b1bd..93ef624 100644
--- a/res/values-in/strings.xml
+++ b/res/values-in/strings.xml
@@ -2924,6 +2924,8 @@
<string name="battery_not_usage" msgid="1472275761547230196">"Tidak ada penggunaan sejak terakhir kali baterai terisi penuh"</string>
<string name="battery_not_usage_24hr" msgid="8397519536160741248">"Tidak ada penggunaan selama 24 jam terakhir"</string>
<string name="battery_usage_without_time" msgid="1346894834339420538"></string>
+ <!-- no translation found for battery_usage_other_users (9002643295562500693) -->
+ <skip />
<string name="advanced_battery_graph_subtext" msgid="6816737986172678550">"Perkiraan sisa baterai berdasarkan pada penggunaan perangkat"</string>
<string name="estimated_time_left" msgid="948717045180211777">"Perkiraan sisa waktu"</string>
<string name="estimated_charging_time_left" msgid="2287135413363961246">"Sampai terisi penuh"</string>
diff --git a/res/values-is/strings.xml b/res/values-is/strings.xml
index f7b49a0..2e057a4 100644
--- a/res/values-is/strings.xml
+++ b/res/values-is/strings.xml
@@ -2924,6 +2924,8 @@
<string name="battery_not_usage" msgid="1472275761547230196">"Engin notkun frá síðustu fullu hleðslu"</string>
<string name="battery_not_usage_24hr" msgid="8397519536160741248">"Engin notkun síðasta sólarhringinn"</string>
<string name="battery_usage_without_time" msgid="1346894834339420538"></string>
+ <!-- no translation found for battery_usage_other_users (9002643295562500693) -->
+ <skip />
<string name="advanced_battery_graph_subtext" msgid="6816737986172678550">"Áætluð rafhlöðuending er byggð á notkun þinni á tækinu"</string>
<string name="estimated_time_left" msgid="948717045180211777">"Áætlaður tími eftir"</string>
<string name="estimated_charging_time_left" msgid="2287135413363961246">"Þar til fullri hleðslu er náð"</string>
diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml
index fe90890..d870a26 100644
--- a/res/values-it/strings.xml
+++ b/res/values-it/strings.xml
@@ -2927,6 +2927,8 @@
<string name="battery_not_usage" msgid="1472275761547230196">"Nessun utilizzo dall\'ultima ricarica completa"</string>
<string name="battery_not_usage_24hr" msgid="8397519536160741248">"Nessun utilizzo nelle ultime 24 ore"</string>
<string name="battery_usage_without_time" msgid="1346894834339420538"></string>
+ <!-- no translation found for battery_usage_other_users (9002643295562500693) -->
+ <skip />
<string name="advanced_battery_graph_subtext" msgid="6816737986172678550">"La stima della batteria residua si basa sul tuo utilizzo del dispositivo"</string>
<string name="estimated_time_left" msgid="948717045180211777">"Tempo residuo stimato"</string>
<string name="estimated_charging_time_left" msgid="2287135413363961246">"Tempo rimanente alla carica completa"</string>
@@ -5145,7 +5147,7 @@
<string name="app_info_storage_title" msgid="4076977173803093808">"Spazio occupato"</string>
<string name="webview_uninstalled_for_user" msgid="627352948986275488">"(disinstallato per l\'utente <xliff:g id="USER">%s</xliff:g>)"</string>
<string name="webview_disabled_for_user" msgid="5809886172032644498">"(disattivato per l\'utente <xliff:g id="USER">%s</xliff:g>)"</string>
- <string name="autofill_app" msgid="7595308061826307921">"Compilazione automatica"</string>
+ <string name="autofill_app" msgid="7595308061826307921">"Servizio di compilazione automatica"</string>
<string name="autofill_passwords" msgid="6708057251459761083">"Password"</string>
<plurals name="autofill_passwords_count" formatted="false" msgid="7715009165029452622">
<item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> password</item>
diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml
index e42e71c..4e48054 100644
--- a/res/values-iw/strings.xml
+++ b/res/values-iw/strings.xml
@@ -3002,6 +3002,7 @@
<string name="battery_not_usage" msgid="1472275761547230196">"לא בשימוש מאז הטעינה המלאה האחרונה"</string>
<string name="battery_not_usage_24hr" msgid="8397519536160741248">"לא נעשה שימוש ב-24 השעות האחרונות"</string>
<string name="battery_usage_without_time" msgid="1346894834339420538"></string>
+ <string name="battery_usage_other_users" msgid="9002643295562500693">"משתמשים אחרים"</string>
<string name="advanced_battery_graph_subtext" msgid="6816737986172678550">"הערכת הזמן שנותר עד שתיגמר הסוללה מבוססת על השימוש שנעשה במכשיר"</string>
<string name="estimated_time_left" msgid="948717045180211777">"זמן משוער שנותר"</string>
<string name="estimated_charging_time_left" msgid="2287135413363961246">"עד לטעינה מלאה"</string>
diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml
index 66642fb..0e6497b 100644
--- a/res/values-ja/strings.xml
+++ b/res/values-ja/strings.xml
@@ -433,7 +433,7 @@
<string name="security_settings_fingerprint_enroll_introduction_title" msgid="7931650601996313070">"指紋の設定"</string>
<string name="security_settings_fingerprint_enroll_consent_introduction_title" msgid="2278592030102282364">"指紋認証によるロック解除の許可"</string>
<string name="security_settings_fingerprint_enroll_introduction_title_unlock_disabled" msgid="1911710308293783998">"指紋の使用"</string>
- <string name="security_settings_fingerprint_enroll_introduction_v2_message" product="tablet" msgid="1533352560544756928">"指紋を使ってタブレットのロック解除や本人確認(アプリへのログインや購入の承認など)を行えるようにします。"</string>
+ <string name="security_settings_fingerprint_enroll_introduction_v2_message" product="tablet" msgid="1533352560544756928">"指紋を使ってタブレットのロック解除や本人確認(アプリへのログインや購入の承認など)を行えるようになります。"</string>
<string name="security_settings_fingerprint_enroll_introduction_v2_message" product="device" msgid="3570866595300511932">"指紋を使ってデバイスのロック解除や本人確認(アプリへのログインや購入の承認など)を行えるようにします。"</string>
<string name="security_settings_fingerprint_enroll_introduction_v2_message" product="default" msgid="8539442240212670385">"指紋を使ってスマートフォンのロック解除や本人確認(アプリへのログインや購入の承認など)を行えるようにします。"</string>
<string name="security_settings_fingerprint_enroll_introduction_consent_message" msgid="1833139688278350628">"お子様に、指紋を使ってスマートフォンのロック解除や本人確認を行うことを許可します。アプリへのログインや購入の承認などに顔を使用できるようになります。"</string>
@@ -473,7 +473,7 @@
<string name="security_settings_fingerprint_v2_enroll_acquire_too_fast" msgid="5891227328100822018">"振動を感じるまで指を離さないでください"</string>
<string name="security_settings_fingerprint_v2_enroll_acquire_too_bright" msgid="769646735950329315">"もっと明るい場所に移動してもう一度お試しください"</string>
<string name="security_settings_fingerprint_v2_enroll_error_max_attempts" msgid="1464972470750764128">"試行回数の上限を超えました"</string>
- <string name="security_settings_fingerprint_v2_home_screen_text" product="tablet" msgid="179325591887291180">"指紋を使ってタブレットのロック解除や本人確認(アプリへのログインなど)を行えるようにします。"</string>
+ <string name="security_settings_fingerprint_v2_home_screen_text" product="tablet" msgid="179325591887291180">"指紋を使ってタブレットのロック解除や本人確認(アプリへのログインなど)を行えるようになります。"</string>
<string name="security_settings_fingerprint_v2_home_screen_text" product="device" msgid="2503218139575057099">"指紋を使ってデバイストのロック解除や本人確認(アプリへのログインなど)を行えるようにします。"</string>
<string name="security_settings_fingerprint_v2_home_screen_text" product="default" msgid="481286891358925579">"指紋を使ってスマートフォンのロック解除や本人確認(アプリへのログインなど)を行えるようにします。"</string>
<string name="security_settings_biometric_preference_title" msgid="298146483579539448">"顔認証と指紋認証によるロック解除"</string>
@@ -2924,6 +2924,7 @@
<string name="battery_not_usage" msgid="1472275761547230196">"使用: なし(前回のフル充電以降)"</string>
<string name="battery_not_usage_24hr" msgid="8397519536160741248">"使用: なし(過去 24 時間)"</string>
<string name="battery_usage_without_time" msgid="1346894834339420538"></string>
+ <string name="battery_usage_other_users" msgid="9002643295562500693">"その他のユーザー"</string>
<string name="advanced_battery_graph_subtext" msgid="6816737986172678550">"バッテリー残量はデバイスの使用状況に基づく推定値です"</string>
<string name="estimated_time_left" msgid="948717045180211777">"予測される残り時間"</string>
<string name="estimated_charging_time_left" msgid="2287135413363961246">"フル充電まで"</string>
diff --git a/res/values-ka/strings.xml b/res/values-ka/strings.xml
index 3c673c0..2a41c58 100644
--- a/res/values-ka/strings.xml
+++ b/res/values-ka/strings.xml
@@ -485,7 +485,7 @@
<string name="biometric_settings_use_biometric_unlock_phone" msgid="8180914579885804358">"თქვენი ტელეფონის განსაბლოკად"</string>
<string name="biometric_settings_use_biometric_for_apps" msgid="6201168728906364189">"აპებში ვინაობის დასადასტურებლად"</string>
<string name="biometric_settings_use_face_preference_summary" msgid="1821648836899408477">"სახის მეშვეობით"</string>
- <string name="biometric_settings_use_fingerprint_preference_summary" msgid="6077762097826050165">"თთის ანაბეჭდის მეშვეობით"</string>
+ <string name="biometric_settings_use_fingerprint_preference_summary" msgid="6077762097826050165">"თითის ანაბეჭდის მეშვეობით"</string>
<string name="biometric_settings_use_face_or_fingerprint_preference_summary" msgid="3029102492674234728">"სახის ან თითის ანაბეჭდის მეშვეობით"</string>
<string name="biometric_settings_hand_back_to_guardian" product="tablet" msgid="1498542470242509989">"დაუბრუნეთ ტაბლეტი მშობელს"</string>
<string name="biometric_settings_hand_back_to_guardian" product="device" msgid="3837001353226852511">"დაუბრუნეთ მოწყობილობა მშობელს"</string>
@@ -2924,6 +2924,8 @@
<string name="battery_not_usage" msgid="1472275761547230196">"ბოლო სრული დატენვის შემდეგ მოხმარება არ ფიქსირდება"</string>
<string name="battery_not_usage_24hr" msgid="8397519536160741248">"ბოლო 24 საათში გამოყენება არ მომხდარა"</string>
<string name="battery_usage_without_time" msgid="1346894834339420538"></string>
+ <!-- no translation found for battery_usage_other_users (9002643295562500693) -->
+ <skip />
<string name="advanced_battery_graph_subtext" msgid="6816737986172678550">"ბატარეის მუშაობის დარჩენილი ხანგრძლივობის მიახლოებითი ვარაუდი თქვენი მოწყობილობის მოხმარებას ეყრდნობა"</string>
<string name="estimated_time_left" msgid="948717045180211777">"სავარაუდო დარჩენილი დრო"</string>
<string name="estimated_charging_time_left" msgid="2287135413363961246">"სრულ დატენვამდე"</string>
diff --git a/res/values-kk/strings.xml b/res/values-kk/strings.xml
index ffe5d90..0a34490 100644
--- a/res/values-kk/strings.xml
+++ b/res/values-kk/strings.xml
@@ -2924,6 +2924,8 @@
<string name="battery_not_usage" msgid="1472275761547230196">"Соңғы толық зарядталғаннан бері пайдаланылмады."</string>
<string name="battery_not_usage_24hr" msgid="8397519536160741248">"Соңғы 24 сағатта пайдаланылмады."</string>
<string name="battery_usage_without_time" msgid="1346894834339420538"></string>
+ <!-- no translation found for battery_usage_other_users (9002643295562500693) -->
+ <skip />
<string name="advanced_battery_graph_subtext" msgid="6816737986172678550">"Қалған батарея зарядының деңгейі құрылғының пайдаланылуы негізінде анықталады"</string>
<string name="estimated_time_left" msgid="948717045180211777">"Қалған болжалды уақыт"</string>
<string name="estimated_charging_time_left" msgid="2287135413363961246">"Толық зарядталғанға дейін"</string>
diff --git a/res/values-km/strings.xml b/res/values-km/strings.xml
index 34cc461..770646c 100644
--- a/res/values-km/strings.xml
+++ b/res/values-km/strings.xml
@@ -2924,6 +2924,8 @@
<string name="battery_not_usage" msgid="1472275761547230196">"មិនមានការប្រើប្រាស់ទេតាំងពីសាកថ្មពេញលើកចុងក្រោយ"</string>
<string name="battery_not_usage_24hr" msgid="8397519536160741248">"មិនមានការប្រើប្រាស់ទេក្នុងរយៈពេល 24 ម៉ោងចុងក្រោយ"</string>
<string name="battery_usage_without_time" msgid="1346894834339420538"></string>
+ <!-- no translation found for battery_usage_other_users (9002643295562500693) -->
+ <skip />
<string name="advanced_battery_graph_subtext" msgid="6816737986172678550">"ការប៉ាន់ស្មានអំពីកម្រិតថ្មដែលនៅសល់គឺផ្អែកលើការប្រើប្រាស់ឧបករណ៍របស់អ្នក"</string>
<string name="estimated_time_left" msgid="948717045180211777">"រយៈពេលនៅសល់ប៉ាន់ស្មាន"</string>
<string name="estimated_charging_time_left" msgid="2287135413363961246">"ទៀតទើបសាកថ្មពេញ"</string>
diff --git a/res/values-kn/strings.xml b/res/values-kn/strings.xml
index 297ee75..31fdf7d 100644
--- a/res/values-kn/strings.xml
+++ b/res/values-kn/strings.xml
@@ -474,8 +474,8 @@
<string name="security_settings_fingerprint_v2_enroll_acquire_too_bright" msgid="769646735950329315">"ಕಡಿಮೆ ಬೆಳಕಿನ ಸ್ಥಳಕ್ಕೆ ಸರಿಸಿ ಹಾಗೂ ಪುನಃ ಪ್ರಯತ್ನಿಸಿ"</string>
<string name="security_settings_fingerprint_v2_enroll_error_max_attempts" msgid="1464972470750764128">"ನೀವು ಗರಿಷ್ಠ ಸಂಖ್ಯೆಯ ಪ್ರಯತ್ನಗಳ ಮಿತಿಯನ್ನು ತಲುಪಿದ್ದೀರಿ"</string>
<string name="security_settings_fingerprint_v2_home_screen_text" product="tablet" msgid="179325591887291180">"ನೀವು ಆ್ಯಪ್ಗಳಿಗೆ ಸೈನ್ ಇನ್ ಮಾಡುವಂತೆಯೇ, ನಿಮ್ಮ ಟ್ಯಾಬ್ಲೆಟ್ ಅನ್ನು ಅನ್ಲಾಕ್ ಮಾಡಲು ಅಥವಾ ನಿಮ್ಮ ಗುರುತನ್ನು ದೃಢೀಕರಿಸಲು ನಿಮ್ಮ ಫಿಂಗರ್ಪ್ರಿಂಟ್ ಅನ್ನು ನೀವು ಬಳಸಿ"</string>
- <string name="security_settings_fingerprint_v2_home_screen_text" product="device" msgid="2503218139575057099">"ನೀವು ಆ್ಯಪ್ಗಳಿಗೆ ಸೈನ್ ಇನ್ ಮಾಡುವಂತೆಯೇ, ನಿಮ್ಮ ಸಾಧನವನ್ನು ಅನ್ಲಾಕ್ ಮಾಡಲು ಅಥವಾ ನಿಮ್ಮ ಗುರುತನ್ನು ದೃಢೀಕರಿಸಲು ನಿಮ್ಮ ಫಿಂಗರ್ಪ್ರಿಂಟ್ ಅನ್ನು ನೀವು ಬಳಸಿ"</string>
- <string name="security_settings_fingerprint_v2_home_screen_text" product="default" msgid="481286891358925579">"ನೀವು ಆ್ಯಪ್ಗಳಿಗೆ ಸೈನ್ ಇನ್ ಮಾಡುವಂತೆಯೇ, ನಿಮ್ಮ ಫೋನ್ ಅನ್ನು ಅನ್ಲಾಕ್ ಮಾಡಲು ಅಥವಾ ನಿಮ್ಮ ಗುರುತನ್ನು ದೃಢೀಕರಿಸಲು ನಿಮ್ಮ ಫಿಂಗರ್ಪ್ರಿಂಟ್ ಅನ್ನು ನೀವು ಬಳಸಿ"</string>
+ <string name="security_settings_fingerprint_v2_home_screen_text" product="device" msgid="2503218139575057099">"ನೀವು ಆ್ಯಪ್ಗಳಿಗೆ ಸೈನ್ ಇನ್ ಮಾಡುವಂತೆಯೇ, ನಿಮ್ಮ ಸಾಧನವನ್ನು ಅನ್ಲಾಕ್ ಮಾಡಲು ಅಥವಾ ನಿಮ್ಮ ಗುರುತನ್ನು ದೃಢೀಕರಿಸಲು ನಿಮ್ಮ ಫಿಂಗರ್ಪ್ರಿಂಟ್ ಅನ್ನು ಬಳಸಿ"</string>
+ <string name="security_settings_fingerprint_v2_home_screen_text" product="default" msgid="481286891358925579">"ನೀವು ಆ್ಯಪ್ಗಳಿಗೆ ಸೈನ್ ಇನ್ ಮಾಡುವಂತೆಯೇ, ನಿಮ್ಮ ಫೋನ್ ಅನ್ನು ಅನ್ಲಾಕ್ ಮಾಡಲು ಅಥವಾ ನಿಮ್ಮ ಗುರುತನ್ನು ದೃಢೀಕರಿಸಲು ನಿಮ್ಮ ಫಿಂಗರ್ಪ್ರಿಂಟ್ ಅನ್ನು ಬಳಸಿ"</string>
<string name="security_settings_biometric_preference_title" msgid="298146483579539448">"ಫೇಸ್ ಮತ್ತು ಫಿಂಗರ್ಪ್ರಿಂಟ್ ಅನ್ಲಾಕ್"</string>
<string name="security_settings_biometric_preference_summary_none_enrolled" msgid="6941188982863819389">"ಸೆಟಪ್ ಮಾಡಲು ಟ್ಯಾಪ್ ಮಾಡಿ"</string>
<string name="security_settings_biometric_preference_summary_both_fp_multiple" msgid="4821859306609955966">"ಫೇಸ್ ಮತ್ತು ಫಿಂಗರ್ಪ್ರಿಂಟ್ಗಳನ್ನು ಸೇರಿಸಲಾಗಿದೆ"</string>
@@ -2924,6 +2924,8 @@
<string name="battery_not_usage" msgid="1472275761547230196">"ಪೂರ್ಣ ಚಾರ್ಜ್ ಮಾಡಿದಾಗಿನಿಂದ ಯಾವುದೇ ಬಳಕೆಯಾಗಿಲ್ಲ"</string>
<string name="battery_not_usage_24hr" msgid="8397519536160741248">"ಕಳೆದ 24 ಗಂಟೆಗಳಲ್ಲಿ ಯಾವುದೇ ಬಳಕೆಯಾಗಿಲ್ಲ"</string>
<string name="battery_usage_without_time" msgid="1346894834339420538"></string>
+ <!-- no translation found for battery_usage_other_users (9002643295562500693) -->
+ <skip />
<string name="advanced_battery_graph_subtext" msgid="6816737986172678550">"ನಿಮ್ಮ ಸಾಧನವನ್ನು ಎಷ್ಟು ಸಮಯದವರೆಗೆ ಬಳಸಲಾಗಿದೆ ಎಂಬುದನ್ನು ಆಧರಿಸಿ ಉಳಿದಿರುವ ಬ್ಯಾಟರಿಯನ್ನು ಅಂದಾಜು ಮಾಡಲಾಗುತ್ತದೆ"</string>
<string name="estimated_time_left" msgid="948717045180211777">"ಅಂದಾಜಿಸಿದ ಸಮಯ ಮುಗಿದಿದೆ"</string>
<string name="estimated_charging_time_left" msgid="2287135413363961246">"ಸಂಪೂರ್ಣ ಚಾರ್ಜ್ ಆಗಲು"</string>
diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml
index 784d09d..6c33836 100644
--- a/res/values-ko/strings.xml
+++ b/res/values-ko/strings.xml
@@ -2926,6 +2926,8 @@
<string name="battery_not_usage" msgid="1472275761547230196">"마지막으로 완전히 충전한 이후 사용 안 함"</string>
<string name="battery_not_usage_24hr" msgid="8397519536160741248">"지난 24시간 동안 사용 안 함"</string>
<string name="battery_usage_without_time" msgid="1346894834339420538"></string>
+ <!-- no translation found for battery_usage_other_users (9002643295562500693) -->
+ <skip />
<string name="advanced_battery_graph_subtext" msgid="6816737986172678550">"예상 잔여 배터리 소모 시간은 기기 사용량을 기반으로 표시됩니다."</string>
<string name="estimated_time_left" msgid="948717045180211777">"남은 예상 시간"</string>
<string name="estimated_charging_time_left" msgid="2287135413363961246">"충전 완료까지 남은 시간"</string>
diff --git a/res/values-ky/strings.xml b/res/values-ky/strings.xml
index 7ec1383..f02db83 100644
--- a/res/values-ky/strings.xml
+++ b/res/values-ky/strings.xml
@@ -480,7 +480,7 @@
<string name="security_settings_biometric_preference_summary_none_enrolled" msgid="6941188982863819389">"Жөндөө үчүн таптаңыз"</string>
<string name="security_settings_biometric_preference_summary_both_fp_multiple" msgid="4821859306609955966">"Жүз жана манжа изи кошулду"</string>
<string name="security_settings_biometric_preference_summary_both_fp_single" msgid="684409535278676426">"Жүз жана манжа изи кошулду"</string>
- <string name="biometric_settings_intro" msgid="4263069383955676756">"Эгер манжа изи жана жүзүнөн таанып ачуу функциясын жөндөсөңүз, беткап тагынып же караңгы жерде турганыңызда телефонуңуз манжаңыздын изин сурайт"</string>
+ <string name="biometric_settings_intro" msgid="4263069383955676756">"Эгер манжа изи жана жүзүнөн таанып ачуу функциясын койгон болсоңуз, беткап тагынып же караңгы жерде турганыңызда телефонуңуз манжаңыздын изин сурайт"</string>
<string name="biometric_settings_category_ways_to_unlock" msgid="3384767901580915266">"Кулпуну ачуу жолдору"</string>
<string name="biometric_settings_use_biometric_unlock_phone" msgid="8180914579885804358">"Телефонуңуздун кулпусун ачыңыз"</string>
<string name="biometric_settings_use_biometric_for_apps" msgid="6201168728906364189">"Колдонмолордо өзүңүздү ырастаңыз"</string>
@@ -847,7 +847,7 @@
<string name="bluetooth_preference_scan_title" msgid="3460316252463771851">"Түзмөктөрдү издөө"</string>
<string name="bluetooth_search_for_devices" msgid="6516902340975407648">"Жаңылоо"</string>
<string name="bluetooth_searching_for_devices" msgid="6541984133657573124">"Изделүүдө…"</string>
- <string name="bluetooth_preference_device_settings" msgid="1688662188157019998">"Түзмөктүн жөндөөлөрү"</string>
+ <string name="bluetooth_preference_device_settings" msgid="1688662188157019998">"Түзмөктү тууралоо"</string>
<string name="bluetooth_preference_paired_dialog_title" msgid="1090131276572055841">"Жупташкан түзмөк"</string>
<string name="bluetooth_preference_paired_dialog_internet_option" msgid="4337953030661626289">"Интернет"</string>
<string name="bluetooth_preference_paired_dialog_keyboard_option" msgid="8247634441638919886">"Баскычтоп"</string>
@@ -2924,6 +2924,8 @@
<string name="battery_not_usage" msgid="1472275761547230196">"Акыркы жолу толук кубатталгандан бери колдонулган жок"</string>
<string name="battery_not_usage_24hr" msgid="8397519536160741248">"Акыркы 24 сааттын ичинде колдонулган жок"</string>
<string name="battery_usage_without_time" msgid="1346894834339420538"></string>
+ <!-- no translation found for battery_usage_other_users (9002643295562500693) -->
+ <skip />
<string name="advanced_battery_graph_subtext" msgid="6816737986172678550">"Калган убакыт түзмөктүн колдонулушуна жараша эсептелип көрсөтүлүүдө."</string>
<string name="estimated_time_left" msgid="948717045180211777">"Болжолдуу калган убакыт"</string>
<string name="estimated_charging_time_left" msgid="2287135413363961246">"Батарея толгонго чейин калган убакыт"</string>
diff --git a/res/values-lo/strings.xml b/res/values-lo/strings.xml
index 10b2ccc..83a8985 100644
--- a/res/values-lo/strings.xml
+++ b/res/values-lo/strings.xml
@@ -2924,6 +2924,8 @@
<string name="battery_not_usage" msgid="1472275761547230196">"ບໍ່ມີການນຳໃຊ້ຫຼັງຈາກສາກເຕັມຫຼ້າສຸດ"</string>
<string name="battery_not_usage_24hr" msgid="8397519536160741248">"ບໍ່ມີການນຳໃຊ້ໃນຮອບ 24 ຊມ ທີ່ຜ່ານມາ"</string>
<string name="battery_usage_without_time" msgid="1346894834339420538"></string>
+ <!-- no translation found for battery_usage_other_users (9002643295562500693) -->
+ <skip />
<string name="advanced_battery_graph_subtext" msgid="6816737986172678550">"ການປະເມີນໄລຍະເວລາແບັດເຕີຣີທີ່ເຫຼືອແມ່ນອ້າງອີງຈາກການນຳໃຊ້ອຸປະກອນຂອງທ່ານ"</string>
<string name="estimated_time_left" msgid="948717045180211777">"ເວລາທີ່ເຫຼືອໂດຍປະມານ"</string>
<string name="estimated_charging_time_left" msgid="2287135413363961246">"ຈົນກວ່າຈະສາກເຕັມ"</string>
diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml
index 7c1ee40..5316107 100644
--- a/res/values-lt/strings.xml
+++ b/res/values-lt/strings.xml
@@ -3000,6 +3000,8 @@
<string name="battery_not_usage" msgid="1472275761547230196">"Nenaudota nuo pastarojo visiško įkrovimo"</string>
<string name="battery_not_usage_24hr" msgid="8397519536160741248">"Nenaudota per pastarąsias 24 val."</string>
<string name="battery_usage_without_time" msgid="1346894834339420538"></string>
+ <!-- no translation found for battery_usage_other_users (9002643295562500693) -->
+ <skip />
<string name="advanced_battery_graph_subtext" msgid="6816737986172678550">"Likęs akumuliatoriaus veikimo laikas numatytas pagal tai, kaip naudojate įrenginį"</string>
<string name="estimated_time_left" msgid="948717045180211777">"Liko laiko (numatyta)"</string>
<string name="estimated_charging_time_left" msgid="2287135413363961246">"Iki visiško įkrovimo"</string>
diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml
index 9545b19..ff317f4 100644
--- a/res/values-lv/strings.xml
+++ b/res/values-lv/strings.xml
@@ -2962,6 +2962,8 @@
<string name="battery_not_usage" msgid="1472275761547230196">"Nav lietots kopš pēdējās pilnās uzlādes"</string>
<string name="battery_not_usage_24hr" msgid="8397519536160741248">"Nav lietots pēdējo 24 h laikā"</string>
<string name="battery_usage_without_time" msgid="1346894834339420538"></string>
+ <!-- no translation found for battery_usage_other_users (9002643295562500693) -->
+ <skip />
<string name="advanced_battery_graph_subtext" msgid="6816737986172678550">"Akumulatora darbības laiks tiek aprēķināts, pamatojoties uz ierīces lietojuma datiem."</string>
<string name="estimated_time_left" msgid="948717045180211777">"Plānotais atlikušais laiks"</string>
<string name="estimated_charging_time_left" msgid="2287135413363961246">"Līdz pilnai uzlādei"</string>
diff --git a/res/values-mk/strings.xml b/res/values-mk/strings.xml
index e60fe25..83ccc83 100644
--- a/res/values-mk/strings.xml
+++ b/res/values-mk/strings.xml
@@ -483,7 +483,7 @@
<string name="biometric_settings_intro" msgid="4263069383955676756">"Кога ќе поставите „Отклучување со лик“ и „Отклучување со отпечаток на прст“, телефонот ќе го побара вашиот отпечаток кога носите маска или сте на темно место"</string>
<string name="biometric_settings_category_ways_to_unlock" msgid="3384767901580915266">"Начини на отклучување"</string>
<string name="biometric_settings_use_biometric_unlock_phone" msgid="8180914579885804358">"Отклучувајте го телефонот"</string>
- <string name="biometric_settings_use_biometric_for_apps" msgid="6201168728906364189">"Потврдете дека сте вие во апликации"</string>
+ <string name="biometric_settings_use_biometric_for_apps" msgid="6201168728906364189">"Потврдувајте дека сте вие во апликациите"</string>
<string name="biometric_settings_use_face_preference_summary" msgid="1821648836899408477">"со користење лик"</string>
<string name="biometric_settings_use_fingerprint_preference_summary" msgid="6077762097826050165">"со користење отпечаток"</string>
<string name="biometric_settings_use_face_or_fingerprint_preference_summary" msgid="3029102492674234728">"со користење лик или отпечаток"</string>
@@ -2926,6 +2926,8 @@
<string name="battery_not_usage" msgid="1472275761547230196">"Не е користена од последното целосно полнење"</string>
<string name="battery_not_usage_24hr" msgid="8397519536160741248">"Не е користена во минатите 24 часа"</string>
<string name="battery_usage_without_time" msgid="1346894834339420538"></string>
+ <!-- no translation found for battery_usage_other_users (9002643295562500693) -->
+ <skip />
<string name="advanced_battery_graph_subtext" msgid="6816737986172678550">"Проценката за преостанатата батерија се базира врз користењето на уредот"</string>
<string name="estimated_time_left" msgid="948717045180211777">"Проценето преостанато време"</string>
<string name="estimated_charging_time_left" msgid="2287135413363961246">"До целосно полнење"</string>
diff --git a/res/values-ml/strings.xml b/res/values-ml/strings.xml
index 8499036..402050d 100644
--- a/res/values-ml/strings.xml
+++ b/res/values-ml/strings.xml
@@ -2924,6 +2924,8 @@
<string name="battery_not_usage" msgid="1472275761547230196">"അവസാനം പൂർണ്ണമായി ചാർജ് ആയതിന് ശേഷം ഉപയോഗിച്ചിട്ടില്ല"</string>
<string name="battery_not_usage_24hr" msgid="8397519536160741248">"കഴിഞ്ഞ 24 മണിക്കൂറിനിടെ ഉപയോഗിച്ചിട്ടില്ല"</string>
<string name="battery_usage_without_time" msgid="1346894834339420538"></string>
+ <!-- no translation found for battery_usage_other_users (9002643295562500693) -->
+ <skip />
<string name="advanced_battery_graph_subtext" msgid="6816737986172678550">"നിങ്ങളുടെ ഉപകരണ ഉപയോഗത്തെ അടിസ്ഥാനമാക്കിയുള്ളതാണ് ബാക്കിയുള്ള ബാറ്ററിയുടെ ഏകദേശക്കണക്ക്"</string>
<string name="estimated_time_left" msgid="948717045180211777">"അവശേഷിക്കുന്ന ഏകദേശ സമയം"</string>
<string name="estimated_charging_time_left" msgid="2287135413363961246">"പൂർണ്ണമായി ചാർജ്ജുചെയ്യുന്നത് വരെ"</string>
diff --git a/res/values-mn/strings.xml b/res/values-mn/strings.xml
index 14b5bfd..dbe2ad4 100644
--- a/res/values-mn/strings.xml
+++ b/res/values-mn/strings.xml
@@ -2924,6 +2924,7 @@
<string name="battery_not_usage" msgid="1472275761547230196">"Сүүлд бүрэн цэнэглэснээс хойш ашиглаагүй"</string>
<string name="battery_not_usage_24hr" msgid="8397519536160741248">"Өнгөрсөн 24 цагийн турш ашиглаагүй"</string>
<string name="battery_usage_without_time" msgid="1346894834339420538"></string>
+ <string name="battery_usage_other_users" msgid="9002643295562500693">"Бусад хэрэглэгч"</string>
<string name="advanced_battery_graph_subtext" msgid="6816737986172678550">"Таны төхөөрөмжийн ашиглалтад үндэслэн батарейны үлдсэн түвшнийг тооцдог"</string>
<string name="estimated_time_left" msgid="948717045180211777">"Барагцаалсан үлдсэн хугацаа"</string>
<string name="estimated_charging_time_left" msgid="2287135413363961246">"Бүрэн цэнэглэх хүртэл"</string>
diff --git a/res/values-mr/strings.xml b/res/values-mr/strings.xml
index dea4538..6595e77 100644
--- a/res/values-mr/strings.xml
+++ b/res/values-mr/strings.xml
@@ -2925,6 +2925,8 @@
<string name="battery_not_usage" msgid="1472275761547230196">"शेवटची पूर्ण चार्ज केल्यानंतर बॅटरी वापरलेली नाही"</string>
<string name="battery_not_usage_24hr" msgid="8397519536160741248">"मागील २४ तासांमध्ये बॅटरी वापरलेली नाही"</string>
<string name="battery_usage_without_time" msgid="1346894834339420538"></string>
+ <!-- no translation found for battery_usage_other_users (9002643295562500693) -->
+ <skip />
<string name="advanced_battery_graph_subtext" msgid="6816737986172678550">"अंदाजे शिल्लक बॅटरी ही तुमच्या डिव्हाइसच्या वापरावर अवलंबून असते"</string>
<string name="estimated_time_left" msgid="948717045180211777">"अंदाजे शिल्लक वेळ"</string>
<string name="estimated_charging_time_left" msgid="2287135413363961246">"पूर्ण चार्ज होईपर्यंत"</string>
diff --git a/res/values-ms/strings.xml b/res/values-ms/strings.xml
index 17d240f..4da3eb8 100644
--- a/res/values-ms/strings.xml
+++ b/res/values-ms/strings.xml
@@ -2924,6 +2924,7 @@
<string name="battery_not_usage" msgid="1472275761547230196">"Tiada penggunaan sejak cas penuh terakhir"</string>
<string name="battery_not_usage_24hr" msgid="8397519536160741248">"Tiada penggunaan untuk tempoh 24 jam yang lalu"</string>
<string name="battery_usage_without_time" msgid="1346894834339420538"></string>
+ <string name="battery_usage_other_users" msgid="9002643295562500693">"Pengguna lain"</string>
<string name="advanced_battery_graph_subtext" msgid="6816737986172678550">"Anggaran baki bateri adalah berdasarkan penggunaan peranti anda"</string>
<string name="estimated_time_left" msgid="948717045180211777">"Anggaran baki masa"</string>
<string name="estimated_charging_time_left" msgid="2287135413363961246">"Sehingga dicas penuh"</string>
diff --git a/res/values-my/strings.xml b/res/values-my/strings.xml
index 79aa715..9beb425 100644
--- a/res/values-my/strings.xml
+++ b/res/values-my/strings.xml
@@ -2924,6 +2924,7 @@
<string name="battery_not_usage" msgid="1472275761547230196">"နောက်ဆုံးအကြိမ် အားအပြည့်သွင်းပြီးနောက် အသုံးပြုမှု မရှိပါ"</string>
<string name="battery_not_usage_24hr" msgid="8397519536160741248">"ပြီးခဲ့သော ၂၄ နာရီအတွက် အသုံးပြုမှု မရှိပါ"</string>
<string name="battery_usage_without_time" msgid="1346894834339420538"></string>
+ <string name="battery_usage_other_users" msgid="9002643295562500693">"အခြားအသုံးပြုသူများ"</string>
<string name="advanced_battery_graph_subtext" msgid="6816737986172678550">"ဘက်ထရီလက်ကျန်ခန့်မှန်းချက်သည် သင့်စက်၏ အသုံးပြုမှုအပေါ် အခြေခံပါသည်"</string>
<string name="estimated_time_left" msgid="948717045180211777">"ခန့်မှန်း ကျန်ရှိချိန်"</string>
<string name="estimated_charging_time_left" msgid="2287135413363961246">"အားပြည့်ရန် လိုအပ်ချိန်"</string>
diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml
index f62e46c..6f0a665 100644
--- a/res/values-nb/strings.xml
+++ b/res/values-nb/strings.xml
@@ -2555,7 +2555,7 @@
<string name="reduce_bright_colors_preference_summary" product="default" msgid="7878756844769221647">"Gjør skjermen mørkere enn den laveste lysstyrken på telefonen"</string>
<string name="reduce_bright_colors_preference_summary" product="tablet" msgid="8959794720356934888">"Gjør skjermen mørkere enn den laveste lysstyrken på nettbrettet"</string>
<string name="reduce_bright_colors_preference_intro_text" msgid="3502290826747650566">"Gjør skjermen mørkere så det blir mer komfortabelt å lese"</string>
- <string name="reduce_bright_colors_preference_subtitle" product="default" msgid="8573408446901659333">"Ekstra dimmet kan være nyttig når <ol> <li> standard laveste lysstyrke på telefonen fremdeles er for lys</li> <li> du bruker telefonen i mørke omgivelser, for eksempel om natten eller i et mørkt rom før leggetid</li> </ol>"</string>
+ <string name="reduce_bright_colors_preference_subtitle" product="default" msgid="8573408446901659333">"Ekstra dimmet kan være nyttig når <ol> <li> standard laveste lysstyrke på telefonen fremdeles er for lys</li> <li> du bruker telefonen i mørke omgivelser, for eksempel om natten eller i et mørkt rom før leggetid</li> </ol>"</string>
<string name="reduce_bright_colors_preference_subtitle" product="tablet" msgid="5158211121482010799">"Ekstra dimmet kan være nyttig når <ol> <li> standard laveste lysstyrke på nettbrettet fremdeles er for lys</li> <li> du bruker nettbrettet i mørke omgivelser, for eksempel om natten eller i et mørkt rom før leggetid</li> </ol>"</string>
<string name="reduce_bright_colors_intensity_preference_title" msgid="7455443033955118267">"Intensitet"</string>
<string name="reduce_bright_colors_intensity_start_label" msgid="930387498396426039">"Mørkere"</string>
@@ -2924,6 +2924,8 @@
<string name="battery_not_usage" msgid="1472275761547230196">"Ingen bruk siden sist batteriet var fulladet"</string>
<string name="battery_not_usage_24hr" msgid="8397519536160741248">"Ingen bruk de siste 24 timene"</string>
<string name="battery_usage_without_time" msgid="1346894834339420538"></string>
+ <!-- no translation found for battery_usage_other_users (9002643295562500693) -->
+ <skip />
<string name="advanced_battery_graph_subtext" msgid="6816737986172678550">"Beregnet gjenværende batteritid er basert på måten du bruker enheten på"</string>
<string name="estimated_time_left" msgid="948717045180211777">"Anslått tid som er igjen"</string>
<string name="estimated_charging_time_left" msgid="2287135413363961246">"Til det er fulladet"</string>
@@ -5079,20 +5081,20 @@
<string name="financed_privacy_install_apps" msgid="7381718005710210851">"installere apper fra utenfor Play-butikken"</string>
<string name="financed_privacy_safe_mode" msgid="5362149445732602578">"starte enheten din på nytt i sikker modus"</string>
<string name="financed_privacy_multi_users" msgid="1727194928477613081">"legge til flere brukere på enheten din"</string>
- <string name="financed_privacy_config_date_time" msgid="8567370445374984365">"Endre dato, klokkeslett og tidssoner"</string>
+ <string name="financed_privacy_config_date_time" msgid="8567370445374984365">"endre dato, klokkeslett og tidssoner"</string>
<string name="financed_privacy_developer_options" msgid="7602001474669831672">"bruke utvikleralternativer"</string>
<string name="financed_privacy_credit_provider_capabilities_category" msgid="8737902277892987998">"Kredittleverandøren din kan"</string>
- <string name="financed_privacy_IMEI" msgid="1852413860963824799">"Tilgang til IMEI-nummeret ditt"</string>
- <string name="financed_privacy_factory_reset" msgid="5505016667590160732">"Tilbakestill enheten til fabrikkstandard hvis noe går galt"</string>
+ <string name="financed_privacy_IMEI" msgid="1852413860963824799">"tilgang til IMEI-nummeret ditt"</string>
+ <string name="financed_privacy_factory_reset" msgid="5505016667590160732">"tilbakestill enheten til fabrikkstandard hvis noe går galt"</string>
<string name="financed_privacy_locked_mode_category" msgid="3708288398912647751">"Hvis enheten din er låst, kan du bare bruke den til å"</string>
<string name="financed_privacy_emergency_calls" msgid="1108183987142736497">"starte nødanrop"</string>
<string name="financed_privacy_system_info" msgid="4158031444108708927">"se systeminformasjon som dato, klokkeslett, nettverksstatus og batteri"</string>
<string name="financed_privacy_turn_on_off_device" msgid="3331566753152790571">"slå enheten din på eller av"</string>
<string name="financed_privacy_notifications" msgid="5932303271274089968">"se varsler og SMS-er"</string>
- <string name="financed_privacy_allowlisted_apps" msgid="8333040812194879963">"Tilgang til apper som tillates av kredittleverandøren"</string>
+ <string name="financed_privacy_allowlisted_apps" msgid="8333040812194879963">"tilgang til apper som tillates av kredittleverandøren"</string>
<string name="financed_privacy_fully_paid_category" msgid="9221763928564246923">"Når du har betalt hele beløpet:"</string>
- <string name="financed_privacy_restrictions_removed" msgid="3182636815294595072">"Alle begrensninger fjernes fra enheten"</string>
- <string name="financed_privacy_uninstall_creditor_app" msgid="6339004120497310705">"Du kan ikke avinstallere kreditorappen"</string>
+ <string name="financed_privacy_restrictions_removed" msgid="3182636815294595072">"alle begrensninger fjernes fra enheten"</string>
+ <string name="financed_privacy_uninstall_creditor_app" msgid="6339004120497310705">"du kan ikke avinstallere kreditorappen"</string>
<plurals name="default_camera_app_title" formatted="false" msgid="8112432929729136399">
<item quantity="other">Kamera-apper</item>
<item quantity="one">Kamera-app</item>
diff --git a/res/values-ne/strings.xml b/res/values-ne/strings.xml
index 6174223..3c055be 100644
--- a/res/values-ne/strings.xml
+++ b/res/values-ne/strings.xml
@@ -2924,6 +2924,8 @@
<string name="battery_not_usage" msgid="1472275761547230196">"पछिल्लो पटक पूर्ण चार्ज भएदेखि ब्याट्री प्रयोग गरिएको छैन"</string>
<string name="battery_not_usage_24hr" msgid="8397519536160741248">"पछिल्लो २४ घन्टामा ब्याट्री प्रयोग गरिएन"</string>
<string name="battery_usage_without_time" msgid="1346894834339420538"></string>
+ <!-- no translation found for battery_usage_other_users (9002643295562500693) -->
+ <skip />
<string name="advanced_battery_graph_subtext" msgid="6816737986172678550">"बाँकी रहेको ब्याट्रीको प्रतिशतको अनुमान तपाईंको डिभाइसको प्रयोगमा आधारित हुन्छ"</string>
<string name="estimated_time_left" msgid="948717045180211777">"अनुमानित बाँकी समय"</string>
<string name="estimated_charging_time_left" msgid="2287135413363961246">"पूर्ण चार्ज नभएसम्म"</string>
diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml
index 8dd625c..3756c87 100644
--- a/res/values-nl/strings.xml
+++ b/res/values-nl/strings.xml
@@ -473,7 +473,7 @@
<string name="security_settings_fingerprint_v2_enroll_acquire_too_fast" msgid="5891227328100822018">"Til je vinger op zodra je een trilling voelt"</string>
<string name="security_settings_fingerprint_v2_enroll_acquire_too_bright" msgid="769646735950329315">"Ga naar een plek met zachter licht en probeer het opnieuw"</string>
<string name="security_settings_fingerprint_v2_enroll_error_max_attempts" msgid="1464972470750764128">"Je hebt het maximale aantal pogingen bereikt"</string>
- <string name="security_settings_fingerprint_v2_home_screen_text" product="tablet" msgid="179325591887291180">"Gebruik je vingerafdruk om je tablet te ontgrendelen of te bevestigen dat jij het bent als je inlogt bij apps"</string>
+ <string name="security_settings_fingerprint_v2_home_screen_text" product="tablet" msgid="179325591887291180">"Gebruik je vingerafdruk om je tablet te ontgrendelen of te bevestigen dat jij het bent als je bijvoorbeeld inlogt bij apps"</string>
<string name="security_settings_fingerprint_v2_home_screen_text" product="device" msgid="2503218139575057099">"Gebruik je vingerafdruk om je apparaat te ontgrendelen of te bevestigen dat jij het bent als je inlogt bij apps"</string>
<string name="security_settings_fingerprint_v2_home_screen_text" product="default" msgid="481286891358925579">"Gebruik je vingerafdruk om je telefoon te ontgrendelen of te bevestigen dat jij het bent als je inlogt bij apps"</string>
<string name="security_settings_biometric_preference_title" msgid="298146483579539448">"Ontgrendelen via gezichtsherkenning en vingerafdruk"</string>
@@ -1577,7 +1577,7 @@
<string name="memory_dcim_usage" msgid="3568913845973164352">"Foto\'s, video\'s"</string>
<string name="memory_music_usage" msgid="8100634000114206429">"Audio (muziek, ringtones, podcasts, enzovoort)"</string>
<string name="memory_media_misc_usage" msgid="7066851245178533269">"Andere bestanden"</string>
- <string name="memory_media_cache_usage" msgid="780808666853685824">"Gegevens in het cachegeheugen"</string>
+ <string name="memory_media_cache_usage" msgid="780808666853685824">"Gecachete gegevens"</string>
<string name="sd_eject" product="nosdcard" msgid="6136102589751843304">"Gedeelde opslag ontkoppelen"</string>
<string name="sd_eject" product="default" msgid="8062832622096296251">"SD-kaart ontkoppelen"</string>
<string name="sd_eject_summary" product="nosdcard" msgid="6859940774161708871">"Interne USB-opslag ontkoppelen"</string>
@@ -2924,6 +2924,8 @@
<string name="battery_not_usage" msgid="1472275761547230196">"Geen gebruik sinds laatste volledige lading"</string>
<string name="battery_not_usage_24hr" msgid="8397519536160741248">"Geen gebruik in de afgelopen 24 u"</string>
<string name="battery_usage_without_time" msgid="1346894834339420538"></string>
+ <!-- no translation found for battery_usage_other_users (9002643295562500693) -->
+ <skip />
<string name="advanced_battery_graph_subtext" msgid="6816737986172678550">"Schatting van resterende batterijduur is gebaseerd op je apparaatgebruik"</string>
<string name="estimated_time_left" msgid="948717045180211777">"Geschatte resterende tijd"</string>
<string name="estimated_charging_time_left" msgid="2287135413363961246">"Tot volledige lading"</string>
@@ -5091,8 +5093,8 @@
<string name="financed_privacy_notifications" msgid="5932303271274089968">"Meldingen en sms-berichten bekijken"</string>
<string name="financed_privacy_allowlisted_apps" msgid="8333040812194879963">"Toegang krijgen tot apps die zijn toegestaan door de kredietverstrekker"</string>
<string name="financed_privacy_fully_paid_category" msgid="9221763928564246923">"Nadat je het volledige bedrag hebt betaald:"</string>
- <string name="financed_privacy_restrictions_removed" msgid="3182636815294595072">"Alle beperkingen voor het apparaat worden ingetrokken"</string>
- <string name="financed_privacy_uninstall_creditor_app" msgid="6339004120497310705">"Je kunt de app van de kredietverstrekker verwijderen"</string>
+ <string name="financed_privacy_restrictions_removed" msgid="3182636815294595072">"worden alle beperkingen voor het apparaat ingetrokken."</string>
+ <string name="financed_privacy_uninstall_creditor_app" msgid="6339004120497310705">"kun je de app van de kredietverstrekker verwijderen."</string>
<plurals name="default_camera_app_title" formatted="false" msgid="8112432929729136399">
<item quantity="other">Camera-apps</item>
<item quantity="one">Camera-app</item>
diff --git a/res/values-or/arrays.xml b/res/values-or/arrays.xml
index f7a665d..89f4ff4 100644
--- a/res/values-or/arrays.xml
+++ b/res/values-or/arrays.xml
@@ -521,7 +521,7 @@
</string-array>
<string-array name="cdma_system_select_choices">
<item msgid="1205665684426617345">"କେବଳ ହୋମ୍ ନେଟ୍ୱର୍କ"</item>
- <item msgid="6691772120712000966">"ସ୍ୱଚାଳିତ"</item>
+ <item msgid="6691772120712000966">"ଅଟୋମେଟିକ"</item>
</string-array>
<string-array name="preferred_network_mode_choices">
<item msgid="5746729990546256950">"GSM/WCDMA ପସନ୍ଦ କରାଯାଇଛି"</item>
diff --git a/res/values-or/strings.xml b/res/values-or/strings.xml
index a033d0e..5c41ce5 100644
--- a/res/values-or/strings.xml
+++ b/res/values-or/strings.xml
@@ -146,7 +146,7 @@
<string name="bluetooth_disable_hw_offload_dialog_title" msgid="6001142380445276918">"ଡିଭାଇସକୁ ରିଷ୍ଟାର୍ଟ କରିବେ?"</string>
<string name="bluetooth_disable_hw_offload_dialog_message" msgid="1524373895333698779">"ଏହି ସେଟିଂ ବଦଳାଇବାକୁ ଆପଣଙ୍କୁ ଆପଣଙ୍କ ଡିଭାଇସ ରିଷ୍ଟାର୍ଟ କରିବାକୁ ହେବ।"</string>
<string name="bluetooth_disable_hw_offload_dialog_confirm" msgid="5594859658551707592">"ରିଷ୍ଟାର୍ଟ କରନ୍ତୁ"</string>
- <string name="bluetooth_disable_hw_offload_dialog_cancel" msgid="3663690305043973720">"ବାତିଲ୍ କରନ୍ତୁ"</string>
+ <string name="bluetooth_disable_hw_offload_dialog_cancel" msgid="3663690305043973720">"ବାତିଲ କରନ୍ତୁ"</string>
<string name="bluetooth_enable_leaudio" msgid="1245004820628723136">"ବ୍ଲୁଟୁଥ LE ଅଡିଓକୁ ସକ୍ଷମ କରନ୍ତୁ"</string>
<string name="bluetooth_enable_leaudio_summary" msgid="8066117764037123479">"ଯଦି ଡିଭାଇସ LE ଅଡିଓ ହାର୍ଡୱେର କ୍ଷମତାକୁ ସମର୍ଥନ କରେ ତେବେ ବ୍ଲୁଟୁଥ LE ଅଡିଓ ଫିଚରକୁ ସକ୍ଷମ କରେ।"</string>
<string name="connected_device_media_device_title" msgid="3783388247594566734">"ମିଡିଆ ଡିଭାଇସ୍ଗୁଡ଼ିକ"</string>
@@ -240,7 +240,7 @@
<string name="sd_card_settings_label" product="nosdcard" msgid="1850505156136467106">"USB ଷ୍ଟୋରେଜ୍"</string>
<string name="sd_card_settings_label" product="default" msgid="8715502912796241588">"SD କାର୍ଡ"</string>
<string name="proxy_settings_label" msgid="6300573815025557843">"ପ୍ରକ୍ସି ସେଟିଂସ"</string>
- <string name="cancel" msgid="5780102414089664898">"ବାତିଲ୍"</string>
+ <string name="cancel" msgid="5780102414089664898">"ବାତିଲ"</string>
<string name="okay" msgid="4827099303045669054">"ଠିକ୍ ଅଛି"</string>
<string name="forget" msgid="3754013654135912783">"ଭୁଲିଯାଆନ୍ତୁ"</string>
<string name="save" msgid="3125033126936493822">"ସେଭ୍ କରନ୍ତୁ"</string>
@@ -355,7 +355,7 @@
<string name="security_settings_face_enroll_introduction_accessibility_expanded" msgid="6763509014732769185"></string>
<string name="security_settings_face_enroll_introduction_accessibility_diversity" msgid="2774962371839179206"></string>
<string name="security_settings_face_enroll_introduction_accessibility_vision" msgid="7700394302162170363"></string>
- <string name="security_settings_face_enroll_introduction_cancel" msgid="7551159644361639436">"ବାତିଲ୍"</string>
+ <string name="security_settings_face_enroll_introduction_cancel" msgid="7551159644361639436">"ବାତିଲ"</string>
<string name="security_settings_face_enroll_introduction_no_thanks" msgid="1820618982738898717">"ନାହିଁ, ଧନ୍ୟବାଦ"</string>
<string name="security_settings_face_enroll_introduction_agree" msgid="6319476573697497750">"ମୁଁ ରାଜି ଅଛି"</string>
<string name="security_settings_face_enroll_introduction_more" msgid="1970820298889710532">"ଅଧିକ"</string>
@@ -444,7 +444,7 @@
<string name="security_settings_fingerprint_enroll_introduction_footer_message_2" msgid="3507618608004123384">"ଏକ ଦୃଢ଼ ପାଟର୍ନ କିମ୍ବା PINଠାରୁ ଆପଣଙ୍କ ଟିପଚିହ୍ନ କମ୍ ସୁରକ୍ଷିତ ହୋଇପାରେ।"</string>
<string name="security_settings_fingerprint_enroll_introduction_footer_message_3" product="default" msgid="4757472591076060066">"ଉନ୍ନତ ଟିପଚିହ୍ନ ମଡେଲଗୁଡ଼ିକୁ ତିଆରି କରିବା ପାଇଁ ଆପଣଙ୍କର ଫୋନ୍ ବେଳେବେଳେ ଆପଣଙ୍କ ବର୍ତ୍ତମାନର ଟିପଚିହ୍ନ ଛବିଗୁଡ଼ିକୁ ବ୍ୟବହାର କରିବ।"</string>
<string name="security_settings_fingerprint_enroll_introduction_message_unlock_disabled" msgid="8957789840251747092">"ଫୋନ୍କୁ ଅନ୍ଲକ୍ କରିବା କିମ୍ୱା କିଣାକିଣିକୁ ଅନୁମୋଦନ କରିବା ପାଇଁ ନିଜ ଟିପଚିହ୍ନର ବ୍ୟବହାର କରନ୍ତୁ।\n\nଧ୍ୟାନଦିଅନ୍ତୁ: ଏହି ଡିଭାଇସ୍ ଅନଲକ୍ କରିବାକୁ ଆପଣ ଟିପଚିହ୍ନ ବ୍ୟବହାର କରିପାରିବେ ନାହିଁ। ଅଧିକ ସୂଚନା ପାଇଁ, ଆପଣଙ୍କ ସଂସ୍ଥାର ଆଡମିନଙ୍କ ସହ ଯୋଗାଯୋଗ କରନ୍ତୁ।"</string>
- <string name="security_settings_fingerprint_enroll_introduction_cancel" msgid="6086532316718920562">"ବାତିଲ୍"</string>
+ <string name="security_settings_fingerprint_enroll_introduction_cancel" msgid="6086532316718920562">"ବାତିଲ"</string>
<string name="security_settings_fingerprint_enroll_introduction_no_thanks" msgid="6104718999323591180">"ନା, ଧନ୍ୟବାଦ"</string>
<string name="security_settings_fingerprint_enroll_introduction_agree" msgid="4068276083536421828">"ମୁଁ ରାଜି"</string>
<string name="setup_fingerprint_enroll_skip_title" msgid="2473807887676247264">"ଟିପଚିହ୍ନ ବାଦ୍ ଦେବେ?"</string>
@@ -501,7 +501,7 @@
<string name="skip_anyway_button_label" msgid="3442274117023270068">"ଯେ କୌଣସି ଭାବେ ବାଦ୍ ଦିଅନ୍ତୁ"</string>
<string name="go_back_button_label" msgid="6139455414099035594">"ପଛକୁ ଫେରନ୍ତୁ"</string>
<string name="skip_lock_screen_dialog_button_label" msgid="641984698150020591">"ବାଦ୍ ଦିଅନ୍ତୁ"</string>
- <string name="cancel_lock_screen_dialog_button_label" msgid="1801132985957491690">"ବାତିଲ୍ କରନ୍ତୁ"</string>
+ <string name="cancel_lock_screen_dialog_button_label" msgid="1801132985957491690">"ବାତିଲ କରନ୍ତୁ"</string>
<string name="security_settings_fingerprint_enroll_find_sensor_title" msgid="886085239313346000">"ସେନ୍ସରକୁ ସ୍ପର୍ଶ କରନ୍ତୁ"</string>
<string name="security_settings_udfps_enroll_find_sensor_title" msgid="8077484429913330179">"ଆପଣଙ୍କ ଟିପଚିହ୍ନ କିପରି ସେଟ୍ ଅପ୍ କରିବେ"</string>
<string name="security_settings_fingerprint_enroll_find_sensor_message" msgid="6160543980992596286">"ଏହା ଆପଣଙ୍କ ଫୋନ୍ର ପଛରେ ଅଛି। ନିଜ ପ୍ରଥମ ଆଙ୍ଗୁଠିର ବ୍ୟବହାର କରନ୍ତୁ।"</string>
@@ -805,10 +805,10 @@
<string name="lockpassword_password_recently_used" msgid="5341218079730167191">"ଏକ ସମ୍ପ୍ରତି ପାସ୍ୱର୍ଡ ବ୍ୟବହାର କରିବାକୁ ଡିଭାଇସ୍ ଆଡମିନ୍ ଅନୁମତି ଦିଅନ୍ତି ନାହିଁ"</string>
<string name="lockpassword_pin_no_sequential_digits" msgid="5843639256988031272">"ସଂଖ୍ୟାର କ୍ରମବୃଦ୍ଧି, କ୍ରମହ୍ରାସ, କିମ୍ବା ପୁନରାବୃତ୍ତ କ୍ରମ ଅନୁମୋଦିତ ନୁହେଁ"</string>
<string name="lockpassword_confirm_label" msgid="560897521093566777">"ନିଶ୍ଚିତ କରନ୍ତୁ"</string>
- <string name="lockpassword_cancel_label" msgid="6711112212489992112">"ବାତିଲ୍ କରନ୍ତୁ"</string>
+ <string name="lockpassword_cancel_label" msgid="6711112212489992112">"ବାତିଲ କରନ୍ତୁ"</string>
<string name="lockpassword_clear_label" msgid="311359833434539894">"ଖାଲି କରନ୍ତୁ"</string>
<string name="lockpassword_credential_changed" msgid="5934778179732392028">"ପୂର୍ବରୁ ସ୍କ୍ରିନ୍ ଲକ୍ ପରିବର୍ତ୍ତନ କରାଯାଇଥିଲା। ନୂତନ ସ୍କ୍ରିନ୍ ଲକ୍କୁ ଚେଷ୍ଟା କରନ୍ତୁ।"</string>
- <string name="lockpattern_tutorial_cancel_label" msgid="775215267818384016">"ବାତିଲ୍"</string>
+ <string name="lockpattern_tutorial_cancel_label" msgid="775215267818384016">"ବାତିଲ"</string>
<string name="lockpattern_tutorial_continue_label" msgid="1329049481210689408">"ଆଗକୁ"</string>
<string name="lock_setup" msgid="4622999020926280737">"ସେଟଅପ୍ ସମ୍ପୂର୍ଣ୍ଣ।"</string>
<string name="manage_device_admin" msgid="1044620606203916275">"ଡିଭାଇସ୍ ଆଡମିନ୍ ଆପ୍"</string>
@@ -1134,7 +1134,7 @@
<string name="wifi_failed_forget_message" msgid="8272732599235525880">"ନେଟ୍ୱର୍କ ଭୁଲିଯିବାରେ ବିଫଳ ହେଲା"</string>
<string name="wifi_save" msgid="2312643132472226807">"ସେଭ୍ କରନ୍ତୁ"</string>
<string name="wifi_failed_save_message" msgid="1830279872341387120">"ନେଟୱାର୍କ୍ ସେଭ୍ କରି ପାରିଲା ନାହିଁ"</string>
- <string name="wifi_cancel" msgid="6698897376888935410">"ବାତିଲ୍"</string>
+ <string name="wifi_cancel" msgid="6698897376888935410">"ବାତିଲ"</string>
<string name="wifi_forget_dialog_title" msgid="4363829200968563164">"ନେଟୱର୍କକୁ ଭୁଲିଯିବେ?"</string>
<string name="wifi_forget_dialog_message" msgid="8419499588321940243">"ଏହି ନେଟ୍ୱର୍କ ପାଇଁ ଥିବା ସବୁ ପାସ୍ୱର୍ଡକୁ ଡିଲିଟ୍ କରିଦିଆଯିବ"</string>
<plurals name="wifi_saved_access_points_summary" formatted="false" msgid="2802436466732147888">
@@ -1166,7 +1166,7 @@
<string name="wifi_advanced_settings_label" msgid="5880605751602184383">"IP ସେଟିଂସ"</string>
<string name="wifi_advanced_not_available" msgid="8701003884367299092">"ଏହି ଉପଯୋଗକର୍ତ୍ତାଙ୍କ ପାଇଁ ୱାଇ-ଫାଇର ଉନ୍ନତ ସେଟିଂସ ଉପଲବ୍ଧ ନାହିଁ"</string>
<string name="wifi_ip_settings_menu_save" msgid="5190481040428567106">"ସେଭ୍ କରନ୍ତୁ"</string>
- <string name="wifi_ip_settings_menu_cancel" msgid="1757817733064004598">"ବାତିଲ୍ କରନ୍ତୁ"</string>
+ <string name="wifi_ip_settings_menu_cancel" msgid="1757817733064004598">"ବାତିଲ କରନ୍ତୁ"</string>
<string name="wifi_ip_settings_invalid_ip_address" msgid="3622891107865052307">"ଏକ ବୈଧ IP ଠିକଣା ଟାଇପ୍ କରନ୍ତୁ"</string>
<string name="wifi_ip_settings_invalid_gateway" msgid="1174931247370931239">"ଏକ ମାନ୍ୟ ଗେଟ୍ୱେ ଠିକଣା ଟାଇପ୍ କରନ୍ତୁ"</string>
<string name="wifi_ip_settings_invalid_dns" msgid="1757402215999845975">"ଏକ ବୈଧ DNS ଠିକଣା ଟାଇପ୍ କରନ୍ତୁ।"</string>
@@ -1188,8 +1188,8 @@
<string name="wifi_p2p_disconnect_title" msgid="96361896458072463">"ବିଚ୍ଛିନ୍ନ କରିବେ?"</string>
<string name="wifi_p2p_disconnect_message" msgid="1208761239498807208">"ଯଦି ଆପଣ ବିଚ୍ଛିନ୍ନ କରନ୍ତି, <xliff:g id="PEER_NAME">%1$s</xliff:g> ସହ ଆପଣଙ୍କ ସଂଯୋଗ ଶେଷ ହୋଇଯିବ।"</string>
<string name="wifi_p2p_disconnect_multiple_message" msgid="4490648217799144078">"ଯଦି ଆପଣ ବିଚ୍ଛିନ୍ନ କରନ୍ତି, <xliff:g id="PEER_NAME">%1$s</xliff:g> ଏବଂ <xliff:g id="PEER_COUNT">%2$s</xliff:g> ଟି ଅନ୍ୟ ଡିଭାଇସ୍ ସହ ଆପଣଙ୍କ ସଂଯୋଜନା ଶେଷ ହେବ।"</string>
- <string name="wifi_p2p_cancel_connect_title" msgid="8476985132989357041">"ନିମନ୍ତ୍ରଣକୁ ବାତିଲ୍ କରିବେ?"</string>
- <string name="wifi_p2p_cancel_connect_message" msgid="2409074184473879809">"<xliff:g id="PEER_NAME">%1$s</xliff:g> ସହ ସଂଯୋଗ କରିବାକୁ ନିମନ୍ତ୍ରଣକୁ ଆପଣ ବାତିଲ୍ କରିବାକୁ ଚାହାଁନ୍ତି କି?"</string>
+ <string name="wifi_p2p_cancel_connect_title" msgid="8476985132989357041">"ନିମନ୍ତ୍ରଣକୁ ବାତିଲ କରିବେ?"</string>
+ <string name="wifi_p2p_cancel_connect_message" msgid="2409074184473879809">"<xliff:g id="PEER_NAME">%1$s</xliff:g> ସହ ସଂଯୋଗ କରିବାକୁ ନିମନ୍ତ୍ରଣକୁ ଆପଣ ବାତିଲ କରିବାକୁ ଚାହାଁନ୍ତି କି?"</string>
<string name="wifi_p2p_delete_group_message" msgid="4880242270742385699">"ଏହି ଗ୍ରୁପ୍କୁ ଭୁଲିଯିବେ?"</string>
<string name="wifi_hotspot_checkbox_text" msgid="1549663436920597006">"ୱାଇ-ଫାଇ ହଟସ୍ପଟ୍"</string>
<string name="wifi_hotspot_off_subtext" msgid="2751383134504362078">"ଅନ୍ୟ ଡିଭାଇସଗୁଡ଼ିକ ସହ ଇଣ୍ଟରନେଟ୍ କିମ୍ବା ବିଷୟବସ୍ତୁ ସେୟାର୍ କରୁନାହିଁ"</string>
@@ -1492,7 +1492,7 @@
<string name="sim_pin_disable_failed" msgid="8719890393181032837">"PIN ଅକ୍ଷମ କରିହେବ ନାହିଁ।"</string>
<string name="sim_pin_enable_failed" msgid="5156513975085380284">"PIN ସକ୍ଷମ କରିହେବ ନାହିଁ।"</string>
<string name="sim_enter_ok" msgid="3401715290135787531">"ଠିକ ଅଛି"</string>
- <string name="sim_enter_cancel" msgid="2001859323724961490">"ବାତିଲ୍ କରନ୍ତୁ"</string>
+ <string name="sim_enter_cancel" msgid="2001859323724961490">"ବାତିଲ କରନ୍ତୁ"</string>
<string name="sim_multi_sims_title" msgid="4875083890014013296">"ଏକାଧିକ ସିମ୍ ମିଳିଛି"</string>
<string name="sim_multi_sims_summary" msgid="1711012455679332238">"ମୋବାଇଲ୍ ଡାଟା ପାଇଁ ନିଜ ପସନ୍ଦର SIM ବାଛନ୍ତୁ।"</string>
<string name="sim_change_data_title" msgid="4663239438584588847">"ମୋବାଇଲ୍ ଡାଟା ପାଇଁ <xliff:g id="CARRIER">%1$s</xliff:g> ବ୍ୟବହାର କରିବେ?"</string>
@@ -1677,7 +1677,7 @@
<string name="storage_wizard_move_unlock" msgid="14651384927767749">"ଡାଟା ନେବାକୁ ଆପଣଙ୍କୁ ଉପଯୋଗକର୍ତ୍ତା <xliff:g id="APP">^1</xliff:g> ଅନଲକ୍ କରିବା ଆବଶ୍ୟକ।"</string>
<string name="storage_wizard_move_progress_title" msgid="3912406225614672391">"<xliff:g id="APP">^1</xliff:g> ଚଳାଉଛି…"</string>
<string name="storage_wizard_move_progress_body" msgid="2396714553394935094">"ଘୁଞ୍ଚାଇବାବେଳେ <xliff:g id="NAME">^1</xliff:g>କୁ କାଢ଼ନ୍ତୁ ନାହିଁ। \n\nଏହି ଡିଭାଇସ୍ରେ ଥିବା <xliff:g id="APP">^2</xliff:g> ଆପ୍, ଏହି କାର୍ଯ୍ୟ ନସରିବା ପର୍ଯ୍ୟନ୍ତ କାମ କରିବ ନାହିଁ।"</string>
- <string name="storage_wizard_move_progress_cancel" msgid="3494022998599718937">"ଘୁଞ୍ଚାଇବା କ୍ୟାନ୍ସଲ୍ କରନ୍ତୁ"</string>
+ <string name="storage_wizard_move_progress_cancel" msgid="3494022998599718937">"ଘୁଞ୍ଚାଇବା ବାତିଲ କରନ୍ତୁ"</string>
<string name="storage_wizard_slow_body" msgid="8293565076885232029">"ଏହି <xliff:g id="NAME_0">^1</xliff:g> ଧୀର ଥିବା ପରି ଜଣାପଡୁଛି। \n\nଆପଣ ଜାରିରଖିପାରିବେ, କିନ୍ତୁ ଏହି ଅବସ୍ଥାନକୁ ଚଳାଯାଇଥିବା ଆପ୍ଗୁଡ଼ିକ ରହି ରହି ଚାଲିପାରେ ଏବଂ ଡାଟା ସ୍ଥାନାନ୍ତର ବହୁତ ସମୟ ନେଇପାରେ। \n\nଉନ୍ନତ କାର୍ଯ୍ୟଦକ୍ଷତା ପାଇଁ ଏକ ଦ୍ରୁତତ୍ତମ <xliff:g id="NAME_1">^1</xliff:g> ପାଇଁ ବିବେଚନା କରନ୍ତୁ।"</string>
<string name="storage_wizard_init_v2_title" msgid="2538630338392381113">"ଆପଣ କିପରି ଏହି <xliff:g id="NAME">^1</xliff:g>କୁ ବ୍ୟବହାର କରିବେ?"</string>
<string name="storage_wizard_init_v2_internal_title" product="tablet" msgid="1884468440013151482">"ଅତିରିକ୍ତ ଟାବଲେଟ୍ ଷ୍ଟୋରେଜ୍ ପାଇଁ ବ୍ୟବହାର କରନ୍ତୁ"</string>
@@ -1747,7 +1747,7 @@
<string name="menu_delete" msgid="9199740901584348273">"APN ଡିଲିଟ୍ କରନ୍ତୁ"</string>
<string name="menu_new" msgid="6571230342655509006">"ନୂଆ APN"</string>
<string name="menu_save" msgid="6611465355127483100">"ସେଭ୍ କରନ୍ତୁ"</string>
- <string name="menu_cancel" msgid="1197826697950745335">"ବାତିଲ୍ କରନ୍ତୁ"</string>
+ <string name="menu_cancel" msgid="1197826697950745335">"ବାତିଲ କରନ୍ତୁ"</string>
<string name="error_title" msgid="7158648377702417716"></string>
<string name="error_name_empty" msgid="1258275899283079142">"ନାମ ସ୍ଥାନ ଶୂନ୍ୟ ରହିପାରିବ ନାହିଁ।"</string>
<string name="error_apn_empty" msgid="7657491065443746915">"APNକୁ ଖାଲି ରଖାଯାଇପାରିବ ନାହିଁ।"</string>
@@ -1764,7 +1764,7 @@
<string name="reset_network_desc" msgid="1112523764899788246">"ଏହା:\n\n"<li>"ୱାଇ-ଫାଇ"</li>\n<li>"ମୋବାଇଲ ଡାଟା"</li>\n<li>"ବ୍ଲୁଟୁଥ୍"</li>" ସମେତ ସମସ୍ତ ନେଟୱାର୍କ ସେଟିଂସକୁ ରିସେଟ କରିବ"</string>
<string name="erase_euicc_data_button" msgid="728078969563311737">"ଖାଲି କରନ୍ତୁ"</string>
<string name="reset_esim_title" msgid="6152167073280852849">"ଡାଉନଲୋଡ୍ ହୋଇଥିବା SIMକୁ ଖାଲି କରନ୍ତୁ"</string>
- <string name="reset_esim_desc" msgid="3662444090563399131">"ଏହା କୌଣସି ମୋବାଇଲ ସେବା ପ୍ଲାନକୁ ବାତିଲ୍ କରିବ ନାହିଁ। ରିପ୍ଲେସମେଣ୍ଟ SIMଗୁଡ଼ିକୁ ଡାଉନଲୋଡ କରିବା ପାଇଁ ଆପଣଙ୍କ କ୍ୟାରିଅର ସହ ଯୋଗାଯୋଗ କରନ୍ତୁ।"</string>
+ <string name="reset_esim_desc" msgid="3662444090563399131">"ଏହା କୌଣସି ମୋବାଇଲ ସେବା ପ୍ଲାନକୁ ବାତିଲ କରିବ ନାହିଁ। ରିପ୍ଲେସମେଣ୍ଟ SIMଗୁଡ଼ିକୁ ଡାଉନଲୋଡ କରିବା ପାଇଁ ଆପଣଙ୍କ କ୍ୟାରିଅର ସହ ଯୋଗାଯୋଗ କରନ୍ତୁ।"</string>
<string name="reset_network_button_text" msgid="2281476496459610071">"ସେଟିଂସ ରିସେଟ କରନ୍ତୁ"</string>
<string name="reset_network_final_desc" msgid="5304365082065278425">"ସମସ୍ତ ନେଟୱାର୍କ ସେଟିଂସ ରିସେଟ କରିବେ? ଏହାକୁ ଆପଣ ଆଉ ପୂର୍ବବତ୍ କରିପାରିବେ ନାହିଁ।"</string>
<string name="reset_network_final_desc_esim" msgid="8342882682282693844">"ସମସ୍ତ ନେଟୱାର୍କ ସେଟିଂସ ରିସେଟ ଏବଂ ଡାଉନଲୋଡ ହୋଇଥିବା SIMକୁ ଖାଲି କରିବେ କି? ଆପଣ ଏହି କାର୍ଯ୍ୟକୁ ପୂର୍ବବତ୍ କରିପାରିବେ ନାହିଁ।"</string>
@@ -1782,7 +1782,7 @@
<string name="main_clear_other_users_present" product="default" msgid="2672976674798019077">\n\n"ଏହି ଡିଭାଇସରେ ଅନ୍ୟ ଉପଯୋଗକର୍ତ୍ତା ଅଛନ୍ତି।\n"</string>
<string name="main_clear_desc_also_erases_external" msgid="3687911419628956693"><li>"ସଙ୍ଗୀତ"</li>\n<li>"ଫଟୋ"</li>\n<li>"ଅନ୍ୟ ଉପଯୋଗକର୍ତ୍ତା ଡାଟା"</li></string>
<string name="main_clear_desc_also_erases_esim" msgid="4553469876411831729"><li>"eSIMs"</li></string>
- <string name="main_clear_desc_no_cancel_mobile_plan" msgid="369883568059127035">\n\n"ଏହା ଆପଣଙ୍କ ମୋବାଇଲ ସେବା ପ୍ଲାନକୁ ବାତିଲ୍ କରିବ ନାହିଁ।"</string>
+ <string name="main_clear_desc_no_cancel_mobile_plan" msgid="369883568059127035">\n\n"ଏହା ଆପଣଙ୍କ ମୋବାଇଲ ସେବା ପ୍ଲାନକୁ ବାତିଲ କରିବ ନାହିଁ।"</string>
<string name="main_clear_desc_erase_external_storage" product="nosdcard" msgid="4441604184663452046">\n\n"ସଙ୍ଗୀତ, ଛବି ଓ ଅନ୍ୟ ଉପଯୋଗକର୍ତ୍ତା ଡାଟାକୁ ଖାଲି କରିବାକୁ "<b>"USB ଷ୍ଟୋରେଜ୍"</b>"କୁ ଖାଲି କରିବା ଆବଶ୍ୟକ।"</string>
<string name="main_clear_desc_erase_external_storage" product="default" msgid="1498514970618215728">\n\n"ସଙ୍ଗୀତ, ଛବି ଓ ଅନ୍ୟ ଉପଯୋଗକର୍ତ୍ତା ଡାଟାକୁ ଖାଲି କରିବାକୁ "<b>"SD କାର୍ଡ"</b>"କୁ ଖାଲି କରିବା ଆବଶ୍ୟକ।"</string>
<string name="erase_external_storage" product="nosdcard" msgid="2182181846128639635">"USB ଷ୍ଟୋରେଜ୍କୁ ଲିଭାନ୍ତୁ"</string>
@@ -1892,7 +1892,7 @@
<string name="location_time_zone_detection_location_is_off_dialog_title" msgid="231698690198001146">"ଡିଭାଇସର ଲୋକେସନ୍ ଆବଶ୍ୟକ"</string>
<string name="location_time_zone_detection_location_is_off_dialog_message" msgid="5846316326139169523">"ଆପଣଙ୍କ ଲୋକେସନ ବ୍ୟବହାର କରି ଟାଇମ ଜୋନ ସେଟ କରିବାକୁ ଲୋକେସନ ଚାଲୁ କରନ୍ତୁ, ତା\'ପରେ ଟାଇମ ଜୋନ ସେଟିଂସ ଅପଡେଟ କରନ୍ତୁ"</string>
<string name="location_time_zone_detection_location_is_off_dialog_ok_button" msgid="2685647335717750297">"ଲୋକେସନ ସେଟିଂସ"</string>
- <string name="location_time_zone_detection_location_is_off_dialog_cancel_button" msgid="3968729678789071154">"ବାତିଲ୍ କରନ୍ତୁ"</string>
+ <string name="location_time_zone_detection_location_is_off_dialog_cancel_button" msgid="3968729678789071154">"ବାତିଲ କରନ୍ତୁ"</string>
<string name="location_time_zone_detection_auto_is_off" msgid="6264253990141650280">"ସ୍ୱଚାଳିତ ଟାଇମ୍ ଜୋନ୍ ବନ୍ଦ ଅଛି"</string>
<string name="location_time_zone_detection_not_applicable" msgid="6757964612836952714">"ଲୋକେସନ୍ ଟାଇମ୍ ଜୋନ୍ ଚିହ୍ନଟକରଣ ଅକ୍ଷମ କରାଯାଇଛି"</string>
<string name="location_time_zone_detection_not_supported" msgid="3251181656388306501">"ଲୋକେସନ୍ ଟାଇମ୍ ଜୋନ୍ ଚିହ୍ନଟକରଣ ସମର୍ଥିତ ନୁହେଁ"</string>
@@ -2265,7 +2265,7 @@
<string name="input_method" msgid="2982805181425436775">"ଇନ୍ପୁଟ୍ ପଦ୍ଧତି"</string>
<string name="current_input_method" msgid="3471068842881330883">"ବର୍ତ୍ତମାନର କୀବୋର୍ଡ"</string>
<string name="input_method_selector" msgid="8463209725824763600">"ଇନପୁଟ୍ ପଦ୍ଧତି ଚୟନକାରୀ"</string>
- <string name="input_method_selector_show_automatically_title" msgid="6483428482089875034">"ଅଟୋମେଟିକ୍"</string>
+ <string name="input_method_selector_show_automatically_title" msgid="6483428482089875034">"ଅଟୋମେଟିକ"</string>
<string name="input_method_selector_always_show_title" msgid="2479533500357556146">"ସର୍ବଦା ଦେଖାନ୍ତୁ"</string>
<string name="input_method_selector_always_hide_title" msgid="807424180027384849">"ସର୍ବଦା ଲୁଚାଇ ରଖ"</string>
<string name="configure_input_method" msgid="8831343065130376880">"ସେଟ୍ ଅପ୍ ଇନ୍ପୁଟ୍ ପଦ୍ଧତି"</string>
@@ -2335,7 +2335,7 @@
<string name="accessibility_magnification_triple_tap_warning_title" msgid="8484669851397296597">"ଏହା ଆପଣଙ୍କ କୀବୋର୍ଡକୁ ଧୀର କରିପାରେ"</string>
<string name="accessibility_magnification_triple_tap_warning_message" msgid="2008671502848936410">"ଆପଣଙ୍କ ସ୍କ୍ରିନର ଅଂଶକୁ ମ୍ୟାଗ୍ନିଫାଏ କରିବା ପାଇଁ ତିନିଥର-ଟାପ ବିକଳ୍ପକୁ ବ୍ୟବହାର କରିବା ସମୟରେ, ଆପଣ କୀବୋର୍ଡରେ ସମସ୍ୟାଗୁଡ଼ିକୁ ନୋଟିସ କରିପାରନ୍ତି।\n\nଏହାକୁ ଏଡ଼ାଇବା ପାଇଁ, ଆପଣ ଆପଣଙ୍କ ମ୍ୟାଗ୍ନିଫିକେସନ ସର୍ଟକଟକୁ ତିନିଥର-ଟାପରୁ ଅନ୍ୟ ଏକ ବିକଳ୍ପକୁ ପରିବର୍ତ୍ତନ କରିପାରିବେ।\n"<annotation id="link">"ସେଟିଂ ପରିବର୍ତ୍ତନ କରନ୍ତୁ"</annotation></string>
<string name="accessibility_magnification_triple_tap_warning_positive_button" msgid="8712304035901450010">"ଯେ କୌଣସି ମତେ ଜାରି ରଖନ୍ତୁ"</string>
- <string name="accessibility_magnification_triple_tap_warning_negative_button" msgid="2028849736366584733">"ବାତିଲ୍ କର"</string>
+ <string name="accessibility_magnification_triple_tap_warning_negative_button" msgid="2028849736366584733">"ବାତିଲ କର"</string>
<string name="accessibility_magnification_service_settings_title" msgid="3531350704632316017">"ମାଗ୍ନିଫିକେସନ ସେଟିଂସ"</string>
<string name="accessibility_screen_magnification_gestures_title" msgid="3121714118381882167">"ଟ୍ରିପଲ୍-ଟାପ୍ ଦ୍ୱାରା ମାଗ୍ନିଫାଏ କରନ୍ତୁ"</string>
<string name="accessibility_screen_magnification_navbar_title" msgid="480853328665484528">"ସର୍ଟକଟ୍ ସାହାଯ୍ୟରେ ମାଗ୍ନିଫାଏ କରନ୍ତୁ"</string>
@@ -2622,7 +2622,7 @@
<string name="accessibility_dialog_button_allow" msgid="8274918676473216697">"ଅନୁମତି"</string>
<string name="accessibility_dialog_button_deny" msgid="2037249860078259284">"ଅଗ୍ରାହ୍ୟ"</string>
<string name="accessibility_dialog_button_stop" msgid="7295448112784528196">"ବନ୍ଦ କରନ୍ତୁ"</string>
- <string name="accessibility_dialog_button_cancel" msgid="4813234247237851121">"ବାତିଲ୍"</string>
+ <string name="accessibility_dialog_button_cancel" msgid="4813234247237851121">"ବାତିଲ"</string>
<string name="disable_service_title" msgid="2909108731776956167">"<xliff:g id="SERVICE">%1$s</xliff:g>କୁ ବନ୍ଦ କରିବେ?"</string>
<string name="disable_service_message" msgid="4814173941688548016">"<xliff:g id="STOP">%1$s</xliff:g>କୁ ଟାପ୍ କରିବା ଦ୍ୱାରା <xliff:g id="SERVICE">%2$s</xliff:g> ବନ୍ଦ ହୋଇଯିବ।"</string>
<string name="accessibility_no_services_installed" msgid="3725569493860028593">"କୌଣସି ସେବା ସଂସ୍ଥାପିତ ହୋଇନାହିଁ"</string>
@@ -2673,7 +2673,7 @@
<string name="print_print_jobs" msgid="2605944855933091183">"ପ୍ରିଣ୍ଟ ଜବ୍"</string>
<string name="print_print_job" msgid="8477859161886726608">"ପ୍ରିଣ୍ଟ ଜବ୍"</string>
<string name="print_restart" msgid="4424096106141083945">"ରିଷ୍ଟାର୍ଟ କରନ୍ତୁ"</string>
- <string name="print_cancel" msgid="7611266511967568501">"ବାତିଲ୍"</string>
+ <string name="print_cancel" msgid="7611266511967568501">"ବାତିଲ"</string>
<string name="print_job_summary" msgid="277210060872032969">"<xliff:g id="PRINTER">%1$s</xliff:g>\n<xliff:g id="TIME">%2$s</xliff:g>"</string>
<string name="print_configuring_state_title_template" msgid="2887013172492183045">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> କନଫିଗର୍ କରାଯାଉଛି"</string>
<string name="print_printing_state_title_template" msgid="7367513245156603431">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> ପ୍ରିଣ୍ଟ ହେଉଛି"</string>
@@ -2786,7 +2786,7 @@
<string name="battery_tip_unrestrict_app_dialog_title" msgid="5501997201160532301">"ପ୍ରତିବନ୍ଧକ ହଟାଇ ଦେବେ?"</string>
<string name="battery_tip_unrestrict_app_dialog_message" msgid="215449637818582819">"ଏହି ଆପ୍ ବ୍ୟାକ୍ଗ୍ରାଉଣ୍ଡରେ ବ୍ୟାଟେରୀ ବ୍ୟବହାର କରିପାରିବ। ଆପଣଙ୍କ ବ୍ୟାଟେରୀ ଅନୁମାନ କରିଥିବା ସମୟର ପୂର୍ବରୁ ହିଁ ସରିଯାଇପାରେ।"</string>
<string name="battery_tip_unrestrict_app_dialog_ok" msgid="7940183167721998470">"କାଢ଼ିଦିଅନ୍ତୁ"</string>
- <string name="battery_tip_unrestrict_app_dialog_cancel" msgid="4968135709160207507">"ବାତିଲ୍"</string>
+ <string name="battery_tip_unrestrict_app_dialog_cancel" msgid="4968135709160207507">"ବାତିଲ"</string>
<string name="battery_tip_dialog_summary_message" product="default" msgid="6097167058237891756">"ଆପଣଙ୍କର ଆପ୍ସ ସାଧାରଣ ଭାବେ ବ୍ୟାଟେରୀ ଖର୍ଚ୍ଚ କରୁଛି। ଯଦି ଆପ୍ସ ଅଧିକ ବ୍ୟାଟେରୀ ଖର୍ଚ୍ଚ କରେ, ତେବେ ଆପଣଙ୍କ ଫୋନ୍ ପଦକ୍ଷେପ ନେବା ପାଇଁ ଆପଣଙ୍କୁ ପରାମର୍ଶ ଦେବ। \n\n ବ୍ୟାଟେରୀ ଅଧିକ ଖର୍ଚ୍ଚ ହେଉଥିଲେ ଆପଣ ସର୍ବଦା ବ୍ୟାଟେରୀ ସେଭର୍କୁ ଚାଲୁ କରିପାରିବେ।"</string>
<string name="battery_tip_dialog_summary_message" product="tablet" msgid="573297655597451123">"ଆପଣଙ୍କର ଆପଗୁଡ଼ିକ ସାଧାରଣ ଭାବେ ବ୍ୟାଟେରୀ ଖର୍ଚ୍ଚ କରୁଛନ୍ତି। ଯଦି ଆପଗୁଡ଼ିକ ଅଧିକ ବ୍ୟାଟେରୀ ଖର୍ଚ୍ଚ କରନ୍ତି, ତେବେ ଆପଣଙ୍କ ଟାବଲେଟ୍ ପଦକ୍ଷେପ ନେବା ପାଇଁ ଆପଣଙ୍କୁ ପରାମର୍ଶ ଦେବ। \n\n ବ୍ୟାଟେରୀ ଅଧିକ ଖର୍ଚ୍ଚ ହେଉଥିଲେ ଆପଣ ସର୍ବଦା ବ୍ୟାଟେରୀ ସେଭର୍କୁ ଚାଲୁ କରିପାରିବେ।"</string>
<string name="battery_tip_dialog_summary_message" product="device" msgid="8222461068860745749">"ଆପଣଙ୍କର ଆପ୍ ସାଧାରଣ ଭାବେ ବ୍ୟାଟେରୀ ଖର୍ଚ୍ଚ କରୁଛି। ଯଦି ଆପ୍ ଅଧିକ ବ୍ୟାଟେରୀ ଖର୍ଚ୍ଚ କରନ୍ତି, ତେବେ ଡିଭାଇସ୍ ପଦକ୍ଷେପ ନେବା ପାଇଁ ଆପଣଙ୍କୁ ପରାମର୍ଶ ଦେବ। \n\n ବ୍ୟାଟେରୀ ଅଧିକ ଖର୍ଚ୍ଚ ହେଉଥିଲେ ଆପଣ ସର୍ବଦା ବ୍ୟାଟେରୀ ସେଭର୍କୁ ଚାଲୁ କରିପାରିବେ।"</string>
@@ -2924,6 +2924,8 @@
<string name="battery_not_usage" msgid="1472275761547230196">"ଗତଥର ସମ୍ପୂର୍ଣ୍ଣ ଚାର୍ଜ ହେବା ପରଠାରୁ ବ୍ୟବହାର କରାଯାଇନାହିଁ"</string>
<string name="battery_not_usage_24hr" msgid="8397519536160741248">"ଗତ 24 ଘଣ୍ଟାରେ ବ୍ୟବହାର କରାଯାଇନାହିଁ"</string>
<string name="battery_usage_without_time" msgid="1346894834339420538"></string>
+ <!-- no translation found for battery_usage_other_users (9002643295562500693) -->
+ <skip />
<string name="advanced_battery_graph_subtext" msgid="6816737986172678550">"ଆପଣଙ୍କ ଡିଭାଇସ୍ର ବ୍ୟବହାରକୁ ନେଇ ବଳକା ଥିବା ବ୍ୟାଟେରୀର ଅନୁମାନ କରାଯାଇଥାଏ"</string>
<string name="estimated_time_left" msgid="948717045180211777">"ଆନୁମାନିକ ବଳକା ସମୟ"</string>
<string name="estimated_charging_time_left" msgid="2287135413363961246">"ପୂର୍ଣ୍ଣ ଚାର୍ଜ ହେବା ପାଇଁ"</string>
@@ -3025,7 +3027,7 @@
<string name="tts_install_voices_title" msgid="6505257816336165782">"Voices ଇନ୍ଷ୍ଟଲ୍ କରନ୍ତୁ"</string>
<string name="tts_install_voices_text" msgid="902408506519246362">"ଭଏସ୍ ଇନ୍ଷ୍ଟଲ୍ କରିବାକୁ <xliff:g id="TTS_APP_NAME">%s</xliff:g> ଆପ୍ ଜାରି ରଖନ୍ତୁ"</string>
<string name="tts_install_voices_open" msgid="919034855418197668">"ଆପ୍ ଖୋଲନ୍ତୁ"</string>
- <string name="tts_install_voices_cancel" msgid="5179154684379560628">"ବାତିଲ୍"</string>
+ <string name="tts_install_voices_cancel" msgid="5179154684379560628">"ବାତିଲ"</string>
<string name="tts_reset" msgid="9047681050813970031">"ରିସେଟ୍ କରନ୍ତୁ"</string>
<string name="tts_play" msgid="2945513377250757221">"ଚଲାନ୍ତୁ"</string>
<string name="vpn_settings_title" msgid="9131315656202257272">"VPN"</string>
@@ -3155,7 +3157,7 @@
<string name="settings_backup" msgid="5357973563989458049">"ବ୍ୟାକଅପ ସେଟିଂସ"</string>
<string name="settings_backup_summary" msgid="6803046376335724034">"ମୋ ସେଟିଂସର ବ୍ୟାକଅପ ନିଅ"</string>
<string name="sync_menu_sync_now" msgid="3948443642329221882">"ବର୍ତ୍ତମାନ ସିଙ୍କ କରନ୍ତୁ"</string>
- <string name="sync_menu_sync_cancel" msgid="2422994461106269813">"ସିଙ୍କ୍ ବାତିଲ୍ କରନ୍ତୁ"</string>
+ <string name="sync_menu_sync_cancel" msgid="2422994461106269813">"ସିଙ୍କ୍ ବାତିଲ କରନ୍ତୁ"</string>
<string name="sync_one_time_sync" msgid="8114337154112057462">"<xliff:g id="LAST_SYNC_TIME">
%1$s</xliff:g> ବର୍ତ୍ତମାନ ସିଙ୍କ କରିବାକୁ ଟାପ୍ କରନ୍ତୁ"</string>
<string name="sync_gmail" msgid="228561698646018808">"Gmail"</string>
@@ -3264,7 +3266,7 @@
<string name="data_usage_metered_mobile" msgid="3514227339274396401">"ମୋବାଇଲ୍ ନେଟୱର୍କ"</string>
<string name="data_usage_metered_wifi" msgid="4807465959110473407">"Wi‑Fi ନେଟୱର୍କର ତାଲିକା"</string>
<string name="data_usage_metered_wifi_disabled" msgid="4664158157415362613">"ମିଟରଯୁକ୍ତ ନେଟ୍ୱର୍କଗୁଡିକର ଚୟନ କରିବାକୁ, ୱାଇ-ଫାଇ ଅନ୍ କରନ୍ତୁ।"</string>
- <string name="data_usage_metered_auto" msgid="1560514082131687116">"ସ୍ଵତଃଚାଳିତ"</string>
+ <string name="data_usage_metered_auto" msgid="1560514082131687116">"ଅଟୋମେଟିକ"</string>
<string name="wifi_metered_title" msgid="6623732965268033931">"ନେଟ୍ୱାର୍କର ବ୍ୟବହାର"</string>
<string name="data_usage_metered_yes" msgid="4262598072030135223">"ମିଟର୍ଡ"</string>
<string name="data_usage_metered_no" msgid="1685828958417926268">"ମପାଯାଉନାହିଁ"</string>
@@ -3294,7 +3296,7 @@
<string name="vpn_always_on_invalid_reason_no_dns" msgid="3980357762395272467">"ସର୍ବଦା-ଅନ୍ VPN ପାଇଁ ଏକ DNS ସର୍ଭର ଉଲ୍ଲେଖ କରିବା ଜରୁରୀ"</string>
<string name="vpn_always_on_invalid_reason_dns" msgid="3934369594591801587">"ସର୍ବଦା ଚାଲୁଥିବା VPN ପାଇଁ DNS ସର୍ଭର୍ ଠିକଣା ସଂଖ୍ୟା ବିଶିଷ୍ଟ ହୋଇଥିବା ଦରକାର"</string>
<string name="vpn_always_on_invalid_reason_other" msgid="4571905303713233321">"ଏଣ୍ଟର୍ କରାଯାଇଥିବା ସୂଚନା ସର୍ବଦା-ଅନ୍ VPNକୁ ସପୋର୍ଟ କରେ ନାହିଁ"</string>
- <string name="vpn_cancel" msgid="5929410618112404383">"ବାତିଲ୍ କରନ୍ତୁ"</string>
+ <string name="vpn_cancel" msgid="5929410618112404383">"ବାତିଲ କରନ୍ତୁ"</string>
<string name="vpn_done" msgid="5137858784289564985">"ଖାରଜ"</string>
<string name="vpn_save" msgid="683868204634860888">"ସେଭ୍ କରନ୍ତୁ"</string>
<string name="vpn_connect" msgid="7102335248484045354">"ସଂଯୋଗ କରନ୍ତୁ"</string>
@@ -3896,7 +3898,7 @@
<string name="bubbles_feature_disabled_dialog_title" msgid="1794193899792284007">"ଡିଭାଇସ୍ ପାଇଁ ବବଲ୍ ଚାଲୁ କରିବେ?"</string>
<string name="bubbles_feature_disabled_dialog_text" msgid="5275666953364031055">"ଏହି ଆପ୍ ପାଇଁ ବବଲ୍ ଚାଲୁ କଲେ ଆପଣଙ୍କ ଡିଭାଇସ୍ ପାଇଁ ମଧ୍ୟ ବବଲଗୁଡ଼ିକ ଚାଲୁ ହୋଇଯିବ।\n\n ଏହା ବବଲକୁ ଅନୁମତି ଦେଇ ଥିବା ଅନ୍ୟ ଆପ୍ କିମ୍ବା ବାର୍ତ୍ତାଳାପଗୁଡ଼ିକୁ ପ୍ରଭାବିତ କରେ।"</string>
<string name="bubbles_feature_disabled_button_approve" msgid="2042628067101419871">"ଚାଲୁ କରନ୍ତୁ"</string>
- <string name="bubbles_feature_disabled_button_cancel" msgid="8963409459448350600">"ବାତିଲ୍ କରନ୍ତୁ"</string>
+ <string name="bubbles_feature_disabled_button_cancel" msgid="8963409459448350600">"ବାତିଲ କରନ୍ତୁ"</string>
<string name="notifications_bubble_setting_on_summary" msgid="4641572377430901196">"ଚାଲୁ ଅଛି / ବାର୍ତ୍ତାଳାପଗୁଡ଼ିକ ଫ୍ଲୋଟିଂ ଆଇକନଗୁଡ଼ିକ ଭାବେ ଦେଖାଯାଇପାରିବ"</string>
<string name="notifications_bubble_setting_title" msgid="8287649393774855268">"ବବଲଗୁଡ଼ିକ ଦେଖାଇବାକୁ ଆପଗୁଡ଼ିକୁ ଅନୁମତି ଦିଅନ୍ତୁ"</string>
<string name="notifications_bubble_setting_description" msgid="7336770088735025981">"ଅନ୍ୟ ଆପଗୁଡ଼ିକର ଶୀର୍ଷରେ କିଛି ବାର୍ତ୍ତାଳାପ ଫ୍ଲୋଟିଂ ଆଇକନ୍ ପରି ଦେଖାଯିବ"</string>
@@ -4039,7 +4041,7 @@
<string name="nls_feature_settings_summary" msgid="3770028705648985689">"ଏହା \"ବିରକ୍ତ କରନ୍ତୁ ନାହିଁ\"କୁ ଚାଲୁ କିମ୍ବା ବନ୍ଦ କରିପାରିବ ଏବଂ ସମ୍ବନ୍ଧିତ ସେଟିଂସକୁ ପରିବର୍ତ୍ତନ କରିପାରିବ।"</string>
<string name="notification_listener_disable_warning_summary" msgid="8373396293802088961">"<xliff:g id="NOTIFICATION_LISTENER_NAME">%1$s</xliff:g> ପାଇଁ ଯଦି ଆପଣ ବିଜ୍ଞପ୍ତି ଆକ୍ସେସ୍କୁ ବନ୍ଦ କରୁଛନ୍ତି, ତେବେ \"ବିରକ୍ତ କରନ୍ତୁ ନାହିଁ\" ବିକଳ୍ପ ଆକ୍ସେସ୍ ମଧ୍ୟ ବନ୍ଦ ହୋଇଯାଇପାରେ।"</string>
<string name="notification_listener_disable_warning_confirm" msgid="841492108402184976">"ବନ୍ଦ କରନ୍ତୁ"</string>
- <string name="notification_listener_disable_warning_cancel" msgid="8802784105045594324">"ବାତିଲ୍"</string>
+ <string name="notification_listener_disable_warning_cancel" msgid="8802784105045594324">"ବାତିଲ"</string>
<string name="notification_listener_type_title" msgid="2791552789364336733">"ଅନୁମତି ଦିଆଯାଇଥିବା ବିଜ୍ଞପ୍ତିର ପ୍ରକାର"</string>
<string name="notif_type_ongoing" msgid="135675014223627555">"ରିଅଲ୍-ଟାଇମ୍"</string>
<string name="notif_type_ongoing_summary" msgid="2348867528527573574">"ବ୍ୟବହାରରେ ଥିବା ଆପ୍, ନାଭିଗେସନ୍, ଫୋନ୍ କଲ୍ ଏବଂ ଆହୁରି ଅନେକ କିଛିରୁ ଚାଲୁଥିବା କମ୍ୟୁନିକେସନ୍"</string>
@@ -4366,7 +4368,7 @@
<string name="app_launch_dialog_ok" msgid="1446157681861409861">"ଠିକ୍ ଅଛି"</string>
<string name="app_launch_verified_links_info_description" msgid="7514750232467132117">"ଯାଞ୍ଚ କରାଯାଇଥିବା ଲିଙ୍କଗୁଡ଼ିକର ତାଲିକା ଦେଖାନ୍ତୁ"</string>
<string name="app_launch_checking_links_title" msgid="6119228853554114201">"ଅନ୍ୟ ସମର୍ଥିତ ଲିଙ୍କଗୁଡ଼ିକ ପାଇଁ ଯାଞ୍ଚ କରାଯାଉଛି…"</string>
- <string name="app_launch_dialog_cancel" msgid="6961071841814898663">"ବାତିଲ୍ କରନ୍ତୁ"</string>
+ <string name="app_launch_dialog_cancel" msgid="6961071841814898663">"ବାତିଲ କରନ୍ତୁ"</string>
<plurals name="app_launch_supported_links_title" formatted="false" msgid="8579323750839397568">
<item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>ଟି ସମର୍ଥିତ ଲିଙ୍କ୍</item>
<item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>ଟି ସମର୍ଥିତ ଲିଙ୍କ୍</item>
@@ -4907,7 +4909,7 @@
<string name="automatic_storage_manager_days_title" msgid="5077286114860539367">"ଫୋଟୋ ଓ ଭିଡିଓଗୁଡ଼ିକ କାଢ଼ିଦିଅନ୍ତୁ"</string>
<string name="automatic_storage_manager_preference_title" msgid="3483357910142595444">"ଷ୍ଟୋରେଜ୍ ମ୍ୟାନେଜର୍"</string>
<string name="automatic_storage_manager_primary_switch_title" msgid="9131959126462101994">"ଷ୍ଟୋରେଜ୍ ମ୍ୟାନେଜର୍ ବ୍ୟବହାର କରନ୍ତୁ"</string>
- <string name="deletion_helper_automatic_title" msgid="597196990024769472">"ଅଟୋମେଟିକ୍"</string>
+ <string name="deletion_helper_automatic_title" msgid="597196990024769472">"ଅଟୋମେଟିକ"</string>
<string name="deletion_helper_manual_title" msgid="1068812971600327101">"ମାନୁଆଲ୍"</string>
<string name="deletion_helper_preference_title" msgid="6364023246849161274">"ବର୍ତ୍ତମାନ ସ୍ପେସ୍ ଖାଲି କରନ୍ତୁ"</string>
<string name="gesture_preference_title" msgid="8291899281322647187">"ଜେଶ୍ଚର୍"</string>
@@ -5351,7 +5353,7 @@
<string name="mobile_network_disable_sim_explanation" msgid="2851862257846773796">"ଏହି SIMକୁ ଅକ୍ଷମ କରିବା ପାଇଁ SIM କାର୍ଡକୁ କାଢ଼ି ଦିଅନ୍ତୁ"</string>
<string name="mobile_network_tap_to_activate" msgid="4139979375717958102">"<xliff:g id="CARRIER">%1$s</xliff:g>କୁ ସକ୍ରିୟ କରିବା ପାଇଁ ଟାପ୍ କରନ୍ତୁ"</string>
<string name="mobile_network_esim_swap_confirm_title" msgid="2762744961192218789">"<xliff:g id="CARRIER">%1$s</xliff:g>ରେ ସ୍ବିଚ୍ କରିବେ କି?"</string>
- <string name="mobile_network_esim_swap_confirm_body" msgid="8168680839542031781">"ଏକ ସମୟରେ କେବଳ ଗୋଟିଏ ଡାଉନଲୋଡ୍ ହୋଇଥିବା SIM ସକ୍ରିୟ ହୋଇପାରିବ।\n\n <xliff:g id="CARRIER1">%1$s</xliff:g>କୁ ସ୍ୱିଚ୍ କରିବା ଦ୍ୱାରା ଆପଣଙ୍କର <xliff:g id="CARRIER2">%2$s</xliff:g> ସେବା ବାତିଲ୍ ହୋବ ନାହିଁ।"</string>
+ <string name="mobile_network_esim_swap_confirm_body" msgid="8168680839542031781">"ଏକ ସମୟରେ କେବଳ ଗୋଟିଏ ଡାଉନଲୋଡ ହୋଇଥିବା SIM ସକ୍ରିୟ ହୋଇପାରିବ।\n\n <xliff:g id="CARRIER1">%1$s</xliff:g>କୁ ସ୍ୱିଚ୍ କରିବା ଦ୍ୱାରା ଆପଣଙ୍କର <xliff:g id="CARRIER2">%2$s</xliff:g> ସେବା ବାତିଲ ହୋବ ନାହିଁ।"</string>
<string name="mobile_network_esim_swap_confirm_ok" msgid="8695772737522378095">"<xliff:g id="CARRIER">%1$s</xliff:g>କୁ ଯାଆନ୍ତୁ"</string>
<string name="mobile_network_erase_sim" msgid="4629071168032714930">"SIM ଖାଲି କରନ୍ତୁ"</string>
<string name="mobile_network_erase_sim_error_dialog_title" msgid="6680959559589234726">"SIMକୁ ଖାଲି କରିହେବ ନାହିଁ"</string>
@@ -5385,13 +5387,13 @@
<string name="sim_action_switch_sub_dialog_title" msgid="9180969453358718635">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>କୁ ସ୍ୱିଚ୍ କରିବେ?"</string>
<string name="sim_action_switch_psim_dialog_title" msgid="5613177333235213024">"SIM କାର୍ଡ ବ୍ୟବହାର କରିବାକୁ ସ୍ୱିଚ୍ କରିବେ?"</string>
<string name="sim_action_switch_sub_dialog_mep_title" msgid="933856847099933004">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g> ବ୍ୟବହାର କରିବେ?"</string>
- <string name="sim_action_switch_sub_dialog_text" msgid="2091834911153293004">"ଥରକେ କେବଳ ଗୋଟିଏ SIMକୁ ସକ୍ରିୟ କରାଯାଇପାରିବ।\n\n<xliff:g id="TO_CARRIER_NAME">%1$s</xliff:g>କୁ ସ୍ୱିଚ୍ କରିବା ଦ୍ୱାରା ଆପଣଙ୍କର <xliff:g id="FROM_CARRIER_NAME">%2$s</xliff:g> ସେବା ବାତିଲ୍ ହେବ ନାହିଁ।"</string>
- <string name="sim_action_switch_sub_dialog_text_downloaded" msgid="1396320209544698027">"ଥରକେ କେବଳ ଗୋଟିଏ ଡାଉନଲୋଡ୍ କରାଯାଇଥିବା SIMକୁ ସକ୍ରିୟ କରାଯାଇପାରିବ।\n\n <xliff:g id="TO_CARRIER_NAME">%1$s</xliff:g>କୁ ସ୍ୱିଚ୍ କରିବା ଦ୍ୱାରା ଆପଣଙ୍କର <xliff:g id="FROM_CARRIER_NAME">%2$s</xliff:g> ସେବା ବାତିଲ୍ ହେବ ନାହିଁ।"</string>
- <string name="sim_action_switch_sub_dialog_text_single_sim" msgid="6188750682431170845">"ଥରକେ କେବଳ ଗୋଟିଏ SIMକୁ ସକ୍ରିୟ କରାଯାଇପାରିବ।\n\nସ୍ୱିଚ୍ କରିବା ଦ୍ୱାରା ଆପଣଙ୍କର <xliff:g id="TO_CARRIER_NAME">%1$s</xliff:g> ସେବା ବାତିଲ୍ ହେବ ନାହିଁ।"</string>
+ <string name="sim_action_switch_sub_dialog_text" msgid="2091834911153293004">"ଥରକେ କେବଳ ଗୋଟିଏ SIMକୁ ସକ୍ରିୟ କରାଯାଇପାରିବ।\n\n<xliff:g id="TO_CARRIER_NAME">%1$s</xliff:g>କୁ ସ୍ୱିଚ୍ କରିବା ଦ୍ୱାରା ଆପଣଙ୍କର <xliff:g id="FROM_CARRIER_NAME">%2$s</xliff:g> ସେବା ବାତିଲ ହେବ ନାହିଁ।"</string>
+ <string name="sim_action_switch_sub_dialog_text_downloaded" msgid="1396320209544698027">"ଥରକେ କେବଳ ଗୋଟିଏ ଡାଉନଲୋଡ କରାଯାଇଥିବା SIMକୁ ସକ୍ରିୟ କରାଯାଇପାରିବ।\n\n <xliff:g id="TO_CARRIER_NAME">%1$s</xliff:g>କୁ ସ୍ୱିଚ୍ କରିବା ଦ୍ୱାରା ଆପଣଙ୍କର <xliff:g id="FROM_CARRIER_NAME">%2$s</xliff:g> ସେବା ବାତିଲ ହେବ ନାହିଁ।"</string>
+ <string name="sim_action_switch_sub_dialog_text_single_sim" msgid="6188750682431170845">"ଥରକେ କେବଳ ଗୋଟିଏ SIMକୁ ସକ୍ରିୟ କରାଯାଇପାରିବ।\n\nସ୍ୱିଚ୍ କରିବା ଦ୍ୱାରା ଆପଣଙ୍କର <xliff:g id="TO_CARRIER_NAME">%1$s</xliff:g> ସେବା ବାତିଲ ହେବ ନାହିଁ।"</string>
<string name="sim_action_switch_sub_dialog_mep_text" msgid="8348764755143679582">"ଆପଣ ଥରକେ 2ଟି SIM ବ୍ୟବହାର କରିପାରିବେ। <xliff:g id="CARRIER_NAME">%1$s</xliff:g> ବ୍ୟବହାର କରିବା ପାଇଁ, ଅନ୍ୟ ଏକ SIM ବନ୍ଦ କରନ୍ତୁ।"</string>
<string name="sim_action_switch_sub_dialog_confirm" msgid="1901181581944638961">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>କୁ ସ୍ୱିଚ୍ କରନ୍ତୁ"</string>
<string name="sim_action_switch_sub_dialog_carrier_list_item_for_turning_off" msgid="5392037608705799522">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g> ବନ୍ଦ କରନ୍ତୁ"</string>
- <string name="sim_action_switch_sub_dialog_info_outline_for_turning_off" msgid="1617619100229136888">"ଏକ SIMକୁ ବନ୍ଦ କରିବା ଫଳରେ ଆପଣଙ୍କ ସେବା ବାତିଲ୍ ହେବ ନାହିଁ"</string>
+ <string name="sim_action_switch_sub_dialog_info_outline_for_turning_off" msgid="1617619100229136888">"ଏକ SIMକୁ ବନ୍ଦ କରିବା ଫଳରେ ଆପଣଙ୍କ ସେବା ବାତିଲ ହେବ ନାହିଁ"</string>
<string name="sim_action_enabling_sim_without_carrier_name" msgid="2706862823501979981">"ନେଟୱାର୍କ ସହ ସଂଯୋଗ କରାଯାଉଛି…"</string>
<string name="sim_action_switch_sub_dialog_progress" msgid="4718412054243793310">"କଲ ଏବଂ ମେସେଜଗୁଡ଼ିକ ପାଇଁ <xliff:g id="CARRIER_NAME">%1$s</xliff:g>କୁ ସ୍ୱିଚ କରାଯାଉଛି…"</string>
<string name="sim_action_enable_sim_fail_title" msgid="1765646238941015899">"କ୍ୟାରିଅରକୁ ସ୍ୱିଚ୍ କରାଯାଇପାରିବ ନାହିଁ"</string>
@@ -5409,7 +5411,7 @@
<string name="sim_action_yes" msgid="8076556020131395515">"ହଁ"</string>
<string name="sim_action_reboot" msgid="3508948833333441538">"ରିଷ୍ଟାର୍ଟ କରନ୍ତୁ"</string>
<string name="sim_action_no_thanks" msgid="435717748384544195">"ନା, ଧନ୍ୟବାଦ"</string>
- <string name="sim_action_cancel" msgid="2668099867029610910">"ବାତିଲ୍ କରନ୍ତୁ"</string>
+ <string name="sim_action_cancel" msgid="2668099867029610910">"ବାତିଲ କରନ୍ତୁ"</string>
<string name="sim_switch_button" msgid="1405772571706095387">"ସ୍ୱିଚ୍ କରନ୍ତୁ"</string>
<string name="dsds_activation_failure_title" msgid="4467364110584914794">"SIMକୁ ସକ୍ରିୟ କରାଯାଇପାରିବ ନାହିଁ"</string>
<string name="dsds_activation_failure_body_msg1" msgid="6303921196869256391">"SIMକୁ କାଢ଼ି ପୁଣି ଭର୍ତ୍ତି କରନ୍ତୁ। ଯଦି ସମସ୍ୟା ଜାରି ରହେ, ତେବେ ଆପଣଙ୍କ ଡିଭାଇସକୁ ରିଷ୍ଟାର୍ଟ କରନ୍ତୁ।"</string>
diff --git a/res/values-pa/strings.xml b/res/values-pa/strings.xml
index 40281df..d521648 100644
--- a/res/values-pa/strings.xml
+++ b/res/values-pa/strings.xml
@@ -2807,8 +2807,8 @@
<string name="battery_manager_summary_unsupported" msgid="7334173707292807964">"ਐਪਾਂ ਵੱਲੋਂ ਜ਼ਿਆਦਾ ਬੈਟਰੀ ਵਰਤੇ ਜਾਣ ਦਾ ਪਤਾ ਲਗਾਇਆ ਜਾ ਰਿਹਾ ਹੈ"</string>
<string name="battery_manager_off" msgid="673547668722420924">"ਬੰਦ"</string>
<plurals name="battery_manager_app_restricted" formatted="false" msgid="6714534362166394848">
- <item quantity="one">%1$d ਐਪ ਪ੍ਰਤੀਬੰਧਿਤ</item>
- <item quantity="other">%1$d ਐਪਾਂ ਪ੍ਰਤੀਬੰਧਿਤ</item>
+ <item quantity="one">%1$d ਐਪ ਪ੍ਰਤਿਬੰਧਿਤ</item>
+ <item quantity="other">%1$d ਐਪਾਂ ਪ੍ਰਤਿਬੰਧਿਤ</item>
</plurals>
<string name="battery_header_title_alternate" msgid="8371821625994616659">"<xliff:g id="NUMBER">^1</xliff:g>"<small>" "<font size="20">"<xliff:g id="UNIT">%</xliff:g>"</font></small>""</string>
<string name="battery_missing_message" msgid="400958471814422770">"ਬੈਟਰੀ ਮੀਟਰ ਨੂੰ ਪੜ੍ਹਨ ਵਿੱਚ ਸਮੱਸਿਆ ਹੋ ਰਹੀ ਹੈ।"</string>
@@ -2924,6 +2924,8 @@
<string name="battery_not_usage" msgid="1472275761547230196">"ਪਿਛਲੀ ਵਾਰ ਪੂਰਾ ਚਾਰਜ ਕਰਨ ਤੋਂ ਬਾਅਦ ਕੋਈ ਵਰਤੋਂ ਨਹੀਂ"</string>
<string name="battery_not_usage_24hr" msgid="8397519536160741248">"ਪਿਛਲੇ 24 ਘੰਟਿਆਂ ਦੌਰਾਨ ਕੋਈ ਵਰਤੋਂ ਨਹੀਂ"</string>
<string name="battery_usage_without_time" msgid="1346894834339420538"></string>
+ <!-- no translation found for battery_usage_other_users (9002643295562500693) -->
+ <skip />
<string name="advanced_battery_graph_subtext" msgid="6816737986172678550">"ਬਾਕੀ ਬਚੀ ਬੈਟਰੀ ਦਾ ਅਨੁਮਾਨ ਤੁਹਾਡੇ ਡੀਵਾਈਸ ਦੀ ਵਰਤੋਂ \'ਤੇ ਆਧਾਰਿਤ ਹੈ"</string>
<string name="estimated_time_left" msgid="948717045180211777">"ਅਨੁਮਾਨਿਤ ਬਾਕੀ ਸਮਾਂ"</string>
<string name="estimated_charging_time_left" msgid="2287135413363961246">"ਪੂਰਾ ਚਾਰਜ ਹੋਣ ਲਈ"</string>
@@ -3249,7 +3251,7 @@
<string name="data_usage_limit_dialog_mobile" product="default" msgid="4942895670789168024">"ਤੁਹਾਡਾ ਫ਼ੋਨ ਤੁਹਾਡੇ ਵੱਲੋਂ ਸੈੱਟ ਕੀਤੀ ਮੋਬਾਈਲ ਡਾਟੇ ਦੀ ਸੀਮਾ ਉੱਤੇ ਪਹੁੰਚਣ \'ਤੇ ਮੋਬਾਈਲ ਡਾਟਾ ਬੰਦ ਕਰ ਦੇਵੇਗਾ।\n\nਕਿਉਂਕਿ ਡਾਟਾ ਵਰਤੋਂ ਨੂੰ ਤੁਹਾਡੇ ਫ਼ੋਨ ਵੱਲੋਂ ਮਾਪਿਆ ਜਾਂਦਾ ਹੈ ਅਤੇ ਹੋ ਸਕਦਾ ਹੈ ਕਿ ਤੁਹਾਡਾ ਕੈਰੀਅਰ ਵਰਤੋਂ ਦਾ ਹਿਸਾਬ ਵੱਖਰੇ ਢੰਗ ਨਾਲ ਲਗਾਵੇ, ਇਸ ਕਰਕੇ ਕੋਈ ਸਰਫ਼ੇ ਵਾਲੀ ਸੀਮਾ ਸੈੱਟ ਕਰਨ ਬਾਰੇ ਵਿਚਾਰ ਕਰੋ।"</string>
<string name="data_usage_restrict_background_title" msgid="2745551538820692821">"ਕੀ ਪਿਛੋਕੜ ਡਾਟਾ ਤੇ ਪ੍ਰਤਿਬੰਧ ਲਾਉਣਾ ਹੈ?"</string>
<string name="data_usage_restrict_background" msgid="1893102079135282794">"ਜੇਕਰ ਤੁਸੀਂ ਬੈਕਗ੍ਰਾਊਂਡ ਮੋਬਾਈਲ ਡਾਟੇ \'ਤੇ ਪਾਬੰਦੀ ਲਗਾਉਂਦੇ ਹੋ, ਤਾਂ ਕੁਝ ਐਪਾਂ ਅਤੇ ਸੇਵਾਵਾਂ ਉਦੋਂ ਤੱਕ ਕੰਮ ਨਹੀਂ ਕਰਨਗੀਆਂ ਜਦੋਂ ਤੱਕ ਤੁਸੀਂ ਵਾਈ‑ਫਾਈ ਨਾਲ ਕਨੈਕਟ ਨਹੀਂ ਹੁੰਦੇ।"</string>
- <string name="data_usage_restrict_background_multiuser" product="tablet" msgid="5588623586867665419">"ਜੇਕਰ ਤੁਸੀਂ ਬੈਕਗ੍ਰਾਊਂਡ ਮੋਬਾਈਲ ਡਾਟੇ \'ਤੇ ਪ੍ਰਤੀਬੰਧ ਲਗਾਉਂਦੇ ਹੋ, ਤਾਂ ਕੁਝ ਐਪਾਂ ਅਤੇ ਸੇਵਾਵਾਂ ਉਦੋਂ ਤੱਕ ਕੰਮ ਨਹੀਂ ਕਰਨਗੀਆਂ ਜਦੋਂ ਤੱਕ ਤੁਸੀਂ ਵਾਈ‑ਫਾਈ ਨਾਲ ਕਨੈਕਟ ਨਹੀਂ ਹੁੰਦੇ।\n\nਇਹ ਸੈਟਿੰਗ ਇਸ ਟੈਬਲੈੱਟ \'ਤੇ ਸਾਰੇ ਵਰਤੋਂਕਾਰਾਂ ਨੂੰ ਪ੍ਰਭਾਵਿਤ ਕਰਦੀ ਹੈ।"</string>
+ <string name="data_usage_restrict_background_multiuser" product="tablet" msgid="5588623586867665419">"ਜੇਕਰ ਤੁਸੀਂ ਬੈਕਗ੍ਰਾਊਂਡ ਮੋਬਾਈਲ ਡਾਟੇ \'ਤੇ ਪ੍ਰਤਿਬੰਧ ਲਗਾਉਂਦੇ ਹੋ, ਤਾਂ ਕੁਝ ਐਪਾਂ ਅਤੇ ਸੇਵਾਵਾਂ ਉਦੋਂ ਤੱਕ ਕੰਮ ਨਹੀਂ ਕਰਨਗੀਆਂ ਜਦੋਂ ਤੱਕ ਤੁਸੀਂ ਵਾਈ‑ਫਾਈ ਨਾਲ ਕਨੈਕਟ ਨਹੀਂ ਹੁੰਦੇ।\n\nਇਹ ਸੈਟਿੰਗ ਇਸ ਟੈਬਲੈੱਟ \'ਤੇ ਸਾਰੇ ਵਰਤੋਂਕਾਰਾਂ ਨੂੰ ਪ੍ਰਭਾਵਿਤ ਕਰਦੀ ਹੈ।"</string>
<string name="data_usage_restrict_background_multiuser" product="default" msgid="6402714504088590463">"ਜੇਕਰ ਤੁਸੀਂ ਬੈਕਗ੍ਰਾਊਂਡ ਮੋਬਾਈਲ ਡਾਟੇ \'ਤੇ ਪਾਬੰਦੀ ਲਗਾਉਂਦੇ ਹੋ, ਤਾਂ ਕੁਝ ਐਪਾਂ ਅਤੇ ਸੇਵਾਵਾਂ ਉਦੋਂ ਤੱਕ ਕੰਮ ਨਹੀਂ ਕਰਨਗੀਆਂ ਜਦੋਂ ਤੱਕ ਤੁਸੀਂ ਵਾਈ-ਫਾਈ ਨਾਲ ਕਨੈਕਟ ਨਹੀਂ ਹੁੰਦੇ।\n\nਇਹ ਸੈਟਿੰਗ ਇਸ ਫ਼ੋਨ \'ਤੇ ਸਾਰੇ ਵਰਤੋਂਕਾਰਾਂ ਨੂੰ ਪ੍ਰਭਾਵਿਤ ਕਰਦੀ ਹੈ।"</string>
<string name="data_usage_sweep_warning" msgid="2072854703184614828"><font size="18">"<xliff:g id="NUMBER">^1</xliff:g>"</font>" "<font size="9">"<xliff:g id="UNIT">^2</xliff:g>"</font>\n<font size="12">"ਚਿਤਾਵਨੀ"</font></string>
<string name="data_usage_sweep_limit" msgid="6947019190890086284"><font size="18">"<xliff:g id="NUMBER">^1</xliff:g>"</font>" "<font size="9">"<xliff:g id="UNIT">^2</xliff:g>"</font>\n<font size="12">"ਸੀਮਾ"</font></string>
@@ -3753,7 +3755,7 @@
<string name="zen_mode_automation_settings_page_title" msgid="6217433860514433311">"ਸਮਾਂ-ਸੂਚੀਆਂ"</string>
<string name="zen_mode_automatic_rule_settings_page_title" msgid="5264835276518295033">"ਸਮਾਂ-ਸੂਚੀ"</string>
<string name="zen_mode_schedule_category_title" msgid="1381879916197350988">"ਸਮਾਂ-ਸੂਚੀ"</string>
- <string name="zen_mode_automation_suggestion_title" msgid="7776129050500707960">"ਕੁਝ ਖਾਸ ਸਮਿਆਂ \'ਤੇ ਫ਼ੋਨ ਖਾਮੋਸ਼ ਰੱਖੋ"</string>
+ <string name="zen_mode_automation_suggestion_title" msgid="7776129050500707960">"ਕੁਝ ਖਾਸ ਸਮਿਆਂ \'ਤੇ ਫ਼ੋਨ ਸ਼ਾਂਤ ਰੱਖੋ"</string>
<string name="zen_mode_automation_suggestion_summary" msgid="1946750790084170826">"\'ਪਰੇਸ਼ਾਨ ਨਾ ਕਰੋ\' ਦੇ ਨਿਯਮ ਸੈੱਟ ਕਰੋ"</string>
<string name="zen_mode_schedule_title" msgid="7064866561892906613">"ਸਮਾਂ-ਸੂਚੀ"</string>
<string name="zen_mode_use_automatic_rule" msgid="733850322530002484">"ਸਮਾਂ-ਸੂਚੀ ਵਰਤੋ"</string>
@@ -3914,7 +3916,7 @@
<string name="gentle_notifications_also_display" msgid="8617545395880297691">"ਇਸ ਵਿੱਚ ਵੀ ਦਿਸਦੀਆਂ ਹਨ"</string>
<string name="gentle_notifications_display_status" msgid="7410244447768694856">"ਸਥਿਤੀ ਪੱਟੀ"</string>
<string name="gentle_notifications_display_lock" msgid="1914245082527924144">"ਲਾਕ ਸਕ੍ਰੀਨ"</string>
- <string name="gentle_notifications_education" msgid="5957509621826384362">"ਸਰਲ ਸੂਚਨਾਵਾਂ ਹਮੇਸ਼ਾਂ ਖਾਮੋਸ਼ ਰਹਿੰਦੀਆਂ ਹਨ ਅਤੇ ਹਮੇਸ਼ਾਂ ਹੇਠਾਂ ਖਿੱਚੀ ਜਾਣ ਵਾਲੀ ਸੂਚੀ ਵਿੱਚ ਦਿਸਦੀਆਂ ਹਨ"</string>
+ <string name="gentle_notifications_education" msgid="5957509621826384362">"ਸਰਲ ਸੂਚਨਾਵਾਂ ਹਮੇਸ਼ਾਂ ਸ਼ਾਂਤ ਰਹਿੰਦੀਆਂ ਹਨ ਅਤੇ ਹਮੇਸ਼ਾਂ ਹੇਠਾਂ ਖਿੱਚੀ ਜਾਣ ਵਾਲੀ ਸੂਚੀ ਵਿੱਚ ਦਿਸਦੀਆਂ ਹਨ"</string>
<string name="gentle_notifications_display_summary_shade" msgid="7616926954719310445">"ਸਿਰਫ਼ ਹੇਠਾਂ ਖਿੱਚੀ ਜਾਣ ਵਾਲੀ ਸੂਚੀ ਵਿੱਚ ਦਿਸਦੀਆਂ ਹਨ"</string>
<string name="gentle_notifications_display_summary_shade_lock" msgid="3936088046873705625">"ਹੇਠਾਂ ਖਿੱਚੀ ਜਾਣ ਵਾਲੀ ਸੂਚੀ ਅਤੇ ਲਾਕ ਸਕ੍ਰੀਨ \'ਤੇ ਦਿਸਦੀਆਂ ਹਨ"</string>
<string name="gentle_notifications_display_summary_shade_status" msgid="3363137853729359907">"ਹੇਠਾਂ ਖਿੱਚੀ ਜਾਣ ਵਾਲੀ ਸੂਚੀ ਅਤੇ ਸਥਿਤੀ ਪੱਟੀ \'ਤੇ ਦਿਸਦੀਆਂ ਹਨ"</string>
@@ -4289,7 +4291,7 @@
<string name="zen_mode_summary_alarms_only_by_time" msgid="8140619669703968810">"ਅਲਾਰਮ ਨੂੰ ਸਿਰਫ਼ <xliff:g id="FORMATTEDTIME">%1$s</xliff:g> ਤੱਕ ਬਦਲੋ"</string>
<string name="zen_mode_summary_always" msgid="722093064250082317">"ਹਮੇਸ਼ਾਂ ਵਿਘਨ ਪਾਓ ਵਿੱਚ ਬਦਲੋ"</string>
<string name="zen_mode_screen_on" msgid="7312758100468915319">"ਜਦੋਂ ਸਕ੍ਰੀਨ ਚਾਲੂ ਹੋਵੇ"</string>
- <string name="zen_mode_screen_on_summary" msgid="510055058460316698">"\'ਪਰੇਸ਼ਾਨ ਨਾ ਕਰੋ\' ਵੱਲੋਂ ਖਾਮੋਸ਼ ਕਰਵਾਈਆਂ ਸੂਚਨਾਵਾਂ ਨੂੰ ਸਕ੍ਰੀਨ \'ਤੇ ਦਿਖਣ ਦਿਓ ਅਤੇ ਇੱਕ ਸਥਿਤੀ ਪੱਟੀ ਪ੍ਰਤੀਕ ਦਿਖਾਉਣ ਦਿਓ"</string>
+ <string name="zen_mode_screen_on_summary" msgid="510055058460316698">"\'ਪਰੇਸ਼ਾਨ ਨਾ ਕਰੋ\' ਵੱਲੋਂ ਸ਼ਾਂਤ ਕਰਵਾਈਆਂ ਸੂਚਨਾਵਾਂ ਨੂੰ ਸਕ੍ਰੀਨ \'ਤੇ ਦਿਸਣ ਦਿਓ ਅਤੇ ਇੱਕ ਸਥਿਤੀ ਪੱਟੀ ਪ੍ਰਤੀਕ ਦਿਖਾਉਣ ਦਿਓ"</string>
<string name="zen_mode_screen_off" msgid="7069798697669366075">"ਜਦੋਂ ਸਕ੍ਰੀਨ ਬੰਦ ਹੋਵੇ"</string>
<string name="zen_mode_screen_off_summary" msgid="4698018253505406152">"\'ਪਰੇਸ਼ਾਨ ਨਾ ਕਰੋ\' ਵੱਲੋਂ ਚੁੱਪ ਕਰਵਾਈਆਂ ਸੂਚਨਾਵਾਂ ਨੂੰ ਸਕ੍ਰੀਨ ਚਾਲੂ ਕਰਨ ਅਤੇ ਰੋਸ਼ਨੀ ਨੂੰ ਟਿਮ-ਟਿਮਾਉਣ ਦਿਓ"</string>
<string name="zen_mode_screen_off_summary_no_led" msgid="1958271859408992636">"\'ਪਰੇਸ਼ਾਨ ਨਾ ਕਰੋ\' ਵੱਲੋਂ ਚੁੱਪ ਕਰਵਾਈਆਂ ਸੂਚਨਾਵਾਂ ਨੂੰ ਸਕ੍ਰੀਨ ਚਾਲੂ ਕਰਨ ਦਿਓ"</string>
@@ -4855,8 +4857,8 @@
<string name="overlay_toast_failed_to_apply" msgid="4839587811338164960">"ਓਵਰਲੇ ਨੂੰ ਲਾਗੂ ਕਰਨਾ ਅਸਫਲ ਰਿਹਾ"</string>
<string name="special_access" msgid="1767980727423395147">"ਵਿਸ਼ੇਸ਼ ਐਪ ਪਹੁੰਚ"</string>
<plurals name="special_access_summary" formatted="false" msgid="4995506406763570815">
- <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> ਐਪ ਅਣ-ਪ੍ਰਤੀਬੰਧਿਤ ਡਾਟੇ ਦੀ ਵਰਤੋਂ ਕਰ ਸਕਦੀ ਹੈ</item>
- <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> ਐਪਾਂ ਅਣ-ਪ੍ਰਤੀਬੰਧਿਤ ਡਾਟੇ ਦੀ ਵਰਤੋਂ ਕਰ ਸਕਦੀਆਂ ਹਨ</item>
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> ਐਪ ਅਣ-ਪ੍ਰਤਿਬੰਧਿਤ ਡਾਟੇ ਦੀ ਵਰਤੋਂ ਕਰ ਸਕਦੀ ਹੈ</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> ਐਪਾਂ ਅਣ-ਪ੍ਰਤਿਬੰਧਿਤ ਡਾਟੇ ਦੀ ਵਰਤੋਂ ਕਰ ਸਕਦੀਆਂ ਹਨ</item>
</plurals>
<string name="special_access_more" msgid="132919514147475846">"ਹੋਰ ਦੇਖੋ"</string>
<string name="reset_shortcut_manager_throttling" msgid="2183940254903144298">"ShortcutManager ਰੇਟ-ਲਿਮਿਟਿੰਗ ਰੀਸੈੱਟ ਕਰੋ"</string>
diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml
index 6d69592..4f243f6 100644
--- a/res/values-pl/strings.xml
+++ b/res/values-pl/strings.xml
@@ -3000,6 +3000,8 @@
<string name="battery_not_usage" msgid="1472275761547230196">"Brak użycia od ostatniego pełnego naładowania"</string>
<string name="battery_not_usage_24hr" msgid="8397519536160741248">"Brak wykorzystania w ciągu ostatnich 24 godzin"</string>
<string name="battery_usage_without_time" msgid="1346894834339420538"></string>
+ <!-- no translation found for battery_usage_other_users (9002643295562500693) -->
+ <skip />
<string name="advanced_battery_graph_subtext" msgid="6816737986172678550">"Pozostały czas pracy na baterii jest szacowany na podstawie wykorzystania urządzenia"</string>
<string name="estimated_time_left" msgid="948717045180211777">"Szacowany pozostały czas"</string>
<string name="estimated_charging_time_left" msgid="2287135413363961246">"Do pełnego naładowania"</string>
diff --git a/res/values-pt-rBR/strings.xml b/res/values-pt-rBR/strings.xml
index 8fc8ff3..1766396 100644
--- a/res/values-pt-rBR/strings.xml
+++ b/res/values-pt-rBR/strings.xml
@@ -2926,6 +2926,8 @@
<string name="battery_not_usage" msgid="1472275761547230196">"Sem uso desde a última carga completa"</string>
<string name="battery_not_usage_24hr" msgid="8397519536160741248">"Sem uso nas últimas 24h"</string>
<string name="battery_usage_without_time" msgid="1346894834339420538"></string>
+ <!-- no translation found for battery_usage_other_users (9002643295562500693) -->
+ <skip />
<string name="advanced_battery_graph_subtext" msgid="6816737986172678550">"A estimativa de carga da bateria restante é baseada no uso que você faz do dispositivo"</string>
<string name="estimated_time_left" msgid="948717045180211777">"Tempo restante estimado"</string>
<string name="estimated_charging_time_left" msgid="2287135413363961246">"Até a carga completa"</string>
diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml
index 1d071c3..9ae9a4d 100644
--- a/res/values-pt-rPT/strings.xml
+++ b/res/values-pt-rPT/strings.xml
@@ -2924,6 +2924,7 @@
<string name="battery_not_usage" msgid="1472275761547230196">"Nenhuma utilização desde o último carregamento"</string>
<string name="battery_not_usage_24hr" msgid="8397519536160741248">"Nenhuma utilização nas últimas 24 h"</string>
<string name="battery_usage_without_time" msgid="1346894834339420538"></string>
+ <string name="battery_usage_other_users" msgid="9002643295562500693">"Outros utilizadores"</string>
<string name="advanced_battery_graph_subtext" msgid="6816737986172678550">"A estimativa de bateria restante baseia-se na utilização do dispositivo"</string>
<string name="estimated_time_left" msgid="948717045180211777">"Tempo restante estimado"</string>
<string name="estimated_charging_time_left" msgid="2287135413363961246">"Até ficar totalmente carregada"</string>
@@ -4066,7 +4067,7 @@
<string name="picture_in_picture_empty_text" msgid="9123600661268731579">"Nenhuma app instalada é compatível com Imagem na imagem"</string>
<string name="picture_in_picture_keywords" msgid="3605379820551656253">"pip picture in"</string>
<string name="picture_in_picture_app_detail_title" msgid="4442235098255164650">"Imagem na imagem"</string>
- <string name="picture_in_picture_app_detail_switch" msgid="8544190716075624017">"Permitir imagem na imagem"</string>
+ <string name="picture_in_picture_app_detail_switch" msgid="8544190716075624017">"Permitir ecrã no ecrã"</string>
<string name="picture_in_picture_app_detail_summary" msgid="2503211101305358849">"Permita que esta app crie uma janela de ecrã no ecrã enquanto a aplicação está aberta ou depois de sair da mesma (por exemplo, para continuar a ver um vídeo). Esta janela é apresentada sobre as outras aplicações que estiver a utilizar."</string>
<string name="interact_across_profiles_title" msgid="7285906999927669971">"Apps pessoais e de trabalho associadas"</string>
<string name="interact_across_profiles_summary_allowed" msgid="1365881452153799092">"Associadas"</string>
diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml
index 8fc8ff3..1766396 100644
--- a/res/values-pt/strings.xml
+++ b/res/values-pt/strings.xml
@@ -2926,6 +2926,8 @@
<string name="battery_not_usage" msgid="1472275761547230196">"Sem uso desde a última carga completa"</string>
<string name="battery_not_usage_24hr" msgid="8397519536160741248">"Sem uso nas últimas 24h"</string>
<string name="battery_usage_without_time" msgid="1346894834339420538"></string>
+ <!-- no translation found for battery_usage_other_users (9002643295562500693) -->
+ <skip />
<string name="advanced_battery_graph_subtext" msgid="6816737986172678550">"A estimativa de carga da bateria restante é baseada no uso que você faz do dispositivo"</string>
<string name="estimated_time_left" msgid="948717045180211777">"Tempo restante estimado"</string>
<string name="estimated_charging_time_left" msgid="2287135413363961246">"Até a carga completa"</string>
diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml
index 495a6e0..9577b00 100644
--- a/res/values-ro/strings.xml
+++ b/res/values-ro/strings.xml
@@ -2964,6 +2964,7 @@
<string name="battery_not_usage" msgid="1472275761547230196">"Nu a fost folosită de la ultima încărcare completă"</string>
<string name="battery_not_usage_24hr" msgid="8397519536160741248">"Nu a fost folosită în ultimele 24 h"</string>
<string name="battery_usage_without_time" msgid="1346894834339420538"></string>
+ <string name="battery_usage_other_users" msgid="9002643295562500693">"Alți utilizatori"</string>
<string name="advanced_battery_graph_subtext" msgid="6816737986172678550">"Estimarea bateriei rămase se bazează pe utilizarea dispozitivului"</string>
<string name="estimated_time_left" msgid="948717045180211777">"Timp estimat rămas"</string>
<string name="estimated_charging_time_left" msgid="2287135413363961246">"Până la încărcarea completă"</string>
@@ -3361,7 +3362,7 @@
<string name="vpn_create" msgid="7546073242936894638">"Adăugați un profil VPN"</string>
<string name="vpn_menu_edit" msgid="5100387853773792379">"Editați profilul"</string>
<string name="vpn_menu_delete" msgid="4455966182219039928">"Ștergeți profilul"</string>
- <string name="vpn_menu_lockdown" msgid="5284041663859541007">"Rețea VPN activată permanent"</string>
+ <string name="vpn_menu_lockdown" msgid="5284041663859541007">"VPN activat permanent"</string>
<string name="vpn_no_vpns_added" msgid="7387080769821533728">"Nicio rețea VPN adăugată"</string>
<string name="vpn_always_on_summary" msgid="2171252372476858166">"Mențineți conexiunea la rețelele VPN"</string>
<string name="vpn_always_on_summary_not_supported" msgid="9084872130449368437">"Nu este acceptată de această aplicație"</string>
diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml
index c65ce16..45f5cd2 100644
--- a/res/values-ru/strings.xml
+++ b/res/values-ru/strings.xml
@@ -3000,6 +3000,8 @@
<string name="battery_not_usage" msgid="1472275761547230196">"Батарея не использовалась с момента последней полной зарядки"</string>
<string name="battery_not_usage_24hr" msgid="8397519536160741248">"Батарея не использовалась за последние 24 часа"</string>
<string name="battery_usage_without_time" msgid="1346894834339420538"></string>
+ <!-- no translation found for battery_usage_other_users (9002643295562500693) -->
+ <skip />
<string name="advanced_battery_graph_subtext" msgid="6816737986172678550">"Оставшееся время работы рассчитано с учетом того, как используется устройство."</string>
<string name="estimated_time_left" msgid="948717045180211777">"Расчетное время работы без подзарядки"</string>
<string name="estimated_charging_time_left" msgid="2287135413363961246">"До полной зарядки"</string>
diff --git a/res/values-si/strings.xml b/res/values-si/strings.xml
index 3242540..4407cfd 100644
--- a/res/values-si/strings.xml
+++ b/res/values-si/strings.xml
@@ -2924,6 +2924,8 @@
<string name="battery_not_usage" msgid="1472275761547230196">"අවසන් පූර්ණ ආරෝපණයේ සිට භාවිත කර නැත"</string>
<string name="battery_not_usage_24hr" msgid="8397519536160741248">"පසුගිය පැය 24 සඳහා භාවිතයක් නැත"</string>
<string name="battery_usage_without_time" msgid="1346894834339420538"></string>
+ <!-- no translation found for battery_usage_other_users (9002643295562500693) -->
+ <skip />
<string name="advanced_battery_graph_subtext" msgid="6816737986172678550">"ඉතිරිව ඇති බැටරි ඇස්තමේන්තුව ඔබගේ උපාංග භාවිතය මත පදනම් වේ"</string>
<string name="estimated_time_left" msgid="948717045180211777">"ඇස්තමේන්තුගත ඉතිරි කාලය"</string>
<string name="estimated_charging_time_left" msgid="2287135413363961246">"පූර්ණ ආරෝපණය වන තෙක්"</string>
diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml
index 068cfee..a423387 100644
--- a/res/values-sk/strings.xml
+++ b/res/values-sk/strings.xml
@@ -481,7 +481,7 @@
<string name="security_settings_fingerprint_v2_enroll_acquire_too_fast" msgid="5891227328100822018">"Keď zacítite vibráciu, zdvihnite prst"</string>
<string name="security_settings_fingerprint_v2_enroll_acquire_too_bright" msgid="769646735950329315">"Prejdite na miesto s jemnejším osvetlením a skúste to znova"</string>
<string name="security_settings_fingerprint_v2_enroll_error_max_attempts" msgid="1464972470750764128">"Dosiahli ste maximálny počet pokusov"</string>
- <string name="security_settings_fingerprint_v2_home_screen_text" product="tablet" msgid="179325591887291180">"Odomykajte tablet alebo overujte svoju totožnosť odtlačkom prsta, napríklad pri prihlasovaní do aplikácií"</string>
+ <string name="security_settings_fingerprint_v2_home_screen_text" product="tablet" msgid="179325591887291180">"Odtlačkom prsta môžete odomknúť tablet alebo overiť svoju totožnosť, napríklad pri prihlasovaní do nejakej aplikácie"</string>
<string name="security_settings_fingerprint_v2_home_screen_text" product="device" msgid="2503218139575057099">"Odomykajte zariadenie alebo overujte svoju totožnosť odtlačkom prsta, napríklad pri prihlasovaní do aplikácií"</string>
<string name="security_settings_fingerprint_v2_home_screen_text" product="default" msgid="481286891358925579">"Odomykajte telefón alebo overujte svoju totožnosť odtlačkom prsta, napríklad pri prihlasovaní do aplikácií"</string>
<string name="security_settings_biometric_preference_title" msgid="298146483579539448">"Odomknutie tvárou a odtlačkom prsta"</string>
@@ -3002,6 +3002,7 @@
<string name="battery_not_usage" msgid="1472275761547230196">"Žiadne použitie od posledného úplného dobitia"</string>
<string name="battery_not_usage_24hr" msgid="8397519536160741248">"Žiadne použitie za posledných 24 hodín"</string>
<string name="battery_usage_without_time" msgid="1346894834339420538"></string>
+ <string name="battery_usage_other_users" msgid="9002643295562500693">"Ďalší používatelia"</string>
<string name="advanced_battery_graph_subtext" msgid="6816737986172678550">"Odhad zostávajúcej batérie vychádza z vášho používania zariadenia"</string>
<string name="estimated_time_left" msgid="948717045180211777">"Odhadovaný zostávajúci čas:"</string>
<string name="estimated_charging_time_left" msgid="2287135413363961246">"Do úplného dobitia"</string>
diff --git a/res/values-sl/strings.xml b/res/values-sl/strings.xml
index afb85e2..3d68a6f 100644
--- a/res/values-sl/strings.xml
+++ b/res/values-sl/strings.xml
@@ -3002,6 +3002,8 @@
<string name="battery_not_usage" msgid="1472275761547230196">"Ni bilo uporabe od zadnje polne napolnjenosti."</string>
<string name="battery_not_usage_24hr" msgid="8397519536160741248">"Ni bilo uporabe v zadnjih 24 urah."</string>
<string name="battery_usage_without_time" msgid="1346894834339420538"></string>
+ <!-- no translation found for battery_usage_other_users (9002643295562500693) -->
+ <skip />
<string name="advanced_battery_graph_subtext" msgid="6816737986172678550">"Ocena preostalega časa delovanja na baterijsko napajanje temelji na načinu uporabe naprave."</string>
<string name="estimated_time_left" msgid="948717045180211777">"Približni preostali čas"</string>
<string name="estimated_charging_time_left" msgid="2287135413363961246">"Do napolnjenosti"</string>
diff --git a/res/values-sq/strings.xml b/res/values-sq/strings.xml
index 94ddd4f..735a31d 100644
--- a/res/values-sq/strings.xml
+++ b/res/values-sq/strings.xml
@@ -2924,6 +2924,8 @@
<string name="battery_not_usage" msgid="1472275761547230196">"Pa përdorim nga karikimi i fundit i plotë"</string>
<string name="battery_not_usage_24hr" msgid="8397519536160741248">"Nuk është përdorur për 24 orët e fundit"</string>
<string name="battery_usage_without_time" msgid="1346894834339420538"></string>
+ <!-- no translation found for battery_usage_other_users (9002643295562500693) -->
+ <skip />
<string name="advanced_battery_graph_subtext" msgid="6816737986172678550">"Përllogaritja për baterinë e mbetur bazohet në përdorimin e pajisjes tënde"</string>
<string name="estimated_time_left" msgid="948717045180211777">"Koha e vlerësuar e mbetur"</string>
<string name="estimated_charging_time_left" msgid="2287135413363961246">"Deri në ngarkimin e plotë"</string>
diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml
index 246509f..1dfdec3 100644
--- a/res/values-sr/strings.xml
+++ b/res/values-sr/strings.xml
@@ -2962,6 +2962,7 @@
<string name="battery_not_usage" msgid="1472275761547230196">"Нема коришћења од последњег потпуног пуњења"</string>
<string name="battery_not_usage_24hr" msgid="8397519536160741248">"Нема коришћења у последња 24 сата"</string>
<string name="battery_usage_without_time" msgid="1346894834339420538"></string>
+ <string name="battery_usage_other_users" msgid="9002643295562500693">"Остали корисници"</string>
<string name="advanced_battery_graph_subtext" msgid="6816737986172678550">"Процена преосталог нивоа напуњености батерије је заснована на коришћењу уређаја"</string>
<string name="estimated_time_left" msgid="948717045180211777">"Процењено преостало време"</string>
<string name="estimated_charging_time_left" msgid="2287135413363961246">"До потпуног пуњења"</string>
diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml
index dca0f5a..8e6702c 100644
--- a/res/values-sv/strings.xml
+++ b/res/values-sv/strings.xml
@@ -2555,7 +2555,7 @@
<string name="reduce_bright_colors_preference_summary" product="default" msgid="7878756844769221647">"Gör skärmen mer dimmad än telefonens lägsta ljusstyrka"</string>
<string name="reduce_bright_colors_preference_summary" product="tablet" msgid="8959794720356934888">"Gör skärmen mer dimmad än surfplattans lägsta ljusstyrka"</string>
<string name="reduce_bright_colors_preference_intro_text" msgid="3502290826747650566">"Dämpa skärmens ljusstyrka ytterligare så att det blir behagligare för ögonen att läsa"</string>
- <string name="reduce_bright_colors_preference_subtitle" product="default" msgid="8573408446901659333">"Extradimmat kan vara användbart när <ol> <li> telefonens lägsta ljusstyrka fortfarande är för ljus</li> <li> du använder telefonen i mörker, t.ex. på natten eller i ett mörkt rum innan du ska sova.</li> </ol>"</string>
+ <string name="reduce_bright_colors_preference_subtitle" product="default" msgid="8573408446901659333">"Extradimmat kan vara användbart när <ol> <li> telefonens lägsta ljusstyrka fortfarande är för ljus</li> <li> du använder telefonen i mörker, t.ex. på natten eller i ett mörkt rum innan du ska sova.</li> </ol>"</string>
<string name="reduce_bright_colors_preference_subtitle" product="tablet" msgid="5158211121482010799">"Extradimmat kan vara användbart när <ol> <li> surfplattans lägsta ljusstyrka fortfarande är för ljus</li> <li> du använder surfplattan i mörker, t.ex. på natten eller i ett mörkt rum innan du ska sova.</li> </ol>"</string>
<string name="reduce_bright_colors_intensity_preference_title" msgid="7455443033955118267">"Intensitet"</string>
<string name="reduce_bright_colors_intensity_start_label" msgid="930387498396426039">"Svagare"</string>
@@ -2924,6 +2924,8 @@
<string name="battery_not_usage" msgid="1472275761547230196">"Har inte använts sedan batteriet senast var fulladdat"</string>
<string name="battery_not_usage_24hr" msgid="8397519536160741248">"Har inte använts under de senaste 24 timmarna"</string>
<string name="battery_usage_without_time" msgid="1346894834339420538"></string>
+ <!-- no translation found for battery_usage_other_users (9002643295562500693) -->
+ <skip />
<string name="advanced_battery_graph_subtext" msgid="6816737986172678550">"Uppskattad återstående batteritid baseras på enhetsanvändningen"</string>
<string name="estimated_time_left" msgid="948717045180211777">"Beräknad återstående tid"</string>
<string name="estimated_charging_time_left" msgid="2287135413363961246">"Tills fulladdad"</string>
@@ -5083,7 +5085,7 @@
<string name="financed_privacy_developer_options" msgid="7602001474669831672">"Använda utvecklaralternativ"</string>
<string name="financed_privacy_credit_provider_capabilities_category" msgid="8737902277892987998">"Långivaren kan göra följande:"</string>
<string name="financed_privacy_IMEI" msgid="1852413860963824799">"Få åtkomst till ditt IMEI-nummer"</string>
- <string name="financed_privacy_factory_reset" msgid="5505016667590160732">"Återställ standardinställningarna på enheten om något blir fel"</string>
+ <string name="financed_privacy_factory_reset" msgid="5505016667590160732">"Återställa standardinställningarna på enheten om något blir fel"</string>
<string name="financed_privacy_locked_mode_category" msgid="3708288398912647751">"Om enheten är låst kan du använda den endast för att göra följande:"</string>
<string name="financed_privacy_emergency_calls" msgid="1108183987142736497">"Ringa nödsamtal"</string>
<string name="financed_privacy_system_info" msgid="4158031444108708927">"Visa systeminformation som datum, tid, nätverksstatus och batteri"</string>
diff --git a/res/values-sw/strings.xml b/res/values-sw/strings.xml
index 06dfb1c..670c6e5 100644
--- a/res/values-sw/strings.xml
+++ b/res/values-sw/strings.xml
@@ -486,7 +486,7 @@
<string name="biometric_settings_use_biometric_for_apps" msgid="6201168728906364189">"Kuthibitisha ni wewe katika programu"</string>
<string name="biometric_settings_use_face_preference_summary" msgid="1821648836899408477">"Kutumia uso"</string>
<string name="biometric_settings_use_fingerprint_preference_summary" msgid="6077762097826050165">"Ukitumia alama ya kidole"</string>
- <string name="biometric_settings_use_face_or_fingerprint_preference_summary" msgid="3029102492674234728">"Kutumia uso au alama ya kidole"</string>
+ <string name="biometric_settings_use_face_or_fingerprint_preference_summary" msgid="3029102492674234728">"Ukitumia uso au alama ya kidole"</string>
<string name="biometric_settings_hand_back_to_guardian" product="tablet" msgid="1498542470242509989">"Rudisha kompyuta kibao kwa mzazi wako"</string>
<string name="biometric_settings_hand_back_to_guardian" product="device" msgid="3837001353226852511">"Rudisha kifaa kwa mzazi wako"</string>
<string name="biometric_settings_hand_back_to_guardian" product="default" msgid="3747619291972376153">"Mrejeshee mzazi wako simu"</string>
@@ -2924,6 +2924,8 @@
<string name="battery_not_usage" msgid="1472275761547230196">"Haijatumika tangu ilipojazwa chaji mara ya mwisho"</string>
<string name="battery_not_usage_24hr" msgid="8397519536160741248">"Haijatumika katika saa 24 zilizopita"</string>
<string name="battery_usage_without_time" msgid="1346894834339420538"></string>
+ <!-- no translation found for battery_usage_other_users (9002643295562500693) -->
+ <skip />
<string name="advanced_battery_graph_subtext" msgid="6816737986172678550">"Kadirio la chaji ya betri iliyosalia linategemea matumizi ya kifaa chako"</string>
<string name="estimated_time_left" msgid="948717045180211777">"Kadirio la muda uliosalia"</string>
<string name="estimated_charging_time_left" msgid="2287135413363961246">"Hadi chaji ijae"</string>
diff --git a/res/values-ta/strings.xml b/res/values-ta/strings.xml
index 60f151b..f403968 100644
--- a/res/values-ta/strings.xml
+++ b/res/values-ta/strings.xml
@@ -2924,6 +2924,8 @@
<string name="battery_not_usage" msgid="1472275761547230196">"கடந்த முறை முழு சார்ஜ் ஆனதிலிருந்து எந்த உபயோகமும் இல்லை"</string>
<string name="battery_not_usage_24hr" msgid="8397519536160741248">"கடந்த 24 மணிநேரத்தில் எந்த உபயோகமும் இல்லை"</string>
<string name="battery_usage_without_time" msgid="1346894834339420538"></string>
+ <!-- no translation found for battery_usage_other_users (9002643295562500693) -->
+ <skip />
<string name="advanced_battery_graph_subtext" msgid="6816737986172678550">"சாதனத்தை உபயோகிப்பதன் அடிப்படையில், மீதமுள்ள பேட்டரியின் தோராய அளவு கணக்கிடப்படுகிறது"</string>
<string name="estimated_time_left" msgid="948717045180211777">"கணக்கிடப்பட்ட மீதமுள்ள நேரம்"</string>
<string name="estimated_charging_time_left" msgid="2287135413363961246">"முழு சார்ஜ் ஆக"</string>
diff --git a/res/values-te/strings.xml b/res/values-te/strings.xml
index 23eacf3..9d1c4ca 100644
--- a/res/values-te/strings.xml
+++ b/res/values-te/strings.xml
@@ -932,8 +932,8 @@
<string name="link_speed" msgid="931786745741016446">"<xliff:g id="LINK_SPEED">%1$d</xliff:g> Mbps"</string>
<string name="wifi_ask_enable" msgid="6860056048266810769">"<xliff:g id="REQUESTER">%s</xliff:g> Wi-Fiని ఆన్ చేయాలనుకుంటోంది"</string>
<string name="wifi_ask_disable" msgid="1663208096020309639">"<xliff:g id="REQUESTER">%s</xliff:g> Wi-Fiని ఆఫ్ చేయాలనుకుంటోంది"</string>
- <string name="art_verifier_for_debuggable_title" msgid="1926445785190030479">"డీబగ్ చేయగల యాప్ల బైట్కోడ్ను తనిఖీ చేయండి"</string>
- <string name="art_verifier_for_debuggable_summary" msgid="4802875841862652879">"డీబగ్ చేయదగిన యాప్ల బైట్కోడ్ తనిఖీ చేయడం కోసం ARTని అనుమతించండి"</string>
+ <string name="art_verifier_for_debuggable_title" msgid="1926445785190030479">"డీబగ్ చేయగల యాప్ల బైట్కోడ్ను చెక్ చేయండి"</string>
+ <string name="art_verifier_for_debuggable_summary" msgid="4802875841862652879">"డీబగ్ చేయదగిన యాప్ల బైట్కోడ్ చెక్ చేయడం కోసం ARTని అనుమతించండి"</string>
<string name="show_refresh_rate" msgid="5742688821872354973">"రిఫ్రెష్ రేటును చూపడం"</string>
<string name="show_refresh_rate_summary" msgid="3558118122374609663">"ప్రస్తుతం ప్రదర్శనలో వున్న రిఫ్రెష్ రేటును చూపడం"</string>
<string name="nfc_quick_toggle_title" msgid="3607620705230351666">"NFC"</string>
@@ -2924,6 +2924,8 @@
<string name="battery_not_usage" msgid="1472275761547230196">"చివరిగా పూర్తి ఛార్జింగ్ చేసినప్పటి నుండి ఎలాంటి వినియోగం లేదు"</string>
<string name="battery_not_usage_24hr" msgid="8397519536160741248">"గత 24 గంటల నుండి ఎలాంటి వినియోగం లేదు"</string>
<string name="battery_usage_without_time" msgid="1346894834339420538"></string>
+ <!-- no translation found for battery_usage_other_users (9002643295562500693) -->
+ <skip />
<string name="advanced_battery_graph_subtext" msgid="6816737986172678550">"పరికరం వినియోగాన్ని బట్టి మిగిలి ఉన్న బ్యాటరీ అంచనా వేయబడుతుంది"</string>
<string name="estimated_time_left" msgid="948717045180211777">"అంచనా వేసిన సమయం మిగిలి ఉంది"</string>
<string name="estimated_charging_time_left" msgid="2287135413363961246">"పూర్తిగా ఛార్జ్ కావడానికి పట్టే సమయం"</string>
@@ -3370,8 +3372,8 @@
<string name="ssl_ca_cert_info_message" msgid="3111724430981667845">"{numberOfCertificates,plural, =1{మీ వర్క్ ప్రొఫైల్ కోసం {orgName} సర్టిఫికెట్ అధికారాన్ని ఇన్స్టాల్ చేసింది. దీని వల్ల వారు ఈమెయిల్స్, యాప్లు ఇంకా సురక్షితమైన వెబ్సైట్లతో సహా వర్క్ నెట్వర్క్ యాక్టివిటీని పర్యవేక్షించడానికి అనుమతించబడవచ్చు.\n\nఈ సర్టిఫికెట్ గురించి మరింత సమాచారం కోసం, మీ అడ్మిన్ను కాంటాక్ట్ చేయండి.}other{మీ వర్క్ ప్రొఫైల్ కోసం {orgName} సర్టిఫికెట్ అధికారాలను ఇన్స్టాల్ చేసింది. దీని వల్ల వారు ఈమెయిల్స్, యాప్లు ఇంకా సురక్షితమైన వెబ్సైట్లతో సహా వర్క్ నెట్వర్క్ యాక్టివిటీని పర్యవేక్షించడానికి అనుమతించబడవచ్చు.\n\nఈ సర్టిఫికెట్ల గురించి మరింత సమాచారం కోసం, మీ అడ్మిన్ను కాంటాక్ట్ చేయండి.}}"</string>
<string name="ssl_ca_cert_warning_message" msgid="4374052724815563051">"మూడవ పక్షం ఈమెయిళ్లు, యాప్లు మరియు సురక్షిత వెబ్సైట్లతో సహా మీ నెట్వర్క్ కార్యాచరణను పర్యవేక్షించగలిగే సామర్థ్యాన్ని కలిగి ఉంటారు.\n\nమీ పరికరంలో ఇన్స్టాల్ చేయబడిన విశ్వసనీయ ఆధారాల వలన ఇది సాధ్యపడుతుంది."</string>
<plurals name="ssl_ca_cert_settings_button" formatted="false" msgid="125941406175485894">
- <item quantity="other">ప్రమాణపత్రాలను తనిఖీ చేయి</item>
- <item quantity="one">ప్రమాణపత్రాన్ని తనిఖీ చేయి</item>
+ <item quantity="other">ప్రమాణపత్రాలను చెక్ చేయండి</item>
+ <item quantity="one">ప్రమాణపత్రాన్ని చెక్ చేయండి</item>
</plurals>
<string name="user_settings_title" msgid="6550866465409807877">"మల్టిపుల్ యూజర్లు"</string>
<string name="user_settings_footer_text" product="device" msgid="7523914344521302179">"కొత్త వినియోగదారులను జోడించడం ద్వారా మీ పరికరాన్ని షేర్ చేయండి. మీ పరికరంలోని అనుకూల హోమ్ స్క్రీన్లు, ఖాతాలు, యాప్ల సెట్టింగ్లు మరియు మరిన్నింటి కోసం ప్రతి వినియోగదారుకి వ్యక్తిగత స్థలం ఉంటుంది."</string>
@@ -4965,17 +4967,17 @@
<string name="one_handed_action_pull_down_screen_summary" msgid="7582432473450036628">"స్క్రీన్ పైభాగం మీ బొటనవేలు పైభాగానికి చేరుకుంటుంది."</string>
<string name="one_handed_action_show_notification_title" msgid="8789305491485437130">"నోటిఫికేషన్లను చూపండి"</string>
<string name="one_handed_action_show_notification_summary" msgid="8281689861222000436">"నోటిఫికేషన్లు, సెట్టింగ్లు కనిపిస్తాయి."</string>
- <string name="ambient_display_summary" msgid="2650326740502690434">"సమయం, నోటిఫికేషన్లు మరియు ఇతర సమాచారాన్ని తనిఖీ చేయడం కోసం, మీ స్క్రీన్ని రెండుసార్లు నొక్కండి."</string>
+ <string name="ambient_display_summary" msgid="2650326740502690434">"సమయం, నోటిఫికేషన్లు మరియు ఇతర సమాచారాన్ని చెక్ చేయడం కోసం, మీ స్క్రీన్ని రెండుసార్లు నొక్కండి."</string>
<string name="ambient_display_pickup_title" product="default" msgid="4418310591912877548">"ఫోన్ను తరచి చూడటానికి పైకి ఎత్తండి"</string>
<string name="ambient_display_pickup_title" product="tablet" msgid="8055486872070888377">"టాబ్లెట్ను తరచి చూడటానికి పైకి ఎత్తండి"</string>
<string name="ambient_display_pickup_title" product="device" msgid="8980156994848721455">"పరికరాన్ని తరచి చూడటానికి పైకి ఎత్తండి"</string>
<string name="ambient_display_wake_screen_title" msgid="7637678749035378085">"డిస్ప్లేను సక్రియపరచండి"</string>
<string name="ambient_display_pickup_summary" product="default" msgid="1087355013674109242">"టైమ్, నోటిఫికేషన్లతో పాటు ఇతర సమాచారాన్ని చెక్ చేయడానికి, మీ ఫోన్ను చేతిలోకి తీసుకోండి"</string>
- <string name="ambient_display_pickup_summary" product="tablet" msgid="2589556997034530529">"సమయం, నోటిఫికేషన్లు మరియు ఇతర సమాచారాన్ని తనిఖీ చేయడం కోసం, మీ టాబ్లెట్ని చేతిలోకి తీసుకోండి."</string>
- <string name="ambient_display_pickup_summary" product="device" msgid="1916011370011115627">"సమయం, నోటిఫికేషన్లు మరియు ఇతర సమాచారాన్ని తనిఖీ చేయడం కోసం, మీ పరికరాన్ని చేతిలోకి తీసుకోండి."</string>
+ <string name="ambient_display_pickup_summary" product="tablet" msgid="2589556997034530529">"సమయం, నోటిఫికేషన్లు మరియు ఇతర సమాచారాన్ని చెక్ చేయడం కోసం, మీ టాబ్లెట్ని చేతిలోకి తీసుకోండి."</string>
+ <string name="ambient_display_pickup_summary" product="device" msgid="1916011370011115627">"సమయం, నోటిఫికేషన్లు మరియు ఇతర సమాచారాన్ని చెక్ చేయడం కోసం, మీ పరికరాన్ని చేతిలోకి తీసుకోండి."</string>
<string name="ambient_display_tap_screen_title" product="default" msgid="2811332293938467179">"ఫోన్ను చెక్ చేయడానికి ట్యాప్ చేయండి"</string>
- <string name="ambient_display_tap_screen_title" product="tablet" msgid="6461531447715370632">"టాబ్లెట్ను తనిఖీ చేయడానికి నొక్కండి"</string>
- <string name="ambient_display_tap_screen_title" product="device" msgid="4423803387551153840">"పరికరాన్ని తనిఖీ చేయడానికి నొక్కండి"</string>
+ <string name="ambient_display_tap_screen_title" product="tablet" msgid="6461531447715370632">"టాబ్లెట్ను చెక్ చేయడానికి నొక్కండి"</string>
+ <string name="ambient_display_tap_screen_title" product="device" msgid="4423803387551153840">"పరికరాన్ని చెక్ చేయడానికి నొక్కండి"</string>
<string name="ambient_display_tap_screen_summary" msgid="4480489179996521405">"టైమ్, నోటిఫికేషన్లతో పాటు ఇతర సమాచారాన్ని చెక్ చేయడానికి మీ స్క్రీన్ను ట్యాప్ చేయండి."</string>
<string name="emergency_gesture_screen_title" msgid="3280543310204360902">"ఎమర్జెన్సీ సహాయం"</string>
<string name="emergency_gesture_switchbar_title" msgid="7421353963329899514">"ఎమర్జెన్సీ సహాయాన్ని ఉపయోగించండి"</string>
@@ -4990,8 +4992,8 @@
<string name="fingerprint_swipe_for_notifications_title" msgid="2271217256447175017">"నోటిఫికేషన్ల కోసం వేలిముద్రతో స్వైప్ చేయండి"</string>
<string name="fingerprint_gesture_screen_title" msgid="9086261338232806522">"వేలిముద్రతో స్వైప్ చేయి"</string>
<string name="fingerprint_swipe_for_notifications_summary" product="default" msgid="286662791588779673">"మీ నోటిఫికేషన్లను చెక్ చేయడానికి, మీ ఫోన్ వెనుకవైపు ఉన్న వేలిముద్ర సెన్సార్పై కిందికి స్వైప్ చేయండి."</string>
- <string name="fingerprint_swipe_for_notifications_summary" product="tablet" msgid="8642092907817554454">"మీ నోటిఫికేషన్లను తనిఖీ చేయడానికి, మీ టాబ్లెట్ వెనుకవైపు ఉన్న వేలిముద్ర సెన్సార్పై కిందికి స్వైప్ చేయండి."</string>
- <string name="fingerprint_swipe_for_notifications_summary" product="device" msgid="3888927017311372398">"మీ నోటిఫికేషన్లను తనిఖీ చేయడానికి, మీ పరికరం వెనుకవైపు ఉన్న వేలిముద్ర సెన్సార్పై క్రిందికి స్వైప్ చేయండి."</string>
+ <string name="fingerprint_swipe_for_notifications_summary" product="tablet" msgid="8642092907817554454">"మీ నోటిఫికేషన్లను చెక్ చేయడానికి, మీ టాబ్లెట్ వెనుకవైపు ఉన్న వేలిముద్ర సెన్సార్పై కిందికి స్వైప్ చేయండి."</string>
+ <string name="fingerprint_swipe_for_notifications_summary" product="device" msgid="3888927017311372398">"మీ నోటిఫికేషన్లను చెక్ చేయడానికి, మీ పరికరం వెనుకవైపు ఉన్న వేలిముద్ర సెన్సార్పై క్రిందికి స్వైప్ చేయండి."</string>
<string name="fingerprint_swipe_for_notifications_suggestion_title" msgid="2956636269742745449">"నోటిఫికేషన్లను త్వరగా చూడండి"</string>
<string name="gesture_setting_on" msgid="3223448394997988591">"ఆన్"</string>
<string name="gesture_setting_off" msgid="3444029475726294919">"ఆఫ్"</string>
@@ -5496,7 +5498,7 @@
<string name="wfc_disclaimer_disagree_text" msgid="8424457394700137703">"వద్దు, ధన్యవాదాలు"</string>
<string name="wfc_disclaimer_location_title_text" msgid="7913919887475418423">"లొకేషన్"</string>
<string name="wfc_disclaimer_location_desc_text" msgid="1417004513415772582">"మీరు ఈ సర్వీస్ను ఎమర్జెన్సీ కాల్స్ కోసం ఉపయోగించినప్పుడు మీ క్యారియర్ మీ లొకేషన్ను సేకరించే అవకాశం ఉంది.\n\nవివరాల కోసం మీ క్యారియర్ గోప్యతా పాలసీని సందర్శించండి."</string>
- <string name="forget_passpoint_dialog_message" msgid="2433875063907365760">"మీరు ఏదైనా మిగిలిన సమయం లేదా డేటాకు యాక్సెస్ను కోల్పోవచ్చు. తీసివేసే ముందు మీ ప్రదాతతో తనిఖీ చేయండి."</string>
+ <string name="forget_passpoint_dialog_message" msgid="2433875063907365760">"మీరు ఏదైనా మిగిలిన సమయం లేదా డేటాకు యాక్సెస్ను కోల్పోవచ్చు. తీసివేసే ముందు మీ ప్రదాతతో చెక్ చేయండి."</string>
<string name="keywords_content_capture" msgid="7802155522681936956">"కంటెంట్ క్యాప్చర్, యాప్ కంటెంట్"</string>
<string name="content_capture" msgid="868372905432812238">"యాప్ కంటెంట్"</string>
<string name="content_capture_summary" msgid="49720773699715531">"Android సిస్టమ్కు కంటెంట్ను పంపడానికి యాప్లను అనుమతిస్తుంది"</string>
diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml
index 8a626df..3dd8ae9 100644
--- a/res/values-th/strings.xml
+++ b/res/values-th/strings.xml
@@ -2924,6 +2924,8 @@
<string name="battery_not_usage" msgid="1472275761547230196">"ไม่มีการใช้งานตั้งแต่ชาร์จเต็มครั้งล่าสุด"</string>
<string name="battery_not_usage_24hr" msgid="8397519536160741248">"ไม่มีการใช้งานในช่วง 24 ชม. ที่ผ่านมา"</string>
<string name="battery_usage_without_time" msgid="1346894834339420538"></string>
+ <!-- no translation found for battery_usage_other_users (9002643295562500693) -->
+ <skip />
<string name="advanced_battery_graph_subtext" msgid="6816737986172678550">"ค่าประมาณแบตเตอรี่ที่เหลืออิงตามการใช้งานอุปกรณ์ของคุณ"</string>
<string name="estimated_time_left" msgid="948717045180211777">"เวลาที่เหลือโดยประมาณ"</string>
<string name="estimated_charging_time_left" msgid="2287135413363961246">"จนกว่าจะชาร์จเต็ม"</string>
diff --git a/res/values-tl/strings.xml b/res/values-tl/strings.xml
index 2372fc0..cbe6cea 100644
--- a/res/values-tl/strings.xml
+++ b/res/values-tl/strings.xml
@@ -2924,6 +2924,8 @@
<string name="battery_not_usage" msgid="1472275761547230196">"Walang paggamit mula noong huling na-full charge"</string>
<string name="battery_not_usage_24hr" msgid="8397519536160741248">"Walang paggamit sa nakalipas na 24 na oras"</string>
<string name="battery_usage_without_time" msgid="1346894834339420538"></string>
+ <!-- no translation found for battery_usage_other_users (9002643295562500693) -->
+ <skip />
<string name="advanced_battery_graph_subtext" msgid="6816737986172678550">"Nakabatay ang pagtatantya ng natitirang baterya sa paggamit ng iyong device"</string>
<string name="estimated_time_left" msgid="948717045180211777">"Tinatayang natitirang oras"</string>
<string name="estimated_charging_time_left" msgid="2287135413363961246">"Hanggang mapuno ang baterya"</string>
diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml
index ba4a524..2cad593 100644
--- a/res/values-tr/strings.xml
+++ b/res/values-tr/strings.xml
@@ -2924,6 +2924,8 @@
<string name="battery_not_usage" msgid="1472275761547230196">"Son kez tamamen şarj olduktan sonra kullanılmadı"</string>
<string name="battery_not_usage_24hr" msgid="8397519536160741248">"Son 24 saatte kullanılmadı"</string>
<string name="battery_usage_without_time" msgid="1346894834339420538"></string>
+ <!-- no translation found for battery_usage_other_users (9002643295562500693) -->
+ <skip />
<string name="advanced_battery_graph_subtext" msgid="6816737986172678550">"Kalan pil gücü tahmini, cihazınızın kullanımına göre yapılır"</string>
<string name="estimated_time_left" msgid="948717045180211777">"Kalan tahmini süre"</string>
<string name="estimated_charging_time_left" msgid="2287135413363961246">"sonra tam olarak şarj olacak"</string>
diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml
index 6bcd851..2bace95 100644
--- a/res/values-uk/strings.xml
+++ b/res/values-uk/strings.xml
@@ -3000,6 +3000,8 @@
<string name="battery_not_usage" msgid="1472275761547230196">"Відсутнє споживання з часу останнього повного заряджання"</string>
<string name="battery_not_usage_24hr" msgid="8397519536160741248">"Відсутнє споживання за останні 24 години"</string>
<string name="battery_usage_without_time" msgid="1346894834339420538"></string>
+ <!-- no translation found for battery_usage_other_users (9002643295562500693) -->
+ <skip />
<string name="advanced_battery_graph_subtext" msgid="6816737986172678550">"Залишок заряду акумулятора визначається на основі використання пристрою"</string>
<string name="estimated_time_left" msgid="948717045180211777">"Залишилося приблизно"</string>
<string name="estimated_charging_time_left" msgid="2287135413363961246">"До повного заряду"</string>
@@ -5949,7 +5951,7 @@
<string name="ingress_rate_limit_title" msgid="2106694002836274350">"Ліміт швидкості завантаження в мережі"</string>
<string name="ingress_rate_limit_summary" msgid="1097811019742438371">"Налаштуйте ліміт вхідної пропускної спроможності мережі, який застосовуватиметься до всіх мереж, що забезпечують інтернет-з’єднання."</string>
<string name="ingress_rate_limit_dialog_title" msgid="5359461052422633789">"Налаштувати ліміт швидкості завантаження в мережі"</string>
- <string name="ingress_rate_limit_no_limit_entry" msgid="8741098826008012163">"Немає ліміту"</string>
+ <string name="ingress_rate_limit_no_limit_entry" msgid="8741098826008012163">"Немає обмеження"</string>
<string name="bluetooth_broadcast_dialog_title" msgid="9172775308463135884">"Трансляція"</string>
<string name="bluetooth_broadcast_dialog_broadcast_app" msgid="1016617579194329005">"Змінити додаток для трансляції на <xliff:g id="CURRENTAPP">%1$s</xliff:g>"</string>
<string name="bluetooth_broadcast_dialog_find_message" msgid="6621660851669953883">"Слухайте трансляції з пристроїв поблизу"</string>
diff --git a/res/values-ur/strings.xml b/res/values-ur/strings.xml
index e20f40b..b07da8b 100644
--- a/res/values-ur/strings.xml
+++ b/res/values-ur/strings.xml
@@ -2924,6 +2924,8 @@
<string name="battery_not_usage" msgid="1472275761547230196">"پچھلے مکمل چارج کے بعد سے بیٹری کا کوئی استعمال نہیں"</string>
<string name="battery_not_usage_24hr" msgid="8397519536160741248">"گزشتہ 24 گھنٹے میں بیٹری کا کوئی استعمال نہیں"</string>
<string name="battery_usage_without_time" msgid="1346894834339420538"></string>
+ <!-- no translation found for battery_usage_other_users (9002643295562500693) -->
+ <skip />
<string name="advanced_battery_graph_subtext" msgid="6816737986172678550">"بچی ہوئی بیٹری کا اندازہ آپ کے آلے کے استعمال پر مبنی ہے"</string>
<string name="estimated_time_left" msgid="948717045180211777">"باقی تخمینی وقت"</string>
<string name="estimated_charging_time_left" msgid="2287135413363961246">"پوری طرح چارج ہونے تک"</string>
diff --git a/res/values-uz/strings.xml b/res/values-uz/strings.xml
index dcd6d38..8dd4700 100644
--- a/res/values-uz/strings.xml
+++ b/res/values-uz/strings.xml
@@ -473,7 +473,7 @@
<string name="security_settings_fingerprint_v2_enroll_acquire_too_fast" msgid="5891227328100822018">"Barmoqni tebranishni sezganda oling"</string>
<string name="security_settings_fingerprint_v2_enroll_acquire_too_bright" msgid="769646735950329315">"Yoriqroq joyga borib, qaytadan urining"</string>
<string name="security_settings_fingerprint_v2_enroll_error_max_attempts" msgid="1464972470750764128">"Urinishlar soni qolmadi"</string>
- <string name="security_settings_fingerprint_v2_home_screen_text" product="tablet" msgid="179325591887291180">"Planshetni qulfdan chiqarish yoki ilovalarga hisobingiz bilan kirishda shaxsingizni tasdiqlash uchun barmoq izingizdan foydalaning"</string>
+ <string name="security_settings_fingerprint_v2_home_screen_text" product="tablet" msgid="179325591887291180">"Planshetingiz qulfini ochish yoki ilovalarga hisobingiz bilan kirishda shaxsingizni tasdiqlash uchun barmoq izingizdan foydalaning"</string>
<string name="security_settings_fingerprint_v2_home_screen_text" product="device" msgid="2503218139575057099">"Qurilmani qulfdan chiqarish yoki ilovalarga hisobingiz bilan kirishda shaxsingizni tasdiqlash uchun barmoq izingizdan foydalaning"</string>
<string name="security_settings_fingerprint_v2_home_screen_text" product="default" msgid="481286891358925579">"Telefonni qulfdan chiqarish yoki ilovalarga hisobingiz bilan kirishda shaxsingizni tasdiqlash uchun barmoq izingizdan foydalaning"</string>
<string name="security_settings_biometric_preference_title" msgid="298146483579539448">"Yuz va barmoq izi bilan ochish"</string>
@@ -2926,6 +2926,8 @@
<string name="battery_not_usage" msgid="1472275761547230196">"Toʻliq quvvat olgandan keyin ishlatilmagan"</string>
<string name="battery_not_usage_24hr" msgid="8397519536160741248">"24 soat ichida orqa fon rejimi ishlatilmagan"</string>
<string name="battery_usage_without_time" msgid="1346894834339420538"></string>
+ <!-- no translation found for battery_usage_other_users (9002643295562500693) -->
+ <skip />
<string name="advanced_battery_graph_subtext" msgid="6816737986172678550">"Batareyaning qolgan vaqti qurilmadan qanday foydalanishingiz asosida taxminiy hisoblangan"</string>
<string name="estimated_time_left" msgid="948717045180211777">"Taxminiy qolgan vaqt"</string>
<string name="estimated_charging_time_left" msgid="2287135413363961246">"Quvvati to‘lishigacha qolgan vaqt"</string>
diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml
index 72a878c..ed86bc0 100644
--- a/res/values-vi/strings.xml
+++ b/res/values-vi/strings.xml
@@ -2753,7 +2753,7 @@
<string name="battery_tip_high_usage_title" msgid="9110720762506146697">"Mức sử dụng pin cao"</string>
<string name="battery_tip_high_usage_summary" msgid="3938999581403084551">"Xem các ứng dụng có mức sử dụng pin cao nhất"</string>
<string name="battery_tip_limited_temporarily_title" msgid="5231061779363606924">"Chức năng sạc tạm thời bị hạn chế"</string>
- <string name="battery_tip_limited_temporarily_summary" msgid="8504402301403419444">"Để kéo dài tuổi thọ pin. Tìm hiểu thêm."</string>
+ <string name="battery_tip_limited_temporarily_summary" msgid="8504402301403419444">"Để kéo dài thời lượng pin. Tìm hiểu thêm."</string>
<string name="battery_tip_limited_temporarily_dialog_resume_charge" msgid="2302295458913832342">"Tiếp tục sạc"</string>
<string name="battery_tip_limited_temporarily_dialog_msg" product="default" msgid="8125639486214812735">"Trong một số điều kiện, chẳng hạn như nhiệt độ cao và thời gian sạc lâu, mức sạc có thể bị hạn chế ở <xliff:g id="PERCENT">%1$s</xliff:g> để duy trì độ bền của pin.\n\nKhi các điều kiện đó chấm dứt, điện thoại của bạn sẽ tự động sạc như bình thường."</string>
<string name="battery_tip_limited_temporarily_dialog_msg" product="tablet" msgid="3890877885222574553">"Trong một số điều kiện, chẳng hạn như nhiệt độ cao và thời gian sạc lâu, mức sạc có thể bị hạn chế ở <xliff:g id="PERCENT">%1$s</xliff:g> để duy trì độ bền của pin.\n\nKhi các điều kiện đó chấm dứt, điện thoại của bạn sẽ tự động sạc như bình thường."</string>
@@ -2926,6 +2926,7 @@
<string name="battery_not_usage" msgid="1472275761547230196">"Không sử dụng pin kể từ lần sạc đầy gần đây nhất"</string>
<string name="battery_not_usage_24hr" msgid="8397519536160741248">"Không sử dụng pin trong 24 giờ qua"</string>
<string name="battery_usage_without_time" msgid="1346894834339420538"></string>
+ <string name="battery_usage_other_users" msgid="9002643295562500693">"Người dùng khác"</string>
<string name="advanced_battery_graph_subtext" msgid="6816737986172678550">"Thời lượng pin còn lại ước tính là dựa trên mức sử dụng thiết bị"</string>
<string name="estimated_time_left" msgid="948717045180211777">"Thời gian còn lại ước tính"</string>
<string name="estimated_charging_time_left" msgid="2287135413363961246">"Cho tới khi được sạc đầy"</string>
@@ -3147,7 +3148,7 @@
<string name="background_data" msgid="321903213000101158">"Dữ liệu nền"</string>
<string name="background_data_summary" msgid="6572245922513522466">"Ứng dụng có thể đ.bộ hóa, gửi & nhận dữ liệu bất kỳ lúc nào"</string>
<string name="background_data_dialog_title" msgid="1692005302993229867">"Tắt dữ liệu nền?"</string>
- <string name="background_data_dialog_message" msgid="7760280837612824670">"Tắt dữ liệu nền sẽ kéo dài tuổi thọ pin và giảm mức sử dụng dữ liệu. Một số ứng dụng vẫn có thể sử dụng kết nối dữ liệu nền."</string>
+ <string name="background_data_dialog_message" msgid="7760280837612824670">"Tắt dữ liệu nền sẽ kéo dài thời lượng pin và giảm mức sử dụng dữ liệu. Một số ứng dụng vẫn có thể sử dụng kết nối dữ liệu nền."</string>
<string name="sync_automatically" msgid="4874122892765430304">"Tự động đồng bộ hóa dữ liệu ứng dụng"</string>
<string name="sync_enabled" msgid="5794103781356455043">"Tính năng đồng bộ hóa đang BẬT"</string>
<string name="sync_disabled" msgid="1636223106968593391">"Tính năng đồng bộ hóa đang TẮT"</string>
@@ -5236,9 +5237,9 @@
<string name="media_output_switching" msgid="7488216595474868546">"Đang chuyển đổi…"</string>
<string name="take_call_on_title" msgid="1159417893879946757">"Thực hiện cuộc gọi trên"</string>
<string name="cannot_change_apn_toast" msgid="296540724089240405">"Không thể thay đổi APN (Tên điểm truy cập) này."</string>
- <string name="battery_suggestion_title" product="tablet" msgid="1525940496459255289">"Tăng tuổi thọ pin của máy tính bảng"</string>
- <string name="battery_suggestion_title" product="device" msgid="2280773774080720377">"Tăng tuổi thọ pin của thiết bị"</string>
- <string name="battery_suggestion_title" product="default" msgid="4811554469047272537">"Tăng tuổi thọ pin của điện thoại"</string>
+ <string name="battery_suggestion_title" product="tablet" msgid="1525940496459255289">"Tăng thời lượng pin của máy tính bảng"</string>
+ <string name="battery_suggestion_title" product="device" msgid="2280773774080720377">"Tăng thời lượng pin của thiết bị"</string>
+ <string name="battery_suggestion_title" product="default" msgid="4811554469047272537">"Tăng thời lượng pin của điện thoại"</string>
<string name="battery_suggestion_summary" msgid="8186720080540016197"></string>
<string name="gesture_prevent_ringing_screen_title" msgid="8293094715267769349">"Ngăn đổ chuông"</string>
<string name="gesture_prevent_ringing_title" msgid="5978577898997523581">"Nhấn đồng thời nút Nguồn và nút Tăng âm lượng để"</string>
diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml
index 5ca0cf4..249a287 100644
--- a/res/values-zh-rCN/strings.xml
+++ b/res/values-zh-rCN/strings.xml
@@ -473,7 +473,7 @@
<string name="security_settings_fingerprint_v2_enroll_acquire_too_fast" msgid="5891227328100822018">"请在感觉到振动后抬起手指"</string>
<string name="security_settings_fingerprint_v2_enroll_acquire_too_bright" msgid="769646735950329315">"请移到光线较柔和的地方,然后重试"</string>
<string name="security_settings_fingerprint_v2_enroll_error_max_attempts" msgid="1464972470750764128">"您已达到尝试次数上限"</string>
- <string name="security_settings_fingerprint_v2_home_screen_text" product="tablet" msgid="179325591887291180">"您可以使用指纹解锁平板电脑或验证自己的身份,例如在登录应用时"</string>
+ <string name="security_settings_fingerprint_v2_home_screen_text" product="tablet" msgid="179325591887291180">"您可以使用指纹解锁平板电脑,或验证自己的身份(例如在登录应用时)"</string>
<string name="security_settings_fingerprint_v2_home_screen_text" product="device" msgid="2503218139575057099">"您可以使用指纹解锁设备或验证自己的身份,例如在登录应用时"</string>
<string name="security_settings_fingerprint_v2_home_screen_text" product="default" msgid="481286891358925579">"您可以使用指纹解锁手机或验证自己的身份,例如在登录应用时"</string>
<string name="security_settings_biometric_preference_title" msgid="298146483579539448">"人脸解锁和指纹解锁"</string>
@@ -2924,6 +2924,7 @@
<string name="battery_not_usage" msgid="1472275761547230196">"自电池上次充满电后未使用过"</string>
<string name="battery_not_usage_24hr" msgid="8397519536160741248">"过去 24 小时内未使用过"</string>
<string name="battery_usage_without_time" msgid="1346894834339420538"></string>
+ <string name="battery_usage_other_users" msgid="9002643295562500693">"其他用户"</string>
<string name="advanced_battery_graph_subtext" msgid="6816737986172678550">"系统会根据设备使用情况估算电池的剩余续航时间"</string>
<string name="estimated_time_left" msgid="948717045180211777">"预计剩余时间"</string>
<string name="estimated_charging_time_left" msgid="2287135413363961246">"剩余充电时间"</string>
diff --git a/res/values-zh-rHK/strings.xml b/res/values-zh-rHK/strings.xml
index 65c5940..e0780e8 100644
--- a/res/values-zh-rHK/strings.xml
+++ b/res/values-zh-rHK/strings.xml
@@ -2927,6 +2927,8 @@
<string name="battery_not_usage" msgid="1472275761547230196">"上次充滿電後未使用電池"</string>
<string name="battery_not_usage_24hr" msgid="8397519536160741248">"過去 24 小時未使用電池"</string>
<string name="battery_usage_without_time" msgid="1346894834339420538"></string>
+ <!-- no translation found for battery_usage_other_users (9002643295562500693) -->
+ <skip />
<string name="advanced_battery_graph_subtext" msgid="6816737986172678550">"根據裝置的使用情況估計剩餘電量"</string>
<string name="estimated_time_left" msgid="948717045180211777">"估計剩餘時間"</string>
<string name="estimated_charging_time_left" msgid="2287135413363961246">"剩餘充電時間"</string>
diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml
index 5a9a839..120cb97 100644
--- a/res/values-zh-rTW/strings.xml
+++ b/res/values-zh-rTW/strings.xml
@@ -2926,6 +2926,8 @@
<string name="battery_not_usage" msgid="1472275761547230196">"從上次充飽電後未曾使用"</string>
<string name="battery_not_usage_24hr" msgid="8397519536160741248">"過去 24 小時未曾使用"</string>
<string name="battery_usage_without_time" msgid="1346894834339420538"></string>
+ <!-- no translation found for battery_usage_other_users (9002643295562500693) -->
+ <skip />
<string name="advanced_battery_graph_subtext" msgid="6816737986172678550">"系統會依據裝置的使用情形估算剩餘電量"</string>
<string name="estimated_time_left" msgid="948717045180211777">"預估剩餘時間"</string>
<string name="estimated_charging_time_left" msgid="2287135413363961246">"充飽所需時間"</string>
diff --git a/res/values-zu/strings.xml b/res/values-zu/strings.xml
index f502e0a..4772c5f 100644
--- a/res/values-zu/strings.xml
+++ b/res/values-zu/strings.xml
@@ -2925,6 +2925,8 @@
<string name="battery_not_usage" msgid="1472275761547230196">"Akusetshenziswanga kusuka ekushajweni kokugcina okugcwele"</string>
<string name="battery_not_usage_24hr" msgid="8397519536160741248">"Akusetshenziswanga emahoreni angama-24 adlule"</string>
<string name="battery_usage_without_time" msgid="1346894834339420538"></string>
+ <!-- no translation found for battery_usage_other_users (9002643295562500693) -->
+ <skip />
<string name="advanced_battery_graph_subtext" msgid="6816737986172678550">"Ukulinganiselwa kwebhethri okusele kususelwa ekusetshenzisweni kwedivayisi yakho"</string>
<string name="estimated_time_left" msgid="948717045180211777">"Isikhathi esilinganiselwe esisele"</string>
<string name="estimated_charging_time_left" msgid="2287135413363961246">"Kuze kushaje ngokuphelele"</string>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index cc7690e..355b4ba 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -6607,6 +6607,8 @@
<string name="battery_not_usage_24hr">No usage for past 24 hr</string>
<!-- Description for no usage time but have battery usage [CHAR LIMIT=120] -->
<string name="battery_usage_without_time"></string>
+ <!-- Description for other users aggregated battery usage data [CHAR LIMIT=120] -->
+ <string name="battery_usage_other_users">Other users</string>
<!-- Graph subtext displayed to user when enhanced battery estimate is being used [CHAR LIMIT=120] -->
<string name="advanced_battery_graph_subtext">Battery left estimate is based on your device usage</string>
diff --git a/res/xml/captioning_appearance.xml b/res/xml/captioning_appearance.xml
index 7156630..6710ec6 100644
--- a/res/xml/captioning_appearance.xml
+++ b/res/xml/captioning_appearance.xml
@@ -25,14 +25,16 @@
android:title="@string/summary_placeholder"
android:layout="@layout/captioning_preview"
android:selectable="false"
- settings:searchable="false"/>
+ settings:searchable="false"
+ settings:controller="com.android.settings.accessibility.CaptionPreviewPreferenceController"/>
<ListPreference
android:entries="@array/captioning_font_size_selector_titles"
android:entryValues="@array/captioning_font_size_selector_values"
android:key="captioning_font_size"
android:summary="%s"
- android:title="@string/captioning_text_size"/>
+ android:title="@string/captioning_text_size"
+ settings:controller="com.android.settings.accessibility.CaptionFontSizeController"/>
<com.android.settings.accessibility.PresetPreference
android:key="captioning_preset"
@@ -47,7 +49,8 @@
android:entryValues="@array/captioning_typeface_selector_values"
android:key="captioning_typeface"
android:summary="%s"
- android:title="@string/captioning_typeface"/>
+ android:title="@string/captioning_typeface"
+ settings:controller="com.android.settings.accessibility.CaptionTypefaceController"/>
<com.android.settings.accessibility.ColorPreference
android:key="captioning_foreground_color"
diff --git a/res/xml/privacy_controls_settings.xml b/res/xml/privacy_controls_settings.xml
index a477dc2..cc88e0c 100644
--- a/res/xml/privacy_controls_settings.xml
+++ b/res/xml/privacy_controls_settings.xml
@@ -34,12 +34,6 @@
android:summary="@string/mic_toggle_description"
settings:controller="com.android.settings.privacy.MicToggleController"/>
- <!-- Location toggle -->
- <com.android.settingslib.RestrictedSwitchPreference
- android:key="privacy_location_toggle"
- android:title="@string/location_toggle_title"
- android:summary="@string/perm_toggle_description"/>
-
<!-- Clipboard access notifications -->
<SwitchPreference
android:key="show_clip_access_notification"
diff --git a/src/com/android/settings/accessibility/CaptionAppearanceFragment.java b/src/com/android/settings/accessibility/CaptionAppearanceFragment.java
index 53c1dd0..da529d3 100644
--- a/src/com/android/settings/accessibility/CaptionAppearanceFragment.java
+++ b/src/com/android/settings/accessibility/CaptionAppearanceFragment.java
@@ -16,45 +16,29 @@
package com.android.settings.accessibility;
-import static com.android.settings.accessibility.AccessibilityUtil.State.ON;
-
import android.app.settings.SettingsEnums;
import android.content.ContentResolver;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Color;
import android.os.Bundle;
-import android.os.Handler;
-import android.os.Looper;
import android.provider.Settings;
-import android.view.View;
import android.view.accessibility.CaptioningManager;
-import androidx.preference.ListPreference;
-import androidx.preference.Preference;
-import androidx.preference.Preference.OnPreferenceChangeListener;
import androidx.preference.PreferenceCategory;
-import com.android.internal.widget.SubtitleView;
import com.android.settings.R;
import com.android.settings.accessibility.ListDialogPreference.OnValueChangedListener;
import com.android.settings.dashboard.DashboardFragment;
import com.android.settings.search.BaseSearchIndexProvider;
-import com.android.settingslib.accessibility.AccessibilityUtils;
import com.android.settingslib.search.SearchIndexable;
-import com.android.settingslib.widget.LayoutPreference;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Locale;
/** Settings fragment containing font style of captioning properties. */
@SearchIndexable(forTarget = SearchIndexable.ALL & ~SearchIndexable.ARC)
public class CaptionAppearanceFragment extends DashboardFragment
- implements OnPreferenceChangeListener, OnValueChangedListener {
+ implements OnValueChangedListener {
private static final String TAG = "CaptionAppearanceFragment";
- private static final String PREF_CAPTION_PREVIEW = "caption_preview";
private static final String PREF_BACKGROUND_COLOR = "captioning_background_color";
private static final String PREF_BACKGROUND_OPACITY = "captioning_background_opacity";
private static final String PREF_FOREGROUND_COLOR = "captioning_foreground_color";
@@ -63,25 +47,16 @@
private static final String PREF_WINDOW_OPACITY = "captioning_window_opacity";
private static final String PREF_EDGE_COLOR = "captioning_edge_color";
private static final String PREF_EDGE_TYPE = "captioning_edge_type";
- private static final String PREF_FONT_SIZE = "captioning_font_size";
- private static final String PREF_TYPEFACE = "captioning_typeface";
private static final String PREF_PRESET = "captioning_preset";
private static final String PREF_CUSTOM = "custom";
- /* WebVtt specifies line height as 5.3% of the viewport height. */
- private static final float LINE_HEIGHT_RATIO = 0.0533f;
-
private CaptioningManager mCaptioningManager;
- private SubtitleView mPreviewText;
- private View mPreviewWindow;
- private View mPreviewViewport;
+ private CaptionHelper mCaptionHelper;
// Standard options.
- private ListPreference mFontSize;
private PresetPreference mPreset;
// Custom options.
- private ListPreference mTypeface;
private ColorPreference mForegroundColor;
private ColorPreference mForegroundOpacity;
private EdgeTypePreference mEdgeType;
@@ -94,20 +69,6 @@
private boolean mShowingCustom;
- private final List<Preference> mPreferenceList = new ArrayList<>();
-
- private final Handler mHandler = new Handler(Looper.getMainLooper());
- private final View.OnLayoutChangeListener mLayoutChangeListener =
- new View.OnLayoutChangeListener() {
- @Override
- public void onLayoutChange(View v, int left, int top, int right, int bottom,
- int oldLeft, int oldTop, int oldRight, int oldBottom) {
- // Remove the listener once the callback is triggered.
- mPreviewViewport.removeOnLayoutChangeListener(this);
- mHandler.post(() ->refreshPreviewText());
- }
- };
-
@Override
public int getMetricsCategory() {
return SettingsEnums.ACCESSIBILITY_CAPTION_APPEARANCE;
@@ -118,12 +79,12 @@
super.onCreatePreferences(savedInstanceState, rootKey);
mCaptioningManager = (CaptioningManager) getSystemService(Context.CAPTIONING_SERVICE);
+ mCaptionHelper = new CaptionHelper(getContext());
initializeAllPreferences();
updateAllPreferences();
refreshShowingCustom();
installUpdateListeners();
- refreshPreviewText();
}
@Override
@@ -136,83 +97,7 @@
return TAG;
}
- private void refreshPreviewText() {
- final Context context = getActivity();
- if (context == null) {
- // We've been destroyed, abort!
- return;
- }
-
- final SubtitleView preview = mPreviewText;
- if (preview != null) {
- final int styleId = mCaptioningManager.getRawUserStyle();
- applyCaptionProperties(mCaptioningManager, preview, mPreviewViewport, styleId);
-
- final Locale locale = mCaptioningManager.getLocale();
- if (locale != null) {
- final CharSequence localizedText = AccessibilityUtils.getTextForLocale(
- context, locale, R.string.captioning_preview_text);
- preview.setText(localizedText);
- } else {
- preview.setText(R.string.captioning_preview_text);
- }
-
- final CaptioningManager.CaptionStyle style = mCaptioningManager.getUserStyle();
- if (style.hasWindowColor()) {
- mPreviewWindow.setBackgroundColor(style.windowColor);
- } else {
- final CaptioningManager.CaptionStyle defStyle =
- CaptioningManager.CaptionStyle.DEFAULT;
- mPreviewWindow.setBackgroundColor(defStyle.windowColor);
- }
- }
- }
-
- /**
- * Updates font style of captioning properties for preview screen.
- *
- * @param manager caption manager
- * @param previewText preview text
- * @param previewWindow preview window
- * @param styleId font style id
- */
- public static void applyCaptionProperties(CaptioningManager manager, SubtitleView previewText,
- View previewWindow, int styleId) {
- previewText.setStyle(styleId);
-
- final Context context = previewText.getContext();
- final ContentResolver cr = context.getContentResolver();
- final float fontScale = manager.getFontScale();
- if (previewWindow != null) {
- // Assume the viewport is clipped with a 16:9 aspect ratio.
- final float virtualHeight = Math.max(9 * previewWindow.getWidth(),
- 16 * previewWindow.getHeight()) / 16.0f;
- previewText.setTextSize(virtualHeight * LINE_HEIGHT_RATIO * fontScale);
- } else {
- final float textSize = context.getResources().getDimension(
- R.dimen.caption_preview_text_size);
- previewText.setTextSize(textSize * fontScale);
- }
-
- final Locale locale = manager.getLocale();
- if (locale != null) {
- final CharSequence localizedText = AccessibilityUtils.getTextForLocale(
- context, locale, R.string.captioning_preview_characters);
- previewText.setText(localizedText);
- } else {
- previewText.setText(R.string.captioning_preview_characters);
- }
- }
-
private void initializeAllPreferences() {
- final LayoutPreference captionPreview = findPreference(PREF_CAPTION_PREVIEW);
-
- mPreviewText = captionPreview.findViewById(R.id.preview_text);
-
- mPreviewWindow = captionPreview.findViewById(R.id.preview_window);
-
- mPreviewViewport = captionPreview.findViewById(R.id.preview_viewport);
- mPreviewViewport.addOnLayoutChangeListener(mLayoutChangeListener);
final Resources res = getResources();
final int[] presetValues = res.getIntArray(R.array.captioning_preset_selector_values);
@@ -221,12 +106,6 @@
mPreset.setValues(presetValues);
mPreset.setTitles(presetTitles);
- mFontSize = (ListPreference) findPreference(PREF_FONT_SIZE);
-
- // Initialize the preference list
- mPreferenceList.add(mFontSize);
- mPreferenceList.add(mPreset);
-
mCustom = (PreferenceCategory) findPreference(PREF_CUSTOM);
mShowingCustom = true;
@@ -271,7 +150,6 @@
mWindowOpacity.setValues(opacityValues);
mEdgeType = (EdgeTypePreference) mCustom.findPreference(PREF_EDGE_TYPE);
- mTypeface = (ListPreference) mCustom.findPreference(PREF_TYPEFACE);
}
private void installUpdateListeners() {
@@ -284,18 +162,12 @@
mWindowColor.setOnValueChangedListener(this);
mWindowOpacity.setOnValueChangedListener(this);
mEdgeType.setOnValueChangedListener(this);
-
- mTypeface.setOnPreferenceChangeListener(this);
- mFontSize.setOnPreferenceChangeListener(this);
}
private void updateAllPreferences() {
final int preset = mCaptioningManager.getRawUserStyle();
mPreset.setValue(preset);
- final float fontSize = mCaptioningManager.getFontScale();
- mFontSize.setValue(Float.toString(fontSize));
-
final ContentResolver cr = getContentResolver();
final CaptioningManager.CaptionStyle attrs = CaptioningManager.CaptionStyle.getCustomStyle(
cr);
@@ -313,9 +185,6 @@
final int windowColor = attrs.hasWindowColor() ? attrs.windowColor
: CaptioningManager.CaptionStyle.COLOR_UNSPECIFIED;
parseColorOpacity(mWindowColor, mWindowOpacity, windowColor);
-
- final String rawTypeface = attrs.mRawTypeface;
- mTypeface.setValue(rawTypeface == null ? "" : rawTypeface);
}
/**
@@ -400,36 +269,7 @@
} else if (mEdgeType == preference) {
Settings.Secure.putInt(cr, Settings.Secure.ACCESSIBILITY_CAPTIONING_EDGE_TYPE, value);
}
-
- refreshPreviewText();
- enableCaptioningManager();
- }
-
- @Override
- public boolean onPreferenceChange(Preference preference, Object value) {
- final ContentResolver cr = getActivity().getContentResolver();
- if (mTypeface == preference) {
- Settings.Secure.putString(
- cr, Settings.Secure.ACCESSIBILITY_CAPTIONING_TYPEFACE, (String) value);
- refreshPreviewText();
- enableCaptioningManager();
- } else if (mFontSize == preference) {
- Settings.Secure.putFloat(
- cr, Settings.Secure.ACCESSIBILITY_CAPTIONING_FONT_SCALE,
- Float.parseFloat((String) value));
- refreshPreviewText();
- enableCaptioningManager();
- }
-
- return true;
- }
-
- private void enableCaptioningManager() {
- if (mCaptioningManager.isEnabled()) {
- return;
- }
- Settings.Secure.putInt(getContentResolver(),
- Settings.Secure.ACCESSIBILITY_CAPTIONING_ENABLED, ON);
+ mCaptionHelper.setEnabled(true);
}
@Override
diff --git a/src/com/android/settings/accessibility/CaptionFontSizeController.java b/src/com/android/settings/accessibility/CaptionFontSizeController.java
new file mode 100644
index 0000000..a8cdce5
--- /dev/null
+++ b/src/com/android/settings/accessibility/CaptionFontSizeController.java
@@ -0,0 +1,68 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.accessibility;
+
+import android.content.ContentResolver;
+import android.content.Context;
+import android.provider.Settings;
+import android.view.accessibility.CaptioningManager;
+
+import androidx.preference.ListPreference;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceScreen;
+
+import com.android.settings.core.BasePreferenceController;
+
+/** Preference controller for caption font size. */
+public class CaptionFontSizeController extends BasePreferenceController
+ implements Preference.OnPreferenceChangeListener {
+
+ private final CaptioningManager mCaptioningManager;
+ private final CaptionHelper mCaptionHelper;
+ private ListPreference mPreference;
+
+ public CaptionFontSizeController(Context context, String preferenceKey) {
+ super(context, preferenceKey);
+ mCaptioningManager = context.getSystemService(CaptioningManager.class);
+ mCaptionHelper = new CaptionHelper(context);
+ }
+
+ @Override
+ public int getAvailabilityStatus() {
+ return AVAILABLE;
+ }
+
+ @Override
+ public void displayPreference(PreferenceScreen screen) {
+ super.displayPreference(screen);
+ mPreference = screen.findPreference(getPreferenceKey());
+
+ final float fontSize = mCaptioningManager.getFontScale();
+ mPreference.setValue(Float.toString(fontSize));
+ }
+
+ @Override
+ public boolean onPreferenceChange(Preference preference, Object newValue) {
+ final ContentResolver cr = mContext.getContentResolver();
+ Settings.Secure.putFloat(
+ cr, Settings.Secure.ACCESSIBILITY_CAPTIONING_FONT_SCALE,
+ Float.parseFloat((String) newValue));
+ mPreference.setValue((String) newValue);
+ mCaptionHelper.setEnabled(true);
+ return false;
+ }
+}
diff --git a/src/com/android/settings/accessibility/CaptionHelper.java b/src/com/android/settings/accessibility/CaptionHelper.java
new file mode 100644
index 0000000..c833272
--- /dev/null
+++ b/src/com/android/settings/accessibility/CaptionHelper.java
@@ -0,0 +1,107 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.accessibility;
+
+import static com.android.settings.accessibility.AccessibilityUtil.State.OFF;
+import static com.android.settings.accessibility.AccessibilityUtil.State.ON;
+
+import android.content.Context;
+import android.provider.Settings;
+import android.view.View;
+import android.view.accessibility.CaptioningManager;
+
+import com.android.internal.widget.SubtitleView;
+import com.android.settings.R;
+import com.android.settingslib.accessibility.AccessibilityUtils;
+
+import com.google.common.annotations.VisibleForTesting;
+
+import java.util.Locale;
+
+/**
+ * Helper class for caption.
+ */
+public class CaptionHelper {
+
+ /* WebVtt specifies line height as 5.3% of the viewport height. */
+ @VisibleForTesting
+ static final float LINE_HEIGHT_RATIO = 0.0533f;
+
+ private final Context mContext;
+ private final CaptioningManager mCaptioningManager;
+
+ public CaptionHelper(Context context) {
+ mContext = context;
+ mCaptioningManager = context.getSystemService(CaptioningManager.class);
+ }
+
+ /**
+ * Sets the user's preferred captioning enabled state.
+ *
+ * @param enabled Whether to enable or disable captioning manager.
+ */
+ public void setEnabled(boolean enabled) {
+ if (isEnabled() == enabled) {
+ return;
+ }
+
+ Settings.Secure.putInt(mContext.getContentResolver(),
+ Settings.Secure.ACCESSIBILITY_CAPTIONING_ENABLED, enabled ? ON : OFF);
+ }
+
+ /**
+ * Gets if the captioning manager is enabled.
+ *
+ * @return True if the captioning manager is enabled, false otherwise.
+ */
+ public boolean isEnabled() {
+ return mCaptioningManager.isEnabled();
+ }
+
+ /**
+ * Updates font style of captioning properties for preview screen.
+ *
+ * @param previewText preview text
+ * @param previewWindow preview window
+ * @param styleId font style id
+ */
+ public void applyCaptionProperties(SubtitleView previewText, View previewWindow,
+ int styleId) {
+ previewText.setStyle(styleId);
+
+ final float fontScale = mCaptioningManager.getFontScale();
+ if (previewWindow != null) {
+ // Assume the viewport is clipped with a 16:9 aspect ratio.
+ final float virtualHeight = Math.max(9 * previewWindow.getWidth(),
+ 16 * previewWindow.getHeight()) / 16.0f;
+ previewText.setTextSize(virtualHeight * LINE_HEIGHT_RATIO * fontScale);
+ } else {
+ final float textSize = mContext.getResources().getDimension(
+ R.dimen.caption_preview_text_size);
+ previewText.setTextSize(textSize * fontScale);
+ }
+
+ final Locale locale = mCaptioningManager.getLocale();
+ if (locale != null) {
+ final CharSequence localizedText = AccessibilityUtils.getTextForLocale(
+ mContext, locale, R.string.captioning_preview_characters);
+ previewText.setText(localizedText);
+ } else {
+ previewText.setText(R.string.captioning_preview_characters);
+ }
+ }
+}
diff --git a/src/com/android/settings/accessibility/CaptionPreviewPreferenceController.java b/src/com/android/settings/accessibility/CaptionPreviewPreferenceController.java
new file mode 100644
index 0000000..a8187f1
--- /dev/null
+++ b/src/com/android/settings/accessibility/CaptionPreviewPreferenceController.java
@@ -0,0 +1,135 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.accessibility;
+
+import android.content.Context;
+import android.os.Handler;
+import android.os.Looper;
+import android.provider.Settings;
+import android.view.View;
+import android.view.accessibility.CaptioningManager;
+
+import androidx.annotation.VisibleForTesting;
+import androidx.preference.PreferenceScreen;
+
+import com.android.internal.widget.SubtitleView;
+import com.android.settings.R;
+import com.android.settings.core.BasePreferenceController;
+import com.android.settingslib.accessibility.AccessibilityUtils;
+import com.android.settingslib.core.lifecycle.LifecycleObserver;
+import com.android.settingslib.core.lifecycle.events.OnStart;
+import com.android.settingslib.core.lifecycle.events.OnStop;
+import com.android.settingslib.widget.LayoutPreference;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Locale;
+
+/** Controller that shows the caption locale summary. */
+public class CaptionPreviewPreferenceController extends BasePreferenceController
+ implements LifecycleObserver, OnStart, OnStop {
+
+ @VisibleForTesting
+ static final List<String> CAPTIONING_FEATURE_KEYS = Arrays.asList(
+ Settings.Secure.ACCESSIBILITY_CAPTIONING_FOREGROUND_COLOR,
+ Settings.Secure.ACCESSIBILITY_CAPTIONING_BACKGROUND_COLOR,
+ Settings.Secure.ACCESSIBILITY_CAPTIONING_WINDOW_COLOR,
+ Settings.Secure.ACCESSIBILITY_CAPTIONING_EDGE_COLOR,
+ Settings.Secure.ACCESSIBILITY_CAPTIONING_PRESET,
+ Settings.Secure.ACCESSIBILITY_CAPTIONING_EDGE_TYPE,
+ Settings.Secure.ACCESSIBILITY_CAPTIONING_TYPEFACE,
+ Settings.Secure.ACCESSIBILITY_CAPTIONING_FONT_SCALE
+ );
+ private final Handler mHandler = new Handler(Looper.getMainLooper());
+ @VisibleForTesting
+ AccessibilitySettingsContentObserver mSettingsContentObserver;
+ private CaptioningManager mCaptioningManager;
+ private CaptionHelper mCaptionHelper;
+ private LayoutPreference mPreference;
+ private SubtitleView mPreviewText;
+ private View mPreviewWindow;
+ private View mPreviewViewport;
+
+ public CaptionPreviewPreferenceController(Context context, String preferenceKey) {
+ super(context, preferenceKey);
+ mCaptioningManager = context.getSystemService(CaptioningManager.class);
+ mCaptionHelper = new CaptionHelper(context);
+ mSettingsContentObserver = new AccessibilitySettingsContentObserver(mHandler);
+ mSettingsContentObserver.registerKeysToObserverCallback(CAPTIONING_FEATURE_KEYS,
+ key -> refreshPreviewText());
+ }
+
+ @Override
+ public void onStart() {
+ mSettingsContentObserver.register(mContext.getContentResolver());
+ }
+
+ @Override
+ public void onStop() {
+ mContext.getContentResolver().unregisterContentObserver(mSettingsContentObserver);
+ }
+
+ @Override
+ public int getAvailabilityStatus() {
+ return AVAILABLE;
+ }
+
+ @Override
+ public void displayPreference(PreferenceScreen screen) {
+ super.displayPreference(screen);
+ mPreference = screen.findPreference(getPreferenceKey());
+ mPreviewText = mPreference.findViewById(R.id.preview_text);
+ mPreviewWindow = mPreference.findViewById(R.id.preview_window);
+ mPreviewViewport = mPreference.findViewById(R.id.preview_viewport);
+ mPreviewViewport.addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
+ @Override
+ public void onLayoutChange(View v, int left, int top, int right,
+ int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {
+ if ((oldRight - oldLeft) != (right - left)) {
+ // Remove the listener once the callback is triggered.
+ mPreviewViewport.removeOnLayoutChangeListener(this);
+ mHandler.post(() -> refreshPreviewText());
+ }
+ }
+ });
+ }
+
+ private void refreshPreviewText() {
+ if (mPreviewText != null) {
+ final int styleId = mCaptioningManager.getRawUserStyle();
+ mCaptionHelper.applyCaptionProperties(mPreviewText, mPreviewViewport, styleId);
+
+ final Locale locale = mCaptioningManager.getLocale();
+ if (locale != null) {
+ final CharSequence localizedText = AccessibilityUtils.getTextForLocale(
+ mContext, locale, R.string.captioning_preview_text);
+ mPreviewText.setText(localizedText);
+ } else {
+ mPreviewText.setText(R.string.captioning_preview_text);
+ }
+
+ final CaptioningManager.CaptionStyle style = mCaptioningManager.getUserStyle();
+ if (style.hasWindowColor()) {
+ mPreviewWindow.setBackgroundColor(style.windowColor);
+ } else {
+ final CaptioningManager.CaptionStyle defStyle =
+ CaptioningManager.CaptionStyle.DEFAULT;
+ mPreviewWindow.setBackgroundColor(defStyle.windowColor);
+ }
+ }
+ }
+}
diff --git a/src/com/android/settings/accessibility/CaptionTogglePreferenceController.java b/src/com/android/settings/accessibility/CaptionTogglePreferenceController.java
index d0ea1f9..bc305c1 100644
--- a/src/com/android/settings/accessibility/CaptionTogglePreferenceController.java
+++ b/src/com/android/settings/accessibility/CaptionTogglePreferenceController.java
@@ -16,12 +16,7 @@
package com.android.settings.accessibility;
-import static com.android.settings.accessibility.AccessibilityUtil.State.OFF;
-import static com.android.settings.accessibility.AccessibilityUtil.State.ON;
-
import android.content.Context;
-import android.provider.Settings;
-import android.view.accessibility.CaptioningManager;
import android.widget.Switch;
import androidx.preference.PreferenceScreen;
@@ -35,11 +30,11 @@
public class CaptionTogglePreferenceController extends TogglePreferenceController
implements OnMainSwitchChangeListener {
- private final CaptioningManager mCaptioningManager;
+ private final CaptionHelper mCaptionHelper;
public CaptionTogglePreferenceController(Context context, String preferenceKey) {
super(context, preferenceKey);
- mCaptioningManager = context.getSystemService(CaptioningManager.class);
+ mCaptionHelper = new CaptionHelper(context);
}
@Override
@@ -49,13 +44,12 @@
@Override
public boolean isChecked() {
- return mCaptioningManager.isEnabled();
+ return mCaptionHelper.isEnabled();
}
@Override
public boolean setChecked(boolean isChecked) {
- Settings.Secure.putInt(mContext.getContentResolver(),
- Settings.Secure.ACCESSIBILITY_CAPTIONING_ENABLED, isChecked ? ON : OFF);
+ mCaptionHelper.setEnabled(isChecked);
return true;
}
diff --git a/src/com/android/settings/accessibility/CaptionTypefaceController.java b/src/com/android/settings/accessibility/CaptionTypefaceController.java
new file mode 100644
index 0000000..44049b0
--- /dev/null
+++ b/src/com/android/settings/accessibility/CaptionTypefaceController.java
@@ -0,0 +1,67 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.accessibility;
+
+import android.content.ContentResolver;
+import android.content.Context;
+import android.provider.Settings;
+import android.view.accessibility.CaptioningManager.CaptionStyle;
+
+import androidx.preference.ListPreference;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceScreen;
+
+import com.android.settings.core.BasePreferenceController;
+
+/** Preference controller for caption type face. */
+public class CaptionTypefaceController extends BasePreferenceController
+ implements Preference.OnPreferenceChangeListener {
+
+ private final CaptionHelper mCaptionHelper;
+ private ListPreference mPreference;
+
+ public CaptionTypefaceController(Context context, String preferenceKey) {
+ super(context, preferenceKey);
+ mCaptionHelper = new CaptionHelper(context);
+ }
+
+ @Override
+ public int getAvailabilityStatus() {
+ return AVAILABLE;
+ }
+
+ @Override
+ public void displayPreference(PreferenceScreen screen) {
+ super.displayPreference(screen);
+ mPreference = screen.findPreference(getPreferenceKey());
+
+ final ContentResolver cr = mContext.getContentResolver();
+ final CaptionStyle attrs = CaptionStyle.getCustomStyle(cr);
+ final String rawTypeface = attrs.mRawTypeface;
+ mPreference.setValue(rawTypeface == null ? "" : rawTypeface);
+ }
+
+ @Override
+ public boolean onPreferenceChange(Preference preference, Object newValue) {
+ final ContentResolver cr = mContext.getContentResolver();
+ Settings.Secure.putString(
+ cr, Settings.Secure.ACCESSIBILITY_CAPTIONING_TYPEFACE, (String) newValue);
+ mPreference.setValue((String) newValue);
+ mCaptionHelper.setEnabled(true);
+ return false;
+ }
+}
diff --git a/src/com/android/settings/accessibility/DividerAllowedBelowPreference.java b/src/com/android/settings/accessibility/DividerAllowedBelowPreference.java
deleted file mode 100644
index 1be281f..0000000
--- a/src/com/android/settings/accessibility/DividerAllowedBelowPreference.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settings.accessibility;
-
-import android.content.Context;
-import android.util.AttributeSet;
-
-import androidx.preference.Preference;
-import androidx.preference.PreferenceViewHolder;
-
-/*
- * Preference that always has a divider below. Used for SUW Accessibility Settings Summary text.
- */
-public class DividerAllowedBelowPreference extends Preference {
- public DividerAllowedBelowPreference(Context context) {
- super(context);
- }
-
- public DividerAllowedBelowPreference(Context context, AttributeSet attrs) {
- super(context, attrs);
- }
-
- public DividerAllowedBelowPreference(Context context, AttributeSet attrs, int defStyleAttrs) {
- super(context, attrs, defStyleAttrs);
- }
-
- @Override
- public void onBindViewHolder(PreferenceViewHolder holder) {
- super.onBindViewHolder(holder);
- holder.setDividerAllowedBelow(true);
- }
-}
-
diff --git a/src/com/android/settings/accessibility/DividerSwitchPreference.java b/src/com/android/settings/accessibility/DividerSwitchPreference.java
deleted file mode 100644
index 2c44789..0000000
--- a/src/com/android/settings/accessibility/DividerSwitchPreference.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settings.accessibility;
-
-import android.content.Context;
-import android.view.View;
-
-import androidx.preference.PreferenceViewHolder;
-import androidx.preference.SwitchPreference;
-
-/**
- * A switch preference that has a divider below and above. Used for Accessibility Settings use
- * service.
- */
-public final class DividerSwitchPreference extends SwitchPreference {
-
- private Boolean mDividerAllowedAbove;
- private Boolean mDividerAllowBelow;
- private int mSwitchVisibility;
-
- public DividerSwitchPreference(Context context) {
- super(context);
- mDividerAllowedAbove = true;
- mDividerAllowBelow = true;
- mSwitchVisibility = View.VISIBLE;
- }
-
- @Override
- public void onBindViewHolder(PreferenceViewHolder holder) {
- super.onBindViewHolder(holder);
- holder.setDividerAllowedAbove(mDividerAllowedAbove);
- holder.setDividerAllowedBelow(mDividerAllowBelow);
-
- final View switchView = holder.itemView.findViewById(android.R.id.widget_frame);
- if (switchView != null) {
- switchView.setVisibility(mSwitchVisibility);
- }
- }
-
- /**
- * Sets divider whether to show in preference above.
- *
- * @param allowed true will be drawn on above this item
- */
- public void setDividerAllowedAbove(boolean allowed) {
- if (mDividerAllowedAbove != allowed) {
- mDividerAllowedAbove = allowed;
- notifyChanged();
- }
- }
-
- /**
- * Sets divider whether to show in preference below.
- *
- * @param allowed true will be drawn on below this item
- */
- public void setDividerAllowedBelow(boolean allowed) {
- if (mDividerAllowedAbove != allowed) {
- mDividerAllowBelow = allowed;
- notifyChanged();
- }
- }
-
- /**
- * Sets the visibility state of Settings view.
- *
- * @param visibility one of {@link View#VISIBLE}, {@link View#INVISIBLE}, or {@link View#GONE}.
- */
- public void setSwitchVisibility(@View.Visibility int visibility) {
- if (mSwitchVisibility != visibility) {
- mSwitchVisibility = visibility;
- notifyChanged();
- }
- }
-}
diff --git a/src/com/android/settings/accessibility/LaunchAccessibilityActivityPreferenceFragment.java b/src/com/android/settings/accessibility/LaunchAccessibilityActivityPreferenceFragment.java
index 3adef6d..1f8374d 100644
--- a/src/com/android/settings/accessibility/LaunchAccessibilityActivityPreferenceFragment.java
+++ b/src/com/android/settings/accessibility/LaunchAccessibilityActivityPreferenceFragment.java
@@ -49,9 +49,11 @@
/** Fragment for providing open activity button. */
public class LaunchAccessibilityActivityPreferenceFragment extends ToggleFeaturePreferenceFragment {
- private static final String TAG = "LaunchA11yActivity";
+
+ private static final String TAG = "LaunchAccessibilityActivityPreferenceFragment";
private static final String EMPTY_STRING = "";
protected static final String KEY_LAUNCH_PREFERENCE = "launch_preference";
+
private ComponentName mTileComponentName;
@Override
@@ -70,10 +72,10 @@
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
- final View view = super.onCreateView(inflater, container, savedInstanceState);
-
// Init new preference to replace the switch preference instead.
initLaunchPreference();
+
+ final View view = super.onCreateView(inflater, container, savedInstanceState);
removePreference(KEY_USE_SERVICE_PREFERENCE);
return view;
}
@@ -173,6 +175,7 @@
/** Customizes the order by preference key. */
protected List<String> getPreferenceOrderList() {
final List<String> lists = new ArrayList<>();
+ lists.add(KEY_TOP_INTRO_PREFERENCE);
lists.add(KEY_ANIMATED_IMAGE);
lists.add(KEY_LAUNCH_PREFERENCE);
lists.add(KEY_GENERAL_CATEGORY);
@@ -230,4 +233,15 @@
return settingsIntent;
}
+
+ @Override
+ protected int getPreferenceScreenResId() {
+ // TODO(b/171272809): Add back when controllers move to static type
+ return 0;
+ }
+
+ @Override
+ protected String getLogTag() {
+ return TAG;
+ }
}
diff --git a/src/com/android/settings/accessibility/PresetPreference.java b/src/com/android/settings/accessibility/PresetPreference.java
index 680fcbc..a0ef7b6 100644
--- a/src/com/android/settings/accessibility/PresetPreference.java
+++ b/src/com/android/settings/accessibility/PresetPreference.java
@@ -19,26 +19,24 @@
import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
-import android.view.accessibility.CaptioningManager;
import android.view.accessibility.CaptioningManager.CaptionStyle;
import android.widget.TextView;
import com.android.internal.widget.SubtitleView;
import com.android.settings.R;
+/** Grid preference that allows the user to pick a captioning preset type. */
public class PresetPreference extends ListDialogPreference {
- private static final float DEFAULT_FONT_SIZE = 32f;
- private final CaptioningManager mCaptioningManager;
+ private static final float DEFAULT_FONT_SIZE = 32f;
+ private final CaptionHelper mCaptionHelper;
public PresetPreference(Context context, AttributeSet attrs) {
super(context, attrs);
+ mCaptionHelper = new CaptionHelper(context);
setDialogLayoutResource(R.layout.grid_picker_dialog);
setListItemLayoutResource(R.layout.preset_picker_item);
-
- mCaptioningManager = (CaptioningManager) context.getSystemService(
- Context.CAPTIONING_SERVICE);
}
@Override
@@ -50,17 +48,16 @@
@Override
protected void onBindListItem(View view, int index) {
final View previewViewport = view.findViewById(R.id.preview_viewport);
- final SubtitleView previewText = (SubtitleView) view.findViewById(R.id.preview);
+ final SubtitleView previewText = view.findViewById(R.id.preview);
final int value = getValueAt(index);
- CaptionAppearanceFragment.applyCaptionProperties(
- mCaptioningManager, previewText, previewViewport, value);
+ mCaptionHelper.applyCaptionProperties(previewText, previewViewport, value);
final float density = getContext().getResources().getDisplayMetrics().density;
previewText.setTextSize(DEFAULT_FONT_SIZE * density);
final CharSequence title = getTitleAt(index);
if (title != null) {
- final TextView summary = (TextView) view.findViewById(R.id.summary);
+ final TextView summary = view.findViewById(R.id.summary);
summary.setText(title);
}
}
diff --git a/src/com/android/settings/accessibility/ToggleAccessibilityServicePreferenceFragment.java b/src/com/android/settings/accessibility/ToggleAccessibilityServicePreferenceFragment.java
index e314036..f1c0202 100644
--- a/src/com/android/settings/accessibility/ToggleAccessibilityServicePreferenceFragment.java
+++ b/src/com/android/settings/accessibility/ToggleAccessibilityServicePreferenceFragment.java
@@ -61,9 +61,7 @@
private static final String TAG = "ToggleAccessibilityServicePreferenceFragment";
private static final String KEY_HAS_LOGGED = "has_logged";
- private AtomicBoolean mIsDialogShown = new AtomicBoolean(/* initialValue= */ false);
-
- private static final String EMPTY_STRING = "";
+ private final AtomicBoolean mIsDialogShown = new AtomicBoolean(/* initialValue= */ false);
private Dialog mWarningDialog;
private ComponentName mTileComponentName;
@@ -85,7 +83,7 @@
}
@Override
- public void onCreateOptionsMenu(Menu menu, MenuInflater infalter) {
+ public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
// Do not call super. We don't want to see the "Help & feedback" option on this page so as
// not to confuse users who think they might be able to send feedback about a specific
// accessibility service from this page.
@@ -126,11 +124,6 @@
}
@Override
- public void onPause() {
- super.onPause();
- }
-
- @Override
public void onSaveInstanceState(Bundle outState) {
if (mStartTimeMillsForLogging > 0) {
outState.putBoolean(KEY_HAS_LOGGED, mDisabledStateLogged);
@@ -148,10 +141,8 @@
AccessibilityUtils.setAccessibilityServiceState(getPrefContext(), toggledService, enabled);
}
- // IMPORTANT: Refresh the info since there are dynamically changing
- // capabilities. For
- // example, before JellyBean MR2 the user was granting the explore by touch
- // one.
+ // IMPORTANT: Refresh the info since there are dynamically changing capabilities. For
+ // example, before JellyBean MR2 the user was granting the explore by touch one.
@Nullable
AccessibilityServiceInfo getAccessibilityServiceInfo() {
final List<AccessibilityServiceInfo> infos = AccessibilityManager.getInstance(
@@ -454,6 +445,17 @@
unregisterPackageRemoveReceiver();
}
+ @Override
+ protected int getPreferenceScreenResId() {
+ // TODO(b/171272809): Add back when controllers move to static type
+ return 0;
+ }
+
+ @Override
+ protected String getLogTag() {
+ return TAG;
+ }
+
private void onAllowButtonFromEnableToggleClicked() {
handleConfirmServiceEnabled(/* confirmed= */ true);
if (isServiceSupportAccessibilityButton()) {
diff --git a/src/com/android/settings/accessibility/ToggleColorInversionPreferenceFragment.java b/src/com/android/settings/accessibility/ToggleColorInversionPreferenceFragment.java
index 5b85c44..927729e 100644
--- a/src/com/android/settings/accessibility/ToggleColorInversionPreferenceFragment.java
+++ b/src/com/android/settings/accessibility/ToggleColorInversionPreferenceFragment.java
@@ -34,19 +34,50 @@
import com.android.settings.R;
import com.android.settings.accessibility.AccessibilityUtil.QuickSettingsTooltipType;
+import com.android.settings.search.BaseSearchIndexProvider;
import com.android.settings.widget.SettingsMainSwitchPreference;
+import com.android.settingslib.search.SearchIndexable;
import java.util.ArrayList;
import java.util.List;
/** Settings page for color inversion. */
+@SearchIndexable(forTarget = SearchIndexable.ALL & ~SearchIndexable.ARC)
public class ToggleColorInversionPreferenceFragment extends ToggleFeaturePreferenceFragment {
+ private static final String TAG = "ToggleColorInversionPreferenceFragment";
private static final String ENABLED = Settings.Secure.ACCESSIBILITY_DISPLAY_INVERSION_ENABLED;
@Override
- public void onActivityCreated(Bundle savedInstanceState) {
- super.onActivityCreated(savedInstanceState);
+ protected void registerKeysToObserverCallback(
+ AccessibilitySettingsContentObserver contentObserver) {
+ super.registerKeysToObserverCallback(contentObserver);
+
+ final List<String> enableServiceFeatureKeys = new ArrayList<>(/* initialCapacity= */ 1);
+ enableServiceFeatureKeys.add(ENABLED);
+ contentObserver.registerKeysToObserverCallback(enableServiceFeatureKeys,
+ key -> updateSwitchBarToggleSwitch());
+ }
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container,
+ Bundle savedInstanceState) {
+ mComponentName = COLOR_INVERSION_COMPONENT_NAME;
+ mPackageName = getText(R.string.accessibility_display_inversion_preference_title);
+ mHtmlDescription = getText(R.string.accessibility_display_inversion_preference_subtitle);
+ mTopIntroTitle = getText(R.string.accessibility_display_inversion_preference_intro_text);
+ mImageUri = new Uri.Builder().scheme(ContentResolver.SCHEME_ANDROID_RESOURCE)
+ .authority(getPrefContext().getPackageName())
+ .appendPath(String.valueOf(R.raw.accessibility_color_inversion_banner))
+ .build();
+ final View view = super.onCreateView(inflater, container, savedInstanceState);
+ updateFooterPreference();
+ return view;
+ }
+
+ @Override
+ public void onViewCreated(View view, Bundle savedInstanceState) {
+ super.onViewCreated(view, savedInstanceState);
final View rootView = getActivity().getWindow().peekDecorView();
if (rootView != null) {
rootView.setAccessibilityPaneTitle(getString(
@@ -79,6 +110,11 @@
}
@Override
+ protected String getLogTag() {
+ return TAG;
+ }
+
+ @Override
protected void onRemoveSwitchPreferenceToggleSwitch() {
super.onRemoveSwitchPreferenceToggleSwitch();
mToggleServiceSwitchPreference.setOnPreferenceClickListener(null);
@@ -94,33 +130,6 @@
return getText(R.string.accessibility_display_inversion_shortcut_title);
}
- @Override
- public View onCreateView(LayoutInflater inflater, ViewGroup container,
- Bundle savedInstanceState) {
- mComponentName = COLOR_INVERSION_COMPONENT_NAME;
- mPackageName = getText(R.string.accessibility_display_inversion_preference_title);
- mHtmlDescription = getText(R.string.accessibility_display_inversion_preference_subtitle);
- mTopIntroTitle = getText(R.string.accessibility_display_inversion_preference_intro_text);
- mImageUri = new Uri.Builder().scheme(ContentResolver.SCHEME_ANDROID_RESOURCE)
- .authority(getPrefContext().getPackageName())
- .appendPath(String.valueOf(R.raw.accessibility_color_inversion_banner))
- .build();
- final View view = super.onCreateView(inflater, container, savedInstanceState);
- updateFooterPreference();
- return view;
- }
-
- @Override
- protected void registerKeysToObserverCallback(
- AccessibilitySettingsContentObserver contentObserver) {
- super.registerKeysToObserverCallback(contentObserver);
-
- final List<String> enableServiceFeatureKeys = new ArrayList<>(/* initialCapacity= */ 1);
- enableServiceFeatureKeys.add(ENABLED);
- contentObserver.registerKeysToObserverCallback(enableServiceFeatureKeys,
- key -> updateSwitchBarToggleSwitch());
- }
-
private void updateFooterPreference() {
final String title = getPrefContext().getString(
R.string.accessibility_color_inversion_about_title);
@@ -173,4 +182,7 @@
}
mToggleServiceSwitchPreference.setChecked(checked);
}
+
+ public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
+ new BaseSearchIndexProvider(R.xml.accessibility_color_inversion_settings);
}
diff --git a/src/com/android/settings/accessibility/ToggleDaltonizerPreferenceFragment.java b/src/com/android/settings/accessibility/ToggleDaltonizerPreferenceFragment.java
index 0e76a6c..5e36100 100644
--- a/src/com/android/settings/accessibility/ToggleDaltonizerPreferenceFragment.java
+++ b/src/com/android/settings/accessibility/ToggleDaltonizerPreferenceFragment.java
@@ -51,6 +51,7 @@
public class ToggleDaltonizerPreferenceFragment extends ToggleFeaturePreferenceFragment
implements DaltonizerRadioButtonPreferenceController.OnChangeListener {
+ private static final String TAG = "ToggleDaltonizerPreferenceFragment";
private static final String ENABLED = Settings.Secure.ACCESSIBILITY_DISPLAY_DALTONIZER_ENABLED;
private static final String KEY_PREVIEW = "daltonizer_preview";
@VisibleForTesting
@@ -70,29 +71,24 @@
final String[] daltonizerKeys = resources.getStringArray(
R.array.daltonizer_mode_keys);
- for (int i = 0; i < daltonizerKeys.length; i++) {
+ for (String daltonizerKey : daltonizerKeys) {
sControllers.add(new DaltonizerRadioButtonPreferenceController(
- context, lifecycle, daltonizerKeys[i]));
+ context, lifecycle, daltonizerKey));
}
}
return sControllers;
}
- @Override
- public void onActivityCreated(Bundle savedInstanceState) {
- super.onActivityCreated(savedInstanceState);
- final View rootView = getActivity().getWindow().peekDecorView();
- if (rootView != null) {
- rootView.setAccessibilityPaneTitle(getString(
- R.string.accessibility_display_daltonizer_preference_title));
- }
- }
@Override
- public void onCheckedChanged(Preference preference) {
- for (AbstractPreferenceController controller : sControllers) {
- controller.updateState(preference);
- }
+ protected void registerKeysToObserverCallback(
+ AccessibilitySettingsContentObserver contentObserver) {
+ super.registerKeysToObserverCallback(contentObserver);
+
+ final List<String> enableServiceFeatureKeys = new ArrayList<>(/* initialCapacity= */ 1);
+ enableServiceFeatureKeys.add(ENABLED);
+ contentObserver.registerKeysToObserverCallback(enableServiceFeatureKeys,
+ key -> updateSwitchBarToggleSwitch());
}
@Override
@@ -108,14 +104,20 @@
}
@Override
- protected void registerKeysToObserverCallback(
- AccessibilitySettingsContentObserver contentObserver) {
- super.registerKeysToObserverCallback(contentObserver);
+ public void onViewCreated(View view, Bundle savedInstanceState) {
+ super.onViewCreated(view, savedInstanceState);
+ final View rootView = getActivity().getWindow().peekDecorView();
+ if (rootView != null) {
+ rootView.setAccessibilityPaneTitle(getString(
+ R.string.accessibility_display_daltonizer_preference_title));
+ }
+ }
- final List<String> enableServiceFeatureKeys = new ArrayList<>(/* initialCapacity= */ 1);
- enableServiceFeatureKeys.add(ENABLED);
- contentObserver.registerKeysToObserverCallback(enableServiceFeatureKeys,
- key -> updateSwitchBarToggleSwitch());
+ @Override
+ public void onCheckedChanged(Preference preference) {
+ for (AbstractPreferenceController controller : sControllers) {
+ controller.updateState(preference);
+ }
}
private void updateFooterPreference() {
@@ -180,6 +182,11 @@
}
@Override
+ protected String getLogTag() {
+ return TAG;
+ }
+
+ @Override
protected void onPreferenceToggled(String preferenceKey, boolean enabled) {
final boolean isEnabled = Settings.Secure.getInt(getContentResolver(), ENABLED, OFF) == ON;
if (enabled == isEnabled) {
diff --git a/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragment.java b/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragment.java
index 39d20c9..e3b9e93 100644
--- a/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragment.java
+++ b/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragment.java
@@ -54,10 +54,10 @@
import com.android.settings.R;
import com.android.settings.SettingsActivity;
-import com.android.settings.SettingsPreferenceFragment;
import com.android.settings.accessibility.AccessibilityDialogUtils.DialogType;
import com.android.settings.accessibility.AccessibilityUtil.QuickSettingsTooltipType;
import com.android.settings.accessibility.AccessibilityUtil.UserShortcutType;
+import com.android.settings.dashboard.DashboardFragment;
import com.android.settings.utils.LocaleUtils;
import com.android.settings.widget.SettingsMainSwitchBar;
import com.android.settings.widget.SettingsMainSwitchPreference;
@@ -76,9 +76,24 @@
* Base class for accessibility fragments with toggle, shortcut, some helper functions
* and dialog management.
*/
-public abstract class ToggleFeaturePreferenceFragment extends SettingsPreferenceFragment
+public abstract class ToggleFeaturePreferenceFragment extends DashboardFragment
implements ShortcutPreference.OnClickCallback, OnMainSwitchChangeListener {
+ public static final String KEY_GENERAL_CATEGORY = "general_categories";
+ public static final String KEY_SHORTCUT_PREFERENCE = "shortcut_preference";
+ public static final int NOT_SET = -1;
+ protected static final String KEY_TOP_INTRO_PREFERENCE = "top_intro";
+ protected static final String KEY_USE_SERVICE_PREFERENCE = "use_service";
+ protected static final String KEY_HTML_DESCRIPTION_PREFERENCE = "html_description";
+ protected static final String KEY_SAVED_USER_SHORTCUT_TYPE = "shortcut_type";
+ protected static final String KEY_SAVED_QS_TOOLTIP_RESHOW = "qs_tooltip_reshow";
+ protected static final String KEY_SAVED_QS_TOOLTIP_TYPE = "qs_tooltip_type";
+ protected static final String KEY_ANIMATED_IMAGE = "animated_image";
+ // For html description of accessibility service, must follow the rule, such as
+ // <img src="R.drawable.fileName"/>, a11y settings will get the resources successfully.
+ private static final String IMG_PREFIX = "R.drawable.";
+ private static final String DRAWABLE_FOLDER = "drawable";
+
protected TopIntroPreference mTopIntroPreference;
protected SettingsMainSwitchPreference mToggleServiceSwitchPreference;
protected ShortcutPreference mShortcutPreference;
@@ -86,28 +101,17 @@
protected AccessibilityFooterPreferenceController mFooterPreferenceController;
protected String mPreferenceKey;
protected Dialog mDialog;
-
protected CharSequence mSettingsTitle;
protected Intent mSettingsIntent;
// The mComponentName maybe null, such as Magnify
protected ComponentName mComponentName;
protected CharSequence mPackageName;
protected Uri mImageUri;
- private CharSequence mDescription;
protected CharSequence mHtmlDescription;
protected CharSequence mTopIntroTitle;
-
- private static final String DRAWABLE_FOLDER = "drawable";
- protected static final String KEY_TOP_INTRO_PREFERENCE = "top_intro";
- protected static final String KEY_USE_SERVICE_PREFERENCE = "use_service";
- public static final String KEY_GENERAL_CATEGORY = "general_categories";
- protected static final String KEY_HTML_DESCRIPTION_PREFERENCE = "html_description";
- public static final String KEY_SHORTCUT_PREFERENCE = "shortcut_preference";
- protected static final String KEY_SAVED_USER_SHORTCUT_TYPE = "shortcut_type";
- protected static final String KEY_SAVED_QS_TOOLTIP_RESHOW = "qs_tooltip_reshow";
- protected static final String KEY_SAVED_QS_TOOLTIP_TYPE = "qs_tooltip_type";
- protected static final String KEY_ANIMATED_IMAGE = "animated_image";
-
+ // Save user's shortcutType value when savedInstance has value (e.g. device rotated).
+ protected int mSavedCheckBoxValue = NOT_SET;
+ private CharSequence mDescription;
private TouchExplorationStateChangeListener mTouchExplorationStateChangeListener;
private AccessibilitySettingsContentObserver mSettingsContentObserver;
@@ -117,18 +121,8 @@
private AccessibilityQuickSettingsTooltipWindow mTooltipWindow;
private boolean mNeedsQSTooltipReshow = false;
private int mNeedsQSTooltipType = QuickSettingsTooltipType.GUIDE_TO_EDIT;
-
- public static final int NOT_SET = -1;
- // Save user's shortcutType value when savedInstance has value (e.g. device rotated).
- protected int mSavedCheckBoxValue = NOT_SET;
private boolean mSavedAccessibilityFloatingMenuEnabled;
-
- // For html description of accessibility service, must follow the rule, such as
- // <img src="R.drawable.fileName"/>, a11y settings will get the resources successfully.
- private static final String IMG_PREFIX = "R.drawable.";
-
private ImageView mImageGetterCacheView;
-
private final Html.ImageGetter mImageGetter = (String str) -> {
if (str != null && str.startsWith(IMG_PREFIX)) {
final String fileName = str.substring(IMG_PREFIX.length());
@@ -143,6 +137,8 @@
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
+
+ onProcessArguments(getArguments());
// Restore the user shortcut type and tooltip.
if (savedInstanceState != null) {
if (savedInstanceState.containsKey(KEY_SAVED_USER_SHORTCUT_TYPE)) {
@@ -188,9 +184,6 @@
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
- // Need to be called as early as possible. Protected variables will be assigned here.
- onProcessArguments(getArguments());
-
initTopIntroPreference();
initAnimatedImagePreference();
initToggleServiceSwitchPreference();
@@ -208,10 +201,34 @@
removeDialog(DialogEnums.EDIT_SHORTCUT);
mShortcutPreference.setSummary(getShortcutTypeSummary(getPrefContext()));
};
+
+ updatePreferenceOrder();
return super.onCreateView(inflater, container, savedInstanceState);
}
@Override
+ public Dialog onCreateDialog(int dialogId) {
+ switch (dialogId) {
+ case DialogEnums.EDIT_SHORTCUT:
+ final int dialogType = WizardManagerHelper.isAnySetupWizard(getIntent())
+ ? DialogType.EDIT_SHORTCUT_GENERIC_SUW : DialogType.EDIT_SHORTCUT_GENERIC;
+ mDialog = AccessibilityDialogUtils.showEditShortcutDialog(
+ getPrefContext(), dialogType, getShortcutTitle(),
+ this::callOnAlertDialogCheckboxClicked);
+ setupEditShortcutDialog(mDialog);
+ return mDialog;
+ case DialogEnums.LAUNCH_ACCESSIBILITY_TUTORIAL:
+ mDialog = AccessibilityGestureNavigationTutorial
+ .createAccessibilityTutorialDialog(getPrefContext(),
+ getUserShortcutTypes(), this::callOnTutorialDialogButtonClicked);
+ mDialog.setCanceledOnTouchOutside(false);
+ return mDialog;
+ default:
+ throw new IllegalArgumentException("Unsupported dialogId " + dialogId);
+ }
+ }
+
+ @Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
@@ -219,8 +236,6 @@
final SettingsMainSwitchBar switchBar = activity.getSwitchBar();
switchBar.hide();
- updatePreferenceOrder();
-
// Reshow tooltip when activity recreate, such as rotate device.
if (mNeedsQSTooltipReshow) {
getView().post(this::showQuickSettingsTooltipIfNeeded);
@@ -268,25 +283,9 @@
}
@Override
- public Dialog onCreateDialog(int dialogId) {
- switch (dialogId) {
- case DialogEnums.EDIT_SHORTCUT:
- final int dialogType = WizardManagerHelper.isAnySetupWizard(getIntent())
- ? DialogType.EDIT_SHORTCUT_GENERIC_SUW : DialogType.EDIT_SHORTCUT_GENERIC;
- mDialog = AccessibilityDialogUtils.showEditShortcutDialog(
- getPrefContext(), dialogType, getShortcutTitle(),
- this::callOnAlertDialogCheckboxClicked);
- setupEditShortcutDialog(mDialog);
- return mDialog;
- case DialogEnums.LAUNCH_ACCESSIBILITY_TUTORIAL:
- mDialog = AccessibilityGestureNavigationTutorial
- .createAccessibilityTutorialDialog(getPrefContext(),
- getUserShortcutTypes(), this::callOnTutorialDialogButtonClicked);
- mDialog.setCanceledOnTouchOutside(false);
- return mDialog;
- default:
- throw new IllegalArgumentException("Unsupported dialogId " + dialogId);
- }
+ public void onDestroyView() {
+ super.onDestroyView();
+ removeActionBarToggleSwitch();
}
@Override
@@ -312,12 +311,6 @@
}
@Override
- public void onDestroyView() {
- super.onDestroyView();
- removeActionBarToggleSwitch();
- }
-
- @Override
public void onSwitchChanged(Switch switchView, boolean isChecked) {
onPreferenceToggled(mPreferenceKey, isChecked);
}
@@ -335,7 +328,7 @@
protected void updateToggleServiceTitle(SettingsMainSwitchPreference switchPreference) {
final CharSequence title =
- getString(R.string.accessibility_service_primary_switch_title, mPackageName);
+ getString(R.string.accessibility_service_primary_switch_title, mPackageName);
switchPreference.setTitle(title);
}
@@ -363,15 +356,6 @@
// Implement this to update the state of switch.
}
- private void installActionBarToggleSwitch() {
- onInstallSwitchPreferenceToggleSwitch();
- }
-
- private void removeActionBarToggleSwitch() {
- mToggleServiceSwitchPreference.setOnPreferenceClickListener(null);
- onRemoveSwitchPreferenceToggleSwitch();
- }
-
public void setTitle(String title) {
getActivity().setTitle(title);
}
@@ -405,15 +389,13 @@
}
}
- /** Customizes the order by preference key. */
- protected List<String> getPreferenceOrderList() {
- final List<String> lists = new ArrayList<>();
- lists.add(KEY_TOP_INTRO_PREFERENCE);
- lists.add(KEY_ANIMATED_IMAGE);
- lists.add(KEY_USE_SERVICE_PREFERENCE);
- lists.add(KEY_GENERAL_CATEGORY);
- lists.add(KEY_HTML_DESCRIPTION_PREFERENCE);
- return lists;
+ private void installActionBarToggleSwitch() {
+ onInstallSwitchPreferenceToggleSwitch();
+ }
+
+ private void removeActionBarToggleSwitch() {
+ mToggleServiceSwitchPreference.setOnPreferenceClickListener(null);
+ onRemoveSwitchPreferenceToggleSwitch();
}
private void updatePreferenceOrder() {
@@ -431,6 +413,17 @@
}
}
+ /** Customizes the order by preference key. */
+ protected List<String> getPreferenceOrderList() {
+ final List<String> lists = new ArrayList<>();
+ lists.add(KEY_TOP_INTRO_PREFERENCE);
+ lists.add(KEY_ANIMATED_IMAGE);
+ lists.add(KEY_USE_SERVICE_PREFERENCE);
+ lists.add(KEY_GENERAL_CATEGORY);
+ lists.add(KEY_HTML_DESCRIPTION_PREFERENCE);
+ return lists;
+ }
+
private Drawable getDrawableFromUri(Uri imageUri) {
if (mImageGetterCacheView == null) {
mImageGetterCacheView = new ImageView(getPrefContext());
@@ -551,7 +544,7 @@
// TODO(b/171272809): Migrate to DashboardFragment.
final String title = getString(R.string.accessibility_introduction_title, mPackageName);
mFooterPreferenceController = new AccessibilityFooterPreferenceController(
- screen.getContext(), htmlFooterPreference.getKey());
+ screen.getContext(), htmlFooterPreference.getKey());
mFooterPreferenceController.setIntroductionTitle(title);
mFooterPreferenceController.displayPreference(screen);
}
@@ -568,8 +561,8 @@
* Creates {@link AccessibilityFooterPreference} and append into {@link PreferenceScreen}
*
* @param screen The preference screen to add the footer preference
- * @param summary The summary of the preference summary.
- * @param introductionTitle The title of introduction in the footer.
+ * @param summary The summary of the preference summary
+ * @param introductionTitle The title of introduction in the footer
*/
@VisibleForTesting
void createFooterPreference(PreferenceScreen screen, CharSequence summary,
@@ -580,7 +573,7 @@
screen.addPreference(footerPreference);
mFooterPreferenceController = new AccessibilityFooterPreferenceController(
- screen.getContext(), footerPreference.getKey());
+ screen.getContext(), footerPreference.getKey());
mFooterPreferenceController.setIntroductionTitle(introductionTitle);
mFooterPreferenceController.displayPreference(screen);
}
@@ -649,18 +642,6 @@
return value;
}
- private static CharSequence getSoftwareShortcutTypeSummary(Context context) {
- int resId;
- if (AccessibilityUtil.isFloatingMenuEnabled(context)) {
- resId = R.string.accessibility_shortcut_edit_summary_software;
- } else if (AccessibilityUtil.isGestureNavigateEnabled(context)) {
- resId = R.string.accessibility_shortcut_edit_summary_software_gesture;
- } else {
- resId = R.string.accessibility_shortcut_edit_summary_software;
- }
- return context.getText(resId);
- }
-
protected CharSequence getShortcutTypeSummary(Context context) {
if (!mShortcutPreference.isSettingsEditable()) {
return context.getText(R.string.accessibility_shortcut_edit_dialog_title_hardware);
@@ -692,6 +673,18 @@
null, LocaleUtils.getConcatenatedString(list));
}
+ private static CharSequence getSoftwareShortcutTypeSummary(Context context) {
+ int resId;
+ if (AccessibilityUtil.isFloatingMenuEnabled(context)) {
+ resId = R.string.accessibility_shortcut_edit_summary_software;
+ } else if (AccessibilityUtil.isGestureNavigateEnabled(context)) {
+ resId = R.string.accessibility_shortcut_edit_summary_software_gesture;
+ } else {
+ resId = R.string.accessibility_shortcut_edit_summary_software;
+ }
+ return context.getText(resId);
+ }
+
/**
* This method will be invoked when a button in the tutorial dialog is clicked.
*
diff --git a/src/com/android/settings/accessibility/ToggleReduceBrightColorsPreferenceFragment.java b/src/com/android/settings/accessibility/ToggleReduceBrightColorsPreferenceFragment.java
index 4e990f4..4b7fffb 100644
--- a/src/com/android/settings/accessibility/ToggleReduceBrightColorsPreferenceFragment.java
+++ b/src/com/android/settings/accessibility/ToggleReduceBrightColorsPreferenceFragment.java
@@ -49,19 +49,30 @@
@SearchIndexable(forTarget = SearchIndexable.ALL & ~SearchIndexable.ARC)
public class ToggleReduceBrightColorsPreferenceFragment extends ToggleFeaturePreferenceFragment {
- private static final String REDUCE_BRIGHT_COLORS_ACTIVATED_KEY =
- Settings.Secure.REDUCE_BRIGHT_COLORS_ACTIVATED;
+ private static final String TAG = "ToggleReduceBrightColorsPreferenceFragment";
private static final String KEY_INTENSITY = "rbc_intensity";
private static final String KEY_PERSIST = "rbc_persist";
+ private static final String REDUCE_BRIGHT_COLORS_ACTIVATED_KEY =
+ Settings.Secure.REDUCE_BRIGHT_COLORS_ACTIVATED;
private ReduceBrightColorsIntensityPreferenceController mRbcIntensityPreferenceController;
private ReduceBrightColorsPersistencePreferenceController mRbcPersistencePreferenceController;
private ColorDisplayManager mColorDisplayManager;
@Override
+ protected void registerKeysToObserverCallback(
+ AccessibilitySettingsContentObserver contentObserver) {
+ super.registerKeysToObserverCallback(contentObserver);
+
+ final List<String> enableServiceFeatureKeys = new ArrayList<>(/* initialCapacity= */ 1);
+ enableServiceFeatureKeys.add(REDUCE_BRIGHT_COLORS_ACTIVATED_KEY);
+ contentObserver.registerKeysToObserverCallback(enableServiceFeatureKeys,
+ key -> updateSwitchBarToggleSwitch());
+ }
+
+ @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
-
mImageUri = new Uri.Builder().scheme(ContentResolver.SCHEME_ANDROID_RESOURCE)
.authority(getPrefContext().getPackageName())
.appendPath(String.valueOf(R.raw.extra_dim_banner))
@@ -85,17 +96,6 @@
return view;
}
- @Override
- protected void registerKeysToObserverCallback(
- AccessibilitySettingsContentObserver contentObserver) {
- super.registerKeysToObserverCallback(contentObserver);
-
- final List<String> enableServiceFeatureKeys = new ArrayList<>(/* initialCapacity= */ 1);
- enableServiceFeatureKeys.add(REDUCE_BRIGHT_COLORS_ACTIVATED_KEY);
- contentObserver.registerKeysToObserverCallback(enableServiceFeatureKeys,
- key -> updateSwitchBarToggleSwitch());
- }
-
private void updateGeneralCategoryOrder() {
final PreferenceCategory generalCategory = findPreference(KEY_GENERAL_CATEGORY);
final SeekBarPreference intensity = findPreference(KEY_INTENSITY);
@@ -115,29 +115,19 @@
}
@Override
- public void onViewCreated(View view, Bundle savedInstanceState) {
- super.onViewCreated(view, savedInstanceState);
- }
-
- @Override
public void onResume() {
super.onResume();
updateSwitchBarToggleSwitch();
}
@Override
- public void onPause() {
- super.onPause();
- }
-
- @Override
public int getMetricsCategory() {
return SettingsEnums.REDUCE_BRIGHT_COLORS_SETTINGS;
}
@Override
public int getHelpResource() {
- // TODO(170973645): Link to help support page
+ // TODO(b/170973645): Link to help support page
return 0;
}
@@ -147,6 +137,11 @@
}
@Override
+ protected String getLogTag() {
+ return TAG;
+ }
+
+ @Override
protected void onPreferenceToggled(String preferenceKey, boolean enabled) {
if (enabled) {
showQuickSettingsTooltipIfNeeded(QuickSettingsTooltipType.GUIDE_TO_DIRECT_USE);
@@ -186,8 +181,8 @@
@Override
CharSequence getTileTooltipContent(@QuickSettingsTooltipType int type) {
return getText(type == QuickSettingsTooltipType.GUIDE_TO_EDIT
- ? R.string.accessibility_reduce_bright_colors_qs_tooltip_content
- : R.string.accessibility_reduce_bright_colors_auto_added_qs_tooltip_content);
+ ? R.string.accessibility_reduce_bright_colors_qs_tooltip_content
+ : R.string.accessibility_reduce_bright_colors_auto_added_qs_tooltip_content);
}
@Override
diff --git a/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragment.java b/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragment.java
index 3260cd1..8da190a 100644
--- a/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragment.java
+++ b/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragment.java
@@ -66,22 +66,22 @@
public class ToggleScreenMagnificationPreferenceFragment extends
ToggleFeaturePreferenceFragment implements
MagnificationModePreferenceController.DialogHelper {
- // TODO(b/147021230): Move duplicated functions with android/internal/accessibility into util.
- private TouchExplorationStateChangeListener mTouchExplorationStateChangeListener;
- private CheckBox mSoftwareTypeCheckBox;
- private CheckBox mHardwareTypeCheckBox;
- private CheckBox mTripleTapTypeCheckBox;
-
+ private static final String TAG = "ToggleScreenMagnificationPreferenceFragment";
private static final char COMPONENT_NAME_SEPARATOR = ':';
private static final TextUtils.SimpleStringSplitter sStringColonSplitter =
new TextUtils.SimpleStringSplitter(COMPONENT_NAME_SEPARATOR);
+ protected SwitchPreference mFollowingTypingSwitchPreference;
+
+ // TODO(b/147021230): Move duplicated functions with android/internal/accessibility into util.
+ private TouchExplorationStateChangeListener mTouchExplorationStateChangeListener;
+ private CheckBox mSoftwareTypeCheckBox;
+ private CheckBox mHardwareTypeCheckBox;
+ private CheckBox mTripleTapTypeCheckBox;
private DialogCreatable mDialogDelegate;
private MagnificationFollowTypingPreferenceController mFollowTypingPreferenceController;
- protected SwitchPreference mFollowingTypingSwitchPreference;
-
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
@@ -126,6 +126,17 @@
}
@Override
+ protected int getPreferenceScreenResId() {
+ // TODO(b/171272809): Add back when controllers move to static type
+ return 0;
+ }
+
+ @Override
+ protected String getLogTag() {
+ return TAG;
+ }
+
+ @Override
public void onPause() {
final AccessibilityManager am = getPrefContext().getSystemService(
AccessibilityManager.class);
@@ -623,15 +634,6 @@
return false;
}
- private boolean isWindowMagnification(Context context) {
- final int mode = Settings.Secure.getIntForUser(
- context.getContentResolver(),
- Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE,
- Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_FULLSCREEN,
- context.getContentResolver().getUserId());
- return mode == Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW;
- }
-
private static int getUserShortcutTypeFromSettings(Context context) {
int shortcutTypes = UserShortcutType.EMPTY;
if (hasMagnificationValuesInSettings(context, UserShortcutType.SOFTWARE)) {
diff --git a/src/com/android/settings/biometrics/BiometricEnrollActivity.java b/src/com/android/settings/biometrics/BiometricEnrollActivity.java
index e682934..79e2ea3 100644
--- a/src/com/android/settings/biometrics/BiometricEnrollActivity.java
+++ b/src/com/android/settings/biometrics/BiometricEnrollActivity.java
@@ -93,6 +93,8 @@
public static final String EXTRA_PARENTAL_CONSENT_STATUS = "consent_status";
private static final String SAVED_STATE_CONFIRMING_CREDENTIALS = "confirming_credentials";
+ private static final String SAVED_STATE_FINGERPRINT_ONLY_ENROLLING =
+ "fingerprint_only_enrolling";
private static final String SAVED_STATE_ENROLL_ACTION_LOGGED = "enroll_action_logged";
private static final String SAVED_STATE_PARENTAL_OPTIONS = "enroll_preferences";
private static final String SAVED_STATE_GK_PW_HANDLE = "gk_pw_handle";
@@ -101,6 +103,7 @@
private int mUserId = UserHandle.myUserId();
private boolean mConfirmingCredentials;
+ private boolean mFingerprintOnlyEnrolling;
private boolean mIsEnrollActionLogged;
private boolean mHasFeatureFace = false;
private boolean mHasFeatureFingerprint = false;
@@ -129,6 +132,8 @@
if (savedInstanceState != null) {
mConfirmingCredentials = savedInstanceState.getBoolean(
SAVED_STATE_CONFIRMING_CREDENTIALS, false);
+ mFingerprintOnlyEnrolling = savedInstanceState.getBoolean(
+ SAVED_STATE_FINGERPRINT_ONLY_ENROLLING, false);
mIsEnrollActionLogged = savedInstanceState.getBoolean(
SAVED_STATE_ENROLL_ACTION_LOGGED, false);
mParentalOptions = savedInstanceState.getBundle(SAVED_STATE_PARENTAL_OPTIONS);
@@ -302,7 +307,11 @@
setOrConfirmCredentialsNow();
}
} else if (canUseFingerprint) {
- launchFingerprintOnlyEnroll();
+ if (mGkPwHandle != null) {
+ launchFingerprintOnlyEnroll();
+ } else {
+ setOrConfirmCredentialsNow();
+ }
} else if (canUseFace) {
launchFaceOnlyEnroll();
} else { // no modalities available
@@ -320,6 +329,7 @@
protected void onSaveInstanceState(@NonNull Bundle outState) {
super.onSaveInstanceState(outState);
outState.putBoolean(SAVED_STATE_CONFIRMING_CREDENTIALS, mConfirmingCredentials);
+ outState.putBoolean(SAVED_STATE_FINGERPRINT_ONLY_ENROLLING, mFingerprintOnlyEnrolling);
outState.putBoolean(SAVED_STATE_ENROLL_ACTION_LOGGED, mIsEnrollActionLogged);
if (mParentalOptions != null) {
outState.putBundle(SAVED_STATE_PARENTAL_OPTIONS, mParentalOptions);
@@ -432,11 +442,14 @@
mConfirmingCredentials = false;
final boolean isOk =
isSuccessfulConfirmOrChooseCredential(requestCode, resultCode);
- // single modality enrollment requests confirmation directly
+ // single face enrollment requests confirmation directly
// via BiometricEnrollBase#onCreate and should never get here
if (isOk && mHasFeatureFace && mHasFeatureFingerprint) {
updateGatekeeperPasswordHandle(data);
launchFaceAndFingerprintEnroll();
+ } else if (isOk && mHasFeatureFingerprint) {
+ updateGatekeeperPasswordHandle(data);
+ launchFingerprintOnlyEnroll();
} else {
Log.d(TAG, "Unknown result for set/choose lock: " + resultCode);
setResult(resultCode);
@@ -444,6 +457,7 @@
}
break;
case REQUEST_SINGLE_ENROLL:
+ mFingerprintOnlyEnrolling = false;
finishOrLaunchHandToParent(resultCode);
break;
default:
@@ -572,15 +586,18 @@
}
private void launchFingerprintOnlyEnroll() {
- final Intent intent;
- // ChooseLockGeneric can request to start fingerprint enroll bypassing the intro screen.
- if (getIntent().getBooleanExtra(EXTRA_SKIP_INTRO, false)
- && this instanceof InternalActivity) {
- intent = BiometricUtils.getFingerprintFindSensorIntent(this, getIntent());
- } else {
- intent = BiometricUtils.getFingerprintIntroIntent(this, getIntent());
+ if (!mFingerprintOnlyEnrolling) {
+ mFingerprintOnlyEnrolling = true;
+ final Intent intent;
+ // ChooseLockGeneric can request to start fingerprint enroll bypassing the intro screen.
+ if (getIntent().getBooleanExtra(EXTRA_SKIP_INTRO, false)
+ && this instanceof InternalActivity) {
+ intent = BiometricUtils.getFingerprintFindSensorIntent(this, getIntent());
+ } else {
+ intent = BiometricUtils.getFingerprintIntroIntent(this, getIntent());
+ }
+ launchSingleSensorEnrollActivity(intent, REQUEST_SINGLE_ENROLL);
}
- launchSingleSensorEnrollActivity(intent, REQUEST_SINGLE_ENROLL);
}
private void launchFaceOnlyEnroll() {
diff --git a/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrolling.java b/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrolling.java
index bf04d5f..ca79a24 100644
--- a/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrolling.java
+++ b/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrolling.java
@@ -76,6 +76,7 @@
private static final String TAG = "FingerprintEnrollEnrolling";
static final String TAG_SIDECAR = "sidecar";
+ static final String KEY_STATE_CANCELED = "is_canceled";
private static final int PROGRESS_BAR_MAX = 10000;
@@ -115,6 +116,7 @@
private FingerprintManager mFingerprintManager;
private boolean mCanAssumeUdfps;
+ private boolean mCanAssumeSidefps;
@Nullable private ProgressBar mProgressBar;
private ObjectAnimator mProgressAnim;
private TextView mDescriptionText;
@@ -129,6 +131,7 @@
private boolean mRestoring;
private Vibrator mVibrator;
private boolean mIsSetupWizard;
+ private boolean mIsCanceled;
private AccessibilityManager mAccessibilityManager;
private boolean mIsAccessibilityEnabled;
private LottieAnimationView mIllustrationLottie;
@@ -153,10 +156,14 @@
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
+ if (savedInstanceState != null) {
+ restoreSavedState(savedInstanceState);
+ }
mFingerprintManager = getSystemService(FingerprintManager.class);
final List<FingerprintSensorPropertiesInternal> props =
mFingerprintManager.getSensorPropertiesInternal();
- mCanAssumeUdfps = props.size() == 1 && props.get(0).isAnyUdfpsType();
+ mCanAssumeUdfps = props != null && props.size() == 1 && props.get(0).isAnyUdfpsType();
+ mCanAssumeSidefps = props != null && props.size() == 1 && props.get(0).isAnySidefpsType();
mAccessibilityManager = getSystemService(AccessibilityManager.class);
mIsAccessibilityEnabled = mAccessibilityManager.isEnabled();
@@ -238,7 +245,6 @@
return true;
});
}
- mRestoring = savedInstanceState != null;
}
@Override
@@ -253,12 +259,23 @@
if (mCanAssumeUdfps) {
// Continue enrollment if restoring (e.g. configuration changed). Otherwise, wait
// for the entry animation to complete before starting.
- return mRestoring;
+ return mRestoring && !mIsCanceled;
}
return true;
}
@Override
+ protected void onSaveInstanceState(Bundle outState) {
+ super.onSaveInstanceState(outState);
+ outState.putBoolean(KEY_STATE_CANCELED, mIsCanceled);
+ }
+
+ private void restoreSavedState(Bundle savedInstanceState) {
+ mRestoring = true;
+ mIsCanceled = savedInstanceState.getBoolean(KEY_STATE_CANCELED, false);
+ }
+
+ @Override
protected void onStart() {
super.onStart();
updateProgress(false /* animate */);
@@ -498,7 +515,10 @@
@Override
public void onEnrollmentError(int errMsgId, CharSequence errString) {
FingerprintErrorDialog.showErrorDialog(this, errMsgId);
+ mIsCanceled = true;
+ cancelEnrollment();
stopIconAnimation();
+ stopListenOrientationEvent();
if (!mCanAssumeUdfps) {
mErrorText.removeCallbacks(mTouchAgainRunnable);
}
@@ -567,7 +587,7 @@
}
private void showError(CharSequence error) {
- if (mCanAssumeUdfps) {
+ if (mCanAssumeUdfps || mCanAssumeSidefps) {
setHeaderText(error);
// Show nothing for subtitle when getting an error message.
setDescriptionText("");
diff --git a/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollIntroduction.java b/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollIntroduction.java
index 8ce3845..71d0c8e 100644
--- a/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollIntroduction.java
+++ b/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollIntroduction.java
@@ -241,6 +241,8 @@
final boolean isSetupWizard = WizardManagerHelper.isAnySetupWizard(getIntent());
final boolean isDeferredSetupWizard =
WizardManagerHelper.isDeferredSetupWizard(getIntent());
+ final boolean isPortalSetupWizard =
+ WizardManagerHelper.isPortalSetupWizard(getIntent());
if (mFingerprintManager != null) {
final List<FingerprintSensorPropertiesInternal> props =
mFingerprintManager.getSensorPropertiesInternal();
@@ -252,7 +254,7 @@
getApplicationContext()
.getResources()
.getInteger(R.integer.suw_max_fingerprints_enrollable);
- if (isSetupWizard && !isDeferredSetupWizard) {
+ if (isSetupWizard && !isDeferredSetupWizard && !isPortalSetupWizard) {
if (numEnrolledFingerprints >= maxFingerprintsEnrollableIfSUW) {
return R.string.fingerprint_intro_error_max;
} else {
diff --git a/src/com/android/settings/biometrics/fingerprint/FingerprintErrorDialog.java b/src/com/android/settings/biometrics/fingerprint/FingerprintErrorDialog.java
index cea44ba..9f9efdc 100644
--- a/src/com/android/settings/biometrics/fingerprint/FingerprintErrorDialog.java
+++ b/src/com/android/settings/biometrics/fingerprint/FingerprintErrorDialog.java
@@ -18,11 +18,13 @@
import static com.android.settings.biometrics.BiometricEnrollBase.RESULT_FINISHED;
import static com.android.settings.biometrics.BiometricEnrollBase.RESULT_TIMEOUT;
+import static com.android.settings.biometrics.fingerprint.FingerprintEnrollEnrolling.KEY_STATE_CANCELED;
import android.app.Activity;
import android.app.Dialog;
import android.app.settings.SettingsEnums;
import android.content.DialogInterface;
+import android.content.Intent;
import android.hardware.biometrics.BiometricConstants;
import android.hardware.fingerprint.FingerprintManager;
import android.os.Bundle;
@@ -68,7 +70,11 @@
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
- getActivity().recreate();
+ Activity activity = getActivity();
+ Intent intent = activity.getIntent();
+ intent.putExtra(KEY_STATE_CANCELED, false);
+ activity.startActivity(intent);
+ activity.finish();
}
})
.setNegativeButton(
diff --git a/src/com/android/settings/bluetooth/QrCodeScanModeBaseActivity.java b/src/com/android/settings/bluetooth/QrCodeScanModeBaseActivity.java
index af8a6e9..06f3619 100644
--- a/src/com/android/settings/bluetooth/QrCodeScanModeBaseActivity.java
+++ b/src/com/android/settings/bluetooth/QrCodeScanModeBaseActivity.java
@@ -18,14 +18,20 @@
import android.content.Intent;
import android.os.Bundle;
+import android.os.SystemProperties;
import androidx.fragment.app.FragmentManager;
import com.android.settingslib.R;
import com.android.settingslib.core.lifecycle.ObservableActivity;
+import com.google.android.setupdesign.util.ThemeHelper;
+import com.google.android.setupdesign.util.ThemeResolver;
+
public abstract class QrCodeScanModeBaseActivity extends ObservableActivity {
+ private static final String THEME_KEY = "setupwizard.theme";
+ private static final String THEME_DEFAULT_VALUE = "SudThemeGlifV3_DayNight";
protected FragmentManager mFragmentManager;
protected abstract void handleIntent(Intent intent);
@@ -34,7 +40,18 @@
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
- setTheme(R.style.SudThemeGlifV3_DayNight);
+ int defaultTheme =
+ ThemeHelper.isSetupWizardDayNightEnabled(this)
+ ? R.style.SudThemeGlifV3_DayNight
+ : R.style.SudThemeGlifV3_Light;
+ ThemeResolver themeResolver =
+ new ThemeResolver.Builder(ThemeResolver.getDefault())
+ .setDefaultTheme(defaultTheme)
+ .setUseDayNight(true)
+ .build();
+ setTheme(themeResolver.resolve(
+ SystemProperties.get(THEME_KEY, THEME_DEFAULT_VALUE),
+ /* suppressDayNight= */ !ThemeHelper.isSetupWizardDayNightEnabled(this)));
setContentView(R.layout.qrcode_scan_mode_activity);
mFragmentManager = getSupportFragmentManager();
diff --git a/src/com/android/settings/development/StayAwakePreferenceController.java b/src/com/android/settings/development/StayAwakePreferenceController.java
index 25a92b2..9ed0ef8 100644
--- a/src/com/android/settings/development/StayAwakePreferenceController.java
+++ b/src/com/android/settings/development/StayAwakePreferenceController.java
@@ -50,7 +50,7 @@
@VisibleForTesting
static final int SETTING_VALUE_ON =
BatteryManager.BATTERY_PLUGGED_AC | BatteryManager.BATTERY_PLUGGED_USB
- | BatteryManager.BATTERY_PLUGGED_WIRELESS;
+ | BatteryManager.BATTERY_PLUGGED_WIRELESS | BatteryManager.BATTERY_PLUGGED_DOCK;
@VisibleForTesting
SettingsObserver mSettingsObserver;
diff --git a/src/com/android/settings/display/ScreenResolutionFragment.java b/src/com/android/settings/display/ScreenResolutionFragment.java
index bc82514..b977703 100644
--- a/src/com/android/settings/display/ScreenResolutionFragment.java
+++ b/src/com/android/settings/display/ScreenResolutionFragment.java
@@ -26,6 +26,7 @@
import android.graphics.Point;
import android.graphics.drawable.Drawable;
import android.hardware.display.DisplayManager;
+import android.provider.Settings;
import android.text.TextUtils;
import android.view.Display;
@@ -56,6 +57,7 @@
private Resources mResources;
private static final int FHD_INDEX = 0;
private static final int QHD_INDEX = 1;
+ private static final String SCREEN_RESOLUTION = "user_selected_resolution";
private Display mDefaultDisplay;
private String[] mScreenResolutionOptions;
private Set<Point> mResolutions;
@@ -156,8 +158,19 @@
/** Using display manager to set the display mode. */
@VisibleForTesting
public void setDisplayMode(final int width) {
+ Display.Mode mode = getPreferMode(width);
+
mDisplayObserver.startObserve();
- mDefaultDisplay.setUserPreferredDisplayMode(getPreferMode(width));
+
+ /** For store settings globally. */
+ /** TODO(b/238061217): Moving to an atom with the same string */
+ Settings.System.putString(
+ getContext().getContentResolver(),
+ SCREEN_RESOLUTION,
+ mode.getPhysicalWidth() + "x" + mode.getPhysicalHeight());
+
+ /** Apply the resolution change. */
+ mDefaultDisplay.setUserPreferredDisplayMode(mode);
}
/** Get the key corresponding to the resolution. */
@@ -186,7 +199,7 @@
protected boolean setDefaultKey(final String key) {
int width = getWidthForResoluitonKey(key);
if (width < 0) {
- return false;
+ return false;
}
setDisplayMode(width);
@@ -200,9 +213,8 @@
String selectedKey = selected.getKey();
int selectedWidth = getWidthForResoluitonKey(selectedKey);
if (!mDisplayObserver.setPendingResolutionChange(selectedWidth)) {
- return;
+ return;
}
-
super.onRadioButtonClicked(selected);
}
@@ -318,7 +330,7 @@
}
if (!isDensityChanged() || !isResolutionChangeApplied()) {
- return;
+ return;
}
restoreDensity();
@@ -353,10 +365,10 @@
int currentWidth = getCurrentWidth();
if (selectedWidth == currentWidth) {
- return false;
+ return false;
}
if (mPreviousWidth.get() != -1 && !isResolutionChangeApplied()) {
- return false;
+ return false;
}
mPreviousWidth.set(currentWidth);
@@ -366,7 +378,7 @@
private boolean isResolutionChangeApplied() {
if (mPreviousWidth.get() == getCurrentWidth()) {
- return false;
+ return false;
}
return true;
diff --git a/src/com/android/settings/fuelgauge/BatteryUtils.java b/src/com/android/settings/fuelgauge/BatteryUtils.java
index 3f6c165..a6c48a4 100644
--- a/src/com/android/settings/fuelgauge/BatteryUtils.java
+++ b/src/com/android/settings/fuelgauge/BatteryUtils.java
@@ -69,6 +69,8 @@
public static final int UID_REMOVED_APPS = -4;
/** Special UID value for data usage by tethering. */
public static final int UID_TETHERING = -5;
+ /** Special UID for aggregated other users. */
+ public static final long UID_OTHER_USERS = Long.MIN_VALUE;
@Retention(RetentionPolicy.SOURCE)
@IntDef({StatusType.SCREEN_USAGE,
diff --git a/src/com/android/settings/fuelgauge/batteryusage/BatteryChartPreferenceControllerV2.java b/src/com/android/settings/fuelgauge/batteryusage/BatteryChartPreferenceControllerV2.java
new file mode 100644
index 0000000..dc80b84
--- /dev/null
+++ b/src/com/android/settings/fuelgauge/batteryusage/BatteryChartPreferenceControllerV2.java
@@ -0,0 +1,741 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.fuelgauge.batteryusage;
+
+import android.app.settings.SettingsEnums;
+import android.content.Context;
+import android.content.res.Configuration;
+import android.graphics.drawable.Drawable;
+import android.os.AsyncTask;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.Looper;
+import android.text.TextUtils;
+import android.text.format.DateFormat;
+import android.text.format.DateUtils;
+import android.util.Log;
+
+import androidx.annotation.VisibleForTesting;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceGroup;
+import androidx.preference.PreferenceScreen;
+
+import com.android.settings.R;
+import com.android.settings.SettingsActivity;
+import com.android.settings.core.InstrumentedPreferenceFragment;
+import com.android.settings.core.PreferenceControllerMixin;
+import com.android.settings.fuelgauge.AdvancedPowerUsageDetail;
+import com.android.settings.fuelgauge.BatteryUtils;
+import com.android.settings.overlay.FeatureFactory;
+import com.android.settingslib.core.AbstractPreferenceController;
+import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
+import com.android.settingslib.core.lifecycle.Lifecycle;
+import com.android.settingslib.core.lifecycle.LifecycleObserver;
+import com.android.settingslib.core.lifecycle.events.OnCreate;
+import com.android.settingslib.core.lifecycle.events.OnDestroy;
+import com.android.settingslib.core.lifecycle.events.OnResume;
+import com.android.settingslib.core.lifecycle.events.OnSaveInstanceState;
+import com.android.settingslib.utils.StringUtil;
+import com.android.settingslib.widget.FooterPreference;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/** Controls the update for chart graph and the list items. */
+public class BatteryChartPreferenceControllerV2 extends AbstractPreferenceController
+ implements PreferenceControllerMixin, LifecycleObserver, OnCreate, OnDestroy,
+ OnSaveInstanceState, BatteryChartViewV2.OnSelectListener, OnResume,
+ ExpandDividerPreference.OnExpandListener {
+ private static final String TAG = "BatteryChartPreferenceControllerV2";
+ private static final String KEY_FOOTER_PREF = "battery_graph_footer";
+ private static final String PACKAGE_NAME_NONE = "none";
+
+ /** Desired battery history size for timestamp slots. */
+ public static final int DESIRED_HISTORY_SIZE = 25;
+ private static final int CHART_LEVEL_ARRAY_SIZE = 13;
+ private static final int CHART_KEY_ARRAY_SIZE = DESIRED_HISTORY_SIZE;
+ private static final long VALID_USAGE_TIME_DURATION = DateUtils.HOUR_IN_MILLIS * 2;
+ private static final long VALID_DIFF_DURATION = DateUtils.MINUTE_IN_MILLIS * 3;
+
+ // Keys for bundle instance to restore configurations.
+ private static final String KEY_EXPAND_SYSTEM_INFO = "expand_system_info";
+ private static final String KEY_CURRENT_TIME_SLOT = "current_time_slot";
+
+ private static int sUiMode = Configuration.UI_MODE_NIGHT_UNDEFINED;
+
+ @VisibleForTesting
+ Map<Integer, List<BatteryDiffEntry>> mBatteryIndexedMap;
+
+ @VisibleForTesting
+ Context mPrefContext;
+ @VisibleForTesting
+ BatteryUtils mBatteryUtils;
+ @VisibleForTesting
+ PreferenceGroup mAppListPrefGroup;
+ @VisibleForTesting
+ BatteryChartViewV2 mBatteryChartView;
+ @VisibleForTesting
+ ExpandDividerPreference mExpandDividerPreference;
+
+ @VisibleForTesting
+ boolean mIsExpanded = false;
+ @VisibleForTesting
+ int[] mBatteryHistoryLevels;
+ @VisibleForTesting
+ long[] mBatteryHistoryKeys;
+ @VisibleForTesting
+ int mTrapezoidIndex = BatteryChartViewV2.SELECTED_INDEX_INVALID;
+
+ private boolean mIs24HourFormat = false;
+ private boolean mIsFooterPrefAdded = false;
+ private PreferenceScreen mPreferenceScreen;
+ private FooterPreference mFooterPreference;
+
+ private final String mPreferenceKey;
+ private final SettingsActivity mActivity;
+ private final InstrumentedPreferenceFragment mFragment;
+ private final CharSequence[] mNotAllowShowEntryPackages;
+ private final CharSequence[] mNotAllowShowSummaryPackages;
+ private final MetricsFeatureProvider mMetricsFeatureProvider;
+ private final Handler mHandler = new Handler(Looper.getMainLooper());
+
+ // Preference cache to avoid create new instance each time.
+ @VisibleForTesting
+ final Map<String, Preference> mPreferenceCache = new HashMap<>();
+ @VisibleForTesting
+ final List<BatteryDiffEntry> mSystemEntries = new ArrayList<>();
+
+ public BatteryChartPreferenceControllerV2(
+ Context context, String preferenceKey,
+ Lifecycle lifecycle, SettingsActivity activity,
+ InstrumentedPreferenceFragment fragment) {
+ super(context);
+ mActivity = activity;
+ mFragment = fragment;
+ mPreferenceKey = preferenceKey;
+ mIs24HourFormat = DateFormat.is24HourFormat(context);
+ mMetricsFeatureProvider =
+ FeatureFactory.getFactory(mContext).getMetricsFeatureProvider();
+ mNotAllowShowEntryPackages =
+ FeatureFactory.getFactory(context)
+ .getPowerUsageFeatureProvider(context)
+ .getHideApplicationEntries(context);
+ mNotAllowShowSummaryPackages =
+ FeatureFactory.getFactory(context)
+ .getPowerUsageFeatureProvider(context)
+ .getHideApplicationSummary(context);
+ if (lifecycle != null) {
+ lifecycle.addObserver(this);
+ }
+ }
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ if (savedInstanceState == null) {
+ return;
+ }
+ mTrapezoidIndex =
+ savedInstanceState.getInt(KEY_CURRENT_TIME_SLOT, mTrapezoidIndex);
+ mIsExpanded =
+ savedInstanceState.getBoolean(KEY_EXPAND_SYSTEM_INFO, mIsExpanded);
+ Log.d(TAG, String.format("onCreate() slotIndex=%d isExpanded=%b",
+ mTrapezoidIndex, mIsExpanded));
+ }
+
+ @Override
+ public void onResume() {
+ final int currentUiMode =
+ mContext.getResources().getConfiguration().uiMode
+ & Configuration.UI_MODE_NIGHT_MASK;
+ if (sUiMode != currentUiMode) {
+ sUiMode = currentUiMode;
+ BatteryDiffEntry.clearCache();
+ Log.d(TAG, "clear icon and label cache since uiMode is changed");
+ }
+ mIs24HourFormat = DateFormat.is24HourFormat(mContext);
+ mMetricsFeatureProvider.action(mPrefContext, SettingsEnums.OPEN_BATTERY_USAGE);
+ }
+
+ @Override
+ public void onSaveInstanceState(Bundle savedInstance) {
+ if (savedInstance == null) {
+ return;
+ }
+ savedInstance.putInt(KEY_CURRENT_TIME_SLOT, mTrapezoidIndex);
+ savedInstance.putBoolean(KEY_EXPAND_SYSTEM_INFO, mIsExpanded);
+ Log.d(TAG, String.format("onSaveInstanceState() slotIndex=%d isExpanded=%b",
+ mTrapezoidIndex, mIsExpanded));
+ }
+
+ @Override
+ public void onDestroy() {
+ if (mActivity.isChangingConfigurations()) {
+ BatteryDiffEntry.clearCache();
+ }
+ mHandler.removeCallbacksAndMessages(/*token=*/ null);
+ mPreferenceCache.clear();
+ if (mAppListPrefGroup != null) {
+ mAppListPrefGroup.removeAll();
+ }
+ }
+
+ @Override
+ public void displayPreference(PreferenceScreen screen) {
+ super.displayPreference(screen);
+ mPreferenceScreen = screen;
+ mPrefContext = screen.getContext();
+ mAppListPrefGroup = screen.findPreference(mPreferenceKey);
+ mAppListPrefGroup.setOrderingAsAdded(false);
+ mAppListPrefGroup.setTitle(
+ mPrefContext.getString(R.string.battery_app_usage_for_past_24));
+ mFooterPreference = screen.findPreference(KEY_FOOTER_PREF);
+ // Removes footer first until usage data is loaded to avoid flashing.
+ if (mFooterPreference != null) {
+ screen.removePreference(mFooterPreference);
+ }
+ }
+
+ @Override
+ public boolean isAvailable() {
+ return true;
+ }
+
+ @Override
+ public String getPreferenceKey() {
+ return mPreferenceKey;
+ }
+
+ @Override
+ public boolean handlePreferenceTreeClick(Preference preference) {
+ if (!(preference instanceof PowerGaugePreference)) {
+ return false;
+ }
+ final PowerGaugePreference powerPref = (PowerGaugePreference) preference;
+ final BatteryDiffEntry diffEntry = powerPref.getBatteryDiffEntry();
+ final BatteryHistEntry histEntry = diffEntry.mBatteryHistEntry;
+ final String packageName = histEntry.mPackageName;
+ final boolean isAppEntry = histEntry.isAppEntry();
+ mMetricsFeatureProvider.action(
+ /* attribution */ SettingsEnums.OPEN_BATTERY_USAGE,
+ /* action */ isAppEntry
+ ? SettingsEnums.ACTION_BATTERY_USAGE_APP_ITEM
+ : SettingsEnums.ACTION_BATTERY_USAGE_SYSTEM_ITEM,
+ /* pageId */ SettingsEnums.OPEN_BATTERY_USAGE,
+ TextUtils.isEmpty(packageName) ? PACKAGE_NAME_NONE : packageName,
+ (int) Math.round(diffEntry.getPercentOfTotal()));
+ Log.d(TAG, String.format("handleClick() label=%s key=%s package=%s",
+ diffEntry.getAppLabel(), histEntry.getKey(), histEntry.mPackageName));
+ AdvancedPowerUsageDetail.startBatteryDetailPage(
+ mActivity, mFragment, diffEntry, powerPref.getPercent(),
+ isValidToShowSummary(packageName), getSlotInformation());
+ return true;
+ }
+
+ @Override
+ public void onSelect(int trapezoidIndex) {
+ Log.d(TAG, "onChartSelect:" + trapezoidIndex);
+ refreshUi(trapezoidIndex, /*isForce=*/ false);
+ mMetricsFeatureProvider.action(
+ mPrefContext,
+ trapezoidIndex == BatteryChartViewV2.SELECTED_INDEX_ALL
+ ? SettingsEnums.ACTION_BATTERY_USAGE_SHOW_ALL
+ : SettingsEnums.ACTION_BATTERY_USAGE_TIME_SLOT);
+ }
+
+ @Override
+ public void onExpand(boolean isExpanded) {
+ mIsExpanded = isExpanded;
+ mMetricsFeatureProvider.action(
+ mPrefContext,
+ SettingsEnums.ACTION_BATTERY_USAGE_EXPAND_ITEM,
+ isExpanded);
+ refreshExpandUi();
+ }
+
+ void setBatteryHistoryMap(
+ final Map<Long, Map<String, BatteryHistEntry>> batteryHistoryMap) {
+ // Resets all battery history data relative variables.
+ if (batteryHistoryMap == null || batteryHistoryMap.isEmpty()) {
+ mBatteryIndexedMap = null;
+ mBatteryHistoryKeys = null;
+ mBatteryHistoryLevels = null;
+ addFooterPreferenceIfNeeded(false);
+ return;
+ }
+ mBatteryHistoryKeys = getBatteryHistoryKeys(batteryHistoryMap);
+ mBatteryHistoryLevels = new int[CHART_LEVEL_ARRAY_SIZE];
+ for (int index = 0; index < CHART_LEVEL_ARRAY_SIZE; index++) {
+ final long timestamp = mBatteryHistoryKeys[index * 2];
+ final Map<String, BatteryHistEntry> entryMap = batteryHistoryMap.get(timestamp);
+ if (entryMap == null || entryMap.isEmpty()) {
+ Log.e(TAG, "abnormal entry list in the timestamp:"
+ + ConvertUtils.utcToLocalTime(mPrefContext, timestamp));
+ continue;
+ }
+ // Averages the battery level in each time slot to avoid corner conditions.
+ float batteryLevelCounter = 0;
+ for (BatteryHistEntry entry : entryMap.values()) {
+ batteryLevelCounter += entry.mBatteryLevel;
+ }
+ mBatteryHistoryLevels[index] =
+ Math.round(batteryLevelCounter / entryMap.size());
+ }
+ forceRefreshUi();
+ Log.d(TAG, String.format(
+ "setBatteryHistoryMap() size=%d key=%s\nlevels=%s",
+ batteryHistoryMap.size(),
+ ConvertUtils.utcToLocalTime(mPrefContext,
+ mBatteryHistoryKeys[mBatteryHistoryKeys.length - 1]),
+ Arrays.toString(mBatteryHistoryLevels)));
+
+ // Loads item icon and label in the background.
+ new LoadAllItemsInfoTask(batteryHistoryMap).execute();
+ }
+
+ void setBatteryChartView(final BatteryChartViewV2 batteryChartView) {
+ if (mBatteryChartView != batteryChartView) {
+ mHandler.post(() -> setBatteryChartViewInner(batteryChartView));
+ }
+ }
+
+ private void setBatteryChartViewInner(final BatteryChartViewV2 batteryChartView) {
+ mBatteryChartView = batteryChartView;
+ mBatteryChartView.setOnSelectListener(this);
+ forceRefreshUi();
+ }
+
+ private void forceRefreshUi() {
+ final int refreshIndex =
+ mTrapezoidIndex == BatteryChartViewV2.SELECTED_INDEX_INVALID
+ ? BatteryChartViewV2.SELECTED_INDEX_ALL
+ : mTrapezoidIndex;
+ if (mBatteryChartView != null) {
+ mBatteryChartView.setLevels(mBatteryHistoryLevels);
+ mBatteryChartView.setSelectedIndex(refreshIndex);
+ setTimestampLabel();
+ }
+ refreshUi(refreshIndex, /*isForce=*/ true);
+ }
+
+ @VisibleForTesting
+ boolean refreshUi(int trapezoidIndex, boolean isForce) {
+ // Invalid refresh condition.
+ if (mBatteryIndexedMap == null
+ || mBatteryChartView == null
+ || (mTrapezoidIndex == trapezoidIndex && !isForce)) {
+ return false;
+ }
+ Log.d(TAG, String.format("refreshUi: index=%d size=%d isForce:%b",
+ trapezoidIndex, mBatteryIndexedMap.size(), isForce));
+
+ mTrapezoidIndex = trapezoidIndex;
+ mHandler.post(() -> {
+ final long start = System.currentTimeMillis();
+ removeAndCacheAllPrefs();
+ addAllPreferences();
+ refreshCategoryTitle();
+ Log.d(TAG, String.format("refreshUi is finished in %d/ms",
+ (System.currentTimeMillis() - start)));
+ });
+ return true;
+ }
+
+ private void addAllPreferences() {
+ final List<BatteryDiffEntry> entries =
+ mBatteryIndexedMap.get(Integer.valueOf(mTrapezoidIndex));
+ addFooterPreferenceIfNeeded(entries != null && !entries.isEmpty());
+ if (entries == null) {
+ Log.w(TAG, "cannot find BatteryDiffEntry for:" + mTrapezoidIndex);
+ return;
+ }
+ // Separates data into two groups and sort them individually.
+ final List<BatteryDiffEntry> appEntries = new ArrayList<>();
+ mSystemEntries.clear();
+ entries.forEach(entry -> {
+ final String packageName = entry.getPackageName();
+ if (!isValidToShowEntry(packageName)) {
+ Log.w(TAG, "ignore showing item:" + packageName);
+ return;
+ }
+ if (entry.isSystemEntry()) {
+ mSystemEntries.add(entry);
+ } else {
+ appEntries.add(entry);
+ }
+ // Validates the usage time if users click a specific slot.
+ if (mTrapezoidIndex >= 0) {
+ validateUsageTime(entry);
+ }
+ });
+ Collections.sort(appEntries, BatteryDiffEntry.COMPARATOR);
+ Collections.sort(mSystemEntries, BatteryDiffEntry.COMPARATOR);
+ Log.d(TAG, String.format("addAllPreferences() app=%d system=%d",
+ appEntries.size(), mSystemEntries.size()));
+
+ // Adds app entries to the list if it is not empty.
+ if (!appEntries.isEmpty()) {
+ addPreferenceToScreen(appEntries);
+ }
+ // Adds the expabable divider if we have system entries data.
+ if (!mSystemEntries.isEmpty()) {
+ if (mExpandDividerPreference == null) {
+ mExpandDividerPreference = new ExpandDividerPreference(mPrefContext);
+ mExpandDividerPreference.setOnExpandListener(this);
+ mExpandDividerPreference.setIsExpanded(mIsExpanded);
+ }
+ mExpandDividerPreference.setOrder(
+ mAppListPrefGroup.getPreferenceCount());
+ mAppListPrefGroup.addPreference(mExpandDividerPreference);
+ }
+ refreshExpandUi();
+ }
+
+ @VisibleForTesting
+ void addPreferenceToScreen(List<BatteryDiffEntry> entries) {
+ if (mAppListPrefGroup == null || entries.isEmpty()) {
+ return;
+ }
+ int prefIndex = mAppListPrefGroup.getPreferenceCount();
+ for (BatteryDiffEntry entry : entries) {
+ boolean isAdded = false;
+ final String appLabel = entry.getAppLabel();
+ final Drawable appIcon = entry.getAppIcon();
+ if (TextUtils.isEmpty(appLabel) || appIcon == null) {
+ Log.w(TAG, "cannot find app resource for:" + entry.getPackageName());
+ continue;
+ }
+ final String prefKey = entry.mBatteryHistEntry.getKey();
+ PowerGaugePreference pref = mAppListPrefGroup.findPreference(prefKey);
+ if (pref != null) {
+ isAdded = true;
+ Log.w(TAG, "preference should be removed for:" + entry.getPackageName());
+ } else {
+ pref = (PowerGaugePreference) mPreferenceCache.get(prefKey);
+ }
+ // Creates new innstance if cached preference is not found.
+ if (pref == null) {
+ pref = new PowerGaugePreference(mPrefContext);
+ pref.setKey(prefKey);
+ mPreferenceCache.put(prefKey, pref);
+ }
+ pref.setIcon(appIcon);
+ pref.setTitle(appLabel);
+ pref.setOrder(prefIndex);
+ pref.setPercent(entry.getPercentOfTotal());
+ pref.setSingleLineTitle(true);
+ // Sets the BatteryDiffEntry to preference for launching detailed page.
+ pref.setBatteryDiffEntry(entry);
+ pref.setEnabled(entry.validForRestriction());
+ setPreferenceSummary(pref, entry);
+ if (!isAdded) {
+ mAppListPrefGroup.addPreference(pref);
+ }
+ prefIndex++;
+ }
+ }
+
+ private void removeAndCacheAllPrefs() {
+ if (mAppListPrefGroup == null
+ || mAppListPrefGroup.getPreferenceCount() == 0) {
+ return;
+ }
+ final int prefsCount = mAppListPrefGroup.getPreferenceCount();
+ for (int index = 0; index < prefsCount; index++) {
+ final Preference pref = mAppListPrefGroup.getPreference(index);
+ if (TextUtils.isEmpty(pref.getKey())) {
+ continue;
+ }
+ mPreferenceCache.put(pref.getKey(), pref);
+ }
+ mAppListPrefGroup.removeAll();
+ }
+
+ private void refreshExpandUi() {
+ if (mIsExpanded) {
+ addPreferenceToScreen(mSystemEntries);
+ } else {
+ // Removes and recycles all system entries to hide all of them.
+ for (BatteryDiffEntry entry : mSystemEntries) {
+ final String prefKey = entry.mBatteryHistEntry.getKey();
+ final Preference pref = mAppListPrefGroup.findPreference(prefKey);
+ if (pref != null) {
+ mAppListPrefGroup.removePreference(pref);
+ mPreferenceCache.put(pref.getKey(), pref);
+ }
+ }
+ }
+ }
+
+ @VisibleForTesting
+ void refreshCategoryTitle() {
+ final String slotInformation = getSlotInformation();
+ Log.d(TAG, String.format("refreshCategoryTitle:%s", slotInformation));
+ if (mAppListPrefGroup != null) {
+ mAppListPrefGroup.setTitle(
+ getSlotInformation(/*isApp=*/ true, slotInformation));
+ }
+ if (mExpandDividerPreference != null) {
+ mExpandDividerPreference.setTitle(
+ getSlotInformation(/*isApp=*/ false, slotInformation));
+ }
+ }
+
+ private String getSlotInformation(boolean isApp, String slotInformation) {
+ // Null means we show all information without a specific time slot.
+ if (slotInformation == null) {
+ return isApp
+ ? mPrefContext.getString(R.string.battery_app_usage_for_past_24)
+ : mPrefContext.getString(R.string.battery_system_usage_for_past_24);
+ } else {
+ return isApp
+ ? mPrefContext.getString(R.string.battery_app_usage_for, slotInformation)
+ : mPrefContext.getString(R.string.battery_system_usage_for, slotInformation);
+ }
+ }
+
+ private String getSlotInformation() {
+ if (mTrapezoidIndex < 0) {
+ return null;
+ }
+ final String fromHour = ConvertUtils.utcToLocalTimeHour(mPrefContext,
+ mBatteryHistoryKeys[mTrapezoidIndex * 2], mIs24HourFormat);
+ final String toHour = ConvertUtils.utcToLocalTimeHour(mPrefContext,
+ mBatteryHistoryKeys[(mTrapezoidIndex + 1) * 2], mIs24HourFormat);
+ return mIs24HourFormat
+ ? String.format("%s–%s", fromHour, toHour)
+ : String.format("%s – %s", fromHour, toHour);
+ }
+
+ @VisibleForTesting
+ void setPreferenceSummary(
+ PowerGaugePreference preference, BatteryDiffEntry entry) {
+ final long foregroundUsageTimeInMs = entry.mForegroundUsageTimeInMs;
+ final long backgroundUsageTimeInMs = entry.mBackgroundUsageTimeInMs;
+ final long totalUsageTimeInMs = foregroundUsageTimeInMs + backgroundUsageTimeInMs;
+ // Checks whether the package is allowed to show summary or not.
+ if (!isValidToShowSummary(entry.getPackageName())) {
+ preference.setSummary(null);
+ return;
+ }
+ String usageTimeSummary = null;
+ // Not shows summary for some system components without usage time.
+ if (totalUsageTimeInMs == 0) {
+ preference.setSummary(null);
+ // Shows background summary only if we don't have foreground usage time.
+ } else if (foregroundUsageTimeInMs == 0 && backgroundUsageTimeInMs != 0) {
+ usageTimeSummary = buildUsageTimeInfo(backgroundUsageTimeInMs, true);
+ // Shows total usage summary only if total usage time is small.
+ } else if (totalUsageTimeInMs < DateUtils.MINUTE_IN_MILLIS) {
+ usageTimeSummary = buildUsageTimeInfo(totalUsageTimeInMs, false);
+ } else {
+ usageTimeSummary = buildUsageTimeInfo(totalUsageTimeInMs, false);
+ // Shows background usage time if it is larger than a minute.
+ if (backgroundUsageTimeInMs > 0) {
+ usageTimeSummary +=
+ "\n" + buildUsageTimeInfo(backgroundUsageTimeInMs, true);
+ }
+ }
+ preference.setSummary(usageTimeSummary);
+ }
+
+ private String buildUsageTimeInfo(long usageTimeInMs, boolean isBackground) {
+ if (usageTimeInMs < DateUtils.MINUTE_IN_MILLIS) {
+ return mPrefContext.getString(
+ isBackground
+ ? R.string.battery_usage_background_less_than_one_minute
+ : R.string.battery_usage_total_less_than_one_minute);
+ }
+ final CharSequence timeSequence =
+ StringUtil.formatElapsedTime(mPrefContext, usageTimeInMs,
+ /*withSeconds=*/ false, /*collapseTimeUnit=*/ false);
+ final int resourceId =
+ isBackground
+ ? R.string.battery_usage_for_background_time
+ : R.string.battery_usage_for_total_time;
+ return mPrefContext.getString(resourceId, timeSequence);
+ }
+
+ @VisibleForTesting
+ boolean isValidToShowSummary(String packageName) {
+ return !contains(packageName, mNotAllowShowSummaryPackages);
+ }
+
+ @VisibleForTesting
+ boolean isValidToShowEntry(String packageName) {
+ return !contains(packageName, mNotAllowShowEntryPackages);
+ }
+
+ @VisibleForTesting
+ void setTimestampLabel() {
+ if (mBatteryChartView == null || mBatteryHistoryKeys == null) {
+ return;
+ }
+ final boolean is24HourFormat = DateFormat.is24HourFormat(mContext);
+ final String[] labels = new String[mBatteryHistoryKeys.length];
+ for (int i = 0; i < mBatteryHistoryKeys.length; i++) {
+ labels[i] = ConvertUtils.utcToLocalTimeHour(mContext, mBatteryHistoryKeys[i],
+ is24HourFormat);
+ }
+ mBatteryChartView.setAxisLabels(labels);
+ }
+
+ private void addFooterPreferenceIfNeeded(boolean containAppItems) {
+ if (mIsFooterPrefAdded || mFooterPreference == null) {
+ return;
+ }
+ mIsFooterPrefAdded = true;
+ mFooterPreference.setTitle(mPrefContext.getString(
+ containAppItems
+ ? R.string.battery_usage_screen_footer
+ : R.string.battery_usage_screen_footer_empty));
+ mHandler.post(() -> mPreferenceScreen.addPreference(mFooterPreference));
+ }
+
+ private static boolean contains(String target, CharSequence[] packageNames) {
+ if (target != null && packageNames != null) {
+ for (CharSequence packageName : packageNames) {
+ if (TextUtils.equals(target, packageName)) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ @VisibleForTesting
+ static boolean validateUsageTime(BatteryDiffEntry entry) {
+ final long foregroundUsageTimeInMs = entry.mForegroundUsageTimeInMs;
+ final long backgroundUsageTimeInMs = entry.mBackgroundUsageTimeInMs;
+ final long totalUsageTimeInMs = foregroundUsageTimeInMs + backgroundUsageTimeInMs;
+ if (foregroundUsageTimeInMs > VALID_USAGE_TIME_DURATION
+ || backgroundUsageTimeInMs > VALID_USAGE_TIME_DURATION
+ || totalUsageTimeInMs > VALID_USAGE_TIME_DURATION) {
+ Log.e(TAG, "validateUsageTime() fail for\n" + entry);
+ return false;
+ }
+ return true;
+ }
+
+ /** Used for {@link AppBatteryPreferenceController}. */
+ public static List<BatteryDiffEntry> getBatteryLast24HrUsageData(Context context) {
+ final long start = System.currentTimeMillis();
+ final Map<Long, Map<String, BatteryHistEntry>> batteryHistoryMap =
+ FeatureFactory.getFactory(context)
+ .getPowerUsageFeatureProvider(context)
+ .getBatteryHistory(context);
+ if (batteryHistoryMap == null || batteryHistoryMap.isEmpty()) {
+ return null;
+ }
+ Log.d(TAG, String.format("getBatteryLast24HrData() size=%d time=%d/ms",
+ batteryHistoryMap.size(), (System.currentTimeMillis() - start)));
+ final Map<Integer, List<BatteryDiffEntry>> batteryIndexedMap =
+ ConvertUtils.getIndexedUsageMap(
+ context,
+ /*timeSlotSize=*/ CHART_LEVEL_ARRAY_SIZE - 1,
+ getBatteryHistoryKeys(batteryHistoryMap),
+ batteryHistoryMap,
+ /*purgeLowPercentageAndFakeData=*/ true);
+ return batteryIndexedMap.get(BatteryChartViewV2.SELECTED_INDEX_ALL);
+ }
+
+ /** Used for {@link AppBatteryPreferenceController}. */
+ public static BatteryDiffEntry getBatteryLast24HrUsageData(
+ Context context, String packageName, int userId) {
+ if (packageName == null) {
+ return null;
+ }
+ final List<BatteryDiffEntry> entries = getBatteryLast24HrUsageData(context);
+ if (entries == null) {
+ return null;
+ }
+ for (BatteryDiffEntry entry : entries) {
+ final BatteryHistEntry batteryHistEntry = entry.mBatteryHistEntry;
+ if (batteryHistEntry != null
+ && batteryHistEntry.mConsumerType == ConvertUtils.CONSUMER_TYPE_UID_BATTERY
+ && batteryHistEntry.mUserId == userId
+ && packageName.equals(entry.getPackageName())) {
+ return entry;
+ }
+ }
+ return null;
+ }
+
+ private static long[] getBatteryHistoryKeys(
+ final Map<Long, Map<String, BatteryHistEntry>> batteryHistoryMap) {
+ final List<Long> batteryHistoryKeyList =
+ new ArrayList<>(batteryHistoryMap.keySet());
+ Collections.sort(batteryHistoryKeyList);
+ final long[] batteryHistoryKeys = new long[CHART_KEY_ARRAY_SIZE];
+ for (int index = 0; index < CHART_KEY_ARRAY_SIZE; index++) {
+ batteryHistoryKeys[index] = batteryHistoryKeyList.get(index);
+ }
+ return batteryHistoryKeys;
+ }
+
+ // Loads all items icon and label in the background.
+ private final class LoadAllItemsInfoTask
+ extends AsyncTask<Void, Void, Map<Integer, List<BatteryDiffEntry>>> {
+
+ private long[] mBatteryHistoryKeysCache;
+ private Map<Long, Map<String, BatteryHistEntry>> mBatteryHistoryMap;
+
+ private LoadAllItemsInfoTask(
+ Map<Long, Map<String, BatteryHistEntry>> batteryHistoryMap) {
+ this.mBatteryHistoryMap = batteryHistoryMap;
+ this.mBatteryHistoryKeysCache = mBatteryHistoryKeys;
+ }
+
+ @Override
+ protected Map<Integer, List<BatteryDiffEntry>> doInBackground(Void... voids) {
+ if (mPrefContext == null || mBatteryHistoryKeysCache == null) {
+ return null;
+ }
+ final long startTime = System.currentTimeMillis();
+ final Map<Integer, List<BatteryDiffEntry>> indexedUsageMap =
+ ConvertUtils.getIndexedUsageMap(
+ mPrefContext, /*timeSlotSize=*/ CHART_LEVEL_ARRAY_SIZE - 1,
+ mBatteryHistoryKeysCache, mBatteryHistoryMap,
+ /*purgeLowPercentageAndFakeData=*/ true);
+ // Pre-loads each BatteryDiffEntry relative icon and label for all slots.
+ for (List<BatteryDiffEntry> entries : indexedUsageMap.values()) {
+ entries.forEach(entry -> entry.loadLabelAndIcon());
+ }
+ Log.d(TAG, String.format("execute LoadAllItemsInfoTask in %d/ms",
+ (System.currentTimeMillis() - startTime)));
+ return indexedUsageMap;
+ }
+
+ @Override
+ protected void onPostExecute(
+ Map<Integer, List<BatteryDiffEntry>> indexedUsageMap) {
+ mBatteryHistoryMap = null;
+ mBatteryHistoryKeysCache = null;
+ if (indexedUsageMap == null) {
+ return;
+ }
+ // Posts results back to main thread to refresh UI.
+ mHandler.post(() -> {
+ mBatteryIndexedMap = indexedUsageMap;
+ forceRefreshUi();
+ });
+ }
+ }
+}
diff --git a/src/com/android/settings/fuelgauge/batteryusage/BatteryChartViewV2.java b/src/com/android/settings/fuelgauge/batteryusage/BatteryChartViewV2.java
new file mode 100644
index 0000000..9b6abb0
--- /dev/null
+++ b/src/com/android/settings/fuelgauge/batteryusage/BatteryChartViewV2.java
@@ -0,0 +1,631 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.settings.fuelgauge.batteryusage;
+
+import static com.android.settings.Utils.formatPercentage;
+
+import static java.lang.Math.round;
+
+import android.accessibilityservice.AccessibilityServiceInfo;
+import android.annotation.NonNull;
+import android.content.Context;
+import android.content.res.Resources;
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.CornerPathEffect;
+import android.graphics.Paint;
+import android.graphics.Path;
+import android.graphics.Rect;
+import android.os.Handler;
+import android.util.AttributeSet;
+import android.util.Log;
+import android.view.HapticFeedbackConstants;
+import android.view.MotionEvent;
+import android.view.View;
+import android.view.accessibility.AccessibilityManager;
+import android.widget.TextView;
+
+import androidx.annotation.VisibleForTesting;
+import androidx.appcompat.widget.AppCompatImageView;
+
+import com.android.settings.R;
+import com.android.settings.overlay.FeatureFactory;
+import com.android.settingslib.Utils;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Locale;
+
+/** A widget component to draw chart graph. */
+public class BatteryChartViewV2 extends AppCompatImageView implements View.OnClickListener,
+ AccessibilityManager.AccessibilityStateChangeListener {
+ private static final String TAG = "BatteryChartViewV2";
+ private static final List<String> ACCESSIBILITY_SERVICE_NAMES =
+ Arrays.asList("SwitchAccessService", "TalkBackService", "JustSpeakService");
+
+ private static final int DEFAULT_TRAPEZOID_COUNT = 12;
+ private static final int DEFAULT_AXIS_LABEL_COUNT = 4;
+ private static final int AXIS_LABEL_GAPS_COUNT = DEFAULT_AXIS_LABEL_COUNT - 1;
+ private static final int DIVIDER_COLOR = Color.parseColor("#CDCCC5");
+ private static final long UPDATE_STATE_DELAYED_TIME = 500L;
+
+ /** Selects all trapezoid shapes. */
+ public static final int SELECTED_INDEX_ALL = -1;
+ public static final int SELECTED_INDEX_INVALID = -2;
+
+ /** A callback listener for selected group index is updated. */
+ public interface OnSelectListener {
+ /** The callback function for selected group index is updated. */
+ void onSelect(int trapezoidIndex);
+ }
+
+ private int mDividerWidth;
+ private int mDividerHeight;
+ private int mTrapezoidCount;
+ private float mTrapezoidVOffset;
+ private float mTrapezoidHOffset;
+ private boolean mIsSlotsClickabled;
+ private String[] mPercentages = getPercentages();
+
+ @VisibleForTesting
+ int mHoveredIndex = SELECTED_INDEX_INVALID;
+ @VisibleForTesting
+ int mSelectedIndex = SELECTED_INDEX_INVALID;
+ @VisibleForTesting
+ String[] mAxisLabels;
+
+ // Colors for drawing the trapezoid shape and dividers.
+ private int mTrapezoidColor;
+ private int mTrapezoidSolidColor;
+ private int mTrapezoidHoverColor;
+ // For drawing the percentage information.
+ private int mTextPadding;
+ private final Rect mIndent = new Rect();
+ private final Rect[] mPercentageBounds =
+ new Rect[]{new Rect(), new Rect(), new Rect()};
+ // For drawing the axis label information.
+ private final Rect[] mAxisLabelsBounds =
+ new Rect[]{new Rect(), new Rect(), new Rect(), new Rect()};
+
+ @VisibleForTesting
+ Handler mHandler = new Handler();
+ @VisibleForTesting
+ final Runnable mUpdateClickableStateRun = () -> updateClickableState();
+
+ private int[] mLevels;
+ private Paint mTextPaint;
+ private Paint mDividerPaint;
+ private Paint mTrapezoidPaint;
+
+ @VisibleForTesting
+ Paint mTrapezoidCurvePaint = null;
+ private TrapezoidSlot[] mTrapezoidSlots;
+ // Records the location to calculate selected index.
+ private float mTouchUpEventX = Float.MIN_VALUE;
+ private BatteryChartViewV2.OnSelectListener mOnSelectListener;
+
+ public BatteryChartViewV2(Context context) {
+ super(context, null);
+ }
+
+ public BatteryChartViewV2(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ initializeColors(context);
+ // Registers the click event listener.
+ setOnClickListener(this);
+ setSelectedIndex(SELECTED_INDEX_ALL);
+ setTrapezoidCount(DEFAULT_TRAPEZOID_COUNT);
+ setClickable(false);
+ }
+
+ /** Sets the total trapezoid count for drawing. */
+ public void setTrapezoidCount(int trapezoidCount) {
+ Log.i(TAG, "trapezoidCount:" + trapezoidCount);
+ mTrapezoidCount = trapezoidCount;
+ mTrapezoidSlots = new TrapezoidSlot[trapezoidCount];
+ // Allocates the trapezoid slot array.
+ for (int index = 0; index < trapezoidCount; index++) {
+ mTrapezoidSlots[index] = new TrapezoidSlot();
+ }
+ invalidate();
+ }
+
+ /** Sets all levels value to draw the trapezoid shape */
+ public void setLevels(int[] levels) {
+ Log.d(TAG, "setLevels() " + (levels == null ? "null" : levels.length));
+ if (levels == null) {
+ mLevels = null;
+ return;
+ }
+ // We should provide trapezoid count + 1 data to draw all trapezoids.
+ mLevels = levels.length == mTrapezoidCount + 1 ? levels : null;
+ setClickable(false);
+ invalidate();
+ if (mLevels == null) {
+ return;
+ }
+ // Sets the chart is clickable if there is at least one valid item in it.
+ for (int index = 0; index < mLevels.length - 1; index++) {
+ if (mLevels[index] != 0 && mLevels[index + 1] != 0) {
+ setClickable(true);
+ break;
+ }
+ }
+ }
+
+ /** Sets the selected group index to draw highlight effect. */
+ public void setSelectedIndex(int index) {
+ if (mSelectedIndex != index) {
+ mSelectedIndex = index;
+ invalidate();
+ // Callbacks to the listener if we have.
+ if (mOnSelectListener != null) {
+ mOnSelectListener.onSelect(mSelectedIndex);
+ }
+ }
+ }
+
+ /** Sets the callback to monitor the selected group index. */
+ public void setOnSelectListener(BatteryChartViewV2.OnSelectListener listener) {
+ mOnSelectListener = listener;
+ }
+
+ /** Sets the companion {@link TextView} for percentage information. */
+ public void setCompanionTextView(TextView textView) {
+ if (textView != null) {
+ // Pre-draws the view first to load style atttributions into paint.
+ textView.draw(new Canvas());
+ mTextPaint = textView.getPaint();
+ } else {
+ mTextPaint = null;
+ }
+ setVisibility(View.VISIBLE);
+ requestLayout();
+ }
+
+ /**
+ * Sets the X-axis labels list for each level. This class will choose some labels among the
+ * input list to show.
+ *
+ * @param labels The length of this parameter should be the same as the length of
+ * {@code levels}.
+ */
+ public void setAxisLabels(@NonNull String[] labels) {
+ if (mAxisLabels == null) {
+ mAxisLabels = new String[DEFAULT_AXIS_LABEL_COUNT];
+ }
+ // Current logic is always showing {@code AXIS_LABEL_GAPS_COUNT} labels.
+ // TODO: Support different count of labels for different levels sizes.
+ final int step = (labels.length - 1) / AXIS_LABEL_GAPS_COUNT;
+ for (int index = 0; index < DEFAULT_AXIS_LABEL_COUNT; index++) {
+ mAxisLabels[index] = labels[index * step];
+ }
+ requestLayout();
+ }
+
+ @Override
+ public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+ super.onMeasure(widthMeasureSpec, heightMeasureSpec);
+ // Measures text bounds and updates indent configuration.
+ if (mTextPaint != null) {
+ for (int index = 0; index < mPercentages.length; index++) {
+ mTextPaint.getTextBounds(
+ mPercentages[index], 0, mPercentages[index].length(),
+ mPercentageBounds[index]);
+ }
+ // Updates the indent configurations.
+ mIndent.top = mPercentageBounds[0].height();
+ mIndent.right = mPercentageBounds[0].width() + mTextPadding;
+
+ if (mAxisLabels != null) {
+ int maxHeight = 0;
+ for (int index = 0; index < DEFAULT_AXIS_LABEL_COUNT; index++) {
+ mTextPaint.getTextBounds(
+ mAxisLabels[index], 0, mAxisLabels[index].length(),
+ mAxisLabelsBounds[index]);
+ maxHeight = Math.max(maxHeight, mAxisLabelsBounds[index].height());
+ }
+ mIndent.bottom = maxHeight + round(mTextPadding * 1.5f);
+ }
+ Log.d(TAG, "setIndent:" + mPercentageBounds[0]);
+ } else {
+ mIndent.set(0, 0, 0, 0);
+ }
+ }
+
+ @Override
+ public void draw(Canvas canvas) {
+ super.draw(canvas);
+ drawHorizontalDividers(canvas);
+ drawVerticalDividers(canvas);
+ drawTrapezoids(canvas);
+ }
+
+ @Override
+ public boolean onTouchEvent(MotionEvent event) {
+ // Caches the location to calculate selected trapezoid index.
+ final int action = event.getAction();
+ switch (action) {
+ case MotionEvent.ACTION_UP:
+ mTouchUpEventX = event.getX();
+ break;
+ case MotionEvent.ACTION_CANCEL:
+ mTouchUpEventX = Float.MIN_VALUE; // reset
+ break;
+ }
+ return super.onTouchEvent(event);
+ }
+
+ @Override
+ public boolean onHoverEvent(MotionEvent event) {
+ final int action = event.getAction();
+ switch (action) {
+ case MotionEvent.ACTION_HOVER_ENTER:
+ case MotionEvent.ACTION_HOVER_MOVE:
+ final int trapezoidIndex = getTrapezoidIndex(event.getX());
+ if (mHoveredIndex != trapezoidIndex) {
+ mHoveredIndex = trapezoidIndex;
+ invalidate();
+ }
+ break;
+ }
+ return super.onHoverEvent(event);
+ }
+
+ @Override
+ public void onHoverChanged(boolean hovered) {
+ super.onHoverChanged(hovered);
+ if (!hovered) {
+ mHoveredIndex = SELECTED_INDEX_INVALID; // reset
+ invalidate();
+ }
+ }
+
+ @Override
+ public void onClick(View view) {
+ if (mTouchUpEventX == Float.MIN_VALUE) {
+ Log.w(TAG, "invalid motion event for onClick() callback");
+ return;
+ }
+ final int trapezoidIndex = getTrapezoidIndex(mTouchUpEventX);
+ // Ignores the click event if the level is zero.
+ if (trapezoidIndex == SELECTED_INDEX_INVALID
+ || !isValidToDraw(trapezoidIndex)) {
+ return;
+ }
+ // Selects all if users click the same trapezoid item two times.
+ if (trapezoidIndex == mSelectedIndex) {
+ setSelectedIndex(SELECTED_INDEX_ALL);
+ } else {
+ setSelectedIndex(trapezoidIndex);
+ }
+ view.performHapticFeedback(HapticFeedbackConstants.CONTEXT_CLICK);
+ }
+
+ @Override
+ public void onAttachedToWindow() {
+ super.onAttachedToWindow();
+ updateClickableState();
+ mContext.getSystemService(AccessibilityManager.class)
+ .addAccessibilityStateChangeListener(/*listener=*/ this);
+ }
+
+ @Override
+ public void onDetachedFromWindow() {
+ super.onDetachedFromWindow();
+ mContext.getSystemService(AccessibilityManager.class)
+ .removeAccessibilityStateChangeListener(/*listener=*/ this);
+ mHandler.removeCallbacks(mUpdateClickableStateRun);
+ }
+
+ @Override
+ public void onAccessibilityStateChanged(boolean enabled) {
+ Log.d(TAG, "onAccessibilityStateChanged:" + enabled);
+ mHandler.removeCallbacks(mUpdateClickableStateRun);
+ // We should delay it a while since accessibility manager will spend
+ // some times to bind with new enabled accessibility services.
+ mHandler.postDelayed(
+ mUpdateClickableStateRun, UPDATE_STATE_DELAYED_TIME);
+ }
+
+ private void updateClickableState() {
+ final Context context = mContext;
+ mIsSlotsClickabled =
+ FeatureFactory.getFactory(context)
+ .getPowerUsageFeatureProvider(context)
+ .isChartGraphSlotsEnabled(context)
+ && !isAccessibilityEnabled(context);
+ Log.d(TAG, "isChartGraphSlotsEnabled:" + mIsSlotsClickabled);
+ setClickable(isClickable());
+ // Initializes the trapezoid curve paint for non-clickable case.
+ if (!mIsSlotsClickabled && mTrapezoidCurvePaint == null) {
+ mTrapezoidCurvePaint = new Paint();
+ mTrapezoidCurvePaint.setAntiAlias(true);
+ mTrapezoidCurvePaint.setColor(mTrapezoidSolidColor);
+ mTrapezoidCurvePaint.setStyle(Paint.Style.STROKE);
+ mTrapezoidCurvePaint.setStrokeWidth(mDividerWidth * 2);
+ } else if (mIsSlotsClickabled) {
+ mTrapezoidCurvePaint = null;
+ // Sets levels again to force update the click state.
+ setLevels(mLevels);
+ }
+ invalidate();
+ }
+
+ @Override
+ public void setClickable(boolean clickable) {
+ super.setClickable(mIsSlotsClickabled && clickable);
+ }
+
+ @VisibleForTesting
+ void setClickableForce(boolean clickable) {
+ super.setClickable(clickable);
+ }
+
+ private void initializeColors(Context context) {
+ setBackgroundColor(Color.TRANSPARENT);
+ mTrapezoidSolidColor = Utils.getColorAccentDefaultColor(context);
+ mTrapezoidColor = Utils.getDisabled(context, mTrapezoidSolidColor);
+ mTrapezoidHoverColor = Utils.getColorAttrDefaultColor(context,
+ com.android.internal.R.attr.colorAccentSecondaryVariant);
+ // Initializes the divider line paint.
+ final Resources resources = getContext().getResources();
+ mDividerWidth = resources.getDimensionPixelSize(R.dimen.chartview_divider_width);
+ mDividerHeight = resources.getDimensionPixelSize(R.dimen.chartview_divider_height);
+ mDividerPaint = new Paint();
+ mDividerPaint.setAntiAlias(true);
+ mDividerPaint.setColor(DIVIDER_COLOR);
+ mDividerPaint.setStyle(Paint.Style.STROKE);
+ mDividerPaint.setStrokeWidth(mDividerWidth);
+ Log.i(TAG, "mDividerWidth:" + mDividerWidth);
+ Log.i(TAG, "mDividerHeight:" + mDividerHeight);
+ // Initializes the trapezoid paint.
+ mTrapezoidHOffset = resources.getDimension(R.dimen.chartview_trapezoid_margin_start);
+ mTrapezoidVOffset = resources.getDimension(R.dimen.chartview_trapezoid_margin_bottom);
+ mTrapezoidPaint = new Paint();
+ mTrapezoidPaint.setAntiAlias(true);
+ mTrapezoidPaint.setColor(mTrapezoidSolidColor);
+ mTrapezoidPaint.setStyle(Paint.Style.FILL);
+ mTrapezoidPaint.setPathEffect(
+ new CornerPathEffect(
+ resources.getDimensionPixelSize(R.dimen.chartview_trapezoid_radius)));
+ // Initializes for drawing text information.
+ mTextPadding = resources.getDimensionPixelSize(R.dimen.chartview_text_padding);
+ }
+
+ private void drawHorizontalDividers(Canvas canvas) {
+ final int width = getWidth() - mIndent.right;
+ final int height = getHeight() - mIndent.top - mIndent.bottom;
+ // Draws the top divider line for 100% curve.
+ float offsetY = mIndent.top + mDividerWidth * .5f;
+ canvas.drawLine(0, offsetY, width, offsetY, mDividerPaint);
+ drawPercentage(canvas, /*index=*/ 0, offsetY);
+
+ // Draws the center divider line for 50% curve.
+ final float availableSpace =
+ height - mDividerWidth * 2 - mTrapezoidVOffset - mDividerHeight;
+ offsetY = mIndent.top + mDividerWidth + availableSpace * .5f;
+ canvas.drawLine(0, offsetY, width, offsetY, mDividerPaint);
+ drawPercentage(canvas, /*index=*/ 1, offsetY);
+
+ // Draws the bottom divider line for 0% curve.
+ offsetY = mIndent.top + (height - mDividerHeight - mDividerWidth * .5f);
+ canvas.drawLine(0, offsetY, width, offsetY, mDividerPaint);
+ drawPercentage(canvas, /*index=*/ 2, offsetY);
+ }
+
+ private void drawPercentage(Canvas canvas, int index, float offsetY) {
+ if (mTextPaint != null) {
+ canvas.drawText(
+ mPercentages[index],
+ getWidth() - mPercentageBounds[index].width()
+ - mPercentageBounds[index].left,
+ offsetY + mPercentageBounds[index].height() * .5f,
+ mTextPaint);
+ }
+ }
+
+ private void drawVerticalDividers(Canvas canvas) {
+ final int width = getWidth() - mIndent.right;
+ final int dividerCount = mTrapezoidCount + 1;
+ final float dividerSpace = dividerCount * mDividerWidth;
+ final float unitWidth = (width - dividerSpace) / (float) mTrapezoidCount;
+ final float bottomY = getHeight() - mIndent.bottom;
+ final float startY = bottomY - mDividerHeight;
+ final float trapezoidSlotOffset = mTrapezoidHOffset + mDividerWidth * .5f;
+ // Draws each vertical dividers.
+ float startX = mDividerWidth * .5f;
+ for (int index = 0; index < dividerCount; index++) {
+ canvas.drawLine(startX, startY, startX, bottomY, mDividerPaint);
+ final float nextX = startX + mDividerWidth + unitWidth;
+ // Updates the trapezoid slots for drawing.
+ if (index < mTrapezoidSlots.length) {
+ mTrapezoidSlots[index].mLeft = round(startX + trapezoidSlotOffset);
+ mTrapezoidSlots[index].mRight = round(nextX - trapezoidSlotOffset);
+ }
+ startX = nextX;
+ }
+ // Draws the axis label slot information.
+ if (mAxisLabels != null) {
+ final float[] xOffsets = new float[DEFAULT_AXIS_LABEL_COUNT];
+ final float baselineX = mDividerWidth * .5f;
+ final float offsetX = mDividerWidth + unitWidth;
+ // TODO: Support different count of labels for different levels sizes.
+ final int slotBarOffset = (/*total 12 bars*/ 12) / AXIS_LABEL_GAPS_COUNT;
+ for (int index = 0; index < DEFAULT_AXIS_LABEL_COUNT; index++) {
+ xOffsets[index] = baselineX + index * offsetX * slotBarOffset;
+ }
+ drawAxisLabel(canvas, xOffsets);
+ }
+ }
+
+ private void drawAxisLabel(Canvas canvas, float[] xOffsets) {
+ // Draws the 1st axis label info.
+ canvas.drawText(
+ mAxisLabels[0], xOffsets[0] - mAxisLabelsBounds[0].left, getAxisLabelY(0),
+ mTextPaint);
+ final int latestIndex = DEFAULT_AXIS_LABEL_COUNT - 1;
+ // Draws the last axis label info.
+ canvas.drawText(
+ mAxisLabels[latestIndex],
+ xOffsets[latestIndex]
+ - mAxisLabelsBounds[latestIndex].width()
+ - mAxisLabelsBounds[latestIndex].left,
+ getAxisLabelY(latestIndex),
+ mTextPaint);
+ // Draws the rest of axis label info since it is located in the center.
+ for (int index = 1; index <= DEFAULT_AXIS_LABEL_COUNT - 2; index++) {
+ canvas.drawText(
+ mAxisLabels[index],
+ xOffsets[index]
+ - (mAxisLabelsBounds[index].width() - mAxisLabelsBounds[index].left)
+ * .5f,
+ getAxisLabelY(index),
+ mTextPaint);
+ }
+ }
+
+ private int getAxisLabelY(int index) {
+ return getHeight()
+ - mAxisLabelsBounds[index].height()
+ + (mAxisLabelsBounds[index].height() + mAxisLabelsBounds[index].top)
+ + round(mTextPadding * 1.5f);
+ }
+
+ private void drawTrapezoids(Canvas canvas) {
+ // Ignores invalid trapezoid data.
+ if (mLevels == null) {
+ return;
+ }
+ final float trapezoidBottom =
+ getHeight() - mIndent.bottom - mDividerHeight - mDividerWidth
+ - mTrapezoidVOffset;
+ final float availableSpace = trapezoidBottom - mDividerWidth * .5f - mIndent.top;
+ final float unitHeight = availableSpace / 100f;
+ // Draws all trapezoid shapes into the canvas.
+ final Path trapezoidPath = new Path();
+ Path trapezoidCurvePath = null;
+ for (int index = 0; index < mTrapezoidCount; index++) {
+ // Not draws the trapezoid for corner or not initialization cases.
+ if (!isValidToDraw(index)) {
+ if (mTrapezoidCurvePaint != null && trapezoidCurvePath != null) {
+ canvas.drawPath(trapezoidCurvePath, mTrapezoidCurvePaint);
+ trapezoidCurvePath = null;
+ }
+ continue;
+ }
+ // Configures the trapezoid paint color.
+ final int trapezoidColor =
+ !mIsSlotsClickabled
+ ? mTrapezoidColor
+ : mSelectedIndex == index || mSelectedIndex == SELECTED_INDEX_ALL
+ ? mTrapezoidSolidColor : mTrapezoidColor;
+ final boolean isHoverState =
+ mIsSlotsClickabled && mHoveredIndex == index && isValidToDraw(mHoveredIndex);
+ mTrapezoidPaint.setColor(isHoverState ? mTrapezoidHoverColor : trapezoidColor);
+
+ final float leftTop = round(trapezoidBottom - mLevels[index] * unitHeight);
+ final float rightTop = round(trapezoidBottom - mLevels[index + 1] * unitHeight);
+ trapezoidPath.reset();
+ trapezoidPath.moveTo(mTrapezoidSlots[index].mLeft, trapezoidBottom);
+ trapezoidPath.lineTo(mTrapezoidSlots[index].mLeft, leftTop);
+ trapezoidPath.lineTo(mTrapezoidSlots[index].mRight, rightTop);
+ trapezoidPath.lineTo(mTrapezoidSlots[index].mRight, trapezoidBottom);
+ // A tricky way to make the trapezoid shape drawing the rounded corner.
+ trapezoidPath.lineTo(mTrapezoidSlots[index].mLeft, trapezoidBottom);
+ trapezoidPath.lineTo(mTrapezoidSlots[index].mLeft, leftTop);
+ // Draws the trapezoid shape into canvas.
+ canvas.drawPath(trapezoidPath, mTrapezoidPaint);
+
+ // Generates path for non-clickable trapezoid curve.
+ if (mTrapezoidCurvePaint != null) {
+ if (trapezoidCurvePath == null) {
+ trapezoidCurvePath = new Path();
+ trapezoidCurvePath.moveTo(mTrapezoidSlots[index].mLeft, leftTop);
+ } else {
+ trapezoidCurvePath.lineTo(mTrapezoidSlots[index].mLeft, leftTop);
+ }
+ trapezoidCurvePath.lineTo(mTrapezoidSlots[index].mRight, rightTop);
+ }
+ }
+ // Draws the trapezoid curve for non-clickable case.
+ if (mTrapezoidCurvePaint != null && trapezoidCurvePath != null) {
+ canvas.drawPath(trapezoidCurvePath, mTrapezoidCurvePaint);
+ trapezoidCurvePath = null;
+ }
+ }
+
+ // Searches the corresponding trapezoid index from x location.
+ private int getTrapezoidIndex(float x) {
+ for (int index = 0; index < mTrapezoidSlots.length; index++) {
+ final TrapezoidSlot slot = mTrapezoidSlots[index];
+ if (x >= slot.mLeft - mTrapezoidHOffset
+ && x <= slot.mRight + mTrapezoidHOffset) {
+ return index;
+ }
+ }
+ return SELECTED_INDEX_INVALID;
+ }
+
+ private boolean isValidToDraw(int trapezoidIndex) {
+ return mLevels != null
+ && trapezoidIndex >= 0
+ && trapezoidIndex < mLevels.length - 1
+ && mLevels[trapezoidIndex] != 0
+ && mLevels[trapezoidIndex + 1] != 0;
+ }
+
+ private static String[] getPercentages() {
+ return new String[]{
+ formatPercentage(/*percentage=*/ 100, /*round=*/ true),
+ formatPercentage(/*percentage=*/ 50, /*round=*/ true),
+ formatPercentage(/*percentage=*/ 0, /*round=*/ true)};
+ }
+
+ @VisibleForTesting
+ static boolean isAccessibilityEnabled(Context context) {
+ final AccessibilityManager accessibilityManager =
+ context.getSystemService(AccessibilityManager.class);
+ if (!accessibilityManager.isEnabled()) {
+ return false;
+ }
+ final List<AccessibilityServiceInfo> serviceInfoList =
+ accessibilityManager.getEnabledAccessibilityServiceList(
+ AccessibilityServiceInfo.FEEDBACK_SPOKEN
+ | AccessibilityServiceInfo.FEEDBACK_GENERIC);
+ for (AccessibilityServiceInfo info : serviceInfoList) {
+ for (String serviceName : ACCESSIBILITY_SERVICE_NAMES) {
+ final String serviceId = info.getId();
+ if (serviceId != null && serviceId.contains(serviceName)) {
+ Log.d(TAG, "acccessibilityEnabled:" + serviceId);
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ // A container class for each trapezoid left and right location.
+ private static final class TrapezoidSlot {
+ public float mLeft;
+ public float mRight;
+
+ @Override
+ public String toString() {
+ return String.format(Locale.US, "TrapezoidSlot[%f,%f]", mLeft, mRight);
+ }
+ }
+}
diff --git a/src/com/android/settings/fuelgauge/batteryusage/BatteryDiffEntry.java b/src/com/android/settings/fuelgauge/batteryusage/BatteryDiffEntry.java
index 8b995c8..d4d7a00 100644
--- a/src/com/android/settings/fuelgauge/batteryusage/BatteryDiffEntry.java
+++ b/src/com/android/settings/fuelgauge/batteryusage/BatteryDiffEntry.java
@@ -113,6 +113,9 @@
/** Gets the app label name for this entry. */
public String getAppLabel() {
+ if (isOtherUsers()) {
+ return mContext.getString(R.string.battery_usage_other_users);
+ }
loadLabelAndIcon();
// Returns default applicationn label if we cannot find it.
return mAppLabel == null || mAppLabel.length() == 0
@@ -122,6 +125,9 @@
/** Gets the app icon {@link Drawable} for this entry. */
public Drawable getAppIcon() {
+ if (isOtherUsers()) {
+ return mContext.getDrawable(R.drawable.ic_power_system);
+ }
loadLabelAndIcon();
return mAppIcon != null && mAppIcon.getConstantState() != null
? mAppIcon.getConstantState().newDrawable()
@@ -156,6 +162,9 @@
/** Whether the current BatteryDiffEntry is system component or not. */
public boolean isSystemEntry() {
+ if (isOtherUsers()) {
+ return true;
+ }
switch (mBatteryHistEntry.mConsumerType) {
case ConvertUtils.CONSUMER_TYPE_USER_BATTERY:
case ConvertUtils.CONSUMER_TYPE_SYSTEM_BATTERY:
@@ -175,6 +184,11 @@
return false;
}
+ private boolean isOtherUsers() {
+ return mBatteryHistEntry.mConsumerType == ConvertUtils.CONSUMER_TYPE_UID_BATTERY
+ && mBatteryHistEntry.mUid == BatteryUtils.UID_OTHER_USERS;
+ }
+
void loadLabelAndIcon() {
if (mIsLoaded) {
return;
diff --git a/src/com/android/settings/fuelgauge/batteryusage/BatteryLevelData.java b/src/com/android/settings/fuelgauge/batteryusage/BatteryLevelData.java
new file mode 100644
index 0000000..94d7c0e
--- /dev/null
+++ b/src/com/android/settings/fuelgauge/batteryusage/BatteryLevelData.java
@@ -0,0 +1,73 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.fuelgauge.batteryusage;
+
+import android.util.Log;
+
+import com.google.common.collect.ImmutableList;
+
+import java.util.List;
+
+/** Wraps the battery timestamp and level data used for battery usage chart. */
+public final class BatteryLevelData {
+
+ /** A container for the battery timestamp and level data. */
+ public static final class PeriodBatteryLevelData {
+ private static final String TAG = "PeriodBatteryLevelData";
+
+ private final ImmutableList<Long> mTimestamps;
+ private final ImmutableList<Integer> mLevels;
+
+ public PeriodBatteryLevelData(List<Long> timestamps, List<Integer> levels) {
+ if (timestamps.size() != levels.size()) {
+ Log.e(TAG, "Different sizes of timestamps and levels. Timestamp: "
+ + timestamps.size() + ", Level: " + levels.size());
+ mTimestamps = ImmutableList.of();
+ mLevels = ImmutableList.of();
+ return;
+ }
+ mTimestamps = ImmutableList.copyOf(timestamps);
+ mLevels = ImmutableList.copyOf(levels);
+ }
+
+ public ImmutableList<Long> getTimestamps() {
+ return mTimestamps;
+ }
+
+ public ImmutableList<Integer> getLevels() {
+ return mLevels;
+ }
+ }
+
+ private final PeriodBatteryLevelData mDailyBatteryLevels;
+ private final ImmutableList<PeriodBatteryLevelData> mHourlyBatteryLevelsPerDay;
+
+ public BatteryLevelData(
+ PeriodBatteryLevelData dailyBatteryLevels,
+ List<PeriodBatteryLevelData> hourlyBatteryLevelsPerDay) {
+ mDailyBatteryLevels = dailyBatteryLevels;
+ mHourlyBatteryLevelsPerDay = ImmutableList.copyOf(hourlyBatteryLevelsPerDay);
+ }
+
+ public PeriodBatteryLevelData getDailyBatteryLevels() {
+ return mDailyBatteryLevels;
+ }
+
+ public ImmutableList<PeriodBatteryLevelData> getHourlyBatteryLevelsPerDay() {
+ return mHourlyBatteryLevelsPerDay;
+ }
+}
diff --git a/src/com/android/settings/fuelgauge/batteryusage/ConvertUtils.java b/src/com/android/settings/fuelgauge/batteryusage/ConvertUtils.java
index 76f9419..168fe0f 100644
--- a/src/com/android/settings/fuelgauge/batteryusage/ConvertUtils.java
+++ b/src/com/android/settings/fuelgauge/batteryusage/ConvertUtils.java
@@ -21,6 +21,7 @@
import android.os.BatteryUsageStats;
import android.os.LocaleList;
import android.os.UserHandle;
+import android.os.UserManager;
import android.text.format.DateFormat;
import android.text.format.DateUtils;
import android.util.ArraySet;
@@ -28,6 +29,8 @@
import androidx.annotation.VisibleForTesting;
+import com.android.settings.Utils;
+import com.android.settings.fuelgauge.BatteryUtils;
import com.android.settings.overlay.FeatureFactory;
import java.lang.annotation.Retention;
@@ -265,17 +268,55 @@
}
}
insert24HoursData(BatteryChartView.SELECTED_INDEX_ALL, resultMap);
+ resolveMultiUsersData(context, resultMap);
if (purgeLowPercentageAndFakeData) {
purgeLowPercentageAndFakeData(context, resultMap);
}
return resultMap;
}
+ @VisibleForTesting
+ static void resolveMultiUsersData(
+ final Context context,
+ final Map<Integer, List<BatteryDiffEntry>> indexedUsageMap) {
+ final int currentUserId = context.getUserId();
+ final UserHandle userHandle =
+ Utils.getManagedProfile(context.getSystemService(UserManager.class));
+ final int workProfileUserId =
+ userHandle != null ? userHandle.getIdentifier() : Integer.MIN_VALUE;
+ // Loops for all BatteryDiffEntry in the different slots.
+ for (List<BatteryDiffEntry> entryList : indexedUsageMap.values()) {
+ double consumePowerFromOtherUsers = 0f;
+ double consumePercentageFromOtherUsers = 0f;
+ final Iterator<BatteryDiffEntry> iterator = entryList.iterator();
+ while (iterator.hasNext()) {
+ final BatteryDiffEntry entry = iterator.next();
+ final BatteryHistEntry batteryHistEntry = entry.mBatteryHistEntry;
+ if (batteryHistEntry.mConsumerType != CONSUMER_TYPE_UID_BATTERY) {
+ continue;
+ }
+ // Whether the BatteryHistEntry represents the current user data?
+ if (batteryHistEntry.mUserId == currentUserId
+ || batteryHistEntry.mUserId == workProfileUserId) {
+ continue;
+ }
+ // Removes and aggregates non-current users data from the list.
+ iterator.remove();
+ consumePowerFromOtherUsers += entry.mConsumePower;
+ consumePercentageFromOtherUsers += entry.getPercentOfTotal();
+ }
+ if (consumePercentageFromOtherUsers != 0) {
+ entryList.add(createOtherUsersEntry(context, consumePowerFromOtherUsers,
+ consumePercentageFromOtherUsers));
+ }
+ }
+ }
+
private static void insert24HoursData(
final int desiredIndex,
final Map<Integer, List<BatteryDiffEntry>> indexedUsageMap) {
final Map<String, BatteryDiffEntry> resultMap = new HashMap<>();
- double totalConsumePower = 0.0;
+ double totalConsumePower = 0f;
// Loops for all BatteryDiffEntry and aggregate them together.
for (List<BatteryDiffEntry> entryList : indexedUsageMap.values()) {
for (BatteryDiffEntry entry : entryList) {
@@ -361,4 +402,22 @@
return locales != null && !locales.isEmpty() ? locales.get(0)
: Locale.getDefault();
}
+
+ private static BatteryDiffEntry createOtherUsersEntry(
+ Context context, double consumePower, double consumePercentage) {
+ final ContentValues values = new ContentValues();
+ values.put(BatteryHistEntry.KEY_UID, BatteryUtils.UID_OTHER_USERS);
+ values.put(BatteryHistEntry.KEY_USER_ID, BatteryUtils.UID_OTHER_USERS);
+ values.put(BatteryHistEntry.KEY_CONSUMER_TYPE, CONSUMER_TYPE_UID_BATTERY);
+ // We will show the percentage for the "other users" item only, the aggregated
+ // running time information is useless for users to identify individual apps.
+ final BatteryDiffEntry batteryDiffEntry = new BatteryDiffEntry(
+ context,
+ /*foregroundUsageTimeInMs=*/ 0,
+ /*backgroundUsageTimeInMs=*/ 0,
+ consumePower,
+ new BatteryHistEntry(values));
+ batteryDiffEntry.setTotalConsumePower(100 * consumePower / consumePercentage);
+ return batteryDiffEntry;
+ }
}
diff --git a/src/com/android/settings/network/telephony/EnabledNetworkModePreferenceController.java b/src/com/android/settings/network/telephony/EnabledNetworkModePreferenceController.java
index 43b3cc0..2525fbd 100644
--- a/src/com/android/settings/network/telephony/EnabledNetworkModePreferenceController.java
+++ b/src/com/android/settings/network/telephony/EnabledNetworkModePreferenceController.java
@@ -239,8 +239,8 @@
void setPreferenceEntries() {
mTelephonyManager = mTelephonyManager.createForSubscriptionId(mSubId);
final PersistableBundle carrierConfig = mCarrierConfigCache.getConfigForSubId(mSubId);
- final boolean display2gOptions = carrierConfig
- .getBoolean(CarrierConfigManager.KEY_PREFER_2G_BOOL);
+ final boolean display2gOptions = carrierConfig != null
+ && carrierConfig.getBoolean(CarrierConfigManager.KEY_PREFER_2G_BOOL);
clearAllEntries();
UiOptions.Builder uiOptions = UiOptions.newBuilder();
uiOptions.setType(getEnabledNetworkType());
diff --git a/src/com/android/settings/network/telephony/MobileNetworkUtils.java b/src/com/android/settings/network/telephony/MobileNetworkUtils.java
index e769a4e..548ce28 100644
--- a/src/com/android/settings/network/telephony/MobileNetworkUtils.java
+++ b/src/com/android/settings/network/telephony/MobileNetworkUtils.java
@@ -213,7 +213,7 @@
return false;
}
PersistableBundle bundle = carrierConfigCache.getConfigForSubId(subId);
- return bundle.getBoolean(
+ return bundle == null ? false : bundle.getBoolean(
CarrierConfigManager.KEY_USE_RCS_PRESENCE_BOOL, false /*default*/)
|| bundle.getBoolean(CarrierConfigManager.Ims.KEY_RCS_BULK_CAPABILITY_EXCHANGE_BOOL,
false /*default*/);
diff --git a/src/com/android/settings/network/telephony/NetworkProviderWifiCallingGroup.java b/src/com/android/settings/network/telephony/NetworkProviderWifiCallingGroup.java
index 14bdd41..688084f 100644
--- a/src/com/android/settings/network/telephony/NetworkProviderWifiCallingGroup.java
+++ b/src/com/android/settings/network/telephony/NetworkProviderWifiCallingGroup.java
@@ -74,6 +74,7 @@
private Map<Integer, PhoneAccountHandle> mSimCallManagerList = new HashMap<>();
private Map<Integer, Preference> mWifiCallingForSubPreferences;
private List<SubscriptionInfo> mSubInfoListForWfc;
+ private SubscriptionsChangeListener mChangeListener;
public NetworkProviderWifiCallingGroup(Context context, Lifecycle lifecycle,
String preferenceGroupKey) {
@@ -87,26 +88,25 @@
mTelephonyCallback = new PhoneCallStateTelephonyCallback();
}
lifecycle.addObserver(this);
+ mChangeListener = new SubscriptionsChangeListener(context, this);
}
private void setSubscriptionInfoList(Context context) {
mSubInfoListForWfc = new ArrayList<>(
SubscriptionUtil.getActiveSubscriptions(mSubscriptionManager));
- if (mSubInfoListForWfc != null) {
- mSubInfoListForWfc.removeIf(info -> {
- final int subId = info.getSubscriptionId();
- setTelephonyManagerForSubscriptionId(context, subId);
- setPhoneAccountHandleForSubscriptionId(context, subId);
- boolean isExisted = mSubInfoListForWfc.contains(info);
- boolean shouldShowWfcForSub = shouldShowWifiCallingForSub(subId);
- if (!shouldShowWfcForSub && isExisted) {
- return true;
- }
- return false;
- });
- } else {
- Log.d(TAG, "No active subscriptions");
- }
+ mSubInfoListForWfc.removeIf(info -> {
+ final int subId = info.getSubscriptionId();
+ setTelephonyManagerForSubscriptionId(context, subId);
+ setPhoneAccountHandleForSubscriptionId(context, subId);
+ boolean isExisted = mSubInfoListForWfc.contains(info);
+ boolean shouldShowWfcForSub = shouldShowWifiCallingForSub(subId);
+ if (!shouldShowWfcForSub && isExisted) {
+ return true;
+ }
+ return false;
+ });
+ Log.d(TAG, "setSubscriptionInfoList: mSubInfoListForWfc size:"
+ + mSubInfoListForWfc.size());
}
private void setTelephonyManagerForSubscriptionId(Context context, int subId) {
@@ -137,12 +137,18 @@
@OnLifecycleEvent(Event.ON_RESUME)
public void onResume() {
+ if (mChangeListener != null) {
+ mChangeListener.start();
+ }
updateListener();
update();
}
@OnLifecycleEvent(Event.ON_PAUSE)
public void onPause() {
+ if (mChangeListener != null) {
+ mChangeListener.stop();
+ }
if ((mTelephonyCallback != null)) {
mTelephonyCallback.unregister();
}
@@ -176,6 +182,7 @@
private void update() {
if (mPreferenceGroup == null) {
+ Log.d(TAG, "mPreferenceGroup == null");
return;
}
@@ -255,7 +262,11 @@
@Override
public void onSubscriptionsChanged() {
+ Log.d(TAG, "onSubscriptionsChanged:");
setSubscriptionInfoList(mContext);
+ if (mPreferenceGroup != null) {
+ mPreferenceGroup.setVisible(isAvailable());
+ }
updateListener();
update();
}
@@ -322,6 +333,7 @@
CarrierConfigManager.KEY_CARRIER_WFC_IMS_AVAILABLE_BOOL);
}
}
+ Log.d(TAG, "isWifiCallingAvailableForCarrier:" + isWifiCallingAvailableForCarrier);
return isWifiCallingAvailableForCarrier;
}
diff --git a/src/com/android/settings/privacy/PrivacyControlsFragment.java b/src/com/android/settings/privacy/PrivacyControlsFragment.java
index 7b33364..1d9a4712 100644
--- a/src/com/android/settings/privacy/PrivacyControlsFragment.java
+++ b/src/com/android/settings/privacy/PrivacyControlsFragment.java
@@ -33,15 +33,12 @@
private static final String TAG = "PrivacyDashboardFrag";
private static final String CAMERA_KEY = "privacy_camera_toggle";
private static final String MIC_KEY = "privacy_mic_toggle";
- private static final String LOCATION_KEY = "privacy_location_toggle";
@Override
protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
final List<AbstractPreferenceController> controllers = new ArrayList<>();
controllers.add(new CameraToggleController(context, CAMERA_KEY));
controllers.add(new MicToggleController(context, MIC_KEY));
- controllers.add(new LocationToggleController(context, LOCATION_KEY,
- getSettingsLifecycle()));
controllers.add(new ShowClipAccessNotificationPreferenceController(context));
return controllers;
}
diff --git a/tests/robotests/src/com/android/settings/accessibility/AccessibilityButtonFragmentTest.java b/tests/robotests/src/com/android/settings/accessibility/AccessibilityButtonFragmentTest.java
index e34767e..1051483 100644
--- a/tests/robotests/src/com/android/settings/accessibility/AccessibilityButtonFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/accessibility/AccessibilityButtonFragmentTest.java
@@ -24,6 +24,7 @@
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.when;
+import android.app.settings.SettingsEnums;
import android.content.Context;
import android.content.res.Resources;
import android.os.Bundle;
@@ -71,6 +72,17 @@
}
@Test
+ public void getMetricsCategory_returnsCorrectCategory() {
+ assertThat(mFragment.getMetricsCategory()).isEqualTo(
+ SettingsEnums.ACCESSIBILITY_BUTTON_SETTINGS);
+ }
+
+ @Test
+ public void getLogTag_returnsCorrectTag() {
+ assertThat(mFragment.getLogTag()).isEqualTo("AccessibilityButtonFragment");
+ }
+
+ @Test
public void onCreate_navigationGestureEnabled_setCorrectTitle() {
when(mResources.getInteger(com.android.internal.R.integer.config_navBarInteractionMode))
.thenReturn(NAV_BAR_MODE_GESTURAL);
diff --git a/tests/robotests/src/com/android/settings/accessibility/AccessibilityDetailsSettingsFragmentTest.java b/tests/robotests/src/com/android/settings/accessibility/AccessibilityDetailsSettingsFragmentTest.java
index b0efbcb..605c258 100644
--- a/tests/robotests/src/com/android/settings/accessibility/AccessibilityDetailsSettingsFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/accessibility/AccessibilityDetailsSettingsFragmentTest.java
@@ -28,6 +28,7 @@
import static org.mockito.Mockito.verify;
import android.accessibilityservice.AccessibilityServiceInfo;
+import android.app.settings.SettingsEnums;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
@@ -60,6 +61,7 @@
import java.util.ArrayList;
import java.util.List;
+/** Tests for {@link AccessibilityDetailsSettingsFragment}. */
@Config(shadows = ShadowFragment.class)
@RunWith(RobolectricTestRunner.class)
public class AccessibilityDetailsSettingsFragmentTest {
@@ -169,6 +171,12 @@
AccessibilityButtonFragment.class.getName());
}
+ @Test
+ public void getMetricsCategory_returnsCorrectCategory() {
+ assertThat(mFragment.getMetricsCategory()).isEqualTo(
+ SettingsEnums.ACCESSIBILITY_DETAILS_SETTINGS);
+ }
+
private AccessibilityServiceInfo getMockAccessibilityServiceInfo() {
final ApplicationInfo applicationInfo = new ApplicationInfo();
final ServiceInfo serviceInfo = new ServiceInfo();
diff --git a/tests/robotests/src/com/android/settings/accessibility/AudioAdjustmentFragmentTest.java b/tests/robotests/src/com/android/settings/accessibility/AudioAdjustmentFragmentTest.java
index 814736d..6eec3a9 100644
--- a/tests/robotests/src/com/android/settings/accessibility/AudioAdjustmentFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/accessibility/AudioAdjustmentFragmentTest.java
@@ -18,6 +18,7 @@
import static com.google.common.truth.Truth.assertThat;
+import android.app.settings.SettingsEnums;
import android.content.Context;
import androidx.test.core.app.ApplicationProvider;
@@ -25,6 +26,7 @@
import com.android.settings.R;
import com.android.settings.testutils.XmlTestUtils;
+import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.RobolectricTestRunner;
@@ -35,7 +37,30 @@
@RunWith(RobolectricTestRunner.class)
public class AudioAdjustmentFragmentTest {
- private Context mContext = ApplicationProvider.getApplicationContext();
+ private final Context mContext = ApplicationProvider.getApplicationContext();
+ private AudioAdjustmentFragment mFragment;
+
+ @Before
+ public void setUp() {
+ mFragment = new AudioAdjustmentFragment();
+ }
+
+ @Test
+ public void getMetricsCategory_returnsCorrectCategory() {
+ assertThat(mFragment.getMetricsCategory()).isEqualTo(
+ SettingsEnums.ACCESSIBILITY_AUDIO_ADJUSTMENT);
+ }
+
+ @Test
+ public void getPreferenceScreenResId_returnsCorrectXml() {
+ assertThat(mFragment.getPreferenceScreenResId()).isEqualTo(
+ R.xml.accessibility_audio_adjustment);
+ }
+
+ @Test
+ public void getLogTag_returnsCorrectTag() {
+ assertThat(mFragment.getLogTag()).isEqualTo("AudioAdjustmentFragment");
+ }
@Test
public void getNonIndexableKeys_existInXmlLayout() {
diff --git a/tests/robotests/src/com/android/settings/accessibility/CaptionFontSizeControllerTest.java b/tests/robotests/src/com/android/settings/accessibility/CaptionFontSizeControllerTest.java
new file mode 100644
index 0000000..c4033ef
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/accessibility/CaptionFontSizeControllerTest.java
@@ -0,0 +1,114 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.accessibility;
+
+import static com.android.settings.accessibility.AccessibilityUtil.State.OFF;
+import static com.android.settings.accessibility.AccessibilityUtil.State.ON;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.provider.Settings;
+import android.view.accessibility.CaptioningManager;
+
+import androidx.preference.ListPreference;
+import androidx.preference.PreferenceScreen;
+import androidx.test.core.app.ApplicationProvider;
+
+import com.android.settings.R;
+import com.android.settings.core.BasePreferenceController;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.junit.MockitoJUnit;
+import org.mockito.junit.MockitoRule;
+import org.robolectric.RobolectricTestRunner;
+import org.robolectric.shadow.api.Shadow;
+import org.robolectric.shadows.ShadowCaptioningManager;
+
+/** Tests for {@link CaptionFontSizeController}. */
+@RunWith(RobolectricTestRunner.class)
+public class CaptionFontSizeControllerTest {
+
+ @Rule
+ public final MockitoRule mMockitoRule = MockitoJUnit.rule();
+ @Mock
+ private PreferenceScreen mScreen;
+ private final Context mContext = ApplicationProvider.getApplicationContext();
+ private CaptionFontSizeController mController;
+ private ListPreference mPreference;
+ private ShadowCaptioningManager mShadowCaptioningManager;
+
+ @Before
+ public void setUp() {
+ mController = new CaptionFontSizeController(mContext, "captioning_font_size");
+ mPreference = new ListPreference(mContext);
+ mPreference.setEntries(R.array.captioning_font_size_selector_titles);
+ mPreference.setEntryValues(R.array.captioning_font_size_selector_values);
+ when(mScreen.findPreference(mController.getPreferenceKey())).thenReturn(mPreference);
+ CaptioningManager captioningManager = mContext.getSystemService(CaptioningManager.class);
+ mShadowCaptioningManager = Shadow.extract(captioningManager);
+ }
+
+ @Test
+ public void getAvailabilityStatus_shouldReturnAvailable() {
+ assertThat(mController.getAvailabilityStatus())
+ .isEqualTo(BasePreferenceController.AVAILABLE);
+ }
+
+ @Test
+ public void displayPreference_byDefault_shouldReturnDefault() {
+ mController.displayPreference(mScreen);
+
+ assertThat(mPreference.getEntry().toString()).isEqualTo("Medium");
+ }
+
+ @Test
+ public void displayPreference_bySmallValue_shouldReturnSmall() {
+ mShadowCaptioningManager.setFontScale(0.5f);
+
+ mController.displayPreference(mScreen);
+
+ assertThat(mPreference.getEntry().toString()).isEqualTo("Small");
+ }
+
+ @Test
+ public void onPreferenceChange_shouldReturnSmall() {
+ mController.displayPreference(mScreen);
+
+ mController.onPreferenceChange(mPreference, "0.5");
+
+ assertThat(mPreference.getEntry().toString()).isEqualTo("Small");
+ }
+
+ @Test
+ public void onPreferenceChange_shouldSetCaptionEnabled() {
+ mShadowCaptioningManager.setEnabled(false);
+ mController.displayPreference(mScreen);
+
+ mController.onPreferenceChange(mPreference, "0.5");
+
+ final boolean isCaptionEnabled = Settings.Secure.getInt(mContext.getContentResolver(),
+ Settings.Secure.ACCESSIBILITY_CAPTIONING_ENABLED, OFF) == ON;
+ assertThat(isCaptionEnabled).isTrue();
+ }
+}
diff --git a/tests/robotests/src/com/android/settings/accessibility/CaptionHelperTest.java b/tests/robotests/src/com/android/settings/accessibility/CaptionHelperTest.java
new file mode 100644
index 0000000..42d9454
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/accessibility/CaptionHelperTest.java
@@ -0,0 +1,132 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.accessibility;
+
+import static com.android.settings.accessibility.AccessibilityUtil.State.OFF;
+import static com.android.settings.accessibility.AccessibilityUtil.State.ON;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.provider.Settings;
+import android.view.View;
+import android.view.accessibility.CaptioningManager;
+
+import androidx.test.core.app.ApplicationProvider;
+
+import com.android.internal.widget.SubtitleView;
+import com.android.settings.R;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.Spy;
+import org.mockito.junit.MockitoJUnit;
+import org.mockito.junit.MockitoRule;
+import org.robolectric.RobolectricTestRunner;
+
+import java.util.Locale;
+
+/** Tests for {@link CaptionHelper}. */
+@RunWith(RobolectricTestRunner.class)
+public class CaptionHelperTest {
+
+ @Rule
+ public final MockitoRule mMockitoRule = MockitoJUnit.rule();
+ @Mock
+ private CaptioningManager mCaptioningManager;
+ @Mock
+ private SubtitleView mSubtitleView;
+ @Mock
+ private View mPreviewWindow;
+ @Spy
+ private final Context mContext = ApplicationProvider.getApplicationContext();
+ private CaptionHelper mCaptionHelper;
+
+ @Before
+ public void setUp() {
+ when(mContext.getSystemService(CaptioningManager.class)).thenReturn(mCaptioningManager);
+ mCaptionHelper = new CaptionHelper(mContext);
+ }
+
+ @Test
+ public void applyCaptionProperties_verifyAction() {
+ final float fontScale = 1.0f;
+ when(mCaptioningManager.getFontScale()).thenReturn(fontScale);
+ final int windowSize = 100;
+ when(mPreviewWindow.getWidth()).thenReturn(windowSize);
+ when(mPreviewWindow.getHeight()).thenReturn(windowSize);
+ final float textSize = CaptionHelper.LINE_HEIGHT_RATIO * windowSize * fontScale;
+
+ mCaptionHelper.applyCaptionProperties(mSubtitleView, mPreviewWindow, /* styleId= */ 0);
+
+ verify(mSubtitleView).setTextSize(textSize);
+ verify(mSubtitleView).setText(R.string.captioning_preview_characters);
+ }
+
+ @Test
+ public void applyCaptionProperties_withoutPreviewWindow_verifyAction() {
+ final float fontScale = 1.0f;
+ when(mCaptioningManager.getFontScale()).thenReturn(fontScale);
+ final float textSize = mContext.getResources().getDimension(
+ R.dimen.caption_preview_text_size) * fontScale;
+
+ mCaptionHelper.applyCaptionProperties(mSubtitleView, /* PreviewWindow= */ null,
+ /* styleId= */ 0);
+
+ verify(mSubtitleView).setTextSize(textSize);
+ verify(mSubtitleView).setText(R.string.captioning_preview_characters);
+ }
+
+ @Test
+ public void applyCaptionProperties_localeUS_verifyAction() {
+ when(mCaptioningManager.getLocale()).thenReturn(Locale.US);
+ final String text = mContext.getString(R.string.captioning_preview_characters);
+
+ mCaptionHelper.applyCaptionProperties(mSubtitleView, /* PreviewWindow= */ null,
+ /* styleId= */ 0);
+
+ verify(mSubtitleView).setText(text);
+ }
+
+ @Test
+ public void enableCaptioningManager_shouldSetCaptionEnabled() {
+ when(mCaptioningManager.isEnabled()).thenReturn(false);
+
+ mCaptionHelper.setEnabled(true);
+
+ final boolean isCaptionEnabled = Settings.Secure.getInt(mContext.getContentResolver(),
+ Settings.Secure.ACCESSIBILITY_CAPTIONING_ENABLED, OFF) == ON;
+ assertThat(isCaptionEnabled).isTrue();
+ }
+
+ @Test
+ public void disableCaptioningManager_shouldSetCaptionDisabled() {
+ when(mCaptioningManager.isEnabled()).thenReturn(true);
+
+ mCaptionHelper.setEnabled(false);
+
+ final boolean isCaptionEnabled = Settings.Secure.getInt(mContext.getContentResolver(),
+ Settings.Secure.ACCESSIBILITY_CAPTIONING_ENABLED, OFF) == ON;
+ assertThat(isCaptionEnabled).isFalse();
+ }
+}
diff --git a/tests/robotests/src/com/android/settings/accessibility/CaptionMoreOptionsFragmentTest.java b/tests/robotests/src/com/android/settings/accessibility/CaptionMoreOptionsFragmentTest.java
index db54f81..8d1c684 100644
--- a/tests/robotests/src/com/android/settings/accessibility/CaptionMoreOptionsFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/accessibility/CaptionMoreOptionsFragmentTest.java
@@ -18,6 +18,7 @@
import static com.google.common.truth.Truth.assertThat;
+import android.app.settings.SettingsEnums;
import android.content.Context;
import androidx.test.core.app.ApplicationProvider;
@@ -25,6 +26,7 @@
import com.android.settings.R;
import com.android.settings.testutils.XmlTestUtils;
+import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.RobolectricTestRunner;
@@ -35,7 +37,30 @@
@RunWith(RobolectricTestRunner.class)
public class CaptionMoreOptionsFragmentTest {
- private Context mContext = ApplicationProvider.getApplicationContext();
+ private final Context mContext = ApplicationProvider.getApplicationContext();
+ private CaptionMoreOptionsFragment mFragment;
+
+ @Before
+ public void setUp() {
+ mFragment = new CaptionMoreOptionsFragment();
+ }
+
+ @Test
+ public void getMetricsCategory_returnsCorrectCategory() {
+ assertThat(mFragment.getMetricsCategory()).isEqualTo(
+ SettingsEnums.ACCESSIBILITY_CAPTION_MORE_OPTIONS);
+ }
+
+ @Test
+ public void getPreferenceScreenResId_returnsCorrectXml() {
+ assertThat(mFragment.getPreferenceScreenResId()).isEqualTo(
+ R.xml.captioning_more_options);
+ }
+
+ @Test
+ public void getLogTag_returnsCorrectTag() {
+ assertThat(mFragment.getLogTag()).isEqualTo("CaptionMoreOptionsFragment");
+ }
@Test
public void getNonIndexableKeys_existInXmlLayout() {
diff --git a/tests/robotests/src/com/android/settings/accessibility/CaptionPreviewPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/accessibility/CaptionPreviewPreferenceControllerTest.java
new file mode 100644
index 0000000..2ca755c
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/accessibility/CaptionPreviewPreferenceControllerTest.java
@@ -0,0 +1,92 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.accessibility;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.content.ContentResolver;
+import android.content.Context;
+import android.provider.Settings;
+import android.view.View;
+
+import androidx.preference.PreferenceScreen;
+import androidx.test.core.app.ApplicationProvider;
+
+import com.android.settings.core.BasePreferenceController;
+import com.android.settingslib.widget.LayoutPreference;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.Spy;
+import org.mockito.junit.MockitoJUnit;
+import org.mockito.junit.MockitoRule;
+import org.robolectric.RobolectricTestRunner;
+
+/** Tests for {@link CaptionPreviewPreferenceController}. */
+@RunWith(RobolectricTestRunner.class)
+public class CaptionPreviewPreferenceControllerTest {
+
+ @Rule
+ public final MockitoRule mMockitoRule = MockitoJUnit.rule();
+ @Mock
+ private PreferenceScreen mScreen;
+ @Mock
+ private ContentResolver mContentResolver;
+ @Spy
+ private final Context mContext = ApplicationProvider.getApplicationContext();
+ private CaptionPreviewPreferenceController mController;
+ private LayoutPreference mLayoutPreference;
+
+ @Before
+ public void setUp() {
+ when(mContext.getContentResolver()).thenReturn(mContentResolver);
+ mController = new CaptionPreviewPreferenceController(mContext,
+ "captioning_preference_switch");
+ final View view = new View(mContext);
+ mLayoutPreference = new LayoutPreference(mContext, view);
+ when(mScreen.findPreference(mController.getPreferenceKey())).thenReturn(mLayoutPreference);
+ }
+
+ @Test
+ public void getAvailabilityStatus_shouldReturnAvailable() {
+ assertThat(mController.getAvailabilityStatus())
+ .isEqualTo(BasePreferenceController.AVAILABLE);
+ }
+
+ @Test
+ public void onStart_registerSpecificContentObserverForSpecificKeys() {
+ mController.onStart();
+
+ for (String key : mController.CAPTIONING_FEATURE_KEYS) {
+ verify(mContentResolver).registerContentObserver(Settings.Secure.getUriFor(key),
+ /* notifyForDescendants= */ false, mController.mSettingsContentObserver);
+ }
+ }
+
+ @Test
+ public void onPause_unregisterContentObserver() {
+ mController.onStop();
+
+ verify(mContentResolver).unregisterContentObserver(mController.mSettingsContentObserver);
+ }
+}
diff --git a/tests/robotests/src/com/android/settings/accessibility/CaptionPropertiesFragmentTest.java b/tests/robotests/src/com/android/settings/accessibility/CaptionPropertiesFragmentTest.java
index f041edc..cd0638a 100644
--- a/tests/robotests/src/com/android/settings/accessibility/CaptionPropertiesFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/accessibility/CaptionPropertiesFragmentTest.java
@@ -18,6 +18,7 @@
import static com.google.common.truth.Truth.assertThat;
+import android.app.settings.SettingsEnums;
import android.content.Context;
import androidx.test.core.app.ApplicationProvider;
@@ -25,6 +26,7 @@
import com.android.settings.R;
import com.android.settings.testutils.XmlTestUtils;
+import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.RobolectricTestRunner;
@@ -36,6 +38,29 @@
public class CaptionPropertiesFragmentTest {
private final Context mContext = ApplicationProvider.getApplicationContext();
+ private CaptionPropertiesFragment mFragment;
+
+ @Before
+ public void setUp() {
+ mFragment = new CaptionPropertiesFragment();
+ }
+
+ @Test
+ public void getMetricsCategory_returnsCorrectCategory() {
+ assertThat(mFragment.getMetricsCategory()).isEqualTo(
+ SettingsEnums.ACCESSIBILITY_CAPTION_PROPERTIES);
+ }
+
+ @Test
+ public void getPreferenceScreenResId_returnsCorrectXml() {
+ assertThat(mFragment.getPreferenceScreenResId()).isEqualTo(
+ R.xml.captioning_settings);
+ }
+
+ @Test
+ public void getLogTag_returnsCorrectTag() {
+ assertThat(mFragment.getLogTag()).isEqualTo("CaptionPropertiesFragment");
+ }
@Test
public void getNonIndexableKeys_existInXmlLayout() {
diff --git a/tests/robotests/src/com/android/settings/accessibility/CaptionTypefaceControllerTest.java b/tests/robotests/src/com/android/settings/accessibility/CaptionTypefaceControllerTest.java
new file mode 100644
index 0000000..f2f070f
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/accessibility/CaptionTypefaceControllerTest.java
@@ -0,0 +1,115 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.accessibility;
+
+import static com.android.settings.accessibility.AccessibilityUtil.State.OFF;
+import static com.android.settings.accessibility.AccessibilityUtil.State.ON;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.provider.Settings;
+import android.view.accessibility.CaptioningManager;
+
+import androidx.preference.ListPreference;
+import androidx.preference.PreferenceScreen;
+import androidx.test.core.app.ApplicationProvider;
+
+import com.android.settings.R;
+import com.android.settings.core.BasePreferenceController;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.junit.MockitoJUnit;
+import org.mockito.junit.MockitoRule;
+import org.robolectric.RobolectricTestRunner;
+import org.robolectric.shadow.api.Shadow;
+import org.robolectric.shadows.ShadowCaptioningManager;
+
+/** Tests for {@link CaptionTypefaceController}. */
+@RunWith(RobolectricTestRunner.class)
+public class CaptionTypefaceControllerTest {
+
+ @Rule
+ public final MockitoRule mMockitoRule = MockitoJUnit.rule();
+ @Mock
+ private PreferenceScreen mScreen;
+ private final Context mContext = ApplicationProvider.getApplicationContext();
+ private CaptionTypefaceController mController;
+ private ListPreference mPreference;
+ private ShadowCaptioningManager mShadowCaptioningManager;
+
+ @Before
+ public void setUp() {
+ mController = new CaptionTypefaceController(mContext, "captioning_typeface");
+ mPreference = new ListPreference(mContext);
+ mPreference.setEntries(R.array.captioning_typeface_selector_titles);
+ mPreference.setEntryValues(R.array.captioning_typeface_selector_values);
+ when(mScreen.findPreference(mController.getPreferenceKey())).thenReturn(mPreference);
+ CaptioningManager captioningManager = mContext.getSystemService(CaptioningManager.class);
+ mShadowCaptioningManager = Shadow.extract(captioningManager);
+ }
+
+ @Test
+ public void getAvailabilityStatus_shouldReturnAvailable() {
+ assertThat(mController.getAvailabilityStatus())
+ .isEqualTo(BasePreferenceController.AVAILABLE);
+ }
+
+ @Test
+ public void displayPreference_byDefault_shouldReturnDefault() {
+ mController.displayPreference(mScreen);
+
+ assertThat(mPreference.getEntry().toString()).isEqualTo("Default");
+ }
+
+ @Test
+ public void displayPreference_bySerif_shouldReturnSerif() {
+ Settings.Secure.putString(mContext.getContentResolver(),
+ Settings.Secure.ACCESSIBILITY_CAPTIONING_TYPEFACE, "serif");
+
+ mController.displayPreference(mScreen);
+
+ assertThat(mPreference.getEntry().toString()).isEqualTo("Serif");
+ }
+
+ @Test
+ public void onPreferenceChange_bySerif_shouldReturnSerif() {
+ mController.displayPreference(mScreen);
+
+ mController.onPreferenceChange(mPreference, "serif");
+
+ assertThat(mPreference.getEntry().toString()).isEqualTo("Serif");
+ }
+
+ @Test
+ public void onPreferenceChange_shouldSetCaptionEnabled() {
+ mShadowCaptioningManager.setEnabled(false);
+ mController.displayPreference(mScreen);
+
+ mController.onPreferenceChange(mPreference, "serif");
+
+ final boolean isCaptionEnabled = Settings.Secure.getInt(mContext.getContentResolver(),
+ Settings.Secure.ACCESSIBILITY_CAPTIONING_ENABLED, OFF) == ON;
+ assertThat(isCaptionEnabled).isTrue();
+ }
+}
diff --git a/tests/robotests/src/com/android/settings/accessibility/ColorAndMotionFragmentTest.java b/tests/robotests/src/com/android/settings/accessibility/ColorAndMotionFragmentTest.java
index 0bb227e..a30dbff 100644
--- a/tests/robotests/src/com/android/settings/accessibility/ColorAndMotionFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/accessibility/ColorAndMotionFragmentTest.java
@@ -18,6 +18,7 @@
import static com.google.common.truth.Truth.assertThat;
+import android.app.settings.SettingsEnums;
import android.content.Context;
import androidx.test.core.app.ApplicationProvider;
@@ -25,16 +26,41 @@
import com.android.settings.R;
import com.android.settings.testutils.XmlTestUtils;
+import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.RobolectricTestRunner;
import java.util.List;
+/** Tests for {@link ColorAndMotionFragment}. */
@RunWith(RobolectricTestRunner.class)
public class ColorAndMotionFragmentTest {
- private Context mContext = ApplicationProvider.getApplicationContext();
+ private final Context mContext = ApplicationProvider.getApplicationContext();
+ private ColorAndMotionFragment mFragment;
+
+ @Before
+ public void setUp() {
+ mFragment = new ColorAndMotionFragment();
+ }
+
+ @Test
+ public void getMetricsCategory_returnsCorrectCategory() {
+ assertThat(mFragment.getMetricsCategory()).isEqualTo(
+ SettingsEnums.ACCESSIBILITY_COLOR_AND_MOTION);
+ }
+
+ @Test
+ public void getPreferenceScreenResId_returnsCorrectXml() {
+ assertThat(mFragment.getPreferenceScreenResId()).isEqualTo(
+ R.xml.accessibility_color_and_motion);
+ }
+
+ @Test
+ public void getLogTag_returnsCorrectTag() {
+ assertThat(mFragment.getLogTag()).isEqualTo("ColorAndMotionFragment");
+ }
@Test
public void getNonIndexableKeys_existInXmlLayout() {
diff --git a/tests/robotests/src/com/android/settings/accessibility/DividerAllowedBelowPreferenceTest.java b/tests/robotests/src/com/android/settings/accessibility/DividerAllowedBelowPreferenceTest.java
deleted file mode 100644
index 27f0623..0000000
--- a/tests/robotests/src/com/android/settings/accessibility/DividerAllowedBelowPreferenceTest.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settings.accessibility;
-
-import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.verify;
-import static org.mockito.internal.verification.VerificationModeFactory.times;
-
-import android.content.Context;
-import android.view.LayoutInflater;
-import android.view.View;
-
-import androidx.preference.PreferenceViewHolder;
-
-import com.android.settings.R;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
-
-/** Tests for {@link DividerAllowedBelowPreference}. */
-@RunWith(RobolectricTestRunner.class)
-public class DividerAllowedBelowPreferenceTest {
- private final Context mContext = RuntimeEnvironment.application;
- private PreferenceViewHolder mViewHolder;
-
- @Before
- public void setUp() {
- final LayoutInflater inflater = LayoutInflater.from(mContext);
- final View rootView =
- inflater.inflate(R.layout.preference, /* root= */ null);
- mViewHolder = spy(PreferenceViewHolder.createInstanceForTests(rootView));
- }
-
- @Test
- public void onBindViewHolder_dividerAllowedBelow() {
- final DividerAllowedBelowPreference dividerAllowedBelowPreference =
- new DividerAllowedBelowPreference(mContext);
-
- dividerAllowedBelowPreference.onBindViewHolder(mViewHolder);
-
- // One time was in parent, the other time was in child.
- verify(mViewHolder, times(2)).setDividerAllowedBelow(true);
- }
-}
diff --git a/tests/robotests/src/com/android/settings/accessibility/DividerSwitchPreferenceTest.java b/tests/robotests/src/com/android/settings/accessibility/DividerSwitchPreferenceTest.java
deleted file mode 100644
index d80a4e8..0000000
--- a/tests/robotests/src/com/android/settings/accessibility/DividerSwitchPreferenceTest.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settings.accessibility;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.verify;
-import static org.mockito.internal.verification.VerificationModeFactory.times;
-
-import android.content.Context;
-import android.view.LayoutInflater;
-import android.view.View;
-
-import androidx.preference.PreferenceViewHolder;
-
-import com.android.settings.R;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
-
-/** Tests for {@link DividerSwitchPreference}. */
-@RunWith(RobolectricTestRunner.class)
-public class DividerSwitchPreferenceTest {
- private final Context mContext = RuntimeEnvironment.application;
- private View mRootView;
- private PreferenceViewHolder mViewHolder;
- private DividerSwitchPreference mDividerSwitchPreference;
-
- @Before
- public void setUp() {
- initRootView();
- initPreference();
- }
-
- @Test
- public void setDividerAllowedAbove_allowed_success() {
- mDividerSwitchPreference.setDividerAllowedAbove(true);
- mDividerSwitchPreference.onBindViewHolder(mViewHolder);
-
- // One time was in parent, the other time was in child.
- verify(mViewHolder, times(2)).setDividerAllowedAbove(true);
- }
-
- @Test
- public void setDividerAllowedBelow_allowed_success() {
- mDividerSwitchPreference.setDividerAllowedBelow(true);
- mDividerSwitchPreference.onBindViewHolder(mViewHolder);
-
- // One time was in parent, the other time was in child.
- verify(mViewHolder, times(2)).setDividerAllowedBelow(true);
- }
-
- @Test
- public void setSwitchVisibility_visible_success() {
- final View view = spy(new View(mContext));
- doReturn(view).when(mRootView).findViewById(android.R.id.widget_frame);
-
- mDividerSwitchPreference.setSwitchVisibility(View.VISIBLE);
- mDividerSwitchPreference.onBindViewHolder(mViewHolder);
-
- assertThat(view.getVisibility()).isEqualTo(View.VISIBLE);
- }
-
- private void initRootView() {
- final LayoutInflater inflater = LayoutInflater.from(mContext);
- mRootView = spy(inflater.inflate(R.layout.preference_widget_switch, /* root= */ null));
- mViewHolder = spy(PreferenceViewHolder.createInstanceForTests(mRootView));
- }
-
- private void initPreference() {
- mDividerSwitchPreference = new DividerSwitchPreference(mContext);
- mDividerSwitchPreference.setDividerAllowedAbove(false);
- mDividerSwitchPreference.setDividerAllowedBelow(false);
- mDividerSwitchPreference.setSwitchVisibility(View.INVISIBLE);
- }
-}
diff --git a/tests/robotests/src/com/android/settings/accessibility/HearingAidDialogFragmentTest.java b/tests/robotests/src/com/android/settings/accessibility/HearingAidDialogFragmentTest.java
index 4f8713a..7408374 100644
--- a/tests/robotests/src/com/android/settings/accessibility/HearingAidDialogFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/accessibility/HearingAidDialogFragmentTest.java
@@ -23,6 +23,7 @@
import static org.robolectric.Shadows.shadowOf;
import android.app.Dialog;
+import android.app.settings.SettingsEnums;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
@@ -44,7 +45,7 @@
import org.robolectric.RobolectricTestRunner;
import org.robolectric.annotation.Config;
-
+/** Tests for {@link HearingAidDialogFragment}. */
@RunWith(RobolectricTestRunner.class)
@Config(shadows = ShadowAlertDialogCompat.class)
public class HearingAidDialogFragmentTest {
@@ -90,4 +91,10 @@
assertThat(dialog.isShowing()).isFalse();
}
+
+ @Test
+ public void getMetricsCategory_returnsCorrectCategory() {
+ assertThat(mFragment.getMetricsCategory()).isEqualTo(
+ SettingsEnums.DIALOG_ACCESSIBILITY_HEARINGAID);
+ }
}
diff --git a/tests/robotests/src/com/android/settings/accessibility/HearingAidPairingDialogFragmentTest.java b/tests/robotests/src/com/android/settings/accessibility/HearingAidPairingDialogFragmentTest.java
index 5c440d2..5990a3d 100644
--- a/tests/robotests/src/com/android/settings/accessibility/HearingAidPairingDialogFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/accessibility/HearingAidPairingDialogFragmentTest.java
@@ -22,6 +22,7 @@
import static org.mockito.Mockito.when;
import static org.robolectric.Shadows.shadowOf;
+import android.app.settings.SettingsEnums;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
@@ -102,4 +103,10 @@
assertThat(dialog.isShowing()).isFalse();
}
+
+ @Test
+ public void getMetricsCategory_returnsCorrectCategory() {
+ assertThat(mFragment.getMetricsCategory()).isEqualTo(
+ SettingsEnums.DIALOG_ACCESSIBILITY_HEARING_AID_PAIR_ANOTHER);
+ }
}
diff --git a/tests/robotests/src/com/android/settings/accessibility/HearingAidUtilsTest.java b/tests/robotests/src/com/android/settings/accessibility/HearingAidUtilsTest.java
index 6918fb6..efeb27f 100644
--- a/tests/robotests/src/com/android/settings/accessibility/HearingAidUtilsTest.java
+++ b/tests/robotests/src/com/android/settings/accessibility/HearingAidUtilsTest.java
@@ -28,7 +28,6 @@
import com.android.settingslib.bluetooth.CachedBluetoothDevice;
import com.android.settingslib.bluetooth.HearingAidProfile;
-import org.junit.After;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
@@ -59,12 +58,9 @@
public void setUp() {
final FragmentActivity mActivity = Robolectric.setupActivity(FragmentActivity.class);
mFragmentManager = mActivity.getSupportFragmentManager();
- }
-
- @After
- public void tearDown() {
ShadowAlertDialogCompat.reset();
}
+
@Test
public void launchHearingAidPairingDialog_deviceNotConnectedHearingAid_noDialog() {
when(mCachedBluetoothDevice.isConnectedHearingAidDevice()).thenReturn(false);
diff --git a/tests/robotests/src/com/android/settings/accessibility/MagnificationSettingsFragmentTest.java b/tests/robotests/src/com/android/settings/accessibility/MagnificationSettingsFragmentTest.java
index 73d29cf..a1a146d 100644
--- a/tests/robotests/src/com/android/settings/accessibility/MagnificationSettingsFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/accessibility/MagnificationSettingsFragmentTest.java
@@ -27,6 +27,7 @@
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
+import android.app.settings.SettingsEnums;
import android.content.Context;
import android.os.Bundle;
@@ -67,7 +68,6 @@
doReturn(mScreen).when(mFragment).getPreferenceScreen();
doReturn(mock(FragmentManager.class, Answers.RETURNS_DEEP_STUBS)).when(
mFragment).getChildFragmentManager();
-
}
@Test
@@ -92,6 +92,23 @@
}
@Test
+ public void getMetricsCategory_returnsCorrectCategory() {
+ assertThat(mFragment.getMetricsCategory()).isEqualTo(
+ SettingsEnums.ACCESSIBILITY_MAGNIFICATION_SETTINGS);
+ }
+
+ @Test
+ public void getPreferenceScreenResId_returnsCorrectXml() {
+ assertThat(mFragment.getPreferenceScreenResId()).isEqualTo(
+ R.xml.accessibility_magnification_service_settings);
+ }
+
+ @Test
+ public void getLogTag_returnsCorrectTag() {
+ assertThat(mFragment.getLogTag()).isEqualTo("MagnificationSettingsFragment");
+ }
+
+ @Test
public void getNonIndexableKeys_existInXmlLayout() {
final List<String> niks =
ShortcutsSettingsFragment.SEARCH_INDEX_DATA_PROVIDER
diff --git a/tests/robotests/src/com/android/settings/accessibility/ShortcutsSettingsFragmentTest.java b/tests/robotests/src/com/android/settings/accessibility/ShortcutsSettingsFragmentTest.java
index 12b568f..8505f89 100644
--- a/tests/robotests/src/com/android/settings/accessibility/ShortcutsSettingsFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/accessibility/ShortcutsSettingsFragmentTest.java
@@ -18,6 +18,7 @@
import static com.google.common.truth.Truth.assertThat;
+import android.app.settings.SettingsEnums;
import android.content.Context;
import androidx.test.core.app.ApplicationProvider;
@@ -25,6 +26,7 @@
import com.android.settings.R;
import com.android.settings.testutils.XmlTestUtils;
+import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.RobolectricTestRunner;
@@ -35,7 +37,30 @@
@RunWith(RobolectricTestRunner.class)
public class ShortcutsSettingsFragmentTest {
- private Context mContext = ApplicationProvider.getApplicationContext();
+ private final Context mContext = ApplicationProvider.getApplicationContext();
+ private ShortcutsSettingsFragment mFragment;
+
+ @Before
+ public void setUp() {
+ mFragment = new ShortcutsSettingsFragment();
+ }
+
+ @Test
+ public void getMetricsCategory_returnsCorrectCategory() {
+ assertThat(mFragment.getMetricsCategory()).isEqualTo(
+ SettingsEnums.ACCESSIBILITY_SHORTCUTS_SETTINGS);
+ }
+
+ @Test
+ public void getPreferenceScreenResId_returnsCorrectXml() {
+ assertThat(mFragment.getPreferenceScreenResId()).isEqualTo(
+ R.xml.accessibility_shortcuts_settings);
+ }
+
+ @Test
+ public void getLogTag_returnsCorrectTag() {
+ assertThat(mFragment.getLogTag()).isEqualTo("ShortcutsSettingsFragment");
+ }
@Test
public void getNonIndexableKeys_existInXmlLayout() {
diff --git a/tests/robotests/src/com/android/settings/accessibility/SystemControlsFragmentTest.java b/tests/robotests/src/com/android/settings/accessibility/SystemControlsFragmentTest.java
index 4b12900..1d8fb32 100644
--- a/tests/robotests/src/com/android/settings/accessibility/SystemControlsFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/accessibility/SystemControlsFragmentTest.java
@@ -18,6 +18,7 @@
import static com.google.common.truth.Truth.assertThat;
+import android.app.settings.SettingsEnums;
import android.content.Context;
import androidx.test.core.app.ApplicationProvider;
@@ -25,6 +26,7 @@
import com.android.settings.R;
import com.android.settings.testutils.XmlTestUtils;
+import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.RobolectricTestRunner;
@@ -35,7 +37,30 @@
@RunWith(RobolectricTestRunner.class)
public class SystemControlsFragmentTest {
- private Context mContext = ApplicationProvider.getApplicationContext();
+ private final Context mContext = ApplicationProvider.getApplicationContext();
+ private SystemControlsFragment mFragment;
+
+ @Before
+ public void setUp() {
+ mFragment = new SystemControlsFragment();
+ }
+
+ @Test
+ public void getMetricsCategory_returnsCorrectCategory() {
+ assertThat(mFragment.getMetricsCategory()).isEqualTo(
+ SettingsEnums.ACCESSIBILITY_SYSTEM_CONTROLS);
+ }
+
+ @Test
+ public void getPreferenceScreenResId_returnsCorrectXml() {
+ assertThat(mFragment.getPreferenceScreenResId()).isEqualTo(
+ R.xml.accessibility_system_controls);
+ }
+
+ @Test
+ public void getLogTag_returnsCorrectTag() {
+ assertThat(mFragment.getLogTag()).isEqualTo("SystemControlsFragment");
+ }
@Test
public void getNonIndexableKeys_existInXmlLayout() {
diff --git a/tests/robotests/src/com/android/settings/accessibility/TapAssistanceFragmentTest.java b/tests/robotests/src/com/android/settings/accessibility/TapAssistanceFragmentTest.java
index 093ea03..a1054da 100644
--- a/tests/robotests/src/com/android/settings/accessibility/TapAssistanceFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/accessibility/TapAssistanceFragmentTest.java
@@ -18,6 +18,7 @@
import static com.google.common.truth.Truth.assertThat;
+import android.app.settings.SettingsEnums;
import android.content.Context;
import androidx.test.core.app.ApplicationProvider;
@@ -25,6 +26,7 @@
import com.android.settings.R;
import com.android.settings.testutils.XmlTestUtils;
+import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.RobolectricTestRunner;
@@ -35,7 +37,30 @@
/** Tests for {@link TapAssistanceFragment}. */
public class TapAssistanceFragmentTest {
- private Context mContext = ApplicationProvider.getApplicationContext();
+ private final Context mContext = ApplicationProvider.getApplicationContext();
+ private TapAssistanceFragment mFragment;
+
+ @Before
+ public void setUp() {
+ mFragment = new TapAssistanceFragment();
+ }
+
+ @Test
+ public void getMetricsCategory_returnsCorrectCategory() {
+ assertThat(mFragment.getMetricsCategory()).isEqualTo(
+ SettingsEnums.ACCESSIBILITY_TAP_ASSISTANCE);
+ }
+
+ @Test
+ public void getPreferenceScreenResId_returnsCorrectXml() {
+ assertThat(mFragment.getPreferenceScreenResId()).isEqualTo(
+ R.xml.accessibility_tap_assistance);
+ }
+
+ @Test
+ public void getLogTag_returnsCorrectTag() {
+ assertThat(mFragment.getLogTag()).isEqualTo("TapAssistanceFragment");
+ }
@Test
public void getNonIndexableKeys_existInXmlLayout() {
diff --git a/tests/robotests/src/com/android/settings/accessibility/TextReadingPreferenceFragmentForSetupWizardTest.java b/tests/robotests/src/com/android/settings/accessibility/TextReadingPreferenceFragmentForSetupWizardTest.java
index bddaed5..4813c80 100644
--- a/tests/robotests/src/com/android/settings/accessibility/TextReadingPreferenceFragmentForSetupWizardTest.java
+++ b/tests/robotests/src/com/android/settings/accessibility/TextReadingPreferenceFragmentForSetupWizardTest.java
@@ -18,10 +18,13 @@
import static com.android.settings.accessibility.TextReadingPreferenceFragment.RESET_KEY;
+import static com.google.common.truth.Truth.assertThat;
+
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
+import android.app.settings.SettingsEnums;
import android.content.Context;
import androidx.test.core.app.ApplicationProvider;
@@ -32,27 +35,29 @@
import com.google.android.setupdesign.GlifPreferenceLayout;
import org.junit.Before;
+import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
+import org.mockito.Spy;
+import org.mockito.junit.MockitoJUnit;
+import org.mockito.junit.MockitoRule;
import org.robolectric.RobolectricTestRunner;
-/**
- * Tests for {@link TextReadingPreferenceFragmentForSetupWizard}.
- */
+/** Tests for {@link TextReadingPreferenceFragmentForSetupWizard}. */
@RunWith(RobolectricTestRunner.class)
public class TextReadingPreferenceFragmentForSetupWizardTest {
- private final Context mContext = spy(ApplicationProvider.getApplicationContext());
+ @Rule
+ public final MockitoRule mMockito = MockitoJUnit.rule();
@Mock
private GlifPreferenceLayout mGlifLayoutView;
+ @Spy
+ private final Context mContext = ApplicationProvider.getApplicationContext();
private TextReadingPreferenceFragmentForSetupWizard mFragment;
@Before
public void setUp() {
- MockitoAnnotations.initMocks(this);
-
mFragment = spy(new TextReadingPreferenceFragmentForSetupWizard());
final LayoutPreference resetPreference =
new LayoutPreference(mContext, R.layout.accessibility_text_reading_reset_button);
@@ -70,4 +75,15 @@
verify(mGlifLayoutView).setHeaderText(title);
}
+
+ @Test
+ public void getMetricsCategory_returnsCorrectCategory() {
+ assertThat(mFragment.getMetricsCategory()).isEqualTo(
+ SettingsEnums.SUW_ACCESSIBILITY_TEXT_READING_OPTIONS);
+ }
+
+ @Test
+ public void getHelpResource_shouldNotHaveHelpResource() {
+ assertThat(mFragment.getHelpResource()).isEqualTo(0);
+ }
}
diff --git a/tests/robotests/src/com/android/settings/accessibility/TextReadingPreferenceFragmentTest.java b/tests/robotests/src/com/android/settings/accessibility/TextReadingPreferenceFragmentTest.java
index b72cdf7..606283f 100644
--- a/tests/robotests/src/com/android/settings/accessibility/TextReadingPreferenceFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/accessibility/TextReadingPreferenceFragmentTest.java
@@ -26,6 +26,7 @@
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
+import android.app.settings.SettingsEnums;
import android.content.Context;
import android.content.DialogInterface;
import android.provider.Settings;
@@ -38,33 +39,37 @@
import com.android.settings.R;
import com.android.settings.accessibility.AccessibilityDialogUtils.DialogEnums;
import com.android.settings.accessibility.TextReadingResetController.ResetStateListener;
+import com.android.settings.testutils.XmlTestUtils;
import org.junit.Before;
+import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Answers;
import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
+import org.mockito.junit.MockitoJUnit;
+import org.mockito.junit.MockitoRule;
import org.robolectric.Robolectric;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.shadows.ShadowToast;
import java.util.ArrayList;
import java.util.Arrays;
+import java.util.List;
-/**
- * Tests for {@link TextReadingPreferenceFragment}.
- */
+/** Tests for {@link TextReadingPreferenceFragment}. */
@RunWith(RobolectricTestRunner.class)
public class TextReadingPreferenceFragmentTest {
- private TextReadingPreferenceFragment mFragment;
- private Context mContext = ApplicationProvider.getApplicationContext();
+
+ @Rule
+ public final MockitoRule mMockito = MockitoJUnit.rule();
@Mock(answer = Answers.RETURNS_DEEP_STUBS)
private PreferenceManager mPreferenceManager;
+ private Context mContext = ApplicationProvider.getApplicationContext();
+ private TextReadingPreferenceFragment mFragment;
@Before
public void setUp() {
- MockitoAnnotations.initMocks(this);
mContext.setTheme(R.style.Theme_AppCompat);
mFragment = spy(new TextReadingPreferenceFragment());
@@ -119,4 +124,32 @@
assertThat(ShadowToast.getTextOfLatestToast())
.isEqualTo(mContext.getString(R.string.accessibility_text_reading_reset_message));
}
+
+ @Test
+ public void getMetricsCategory_returnsCorrectCategory() {
+ assertThat(mFragment.getMetricsCategory()).isEqualTo(
+ SettingsEnums.ACCESSIBILITY_TEXT_READING_OPTIONS);
+ }
+
+ @Test
+ public void getPreferenceScreenResId_returnsCorrectXml() {
+ assertThat(mFragment.getPreferenceScreenResId()).isEqualTo(
+ R.xml.accessibility_text_reading_options);
+ }
+
+ @Test
+ public void getLogTag_returnsCorrectTag() {
+ assertThat(mFragment.getLogTag()).isEqualTo("TextReadingPreferenceFragment");
+ }
+
+ @Test
+ public void getNonIndexableKeys_existInXmlLayout() {
+ final List<String> niks = TextReadingPreferenceFragment.SEARCH_INDEX_DATA_PROVIDER
+ .getNonIndexableKeys(mContext);
+ final List<String> keys =
+ XmlTestUtils.getKeysFromPreferenceXml(mContext,
+ R.xml.accessibility_text_reading_options);
+
+ assertThat(keys).containsAtLeastElementsIn(niks);
+ }
}
diff --git a/tests/robotests/src/com/android/settings/accessibility/ToggleColorInversionPreferenceFragmentTest.java b/tests/robotests/src/com/android/settings/accessibility/ToggleColorInversionPreferenceFragmentTest.java
index 840ace0..9155113 100644
--- a/tests/robotests/src/com/android/settings/accessibility/ToggleColorInversionPreferenceFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/accessibility/ToggleColorInversionPreferenceFragmentTest.java
@@ -27,6 +27,7 @@
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.when;
+import android.app.settings.SettingsEnums;
import android.content.ComponentName;
import android.content.Context;
import android.os.Bundle;
@@ -41,7 +42,9 @@
import androidx.preference.PreferenceScreen;
import androidx.test.core.app.ApplicationProvider;
+import com.android.settings.R;
import com.android.settings.accessibility.AccessibilityUtil.QuickSettingsTooltipType;
+import com.android.settings.testutils.XmlTestUtils;
import com.android.settings.testutils.shadow.ShadowFragment;
import com.android.settings.widget.SettingsMainSwitchPreference;
@@ -56,6 +59,8 @@
import org.robolectric.shadow.api.Shadow;
import org.robolectric.shadows.ShadowApplication;
+import java.util.List;
+
/** Tests for {@link ToggleColorInversionPreferenceFragment} */
@RunWith(RobolectricTestRunner.class)
@Config(shadows = ShadowFragment.class)
@@ -159,6 +164,34 @@
assertThat(getLatestPopupWindow()).isNull();
}
+ @Test
+ public void getMetricsCategory_returnsCorrectCategory() {
+ assertThat(mFragment.getMetricsCategory()).isEqualTo(
+ SettingsEnums.ACCESSIBILITY_COLOR_INVERSION_SETTINGS);
+ }
+
+ @Test
+ public void getPreferenceScreenResId_returnsCorrectXml() {
+ assertThat(mFragment.getPreferenceScreenResId()).isEqualTo(
+ R.xml.accessibility_color_inversion_settings);
+ }
+
+ @Test
+ public void getHelpResource_returnsCorrectHelpResource() {
+ assertThat(mFragment.getHelpResource()).isEqualTo(R.string.help_url_color_inversion);
+ }
+
+ @Test
+ public void getNonIndexableKeys_existInXmlLayout() {
+ final List<String> niks = ToggleColorInversionPreferenceFragment.SEARCH_INDEX_DATA_PROVIDER
+ .getNonIndexableKeys(mContext);
+ final List<String> keys =
+ XmlTestUtils.getKeysFromPreferenceXml(mContext,
+ R.xml.accessibility_color_inversion_settings);
+
+ assertThat(keys).containsAtLeastElementsIn(niks);
+ }
+
private static PopupWindow getLatestPopupWindow() {
final ShadowApplication shadowApplication =
Shadow.extract(ApplicationProvider.getApplicationContext());
diff --git a/tests/robotests/src/com/android/settings/accessibility/ToggleDaltonizerPreferenceFragmentTest.java b/tests/robotests/src/com/android/settings/accessibility/ToggleDaltonizerPreferenceFragmentTest.java
index eb293dd..94db63b 100644
--- a/tests/robotests/src/com/android/settings/accessibility/ToggleDaltonizerPreferenceFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/accessibility/ToggleDaltonizerPreferenceFragmentTest.java
@@ -31,6 +31,7 @@
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.when;
+import android.app.settings.SettingsEnums;
import android.content.ComponentName;
import android.content.Context;
import android.os.Bundle;
@@ -45,7 +46,9 @@
import androidx.preference.PreferenceScreen;
import androidx.test.core.app.ApplicationProvider;
+import com.android.settings.R;
import com.android.settings.accessibility.AccessibilityUtil.QuickSettingsTooltipType;
+import com.android.settings.testutils.XmlTestUtils;
import com.android.settings.testutils.shadow.ShadowFragment;
import com.android.settings.widget.SettingsMainSwitchPreference;
import com.android.settingslib.widget.SelectorWithWidgetPreference;
@@ -61,6 +64,8 @@
import org.robolectric.shadow.api.Shadow;
import org.robolectric.shadows.ShadowApplication;
+import java.util.List;
+
/** Tests for {@link ToggleDaltonizerPreferenceFragment} */
@RunWith(RobolectricTestRunner.class)
@Config(shadows = ShadowFragment.class)
@@ -182,6 +187,34 @@
assertThat(getLatestPopupWindow()).isNull();
}
+ @Test
+ public void getMetricsCategory_returnsCorrectCategory() {
+ assertThat(mFragment.getMetricsCategory()).isEqualTo(
+ SettingsEnums.ACCESSIBILITY_TOGGLE_DALTONIZER);
+ }
+
+ @Test
+ public void getPreferenceScreenResId_returnsCorrectXml() {
+ assertThat(mFragment.getPreferenceScreenResId()).isEqualTo(
+ R.xml.accessibility_daltonizer_settings);
+ }
+
+ @Test
+ public void getHelpResource_returnsCorrectHelpResource() {
+ assertThat(mFragment.getHelpResource()).isEqualTo(R.string.help_url_color_correction);
+ }
+
+ @Test
+ public void getNonIndexableKeys_existInXmlLayout() {
+ final List<String> niks = ToggleDaltonizerPreferenceFragment.SEARCH_INDEX_DATA_PROVIDER
+ .getNonIndexableKeys(mContext);
+ final List<String> keys =
+ XmlTestUtils.getKeysFromPreferenceXml(mContext,
+ R.xml.accessibility_daltonizer_settings);
+
+ assertThat(keys).containsAtLeastElementsIn(niks);
+ }
+
private static PopupWindow getLatestPopupWindow() {
final ShadowApplication shadowApplication =
Shadow.extract(ApplicationProvider.getApplicationContext());
diff --git a/tests/robotests/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragmentTest.java b/tests/robotests/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragmentTest.java
index fea28d1..6b710ca 100644
--- a/tests/robotests/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragmentTest.java
@@ -16,7 +16,6 @@
package com.android.settings.accessibility;
-import static com.android.settings.accessibility.ToggleFeaturePreferenceFragment.KEY_SAVED_QS_TOOLTIP_RESHOW;
import static com.android.settings.accessibility.ToggleFeaturePreferenceFragment.KEY_SAVED_USER_SHORTCUT_TYPE;
import static com.google.common.truth.Truth.assertThat;
@@ -41,7 +40,6 @@
import android.widget.CheckBox;
import android.widget.PopupWindow;
-import androidx.annotation.XmlRes;
import androidx.appcompat.app.AlertDialog;
import androidx.fragment.app.FragmentActivity;
import androidx.preference.PreferenceManager;
@@ -115,15 +113,15 @@
final PreferenceScreen screen = spy(new PreferenceScreen(mContext, null));
when(screen.getPreferenceManager()).thenReturn(mPreferenceManager);
doReturn(screen).when(mFragment).getPreferenceScreen();
+ mContext.setTheme(R.style.Theme_AppCompat);
}
@Test
- public void createFragment_shouldOnlyAddPreferencesOnce() {
+ public void setupFragment_getExpectedPreferenceScreenResId() {
FragmentController.setupFragment(mFragment, FragmentActivity.class,
- /* containerViewId= */ 0, /* bundle= */ null);
+ /* containerViewId= */ 0, Bundle.EMPTY);
- // execute exactly once
- verify(mFragment).addPreferencesFromResource(R.xml.placeholder_prefs);
+ assertThat(mFragment.getPreferenceScreenResId()).isEqualTo(R.xml.placeholder_prefs);
}
@Test
@@ -186,7 +184,6 @@
@Test
public void dialogCheckboxClicked_hardwareType_skipTimeoutRestriction() {
- mContext.setTheme(R.style.Theme_AppCompat);
final ShortcutPreference shortcutPreference = new ShortcutPreference(mContext, /* attrs= */
null);
mFragment.mComponentName = PLACEHOLDER_COMPONENT_NAME;
@@ -208,7 +205,6 @@
@Test
public void setupEditShortcutDialog_shortcutPreferenceOff_checkboxIsEmptyValue() {
- mContext.setTheme(R.style.Theme_AppCompat);
final AlertDialog dialog = AccessibilityDialogUtils.showEditShortcutDialog(
mContext, DialogType.EDIT_SHORTCUT_GENERIC, PLACEHOLDER_DIALOG_TITLE,
this::callEmptyOnClicked);
@@ -226,7 +222,6 @@
@Test
public void setupEditShortcutDialog_shortcutPreferenceOn_checkboxIsSavedValue() {
- mContext.setTheme(R.style.Theme_AppCompat);
final AlertDialog dialog = AccessibilityDialogUtils.showEditShortcutDialog(
mContext, DialogType.EDIT_SHORTCUT_GENERIC, PLACEHOLDER_DIALOG_TITLE,
this::callEmptyOnClicked);
@@ -248,7 +243,6 @@
@Test
@Config(shadows = ShadowFragment.class)
public void restoreValueFromSavedInstanceState_assignShortcutTypeToVariable() {
- mContext.setTheme(R.style.Theme_AppCompat);
final AlertDialog dialog = AccessibilityDialogUtils.showEditShortcutDialog(
mContext, DialogType.EDIT_SHORTCUT_GENERIC, PLACEHOLDER_DIALOG_TITLE,
this::callEmptyOnClicked);
@@ -273,9 +267,8 @@
@Test
@Config(shadows = ShadowFragment.class)
public void onPreferenceToggledOnDisabledService_notShowTooltipView() {
- mContext.setTheme(R.style.Theme_AppCompat);
-
- mFragment.onPreferenceToggled(mFragment.KEY_USE_SERVICE_PREFERENCE, /* enabled= */ false);
+ mFragment.onPreferenceToggled(
+ ToggleFeaturePreferenceFragment.KEY_USE_SERVICE_PREFERENCE, /* enabled= */ false);
assertThat(getLatestPopupWindow()).isNull();
}
@@ -283,9 +276,8 @@
@Test
@Config(shadows = ShadowFragment.class)
public void onPreferenceToggledOnEnabledService_showTooltipView() {
- mContext.setTheme(R.style.Theme_AppCompat);
-
- mFragment.onPreferenceToggled(mFragment.KEY_USE_SERVICE_PREFERENCE, /* enabled= */ true);
+ mFragment.onPreferenceToggled(
+ ToggleFeaturePreferenceFragment.KEY_USE_SERVICE_PREFERENCE, /* enabled= */ true);
assertThat(getLatestPopupWindow().isShowing()).isTrue();
}
@@ -293,33 +285,17 @@
@Test
@Config(shadows = ShadowFragment.class)
public void onPreferenceToggledOnEnabledService_tooltipViewShown_notShowTooltipView() {
- mContext.setTheme(R.style.Theme_AppCompat);
- mFragment.onPreferenceToggled(mFragment.KEY_USE_SERVICE_PREFERENCE, /* enabled= */ true);
+ mFragment.onPreferenceToggled(
+ ToggleFeaturePreferenceFragment.KEY_USE_SERVICE_PREFERENCE, /* enabled= */ true);
getLatestPopupWindow().dismiss();
- mFragment.onPreferenceToggled(mFragment.KEY_USE_SERVICE_PREFERENCE, /* enabled= */ true);
+ mFragment.onPreferenceToggled(
+ ToggleFeaturePreferenceFragment.KEY_USE_SERVICE_PREFERENCE, /* enabled= */ true);
assertThat(getLatestPopupWindow().isShowing()).isFalse();
}
@Test
- @Config(shadows = ShadowFragment.class)
- public void restoreValueFromSavedInstanceState_showTooltipView() {
- mContext.setTheme(R.style.Theme_AppCompat);
- mFragment.onPreferenceToggled(mFragment.KEY_USE_SERVICE_PREFERENCE, /* enabled= */ true);
- assertThat(getLatestPopupWindow().isShowing()).isTrue();
-
- final Bundle savedInstanceState = new Bundle();
- savedInstanceState.putBoolean(KEY_SAVED_QS_TOOLTIP_RESHOW, /* value= */ true);
- mFragment.onCreate(savedInstanceState);
- mFragment.onCreateView(LayoutInflater.from(mContext), mock(ViewGroup.class), Bundle.EMPTY);
- mFragment.onViewCreated(mFragment.getView(), savedInstanceState);
- mFragment.onAttach(mContext);
-
- assertThat(getLatestPopupWindow().isShowing()).isTrue();
- }
-
- @Test
public void initTopIntroPreference_hasTopIntroTitle_shouldSetAsExpectedValue() {
mFragment.mTopIntroTitle = DEFAULT_TOP_INTRO;
mFragment.initTopIntroPreference();
@@ -395,6 +371,21 @@
}
@Override
+ protected String getLogTag() {
+ return null;
+ }
+
+ @Override
+ protected void onProcessArguments(Bundle arguments) {
+ // do nothing
+ }
+
+ @Override
+ public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
+ // do nothing
+ }
+
+ @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return mock(View.class);
@@ -411,11 +402,6 @@
}
@Override
- public void addPreferencesFromResource(@XmlRes int preferencesResId) {
- // do nothing
- }
-
- @Override
protected void updateShortcutPreference() {
// UI related function, do nothing in tests
}
diff --git a/tests/robotests/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragmentForSetupWizardTest.java b/tests/robotests/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragmentForSetupWizardTest.java
index b8bb8d2..c5978f6 100644
--- a/tests/robotests/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragmentForSetupWizardTest.java
+++ b/tests/robotests/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragmentForSetupWizardTest.java
@@ -23,6 +23,7 @@
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
+import android.app.settings.SettingsEnums;
import android.content.Context;
import androidx.preference.Preference;
@@ -49,9 +50,7 @@
import org.robolectric.RobolectricTestRunner;
import org.robolectric.annotation.Config;
-/**
- * Tests for {@link ToggleScreenMagnificationPreferenceFragmentForSetupWizard}.
- */
+/** Tests for {@link ToggleScreenMagnificationPreferenceFragmentForSetupWizard}. */
@RunWith(RobolectricTestRunner.class)
@Config(shadows = {ShadowSettingsPreferenceFragment.class})
public class ToggleScreenMagnificationPreferenceFragmentForSetupWizardTest {
@@ -89,6 +88,17 @@
assertThat(mFragment.mFollowingTypingSwitchPreference.isVisible()).isFalse();
}
+ @Test
+ public void getMetricsCategory_returnsCorrectCategory() {
+ assertThat(mFragment.getMetricsCategory()).isEqualTo(
+ SettingsEnums.SUW_ACCESSIBILITY_TOGGLE_SCREEN_MAGNIFICATION);
+ }
+
+ @Test
+ public void getHelpResource_shouldNotHaveHelpResource() {
+ assertThat(mFragment.getHelpResource()).isEqualTo(0);
+ }
+
private static class TestToggleScreenMagnificationPreferenceFragmentForSetupWizard
extends ToggleScreenMagnificationPreferenceFragmentForSetupWizard {
diff --git a/tests/robotests/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragmentTest.java b/tests/robotests/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragmentTest.java
index 00ff960..4e74048 100644
--- a/tests/robotests/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragmentTest.java
@@ -70,6 +70,7 @@
import org.robolectric.RobolectricTestRunner;
import org.robolectric.annotation.Config;
+/** Tests for {@link ToggleScreenMagnificationPreferenceFragment}. */
@RunWith(RobolectricTestRunner.class)
@Config(shadows = {ShadowSettingsPreferenceFragment.class})
public class ToggleScreenMagnificationPreferenceFragmentTest {
@@ -389,6 +390,16 @@
verify(dialogDelegate).getDialogMetricsCategory(1);
}
+ @Test
+ public void getMetricsCategory_shouldNotHaveMetricsCategory() {
+ assertThat(mFragment.getMetricsCategory()).isEqualTo(0);
+ }
+
+ @Test
+ public void getHelpResource_returnsCorrectHelpResource() {
+ assertThat(mFragment.getHelpResource()).isEqualTo(R.string.help_url_magnification);
+ }
+
private void putStringIntoSettings(String key, String componentName) {
Settings.Secure.putString(mContext.getContentResolver(), key, componentName);
}
@@ -469,6 +480,11 @@
}
@Override
+ public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
+ // do nothing
+ }
+
+ @Override
public void onViewCreated(View view, Bundle savedInstanceState) {
// do nothing
}
diff --git a/tests/robotests/src/com/android/settings/accessibility/ToggleScreenReaderPreferenceFragmentForSetupWizardTest.java b/tests/robotests/src/com/android/settings/accessibility/ToggleScreenReaderPreferenceFragmentForSetupWizardTest.java
index 017a781..2cbe1ad 100644
--- a/tests/robotests/src/com/android/settings/accessibility/ToggleScreenReaderPreferenceFragmentForSetupWizardTest.java
+++ b/tests/robotests/src/com/android/settings/accessibility/ToggleScreenReaderPreferenceFragmentForSetupWizardTest.java
@@ -23,6 +23,7 @@
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
+import android.app.settings.SettingsEnums;
import android.content.Context;
import android.os.Bundle;
@@ -47,9 +48,7 @@
import org.mockito.junit.MockitoRule;
import org.robolectric.RobolectricTestRunner;
-/**
- * Tests for {@link ToggleScreenReaderPreferenceFragmentForSetupWizard}.
- */
+/** Tests for {@link ToggleScreenReaderPreferenceFragmentForSetupWizard}. */
@RunWith(RobolectricTestRunner.class)
public class ToggleScreenReaderPreferenceFragmentForSetupWizardTest {
@@ -83,6 +82,12 @@
assertThat(mFragment.mTopIntroPreference.isVisible()).isFalse();
}
+ @Test
+ public void getMetricsCategory_returnsCorrectCategory() {
+ assertThat(mFragment.getMetricsCategory()).isEqualTo(
+ SettingsEnums.SUW_ACCESSIBILITY_TOGGLE_SCREEN_READER);
+ }
+
private static class TestToggleScreenReaderPreferenceFragmentForSetupWizard
extends ToggleScreenReaderPreferenceFragmentForSetupWizard {
diff --git a/tests/robotests/src/com/android/settings/accessibility/ToggleSelectToSpeakPreferenceFragmentForSetupWizardTest.java b/tests/robotests/src/com/android/settings/accessibility/ToggleSelectToSpeakPreferenceFragmentForSetupWizardTest.java
index 85abbd6..43440ff 100644
--- a/tests/robotests/src/com/android/settings/accessibility/ToggleSelectToSpeakPreferenceFragmentForSetupWizardTest.java
+++ b/tests/robotests/src/com/android/settings/accessibility/ToggleSelectToSpeakPreferenceFragmentForSetupWizardTest.java
@@ -23,6 +23,7 @@
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
+import android.app.settings.SettingsEnums;
import android.content.Context;
import android.os.Bundle;
@@ -47,9 +48,7 @@
import org.mockito.junit.MockitoRule;
import org.robolectric.RobolectricTestRunner;
-/**
- * Tests for {@link ToggleSelectToSpeakPreferenceFragmentForSetupWizard}.
- */
+/** Tests for {@link ToggleSelectToSpeakPreferenceFragmentForSetupWizard}. */
@RunWith(RobolectricTestRunner.class)
public class ToggleSelectToSpeakPreferenceFragmentForSetupWizardTest {
@@ -83,6 +82,12 @@
assertThat(mFragment.mTopIntroPreference.isVisible()).isFalse();
}
+ @Test
+ public void getMetricsCategory_returnsCorrectCategory() {
+ assertThat(mFragment.getMetricsCategory()).isEqualTo(
+ SettingsEnums.SUW_ACCESSIBILITY_TOGGLE_SELECT_TO_SPEAK);
+ }
+
private static class TestToggleSelectToSpeakPreferenceFragmentForSetupWizard
extends ToggleSelectToSpeakPreferenceFragmentForSetupWizard {
diff --git a/tests/robotests/src/com/android/settings/applications/AppWithAdminGrantedPermissionsCounterTest.java b/tests/robotests/src/com/android/settings/applications/AppWithAdminGrantedPermissionsCounterTest.java
index 4e08f98..71c532c 100644
--- a/tests/robotests/src/com/android/settings/applications/AppWithAdminGrantedPermissionsCounterTest.java
+++ b/tests/robotests/src/com/android/settings/applications/AppWithAdminGrantedPermissionsCounterTest.java
@@ -20,10 +20,10 @@
import static com.google.common.truth.Truth.assertThat;
-import static org.mockito.ArgumentMatchers.anyInt;
-import static org.mockito.ArgumentMatchers.anyObject;
-import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.any;
+import static org.mockito.Mockito.anyInt;
import static org.mockito.Mockito.atLeast;
+import static org.mockito.Mockito.eq;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoMoreInteractions;
import static org.mockito.Mockito.when;
@@ -39,7 +39,6 @@
import android.os.UserHandle;
import android.os.UserManager;
-import java.util.Collections;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -49,6 +48,7 @@
import org.robolectric.shadows.ShadowApplication;
import java.util.Arrays;
+import java.util.Collections;
@RunWith(RobolectricTestRunner.class)
public final class AppWithAdminGrantedPermissionsCounterTest {
@@ -129,7 +129,7 @@
verify(mPackageManager).getInstalledApplicationsAsUser(anyInt(), eq(MAIN_USER_ID));
verify(mPackageManager).getInstalledApplicationsAsUser(anyInt(),
eq(MANAGED_PROFILE_ID));
- verify(mPackageManager, atLeast(0)).getInstallReason(anyObject(), anyObject());
+ verify(mPackageManager, atLeast(0)).getInstallReason(any(), any());
verifyNoMoreInteractions(mPackageManager);
}
@@ -166,9 +166,9 @@
}
private void configureInstallTimePermissions() throws RemoteException {
- when(mPackageManagerService.checkUidPermission(anyObject(), eq(APP_1_UID)))
+ when(mPackageManagerService.checkUidPermission(any(), eq(APP_1_UID)))
.thenReturn(PackageManager.PERMISSION_DENIED);
- when(mPackageManagerService.checkUidPermission(anyObject(), eq(APP_2_UID)))
+ when(mPackageManagerService.checkUidPermission(any(), eq(APP_2_UID)))
.thenReturn(PackageManager.PERMISSION_DENIED);
when(mPackageManagerService.checkUidPermission(PERMISSION_1, APP_3_UID))
.thenReturn(PackageManager.PERMISSION_DENIED);
@@ -178,9 +178,9 @@
.thenReturn(PackageManager.PERMISSION_DENIED);
when(mPackageManagerService.checkUidPermission(PERMISSION_2, APP_4_UID))
.thenReturn(PackageManager.PERMISSION_GRANTED);
- when(mPackageManagerService.checkUidPermission(anyObject(), eq(APP_5_UID)))
+ when(mPackageManagerService.checkUidPermission(any(), eq(APP_5_UID)))
.thenReturn(PackageManager.PERMISSION_DENIED);
- when(mPackageManagerService.checkUidPermission(anyObject(), eq(APP_6_UID)))
+ when(mPackageManagerService.checkUidPermission(any(), eq(APP_6_UID)))
.thenReturn(PackageManager.PERMISSION_DENIED);
}
@@ -189,15 +189,15 @@
.thenReturn(DevicePolicyManager.PERMISSION_GRANT_STATE_GRANTED);
when(mDevicePolicyManager.getPermissionGrantState(null, APP_1, PERMISSION_2))
.thenReturn(DevicePolicyManager.PERMISSION_GRANT_STATE_DENIED);
- when(mDevicePolicyManager.getPermissionGrantState(eq(null), eq(APP_2), anyObject()))
+ when(mDevicePolicyManager.getPermissionGrantState(eq(null), eq(APP_2), any()))
.thenReturn(DevicePolicyManager.PERMISSION_GRANT_STATE_DENIED);
- when(mDevicePolicyManager.getPermissionGrantState(eq(null), eq(APP_3), anyObject()))
+ when(mDevicePolicyManager.getPermissionGrantState(eq(null), eq(APP_3), any()))
.thenReturn(DevicePolicyManager.PERMISSION_GRANT_STATE_DENIED);
- when(mDevicePolicyManager.getPermissionGrantState(eq(null), eq(APP_4), anyObject()))
+ when(mDevicePolicyManager.getPermissionGrantState(eq(null), eq(APP_4), any()))
.thenReturn(DevicePolicyManager.PERMISSION_GRANT_STATE_DENIED);
- when(mDevicePolicyManager.getPermissionGrantState(eq(null), eq(APP_5), anyObject()))
+ when(mDevicePolicyManager.getPermissionGrantState(eq(null), eq(APP_5), any()))
.thenReturn(DevicePolicyManager.PERMISSION_GRANT_STATE_DENIED);
- when(mDevicePolicyManager.getPermissionGrantState(eq(null), eq(APP_6), anyObject()))
+ when(mDevicePolicyManager.getPermissionGrantState(eq(null), eq(APP_6), any()))
.thenReturn(DevicePolicyManager.PERMISSION_GRANT_STATE_GRANTED);
}
diff --git a/tests/robotests/src/com/android/settings/applications/AppWithAdminGrantedPermissionsListerTest.java b/tests/robotests/src/com/android/settings/applications/AppWithAdminGrantedPermissionsListerTest.java
index a818637..9a4978b 100644
--- a/tests/robotests/src/com/android/settings/applications/AppWithAdminGrantedPermissionsListerTest.java
+++ b/tests/robotests/src/com/android/settings/applications/AppWithAdminGrantedPermissionsListerTest.java
@@ -20,10 +20,10 @@
import static com.google.common.truth.Truth.assertThat;
-import static org.mockito.ArgumentMatchers.anyInt;
-import static org.mockito.ArgumentMatchers.anyObject;
-import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.any;
+import static org.mockito.Mockito.anyInt;
import static org.mockito.Mockito.atLeast;
+import static org.mockito.Mockito.eq;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoMoreInteractions;
import static org.mockito.Mockito.when;
@@ -122,19 +122,19 @@
.thenReturn(DevicePolicyManager.PERMISSION_GRANT_STATE_GRANTED);
when(mDevicePolicyManager.getPermissionGrantState(null, APP_1, PERMISSION_2))
.thenReturn(DevicePolicyManager.PERMISSION_GRANT_STATE_DENIED);
- when(mDevicePolicyManager.getPermissionGrantState(eq(null), eq(APP_2), anyObject()))
+ when(mDevicePolicyManager.getPermissionGrantState(eq(null), eq(APP_2), any()))
.thenReturn(DevicePolicyManager.PERMISSION_GRANT_STATE_DENIED);
- when(mDevicePolicyManager.getPermissionGrantState(eq(null), eq(APP_3), anyObject()))
+ when(mDevicePolicyManager.getPermissionGrantState(eq(null), eq(APP_3), any()))
.thenReturn(DevicePolicyManager.PERMISSION_GRANT_STATE_DENIED);
- when(mDevicePolicyManager.getPermissionGrantState(eq(null), eq(APP_4), anyObject()))
+ when(mDevicePolicyManager.getPermissionGrantState(eq(null), eq(APP_4), any()))
.thenReturn(DevicePolicyManager.PERMISSION_GRANT_STATE_DENIED);
- when(mDevicePolicyManager.getPermissionGrantState(eq(null), eq(APP_5), anyObject()))
+ when(mDevicePolicyManager.getPermissionGrantState(eq(null), eq(APP_5), any()))
.thenReturn(DevicePolicyManager.PERMISSION_GRANT_STATE_DENIED);
// Grant install-time permissions as appropriate.
- when(mPackageManagerService.checkUidPermission(anyObject(), eq(APP_1_UID)))
+ when(mPackageManagerService.checkUidPermission(any(), eq(APP_1_UID)))
.thenReturn(PackageManager.PERMISSION_DENIED);
- when(mPackageManagerService.checkUidPermission(anyObject(), eq(APP_2_UID)))
+ when(mPackageManagerService.checkUidPermission(any(), eq(APP_2_UID)))
.thenReturn(PackageManager.PERMISSION_DENIED);
when(mPackageManagerService.checkUidPermission(PERMISSION_1, APP_3_UID))
.thenReturn(PackageManager.PERMISSION_DENIED);
@@ -144,7 +144,7 @@
.thenReturn(PackageManager.PERMISSION_DENIED);
when(mPackageManagerService.checkUidPermission(PERMISSION_2, APP_4_UID))
.thenReturn(PackageManager.PERMISSION_GRANTED);
- when(mPackageManagerService.checkUidPermission(anyObject(), eq(APP_5_UID)))
+ when(mPackageManagerService.checkUidPermission(any(), eq(APP_5_UID)))
.thenReturn(PackageManager.PERMISSION_DENIED);
// app3 and app5 were installed by enterprise policy.
@@ -168,11 +168,11 @@
buildInfo(APP_6_UID, APP_6, 0 /* flags */, Build.VERSION_CODES.M)));
// Grant run-time permissions as appropriate.
- when(mDevicePolicyManager.getPermissionGrantState(eq(null), eq(APP_6), anyObject()))
+ when(mDevicePolicyManager.getPermissionGrantState(eq(null), eq(APP_6), any()))
.thenReturn(DevicePolicyManager.PERMISSION_GRANT_STATE_GRANTED);
// Grant install-time permissions as appropriate.
- when(mPackageManagerService.checkUidPermission(anyObject(), eq(APP_6_UID)))
+ when(mPackageManagerService.checkUidPermission(any(), eq(APP_6_UID)))
.thenReturn(PackageManager.PERMISSION_DENIED);
// app6 was not installed by enterprise policy.
@@ -202,7 +202,7 @@
verify(mPackageManager).getInstalledApplicationsAsUser(anyInt(), eq(MAIN_USER_ID));
verify(mPackageManager).getInstalledApplicationsAsUser(anyInt(),
eq(MANAGED_PROFILE_ID));
- verify(mPackageManager, atLeast(0)).getInstallReason(anyObject(), anyObject());
+ verify(mPackageManager, atLeast(0)).getInstallReason(any(), any());
verifyNoMoreInteractions(mPackageManager);
}
diff --git a/tests/robotests/src/com/android/settings/applications/InstalledAppListerTest.java b/tests/robotests/src/com/android/settings/applications/InstalledAppListerTest.java
index e2aed36..602d678 100644
--- a/tests/robotests/src/com/android/settings/applications/InstalledAppListerTest.java
+++ b/tests/robotests/src/com/android/settings/applications/InstalledAppListerTest.java
@@ -20,11 +20,11 @@
import static com.google.common.truth.Truth.assertThat;
-import static org.mockito.ArgumentMatchers.anyInt;
-import static org.mockito.ArgumentMatchers.anyObject;
-import static org.mockito.ArgumentMatchers.argThat;
-import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.any;
+import static org.mockito.Mockito.anyInt;
+import static org.mockito.Mockito.argThat;
import static org.mockito.Mockito.atLeast;
+import static org.mockito.Mockito.eq;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@@ -170,7 +170,7 @@
verify(mPackageManager).getInstalledApplicationsAsUser(anyInt(), eq(MAIN_USER_ID));
verify(mPackageManager).getInstalledApplicationsAsUser(anyInt(), eq(MANAGED_PROFILE_ID));
verify(mPackageManager, atLeast(0))
- .queryIntentActivitiesAsUser(anyObject(), anyInt(), anyInt());
+ .queryIntentActivitiesAsUser(any(), anyInt(), anyInt());
}
public static boolean checkAppFound(List<UserAppInfo> mInstalledAppList, String appId,
diff --git a/tests/robotests/src/com/android/settings/applications/SpecialAppAccessPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/applications/SpecialAppAccessPreferenceControllerTest.java
index e0a0836..da5ada7 100644
--- a/tests/robotests/src/com/android/settings/applications/SpecialAppAccessPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/applications/SpecialAppAccessPreferenceControllerTest.java
@@ -20,7 +20,7 @@
import static com.google.common.truth.Truth.assertThat;
-import static org.mockito.Matchers.anyInt;
+import static org.mockito.Mockito.anyInt;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.spy;
diff --git a/tests/robotests/src/com/android/settings/applications/assist/DefaultAssistPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/applications/assist/DefaultAssistPreferenceControllerTest.java
index 3e46027..178a26f 100644
--- a/tests/robotests/src/com/android/settings/applications/assist/DefaultAssistPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/applications/assist/DefaultAssistPreferenceControllerTest.java
@@ -24,7 +24,7 @@
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.verifyZeroInteractions;
+import static org.mockito.Mockito.verifyNoInteractions;
import static org.mockito.Mockito.when;
import android.Manifest;
@@ -142,6 +142,6 @@
controller.getSettingIntent(null);
- verifyZeroInteractions(assistUtils);
+ verifyNoInteractions(assistUtils);
}
}
diff --git a/tests/robotests/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrollingTest.java b/tests/robotests/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrollingTest.java
index 757a304..3af10fd 100644
--- a/tests/robotests/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrollingTest.java
+++ b/tests/robotests/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrollingTest.java
@@ -18,11 +18,11 @@
import static com.google.common.truth.Truth.assertThat;
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.anyInt;
-import static org.mockito.ArgumentMatchers.anyString;
-import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.any;
+import static org.mockito.Mockito.anyInt;
+import static org.mockito.Mockito.anyString;
import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.eq;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
diff --git a/tests/robotests/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollFindSensorTest.java b/tests/robotests/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollFindSensorTest.java
index 55f0210..ec17a86 100644
--- a/tests/robotests/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollFindSensorTest.java
+++ b/tests/robotests/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollFindSensorTest.java
@@ -19,9 +19,9 @@
import static com.google.common.truth.Truth.assertThat;
import static com.google.common.truth.Truth.assertWithMessage;
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.anyInt;
-import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.any;
+import static org.mockito.Mockito.anyInt;
+import static org.mockito.Mockito.eq;
import static org.mockito.Mockito.verify;
import static org.robolectric.RuntimeEnvironment.application;
diff --git a/tests/robotests/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollIntroductionTest.java b/tests/robotests/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollIntroductionTest.java
index d8852db..1096f40 100644
--- a/tests/robotests/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollIntroductionTest.java
+++ b/tests/robotests/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollIntroductionTest.java
@@ -173,4 +173,24 @@
assertThat(result).isEqualTo(R.string.fingerprint_intro_error_max);
}
+
+ @Test
+ public void intro_CheckCanEnrollDuringPortal() {
+ setupFingerprintEnrollIntroWith(
+ new Intent().putExtra(WizardManagerHelper.EXTRA_IS_PORTAL_SETUP, true));
+ setFingerprintManagerToHave(2 /* numEnrollments */);
+ int result = mFingerprintEnrollIntroduction.checkMaxEnrolled();
+
+ assertThat(result).isEqualTo(0);
+ }
+
+ @Test
+ public void intro_CheckMaxEnrolledDuringPortal() {
+ setupFingerprintEnrollIntroWith(
+ new Intent().putExtra(WizardManagerHelper.EXTRA_IS_PORTAL_SETUP, true));
+ setFingerprintManagerToHave(6 /* numEnrollments */);
+ int result = mFingerprintEnrollIntroduction.checkMaxEnrolled();
+
+ assertThat(result).isEqualTo(R.string.fingerprint_intro_error_max);
+ }
}
diff --git a/tests/robotests/src/com/android/settings/bluetooth/BluetoothDeviceDetailsFragmentTest.java b/tests/robotests/src/com/android/settings/bluetooth/BluetoothDeviceDetailsFragmentTest.java
index 53317a9..d501c15 100644
--- a/tests/robotests/src/com/android/settings/bluetooth/BluetoothDeviceDetailsFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/bluetooth/BluetoothDeviceDetailsFragmentTest.java
@@ -21,8 +21,8 @@
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
diff --git a/tests/robotests/src/com/android/settings/dashboard/DashboardFeatureProviderImplTest.java b/tests/robotests/src/com/android/settings/dashboard/DashboardFeatureProviderImplTest.java
index 01f9707..88c9597 100644
--- a/tests/robotests/src/com/android/settings/dashboard/DashboardFeatureProviderImplTest.java
+++ b/tests/robotests/src/com/android/settings/dashboard/DashboardFeatureProviderImplTest.java
@@ -40,7 +40,7 @@
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.verifyZeroInteractions;
+import static org.mockito.Mockito.verifyNoInteractions;
import static org.mockito.Mockito.when;
import android.content.Context;
@@ -273,7 +273,7 @@
mImpl.bindPreferenceToTileAndGetObservers(mActivity, mFragment, mForceRoundedIcon,
null /* keys */, tile, "123", Preference.DEFAULT_ORDER);
- verifyZeroInteractions(tile);
+ verifyNoInteractions(tile);
}
@Test
diff --git a/tests/robotests/src/com/android/settings/datausage/AppDataUsageTest.java b/tests/robotests/src/com/android/settings/datausage/AppDataUsageTest.java
index 483d746..47db4f2 100644
--- a/tests/robotests/src/com/android/settings/datausage/AppDataUsageTest.java
+++ b/tests/robotests/src/com/android/settings/datausage/AppDataUsageTest.java
@@ -19,14 +19,14 @@
import static com.google.common.truth.Truth.assertThat;
import static org.junit.Assert.assertTrue;
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.anyBoolean;
-import static org.mockito.ArgumentMatchers.anyInt;
-import static org.mockito.ArgumentMatchers.anyString;
-import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
+import static org.mockito.Mockito.any;
+import static org.mockito.Mockito.anyBoolean;
+import static org.mockito.Mockito.anyInt;
+import static org.mockito.Mockito.anyString;
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
diff --git a/tests/robotests/src/com/android/settings/datausage/BillingCycleSettingsTest.java b/tests/robotests/src/com/android/settings/datausage/BillingCycleSettingsTest.java
index 861b4e3..cef5928 100644
--- a/tests/robotests/src/com/android/settings/datausage/BillingCycleSettingsTest.java
+++ b/tests/robotests/src/com/android/settings/datausage/BillingCycleSettingsTest.java
@@ -19,16 +19,15 @@
import static com.google.common.truth.Truth.assertThat;
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.anyInt;
-import static org.mockito.ArgumentMatchers.anyLong;
-import static org.mockito.ArgumentMatchers.anyObject;
-import static org.mockito.ArgumentMatchers.anyString;
-import static org.mockito.ArgumentMatchers.nullable;
+import static org.mockito.Mockito.any;
+import static org.mockito.Mockito.anyInt;
+import static org.mockito.Mockito.anyLong;
+import static org.mockito.Mockito.anyString;
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.nullable;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@@ -133,9 +132,9 @@
mDataLimit, mDataWarning, mEnableDataLimit, mEnableDataWarning);
doReturn("some-string").when(billingCycleSettings).getString(anyInt(), anyInt());
- when(mNetworkPolicyEditor.getPolicyCycleDay(anyObject())).thenReturn(CYCLE_NONE + 1);
- when(mNetworkPolicyEditor.getPolicyLimitBytes(anyObject())).thenReturn(2000L);
- when(mNetworkPolicyEditor.getPolicyWarningBytes(anyObject())).thenReturn(1000L);
+ when(mNetworkPolicyEditor.getPolicyCycleDay(any())).thenReturn(CYCLE_NONE + 1);
+ when(mNetworkPolicyEditor.getPolicyLimitBytes(any())).thenReturn(2000L);
+ when(mNetworkPolicyEditor.getPolicyWarningBytes(any())).thenReturn(1000L);
billingCycleSettings.updatePrefs();
diff --git a/tests/robotests/src/com/android/settings/datausage/lib/DataUsageLibTest.java b/tests/robotests/src/com/android/settings/datausage/lib/DataUsageLibTest.java
index 70a1a38..4391425 100644
--- a/tests/robotests/src/com/android/settings/datausage/lib/DataUsageLibTest.java
+++ b/tests/robotests/src/com/android/settings/datausage/lib/DataUsageLibTest.java
@@ -18,7 +18,7 @@
import static com.google.common.truth.Truth.assertThat;
-import static org.mockito.Matchers.anyInt;
+import static org.mockito.Mockito.anyInt;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.when;
diff --git a/tests/robotests/src/com/android/settings/datetime/LocationTimeZoneDetectionPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/datetime/LocationTimeZoneDetectionPreferenceControllerTest.java
index 1f50bed..fc62ac8 100644
--- a/tests/robotests/src/com/android/settings/datetime/LocationTimeZoneDetectionPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/datetime/LocationTimeZoneDetectionPreferenceControllerTest.java
@@ -24,7 +24,7 @@
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.verifyZeroInteractions;
+import static org.mockito.Mockito.verifyNoInteractions;
import static org.mockito.Mockito.when;
import android.app.time.Capabilities;
@@ -99,7 +99,7 @@
mController.setChecked(true);
// Verify the TimeManager was not called.
- verifyZeroInteractions(mTimeManager);
+ verifyNoInteractions(mTimeManager);
}
@Test
diff --git a/tests/robotests/src/com/android/settings/deviceinfo/firmwareversion/MainlineModuleVersionPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/deviceinfo/firmwareversion/MainlineModuleVersionPreferenceControllerTest.java
index 3f49b15..35e044c 100644
--- a/tests/robotests/src/com/android/settings/deviceinfo/firmwareversion/MainlineModuleVersionPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/deviceinfo/firmwareversion/MainlineModuleVersionPreferenceControllerTest.java
@@ -23,8 +23,8 @@
import static com.google.common.truth.Truth.assertThat;
-import static org.mockito.Matchers.anyInt;
-import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.anyInt;
+import static org.mockito.Mockito.eq;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.when;
diff --git a/tests/robotests/src/com/android/settings/enterprise/AdminGrantedPermissionsPreferenceControllerTestBase.java b/tests/robotests/src/com/android/settings/enterprise/AdminGrantedPermissionsPreferenceControllerTestBase.java
index 09d1c84..06e4107 100644
--- a/tests/robotests/src/com/android/settings/enterprise/AdminGrantedPermissionsPreferenceControllerTestBase.java
+++ b/tests/robotests/src/com/android/settings/enterprise/AdminGrantedPermissionsPreferenceControllerTestBase.java
@@ -18,10 +18,10 @@
import static com.google.common.truth.Truth.assertThat;
-import static org.mockito.ArgumentMatchers.anyObject;
-import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.any;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
@@ -79,7 +79,7 @@
}
}).when(mFeatureFactory.applicationFeatureProvider)
.calculateNumberOfAppsWithAdminGrantedPermissions(eq(mPermissions),
- eq(async), anyObject());
+ eq(async), any());
}
@Test
diff --git a/tests/robotests/src/com/android/settings/enterprise/EnterpriseInstalledPackagesPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/enterprise/EnterpriseInstalledPackagesPreferenceControllerTest.java
index f39b4b8..c32d2d7 100644
--- a/tests/robotests/src/com/android/settings/enterprise/EnterpriseInstalledPackagesPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/enterprise/EnterpriseInstalledPackagesPreferenceControllerTest.java
@@ -18,7 +18,7 @@
import static com.google.common.truth.Truth.assertThat;
-import static org.mockito.Mockito.anyObject;
+import static org.mockito.Mockito.any;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.eq;
@@ -74,7 +74,7 @@
return null;
}
}).when(mFeatureFactory.applicationFeatureProvider)
- .calculateNumberOfPolicyInstalledApps(eq(async), anyObject());
+ .calculateNumberOfPolicyInstalledApps(eq(async), any());
}
@Test
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java b/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java
index 079e8f9..e7d7cd0 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java
@@ -30,7 +30,7 @@
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.verifyZeroInteractions;
+import static org.mockito.Mockito.verifyNoInteractions;
import static org.mockito.Mockito.when;
import android.app.AppOpsManager;
@@ -824,7 +824,7 @@
mFragment.onRadioButtonClicked(mOptimizePreference);
mFragment.onPause();
- verifyZeroInteractions(mMetricsFeatureProvider);
+ verifyNoInteractions(mMetricsFeatureProvider);
}
@Test
@@ -835,7 +835,7 @@
mFragment.notifyBackupManager();
- verifyZeroInteractions(mBackupManager);
+ verifyNoInteractions(mBackupManager);
}
@Test
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BatteryBackupHelperTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BatteryBackupHelperTest.java
index 14bbeea..55ff93b 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/BatteryBackupHelperTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/BatteryBackupHelperTest.java
@@ -34,7 +34,7 @@
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.verifyZeroInteractions;
+import static org.mockito.Mockito.verifyNoInteractions;
import android.app.AppOpsManager;
import android.app.backup.BackupDataInputStream;
@@ -70,6 +70,7 @@
import java.util.Arrays;
import java.util.List;
+import java.util.Set;
import java.util.concurrent.TimeUnit;
@RunWith(RobolectricTestRunner.class)
@@ -253,7 +254,7 @@
mBatteryBackupHelper.restoreEntity(mBackupDataInputStream);
- verifyZeroInteractions(mBackupDataInputStream);
+ verifyNoInteractions(mBackupDataInputStream);
}
@Test
@@ -291,13 +292,13 @@
@Test
public void restoreOptimizationMode_nullBytesData_skipRestore() throws Exception {
mBatteryBackupHelper.restoreOptimizationMode(new byte[0]);
- verifyZeroInteractions(mBatteryOptimizeUtils);
+ verifyNoInteractions(mBatteryOptimizeUtils);
mBatteryBackupHelper.restoreOptimizationMode("invalid data format".getBytes());
- verifyZeroInteractions(mBatteryOptimizeUtils);
+ verifyNoInteractions(mBatteryOptimizeUtils);
mBatteryBackupHelper.restoreOptimizationMode(DELIMITER.getBytes());
- verifyZeroInteractions(mBatteryOptimizeUtils);
+ verifyNoInteractions(mBatteryOptimizeUtils);
}
@Test
@@ -343,9 +344,17 @@
private void verifyBackupData(String expectedResult) throws Exception {
final byte[] expectedBytes = expectedResult.getBytes();
+ final ArgumentCaptor<byte[]> captor = ArgumentCaptor.forClass(byte[].class);
+ final Set<String> expectedResultSet =
+ Set.of(expectedResult.split(BatteryBackupHelper.DELIMITER));
+
verify(mBackupDataOutput).writeEntityHeader(
BatteryBackupHelper.KEY_OPTIMIZATION_LIST, expectedBytes.length);
- verify(mBackupDataOutput).writeEntityData(expectedBytes, expectedBytes.length);
+ verify(mBackupDataOutput).writeEntityData(captor.capture(), eq(expectedBytes.length));
+ final String actualResult = new String(captor.getValue());
+ final Set<String> actualResultSet =
+ Set.of(actualResult.split(BatteryBackupHelper.DELIMITER));
+ assertThat(actualResultSet).isEqualTo(expectedResultSet);
}
private void createTestingData(
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BatteryHeaderPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BatteryHeaderPreferenceControllerTest.java
index 6389dc9..78534e1 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/BatteryHeaderPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/BatteryHeaderPreferenceControllerTest.java
@@ -23,7 +23,7 @@
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.verifyZeroInteractions;
+import static org.mockito.Mockito.verifyNoInteractions;
import static org.mockito.Mockito.when;
import android.app.Activity;
@@ -267,7 +267,7 @@
mController.updateHeaderByBatteryTips(null, mBatteryInfo);
- verifyZeroInteractions(mBatteryUsageProgressBarPref);
+ verifyNoInteractions(mBatteryUsageProgressBarPref);
}
@Test
@@ -277,7 +277,7 @@
mController.updateHeaderByBatteryTips(lowBatteryTip, null);
- verifyZeroInteractions(mBatteryUsageProgressBarPref);
+ verifyNoInteractions(mBatteryUsageProgressBarPref);
}
@Test
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BatteryOptimizeUtilsTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BatteryOptimizeUtilsTest.java
index b223d0b..f92c322 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/BatteryOptimizeUtilsTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/BatteryOptimizeUtilsTest.java
@@ -25,16 +25,16 @@
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
-import static org.mockito.ArgumentMatchers.anyInt;
-import static org.mockito.ArgumentMatchers.anyLong;
-import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.Mockito.anyInt;
+import static org.mockito.Mockito.anyLong;
+import static org.mockito.Mockito.anyString;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.doThrow;
import static org.mockito.Mockito.inOrder;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoInteractions;
import static org.mockito.Mockito.verifyNoMoreInteractions;
-import static org.mockito.Mockito.verifyZeroInteractions;
import static org.mockito.Mockito.when;
import android.app.AppOpsManager;
@@ -183,8 +183,8 @@
mBatteryOptimizeUtils.setAppUsageState(MODE_UNRESTRICTED);
TimeUnit.SECONDS.sleep(1);
- verifyZeroInteractions(mMockBackend);
- verifyZeroInteractions(mMockBatteryUtils);
+ verifyNoInteractions(mMockBackend);
+ verifyNoInteractions(mMockBatteryUtils);
}
@Test
@@ -247,7 +247,7 @@
AppOpsManager.MODE_ALLOWED, /* allowListed */ false,
/* isSystemOrDefaultApp */ false);
- verifyZeroInteractions(mMockBatteryUtils);
+ verifyNoInteractions(mMockBatteryUtils);
final InOrder inOrder = inOrder(mMockBackend);
inOrder.verify(mMockBackend).refreshList();
@@ -261,7 +261,7 @@
AppOpsManager.MODE_ALLOWED, /* allowListed */ true,
/* isSystemOrDefaultApp */ true);
- verifyZeroInteractions(mMockBatteryUtils);
+ verifyNoInteractions(mMockBatteryUtils);
final InOrder inOrder = inOrder(mMockBackend);
inOrder.verify(mMockBackend).refreshList();
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryAppListPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryAppListPreferenceControllerTest.java
index da397fd..5815bae 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryAppListPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryAppListPreferenceControllerTest.java
@@ -18,7 +18,7 @@
import static com.google.common.truth.Truth.assertThat;
-import static org.mockito.Matchers.anyInt;
+import static org.mockito.Mockito.anyInt;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.when;
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryChartPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryChartPreferenceControllerTest.java
index 75b7fe1..4a28e64 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryChartPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryChartPreferenceControllerTest.java
@@ -18,8 +18,8 @@
import static com.google.common.truth.Truth.assertThat;
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.Matchers.anyLong;
+import static org.mockito.Mockito.any;
+import static org.mockito.Mockito.anyLong;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.spy;
@@ -28,8 +28,6 @@
import android.app.settings.SettingsEnums;
import android.content.ContentValues;
import android.content.Context;
-import android.content.pm.PackageManager;
-import android.content.res.Configuration;
import android.content.res.Resources;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryChartPreferenceControllerV2Test.java b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryChartPreferenceControllerV2Test.java
new file mode 100644
index 0000000..c40d359
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryChartPreferenceControllerV2Test.java
@@ -0,0 +1,702 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.fuelgauge.batteryusage;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.any;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+
+import android.app.settings.SettingsEnums;
+import android.content.ContentValues;
+import android.content.Context;
+import android.content.res.Resources;
+import android.graphics.drawable.Drawable;
+import android.os.Bundle;
+import android.os.LocaleList;
+import android.text.format.DateUtils;
+
+import androidx.preference.Preference;
+import androidx.preference.PreferenceCategory;
+import androidx.preference.PreferenceGroup;
+
+import com.android.settings.SettingsActivity;
+import com.android.settings.core.InstrumentedPreferenceFragment;
+import com.android.settings.fuelgauge.BatteryUtils;
+import com.android.settings.testutils.FakeFeatureFactory;
+import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
+import org.robolectric.RuntimeEnvironment;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Locale;
+import java.util.Map;
+import java.util.TimeZone;
+
+@RunWith(RobolectricTestRunner.class)
+public final class BatteryChartPreferenceControllerV2Test {
+ private static final String PREF_KEY = "pref_key";
+ private static final String PREF_SUMMARY = "fake preference summary";
+ private static final int DESIRED_HISTORY_SIZE =
+ BatteryChartPreferenceControllerV2.DESIRED_HISTORY_SIZE;
+
+ @Mock
+ private InstrumentedPreferenceFragment mFragment;
+ @Mock
+ private SettingsActivity mSettingsActivity;
+ @Mock
+ private PreferenceGroup mAppListGroup;
+ @Mock
+ private Drawable mDrawable;
+ @Mock
+ private BatteryHistEntry mBatteryHistEntry;
+ @Mock
+ private BatteryChartViewV2 mBatteryChartView;
+ @Mock
+ private PowerGaugePreference mPowerGaugePreference;
+ @Mock
+ private BatteryUtils mBatteryUtils;
+
+ private Context mContext;
+ private FakeFeatureFactory mFeatureFactory;
+ private BatteryDiffEntry mBatteryDiffEntry;
+ private MetricsFeatureProvider mMetricsFeatureProvider;
+ private BatteryChartPreferenceControllerV2 mBatteryChartPreferenceController;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ Locale.setDefault(new Locale("en_US"));
+ org.robolectric.shadows.ShadowSettings.set24HourTimeFormat(false);
+ TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
+ mFeatureFactory = FakeFeatureFactory.setupForTest();
+ mMetricsFeatureProvider = mFeatureFactory.metricsFeatureProvider;
+ mContext = spy(RuntimeEnvironment.application);
+ final Resources resources = spy(mContext.getResources());
+ resources.getConfiguration().setLocales(new LocaleList(new Locale("en_US")));
+ doReturn(resources).when(mContext).getResources();
+ doReturn(new String[]{"com.android.googlequicksearchbox"})
+ .when(mFeatureFactory.powerUsageFeatureProvider)
+ .getHideApplicationSummary(mContext);
+ doReturn(new String[]{"com.android.gms.persistent"})
+ .when(mFeatureFactory.powerUsageFeatureProvider)
+ .getHideApplicationEntries(mContext);
+ mBatteryChartPreferenceController = createController();
+ mBatteryChartPreferenceController.mPrefContext = mContext;
+ mBatteryChartPreferenceController.mAppListPrefGroup = mAppListGroup;
+ mBatteryChartPreferenceController.mBatteryChartView = mBatteryChartView;
+ mBatteryDiffEntry = new BatteryDiffEntry(
+ mContext,
+ /*foregroundUsageTimeInMs=*/ 1,
+ /*backgroundUsageTimeInMs=*/ 2,
+ /*consumePower=*/ 3,
+ mBatteryHistEntry);
+ mBatteryDiffEntry = spy(mBatteryDiffEntry);
+ // Adds fake testing data.
+ BatteryDiffEntry.sResourceCache.put(
+ "fakeBatteryDiffEntryKey",
+ new BatteryEntry.NameAndIcon("fakeName", /*icon=*/ null, /*iconId=*/ 1));
+ mBatteryChartPreferenceController.setBatteryHistoryMap(
+ createBatteryHistoryMap());
+ }
+
+ @Test
+ public void testOnDestroy_activityIsChanging_clearBatteryEntryCache() {
+ doReturn(true).when(mSettingsActivity).isChangingConfigurations();
+ // Ensures the testing environment is correct.
+ assertThat(BatteryDiffEntry.sResourceCache).hasSize(1);
+
+ mBatteryChartPreferenceController.onDestroy();
+ assertThat(BatteryDiffEntry.sResourceCache).isEmpty();
+ }
+
+ @Test
+ public void testOnDestroy_activityIsNotChanging_notClearBatteryEntryCache() {
+ doReturn(false).when(mSettingsActivity).isChangingConfigurations();
+ // Ensures the testing environment is correct.
+ assertThat(BatteryDiffEntry.sResourceCache).hasSize(1);
+
+ mBatteryChartPreferenceController.onDestroy();
+ assertThat(BatteryDiffEntry.sResourceCache).isNotEmpty();
+ }
+
+ @Test
+ public void testOnDestroy_clearPreferenceCache() {
+ // Ensures the testing environment is correct.
+ mBatteryChartPreferenceController.mPreferenceCache.put(
+ PREF_KEY, mPowerGaugePreference);
+ assertThat(mBatteryChartPreferenceController.mPreferenceCache).hasSize(1);
+
+ mBatteryChartPreferenceController.onDestroy();
+ // Verifies the result after onDestroy.
+ assertThat(mBatteryChartPreferenceController.mPreferenceCache).isEmpty();
+ }
+
+ @Test
+ public void testOnDestroy_removeAllPreferenceFromPreferenceGroup() {
+ mBatteryChartPreferenceController.onDestroy();
+ verify(mAppListGroup).removeAll();
+ }
+
+ @Test
+ public void testSetBatteryHistoryMap_createExpectedKeysAndLevels() {
+ mBatteryChartPreferenceController.setBatteryHistoryMap(
+ createBatteryHistoryMap());
+
+ // Verifies the created battery keys array.
+ for (int index = 0; index < DESIRED_HISTORY_SIZE; index++) {
+ assertThat(mBatteryChartPreferenceController.mBatteryHistoryKeys[index])
+ // These values is are calculated by hand from createBatteryHistoryMap().
+ .isEqualTo(index + 1);
+ }
+ // Verifies the created battery levels array.
+ for (int index = 0; index < 13; index++) {
+ assertThat(mBatteryChartPreferenceController.mBatteryHistoryLevels[index])
+ // These values is are calculated by hand from createBatteryHistoryMap().
+ .isEqualTo(100 - index * 2);
+ }
+ assertThat(mBatteryChartPreferenceController.mBatteryIndexedMap).hasSize(13);
+ }
+
+ @Test
+ public void testSetBatteryHistoryMap_largeSize_createExpectedKeysAndLevels() {
+ mBatteryChartPreferenceController.setBatteryHistoryMap(
+ createBatteryHistoryMap());
+
+ // Verifies the created battery keys array.
+ for (int index = 0; index < DESIRED_HISTORY_SIZE; index++) {
+ assertThat(mBatteryChartPreferenceController.mBatteryHistoryKeys[index])
+ // These values is are calculated by hand from createBatteryHistoryMap().
+ .isEqualTo(index + 1);
+ }
+ // Verifies the created battery levels array.
+ for (int index = 0; index < 13; index++) {
+ assertThat(mBatteryChartPreferenceController.mBatteryHistoryLevels[index])
+ // These values is are calculated by hand from createBatteryHistoryMap().
+ .isEqualTo(100 - index * 2);
+ }
+ assertThat(mBatteryChartPreferenceController.mBatteryIndexedMap).hasSize(13);
+ }
+
+ @Test
+ public void testRefreshUi_batteryIndexedMapIsNull_ignoreRefresh() {
+ mBatteryChartPreferenceController.setBatteryHistoryMap(null);
+ assertThat(mBatteryChartPreferenceController.refreshUi(
+ /*trapezoidIndex=*/ 1, /*isForce=*/ false)).isFalse();
+ }
+
+ @Test
+ public void testRefreshUi_batteryChartViewIsNull_ignoreRefresh() {
+ mBatteryChartPreferenceController.mBatteryChartView = null;
+ assertThat(mBatteryChartPreferenceController.refreshUi(
+ /*trapezoidIndex=*/ 1, /*isForce=*/ false)).isFalse();
+ }
+
+ @Test
+ public void testRefreshUi_trapezoidIndexIsNotChanged_ignoreRefresh() {
+ final int trapezoidIndex = 1;
+ mBatteryChartPreferenceController.mTrapezoidIndex = trapezoidIndex;
+ assertThat(mBatteryChartPreferenceController.refreshUi(
+ trapezoidIndex, /*isForce=*/ false)).isFalse();
+ }
+
+ @Test
+ public void testRefreshUi_forceUpdate_refreshUi() {
+ final int trapezoidIndex = 1;
+ mBatteryChartPreferenceController.mTrapezoidIndex = trapezoidIndex;
+ assertThat(mBatteryChartPreferenceController.refreshUi(
+ trapezoidIndex, /*isForce=*/ true)).isTrue();
+ }
+
+ @Test
+ public void testForceRefreshUi_updateTrapezoidIndexIntoSelectAll() {
+ mBatteryChartPreferenceController.mTrapezoidIndex =
+ BatteryChartViewV2.SELECTED_INDEX_INVALID;
+ mBatteryChartPreferenceController.setBatteryHistoryMap(
+ createBatteryHistoryMap());
+
+ assertThat(mBatteryChartPreferenceController.mTrapezoidIndex)
+ .isEqualTo(BatteryChartViewV2.SELECTED_INDEX_ALL);
+ }
+
+ @Test
+ public void testRemoveAndCacheAllPrefs_emptyContent_ignoreRemoveAll() {
+ final int trapezoidIndex = 1;
+ doReturn(0).when(mAppListGroup).getPreferenceCount();
+
+ mBatteryChartPreferenceController.refreshUi(
+ trapezoidIndex, /*isForce=*/ true);
+ verify(mAppListGroup, never()).removeAll();
+ }
+
+ @Test
+ public void testRemoveAndCacheAllPrefs_buildCacheAndRemoveAllPreference() {
+ final int trapezoidIndex = 1;
+ doReturn(1).when(mAppListGroup).getPreferenceCount();
+ doReturn(mPowerGaugePreference).when(mAppListGroup).getPreference(0);
+ doReturn(PREF_KEY).when(mPowerGaugePreference).getKey();
+ // Ensures the testing data is correct.
+ assertThat(mBatteryChartPreferenceController.mPreferenceCache).isEmpty();
+
+ mBatteryChartPreferenceController.refreshUi(
+ trapezoidIndex, /*isForce=*/ true);
+
+ assertThat(mBatteryChartPreferenceController.mPreferenceCache.get(PREF_KEY))
+ .isEqualTo(mPowerGaugePreference);
+ verify(mAppListGroup).removeAll();
+ }
+
+ @Test
+ public void testAddPreferenceToScreen_emptyContent_ignoreAddPreference() {
+ mBatteryChartPreferenceController.addPreferenceToScreen(
+ new ArrayList<BatteryDiffEntry>());
+ verify(mAppListGroup, never()).addPreference(any());
+ }
+
+ @Test
+ public void testAddPreferenceToScreen_addPreferenceIntoScreen() {
+ final String appLabel = "fake app label";
+ doReturn(1).when(mAppListGroup).getPreferenceCount();
+ doReturn(mDrawable).when(mBatteryDiffEntry).getAppIcon();
+ doReturn(appLabel).when(mBatteryDiffEntry).getAppLabel();
+ doReturn(PREF_KEY).when(mBatteryHistEntry).getKey();
+ doReturn(null).when(mAppListGroup).findPreference(PREF_KEY);
+ doReturn(false).when(mBatteryDiffEntry).validForRestriction();
+
+ mBatteryChartPreferenceController.addPreferenceToScreen(
+ Arrays.asList(mBatteryDiffEntry));
+
+ // Verifies the preference cache.
+ final PowerGaugePreference pref =
+ (PowerGaugePreference) mBatteryChartPreferenceController.mPreferenceCache
+ .get(PREF_KEY);
+ assertThat(pref).isNotNull();
+ // Verifies the added preference configuration.
+ verify(mAppListGroup).addPreference(pref);
+ assertThat(pref.getKey()).isEqualTo(PREF_KEY);
+ assertThat(pref.getTitle()).isEqualTo(appLabel);
+ assertThat(pref.getIcon()).isEqualTo(mDrawable);
+ assertThat(pref.getOrder()).isEqualTo(1);
+ assertThat(pref.getBatteryDiffEntry()).isSameInstanceAs(mBatteryDiffEntry);
+ assertThat(pref.isSingleLineTitle()).isTrue();
+ assertThat(pref.isEnabled()).isFalse();
+ }
+
+ @Test
+ public void testAddPreferenceToScreen_alreadyInScreen_notAddPreferenceAgain() {
+ final String appLabel = "fake app label";
+ doReturn(1).when(mAppListGroup).getPreferenceCount();
+ doReturn(mDrawable).when(mBatteryDiffEntry).getAppIcon();
+ doReturn(appLabel).when(mBatteryDiffEntry).getAppLabel();
+ doReturn(PREF_KEY).when(mBatteryHistEntry).getKey();
+ doReturn(mPowerGaugePreference).when(mAppListGroup).findPreference(PREF_KEY);
+
+ mBatteryChartPreferenceController.addPreferenceToScreen(
+ Arrays.asList(mBatteryDiffEntry));
+
+ verify(mAppListGroup, never()).addPreference(any());
+ }
+
+ @Test
+ public void testHandlePreferenceTreeiClick_notPowerGaugePreference_returnFalse() {
+ assertThat(mBatteryChartPreferenceController.handlePreferenceTreeClick(mAppListGroup))
+ .isFalse();
+
+ verify(mMetricsFeatureProvider, never())
+ .action(mContext, SettingsEnums.ACTION_BATTERY_USAGE_APP_ITEM);
+ verify(mMetricsFeatureProvider, never())
+ .action(mContext, SettingsEnums.ACTION_BATTERY_USAGE_SYSTEM_ITEM);
+ }
+
+ @Test
+ public void testHandlePreferenceTreeClick_forAppEntry_returnTrue() {
+ doReturn(false).when(mBatteryHistEntry).isAppEntry();
+ doReturn(mBatteryDiffEntry).when(mPowerGaugePreference).getBatteryDiffEntry();
+
+ assertThat(mBatteryChartPreferenceController.handlePreferenceTreeClick(
+ mPowerGaugePreference)).isTrue();
+ verify(mMetricsFeatureProvider)
+ .action(
+ SettingsEnums.OPEN_BATTERY_USAGE,
+ SettingsEnums.ACTION_BATTERY_USAGE_SYSTEM_ITEM,
+ SettingsEnums.OPEN_BATTERY_USAGE,
+ /* package name */ "none",
+ /* percentage of total */ 0);
+ }
+
+ @Test
+ public void testHandlePreferenceTreeClick_forSystemEntry_returnTrue() {
+ mBatteryChartPreferenceController.mBatteryUtils = mBatteryUtils;
+ doReturn(true).when(mBatteryHistEntry).isAppEntry();
+ doReturn(mBatteryDiffEntry).when(mPowerGaugePreference).getBatteryDiffEntry();
+
+ assertThat(mBatteryChartPreferenceController.handlePreferenceTreeClick(
+ mPowerGaugePreference)).isTrue();
+ verify(mMetricsFeatureProvider)
+ .action(
+ SettingsEnums.OPEN_BATTERY_USAGE,
+ SettingsEnums.ACTION_BATTERY_USAGE_APP_ITEM,
+ SettingsEnums.OPEN_BATTERY_USAGE,
+ /* package name */ "none",
+ /* percentage of total */ 0);
+ }
+
+ @Test
+ public void testSetPreferenceSummary_setNullContentIfTotalUsageTimeIsZero() {
+ final PowerGaugePreference pref = new PowerGaugePreference(mContext);
+ pref.setSummary(PREF_SUMMARY);
+
+ mBatteryChartPreferenceController.setPreferenceSummary(
+ pref, createBatteryDiffEntry(
+ /*foregroundUsageTimeInMs=*/ 0,
+ /*backgroundUsageTimeInMs=*/ 0));
+ assertThat(pref.getSummary()).isNull();
+ }
+
+ @Test
+ public void testSetPreferenceSummary_setBackgroundUsageTimeOnly() {
+ final PowerGaugePreference pref = new PowerGaugePreference(mContext);
+ pref.setSummary(PREF_SUMMARY);
+
+ mBatteryChartPreferenceController.setPreferenceSummary(
+ pref, createBatteryDiffEntry(
+ /*foregroundUsageTimeInMs=*/ 0,
+ /*backgroundUsageTimeInMs=*/ DateUtils.MINUTE_IN_MILLIS));
+ assertThat(pref.getSummary()).isEqualTo("Background: 1 min");
+ }
+
+ @Test
+ public void testSetPreferenceSummary_setTotalUsageTimeLessThanAMinute() {
+ final PowerGaugePreference pref = new PowerGaugePreference(mContext);
+ pref.setSummary(PREF_SUMMARY);
+
+ mBatteryChartPreferenceController.setPreferenceSummary(
+ pref, createBatteryDiffEntry(
+ /*foregroundUsageTimeInMs=*/ 100,
+ /*backgroundUsageTimeInMs=*/ 200));
+ assertThat(pref.getSummary()).isEqualTo("Total: less than a min");
+ }
+
+ @Test
+ public void testSetPreferenceSummary_setTotalTimeIfBackgroundTimeLessThanAMinute() {
+ final PowerGaugePreference pref = new PowerGaugePreference(mContext);
+ pref.setSummary(PREF_SUMMARY);
+
+ mBatteryChartPreferenceController.setPreferenceSummary(
+ pref, createBatteryDiffEntry(
+ /*foregroundUsageTimeInMs=*/ DateUtils.MINUTE_IN_MILLIS,
+ /*backgroundUsageTimeInMs=*/ 200));
+ assertThat(pref.getSummary())
+ .isEqualTo("Total: 1 min\nBackground: less than a min");
+ }
+
+ @Test
+ public void testSetPreferenceSummary_setTotalAndBackgroundUsageTime() {
+ final PowerGaugePreference pref = new PowerGaugePreference(mContext);
+ pref.setSummary(PREF_SUMMARY);
+
+ mBatteryChartPreferenceController.setPreferenceSummary(
+ pref, createBatteryDiffEntry(
+ /*foregroundUsageTimeInMs=*/ DateUtils.MINUTE_IN_MILLIS,
+ /*backgroundUsageTimeInMs=*/ DateUtils.MINUTE_IN_MILLIS));
+ assertThat(pref.getSummary()).isEqualTo("Total: 2 min\nBackground: 1 min");
+ }
+
+ @Test
+ public void testSetPreferenceSummary_notAllowShownPackage_setSummayAsNull() {
+ final PowerGaugePreference pref = new PowerGaugePreference(mContext);
+ pref.setSummary(PREF_SUMMARY);
+ final BatteryDiffEntry batteryDiffEntry =
+ spy(createBatteryDiffEntry(
+ /*foregroundUsageTimeInMs=*/ DateUtils.MINUTE_IN_MILLIS,
+ /*backgroundUsageTimeInMs=*/ DateUtils.MINUTE_IN_MILLIS));
+ doReturn("com.android.googlequicksearchbox").when(batteryDiffEntry)
+ .getPackageName();
+
+ mBatteryChartPreferenceController.setPreferenceSummary(pref, batteryDiffEntry);
+ assertThat(pref.getSummary()).isNull();
+ }
+
+ @Test
+ public void testValidateUsageTime_returnTrueIfBatteryDiffEntryIsValid() {
+ assertThat(BatteryChartPreferenceControllerV2.validateUsageTime(
+ createBatteryDiffEntry(
+ /*foregroundUsageTimeInMs=*/ DateUtils.MINUTE_IN_MILLIS,
+ /*backgroundUsageTimeInMs=*/ DateUtils.MINUTE_IN_MILLIS)))
+ .isTrue();
+ }
+
+ @Test
+ public void testValidateUsageTime_foregroundTimeExceedThreshold_returnFalse() {
+ assertThat(BatteryChartPreferenceControllerV2.validateUsageTime(
+ createBatteryDiffEntry(
+ /*foregroundUsageTimeInMs=*/ DateUtils.HOUR_IN_MILLIS * 3,
+ /*backgroundUsageTimeInMs=*/ 0)))
+ .isFalse();
+ }
+
+ @Test
+ public void testValidateUsageTime_backgroundTimeExceedThreshold_returnFalse() {
+ assertThat(BatteryChartPreferenceControllerV2.validateUsageTime(
+ createBatteryDiffEntry(
+ /*foregroundUsageTimeInMs=*/ 0,
+ /*backgroundUsageTimeInMs=*/ DateUtils.HOUR_IN_MILLIS * 3)))
+ .isFalse();
+ }
+
+ @Test
+ public void testOnExpand_expandedIsTrue_addSystemEntriesToPreferenceGroup() {
+ doReturn(1).when(mAppListGroup).getPreferenceCount();
+ mBatteryChartPreferenceController.mSystemEntries.add(mBatteryDiffEntry);
+ doReturn("label").when(mBatteryDiffEntry).getAppLabel();
+ doReturn(mDrawable).when(mBatteryDiffEntry).getAppIcon();
+ doReturn(PREF_KEY).when(mBatteryHistEntry).getKey();
+
+ mBatteryChartPreferenceController.onExpand(/*isExpanded=*/ true);
+
+ final ArgumentCaptor<Preference> captor = ArgumentCaptor.forClass(Preference.class);
+ verify(mAppListGroup).addPreference(captor.capture());
+ // Verifies the added preference.
+ assertThat(captor.getValue().getKey()).isEqualTo(PREF_KEY);
+ verify(mMetricsFeatureProvider)
+ .action(
+ mContext,
+ SettingsEnums.ACTION_BATTERY_USAGE_EXPAND_ITEM,
+ true /*isExpanded*/);
+ }
+
+ @Test
+ public void testOnExpand_expandedIsFalse_removeSystemEntriesFromPreferenceGroup() {
+ doReturn(PREF_KEY).when(mBatteryHistEntry).getKey();
+ doReturn(mPowerGaugePreference).when(mAppListGroup).findPreference(PREF_KEY);
+ mBatteryChartPreferenceController.mSystemEntries.add(mBatteryDiffEntry);
+ // Verifies the cache is empty first.
+ assertThat(mBatteryChartPreferenceController.mPreferenceCache).isEmpty();
+
+ mBatteryChartPreferenceController.onExpand(/*isExpanded=*/ false);
+
+ verify(mAppListGroup).findPreference(PREF_KEY);
+ verify(mAppListGroup).removePreference(mPowerGaugePreference);
+ assertThat(mBatteryChartPreferenceController.mPreferenceCache).hasSize(1);
+ verify(mMetricsFeatureProvider)
+ .action(
+ mContext,
+ SettingsEnums.ACTION_BATTERY_USAGE_EXPAND_ITEM,
+ false /*isExpanded*/);
+ }
+
+ @Test
+ public void testOnSelect_selectSpecificTimeSlot_logMetric() {
+ mBatteryChartPreferenceController.onSelect(1 /*slot index*/);
+
+ verify(mMetricsFeatureProvider)
+ .action(mContext, SettingsEnums.ACTION_BATTERY_USAGE_TIME_SLOT);
+ }
+
+ @Test
+ public void testOnSelect_selectAll_logMetric() {
+ mBatteryChartPreferenceController.onSelect(
+ BatteryChartViewV2.SELECTED_INDEX_ALL /*slot index*/);
+
+ verify(mMetricsFeatureProvider)
+ .action(mContext, SettingsEnums.ACTION_BATTERY_USAGE_SHOW_ALL);
+ }
+
+ @Test
+ public void testRefreshCategoryTitle_setHourIntoBothTitleTextView() {
+ mBatteryChartPreferenceController = createController();
+ setUpBatteryHistoryKeys();
+ mBatteryChartPreferenceController.mAppListPrefGroup =
+ spy(new PreferenceCategory(mContext));
+ mBatteryChartPreferenceController.mExpandDividerPreference =
+ spy(new ExpandDividerPreference(mContext));
+ // Simulates select the first slot.
+ mBatteryChartPreferenceController.mTrapezoidIndex = 0;
+
+ mBatteryChartPreferenceController.refreshCategoryTitle();
+
+ ArgumentCaptor<String> captor = ArgumentCaptor.forClass(String.class);
+ // Verifies the title in the preference group.
+ verify(mBatteryChartPreferenceController.mAppListPrefGroup)
+ .setTitle(captor.capture());
+ assertThat(captor.getValue()).isNotEqualTo("App usage for past 24 hr");
+ // Verifies the title in the expandable divider.
+ captor = ArgumentCaptor.forClass(String.class);
+ verify(mBatteryChartPreferenceController.mExpandDividerPreference)
+ .setTitle(captor.capture());
+ assertThat(captor.getValue()).isNotEqualTo("System usage for past 24 hr");
+ }
+
+ @Test
+ public void testRefreshCategoryTitle_setLast24HrIntoBothTitleTextView() {
+ mBatteryChartPreferenceController = createController();
+ mBatteryChartPreferenceController.mAppListPrefGroup =
+ spy(new PreferenceCategory(mContext));
+ mBatteryChartPreferenceController.mExpandDividerPreference =
+ spy(new ExpandDividerPreference(mContext));
+ // Simulates select all condition.
+ mBatteryChartPreferenceController.mTrapezoidIndex =
+ BatteryChartViewV2.SELECTED_INDEX_ALL;
+
+ mBatteryChartPreferenceController.refreshCategoryTitle();
+
+ ArgumentCaptor<String> captor = ArgumentCaptor.forClass(String.class);
+ // Verifies the title in the preference group.
+ verify(mBatteryChartPreferenceController.mAppListPrefGroup)
+ .setTitle(captor.capture());
+ assertThat(captor.getValue())
+ .isEqualTo("App usage for past 24 hr");
+ // Verifies the title in the expandable divider.
+ captor = ArgumentCaptor.forClass(String.class);
+ verify(mBatteryChartPreferenceController.mExpandDividerPreference)
+ .setTitle(captor.capture());
+ assertThat(captor.getValue())
+ .isEqualTo("System usage for past 24 hr");
+ }
+
+ @Test
+ public void testSetTimestampLabel_nullBatteryHistoryKeys_ignore() {
+ mBatteryChartPreferenceController = createController();
+ mBatteryChartPreferenceController.mBatteryHistoryKeys = null;
+ mBatteryChartPreferenceController.mBatteryChartView =
+ spy(new BatteryChartViewV2(mContext));
+ mBatteryChartPreferenceController.setTimestampLabel();
+
+ verify(mBatteryChartPreferenceController.mBatteryChartView, never())
+ .setAxisLabels(any());
+ }
+
+ @Test
+ public void testSetTimestampLabel_setExpectedTimestampData() {
+ mBatteryChartPreferenceController = createController();
+ mBatteryChartPreferenceController.mBatteryChartView =
+ spy(new BatteryChartViewV2(mContext));
+ setUpBatteryHistoryKeys();
+
+ mBatteryChartPreferenceController.setTimestampLabel();
+
+ verify(mBatteryChartPreferenceController.mBatteryChartView)
+ .setAxisLabels(new String[] {"4 pm", "12 am", "7 am"});
+ }
+
+ @Test
+ public void testSetTimestampLabel_withoutValidTimestamp_setExpectedTimestampData() {
+ mBatteryChartPreferenceController = createController();
+ mBatteryChartPreferenceController.mBatteryChartView =
+ spy(new BatteryChartViewV2(mContext));
+ mBatteryChartPreferenceController.mBatteryHistoryKeys = new long[]{0L};
+
+ mBatteryChartPreferenceController.setTimestampLabel();
+
+ verify(mBatteryChartPreferenceController.mBatteryChartView)
+ .setAxisLabels(new String[] {"12 am"});
+ }
+
+ @Test
+ public void testOnSaveInstanceState_restoreSelectedIndexAndExpandState() {
+ final int expectedIndex = 1;
+ final boolean isExpanded = true;
+ final Bundle bundle = new Bundle();
+ mBatteryChartPreferenceController.mTrapezoidIndex = expectedIndex;
+ mBatteryChartPreferenceController.mIsExpanded = isExpanded;
+ mBatteryChartPreferenceController.onSaveInstanceState(bundle);
+ // Replaces the original controller with other values.
+ mBatteryChartPreferenceController.mTrapezoidIndex = -1;
+ mBatteryChartPreferenceController.mIsExpanded = false;
+
+ mBatteryChartPreferenceController.onCreate(bundle);
+ mBatteryChartPreferenceController.setBatteryHistoryMap(
+ createBatteryHistoryMap());
+
+ assertThat(mBatteryChartPreferenceController.mTrapezoidIndex)
+ .isEqualTo(expectedIndex);
+ assertThat(mBatteryChartPreferenceController.mIsExpanded).isTrue();
+ }
+
+ @Test
+ public void testIsValidToShowSummary_returnExpectedResult() {
+ assertThat(mBatteryChartPreferenceController
+ .isValidToShowSummary("com.google.android.apps.scone"))
+ .isTrue();
+
+ // Verifies the item which is defined in the array list.
+ assertThat(mBatteryChartPreferenceController
+ .isValidToShowSummary("com.android.googlequicksearchbox"))
+ .isFalse();
+ }
+
+ @Test
+ public void testIsValidToShowEntry_returnExpectedResult() {
+ assertThat(mBatteryChartPreferenceController
+ .isValidToShowEntry("com.google.android.apps.scone"))
+ .isTrue();
+
+ // Verifies the items which are defined in the array list.
+ assertThat(mBatteryChartPreferenceController
+ .isValidToShowEntry("com.android.gms.persistent"))
+ .isFalse();
+ }
+
+ private static Map<Long, Map<String, BatteryHistEntry>> createBatteryHistoryMap() {
+ final Map<Long, Map<String, BatteryHistEntry>> batteryHistoryMap = new HashMap<>();
+ for (int index = 0; index < DESIRED_HISTORY_SIZE; index++) {
+ final ContentValues values = new ContentValues();
+ values.put("batteryLevel", Integer.valueOf(100 - index));
+ final BatteryHistEntry entry = new BatteryHistEntry(values);
+ final Map<String, BatteryHistEntry> entryMap = new HashMap<>();
+ entryMap.put("fake_entry_key" + index, entry);
+ batteryHistoryMap.put(Long.valueOf(index + 1), entryMap);
+ }
+ return batteryHistoryMap;
+ }
+
+ private BatteryDiffEntry createBatteryDiffEntry(
+ long foregroundUsageTimeInMs, long backgroundUsageTimeInMs) {
+ return new BatteryDiffEntry(
+ mContext, foregroundUsageTimeInMs, backgroundUsageTimeInMs,
+ /*consumePower=*/ 0, mBatteryHistEntry);
+ }
+
+ private void setUpBatteryHistoryKeys() {
+ mBatteryChartPreferenceController.mBatteryHistoryKeys =
+ // "2021-04-23 16:53:06 UTC", "1970-01-01 00:00:00 UTC", "2021-04-23 07:00:36 UTC"
+ new long[]{1619196786769L, 0L, 1619247636826L};
+ ConvertUtils.utcToLocalTimeHour(
+ mContext, /*timestamp=*/ 0, /*is24HourFormat=*/ false);
+ }
+
+ private BatteryChartPreferenceControllerV2 createController() {
+ final BatteryChartPreferenceControllerV2 controller =
+ new BatteryChartPreferenceControllerV2(
+ mContext, "app_list", /*lifecycle=*/ null,
+ mSettingsActivity, mFragment);
+ controller.mPrefContext = mContext;
+ return controller;
+ }
+}
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryChartViewV2Test.java b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryChartViewV2Test.java
new file mode 100644
index 0000000..111019f
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryChartViewV2Test.java
@@ -0,0 +1,235 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.settings.fuelgauge.batteryusage;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.accessibilityservice.AccessibilityServiceInfo;
+import android.content.Context;
+import android.os.LocaleList;
+import android.view.accessibility.AccessibilityManager;
+
+import com.android.settings.fuelgauge.PowerUsageFeatureProvider;
+import com.android.settings.testutils.FakeFeatureFactory;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
+import org.robolectric.RuntimeEnvironment;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Locale;
+
+@RunWith(RobolectricTestRunner.class)
+public final class BatteryChartViewV2Test {
+
+ private Context mContext;
+ private BatteryChartViewV2 mBatteryChartView;
+ private FakeFeatureFactory mFeatureFactory;
+ private PowerUsageFeatureProvider mPowerUsageFeatureProvider;
+
+ @Mock
+ private AccessibilityServiceInfo mMockAccessibilityServiceInfo;
+ @Mock
+ private AccessibilityManager mMockAccessibilityManager;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ mFeatureFactory = FakeFeatureFactory.setupForTest();
+ mPowerUsageFeatureProvider = mFeatureFactory.powerUsageFeatureProvider;
+ mContext = spy(RuntimeEnvironment.application);
+ mContext.getResources().getConfiguration().setLocales(
+ new LocaleList(new Locale("en_US")));
+ mBatteryChartView = new BatteryChartViewV2(mContext);
+ doReturn(mMockAccessibilityManager).when(mContext)
+ .getSystemService(AccessibilityManager.class);
+ doReturn("TalkBackService").when(mMockAccessibilityServiceInfo).getId();
+ doReturn(Arrays.asList(mMockAccessibilityServiceInfo))
+ .when(mMockAccessibilityManager)
+ .getEnabledAccessibilityServiceList(anyInt());
+ }
+
+ @Test
+ public void testIsAccessibilityEnabled_disable_returnFalse() {
+ doReturn(false).when(mMockAccessibilityManager).isEnabled();
+ assertThat(BatteryChartViewV2.isAccessibilityEnabled(mContext)).isFalse();
+ }
+
+ @Test
+ public void testIsAccessibilityEnabled_emptyInfo_returnFalse() {
+ doReturn(true).when(mMockAccessibilityManager).isEnabled();
+ doReturn(new ArrayList<AccessibilityServiceInfo>())
+ .when(mMockAccessibilityManager)
+ .getEnabledAccessibilityServiceList(anyInt());
+
+ assertThat(BatteryChartViewV2.isAccessibilityEnabled(mContext)).isFalse();
+ }
+
+ @Test
+ public void testIsAccessibilityEnabled_validServiceId_returnTrue() {
+ doReturn(true).when(mMockAccessibilityManager).isEnabled();
+ assertThat(BatteryChartViewV2.isAccessibilityEnabled(mContext)).isTrue();
+ }
+
+ @Test
+ public void testSetSelectedIndex_invokesCallback() {
+ final int[] selectedIndex = new int[1];
+ final int expectedIndex = 2;
+ mBatteryChartView.mSelectedIndex = 1;
+ mBatteryChartView.setOnSelectListener(
+ trapezoidIndex -> {
+ selectedIndex[0] = trapezoidIndex;
+ });
+
+ mBatteryChartView.setSelectedIndex(expectedIndex);
+
+ assertThat(mBatteryChartView.mSelectedIndex)
+ .isEqualTo(expectedIndex);
+ assertThat(selectedIndex[0]).isEqualTo(expectedIndex);
+ }
+
+ @Test
+ public void testSetSelectedIndex_sameIndex_notInvokesCallback() {
+ final int[] selectedIndex = new int[1];
+ final int expectedIndex = 1;
+ mBatteryChartView.mSelectedIndex = expectedIndex;
+ mBatteryChartView.setOnSelectListener(
+ trapezoidIndex -> {
+ selectedIndex[0] = trapezoidIndex;
+ });
+
+ mBatteryChartView.setSelectedIndex(expectedIndex);
+
+ assertThat(selectedIndex[0]).isNotEqualTo(expectedIndex);
+ }
+
+ @Test
+ public void testClickable_isChartGraphSlotsEnabledIsFalse_notClickable() {
+ mBatteryChartView.setClickableForce(true);
+ when(mPowerUsageFeatureProvider.isChartGraphSlotsEnabled(mContext))
+ .thenReturn(false);
+
+ mBatteryChartView.onAttachedToWindow();
+ assertThat(mBatteryChartView.isClickable()).isFalse();
+ assertThat(mBatteryChartView.mTrapezoidCurvePaint).isNotNull();
+ }
+
+ @Test
+ public void testClickable_accessibilityIsDisabled_clickable() {
+ mBatteryChartView.setClickableForce(true);
+ when(mPowerUsageFeatureProvider.isChartGraphSlotsEnabled(mContext))
+ .thenReturn(true);
+ doReturn(false).when(mMockAccessibilityManager).isEnabled();
+
+ mBatteryChartView.onAttachedToWindow();
+ assertThat(mBatteryChartView.isClickable()).isTrue();
+ assertThat(mBatteryChartView.mTrapezoidCurvePaint).isNull();
+ }
+
+ @Test
+ public void testClickable_accessibilityIsEnabledWithoutValidId_clickable() {
+ mBatteryChartView.setClickableForce(true);
+ when(mPowerUsageFeatureProvider.isChartGraphSlotsEnabled(mContext))
+ .thenReturn(true);
+ doReturn(true).when(mMockAccessibilityManager).isEnabled();
+ doReturn(new ArrayList<AccessibilityServiceInfo>())
+ .when(mMockAccessibilityManager)
+ .getEnabledAccessibilityServiceList(anyInt());
+
+ mBatteryChartView.onAttachedToWindow();
+ assertThat(mBatteryChartView.isClickable()).isTrue();
+ assertThat(mBatteryChartView.mTrapezoidCurvePaint).isNull();
+ }
+
+ @Test
+ public void testClickable_accessibilityIsEnabledWithValidId_notClickable() {
+ mBatteryChartView.setClickableForce(true);
+ when(mPowerUsageFeatureProvider.isChartGraphSlotsEnabled(mContext))
+ .thenReturn(true);
+ doReturn(true).when(mMockAccessibilityManager).isEnabled();
+
+ mBatteryChartView.onAttachedToWindow();
+ assertThat(mBatteryChartView.isClickable()).isFalse();
+ assertThat(mBatteryChartView.mTrapezoidCurvePaint).isNotNull();
+ }
+
+ @Test
+ public void testClickable_restoreFromNonClickableState() {
+ final int[] levels = new int[13];
+ for (int index = 0; index < levels.length; index++) {
+ levels[index] = index + 1;
+ }
+ mBatteryChartView.setTrapezoidCount(12);
+ mBatteryChartView.setLevels(levels);
+ mBatteryChartView.setClickableForce(true);
+ when(mPowerUsageFeatureProvider.isChartGraphSlotsEnabled(mContext))
+ .thenReturn(true);
+ doReturn(true).when(mMockAccessibilityManager).isEnabled();
+ mBatteryChartView.onAttachedToWindow();
+ // Ensures the testing environment is correct.
+ assertThat(mBatteryChartView.isClickable()).isFalse();
+ // Turns off accessibility service.
+ doReturn(false).when(mMockAccessibilityManager).isEnabled();
+
+ mBatteryChartView.onAttachedToWindow();
+
+ assertThat(mBatteryChartView.isClickable()).isTrue();
+ }
+
+ @Test
+ public void testOnAttachedToWindow_addAccessibilityStateChangeListener() {
+ mBatteryChartView.onAttachedToWindow();
+ verify(mMockAccessibilityManager)
+ .addAccessibilityStateChangeListener(mBatteryChartView);
+ }
+
+ @Test
+ public void testOnDetachedFromWindow_removeAccessibilityStateChangeListener() {
+ mBatteryChartView.onAttachedToWindow();
+ mBatteryChartView.mHandler.postDelayed(
+ mBatteryChartView.mUpdateClickableStateRun, 1000);
+
+ mBatteryChartView.onDetachedFromWindow();
+
+ verify(mMockAccessibilityManager)
+ .removeAccessibilityStateChangeListener(mBatteryChartView);
+ assertThat(mBatteryChartView.mHandler.hasCallbacks(
+ mBatteryChartView.mUpdateClickableStateRun))
+ .isFalse();
+ }
+
+ @Test
+ public void testOnAccessibilityStateChanged_postUpdateStateRunnable() {
+ mBatteryChartView.mHandler = spy(mBatteryChartView.mHandler);
+ mBatteryChartView.onAccessibilityStateChanged(/*enabled=*/ true);
+
+ verify(mBatteryChartView.mHandler)
+ .removeCallbacks(mBatteryChartView.mUpdateClickableStateRun);
+ verify(mBatteryChartView.mHandler)
+ .postDelayed(mBatteryChartView.mUpdateClickableStateRun, 500L);
+ }
+}
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryDiffEntryTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryDiffEntryTest.java
index bb19b5a..07a5504 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryDiffEntryTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryDiffEntryTest.java
@@ -17,10 +17,10 @@
import static com.google.common.truth.Truth.assertThat;
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.eq;
-import static org.mockito.Matchers.anyInt;
+import static org.mockito.Mockito.any;
+import static org.mockito.Mockito.anyInt;
import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.eq;
import static org.mockito.Mockito.spy;
import android.content.ContentValues;
@@ -138,7 +138,7 @@
// Generates fake testing data.
final ContentValues values = getContentValuesWithType(
ConvertUtils.CONSUMER_TYPE_SYSTEM_BATTERY);
- values.put("drainType",
+ values.put(BatteryHistEntry.KEY_DRAIN_TYPE,
Integer.valueOf(BatteryConsumer.POWER_COMPONENT_AMBIENT_DISPLAY));
final BatteryHistEntry batteryHistEntry = new BatteryHistEntry(values);
@@ -164,7 +164,7 @@
// Generates fake testing data.
final ContentValues values = getContentValuesWithType(
ConvertUtils.CONSUMER_TYPE_USER_BATTERY);
- values.put("userId", Integer.valueOf(1001));
+ values.put(BatteryHistEntry.KEY_USER_ID, Integer.valueOf(1001));
final BatteryHistEntry batteryHistEntry = new BatteryHistEntry(values);
final BatteryDiffEntry entry = createBatteryDiffEntry(10, batteryHistEntry);
@@ -189,8 +189,8 @@
final String fakePackageName = "com.fake.google.com";
final ContentValues values = getContentValuesWithType(
ConvertUtils.CONSUMER_TYPE_UID_BATTERY);
- values.put("uid", /*invalid uid*/ 10001);
- values.put("packageName", fakePackageName);
+ values.put(BatteryHistEntry.KEY_UID, /*invalid uid*/ 10001);
+ values.put(BatteryHistEntry.KEY_PACKAGE_NAME, fakePackageName);
doReturn(mMockAppInfo).when(mMockPackageManager)
.getApplicationInfo(fakePackageName, 0);
doReturn(expectedAppLabel).when(mMockPackageManager)
@@ -233,7 +233,7 @@
final String expectedAppLabel = "fake app label";
final ContentValues values = getContentValuesWithType(
ConvertUtils.CONSUMER_TYPE_UID_BATTERY);
- values.put("appLabel", expectedAppLabel);
+ values.put(BatteryHistEntry.KEY_APP_LABEL, expectedAppLabel);
final BatteryHistEntry batteryHistEntry = new BatteryHistEntry(values);
final BatteryDiffEntry entry = createBatteryDiffEntry(10, batteryHistEntry);
@@ -391,8 +391,8 @@
final String fakePackageName = "com.fake.google.com";
final ContentValues values = getContentValuesWithType(
ConvertUtils.CONSUMER_TYPE_UID_BATTERY);
- values.put("uid", /*invalid uid*/ 10001);
- values.put("packageName", fakePackageName);
+ values.put(BatteryHistEntry.KEY_UID, /*invalid uid*/ 10001);
+ values.put(BatteryHistEntry.KEY_PACKAGE_NAME, fakePackageName);
final BatteryDiffEntry entry =
createBatteryDiffEntry(10, new BatteryHistEntry(values));
@@ -424,7 +424,7 @@
final String expectedPackageName = "com.fake.google.com";
final ContentValues values = getContentValuesWithType(
ConvertUtils.CONSUMER_TYPE_UID_BATTERY);
- values.put("packageName", expectedPackageName);
+ values.put(BatteryHistEntry.KEY_PACKAGE_NAME, expectedPackageName);
final BatteryDiffEntry entry =
createBatteryDiffEntry(10, new BatteryHistEntry(values));
@@ -437,7 +437,7 @@
final ContentValues values = getContentValuesWithType(
ConvertUtils.CONSUMER_TYPE_UID_BATTERY);
values.put(
- "packageName",
+ BatteryHistEntry.KEY_PACKAGE_NAME,
expectedPackageName + ":privileged_process0");
final BatteryDiffEntry entry =
createBatteryDiffEntry(10, new BatteryHistEntry(values));
@@ -445,11 +445,24 @@
assertThat(entry.getPackageName()).isEqualTo(expectedPackageName);
}
+ @Test
+ public void getAppLabel_withOtherUsersUid_returnExpectedLabel() {
+ final ContentValues values = getContentValuesWithType(
+ ConvertUtils.CONSUMER_TYPE_UID_BATTERY);
+ values.put(BatteryHistEntry.KEY_UID, BatteryUtils.UID_OTHER_USERS);
+
+ final BatteryDiffEntry batteryDiffEntry = createBatteryDiffEntry(
+ /*consumePower=*/ 0, new BatteryHistEntry(values));
+
+ assertThat(batteryDiffEntry.getAppLabel())
+ .isEqualTo(mContext.getString(R.string.battery_usage_other_users));
+ }
+
private BatteryDiffEntry createBatteryDiffEntry(
int consumerType, long uid, boolean isHidden) {
final ContentValues values = getContentValuesWithType(consumerType);
- values.put("isHidden", isHidden);
- values.put("uid", uid);
+ values.put(BatteryHistEntry.KEY_IS_HIDDEN, isHidden);
+ values.put(BatteryHistEntry.KEY_UID, uid);
return new BatteryDiffEntry(
mContext,
/*foregroundUsageTimeInMs=*/ 0,
@@ -472,15 +485,15 @@
private static ContentValues getContentValuesWithType(int consumerType) {
final ContentValues values = new ContentValues();
- values.put("consumerType", Integer.valueOf(consumerType));
+ values.put(BatteryHistEntry.KEY_CONSUMER_TYPE, Integer.valueOf(consumerType));
return values;
}
private BatteryDiffEntry createBatteryDiffEntry(Drawable drawable) throws Exception {
final ContentValues values = getContentValuesWithType(
ConvertUtils.CONSUMER_TYPE_UID_BATTERY);
- values.put("uid", 1001);
- values.put("packageName", "com.a.b.c");
+ values.put(BatteryHistEntry.KEY_UID, 1001);
+ values.put(BatteryHistEntry.KEY_PACKAGE_NAME, "com.a.b.c");
final BatteryHistEntry batteryHistEntry = new BatteryHistEntry(values);
doReturn(drawable).when(mMockPackageManager).getDefaultActivityIcon();
doReturn(null).when(mMockPackageManager).getApplicationInfo("com.a.b.c", 0);
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/ConvertUtilsTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/ConvertUtilsTest.java
index 0b8a98a..c1f9815 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/ConvertUtilsTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/ConvertUtilsTest.java
@@ -27,6 +27,7 @@
import android.os.LocaleList;
import android.os.UserHandle;
+import com.android.settings.fuelgauge.BatteryUtils;
import com.android.settings.fuelgauge.PowerUsageFeatureProvider;
import com.android.settings.testutils.FakeFeatureFactory;
@@ -39,6 +40,7 @@
import org.robolectric.RuntimeEnvironment;
import java.util.Arrays;
+import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
@@ -371,6 +373,71 @@
assertThat(ConvertUtils.getLocale(mContext)).isEqualTo(Locale.getDefault());
}
+ @Test
+ public void resolveMultiUsersData_replaceOtherUsersItemWithExpectedEntry() {
+ final int currentUserId = mContext.getUserId();
+ final Map<Integer, List<BatteryDiffEntry>> entryMap = new HashMap<>();
+ // Without other users time slot.
+ entryMap.put(0, Arrays.asList(
+ createBatteryDiffEntry(
+ currentUserId,
+ ConvertUtils.CONSUMER_TYPE_UID_BATTERY,
+ /*consumePercentage=*/ 50)));
+ // With other users time slot.
+ final List<BatteryDiffEntry> withOtherUsersList = new ArrayList<>();
+ entryMap.put(1, withOtherUsersList);
+ withOtherUsersList.add(
+ createBatteryDiffEntry(
+ currentUserId + 1,
+ ConvertUtils.CONSUMER_TYPE_SYSTEM_BATTERY,
+ /*consumePercentage=*/ 20));
+ withOtherUsersList.add(
+ createBatteryDiffEntry(
+ currentUserId + 2,
+ ConvertUtils.CONSUMER_TYPE_UID_BATTERY,
+ /*consumePercentage=*/ 30));
+ withOtherUsersList.add(
+ createBatteryDiffEntry(
+ currentUserId + 3,
+ ConvertUtils.CONSUMER_TYPE_UID_BATTERY,
+ /*consumePercentage=*/ 40));
+
+ ConvertUtils.resolveMultiUsersData(mContext, entryMap);
+
+ assertThat(entryMap.get(0).get(0).getPercentOfTotal()).isEqualTo(50);
+ // Asserts with other users items.
+ final List<BatteryDiffEntry> entryList = entryMap.get(1);
+ assertThat(entryList).hasSize(2);
+ assertBatteryDiffEntry(
+ entryList.get(0),
+ currentUserId + 1,
+ /*uid=*/ 0,
+ ConvertUtils.CONSUMER_TYPE_SYSTEM_BATTERY,
+ /*consumePercentage=*/ 20);
+ assertBatteryDiffEntry(
+ entryList.get(1),
+ BatteryUtils.UID_OTHER_USERS,
+ BatteryUtils.UID_OTHER_USERS,
+ ConvertUtils.CONSUMER_TYPE_UID_BATTERY,
+ /*consumePercentage=*/ 70);
+ }
+
+ private BatteryDiffEntry createBatteryDiffEntry(
+ long userId, int counsumerType, double consumePercentage) {
+ final ContentValues values = new ContentValues();
+ values.put(BatteryHistEntry.KEY_USER_ID, userId);
+ values.put(BatteryHistEntry.KEY_CONSUMER_TYPE, counsumerType);
+ final BatteryDiffEntry batteryDiffEntry =
+ new BatteryDiffEntry(
+ mContext,
+ /*foregroundUsageTimeInMs=*/ 0,
+ /*backgroundUsageTimeInMs=*/ 0,
+ /*consumePower=*/ consumePercentage,
+ new BatteryHistEntry(values));
+ batteryDiffEntry.setTotalConsumePower(100f);
+ return batteryDiffEntry;
+ }
+
private static BatteryHistEntry createBatteryHistEntry(
String packageName, String appLabel, double consumePower,
long uid, long foregroundUsageTimeInMs, long backgroundUsageTimeInMs) {
@@ -390,6 +457,15 @@
}
private static void assertBatteryDiffEntry(
+ BatteryDiffEntry entry, long userId, long uid, int counsumerType,
+ double consumePercentage) {
+ assertThat(entry.mBatteryHistEntry.mUid).isEqualTo(uid);
+ assertThat(entry.mBatteryHistEntry.mUserId).isEqualTo(userId);
+ assertThat(entry.mBatteryHistEntry.mConsumerType).isEqualTo(counsumerType);
+ assertThat(entry.getPercentOfTotal()).isEqualTo(consumePercentage);
+ }
+
+ private static void assertBatteryDiffEntry(
BatteryDiffEntry entry, int percentOfTotal,
long foregroundUsageTimeInMs, long backgroundUsageTimeInMs) {
assertThat((int) entry.getPercentOfTotal()).isEqualTo(percentOfTotal);
diff --git a/tests/robotests/src/com/android/settings/network/TetherPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/network/TetherPreferenceControllerTest.java
index bafc021..9aa79ff 100644
--- a/tests/robotests/src/com/android/settings/network/TetherPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/network/TetherPreferenceControllerTest.java
@@ -16,16 +16,15 @@
package com.android.settings.network;
-import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.any;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoInteractions;
import static org.mockito.Mockito.verifyNoMoreInteractions;
-import static org.mockito.Mockito.verifyZeroInteractions;
import static org.mockito.Mockito.when;
-import android.app.admin.DevicePolicyManager;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothPan;
import android.bluetooth.BluetoothProfile;
@@ -162,7 +161,7 @@
mController.onResume();
- verifyZeroInteractions(mPreference);
+ verifyNoInteractions(mPreference);
Settings.Global.putInt(context.getContentResolver(), Settings.Global.AIRPLANE_MODE_ON, 1);
diff --git a/tests/robotests/src/com/android/settings/notification/zen/ZenModeAutomaticRulesPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/zen/ZenModeAutomaticRulesPreferenceControllerTest.java
index 1660955..3791c23 100644
--- a/tests/robotests/src/com/android/settings/notification/zen/ZenModeAutomaticRulesPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/notification/zen/ZenModeAutomaticRulesPreferenceControllerTest.java
@@ -18,6 +18,7 @@
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.Mockito.doReturn;
@@ -42,10 +43,10 @@
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
-import org.mockito.internal.util.reflection.FieldSetter;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.util.ReflectionHelpers;
+import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;
@@ -192,16 +193,26 @@
rule.setEnabled(false);
rMap.put(testId, rule);
mockGetAutomaticZenRules(NUM_RULES, rMap);
- FieldSetter.setField(mZenRulePreference, ZenRulePreference.class.getDeclaredField("mId"), testId);
+ setZenRulePreferenceField("mId", testId);
mController.updateState(mockPref);
verify(mZenRulePreference, times(1)).updatePreference(any());
verify(mockPref, never()).removeAll();
assertEquals(NUM_RULES, mController.mZenRulePreferences.size());
}
+ private void setZenRulePreferenceField(String name, Object value) {
+ try {
+ Field field = ZenRulePreference.class.getDeclaredField("mId");
+ field.setAccessible(true);
+ field.set(mZenRulePreference, value);
+ } catch (ReflectiveOperationException e) {
+ fail("Unable to set mZenRulePreference field: " + name);
+ }
+ }
+
private void mockGetAutomaticZenRules(int numRules, Map<String, AutomaticZenRule> rules) {
Map.Entry<String, AutomaticZenRule>[] arr = new Map.Entry[numRules];
rules.entrySet().toArray(arr);
when(mBackend.getAutomaticZenRules()).thenReturn(arr);
}
-}
\ No newline at end of file
+}
diff --git a/tests/robotests/src/com/android/settings/notification/zen/ZenModePriorityConversationsPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/zen/ZenModePriorityConversationsPreferenceControllerTest.java
index 6bf0538..d5834f9 100644
--- a/tests/robotests/src/com/android/settings/notification/zen/ZenModePriorityConversationsPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/notification/zen/ZenModePriorityConversationsPreferenceControllerTest.java
@@ -26,7 +26,7 @@
import static com.google.common.truth.Truth.assertThat;
-import static org.mockito.Matchers.any;
+import static org.mockito.Mockito.any;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.reset;
@@ -146,4 +146,4 @@
}
return null;
}
-}
\ No newline at end of file
+}
diff --git a/tests/robotests/src/com/android/settings/notification/zen/ZenModePrioritySendersPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/zen/ZenModePrioritySendersPreferenceControllerTest.java
index 99fa8e6..c431c53 100644
--- a/tests/robotests/src/com/android/settings/notification/zen/ZenModePrioritySendersPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/notification/zen/ZenModePrioritySendersPreferenceControllerTest.java
@@ -30,8 +30,8 @@
import static com.android.settings.notification.zen.ZenPrioritySendersHelper.KEY_NONE;
import static com.android.settings.notification.zen.ZenPrioritySendersHelper.UNKNOWN;
-import static org.mockito.ArgumentMatchers.anyInt;
-import static org.mockito.Matchers.any;
+import static org.mockito.Mockito.any;
+import static org.mockito.Mockito.anyInt;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.times;
diff --git a/tests/robotests/src/com/android/settings/notification/zen/ZenRuleStarredContactsPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/zen/ZenRuleStarredContactsPreferenceControllerTest.java
index 2f7dfe7..01f3dfa 100644
--- a/tests/robotests/src/com/android/settings/notification/zen/ZenRuleStarredContactsPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/notification/zen/ZenRuleStarredContactsPreferenceControllerTest.java
@@ -18,7 +18,7 @@
import static com.google.common.truth.Truth.assertThat;
-import static org.mockito.Matchers.any;
+import static org.mockito.Mockito.any;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
diff --git a/tests/robotests/src/com/android/settings/print/PrintJobMessagePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/print/PrintJobMessagePreferenceControllerTest.java
index 96036d5..b5d07cc 100644
--- a/tests/robotests/src/com/android/settings/print/PrintJobMessagePreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/print/PrintJobMessagePreferenceControllerTest.java
@@ -21,8 +21,8 @@
import static com.google.common.truth.Truth.assertThat;
-import static org.mockito.ArgumentMatchers.anyInt;
-import static org.mockito.ArgumentMatchers.anyObject;
+import static org.mockito.Mockito.any;
+import static org.mockito.Mockito.anyInt;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@@ -72,7 +72,7 @@
mPreference = new Preference(mContext);
when(mContext.getSystemService(Context.PRINT_SERVICE)).thenReturn(mPrintManager);
when(mPrintManager.getGlobalPrintManagerForUser(anyInt())).thenReturn(mPrintManager);
- when(mPrintManager.getPrintJob(anyObject())).thenReturn(mPrintJob);
+ when(mPrintManager.getPrintJob(any())).thenReturn(mPrintJob);
when(mPrintJob.getInfo()).thenReturn(mPrintJobInfo);
mController = new PrintJobMessagePreferenceController(mContext, PREF_KEY);
when(mScreen.findPreference(mController.getPreferenceKey())).thenReturn(mPreference);
@@ -93,7 +93,7 @@
@Test
public void updateUi_visiblePreference() {
- when(mPrintJobInfo.getStatus(anyObject())).thenReturn("TestPrint");
+ when(mPrintJobInfo.getStatus(any())).thenReturn("TestPrint");
mLifecycle.handleLifecycleEvent(ON_START);
assertThat(mPreference.isVisible()).isTrue();
@@ -103,7 +103,7 @@
@Test
public void updateUi_invisiblePreference() {
- when(mPrintJobInfo.getStatus(anyObject())).thenReturn(null);
+ when(mPrintJobInfo.getStatus(any())).thenReturn(null);
mLifecycle.handleLifecycleEvent(ON_START);
assertThat(mPreference.isVisible()).isFalse();
diff --git a/tests/robotests/src/com/android/settings/print/PrintJobPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/print/PrintJobPreferenceControllerTest.java
index 09c5bf3..da4d58c 100644
--- a/tests/robotests/src/com/android/settings/print/PrintJobPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/print/PrintJobPreferenceControllerTest.java
@@ -21,8 +21,8 @@
import static com.google.common.truth.Truth.assertThat;
-import static org.mockito.ArgumentMatchers.anyInt;
-import static org.mockito.ArgumentMatchers.anyObject;
+import static org.mockito.Mockito.any;
+import static org.mockito.Mockito.anyInt;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@@ -75,7 +75,7 @@
mTestLabel = "PrintTest";
when(mContext.getSystemService(Context.PRINT_SERVICE)).thenReturn(mPrintManager);
when(mPrintManager.getGlobalPrintManagerForUser(anyInt())).thenReturn(mPrintManager);
- when(mPrintManager.getPrintJob(anyObject())).thenReturn(mPrintJob);
+ when(mPrintManager.getPrintJob(any())).thenReturn(mPrintJob);
when(mPrintJob.getInfo()).thenReturn(mPrintJobInfo);
mController = new PrintJobPreferenceController(mContext, PREF_KEY);
when(mScreen.findPreference(mController.getPreferenceKey())).thenReturn(mPreference);
diff --git a/tests/robotests/src/com/android/settings/search/actionbar/SearchMenuControllerTest.java b/tests/robotests/src/com/android/settings/search/actionbar/SearchMenuControllerTest.java
index c646a93..2a7bd29 100644
--- a/tests/robotests/src/com/android/settings/search/actionbar/SearchMenuControllerTest.java
+++ b/tests/robotests/src/com/android/settings/search/actionbar/SearchMenuControllerTest.java
@@ -21,7 +21,7 @@
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.verifyZeroInteractions;
+import static org.mockito.Mockito.verifyNoInteractions;
import static org.mockito.Mockito.when;
import android.app.settings.SettingsEnums;
@@ -91,7 +91,7 @@
SearchMenuController.init(mHost);
mHost.getSettingsLifecycle().onCreateOptionsMenu(mMenu, null /* inflater */);
- verifyZeroInteractions(mMenu);
+ verifyNoInteractions(mMenu);
}
@Test
@@ -100,7 +100,7 @@
SearchMenuController.init(mHost);
mHost.getSettingsLifecycle().onCreateOptionsMenu(mMenu, null /* inflater */);
- verifyZeroInteractions(mMenu);
+ verifyNoInteractions(mMenu);
}
@Test
@@ -112,6 +112,6 @@
mHost.getSettingsLifecycle().onCreateOptionsMenu(mMenu, null /* inflater */);
- verifyZeroInteractions(mMenu);
+ verifyNoInteractions(mMenu);
}
}
diff --git a/tests/robotests/src/com/android/settings/widget/HighlightablePreferenceGroupAdapterTest.java b/tests/robotests/src/com/android/settings/widget/HighlightablePreferenceGroupAdapterTest.java
index 62c7bd8..e297b78 100644
--- a/tests/robotests/src/com/android/settings/widget/HighlightablePreferenceGroupAdapterTest.java
+++ b/tests/robotests/src/com/android/settings/widget/HighlightablePreferenceGroupAdapterTest.java
@@ -26,7 +26,7 @@
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.verifyZeroInteractions;
+import static org.mockito.Mockito.verifyNoInteractions;
import static org.mockito.Mockito.when;
import android.content.Context;
@@ -111,7 +111,7 @@
ReflectionHelpers.setField(mAdapter, "mHighlightRequested", false);
mAdapter.requestHighlight(mRoot, null /* recyclerView */, mock(AppBarLayout.class));
- verifyZeroInteractions(mRoot);
+ verifyNoInteractions(mRoot);
}
@Test
@@ -125,7 +125,7 @@
when(mFragment.getArguments()).thenReturn(null);
when(mFragment.getPreferenceScreen()).thenReturn(screen);
HighlightablePreferenceGroupAdapter.adjustInitialExpandedChildCount(mFragment);
- verifyZeroInteractions(screen);
+ verifyNoInteractions(screen);
}
@Test
@@ -150,7 +150,7 @@
HighlightablePreferenceGroupAdapter.adjustInitialExpandedChildCount(mFragment);
verify(mFragment).getInitialExpandedChildCount();
- verifyZeroInteractions(screen);
+ verifyNoInteractions(screen);
}
@Test
diff --git a/tests/robotests/src/com/android/settings/widget/SeekBarPreferenceTest.java b/tests/robotests/src/com/android/settings/widget/SeekBarPreferenceTest.java
index 8c5f428..732defb 100644
--- a/tests/robotests/src/com/android/settings/widget/SeekBarPreferenceTest.java
+++ b/tests/robotests/src/com/android/settings/widget/SeekBarPreferenceTest.java
@@ -24,7 +24,7 @@
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.verifyZeroInteractions;
+import static org.mockito.Mockito.verifyNoInteractions;
import static org.mockito.Mockito.when;
import static org.robolectric.Shadows.shadowOf;
@@ -197,7 +197,7 @@
public void onProgressChanged_noSeekBarChangeListener_noAction() {
mSeekBarPreference.onProgressChanged(mSeekBar, PROGRESS, true);
- verifyZeroInteractions(mMockOnSeekBarChangeListener);
+ verifyNoInteractions(mMockOnSeekBarChangeListener);
}
@Test
@@ -213,7 +213,7 @@
public void onStartTrackingTouch_noSeekBarChangeListener_noAction() {
mSeekBarPreference.onStartTrackingTouch(mSeekBar);
- verifyZeroInteractions(mMockOnSeekBarChangeListener);
+ verifyNoInteractions(mMockOnSeekBarChangeListener);
}
@Test
@@ -229,7 +229,7 @@
public void onStopTrackingTouch_noSeekBarChangeListener_noAction() {
mSeekBarPreference.onStopTrackingTouch(mSeekBar);
- verifyZeroInteractions(mMockOnSeekBarChangeListener);
+ verifyNoInteractions(mMockOnSeekBarChangeListener);
}
public static class TestFragment extends PreferenceFragmentCompat {
diff --git a/tests/robotests/src/com/android/settings/wifi/NetworkRequestDialogFragmentTest.java b/tests/robotests/src/com/android/settings/wifi/NetworkRequestDialogFragmentTest.java
index e08a14a..66d399c 100644
--- a/tests/robotests/src/com/android/settings/wifi/NetworkRequestDialogFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/wifi/NetworkRequestDialogFragmentTest.java
@@ -173,7 +173,7 @@
}
private List<WifiEntry> createWifiEntryList() {
- List<WifiEntry> wifiEntryList = spy(new ArrayList<>());
+ List<WifiEntry> wifiEntryList = new ArrayList<>();
final WifiEntry wifiEntry1 = mock(WifiEntry.class);
when(wifiEntry1.getSsid()).thenReturn("Test AP 1");
diff --git a/tests/robotests/src/com/android/settings/wifi/calling/DisclaimerItemListAdapterTest.java b/tests/robotests/src/com/android/settings/wifi/calling/DisclaimerItemListAdapterTest.java
index 8478a54..610e520 100644
--- a/tests/robotests/src/com/android/settings/wifi/calling/DisclaimerItemListAdapterTest.java
+++ b/tests/robotests/src/com/android/settings/wifi/calling/DisclaimerItemListAdapterTest.java
@@ -21,9 +21,9 @@
import static com.android.settings.wifi.calling.DisclaimerItemListAdapter
.DisclaimerItemViewHolder.ID_DISCLAIMER_ITEM_TITLE;
-import static org.mockito.Matchers.anyBoolean;
-import static org.mockito.Matchers.anyInt;
-import static org.mockito.Matchers.anyObject;
+import static org.mockito.Mockito.any;
+import static org.mockito.Mockito.anyBoolean;
+import static org.mockito.Mockito.anyInt;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@@ -75,7 +75,7 @@
mDisclaimerItem = spy(new MockDisclaimerItem(mContext, 0 /* subId */));
mDisclaimerItemList.add(mDisclaimerItem);
- when(mLayoutInflater.inflate(anyInt(), anyObject(), anyBoolean())).thenReturn(mView);
+ when(mLayoutInflater.inflate(anyInt(), any(), anyBoolean())).thenReturn(mView);
when(mViewGroup.getContext()).thenReturn(mContext);
when(mViewGroup.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE)).thenReturn(
mLayoutInflater);
diff --git a/tests/robotests/src/com/android/settings/wifi/calling/EmergencyCallLimitationDisclaimerTest.java b/tests/robotests/src/com/android/settings/wifi/calling/EmergencyCallLimitationDisclaimerTest.java
index 985edda..c8e4cce 100644
--- a/tests/robotests/src/com/android/settings/wifi/calling/EmergencyCallLimitationDisclaimerTest.java
+++ b/tests/robotests/src/com/android/settings/wifi/calling/EmergencyCallLimitationDisclaimerTest.java
@@ -18,8 +18,8 @@
import static com.google.common.truth.Truth.assertThat;
-import static org.mockito.Matchers.anyInt;
-import static org.mockito.Matchers.anyString;
+import static org.mockito.Mockito.anyInt;
+import static org.mockito.Mockito.anyString;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.when;
diff --git a/tests/robotests/src/com/android/settings/wifi/calling/LocationPolicyDisclaimerTest.java b/tests/robotests/src/com/android/settings/wifi/calling/LocationPolicyDisclaimerTest.java
index 3fe9678..148095a 100644
--- a/tests/robotests/src/com/android/settings/wifi/calling/LocationPolicyDisclaimerTest.java
+++ b/tests/robotests/src/com/android/settings/wifi/calling/LocationPolicyDisclaimerTest.java
@@ -18,8 +18,8 @@
import static com.google.common.truth.Truth.assertThat;
-import static org.mockito.Matchers.anyInt;
-import static org.mockito.Matchers.anyString;
+import static org.mockito.Mockito.anyInt;
+import static org.mockito.Mockito.anyString;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.when;
diff --git a/tests/robotests/src/com/android/settings/wifi/calling/WifiCallingDisclaimerFragmentTest.java b/tests/robotests/src/com/android/settings/wifi/calling/WifiCallingDisclaimerFragmentTest.java
index 207a231..0ece537 100644
--- a/tests/robotests/src/com/android/settings/wifi/calling/WifiCallingDisclaimerFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/wifi/calling/WifiCallingDisclaimerFragmentTest.java
@@ -16,10 +16,9 @@
package com.android.settings.wifi.calling;
-import static org.mockito.Matchers.any;
-import static org.mockito.Matchers.anyBoolean;
-import static org.mockito.Matchers.anyInt;
-import static org.mockito.Matchers.anyObject;
+import static org.mockito.Mockito.any;
+import static org.mockito.Mockito.anyBoolean;
+import static org.mockito.Mockito.anyInt;
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.never;
@@ -95,7 +94,7 @@
doReturn(mActivity).when(mFragment).getActivity();
- when(mLayoutInflater.inflate(anyInt(), anyObject(), anyBoolean())).thenReturn(mView);
+ when(mLayoutInflater.inflate(anyInt(), any(), anyBoolean())).thenReturn(mView);
when(mView.findViewById(R.id.agree_button)).thenReturn(mAgreeButton);
when(mView.findViewById(R.id.disagree_button)).thenReturn(mDisagreeButton);
when(mView.findViewById(R.id.disclaimer_item_list)).thenReturn(mRecyclerView);
diff --git a/tests/robotests/src/com/android/settings/wifi/calling/WifiCallingSettingsForSubTest.java b/tests/robotests/src/com/android/settings/wifi/calling/WifiCallingSettingsForSubTest.java
index e2c5ca3..1faa611 100644
--- a/tests/robotests/src/com/android/settings/wifi/calling/WifiCallingSettingsForSubTest.java
+++ b/tests/robotests/src/com/android/settings/wifi/calling/WifiCallingSettingsForSubTest.java
@@ -16,17 +16,17 @@
package com.android.settings.wifi.calling;
-import static junit.framework.Assert.assertEquals;
-
import static com.android.settings.SettingsActivity.EXTRA_SHOW_FRAGMENT;
import static com.google.common.truth.Truth.assertThat;
-import static org.mockito.Matchers.any;
-import static org.mockito.Matchers.anyInt;
-import static org.mockito.Matchers.eq;
+import static junit.framework.Assert.assertEquals;
+
+import static org.mockito.Mockito.any;
+import static org.mockito.Mockito.anyInt;
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.spy;
@@ -44,7 +44,6 @@
import android.telephony.TelephonyManager;
import android.telephony.ims.ImsMmTelManager;
import android.view.View;
-import android.widget.TextView;
import androidx.preference.Preference;
import androidx.preference.PreferenceScreen;
diff --git a/tests/robotests/src/com/android/settings/wifi/details2/WifiDetailPreferenceController2Test.java b/tests/robotests/src/com/android/settings/wifi/details2/WifiDetailPreferenceController2Test.java
index 08bcd2a..b0a50c8 100644
--- a/tests/robotests/src/com/android/settings/wifi/details2/WifiDetailPreferenceController2Test.java
+++ b/tests/robotests/src/com/android/settings/wifi/details2/WifiDetailPreferenceController2Test.java
@@ -17,15 +17,16 @@
import static com.google.common.truth.Truth.assertThat;
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.anyBoolean;
-import static org.mockito.ArgumentMatchers.anyInt;
-import static org.mockito.ArgumentMatchers.nullable;
+import static org.mockito.Mockito.any;
+import static org.mockito.Mockito.anyBoolean;
+import static org.mockito.Mockito.anyInt;
+import static org.mockito.Mockito.anyString;
import static org.mockito.Mockito.atLeastOnce;
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.inOrder;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.nullable;
import static org.mockito.Mockito.reset;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.times;
@@ -92,7 +93,6 @@
import org.mockito.ArgumentCaptor;
import org.mockito.Captor;
import org.mockito.InOrder;
-import org.mockito.Matchers;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.robolectric.RobolectricTestRunner;
@@ -1253,7 +1253,7 @@
mMockWifiConfig.creatorUid = doUid;
ComponentName doComponent = new ComponentName(doPackage, "some.Class");
try {
- when(mMockPackageManager.getPackageUidAsUser(Matchers.anyString(), Matchers.anyInt()))
+ when(mMockPackageManager.getPackageUidAsUser(anyString(), anyInt()))
.thenReturn(doUid);
} catch (PackageManager.NameNotFoundException e) {
//do nothing
diff --git a/tests/unit/src/com/android/settings/display/ScreenResolutionFragmentTest.java b/tests/unit/src/com/android/settings/display/ScreenResolutionFragmentTest.java
index b7d37df..4e674d2 100644
--- a/tests/unit/src/com/android/settings/display/ScreenResolutionFragmentTest.java
+++ b/tests/unit/src/com/android/settings/display/ScreenResolutionFragmentTest.java
@@ -27,15 +27,12 @@
import androidx.test.annotation.UiThreadTest;
import androidx.test.core.app.ApplicationProvider;
-import androidx.test.ext.junit.runners.AndroidJUnit4;
import com.android.settingslib.widget.SelectorWithWidgetPreference;
import org.junit.Before;
import org.junit.Test;
-import org.junit.runner.RunWith;
-@RunWith(AndroidJUnit4.class)
public class ScreenResolutionFragmentTest {
private Context mContext;
@@ -56,6 +53,7 @@
public void getDefaultKey_FHD() {
Display.Mode mode = new Display.Mode(0, FHD_WIDTH, 0, 0);
doReturn(mode).when(mFragment).getDisplayMode();
+ doReturn(mContext).when(mFragment).getContext();
mFragment.onAttach(mContext);
assertThat(mFragment.getDefaultKey()).isEqualTo(mFragment.getKeyForResolution(FHD_WIDTH));
@@ -66,6 +64,7 @@
public void getDefaultKey_QHD() {
Display.Mode mode = new Display.Mode(0, QHD_WIDTH, 0, 0);
doReturn(mode).when(mFragment).getDisplayMode();
+ doReturn(mContext).when(mFragment).getContext();
mFragment.onAttach(mContext);
assertThat(mFragment.getDefaultKey()).isEqualTo(mFragment.getKeyForResolution(QHD_WIDTH));
@@ -74,6 +73,7 @@
@Test
@UiThreadTest
public void setDefaultKey_FHD() {
+ doReturn(mContext).when(mFragment).getContext();
mFragment.onAttach(mContext);
mFragment.setDefaultKey(mFragment.getKeyForResolution(FHD_WIDTH));
@@ -84,6 +84,7 @@
@Test
@UiThreadTest
public void setDefaultKey_QHD() {
+ doReturn(mContext).when(mFragment).getContext();
mFragment.onAttach(mContext);
mFragment.setDefaultKey(mFragment.getKeyForResolution(QHD_WIDTH));
@@ -94,6 +95,7 @@
@Test
@UiThreadTest
public void bindPreferenceExtra_setSummary() {
+ doReturn(mContext).when(mFragment).getContext();
mFragment.onAttach(mContext);
SelectorWithWidgetPreference preference = new SelectorWithWidgetPreference(mContext);
ScreenResolutionFragment.ScreenResolutionCandidateInfo candidates =