Merge "ShadowLockPatternUtils: remove patternEverChosen methods" into main am: b862d378bd am: 12c1013250 am: c44a165ec7
Original change: https://android-review.googlesource.com/c/platform/packages/apps/Settings/+/2776713
Change-Id: I344e3a8d2a8a3e6cdb9056a9b06a7fe5b6b5741a
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 6689645..df4ad39 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -658,7 +658,6 @@
<activity android:name="Settings$FaceSettingsActivity"
android:label="@string/security_settings_face_preference_title"
android:exported="true"
- android:configChanges="orientation|screenSize"
android:icon="@drawable/ic_face_header">
<intent-filter>
<action android:name="android.settings.FACE_SETTINGS" />
@@ -674,7 +673,6 @@
android:label="@string/security_settings_face_preference_title"
android:exported="false"
android:icon="@drawable/ic_face_header"
- android:configChanges="orientation|screenSize"
android:taskAffinity="com.android.settings.root">
<meta-data android:name="com.android.settings.FRAGMENT_CLASS"
android:value="com.android.settings.biometrics.face.FaceSettings" />
@@ -864,6 +862,7 @@
<activity
android:name="Settings$LongBackgroundTasksActivity"
+ android:knownActivityEmbeddingCerts="@array/config_known_host_certs"
android:exported="true"
android:label="@string/long_background_tasks_label">
<intent-filter android:priority="1">
@@ -1545,6 +1544,7 @@
<activity
android:name="Settings$ManageApplicationsActivity"
+ android:knownActivityEmbeddingCerts="@array/config_known_host_certs"
android:exported="true"
android:label="@string/applications_settings">
<intent-filter android:priority="1">
@@ -1607,6 +1607,7 @@
<activity
android:name="Settings$HighPowerApplicationsActivity"
+ android:knownActivityEmbeddingCerts="@array/config_known_host_certs"
android:exported="true"
android:label="@string/high_power_apps">
<intent-filter android:priority="1">
@@ -1665,6 +1666,7 @@
This is for compatibility with old shortcuts. -->
<activity-alias android:name=".RunningServices"
android:label="@string/runningservices_settings_title"
+ android:knownActivityEmbeddingCerts="@array/config_known_host_certs"
android:exported="true"
android:targetActivity="Settings$ManageApplicationsActivity">
<meta-data android:name="com.android.settings.FRAGMENT_CLASS"
@@ -1677,6 +1679,7 @@
This is for compatibility with old shortcuts. -->
<activity-alias android:name=".applications.StorageUse"
android:label="@string/storageuse_settings_title"
+ android:knownActivityEmbeddingCerts="@array/config_known_host_certs"
android:exported="true"
android:targetActivity="Settings$ManageApplicationsActivity">
<meta-data android:name="com.android.settings.FRAGMENT_CLASS"
@@ -1743,6 +1746,7 @@
<!-- Provide direct entry into manage apps showing running services. -->
<activity android:name="Settings$RunningServicesActivity"
android:exported="true"
+ android:knownActivityEmbeddingCerts="@array/config_known_host_certs"
android:label="@string/runningservices_settings_title">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
@@ -1761,6 +1765,7 @@
<!-- Provide direct entry into manage apps showing storage usage of apps. -->
<activity
android:name="Settings$StorageUseActivity"
+ android:knownActivityEmbeddingCerts="@array/config_known_host_certs"
android:exported="true"
android:label="@string/storageuse_settings_title">
<intent-filter android:priority="1">
@@ -2105,6 +2110,7 @@
<activity
android:name="Settings$UsageAccessSettingsActivity"
+ android:knownActivityEmbeddingCerts="@array/config_known_host_certs"
android:exported="true"
android:label="@string/usage_access_title">
<intent-filter android:priority="1">
@@ -3483,6 +3489,7 @@
<activity
android:name="Settings$TurnScreenOnSettingsActivity"
android:exported="true"
+ android:knownActivityEmbeddingCerts="@array/config_known_host_certs"
android:label="@string/turn_screen_on_title">
<intent-filter android:priority="1">
<action android:name="android.settings.TURN_SCREEN_ON_SETTINGS" />
@@ -3662,6 +3669,7 @@
<activity android:name="Settings$NotificationAppListActivity"
android:label="@string/app_notifications_title"
android:icon="@drawable/ic_notifications"
+ android:knownActivityEmbeddingCerts="@array/config_known_host_certs"
android:exported="true">
<intent-filter android:priority="1">
<action android:name="android.settings.ALL_APPS_NOTIFICATION_SETTINGS" />
@@ -3676,6 +3684,7 @@
<!-- Displays a list of apps available for cloning on the device -->
<activity android:name=".Settings$ClonedAppsListActivity"
android:label="@string/cloned_apps_dashboard_title"
+ android:knownActivityEmbeddingCerts="@array/config_known_host_certs"
android:exported="true">
<intent-filter android:priority="1">
<action android:name="android.settings.MANAGE_CLONED_APPS_SETTINGS" />
@@ -3748,6 +3757,7 @@
<!-- Show regulatory info (from settings item or dialing "*#07#") -->
<activity
android:name="RegulatoryInfoDisplayActivity"
+ android:theme="@style/Theme.AlertDialog"
android:label="@string/regulatory_labels"
android:exported="true"
android:enabled="@bool/config_show_regulatory_info">
@@ -3941,6 +3951,7 @@
<activity
android:name="Settings$OverlaySettingsActivity"
+ android:knownActivityEmbeddingCerts="@array/config_known_host_certs"
android:exported="true"
android:label="@string/draw_overlay">
<intent-filter android:priority="1">
@@ -3978,6 +3989,7 @@
<activity
android:name="Settings$WriteSettingsActivity"
+ android:knownActivityEmbeddingCerts="@array/config_known_host_certs"
android:exported="true"
android:label="@string/write_settings_title">
<intent-filter android:priority="1">
@@ -4011,6 +4023,7 @@
<activity
android:name="Settings$AlarmsAndRemindersActivity"
android:exported="true"
+ android:knownActivityEmbeddingCerts="@array/config_known_host_certs"
android:label="@string/alarms_and_reminders_label">
<intent-filter android:priority="1">
<action android:name="android.settings.REQUEST_SCHEDULE_EXACT_ALARM" />
@@ -4041,6 +4054,7 @@
<activity
android:name="Settings$ManageExternalSourcesActivity"
+ android:knownActivityEmbeddingCerts="@array/config_known_host_certs"
android:exported="true"
android:label="@string/install_other_apps">
<intent-filter android:priority="1">
@@ -4095,6 +4109,7 @@
<activity
android:name="Settings$ManageExternalStorageActivity"
+ android:knownActivityEmbeddingCerts="@array/config_known_host_certs"
android:exported="true"
android:label="@string/manage_external_storage_title">
<intent-filter android:priority="1">
@@ -4126,6 +4141,7 @@
<activity
android:name="Settings$MediaManagementAppsActivity"
+ android:knownActivityEmbeddingCerts="@array/config_known_host_certs"
android:exported="true"
android:label="@string/media_management_apps_title">
<intent-filter android:priority="1">
@@ -4881,6 +4897,7 @@
<activity
android:name=".spa.SpaActivity"
android:configChanges="orientation|screenLayout|screenSize|smallestScreenSize"
+ android:knownActivityEmbeddingCerts="@array/config_known_host_certs"
android:exported="false" />
<activity android:name=".spa.SpaBridgeActivity" android:exported="false"/>
<activity android:name=".spa.SpaAppBridgeActivity" android:exported="false"/>
diff --git a/res-product/values-am/strings.xml b/res-product/values-am/strings.xml
index fb2eb91..21b8107 100644
--- a/res-product/values-am/strings.xml
+++ b/res-product/values-am/strings.xml
@@ -58,12 +58,9 @@
<string name="security_settings_face_enroll_introduction_consent_message_0" product="default" msgid="9086377203303858619">"ልጅዎ ስልካቸውን ለመክፈት ፊታቸውን እንዲጠቀሙ ይፍቀዱ"</string>
<string name="security_settings_face_enroll_introduction_consent_message_0" product="tablet" msgid="4560949471246282574">"ልጅዎ ጡባዊያቸውን ለመክፈት ፊታቸውን እንዲጠቀሙ ይፍቀዱ"</string>
<string name="security_settings_face_enroll_introduction_consent_message_0" product="device" msgid="1156063265854416046">"ልጅዎ መሣሪያቸውን ለመክፈት ፊታቸውን እንዲጠቀሙ ይፍቀዱ"</string>
- <!-- no translation found for security_settings_face_enroll_introduction_consent_message_0_class3 (5082581184108528408) -->
- <skip />
- <!-- no translation found for security_settings_face_enroll_introduction_consent_message_0_class3 (5932555218164668532) -->
- <skip />
- <!-- no translation found for security_settings_face_enroll_introduction_consent_message_0_class3 (8943878265098867810) -->
- <skip />
+ <string name="security_settings_face_enroll_introduction_consent_message_0_class3" product="default" msgid="5082581184108528408">"ልጅዎ ስልካቸውን ለመክፈት ወይም እነሱ መሆናቸውን ለማረጋገጥ መልካቸውን እንዲጠቀሙ ይፍቀዱ። ይህ የሚሆነው ወደ መተግበሪያዎች በመለያ ሲገቡ፣ ግዢን ሲያጸድቁ እና ሌሎችንም ሲያደርጉ ነው።"</string>
+ <string name="security_settings_face_enroll_introduction_consent_message_0_class3" product="tablet" msgid="5932555218164668532">"ልጅዎ ጡባዊያቸውን ለመክፈት ወይም እነሱ መሆናቸውን ለማረጋገጥ መልካቸውን እንዲጠቀሙ ይፍቀዱ። ይህ የሚሆነው ወደ መተግበሪያዎች በመለያ ሲገቡ፣ ግዢን ሲያጸድቁ እና ሌሎችንም ሲያደርጉ ነው።"</string>
+ <string name="security_settings_face_enroll_introduction_consent_message_0_class3" product="device" msgid="8943878265098867810">"ልጅዎ መሣሪያቸውን ለመክፈት ወይም እነሱ መሆናቸውን ለማረጋገጥ መልካቸውን እንዲጠቀሙ ይፍቀዱ። ይህ የሚሆነው ወደ መተግበሪያዎች በመለያ ሲገቡ፣ ግዢን ሲያጸድቁ እና ሌሎችንም ሲያደርጉ ነው።"</string>
<string name="security_settings_face_enroll_introduction_consent_message" product="default" msgid="3698558920963989416">"የልጅዎን ስልክ ለመክፈት መልካቸውን መጠቀሙ ከጠንካራ ስርዓተ ጥለት ወይም ፒን ያነሰ ደህንነት ሊኖረው ይችላል።"</string>
<string name="security_settings_face_enroll_introduction_consent_message" product="tablet" msgid="2689983368730833505">"የልጅዎን ጡባዊ ለመክፈት መልካቸውን መጠቀሙ ከጠንካራ ስርዓተ ጥለት ወይም ፒን ያነሰ ደህንነት ሊኖረው ይችላል።"</string>
<string name="security_settings_face_enroll_introduction_consent_message" product="device" msgid="5768077532130409820">"የልጅዎን መሣሪያ ለመክፈት መልካቸውን መጠቀሙ ከጠንካራ ስርዓተ ጥለት ወይም ፒን ያነሰ ደህንነት ሊኖረው ይችላል።"</string>
diff --git a/res-product/values-as/strings.xml b/res-product/values-as/strings.xml
index a86cc9c..e047813 100644
--- a/res-product/values-as/strings.xml
+++ b/res-product/values-as/strings.xml
@@ -125,7 +125,7 @@
<string name="security_settings_fingerprint_v2_enroll_introduction_footer_message_consent_4" product="default" msgid="5003753461032107715">"আপুনি আৰু আপোনাৰ শিশুৱে যিকোনো সময়তে ছেটিঙলৈ গৈ তেওঁৰ ফিংগাৰপ্ৰিণ্টৰ প্ৰতিচ্ছবি আৰু মডেলটো মচিব পাৰে অথবা ফিংগাৰপ্ৰিণ্টৰ দ্বাৰা আনলক কৰাৰ সুবিধাটো অফ কৰিব পাৰে। ফিংগাৰপ্ৰিণ্টৰ প্ৰতিচ্ছবি আৰু মডেলসমূহ মচি নেপেলোৱালৈকে ফ’নটোত ষ্ট’ৰ হৈ থাকে।"</string>
<string name="security_settings_fingerprint_v2_enroll_introduction_footer_message_consent_4" product="tablet" msgid="8772005555323461143">"আপুনি আৰু আপোনাৰ শিশুৱে যিকোনো সময়তে ছেটিঙলৈ গৈ তেওঁৰ ফিংগাৰপ্ৰিণ্টৰ প্ৰতিচ্ছবি আৰু মডেলটো মচিব পাৰে অথবা ফিংগাৰপ্ৰিণ্ট আনলকৰ সুবিধাটো অফ কৰিব পাৰে। ফিংগাৰপ্ৰিণ্টৰ প্ৰতিচ্ছবি আৰু মডেলসমূহ মচি নেপেলোৱালৈকে টেবলেটোত ষ্ট’ৰ হৈ থাকে।"</string>
<string name="security_settings_fingerprint_v2_enroll_introduction_footer_message_consent_4" product="device" msgid="7254955922685507093">"আপুনি আৰু আপোনাৰ শিশুৱে যিকোনো সময়তে ছেটিঙলৈ গৈ তেওঁৰ ফিংগাৰপ্ৰিণ্টৰ প্ৰতিচ্ছবি আৰু মডেলটো মচিব পাৰে অথবা ফিংগাৰপ্ৰিণ্ট আনলকৰ সুবিধাটো অফ কৰিব পাৰে। ফিংগাৰপ্ৰিণ্টৰ প্ৰতিচ্ছবি আৰু মডেলসমূহ মচি নেপেলোৱালৈকে ডিভাইচটোত ষ্ট’ৰ হৈ থাকে।"</string>
- <string name="security_settings_fingerprint_v2_enroll_introduction_footer_message_5" product="default" msgid="6272159089589340181">"আপুনি নিবিচাৰিলেও আপোনাৰ ফ’নটো আনলক হ\'ব পাৰে, যেনে কোনোবাই এইটো আপোনাৰ আঙুলিৰ আগত দাঙি ধৰিলে।"</string>
+ <string name="security_settings_fingerprint_v2_enroll_introduction_footer_message_5" product="default" msgid="6272159089589340181">"আপুনি নিবিচাৰিলেও আপোনাৰ ফ’নটো আনলক হ\'ব পাৰে, যেনে কোনোবাই এইটো আপোনাৰ আঙুলিত স্পৰ্শ কৰালে।"</string>
<string name="security_settings_fingerprint_v2_enroll_introduction_footer_message_5" product="tablet" msgid="2420109998272019149">"আপুনি নিবিচাৰিলেও আপোনাৰ টেবেলেটটো আনলক হ’ব পাৰে, যেনে কোনোবাই এইটো আপোনাৰ আঙুলিত লগাই দিলে।"</string>
<string name="security_settings_fingerprint_v2_enroll_introduction_footer_message_5" product="device" msgid="5915844445830045866">"আপুনি নিবিচাৰিলেও আপোনাৰ ডিভাইচটো আনলক হ’ব পাৰে, যেনে কোনোবাই এইটো আপোনাৰ আঙুলিত লগাই দিলে।"</string>
<string name="security_settings_fingerprint_v2_enroll_introduction_footer_message_consent_5" product="default" msgid="6556725426776167791">"তেওঁ নিবিচাৰিলেও আপোনাৰ শিশুৰ ফ’নটো আনলক কৰিব পৰা যায়, যেনে কোনোবাই এইটো তেওঁৰ আঙুলিত লগাই দিলে।"</string>
diff --git a/res-product/values-b+sr+Latn/strings.xml b/res-product/values-b+sr+Latn/strings.xml
index cf0868a..ae4231d 100644
--- a/res-product/values-b+sr+Latn/strings.xml
+++ b/res-product/values-b+sr+Latn/strings.xml
@@ -58,12 +58,9 @@
<string name="security_settings_face_enroll_introduction_consent_message_0" product="default" msgid="9086377203303858619">"Dozvolite detetu da koristi otključavanje telefona licem"</string>
<string name="security_settings_face_enroll_introduction_consent_message_0" product="tablet" msgid="4560949471246282574">"Dozvolite detetu da koristi otključavanje tableta licem"</string>
<string name="security_settings_face_enroll_introduction_consent_message_0" product="device" msgid="1156063265854416046">"Dozvolite detetu da koristi otključavanje uređaja licem"</string>
- <!-- no translation found for security_settings_face_enroll_introduction_consent_message_0_class3 (5082581184108528408) -->
- <skip />
- <!-- no translation found for security_settings_face_enroll_introduction_consent_message_0_class3 (5932555218164668532) -->
- <skip />
- <!-- no translation found for security_settings_face_enroll_introduction_consent_message_0_class3 (8943878265098867810) -->
- <skip />
+ <string name="security_settings_face_enroll_introduction_consent_message_0_class3" product="default" msgid="5082581184108528408">"Dozvolite detetu da koristi lice za otključavanje telefona ili potvrdu identiteta. Ovo se dešava kada se prijavljuje u aplikacije, odobrava kupovinu i u drugim situacijama."</string>
+ <string name="security_settings_face_enroll_introduction_consent_message_0_class3" product="tablet" msgid="5932555218164668532">"Dozvolite detetu da koristi lice za otključavanje tableta ili potvrdu identiteta. Ovo se dešava kada se prijavljuje u aplikacije, odobrava kupovinu i u drugim situacijama."</string>
+ <string name="security_settings_face_enroll_introduction_consent_message_0_class3" product="device" msgid="8943878265098867810">"Dozvolite detetu da koristi lice za otključavanje uređaja ili potvrdu identiteta. Ovo se dešava kada se prijavljuje u aplikacije, odobrava kupovinu i u drugim situacijama."</string>
<string name="security_settings_face_enroll_introduction_consent_message" product="default" msgid="3698558920963989416">"Korišćenje lica deteta za otključavanje telefona može da bude manje bezbedno od jakog šablona ili PIN-a."</string>
<string name="security_settings_face_enroll_introduction_consent_message" product="tablet" msgid="2689983368730833505">"Korišćenje lica deteta za otključavanje tableta može da bude manje bezbedno od jakog šablona ili PIN-a."</string>
<string name="security_settings_face_enroll_introduction_consent_message" product="device" msgid="5768077532130409820">"Korišćenje lica deteta za otključavanje uređaja može da bude manje bezbedno od jakog šablona ili PIN-a."</string>
@@ -208,9 +205,9 @@
<string name="biometrics_unlock_title" product="device" msgid="3342994085226864170">"Možete da otključate uređaj pomoću lica ili otiska prsta. Ova opcija zahteva rezervni metod zaključavanja ekrana iz bezbednosnih razloga."</string>
<string name="encrypt_title" product="tablet" msgid="8915795247786124547">"Šifruj tablet"</string>
<string name="encrypt_title" product="default" msgid="511146128799853404">"Šifrovanje telefona"</string>
- <string name="suggested_lock_settings_summary" product="tablet" msgid="8821254377043173267">"Podesite zaključavanje ekrana da biste zaštitili tablet"</string>
- <string name="suggested_lock_settings_summary" product="device" msgid="4863929838844014122">"Podesite zaključavanje ekrana da biste zaštitili uređaj"</string>
- <string name="suggested_lock_settings_summary" product="default" msgid="8050809409337082738">"Podesite zaključavanje ekrana da biste zaštitili telefon"</string>
+ <string name="suggested_lock_settings_summary" product="tablet" msgid="8821254377043173267">"Podesite otključavanje ekrana da biste zaštitili tablet"</string>
+ <string name="suggested_lock_settings_summary" product="device" msgid="4863929838844014122">"Podesite otključavanje ekrana da biste zaštitili uređaj"</string>
+ <string name="suggested_lock_settings_summary" product="default" msgid="8050809409337082738">"Podesite otključavanje ekrana da biste zaštitili telefon"</string>
<string name="suggested_fingerprint_lock_settings_summary" product="tablet" msgid="8565330205932332157"></string>
<string name="suggested_fingerprint_lock_settings_summary" product="device" msgid="8565330205932332157"></string>
<string name="suggested_fingerprint_lock_settings_summary" product="default" msgid="8565330205932332157"></string>
diff --git a/res-product/values-bg/strings.xml b/res-product/values-bg/strings.xml
index e454e1c..044f24b 100644
--- a/res-product/values-bg/strings.xml
+++ b/res-product/values-bg/strings.xml
@@ -58,12 +58,9 @@
<string name="security_settings_face_enroll_introduction_consent_message_0" product="default" msgid="9086377203303858619">"Разрешете на детето си да използва лицето си, за да отключва телефона си"</string>
<string name="security_settings_face_enroll_introduction_consent_message_0" product="tablet" msgid="4560949471246282574">"Разрешете на детето си да използва лицето си, за да отключва таблета си"</string>
<string name="security_settings_face_enroll_introduction_consent_message_0" product="device" msgid="1156063265854416046">"Разрешете на детето си да използва лицето си, за да отключва устройството си"</string>
- <!-- no translation found for security_settings_face_enroll_introduction_consent_message_0_class3 (5082581184108528408) -->
- <skip />
- <!-- no translation found for security_settings_face_enroll_introduction_consent_message_0_class3 (5932555218164668532) -->
- <skip />
- <!-- no translation found for security_settings_face_enroll_introduction_consent_message_0_class3 (8943878265098867810) -->
- <skip />
+ <string name="security_settings_face_enroll_introduction_consent_message_0_class3" product="default" msgid="5082581184108528408">"Разрешете на детето си да използва своето лице, за да отключва телефона или да потвърждава самоличността си, например при влизане в приложения, одобряване на покупки и др."</string>
+ <string name="security_settings_face_enroll_introduction_consent_message_0_class3" product="tablet" msgid="5932555218164668532">"Разрешете на детето си да използва своето лице, за да отключва таблета си или да потвърждава самоличността си, например при влизане в приложения, одобряване на покупки и др."</string>
+ <string name="security_settings_face_enroll_introduction_consent_message_0_class3" product="device" msgid="8943878265098867810">"Разрешете на детето си да използва лицето си, за да отключва устройството си или да потвърждава самоличността си, например при влизане в приложения, одобряване на покупки и др."</string>
<string name="security_settings_face_enroll_introduction_consent_message" product="default" msgid="3698558920963989416">"Отключването на телефона на детето ви с лице може да е по-малко сигурно в сравнение с надеждни фигура или PIN код."</string>
<string name="security_settings_face_enroll_introduction_consent_message" product="tablet" msgid="2689983368730833505">"Отключването на таблета на детето ви с лице може да е по-малко сигурно в сравнение с надеждни фигура или PIN код."</string>
<string name="security_settings_face_enroll_introduction_consent_message" product="device" msgid="5768077532130409820">"Отключването на устройството на детето ви с лице може да е по-малко сигурно в сравнение с надеждни фигура или PIN код."</string>
diff --git a/res-product/values-bs/strings.xml b/res-product/values-bs/strings.xml
index 25fc9b2..ff8382c 100644
--- a/res-product/values-bs/strings.xml
+++ b/res-product/values-bs/strings.xml
@@ -94,18 +94,18 @@
<string name="security_settings_face_enroll_introduction_control_consent_message" product="default" msgid="6983939010814873996"></string>
<string name="security_settings_face_enroll_introduction_control_consent_message" product="tablet" msgid="6983939010814873996"></string>
<string name="security_settings_face_enroll_introduction_control_consent_message" product="device" msgid="6983939010814873996"></string>
- <string name="security_settings_face_settings_footer" product="default" msgid="3036403896485044957">"Koristite lice da otključate telefon ili izvršite autentifikaciju u aplikacijama, npr. kada se prijavljujete ili odobravate kupovinu.\n\nImajte na umu:\nistovremeno možete imati postavljeno samo jedno lice. Da dodate drugo lice, izbrišite postojeće.\n\nTelefon možete otključati ako pogledate u njega čak i ako vam to nije bila namjera.\n\nTelefon može otključati i neko drugi ako ga prinese vašem licu.\n\nTelefon može otključati osoba koja mnogo liči na vas, npr. identični blizanac."</string>
- <string name="security_settings_face_settings_footer" product="tablet" msgid="3467711032275909082">"Koristite lice da otključate tablet ili izvršite autentifikaciju u aplikacijama, npr. kada se prijavljujete ili odobravate kupovinu.\n\nImajte na umu:\nistovremeno možete imati postavljeno samo jedno lice. Da dodate drugo lice, izbrišite postojeće.\n\nTablet možete otključati ako pogledate u njega čak i ako vam to nije bila namjera.\n\nTablet može otključati i neko drugi ako ga prinese vašem licu.\n\nTablet može otključati osoba koja mnogo liči na vas, npr. identični blizanac."</string>
- <string name="security_settings_face_settings_footer" product="device" msgid="6237815625247917310">"Koristite lice da otključate uređaj ili izvršite autentifikaciju u aplikacijama, npr. kada se prijavljujete ili odobravate kupovinu.\n\nImajte na umu:\nistovremeno možete imati postavljeno samo jedno lice. Da dodate drugo lice, izbrišite postojeće.\n\nUređaj možete otključati ako pogledate u njega čak i ako vam to nije bila namjera.\n\nUređaj može otključati i neko drugi ako ga prinese vašem licu.\n\nUređaj može otključati osoba koja mnogo liči na vas, npr. identični blizanac."</string>
- <string name="security_settings_face_settings_footer_attention_not_supported" product="default" msgid="8266896471278294942">"Koristite lice da otključate telefon ili izvršite autentifikaciju u aplikacijama, npr. kada se prijavljujete ili odobravate kupovinu.\n\nImajte na umu:\nistovremeno možete imati postavljeno samo jedno lice. Da dodate drugo lice, izbrišite postojeće.\n\nTelefon možete otključati ako pogledate u njega čak i ako vam to nije bila namjera.\n\nTelefon može otključati i neko drugi ako ga prinese vašem licu, čak i dok su vam oči zatvorene.\n\nTelefon može otključati osoba koja mnogo liči na vas, npr. identični blizanac."</string>
- <string name="security_settings_face_settings_footer_attention_not_supported" product="tablet" msgid="6932278790700490818">"Koristite lice da otključate tablet ili izvršite autentifikaciju u aplikacijama, npr. kada se prijavljujete ili odobravate kupovinu.\n\nImajte na umu:\nistovremeno možete imati postavljeno samo jedno lice. Da dodate drugo lice, izbrišite postojeće.\n\nTablet možete otključati ako pogledate u njega čak i ako vam to nije bila namjera.\n\nTablet može otključati i neko drugi ako ga prinese vašem licu, čak i dok su vam oči zatvorene.\n\nTablet može otključati osoba koja mnogo liči na vas, npr. identični blizanac."</string>
- <string name="security_settings_face_settings_footer_attention_not_supported" product="device" msgid="2559602951942339212">"Koristite lice da otključate uređaj ili izvršite autentifikaciju u aplikacijama, npr. kada se prijavljujete ili odobravate kupovinu.\n\nImajte na umu:\nistovremeno možete imati postavljeno samo jedno lice. Da dodate drugo lice, izbrišite postojeće.\n\nUređaj možete otključati ako pogledate u njega čak i ako vam to nije bila namjera.\n\nUređaj može otključati i neko drugi ako ga prinese vašem licu, čak i dok su vam oči zatvorene.\n\nUređaj može otključati osoba koja mnogo liči na vas, npr. identični blizanac."</string>
- <string name="security_settings_face_settings_footer_class3" product="default" msgid="7050076350282827484">"Koristite lice da otključate telefon ili potvrdite identitet, npr. kada se prijavljujete u aplikacije ili odobravate kupovinu.\n\nImajte na umu:\nistovremeno možete imati postavljeno samo jedno lice. Da dodate drugo lice, izbrišite postojeće.\n\nTelefon možete otključati ako pogledate u njega čak i ako vam to nije bila namjera.\n\nTelefon može otključati i neko drugi ako ga prinese vašem licu.\n\nTelefon može otključati osoba koja mnogo liči na vas, npr. identični blizanac."</string>
- <string name="security_settings_face_settings_footer_class3" product="tablet" msgid="8013245173915280810">"Koristite lice da otključate tablet ili potvrdite identitet, npr. kada se prijavljujete u aplikacije ili odobravate kupovinu.\n\nImajte na umu:\nistovremeno možete imati postavljeno samo jedno lice. Da dodate drugo lice, izbrišite postojeće.\n\nTablet možete otključati ako pogledate u njega čak i ako vam to nije bila namjera.\n\nTablet može otključati i neko drugi ako ga prinese vašem licu.\n\nTablet može otključati osoba koja mnogo liči na vas, npr. identični blizanac."</string>
- <string name="security_settings_face_settings_footer_class3" product="device" msgid="4411845832787210264">"Koristite lice da otključate uređaj ili potvrdite identitet, npr. kada se prijavljujete u aplikacije ili odobravate kupovinu.\n\nImajte na umu:\nistovremeno možete imati postavljeno samo jedno lice. Da dodate drugo lice, izbrišite postojeće.\n\nUređaj možete otključati ako pogledate u njega čak i ako vam to nije bila namjera.\n\nUređaj može otključati i neko drugi ako ga prinese vašem licu.\n\nUređaj može otključati osoba koja mnogo liči na vas, npr. identični blizanac."</string>
- <string name="security_settings_face_settings_footer_class3_attention_not_supported" product="default" msgid="5512898803063743303">"Koristite lice da otključate telefon ili potvrdite identitet, npr. kada se prijavljujete u aplikacije ili odobravate kupovinu.\n\nImajte na umu:\nistovremeno možete imati postavljeno samo jedno lice. Da dodate drugo lice, izbrišite postojeće.\n\nTelefon možete otključati ako pogledate u njega čak i ako vam to nije bila namjera.\n\nTelefon može otključati i neko drugi ako ga prinese vašem licu, čak i dok su vam oči zatvorene.\n\nTelefon može otključati osoba koja mnogo liči na vas, npr. identični blizanac."</string>
- <string name="security_settings_face_settings_footer_class3_attention_not_supported" product="tablet" msgid="6790505667764631343">"Koristite lice da otključate tablet ili potvrdite identitet, npr. kada se prijavljujete u aplikacije ili odobravate kupovinu.\n\nImajte na umu:\nistovremeno možete imati postavljeno samo jedno lice. Da dodate drugo lice, izbrišite postojeće.\n\nTablet možete otključati ako pogledate u njega čak i ako vam to nije bila namjera.\n\nTablet može otključati i neko drugi ako ga prinese vašem licu, čak i dok su vam oči zatvorene.\n\nTablet može otključati osoba koja mnogo liči na vas, npr. identični blizanac."</string>
- <string name="security_settings_face_settings_footer_class3_attention_not_supported" product="device" msgid="7858917821957779752">"Koristite lice da otključate uređaj ili potvrdite identitet, npr. kada se prijavljujete u aplikacije ili odobravate kupovinu.\n\nImajte na umu:\nistovremeno možete imati postavljeno samo jedno lice. Da dodate drugo lice, izbrišite postojeće.\n\nUređaj možete otključati ako pogledate u njega čak i ako vam to nije bila namjera.\n\nUređaj može otključati i neko drugi ako ga prinese vašem licu, čak i dok su vam oči zatvorene.\n\nUređaj može otključati osoba koja mnogo liči na vas, npr. identični blizanac."</string>
+ <string name="security_settings_face_settings_footer" product="default" msgid="3036403896485044957">"Koristite lice da otključate telefon ili izvršite autentifikaciju u aplikacijama, npr. kada se prijavljujete ili odobravate kupovinu.\n\nImajte na umu:\nu datom trenutku možete imati postavljeno samo jedno lice. Da dodate drugo lice, izbrišite postojeće.\n\nTelefon možete otključati ako pogledate u njega čak i ako vam to nije bila namjera.\n\nTelefon može otključati i neko drugi ako ga prinese vašem licu.\n\nTelefon može otključati osoba koja mnogo liči na vas, npr. identični blizanac."</string>
+ <string name="security_settings_face_settings_footer" product="tablet" msgid="3467711032275909082">"Koristite lice da otključate tablet ili izvršite autentifikaciju u aplikacijama, npr. kada se prijavljujete ili odobravate kupovinu.\n\nImajte na umu:\nu datom trenutku možete imati postavljeno samo jedno lice. Da dodate drugo lice, izbrišite postojeće.\n\nTablet možete otključati ako pogledate u njega čak i ako vam to nije bila namjera.\n\nTablet može otključati i neko drugi ako ga prinese vašem licu.\n\nTablet može otključati osoba koja mnogo liči na vas, npr. identični blizanac."</string>
+ <string name="security_settings_face_settings_footer" product="device" msgid="6237815625247917310">"Koristite lice da otključate uređaj ili izvršite autentifikaciju u aplikacijama, npr. kada se prijavljujete ili odobravate kupovinu.\n\nImajte na umu:\nu datom trenutku možete imati postavljeno samo jedno lice. Da dodate drugo lice, izbrišite postojeće.\n\nUređaj možete otključati ako pogledate u njega čak i ako vam to nije bila namjera.\n\nUređaj može otključati i neko drugi ako ga prinese vašem licu.\n\nUređaj može otključati osoba koja mnogo liči na vas, npr. identični blizanac."</string>
+ <string name="security_settings_face_settings_footer_attention_not_supported" product="default" msgid="8266896471278294942">"Koristite lice da otključate telefon ili izvršite autentifikaciju u aplikacijama, npr. kada se prijavljujete ili odobravate kupovinu.\n\nImajte na umu:\nu datom trenutku možete imati postavljeno samo jedno lice. Da dodate drugo lice, izbrišite postojeće.\n\nTelefon možete otključati ako pogledate u njega čak i ako vam to nije bila namjera.\n\nTelefon može otključati i neko drugi ako ga prinese vašem licu, čak i dok su vam oči zatvorene.\n\nTelefon može otključati osoba koja mnogo liči na vas, npr. identični blizanac."</string>
+ <string name="security_settings_face_settings_footer_attention_not_supported" product="tablet" msgid="6932278790700490818">"Koristite lice da otključate tablet ili izvršite autentifikaciju u aplikacijama, npr. kada se prijavljujete ili odobravate kupovinu.\n\nImajte na umu:\nu datom trenutku možete imati postavljeno samo jedno lice. Da dodate drugo lice, izbrišite postojeće.\n\nTablet možete otključati ako pogledate u njega čak i ako vam to nije bila namjera.\n\nTablet može otključati i neko drugi ako ga prinese vašem licu, čak i dok su vam oči zatvorene.\n\nTablet može otključati osoba koja mnogo liči na vas, npr. identični blizanac."</string>
+ <string name="security_settings_face_settings_footer_attention_not_supported" product="device" msgid="2559602951942339212">"Koristite lice da otključate uređaj ili izvršite autentifikaciju u aplikacijama, npr. kada se prijavljujete ili odobravate kupovinu.\n\nImajte na umu:\nu datom trenutku možete imati postavljeno samo jedno lice. Da dodate drugo lice, izbrišite postojeće.\n\nUređaj možete otključati ako pogledate u njega čak i ako vam to nije bila namjera.\n\nUređaj može otključati i neko drugi ako ga prinese vašem licu, čak i dok su vam oči zatvorene.\n\nUređaj može otključati osoba koja mnogo liči na vas, npr. identični blizanac."</string>
+ <string name="security_settings_face_settings_footer_class3" product="default" msgid="7050076350282827484">"Koristite lice da otključate telefon ili potvrdite identitet, npr. kada se prijavljujete u aplikacije ili odobravate kupovinu.\n\nImajte na umu:\nu datom trenutku možete imati postavljeno samo jedno lice. Da dodate drugo lice, izbrišite postojeće.\n\nTelefon možete otključati ako pogledate u njega čak i ako vam to nije bila namjera.\n\nTelefon može otključati i neko drugi ako ga prinese vašem licu.\n\nTelefon može otključati osoba koja mnogo liči na vas, npr. identični blizanac."</string>
+ <string name="security_settings_face_settings_footer_class3" product="tablet" msgid="8013245173915280810">"Koristite lice da otključate tablet ili potvrdite identitet, npr. kada se prijavljujete u aplikacije ili odobravate kupovinu.\n\nImajte na umu:\nu datom trenutku možete imati postavljeno samo jedno lice. Da dodate drugo lice, izbrišite postojeće.\n\nTablet možete otključati ako pogledate u njega čak i ako vam to nije bila namjera.\n\nTablet može otključati i neko drugi ako ga prinese vašem licu.\n\nTablet može otključati osoba koja mnogo liči na vas, npr. identični blizanac."</string>
+ <string name="security_settings_face_settings_footer_class3" product="device" msgid="4411845832787210264">"Koristite lice da otključate uređaj ili potvrdite identitet, npr. kada se prijavljujete u aplikacije ili odobravate kupovinu.\n\nImajte na umu:\nu datom trenutku možete imati postavljeno samo jedno lice. Da dodate drugo lice, izbrišite postojeće.\n\nUređaj možete otključati ako pogledate u njega čak i ako vam to nije bila namjera.\n\nUređaj može otključati i neko drugi ako ga prinese vašem licu.\n\nUređaj može otključati osoba koja mnogo liči na vas, npr. identični blizanac."</string>
+ <string name="security_settings_face_settings_footer_class3_attention_not_supported" product="default" msgid="5512898803063743303">"Koristite lice da otključate telefon ili potvrdite identitet, npr. kada se prijavljujete u aplikacije ili odobravate kupovinu.\n\nImajte na umu:\nu datom trenutku možete imati postavljeno samo jedno lice. Da dodate drugo lice, izbrišite postojeće.\n\nTelefon možete otključati ako pogledate u njega čak i ako vam to nije bila namjera.\n\nTelefon može otključati i neko drugi ako ga prinese vašem licu, čak i dok su vam oči zatvorene.\n\nTelefon može otključati osoba koja mnogo liči na vas, npr. identični blizanac."</string>
+ <string name="security_settings_face_settings_footer_class3_attention_not_supported" product="tablet" msgid="6790505667764631343">"Koristite lice da otključate tablet ili potvrdite identitet, npr. kada se prijavljujete u aplikacije ili odobravate kupovinu.\n\nImajte na umu:\nu datom trenutku možete imati postavljeno samo jedno lice. Da dodate drugo lice, izbrišite postojeće.\n\nTablet možete otključati ako pogledate u njega čak i ako vam to nije bila namjera.\n\nTablet može otključati i neko drugi ako ga prinese vašem licu, čak i dok su vam oči zatvorene.\n\nTablet može otključati osoba koja mnogo liči na vas, npr. identični blizanac."</string>
+ <string name="security_settings_face_settings_footer_class3_attention_not_supported" product="device" msgid="7858917821957779752">"Koristite lice da otključate uređaj ili potvrdite identitet, npr. kada se prijavljujete u aplikacije ili odobravate kupovinu.\n\nImajte na umu:\nu datom trenutku možete imati postavljeno samo jedno lice. Da dodate drugo lice, izbrišite postojeće.\n\nUređaj možete otključati ako pogledate u njega čak i ako vam to nije bila namjera.\n\nUređaj može otključati i neko drugi ako ga prinese vašem licu, čak i dok su vam oči zatvorene.\n\nUređaj može otključati osoba koja mnogo liči na vas, npr. identični blizanac."</string>
<string name="security_settings_fingerprint_enroll_introduction_v3_message" msgid="2145273491174234191">"Pomoću otiska prsta otključajte uređaj <xliff:g id="DEVICENAME">%s</xliff:g> ili potvrdite svoj identitet, naprimjer kada se prijavljujete u aplikacije ili odobravate kupovinu"</string>
<string name="security_settings_fingerprint_enroll_introduction_consent_message" product="default" msgid="5101253231118659496">"Dozvolite djetetu da koristi otisak prsta da otključa telefon ili potvrdi identitet. To će se dešavati prilikom prijava u aplikacije, odobravanja kupovina i drugih radnji."</string>
<string name="security_settings_fingerprint_enroll_introduction_consent_message" product="tablet" msgid="3063978167545799342">"Dozvolite djetetu da koristi otisak prsta da otključa tablet ili potvrdi identitet. To će se dešavati prilikom prijava u aplikacije, odobravanja kupovina i drugih radnji."</string>
diff --git a/res-product/values-cs/strings.xml b/res-product/values-cs/strings.xml
index 1b92375..d058a34 100644
--- a/res-product/values-cs/strings.xml
+++ b/res-product/values-cs/strings.xml
@@ -58,12 +58,9 @@
<string name="security_settings_face_enroll_introduction_consent_message_0" product="default" msgid="9086377203303858619">"Povolte dítěti používat obličej k odemykání telefonu"</string>
<string name="security_settings_face_enroll_introduction_consent_message_0" product="tablet" msgid="4560949471246282574">"Povolte dítěti používat obličej k odemykání tabletu"</string>
<string name="security_settings_face_enroll_introduction_consent_message_0" product="device" msgid="1156063265854416046">"Povolte dítěti používat obličej k odemykání zařízení"</string>
- <!-- no translation found for security_settings_face_enroll_introduction_consent_message_0_class3 (5082581184108528408) -->
- <skip />
- <!-- no translation found for security_settings_face_enroll_introduction_consent_message_0_class3 (5932555218164668532) -->
- <skip />
- <!-- no translation found for security_settings_face_enroll_introduction_consent_message_0_class3 (8943878265098867810) -->
- <skip />
+ <string name="security_settings_face_enroll_introduction_consent_message_0_class3" product="default" msgid="5082581184108528408">"Povolte dítěti používat obličej k odemykání telefonu a ověřování totožnosti. K ověřování dochází při přihlašování do aplikací, schvalování nákupů apod."</string>
+ <string name="security_settings_face_enroll_introduction_consent_message_0_class3" product="tablet" msgid="5932555218164668532">"Povolte dítěti používat obličej k odemykání tabletu a ověřování totožnosti. K ověřování dochází při přihlašování do aplikací, schvalování nákupů apod."</string>
+ <string name="security_settings_face_enroll_introduction_consent_message_0_class3" product="device" msgid="8943878265098867810">"Povolte dítěti používat obličej k odemykání zařízení a ověřování totožnosti. K ověřování dochází při přihlašování do aplikací, schvalování nákupů apod."</string>
<string name="security_settings_face_enroll_introduction_consent_message" product="default" msgid="3698558920963989416">"Odemykání telefonu dítěte obličejem může být méně bezpečné než silné gesto nebo PIN."</string>
<string name="security_settings_face_enroll_introduction_consent_message" product="tablet" msgid="2689983368730833505">"Odemykání tabletu dítěte obličejem může být méně bezpečné než silné gesto nebo PIN."</string>
<string name="security_settings_face_enroll_introduction_consent_message" product="device" msgid="5768077532130409820">"Odemykání zařízení dítěte obličejem může být méně bezpečné než silné gesto nebo PIN."</string>
diff --git a/res-product/values-et/strings.xml b/res-product/values-et/strings.xml
index ac18b1e..58e2859 100644
--- a/res-product/values-et/strings.xml
+++ b/res-product/values-et/strings.xml
@@ -191,9 +191,9 @@
<string name="lock_screen_pin_skip_biometrics_message" product="default" msgid="2717938545326672010">"Näoga avamise ja sõrmejäljega avamise seadistamiseks on vaja PIN-koodi.\n\nPIN-kood kaitseb telefoni juhul, kui see läheb kaotsi või varastatakse."</string>
<string name="lock_screen_pattern_skip_biometrics_message" product="default" msgid="6067309080610183546">"Näoga avamise ja sõrmejäljega avamise seadistamiseks on vaja mustrit.\n\nMuster kaitseb telefoni juhul, kui see läheb kaotsi või varastatakse."</string>
<string name="lock_screen_password_skip_biometrics_message" product="default" msgid="4739690336878613804">"Näoga avamise ja sõrmejäljega avamise seadistamiseks on vaja parooli.\n\nParool kaitseb telefoni juhul, kui see läheb kaotsi või varastatakse."</string>
- <string name="fingerprint_v2_delete_message" product="default" msgid="8723083814238510088">"See kustutab sõrmejäljega „<xliff:g id="FINGERPRINT_ID">%1$s</xliff:g>“ seotud sõrmejäljekujutised ja -mudeli, mis on teie telefoni salvestatud"</string>
- <string name="fingerprint_v2_delete_message" product="tablet" msgid="527375244730792698">"See kustutab sõrmejäljega „<xliff:g id="FINGERPRINT_ID">%1$s</xliff:g>“ seotud sõrmejäljekujutised ja -mudeli, mis on teie tahvelarvutisse salvestatud"</string>
- <string name="fingerprint_v2_delete_message" product="device" msgid="4549780655045100171">"See kustutab sõrmejäljega „<xliff:g id="FINGERPRINT_ID">%1$s</xliff:g>“ seotud sõrmejäljekujutised ja -mudeli, mis on teie seadmesse salvestatud"</string>
+ <string name="fingerprint_v2_delete_message" product="default" msgid="8723083814238510088">"See kustutab sõrmejäljega „<xliff:g id="FINGERPRINT_ID">%1$s</xliff:g>“ seotud sõrmejäljekujutised ja -mudeli, mis on teie telefoni salvestatud."</string>
+ <string name="fingerprint_v2_delete_message" product="tablet" msgid="527375244730792698">"See kustutab sõrmejäljega „<xliff:g id="FINGERPRINT_ID">%1$s</xliff:g>“ seotud sõrmejäljekujutised ja -mudeli, mis on teie tahvelarvutisse salvestatud."</string>
+ <string name="fingerprint_v2_delete_message" product="device" msgid="4549780655045100171">"See kustutab sõrmejäljega „<xliff:g id="FINGERPRINT_ID">%1$s</xliff:g>“ seotud sõrmejäljekujutised ja -mudeli, mis on teie seadmesse salvestatud."</string>
<string name="fingerprint_last_delete_message" product="default" msgid="3187410175262625294">"Te ei saa oma sõrmejälge kasutades telefoni avada ega rakendustes oma isikut kinnitada."</string>
<string name="fingerprint_last_delete_message" product="tablet" msgid="8618307419148004587">"Te ei saa oma sõrmejälge kasutades tahvelarvutit avada ega rakendustes oma isikut kinnitada."</string>
<string name="fingerprint_last_delete_message" product="device" msgid="3910012280858587242">"Te ei saa oma sõrmejälge kasutades seadet avada ega rakendustes oma isikut kinnitada."</string>
diff --git a/res-product/values-fi/strings.xml b/res-product/values-fi/strings.xml
index c6accbd..79d4642 100644
--- a/res-product/values-fi/strings.xml
+++ b/res-product/values-fi/strings.xml
@@ -58,12 +58,9 @@
<string name="security_settings_face_enroll_introduction_consent_message_0" product="default" msgid="9086377203303858619">"Anna lapselle lupa käyttää kasvojaan puhelimen lukituksen avaamiseen"</string>
<string name="security_settings_face_enroll_introduction_consent_message_0" product="tablet" msgid="4560949471246282574">"Anna lapselle lupa käyttää kasvojaan tabletin lukituksen avaamiseen"</string>
<string name="security_settings_face_enroll_introduction_consent_message_0" product="device" msgid="1156063265854416046">"Anna lapselle lupa käyttää kasvojaan laitteen lukituksen avaamiseen"</string>
- <!-- no translation found for security_settings_face_enroll_introduction_consent_message_0_class3 (5082581184108528408) -->
- <skip />
- <!-- no translation found for security_settings_face_enroll_introduction_consent_message_0_class3 (5932555218164668532) -->
- <skip />
- <!-- no translation found for security_settings_face_enroll_introduction_consent_message_0_class3 (8943878265098867810) -->
- <skip />
+ <string name="security_settings_face_enroll_introduction_consent_message_0_class3" product="default" msgid="5082581184108528408">"Anna lapselle lupa käyttää kasvojaan puhelimen lukituksen avaamiseen tai henkilöllisyyden todentamiseen esim. hänen kirjautuessaan sovelluksiin tai hyväksyessään ostoksen."</string>
+ <string name="security_settings_face_enroll_introduction_consent_message_0_class3" product="tablet" msgid="5932555218164668532">"Anna lapselle lupa käyttää kasvojaan tabletin lukituksen avaamiseen tai henkilöllisyyden todentamiseen, esim. hänen kirjautuessaan sovelluksiin tai hyväksyessään ostoksen."</string>
+ <string name="security_settings_face_enroll_introduction_consent_message_0_class3" product="device" msgid="8943878265098867810">"Anna lapselle lupa käyttää kasvojaan laitteen lukituksen avaamiseen tai henkilöllisyyden todentamiseen, esim. hänen kirjautuessaan sovelluksiin tai hyväksyessään ostoksen."</string>
<string name="security_settings_face_enroll_introduction_consent_message" product="default" msgid="3698558920963989416">"Puhelimen lukituksen avaaminen lapsen kasvojen avulla ei ehkä ole yhtä turvallista kuin vahvan kuvion tai PIN-koodin käyttö."</string>
<string name="security_settings_face_enroll_introduction_consent_message" product="tablet" msgid="2689983368730833505">"Tabletin lukituksen avaaminen lapsen kasvojen avulla ei ehkä ole yhtä turvallista kuin vahvan kuvion tai PIN-koodin käyttö."</string>
<string name="security_settings_face_enroll_introduction_consent_message" product="device" msgid="5768077532130409820">"Laitteen lukituksen avaaminen lapsen kasvojen avulla ei ehkä ole yhtä turvallista kuin vahvan kuvion tai PIN-koodin käyttö."</string>
diff --git a/res-product/values-in/strings.xml b/res-product/values-in/strings.xml
index 6cbbdb6..a42a68a 100644
--- a/res-product/values-in/strings.xml
+++ b/res-product/values-in/strings.xml
@@ -58,12 +58,9 @@
<string name="security_settings_face_enroll_introduction_consent_message_0" product="default" msgid="9086377203303858619">"Izinkan anak Anda menggunakan wajah untuk membuka kunci ponselnya"</string>
<string name="security_settings_face_enroll_introduction_consent_message_0" product="tablet" msgid="4560949471246282574">"Izinkan anak Anda menggunakan wajah untuk membuka kunci tabletnya"</string>
<string name="security_settings_face_enroll_introduction_consent_message_0" product="device" msgid="1156063265854416046">"Izinkan anak Anda menggunakan wajah untuk membuka kunci perangkatnya"</string>
- <!-- no translation found for security_settings_face_enroll_introduction_consent_message_0_class3 (5082581184108528408) -->
- <skip />
- <!-- no translation found for security_settings_face_enroll_introduction_consent_message_0_class3 (5932555218164668532) -->
- <skip />
- <!-- no translation found for security_settings_face_enroll_introduction_consent_message_0_class3 (8943878265098867810) -->
- <skip />
+ <string name="security_settings_face_enroll_introduction_consent_message_0_class3" product="default" msgid="5082581184108528408">"Izinkan anak Anda menggunakan wajahnya untuk membuka kunci ponsel atau memverifikasi dirinya. Hal ini dilakukan saat dia login ke aplikasi, menyetujui pembelian, dan lainnya."</string>
+ <string name="security_settings_face_enroll_introduction_consent_message_0_class3" product="tablet" msgid="5932555218164668532">"Izinkan anak Anda menggunakan wajahnya untuk membuka kunci tablet atau memverifikasi dirinya. Hal ini dilakukan saat dia login ke aplikasi, menyetujui pembelian, dan lainnya."</string>
+ <string name="security_settings_face_enroll_introduction_consent_message_0_class3" product="device" msgid="8943878265098867810">"Izinkan anak Anda menggunakan wajahnya untuk membuka kunci perangkat atau memverifikasi dirinya. Hal ini dilakukan saat dia login ke aplikasi, menyetujui pembelian, dan lainnya."</string>
<string name="security_settings_face_enroll_introduction_consent_message" product="default" msgid="3698558920963989416">"Menggunakan wajah anak Anda untuk membuka kunci ponselnya mungkin kurang aman dibandingkan dengan pola atau PIN yang kuat."</string>
<string name="security_settings_face_enroll_introduction_consent_message" product="tablet" msgid="2689983368730833505">"Menggunakan wajah anak Anda untuk membuka kunci tabletnya mungkin kurang aman dibandingkan dengan pola atau PIN yang kuat."</string>
<string name="security_settings_face_enroll_introduction_consent_message" product="device" msgid="5768077532130409820">"Menggunakan wajah anak Anda untuk membuka kunci perangkatnya mungkin kurang aman dibandingkan dengan pola atau PIN yang kuat."</string>
diff --git a/res-product/values-kk/strings.xml b/res-product/values-kk/strings.xml
index c30ab21..f3b1b58 100644
--- a/res-product/values-kk/strings.xml
+++ b/res-product/values-kk/strings.xml
@@ -58,12 +58,9 @@
<string name="security_settings_face_enroll_introduction_consent_message_0" product="default" msgid="9086377203303858619">"Балаңыз өз телефонын ашуы үшін, оған Бет тану функциясын қолдануына рұқсат беріңіз."</string>
<string name="security_settings_face_enroll_introduction_consent_message_0" product="tablet" msgid="4560949471246282574">"Балаңыз өз планшетін ашуы үшін, оған Бет тану функциясын қолдануына рұқсат беріңіз."</string>
<string name="security_settings_face_enroll_introduction_consent_message_0" product="device" msgid="1156063265854416046">"Балаңыз өз құрылғысын ашуы үшін, оған Бет тану функциясын қолдануына рұқсат беріңіз."</string>
- <!-- no translation found for security_settings_face_enroll_introduction_consent_message_0_class3 (5082581184108528408) -->
- <skip />
- <!-- no translation found for security_settings_face_enroll_introduction_consent_message_0_class3 (5932555218164668532) -->
- <skip />
- <!-- no translation found for security_settings_face_enroll_introduction_consent_message_0_class3 (8943878265098867810) -->
- <skip />
+ <string name="security_settings_face_enroll_introduction_consent_message_0_class3" product="default" msgid="5082581184108528408">"Балаңыз өз телефонын ашуы немесе жеке басын растауы үшін, оған бетін қолдануға рұқсат беріңіз. Ол қолданбаларға кіргенде, сатып алу транзакциясын мақұлдағанда және т.б. жағдайларда керек болады."</string>
+ <string name="security_settings_face_enroll_introduction_consent_message_0_class3" product="tablet" msgid="5932555218164668532">"Балаңыз өз планшетін ашуы немесе жеке басын растауы үшін, оған бетін қолдануға рұқсат беріңіз. Ол қолданбаларға кіргенде, сатып алу транзакциясын мақұлдағанда және т.б. жағдайларда керек болады."</string>
+ <string name="security_settings_face_enroll_introduction_consent_message_0_class3" product="device" msgid="8943878265098867810">"Балаңыз өз құрылғысын ашуы немесе жеке басын растауы үшін, оған бетін қолдануға рұқсат беріңіз. Ол қолданбаларға кіргенде, сатып алу транзакциясын мақұлдағанда және т.б. жағдайларда керек болады."</string>
<string name="security_settings_face_enroll_introduction_consent_message" product="default" msgid="3698558920963989416">"Телефонның құлпын баланың бетін пайдаланып ашу, қауіпсіздік тұрғысынан күрделі өрнекке немесе PIN кодына қарағанда әлсіздеу болуы мүмкін."</string>
<string name="security_settings_face_enroll_introduction_consent_message" product="tablet" msgid="2689983368730833505">"Планшеттің құлпын баланың бетін пайдаланып ашу, қауіпсіздік тұрғысынан күрделі өрнекке немесе PIN кодына қарағанда әлсіздеу болуы мүмкін."</string>
<string name="security_settings_face_enroll_introduction_consent_message" product="device" msgid="5768077532130409820">"Құрылғының құлпын баланың бетін пайдаланып ашу, қауіпсіздік тұрғысынан күрделі өрнекке немесе PIN кодына қарағанда әлсіздеу болуы мүмкін."</string>
diff --git a/res-product/values-mn/strings.xml b/res-product/values-mn/strings.xml
index 8358046..1574ca7 100644
--- a/res-product/values-mn/strings.xml
+++ b/res-product/values-mn/strings.xml
@@ -58,12 +58,9 @@
<string name="security_settings_face_enroll_introduction_consent_message_0" product="default" msgid="9086377203303858619">"Хүүхдэдээ царайгаа ашиглан утасныхаа түгжээг тайлахыг зөвшөөрнө үү"</string>
<string name="security_settings_face_enroll_introduction_consent_message_0" product="tablet" msgid="4560949471246282574">"Хүүхдэдээ царайгаа ашиглан таблетынхаа түгжээг тайлахыг зөвшөөрнө үү"</string>
<string name="security_settings_face_enroll_introduction_consent_message_0" product="device" msgid="1156063265854416046">"Хүүхдэдээ царайгаа ашиглан төхөөрөмжийнхөө түгжээг тайлахыг зөвшөөрнө үү"</string>
- <!-- no translation found for security_settings_face_enroll_introduction_consent_message_0_class3 (5082581184108528408) -->
- <skip />
- <!-- no translation found for security_settings_face_enroll_introduction_consent_message_0_class3 (5932555218164668532) -->
- <skip />
- <!-- no translation found for security_settings_face_enroll_introduction_consent_message_0_class3 (8943878265098867810) -->
- <skip />
+ <string name="security_settings_face_enroll_introduction_consent_message_0_class3" product="default" msgid="5082581184108528408">"Хүүхдэдээ царайгаа ашиглан утасныхаа түгжээг тайлах эсвэл өөрийгөө мөн болохыг баталгаажуулахыг зөвшөөрнө үү. Энэ нь түүнийг аппуудад нэвтрэх, худалдан авалтуудыг зөвшөөрөх болон бусад зүйлийг хийх үед тохиолдоно."</string>
+ <string name="security_settings_face_enroll_introduction_consent_message_0_class3" product="tablet" msgid="5932555218164668532">"Хүүхдэдээ царайгаа ашиглан таблетынхаа түгжээг тайлах эсвэл өөрийгөө мөн болохыг баталгаажуулахыг зөвшөөрнө үү. Энэ нь түүнийг аппуудад нэвтрэх, худалдан авалтуудыг зөвшөөрөх болон бусад зүйлийг хийх үед тохиолдоно."</string>
+ <string name="security_settings_face_enroll_introduction_consent_message_0_class3" product="device" msgid="8943878265098867810">"Хүүхдэдээ царайгаа ашиглан төхөөрөмжийнхөө түгжээг тайлах эсвэл өөрийгөө мөн болохыг баталгаажуулахыг зөвшөөрнө үү. Энэ нь түүнийг аппуудад нэвтрэх, худалдан авалтуудыг зөвшөөрөх болон бусад зүйлийг хийх үед тохиолдоно."</string>
<string name="security_settings_face_enroll_introduction_consent_message" product="default" msgid="3698558920963989416">"Хүүхдийнхээ царайг утасных нь түгжээг тайлахад ашиглах нь сайн хээ эсвэл ПИН-ээс хамгаалалт сул байж магадгүй."</string>
<string name="security_settings_face_enroll_introduction_consent_message" product="tablet" msgid="2689983368730833505">"Хүүхдийнхээ царайг таблетынх нь түгжээг тайлахад ашиглах нь сайн хээ эсвэл ПИН-ээс хамгаалалт сул байж магадгүй."</string>
<string name="security_settings_face_enroll_introduction_consent_message" product="device" msgid="5768077532130409820">"Хүүхдийнхээ царайг төхөөрөмжийнх нь түгжээг тайлахад ашиглах нь сайн хээ эсвэл ПИН-ээс хамгаалалт сул байж магадгүй."</string>
diff --git a/res-product/values-sl/strings.xml b/res-product/values-sl/strings.xml
index 8b037f8..fa82030 100644
--- a/res-product/values-sl/strings.xml
+++ b/res-product/values-sl/strings.xml
@@ -58,12 +58,9 @@
<string name="security_settings_face_enroll_introduction_consent_message_0" product="default" msgid="9086377203303858619">"Otroku dovolite odklepanje telefona z obrazom."</string>
<string name="security_settings_face_enroll_introduction_consent_message_0" product="tablet" msgid="4560949471246282574">"Otroku dovolite odklepanje tabličnega računalnika z obrazom."</string>
<string name="security_settings_face_enroll_introduction_consent_message_0" product="device" msgid="1156063265854416046">"Otroku dovolite odklepanje naprave z obrazom."</string>
- <!-- no translation found for security_settings_face_enroll_introduction_consent_message_0_class3 (5082581184108528408) -->
- <skip />
- <!-- no translation found for security_settings_face_enroll_introduction_consent_message_0_class3 (5932555218164668532) -->
- <skip />
- <!-- no translation found for security_settings_face_enroll_introduction_consent_message_0_class3 (8943878265098867810) -->
- <skip />
+ <string name="security_settings_face_enroll_introduction_consent_message_0_class3" product="default" msgid="5082581184108528408">"Otroku dovolite, da bo z obrazom odklepal telefon ali potrjeval svojo identiteto. To se zgodi, ko se prijavi v aplikacije, odobri nakup in drugo."</string>
+ <string name="security_settings_face_enroll_introduction_consent_message_0_class3" product="tablet" msgid="5932555218164668532">"Otroku dovolite, da bo z obrazom odklepal tablični računalnik ali potrjeval svojo identiteto. To se zgodi, ko se prijavi v aplikacije, odobri nakup in drugo."</string>
+ <string name="security_settings_face_enroll_introduction_consent_message_0_class3" product="device" msgid="8943878265098867810">"Otroku dovolite, da bo z obrazom odklepal napravo ali potrjeval svojo identiteto. To se zgodi, ko se prijavi v aplikacije, odobri nakup in drugo."</string>
<string name="security_settings_face_enroll_introduction_consent_message" product="default" msgid="3698558920963989416">"Če otrok odklepa telefon z obrazom, je to morda manj varno od zapletenega vzorca ali kode PIN."</string>
<string name="security_settings_face_enroll_introduction_consent_message" product="tablet" msgid="2689983368730833505">"Če otrok odklepa tablični računalnik z obrazom, je to morda manj varno od zapletenega vzorca ali kode PIN."</string>
<string name="security_settings_face_enroll_introduction_consent_message" product="device" msgid="5768077532130409820">"Če otrok odklepa napravo z obrazom, je to morda manj varno od zapletenega vzorca ali kode PIN."</string>
diff --git a/res-product/values-sr/strings.xml b/res-product/values-sr/strings.xml
index ce61d07..7e8ffd1 100644
--- a/res-product/values-sr/strings.xml
+++ b/res-product/values-sr/strings.xml
@@ -58,12 +58,9 @@
<string name="security_settings_face_enroll_introduction_consent_message_0" product="default" msgid="9086377203303858619">"Дозволите детету да користи откључавање телефона лицем"</string>
<string name="security_settings_face_enroll_introduction_consent_message_0" product="tablet" msgid="4560949471246282574">"Дозволите детету да користи откључавање таблета лицем"</string>
<string name="security_settings_face_enroll_introduction_consent_message_0" product="device" msgid="1156063265854416046">"Дозволите детету да користи откључавање уређаја лицем"</string>
- <!-- no translation found for security_settings_face_enroll_introduction_consent_message_0_class3 (5082581184108528408) -->
- <skip />
- <!-- no translation found for security_settings_face_enroll_introduction_consent_message_0_class3 (5932555218164668532) -->
- <skip />
- <!-- no translation found for security_settings_face_enroll_introduction_consent_message_0_class3 (8943878265098867810) -->
- <skip />
+ <string name="security_settings_face_enroll_introduction_consent_message_0_class3" product="default" msgid="5082581184108528408">"Дозволите детету да користи лице за откључавање телефона или потврду идентитета. Ово се дешава када се пријављује у апликације, одобрава куповину и у другим ситуацијама."</string>
+ <string name="security_settings_face_enroll_introduction_consent_message_0_class3" product="tablet" msgid="5932555218164668532">"Дозволите детету да користи лице за откључавање таблета или потврду идентитета. Ово се дешава када се пријављује у апликације, одобрава куповину и у другим ситуацијама."</string>
+ <string name="security_settings_face_enroll_introduction_consent_message_0_class3" product="device" msgid="8943878265098867810">"Дозволите детету да користи лице за откључавање уређаја или потврду идентитета. Ово се дешава када се пријављује у апликације, одобрава куповину и у другим ситуацијама."</string>
<string name="security_settings_face_enroll_introduction_consent_message" product="default" msgid="3698558920963989416">"Коришћење лица детета за откључавање телефона може да буде мање безбедно од јаког шаблона или PIN-а."</string>
<string name="security_settings_face_enroll_introduction_consent_message" product="tablet" msgid="2689983368730833505">"Коришћење лица детета за откључавање таблета може да буде мање безбедно од јаког шаблона или PIN-а."</string>
<string name="security_settings_face_enroll_introduction_consent_message" product="device" msgid="5768077532130409820">"Коришћење лица детета за откључавање уређаја може да буде мање безбедно од јаког шаблона или PIN-а."</string>
@@ -208,9 +205,9 @@
<string name="biometrics_unlock_title" product="device" msgid="3342994085226864170">"Можете да откључате уређај помоћу лица или отиска прста. Ова опција захтева резервни метод закључавања екрана из безбедносних разлога."</string>
<string name="encrypt_title" product="tablet" msgid="8915795247786124547">"Шифруј таблет"</string>
<string name="encrypt_title" product="default" msgid="511146128799853404">"Шифровање телефона"</string>
- <string name="suggested_lock_settings_summary" product="tablet" msgid="8821254377043173267">"Подесите закључавање екрана да бисте заштитили таблет"</string>
- <string name="suggested_lock_settings_summary" product="device" msgid="4863929838844014122">"Подесите закључавање екрана да бисте заштитили уређај"</string>
- <string name="suggested_lock_settings_summary" product="default" msgid="8050809409337082738">"Подесите закључавање екрана да бисте заштитили телефон"</string>
+ <string name="suggested_lock_settings_summary" product="tablet" msgid="8821254377043173267">"Подесите откључавање екрана да бисте заштитили таблет"</string>
+ <string name="suggested_lock_settings_summary" product="device" msgid="4863929838844014122">"Подесите откључавање екрана да бисте заштитили уређај"</string>
+ <string name="suggested_lock_settings_summary" product="default" msgid="8050809409337082738">"Подесите откључавање екрана да бисте заштитили телефон"</string>
<string name="suggested_fingerprint_lock_settings_summary" product="tablet" msgid="8565330205932332157"></string>
<string name="suggested_fingerprint_lock_settings_summary" product="device" msgid="8565330205932332157"></string>
<string name="suggested_fingerprint_lock_settings_summary" product="default" msgid="8565330205932332157"></string>
diff --git a/res-product/values-te/strings.xml b/res-product/values-te/strings.xml
index 4184745..f1c7ce6 100644
--- a/res-product/values-te/strings.xml
+++ b/res-product/values-te/strings.xml
@@ -119,13 +119,13 @@
<string name="security_settings_fingerprint_v2_enroll_introduction_footer_message_consent_3" product="default" msgid="6804981319922169283">"వారు Pixel Imprintను ఉపయోగించినప్పుడు, వారి వేలిముద్ర మోడల్ను అప్డేట్ చేయడానికి ఇమేజ్లు ఉపయోగించబడతాయి. మీ చిన్నారి వేలిముద్ర మోడల్ను క్రియేట్ చేయడానికి ఉపయోగించే ఇమేజ్లు ఎప్పుడూ స్టోర్ చేయబడవు, కానీ వేలిముద్ర మోడల్ ఫోన్లో సురక్షితంగా స్టోర్ చేయబడుతుంది, ఫోన్ నుండి బయటకు పంపబడదు. మొత్తం ప్రాసెస్ విధానం ఫోన్లో సురక్షితంగా జరుగుతుంది."</string>
<string name="security_settings_fingerprint_v2_enroll_introduction_footer_message_consent_3" product="tablet" msgid="1426913673720862863">"వారు Pixel Imprintను ఉపయోగించినప్పుడు, వారి వేలిముద్ర మోడల్ను అప్డేట్ చేయడానికి ఇమేజ్లు ఉపయోగించబడతాయి. మీ చిన్నారి వేలిముద్ర మోడల్ను క్రియేట్ చేయడానికి ఉపయోగించే ఇమేజ్లు ఎప్పుడూ స్టోర్ చేయబడవు, కానీ వేలిముద్ర మోడల్ టాబ్లెట్లో సురక్షితంగా స్టోర్ చేయబడుతుంది, టాబ్లెట్ నుండి బయటకు పంపబడదు. మొత్తం ప్రాసెస్ విధానం టాబ్లెట్లో సురక్షితంగా జరుగుతుంది."</string>
<string name="security_settings_fingerprint_v2_enroll_introduction_footer_message_consent_3" product="device" msgid="2631789126811300879">"వారు Pixel Imprintను ఉపయోగించినప్పుడు, వారి వేలిముద్ర మోడల్ను అప్డేట్ చేయడానికి ఇమేజ్లు ఉపయోగించబడతాయి. మీ చిన్నారి వేలిముద్ర మోడల్ను క్రియేట్ చేయడానికి ఉపయోగించే ఇమేజ్లు ఎప్పుడూ స్టోర్ చేయబడవు, కానీ వేలిముద్ర మోడల్ పరికరంలో సురక్షితంగా స్టోర్ చేయబడుతుంది, పరికరం నుండి బయటకు పంపబడదు. మొత్తం ప్రాసెస్ విధానం పరికరంలో సురక్షితంగా జరుగుతుంది."</string>
- <string name="security_settings_fingerprint_v2_enroll_introduction_footer_message_4" product="default" msgid="1354488801088258040">"మీరు సెట్టింగ్లలో ఎప్పుడైనా మీ వేలిముద్ర ఇమేజ్లను, మోడల్ను తొలగించవచ్చు లేదా \'వేలిముద్ర అన్లాక్\'ను ఆఫ్ చేయవచ్చు. వేలిముద్ర ఇమేజ్లు, మోడల్లు మీరు వాటిని తొలగించే వరకు ఫోన్లో స్టోర్ చేయబడతాయి."</string>
+ <string name="security_settings_fingerprint_v2_enroll_introduction_footer_message_4" product="default" msgid="1354488801088258040">"మీరు సెట్టింగ్లలో ఎప్పుడైనా మీ వేలిముద్ర ఇమేజ్లను, మోడల్ను తొలగించవచ్చు లేదా \'వేలిముద్ర అన్లాక్\'ను ఆఫ్ చేయవచ్చు. వేలిముద్ర ఇమేజ్లు, మోడల్లను మీరు తొలగించే వరకు ఫోన్లో స్టోర్ చేయబడతాయి."</string>
<string name="security_settings_fingerprint_v2_enroll_introduction_footer_message_4" product="tablet" msgid="8207309581266022275">"మీరు సెట్టింగ్లలో ఎప్పుడైనా మీ వేలిముద్ర ఇమేజ్లను, మోడల్ను తొలగించవచ్చు లేదా \'వేలిముద్ర అన్లాక్\'ను ఆఫ్ చేయవచ్చు. వేలిముద్ర ఇమేజ్లు, మోడల్లు మీరు వాటిని తొలగించే వరకు టాబ్లెట్లో స్టోర్ చేయబడతాయి."</string>
<string name="security_settings_fingerprint_v2_enroll_introduction_footer_message_4" product="device" msgid="2498580070051496133">"మీరు సెట్టింగ్లలో ఎప్పుడైనా మీ వేలిముద్ర ఇమేజ్లను, మోడల్ను తొలగించవచ్చు లేదా \'వేలిముద్ర అన్లాక్\'ను ఆఫ్ చేయవచ్చు. వేలిముద్ర ఇమేజ్లు, మోడల్లు మీరు వాటిని తొలగించే వరకు పరికరంలో స్టోర్ చేయబడతాయి."</string>
<string name="security_settings_fingerprint_v2_enroll_introduction_footer_message_consent_4" product="default" msgid="5003753461032107715">"మీరు మరియు మీ చిన్నారి వారి వేలిముద్ర ఇమేజ్లను, మోడల్ను తొలగించవచ్చు లేదా సెట్టింగ్లలో ఎప్పుడైనా వేలిముద్ర అన్లాక్ను ఆఫ్ చేయవచ్చు. వేలిముద్ర ఇమేజ్లు అలాగే మోడల్లు తొలగించబడే వరకు ఫోన్లో స్టోర్ చేయబడతాయి."</string>
<string name="security_settings_fingerprint_v2_enroll_introduction_footer_message_consent_4" product="tablet" msgid="8772005555323461143">"మీరు మరియు మీ చిన్నారి వారి వేలిముద్ర ఇమేజ్లను, మోడల్ను తొలగించవచ్చు లేదా సెట్టింగ్లలో ఎప్పుడైనా వేలిముద్ర అన్లాక్ను ఆఫ్ చేయవచ్చు. వేలిముద్ర ఇమేజ్లు అలాగే మోడల్లు తొలగించబడే వరకు టాబ్లెట్లో స్టోర్ చేయబడతాయి."</string>
<string name="security_settings_fingerprint_v2_enroll_introduction_footer_message_consent_4" product="device" msgid="7254955922685507093">"మీరు మరియు మీ చిన్నారి వారి వేలిముద్ర ఇమేజ్లను, మోడల్ను తొలగించవచ్చు లేదా సెట్టింగ్లలో ఎప్పుడైనా వేలిముద్ర అన్లాక్ను ఆఫ్ చేయవచ్చు. వేలిముద్ర ఇమేజ్లు అలాగే మోడల్లు తొలగించబడే వరకు పరికరంలో స్టోర్ చేయబడతాయి."</string>
- <string name="security_settings_fingerprint_v2_enroll_introduction_footer_message_5" product="default" msgid="6272159089589340181">"మీరు అనుకోని సందర్భాలలో కూడా, మీ వేలి వద్దకు స్క్రీన్ను తీసుకురావడం ద్వారా ఇతరులు కూడా అన్లాక్ చేయగలుగుతారు."</string>
+ <string name="security_settings_fingerprint_v2_enroll_introduction_footer_message_5" product="default" msgid="6272159089589340181">"మీకు తెలియకుండా ఇతరులు మీ వేలి వద్దకు ఫోన్ స్క్రీన్ను తెచ్చి తాకించి దానిని అన్లాక్ చేయగలుగుతారు."</string>
<string name="security_settings_fingerprint_v2_enroll_introduction_footer_message_5" product="tablet" msgid="2420109998272019149">"మీ టాబ్లెట్ను మీరు అన్లాక్ చేయకూడదనుకున్నప్పుడు కూడా ఎవరైనా దానిని మీ వేలి వద్దకు స్క్రీన్ను తీసుకురావడం ద్వారా అన్లాక్ చేయవచ్చు."</string>
<string name="security_settings_fingerprint_v2_enroll_introduction_footer_message_5" product="device" msgid="5915844445830045866">"మీ పరికరాన్ని మీరు అన్లాక్ చేయకూడదనుకున్నప్పుడు కూడా ఎవరైనా దానిని మీ వేలి వద్దకు స్క్రీన్ను తీసుకురావడం ద్వారా అన్లాక్ చేయవచ్చు."</string>
<string name="security_settings_fingerprint_v2_enroll_introduction_footer_message_consent_5" product="default" msgid="6556725426776167791">"కొంతమంది వారి వేలిని పట్టుకొని దాని దగ్గరకు తీసుకొచ్చినట్లు, మీ చిన్నారి ఫోన్ను ఉద్దేశం లేకపోయినప్పటికీ అన్లాక్ చేసే అవకాశం ఉండవచ్చు."</string>
diff --git a/res-product/values-zh-rTW/strings.xml b/res-product/values-zh-rTW/strings.xml
index a06b68e..cea25ce 100644
--- a/res-product/values-zh-rTW/strings.xml
+++ b/res-product/values-zh-rTW/strings.xml
@@ -145,7 +145,7 @@
<string name="lock_screen_intro_skip_dialog_text" product="default" msgid="8970036878014302990">"裝置保護功能將不會開啟。在這種情況下,你無法在這支手機遺失或遭竊時,防止其他人使用手機。"</string>
<string name="security_settings_sfps_enroll_find_sensor_message" product="tablet" msgid="2006739081527422127">"指紋感應器在電源鍵上。電源鍵形狀扁平,位在平板電腦側邊的調高音量按鈕旁。"</string>
<string name="security_settings_sfps_enroll_find_sensor_message" product="device" msgid="1209233633252372907">"指紋感應器在電源鍵上。電源鍵形狀扁平,位在裝置側邊的調高音量按鈕旁。"</string>
- <string name="security_settings_sfps_enroll_find_sensor_message" product="default" msgid="6862493139500275821">"指紋感應器在電源鍵上。電源鍵形狀扁平,位在手機側邊的調高音量按鈕旁。"</string>
+ <string name="security_settings_sfps_enroll_find_sensor_message" product="default" msgid="6862493139500275821">"指紋感應器在電源鍵上。電源鍵形狀扁平,位在手機側邊的調高音量鍵旁。"</string>
<string name="security_settings_fingerprint_enroll_finish_v2_message" product="tablet" msgid="2012126789397819713">"現在只要使用自己的指紋就能解鎖平板電腦或驗證身分,以便執行某些特定操作,例如登入應用程式或核准購買交易"</string>
<string name="security_settings_fingerprint_enroll_finish_v2_message" product="device" msgid="7119860465479161782">"現在只要使用自己的指紋就能解鎖裝置或驗證身分,以便執行某些特定操作,例如登入應用程式或核准購買交易"</string>
<string name="security_settings_fingerprint_enroll_finish_v2_message" product="default" msgid="8255422287180693200">"現在只要使用自己的指紋就能解鎖手機或驗證身分,以便執行某些特定操作,例如登入應用程式或核准購買交易"</string>
diff --git a/res/layout-land/udfps_enroll_enrolling.xml b/res/layout-land/udfps_enroll_enrolling.xml
deleted file mode 100644
index 743684f..0000000
--- a/res/layout-land/udfps_enroll_enrolling.xml
+++ /dev/null
@@ -1,101 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- Copyright (C) 2021 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<com.google.android.setupdesign.GlifLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/setup_wizard_layout"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:layout="@layout/sud_glif_blank_template"
- style="?attr/fingerprint_layout_theme">
-
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="horizontal"
- android:clipToPadding="false"
- android:clipChildren="false">
-
- <!-- Both texts are kept as separate text views so it doesn't jump around in portrait.
- See layouts/fingerprint_enroll_enrolling_base.xml. -->
- <LinearLayout
- android:id="@+id/layout_container"
- android:layout_width="0dp"
- android:layout_weight="1"
- android:layout_height="match_parent"
- android:layout_marginStart="?attr/sudMarginStart"
- android:layout_marginEnd="@dimen/enroll_margin_end"
- android:layout_marginBottom="@dimen/sud_content_frame_padding_bottom"
- android:paddingStart="@dimen/enroll_padding_start"
- android:paddingEnd="@dimen/enroll_padding_end"
- android:clipChildren="false"
- android:clipToPadding="false"
- android:orientation="vertical">
-
- <ScrollView
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:clipChildren="false"
- android:clipToPadding="false"
- android:fillViewport="true">
-
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:orientation="vertical"
- android:clipChildren="false"
- android:clipToPadding="false">
-
- <ImageView
- android:id="@+id/sud_layout_icon"
- style="@style/SudGlifIcon"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:scaleType="fitStart"
- android:layout_marginStart="0dp"
- android:layout_marginEnd="0dp"
- android:src="@drawable/ic_lock" />
-
- <TextView
- android:id="@+id/suc_layout_title"
- style="@style/SudGlifHeaderTitle"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_marginStart="0dp"
- android:layout_marginEnd="0dp" />
-
- <TextView
- style="@style/SudDescription.Glif"
- android:id="@+id/sud_layout_subtitle"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"/>
-
- <Space
- android:layout_width="0dp"
- android:layout_height="0dp"
- android:layout_weight="1" />
-
- </LinearLayout>
-
- </ScrollView>
-
- </LinearLayout>
-
- </LinearLayout>
-
- <include layout="@layout/udfps_enroll_view" />
-</com.google.android.setupdesign.GlifLayout>
\ No newline at end of file
diff --git a/res/layout/preference_external_action_icon.xml b/res/layout/preference_external_action_icon.xml
new file mode 100644
index 0000000..fcec430
--- /dev/null
+++ b/res/layout/preference_external_action_icon.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2023 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.
+-->
+
+<ImageView
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:src="@drawable/ic_chevron_right_24dp"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginHorizontal="8dp" />
\ No newline at end of file
diff --git a/res/layout/udfps_enroll_enrolling.xml b/res/layout/udfps_enroll_enrolling.xml
index 05556ff..366a87c 100644
--- a/res/layout/udfps_enroll_enrolling.xml
+++ b/res/layout/udfps_enroll_enrolling.xml
@@ -15,7 +15,7 @@
~ limitations under the License.
-->
-<com.google.android.setupdesign.GlifLayout
+<com.android.settings.biometrics.fingerprint.UdfpsEnrollEnrollingView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
@@ -78,4 +78,4 @@
</LinearLayout>
</LinearLayout>
-</com.google.android.setupdesign.GlifLayout>
+</com.android.settings.biometrics.fingerprint.UdfpsEnrollEnrollingView>
diff --git a/res/layout/udfps_enroll_view.xml b/res/layout/udfps_enroll_view.xml
index 6bf339b..bd62609 100644
--- a/res/layout/udfps_enroll_view.xml
+++ b/res/layout/udfps_enroll_view.xml
@@ -18,7 +18,8 @@
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/udfps_animation_view"
android:layout_width="match_parent"
- android:layout_height="match_parent">
+ android:layout_height="match_parent"
+ android:visibility="gone">
<ImageView
android:id="@+id/udfps_enroll_animation_fp_progress_view"
diff --git a/res/values-am/strings.xml b/res/values-am/strings.xml
index de6fd9c..3bfad97 100644
--- a/res/values-am/strings.xml
+++ b/res/values-am/strings.xml
@@ -4653,10 +4653,8 @@
<string name="ingress_rate_limit_no_limit_entry" msgid="8741098826008012163">"ምንም ገደብ የለም"</string>
<string name="disable_phantom_process_monitor_title" msgid="8348108346706188771">"ልጅ የሂደቶች ገደቦችን ያሰናክሉ"</string>
<string name="disable_phantom_process_monitor_summary" msgid="3044464635550256985">"የመተግበሪያው ልጅ ሂደቶቹ ላይ ያሉ የሥርዓት ንብረት አጠቃቀም ገደቦችን ያሰናክሉ"</string>
- <!-- no translation found for enable_notes_role_title (7662702013496114763) -->
- <skip />
- <!-- no translation found for enable_notes_role_summary (136916915155048249) -->
- <skip />
+ <string name="enable_notes_role_title" msgid="7662702013496114763">"የማስታወሻዎች ሚናን በግዳጅ ያንቁ"</string>
+ <string name="enable_notes_role_summary" msgid="136916915155048249">"በማስታወሻዎች ሚና በኩል ማስታወሻ የመውሰጃ ሥርዓት ውህደቶችን ያንቁ። የማስታወሻዎች ሚና አስቀድሞ ከነቃ ምንም አያድርጉ።"</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-ar/strings.xml b/res/values-ar/strings.xml
index efd22ae..0557846 100644
--- a/res/values-ar/strings.xml
+++ b/res/values-ar/strings.xml
@@ -3249,12 +3249,12 @@
<string name="notification_listener_security_warning_summary" msgid="1131986567509818121">"سيكون بإمكان \"<xliff:g id="NOTIFICATION_LISTENER_NAME">%1$s</xliff:g>\" قراءة جميع الإشعارات، بما في ذلك المعلومات الشخصية، مثلاً أسماء جهات الاتصال والصور ونصوص الرسائل التي تتلقّاها. وسيتمكن هذا التطبيق أيضًا من تأجيل الإشعارات أو إغلاقها أو اتخاذ إجراءات من خلال الأزرار في الإشعارات بما في ذلك الردّ على المكالمات الهاتفية. \n\nسيتيح هذا أيضًا للتطبيق إمكانية تفعيل ميزة \"عدم الإزعاج\" أو إيقافها وتغيير الإعدادات ذات الصلة."</string>
<string name="nls_warning_prompt" msgid="1486887096703743841">"سيتمكن التطبيق \"<xliff:g id="NOTIFICATION_LISTENER_NAME">%1$s</xliff:g>\" من إجراء ما يلي:"</string>
<string name="nls_feature_read_title" msgid="7629713268744220437">"قراءة الإشعارات"</string>
- <string name="nls_feature_read_summary" msgid="1064698238110273593">"يمكنها قراءة الإشعارات، بما في ذلك المعلومات الشخصية، مثل جهات الاتصال والرسائل والصور."</string>
+ <string name="nls_feature_read_summary" msgid="1064698238110273593">"يمكنه قراءة الإشعارات، بما في ذلك المعلومات الشخصية، مثل جهات الاتصال والرسائل والصور."</string>
<string name="nls_feature_reply_title" msgid="7925455553821362039">"الردّ على الرسائل"</string>
- <string name="nls_feature_reply_summary" msgid="4492543411395565556">"يمكنها الردّ على الرسائل واتخاذ إجراءات من خلال الأزرار في الإشعارات، بما في ذلك تأجيل الإشعارات أو إغلاقها والردّ على المكالمات."</string>
+ <string name="nls_feature_reply_summary" msgid="4492543411395565556">"يمكنه الردّ على الرسائل واتخاذ إجراءات من خلال الأزرار في الإشعارات، بما في ذلك تأجيل الإشعارات أو إغلاقها والردّ على المكالمات."</string>
<string name="nls_feature_settings_title" msgid="8208164329853194414">"تغيير الإعدادات"</string>
- <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="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="notif_type_ongoing" msgid="135675014223627555">"الوقت الفعلي"</string>
@@ -3275,7 +3275,7 @@
<string name="notif_listener_more_settings_desc" msgid="7995492074281663658">"تتوفّر إعدادات إضافية داخل التطبيق."</string>
<string name="vr_listeners_title" msgid="4960357292472540964">"خدمات مساعد الواقع الافتراضي"</string>
<string name="no_vr_listeners" msgid="8442646085375949755">"لم تطلب أي تطبيقات مثبَّتة أن يتم تشغيلها كخدمات مساعد واقع افتراضي."</string>
- <string name="vr_listener_security_warning_title" msgid="7026351795627615177">"هل تريد السماح لخدمة <xliff:g id="SERVICE">%1$s</xliff:g> بالوصول إلى خدمة الواقع الافتراضي؟"</string>
+ <string name="vr_listener_security_warning_title" msgid="7026351795627615177">"هل تريد السماح لخدمة \"<xliff:g id="SERVICE">%1$s</xliff:g>\" بالوصول إلى خدمة الواقع الافتراضي؟"</string>
<string name="vr_listener_security_warning_summary" msgid="1888843557687017791">"لن يتمكن <xliff:g id="VR_LISTENER_NAME">%1$s</xliff:g> من العمل عند استخدامك تطبيقات في وضع الواقع الافتراضي."</string>
<string name="display_vr_pref_title" msgid="4850474436291113569">"الجهاز في وضع الواقع الافتراضي"</string>
<string name="display_vr_pref_low_persistence" msgid="7039841277157739871">"خفض التعتيم (مستحسن)"</string>
@@ -3285,7 +3285,7 @@
<string name="picture_in_picture_keywords" msgid="3605379820551656253">"صورة، شاشة، صورة داخل صورة"</string>
<string name="picture_in_picture_app_detail_title" msgid="4442235098255164650">"نافذة ضمن النافذة"</string>
<string name="picture_in_picture_app_detail_switch" msgid="8544190716075624017">"السماح بعرض نافذة ضمن النافذة"</string>
- <string name="picture_in_picture_app_detail_summary" msgid="2503211101305358849">"يمكنك السماح لهذا التطبيق بإنشاء نافذة ضمن نافذة أثناء فتح التطبيق أو بعد مغادرته (على سبيل المثال، لمتابعة مشاهدة فيديو)، علمًا بأن هذه النافذة تظهر فوق التطبيقات الأخرى التي تستخدمها."</string>
+ <string name="picture_in_picture_app_detail_summary" msgid="2503211101305358849">"يمكنك السماح لهذا التطبيق بإنشاء نافذة ضمن نافذة أثناء فتح التطبيق أو بعد مغادرته (على سبيل المثال، لمتابعة مشاهدة فيديو)، علمًا بأنّ هذه النافذة تظهر فوق التطبيقات الأخرى التي تستخدمها."</string>
<string name="interact_across_profiles_title" msgid="7285906999927669971">"الربط بين تطبيقات العمل والتطبيقات الشخصية"</string>
<string name="interact_across_profiles_summary_allowed" msgid="1365881452153799092">"مرتبط"</string>
<string name="interact_across_profiles_summary_not_allowed" msgid="5802674212788171790">"غير مرتبط"</string>
@@ -3646,7 +3646,7 @@
<string name="zen_access_warning_dialog_title" msgid="6323325813123130154">"هل تسمح بوصول \"<xliff:g id="APP">%1$s</xliff:g>\" إلى إعداد \"عدم الإزعاج\"؟"</string>
<string name="zen_access_warning_dialog_summary" msgid="8468714854067428987">"سيكون التطبيق قادرًا على تفعيل/إيقاف ميزة \"عدم الإزعاج\" وإجراء تغييرات على الإعدادات ذات الصلة."</string>
<string name="zen_access_disabled_package_warning" msgid="6565908224294537889">"يجب أن يظل قيد التفعيل نظرًا لأن الوصول إلى الإشعارات قيد التفعيل"</string>
- <string name="zen_access_revoke_warning_dialog_title" msgid="7377261509261811449">"هل تريد إبطال إمكانية وصول تطبيق <xliff:g id="APP">%1$s</xliff:g> إلى قواعد \"عدم الإزعاج\"؟"</string>
+ <string name="zen_access_revoke_warning_dialog_title" msgid="7377261509261811449">"هل تريد إبطال إمكانية وصول تطبيق \"<xliff:g id="APP">%1$s</xliff:g>\" إلى إعداد \"عدم الإزعاج\"؟"</string>
<string name="zen_access_revoke_warning_dialog_summary" msgid="8689801842914183595">"ستتم إزالة كل قواعد \"عدم الإزعاج\" التي أنشأها هذا التطبيق."</string>
<string name="ignore_optimizations_on" msgid="6865583039303804932">"عدم تحسين"</string>
<string name="ignore_optimizations_off" msgid="9186557038453586295">"تحسين"</string>
@@ -3664,7 +3664,7 @@
<string name="filter_manage_external_storage" msgid="6751640571715343804">"يمكن الوصول إلى كل الملفات"</string>
<string name="full_screen_intent_title" msgid="1068024949389956404">"إدارة الرسائل بملء الشاشة"</string>
<string name="permit_full_screen_intent" msgid="2251949245519201421">"السماح للتطبيقات بإرسال رسائل بملء الشاشة"</string>
- <string name="footer_description_full_screen_intent" msgid="8322826300555418227">"السماح لهذا التطبيق بإرسال إشعارات رسائل بملء الشاشة تغطي الشاشة بأكملها"</string>
+ <string name="footer_description_full_screen_intent" msgid="8322826300555418227">"يمكنك السماح لهذا التطبيق بإرسال إشعارات رسائل بملء الشاشة تغطي الشاشة بأكملها."</string>
<string name="media_management_apps_title" msgid="8222942355578724582">"تطبيقات إدارة الوسائط"</string>
<string name="media_management_apps_toggle_label" msgid="166724270857067456">"السماح للتطبيق بإدارة الوسائط"</string>
<string name="media_management_apps_description" msgid="8000565658455268524">"في حال السماح لهذا التطبيق، يمكنه بدون طلب موافقتك تعديل أو حذف ملفات الوسائط التي يتم إنشاؤها باستخدام تطبيقات أخرى. يجب أن يتوفّر للتطبيق الإذن بالوصول إلى الملفات والوسائط."</string>
diff --git a/res/values-b+sr+Latn/strings.xml b/res/values-b+sr+Latn/strings.xml
index 7352ee9..528ecc3 100644
--- a/res/values-b+sr+Latn/strings.xml
+++ b/res/values-b+sr+Latn/strings.xml
@@ -481,9 +481,9 @@
<string name="fingerprint_last_delete_message_profile_challenge" msgid="4104208067277655068">"Nećete moći da koristite otisak prsta za otključavanje poslovnog profila, ovlašćivanje kupovina ili prijavljivanje u poslovne aplikacije."</string>
<string name="encryption_settings_title" msgid="2848716008695618360">"Šifrovanje"</string>
<string name="encrypted_summary" msgid="545623487587251207">"Šifrovano"</string>
- <string name="no_screen_lock_issue_title" msgid="1814109590692792891">"Podesite zaključavanje ekrana"</string>
+ <string name="no_screen_lock_issue_title" msgid="1814109590692792891">"Podesite otključavanje ekrana"</string>
<string name="no_screen_lock_issue_summary" msgid="2383217853510608406">"Da biste poboljšali bezbednost, podesite PIN, šablon ili lozinku za ovaj uređaj"</string>
- <string name="no_screen_lock_issue_action_label" msgid="2691229130486382863">"Podesi zaključavanje ekrana"</string>
+ <string name="no_screen_lock_issue_action_label" msgid="2691229130486382863">"Podesi otključavanje ekrana"</string>
<string name="no_screen_lock_issue_notification_title" msgid="5718363966239208505">"Uređaj nema zaključavanje ekrana"</string>
<string name="no_screen_lock_issue_notification_text" msgid="8696194459170873345">"Da biste poboljšali bezbednost, podesite PIN, šablon ili lozinku za ovaj uređaj"</string>
<string name="suggested_lock_settings_title" msgid="7836065447159730217">"Zaštitite telefon"</string>
@@ -4655,10 +4655,8 @@
<string name="ingress_rate_limit_no_limit_entry" msgid="8741098826008012163">"Bez ograničenja"</string>
<string name="disable_phantom_process_monitor_title" msgid="8348108346706188771">"Onemogući ograničenja za podređene procese"</string>
<string name="disable_phantom_process_monitor_summary" msgid="3044464635550256985">"Onemogućite ograničenja korišćenja resursa sistema za podređene procese aplikacije"</string>
- <!-- no translation found for enable_notes_role_title (7662702013496114763) -->
- <skip />
- <!-- no translation found for enable_notes_role_summary (136916915155048249) -->
- <skip />
+ <string name="enable_notes_role_title" msgid="7662702013496114763">"Prinudno omogući ulogu Beleške"</string>
+ <string name="enable_notes_role_summary" msgid="136916915155048249">"Omogućite integracije pravljenja beležaka u sistemu pomoću uloge Beleške. Ako je uloga Beleške već omogućena, ne preduzimajte ništa."</string>
<string name="bluetooth_broadcast_dialog_title" msgid="9172775308463135884">"Emitujte"</string>
<string name="bluetooth_broadcast_dialog_broadcast_app" msgid="1016617579194329005">"Emitujte <xliff:g id="CURRENTAPP">%1$s</xliff:g>"</string>
<string name="bluetooth_broadcast_dialog_find_message" msgid="6621660851669953883">"Slušajte emitovanja koja se puštaju u blizini"</string>
diff --git a/res/values-bg/strings.xml b/res/values-bg/strings.xml
index 85409f2..977f9a3 100644
--- a/res/values-bg/strings.xml
+++ b/res/values-bg/strings.xml
@@ -3247,7 +3247,7 @@
<string name="notification_assistant_security_warning_summary" msgid="4846559755787348129">"Адаптивните известия бяха заменени от функцията за подобрени известия в Android 12. Тя показва предложени действия и отговори и организира известията ви. \n\nФункцията може да осъществява достъп до съдържанието в известията, включително личната информация, като например имената на контактите и текстовите съобщения. Тя има възможност да отхвърля известията или да предприема действия в тях, като например приемане на телефонни обаждания или контролиране на режима „Не безпокойте“."</string>
<string name="notification_listener_security_warning_title" msgid="5791700876622858363">"Да се разреши ли достъпът до известията за „<xliff:g id="SERVICE">%1$s</xliff:g>“?"</string>
<string name="notification_listener_security_warning_summary" msgid="1131986567509818121">"Приложението <xliff:g id="NOTIFICATION_LISTENER_NAME">%1$s</xliff:g> ще може да чете всички известия, включително личната информация, като например имената на контактите, снимките и текста на съобщенията, които получавате. Това приложение ще може също да отлага или отхвърля известия и да взаимодейства с бутоните в тях, включително да отговаря на телефонни обаждания. \n\nПриложението ще може също да включва и изключва режима „Не безпокойте“, както и да променя свързаните с него настройки."</string>
- <string name="nls_warning_prompt" msgid="1486887096703743841">"Приложението <xliff:g id="NOTIFICATION_LISTENER_NAME">%1$s</xliff:g> ще може да:"</string>
+ <string name="nls_warning_prompt" msgid="1486887096703743841">"Приложението <xliff:g id="NOTIFICATION_LISTENER_NAME">%1$s</xliff:g> ще може следното:"</string>
<string name="nls_feature_read_title" msgid="7629713268744220437">"Четене на известия"</string>
<string name="nls_feature_read_summary" msgid="1064698238110273593">"Може да чете известията ви, включително личната информация, като например контактите, съобщенията и снимките."</string>
<string name="nls_feature_reply_title" msgid="7925455553821362039">"Отговаряне на съобщения"</string>
@@ -3664,7 +3664,7 @@
<string name="filter_manage_external_storage" msgid="6751640571715343804">"Може да осъществява достъп до всички файлове"</string>
<string name="full_screen_intent_title" msgid="1068024949389956404">"Управление на намеренията за цял екран"</string>
<string name="permit_full_screen_intent" msgid="2251949245519201421">"Разрешаване на приложенията да изпращат намерения за цял екран"</string>
- <string name="footer_description_full_screen_intent" msgid="8322826300555418227">"Разрешете на това приложение да изпраща намерения за известия, които заемат целия екран."</string>
+ <string name="footer_description_full_screen_intent" msgid="8322826300555418227">"Разрешете на това приложение да изпраща известия за намерения, които заемат целия екран."</string>
<string name="media_management_apps_title" msgid="8222942355578724582">"Приложения за управление на мултимедията"</string>
<string name="media_management_apps_toggle_label" msgid="166724270857067456">"Разрешаване на прил. да управл. мултимедията"</string>
<string name="media_management_apps_description" msgid="8000565658455268524">"Ако е разрешено, това приложение може да променя или изтрива мултимедийните файлове, създадени чрез други приложения, без да ви попита. То трябва да има разрешение за достъп до файловете и мултимедията."</string>
@@ -3812,7 +3812,7 @@
<string name="battery_saver_on_summary" msgid="4605146593966255848">"Вкл."</string>
<string name="battery_saver_off_scheduled_summary" msgid="2193875981740829819">"Ще се включи при <xliff:g id="BATTERY_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="battery_saver_off_summary" msgid="4411561435493109261">"Изкл."</string>
- <string name="app_battery_usage_title" msgid="346558380609793334">"Използване на батерията от приложението"</string>
+ <string name="app_battery_usage_title" msgid="346558380609793334">"Използване на батерията от приложения"</string>
<string name="app_battery_usage_summary" msgid="6349965904306339539">"Задаване на използв. на батерията за приложенията"</string>
<string name="filter_battery_unrestricted_title" msgid="821027369424198223">"Неограничено"</string>
<string name="filter_battery_optimized_title" msgid="8236647176487754796">"Оптимизирано"</string>
@@ -4145,7 +4145,7 @@
<string name="my_device_info_device_identifiers_category_title" msgid="2197063484127704153">"Идентификатори на устройството"</string>
<string name="change_wifi_state_title" msgid="5629648102837821525">"Управление на Wi-Fi"</string>
<string name="change_wifi_state_app_detail_switch" msgid="1385358508267180745">"Разрешаване на приложението да управлява Wi-Fi"</string>
- <string name="change_wifi_state_app_detail_summary" msgid="8230854855584217111">"Разрешаване на това приложение да включва и изключва Wi-Fi, да сканира за Wi-Fi мрежи и да се свързва с тях, да добавя или премахва мрежи и да стартира точки за достъп само на локално ниво"</string>
+ <string name="change_wifi_state_app_detail_summary" msgid="8230854855584217111">"Разрешете на това приложение да включва и изключва Wi-Fi, да сканира за Wi-Fi мрежи и да се свързва с тях, да добавя или премахва мрежи и да стартира точки за достъп само на локално ниво."</string>
<string name="change_nfc_tag_apps_title" msgid="91514009058149617">"Стартиране чрез NFC"</string>
<string name="change_nfc_tag_apps_detail_switch" msgid="240286205725043561">"Разрешаване на стартирането при сканиране с NFC"</string>
<string name="change_nfc_tag_apps_detail_summary" msgid="7083666814715607078">"Разрешете на това приложение да се стартира при сканиране на маркер за NFC.\nАко предоставите това разрешение, приложението ще бъде налице като опция, когато сканирате маркер."</string>
@@ -4653,10 +4653,8 @@
<string name="ingress_rate_limit_no_limit_entry" msgid="8741098826008012163">"Няма ограничение"</string>
<string name="disable_phantom_process_monitor_title" msgid="8348108346706188771">"Деактивиране на ограниченията за дъщерните процеси"</string>
<string name="disable_phantom_process_monitor_summary" msgid="3044464635550256985">"Деактивиране на ограниченията за използването на системните ресурси за дъщерните процеси на приложението"</string>
- <!-- no translation found for enable_notes_role_title (7662702013496114763) -->
- <skip />
- <!-- no translation found for enable_notes_role_summary (136916915155048249) -->
- <skip />
+ <string name="enable_notes_role_title" msgid="7662702013496114763">"Принудително активиране на ролята на бележките"</string>
+ <string name="enable_notes_role_summary" msgid="136916915155048249">"Активиране на системните интегрирания за водене на бележки чрез ролята на бележките. Ако тази роля вече е активирана, не се извършва нищо."</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-bs/strings.xml b/res/values-bs/strings.xml
index 4daf299..18d54ce 100644
--- a/res/values-bs/strings.xml
+++ b/res/values-bs/strings.xml
@@ -3249,7 +3249,7 @@
<string name="nls_feature_reply_title" msgid="7925455553821362039">"odgovarati na poruke"</string>
<string name="nls_feature_reply_summary" msgid="4492543411395565556">"Može odgovarati na poruke i djelovati na dugmad u obavještenjima, uključujući odgodu ili odbacivanje obavještenja i odgovaranje na pozive."</string>
<string name="nls_feature_settings_title" msgid="8208164329853194414">"mijenjati postavke"</string>
- <string name="nls_feature_settings_summary" msgid="3770028705648985689">"Može da uključi ili isključi opciju Ne ometaj i da promijeni postavke povezane s tom opcijom."</string>
+ <string name="nls_feature_settings_summary" msgid="3770028705648985689">"Može uključiti ili isključiti opciju Ne ometaj i promijeniti postavke povezane s tom opcijom."</string>
<string name="notification_listener_disable_warning_summary" msgid="8373396293802088961">"Ako aplikaciji <xliff:g id="NOTIFICATION_LISTENER_NAME">%1$s</xliff:g> isključite pristup obavještenjima, može se isključiti i pristup načinu rada Ne ometaj."</string>
<string name="notification_listener_disable_warning_confirm" msgid="841492108402184976">"Isključi"</string>
<string name="notification_listener_disable_warning_cancel" msgid="8802784105045594324">"Otkaži"</string>
@@ -3271,7 +3271,7 @@
<string name="notif_listener_more_settings_desc" msgid="7995492074281663658">"Više postavki dostupno je unutar aplikacije"</string>
<string name="vr_listeners_title" msgid="4960357292472540964">"Usluge pomagača za VR"</string>
<string name="no_vr_listeners" msgid="8442646085375949755">"Nijedna instalirana aplikacija nije zatražila da bude pokrenuta kao usluga pomagača za VR."</string>
- <string name="vr_listener_security_warning_title" msgid="7026351795627615177">"Želite li dozvoliti pristup VR-a za uslugu <xliff:g id="SERVICE">%1$s</xliff:g>?"</string>
+ <string name="vr_listener_security_warning_title" msgid="7026351795627615177">"Dozvoliti pristup usluzi VR-a za uslugu <xliff:g id="SERVICE">%1$s</xliff:g>?"</string>
<string name="vr_listener_security_warning_summary" msgid="1888843557687017791">"<xliff:g id="VR_LISTENER_NAME">%1$s</xliff:g> će moći raditi kada aplikacije budete koristili u načinu rada virtuelne realnosti."</string>
<string name="display_vr_pref_title" msgid="4850474436291113569">"Kada je uređaj u VR načinu rada"</string>
<string name="display_vr_pref_low_persistence" msgid="7039841277157739871">"Smanjenje zamućenosti (preporučeno)"</string>
@@ -3280,7 +3280,7 @@
<string name="picture_in_picture_empty_text" msgid="9123600661268731579">"Nijedna instalirana aplikacija ne podržava način rada slike u slici"</string>
<string name="picture_in_picture_keywords" msgid="3605379820551656253">"slika u slici"</string>
<string name="picture_in_picture_app_detail_title" msgid="4442235098255164650">"Slika u slici"</string>
- <string name="picture_in_picture_app_detail_switch" msgid="8544190716075624017">"Dozvoli način rada slike u slici"</string>
+ <string name="picture_in_picture_app_detail_switch" msgid="8544190716075624017">"Dozvoli sliku u slici"</string>
<string name="picture_in_picture_app_detail_summary" msgid="2503211101305358849">"Dozvolite aplikaciji da kreira prozor sa slikom u slici dok je aplikacija otvorena ili nakon što je napustite (npr. da nastavite gledati videozapis). Ovaj prozor se prikazuje preko drugih aplikacija koje koristite."</string>
<string name="interact_across_profiles_title" msgid="7285906999927669971">"Povezane poslovne i lične aplikacije"</string>
<string name="interact_across_profiles_summary_allowed" msgid="1365881452153799092">"Povezano"</string>
@@ -3640,10 +3640,10 @@
<string name="memory_maximum_usage" msgid="2047013391595835607">"Maksimalno korištenje"</string>
<string name="no_data_usage" msgid="4665617440434654132">"Nema iskorištenih podataka"</string>
<string name="zen_access_warning_dialog_title" msgid="6323325813123130154">"Dozvoliti da <xliff:g id="APP">%1$s</xliff:g> pristupa načinu rada Ne ometaj?"</string>
- <string name="zen_access_warning_dialog_summary" msgid="8468714854067428987">"Aplikacija će biti u mogućnosti da uključi/isključi način rada Ne ometaj i da izmijeni povezane postavke."</string>
+ <string name="zen_access_warning_dialog_summary" msgid="8468714854067428987">"Aplikacija će biti u mogućnosti da uključi/isključi način rada Ne ometaj i izmijeni povezane postavke."</string>
<string name="zen_access_disabled_package_warning" msgid="6565908224294537889">"Mora ostati uključeno jer je uključen pristup obavještenjima"</string>
- <string name="zen_access_revoke_warning_dialog_title" msgid="7377261509261811449">"Opozvati pristup ka usluzi Ne ometaj za aplikaciju <xliff:g id="APP">%1$s</xliff:g>?"</string>
- <string name="zen_access_revoke_warning_dialog_summary" msgid="8689801842914183595">"Sva pravila za uslugu Ne ometaj koje je kreirala ova aplikacija, biti će uklonjena."</string>
+ <string name="zen_access_revoke_warning_dialog_title" msgid="7377261509261811449">"Opozvati pristup funkciji Ne ometaj za aplikaciju <xliff:g id="APP">%1$s</xliff:g>?"</string>
+ <string name="zen_access_revoke_warning_dialog_summary" msgid="8689801842914183595">"Sva pravila za funkciju Ne ometaj koje je kreirala ova aplikacija će se ukloniti."</string>
<string name="ignore_optimizations_on" msgid="6865583039303804932">"Ne optimiziraj"</string>
<string name="ignore_optimizations_off" msgid="9186557038453586295">"Optimizuj"</string>
<string name="ignore_optimizations_on_desc" msgid="1280043916460939932">"Baterija se može brže isprazniti. Aplikaciji više neće biti ograničena potrošnja baterije u pozadini."</string>
@@ -3659,7 +3659,7 @@
<string name="allow_manage_external_storage_description" msgid="5707948153603253225">"Dozvolite ovoj aplikaciji da čita, mijenja i briše sve fajlove na ovom uređaju ili svim povezanim uređajima za pohranu. Ako to dozvolite, aplikacija može pristupati fajlovima bez vašeg znanja."</string>
<string name="filter_manage_external_storage" msgid="6751640571715343804">"Može da pristupa svim fajlovima"</string>
<string name="full_screen_intent_title" msgid="1068024949389956404">"Upravljanje prikazom preko cijelog ekrana"</string>
- <string name="permit_full_screen_intent" msgid="2251949245519201421">"Dozvoli aplikacijama da šalju namjere preko cijelog ekrana"</string>
+ <string name="permit_full_screen_intent" msgid="2251949245519201421">"Dozvoli aplikacijama prikaz preko cijelog ekrana"</string>
<string name="footer_description_full_screen_intent" msgid="8322826300555418227">"Dozvolite aplikaciji da šalje obavještenja o namjeri preko cijelog ekrana."</string>
<string name="media_management_apps_title" msgid="8222942355578724582">"Aplikacije za upravljanje medijima"</string>
<string name="media_management_apps_toggle_label" msgid="166724270857067456">"Dozvoli apl. da upravlja medijskim fajlovima"</string>
diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml
index cf3ffc7..411b8c4 100644
--- a/res/values-cs/strings.xml
+++ b/res/values-cs/strings.xml
@@ -4657,10 +4657,8 @@
<string name="ingress_rate_limit_no_limit_entry" msgid="8741098826008012163">"Bez omezení"</string>
<string name="disable_phantom_process_monitor_title" msgid="8348108346706188771">"Deaktivace omezení podřízených procesů"</string>
<string name="disable_phantom_process_monitor_summary" msgid="3044464635550256985">"Deaktivovat omezení využití zdrojů systému podřízenými procesy aplikace"</string>
- <!-- no translation found for enable_notes_role_title (7662702013496114763) -->
- <skip />
- <!-- no translation found for enable_notes_role_summary (136916915155048249) -->
- <skip />
+ <string name="enable_notes_role_title" msgid="7662702013496114763">"Vynutit aktivování role Poznámky"</string>
+ <string name="enable_notes_role_summary" msgid="136916915155048249">"Aktivovat integrace systému psaní poznámek prostřednictvím role Poznámky. Pokud je role Poznámky už aktivována, nic se nestane."</string>
<string name="bluetooth_broadcast_dialog_title" msgid="9172775308463135884">"Vysílání"</string>
<string name="bluetooth_broadcast_dialog_broadcast_app" msgid="1016617579194329005">"Vysílat v aplikaci <xliff:g id="CURRENTAPP">%1$s</xliff:g>"</string>
<string name="bluetooth_broadcast_dialog_find_message" msgid="6621660851669953883">"Poslouchejte vysílání v okolí"</string>
diff --git a/res/values-en-rAU/strings.xml b/res/values-en-rAU/strings.xml
index 865769c..cd858c5 100644
--- a/res/values-en-rAU/strings.xml
+++ b/res/values-en-rAU/strings.xml
@@ -3640,7 +3640,7 @@
<string name="memory_maximum_usage" msgid="2047013391595835607">"Maximum usage"</string>
<string name="no_data_usage" msgid="4665617440434654132">"No data used"</string>
<string name="zen_access_warning_dialog_title" msgid="6323325813123130154">"Allow access to Do Not Disturb for <xliff:g id="APP">%1$s</xliff:g>?"</string>
- <string name="zen_access_warning_dialog_summary" msgid="8468714854067428987">"The app will be able to turn on/off Do Not Disturb and make changes to related settings."</string>
+ <string name="zen_access_warning_dialog_summary" msgid="8468714854067428987">"The app will be able to turn Do Not Disturb on or off, and make changes to related settings."</string>
<string name="zen_access_disabled_package_warning" msgid="6565908224294537889">"Must stay turned on because notification access is on"</string>
<string name="zen_access_revoke_warning_dialog_title" msgid="7377261509261811449">"Revoke access to Do Not Disturb for <xliff:g id="APP">%1$s</xliff:g>?"</string>
<string name="zen_access_revoke_warning_dialog_summary" msgid="8689801842914183595">"All Do Not Disturb rules created by this app will be removed."</string>
diff --git a/res/values-en-rGB/strings.xml b/res/values-en-rGB/strings.xml
index 0aa4669..7f2bc25 100644
--- a/res/values-en-rGB/strings.xml
+++ b/res/values-en-rGB/strings.xml
@@ -3640,7 +3640,7 @@
<string name="memory_maximum_usage" msgid="2047013391595835607">"Maximum usage"</string>
<string name="no_data_usage" msgid="4665617440434654132">"No data used"</string>
<string name="zen_access_warning_dialog_title" msgid="6323325813123130154">"Allow access to Do Not Disturb for <xliff:g id="APP">%1$s</xliff:g>?"</string>
- <string name="zen_access_warning_dialog_summary" msgid="8468714854067428987">"The app will be able to turn on/off Do Not Disturb and make changes to related settings."</string>
+ <string name="zen_access_warning_dialog_summary" msgid="8468714854067428987">"The app will be able to turn Do Not Disturb on or off, and make changes to related settings."</string>
<string name="zen_access_disabled_package_warning" msgid="6565908224294537889">"Must stay turned on because notification access is on"</string>
<string name="zen_access_revoke_warning_dialog_title" msgid="7377261509261811449">"Revoke access to Do Not Disturb for <xliff:g id="APP">%1$s</xliff:g>?"</string>
<string name="zen_access_revoke_warning_dialog_summary" msgid="8689801842914183595">"All Do Not Disturb rules created by this app will be removed."</string>
diff --git a/res/values-en-rIN/strings.xml b/res/values-en-rIN/strings.xml
index a652a3b..e7be910 100644
--- a/res/values-en-rIN/strings.xml
+++ b/res/values-en-rIN/strings.xml
@@ -3640,7 +3640,7 @@
<string name="memory_maximum_usage" msgid="2047013391595835607">"Maximum usage"</string>
<string name="no_data_usage" msgid="4665617440434654132">"No data used"</string>
<string name="zen_access_warning_dialog_title" msgid="6323325813123130154">"Allow access to Do Not Disturb for <xliff:g id="APP">%1$s</xliff:g>?"</string>
- <string name="zen_access_warning_dialog_summary" msgid="8468714854067428987">"The app will be able to turn on/off Do Not Disturb and make changes to related settings."</string>
+ <string name="zen_access_warning_dialog_summary" msgid="8468714854067428987">"The app will be able to turn Do Not Disturb on or off, and make changes to related settings."</string>
<string name="zen_access_disabled_package_warning" msgid="6565908224294537889">"Must stay turned on because notification access is on"</string>
<string name="zen_access_revoke_warning_dialog_title" msgid="7377261509261811449">"Revoke access to Do Not Disturb for <xliff:g id="APP">%1$s</xliff:g>?"</string>
<string name="zen_access_revoke_warning_dialog_summary" msgid="8689801842914183595">"All Do Not Disturb rules created by this app will be removed."</string>
diff --git a/res/values-et/strings.xml b/res/values-et/strings.xml
index b262a3d..9b8c1a9 100644
--- a/res/values-et/strings.xml
+++ b/res/values-et/strings.xml
@@ -3171,8 +3171,8 @@
<string name="unseen_notifs_lock_screen" msgid="6910701117021324612">"Kuva lukustuskuval ainult uued märguanded"</string>
<string name="unseen_notifs_lock_screen_summary" msgid="5996722793868021391">"Eemalda varem vaadatud märguanded lukustuskuvalt automaatselt"</string>
<string name="lock_screen_notifs_title" msgid="3412042692317304449">"Märguanded lukustuskuval"</string>
- <string name="lock_screen_notifs_show_all_summary" msgid="4226586018375762117">"Kuva vestluse, vaike- ja vaiksed märguanded"</string>
- <string name="lock_screen_notifs_show_all" msgid="1300418674456749664">"Kuva vestluse, vaike- ja vaiksed märguanded"</string>
+ <string name="lock_screen_notifs_show_all_summary" msgid="4226586018375762117">"Kuva vestluse, vaike- ja hääletud märguanded"</string>
+ <string name="lock_screen_notifs_show_all" msgid="1300418674456749664">"Kuva vestluse, vaike- ja hääletud märguanded"</string>
<string name="lock_screen_notifs_show_alerting" msgid="6584682657382684566">"Peida hääletud vestlused ja märguanded"</string>
<string name="lock_screen_notifs_show_none" msgid="1941044980403067101">"Ära kuva märguandeid"</string>
<string name="lock_screen_notifs_redact" msgid="9024158855454642296">"Tundlikud märguanded"</string>
@@ -3258,7 +3258,7 @@
<string name="notif_type_conversation" msgid="4383931408641374979">"Vestlused"</string>
<string name="notif_type_conversation_summary" msgid="179142405410217101">"SMS-id, tekstsõnumid ja muud suhtlusviisid"</string>
<string name="notif_type_alerting" msgid="4713073696855718576">"Märguanded"</string>
- <string name="notif_type_alerting_summary" msgid="4681068287836313604">"Võib seadete põhjal heliseda või vibreerida"</string>
+ <string name="notif_type_alerting_summary" msgid="4681068287836313604">"Võivad seadete põhjal heliseda või vibreerida"</string>
<string name="notif_type_silent" msgid="6273951794420331010">"Hääletu"</string>
<string name="notif_type_silent_summary" msgid="7820923063105060844">"Märguanded, mis ei tee kunagi häält ega vibreeri"</string>
<string name="notification_listener_allowed" msgid="5536962633536318551">"Lubatud"</string>
@@ -3272,7 +3272,7 @@
<string name="vr_listeners_title" msgid="4960357292472540964">"VR-abilise teenused"</string>
<string name="no_vr_listeners" msgid="8442646085375949755">"Ükski installitud rakendus pole taotlenud VR-abilise teenusena käitamist."</string>
<string name="vr_listener_security_warning_title" msgid="7026351795627615177">"Kas lubada VR-teenuse juurdepääs teenusele <xliff:g id="SERVICE">%1$s</xliff:g>?"</string>
- <string name="vr_listener_security_warning_summary" msgid="1888843557687017791">"Virtuaalreaalses režiimis kuulajat <xliff:g id="VR_LISTENER_NAME">%1$s</xliff:g> saab käitada, kui kasutate rakendusi virtuaalreaalses režiimis."</string>
+ <string name="vr_listener_security_warning_summary" msgid="1888843557687017791">"Teenust <xliff:g id="VR_LISTENER_NAME">%1$s</xliff:g> saab käitada, kui kasutate rakendusi virtuaalreaalsuse režiimis."</string>
<string name="display_vr_pref_title" msgid="4850474436291113569">"Kui seade on VR-režiimis"</string>
<string name="display_vr_pref_low_persistence" msgid="7039841277157739871">"Vähenda hägusust (soovitatav)"</string>
<string name="display_vr_pref_off" msgid="4008841566387432721">"Vähenda värelemist"</string>
@@ -4141,7 +4141,7 @@
<string name="my_device_info_device_identifiers_category_title" msgid="2197063484127704153">"Seadme identifikaatorid"</string>
<string name="change_wifi_state_title" msgid="5629648102837821525">"WiFi-seadete juhtimine"</string>
<string name="change_wifi_state_app_detail_switch" msgid="1385358508267180745">"Luba rakendusel juhtida WiFi-t"</string>
- <string name="change_wifi_state_app_detail_summary" msgid="8230854855584217111">"Lubage sellel rakendusel WiFi sisse või välja lülitada, otsida WiFi-võrke ja nendega ühendus luua, võrke lisada või eemaldada või luua kohalik kuumkoht"</string>
+ <string name="change_wifi_state_app_detail_summary" msgid="8230854855584217111">"Lubage sellel rakendusel WiFi sisse või välja lülitada, otsida WiFi-võrke ja nendega ühendus luua, võrke lisada või eemaldada või luua kohalik kuumkoht."</string>
<string name="change_nfc_tag_apps_title" msgid="91514009058149617">"Käivitamine NFC kaudu"</string>
<string name="change_nfc_tag_apps_detail_switch" msgid="240286205725043561">"Luba käivitamine NFC skannimisel"</string>
<string name="change_nfc_tag_apps_detail_summary" msgid="7083666814715607078">"Lubage see rakendus käivitada, kui skannitakse NFC-kiip.\nKui see luba on sisse lülitatud, on rakendus kiibi tuvastamisel valikuna saadaval."</string>
diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml
index f203e74..44ec910 100644
--- a/res/values-fi/strings.xml
+++ b/res/values-fi/strings.xml
@@ -4653,10 +4653,8 @@
<string name="ingress_rate_limit_no_limit_entry" msgid="8741098826008012163">"Ei rajoitusta"</string>
<string name="disable_phantom_process_monitor_title" msgid="8348108346706188771">"Poista käytöstä alatason prosessirajoitukset"</string>
<string name="disable_phantom_process_monitor_summary" msgid="3044464635550256985">"Poista käytöstä rajoitukset, jotka liittyvät järjestelmäresurssin käyttöön sovelluksen alatason prosesseissa"</string>
- <!-- no translation found for enable_notes_role_title (7662702013496114763) -->
- <skip />
- <!-- no translation found for enable_notes_role_summary (136916915155048249) -->
- <skip />
+ <string name="enable_notes_role_title" msgid="7662702013496114763">"Pakota Muistiinpanot-rooli käyttöön"</string>
+ <string name="enable_notes_role_summary" msgid="136916915155048249">"Ota käyttöön muistiinpanojärjestelmän integraatioita Muistiinpanot-roolin avulla. Jos Muistiinpanot-rooli on jo käytössä, tämä ei vaikuta mitenkään."</string>
<string name="bluetooth_broadcast_dialog_title" msgid="9172775308463135884">"Lähetä"</string>
<string name="bluetooth_broadcast_dialog_broadcast_app" msgid="1016617579194329005">"Lähetä <xliff:g id="CURRENTAPP">%1$s</xliff:g>"</string>
<string name="bluetooth_broadcast_dialog_find_message" msgid="6621660851669953883">"Kuuntele lähellä olevia lähetyksiä"</string>
diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml
index e761beb..a3ee842 100644
--- a/res/values-fr/strings.xml
+++ b/res/values-fr/strings.xml
@@ -3477,7 +3477,7 @@
<string name="memtag_title" msgid="5096176296797727201">"Protection avancée mémoire (bêta)"</string>
<string name="memtag_toggle" msgid="8695028758462939212">"Protection avancée de la mémoire"</string>
<string name="memtag_intro" msgid="579408691329568953">"Cette fonctionnalité bêta vous aide à protéger votre appareil des bugs qui peuvent compromettre votre sécurité."</string>
- <string name="memtag_on" msgid="824938319141503923">"Activée"</string>
+ <string name="memtag_on" msgid="824938319141503923">"Activé"</string>
<string name="memtag_off" msgid="4835589640091709019">"Désactivée"</string>
<string name="memtag_on_pending" msgid="1592053425431532361">"Activé après le redémarrage"</string>
<string name="memtag_off_pending" msgid="1543177181383593726">"Désactivée après le redémarrage"</string>
diff --git a/res/values-gu/strings.xml b/res/values-gu/strings.xml
index 53caefe..66c69c4 100644
--- a/res/values-gu/strings.xml
+++ b/res/values-gu/strings.xml
@@ -909,10 +909,8 @@
<skip />
<string name="wifi_hotspot_speed_summary_unavailable" msgid="7276080644693388756">"તમારા દેશ અથવા પ્રદેશમાં ઉપલબ્ધ નથી"</string>
<string name="wifi_hotspot_speed_footer" msgid="8846939503916795002">"જો તમે પસંદ કરેલી ફ્રિકવન્સી ઉપલબ્ધ ન હોય, તો તમારું હૉટસ્પૉટ કોઈ અલગ ફ્રિકવન્સીનો ઉપયોગ કરી શકે છે. જો તમે ફ્રિકવન્સી બદલો, તો હૉટસ્પૉટના સુરક્ષા સેટિંગ બદલાઈ શકે છે."</string>
- <!-- no translation found for wifi_hotspot_security_summary_unavailable (117582979310345853) -->
- <skip />
- <!-- no translation found for wifi_hotspot_security_footer (4608329688744949796) -->
- <skip />
+ <string name="wifi_hotspot_security_summary_unavailable" msgid="117582979310345853">"6 GHz સાથે ઉપલબ્ધ નથી"</string>
+ <string name="wifi_hotspot_security_footer" msgid="4608329688744949796">"જો તમે હૉટસ્પૉટની ફ્રિકવન્સીને બદલો છો તો સુરક્ષા સેટિંગ બદલાઈ શકે છે"</string>
<string name="wifi_tether_starting" msgid="8879874184033857814">"હૉટસ્પૉટ ચાલુ કરી રહ્યું છે…"</string>
<string name="wifi_tether_stopping" msgid="4416492968019409188">"હૉટસ્પૉટ બંધ કરી રહ્યું છે…"</string>
<string name="wifi_tether_carrier_unsupport_dialog_title" msgid="3089432578433978073">"ઇન્ટરનેટ શેર કરવાની સુવિધા ઉપલબ્ધ નથી"</string>
@@ -2705,14 +2703,12 @@
<string name="enable_guest_calling" msgid="8300355036005240911">"અતિથિને ફોનનો ઉપયોગ કરવાની મંજૂરી આપો"</string>
<string name="enable_guest_calling_summary" msgid="4748224917641204782">"કૉલ ઇતિહાસ અતિથિ વપરાશકર્તા સાથે શેર કરવામાં આવશે"</string>
<string name="user_enable_calling_sms" msgid="8546430559552381324">"ફોન કૉલ અને SMS ચાલુ કરો"</string>
- <!-- no translation found for user_grant_admin (5942118263054572074) -->
- <skip />
+ <string name="user_grant_admin" msgid="5942118263054572074">"આ વપરાશકર્તાને ઍડમિન બનાવો"</string>
<string name="user_remove_user" msgid="8468203789739693845">"વપરાશકર્તાને ડિલીટ કરો"</string>
<string name="user_enable_calling_and_sms_confirm_title" msgid="4041510268838725520">"ફોન કૉલ અને SMS ચાલુ કરીએ?"</string>
<string name="user_enable_calling_and_sms_confirm_message" msgid="367792286597449922">"કૉલ અને SMS ઇતિહાસ આ વપરાશકર્તા સાથે શેર કરવામાં આવશે."</string>
<string name="user_revoke_admin_confirm_title" msgid="3057842401861731863">"ઍડમિનના વિશેષાધિકારો કાઢી નાખીએ?"</string>
- <!-- no translation found for user_revoke_admin_confirm_message (9207187319308572958) -->
- <skip />
+ <string name="user_revoke_admin_confirm_message" msgid="9207187319308572958">"જો તમે આ વપરાશકર્તાના ઍડમિનના અધિકારોને કાઢી નાખશો, તો તમે અથવા બીજા ઍડમિન પછી તેમને તે પાછા આપી શકે છે."</string>
<string name="emergency_info_title" msgid="8233682750953695582">"ઇમર્જન્સીની માહિતી"</string>
<string name="emergency_info_summary" msgid="8463622253016757697">"<xliff:g id="USER_NAME">%1$s</xliff:g> માટે માહિતી અને સંપર્કો"</string>
<string name="open_app_button" msgid="5025229765547191710">"<xliff:g id="APP_NAME">%1$s</xliff:g> ખોલો"</string>
diff --git a/res/values-hr/strings.xml b/res/values-hr/strings.xml
index a985d0f..8f556f5 100644
--- a/res/values-hr/strings.xml
+++ b/res/values-hr/strings.xml
@@ -346,7 +346,7 @@
<string name="setup_fingerprint_enroll_skip_after_adding_lock_text" msgid="2412645723804450304">"Postavljanje otisaka prstiju traje samo jednu ili dvije minute. Ako to preskočite, otiske prstiju možete dodati kasnije u postavkama."</string>
<string name="security_settings_fingerprint_v2_enroll_introduction_message_setup" msgid="6255210343107484206">"Kada se prikaže ta ikona, upotrijebite otisak prsta za autentifikaciju, na primjer radi prijave u aplikacije ili odobravanja kupnje"</string>
<string name="security_settings_fingerprint_v2_enroll_introduction_footer_title_1" msgid="4360262371633254407">"Napomena"</string>
- <string name="security_settings_fingerprint_v2_enroll_introduction_footer_title_2" msgid="2580899232734177771">"Način funkcioniranja"</string>
+ <string name="security_settings_fingerprint_v2_enroll_introduction_footer_title_2" msgid="2580899232734177771">"Kako to funkcionira"</string>
<string name="security_settings_fingerprint_v2_enroll_introduction_footer_message_2" msgid="5909924864816776516">"Otključavanje otiskom prsta izrađuje jedinstveni model vašeg otiska prsta radi potvrde vašeg identiteta. Da biste izradili model otiska prsta tijekom postavljanja, snimit ćete slike svojeg otiska prsta iz različitih položaja."</string>
<string name="security_settings_fingerprint_v2_enroll_introduction_footer_message_consent_2" msgid="3493356605815124807">"Otključavanje otiskom prsta izrađuje jedinstveni model otiska prsta vašeg djeteta radi potvrđivanja njegovog identiteta. Da bi izradilo model otiska prsta tijekom postavljanja, dijete će snimiti slike svojeg otiska prsta iz različitih položaja."</string>
<string name="security_settings_fingerprint_v2_enroll_introduction_footer_message_6" msgid="5314031490467481499">"Za najbolje rezultate koristite zaštitu zaslona s certifikatom Made for Google. Vaš otisak prsta možda neće funkcionirati s drugim zaštitama zaslona."</string>
@@ -2137,7 +2137,7 @@
<string name="print_feature_state_off" msgid="1466195699995209446">"Isključeno"</string>
<string name="print_menu_item_add_service" msgid="1549091062463044676">"Dodajte uslugu"</string>
<string name="print_menu_item_add_printer" msgid="8711630848324870892">"Dodajte pisač"</string>
- <string name="print_menu_item_search" msgid="5989979785203603169">"Pretraži"</string>
+ <string name="print_menu_item_search" msgid="5989979785203603169">"Pretražite"</string>
<string name="print_searching_for_printers" msgid="5401413178028348800">"Traženje pisača"</string>
<string name="print_service_disabled" msgid="9185935228930987786">"Usluga je onemogućena"</string>
<string name="print_print_jobs" msgid="2605944855933091183">"Zadaci ispisa"</string>
@@ -3119,7 +3119,7 @@
<string name="notification_dashboard_summary" msgid="7530169251902320652">"Povijest obavijesti, razgovori"</string>
<string name="conversation_notifs_category" msgid="2549844862379963273">"Razgovor"</string>
<string name="general_notification_header" msgid="3669031068980713359">"Upravljanje"</string>
- <string name="app_notification_field" msgid="3208079070539894909">"Obavijesti aplikacije"</string>
+ <string name="app_notification_field" msgid="3208079070539894909">"Obavijesti aplikacija"</string>
<string name="app_notification_field_summary" msgid="5981393613897713471">"Upravljajte obavijestima pojedinačnih aplikacija"</string>
<string name="advanced_section_header" msgid="6478709678084326738">"Općenito"</string>
<string name="profile_section_header" msgid="4970209372372610799">"Obavijesti poslovnog profila"</string>
@@ -3148,7 +3148,7 @@
<string name="notification_bubbles_title" msgid="5681506665322329301">"Oblačići"</string>
<string name="bubbles_app_toggle_title" msgid="5319021259954576150">"Oblačići"</string>
<string name="bubbles_conversation_toggle_title" msgid="5225039214083311316">"Prikaži ovaj razgovor u oblačiću"</string>
- <string name="bubbles_conversation_toggle_summary" msgid="720229032254323578">"Prikaži pomičnu ikonu povrh aplikacija"</string>
+ <string name="bubbles_conversation_toggle_summary" msgid="720229032254323578">"Prikazuje pomičnu ikonu povrh aplikacija"</string>
<string name="bubbles_feature_disabled_dialog_title" msgid="1794193899792284007">"Uključiti oblačiće za uređaj?"</string>
<string name="bubbles_feature_disabled_dialog_text" msgid="5275666953364031055">"Uključivanjem oblačića za ovu aplikaciju uključit će se i oblačići za vaš uređaj.\n\nTo utječe na druge aplikacije ili razgovore kojima je dopušteno otvaranje oblačića."</string>
<string name="bubbles_feature_disabled_button_approve" msgid="2042628067101419871">"Uključi"</string>
@@ -3247,11 +3247,11 @@
<string name="notification_assistant_security_warning_summary" msgid="4846559755787348129">"U Androidu 12 poboljšane obavijesti zamjenjuju prilagodljive obavijesti za Android. Ta značajka prikazuje predložene radnje i odgovore te organizira vaše obavijesti. \n\nPoboljšane obavijesti mogu pristupati sadržaju obavijesti, uključujući osobne podatke kao što su imena kontakata i poruke. Ta značajka može i odbacivati obavijesti ili poduzimati radnje u vezi s njima, na primjer može odgovarati na telefonske pozive i upravljati značajkom Ne uznemiravaj."</string>
<string name="notification_listener_security_warning_title" msgid="5791700876622858363">"Želite li usluzi <xliff:g id="SERVICE">%1$s</xliff:g> dopustiti da pristupa obavijestima?"</string>
<string name="notification_listener_security_warning_summary" msgid="1131986567509818121">"Aplikacija <xliff:g id="NOTIFICATION_LISTENER_NAME">%1$s</xliff:g> moći će čitati sve obavijesti, uključujući osobne podatke, na primjer imena kontakata, fotografije i tekstove poruka koje primate. Aplikacija će moći i odgoditi ili odbaciti obavijesti ili poduzeti radnje povezane s gumbima u obavijestima, uključujući odgovaranje na telefonske pozive. \n\nAplikacija će također moći uključiti ili isključiti značajku Ne uznemiravaj i promijeniti povezane postavke."</string>
- <string name="nls_warning_prompt" msgid="1486887096703743841">"Aplikacija <xliff:g id="NOTIFICATION_LISTENER_NAME">%1$s</xliff:g> moći će sljedeće:"</string>
+ <string name="nls_warning_prompt" msgid="1486887096703743841">"Aplikaciji <xliff:g id="NOTIFICATION_LISTENER_NAME">%1$s</xliff:g> omogućit će se:"</string>
<string name="nls_feature_read_title" msgid="7629713268744220437">"Čitanje vaših poruka"</string>
<string name="nls_feature_read_summary" msgid="1064698238110273593">"Može čitati vaše obavijesti, uključujući osobne podatke kao što su kontakti, poruke i fotografije."</string>
<string name="nls_feature_reply_title" msgid="7925455553821362039">"Odgovaranje na poruke"</string>
- <string name="nls_feature_reply_summary" msgid="4492543411395565556">"Može odgovarati na poruke i poduzeti radnje povezane s gumbima u obavijestima, uključujući odgađanje alarma, odbacivanje obavijesti i odgovaranje na pozive."</string>
+ <string name="nls_feature_reply_summary" msgid="4492543411395565556">"Može odgovarati na poruke i poduzimati radnje povezane s gumbima u obavijestima, uključujući odgađanje alarma, odbacivanje obavijesti i odgovaranje na pozive."</string>
<string name="nls_feature_settings_title" msgid="8208164329853194414">"Promjena postavki"</string>
<string name="nls_feature_settings_summary" msgid="3770028705648985689">"Može uključiti ili isključiti značajku Ne uznemiravaj i promijeniti povezane postavke."</string>
<string name="notification_listener_disable_warning_summary" msgid="8373396293802088961">"Ako isključite pristup obavijestima za <xliff:g id="NOTIFICATION_LISTENER_NAME">%1$s</xliff:g>, možda će se isključiti i pristup značajci Ne uznemiravaj."</string>
@@ -3643,10 +3643,10 @@
<string name="running_frequency" msgid="7260225121706316639">"Učestalost"</string>
<string name="memory_maximum_usage" msgid="2047013391595835607">"Maksimalna upotreba"</string>
<string name="no_data_usage" msgid="4665617440434654132">"Nema upotrebe podataka"</string>
- <string name="zen_access_warning_dialog_title" msgid="6323325813123130154">"Želite li dopustiti aplikaciji <xliff:g id="APP">%1$s</xliff:g> pristup opciji Ne uznemiravaj?"</string>
+ <string name="zen_access_warning_dialog_title" msgid="6323325813123130154">"Želite li aplikaciji <xliff:g id="APP">%1$s</xliff:g> dopustiti pristup značajci Ne uznemiravaj?"</string>
<string name="zen_access_warning_dialog_summary" msgid="8468714854067428987">"Aplikacija će moći uključiti ili isključiti opciju Ne uznemiravaj i mijenjati povezane postavke."</string>
<string name="zen_access_disabled_package_warning" msgid="6565908224294537889">"Mora ostati uključeno jer je uključen pristup obavijestima"</string>
- <string name="zen_access_revoke_warning_dialog_title" msgid="7377261509261811449">"Želite li opozvati pristup opciji Ne uznemiravaj za aplikaciju <xliff:g id="APP">%1$s</xliff:g>?"</string>
+ <string name="zen_access_revoke_warning_dialog_title" msgid="7377261509261811449">"Želite li opozvati pristup značajci Ne uznemiravaj za aplikaciju <xliff:g id="APP">%1$s</xliff:g>?"</string>
<string name="zen_access_revoke_warning_dialog_summary" msgid="8689801842914183595">"Uklonit će se sva pravila Ne uznemiravaj koja je postavila ova aplikacija."</string>
<string name="ignore_optimizations_on" msgid="6865583039303804932">"Ne optimiziraj"</string>
<string name="ignore_optimizations_off" msgid="9186557038453586295">"Optimizacija"</string>
@@ -3812,7 +3812,7 @@
<string name="battery_saver_on_summary" msgid="4605146593966255848">"Uključeno"</string>
<string name="battery_saver_off_scheduled_summary" msgid="2193875981740829819">"Uključit će se na <xliff:g id="BATTERY_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="battery_saver_off_summary" msgid="4411561435493109261">"Isključeno"</string>
- <string name="app_battery_usage_title" msgid="346558380609793334">"Potrošnja baterije za aplikaciju"</string>
+ <string name="app_battery_usage_title" msgid="346558380609793334">"Potrošnja baterije za aplikacije"</string>
<string name="app_battery_usage_summary" msgid="6349965904306339539">"Postavite potrošnju baterije za aplikacije"</string>
<string name="filter_battery_unrestricted_title" msgid="821027369424198223">"Neograničeno"</string>
<string name="filter_battery_optimized_title" msgid="8236647176487754796">"Optimizirano"</string>
diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml
index eb07144..02836d8 100644
--- a/res/values-hu/strings.xml
+++ b/res/values-hu/strings.xml
@@ -3275,7 +3275,7 @@
<string name="notif_listener_more_settings_desc" msgid="7995492074281663658">"Ebben az alkalmazásban további beállítások állnak rendelkezésre"</string>
<string name="vr_listeners_title" msgid="4960357292472540964">"Virtuálisvalóság-segédszolgáltatás"</string>
<string name="no_vr_listeners" msgid="8442646085375949755">"Egy telepített alkalmazás sem kérte, hogy virtuálisvalóság-segédszolgáltatásként legyen futtatva."</string>
- <string name="vr_listener_security_warning_title" msgid="7026351795627615177">"Engedélyezi a(z) <xliff:g id="SERVICE">%1$s</xliff:g> számára a hozzáférést a virtuálisvalóság-szolgáltatáshoz?"</string>
+ <string name="vr_listener_security_warning_title" msgid="7026351795627615177">"Hozzáférhet a(z) <xliff:g id="SERVICE">%1$s</xliff:g> a virtuálisvalóság-szolgáltatáshoz?"</string>
<string name="vr_listener_security_warning_summary" msgid="1888843557687017791">"A(z) <xliff:g id="VR_LISTENER_NAME">%1$s</xliff:g> futtatható lesz, ha Ön virtuális valóság módban használ alkalmazásokat."</string>
<string name="display_vr_pref_title" msgid="4850474436291113569">"Ha az eszköz VR módban van"</string>
<string name="display_vr_pref_low_persistence" msgid="7039841277157739871">"Homályosítás csökkentése (ajánlott)"</string>
@@ -3643,7 +3643,7 @@
<string name="running_frequency" msgid="7260225121706316639">"Gyakoriság"</string>
<string name="memory_maximum_usage" msgid="2047013391595835607">"Maximális használat"</string>
<string name="no_data_usage" msgid="4665617440434654132">"Nincs felhasznált adatmennyiség"</string>
- <string name="zen_access_warning_dialog_title" msgid="6323325813123130154">"Engedélyezi a(z) <xliff:g id="APP">%1$s</xliff:g> számára a hozzáférést a „Ne zavarjanak” funkcióhoz?"</string>
+ <string name="zen_access_warning_dialog_title" msgid="6323325813123130154">"Hozzáférhet a(z) <xliff:g id="APP">%1$s</xliff:g> a „Ne zavarjanak” funkcióhoz?"</string>
<string name="zen_access_warning_dialog_summary" msgid="8468714854067428987">"Az alkalmazás be- és kikapcsolhatja a „Ne zavarjanak” funkciót, és módosíthatja a vonatkozó beállításokat."</string>
<string name="zen_access_disabled_package_warning" msgid="6565908224294537889">"Bekapcsolva kell hagyni, mert az értesítési hozzáférés be van kapcsolva"</string>
<string name="zen_access_revoke_warning_dialog_title" msgid="7377261509261811449">"Visszavonja a(z) <xliff:g id="APP">%1$s</xliff:g> hozzáférését a „Ne zavarjanak” szabályhoz?"</string>
diff --git a/res/values-hy/strings.xml b/res/values-hy/strings.xml
index 72870f1..ee06335 100644
--- a/res/values-hy/strings.xml
+++ b/res/values-hy/strings.xml
@@ -2386,7 +2386,7 @@
<string name="vpn_settings_multiple_insecure_multiple_total" msgid="1706236062478680488">"<xliff:g id="VPN_COUNT">%d</xliff:g>-ն անվտանգ չէ"</string>
<string name="adaptive_connectivity_title" msgid="7464959640138428192">"Հարմարվող կապ"</string>
<string name="adaptive_connectivity_summary" msgid="3648731530666326885">"Ձեր ցանցային կապերն ավտոմատ կառավարելու միջոցով երկարացնում է մարտկոցի աշխատանքի տևողությունը և բարելավում սարքի արդյունավետությունը"</string>
- <string name="adaptive_connectivity_switch_on" msgid="3653067561620745493">"Միացնել"</string>
+ <string name="adaptive_connectivity_switch_on" msgid="3653067561620745493">"Միացված է"</string>
<string name="adaptive_connectivity_switch_off" msgid="5076172560836115265">"Անջատել"</string>
<string name="adaptive_connectivity_main_switch_title" msgid="261045483524512420">"Հարմարվող միացման օգտագործում"</string>
<string name="credentials_title" msgid="7535942196886123656">"Մուտքի տվյալների պահոց"</string>
diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml
index f2861d9..0ab62ab 100644
--- a/res/values-in/strings.xml
+++ b/res/values-in/strings.xml
@@ -4653,10 +4653,8 @@
<string name="ingress_rate_limit_no_limit_entry" msgid="8741098826008012163">"Tak terbatas"</string>
<string name="disable_phantom_process_monitor_title" msgid="8348108346706188771">"Nonaktifkan batasan proses turunan"</string>
<string name="disable_phantom_process_monitor_summary" msgid="3044464635550256985">"Nonaktifkan batasan penggunaan resource sistem pada proses turunan aplikasi"</string>
- <!-- no translation found for enable_notes_role_title (7662702013496114763) -->
- <skip />
- <!-- no translation found for enable_notes_role_summary (136916915155048249) -->
- <skip />
+ <string name="enable_notes_role_title" msgid="7662702013496114763">"Aktifkan paksa peran Catatan"</string>
+ <string name="enable_notes_role_summary" msgid="136916915155048249">"Aktifkan integrasi sistem pembuatan catatan melalui peran Catatan. Jika peran Catatan telah diaktifkan, setelan ini tidak melakukan apa pun."</string>
<string name="bluetooth_broadcast_dialog_title" msgid="9172775308463135884">"Siaran"</string>
<string name="bluetooth_broadcast_dialog_broadcast_app" msgid="1016617579194329005">"Siarkan <xliff:g id="CURRENTAPP">%1$s</xliff:g>"</string>
<string name="bluetooth_broadcast_dialog_find_message" msgid="6621660851669953883">"Dengarkan siaran yang diputar di dekat Anda"</string>
diff --git a/res/values-ka/strings.xml b/res/values-ka/strings.xml
index 4bf64cf..a532a89 100644
--- a/res/values-ka/strings.xml
+++ b/res/values-ka/strings.xml
@@ -266,7 +266,7 @@
<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="523320857738436024">"საჭიროა დაყენება"</string>
- <string name="security_settings_face_preference_title" msgid="2126625155005348417">"განბლოკვა სახით"</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>
<string name="security_settings_face_enroll_education_title_accessibility" msgid="3701874093226957891">"სახით განბლოკვის პარამეტრების დაყენება"</string>
@@ -3168,7 +3168,7 @@
<string name="silent_notifications_status_bar" msgid="6113307620588767516">"ჩუმი შეტყობინებების დამალვა სტატუსის ზოლში"</string>
<string name="notification_pulse_title" msgid="8013178454646671529">"სინათლის ციმციმი"</string>
<string name="lock_screen_notifications_title" msgid="2876323153692406203">"კონფიდენციალურობა"</string>
- <string name="lockscreen_bypass_title" msgid="6519964196744088573">"ჩაკეტილი ეკრანის გამოსატოვებლად"</string>
+ <string name="lockscreen_bypass_title" msgid="6519964196744088573">"ჩაკეტილი ეკრანის გამოტოვება"</string>
<string name="lockscreen_bypass_summary" msgid="4578154430436224161">"განბლოკვის შემდეგ პირდაპირ გადადით ბოლოს გამოყენებულ ეკრანზე. ჩაკეტილ ეკრანზე შეტყობინებები არ გამოჩნდება. გადაფურცლეთ ზემოდან ქვემოთ მათ სანახავად."</string>
<string name="keywords_lockscreen_bypass" msgid="41035425468915498">"ჩაკეტილი ეკრანი, დაბლოკილი ეკრანი, გამოტოვება, გვერდის ავლა"</string>
<string name="locked_work_profile_notification_title" msgid="279367321791301499">"დაბლოკილი სამს.პროფილისას"</string>
diff --git a/res/values-kk/strings.xml b/res/values-kk/strings.xml
index da57eee..0a47857 100644
--- a/res/values-kk/strings.xml
+++ b/res/values-kk/strings.xml
@@ -4653,10 +4653,8 @@
<string name="ingress_rate_limit_no_limit_entry" msgid="8741098826008012163">"Шексіз"</string>
<string name="disable_phantom_process_monitor_title" msgid="8348108346706188771">"Туынды процеске қатысты шектеулерді өшіру"</string>
<string name="disable_phantom_process_monitor_summary" msgid="3044464635550256985">"Қолданбаның туынды процестерінің жүйе ресурсын пайдалануына қатысты шектеулерді өшіру"</string>
- <!-- no translation found for enable_notes_role_title (7662702013496114763) -->
- <skip />
- <!-- no translation found for enable_notes_role_summary (136916915155048249) -->
- <skip />
+ <string name="enable_notes_role_title" msgid="7662702013496114763">"\"Ескертпелер\" жинағын мәжбүрлі түрде қосу"</string>
+ <string name="enable_notes_role_summary" msgid="136916915155048249">"\"Ескертпелер\" жинағы арқылы ескертпе жасау жүйесін қосады. \"Ескертпелер\" жинағы қосулы болса, ештеңе істемейді."</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-kn/strings.xml b/res/values-kn/strings.xml
index 3e65d50..9287dc6 100644
--- a/res/values-kn/strings.xml
+++ b/res/values-kn/strings.xml
@@ -1517,7 +1517,7 @@
<string name="clear_cache_btn_text" msgid="8597272828928143723">"ಕ್ಯಾಷ್ ಅಳಿಸಿ"</string>
<string name="cache_size_label" msgid="313456088966822757">"ಕ್ಯಾಷ್"</string>
<string name="uri_permissions_text" msgid="8406345863117405105">"{count,plural, =1{1 ಐಟಂ}one{# ಐಟಂಗಳು}other{# ಐಟಂಗಳು}}"</string>
- <string name="clear_uri_btn_text" msgid="4828117421162495134">"ಪ್ರವೇಶ ತೆರವುಗೊಳಿಸು"</string>
+ <string name="clear_uri_btn_text" msgid="4828117421162495134">"ಆ್ಯಕ್ಸೆಸ್ ತೆರವುಗೊಳಿಸು"</string>
<string name="controls_label" msgid="8671492254263626383">"ನಿಯಂತ್ರಣಗಳು"</string>
<string name="force_stop" msgid="2681771622136916280">"ಬಲವಂತವಾಗಿ ನಿಲ್ಲಿಸಿ"</string>
<string name="total_size_label" msgid="2052185048749658866">"ಒಟ್ಟು"</string>
@@ -1751,7 +1751,7 @@
<string name="enabled_locales_keyboard_layout" msgid="3939886151098958639">"ಲೇಔಟ್"</string>
<string name="gadget_picker_title" msgid="7615902510050731400">"ಗ್ಯಾಜೆಟ್ ಆರಿಸಿ"</string>
<string name="widget_picker_title" msgid="7641298325488989676">"ವಿಜೆಟ್ ಅನ್ನು ಆರಿಸಿ"</string>
- <string name="allow_bind_app_widget_activity_allow_bind_title" msgid="3537968409832846255">"ವಿಜೆಟ್ ರಚಿಸಿ ಮತ್ತು ಪ್ರವೇಶ ಅನುಮಿತಿಸಬಹುದೇ?"</string>
+ <string name="allow_bind_app_widget_activity_allow_bind_title" msgid="3537968409832846255">"ವಿಜೆಟ್ ರಚಿಸಿ ಮತ್ತು ಆ್ಯಕ್ಸೆಸ್ ಅನುಮಿತಿಸಬಹುದೇ?"</string>
<string name="allow_bind_app_widget_activity_allow_bind" msgid="5825298768068148804">"ನೀವು ವಿಜೆಟ್ ಅನ್ನು ರಚಿಸಿದ ನಂತರ, ಪ್ರದರ್ಶಿಸುವ ಎಲ್ಲಾ ಡೇಟಾವನ್ನು ಆ್ಯಪ್ ಪ್ರವೇಶಿಸಬಹುದು.\n\nಆ್ಯಪ್: <xliff:g id="WIDGET_HOST_NAME">%1$s</xliff:g>\nವಿಜೆಟ್: <xliff:g id="WIDGET_LABEL">%2$s</xliff:g>\n"</string>
<string name="allow_bind_app_widget_activity_always_allow_bind" msgid="7268758525344468364">"ವಿಜೆಟ್ಗಳನ್ನು ರಚಿಸಲು ಮತ್ತು ಅವುಗಳ ಡೇಟಾವನ್ನು ಪ್ರವೇಶಿಸಲು <xliff:g id="WIDGET_HOST_NAME">%1$s</xliff:g> ಅನ್ನು ಯಾವಾಗಲೂ ಅನುಮತಿಸಿ"</string>
<string name="testing_usage_stats" msgid="4660643799010906365">"ಬಳಕೆಯ ಅಂಕಿಅಂಶಗಳು"</string>
@@ -2770,7 +2770,7 @@
<skip />
<string name="cell_broadcast_settings" msgid="2416980110093867199">"ವೈರ್ಲೆಸ್ ತುರ್ತು ಅಲರ್ಟ್ಗಳು"</string>
<string name="network_operators_settings" msgid="5105453353329748954">"ನೆಟ್ವರ್ಕ್ ಆಪರೇಟರ್ಗಳು"</string>
- <string name="access_point_names" msgid="5768430498022188057">"ಪ್ರವೇಶ ಕೇಂದ್ರದ ಹೆಸರುಗಳು"</string>
+ <string name="access_point_names" msgid="5768430498022188057">"ಆ್ಯಕ್ಸೆಸ್ ಕೇಂದ್ರದ ಹೆಸರುಗಳು"</string>
<string name="enhanced_4g_lte_mode_title" msgid="6624700245232361149">"VoLTE"</string>
<string name="enhanced_4g_lte_mode_title_advanced_calling" msgid="7066009898031465265">"ಸುಧಾರಿತ ಕರೆ ಮಾಡುವಿಕೆ"</string>
<string name="enhanced_4g_lte_mode_title_4g_calling" msgid="7445853566718786195">"4G ಕರೆ ಮಾಡುವಿಕೆ"</string>
@@ -2795,7 +2795,7 @@
<string name="auto_data_switch_title" msgid="5862200603753603464">"ಮೊಬೈಲ್ ಡೇಟಾವನ್ನು ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಬದಲಿಸಿ"</string>
<string name="auto_data_switch_summary" msgid="1934340931995429057">"ಈ ನೆಟ್ವರ್ಕ್ ಉತ್ತಮ ಲಭ್ಯತೆಯನ್ನು ಹೊಂದಿರುವಾಗ ಇದನ್ನು ಬಳಸಿ"</string>
<string name="work_sim_title" msgid="8999872928646924429">"ಕೆಲಸದ ಸಿಮ್"</string>
- <string name="user_restrictions_title" msgid="4068914244980335993">"ಅಪ್ಲಿಕೇಶನ್ & ವಿಷಯ ಪ್ರವೇಶ"</string>
+ <string name="user_restrictions_title" msgid="4068914244980335993">"ಅಪ್ಲಿಕೇಶನ್ & ವಿಷಯ ಆ್ಯಕ್ಸೆಸ್"</string>
<string name="user_rename" msgid="8735940847878484249">"ಮರುಹೆಸರಿಸಿ"</string>
<string name="app_restrictions_custom_label" msgid="6949268049087435132">"ಅಪ್ಲಿಕೇಶನ್ ನಿರ್ಬಂಧಗಳನ್ನು ಹೊಂದಿಸಿ"</string>
<string name="user_restrictions_controlled_by" msgid="2821526006742851624">"<xliff:g id="APP">%1$s</xliff:g> ಮೂಲಕ ನಿಯಂತ್ರಿಸಲಾಗುತ್ತಿದೆ"</string>
@@ -2851,7 +2851,7 @@
<string name="nfc_and_payment_settings_payment_off_nfc_off_summary" msgid="7132040463607801625">"NFC ಆಫ್ ಆಗಿರುವ ಕಾರಣ ಲಭ್ಯವಿಲ್ಲ"</string>
<string name="nfc_and_payment_settings_no_payment_installed_summary" msgid="4879818114908207465">"ಬಳಸಲು, ಮೊದಲು ಪಾವತಿ ಆ್ಯಪ್ ಅನ್ನು ಇನ್ಸ್ಟಾಲ್ ಮಾಡಿ"</string>
<string name="app_and_notification_dashboard_summary" msgid="8047683010984186106">"ಇತ್ತೀಚಿನ ಆ್ಯಪ್ಗಳು, ಡೀಫಾಲ್ಟ್ ಆ್ಯಪ್ಗಳು"</string>
- <string name="notification_settings_work_profile" msgid="6076211850526353975">"ಕೆಲಸದ ಪ್ರೊಫೈಲ್ನಲ್ಲಿರುವ ಅಪ್ಲಿಕೇಶನ್ಗಳಿಗೆ ಅಧಿಸೂಚನೆ ಪ್ರವೇಶ ಲಭ್ಯವಿಲ್ಲ."</string>
+ <string name="notification_settings_work_profile" msgid="6076211850526353975">"ಕೆಲಸದ ಪ್ರೊಫೈಲ್ನಲ್ಲಿರುವ ಅಪ್ಲಿಕೇಶನ್ಗಳಿಗೆ ಅಧಿಸೂಚನೆ ಆ್ಯಕ್ಸೆಸ್ ಲಭ್ಯವಿಲ್ಲ."</string>
<string name="account_dashboard_title" msgid="8228773251948253914">"ಪಾಸ್ವರ್ಡ್ಗಳು ಮತ್ತು ಖಾತೆಗಳು"</string>
<string name="account_dashboard_default_summary" msgid="1730719656099599488">"ಉಳಿಸಲಾದ ಪಾಸ್ವರ್ಡ್ಗಳು, ಸ್ವಯಂ ಭರ್ತಿ, ಸಿಂಕ್ ಮಾಡಿದ ಖಾತೆಗಳು"</string>
<string name="app_default_dashboard_title" msgid="4071015747629103216">"ಡಿಫಾಲ್ಟ್ ಅಪ್ಲಿಕೇಶನ್ಗಳು"</string>
@@ -3254,7 +3254,7 @@
<string name="nls_feature_reply_summary" msgid="4492543411395565556">"ಇದು ಸಂದೇಶಗಳಿಗೆ ಪ್ರತ್ಯುತ್ತರ ನೀಡಬಹುದು ಮತ್ತು ಅಧಿಸೂಚನೆಗಳನ್ನು ಸ್ನೂಜ್ ಮಾಡುವುದು ಅಥವಾ ವಜಾಗೊಳಿಸುವುದು ಮತ್ತು ಕರೆಗಳಿಗೆ ಉತ್ತರಿಸುವುದು ಸೇರಿದಂತೆ ಅಧಿಸೂಚನೆಗಳಲ್ಲಿನ ಬಟನ್ಗಳ ಮೇಲೆ ಕ್ರಮ ತೆಗೆದುಕೊಳ್ಳಬಹುದು."</string>
<string name="nls_feature_settings_title" msgid="8208164329853194414">"ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು ಬದಲಾಯಿಸಿ"</string>
<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_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="notif_type_ongoing" msgid="135675014223627555">"ನೈಜ ಸಮಯ"</string>
@@ -3559,7 +3559,7 @@
<string name="default_phone_title" msgid="7616730756650803827">"ಫೋನ್ ಅಪ್ಲಿಕೇಶನ್"</string>
<string name="system_app" msgid="1863291702508355041">"(ಸಿಸ್ಟಂ)"</string>
<string name="apps_storage" msgid="643866814746927111">"ಆ್ಯಪ್ಗಳ ಸಂಗ್ರಹ"</string>
- <string name="usage_access" msgid="5487993885373893282">"ಬಳಕೆ ಪ್ರವೇಶ"</string>
+ <string name="usage_access" msgid="5487993885373893282">"ಬಳಕೆ ಆ್ಯಕ್ಸೆಸ್"</string>
<string name="permit_usage_access" msgid="179630895262172674">"ಬಳಕೆ ಪ್ರವೇಶವನ್ನು ಅನುಮತಿಸಿ"</string>
<string name="time_spent_in_app_pref_title" msgid="25327097913383330">"ವೀಕ್ಷಣಾ ಅವಧಿ"</string>
<string name="usage_access_description" msgid="8547716253713890707">"ಬಳಕೆ ಪ್ರವೇಶವು ನೀವು ಇತರ ಯಾವ ಅಪ್ಲಿಕೇಶನ್ಗಳನ್ನು ಬಳಸುತ್ತಿರುವಿರಿ ಮತ್ತು ಎಷ್ಟು ಬಾರಿ ಎಂಬುದನ್ನು ಅಲ್ಲದೆ ನಿಮ್ಮ ವಾಹಕ, ಭಾಷೆ ಸೆಟ್ಟಿಂಗ್ಗಳು ಹಾಗೂ ಇತರ ವಿವರಗಳನ್ನು ಟ್ರ್ಯಾಕ್ ಮಾಡಲು ಅನುಮತಿಸುತ್ತದೆ."</string>
@@ -3623,7 +3623,7 @@
<string name="assist_access_screenshot_title" msgid="4395902231753643633">"ಸ್ಕ್ರೀನ್ಶಾಟ್ ಬಳಸಿ"</string>
<string name="assist_access_screenshot_summary" msgid="5276593070956201863">"ಸಹಾಯಕ ಅಪ್ಲಿಕೇಶನ್ಗೆ ಪರದೆಯ ಚಿತ್ರವನ್ನು ಪ್ರವೇಶಿಸಲು ಅನುಮತಿಸಿ"</string>
<string name="assist_flash_title" msgid="5449512572885550108">"ಫ್ಲ್ಯಾಶ್ ಪರದೆ"</string>
- <string name="assist_flash_summary" msgid="3032289860177784594">"ಪರದೆ ಅಥವಾ ಸ್ಕ್ರೀನ್ಶಾಟ್ನಿಂದ ಪಠ್ಯವನ್ನು ಸಹಾಯ ಅಪ್ಲಿಕೇಶನ್ ಪ್ರವೇಶ ಮಾಡಿದಾಗ ಪರದೆಯ ಅಂಚುಗಳು ಫ್ಲ್ಯಾಶ್ ಆಗುವುದು"</string>
+ <string name="assist_flash_summary" msgid="3032289860177784594">"ಪರದೆ ಅಥವಾ ಸ್ಕ್ರೀನ್ಶಾಟ್ನಿಂದ ಪಠ್ಯವನ್ನು ಸಹಾಯ ಅಪ್ಲಿಕೇಶನ್ ಆ್ಯಕ್ಸೆಸ್ ಮಾಡಿದಾಗ ಪರದೆಯ ಅಂಚುಗಳು ಫ್ಲ್ಯಾಶ್ ಆಗುವುದು"</string>
<string name="assist_footer" msgid="8248015363806299068">"ನೀವು ವೀಕ್ಷಿಸುತ್ತಿರುವ ಪರದೆಯ ಮಾಹಿತಿಯನ್ನು ಆಧರಿಸಿ ಸಹಾಯಕ ಅಪ್ಲಿಕೇಶನ್ಗಳು ನಿಮಗೆ ಸಹಾಯ ಮಾಡಬಹುದು. ನಿಮಗೆ ಸಂಪೂರ್ಣ ಸಹಾಯ ನೀಡಲು ಕೆಲವು ಅಪ್ಲಿಕೇಶನ್ಗಳು ಲಾಂಚರ್ ಮತ್ತು ಧ್ವನಿ ಇನ್ಪುಟ್ ಸೇವೆ ಎರಡನ್ನೂ ಬೆಂಬಲಿಸುತ್ತವೆ."</string>
<string name="average_memory_use" msgid="717313706368825388">"ಸರಾಸರಿ ಮೆಮೊರಿ ಬಳಕೆ"</string>
<string name="maximum_memory_use" msgid="2171779724001152933">"ಗರಿಷ್ಠ ಮೆಮೊರಿ ಬಳಕೆ"</string>
@@ -3643,7 +3643,7 @@
<string name="running_frequency" msgid="7260225121706316639">"ಫ್ರೀಕ್ವೆನ್ಸಿ"</string>
<string name="memory_maximum_usage" msgid="2047013391595835607">"ಗರಿಷ್ಠ ಬಳಕೆ"</string>
<string name="no_data_usage" msgid="4665617440434654132">"ಡೇಟಾ ಬಳಸಲಾಗಿಲ್ಲ"</string>
- <string name="zen_access_warning_dialog_title" msgid="6323325813123130154">"<xliff:g id="APP">%1$s</xliff:g> ಗೆ ಅಡಚಣೆ ಮಾಡಬೇಡಿಗೆ ಪ್ರವೇಶ ಅನುಮತಿಸುವುದೇ?"</string>
+ <string name="zen_access_warning_dialog_title" msgid="6323325813123130154">"<xliff:g id="APP">%1$s</xliff:g> ಗೆ ಅಡಚಣೆ ಮಾಡಬೇಡಿಗೆ ಆ್ಯಕ್ಸೆಸ್ ಅನುಮತಿಸುವುದೇ?"</string>
<string name="zen_access_warning_dialog_summary" msgid="8468714854067428987">"ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅಡಚಣೆ ಮಾಡಬೇಡಿ ಆನ್/ಆಫ್ ಮಾಡಲು ಹಾಗೂ ಸಂಬಂಧಿಸಿದ ಸೆಟ್ಟಿಂಗ್ಗಳಿಗೆ ಬದಲಾವಣೆಗಳನ್ನು ಮಾಡಲು ಸಾಧ್ಯವಾಗುತ್ತದೆ."</string>
<string name="zen_access_disabled_package_warning" msgid="6565908224294537889">"ಅಧಿಸೂಚನೆ ಪ್ರವೇಶಗಳು ಆನ್ ಆಗಿರುವ ಕಾರಣ ಕಡ್ಡಾಯವಾಗಿ ಆನ್ ಆಗಿ ಉಳಿಯಬೇಕು"</string>
<string name="zen_access_revoke_warning_dialog_title" msgid="7377261509261811449">"<xliff:g id="APP">%1$s</xliff:g> ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅಡಚಣೆ ಮಾಡಬೇಡಿಗೆ ಪ್ರವೇಶವನ್ನು ಹಿಂತೆಗೆದುಕೊಳ್ಳುವುದೇ?"</string>
@@ -3658,7 +3658,7 @@
<string name="system_alert_window_settings" msgid="6458633954424862521">"ಇತರ ಆ್ಯಪ್ಗಳ ಮೇಲೆ ಪ್ರದರ್ಶಿಸಿ"</string>
<string name="permit_draw_overlay" msgid="4468994037192804075">"ಇತರ ಆ್ಯಪ್ ಮೇಲೆ ಡಿಸ್ಪ್ಲೇ ಮಾಡಲು ಅನುಮತಿಸಿ"</string>
<string name="allow_overlay_description" msgid="1607235723669496298">"ನೀವು ಬಳಸುತ್ತಿರುವ ಇತರ ಆ್ಯಪ್ಗಳ ಮೇಲೆ ಈ ಆ್ಯಪ್ ಅನ್ನು ಪ್ರದರ್ಶಿಸಲು ಅನುಮತಿ ನೀಡಿ. ಪರದೆಯಲ್ಲಿ ನೀವು ಎಲ್ಲಿ ಟ್ಯಾಪ್ ಮಾಡುತ್ತೀರಿ ಎಂಬುದನ್ನು ಅಥವಾ ಏನನ್ನು ಪ್ರದರ್ಶಿಸಲಾಗುತ್ತಿದೆ ಎಂಬುದನ್ನು ನೋಡಲು ಈ ಆ್ಯಪ್ಗೆ ಸಾಧ್ಯವಾಗುತ್ತದೆ."</string>
- <string name="manage_external_storage_title" msgid="8024521099838816100">"ಎಲ್ಲಾ ಫೈಲ್ಗಳ ಪ್ರವೇಶ"</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="filter_manage_external_storage" msgid="6751640571715343804">"ಎಲ್ಲಾ ಫೈಲ್ಗಳನ್ನು ಪ್ರವೇಶಿಸಬಹುದು"</string>
@@ -3714,9 +3714,9 @@
<string name="disabled_by_policy_parental_consent" msgid="9166060049019018978">"ಈ ಸೆಟ್ಟಿಂಗ್ ಅನ್ನು ಬದಲಾಯಿಸಲು ಅನುಮತಿಸಲು ಫೋನ್ ಅನ್ನು ನಿಮ್ಮ ಪೋಷಕರಿಗೆ ಹಸ್ತಾಂತರಿಸಿ."</string>
<string name="default_admin_support_msg" msgid="8816296554831532033">"ಹೆಚ್ಚಿನ ಮಾಹಿತಿಗಾಗಿ, ನಿಮ್ಮ IT ನಿರ್ವಾಹಕರನ್ನು ಸಂಪರ್ಕಿಸಿ"</string>
<string name="admin_support_more_info" msgid="8407433155725898290">"ಇನ್ನಷ್ಟು ವಿವರಗಳು"</string>
- <string name="admin_profile_owner_message" msgid="8860709969532649195">"ನಿಮ್ಮ ನಿರ್ವಾಹಕರು ಸೆಟ್ಟಿಂಗ್ಗಳು, ಅನುಮತಿಗಳು, ಕಾರ್ಪೊರೇಟ್ ಪ್ರವೇಶ, ನೆಟ್ವರ್ಕ್ ಚಟುವಟಿಕೆ ಮತ್ತು ಸಾಧನದ ಸ್ಥಳ ಮಾಹಿತಿಯನ್ನು ಒಳಗೊಂಡಂತೆ ನಿಮ್ಮ ಕೆಲಸದ ಪ್ರೊಫೈಲ್ಗೆ ಸಂಬಂಧಿಸಿದ ಅಪ್ಲಿಕೇಶನ್ಗಳು ಮತ್ತು ಡೇಟಾವನ್ನು ಮೇಲ್ವಿಚಾರಣೆ ಮಾಡಬಹುದು ಮತ್ತು ನಿರ್ವಹಿಸಬಹುದು."</string>
- <string name="admin_profile_owner_user_message" msgid="4929926887231544950">"ನಿಮ್ಮ ನಿರ್ವಾಹಕರು ಸೆಟ್ಟಿಂಗ್ಗಳು, ಅನುಮತಿಗಳು, ಕಾರ್ಪೊರೇಟ್ ಪ್ರವೇಶ, ನೆಟ್ವರ್ಕ್ ಚಟುವಟಿಕೆ ಮತ್ತು ಸಾಧನದ ಸ್ಥಳ ಮಾಹಿತಿಯನ್ನು ಒಳಗೊಂಡಂತೆ ಈ ಬಳಕೆದಾರರಿಗೆ ಸಂಬಂಧಿಸಿದ ಅಪ್ಲಿಕೇಶನ್ಗಳು ಮತ್ತು ಡೇಟಾವನ್ನು ಮೇಲ್ವಿಚಾರಣೆ ಮಾಡಬಹುದು ಮತ್ತು ನಿರ್ವಹಿಸಬಹುದು."</string>
- <string name="admin_device_owner_message" msgid="5503131744126520590">"ನಿಮ್ಮ ನಿರ್ವಾಹಕರು ಸೆಟ್ಟಿಂಗ್ಗಳು, ಅನುಮತಿಗಳು, ಕಾರ್ಪೊರೇಟ್ ಪ್ರವೇಶ, ನೆಟ್ವರ್ಕ್ ಚಟುವಟಿಕೆ ಮತ್ತು ಸಾಧನದ ಸ್ಥಳ ಮಾಹಿತಿಯನ್ನು ಒಳಗೊಂಡಂತೆ ಈ ಸಾಧನಕ್ಕೆ ಸಂಬಂಧಿಸಿದ ಅಪ್ಲಿಕೇಶನ್ಗಳು ಮತ್ತು ಡೇಟಾವನ್ನು ಮೇಲ್ವಿಚಾರಣೆ ಮಾಡಬಹುದು ಮತ್ತು ನಿರ್ವಹಿಸಬಹುದು."</string>
+ <string name="admin_profile_owner_message" msgid="8860709969532649195">"ನಿಮ್ಮ ನಿರ್ವಾಹಕರು ಸೆಟ್ಟಿಂಗ್ಗಳು, ಅನುಮತಿಗಳು, ಕಾರ್ಪೊರೇಟ್ ಆ್ಯಕ್ಸೆಸ್, ನೆಟ್ವರ್ಕ್ ಚಟುವಟಿಕೆ ಮತ್ತು ಸಾಧನದ ಸ್ಥಳ ಮಾಹಿತಿಯನ್ನು ಒಳಗೊಂಡಂತೆ ನಿಮ್ಮ ಕೆಲಸದ ಪ್ರೊಫೈಲ್ಗೆ ಸಂಬಂಧಿಸಿದ ಅಪ್ಲಿಕೇಶನ್ಗಳು ಮತ್ತು ಡೇಟಾವನ್ನು ಮೇಲ್ವಿಚಾರಣೆ ಮಾಡಬಹುದು ಮತ್ತು ನಿರ್ವಹಿಸಬಹುದು."</string>
+ <string name="admin_profile_owner_user_message" msgid="4929926887231544950">"ನಿಮ್ಮ ನಿರ್ವಾಹಕರು ಸೆಟ್ಟಿಂಗ್ಗಳು, ಅನುಮತಿಗಳು, ಕಾರ್ಪೊರೇಟ್ ಆ್ಯಕ್ಸೆಸ್, ನೆಟ್ವರ್ಕ್ ಚಟುವಟಿಕೆ ಮತ್ತು ಸಾಧನದ ಸ್ಥಳ ಮಾಹಿತಿಯನ್ನು ಒಳಗೊಂಡಂತೆ ಈ ಬಳಕೆದಾರರಿಗೆ ಸಂಬಂಧಿಸಿದ ಅಪ್ಲಿಕೇಶನ್ಗಳು ಮತ್ತು ಡೇಟಾವನ್ನು ಮೇಲ್ವಿಚಾರಣೆ ಮಾಡಬಹುದು ಮತ್ತು ನಿರ್ವಹಿಸಬಹುದು."</string>
+ <string name="admin_device_owner_message" msgid="5503131744126520590">"ನಿಮ್ಮ ನಿರ್ವಾಹಕರು ಸೆಟ್ಟಿಂಗ್ಗಳು, ಅನುಮತಿಗಳು, ಕಾರ್ಪೊರೇಟ್ ಆ್ಯಕ್ಸೆಸ್, ನೆಟ್ವರ್ಕ್ ಚಟುವಟಿಕೆ ಮತ್ತು ಸಾಧನದ ಸ್ಥಳ ಮಾಹಿತಿಯನ್ನು ಒಳಗೊಂಡಂತೆ ಈ ಸಾಧನಕ್ಕೆ ಸಂಬಂಧಿಸಿದ ಅಪ್ಲಿಕೇಶನ್ಗಳು ಮತ್ತು ಡೇಟಾವನ್ನು ಮೇಲ್ವಿಚಾರಣೆ ಮಾಡಬಹುದು ಮತ್ತು ನಿರ್ವಹಿಸಬಹುದು."</string>
<string name="admin_financed_message" msgid="1156197630834947884">"ನಿಮ್ಮ ಸಾಧನ ನಿರ್ವಾಹಕರಿಗೆ ಈ ಸಾಧನದ ಜೊತೆಗೆ ಸಂಯೋಜಿತವಾಗಿರುವ ಡೇಟಾವನ್ನು ಪ್ರವೇಶಿಸಲು, ಆ್ಯಪ್ಗಳನ್ನು ನಿರ್ವಹಿಸಲು ಮತ್ತು ಈ ಸಾಧನಗಳ ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು ಬದಲಾಯಿಸಲು ಸಾಧ್ಯವಾಗುತ್ತದೆ."</string>
<string name="condition_turn_off" msgid="402707350778441939">"ಆಫ್ ಮಾಡಿ"</string>
<string name="condition_turn_on" msgid="3911077299444314791">"ಆನ್ ಮಾಡಿ"</string>
@@ -3849,7 +3849,7 @@
<string name="display_cutout_emulation_keywords" msgid="4506580703807358127">"ಕಟ್ಔಟ್ ಪ್ರದರ್ಶನ, ನಾಚ್"</string>
<string name="overlay_option_device_default" msgid="7986355499809313848">"ಸಾಧನದ ಡೀಫಾಲ್ಟ್"</string>
<string name="overlay_toast_failed_to_apply" msgid="4839587811338164960">"ಓವರ್ಲೇ ಅನ್ನು ಅನ್ವಯಿಸಲು ವಿಫಲವಾಗಿದೆ"</string>
- <string name="special_access" msgid="1767980727423395147">"ವಿಶೇಷ ಆ್ಯಪ್ ಪ್ರವೇಶ"</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>
@@ -3868,7 +3868,7 @@
<string name="developer_smallest_width" msgid="632354817870920911">"ಚಿಕ್ಕದಾದ ಅಗಲ"</string>
<string name="premium_sms_none" msgid="8737045049886416739">"ಯಾವುದೇ ಇನ್ಸ್ಟಾಲ್ ಮಾಡಿದ ಆ್ಯಪ್ಗಳು ಪ್ರೀಮಿಯಂ SMS ಪ್ರವೇಶವನ್ನು ವಿನಂತಿಸಿಲ್ಲ"</string>
<string name="premium_sms_warning" msgid="2192300872411073324">"ಪ್ರೀಮಿಯಂ SMS ನಿಮ್ಮ ವೆಚ್ಚಗಳಿಗೆ ಕಾರಣವಾಗಬಹುದು ಮತ್ತು ಇದನ್ನು ನಿಮ್ಮ ವಾಹಕ ಬಿಲ್ಗಳಿಗೆ ಸೇರಿಸಲಾಗುತ್ತದೆ. ನೀವು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅನುಮತಿಯನ್ನು ಸಕ್ರೀಯಗೊಳಿಸಿದರೆ, ನೀವು ಆ ಅಪ್ಲಿಕೇಶನ್ ಬಳಸಿಕೊಂಡು ಪ್ರೀಮಿಯಂ SMS ಕಳುಹಿಸಲು ಸಾಧ್ಯವಾಗುತ್ತದೆ."</string>
- <string name="premium_sms_access" msgid="5605970342699013212">"ಪ್ರೀಮಿಯಂ SMS ಪ್ರವೇಶ"</string>
+ <string name="premium_sms_access" msgid="5605970342699013212">"ಪ್ರೀಮಿಯಂ SMS ಆ್ಯಕ್ಸೆಸ್"</string>
<string name="bluetooth_disabled" msgid="835838280837359514">"ಆಫ್"</string>
<string name="bluetooth_connected_summary" msgid="8043167194934315712">"<xliff:g id="ID_1">%1$s</xliff:g> ಗೆ ಸಂಪರ್ಕಿಸಲಾಗಿದೆ"</string>
<string name="bluetooth_connected_multiple_devices_summary" msgid="2294954614327771844">"ಹಲವು ಸಾಧನಗಳಿಗೆ ಸಂಪರ್ಕಿಸಲಾಗಿದೆ"</string>
@@ -3976,10 +3976,10 @@
<string name="enterprise_privacy_settings" msgid="786350385374794180">"ನಿರ್ವಹಿಸುವ ಸಾಧನದ ಮಾಹಿತಿ"</string>
<string name="enterprise_privacy_settings_summary_generic" msgid="5471858290610344646">"ನಿಮ್ಮ ಸಂಸ್ಥೆಯು ನಿರ್ವಹಿಸುವ ಬದಲಾವಣೆಗಳು ಮತ್ತು ಸೆಟ್ಟಿಂಗ್ಗಳು"</string>
<string name="enterprise_privacy_settings_summary_with_name" msgid="1315413275836515937">"<xliff:g id="ORGANIZATION_NAME">%s</xliff:g> ನಿರ್ವಹಿಸುವ ಬದಲಾವಣೆಗಳು ಮತ್ತು ಸೆಟ್ಟಿಂಗ್ಗಳು"</string>
- <string name="enterprise_privacy_header" msgid="4626225398848641603">"ನಿಮ್ಮ ಕೆಲಸದ ಡೇಟಾಗೆ ಪ್ರವೇಶ ಒದಗಿಸಲು, ನಿಮ್ಮ ಸಂಸ್ಥೆಯು ನಿಮ್ಮ ಸಾಧನದಲ್ಲಿ ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು ಬದಲಾಯಿಸಬಹುದು ಮತ್ತು ಸಾಫ್ಟ್ವೇರ್ ಸ್ಥಾಪಿಸಬಹುದು.\n\nಹೆಚ್ಚಿನ ವಿವರಗಳಿಗಾಗಿ, ನಿಮ್ಮ ಸಂಸ್ಥೆಯ ನಿರ್ವಾಹಕರನ್ನು ಸಂಪರ್ಕಿಸಿ."</string>
+ <string name="enterprise_privacy_header" msgid="4626225398848641603">"ನಿಮ್ಮ ಕೆಲಸದ ಡೇಟಾಗೆ ಆ್ಯಕ್ಸೆಸ್ ಒದಗಿಸಲು, ನಿಮ್ಮ ಸಂಸ್ಥೆಯು ನಿಮ್ಮ ಸಾಧನದಲ್ಲಿ ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು ಬದಲಾಯಿಸಬಹುದು ಮತ್ತು ಸಾಫ್ಟ್ವೇರ್ ಸ್ಥಾಪಿಸಬಹುದು.\n\nಹೆಚ್ಚಿನ ವಿವರಗಳಿಗಾಗಿ, ನಿಮ್ಮ ಸಂಸ್ಥೆಯ ನಿರ್ವಾಹಕರನ್ನು ಸಂಪರ್ಕಿಸಿ."</string>
<string name="enterprise_privacy_exposure_category" msgid="2507761423540037308">"ನಿಮ್ಮ ಸಂಸ್ಥೆಯು ನೋಡಬಹುದಾದ ಮಾಹಿತಿಯ ವಿಧಗಳು"</string>
<string name="enterprise_privacy_exposure_changes_category" msgid="5459989751333816587">"ನಿಮ್ಮ ಸಂಸ್ಥೆಯ ನಿರ್ವಾಹಕರು ಮಾಡಿರುವ ಬದಲಾವಣೆಗಳು"</string>
- <string name="enterprise_privacy_device_access_category" msgid="140157499478630004">"ಈ ಸಾಧನಕ್ಕೆ ನಿಮ್ಮ ಪ್ರವೇಶ"</string>
+ <string name="enterprise_privacy_device_access_category" msgid="140157499478630004">"ಈ ಸಾಧನಕ್ಕೆ ನಿಮ್ಮ ಆ್ಯಕ್ಸೆಸ್"</string>
<string name="enterprise_privacy_enterprise_data" msgid="3963070078195245028">"ಇಮೇಲ್ ಮತ್ತು ಕ್ಯಾಲೆಂಡರ್ನಂತಹ ನಿಮ್ಮ ಕೆಲಸದ ಖಾತೆ ಜೊತೆಗೆ ಸಂಯೋಜಿತವಾಗಿರುವ ಡೇಟಾ"</string>
<string name="enterprise_privacy_installed_packages" msgid="6707006112254572820">"ನಿಮ್ಮ ಸಾಧನದಲ್ಲಿರುವ ಅಪ್ಲಿಕೇಶನ್ಗಳ ಪಟ್ಟಿ"</string>
<string name="enterprise_privacy_usage_stats" msgid="6328506963853465534">"ಪ್ರತಿ ಅಪ್ಲಿಕೇಶನ್ನಲ್ಲಿ ವ್ಯಯಿಸಿದ ಸಮಯ ಮತ್ತು ದಿನಾಂಕ"</string>
diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml
index d6e323f..8d10452 100644
--- a/res/values-lt/strings.xml
+++ b/res/values-lt/strings.xml
@@ -909,10 +909,8 @@
<skip />
<string name="wifi_hotspot_speed_summary_unavailable" msgid="7276080644693388756">"Nepasiekiama jūsų šalyje ar regione"</string>
<string name="wifi_hotspot_speed_footer" msgid="8846939503916795002">"Jei pageidaujamas dažnis nepasiekiamas, viešosios interneto prieigos taškas gali naudoti kitą dažnį. Pakeitus dažnį gali pasikeisti viešosios interneto prieigos taško saugos nustatymai."</string>
- <!-- no translation found for wifi_hotspot_security_summary_unavailable (117582979310345853) -->
- <skip />
- <!-- no translation found for wifi_hotspot_security_footer (4608329688744949796) -->
- <skip />
+ <string name="wifi_hotspot_security_summary_unavailable" msgid="117582979310345853">"Nepasiekiama su 6 GHz"</string>
+ <string name="wifi_hotspot_security_footer" msgid="4608329688744949796">"Saugos nustatymai gali pasikeisti, jei pakeisite viešosios interneto prieigos taško dažnį"</string>
<string name="wifi_tether_starting" msgid="8879874184033857814">"Įjungiamas viešosios interneto prieigos taškas…"</string>
<string name="wifi_tether_stopping" msgid="4416492968019409188">"Išjungiamas viešosios interneto prieigos taškas…"</string>
<string name="wifi_tether_carrier_unsupport_dialog_title" msgid="3089432578433978073">"Įrenginio kaip modemo naudojimas nepasiekiamas"</string>
@@ -2705,14 +2703,12 @@
<string name="enable_guest_calling" msgid="8300355036005240911">"Leidimas svečiui naudoti telefoną"</string>
<string name="enable_guest_calling_summary" msgid="4748224917641204782">"Skambučių istorija bus bendrinama su naudotoju svečiu"</string>
<string name="user_enable_calling_sms" msgid="8546430559552381324">"Įjungti telefono skambučius ir SMS"</string>
- <!-- no translation found for user_grant_admin (5942118263054572074) -->
- <skip />
+ <string name="user_grant_admin" msgid="5942118263054572074">"Nustatyti šį naudotoją kaip administratorių"</string>
<string name="user_remove_user" msgid="8468203789739693845">"Naudotojo ištrynimas"</string>
<string name="user_enable_calling_and_sms_confirm_title" msgid="4041510268838725520">"Įjungti telefono skambučius ir SMS?"</string>
<string name="user_enable_calling_and_sms_confirm_message" msgid="367792286597449922">"Skambučių ir SMS istorija bus bendrinama su šiuo naudotoju."</string>
<string name="user_revoke_admin_confirm_title" msgid="3057842401861731863">"Pašalinti administratoriaus privilegijas?"</string>
- <!-- no translation found for user_revoke_admin_confirm_message (9207187319308572958) -->
- <skip />
+ <string name="user_revoke_admin_confirm_message" msgid="9207187319308572958">"Jei pašalinsite šio naudotojo administratoriaus privilegijas, jūs ar kitas administratorius galės jas vėl suteikti vėliau."</string>
<string name="emergency_info_title" msgid="8233682750953695582">"Kritinės padėties informacija"</string>
<string name="emergency_info_summary" msgid="8463622253016757697">"<xliff:g id="USER_NAME">%1$s</xliff:g> informacija ir kontaktai"</string>
<string name="open_app_button" msgid="5025229765547191710">"Atidaryti „<xliff:g id="APP_NAME">%1$s</xliff:g>“"</string>
diff --git a/res/values-ml/strings.xml b/res/values-ml/strings.xml
index cfd4b53..79c1db0 100644
--- a/res/values-ml/strings.xml
+++ b/res/values-ml/strings.xml
@@ -3244,11 +3244,11 @@
<string name="notification_listener_security_warning_title" msgid="5791700876622858363">"<xliff:g id="SERVICE">%1$s</xliff:g> എന്നതിന് അറിയിപ്പ് ആക്സസ് അനുവദിക്കണോ?"</string>
<string name="notification_listener_security_warning_summary" msgid="1131986567509818121">"കോൺടാക്റ്റ് പേരുകൾ, ഫോട്ടോകൾ, നിങ്ങൾക്ക് ലഭിക്കുന്ന സന്ദേശങ്ങളുടെ വാചകം എന്നിവ പോലുള്ള വ്യക്തിപരമായ വിവരങ്ങൾ ഉൾപ്പെടെ എല്ലാ അറിയിപ്പുകളും <xliff:g id="NOTIFICATION_LISTENER_NAME">%1$s</xliff:g> എന്ന ആപ്പിന് വായിക്കാൻ കഴിയും. അറിയിപ്പുകൾ ഡിസ്മിസ് ചെയ്യാനും സ്നൂസ് ചെയ്യാനും ഫോൺ കോളുകൾക്ക് മറുപടി നൽകുന്നതുൾപ്പെടെ അറിയിപ്പുകളിലെ ബട്ടണുകളിൽ നടപടിയെടുക്കാനും ഈ ആപ്പിന് കഴിയും. \n\n എന്ന ആപ്പിന് \'ശല്യപ്പെടുത്തരുത്\' ഓൺ അല്ലെങ്കിൽ ഓഫ് ആക്കാനും ബന്ധപ്പെട്ട ക്രമീകരണം മാറ്റാനുമുള്ള ശേഷിയും ഇത് നൽകും."</string>
<string name="nls_warning_prompt" msgid="1486887096703743841">"<xliff:g id="NOTIFICATION_LISTENER_NAME">%1$s</xliff:g> എന്ന ആപ്പിന് ഇനിപറയുന്നവ ചെയ്യാനാകും:"</string>
- <string name="nls_feature_read_title" msgid="7629713268744220437">"നിങ്ങളുടെ അറിയിപ്പുകൾ വായിക്കുക"</string>
+ <string name="nls_feature_read_title" msgid="7629713268744220437">"നിങ്ങളുടെ അറിയിപ്പുകൾ വായിക്കാം"</string>
<string name="nls_feature_read_summary" msgid="1064698238110273593">"നിങ്ങളുടെ കോൺടാക്റ്റുകൾ, സന്ദേശങ്ങൾ, ഫോട്ടോകൾ പോലുള്ള വ്യക്തിപരമായ വിവരങ്ങൾ ഉൾപ്പെടെയുള്ള അറിയിപ്പുകൾ ഇതിന് വായിക്കാൻ കഴിയും."</string>
- <string name="nls_feature_reply_title" msgid="7925455553821362039">"സന്ദേശങ്ങൾക്ക് മറുപടി നൽകുക"</string>
+ <string name="nls_feature_reply_title" msgid="7925455553821362039">"സന്ദേശങ്ങൾക്ക് മറുപടി നൽകാം"</string>
<string name="nls_feature_reply_summary" msgid="4492543411395565556">"സ്നൂസ് ചെയ്യൽ അല്ലെങ്കിൽ അറിയിപ്പുകൾ ഡിസ്മിസ് ചെയ്യൽ എന്നതും കോളുകൾക്ക് മറുപടി നൽകലും ഉൾപ്പെടെയുള്ള, അറിയിപ്പുകളിലെ ബട്ടണുകളിൽ നടപടിയെടുക്കാനും സന്ദേശങ്ങൾക്ക് മറുപടി നൽകാനും ഇതിന് കഴിയും."</string>
- <string name="nls_feature_settings_title" msgid="8208164329853194414">"ക്രമീകരണം മാറ്റുക"</string>
+ <string name="nls_feature_settings_title" msgid="8208164329853194414">"ക്രമീകരണം മാറ്റാം"</string>
<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>
@@ -3639,7 +3639,7 @@
<string name="running_frequency" msgid="7260225121706316639">"ഫ്രീക്വൻസി"</string>
<string name="memory_maximum_usage" msgid="2047013391595835607">"പരമാവധി ഉപയോഗം"</string>
<string name="no_data_usage" msgid="4665617440434654132">"ഡാറ്റയൊന്നും ഉപയോഗിച്ചില്ല"</string>
- <string name="zen_access_warning_dialog_title" msgid="6323325813123130154">"\'ശല്യപ്പെടുത്തരുത്\' എന്നതിലേക്ക് <xliff:g id="APP">%1$s</xliff:g>-ന് ആക്സസ് അനുവദിക്കണോ?"</string>
+ <string name="zen_access_warning_dialog_title" msgid="6323325813123130154">"\'ശല്യപ്പെടുത്തരുത്\' എന്നതിലേക്ക് <xliff:g id="APP">%1$s</xliff:g>-യ്ക്ക് ആക്സസ് അനുവദിക്കണോ?"</string>
<string name="zen_access_warning_dialog_summary" msgid="8468714854067428987">"\'ശല്യപ്പെടുത്തരുത്\' ഓൺ/ഓഫ് ആക്കാനും ബന്ധപ്പെട്ട ക്രമീകരണത്തിലേക്ക് മാറ്റങ്ങൾ വരുത്താനും ആപ്പിന് കഴിയും."</string>
<string name="zen_access_disabled_package_warning" msgid="6565908224294537889">"അറിയിപ്പ് ആക്സസ്സ് ഓണായിരിക്കുന്നതിനാൽ ഇതും ഓണായി തുടരണം"</string>
<string name="zen_access_revoke_warning_dialog_title" msgid="7377261509261811449">"\'ശല്യപ്പെടുത്തരുത്\' എന്നതിലേക്ക് <xliff:g id="APP">%1$s</xliff:g> ആപ്പിനുള്ള ആക്സസ് പിൻവലിക്കണോ?"</string>
diff --git a/res/values-mn/strings.xml b/res/values-mn/strings.xml
index a128813..295df75 100644
--- a/res/values-mn/strings.xml
+++ b/res/values-mn/strings.xml
@@ -909,10 +909,8 @@
<skip />
<string name="wifi_hotspot_speed_summary_unavailable" msgid="7276080644693388756">"Танай улс эсвэл бүс нутагт боломжгүй"</string>
<string name="wifi_hotspot_speed_footer" msgid="8846939503916795002">"Хэрэв таны сонгосон давтамж боломжгүй бол таны сүлжээний цэг өөрийг ашиглаж магадгүй. Хэрэв та давтамжийг өөрчилбөл сүлжээний цэгийн аюулгүй байдлын тохиргоо өөрчлөгдөж магадгүй."</string>
- <!-- no translation found for wifi_hotspot_security_summary_unavailable (117582979310345853) -->
- <skip />
- <!-- no translation found for wifi_hotspot_security_footer (4608329688744949796) -->
- <skip />
+ <string name="wifi_hotspot_security_summary_unavailable" msgid="117582979310345853">"6 ГГц-ээр боломжгүй"</string>
+ <string name="wifi_hotspot_security_footer" msgid="4608329688744949796">"Хэрэв та сүлжээний цэгийн давтамжийг өөрчилбөл аюулгүй байдлын тохиргоо өөрчлөгдөж магадгүй"</string>
<string name="wifi_tether_starting" msgid="8879874184033857814">"Сүлжээний цэгийг асааж байна…"</string>
<string name="wifi_tether_stopping" msgid="4416492968019409188">"Сүлжээний цэгийг унтрааж байна…"</string>
<string name="wifi_tether_carrier_unsupport_dialog_title" msgid="3089432578433978073">"Модем хийх боломжгүй байна"</string>
@@ -2705,14 +2703,12 @@
<string name="enable_guest_calling" msgid="8300355036005240911">"Зочинд утас ашиглахыг зөвшөөрөх"</string>
<string name="enable_guest_calling_summary" msgid="4748224917641204782">"Дуудлагын түүхийг зочин хэрэглэгчтэй хуваалцана"</string>
<string name="user_enable_calling_sms" msgid="8546430559552381324">"Утасны дуудлага & SMS авах"</string>
- <!-- no translation found for user_grant_admin (5942118263054572074) -->
- <skip />
+ <string name="user_grant_admin" msgid="5942118263054572074">"Энэ хэрэглэгчийг админ болгох"</string>
<string name="user_remove_user" msgid="8468203789739693845">"Хэрэглэгчийг устгах"</string>
<string name="user_enable_calling_and_sms_confirm_title" msgid="4041510268838725520">"Утасны дуудлага & SMS-г хүлээн авах уу?"</string>
<string name="user_enable_calling_and_sms_confirm_message" msgid="367792286597449922">"Энэ хэрэглэгчтэй утасны дуудлага болон SMS түүхийг хуваалцах болно."</string>
<string name="user_revoke_admin_confirm_title" msgid="3057842401861731863">"Админы эрхийг хасах уу?"</string>
- <!-- no translation found for user_revoke_admin_confirm_message (9207187319308572958) -->
- <skip />
+ <string name="user_revoke_admin_confirm_message" msgid="9207187319308572958">"Хэрэв та энэ хэрэглэгчийн админы эрхийг хасвал та эсвэл өөр админ түүнд дараа буцаан өгөх боломжтой."</string>
<string name="emergency_info_title" msgid="8233682750953695582">"Яаралтай тусламжийн мэдээлэл"</string>
<string name="emergency_info_summary" msgid="8463622253016757697">"<xliff:g id="USER_NAME">%1$s</xliff:g>-н мэдээлэл, харилцагч"</string>
<string name="open_app_button" msgid="5025229765547191710">"<xliff:g id="APP_NAME">%1$s</xliff:g>-г нээх"</string>
@@ -4653,10 +4649,8 @@
<string name="ingress_rate_limit_no_limit_entry" msgid="8741098826008012163">"Хязгааргүй"</string>
<string name="disable_phantom_process_monitor_title" msgid="8348108346706188771">"Дэд боловсруулалтын хязгаарлалтыг идэвхгүй болгох"</string>
<string name="disable_phantom_process_monitor_summary" msgid="3044464635550256985">"Аппын дэд боловсруулалтын системийн нөөцийн ашиглалтын хязгаарлалтыг идэвхгүй болгох"</string>
- <!-- no translation found for enable_notes_role_title (7662702013496114763) -->
- <skip />
- <!-- no translation found for enable_notes_role_summary (136916915155048249) -->
- <skip />
+ <string name="enable_notes_role_title" msgid="7662702013496114763">"Тэмдэглэлийн үүргийг хүчээр идэвхжүүлэх"</string>
+ <string name="enable_notes_role_summary" msgid="136916915155048249">"Тэмдэглэлийн үүргээр тэмдэглэл хөтлөх системийн нэгтгэлийг идэвхжүүлнэ үү. Хэрэв Тэмдэглэлийн үүргийг аль хэдийн идэвхжүүлсэн бол юу ч битгий хийгээрэй."</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-mr/strings.xml b/res/values-mr/strings.xml
index 261f559..ca8f624 100644
--- a/res/values-mr/strings.xml
+++ b/res/values-mr/strings.xml
@@ -412,7 +412,7 @@
<string name="security_settings_fingerprint_enroll_start_message" msgid="5010227772754175346">"तुमचे बोट सेन्सरवर ठेवा आणि व्हायब्रेशन जाणवल्यावर काढा"</string>
<string name="security_settings_udfps_enroll_start_message" msgid="5032954588171487566">"तुम्हाला व्हायब्रेशन जाणवेपर्यंत तुमची फिंगरप्रिंट सेन्सरवर चपटी ठेवा"</string>
<string name="security_settings_sfps_enroll_start_message" msgid="9054672627477685212">"बटण न दाबता, तुम्हाला व्हायब्रेशन जाणवेपर्यंत तुमची फिंगरप्रिंट सेन्सरवर ठेवा.\n\nप्रत्येक वेळी तुमचे बोट किंचित हलवा. यामुळे तुमची फिंगरप्रिंट आणखी स्पष्टपणे कॅप्चर करण्यात मदत होते."</string>
- <string name="security_settings_fingerprint_enroll_udfps_title" msgid="6665610134560896895">"फिंगरप्रिंट सेन्सरला स्पर्श करा आणि धरून ठेवा"</string>
+ <string name="security_settings_fingerprint_enroll_udfps_title" msgid="6665610134560896895">"फिंगरप्रिंट सेन्सरला स्पर्श करून धरून ठेवा"</string>
<string name="security_settings_fingerprint_enroll_repeat_title" msgid="9172202128243545021">"उचला, नंतर पुन्हा स्पर्श करा"</string>
<string name="security_settings_udfps_enroll_title_one_more_time" msgid="424937043843482410">"आणखी एकदा"</string>
<string name="security_settings_udfps_enroll_repeat_title_touch_icon" msgid="4096344864386190335">"फिंगरप्रिंट आयकन फॉलो करा"</string>
diff --git a/res/values-pa/strings.xml b/res/values-pa/strings.xml
index 6a87fdd..ab94d3b 100644
--- a/res/values-pa/strings.xml
+++ b/res/values-pa/strings.xml
@@ -2317,8 +2317,8 @@
<string name="daily_battery_usage_chart" msgid="4176059567682992686">"ਰੋਜ਼ਾਨਾ ਬੈਟਰੀ ਵਰਤੋਂ ਚਾਰਟ"</string>
<string name="hourly_battery_usage_chart" msgid="3098314511076561272">"ਪ੍ਰਤੀ ਘੰਟਾ ਬੈਟਰੀ ਵਰਤੋਂ ਚਾਰਟ"</string>
<string name="battery_usage_breakdown_title_since_last_full_charge" msgid="435006273323199906">"ਪਿਛਲੀ ਵਾਰ ਪੂਰਾ ਚਾਰਜ ਕਰਨ ਤੋਂ ਬਾਅਦ ਬੈਟਰੀ ਵਰਤੋਂ"</string>
- <string name="battery_usage_breakdown_title_for_slot" msgid="4823179483667671406">"<xliff:g id="SLOT">%s</xliff:g> ਦੇ ਲਈ ਬੈਟਰੀ ਵਰਤੋਂ"</string>
- <string name="screen_time_category_last_full_charge" msgid="8856908320256057753">"ਪਿਛਲੀ ਵਾਰ ਪੂਰਾ ਚਾਰਜ ਕਰਨ ਤੋਂ ਬਾਅਦ ਵਰਤੋਂ ਸਕ੍ਰੀਨ ਸਮਾਂ"</string>
+ <string name="battery_usage_breakdown_title_for_slot" msgid="4823179483667671406">"<xliff:g id="SLOT">%s</xliff:g> ਲਈ ਬੈਟਰੀ ਵਰਤੋਂ"</string>
+ <string name="screen_time_category_last_full_charge" msgid="8856908320256057753">"ਪਿਛਲੀ ਵਾਰ ਪੂਰਾ ਚਾਰਜ ਕਰਨ ਤੋਂ ਬਾਅਦ ਸਕ੍ਰੀਨ ਸਮਾਂ"</string>
<string name="screen_time_category_for_slot" msgid="8287722270554654959">"<xliff:g id="SLOT">%s</xliff:g> ਲਈ ਸਕ੍ਰੀਨ ਸਮਾਂ"</string>
<string name="battery_usage_spinner_breakdown_by_apps" msgid="7746337368402445072">"ਐਪਾਂ ਮੁਤਾਬਕ ਵੰਡ"</string>
<string name="battery_usage_spinner_breakdown_by_system" msgid="4646952798665973464">"ਸਿਸਟਮ ਮੁਤਾਬਕ ਵੰਡ"</string>
diff --git a/res/values-pt-rBR/strings.xml b/res/values-pt-rBR/strings.xml
index 9a83d75..0af2507 100644
--- a/res/values-pt-rBR/strings.xml
+++ b/res/values-pt-rBR/strings.xml
@@ -3249,7 +3249,7 @@
<string name="nls_feature_reply_title" msgid="7925455553821362039">"Responder a mensagens"</string>
<string name="nls_feature_reply_summary" msgid="4492543411395565556">"Ele pode responder a mensagens e acionar botões nas notificações, como ativar a soneca, dispensar notificações ou atender ligações."</string>
<string name="nls_feature_settings_title" msgid="8208164329853194414">"Mudar configurações"</string>
- <string name="nls_feature_settings_summary" msgid="3770028705648985689">"Ele pode ativar ou ativar o modo Não perturbe e mudar as configurações relacionadas a ele."</string>
+ <string name="nls_feature_settings_summary" msgid="3770028705648985689">"Ele pode ativar e desativar o modo Não perturbe e mudar as configurações relacionadas a ele."</string>
<string name="notification_listener_disable_warning_summary" msgid="8373396293802088961">"Se você desativar o acesso a notificações para <xliff:g id="NOTIFICATION_LISTENER_NAME">%1$s</xliff:g>, é possível que o acesso ao Não perturbe também seja desativado."</string>
<string name="notification_listener_disable_warning_confirm" msgid="841492108402184976">"Desativar"</string>
<string name="notification_listener_disable_warning_cancel" msgid="8802784105045594324">"Cancelar"</string>
diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml
index 296a1b2..e03d2b2 100644
--- a/res/values-pt-rPT/strings.xml
+++ b/res/values-pt-rPT/strings.xml
@@ -3118,7 +3118,7 @@
<string name="configure_notification_settings" msgid="1492820231694314376">"Notificações"</string>
<string name="notification_dashboard_summary" msgid="7530169251902320652">"Histórico de notificações, conversas"</string>
<string name="conversation_notifs_category" msgid="2549844862379963273">"Conversa"</string>
- <string name="general_notification_header" msgid="3669031068980713359">"Faça a gestão"</string>
+ <string name="general_notification_header" msgid="3669031068980713359">"Gerir"</string>
<string name="app_notification_field" msgid="3208079070539894909">"Notificações de apps"</string>
<string name="app_notification_field_summary" msgid="5981393613897713471">"Controle as notificações de apps individuais"</string>
<string name="advanced_section_header" msgid="6478709678084326738">"Geral"</string>
@@ -3134,7 +3134,7 @@
<string name="asst_importance_reset_summary" msgid="684794589254282667">"Reponha as definições de importância alteradas pelo utilizador e permita que o assistente de notificações defina prioridades."</string>
<string name="asst_capabilities_actions_replies_title" msgid="4392470465646394289">"Respostas e ações sugeridas"</string>
<string name="asst_capabilities_actions_replies_summary" msgid="416234323365645871">"São apresentadas automaticamente respostas e ações sugeridas."</string>
- <string name="notification_history_summary" msgid="5434741516307706892">"Apresentar notificações recentes e suspensas"</string>
+ <string name="notification_history_summary" msgid="5434741516307706892">"Veja as notificações recentes e suspensas"</string>
<string name="notification_history" msgid="8663811361243456201">"Histórico de notificações"</string>
<string name="notification_history_toggle" msgid="9093762294928569030">"Usar histórico de notificações"</string>
<string name="notification_history_off_title_extended" msgid="853807652537281601">"Histórico de notificações desativado"</string>
@@ -3148,7 +3148,7 @@
<string name="notification_bubbles_title" msgid="5681506665322329301">"Balões"</string>
<string name="bubbles_app_toggle_title" msgid="5319021259954576150">"Balões"</string>
<string name="bubbles_conversation_toggle_title" msgid="5225039214083311316">"Apresentar esta conversa como balão"</string>
- <string name="bubbles_conversation_toggle_summary" msgid="720229032254323578">"Mostrar ícone flutuante por cima das apps"</string>
+ <string name="bubbles_conversation_toggle_summary" msgid="720229032254323578">"Mostre ícone flutuante por cima das apps"</string>
<string name="bubbles_feature_disabled_dialog_title" msgid="1794193899792284007">"Ativar os balões para o dispositivo?"</string>
<string name="bubbles_feature_disabled_dialog_text" msgid="5275666953364031055">"A ativação dos balões para esta app também irá ativar os balões para o seu dispositivo.\n\nEsta ação afeta outras apps ou conversas que tenham autorização para aparecer em balões."</string>
<string name="bubbles_feature_disabled_button_approve" msgid="2042628067101419871">"Ativar"</string>
@@ -3177,13 +3177,13 @@
<string name="lock_screen_notifs_title" msgid="3412042692317304449">"Notificações no ecrã de bloqueio"</string>
<string name="lock_screen_notifs_show_all_summary" msgid="4226586018375762117">"Mostrar conversas predefinidas e silenciosas"</string>
<string name="lock_screen_notifs_show_all" msgid="1300418674456749664">"Mostrar conversas predefinidas e silenciosas"</string>
- <string name="lock_screen_notifs_show_alerting" msgid="6584682657382684566">"Ocultar notificações e conversas silenciosas"</string>
+ <string name="lock_screen_notifs_show_alerting" msgid="6584682657382684566">"Oculte notificações e conversas silenciosas"</string>
<string name="lock_screen_notifs_show_none" msgid="1941044980403067101">"Não mostrar notificações"</string>
<string name="lock_screen_notifs_redact" msgid="9024158855454642296">"Notificações confidenciais"</string>
<string name="lock_screen_notifs_redact_summary" msgid="1395483766035470612">"Mostrar conteúdo confidencial quando estiver bloqueado"</string>
<string name="lock_screen_notifs_redact_work" msgid="3833920196569208430">"Notificações confidenciais do perfil de trabalho"</string>
<string name="lock_screen_notifs_redact_work_summary" msgid="3238238380405430156">"Mostrar conteúdo confidencial do perfil de trabalho quando estiver bloqueado"</string>
- <string name="lock_screen_notifications_summary_show" msgid="6540443483088311328">"Mostrar os conteúdos de todas as notificações"</string>
+ <string name="lock_screen_notifications_summary_show" msgid="6540443483088311328">"Mostre conteúdos de todas as notificações"</string>
<string name="lock_screen_notifications_summary_hide" msgid="7837303171531166789">"Mostrar conteúdo confidencial apenas se desbloqueado"</string>
<string name="lock_screen_notifications_summary_disable" msgid="3388290397947365744">"Não mostrar notificações"</string>
<string name="lock_screen_notifications_interstitial_message" msgid="4688399629301178487">"Como quer que o ecrã de bloqueio seja apresentado?"</string>
@@ -3316,7 +3316,7 @@
<string name="app_notifications_not_send_desc" msgid="5683060986735070528">"Esta app não envia notificações"</string>
<string name="notification_channels" msgid="1502969522886493799">"Categorias"</string>
<string name="notification_channels_other" msgid="18159805343647908">"Outra"</string>
- <string name="no_channels" msgid="4716199078612071915">"Esta aplicação não publicou notificações"</string>
+ <string name="no_channels" msgid="4716199078612071915">"Esta app não publicou notificações"</string>
<string name="app_settings_link" msgid="6725453466705333311">"Definições adicionais na app"</string>
<string name="deleted_channels" msgid="8489800381509312964">"{count,plural, =1{# categoria apagada}other{# categorias apagadas}}"</string>
<string name="app_notification_block_title" msgid="3880322745749900296">"Bloquear tudo"</string>
diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml
index 9a83d75..0af2507 100644
--- a/res/values-pt/strings.xml
+++ b/res/values-pt/strings.xml
@@ -3249,7 +3249,7 @@
<string name="nls_feature_reply_title" msgid="7925455553821362039">"Responder a mensagens"</string>
<string name="nls_feature_reply_summary" msgid="4492543411395565556">"Ele pode responder a mensagens e acionar botões nas notificações, como ativar a soneca, dispensar notificações ou atender ligações."</string>
<string name="nls_feature_settings_title" msgid="8208164329853194414">"Mudar configurações"</string>
- <string name="nls_feature_settings_summary" msgid="3770028705648985689">"Ele pode ativar ou ativar o modo Não perturbe e mudar as configurações relacionadas a ele."</string>
+ <string name="nls_feature_settings_summary" msgid="3770028705648985689">"Ele pode ativar e desativar o modo Não perturbe e mudar as configurações relacionadas a ele."</string>
<string name="notification_listener_disable_warning_summary" msgid="8373396293802088961">"Se você desativar o acesso a notificações para <xliff:g id="NOTIFICATION_LISTENER_NAME">%1$s</xliff:g>, é possível que o acesso ao Não perturbe também seja desativado."</string>
<string name="notification_listener_disable_warning_confirm" msgid="841492108402184976">"Desativar"</string>
<string name="notification_listener_disable_warning_cancel" msgid="8802784105045594324">"Cancelar"</string>
diff --git a/res/values-sl/strings.xml b/res/values-sl/strings.xml
index eae1931..3c9d068 100644
--- a/res/values-sl/strings.xml
+++ b/res/values-sl/strings.xml
@@ -4653,10 +4653,8 @@
<string name="ingress_rate_limit_no_limit_entry" msgid="8741098826008012163">"Brez omejitev"</string>
<string name="disable_phantom_process_monitor_title" msgid="8348108346706188771">"Onemogočanje omejitev za podrejene procese"</string>
<string name="disable_phantom_process_monitor_summary" msgid="3044464635550256985">"Onemogočanje omejitev uporabe sistemskih sredstev za podrejene procese aplikacije"</string>
- <!-- no translation found for enable_notes_role_title (7662702013496114763) -->
- <skip />
- <!-- no translation found for enable_notes_role_summary (136916915155048249) -->
- <skip />
+ <string name="enable_notes_role_title" msgid="7662702013496114763">"Vsiljenje omogočanja vloge »Zapiski«"</string>
+ <string name="enable_notes_role_summary" msgid="136916915155048249">"Omogočanje integracij sistema za ustvarjanje zapiskov prek vloge »Zapiski«. Če je vloga »Zapiski« že omogočena, se ne zgodi nič."</string>
<string name="bluetooth_broadcast_dialog_title" msgid="9172775308463135884">"Oddajanje"</string>
<string name="bluetooth_broadcast_dialog_broadcast_app" msgid="1016617579194329005">"Oddajaj aplikacijo <xliff:g id="CURRENTAPP">%1$s</xliff:g>"</string>
<string name="bluetooth_broadcast_dialog_find_message" msgid="6621660851669953883">"Poslušajte oddajanja, ki se predvajajo v bližini."</string>
diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml
index 9cd9c36..cc3f51b 100644
--- a/res/values-sr/strings.xml
+++ b/res/values-sr/strings.xml
@@ -481,9 +481,9 @@
<string name="fingerprint_last_delete_message_profile_challenge" msgid="4104208067277655068">"Нећете моћи да користите отисак прста за откључавање пословног профила, овлашћивање куповина или пријављивање у пословне апликације."</string>
<string name="encryption_settings_title" msgid="2848716008695618360">"Шифровање"</string>
<string name="encrypted_summary" msgid="545623487587251207">"Шифровано"</string>
- <string name="no_screen_lock_issue_title" msgid="1814109590692792891">"Подесите закључавање екрана"</string>
+ <string name="no_screen_lock_issue_title" msgid="1814109590692792891">"Подесите откључавање екрана"</string>
<string name="no_screen_lock_issue_summary" msgid="2383217853510608406">"Да бисте побољшали безбедност, подесите PIN, шаблон или лозинку за овај уређај"</string>
- <string name="no_screen_lock_issue_action_label" msgid="2691229130486382863">"Подеси закључавање екрана"</string>
+ <string name="no_screen_lock_issue_action_label" msgid="2691229130486382863">"Подеси откључавање екрана"</string>
<string name="no_screen_lock_issue_notification_title" msgid="5718363966239208505">"Уређај нема закључавање екрана"</string>
<string name="no_screen_lock_issue_notification_text" msgid="8696194459170873345">"Да бисте побољшали безбедност, подесите PIN, шаблон или лозинку за овај уређај"</string>
<string name="suggested_lock_settings_title" msgid="7836065447159730217">"Заштитите телефон"</string>
@@ -4655,10 +4655,8 @@
<string name="ingress_rate_limit_no_limit_entry" msgid="8741098826008012163">"Без ограничења"</string>
<string name="disable_phantom_process_monitor_title" msgid="8348108346706188771">"Онемогући ограничења за подређене процесе"</string>
<string name="disable_phantom_process_monitor_summary" msgid="3044464635550256985">"Онемогућите ограничења коришћења ресурса система за подређене процесе апликације"</string>
- <!-- no translation found for enable_notes_role_title (7662702013496114763) -->
- <skip />
- <!-- no translation found for enable_notes_role_summary (136916915155048249) -->
- <skip />
+ <string name="enable_notes_role_title" msgid="7662702013496114763">"Принудно омогући улогу Белешке"</string>
+ <string name="enable_notes_role_summary" msgid="136916915155048249">"Омогућите интеграције прављења бележака у систему помоћу улоге Белешке. Ако је улога Белешке већ омогућена, не предузимајте ништа."</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-te/strings.xml b/res/values-te/strings.xml
index 4cf790c..4ad13ce 100644
--- a/res/values-te/strings.xml
+++ b/res/values-te/strings.xml
@@ -3130,7 +3130,7 @@
<string name="asst_importance_reset_summary" msgid="684794589254282667">"యూజర్ మార్చిన ప్రాముఖ్యత సెట్టింగ్లను రీసెట్ చేయండి, నోటిఫికేషన్ అసిస్టెంట్ను ప్రాధాన్యత ఇవ్వడానికి అనుమతించండి"</string>
<string name="asst_capabilities_actions_replies_title" msgid="4392470465646394289">"సూచించబడిన చర్యలు, రిప్లయిలు"</string>
<string name="asst_capabilities_actions_replies_summary" msgid="416234323365645871">"సూచనాత్మక చర్యలను & రిప్లయిలను ఆటోమేటిక్గా చూపుతుంది"</string>
- <string name="notification_history_summary" msgid="5434741516307706892">"ఇటీవలి నోటిఫికేషన్లను, అలాగే స్నూజ్ చేసిన వాటిని చూడండి"</string>
+ <string name="notification_history_summary" msgid="5434741516307706892">"ఇటీవలి, అలాగే తాత్కాలికంగా వాయిదా వేసిన నోటిఫికేషన్లను చూడండి"</string>
<string name="notification_history" msgid="8663811361243456201">"నోటిఫికేషన్ హిస్టరీ"</string>
<string name="notification_history_toggle" msgid="9093762294928569030">"నోటిఫికేషన్ హిస్టరీ ఉపయోగించండి"</string>
<string name="notification_history_off_title_extended" msgid="853807652537281601">"నోటిఫికేషన్ హిస్టరీ ఆఫ్ చేయబడింది"</string>
@@ -3143,8 +3143,8 @@
<string name="notification_badging_title" msgid="5469616894819568917">"యాప్ చిహ్నంపై నోటిఫికేషన్ డాట్"</string>
<string name="notification_bubbles_title" msgid="5681506665322329301">"బబుల్స్"</string>
<string name="bubbles_app_toggle_title" msgid="5319021259954576150">"బబుల్స్"</string>
- <string name="bubbles_conversation_toggle_title" msgid="5225039214083311316">"ఈ సంభాషణను బబుల్ చేయి"</string>
- <string name="bubbles_conversation_toggle_summary" msgid="720229032254323578">"యాప్ల పైన తేలియాడే చిహ్నాన్ని చూపించు"</string>
+ <string name="bubbles_conversation_toggle_title" msgid="5225039214083311316">"ఈ సంభాషణను బబుల్ చేయండి"</string>
+ <string name="bubbles_conversation_toggle_summary" msgid="720229032254323578">"యాప్ల పైన తేలియాడే చిహ్నాన్ని చూపించండి"</string>
<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>
@@ -3173,7 +3173,7 @@
<string name="lock_screen_notifs_title" msgid="3412042692317304449">"లాక్స్క్రీన్లో నోటిఫికేషన్లు"</string>
<string name="lock_screen_notifs_show_all_summary" msgid="4226586018375762117">"సంభాషణలు, ఆటోమేటిక్, నిశ్శబ్దం - ఈ నోటిఫికేషన్లను చూపండి"</string>
<string name="lock_screen_notifs_show_all" msgid="1300418674456749664">"సంభాషణలు, ఆటోమేటిక్, నిశ్శబ్దం - ఈ నోటిఫికేషన్లను చూపాలి"</string>
- <string name="lock_screen_notifs_show_alerting" msgid="6584682657382684566">"నిశ్శబ్ద సంభాషణలు, నోటిఫికేషన్లను దాచిపెట్టు"</string>
+ <string name="lock_screen_notifs_show_alerting" msgid="6584682657382684566">"నిశ్శబ్ద సంభాషణలు, నోటిఫికేషన్లను దాచిపెట్టండి"</string>
<string name="lock_screen_notifs_show_none" msgid="1941044980403067101">"ఏవిధమైన నోటిఫికేషన్లను చూపించవద్దు"</string>
<string name="lock_screen_notifs_redact" msgid="9024158855454642296">"గోప్యమైన నోటిఫికేషన్లు"</string>
<string name="lock_screen_notifs_redact_summary" msgid="1395483766035470612">"లాక్ అయినప్పుడు గోప్యమైన కంటెంట్ను చూపుతుంది"</string>
@@ -3211,8 +3211,8 @@
<string name="recent_convos_removed" msgid="2122932798895714203">"ఇటీవలి సంభాషణలు తీసివేయబడ్డాయి"</string>
<string name="recent_convo_removed" msgid="8686414146325958281">"సంభాషణ తీసివేయబడింది"</string>
<string name="clear" msgid="5092178335409471100">"క్లియర్ చేయండి"</string>
- <string name="conversation_onboarding_title" msgid="5194559958353468484">"ప్రముఖమైన, మార్పులు చేసిన సంభాషణలు ఇక్కడ కనిపిస్తాయి"</string>
- <string name="conversation_onboarding_summary" msgid="2484845363368486941">"మీరు ఒక సంభాషణను ఒక సారి ప్రముఖమైనదిగా మార్క్ చేసినా, లేదా సంభాషణలకు ఇతర మార్పులు ఏవైనా చేసినా, అవి ఇక్కడ కనిపిస్తాయి. \n\nసంభాషణ సెట్టింగ్లను ఇలా మార్చండి: \nకిందకు-లాగే షేడ్ను తెరవడానికి స్క్రీన్పై నుండి కిందకి స్వైప్ చేయండి, ఆపై ఒక సంభాషణను తాకి, అలాగే పట్టుకుని ఉండండి."</string>
+ <string name="conversation_onboarding_title" msgid="5194559958353468484">"ప్రాధాన్యతగల, అలాగే మార్పులు చేసిన సంభాషణలు ఇక్కడ కనిపిస్తాయి"</string>
+ <string name="conversation_onboarding_summary" msgid="2484845363368486941">"మీరు ఒక సంభాషణను ఒకసారి ప్రాధాన్యతగలదిగా మార్క్ చేసినా, లేదా సంభాషణలకు ఇతర మార్పులు ఏవైనా చేసినా, అవి ఇక్కడ కనిపిస్తాయి. \n\nసంభాషణ సెట్టింగ్లను ఇలా మార్చండి: \nకిందకు-లాగే షేడ్ను తెరవడానికి స్క్రీన్పై నుండి కిందకి స్వైప్ చేయండి, ఆపై ఒక సంభాషణను తాకి, అలాగే పట్టుకుని ఉండండి."</string>
<string name="notification_importance_min_title" msgid="7676541266705442501">"తక్కువ స్థాయికి తగ్గించండి"</string>
<string name="notification_importance_high_title" msgid="394129291760607808">"స్క్రీన్పై పాప్ అవుతుంది"</string>
<string name="notification_silence_title" msgid="4085829874452944989">"నిశ్శబ్దం"</string>
@@ -3223,10 +3223,10 @@
<string name="notification_channel_summary_priority" msgid="7225362351439076913">"సంభాషణ విభాగం ఎగువన ఉంటుంది, తేలుతున్న బబుల్లాగా కనిపిస్తుంది, లాక్ స్క్రీన్పై ప్రొఫైల్ ఫోటోను ప్రదర్శిస్తుంది"</string>
<string name="convo_not_supported_summary" msgid="4285471045268268048">"<xliff:g id="APP_NAME">%1$s</xliff:g> చాలా వరకు సంభాషణ ఫీచర్లను సపోర్ట్ చేయదు. మీరు సంభాషణను ప్రాధాన్యతగా సెట్ చేయలేరు, అలాగే సంభాషణలు తేలుతున్న బబుల్స్లా కనిపించవు."</string>
<string name="notification_channel_summary_min" msgid="8823399508450176842">"కిందకు-లాగే షేడ్లో, నోటిఫికేషన్లను ఒక లైన్కు కుదించవచ్చు"</string>
- <string name="notification_channel_summary_low" msgid="5549662596677692000">"శబ్దం లేదా వైబ్రేషన్లు ఏవీ లేవు"</string>
+ <string name="notification_channel_summary_low" msgid="5549662596677692000">"సౌండ్ లేదా వైబ్రేషన్లు ఏవీ ఉండవు"</string>
<string name="notification_conversation_summary_low" msgid="6352818857388412326">"శబ్దం లేదా వైబ్రేషన్ లేదు, సంభాషణ విభాగం దిగువన కనిపిస్తుంది"</string>
<string name="notification_channel_summary_default" msgid="3674057458265438896">"ఫోన్ సెట్టింగ్ల ఆధారంగా రింగ్ లేదా వైబ్రేట్ కావచ్చు"</string>
- <string name="notification_channel_summary_high" msgid="3411637309360617621">"పరికరాన్ని అన్లాక్ చేసినప్పుడు స్క్రీన్ పైభాగంలో ఒక బ్యానర్గా నోటిఫికేషన్లను చూపించు"</string>
+ <string name="notification_channel_summary_high" msgid="3411637309360617621">"పరికరాన్ని అన్లాక్ చేసినప్పుడు స్క్రీన్ పైభాగంలో ఒక బ్యానర్గా నోటిఫికేషన్లను చూపించండి"</string>
<string name="notification_switch_label" msgid="8029371325967501557">"\"<xliff:g id="APP_NAME">%1$s</xliff:g>\" నోటిఫికేషన్లన్నీ"</string>
<string name="notification_app_switch_label" msgid="4422902423925084193">"అన్ని <xliff:g id="APP_NAME">%1$s</xliff:g> నోటిఫికేషన్లు"</string>
<string name="notifications_sent_daily" msgid="10274479224185437">"{count,plural, =1{సుమారుగా ఒక రోజుకు # నోటిఫికేషన్}other{సుమారుగా ఒక రోజుకు # నోటిఫికేషన్లు}}"</string>
@@ -3317,11 +3317,11 @@
<string name="deleted_channels" msgid="8489800381509312964">"{count,plural, =1{# కేటగిరీ తొలగించబడింది}other{# కేటగిరీలు తొలగించబడ్డాయి}}"</string>
<string name="app_notification_block_title" msgid="3880322745749900296">"అన్నింటినీ బ్లాక్ చేయండి"</string>
<string name="app_notification_block_summary" msgid="1804611676339341551">"ఈ నోటిఫికేషన్లను ఎప్పుడూ చూపవద్దు"</string>
- <string name="notification_content_block_title" msgid="6689085826061361351">"నోటిఫికేషన్లను చూపు"</string>
+ <string name="notification_content_block_title" msgid="6689085826061361351">"నోటిఫికేషన్లను చూపండి"</string>
<string name="notification_content_block_summary" msgid="329171999992248925">"నోటిఫికేషన్లను ఎన్నడూ షేడ్లో లేదా అనుబంధ పరికరాల్లో చూపవద్దు"</string>
<string name="notification_badge_title" msgid="6854537463548411313">"నోటిఫికేషన్ డాట్ను అనుమతించండి"</string>
- <string name="notification_channel_badge_title" msgid="6505542437385640049">"నోటిఫికేషన్ డాట్ చూపించు"</string>
- <string name="app_notification_override_dnd_title" msgid="3769539356442226691">"\'అంతరాయం కలిగించవద్దు\'ను ఓవర్రైడ్ చేయి"</string>
+ <string name="notification_channel_badge_title" msgid="6505542437385640049">"నోటిఫికేషన్ డాట్ చూపించండి"</string>
+ <string name="app_notification_override_dnd_title" msgid="3769539356442226691">"\'అంతరాయం కలిగించవద్దు\'ను ఓవర్రైడ్ చేయండి"</string>
<string name="app_notification_override_dnd_summary" msgid="4894641191397562920">"అంతరాయం కలిగించవద్దు ఫీచర్ ఆన్లో ఉన్నా కూడా, నోటిఫికేషన్ వచ్చిన సంగతిని తెలియజెప్పడానికి ఈ నోటిఫికేషన్లను అనుమతిస్తుంది"</string>
<string name="app_notification_visibility_override_title" msgid="7778628150022065920">"లాక్ స్క్రీన్"</string>
<string name="app_notifications_dialog_done" msgid="573716608705273004">"పూర్తయింది"</string>
@@ -3642,8 +3642,8 @@
<string name="zen_access_warning_dialog_title" msgid="6323325813123130154">"<xliff:g id="APP">%1$s</xliff:g> కోసం అంతరాయం కలిగించవద్దు ఎంపికకు యాక్సెస్ను అనుమతించాలా?"</string>
<string name="zen_access_warning_dialog_summary" msgid="8468714854067428987">"యాప్ అంతరాయం కలిగించవద్దు ఎంపికను ఆన్/ఆఫ్ చేయగలదు మరియు సంబంధిత సెట్టింగ్లకు మార్పులు చేయగలదు."</string>
<string name="zen_access_disabled_package_warning" msgid="6565908224294537889">"నోటిఫికేషన్ యాక్సెస్ ఆన్లో ఉన్నందున తప్పనిసరిగా ఇది ఆన్లో ఉండాలి"</string>
- <string name="zen_access_revoke_warning_dialog_title" msgid="7377261509261811449">"<xliff:g id="APP">%1$s</xliff:g> అంతరాయం కలిగించవద్దు ఫీచర్కు యాక్సెస్ను ఉపసంహరించాలా?"</string>
- <string name="zen_access_revoke_warning_dialog_summary" msgid="8689801842914183595">"ఈ యాప్ ద్వారా రూపొందించిన అన్ని అంతరాయం కలిగించవద్దు నిబంధనలు తీసివేయబడతాయి."</string>
+ <string name="zen_access_revoke_warning_dialog_title" msgid="7377261509261811449">"<xliff:g id="APP">%1$s</xliff:g> కోసం అంతరాయం కలిగించవద్దు ఫీచర్కు ఉన్న యాక్సెస్ను ఉపసంహరించాలా?"</string>
+ <string name="zen_access_revoke_warning_dialog_summary" msgid="8689801842914183595">"ఈ యాప్ ద్వారా రూపొందించిన అన్ని అంతరాయం కలిగించవద్దు నియమాలు తీసివేయబడతాయి."</string>
<string name="ignore_optimizations_on" msgid="6865583039303804932">"ఆప్టిమైజ్ చేయవద్దు"</string>
<string name="ignore_optimizations_off" msgid="9186557038453586295">"ఆప్టిమైజ్ చేయి"</string>
<string name="ignore_optimizations_on_desc" msgid="1280043916460939932">"మీ బ్యాటరీ మరింత త్వరగా వినియోగించబడవచ్చు. ఇకపై ఈ యాప్ నేపథ్య బ్యాటరీ వినియోగం పరిమితం చేయబడదు."</string>
@@ -4143,7 +4143,7 @@
<string name="my_device_info_device_identifiers_category_title" msgid="2197063484127704153">"పరికర ఐడెంటిఫయర్లు"</string>
<string name="change_wifi_state_title" msgid="5629648102837821525">"Wi-Fi కంట్రోల్"</string>
<string name="change_wifi_state_app_detail_switch" msgid="1385358508267180745">"Wi-Fiని కంట్రోల్ చేయడానికి యాప్ను అనుమతించండి"</string>
- <string name="change_wifi_state_app_detail_summary" msgid="8230854855584217111">"Wi-Fiని ఆన్ లేదా ఆఫ్ చేయడానికి, Wi-Fi నెట్వర్క్లను స్కాన్ చేసి, కనెక్ట్ కావడానికి, నెట్వర్క్లను జోడించడానికి లేదా తీసివేయడానికి లేదా లోకల్-మాత్రమే హాట్స్పాట్ను ప్రారంభించడానికి ఈ యాప్ను అనుమతించండి"</string>
+ <string name="change_wifi_state_app_detail_summary" msgid="8230854855584217111">"Wi-Fiని ఆన్ లేదా ఆఫ్ చేయడానికి; Wi-Fi నెట్వర్క్లను స్కాన్ చేసి, కనెక్ట్ కావడానికి; నెట్వర్క్లను జోడించడానికి లేదా తీసివేయడానికి; లేదా లోకల్-మాత్రమే హాట్స్పాట్ను ప్రారంభించడానికి ఈ యాప్ను అనుమతించండి"</string>
<string name="change_nfc_tag_apps_title" msgid="91514009058149617">"NFC ద్వారా లాంచ్ అవ్వడం"</string>
<string name="change_nfc_tag_apps_detail_switch" msgid="240286205725043561">"NFC స్కాన్ చేసినప్పుడు లాంచ్ అవ్వగలిగేలా అనుమతించండి"</string>
<string name="change_nfc_tag_apps_detail_summary" msgid="7083666814715607078">"NFC ట్యాగ్ను స్కాన్ చేసినప్పుడు లాంచ్ అవ్వగలిగేలా ఈ యాప్ను అనుమతించండి.\nఈ అనుమతి ఆన్లో ఉన్నట్లయితే, ట్యాగ్ గుర్తించబడినప్పుడల్లా ఒక ఆప్షన్గా ఉపయోగించేందుకు ఈ యాప్ అందుబాటులో ఉంటుంది."</string>
@@ -4684,7 +4684,7 @@
<string name="flash_notifications_summary_on_camera" msgid="3286405833586333730">"ఆన్లో ఉంది / కెమెరా ఫ్లాష్"</string>
<string name="flash_notifications_summary_on_screen" msgid="9040640799633336219">"ఆన్లో ఉంది / స్క్రీన్ ఫ్లాష్"</string>
<string name="flash_notifications_summary_on_camera_and_screen" msgid="2326268141063768701">"ఆన్లో ఉంది / కెమెరా, స్క్రీన్ ఫ్లాష్"</string>
- <string name="flash_notifications_intro" msgid="8409873413480928249">"మీరు నోటిఫికేషన్లను స్వీకరించినప్పుడు లేదా అలారాలు సౌండ్ చేసినప్పుడు కెమెరా లైట్ లేదా స్క్రీన్ను ఫ్లాష్ చేయండి"</string>
+ <string name="flash_notifications_intro" msgid="8409873413480928249">"మీరు నోటిఫికేషన్లను స్వీకరించినప్పుడు లేదా అలారాలు సౌండ్ చేసినప్పుడు కెమెరా లైట్ లేదా స్క్రీన్ను ఫ్లాష్ చేస్తుంది"</string>
<string name="flash_notifications_intro_without_camera_flash" msgid="6297337174487793891">"మీరు నోటిఫికేషన్లను అందుకున్నప్పుడు లేదా అలారాలు మోగినప్పుడు స్క్రీన్ను ఫ్లాష్ చేయండి"</string>
<string name="flash_notifications_note" msgid="2426125248448055075">"మీరు లైట్ సెన్సిటివ్ అయితే, ఫ్లాష్ నోటిఫికేషన్లను జాగ్రత్తగా ఉపయోగించండి"</string>
<string name="flash_notifications_keywords" msgid="2458759275318514836">"ఫ్లాష్, కాంతి, వినడంలో సమస్య, వినికిడి ఎర్రర్"</string>
diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml
index 5c2f9c1..c4dbf9d 100644
--- a/res/values-th/strings.xml
+++ b/res/values-th/strings.xml
@@ -909,10 +909,8 @@
<skip />
<string name="wifi_hotspot_speed_summary_unavailable" msgid="7276080644693388756">"ไม่มีให้บริการในประเทศหรือภูมิภาคของคุณ"</string>
<string name="wifi_hotspot_speed_footer" msgid="8846939503916795002">"หากไม่มีความถี่ที่ต้องการ ฮอตสปอตอาจใช้ความถี่อื่น การตั้งค่าความปลอดภัยฮอตสปอตอาจเปลี่ยนแปลงหากคุณเปลี่ยนความถี่"</string>
- <!-- no translation found for wifi_hotspot_security_summary_unavailable (117582979310345853) -->
- <skip />
- <!-- no translation found for wifi_hotspot_security_footer (4608329688744949796) -->
- <skip />
+ <string name="wifi_hotspot_security_summary_unavailable" msgid="117582979310345853">"ไม่พร้อมใช้งานคลื่นความถี่ 6 GHz"</string>
+ <string name="wifi_hotspot_security_footer" msgid="4608329688744949796">"การตั้งค่าความปลอดภัยอาจเปลี่ยนแปลงหากคุณเปลี่ยนคลื่นความถี่ของฮอตสปอต"</string>
<string name="wifi_tether_starting" msgid="8879874184033857814">"กำลังเปิดฮอตสปอต…"</string>
<string name="wifi_tether_stopping" msgid="4416492968019409188">"กำลังปิดฮอตสปอต…"</string>
<string name="wifi_tether_carrier_unsupport_dialog_title" msgid="3089432578433978073">"ไม่มีบริการเชื่อมต่ออินเทอร์เน็ตผ่านมือถือ"</string>
@@ -2705,14 +2703,12 @@
<string name="enable_guest_calling" msgid="8300355036005240911">"อนุญาตให้ผู้ใช้ชั่วคราวใช้โทรศัพท์"</string>
<string name="enable_guest_calling_summary" msgid="4748224917641204782">"ระบบจะแชร์ประวัติการโทรกับผู้ใช้ชั่วคราว"</string>
<string name="user_enable_calling_sms" msgid="8546430559552381324">"เปิดการโทรและ SMS"</string>
- <!-- no translation found for user_grant_admin (5942118263054572074) -->
- <skip />
+ <string name="user_grant_admin" msgid="5942118263054572074">"กำหนดให้ผู้ใช้รายนี้เป็นผู้ดูแลระบบ"</string>
<string name="user_remove_user" msgid="8468203789739693845">"ลบผู้ใช้"</string>
<string name="user_enable_calling_and_sms_confirm_title" msgid="4041510268838725520">"เปิดการโทรและ SMS ไหม"</string>
<string name="user_enable_calling_and_sms_confirm_message" msgid="367792286597449922">"ระบบจะแชร์ประวัติการโทรและ SMS กับผู้ใช้รายนี้"</string>
<string name="user_revoke_admin_confirm_title" msgid="3057842401861731863">"นำสิทธิ์ของผู้ดูแลระบบออกใช่ไหม"</string>
- <!-- no translation found for user_revoke_admin_confirm_message (9207187319308572958) -->
- <skip />
+ <string name="user_revoke_admin_confirm_message" msgid="9207187319308572958">"หากนำสิทธิ์ของผู้ดูแลระบบออกจากผู้ใช้รายนี้ คุณหรือผู้ดูแลระบบคนอื่นสามารถให้สิทธิ์ดังกล่าวอีกครั้งในภายหลังได้"</string>
<string name="emergency_info_title" msgid="8233682750953695582">"ข้อมูลสำหรับกรณีฉุกเฉิน"</string>
<string name="emergency_info_summary" msgid="8463622253016757697">"ข้อมูลและรายชื่อติดต่อสำหรับ <xliff:g id="USER_NAME">%1$s</xliff:g>"</string>
<string name="open_app_button" msgid="5025229765547191710">"เปิด <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml
index 851e3ea..6e706e2 100644
--- a/res/values-zh-rCN/strings.xml
+++ b/res/values-zh-rCN/strings.xml
@@ -909,10 +909,8 @@
<skip />
<string name="wifi_hotspot_speed_summary_unavailable" msgid="7276080644693388756">"您所在的国家或地区无法使用此功能"</string>
<string name="wifi_hotspot_speed_footer" msgid="8846939503916795002">"如果首选频率不可用,热点可能会使用其他频率。如果您更改频率,热点的安全设置可能也会改变。"</string>
- <!-- no translation found for wifi_hotspot_security_summary_unavailable (117582979310345853) -->
- <skip />
- <!-- no translation found for wifi_hotspot_security_footer (4608329688744949796) -->
- <skip />
+ <string name="wifi_hotspot_security_summary_unavailable" msgid="117582979310345853">"不适用于 6 GHz"</string>
+ <string name="wifi_hotspot_security_footer" msgid="4608329688744949796">"如果您更改热点频率,安全设置可能也会改变"</string>
<string name="wifi_tether_starting" msgid="8879874184033857814">"正在打开热点..."</string>
<string name="wifi_tether_stopping" msgid="4416492968019409188">"正在关闭热点..."</string>
<string name="wifi_tether_carrier_unsupport_dialog_title" msgid="3089432578433978073">"网络共享不可用"</string>
@@ -2705,14 +2703,12 @@
<string name="enable_guest_calling" msgid="8300355036005240911">"允许访客使用电话"</string>
<string name="enable_guest_calling_summary" msgid="4748224917641204782">"将与访客用户共享通话记录"</string>
<string name="user_enable_calling_sms" msgid="8546430559552381324">"开启通话和短信功能"</string>
- <!-- no translation found for user_grant_admin (5942118263054572074) -->
- <skip />
+ <string name="user_grant_admin" msgid="5942118263054572074">"将此用户设为管理员"</string>
<string name="user_remove_user" msgid="8468203789739693845">"删除用户"</string>
<string name="user_enable_calling_and_sms_confirm_title" msgid="4041510268838725520">"要开启通话和短信功能吗?"</string>
<string name="user_enable_calling_and_sms_confirm_message" msgid="367792286597449922">"将与此用户共享通话记录和短信记录。"</string>
<string name="user_revoke_admin_confirm_title" msgid="3057842401861731863">"要撤消管理员权限吗?"</string>
- <!-- no translation found for user_revoke_admin_confirm_message (9207187319308572958) -->
- <skip />
+ <string name="user_revoke_admin_confirm_message" msgid="9207187319308572958">"如果您撤消该用户的管理员权限,您或其他管理员之后可以重新授予其管理员权限。"</string>
<string name="emergency_info_title" msgid="8233682750953695582">"急救信息"</string>
<string name="emergency_info_summary" msgid="8463622253016757697">"<xliff:g id="USER_NAME">%1$s</xliff:g>的相关信息和联系人信息"</string>
<string name="open_app_button" msgid="5025229765547191710">"打开“<xliff:g id="APP_NAME">%1$s</xliff:g>”"</string>
diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml
index c0f00c1..8159eca 100644
--- a/res/values-zh-rTW/strings.xml
+++ b/res/values-zh-rTW/strings.xml
@@ -1477,7 +1477,7 @@
<string name="lockpattern_settings_enhanced_pin_privacy_summary" msgid="8639588868341114740">"輸入 PIN 碼時停用動畫"</string>
<string name="lockpattern_settings_enable_visible_pattern_title_profile" msgid="5138189101808127489">"顯示設定檔解鎖圖案"</string>
<string name="lockpattern_settings_enable_tactile_feedback_title" msgid="2273374883831956787">"輕觸時震動"</string>
- <string name="lockpattern_settings_enable_power_button_instantly_locks" msgid="1638619728773344099">"按下電源按鈕立即鎖定"</string>
+ <string name="lockpattern_settings_enable_power_button_instantly_locks" msgid="1638619728773344099">"按下電源鍵立即鎖定"</string>
<string name="lockpattern_settings_power_button_instantly_locks_summary" msgid="2202430156268094229">"由 <xliff:g id="TRUST_AGENT_NAME">%1$s</xliff:g> 維持解鎖狀態時除外"</string>
<string name="lockpattern_settings_choose_lock_pattern" msgid="2193588309557281466">"設定解鎖圖案"</string>
<string name="lockpattern_settings_change_lock_pattern" msgid="7614155083815661347">"變更解鎖圖案"</string>
@@ -3893,7 +3893,7 @@
<string name="automatic_storage_manager_primary_switch_title" msgid="9131959126462101994">"使用儲存空間管理工具"</string>
<string name="gesture_preference_title" msgid="8291899281322647187">"手勢"</string>
<string name="double_tap_power_for_camera_title" msgid="7982364144330923683">"快速開啟相機"</string>
- <string name="double_tap_power_for_camera_summary" msgid="1100926048598415509">"只要在任何畫面中按兩下電源按鈕,即可快速開啟相機。"</string>
+ <string name="double_tap_power_for_camera_summary" msgid="1100926048598415509">"只要在任何畫面中按兩下電源鍵,即可快速開啟相機。"</string>
<string name="double_twist_for_camera_mode_title" msgid="472455236910935684">"翻轉相機切換自拍模式"</string>
<string name="double_twist_for_camera_mode_summary" msgid="592503740044744951"></string>
<string name="system_navigation_title" msgid="4890381153527184636">"操作模式"</string>
@@ -3938,7 +3938,7 @@
<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>
- <string name="emergency_gesture_screen_summary" msgid="6640521030845132507">"快速按電源按鈕 5 次以上即可觸發以下動作"</string>
+ <string name="emergency_gesture_screen_summary" msgid="6640521030845132507">"快速按電源鍵 5 次以上即可觸發以下動作"</string>
<string name="emergency_gesture_sound_setting_title" msgid="7153948164862156536">"播放倒數計時警報"</string>
<string name="emergency_gesture_sound_setting_summary" msgid="6573377104470235173">"觸發緊急求救功能時,播放高分貝的音效"</string>
<string name="emergency_gesture_category_call_for_help_title" msgid="1680040129478289510">"求救通知"</string>
@@ -4413,8 +4413,8 @@
<string name="power_menu_summary_long_press_for_assistant" msgid="32706459458422952">"存取數位助理"</string>
<string name="power_menu_summary_long_press_for_power_menu" msgid="7617247135239683710">"存取電源鍵選單"</string>
<string name="lockscreen_privacy_not_secure" msgid="3251276389681975912">"必須先設定螢幕鎖定才能使用"</string>
- <string name="power_menu_power_volume_up_hint" msgid="5619917593676125759">"電源鍵選單:\n同時按下電源鍵和調高音量按鈕"</string>
- <string name="power_menu_power_prevent_ringing_hint" msgid="1169955014711158873">"暫停響鈴:\n按下音量按鈕即可顯示捷徑"</string>
+ <string name="power_menu_power_volume_up_hint" msgid="5619917593676125759">"電源鍵選單:\n同時按下電源鍵和調高音量鍵"</string>
+ <string name="power_menu_power_prevent_ringing_hint" msgid="1169955014711158873">"暫停響鈴:\n按下音量鍵即可顯示捷徑"</string>
<string name="power_menu_long_press_for_assist_sensitivity_title" msgid="1626808509158422185">"按住電源鍵的時間長度"</string>
<string name="power_menu_long_press_for_assist_sensitivity_summary" msgid="7550610071666801935">"選擇按住電源鍵的時間長度即可調整靈敏度"</string>
<string name="power_menu_long_press_for_assist_sensitivity_low_label" msgid="3430099983480845635">"短"</string>
diff --git a/res/values/config.xml b/res/values/config.xml
index 334d4e5..5ae0220 100755
--- a/res/values/config.xml
+++ b/res/values/config.xml
@@ -345,6 +345,9 @@
<bool name="config_show_manual">false</bool>
<!-- Whether to show a preference item for regulatory information in About phone -->
<bool name="config_show_regulatory_info">false</bool>
+ <!-- Package name of regulatory information overlay which provides mapping and contents.
+ Fetch resource from overlay package directly if this is set. -->
+ <string name="config_regulatory_info_overlay_package_name" translatable="false" />
<!-- Whether to show a preference item for mobile plan -->
<bool name="config_show_mobile_plan">true</bool>
@@ -364,7 +367,7 @@
<bool name="config_show_wifi_hotspot_settings">true</bool>
<!-- Whether Wi-Fi hotspot speed should be shown or not. -->
- <bool name="config_show_wifi_hotspot_speed">false</bool>
+ <bool name="config_show_wifi_hotspot_speed">true</bool>
<!-- Whether toggle_airplane is available or not. -->
<bool name="config_show_toggle_airplane">true</bool>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index fa79cbb..1ad45d5 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -744,6 +744,10 @@
<string name="security_settings_face_settings_remove_dialog_details">Your face model will be permanently and securely deleted.\n\nAfter deletion, you will need your PIN, pattern, or password to unlock your phone or for authentication in apps.</string>
<!-- Dialog contents shown when the user removes an enrollment when configured as a convenience [CHAR LIMIT=NONE] -->
<string name="security_settings_face_settings_remove_dialog_details_convenience">Your face model will be permanently and securely deleted.\n\nAfter deletion, you will need your PIN, pattern, or password to unlock your phone.</string>
+ <!-- Dialog contents shown when the user removes an enrollment [CHAR LIMIT=NONE] -->
+ <string name="security_settings_face_remove_dialog_details_fingerprint">Your face model will be permanently and securely deleted.\n\nAfter deletion, you will need your fingerprint, PIN, pattern, or password to unlock your phone or for authentication in apps.</string>
+ <!-- Dialog contents shown when the user removes an enrollment when configured as a convenience [CHAR LIMIT=NONE] -->
+ <string name="security_settings_face_remove_dialog_details_fingerprint_conv">Your face model will be permanently and securely deleted.\n\nAfter deletion, you will need your fingerprint, PIN, pattern, or password to unlock your phone.</string>
<!-- Subtitle shown for contextual setting face enrollment [CHAR LIMIT=NONE] -->
<string name="security_settings_face_settings_context_subtitle">Use Face Unlock to unlock your phone</string>
diff --git a/src/com/android/settings/RegulatoryInfoDisplayActivity.java b/src/com/android/settings/RegulatoryInfoDisplayActivity.java
deleted file mode 100644
index 8f65051..0000000
--- a/src/com/android/settings/RegulatoryInfoDisplayActivity.java
+++ /dev/null
@@ -1,171 +0,0 @@
-/*
- * Copyright (C) 2013 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settings;
-
-import android.app.Activity;
-import android.content.DialogInterface;
-import android.content.res.Resources;
-import android.graphics.Bitmap;
-import android.graphics.BitmapFactory;
-import android.graphics.drawable.Drawable;
-import android.os.Bundle;
-import android.os.SystemProperties;
-import android.text.TextUtils;
-import android.view.Gravity;
-import android.view.View;
-import android.widget.ImageView;
-import android.widget.TextView;
-
-import androidx.annotation.VisibleForTesting;
-import androidx.appcompat.app.AlertDialog;
-
-import java.util.Locale;
-
-/**
- * {@link Activity} that displays regulatory information for the "Regulatory information"
- * preference item, and when "*#07#" is dialed on the Phone keypad. To enable this feature,
- * set the "config_show_regulatory_info" boolean to true in a device overlay resource, and in the
- * same overlay, either add a drawable named "regulatory_info.png" containing a graphical version
- * of the required regulatory info (If ro.bootloader.hardware.sku property is set use
- * "regulatory_info_<sku>.png where sku is ro.bootloader.hardware.sku property value in lowercase"),
- * or add a string resource named "regulatory_info_text" with an HTML version of the required
- * information (text will be centered in the dialog).
- */
-public class RegulatoryInfoDisplayActivity extends Activity implements
- DialogInterface.OnDismissListener {
-
- private final String REGULATORY_INFO_RESOURCE = "regulatory_info";
- private static final String DEFAULT_REGULATORY_INFO_FILEPATH =
- "/data/misc/elabel/regulatory_info.png";
- private static final String REGULATORY_INFO_FILEPATH_TEMPLATE =
- "/data/misc/elabel/regulatory_info_%s.png";
-
- /**
- * Display the regulatory info graphic in a dialog window.
- */
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- AlertDialog.Builder builder = new AlertDialog.Builder(this)
- .setTitle(R.string.regulatory_labels)
- .setOnDismissListener(this)
- .setPositiveButton(android.R.string.ok, null /* onClickListener */);
-
- boolean regulatoryInfoDrawableExists = false;
-
- final String regulatoryInfoFile = getRegulatoryInfoImageFileName();
- final Bitmap regulatoryInfoBitmap = BitmapFactory.decodeFile(regulatoryInfoFile);
-
- if (regulatoryInfoBitmap != null) {
- regulatoryInfoDrawableExists = true;
- }
-
- int resId = 0;
- if (!regulatoryInfoDrawableExists) {
- resId = getResourceId();
- }
- if (resId != 0) {
- try {
- Drawable d = getDrawable(resId);
- // set to false if the width or height is <= 2
- // (missing PNG can return an empty 2x2 pixel Drawable)
- regulatoryInfoDrawableExists = (d.getIntrinsicWidth() > 2
- && d.getIntrinsicHeight() > 2);
- } catch (Resources.NotFoundException ignored) {
- regulatoryInfoDrawableExists = false;
- }
- }
-
- CharSequence regulatoryText = getResources()
- .getText(R.string.regulatory_info_text);
-
- if (regulatoryInfoDrawableExists) {
- View view = getLayoutInflater().inflate(R.layout.regulatory_info, null);
- ImageView image = view.findViewById(R.id.regulatoryInfo);
- if (regulatoryInfoBitmap != null) {
- image.setImageBitmap(regulatoryInfoBitmap);
- } else {
- image.setImageResource(resId);
- }
- builder.setView(view);
- builder.show();
- } else if (regulatoryText.length() > 0) {
- builder.setMessage(regulatoryText);
- AlertDialog dialog = builder.show();
- // we have to show the dialog first, or the setGravity() call will throw a NPE
- TextView messageText = (TextView) dialog.findViewById(android.R.id.message);
- messageText.setGravity(Gravity.CENTER);
- } else {
- // neither drawable nor text resource exists, finish activity
- finish();
- }
- }
-
- @VisibleForTesting
- int getResourceId() {
- // Use regulatory_info by default.
- int resId = getResources().getIdentifier(
- REGULATORY_INFO_RESOURCE, "drawable", getPackageName());
-
- // When hardware sku property exists, use regulatory_info_<sku> resource if valid.
- final String sku = getSku();
- if (!TextUtils.isEmpty(sku)) {
- String regulatory_info_res = REGULATORY_INFO_RESOURCE + "_" + sku.toLowerCase();
- int id = getResources().getIdentifier(
- regulatory_info_res, "drawable", getPackageName());
- if (id != 0) {
- resId = id;
- }
- }
-
- // When hardware coo property exists, use regulatory_info_<sku>_<coo> resource if valid.
- final String coo = getCoo();
- if (!TextUtils.isEmpty(coo) && !TextUtils.isEmpty(sku)) {
- final String regulatory_info_coo_res =
- REGULATORY_INFO_RESOURCE + "_" + sku.toLowerCase() + "_" + coo.toLowerCase();
- final int id = getResources().getIdentifier(
- regulatory_info_coo_res, "drawable", getPackageName());
- if (id != 0) {
- resId = id;
- }
- }
- return resId;
- }
-
- @Override
- public void onDismiss(DialogInterface dialog) {
- finish(); // close the activity
- }
-
- private String getCoo() {
- return SystemProperties.get("ro.boot.hardware.coo", "");
- }
-
- private String getSku() {
- return SystemProperties.get("ro.boot.hardware.sku", "");
- }
-
- private String getRegulatoryInfoImageFileName() {
- final String sku = getSku();
- if (TextUtils.isEmpty(sku)) {
- return DEFAULT_REGULATORY_INFO_FILEPATH;
- } else {
- return String.format(Locale.US, REGULATORY_INFO_FILEPATH_TEMPLATE,
- sku.toLowerCase());
- }
- }
-}
diff --git a/src/com/android/settings/RegulatoryInfoDisplayActivity.kt b/src/com/android/settings/RegulatoryInfoDisplayActivity.kt
new file mode 100644
index 0000000..fdf66c3
--- /dev/null
+++ b/src/com/android/settings/RegulatoryInfoDisplayActivity.kt
@@ -0,0 +1,67 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings
+
+import android.app.Activity
+import android.os.Bundle
+import android.view.Gravity
+import android.widget.ImageView
+import android.widget.TextView
+import androidx.appcompat.app.AlertDialog
+import com.android.settings.deviceinfo.regulatory.RegulatoryInfo.getRegulatoryInfo
+
+/**
+ * [Activity] that displays regulatory information for the "Regulatory information"
+ * preference item, and when "*#07#" is dialed on the Phone keypad. To enable this feature,
+ * set the "config_show_regulatory_info" boolean to true in a device overlay resource, and in the
+ * same overlay, either add a drawable named "regulatory_info.png" containing a graphical version
+ * of the required regulatory info (If ro.bootloader.hardware.sku property is set use
+ * "regulatory_info_<sku>.png where sku is ro.bootloader.hardware.sku property value in lowercase"),
+ * or add a string resource named "regulatory_info_text" with an HTML version of the required
+ * information (text will be centered in the dialog).
+ */
+class RegulatoryInfoDisplayActivity : Activity() {
+
+ /** Display the regulatory info graphic in a dialog window. */
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ val builder = AlertDialog.Builder(this)
+ .setTitle(R.string.regulatory_labels)
+ .setOnDismissListener { finish() } // close the activity
+ .setPositiveButton(android.R.string.ok, null)
+
+ getRegulatoryInfo()?.let {
+ val view = layoutInflater.inflate(R.layout.regulatory_info, null)
+ val image = view.requireViewById<ImageView>(R.id.regulatoryInfo)
+ image.setImageDrawable(it)
+ builder.setView(view)
+ builder.show()
+ return
+ }
+
+ val regulatoryText = resources.getText(R.string.regulatory_info_text)
+ if (regulatoryText.isNotEmpty()) {
+ builder.setMessage(regulatoryText)
+ val dialog = builder.show()
+ // we have to show the dialog first, or the setGravity() call will throw a NPE
+ dialog.findViewById<TextView>(android.R.id.message)?.gravity = Gravity.CENTER
+ } else {
+ // neither drawable nor text resource exists, finish activity
+ finish()
+ }
+ }
+}
diff --git a/src/com/android/settings/Settings.java b/src/com/android/settings/Settings.java
index a8fa527..a67aeaa 100644
--- a/src/com/android/settings/Settings.java
+++ b/src/com/android/settings/Settings.java
@@ -52,26 +52,9 @@
public static class AssistGestureSettingsActivity extends SettingsActivity { /* empty */}
public static class BluetoothSettingsActivity extends SettingsActivity { /* empty */ }
public static class CreateShortcutActivity extends SettingsActivity { /* empty */ }
- public static class FaceSettingsActivity extends SettingsActivity {
- @Override
- protected void onCreate(Bundle savedState) {
- setTheme(SetupWizardUtils.getTheme(this, getIntent()));
- setTheme(R.style.SettingsPreferenceTheme_SetupWizard);
- ThemeHelper.trySetDynamicColor(this);
- super.onCreate(savedState);
- }
- }
+ public static class FaceSettingsActivity extends SettingsActivity { /* empty */ }
/** Container for {@link FaceSettings} to use with a pre-defined task affinity. */
- public static class FaceSettingsInternalActivity extends SettingsActivity {
- @Override
- protected void onCreate(Bundle savedState) {
- setTheme(SetupWizardUtils.getTheme(this, getIntent()));
- setTheme(R.style.SettingsPreferenceTheme_SetupWizard);
- ThemeHelper.trySetDynamicColor(this);
- super.onCreate(savedState);
- }
- }
-
+ public static class FaceSettingsInternalActivity extends SettingsActivity { /* empty */ }
public static class FingerprintSettingsActivity extends SettingsActivity { /* empty */ }
public static class CombinedBiometricSettingsActivity extends SettingsActivity { /* empty */ }
public static class CombinedBiometricProfileSettingsActivity extends SettingsActivity { /* empty */ }
diff --git a/src/com/android/settings/Utils.java b/src/com/android/settings/Utils.java
index 68b1a48..e97f020 100644
--- a/src/com/android/settings/Utils.java
+++ b/src/com/android/settings/Utils.java
@@ -97,7 +97,6 @@
import androidx.annotation.ColorInt;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
-import androidx.annotation.StringRes;
import androidx.annotation.VisibleForTesting;
import androidx.core.graphics.drawable.IconCompat;
import androidx.core.graphics.drawable.RoundedBitmapDrawable;
@@ -1295,4 +1294,5 @@
com.android.internal.R.bool.config_dreamsOnlyEnabledForDockUser);
return dreamsSupported && (!dreamsOnlyEnabledForDockUser || canCurrentUserDream(context));
}
+
}
diff --git a/src/com/android/settings/biometrics/BiometricEnrollBase.java b/src/com/android/settings/biometrics/BiometricEnrollBase.java
index 2f852f0..6e11079 100644
--- a/src/com/android/settings/biometrics/BiometricEnrollBase.java
+++ b/src/com/android/settings/biometrics/BiometricEnrollBase.java
@@ -133,6 +133,7 @@
protected long mChallenge;
protected boolean mFromSettingsSummary;
protected FooterBarMixin mFooterBarMixin;
+ protected boolean mShouldSetFooterBarBackground = true;
@Nullable
protected ScreenSizeFoldProvider mScreenSizeFoldProvider;
@Nullable
@@ -191,12 +192,14 @@
super.onPostCreate(savedInstanceState);
initViews();
- @SuppressLint("VisibleForTests")
- final LinearLayout buttonContainer = mFooterBarMixin != null
- ? mFooterBarMixin.getButtonContainer()
- : null;
- if (buttonContainer != null) {
- buttonContainer.setBackgroundColor(getBackgroundColor());
+ if (mShouldSetFooterBarBackground) {
+ @SuppressLint("VisibleForTests")
+ final LinearLayout buttonContainer = mFooterBarMixin != null
+ ? mFooterBarMixin.getButtonContainer()
+ : null;
+ if (buttonContainer != null) {
+ buttonContainer.setBackgroundColor(getBackgroundColor());
+ }
}
}
@@ -331,7 +334,7 @@
}
@ColorInt
- private int getBackgroundColor() {
+ public int getBackgroundColor() {
final ColorStateList stateList = Utils.getColorAttr(this, android.R.attr.windowBackground);
return stateList != null ? stateList.getDefaultColor() : Color.TRANSPARENT;
}
diff --git a/src/com/android/settings/biometrics/BiometricEnrollSidecar.java b/src/com/android/settings/biometrics/BiometricEnrollSidecar.java
index 97d46a4..369fa4b 100644
--- a/src/com/android/settings/biometrics/BiometricEnrollSidecar.java
+++ b/src/com/android/settings/biometrics/BiometricEnrollSidecar.java
@@ -48,11 +48,16 @@
/**
* Called when a pointer down event has occurred.
*/
- default void onPointerDown(int sensorId) { }
+ default void onUdfpsPointerDown(int sensorId) { }
/**
* Called when a pointer up event has occurred.
*/
- default void onPointerUp(int sensorId) { }
+ default void onUdfpsPointerUp(int sensorId) { }
+
+ /**
+ * Called when udfps overlay is shown.
+ */
+ default void onUdfpsOverlayShown() { }
}
private int mEnrollmentSteps = -1;
@@ -126,29 +131,36 @@
}
}
- private class QueuedPointerDown extends QueuedEvent {
+ private class QueuedUdfpsPointerDown extends QueuedEvent {
private final int sensorId;
- public QueuedPointerDown(int sensorId) {
+ QueuedUdfpsPointerDown(int sensorId) {
this.sensorId = sensorId;
}
@Override
public void send(Listener listener) {
- listener.onPointerDown(sensorId);
+ listener.onUdfpsPointerDown(sensorId);
}
}
- private class QueuedPointerUp extends QueuedEvent {
+ private class QueuedUdfpsPointerUp extends QueuedEvent {
private final int sensorId;
- public QueuedPointerUp(int sensorId) {
+ QueuedUdfpsPointerUp(int sensorId) {
this.sensorId = sensorId;
}
@Override
public void send(Listener listener) {
- listener.onPointerUp(sensorId);
+ listener.onUdfpsPointerUp(sensorId);
+ }
+ }
+
+ private class QueuedUdfpsOverlayShown extends QueuedEvent {
+ @Override
+ public void send(Listener listener) {
+ listener.onUdfpsOverlayShown();
}
}
@@ -249,19 +261,27 @@
}
}
- protected void onPointerDown(int sensorId) {
+ protected void onUdfpsPointerDown(int sensorId) {
if (mListener != null) {
- mListener.onPointerDown(sensorId);
+ mListener.onUdfpsPointerDown(sensorId);
} else {
- mQueuedEvents.add(new QueuedPointerDown(sensorId));
+ mQueuedEvents.add(new QueuedUdfpsPointerDown(sensorId));
}
}
- protected void onPointerUp(int sensorId) {
+ protected void onUdfpsPointerUp(int sensorId) {
if (mListener != null) {
- mListener.onPointerUp(sensorId);
+ mListener.onUdfpsPointerUp(sensorId);
} else {
- mQueuedEvents.add(new QueuedPointerUp(sensorId));
+ mQueuedEvents.add(new QueuedUdfpsPointerUp(sensorId));
+ }
+ }
+
+ protected void onUdfpsOverlayShown() {
+ if (mListener != null) {
+ mListener.onUdfpsOverlayShown();
+ } else {
+ mQueuedEvents.add(new QueuedUdfpsOverlayShown());
}
}
diff --git a/src/com/android/settings/biometrics/face/FaceSettings.java b/src/com/android/settings/biometrics/face/FaceSettings.java
index 979faa2..2e94404 100644
--- a/src/com/android/settings/biometrics/face/FaceSettings.java
+++ b/src/com/android/settings/biometrics/face/FaceSettings.java
@@ -208,6 +208,10 @@
mRemoveButton = findPreference(FaceSettingsRemoveButtonPreferenceController.KEY);
mEnrollButton = findPreference(FaceSettingsEnrollButtonPreferenceController.KEY);
+ final boolean hasEnrolled = mFaceManager.hasEnrolledTemplates(mUserId);
+ mEnrollButton.setVisible(!hasEnrolled);
+ mRemoveButton.setVisible(hasEnrolled);
+
// There is no better way to do this :/
for (AbstractPreferenceController controller : mControllers) {
if (controller instanceof FaceSettingsPreferenceController) {
diff --git a/src/com/android/settings/biometrics/face/FaceSettingsRemoveButtonPreferenceController.java b/src/com/android/settings/biometrics/face/FaceSettingsRemoveButtonPreferenceController.java
index 7db5958..1e74ad7 100644
--- a/src/com/android/settings/biometrics/face/FaceSettingsRemoveButtonPreferenceController.java
+++ b/src/com/android/settings/biometrics/face/FaceSettingsRemoveButtonPreferenceController.java
@@ -21,6 +21,7 @@
import android.app.settings.SettingsEnums;
import android.content.Context;
import android.content.DialogInterface;
+import android.content.pm.PackageManager;
import android.hardware.face.Face;
import android.hardware.face.FaceManager;
import android.os.Bundle;
@@ -69,10 +70,22 @@
public Dialog onCreateDialog(Bundle savedInstanceState) {
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
+ final PackageManager pm = getContext().getPackageManager();
+ final boolean hasFingerprint = pm.hasSystemFeature(PackageManager.FEATURE_FINGERPRINT);
+ final int dialogMessageRes;
+
+ if (hasFingerprint) {
+ dialogMessageRes = mIsConvenience
+ ? R.string.security_settings_face_remove_dialog_details_fingerprint_conv
+ : R.string.security_settings_face_remove_dialog_details_fingerprint;
+ } else {
+ dialogMessageRes = mIsConvenience
+ ? R.string.security_settings_face_settings_remove_dialog_details_convenience
+ : R.string.security_settings_face_settings_remove_dialog_details;
+ }
+
builder.setTitle(R.string.security_settings_face_settings_remove_dialog_title)
- .setMessage(mIsConvenience
- ? R.string.security_settings_face_settings_remove_dialog_details_convenience
- : R.string.security_settings_face_settings_remove_dialog_details)
+ .setMessage(dialogMessageRes)
.setPositiveButton(R.string.delete, mOnClickListener)
.setNegativeButton(R.string.cancel, mOnClickListener);
AlertDialog dialog = builder.create();
diff --git a/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrolling.java b/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrolling.java
index 7e76405..dbdb024 100644
--- a/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrolling.java
+++ b/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrolling.java
@@ -32,10 +32,8 @@
import android.content.res.ColorStateList;
import android.content.res.Configuration;
import android.content.res.Resources;
-import android.graphics.Point;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffColorFilter;
-import android.graphics.Rect;
import android.graphics.drawable.Animatable2;
import android.graphics.drawable.AnimatedVectorDrawable;
import android.graphics.drawable.Drawable;
@@ -48,22 +46,16 @@
import android.os.VibrationEffect;
import android.os.Vibrator;
import android.text.TextUtils;
-import android.util.FeatureFlagUtils;
import android.util.Log;
-import android.view.DisplayInfo;
import android.view.MotionEvent;
import android.view.OrientationEventListener;
import android.view.Surface;
import android.view.View;
-import android.view.ViewGroup;
import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityManager;
import android.view.animation.AccelerateDecelerateInterpolator;
import android.view.animation.AnimationUtils;
import android.view.animation.Interpolator;
-import android.widget.FrameLayout;
-import android.widget.ImageView;
-import android.widget.LinearLayout;
import android.widget.ProgressBar;
import android.widget.RelativeLayout;
import android.widget.TextView;
@@ -79,25 +71,20 @@
import com.android.settings.biometrics.BiometricsEnrollEnrolling;
import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
import com.android.settingslib.display.DisplayDensityUtils;
-import com.android.settingslib.udfps.UdfpsOverlayParams;
-import com.android.settingslib.udfps.UdfpsUtils;
import com.airbnb.lottie.LottieAnimationView;
import com.airbnb.lottie.LottieCompositionFactory;
import com.airbnb.lottie.LottieProperty;
import com.airbnb.lottie.model.KeyPath;
-import com.google.android.setupcompat.template.FooterActionButton;
import com.google.android.setupcompat.template.FooterBarMixin;
import com.google.android.setupcompat.template.FooterButton;
import com.google.android.setupcompat.util.WizardManagerHelper;
-import com.google.android.setupdesign.GlifLayout;
import com.google.android.setupdesign.template.DescriptionMixin;
import com.google.android.setupdesign.template.HeaderMixin;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.List;
-import java.util.Locale;
/**
* Activity which handles the actual enrolling for fingerprint.
@@ -176,8 +163,6 @@
@VisibleForTesting
@Nullable
UdfpsEnrollHelper mUdfpsEnrollHelper;
- // TODO(b/260617060): Do not hard-code mScaleFactor, referring to AuthController.
- private float mScaleFactor = 1.0f;
private ObjectAnimator mProgressAnim;
private TextView mErrorText;
private Interpolator mFastOutSlowInInterpolator;
@@ -206,7 +191,7 @@
private boolean mHaveShownSfpsLeftEdgeLottie;
private boolean mHaveShownSfpsRightEdgeLottie;
private boolean mShouldShowLottie;
- private UdfpsUtils mUdfpsUtils;
+
private ObjectAnimator mHelpAnimation;
private OrientationEventListener mOrientationEventListener;
@@ -251,82 +236,17 @@
mAccessibilityManager = getSystemService(AccessibilityManager.class);
mIsAccessibilityEnabled = mAccessibilityManager.isEnabled();
- mUdfpsUtils = new UdfpsUtils();
- final boolean isLayoutRtl = (TextUtils.getLayoutDirectionFromLocale(
- Locale.getDefault()) == View.LAYOUT_DIRECTION_RTL);
listenOrientationEvent();
if (mCanAssumeUdfps) {
- int rotation = getApplicationContext().getDisplay().getRotation();
- final GlifLayout layout = (GlifLayout) getLayoutInflater().inflate(
- R.layout.udfps_enroll_enrolling, null, false);
- final UdfpsEnrollView udfpsEnrollView = layout.findViewById(R.id.udfps_animation_view);
- updateUdfpsEnrollView(udfpsEnrollView, props.get(0));
- switch (rotation) {
- case Surface.ROTATION_90:
- final LinearLayout layoutContainer = layout.findViewById(
- R.id.layout_container);
- final LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
- LinearLayout.LayoutParams.MATCH_PARENT,
- LinearLayout.LayoutParams.MATCH_PARENT);
+ final UdfpsEnrollEnrollingView layout =
+ (UdfpsEnrollEnrollingView) getLayoutInflater().inflate(
+ R.layout.udfps_enroll_enrolling, null, false);
+ setUdfpsEnrollHelper();
+ layout.initView(props.get(0), mUdfpsEnrollHelper, mAccessibilityManager);
- lp.setMarginEnd((int) getResources().getDimension(
- R.dimen.rotation_90_enroll_margin_end));
- layoutContainer.setPaddingRelative((int) getResources().getDimension(
- R.dimen.rotation_90_enroll_padding_start), 0, isLayoutRtl
- ? 0 : (int) getResources().getDimension(
- R.dimen.rotation_90_enroll_padding_end), 0);
- layoutContainer.setLayoutParams(lp);
-
- setOnHoverListener(true, layout, udfpsEnrollView);
- setContentView(layout, lp);
- break;
-
- case Surface.ROTATION_0:
- case Surface.ROTATION_180:
- // In the portrait mode, layout_container's height is 0, so it's
- // always shown at the bottom of the screen.
- final FrameLayout portraitLayoutContainer = layout.findViewById(
- R.id.layout_container);
-
- // In the portrait mode, the title and lottie animation view may
- // overlap when title needs three lines, so adding some paddings
- // between them, and adjusting the fp progress view here accordingly.
- final int layoutLottieAnimationPadding = (int) getResources()
- .getDimension(R.dimen.udfps_lottie_padding_top);
- portraitLayoutContainer.setPadding(0,
- layoutLottieAnimationPadding, 0, 0);
- final ImageView progressView = udfpsEnrollView.findViewById(
- R.id.udfps_enroll_animation_fp_progress_view);
- progressView.setPadding(0, -(layoutLottieAnimationPadding),
- 0, layoutLottieAnimationPadding);
- final ImageView fingerprintView = udfpsEnrollView.findViewById(
- R.id.udfps_enroll_animation_fp_view);
- fingerprintView.setPadding(0, -layoutLottieAnimationPadding,
- 0, layoutLottieAnimationPadding);
-
- // TODO(b/260970216) Instead of hiding the description text view, we should
- // make the header view scrollable if the text is too long.
- // If description text view has overlap with udfps progress view, hide it.
- View view = layout.getDescriptionTextView();
- layout.getViewTreeObserver().addOnDrawListener(() -> {
- if (view.getVisibility() == View.VISIBLE
- && hasOverlap(view, udfpsEnrollView)) {
- view.setVisibility(View.GONE);
- }
- });
-
- setOnHoverListener(false, layout, udfpsEnrollView);
- setContentView(layout);
- break;
-
- case Surface.ROTATION_270:
- default:
- setOnHoverListener(true, layout, udfpsEnrollView);
- setContentView(layout);
- break;
- }
+ setContentView(layout);
setDescriptionText(R.string.security_settings_udfps_enroll_start_message);
} else if (mCanAssumeSfps) {
setContentView(R.layout.sfps_enroll_enrolling);
@@ -366,22 +286,11 @@
.build()
);
- if (FeatureFlagUtils.isEnabled(getApplicationContext(),
- FeatureFlagUtils.SETTINGS_SHOW_UDFPS_ENROLL_IN_SETTINGS)) {
- // Remove the space view and make the width of footer button container WRAP_CONTENT
- // to avoid hiding the udfps view progress bar bottom.
- final LinearLayout buttonContainer = mFooterBarMixin.getButtonContainer();
- View spaceView = null;
- for (int i = 0; i < buttonContainer.getChildCount(); i++) {
- if (!(buttonContainer.getChildAt(i) instanceof FooterActionButton)) {
- spaceView = buttonContainer.getChildAt(i);
- break;
- }
- }
- if (spaceView != null) {
- spaceView.setVisibility(View.GONE);
- buttonContainer.getLayoutParams().width = ViewGroup.LayoutParams.WRAP_CONTENT;
- }
+ // If it's udfps, set the background color only for secondary button if necessary.
+ if (mCanAssumeUdfps) {
+ mShouldSetFooterBarBackground = false;
+ ((UdfpsEnrollEnrollingView) getLayout()).setSecondaryButtonBackground(
+ getBackgroundColor());
}
final LayerDrawable fingerprintDrawable = mProgressBar != null
@@ -919,19 +828,26 @@
}
@Override
- public void onPointerDown(int sensorId) {
+ public void onUdfpsPointerDown(int sensorId) {
if (mUdfpsEnrollHelper != null) {
mUdfpsEnrollHelper.onPointerDown(sensorId);
}
}
@Override
- public void onPointerUp(int sensorId) {
+ public void onUdfpsPointerUp(int sensorId) {
if (mUdfpsEnrollHelper != null) {
mUdfpsEnrollHelper.onPointerUp(sensorId);
}
}
+ @Override
+ public void onUdfpsOverlayShown() {
+ if (mCanAssumeUdfps) {
+ findViewById(R.id.udfps_animation_view).setVisibility(View.VISIBLE);
+ }
+ }
+
private void updateProgress(boolean animate) {
if (mSidecar == null || !mSidecar.isEnrolling()) {
Log.d(TAG, "Enrollment not started yet");
@@ -1224,30 +1140,7 @@
}
}
- private UdfpsEnrollView updateUdfpsEnrollView(UdfpsEnrollView udfpsEnrollView,
- FingerprintSensorPropertiesInternal udfpsProps) {
- DisplayInfo displayInfo = new DisplayInfo();
- getDisplay().getDisplayInfo(displayInfo);
- mScaleFactor = mUdfpsUtils.getScaleFactor(displayInfo);
- Rect udfpsBounds = udfpsProps.getLocation().getRect();
- udfpsBounds.scale(mScaleFactor);
-
- final Rect overlayBounds = new Rect(
- 0, /* left */
- displayInfo.getNaturalHeight() / 2, /* top */
- displayInfo.getNaturalWidth(), /* right */
- displayInfo.getNaturalHeight() /* botom */);
-
- UdfpsOverlayParams params = new UdfpsOverlayParams(
- udfpsBounds,
- overlayBounds,
- displayInfo.getNaturalWidth(),
- displayInfo.getNaturalHeight(),
- mScaleFactor,
- displayInfo.rotation);
-
- udfpsEnrollView.setOverlayParams(params);
-
+ private void setUdfpsEnrollHelper() {
mUdfpsEnrollHelper = (UdfpsEnrollHelper) getSupportFragmentManager().findFragmentByTag(
FingerprintEnrollEnrolling.TAG_UDFPS_HELPER);
if (mUdfpsEnrollHelper == null) {
@@ -1257,57 +1150,6 @@
.add(mUdfpsEnrollHelper, FingerprintEnrollEnrolling.TAG_UDFPS_HELPER)
.commitAllowingStateLoss();
}
- udfpsEnrollView.setEnrollHelper(mUdfpsEnrollHelper);
-
- return udfpsEnrollView;
- }
-
- private void setOnHoverListener(boolean isLandscape, GlifLayout enrollLayout,
- UdfpsEnrollView udfpsEnrollView) {
- if (!mIsAccessibilityEnabled) return;
-
- final Context context = getApplicationContext();
- final View.OnHoverListener onHoverListener = (v, event) -> {
- // Map the touch to portrait mode if the device is in
- // landscape mode.
- final Point scaledTouch =
- mUdfpsUtils.getTouchInNativeCoordinates(event.getPointerId(0),
- event, udfpsEnrollView.getOverlayParams());
-
- if (mUdfpsUtils.isWithinSensorArea(event.getPointerId(0), event,
- udfpsEnrollView.getOverlayParams())) {
- return false;
- }
-
- final String theStr = mUdfpsUtils.onTouchOutsideOfSensorArea(
- mAccessibilityManager.isTouchExplorationEnabled(), context,
- scaledTouch.x, scaledTouch.y, udfpsEnrollView.getOverlayParams());
- if (theStr != null) {
- v.announceForAccessibility(theStr);
- }
- return false;
- };
-
- enrollLayout.findManagedViewById(isLandscape ? R.id.sud_landscape_content_area
- : R.id.sud_layout_content).setOnHoverListener(onHoverListener);
- }
-
-
- @VisibleForTesting boolean hasOverlap(View view1, View view2) {
- int[] firstPosition = new int[2];
- int[] secondPosition = new int[2];
-
- view1.getLocationOnScreen(firstPosition);
- view2.getLocationOnScreen(secondPosition);
-
- // Rect constructor parameters: left, top, right, bottom
- Rect rectView1 = new Rect(firstPosition[0], firstPosition[1],
- firstPosition[0] + view1.getMeasuredWidth(),
- firstPosition[1] + view1.getMeasuredHeight());
- Rect rectView2 = new Rect(secondPosition[0], secondPosition[1],
- secondPosition[0] + view2.getMeasuredWidth(),
- secondPosition[1] + view2.getMeasuredHeight());
- return rectView1.intersect(rectView2);
}
public static class IconTouchDialog extends InstrumentedDialogFragment {
diff --git a/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollSidecar.java b/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollSidecar.java
index 5d04cd6..493302b 100644
--- a/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollSidecar.java
+++ b/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollSidecar.java
@@ -124,13 +124,18 @@
}
@Override
- public void onPointerDown(int sensorId) {
- FingerprintEnrollSidecar.super.onPointerDown(sensorId);
+ public void onUdfpsPointerDown(int sensorId) {
+ FingerprintEnrollSidecar.super.onUdfpsPointerDown(sensorId);
}
@Override
- public void onPointerUp(int sensorId) {
- FingerprintEnrollSidecar.super.onPointerUp(sensorId);
+ public void onUdfpsPointerUp(int sensorId) {
+ FingerprintEnrollSidecar.super.onUdfpsPointerUp(sensorId);
+ }
+
+ @Override
+ public void onUdfpsOverlayShown() {
+ FingerprintEnrollSidecar.super.onUdfpsOverlayShown();
}
};
diff --git a/src/com/android/settings/biometrics/fingerprint/FingerprintSettings.java b/src/com/android/settings/biometrics/fingerprint/FingerprintSettings.java
index fb3319c..e47e9a8 100644
--- a/src/com/android/settings/biometrics/fingerprint/FingerprintSettings.java
+++ b/src/com/android/settings/biometrics/fingerprint/FingerprintSettings.java
@@ -479,10 +479,8 @@
R.string.security_settings_fingerprint_enroll_introduction_v3_message,
DeviceHelper.getDeviceName(getActivity()));
column.mLearnMoreClickListener = learnMoreClickListener;
- if (isSfps()) {
- column.mLearnMoreOverrideText = getText(
- R.string.security_settings_fingerprint_settings_footer_learn_more);
- }
+ column.mLearnMoreOverrideText = getText(
+ R.string.security_settings_fingerprint_settings_footer_learn_more);
mFooterColumns.add(column);
}
}
diff --git a/src/com/android/settings/biometrics/fingerprint/FingerprintUpdater.java b/src/com/android/settings/biometrics/fingerprint/FingerprintUpdater.java
index 36325a7..306b1a3 100644
--- a/src/com/android/settings/biometrics/fingerprint/FingerprintUpdater.java
+++ b/src/com/android/settings/biometrics/fingerprint/FingerprintUpdater.java
@@ -98,13 +98,18 @@
}
@Override
- public void onPointerDown(int sensorId) {
- mCallback.onPointerDown(sensorId);
+ public void onUdfpsPointerDown(int sensorId) {
+ mCallback.onUdfpsPointerDown(sensorId);
}
@Override
- public void onPointerUp(int sensorId) {
- mCallback.onPointerUp(sensorId);
+ public void onUdfpsPointerUp(int sensorId) {
+ mCallback.onUdfpsPointerUp(sensorId);
+ }
+
+ @Override
+ public void onUdfpsOverlayShown() {
+ mCallback.onUdfpsOverlayShown();
}
}
diff --git a/src/com/android/settings/biometrics/fingerprint/UdfpsEnrollEnrollingView.java b/src/com/android/settings/biometrics/fingerprint/UdfpsEnrollEnrollingView.java
new file mode 100644
index 0000000..df2f2f7
--- /dev/null
+++ b/src/com/android/settings/biometrics/fingerprint/UdfpsEnrollEnrollingView.java
@@ -0,0 +1,236 @@
+/*
+ * Copyright (C) 2023 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.biometrics.fingerprint;
+
+import android.content.Context;
+import android.graphics.Point;
+import android.graphics.Rect;
+import android.hardware.fingerprint.FingerprintSensorPropertiesInternal;
+import android.text.TextUtils;
+import android.util.AttributeSet;
+import android.view.DisplayInfo;
+import android.view.Gravity;
+import android.view.Surface;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.accessibility.AccessibilityManager;
+import android.widget.Button;
+import android.widget.FrameLayout;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
+
+import androidx.annotation.ColorInt;
+
+import com.android.internal.annotations.VisibleForTesting;
+import com.android.settings.R;
+import com.android.settingslib.udfps.UdfpsOverlayParams;
+import com.android.settingslib.udfps.UdfpsUtils;
+
+import com.google.android.setupcompat.template.FooterBarMixin;
+import com.google.android.setupdesign.GlifLayout;
+import com.google.android.setupdesign.view.BottomScrollView;
+
+import java.util.Locale;
+
+/**
+ * View for udfps enrolling.
+ */
+public class UdfpsEnrollEnrollingView extends GlifLayout {
+ private final UdfpsUtils mUdfpsUtils;
+ private final Context mContext;
+ // We don't need to listen to onConfigurationChanged() for mRotation here because
+ // FingerprintEnrollEnrolling is always recreated once the configuration is changed.
+ private final int mRotation;
+ private final boolean mIsLandscape;
+ private final boolean mShouldUseReverseLandscape;
+ private UdfpsEnrollView mUdfpsEnrollView;
+ private View mHeaderView;
+ private AccessibilityManager mAccessibilityManager;
+
+
+ public UdfpsEnrollEnrollingView(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ mContext = context;
+ mRotation = mContext.getDisplay().getRotation();
+ mIsLandscape = mRotation == Surface.ROTATION_90 || mRotation == Surface.ROTATION_270;
+ final boolean isLayoutRtl = (TextUtils.getLayoutDirectionFromLocale(Locale.getDefault())
+ == View.LAYOUT_DIRECTION_RTL);
+ mShouldUseReverseLandscape = (mRotation == Surface.ROTATION_90 && isLayoutRtl)
+ || (mRotation == Surface.ROTATION_270 && !isLayoutRtl);
+
+ mUdfpsUtils = new UdfpsUtils();
+ }
+
+ @Override
+ protected void onFinishInflate() {
+ super.onFinishInflate();
+ mHeaderView = findViewById(R.id.sud_landscape_header_area);
+ mUdfpsEnrollView = findViewById(R.id.udfps_animation_view);
+ }
+
+ void initView(FingerprintSensorPropertiesInternal udfpsProps,
+ UdfpsEnrollHelper udfpsEnrollHelper,
+ AccessibilityManager accessibilityManager) {
+ mAccessibilityManager = accessibilityManager;
+ initUdfpsEnrollView(udfpsProps, udfpsEnrollHelper);
+
+ if (!mIsLandscape) {
+ adjustPortraitPaddings();
+ } else if (mShouldUseReverseLandscape) {
+ swapHeaderAndContent();
+ }
+ setOnHoverListener();
+ }
+
+ void setSecondaryButtonBackground(@ColorInt int color) {
+ // Set the button background only when the button is not under udfps overlay to avoid UI
+ // overlap.
+ if (!mIsLandscape || mShouldUseReverseLandscape) {
+ return;
+ }
+ final Button secondaryButtonView =
+ getMixin(FooterBarMixin.class).getSecondaryButtonView();
+ secondaryButtonView.setBackgroundColor(color);
+ if (mRotation == Surface.ROTATION_90) {
+ secondaryButtonView.setGravity(Gravity.START);
+ } else {
+ secondaryButtonView.setGravity(Gravity.END);
+ }
+ mHeaderView.post(() -> {
+ secondaryButtonView.setLayoutParams(
+ new LinearLayout.LayoutParams(mHeaderView.getMeasuredWidth(),
+ ViewGroup.LayoutParams.WRAP_CONTENT));
+ });
+ }
+
+ private void initUdfpsEnrollView(FingerprintSensorPropertiesInternal udfpsProps,
+ UdfpsEnrollHelper udfpsEnrollHelper) {
+ DisplayInfo displayInfo = new DisplayInfo();
+ mContext.getDisplay().getDisplayInfo(displayInfo);
+
+ final float scaleFactor = mUdfpsUtils.getScaleFactor(displayInfo);
+ Rect udfpsBounds = udfpsProps.getLocation().getRect();
+ udfpsBounds.scale(scaleFactor);
+
+ final Rect overlayBounds = new Rect(
+ 0, /* left */
+ displayInfo.getNaturalHeight() / 2, /* top */
+ displayInfo.getNaturalWidth(), /* right */
+ displayInfo.getNaturalHeight() /* botom */);
+
+ UdfpsOverlayParams params = new UdfpsOverlayParams(
+ udfpsBounds,
+ overlayBounds,
+ displayInfo.getNaturalWidth(),
+ displayInfo.getNaturalHeight(),
+ scaleFactor,
+ displayInfo.rotation);
+
+ mUdfpsEnrollView.setOverlayParams(params);
+ mUdfpsEnrollView.setEnrollHelper(udfpsEnrollHelper);
+ }
+
+ private void adjustPortraitPaddings() {
+ // In the portrait mode, layout_container's height is 0, so it's
+ // always shown at the bottom of the screen.
+ final FrameLayout portraitLayoutContainer = findViewById(R.id.layout_container);
+
+ // In the portrait mode, the title and lottie animation view may
+ // overlap when title needs three lines, so adding some paddings
+ // between them, and adjusting the fp progress view here accordingly.
+ final int layoutLottieAnimationPadding = (int) getResources()
+ .getDimension(R.dimen.udfps_lottie_padding_top);
+ portraitLayoutContainer.setPadding(0,
+ layoutLottieAnimationPadding, 0, 0);
+ final ImageView progressView = mUdfpsEnrollView.findViewById(
+ R.id.udfps_enroll_animation_fp_progress_view);
+ progressView.setPadding(0, -(layoutLottieAnimationPadding),
+ 0, layoutLottieAnimationPadding);
+ final ImageView fingerprintView = mUdfpsEnrollView.findViewById(
+ R.id.udfps_enroll_animation_fp_view);
+ fingerprintView.setPadding(0, -layoutLottieAnimationPadding,
+ 0, layoutLottieAnimationPadding);
+
+ // TODO(b/260970216) Instead of hiding the description text view, we should
+ // make the header view scrollable if the text is too long.
+ // If description text view has overlap with udfps progress view, hide it.
+ final View descView = getDescriptionTextView();
+ getViewTreeObserver().addOnDrawListener(() -> {
+ if (descView.getVisibility() == View.VISIBLE
+ && hasOverlap(descView, mUdfpsEnrollView)) {
+ descView.setVisibility(View.GONE);
+ }
+ });
+ }
+
+ private void setOnHoverListener() {
+ if (!mAccessibilityManager.isEnabled()) return;
+
+ final View.OnHoverListener onHoverListener = (v, event) -> {
+ // Map the touch to portrait mode if the device is in
+ // landscape mode.
+ final Point scaledTouch =
+ mUdfpsUtils.getTouchInNativeCoordinates(event.getPointerId(0),
+ event, mUdfpsEnrollView.getOverlayParams());
+
+ if (mUdfpsUtils.isWithinSensorArea(event.getPointerId(0), event,
+ mUdfpsEnrollView.getOverlayParams())) {
+ return false;
+ }
+
+ final String theStr = mUdfpsUtils.onTouchOutsideOfSensorArea(
+ mAccessibilityManager.isTouchExplorationEnabled(), mContext,
+ scaledTouch.x, scaledTouch.y, mUdfpsEnrollView.getOverlayParams());
+ if (theStr != null) {
+ v.announceForAccessibility(theStr);
+ }
+ return false;
+ };
+
+ findManagedViewById(mIsLandscape ? R.id.sud_landscape_content_area
+ : R.id.sud_layout_content).setOnHoverListener(onHoverListener);
+ }
+
+ private void swapHeaderAndContent() {
+ // Reverse header and body
+ ViewGroup parentView = (ViewGroup) mHeaderView.getParent();
+ parentView.removeView(mHeaderView);
+ parentView.addView(mHeaderView);
+
+ // Hide scroll indicators
+ BottomScrollView headerScrollView = mHeaderView.findViewById(R.id.sud_header_scroll_view);
+ headerScrollView.setScrollIndicators(0);
+ }
+
+ @VisibleForTesting
+ boolean hasOverlap(View view1, View view2) {
+ int[] firstPosition = new int[2];
+ int[] secondPosition = new int[2];
+
+ view1.getLocationOnScreen(firstPosition);
+ view2.getLocationOnScreen(secondPosition);
+
+ // Rect constructor parameters: left, top, right, bottom
+ Rect rectView1 = new Rect(firstPosition[0], firstPosition[1],
+ firstPosition[0] + view1.getMeasuredWidth(),
+ firstPosition[1] + view1.getMeasuredHeight());
+ Rect rectView2 = new Rect(secondPosition[0], secondPosition[1],
+ secondPosition[0] + view2.getMeasuredWidth(),
+ secondPosition[1] + view2.getMeasuredHeight());
+ return rectView1.intersect(rectView2);
+ }
+}
diff --git a/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollProgressViewModel.java b/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollProgressViewModel.java
index d77d9d3..7074288 100644
--- a/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollProgressViewModel.java
+++ b/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollProgressViewModel.java
@@ -103,12 +103,12 @@
}
@Override
- public void onPointerDown(int sensorId) {
+ public void onUdfpsPointerDown(int sensorId) {
mPointerDownLiveData.postValue(sensorId);
}
@Override
- public void onPointerUp(int sensorId) {
+ public void onUdfpsPointerUp(int sensorId) {
mPointerUpLiveData.postValue(sensorId);
}
};
diff --git a/src/com/android/settings/bluetooth/BluetoothDetailsProfilesController.java b/src/com/android/settings/bluetooth/BluetoothDetailsProfilesController.java
index 724947c..3472e39 100644
--- a/src/com/android/settings/bluetooth/BluetoothDetailsProfilesController.java
+++ b/src/com/android/settings/bluetooth/BluetoothDetailsProfilesController.java
@@ -69,6 +69,7 @@
private static final String ENABLE_DUAL_MODE_AUDIO =
"persist.bluetooth.enable_dual_mode_audio";
private static final String CONFIG_LE_AUDIO_ENABLED_BY_DEFAULT = "le_audio_enabled_by_default";
+ private static final boolean LE_AUDIO_DEVICE_DETAIL_DEFAULT_VALUE = false;
private LocalBluetoothManager mManager;
private LocalBluetoothProfileManager mProfileManager;
@@ -96,12 +97,6 @@
protected void init(PreferenceScreen screen) {
mProfilesContainer = (PreferenceCategory)screen.findPreference(getPreferenceKey());
mProfilesContainer.setLayoutResource(R.layout.preference_bluetooth_profile_category);
- mIsLeContactSharingEnabled = DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_SETTINGS_UI,
- SettingsUIDeviceConfig.BT_LE_AUDIO_CONTACT_SHARING_ENABLED, true);
- mIsLeAudioToggleEnabled = DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_SETTINGS_UI,
- SettingsUIDeviceConfig.BT_LE_AUDIO_DEVICE_DETAIL_ENABLED, false)
- || DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_BLUETOOTH,
- CONFIG_LE_AUDIO_ENABLED_BY_DEFAULT, false);
// Call refresh here even though it will get called later in onResume, to avoid the
// list of switches appearing to "pop" into the page.
refresh();
@@ -151,8 +146,8 @@
profilePref.setEnabled(!mCachedDevice.isBusy());
}
- if (profile instanceof LeAudioProfile && !mIsLeAudioToggleEnabled) {
- profilePref.setVisible(false);
+ if (profile instanceof LeAudioProfile) {
+ profilePref.setVisible(mIsLeAudioToggleEnabled);
}
if (profile instanceof MapProfile) {
@@ -437,6 +432,7 @@
@Override
public void onResume() {
+ updateLeAudioConfig();
for (CachedBluetoothDevice item : mAllOfCachedDevices) {
item.registerCallback(this);
}
@@ -444,6 +440,21 @@
refresh();
}
+ private void updateLeAudioConfig() {
+ mIsLeContactSharingEnabled = DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_SETTINGS_UI,
+ SettingsUIDeviceConfig.BT_LE_AUDIO_CONTACT_SHARING_ENABLED, true);
+ boolean isLeDeviceDetailEnabled = DeviceConfig.getBoolean(
+ DeviceConfig.NAMESPACE_SETTINGS_UI,
+ SettingsUIDeviceConfig.BT_LE_AUDIO_DEVICE_DETAIL_ENABLED,
+ LE_AUDIO_DEVICE_DETAIL_DEFAULT_VALUE);
+ boolean isLeEnabledByDefault = DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_BLUETOOTH,
+ CONFIG_LE_AUDIO_ENABLED_BY_DEFAULT, false);
+ mIsLeAudioToggleEnabled = isLeDeviceDetailEnabled || isLeEnabledByDefault;
+ Log.d(TAG, "BT_LE_AUDIO_CONTACT_SHARING_ENABLED:" + mIsLeContactSharingEnabled
+ + ", BT_LE_AUDIO_DEVICE_DETAIL_ENABLED:" + isLeDeviceDetailEnabled
+ + ", CONFIG_LE_AUDIO_ENABLED_BY_DEFAULT:" + isLeEnabledByDefault);
+ }
+
@Override
public void onDeviceAttributesChanged() {
for (CachedBluetoothDevice item : mAllOfCachedDevices) {
diff --git a/src/com/android/settings/bluetooth/ForgetDeviceDialogFragment.java b/src/com/android/settings/bluetooth/ForgetDeviceDialogFragment.java
index 1da8672..60d63c6 100644
--- a/src/com/android/settings/bluetooth/ForgetDeviceDialogFragment.java
+++ b/src/com/android/settings/bluetooth/ForgetDeviceDialogFragment.java
@@ -23,6 +23,7 @@
import android.content.Context;
import android.content.DialogInterface;
import android.os.Bundle;
+import android.util.Log;
import androidx.annotation.VisibleForTesting;
import androidx.appcompat.app.AlertDialog;
@@ -63,6 +64,13 @@
@Override
public Dialog onCreateDialog(Bundle inState) {
+ Context context = getContext();
+ mDevice = getDevice(context);
+ if (mDevice == null) {
+ Log.e(TAG, "onCreateDialog: Device is null.");
+ return null;
+ }
+
DialogInterface.OnClickListener onConfirm = (dialog, which) -> {
mDevice.unpair();
Activity activity = getActivity();
@@ -70,9 +78,6 @@
activity.finish();
}
};
- Context context = getContext();
- mDevice = getDevice(context);
-
AlertDialog dialog = new AlertDialog.Builder(context)
.setPositiveButton(R.string.bluetooth_unpair_dialog_forget_confirm_button,
onConfirm)
diff --git a/src/com/android/settings/bluetooth/QrCodeScanModeActivity.java b/src/com/android/settings/bluetooth/QrCodeScanModeActivity.java
index 92786c9..a0b249d 100644
--- a/src/com/android/settings/bluetooth/QrCodeScanModeActivity.java
+++ b/src/com/android/settings/bluetooth/QrCodeScanModeActivity.java
@@ -98,7 +98,7 @@
BluetoothBroadcastUtils.TAG_FRAGMENT_QR_CODE_SCANNER);
if (fragment == null) {
- fragment = new QrCodeScanModeFragment(mIsGroupOp, mSink);
+ fragment = new QrCodeScanModeFragment();
} else {
if (fragment.isVisible()) {
return;
diff --git a/src/com/android/settings/bluetooth/QrCodeScanModeFragment.java b/src/com/android/settings/bluetooth/QrCodeScanModeFragment.java
index f89dac6..80aedd7 100644
--- a/src/com/android/settings/bluetooth/QrCodeScanModeFragment.java
+++ b/src/com/android/settings/bluetooth/QrCodeScanModeFragment.java
@@ -18,7 +18,6 @@
import android.app.Activity;
import android.app.settings.SettingsEnums;
-import android.bluetooth.BluetoothDevice;
import android.content.Context;
import android.content.Intent;
import android.graphics.Matrix;
@@ -71,9 +70,7 @@
public static final String KEY_BROADCAST_METADATA = "key_broadcast_metadata";
- private boolean mIsGroupOp;
private int mCornerRadius;
- private BluetoothDevice mSink;
private String mBroadcastMetadata;
private Context mContext;
private QrCamera mCamera;
@@ -81,11 +78,6 @@
private TextView mSummary;
private TextView mErrorMessage;
- public QrCodeScanModeFragment(boolean isGroupOp, BluetoothDevice sink) {
- mIsGroupOp = isGroupOp;
- mSink = sink;
- }
-
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
diff --git a/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java b/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java
index 4dc8f1a..578493a 100644
--- a/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java
+++ b/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java
@@ -33,6 +33,7 @@
import static com.android.settingslib.drawer.TileUtils.META_DATA_PREFERENCE_TITLE;
import static com.android.settingslib.drawer.TileUtils.META_DATA_PREFERENCE_TITLE_URI;
+import android.app.PendingIntent;
import android.app.settings.SettingsEnums;
import android.content.ComponentName;
import android.content.Context;
@@ -75,6 +76,8 @@
import com.android.settingslib.utils.ThreadUtils;
import com.android.settingslib.widget.AdaptiveIcon;
+import com.google.common.collect.Iterables;
+
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
@@ -152,7 +155,14 @@
}
bindIcon(pref, tile, forceRoundedIcon);
- if (tile instanceof ActivityTile) {
+ if (tile.hasPendingIntent()) {
+ // Pending intent cannot be launched within the settings app panel, and will thus always
+ // be executed directly.
+ pref.setOnPreferenceClickListener(preference -> {
+ launchPendingIntentOrSelectProfile(activity, tile, fragment.getMetricsCategory());
+ return true;
+ });
+ } else if (tile instanceof ActivityTile) {
final int sourceMetricsCategory = fragment.getMetricsCategory();
final Bundle metadata = tile.getMetaData();
String clsName = null;
@@ -441,6 +451,33 @@
preference.setIcon(iconDrawable);
}
+ private void launchPendingIntentOrSelectProfile(FragmentActivity activity, Tile tile,
+ int sourceMetricCategory) {
+ ProfileSelectDialog.updatePendingIntentsIfNeeded(mContext, tile);
+
+ if (tile.pendingIntentMap.isEmpty()) {
+ Log.w(TAG, "Cannot resolve pendingIntent, skipping. " + tile.getIntent());
+ return;
+ }
+
+ mMetricsFeatureProvider.logSettingsTileClick(tile.getKey(mContext), sourceMetricCategory);
+
+ // Launch the pending intent directly if there's only one available.
+ if (tile.pendingIntentMap.size() == 1) {
+ PendingIntent pendingIntent = Iterables.getOnlyElement(tile.pendingIntentMap.values());
+ try {
+ pendingIntent.send();
+ } catch (PendingIntent.CanceledException e) {
+ Log.w(TAG, "Failed executing pendingIntent. " + pendingIntent.getIntent(), e);
+ }
+ return;
+ }
+
+ ProfileSelectDialog.show(activity.getSupportFragmentManager(), tile,
+ sourceMetricCategory, /* onShowListener= */ null,
+ /* onDismissListener= */ null, /* onCancelListener= */ null);
+ }
+
private void launchIntentOrSelectProfile(FragmentActivity activity, Tile tile, Intent intent,
int sourceMetricCategory, TopLevelHighlightMixin highlightMixin,
boolean isDuplicateClick) {
diff --git a/src/com/android/settings/dashboard/DashboardFragment.java b/src/com/android/settings/dashboard/DashboardFragment.java
index 6076a25..f8a5d76 100644
--- a/src/com/android/settings/dashboard/DashboardFragment.java
+++ b/src/com/android/settings/dashboard/DashboardFragment.java
@@ -31,6 +31,7 @@
import androidx.annotation.VisibleForTesting;
import androidx.lifecycle.LifecycleObserver;
import androidx.preference.Preference;
+import androidx.preference.PreferenceCategory;
import androidx.preference.PreferenceGroup;
import androidx.preference.PreferenceManager;
import androidx.preference.PreferenceScreen;
@@ -47,7 +48,6 @@
import com.android.settingslib.core.AbstractPreferenceController;
import com.android.settingslib.core.lifecycle.Lifecycle;
import com.android.settingslib.drawer.DashboardCategory;
-import com.android.settingslib.drawer.ProviderTile;
import com.android.settingslib.drawer.Tile;
import com.android.settingslib.search.Indexable;
@@ -55,6 +55,7 @@
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
+import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.Objects;
@@ -504,6 +505,10 @@
// Install dashboard tiles and collect pending observers.
final boolean forceRoundedIcons = shouldForceRoundedIcon();
final List<DynamicDataObserver> pendingObservers = new ArrayList<>();
+
+ // Move group tiles to the beginning of the list to ensure they are created before the
+ // other tiles.
+ tiles.sort(Comparator.comparingInt(tile -> tile.getType() == Tile.Type.GROUP ? 0 : 1));
for (Tile tile : tiles) {
final String key = mDashboardFeatureProvider.getDashboardKeyForTile(tile);
if (TextUtils.isEmpty(key)) {
@@ -526,7 +531,14 @@
observers = mDashboardFeatureProvider.bindPreferenceToTileAndGetObservers(
getActivity(), this, forceRoundedIcons, pref, tile, key,
mPlaceholderPreferenceController.getOrder());
- screen.addPreference(pref);
+ if (tile.hasGroupKey() && mDashboardTilePrefKeys.containsKey(tile.getGroupKey())) {
+ final Preference group = screen.findPreference(tile.getGroupKey());
+ if (group instanceof PreferenceCategory) {
+ ((PreferenceCategory) group).addPreference(pref);
+ }
+ } else {
+ screen.addPreference(pref);
+ }
registerDynamicDataObservers(observers);
mDashboardTilePrefKeys.put(key, observers);
}
@@ -569,11 +581,28 @@
}
protected Preference createPreference(Tile tile) {
- return tile instanceof ProviderTile
- ? new SwitchPreference(getPrefContext())
- : tile.hasSwitch()
- ? new PrimarySwitchPreference(getPrefContext())
- : new Preference(getPrefContext());
+ switch (tile.getType()) {
+ case EXTERNAL_ACTION:
+ Preference externalActionPreference = new Preference(getPrefContext());
+ externalActionPreference
+ .setWidgetLayoutResource(R.layout.preference_external_action_icon);
+ return externalActionPreference;
+ case SWITCH:
+ return new SwitchPreference(getPrefContext());
+ case SWITCH_WITH_ACTION:
+ return new PrimarySwitchPreference(getPrefContext());
+ case GROUP:
+ mMetricsFeatureProvider.action(
+ mMetricsFeatureProvider.getAttribution(getActivity()),
+ SettingsEnums.ACTION_SETTINGS_GROUP_TILE_ADDED_TO_SCREEN,
+ getMetricsCategory(),
+ tile.getKey(getContext()),
+ /* value= */ 0);
+ return new PreferenceCategory((getPrefContext()));
+ case ACTION:
+ default:
+ return new Preference(getPrefContext());
+ }
}
@VisibleForTesting
diff --git a/src/com/android/settings/dashboard/profileselector/ProfileSelectDialog.java b/src/com/android/settings/dashboard/profileselector/ProfileSelectDialog.java
index ef6ad83..58a51cb 100644
--- a/src/com/android/settings/dashboard/profileselector/ProfileSelectDialog.java
+++ b/src/com/android/settings/dashboard/profileselector/ProfileSelectDialog.java
@@ -17,6 +17,7 @@
package com.android.settings.dashboard.profileselector;
import android.app.Dialog;
+import android.app.PendingIntent;
import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnCancelListener;
@@ -127,13 +128,25 @@
@Override
public void onClick(int position) {
final UserHandle user = mSelectedTile.userHandle.get(position);
- // Show menu on top level items.
- final Intent intent = new Intent(mSelectedTile.getIntent());
- FeatureFactory.getFactory(getContext()).getMetricsFeatureProvider()
- .logStartedIntentWithProfile(intent, mSourceMetricCategory,
- position == 1 /* isWorkProfile */);
- intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
- getActivity().startActivityAsUser(intent, user);
+ if (!mSelectedTile.hasPendingIntent()) {
+ final Intent intent = new Intent(mSelectedTile.getIntent());
+ FeatureFactory.getFactory(getContext()).getMetricsFeatureProvider()
+ .logStartedIntentWithProfile(intent, mSourceMetricCategory,
+ position == 1 /* isWorkProfile */);
+ intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
+ getActivity().startActivityAsUser(intent, user);
+ } else {
+ PendingIntent pendingIntent = mSelectedTile.pendingIntentMap.get(user);
+ FeatureFactory.getFactory(getContext()).getMetricsFeatureProvider()
+ .logSettingsTileClickWithProfile(mSelectedTile.getKey(getContext()),
+ mSourceMetricCategory,
+ position == 1 /* isWorkProfile */);
+ try {
+ pendingIntent.send();
+ } catch (PendingIntent.CanceledException e) {
+ Log.w(TAG, "Failed executing pendingIntent. " + pendingIntent.getIntent(), e);
+ }
+ }
dismiss();
}
@@ -178,4 +191,36 @@
}
}
}
+
+ /**
+ * Checks the userHandle and pendingIntentMap in the provided tile, and remove the invalid
+ * entries if any.
+ */
+ public static void updatePendingIntentsIfNeeded(Context context, Tile tile) {
+ if (tile.userHandle == null || tile.userHandle.size() <= 1
+ || tile.pendingIntentMap.size() <= 1) {
+ return;
+ }
+ for (UserHandle userHandle : List.copyOf(tile.userHandle)) {
+ if (!tile.pendingIntentMap.containsKey(userHandle)) {
+ if (DEBUG) {
+ Log.d(TAG, "Delete the user without pending intent: "
+ + userHandle.getIdentifier());
+ }
+ tile.userHandle.remove(userHandle);
+ }
+ }
+
+ final UserManager userManager = UserManager.get(context);
+ for (UserHandle userHandle : List.copyOf(tile.pendingIntentMap.keySet())) {
+ UserInfo userInfo = userManager.getUserInfo(userHandle.getIdentifier());
+ if (userInfo == null || userInfo.isCloneProfile()) {
+ if (DEBUG) {
+ Log.d(TAG, "Delete the user: " + userHandle.getIdentifier());
+ }
+ tile.userHandle.remove(userHandle);
+ tile.pendingIntentMap.remove(userHandle);
+ }
+ }
+ }
}
diff --git a/src/com/android/settings/development/BluetoothLeAudioDeviceDetailsPreferenceController.java b/src/com/android/settings/development/BluetoothLeAudioDeviceDetailsPreferenceController.java
index a54c594..9545728 100644
--- a/src/com/android/settings/development/BluetoothLeAudioDeviceDetailsPreferenceController.java
+++ b/src/com/android/settings/development/BluetoothLeAudioDeviceDetailsPreferenceController.java
@@ -40,6 +40,7 @@
private static final String PREFERENCE_KEY = "bluetooth_show_leaudio_device_details";
private static final String CONFIG_LE_AUDIO_ENABLED_BY_DEFAULT = "le_audio_enabled_by_default";
+ private static final boolean LE_AUDIO_DEVICE_DETAIL_DEFAULT_VALUE = false;
static int sLeAudioSupportedStateCache = BluetoothStatusCodes.ERROR_UNKNOWN;
@VisibleForTesting
@@ -75,7 +76,7 @@
DeviceConfig.setProperty(
DeviceConfig.NAMESPACE_SETTINGS_UI,
SettingsUIDeviceConfig.BT_LE_AUDIO_DEVICE_DETAIL_ENABLED,
- isEnabled ? "true" : "false", false);
+ isEnabled ? "true" : "false", LE_AUDIO_DEVICE_DETAIL_DEFAULT_VALUE);
return true;
}
@@ -87,7 +88,8 @@
final boolean leAudioDeviceDetailEnabled = DeviceConfig.getBoolean(
DeviceConfig.NAMESPACE_SETTINGS_UI,
- SettingsUIDeviceConfig.BT_LE_AUDIO_DEVICE_DETAIL_ENABLED, false);
+ SettingsUIDeviceConfig.BT_LE_AUDIO_DEVICE_DETAIL_ENABLED,
+ LE_AUDIO_DEVICE_DETAIL_DEFAULT_VALUE);
final boolean leAudioEnabledByDefault = DeviceConfig.getBoolean(
DeviceConfig.NAMESPACE_BLUETOOTH, CONFIG_LE_AUDIO_ENABLED_BY_DEFAULT, false);
@@ -102,6 +104,7 @@
// Reset the toggle to null when the developer option is disabled
DeviceConfig.setProperty(
DeviceConfig.NAMESPACE_SETTINGS_UI,
- SettingsUIDeviceConfig.BT_LE_AUDIO_DEVICE_DETAIL_ENABLED, "null", false);
+ SettingsUIDeviceConfig.BT_LE_AUDIO_DEVICE_DETAIL_ENABLED, "null",
+ LE_AUDIO_DEVICE_DETAIL_DEFAULT_VALUE);
}
}
diff --git a/src/com/android/settings/deviceinfo/TopLevelStoragePreferenceController.java b/src/com/android/settings/deviceinfo/TopLevelStoragePreferenceController.java
index e682783..ccae7e9 100644
--- a/src/com/android/settings/deviceinfo/TopLevelStoragePreferenceController.java
+++ b/src/com/android/settings/deviceinfo/TopLevelStoragePreferenceController.java
@@ -74,10 +74,12 @@
return ThreadUtils.postOnBackgroundThread(() -> {
final PrivateStorageInfo info = PrivateStorageInfo.getPrivateStorageInfo(
getStorageManagerVolumeProvider());
- storageCacheHelper.cacheUsedSize(info.totalBytes - info.freeBytes);
+
+ long usedBytes = info.totalBytes - info.freeBytes;
+ storageCacheHelper.cacheUsedSize(usedBytes);
ThreadUtils.postOnMainThread(() -> {
preference.setSummary(
- getSummary(info.totalBytes - info.freeBytes, info.totalBytes));
+ getSummary(usedBytes, info.totalBytes));
});
});
}
diff --git a/src/com/android/settings/deviceinfo/regulatory/RegulatoryInfo.kt b/src/com/android/settings/deviceinfo/regulatory/RegulatoryInfo.kt
new file mode 100644
index 0000000..e26e061
--- /dev/null
+++ b/src/com/android/settings/deviceinfo/regulatory/RegulatoryInfo.kt
@@ -0,0 +1,75 @@
+/*
+ * Copyright (C) 2023 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.deviceinfo.regulatory
+
+import android.content.Context
+import android.content.res.Resources
+import android.graphics.drawable.Drawable
+import android.os.SystemProperties
+import androidx.annotation.DrawableRes
+import androidx.annotation.VisibleForTesting
+import com.android.settings.R
+
+
+
+/** To load Regulatory Info from device. */
+object RegulatoryInfo {
+ private const val REGULATORY_INFO_RESOURCE = "regulatory_info"
+
+ @VisibleForTesting
+ const val KEY_COO = "ro.boot.hardware.coo"
+
+ @VisibleForTesting
+ const val KEY_SKU = "ro.boot.hardware.sku"
+
+ /** Gets the regulatory drawable. */
+ fun Context.getRegulatoryInfo(): Drawable? {
+ val sku = getSku()
+ if (sku.isNotBlank()) {
+ // When hardware coo property exists, use regulatory_info_<sku>_<coo> resource if valid.
+ val coo = getCoo()
+ if (coo.isNotBlank()) {
+ getRegulatoryInfo("${REGULATORY_INFO_RESOURCE}_${sku}_$coo")?.let { return it }
+ }
+ // Use regulatory_info_<sku> resource if valid.
+ getRegulatoryInfo("${REGULATORY_INFO_RESOURCE}_$sku")?.let { return it }
+ }
+ return getRegulatoryInfo(REGULATORY_INFO_RESOURCE)
+ }
+
+ private fun getCoo(): String = SystemProperties.get(KEY_COO).lowercase()
+
+ private fun getSku(): String = SystemProperties.get(KEY_SKU).lowercase()
+
+ private fun Context.getRegulatoryInfo(fileName: String): Drawable? {
+ val overlayPackageName =
+ resources.getString(R.string.config_regulatory_info_overlay_package_name)
+ .ifBlank { packageName }
+ val resources = packageManager.getResourcesForApplication(overlayPackageName)
+ val id = resources.getIdentifier(fileName, "drawable", overlayPackageName)
+ return if (id > 0) resources.getRegulatoryInfo(id) else null
+ }
+
+ private fun Resources.getRegulatoryInfo(@DrawableRes resId: Int): Drawable? = try {
+ getDrawable(resId, null).takeIf {
+ // Ignore the placeholder image
+ it.intrinsicWidth > 10 && it.intrinsicHeight > 10
+ }
+ } catch (_: Resources.NotFoundException) {
+ null
+ }
+}
diff --git a/src/com/android/settings/display/ScreenResolutionFragment.java b/src/com/android/settings/display/ScreenResolutionFragment.java
index de7d25f..daf1793 100644
--- a/src/com/android/settings/display/ScreenResolutionFragment.java
+++ b/src/com/android/settings/display/ScreenResolutionFragment.java
@@ -369,6 +369,12 @@
private void restoreDensity() {
final DisplayDensityUtils density = new DisplayDensityUtils(mContext);
+ /* If current density is the same as a default density of other resolutions,
+ * then mCurrentIndex may be out of boundary.
+ */
+ if (density.getDefaultDisplayDensityValues().length <= mCurrentIndex) {
+ mCurrentIndex = density.getCurrentIndexForDefaultDisplay();
+ }
if (density.getDefaultDisplayDensityValues()[mCurrentIndex]
!= density.getDefaultDensityForDefaultDisplay()) {
density.setForcedDisplayDensity(mCurrentIndex);
diff --git a/src/com/android/settings/network/UiccSlotUtil.java b/src/com/android/settings/network/UiccSlotUtil.java
index 95a0e4d..49a1a85 100644
--- a/src/com/android/settings/network/UiccSlotUtil.java
+++ b/src/com/android/settings/network/UiccSlotUtil.java
@@ -17,7 +17,10 @@
package com.android.settings.network;
import android.annotation.IntDef;
+import android.content.BroadcastReceiver;
import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
import android.provider.Settings;
import android.telephony.SubscriptionInfo;
import android.telephony.SubscriptionManager;
@@ -54,6 +57,28 @@
public static final int INVALID_PHYSICAL_SLOT_ID = -1;
public static final int INVALID_PORT_ID = -1;
+ @VisibleForTesting
+ static class SimSlotChangeReceiver extends BroadcastReceiver{
+ private final CountDownLatch mLatch;
+ SimSlotChangeReceiver(CountDownLatch latch) {
+ mLatch = latch;
+ }
+
+ public void registerOn(Context context) {
+ context.registerReceiver(this,
+ new IntentFilter(TelephonyManager.ACTION_SIM_SLOT_STATUS_CHANGED),
+ Context.RECEIVER_EXPORTED/*UNAUDITED*/);
+ }
+
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ Log.i(TAG, "Action: " + intent.getAction());
+ if (TelephonyManager.ACTION_SIM_SLOT_STATUS_CHANGED.equals(intent.getAction())) {
+ mLatch.countDown();
+ }
+ }
+ }
+
/**
* Mode for switching to eSIM slot which decides whether there is cleanup process, e.g.
* disabling test profile, after eSIM slot is activated and whether we will wait it finished.
@@ -229,19 +254,27 @@
&& uiccSlotMapping.getPortIndex() == port);
}
- private static void performSwitchToSlot(TelephonyManager telMgr,
+ @VisibleForTesting
+ static void performSwitchToSlot(TelephonyManager telMgr,
Collection<UiccSlotMapping> uiccSlotMappings, Context context)
throws UiccSlotsException {
- CarrierConfigChangedReceiver receiver = null;
+ BroadcastReceiver receiver = null;
long waitingTimeMillis =
Settings.Global.getLong(
context.getContentResolver(),
Settings.Global.EUICC_SWITCH_SLOT_TIMEOUT_MILLIS,
DEFAULT_WAIT_AFTER_SWITCH_TIMEOUT_MILLIS);
+ Log.d(TAG, "Set waitingTime as " + waitingTimeMillis);
+
try {
CountDownLatch latch = new CountDownLatch(1);
- receiver = new CarrierConfigChangedReceiver(latch);
- receiver.registerOn(context);
+ if (isMultipleEnabledProfilesSupported(telMgr)) {
+ receiver = new SimSlotChangeReceiver(latch);
+ ((SimSlotChangeReceiver) receiver).registerOn(context);
+ } else {
+ receiver = new CarrierConfigChangedReceiver(latch);
+ ((CarrierConfigChangedReceiver) receiver).registerOn(context);
+ }
telMgr.setSimSlotMapping(uiccSlotMappings);
latch.await(waitingTimeMillis, TimeUnit.MILLISECONDS);
} catch (InterruptedException e) {
@@ -435,4 +468,14 @@
Log.i(TAG, "isRemovableSimEnabled: " + isRemovableSimEnabled);
return isRemovableSimEnabled;
}
+
+ private static boolean isMultipleEnabledProfilesSupported(TelephonyManager telMgr) {
+ List<UiccCardInfo> cardInfos = telMgr.getUiccCardsInfo();
+ if (cardInfos == null) {
+ Log.w(TAG, "UICC cards info list is empty.");
+ return false;
+ }
+ return cardInfos.stream().anyMatch(
+ cardInfo -> cardInfo.isMultipleEnabledProfilesSupported());
+ }
}
diff --git a/src/com/android/settings/network/telephony/DataUsagePreferenceController.java b/src/com/android/settings/network/telephony/DataUsagePreferenceController.java
deleted file mode 100644
index a536c1d..0000000
--- a/src/com/android/settings/network/telephony/DataUsagePreferenceController.java
+++ /dev/null
@@ -1,151 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settings.network.telephony;
-
-import android.content.Context;
-import android.content.Intent;
-import android.net.NetworkTemplate;
-import android.provider.Settings;
-import android.telephony.SubscriptionManager;
-import android.text.TextUtils;
-import android.util.Log;
-
-import androidx.preference.Preference;
-
-import com.android.internal.annotations.VisibleForTesting;
-import com.android.settings.R;
-import com.android.settings.datausage.DataUsageUtils;
-import com.android.settings.datausage.lib.DataUsageLib;
-import com.android.settingslib.net.DataUsageController;
-import com.android.settingslib.utils.ThreadUtils;
-
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.Future;
-import java.util.concurrent.atomic.AtomicReference;
-
-/**
- * Preference controller for "Data usage"
- */
-public class DataUsagePreferenceController extends TelephonyBasePreferenceController {
-
- private static final String LOG_TAG = "DataUsagePreferCtrl";
-
- private Future<NetworkTemplate> mTemplateFuture;
- private AtomicReference<NetworkTemplate> mTemplate;
- private Future<Long> mHistoricalUsageLevel;
-
- public DataUsagePreferenceController(Context context, String key) {
- super(context, key);
- mTemplate = new AtomicReference<NetworkTemplate>();
- }
-
- @Override
- public int getAvailabilityStatus(int subId) {
- return (SubscriptionManager.isValidSubscriptionId(subId))
- && DataUsageUtils.hasMobileData(mContext)
- ? AVAILABLE
- : AVAILABLE_UNSEARCHABLE;
- }
-
- @Override
- public boolean handlePreferenceTreeClick(Preference preference) {
- if (!TextUtils.equals(preference.getKey(), getPreferenceKey())) {
- return false;
- }
- final Intent intent = new Intent(Settings.ACTION_MOBILE_DATA_USAGE);
- intent.putExtra(Settings.EXTRA_NETWORK_TEMPLATE, getNetworkTemplate());
- intent.putExtra(Settings.EXTRA_SUB_ID, mSubId);
-
- mContext.startActivity(intent);
- return true;
- }
-
- @Override
- public void updateState(Preference preference) {
- super.updateState(preference);
- if (!SubscriptionManager.isValidSubscriptionId(mSubId)) {
- preference.setEnabled(false);
- return;
- }
- final CharSequence summary = getDataUsageSummary(mContext, mSubId);
- if (summary == null) {
- preference.setEnabled(false);
- } else {
- preference.setEnabled(true);
- preference.setSummary(summary);
- }
- }
-
- public void init(int subId) {
- mSubId = subId;
- mTemplate.set(null);
- mTemplateFuture = ThreadUtils.postOnBackgroundThread(()
- -> fetchMobileTemplate(mContext, mSubId));
- }
-
- private NetworkTemplate fetchMobileTemplate(Context context, int subId) {
- if (!SubscriptionManager.isValidSubscriptionId(subId)) {
- return null;
- }
- return DataUsageLib.getMobileTemplate(context, subId);
- }
-
- private NetworkTemplate getNetworkTemplate() {
- if (!SubscriptionManager.isValidSubscriptionId(mSubId)) {
- return null;
- }
- NetworkTemplate template = mTemplate.get();
- if (template != null) {
- return template;
- }
- try {
- template = mTemplateFuture.get();
- mTemplate.set(template);
- } catch (ExecutionException | InterruptedException | NullPointerException exception) {
- Log.e(LOG_TAG, "Fail to get data usage template", exception);
- }
- return template;
- }
-
- @VisibleForTesting
- DataUsageController.DataUsageInfo getDataUsageInfo(DataUsageController controller) {
- return controller.getDataUsageInfo(getNetworkTemplate());
- }
-
- private CharSequence getDataUsageSummary(Context context, int subId) {
- final DataUsageController controller = new DataUsageController(context);
- controller.setSubscriptionId(subId);
-
- mHistoricalUsageLevel = ThreadUtils.postOnBackgroundThread(() ->
- controller.getHistoricalUsageLevel(getNetworkTemplate()));
-
- final DataUsageController.DataUsageInfo usageInfo = getDataUsageInfo(controller);
-
- long usageLevel = usageInfo.usageLevel;
- if (usageLevel <= 0L) {
- try {
- usageLevel = mHistoricalUsageLevel.get();
- } catch (Exception exception) {
- }
- }
- if (usageLevel <= 0L) {
- return null;
- }
- return context.getString(R.string.data_usage_template,
- DataUsageUtils.formatDataUsage(context, usageLevel), usageInfo.period);
- }
-}
diff --git a/src/com/android/settings/network/telephony/DataUsagePreferenceController.kt b/src/com/android/settings/network/telephony/DataUsagePreferenceController.kt
new file mode 100644
index 0000000..88da325
--- /dev/null
+++ b/src/com/android/settings/network/telephony/DataUsagePreferenceController.kt
@@ -0,0 +1,127 @@
+/*
+ * Copyright (C) 2023 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.network.telephony
+
+import android.content.Context
+import android.content.Intent
+import android.net.NetworkTemplate
+import android.provider.Settings
+import android.telephony.SubscriptionManager
+import androidx.annotation.VisibleForTesting
+import androidx.lifecycle.Lifecycle
+import androidx.lifecycle.LifecycleOwner
+import androidx.lifecycle.lifecycleScope
+import androidx.lifecycle.repeatOnLifecycle
+import androidx.preference.Preference
+import androidx.preference.PreferenceScreen
+import com.android.settings.R
+import com.android.settings.datausage.DataUsageUtils
+import com.android.settings.datausage.lib.DataUsageLib
+import com.android.settingslib.net.DataUsageController
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.launch
+import kotlinx.coroutines.withContext
+
+/**
+ * Preference controller for "Data usage"
+ */
+class DataUsagePreferenceController(context: Context, key: String) :
+ TelephonyBasePreferenceController(context, key) {
+
+ private lateinit var preference: Preference
+ private var networkTemplate: NetworkTemplate? = null
+
+ @VisibleForTesting
+ var dataUsageControllerFactory: (Context) -> DataUsageController = { DataUsageController(it) }
+
+ fun init(subId: Int) {
+ mSubId = subId
+ }
+
+ override fun getAvailabilityStatus(subId: Int): Int = when {
+ SubscriptionManager.isValidSubscriptionId(subId) &&
+ DataUsageUtils.hasMobileData(mContext) -> AVAILABLE
+
+ else -> AVAILABLE_UNSEARCHABLE
+ }
+
+ override fun displayPreference(screen: PreferenceScreen) {
+ super.displayPreference(screen)
+ preference = screen.findPreference(preferenceKey)!!
+ }
+
+ fun whenViewCreated(viewLifecycleOwner: LifecycleOwner) {
+ viewLifecycleOwner.lifecycleScope.launch {
+ viewLifecycleOwner.repeatOnLifecycle(Lifecycle.State.STARTED) {
+ update()
+ }
+ }
+ }
+
+ override fun handlePreferenceTreeClick(preference: Preference): Boolean {
+ if (preference.key != preferenceKey || networkTemplate == null) return false
+ val intent = Intent(Settings.ACTION_MOBILE_DATA_USAGE).apply {
+ putExtra(Settings.EXTRA_NETWORK_TEMPLATE, networkTemplate)
+ putExtra(Settings.EXTRA_SUB_ID, mSubId)
+ }
+ mContext.startActivity(intent)
+ return true
+ }
+
+ private suspend fun update() {
+ val summary = withContext(Dispatchers.Default) {
+ networkTemplate = getNetworkTemplate()
+ getDataUsageSummary()
+ }
+ if (summary == null) {
+ preference.isEnabled = false
+ } else {
+ preference.isEnabled = true
+ preference.summary = summary
+ }
+ }
+
+ private fun getNetworkTemplate(): NetworkTemplate? = when {
+ SubscriptionManager.isValidSubscriptionId(mSubId) -> {
+ DataUsageLib.getMobileTemplate(mContext, mSubId)
+ }
+
+ else -> null
+ }
+
+ private fun getDataUsageSummary(): String? {
+ val networkTemplate = networkTemplate ?: return null
+ val controller = dataUsageControllerFactory(mContext).apply {
+ setSubscriptionId(mSubId)
+ }
+ val usageInfo = controller.getDataUsageInfo(networkTemplate)
+ if (usageInfo != null && usageInfo.usageLevel > 0) {
+ return mContext.getString(
+ R.string.data_usage_template,
+ DataUsageUtils.formatDataUsage(mContext, usageInfo.usageLevel),
+ usageInfo.period,
+ )
+ }
+
+ return controller.getHistoricalUsageLevel(networkTemplate).takeIf { it > 0 }?.let {
+ mContext.getString(
+ R.string.data_used_template,
+ DataUsageUtils.formatDataUsage(mContext, it),
+ )
+ }
+ }
+}
diff --git a/src/com/android/settings/network/telephony/MmsMessagePreferenceController.java b/src/com/android/settings/network/telephony/MmsMessagePreferenceController.java
index 5908ecd..8f59f0e 100644
--- a/src/com/android/settings/network/telephony/MmsMessagePreferenceController.java
+++ b/src/com/android/settings/network/telephony/MmsMessagePreferenceController.java
@@ -23,6 +23,7 @@
import android.telephony.TelephonyManager;
import android.telephony.data.ApnSetting;
+import androidx.preference.Preference;
import androidx.preference.PreferenceScreen;
import com.android.settings.network.MobileDataContentObserver;
@@ -31,21 +32,20 @@
import com.android.settingslib.core.lifecycle.events.OnStop;
/**
- * Preference controller for "Mobile data"
+ * Preference controller for "MMS messages"
*/
public class MmsMessagePreferenceController extends TelephonyTogglePreferenceController implements
LifecycleObserver, OnStart, OnStop {
private TelephonyManager mTelephonyManager;
- private SubscriptionManager mSubscriptionManager;
private MobileDataContentObserver mMobileDataContentObserver;
private PreferenceScreen mScreen;
+ private Preference mPreference;
public MmsMessagePreferenceController(Context context, String key) {
super(context, key);
- mSubscriptionManager = context.getSystemService(SubscriptionManager.class);
mMobileDataContentObserver = new MobileDataContentObserver(
new Handler(Looper.getMainLooper()));
- mMobileDataContentObserver.setOnMobileDataChangedListener(()->refreshPreference());
+ mMobileDataContentObserver.setOnMobileDataChangedListener(() -> refreshPreference());
}
@Override
@@ -63,6 +63,7 @@
public void onStart() {
if (mSubId != SubscriptionManager.INVALID_SUBSCRIPTION_ID) {
mMobileDataContentObserver.register(mContext, mSubId);
+ updateState(mPreference);
}
}
@@ -77,6 +78,7 @@
public void displayPreference(PreferenceScreen screen) {
super.displayPreference(screen);
mScreen = screen;
+ mPreference = screen.findPreference(getPreferenceKey());
}
@@ -88,12 +90,15 @@
@Override
public boolean setChecked(boolean isChecked) {
+ if (mTelephonyManager == null) {
+ return false;
+ }
mTelephonyManager.setMobileDataPolicyEnabled(
TelephonyManager.MOBILE_DATA_POLICY_MMS_ALWAYS_ALLOWED, isChecked);
- return isChecked == mTelephonyManager.isMobileDataPolicyEnabled(
- TelephonyManager.MOBILE_DATA_POLICY_MMS_ALWAYS_ALLOWED);
+ return true;
}
+
@Override
public boolean isChecked() {
return mTelephonyManager != null && mTelephonyManager.isDataEnabledForApn(
diff --git a/src/com/android/settings/network/telephony/MobileNetworkSettings.java b/src/com/android/settings/network/telephony/MobileNetworkSettings.java
index 1d862f3..5b57ede 100644
--- a/src/com/android/settings/network/telephony/MobileNetworkSettings.java
+++ b/src/com/android/settings/network/telephony/MobileNetworkSettings.java
@@ -31,7 +31,10 @@
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
+import android.view.View;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
import androidx.annotation.VisibleForTesting;
import androidx.preference.Preference;
@@ -328,6 +331,12 @@
}
@Override
+ public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
+ super.onViewCreated(view, savedInstanceState);
+ use(DataUsagePreferenceController.class).whenViewCreated(getViewLifecycleOwner());
+ }
+
+ @Override
public void onResume() {
super.onResume();
mMobileNetworkRepository.addRegister(this, this, mSubId);
diff --git a/src/com/android/settings/network/tether/TetherSettings.java b/src/com/android/settings/network/tether/TetherSettings.java
index 6f6ba8e..5398e9b 100644
--- a/src/com/android/settings/network/tether/TetherSettings.java
+++ b/src/com/android/settings/network/tether/TetherSettings.java
@@ -148,12 +148,13 @@
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
+ // Even when the UI is restricted, addPreferencesFromResource cannot be omitted.
+ addPreferencesFromResource(R.xml.tether_prefs);
setIfOnlyAvailableForAdmins(true);
if (isUiRestricted()) {
return;
}
- addPreferencesFromResource(R.xml.tether_prefs);
mContext = getContext();
mDataSaverBackend = new DataSaverBackend(mContext);
mDataSaverEnabled = mDataSaverBackend.isDataSaverEnabled();
diff --git a/src/com/android/settings/password/ChooseLockPattern.java b/src/com/android/settings/password/ChooseLockPattern.java
index 9ac9ef8..a5d04cc 100644
--- a/src/com/android/settings/password/ChooseLockPattern.java
+++ b/src/com/android/settings/password/ChooseLockPattern.java
@@ -442,7 +442,8 @@
protected boolean mForFace;
protected boolean mForBiometrics;
- private static final String KEY_UI_STAGE = "uiStage";
+ @VisibleForTesting
+ static final String KEY_UI_STAGE = "uiStage";
private static final String KEY_PATTERN_CHOICE = "chosenPattern";
private static final String KEY_CURRENT_PATTERN = "currentPattern";
@@ -718,10 +719,6 @@
final GlifLayout layout = getActivity().findViewById(R.id.setup_wizard_layout);
mUiStage = stage;
- if (stage == Stage.Introduction) {
- layout.setDescriptionText(stage.headerMessage);
- }
-
// header text, footer text, visibility and
// enabled state all known from the stage
if (stage == Stage.ChoiceTooShort) {
@@ -744,16 +741,13 @@
Theme theme = getActivity().getTheme();
theme.resolveAttribute(R.attr.colorError, typedValue, true);
mHeaderText.setTextColor(typedValue.data);
+ } else if (mDefaultHeaderColorList != null) {
+ mHeaderText.setTextColor(mDefaultHeaderColorList);
+ }
- } else {
- if (mDefaultHeaderColorList != null) {
- mHeaderText.setTextColor(mDefaultHeaderColorList);
- }
- if (stage == Stage.NeedToConfirm) {
- mHeaderText.setText(stage.headerMessage);
- layout.setHeaderText(R.string.lockpassword_draw_your_pattern_again_header);
- }
+ if (stage == Stage.ConfirmWrong || stage == Stage.NeedToConfirm) {
+ layout.setHeaderText(R.string.lockpassword_draw_your_pattern_again_header);
}
updateFooterLeftButton(stage);
diff --git a/src/com/android/settings/password/PasswordRequirementAdapter.java b/src/com/android/settings/password/PasswordRequirementAdapter.java
index 0e194af..a21a3f4 100644
--- a/src/com/android/settings/password/PasswordRequirementAdapter.java
+++ b/src/com/android/settings/password/PasswordRequirementAdapter.java
@@ -16,6 +16,7 @@
package com.android.settings.password;
+import android.annotation.NonNull;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
@@ -60,6 +61,11 @@
}
@Override
+ public void onViewAttachedToWindow(@NonNull PasswordRequirementViewHolder holder) {
+ holder.mDescriptionText.announceForAccessibility(holder.mDescriptionText.getText());
+ }
+
+ @Override
public void onBindViewHolder(PasswordRequirementViewHolder holder, int position) {
holder.mDescriptionText.setText(mRequirements[position]);
}
diff --git a/src/com/android/settings/wifi/calling/WifiCallingSettingsForSub.java b/src/com/android/settings/wifi/calling/WifiCallingSettingsForSub.java
index 0c3d769..3890ddf 100644
--- a/src/com/android/settings/wifi/calling/WifiCallingSettingsForSub.java
+++ b/src/com/android/settings/wifi/calling/WifiCallingSettingsForSub.java
@@ -94,7 +94,6 @@
private ListWithEntrySummaryPreference mButtonWfcRoamingMode;
private Preference mUpdateAddress;
- private boolean mValidListener = false;
private boolean mEditableWfcMode = true;
private boolean mEditableWfcRoamingMode = true;
private boolean mUseWfcHomeModeForRoaming = false;
@@ -104,7 +103,7 @@
private ProvisioningManager mProvisioningManager;
private TelephonyManager mTelephonyManager;
- private final PhoneTelephonyCallback mTelephonyCallback = new PhoneTelephonyCallback();
+ private PhoneTelephonyCallback mTelephonyCallback;
private class PhoneTelephonyCallback extends TelephonyCallback implements
TelephonyCallback.CallStateListener {
@@ -418,27 +417,20 @@
@Override
public void onResume() {
super.onResume();
-
updateBody();
-
- final Context context = getActivity();
- if (queryImsState(mSubId).isWifiCallingSupported()) {
+ Context context = getActivity();
+ if (mTelephonyCallback == null && queryImsState(mSubId).isWifiCallingSupported()) {
+ mTelephonyCallback = new PhoneTelephonyCallback();
getTelephonyManagerForSub(mSubId).registerTelephonyCallback(
context.getMainExecutor(), mTelephonyCallback);
-
mSwitchBar.addOnSwitchChangeListener(this);
-
- mValidListener = true;
}
-
context.registerReceiver(mIntentReceiver, mIntentFilter,
Context.RECEIVER_EXPORTED_UNAUDITED);
-
final Intent intent = getActivity().getIntent();
if (intent.getBooleanExtra(Phone.EXTRA_KEY_ALERT_SHOW, false)) {
showAlert(intent);
}
-
// Register callback for provisioning changes.
registerProvisioningChangedCallback();
}
@@ -446,19 +438,13 @@
@Override
public void onPause() {
super.onPause();
-
- final Context context = getActivity();
-
- if (mValidListener) {
- mValidListener = false;
-
+ Context context = getActivity();
+ if (mTelephonyCallback != null) {
getTelephonyManagerForSub(mSubId).unregisterTelephonyCallback(mTelephonyCallback);
-
+ mTelephonyCallback = null;
mSwitchBar.removeOnSwitchChangeListener(this);
}
-
context.unregisterReceiver(mIntentReceiver);
-
// Remove callback for provisioning changes.
unregisterProvisioningChangedCallback();
}
diff --git a/src/com/android/settings/wifi/repository/WifiHotspotRepository.java b/src/com/android/settings/wifi/repository/WifiHotspotRepository.java
index 6764214..af8eb47 100644
--- a/src/com/android/settings/wifi/repository/WifiHotspotRepository.java
+++ b/src/com/android/settings/wifi/repository/WifiHotspotRepository.java
@@ -623,9 +623,11 @@
@VisibleForTesting
class SoftApCallback implements WifiManager.SoftApCallback {
+ private static final String TAG = "SoftApCallback";
+
@Override
public void onStateChanged(int state, int failureReason) {
- log("onStateChanged(), state:" + state + ", failureReason:" + failureReason);
+ Log.d(TAG, "onStateChanged(), state:" + state + ", failureReason:" + failureReason);
mWifiApState = state;
if (!mIsRestarting) {
return;
diff --git a/src/com/android/settings/wifi/tether/WifiHotspotSpeedSettings.java b/src/com/android/settings/wifi/tether/WifiHotspotSpeedSettings.java
index f5066bd..a5e12d8 100644
--- a/src/com/android/settings/wifi/tether/WifiHotspotSpeedSettings.java
+++ b/src/com/android/settings/wifi/tether/WifiHotspotSpeedSettings.java
@@ -108,15 +108,17 @@
if (radioButton == null) {
continue;
}
- if (radioButton.isChecked() != speedInfo.mIsChecked) {
- radioButton.setChecked(speedInfo.mIsChecked);
+ if (!speedInfo.mIsVisible) {
+ radioButton.setVisible(false);
+ continue;
}
- if (radioButton.isEnabled() != speedInfo.mIsEnabled) {
- radioButton.setEnabled(speedInfo.mIsEnabled);
+ radioButton.setEnabled(speedInfo.mIsEnabled);
+ radioButton.setChecked(speedInfo.mIsChecked);
+ if (speedInfo.mSummary != null) {
+ radioButton.setSummary(speedInfo.mSummary);
}
- if (radioButton.isVisible() != speedInfo.mIsVisible) {
- radioButton.setVisible(speedInfo.mIsVisible);
- }
+ // setVisible at the end to avoid UI flickering
+ radioButton.setVisible(true);
}
}
diff --git a/src/com/android/settings/wifi/tether/WifiHotspotSpeedViewModel.java b/src/com/android/settings/wifi/tether/WifiHotspotSpeedViewModel.java
index f04669a..e7eb3a6 100644
--- a/src/com/android/settings/wifi/tether/WifiHotspotSpeedViewModel.java
+++ b/src/com/android/settings/wifi/tether/WifiHotspotSpeedViewModel.java
@@ -22,12 +22,15 @@
import static com.android.settings.wifi.repository.WifiHotspotRepository.SPEED_6GHZ;
import android.app.Application;
+import android.util.Log;
+import androidx.annotation.VisibleForTesting;
import androidx.lifecycle.AndroidViewModel;
import androidx.lifecycle.LiveData;
import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.Observer;
+import com.android.settings.R;
import com.android.settings.overlay.FeatureFactory;
import com.android.settings.wifi.repository.WifiHotspotRepository;
@@ -41,6 +44,12 @@
*/
public class WifiHotspotSpeedViewModel extends AndroidViewModel {
private static final String TAG = "WifiHotspotSpeedViewModel";
+ @VisibleForTesting
+ static final int RES_SPEED_5G_SUMMARY = R.string.wifi_hotspot_speed_5g_summary;
+ @VisibleForTesting
+ static final int RES_SPEED_6G_SUMMARY = R.string.wifi_hotspot_speed_6g_summary;
+ @VisibleForTesting
+ static final int RES_SUMMARY_UNAVAILABLE = R.string.wifi_hotspot_speed_summary_unavailable;
protected final WifiHotspotRepository mWifiHotspotRepository;
protected Map<Integer, SpeedInfo> mSpeedInfoMap = new HashMap<>();
@@ -75,14 +84,18 @@
}
protected void on6gAvailableChanged(Boolean available) {
- log("on6gAvailableChanged(), available:" + available);
+ Log.d(TAG, "on6gAvailableChanged(), available:" + available);
mSpeedInfo6g.mIsEnabled = available;
+ mSpeedInfo6g.mSummary = getApplication()
+ .getString(available ? RES_SPEED_6G_SUMMARY : RES_SUMMARY_UNAVAILABLE);
updateSpeedInfoMapData();
}
protected void on5gAvailableChanged(Boolean available) {
- log("on5gAvailableChanged(), available:" + available);
+ Log.d(TAG, "on5gAvailableChanged(), available:" + available);
mSpeedInfo5g.mIsEnabled = available;
+ mSpeedInfo5g.mSummary = getApplication()
+ .getString(available ? RES_SPEED_5G_SUMMARY : RES_SUMMARY_UNAVAILABLE);
boolean showDualBand = mWifiHotspotRepository.isDualBand() && available;
log("on5gAvailableChanged(), showDualBand:" + showDualBand);
@@ -144,6 +157,7 @@
Boolean mIsChecked;
boolean mIsEnabled;
boolean mIsVisible;
+ String mSummary;
public SpeedInfo(boolean isChecked, boolean isEnabled, boolean isVisible) {
this.mIsChecked = isChecked;
@@ -157,6 +171,7 @@
.append("isChecked:").append(mIsChecked)
.append(",isEnabled:").append(mIsEnabled)
.append(",isVisible:").append(mIsVisible)
+ .append(",mSummary:").append(mSummary)
.append('}').toString();
}
}
diff --git a/src/com/android/settings/wifi/tether/WifiTetherAutoOffPreferenceController.java b/src/com/android/settings/wifi/tether/WifiTetherAutoOffPreferenceController.java
index 5dc5758..0b6d533 100644
--- a/src/com/android/settings/wifi/tether/WifiTetherAutoOffPreferenceController.java
+++ b/src/com/android/settings/wifi/tether/WifiTetherAutoOffPreferenceController.java
@@ -20,19 +20,29 @@
import android.net.wifi.SoftApConfiguration;
import android.net.wifi.WifiManager;
+import androidx.annotation.VisibleForTesting;
import androidx.preference.Preference;
import androidx.preference.SwitchPreference;
import com.android.settings.core.BasePreferenceController;
+import com.android.settings.overlay.FeatureFactory;
+import com.android.settings.wifi.repository.WifiHotspotRepository;
public class WifiTetherAutoOffPreferenceController extends BasePreferenceController implements
Preference.OnPreferenceChangeListener {
private final WifiManager mWifiManager;
private boolean mSettingsOn;
+ @VisibleForTesting
+ boolean mNeedShutdownSecondarySap;
public WifiTetherAutoOffPreferenceController(Context context, String preferenceKey) {
super(context, preferenceKey);
+ WifiHotspotRepository wifiHotspotRepository = FeatureFactory.getFactory(context)
+ .getWifiFeatureProvider().getWifiHotspotRepository();
+ if (wifiHotspotRepository.isSpeedFeatureAvailable() && wifiHotspotRepository.isDualBand()) {
+ mNeedShutdownSecondarySap = true;
+ }
mWifiManager = context.getSystemService(WifiManager.class);
}
@@ -51,14 +61,15 @@
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
- final boolean settingsOn = (Boolean) newValue;
- SoftApConfiguration softApConfiguration = mWifiManager.getSoftApConfiguration();
- SoftApConfiguration newSoftApConfiguration =
- new SoftApConfiguration.Builder(softApConfiguration)
- .setAutoShutdownEnabled(settingsOn)
- .build();
+ boolean settingsOn = (Boolean) newValue;
+ SoftApConfiguration.Builder configBuilder =
+ new SoftApConfiguration.Builder(mWifiManager.getSoftApConfiguration());
+ configBuilder.setAutoShutdownEnabled(settingsOn);
+ if (mNeedShutdownSecondarySap) {
+ configBuilder.setBridgedModeOpportunisticShutdownEnabled(settingsOn);
+ }
mSettingsOn = settingsOn;
- return mWifiManager.setSoftApConfiguration(newSoftApConfiguration);
+ return mWifiManager.setSoftApConfiguration(configBuilder.build());
}
public boolean isEnabled() {
diff --git a/src/com/android/settings/wifi/tether/WifiTetherSettings.java b/src/com/android/settings/wifi/tether/WifiTetherSettings.java
index 88d601a..d8c3908 100644
--- a/src/com/android/settings/wifi/tether/WifiTetherSettings.java
+++ b/src/com/android/settings/wifi/tether/WifiTetherSettings.java
@@ -91,7 +91,8 @@
@VisibleForTesting
WifiTetherAutoOffPreferenceController mWifiTetherAutoOffPreferenceController;
- private boolean mUnavailable;
+ @VisibleForTesting
+ boolean mUnavailable;
private WifiRestriction mWifiRestriction;
@VisibleForTesting
TetherChangeReceiver mTetherChangeReceiver;
@@ -139,6 +140,9 @@
setIfOnlyAvailableForAdmins(true);
mUnavailable = isUiRestricted() || !mWifiRestriction.isHotspotAvailable(getContext());
+ if (mUnavailable) {
+ return;
+ }
mWifiTetherViewModel = FeatureFactory.getFactory(getContext()).getWifiFeatureProvider()
.getWifiTetherViewModel(this);
@@ -342,7 +346,16 @@
@Override
protected boolean isPageSearchEnabled(Context context) {
- if (context == null || !WifiUtils.canShowWifiHotspot(context)) return false;
+ if (context == null) {
+ return false;
+ }
+ UserManager userManager = context.getSystemService(UserManager.class);
+ if (userManager == null || !userManager.isAdminUser()) {
+ return false;
+ }
+ if (!WifiUtils.canShowWifiHotspot(context)) {
+ return false;
+ }
return !FeatureFlagUtils.isEnabled(context, FeatureFlags.TETHER_ALL_IN_ONE);
}
diff --git a/tests/robotests/res/drawable/regulatory_info.png b/tests/robotests/res/drawable/regulatory_info.png
deleted file mode 100644
index 65de26c..0000000
--- a/tests/robotests/res/drawable/regulatory_info.png
+++ /dev/null
Binary files differ
diff --git a/tests/robotests/res/drawable/regulatory_info_sku.png b/tests/robotests/res/drawable/regulatory_info_sku.png
deleted file mode 100644
index 65de26c..0000000
--- a/tests/robotests/res/drawable/regulatory_info_sku.png
+++ /dev/null
Binary files differ
diff --git a/tests/robotests/res/drawable/regulatory_info_sku1_coo.png b/tests/robotests/res/drawable/regulatory_info_sku1_coo.png
deleted file mode 100644
index 65de26c..0000000
--- a/tests/robotests/res/drawable/regulatory_info_sku1_coo.png
+++ /dev/null
Binary files differ
diff --git a/tests/robotests/src/com/android/settings/RegulatoryInfoDisplayActivityTest.java b/tests/robotests/src/com/android/settings/RegulatoryInfoDisplayActivityTest.java
deleted file mode 100644
index d05d5d7..0000000
--- a/tests/robotests/src/com/android/settings/RegulatoryInfoDisplayActivityTest.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Copyright (C) 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License
- */
-
-package com.android.settings;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import android.os.SystemProperties;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.robolectric.Robolectric;
-import org.robolectric.RobolectricTestRunner;
-
-
-@RunWith(RobolectricTestRunner.class)
-public class RegulatoryInfoDisplayActivityTest {
-
- private static final String SKU_PROP_KEY = "ro.boot.hardware.sku";
- private static final String COO_PROP_KEY = "ro.boot.hardware.coo";
-
- private RegulatoryInfoDisplayActivity mRegulatoryInfoDisplayActivity;
-
- @Before
- public void setUp() {
- mRegulatoryInfoDisplayActivity = Robolectric.buildActivity(
- RegulatoryInfoDisplayActivity.class).create().get();
- }
-
- @Test
- public void getResourceId_noSkuProperty_shouldReturnDefaultLabel() {
- SystemProperties.set(SKU_PROP_KEY, "");
-
- final int expectedResId = getResourceId("regulatory_info");
- assertThat(mRegulatoryInfoDisplayActivity.getResourceId()).isEqualTo(expectedResId);
- }
-
- @Test
- public void getResourceId_noCooProperty_shouldReturnSkuLabel() {
- SystemProperties.set(SKU_PROP_KEY, "sku");
- SystemProperties.set(COO_PROP_KEY, "");
-
- final int expectedResId = getResourceId("regulatory_info_sku");
- assertThat(mRegulatoryInfoDisplayActivity.getResourceId()).isEqualTo(expectedResId);
- }
-
- @Test
- public void getResourceId_hasSkuAndCooProperties_shouldReturnCooLabel() {
- SystemProperties.set(SKU_PROP_KEY, "sku1");
- SystemProperties.set(COO_PROP_KEY, "coo");
-
- final int expectedResId = getResourceId("regulatory_info_sku1_coo");
- assertThat(mRegulatoryInfoDisplayActivity.getResourceId()).isEqualTo(expectedResId);
- }
-
- @Test
- public void getResourceId_noCorrespondingCooLabel_shouldReturnSkuLabel() {
- SystemProperties.set(SKU_PROP_KEY, "sku");
- SystemProperties.set(COO_PROP_KEY, "unknown");
-
- final int expectedResId = getResourceId("regulatory_info_sku");
- assertThat(mRegulatoryInfoDisplayActivity.getResourceId()).isEqualTo(expectedResId);
- }
-
- private int getResourceId(String resourceName) {
- return mRegulatoryInfoDisplayActivity.getResources().getIdentifier(resourceName, "drawable",
- mRegulatoryInfoDisplayActivity.getPackageName());
- }
-}
diff --git a/tests/robotests/src/com/android/settings/biometrics/face/FaceSettingsActivityTest.java b/tests/robotests/src/com/android/settings/biometrics/face/FaceSettingsActivityTest.java
deleted file mode 100644
index 2a95f4c..0000000
--- a/tests/robotests/src/com/android/settings/biometrics/face/FaceSettingsActivityTest.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Copyright (C) 2023 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.biometrics.face;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.Mockito.spy;
-
-import android.content.res.Resources;
-import android.os.Bundle;
-
-import com.android.settings.Settings;
-import com.android.settings.testutils.FakeFeatureFactory;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.android.controller.ActivityController;
-
-@RunWith(RobolectricTestRunner.class)
-public class FaceSettingsActivityTest {
-
- private static final String APPLIED_SETUP_WIZARD_THEME = "SettingsPreferenceTheme.SetupWizard";
-
- private Settings.FaceSettingsActivity mActivity;
- private Resources.Theme mTheme;
-
- @Before
- public void setUp() {
- FakeFeatureFactory.setupForTest();
- mActivity = spy(Settings.FaceSettingsActivity.class);
- }
-
- @Test
- public void verifyFaceSettingsActivity_shouldAppliedSetupWizardTheme() {
- createActivity();
-
- assertThat(isThemeApplied(APPLIED_SETUP_WIZARD_THEME)).isTrue();
- }
-
- private boolean isThemeApplied(String themeName) {
- final String [] appliedThemes = mTheme.getTheme();
- for (String theme : appliedThemes) {
- if (theme.contains(themeName)) {
- return true;
- }
- }
- return false;
- }
-
- private void createActivity() {
- ActivityController.of(mActivity).create(new Bundle());
- mTheme = mActivity.getTheme();
- }
-}
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 959c642..0f12d1e 100644
--- a/tests/robotests/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrollingTest.java
+++ b/tests/robotests/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrollingTest.java
@@ -56,6 +56,7 @@
import android.view.Display;
import android.view.Surface;
import android.view.View;
+import android.view.accessibility.AccessibilityManager;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.TextView;
@@ -314,11 +315,17 @@
@Test
public void fingerprintUdfpsOverlayEnrollment_descriptionViewGoneWithOverlap() {
initializeActivityWithoutCreate(TYPE_UDFPS_OPTICAL);
- doReturn(true).when(mActivity).hasOverlap(any(), any());
when(mMockDisplay.getRotation()).thenReturn(Surface.ROTATION_0);
createActivity();
- final GlifLayout defaultLayout = spy(mActivity.findViewById(R.id.setup_wizard_layout));
+ final UdfpsEnrollEnrollingView defaultLayout = spy(
+ mActivity.findViewById(R.id.setup_wizard_layout));
+ doReturn(true).when(defaultLayout).hasOverlap(any(), any());
+
+ // Somehow spy doesn't work, and we need to call initView manually.
+ defaultLayout.initView(mFingerprintManager.getSensorPropertiesInternal().get(0),
+ mActivity.mUdfpsEnrollHelper,
+ mActivity.getSystemService(AccessibilityManager.class));
final TextView descriptionTextView = defaultLayout.getDescriptionTextView();
defaultLayout.getViewTreeObserver().dispatchOnDraw();
@@ -328,11 +335,17 @@
@Test
public void fingerprintUdfpsOverlayEnrollment_descriptionViewVisibleWithoutOverlap() {
initializeActivityWithoutCreate(TYPE_UDFPS_OPTICAL);
- doReturn(false).when(mActivity).hasOverlap(any(), any());
when(mMockDisplay.getRotation()).thenReturn(Surface.ROTATION_0);
createActivity();
- final GlifLayout defaultLayout = spy(mActivity.findViewById(R.id.setup_wizard_layout));
+ final UdfpsEnrollEnrollingView defaultLayout = spy(
+ mActivity.findViewById(R.id.setup_wizard_layout));
+ doReturn(false).when(defaultLayout).hasOverlap(any(), any());
+
+ // Somehow spy doesn't work, and we need to call initView manually.
+ defaultLayout.initView(mFingerprintManager.getSensorPropertiesInternal().get(0),
+ mActivity.mUdfpsEnrollHelper,
+ mActivity.getSystemService(AccessibilityManager.class));
final TextView descriptionTextView = defaultLayout.getDescriptionTextView();
defaultLayout.getViewTreeObserver().dispatchOnDraw();
@@ -340,6 +353,19 @@
}
@Test
+ public void fingerprintUdfpsOverlayEnrollment_udfpsAnimationViewVisibility() {
+ initializeActivityWithoutCreate(TYPE_UDFPS_OPTICAL);
+ when(mMockDisplay.getRotation()).thenReturn(Surface.ROTATION_0);
+ createActivity();
+
+ final UdfpsEnrollView enrollView = mActivity.findViewById(R.id.udfps_animation_view);
+ assertThat(enrollView.getVisibility()).isEqualTo(View.GONE);
+
+ mActivity.onUdfpsOverlayShown();
+ assertThat(enrollView.getVisibility()).isEqualTo(View.VISIBLE);
+ }
+
+ @Test
public void forwardEnrollProgressEvents() {
initializeActivityFor(TYPE_UDFPS_OPTICAL);
@@ -380,11 +406,11 @@
}
@Test
- public void forwardEnrollPointerDownEvents() {
+ public void forwardUdfpsEnrollPointerDownEvents() {
initializeActivityFor(TYPE_UDFPS_OPTICAL);
EnrollListener listener = new EnrollListener(mActivity);
- mActivity.onPointerDown(0);
+ mActivity.onUdfpsPointerDown(0);
assertThat(listener.mProgress).isFalse();
assertThat(listener.mHelp).isFalse();
assertThat(listener.mAcquired).isFalse();
@@ -393,11 +419,11 @@
}
@Test
- public void forwardEnrollPointerUpEvents() {
+ public void forwardUdfpsEnrollPointerUpEvents() {
initializeActivityFor(TYPE_UDFPS_OPTICAL);
EnrollListener listener = new EnrollListener(mActivity);
- mActivity.onPointerUp(0);
+ mActivity.onUdfpsPointerUp(0);
assertThat(listener.mProgress).isFalse();
assertThat(listener.mHelp).isFalse();
assertThat(listener.mAcquired).isFalse();
@@ -578,7 +604,6 @@
mContext = spy(RuntimeEnvironment.application);
mActivity = spy(FingerprintEnrollEnrolling.class);
- when(mFingerprintManager.getSensorPropertiesInternal()).thenReturn(props);
when(mContext.getDisplay()).thenReturn(mMockDisplay);
when(mMockDisplay.getRotation()).thenReturn(Surface.ROTATION_0);
diff --git a/tests/robotests/src/com/android/settings/dashboard/DashboardFeatureProviderImplTest.java b/tests/robotests/src/com/android/settings/dashboard/DashboardFeatureProviderImplTest.java
index 4ba6eae..f7a940f 100644
--- a/tests/robotests/src/com/android/settings/dashboard/DashboardFeatureProviderImplTest.java
+++ b/tests/robotests/src/com/android/settings/dashboard/DashboardFeatureProviderImplTest.java
@@ -43,6 +43,7 @@
import static org.mockito.Mockito.verifyNoInteractions;
import static org.mockito.Mockito.when;
+import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ActivityInfo;
@@ -57,6 +58,7 @@
import android.os.UserManager;
import android.util.Pair;
+import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentActivity;
import androidx.preference.Preference;
import androidx.preference.SwitchPreference;
@@ -200,6 +202,27 @@
}
@Test
+ public void bindPreference_providerTileWithPendingIntent_shouldBindIntent() {
+ final Preference preference = new SwitchPreference(RuntimeEnvironment.application);
+ Bundle metaData = new Bundle();
+ metaData.putInt(META_DATA_PREFERENCE_TITLE, R.string.settings_label);
+ metaData.putInt(META_DATA_PREFERENCE_SUMMARY, R.string.about_settings_summary);
+ metaData.putInt(META_DATA_KEY_ORDER, 10);
+ metaData.putString(META_DATA_PREFERENCE_KEYHINT, KEY);
+ final Tile tile = new ProviderTile(mProviderInfo, CategoryKey.CATEGORY_HOMEPAGE, metaData);
+ PendingIntent pendingIntent =
+ PendingIntent.getActivity(RuntimeEnvironment.application, 0, new Intent("test"), 0);
+ tile.pendingIntentMap.put(UserHandle.CURRENT, pendingIntent);
+
+ mImpl.bindPreferenceToTileAndGetObservers(mActivity, mFragment, mForceRoundedIcon,
+ preference, tile, "123", Preference.DEFAULT_ORDER);
+
+ assertThat(preference.getFragment()).isNull();
+ assertThat(preference.getOnPreferenceClickListener()).isNotNull();
+ assertThat(preference.getOrder()).isEqualTo(tile.getOrder());
+ }
+
+ @Test
public void bindPreference_noFragmentMetadata_shouldBindIntent() {
final Preference preference = new Preference(RuntimeEnvironment.application);
mActivityInfo.metaData.putInt(META_DATA_KEY_ORDER, 10);
@@ -631,6 +654,55 @@
}
@Test
+ public void clickPreference_providerTileWithPendingIntent_singleUser_executesPendingIntent() {
+ final Preference preference = new SwitchPreference(RuntimeEnvironment.application);
+ Bundle metaData = new Bundle();
+ metaData.putInt(META_DATA_PREFERENCE_TITLE, R.string.settings_label);
+ metaData.putInt(META_DATA_PREFERENCE_SUMMARY, R.string.about_settings_summary);
+ metaData.putInt(META_DATA_KEY_ORDER, 10);
+ metaData.putString(META_DATA_PREFERENCE_KEYHINT, KEY);
+ final Tile tile = new ProviderTile(mProviderInfo, CategoryKey.CATEGORY_HOMEPAGE, metaData);
+ PendingIntent pendingIntent =
+ PendingIntent.getActivity(RuntimeEnvironment.application, 0, new Intent("test"), 0);
+ tile.pendingIntentMap.put(UserHandle.CURRENT, pendingIntent);
+
+ mImpl.bindPreferenceToTileAndGetObservers(mActivity, mFragment, mForceRoundedIcon,
+ preference, tile, "123", Preference.DEFAULT_ORDER);
+ preference.performClick();
+
+ Intent nextStartedActivity =
+ Shadows.shadowOf(RuntimeEnvironment.application).peekNextStartedActivity();
+ assertThat(nextStartedActivity).isNotNull();
+ assertThat(nextStartedActivity.getAction()).isEqualTo("test");
+ }
+
+ @Test
+ public void clickPreference_providerTileWithPendingIntent_multiUser_showsProfileDialog() {
+ final Preference preference = new SwitchPreference(RuntimeEnvironment.application);
+ Bundle metaData = new Bundle();
+ metaData.putInt(META_DATA_PREFERENCE_TITLE, R.string.settings_label);
+ metaData.putInt(META_DATA_PREFERENCE_SUMMARY, R.string.about_settings_summary);
+ metaData.putInt(META_DATA_KEY_ORDER, 10);
+ metaData.putString(META_DATA_PREFERENCE_KEYHINT, KEY);
+ final Tile tile = new ProviderTile(mProviderInfo, CategoryKey.CATEGORY_HOMEPAGE, metaData);
+ PendingIntent pendingIntent =
+ PendingIntent.getActivity(RuntimeEnvironment.application, 0, new Intent("test"), 0);
+ tile.pendingIntentMap.put(UserHandle.CURRENT, pendingIntent);
+ tile.pendingIntentMap.put(new UserHandle(10), pendingIntent);
+
+ mImpl.bindPreferenceToTileAndGetObservers(mActivity, mFragment, mForceRoundedIcon,
+ preference, tile, "123", Preference.DEFAULT_ORDER);
+ preference.performClick();
+
+ Fragment dialogFragment =
+ mActivity.getSupportFragmentManager().findFragmentByTag("select_profile");
+ assertThat(dialogFragment).isNotNull();
+ Intent nextStartedActivity =
+ Shadows.shadowOf(RuntimeEnvironment.application).peekNextStartedActivity();
+ assertThat(nextStartedActivity).isNull();
+ }
+
+ @Test
public void openTileIntent_profileSelectionDialog_shouldShow() {
ShadowUserManager.getShadow().addUser(10, "Someone", 0);
diff --git a/tests/robotests/src/com/android/settings/dashboard/DashboardFragmentTest.java b/tests/robotests/src/com/android/settings/dashboard/DashboardFragmentTest.java
index 0739294..ecaf36f 100644
--- a/tests/robotests/src/com/android/settings/dashboard/DashboardFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/dashboard/DashboardFragmentTest.java
@@ -16,7 +16,9 @@
package com.android.settings.dashboard;
import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.DASHBOARD_CONTAINER;
+import static com.android.settingslib.drawer.TileUtils.META_DATA_PREFERENCE_GROUP_KEY;
import static com.android.settingslib.drawer.TileUtils.META_DATA_PREFERENCE_KEYHINT;
+import static com.android.settingslib.drawer.TileUtils.META_DATA_PREFERENCE_PENDING_INTENT;
import static com.android.settingslib.drawer.TileUtils.META_DATA_PREFERENCE_SWITCH_URI;
import static com.google.common.truth.Truth.assertThat;
@@ -30,6 +32,7 @@
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
+import android.app.PendingIntent;
import android.app.settings.SettingsEnums;
import android.content.ContentResolver;
import android.content.Context;
@@ -38,15 +41,18 @@
import android.content.pm.ProviderInfo;
import android.net.Uri;
import android.os.Bundle;
+import android.os.UserHandle;
import android.preference.PreferenceManager.OnActivityResultListener;
import androidx.preference.Preference;
+import androidx.preference.PreferenceCategory;
import androidx.preference.PreferenceFragmentCompat;
import androidx.preference.PreferenceManager;
import androidx.preference.PreferenceScreen;
import androidx.preference.SwitchPreference;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
+import com.android.settings.R;
import com.android.settings.core.PreferenceControllerMixin;
import com.android.settings.slices.BlockingSlicePrefController;
import com.android.settings.testutils.FakeFeatureFactory;
@@ -57,6 +63,7 @@
import com.android.settingslib.drawer.ActivityTile;
import com.android.settingslib.drawer.DashboardCategory;
import com.android.settingslib.drawer.ProviderTile;
+import com.android.settingslib.drawer.Tile;
import org.junit.Before;
import org.junit.Ignore;
@@ -178,6 +185,43 @@
}
@Test
+ public void displayTilesAsPreference_withGroup_shouldAddTilesIntoGroup() {
+ final ProviderInfo providerInfo = new ProviderInfo();
+ providerInfo.packageName = "pkg";
+ providerInfo.name = "provider";
+ providerInfo.authority = "authority";
+ final Bundle groupTileMetaData = new Bundle();
+ groupTileMetaData.putString(META_DATA_PREFERENCE_KEYHINT, "injected_tile_group_key");
+ ProviderTile groupTile = new ProviderTile(providerInfo, mDashboardCategory.key,
+ groupTileMetaData);
+ mDashboardCategory.addTile(groupTile);
+
+ final Bundle subTileMetaData = new Bundle();
+ subTileMetaData.putString(META_DATA_PREFERENCE_KEYHINT, "injected_tile_key3");
+ subTileMetaData.putString(META_DATA_PREFERENCE_GROUP_KEY, "injected_tile_group_key");
+ subTileMetaData.putParcelable(
+ META_DATA_PREFERENCE_PENDING_INTENT,
+ PendingIntent.getActivity(mContext, 0, new Intent(), 0));
+ ProviderTile subTile = new ProviderTile(providerInfo, mDashboardCategory.key,
+ subTileMetaData);
+ mDashboardCategory.addTile(subTile);
+
+ PreferenceCategory groupPreference = mock(PreferenceCategory.class);
+ when(mFakeFeatureFactory.dashboardFeatureProvider
+ .getTilesForCategory(nullable(String.class)))
+ .thenReturn(mDashboardCategory);
+ when(mFakeFeatureFactory.dashboardFeatureProvider
+ .getDashboardKeyForTile(any(Tile.class)))
+ .then(invocation -> ((Tile) invocation.getArgument(0)).getKey(mContext));
+ when(mTestFragment.mScreen.findPreference("injected_tile_group_key"))
+ .thenReturn(groupPreference);
+ mTestFragment.onCreatePreferences(new Bundle(), "rootKey");
+
+ verify(mTestFragment.mScreen, times(3)).addPreference(nullable(Preference.class));
+ verify(groupPreference).addPreference(nullable(Preference.class));
+ }
+
+ @Test
public void displayTilesAsPreference_shouldNotAddTilesWithoutIntent() {
mTestFragment.onCreatePreferences(new Bundle(), "rootKey");
@@ -352,6 +396,16 @@
}
@Test
+ public void createPreference_isActivityTile_returnPreference() {
+ final Preference pref = mTestFragment.createPreference(mActivityTile);
+
+ assertThat(pref).isInstanceOf(Preference.class);
+ assertThat(pref).isNotInstanceOf(PrimarySwitchPreference.class);
+ assertThat(pref).isNotInstanceOf(SwitchPreference.class);
+ assertThat(pref.getWidgetLayoutResource()).isEqualTo(0);
+ }
+
+ @Test
public void createPreference_isActivityTileAndHasSwitch_returnPrimarySwitchPreference() {
mActivityTile.getMetaData().putString(META_DATA_PREFERENCE_SWITCH_URI, "uri");
@@ -361,6 +415,64 @@
}
@Test
+ public void createPreference_isProviderTileWithPendingIntent_returnPreferenceWithIcon() {
+ final ProviderInfo providerInfo = new ProviderInfo();
+ providerInfo.packageName = "pkg";
+ providerInfo.name = "provider";
+ providerInfo.authority = "authority";
+ final Bundle metaData = new Bundle();
+ metaData.putString(META_DATA_PREFERENCE_KEYHINT, "injected_tile_key2");
+ ProviderTile providerTile = new ProviderTile(providerInfo, mDashboardCategory.key,
+ metaData);
+ providerTile.pendingIntentMap.put(
+ UserHandle.CURRENT, PendingIntent.getActivity(mContext, 0, new Intent(), 0));
+
+ final Preference pref = mTestFragment.createPreference(providerTile);
+
+ assertThat(pref).isInstanceOf(Preference.class);
+ assertThat(pref).isNotInstanceOf(PrimarySwitchPreference.class);
+ assertThat(pref).isNotInstanceOf(SwitchPreference.class);
+ assertThat(pref.getWidgetLayoutResource())
+ .isEqualTo(R.layout.preference_external_action_icon);
+ }
+
+ @Test
+ public void createPreference_isProviderTileWithPendingIntentAndSwitch_returnPrimarySwitch() {
+ mProviderTile.pendingIntentMap.put(
+ UserHandle.CURRENT, PendingIntent.getActivity(mContext, 0, new Intent(), 0));
+
+ final Preference pref = mTestFragment.createPreference(mProviderTile);
+
+ assertThat(pref).isInstanceOf(PrimarySwitchPreference.class);
+ }
+
+ @Test
+ public void createPreference_isGroupTile_returnPreferenceCategory_logTileAdded() {
+ final ProviderInfo providerInfo = new ProviderInfo();
+ providerInfo.packageName = "pkg";
+ providerInfo.name = "provider";
+ providerInfo.authority = "authority";
+ final Bundle metaData = new Bundle();
+ metaData.putString(META_DATA_PREFERENCE_KEYHINT, "injected_tile_key2");
+ ProviderTile providerTile =
+ new ProviderTile(providerInfo, mDashboardCategory.key, metaData);
+ MetricsFeatureProvider metricsFeatureProvider =
+ mFakeFeatureFactory.getMetricsFeatureProvider();
+ when(metricsFeatureProvider.getAttribution(any())).thenReturn(123);
+
+ final Preference pref = mTestFragment.createPreference(providerTile);
+
+ assertThat(pref).isInstanceOf(PreferenceCategory.class);
+ verify(metricsFeatureProvider)
+ .action(
+ 123,
+ SettingsEnums.ACTION_SETTINGS_GROUP_TILE_ADDED_TO_SCREEN,
+ mTestFragment.getMetricsCategory(),
+ "injected_tile_key2",
+ 0);
+ }
+
+ @Test
public void onActivityResult_test() {
final int requestCode = 10;
final int resultCode = 1;
diff --git a/tests/robotests/src/com/android/settings/dashboard/profileselector/ProfileSelectDialogTest.java b/tests/robotests/src/com/android/settings/dashboard/profileselector/ProfileSelectDialogTest.java
index 4e81cee..9a13961 100644
--- a/tests/robotests/src/com/android/settings/dashboard/profileselector/ProfileSelectDialogTest.java
+++ b/tests/robotests/src/com/android/settings/dashboard/profileselector/ProfileSelectDialogTest.java
@@ -24,7 +24,9 @@
import static org.mockito.Mockito.when;
import android.app.Dialog;
+import android.app.PendingIntent;
import android.content.Context;
+import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.content.pm.UserInfo;
import android.os.UserHandle;
@@ -119,6 +121,28 @@
}
@Test
+ public void updatePendingIntentsIfNeeded_removesUsersWithNoPendingIntentsAndCloneProfile() {
+ final UserInfo userInfo = new UserInfo(CLONE_USER.getIdentifier(), "clone_user", null,
+ UserInfo.FLAG_PROFILE, UserManager.USER_TYPE_PROFILE_CLONE);
+ when(mUserManager.getUserInfo(CLONE_USER.getIdentifier())).thenReturn(userInfo);
+ final Tile tile = new ActivityTile(mActivityInfo, CategoryKey.CATEGORY_HOMEPAGE);
+ tile.userHandle.add(CLONE_USER);
+ tile.userHandle.add(NORMAL_USER);
+ tile.userHandle.add(new UserHandle(10));
+ PendingIntent pendingIntent = PendingIntent.getActivity(mContext, 0, new Intent(), 0);
+ tile.pendingIntentMap.put(CLONE_USER, pendingIntent);
+ tile.pendingIntentMap.put(NORMAL_USER, pendingIntent);
+
+ ProfileSelectDialog.updatePendingIntentsIfNeeded(mContext, tile);
+
+ assertThat(tile.userHandle).hasSize(1);
+ assertThat(tile.userHandle).containsExactly(NORMAL_USER);
+ assertThat(tile.pendingIntentMap).hasSize(1);
+ assertThat(tile.pendingIntentMap).containsKey(NORMAL_USER);
+ verify(mUserManager, times(1)).getUserInfo(CLONE_USER.getIdentifier());
+ }
+
+ @Test
public void createDialog_showsCorrectTitle() {
mContext.setTheme(R.style.Theme_AppCompat);
diff --git a/tests/robotests/src/com/android/settings/network/telephony/DataUsagePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/network/telephony/DataUsagePreferenceControllerTest.java
deleted file mode 100644
index a3be60d..0000000
--- a/tests/robotests/src/com/android/settings/network/telephony/DataUsagePreferenceControllerTest.java
+++ /dev/null
@@ -1,139 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settings.network.telephony;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.Mockito.doNothing;
-import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.spy;
-
-import android.app.usage.NetworkStatsManager;
-import android.content.Context;
-import android.content.Intent;
-import android.provider.Settings;
-import android.telephony.SubscriptionManager;
-import android.telephony.TelephonyManager;
-import android.util.DataUnit;
-
-import androidx.preference.SwitchPreference;
-
-import com.android.settings.core.BasePreferenceController;
-import com.android.settingslib.net.DataUsageController;
-
-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 org.robolectric.Shadows;
-import org.robolectric.shadows.ShadowTelephonyManager;
-
-@RunWith(RobolectricTestRunner.class)
-public class DataUsagePreferenceControllerTest {
- private static final int SUB_ID = 2;
-
- @Mock
- private NetworkStatsManager mNetworkStatsManager;
- private DataUsagePreferenceController mController;
- private SwitchPreference mPreference;
- private Context mContext;
-
- @Before
- public void setUp() {
- MockitoAnnotations.initMocks(this);
-
- mContext = spy(RuntimeEnvironment.application);
-
- final TelephonyManager telephonyManager = mContext.getSystemService(TelephonyManager.class);
- final ShadowTelephonyManager shadowTelephonyManager = Shadows.shadowOf(telephonyManager);
- shadowTelephonyManager.setTelephonyManagerForSubscriptionId(SUB_ID, telephonyManager);
- shadowTelephonyManager.setTelephonyManagerForSubscriptionId(
- SubscriptionManager.INVALID_SUBSCRIPTION_ID, telephonyManager);
-
- doReturn(mNetworkStatsManager).when(mContext).getSystemService(NetworkStatsManager.class);
-
- mPreference = new SwitchPreference(mContext);
- mController = spy(new DataUsagePreferenceController(mContext, "data_usage"));
- mController.init(SUB_ID);
- mPreference.setKey(mController.getPreferenceKey());
- }
-
- @Test
- public void getAvailabilityStatus_validSubId_returnAvailable() {
- assertThat(mController.getAvailabilityStatus()).isEqualTo(
- BasePreferenceController.AVAILABLE);
- }
-
- @Test
- public void getAvailabilityStatus_invalidSubId_returnUnsearchable() {
- mController.init(SubscriptionManager.INVALID_SUBSCRIPTION_ID);
-
- assertThat(mController.getAvailabilityStatus()).isEqualTo(
- BasePreferenceController.AVAILABLE_UNSEARCHABLE);
- }
-
- @Test
- public void handlePreferenceTreeClick_needDialog_showDialog() {
- final ArgumentCaptor<Intent> captor = ArgumentCaptor.forClass(Intent.class);
- doNothing().when(mContext).startActivity(captor.capture());
-
- mController.handlePreferenceTreeClick(mPreference);
-
- final Intent intent = captor.getValue();
-
- assertThat(intent.getAction()).isEqualTo(Settings.ACTION_MOBILE_DATA_USAGE);
- assertThat(intent.getIntExtra(Settings.EXTRA_SUB_ID, 0)).isEqualTo(SUB_ID);
- }
-
- @Test
- public void updateState_invalidSubId_disabled() {
- mController.init(SubscriptionManager.INVALID_SUBSCRIPTION_ID);
-
- mController.updateState(mPreference);
-
- assertThat(mPreference.isEnabled()).isFalse();
- }
-
- @Test
- public void updateState_noUsageData_shouldDisablePreference() {
- final DataUsageController.DataUsageInfo usageInfo =
- new DataUsageController.DataUsageInfo();
- doReturn(usageInfo).when(mController).getDataUsageInfo(any());
-
- mController.updateState(mPreference);
-
- assertThat(mPreference.isEnabled()).isFalse();
- }
-
- @Test
- public void updateState_shouldUseIECUnit() {
- final DataUsageController.DataUsageInfo usageInfo =
- new DataUsageController.DataUsageInfo();
- usageInfo.usageLevel = DataUnit.MEBIBYTES.toBytes(1);
- doReturn(usageInfo).when(mController).getDataUsageInfo(any());
-
- mController.updateState(mPreference);
-
- assertThat(mPreference.getSummary().toString())
- .contains("1.00 MB");
- }
-}
diff --git a/tests/robotests/src/com/android/settings/network/tether/TetherSettingsTest.java b/tests/robotests/src/com/android/settings/network/tether/TetherSettingsTest.java
index bf03e82..7fe1187 100644
--- a/tests/robotests/src/com/android/settings/network/tether/TetherSettingsTest.java
+++ b/tests/robotests/src/com/android/settings/network/tether/TetherSettingsTest.java
@@ -131,10 +131,12 @@
@Test
@Config(shadows = ShadowRestrictedSettingsFragment.class)
public void onCreate_isUiRestricted_doNotSetupViewModel() {
+ doNothing().when(mTetherSettings).addPreferencesFromResource(anyInt());
when(mTetherSettings.isUiRestricted()).thenReturn(true);
mTetherSettings.onCreate(null);
+ verify(mTetherSettings).addPreferencesFromResource(anyInt());
verify(mTetherSettings, never()).setupViewModel();
}
diff --git a/tests/robotests/src/com/android/settings/password/ChooseLockPatternTest.java b/tests/robotests/src/com/android/settings/password/ChooseLockPatternTest.java
index 442d021..301a6db 100644
--- a/tests/robotests/src/com/android/settings/password/ChooseLockPatternTest.java
+++ b/tests/robotests/src/com/android/settings/password/ChooseLockPatternTest.java
@@ -18,12 +18,15 @@
import static android.view.WindowManager.LayoutParams.FLAG_SECURE;
+import static com.android.settings.password.ChooseLockPattern.ChooseLockPatternFragment.KEY_UI_STAGE;
+
import static com.google.common.truth.Truth.assertThat;
import static com.google.common.truth.Truth.assertWithMessage;
import static org.robolectric.RuntimeEnvironment.application;
import android.content.Intent;
+import android.os.Bundle;
import android.os.UserHandle;
import android.view.View;
@@ -34,6 +37,8 @@
import com.android.settings.password.ChooseLockPattern.IntentBuilder;
import com.android.settings.testutils.shadow.ShadowUtils;
+import com.google.android.setupdesign.GlifLayout;
+
import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -119,6 +124,21 @@
assertThat(flags & FLAG_SECURE).isEqualTo(FLAG_SECURE);
}
+ @Test
+ public void headerText_stageConfirmWrong() {
+ ChooseLockPattern activity = createActivity(true);
+ ChooseLockPatternFragment fragment = (ChooseLockPatternFragment)
+ activity.getSupportFragmentManager().findFragmentById(R.id.main_content);
+ final GlifLayout layout = fragment.getView().findViewById(R.id.setup_wizard_layout);
+ Bundle savedInstanceState = new Bundle();
+ savedInstanceState.putInt(KEY_UI_STAGE,
+ ChooseLockPatternFragment.Stage.ConfirmWrong.ordinal());
+
+ fragment.onViewCreated(layout, savedInstanceState);
+ assertThat(layout.getHeaderText().toString()).isEqualTo(activity.getResources().getString(
+ R.string.lockpassword_draw_your_pattern_again_header));
+ }
+
private ChooseLockPattern createActivity(boolean addFingerprintExtra) {
return Robolectric.buildActivity(
ChooseLockPattern.class,
diff --git a/tests/robotests/src/com/android/settings/wifi/tether/WifiHotspotSpeedSettingsTest.java b/tests/robotests/src/com/android/settings/wifi/tether/WifiHotspotSpeedSettingsTest.java
index 969f992..31f4c09 100644
--- a/tests/robotests/src/com/android/settings/wifi/tether/WifiHotspotSpeedSettingsTest.java
+++ b/tests/robotests/src/com/android/settings/wifi/tether/WifiHotspotSpeedSettingsTest.java
@@ -25,8 +25,10 @@
import static com.android.settings.wifi.tether.WifiHotspotSpeedSettings.KEY_SPEED_5GHZ;
import static com.android.settings.wifi.tether.WifiHotspotSpeedSettings.KEY_SPEED_6GHZ;
+import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.Mockito.anyBoolean;
import static org.mockito.Mockito.doNothing;
+import static org.mockito.Mockito.never;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@@ -89,98 +91,156 @@
@Test
public void onSpeedInfoMapDataChanged_checkedSpeed2g_checkedToRadioButton2g() {
- mSpeedInfo2g = new WifiHotspotSpeedViewModel.SpeedInfo(false, true, false);
+ mSpeedInfo2g = new WifiHotspotSpeedViewModel.SpeedInfo(true, true, true);
updateSpeedInfoMap();
- mockRadioButton(true, false, true);
+ mockRadioButton(false, false, false);
mSettings.mSpeedPreferenceMap.put(SPEED_2GHZ, mRadioButton);
mSettings.onSpeedInfoMapDataChanged(mSpeedInfoMap);
- verifyRadioButton(false, true, false);
+ verifyRadioButton(true, true, true);
}
@Test
public void onSpeedInfoMapDataChanged_uncheckedSpeed2g_uncheckedToRadioButton2g() {
- mSpeedInfo2g = new WifiHotspotSpeedViewModel.SpeedInfo(true, false, true);
+ mSpeedInfo2g = new WifiHotspotSpeedViewModel.SpeedInfo(false, false, true);
updateSpeedInfoMap();
- mockRadioButton(false, true, false);
+ mockRadioButton(true, true, true);
mSettings.mSpeedPreferenceMap.put(SPEED_2GHZ, mRadioButton);
mSettings.onSpeedInfoMapDataChanged(mSpeedInfoMap);
- verifyRadioButton(true, false, true);
+ verifyRadioButton(false, false, true);
}
@Test
public void onSpeedInfoMapDataChanged_checkedSpeed5g_checkedToRadioButton5g() {
- mSpeedInfo5g = new WifiHotspotSpeedViewModel.SpeedInfo(false, true, false);
+ mSpeedInfo5g = new WifiHotspotSpeedViewModel.SpeedInfo(true, true, true);
updateSpeedInfoMap();
- mockRadioButton(true, false, true);
+ mockRadioButton(false, false, false);
mSettings.mSpeedPreferenceMap.put(SPEED_5GHZ, mRadioButton);
mSettings.onSpeedInfoMapDataChanged(mSpeedInfoMap);
- verifyRadioButton(false, true, false);
+ verifyRadioButton(true, true, true);
}
@Test
public void onSpeedInfoMapDataChanged_uncheckedSpeed5g_uncheckedToRadioButton5g() {
- mSpeedInfo5g = new WifiHotspotSpeedViewModel.SpeedInfo(true, false, true);
+ mSpeedInfo5g = new WifiHotspotSpeedViewModel.SpeedInfo(false, false, true);
updateSpeedInfoMap();
- mockRadioButton(false, true, false);
+ mockRadioButton(true, true, true);
mSettings.mSpeedPreferenceMap.put(SPEED_5GHZ, mRadioButton);
mSettings.onSpeedInfoMapDataChanged(mSpeedInfoMap);
- verifyRadioButton(true, false, true);
+ verifyRadioButton(false, false, true);
}
@Test
public void onSpeedInfoMapDataChanged_checkedSpeed2g5g_checkedToRadioButton2g5g() {
- mSpeedInfo2g5g = new WifiHotspotSpeedViewModel.SpeedInfo(false, true, false);
+ mSpeedInfo2g5g = new WifiHotspotSpeedViewModel.SpeedInfo(true, true, true);
updateSpeedInfoMap();
- mockRadioButton(true, false, true);
+ mockRadioButton(false, false, false);
mSettings.mSpeedPreferenceMap.put(SPEED_2GHZ_5GHZ, mRadioButton);
mSettings.onSpeedInfoMapDataChanged(mSpeedInfoMap);
- verifyRadioButton(false, true, false);
+ verifyRadioButton(true, true, true);
}
@Test
- public void onSpeedInfoMapDataChanged_uncheckedSpeed25g_uncheckedToRadioButton25g() {
- mSpeedInfo2g5g = new WifiHotspotSpeedViewModel.SpeedInfo(true, false, true);
+ public void onSpeedInfoMapDataChanged_uncheckedSpeed2g5g_uncheckedToRadioButton2g5g() {
+ mSpeedInfo2g5g = new WifiHotspotSpeedViewModel.SpeedInfo(false, false, true);
updateSpeedInfoMap();
- mockRadioButton(false, true, false);
+ mockRadioButton(true, true, true);
mSettings.mSpeedPreferenceMap.put(SPEED_2GHZ_5GHZ, mRadioButton);
mSettings.onSpeedInfoMapDataChanged(mSpeedInfoMap);
- verifyRadioButton(true, false, true);
+ verifyRadioButton(false, false, true);
}
@Test
public void onSpeedInfoMapDataChanged_checkedSpeed6g_checkedToRadioButton6g() {
- mSpeedInfo6g = new WifiHotspotSpeedViewModel.SpeedInfo(false, true, false);
+ mSpeedInfo6g = new WifiHotspotSpeedViewModel.SpeedInfo(true, true, true);
updateSpeedInfoMap();
+ mockRadioButton(false, false, false);
+ mSettings.mSpeedPreferenceMap.put(SPEED_6GHZ, mRadioButton);
+
+ mSettings.onSpeedInfoMapDataChanged(mSpeedInfoMap);
+
+ verifyRadioButton(true, true, true);
+ }
+
+ @Test
+ public void onSpeedInfoMapDataChanged_uncheckedSpeed6g_uncheckedToRadioButton6g() {
+ mSpeedInfo6g = new WifiHotspotSpeedViewModel.SpeedInfo(false, false, true);
+ updateSpeedInfoMap();
+ mockRadioButton(true, true, true);
+ mSettings.mSpeedPreferenceMap.put(SPEED_6GHZ, mRadioButton);
+
+ mSettings.onSpeedInfoMapDataChanged(mSpeedInfoMap);
+
+ verifyRadioButton(false, false, true);
+ }
+
+ @Test
+ public void onSpeedInfoMapDataChanged_setVisibleFalse_setVisibleOnly() {
+ mSpeedInfo6g = new WifiHotspotSpeedViewModel.SpeedInfo(true, true, false);
+ mSpeedInfo6g.mSummary = "summary";
+ mSpeedInfoMap.put(SPEED_6GHZ, mSpeedInfo6g);
+ mockRadioButton(true, true, true);
+ mSettings.mSpeedPreferenceMap.put(SPEED_6GHZ, mRadioButton);
+
+ mSettings.onSpeedInfoMapDataChanged(mSpeedInfoMap);
+
+ verify(mRadioButton).setVisible(false);
+ verify(mRadioButton, never()).setChecked(anyBoolean());
+ verify(mRadioButton, never()).setEnabled(anyBoolean());
+ verify(mRadioButton, never()).setSummary(anyString());
+ }
+
+ @Test
+ public void onSpeedInfoMapDataChanged_setVisibleTrue_setAllProperties() {
+ mSpeedInfo6g = new WifiHotspotSpeedViewModel.SpeedInfo(true, true, true);
+ mSpeedInfo6g.mSummary = "summary";
+ mSpeedInfoMap.put(SPEED_6GHZ, mSpeedInfo6g);
+ mockRadioButton(true, true, true);
+ mSettings.mSpeedPreferenceMap.put(SPEED_6GHZ, mRadioButton);
+
+ mSettings.onSpeedInfoMapDataChanged(mSpeedInfoMap);
+
+ verify(mRadioButton).setVisible(true);
+ verify(mRadioButton).setChecked(anyBoolean());
+ verify(mRadioButton).setEnabled(anyBoolean());
+ verify(mRadioButton).setSummary(anyString());
+ }
+
+ @Test
+ public void onSpeedInfoMapDataChanged_summaryIsNull_doNotSetSummary() {
+ mSpeedInfo6g = new WifiHotspotSpeedViewModel.SpeedInfo(true, true, true);
+ mSpeedInfo6g.mSummary = null;
+ mSpeedInfoMap.put(SPEED_6GHZ, mSpeedInfo6g);
+ mockRadioButton(true, true, true);
+ mSettings.mSpeedPreferenceMap.put(SPEED_6GHZ, mRadioButton);
+
+ mSettings.onSpeedInfoMapDataChanged(mSpeedInfoMap);
+
+ verify(mRadioButton, never()).setSummary(anyString());
+ }
+
+ @Test
+ public void onSpeedInfoMapDataChanged_summaryNotNull_setSummary() {
+ mSpeedInfo6g = new WifiHotspotSpeedViewModel.SpeedInfo(true, false, true);
+ mSpeedInfo6g.mSummary = "summary";
+ mSpeedInfoMap.put(SPEED_6GHZ, mSpeedInfo6g);
mockRadioButton(true, false, true);
mSettings.mSpeedPreferenceMap.put(SPEED_6GHZ, mRadioButton);
mSettings.onSpeedInfoMapDataChanged(mSpeedInfoMap);
- verifyRadioButton(false, true, false);
- }
-
- @Test
- public void onSpeedInfoMapDataChanged_uncheckedSpeed6g_uncheckedToRadioButton6g() {
- mSpeedInfo6g = new WifiHotspotSpeedViewModel.SpeedInfo(true, false, true);
- updateSpeedInfoMap();
- mockRadioButton(false, true, false);
- mSettings.mSpeedPreferenceMap.put(SPEED_6GHZ, mRadioButton);
-
- mSettings.onSpeedInfoMapDataChanged(mSpeedInfoMap);
-
- verifyRadioButton(true, false, true);
+ verify(mRadioButton).setSummary(mSpeedInfo6g.mSummary);
}
@Test
diff --git a/tests/robotests/src/com/android/settings/wifi/tether/WifiTetherAutoOffPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/wifi/tether/WifiTetherAutoOffPreferenceControllerTest.java
index fbc4aaa..535e4ab 100644
--- a/tests/robotests/src/com/android/settings/wifi/tether/WifiTetherAutoOffPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/wifi/tether/WifiTetherAutoOffPreferenceControllerTest.java
@@ -18,6 +18,7 @@
import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@@ -28,6 +29,10 @@
import androidx.preference.SwitchPreference;
+import com.android.settings.testutils.FakeFeatureFactory;
+import com.android.settings.wifi.factory.WifiFeatureProvider;
+import com.android.settings.wifi.repository.WifiHotspotRepository;
+
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -54,6 +59,8 @@
mContext = spy(RuntimeEnvironment.application);
+ WifiFeatureProvider provider = FakeFeatureFactory.setupForTest().getWifiFeatureProvider();
+ when(provider.getWifiHotspotRepository()).thenReturn(mock(WifiHotspotRepository.class));
when(mContext.getSystemService(WifiManager.class)).thenReturn(mWifiManager);
mSoftApConfiguration = new SoftApConfiguration.Builder().build();
when(mWifiManager.getSoftApConfiguration()).thenReturn(mSoftApConfiguration);
@@ -101,6 +108,32 @@
assertThat(mSwitchPreference.isChecked()).isTrue();
}
+ @Test
+ public void onPreferenceChange_needShutdownSecondarySap_setSecondarySap() {
+ mController.mNeedShutdownSecondarySap = true;
+ setConfigShutdownSecondarySap(false);
+
+ mController.onPreferenceChange(mSwitchPreference, true);
+
+ ArgumentCaptor<SoftApConfiguration> config =
+ ArgumentCaptor.forClass(SoftApConfiguration.class);
+ verify(mWifiManager).setSoftApConfiguration(config.capture());
+ assertThat(config.getValue().isBridgedModeOpportunisticShutdownEnabled()).isTrue();
+ }
+
+ @Test
+ public void onPreferenceChange_noNeedShutdownSecondarySap_doNotSetSecondarySap() {
+ mController.mNeedShutdownSecondarySap = false;
+ setConfigShutdownSecondarySap(false);
+
+ mController.onPreferenceChange(mSwitchPreference, true);
+
+ ArgumentCaptor<SoftApConfiguration> config =
+ ArgumentCaptor.forClass(SoftApConfiguration.class);
+ verify(mWifiManager).setSoftApConfiguration(config.capture());
+ assertThat(config.getValue().isBridgedModeOpportunisticShutdownEnabled()).isFalse();
+ }
+
private boolean getAutoOffSetting() {
ArgumentCaptor<SoftApConfiguration> softApConfigCaptor =
ArgumentCaptor.forClass(SoftApConfiguration.class);
@@ -115,4 +148,12 @@
.build();
when(mWifiManager.getSoftApConfiguration()).thenReturn(mSoftApConfiguration);
}
+
+ private void setConfigShutdownSecondarySap(boolean enabled) {
+ mSoftApConfiguration =
+ new SoftApConfiguration.Builder(mSoftApConfiguration)
+ .setBridgedModeOpportunisticShutdownEnabled(enabled)
+ .build();
+ when(mWifiManager.getSoftApConfiguration()).thenReturn(mSoftApConfiguration);
+ }
}
diff --git a/tests/robotests/src/com/android/settings/wifi/tether/WifiTetherSettingsTest.java b/tests/robotests/src/com/android/settings/wifi/tether/WifiTetherSettingsTest.java
index 5005f4c..75d49fe 100644
--- a/tests/robotests/src/com/android/settings/wifi/tether/WifiTetherSettingsTest.java
+++ b/tests/robotests/src/com/android/settings/wifi/tether/WifiTetherSettingsTest.java
@@ -146,6 +146,7 @@
doReturn(mTetheringManager).when(mContext).getSystemService(Context.TETHERING_SERVICE);
doReturn(WIFI_REGEXS).when(mTetheringManager).getTetherableWifiRegexs();
doReturn(mUserManager).when(mContext).getSystemService(Context.USER_SERVICE);
+ doReturn(true).when(mUserManager).isAdminUser();
when(mWifiRestriction.isTetherAvailable(mContext)).thenReturn(true);
when(mWifiRestriction.isHotspotAvailable(mContext)).thenReturn(true);
@@ -185,9 +186,21 @@
}
@Test
+ @Config(shadows = ShadowRestrictedDashboardFragment.class)
+ public void onCreate_uiIsRestricted_shouldNotGetViewModel() {
+ mSettings.mWifiTetherViewModel = null;
+ when(mWifiRestriction.isHotspotAvailable(mContext)).thenReturn(false);
+
+ mSettings.onCreate(null);
+
+ assertThat(mSettings.mWifiTetherViewModel).isNull();
+ }
+
+ @Test
@Config(shadows = ShadowFragment.class)
public void onStart_uiIsRestricted_removeAllPreferences() {
spyWifiTetherSettings();
+ mSettings.mUnavailable = true;
mSettings.onStart();
@@ -306,7 +319,7 @@
}
@Test
- public void isPageSearchEnabled_canShowWifiHotspot_returnTrue() {
+ public void isPageSearchEnabled_allReady_returnTrue() {
setCanShowWifiHotspotCached(true);
assertThat(WifiTetherSettings.SEARCH_INDEX_DATA_PROVIDER.isPageSearchEnabled(mContext))
@@ -314,6 +327,14 @@
}
@Test
+ public void isPageSearchEnabled_isNotAdminUser_returnFalse() {
+ doReturn(false).when(mUserManager).isAdminUser();
+
+ assertThat(WifiTetherSettings.SEARCH_INDEX_DATA_PROVIDER.isPageSearchEnabled(mContext))
+ .isFalse();
+ }
+
+ @Test
public void isPageSearchEnabled_canNotShowWifiHotspot_returnFalse() {
setCanShowWifiHotspotCached(false);
@@ -419,5 +440,10 @@
public void onCreate(Bundle icicle) {
// do nothing
}
+
+ @Implementation
+ public boolean isUiRestricted() {
+ return false;
+ }
}
}
diff --git a/tests/spa_unit/res/drawable/regulatory_info.xml b/tests/spa_unit/res/drawable/regulatory_info.xml
new file mode 100644
index 0000000..7cc3803
--- /dev/null
+++ b/tests/spa_unit/res/drawable/regulatory_info.xml
@@ -0,0 +1,20 @@
+<!--
+ ~ Copyright (C) 2023 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.
+ -->
+
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+ <solid android:color="#ff0000"/>
+ <size android:width="24dp" android:height="24dp" />
+</shape>
diff --git a/tests/spa_unit/res/drawable/regulatory_info_sku.xml b/tests/spa_unit/res/drawable/regulatory_info_sku.xml
new file mode 100644
index 0000000..634e55e
--- /dev/null
+++ b/tests/spa_unit/res/drawable/regulatory_info_sku.xml
@@ -0,0 +1,21 @@
+<!--
+ ~ Copyright (C) 2023 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.
+ -->
+
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+ <solid android:color="#00ff00"/>
+ <size android:width="24dp" android:height="24dp" />
+</shape>
+
diff --git a/tests/spa_unit/res/drawable/regulatory_info_sku1_coo.xml b/tests/spa_unit/res/drawable/regulatory_info_sku1_coo.xml
new file mode 100644
index 0000000..7e6b9ef
--- /dev/null
+++ b/tests/spa_unit/res/drawable/regulatory_info_sku1_coo.xml
@@ -0,0 +1,20 @@
+<!--
+ ~ Copyright (C) 2023 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.
+ -->
+
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+ <solid android:color="#0000ff"/>
+ <size android:width="24dp" android:height="24dp" />
+</shape>
diff --git a/tests/spa_unit/src/com/android/settings/deviceinfo/regulatory/RegulatoryInfoTest.kt b/tests/spa_unit/src/com/android/settings/deviceinfo/regulatory/RegulatoryInfoTest.kt
new file mode 100644
index 0000000..f1e18fc
--- /dev/null
+++ b/tests/spa_unit/src/com/android/settings/deviceinfo/regulatory/RegulatoryInfoTest.kt
@@ -0,0 +1,105 @@
+/*
+ * Copyright (C) 2023 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.deviceinfo.regulatory
+
+import android.content.Context
+import android.graphics.drawable.Drawable
+import android.os.SystemProperties
+import androidx.annotation.DrawableRes
+import androidx.core.graphics.drawable.toBitmap
+import androidx.test.core.app.ApplicationProvider
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import com.android.dx.mockito.inline.extended.ExtendedMockito
+import com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn
+import com.android.settings.deviceinfo.regulatory.RegulatoryInfo.KEY_COO
+import com.android.settings.deviceinfo.regulatory.RegulatoryInfo.KEY_SKU
+import com.android.settings.deviceinfo.regulatory.RegulatoryInfo.getRegulatoryInfo
+import com.android.settings.tests.spa_unit.R
+import com.google.common.truth.Truth.assertThat
+import org.junit.After
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mockito.MockitoSession
+import org.mockito.Spy
+import org.mockito.quality.Strictness
+
+@RunWith(AndroidJUnit4::class)
+class RegulatoryInfoTest {
+ private lateinit var mockSession: MockitoSession
+
+ @Spy
+ private val context: Context = ApplicationProvider.getApplicationContext()
+
+ @Before
+ fun setUp() {
+ mockSession = ExtendedMockito.mockitoSession()
+ .initMocks(this)
+ .mockStatic(SystemProperties::class.java)
+ .strictness(Strictness.LENIENT)
+ .startMocking()
+ }
+
+ @After
+ fun tearDown() {
+ mockSession.finishMocking()
+ }
+
+ @Test
+ fun getRegulatoryInfo_noSkuProperty_shouldReturnDefaultLabel() {
+ doReturn("").`when` { SystemProperties.get(KEY_SKU) }
+
+ val regulatoryInfo = context.getRegulatoryInfo()
+
+ assertDrawableSameAs(regulatoryInfo, R.drawable.regulatory_info)
+ }
+
+ @Test
+ fun getResourceId_noCooProperty_shouldReturnSkuLabel() {
+ doReturn("sku").`when` { SystemProperties.get(KEY_SKU) }
+ doReturn("").`when` { SystemProperties.get(KEY_COO) }
+
+ val regulatoryInfo = context.getRegulatoryInfo()
+
+ assertDrawableSameAs(regulatoryInfo, R.drawable.regulatory_info_sku)
+ }
+
+ @Test
+ fun getResourceId_hasSkuAndCooProperties_shouldReturnCooLabel() {
+ doReturn("sku1").`when` { SystemProperties.get(KEY_SKU) }
+ doReturn("coo").`when` { SystemProperties.get(KEY_COO) }
+
+ val regulatoryInfo = context.getRegulatoryInfo()
+
+ assertDrawableSameAs(regulatoryInfo, R.drawable.regulatory_info_sku1_coo)
+ }
+
+ @Test
+ fun getResourceId_noCorrespondingCooLabel_shouldReturnSkuLabel() {
+ doReturn("sku").`when` { SystemProperties.get(KEY_SKU) }
+ doReturn("unknown").`when` { SystemProperties.get(KEY_COO) }
+
+ val regulatoryInfo = context.getRegulatoryInfo()
+
+ assertDrawableSameAs(regulatoryInfo, R.drawable.regulatory_info_sku)
+ }
+
+ private fun assertDrawableSameAs(drawable: Drawable?, @DrawableRes resId: Int) {
+ val expected = context.getDrawable(resId)!!.toBitmap()
+ assertThat(drawable!!.toBitmap().sameAs(expected)).isTrue()
+ }
+}
diff --git a/tests/spa_unit/src/com/android/settings/network/telephony/DataUsagePreferenceControllerTest.kt b/tests/spa_unit/src/com/android/settings/network/telephony/DataUsagePreferenceControllerTest.kt
new file mode 100644
index 0000000..a42e41e
--- /dev/null
+++ b/tests/spa_unit/src/com/android/settings/network/telephony/DataUsagePreferenceControllerTest.kt
@@ -0,0 +1,174 @@
+/*
+ * Copyright (C) 2023 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.network.telephony
+
+import android.content.Context
+import android.content.Intent
+import android.net.NetworkTemplate
+import android.provider.Settings
+import android.telephony.SubscriptionManager
+import android.util.DataUnit
+import androidx.lifecycle.Lifecycle
+import androidx.lifecycle.testing.TestLifecycleOwner
+import androidx.preference.Preference
+import androidx.preference.PreferenceScreen
+import androidx.test.core.app.ApplicationProvider
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import com.android.dx.mockito.inline.extended.ExtendedMockito
+import com.android.settings.core.BasePreferenceController.AVAILABLE
+import com.android.settings.core.BasePreferenceController.AVAILABLE_UNSEARCHABLE
+import com.android.settings.datausage.DataUsageUtils
+import com.android.settings.datausage.lib.DataUsageLib
+import com.android.settingslib.net.DataUsageController
+import com.android.settingslib.net.DataUsageController.DataUsageInfo
+import com.android.settingslib.spa.testutils.waitUntil
+import com.google.common.truth.Truth.assertThat
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+import kotlinx.coroutines.test.runTest
+import org.junit.After
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mockito.ArgumentCaptor
+import org.mockito.Mock
+import org.mockito.Mockito.any
+import org.mockito.Mockito.doNothing
+import org.mockito.Mockito.verify
+import org.mockito.MockitoSession
+import org.mockito.Spy
+import org.mockito.quality.Strictness
+import org.mockito.Mockito.`when` as whenever
+
+@OptIn(ExperimentalCoroutinesApi::class)
+@RunWith(AndroidJUnit4::class)
+class DataUsagePreferenceControllerTest {
+
+ private lateinit var mockSession: MockitoSession
+
+ @Spy
+ private val context: Context = ApplicationProvider.getApplicationContext()
+
+ private lateinit var controller: DataUsagePreferenceController
+
+ private val preference = Preference(context)
+
+ @Mock
+ private lateinit var networkTemplate: NetworkTemplate
+
+ @Mock
+ private lateinit var dataUsageController: DataUsageController
+
+ @Mock
+ private lateinit var preferenceScreen: PreferenceScreen
+
+ @Before
+ fun setUp() {
+ mockSession = ExtendedMockito.mockitoSession()
+ .initMocks(this)
+ .mockStatic(SubscriptionManager::class.java)
+ .spyStatic(DataUsageUtils::class.java)
+ .spyStatic(DataUsageLib::class.java)
+ .strictness(Strictness.LENIENT)
+ .startMocking()
+
+ whenever(SubscriptionManager.isValidSubscriptionId(SUB_ID)).thenReturn(true)
+ ExtendedMockito.doReturn(true).`when` { DataUsageUtils.hasMobileData(context) }
+ ExtendedMockito.doReturn(networkTemplate)
+ .`when` { DataUsageLib.getMobileTemplate(context, SUB_ID) }
+ preference.key = TEST_KEY
+ whenever(preferenceScreen.findPreference<Preference>(TEST_KEY)).thenReturn(preference)
+
+ controller =
+ DataUsagePreferenceController(context, TEST_KEY).apply {
+ init(SUB_ID)
+ displayPreference(preferenceScreen)
+ dataUsageControllerFactory = { dataUsageController }
+ }
+ }
+
+ @After
+ fun tearDown() {
+ mockSession.finishMocking()
+ }
+
+ @Test
+ fun getAvailabilityStatus_validSubId_returnAvailable() {
+ assertThat(controller.availabilityStatus).isEqualTo(AVAILABLE)
+ }
+
+ @Test
+ fun getAvailabilityStatus_invalidSubId_returnUnsearchable() {
+ controller.init(SubscriptionManager.INVALID_SUBSCRIPTION_ID)
+
+ assertThat(controller.availabilityStatus).isEqualTo(AVAILABLE_UNSEARCHABLE)
+ }
+
+ @Test
+ fun handlePreferenceTreeClick_startActivity() = runTest {
+ val usageInfo = DataUsageInfo().apply {
+ usageLevel = DataUnit.MEBIBYTES.toBytes(1)
+ }
+ whenever(dataUsageController.getDataUsageInfo(networkTemplate)).thenReturn(usageInfo)
+ doNothing().`when`(context).startActivity(any())
+ controller.whenViewCreated(TestLifecycleOwner(initialState = Lifecycle.State.STARTED))
+ waitUntil { preference.summary != null }
+
+ controller.handlePreferenceTreeClick(preference)
+
+ val captor = ArgumentCaptor.forClass(Intent::class.java)
+ verify(context).startActivity(captor.capture())
+ val intent = captor.value
+ assertThat(intent.action).isEqualTo(Settings.ACTION_MOBILE_DATA_USAGE)
+ assertThat(intent.getIntExtra(Settings.EXTRA_SUB_ID, 0)).isEqualTo(SUB_ID)
+ }
+
+ @Test
+ fun updateState_invalidSubId_disabled() = runTest {
+ controller.init(SubscriptionManager.INVALID_SUBSCRIPTION_ID)
+
+ controller.whenViewCreated(TestLifecycleOwner(initialState = Lifecycle.State.STARTED))
+
+ waitUntil { !preference.isEnabled }
+ }
+
+ @Test
+ fun updateState_noUsageData_shouldDisablePreference() = runTest {
+ val usageInfo = DataUsageInfo()
+ whenever(dataUsageController.getDataUsageInfo(networkTemplate)).thenReturn(usageInfo)
+
+ controller.whenViewCreated(TestLifecycleOwner(initialState = Lifecycle.State.STARTED))
+
+ waitUntil { !preference.isEnabled }
+ }
+
+ @Test
+ fun updateState_shouldUseIecUnit() = runTest {
+ val usageInfo = DataUsageInfo().apply {
+ usageLevel = DataUnit.MEBIBYTES.toBytes(1)
+ }
+ whenever(dataUsageController.getDataUsageInfo(networkTemplate)).thenReturn(usageInfo)
+
+ controller.whenViewCreated(TestLifecycleOwner(initialState = Lifecycle.State.STARTED))
+
+ waitUntil { preference.summary?.contains("1.00 MB") == true }
+ }
+
+ private companion object {
+ const val TEST_KEY = "test_key"
+ const val SUB_ID = 2
+ }
+}
diff --git a/tests/unit/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollProgressViewModelTest.java b/tests/unit/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollProgressViewModelTest.java
index bdb45b0..2c830ad 100644
--- a/tests/unit/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollProgressViewModelTest.java
+++ b/tests/unit/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollProgressViewModelTest.java
@@ -379,7 +379,7 @@
// Notify acquire message
final int value = 33;
- mCallbackWrapper.mValue.onPointerDown(value);
+ mCallbackWrapper.mValue.onUdfpsPointerDown(value);
assertThat(liveData.getValue()).isEqualTo(value);
}
@@ -397,7 +397,7 @@
// Notify acquire message
final int value = 44;
- mCallbackWrapper.mValue.onPointerUp(value);
+ mCallbackWrapper.mValue.onUdfpsPointerUp(value);
assertThat(liveData.getValue()).isEqualTo(value);
}
diff --git a/tests/unit/src/com/android/settings/network/UiccSlotUtilTest.java b/tests/unit/src/com/android/settings/network/UiccSlotUtilTest.java
index 9a2c611..2e17fb2 100644
--- a/tests/unit/src/com/android/settings/network/UiccSlotUtilTest.java
+++ b/tests/unit/src/com/android/settings/network/UiccSlotUtilTest.java
@@ -20,10 +20,13 @@
import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import android.content.Context;
+import android.content.Intent;
import android.telephony.SubscriptionInfo;
import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager;
@@ -49,6 +52,7 @@
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
+import java.util.concurrent.CountDownLatch;
@RunWith(AndroidJUnit4.class)
public class UiccSlotUtilTest {
@@ -738,6 +742,25 @@
assertThat(testSlot).isFalse();
}
+ @Test
+ public void performSwitchToSlot_setSimSlotMapping() throws UiccSlotsException {
+ Collection<UiccSlotMapping> uiccSlotMappings = createUiccSlotMappingDualPortsBNoOrding();
+
+ UiccSlotUtil.performSwitchToSlot(mTelephonyManager, uiccSlotMappings, mContext);
+
+ verify(mTelephonyManager).setSimSlotMapping(any());
+ }
+
+ @Test
+ public void onReceiveSimSlotChangeReceiver_receiveAction_timerCountDown() {
+ CountDownLatch latch = spy(new CountDownLatch(1));
+ UiccSlotUtil.SimSlotChangeReceiver receive = new UiccSlotUtil.SimSlotChangeReceiver(latch);
+
+ receive.onReceive(mContext, new Intent(TelephonyManager.ACTION_SIM_SLOT_STATUS_CHANGED));
+
+ verify(latch).countDown();
+ }
+
private void compareTwoUiccSlotMappings(Collection<UiccSlotMapping> testUiccSlotMappings,
Collection<UiccSlotMapping> verifyUiccSlotMappings) {
assertThat(testUiccSlotMappings.size()).isEqualTo(verifyUiccSlotMappings.size());
diff --git a/tests/unit/src/com/android/settings/network/telephony/MmsMessagePreferenceControllerTest.java b/tests/unit/src/com/android/settings/network/telephony/MmsMessagePreferenceControllerTest.java
index a0219a0..127cdfd 100644
--- a/tests/unit/src/com/android/settings/network/telephony/MmsMessagePreferenceControllerTest.java
+++ b/tests/unit/src/com/android/settings/network/telephony/MmsMessagePreferenceControllerTest.java
@@ -21,15 +21,20 @@
import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import android.content.Context;
+import android.os.Looper;
import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager;
import android.telephony.data.ApnSetting;
+import androidx.preference.PreferenceManager;
+import androidx.preference.PreferenceScreen;
import androidx.preference.SwitchPreference;
import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4;
@@ -63,7 +68,7 @@
when(mContext.getSystemService(SubscriptionManager.class)).thenReturn(mSubscriptionManager);
when(mTelephonyManager.createForSubscriptionId(SUB_ID)).thenReturn(mTelephonyManager);
- mPreference = new SwitchPreference(mContext);
+ mPreference = spy(new SwitchPreference(mContext));
mController = new MmsMessagePreferenceController(mContext, "mms_message");
mController.init(SUB_ID);
mPreference.setKey(mController.getPreferenceKey());
@@ -118,4 +123,20 @@
verify(mTelephonyManager).setMobileDataPolicyEnabled(
TelephonyManager.MOBILE_DATA_POLICY_MMS_ALWAYS_ALLOWED, false);
}
+
+ @Test
+ public void onStart_updatePreferenceUiState() {
+ if (Looper.myLooper() == null) {
+ Looper.prepare();
+ }
+ PreferenceManager preferenceManager = new PreferenceManager(mContext);
+ PreferenceScreen preferenceScreen = preferenceManager.createPreferenceScreen(mContext);
+ preferenceScreen.addPreference(mPreference);
+ mController.displayPreference(preferenceScreen);
+
+ mController.onStart();
+
+ // First is preference initialization, and second is in onStart();
+ verify(mPreference, times(2)).setChecked(anyBoolean());
+ }
}
diff --git a/tests/unit/src/com/android/settings/wifi/tether/WifiHotspotSpeedViewModelTest.java b/tests/unit/src/com/android/settings/wifi/tether/WifiHotspotSpeedViewModelTest.java
index 3a1a927..f52478e 100644
--- a/tests/unit/src/com/android/settings/wifi/tether/WifiHotspotSpeedViewModelTest.java
+++ b/tests/unit/src/com/android/settings/wifi/tether/WifiHotspotSpeedViewModelTest.java
@@ -20,6 +20,9 @@
import static com.android.settings.wifi.repository.WifiHotspotRepository.SPEED_2GHZ_5GHZ;
import static com.android.settings.wifi.repository.WifiHotspotRepository.SPEED_5GHZ;
import static com.android.settings.wifi.repository.WifiHotspotRepository.SPEED_6GHZ;
+import static com.android.settings.wifi.tether.WifiHotspotSpeedViewModel.RES_SPEED_5G_SUMMARY;
+import static com.android.settings.wifi.tether.WifiHotspotSpeedViewModel.RES_SPEED_6G_SUMMARY;
+import static com.android.settings.wifi.tether.WifiHotspotSpeedViewModel.RES_SUMMARY_UNAVAILABLE;
import static com.google.common.truth.Truth.assertThat;
@@ -128,7 +131,9 @@
mViewModel.on6gAvailableChanged(true);
verify(mSpeedInfoMapData).setValue(mViewModel.mSpeedInfoMap);
- assertThat(mViewModel.mSpeedInfoMap.get(SPEED_6GHZ).mIsEnabled).isTrue();
+ WifiHotspotSpeedViewModel.SpeedInfo speedInfo = mViewModel.mSpeedInfoMap.get(SPEED_6GHZ);
+ assertThat(speedInfo.mIsEnabled).isTrue();
+ assertThat(speedInfo.mSummary).isEqualTo(mContext.getString(RES_SPEED_6G_SUMMARY));
}
@Test
@@ -139,7 +144,9 @@
mViewModel.on6gAvailableChanged(false);
verify(mSpeedInfoMapData).setValue(mViewModel.mSpeedInfoMap);
- assertThat(mViewModel.mSpeedInfoMap.get(SPEED_6GHZ).mIsEnabled).isFalse();
+ WifiHotspotSpeedViewModel.SpeedInfo speedInfo = mViewModel.mSpeedInfoMap.get(SPEED_6GHZ);
+ assertThat(speedInfo.mIsEnabled).isFalse();
+ assertThat(speedInfo.mSummary).isEqualTo(mContext.getString(RES_SUMMARY_UNAVAILABLE));
}
@Test
@@ -150,7 +157,9 @@
mViewModel.on5gAvailableChanged(true);
verify(mSpeedInfoMapData).setValue(mViewModel.mSpeedInfoMap);
- assertThat(mViewModel.mSpeedInfoMap.get(SPEED_5GHZ).mIsEnabled).isTrue();
+ WifiHotspotSpeedViewModel.SpeedInfo speedInfo = mViewModel.mSpeedInfoMap.get(SPEED_5GHZ);
+ assertThat(speedInfo.mIsEnabled).isTrue();
+ assertThat(speedInfo.mSummary).isEqualTo(mContext.getString(RES_SPEED_5G_SUMMARY));
}
@Test
@@ -161,7 +170,9 @@
mViewModel.on5gAvailableChanged(false);
verify(mSpeedInfoMapData).setValue(mViewModel.mSpeedInfoMap);
- assertThat(mViewModel.mSpeedInfoMap.get(SPEED_5GHZ).mIsEnabled).isFalse();
+ WifiHotspotSpeedViewModel.SpeedInfo speedInfo = mViewModel.mSpeedInfoMap.get(SPEED_5GHZ);
+ assertThat(speedInfo.mIsEnabled).isFalse();
+ assertThat(speedInfo.mSummary).isEqualTo(mContext.getString(RES_SUMMARY_UNAVAILABLE));
}
@Test