Merge "Update sensitiveNotificationAppProtection reference after move." into main
diff --git a/Android.bp b/Android.bp
index 737c16c..c9a409c 100644
--- a/Android.bp
+++ b/Android.bp
@@ -1,4 +1,5 @@
package {
+ default_team: "trendy_team_android_settings_app",
default_applicable_licenses: ["packages_apps_Settings_license"],
}
@@ -57,7 +58,7 @@
"src/**/*.kt",
],
exclude_srcs: [
- "src/com/android/settings/biometrics/fingerprint2/shared/**/*.kt",
+ "src/com/android/settings/biometrics/fingerprint2/lib/**/*.kt",
],
use_resource_processor: true,
resource_dirs: [
diff --git a/aconfig/Android.bp b/aconfig/Android.bp
index d14cc6f..d511d04 100644
--- a/aconfig/Android.bp
+++ b/aconfig/Android.bp
@@ -1,10 +1,12 @@
package {
+ default_team: "trendy_team_android_settings_app",
default_applicable_licenses: ["packages_apps_Settings_license"],
}
aconfig_declarations {
name: "aconfig_settings_flags",
package: "com.android.settings.flags",
+ container: "system",
srcs: [
"*.aconfig",
],
@@ -18,6 +20,7 @@
aconfig_declarations {
name: "factory_reset_flags",
package: "com.android.settings.factory_reset",
+ container: "system",
srcs: ["factory_reset/*.aconfig"],
}
@@ -29,6 +32,7 @@
aconfig_declarations {
name: "media_drm_flags",
package: "com.android.settings.media_drm",
+ container: "system",
srcs: ["media_drm/*.aconfig"],
}
@@ -40,6 +44,7 @@
aconfig_declarations {
name: "accessibility_flags",
package: "com.android.settings.accessibility",
+ container: "system",
srcs: ["accessibility/*.aconfig"],
}
@@ -51,8 +56,9 @@
aconfig_declarations {
name: "development_settings_flags",
package: "com.android.settings.development",
+ container: "system",
srcs: [
- "development/**/*.aconfig"
+ "development/**/*.aconfig",
],
}
diff --git a/aconfig/accessibility/accessibility_flags.aconfig b/aconfig/accessibility/accessibility_flags.aconfig
index ad770fb..24e108e 100644
--- a/aconfig/accessibility/accessibility_flags.aconfig
+++ b/aconfig/accessibility/accessibility_flags.aconfig
@@ -1,4 +1,5 @@
package: "com.android.settings.accessibility"
+container: "system"
# NOTE: Keep alphabetized to help limit merge conflicts from multiple simultaneous editors.
diff --git a/aconfig/development/settings_core_flag_declarations.aconfig b/aconfig/development/settings_core_flag_declarations.aconfig
index c012263..b73b026 100644
--- a/aconfig/development/settings_core_flag_declarations.aconfig
+++ b/aconfig/development/settings_core_flag_declarations.aconfig
@@ -1,4 +1,5 @@
package: "com.android.settings.development"
+container: "system"
flag {
name: "deprecate_list_activity"
diff --git a/aconfig/factory_reset/factory_reset_flag_declarations.aconfig b/aconfig/factory_reset/factory_reset_flag_declarations.aconfig
index 2b1ce72..7feebf5 100644
--- a/aconfig/factory_reset/factory_reset_flag_declarations.aconfig
+++ b/aconfig/factory_reset/factory_reset_flag_declarations.aconfig
@@ -1,4 +1,5 @@
package: "com.android.settings.factory_reset"
+container: "system"
flag {
name: "enable_factory_reset_wizard"
diff --git a/aconfig/media_drm/settings_mediadrm_flag_declarations.aconfig b/aconfig/media_drm/settings_mediadrm_flag_declarations.aconfig
index 06d75f1..4697a11 100644
--- a/aconfig/media_drm/settings_mediadrm_flag_declarations.aconfig
+++ b/aconfig/media_drm/settings_mediadrm_flag_declarations.aconfig
@@ -1,4 +1,5 @@
package: "com.android.settings.media_drm"
+container: "system"
flag {
name: "force_l3_enabled"
diff --git a/aconfig/settings_accessibility_flag_declarations_legacy.aconfig b/aconfig/settings_accessibility_flag_declarations_legacy.aconfig
index 5a464b5..6e02bfe 100644
--- a/aconfig/settings_accessibility_flag_declarations_legacy.aconfig
+++ b/aconfig/settings_accessibility_flag_declarations_legacy.aconfig
@@ -1,4 +1,5 @@
package: "com.android.settings.flags"
+container: "system"
# NOTE: Don't add new accessibility flags here, since the package name doesn't follow
# the best practice for setting's feature flag go/settings-trunk-stable
diff --git a/aconfig/settings_biometrics_framework_flag_declarations.aconfig b/aconfig/settings_biometrics_framework_flag_declarations.aconfig
index 810f2de..e9f19bc 100644
--- a/aconfig/settings_biometrics_framework_flag_declarations.aconfig
+++ b/aconfig/settings_biometrics_framework_flag_declarations.aconfig
@@ -1,4 +1,5 @@
package: "com.android.settings.flags"
+container: "system"
flag {
name: "biometric_settings_provider"
diff --git a/aconfig/settings_biometrics_integration_declarations.aconfig b/aconfig/settings_biometrics_integration_declarations.aconfig
index bc437f2..ea3ac19 100644
--- a/aconfig/settings_biometrics_integration_declarations.aconfig
+++ b/aconfig/settings_biometrics_integration_declarations.aconfig
@@ -1,4 +1,5 @@
package: "com.android.settings.flags"
+container: "system"
flag {
name: "sfps_enroll_refinement"
diff --git a/aconfig/settings_bluetooth_declarations.aconfig b/aconfig/settings_bluetooth_declarations.aconfig
index 58ddd25..3e771cd 100644
--- a/aconfig/settings_bluetooth_declarations.aconfig
+++ b/aconfig/settings_bluetooth_declarations.aconfig
@@ -1,4 +1,5 @@
package: "com.android.settings.flags"
+container: "system"
flag {
name: "enable_offload_bluetooth_operations_to_background_thread"
diff --git a/aconfig/settings_connecteddevice_flag_declarations.aconfig b/aconfig/settings_connecteddevice_flag_declarations.aconfig
index 0fc164e..84bb578 100644
--- a/aconfig/settings_connecteddevice_flag_declarations.aconfig
+++ b/aconfig/settings_connecteddevice_flag_declarations.aconfig
@@ -1,4 +1,5 @@
package: "com.android.settings.flags"
+container: "system"
flag {
name: "enable_subsequent_pair_settings_integration"
diff --git a/aconfig/settings_development_flag_declarations.aconfig b/aconfig/settings_development_flag_declarations.aconfig
index e12bccc..318f862 100644
--- a/aconfig/settings_development_flag_declarations.aconfig
+++ b/aconfig/settings_development_flag_declarations.aconfig
@@ -1,4 +1,5 @@
package: "com.android.settings.flags"
+container: "system"
# NOTE: Keep alphabetized to help limit merge conflicts from multiple simultaneous editors.
diff --git a/aconfig/settings_display_flag_declarations.aconfig b/aconfig/settings_display_flag_declarations.aconfig
index 52a326d..9fe587b 100644
--- a/aconfig/settings_display_flag_declarations.aconfig
+++ b/aconfig/settings_display_flag_declarations.aconfig
@@ -1,4 +1,5 @@
package: "com.android.settings.flags"
+container: "system"
flag {
name: "protect_screen_timeout_with_auth"
diff --git a/aconfig/settings_experience_flag_declarations.aconfig b/aconfig/settings_experience_flag_declarations.aconfig
index 7642734..e6cb924 100644
--- a/aconfig/settings_experience_flag_declarations.aconfig
+++ b/aconfig/settings_experience_flag_declarations.aconfig
@@ -1,4 +1,5 @@
package: "com.android.settings.flags"
+container: "system"
flag {
name: "new_apn_page_enabled"
diff --git a/aconfig/settings_flag_declarations.aconfig b/aconfig/settings_flag_declarations.aconfig
index 36f104c..9c3a7e1 100644
--- a/aconfig/settings_flag_declarations.aconfig
+++ b/aconfig/settings_flag_declarations.aconfig
@@ -1,4 +1,5 @@
package: "com.android.settings.flags"
+container: "system"
flag {
name: "show_factory_reset_cancel_button"
diff --git a/aconfig/settings_globalintl_flag_declarations.aconfig b/aconfig/settings_globalintl_flag_declarations.aconfig
index 68662d0..95202d3 100644
--- a/aconfig/settings_globalintl_flag_declarations.aconfig
+++ b/aconfig/settings_globalintl_flag_declarations.aconfig
@@ -1,4 +1,5 @@
package: "com.android.settings.flags"
+container: "system"
flag {
name: "terms_of_address_enabled"
diff --git a/aconfig/settings_notification_flag_declarations.aconfig b/aconfig/settings_notification_flag_declarations.aconfig
index f2bf1c8..bdb6573 100644
--- a/aconfig/settings_notification_flag_declarations.aconfig
+++ b/aconfig/settings_notification_flag_declarations.aconfig
@@ -1,4 +1,5 @@
package: "com.android.settings.flags"
+container: "system"
flag {
name: "dedupe_dnd_settings_channels"
diff --git a/aconfig/settings_onboarding_experience_flag_declarations.aconfig b/aconfig/settings_onboarding_experience_flag_declarations.aconfig
index 6fb5377..8d58d40 100644
--- a/aconfig/settings_onboarding_experience_flag_declarations.aconfig
+++ b/aconfig/settings_onboarding_experience_flag_declarations.aconfig
@@ -1,4 +1,5 @@
package: "com.android.settings.flags"
+container: "system"
flag {
name: "enable_sound_backup"
diff --git a/aconfig/settings_panel_flag_declarations.aconfig b/aconfig/settings_panel_flag_declarations.aconfig
index 10eb655..efab83e 100644
--- a/aconfig/settings_panel_flag_declarations.aconfig
+++ b/aconfig/settings_panel_flag_declarations.aconfig
@@ -1,4 +1,5 @@
package: "com.android.settings.flags"
+container: "system"
flag {
name: "enable_volume_plus_quick_settings"
diff --git a/aconfig/settings_security_flag_declarations.aconfig b/aconfig/settings_security_flag_declarations.aconfig
index 42ef4d0..3684212 100644
--- a/aconfig/settings_security_flag_declarations.aconfig
+++ b/aconfig/settings_security_flag_declarations.aconfig
@@ -1,4 +1,5 @@
package: "com.android.settings.flags"
+container: "system"
flag {
name: "protect_lock_after_timeout_with_auth"
diff --git a/aconfig/settings_telephony_flag_declarations.aconfig b/aconfig/settings_telephony_flag_declarations.aconfig
index 0999a7b..dab1b45 100644
--- a/aconfig/settings_telephony_flag_declarations.aconfig
+++ b/aconfig/settings_telephony_flag_declarations.aconfig
@@ -1,4 +1,5 @@
package: "com.android.settings.flags"
+container: "system"
flag {
name: "remove_key_hide_enable_2g"
diff --git a/aconfig/settings_voice_activation_apps_flag_declarations.aconfig b/aconfig/settings_voice_activation_apps_flag_declarations.aconfig
index d98bc52..a18e8c5 100644
--- a/aconfig/settings_voice_activation_apps_flag_declarations.aconfig
+++ b/aconfig/settings_voice_activation_apps_flag_declarations.aconfig
@@ -1,4 +1,5 @@
package: "com.android.settings.flags"
+container: "system"
flag {
name: "enable_voice_activation_apps_in_settings"
diff --git a/protos/Android.bp b/protos/Android.bp
index d546e2d..560851a 100644
--- a/protos/Android.bp
+++ b/protos/Android.bp
@@ -1,4 +1,5 @@
package {
+ default_team: "trendy_team_android_settings_app",
// See: http://go/android-license-faq
// A large-scale-change added 'default_applicable_licenses' to import
// all of the 'license_kinds' from "packages_apps_Settings_license"
diff --git a/res-product/values-af/strings.xml b/res-product/values-af/strings.xml
index 1f46168..73fdec6 100644
--- a/res-product/values-af/strings.xml
+++ b/res-product/values-af/strings.xml
@@ -347,12 +347,9 @@
<string name="lockpassword_confirm_your_password_details_frp" product="default" msgid="1465326741724776281">"Jou foon is na fabriekinstellings teruggestel. Voer jou vorige wagwoord in om dié foon te gebruik."</string>
<string name="lockpassword_confirm_your_password_details_frp" product="tablet" msgid="1333164951750797865">"Jou tablet is na fabriekinstellings teruggestel. Voer vorige wagwoord in om dié tablet te gebruik."</string>
<string name="lockpassword_confirm_your_password_details_frp" product="device" msgid="116667646012224967">"Jou toestel is na fabriekinstellings teruggestel. Voer vorige wagwoord in om dié toestel te gebruik."</string>
- <!-- no translation found for battery_tip_incompatible_charging_message (5097154279720383707) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (4208335872169818919) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (5697523201841444736) -->
- <skip />
+ <string name="battery_tip_incompatible_charging_message" product="default" msgid="5097154279720383707">"Jou foon laai dalk stadig of laai glad nie. Gebruik ’n aanbeveelde kabel en aansluitprop om vinniger te laai."</string>
+ <string name="battery_tip_incompatible_charging_message" product="device" msgid="4208335872169818919">"Jou toestel laai dalk stadig of laai glad nie. Gebruik ’n aanbeveelde kabel en aansluitprop om vinniger te laai."</string>
+ <string name="battery_tip_incompatible_charging_message" product="tablet" msgid="5697523201841444736">"Jou tablet laai dalk stadig of laai glad nie. Gebruik ’n aanbeveelde kabel en aansluitprop om vinniger te laai."</string>
<string name="lockscreen_trivial_controls_summary" product="default" msgid="42562533085885152">"Sonder om jou foon te ontsluit"</string>
<string name="lockscreen_trivial_controls_summary" product="tablet" msgid="9052068482124729345">"Sonder om jou tablet te ontsluit"</string>
<string name="auto_rotate_summary_a11y" product="default" msgid="2813368383309985185">"Wanneer jy jou foon tussen portret en landskap beweeg"</string>
diff --git a/res-product/values-am/strings.xml b/res-product/values-am/strings.xml
index 89e4c36..df771ea 100644
--- a/res-product/values-am/strings.xml
+++ b/res-product/values-am/strings.xml
@@ -347,12 +347,9 @@
<string name="lockpassword_confirm_your_password_details_frp" product="default" msgid="1465326741724776281">"የእርስዎ ስልክ ወደ የፋብሪካ ቅንብሮች ዳግም ተጀምሯል። ይህን ስልክ ለመጠቀም ቀዳሚውን ይለፍ ቃልዎን ያስገቡ።"</string>
<string name="lockpassword_confirm_your_password_details_frp" product="tablet" msgid="1333164951750797865">"የእርስዎ ጡባዊ ወደ የፋብሪካ ቅንብሮች ዳግም ተጀምሯል። ይህን ጡባዊ ለመጠቀም የእርስዎን ቀዳሚ የይለፍ ቃል ያስገቡ።"</string>
<string name="lockpassword_confirm_your_password_details_frp" product="device" msgid="116667646012224967">"የእርስዎ መሣሪያ ወደ የፋብሪካ ቅንብሮች ዳግም ተጀምሯል። ይህን መሣሪያ ለመጠቀም የእርስዎን ቀዳሚ የይለፍ ቃል ያስገቡ።"</string>
- <!-- no translation found for battery_tip_incompatible_charging_message (5097154279720383707) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (4208335872169818919) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (5697523201841444736) -->
- <skip />
+ <string name="battery_tip_incompatible_charging_message" product="default" msgid="5097154279720383707">"ስልክዎ በዝግታ ኃይል እየሞላ ሊሆን ወይም ኃይል እየሞላ ላይሆን ይችላል። ይበልጥ ፈጣን ለሆነ ኃይል መሙላት የሚመከር ገመድ እና የኃይል አስማሚ ይጠቀሙ።"</string>
+ <string name="battery_tip_incompatible_charging_message" product="device" msgid="4208335872169818919">"መሣሪያዎ በዝግታ ኃይል እየሞላ ሊሆን ወይም ኃይል እየሞላ ላይሆን ይችላል። ይበልጥ ፈጣን ለሆነ ኃይል መሙላት የሚመከር ገመድ እና የኃይል አስማሚ ይጠቀሙ።"</string>
+ <string name="battery_tip_incompatible_charging_message" product="tablet" msgid="5697523201841444736">"ጡባዊዎ በዝግታ ኃይል እየሞላ ሊሆን ወይም ኃይል እየሞላ ላይሆን ይችላል። ይበልጥ ፈጣን ለሆነ ኃይል መሙላት የሚመከር ገመድ እና የኃይል አስማሚ ይጠቀሙ።"</string>
<string name="lockscreen_trivial_controls_summary" product="default" msgid="42562533085885152">"ስልክዎን ሳይከፍቱ"</string>
<string name="lockscreen_trivial_controls_summary" product="tablet" msgid="9052068482124729345">"ጡባዊዎን ሳይክፍቱ"</string>
<string name="auto_rotate_summary_a11y" product="default" msgid="2813368383309985185">"ስልክዎን በቁም ፎቶ እና በወርድ መካከል ሲያንቀሳቅሱ"</string>
diff --git a/res-product/values-ar/strings.xml b/res-product/values-ar/strings.xml
index be429c4..fe29067 100644
--- a/res-product/values-ar/strings.xml
+++ b/res-product/values-ar/strings.xml
@@ -347,12 +347,9 @@
<string name="lockpassword_confirm_your_password_details_frp" product="default" msgid="1465326741724776281">"تمت إعادة ضبط هاتفك على الإعدادات الأصلية. لاستخدام هذا الهاتف، أدخِل كلمة المرور السابقة."</string>
<string name="lockpassword_confirm_your_password_details_frp" product="tablet" msgid="1333164951750797865">"تمت إعادة ضبط جهازك اللوحي على الإعدادات الأصلية. لاستخدام جهازك اللوحي، أدخِل كلمة المرور السابقة."</string>
<string name="lockpassword_confirm_your_password_details_frp" product="device" msgid="116667646012224967">"تمت إعادة ضبط جهازك على الإعدادات الأصلية. لاستخدام هذا الجهاز، أدخِل كلمة المرور السابقة."</string>
- <!-- no translation found for battery_tip_incompatible_charging_message (5097154279720383707) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (4208335872169818919) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (5697523201841444736) -->
- <skip />
+ <string name="battery_tip_incompatible_charging_message" product="default" msgid="5097154279720383707">"قد يتم شحن هاتفك ببطء أو لا يتم شحنه. لشحن أسرع، استخدِم كابلاً ومحوِّل طاقة يُنصح باستخدامهما."</string>
+ <string name="battery_tip_incompatible_charging_message" product="device" msgid="4208335872169818919">"قد يتم شحن جهازك ببطء أو لا يتم شحنه. لشحن أسرع، استخدِم كابلاً ومحوِّل طاقة يُنصح باستخدامهما."</string>
+ <string name="battery_tip_incompatible_charging_message" product="tablet" msgid="5697523201841444736">"قد يتم شحن جهازك اللوحي ببطء أو لا يتم شحنه. لشحن أسرع، استخدِم كابلاً ومحوِّل طاقة يُنصح باستخدامهما."</string>
<string name="lockscreen_trivial_controls_summary" product="default" msgid="42562533085885152">"بدون فتح قفل هاتفك"</string>
<string name="lockscreen_trivial_controls_summary" product="tablet" msgid="9052068482124729345">"بدون فتح قفل جهازك اللوحي"</string>
<string name="auto_rotate_summary_a11y" product="default" msgid="2813368383309985185">"عند تغيير اتّجاه شاشة هاتفك بين الوضع العمودي والوضع الأفقي"</string>
diff --git a/res-product/values-as/strings.xml b/res-product/values-as/strings.xml
index fb39878..a1720d3 100644
--- a/res-product/values-as/strings.xml
+++ b/res-product/values-as/strings.xml
@@ -347,12 +347,9 @@
<string name="lockpassword_confirm_your_password_details_frp" product="default" msgid="1465326741724776281">"আপোনাৰ ফ’নটো ফেক্টৰী ছেটিঙলৈ ৰিছেট কৰা হৈছিল। ফ’নটো ব্যৱহাৰ কৰিবলৈ আপোনাৰ আগৰ পাছৱৰ্ডটো দিয়ক।"</string>
<string name="lockpassword_confirm_your_password_details_frp" product="tablet" msgid="1333164951750797865">"আপোনাৰ টেবলেটটো ফেক্টৰীৰ ছেটিঙলৈ ৰিছেট কৰা হৈছে। এই টেবলেটটো ব্যৱহাৰ কৰিবলৈ আপোনাৰ আগৰ পাছৱৰ্ডটো দিয়ক।"</string>
<string name="lockpassword_confirm_your_password_details_frp" product="device" msgid="116667646012224967">"আপোনাৰ ডিভাইচটো ফেক্টৰীৰ ছেটিঙলৈ ৰিছেট কৰা হৈছে। এই ডিভাইচটো ব্যৱহাৰ কৰিবলৈ আপোনাৰ আগৰ পাছৱৰ্ডটো দিয়ক।"</string>
- <!-- no translation found for battery_tip_incompatible_charging_message (5097154279720383707) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (4208335872169818919) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (5697523201841444736) -->
- <skip />
+ <string name="battery_tip_incompatible_charging_message" product="default" msgid="5097154279720383707">"আপোনাৰ ফ’নটো হয়তো লাহে লাহে চাৰ্জ হৈ আছে বা চাৰ্জ হোৱা নাই। দ্ৰুত চাৰ্জিঙৰ বাবে, চুপাৰিছ কৰা কে’বল আৰু এডাপ্টাৰ ব্যৱহাৰ কৰক।"</string>
+ <string name="battery_tip_incompatible_charging_message" product="device" msgid="4208335872169818919">"আপোনাৰ ডিভাইচটো হয়তো লাহে লাহে চাৰ্জ হৈ আছে বা চাৰ্জ হোৱা নাই। দ্ৰুত চাৰ্জিঙৰ বাবে, চুপাৰিছ কৰা কে’বল আৰু এডাপ্টাৰ ব্যৱহাৰ কৰক।"</string>
+ <string name="battery_tip_incompatible_charging_message" product="tablet" msgid="5697523201841444736">"আপোনাৰ টেবলেটটো হয়তো লাহে লাহে চাৰ্জ হৈ আছে বা চাৰ্জ হোৱা নাই। দ্ৰুত চাৰ্জিঙৰ বাবে, চুপাৰিছ কৰা কে’বল আৰু এডাপ্টাৰ ব্যৱহাৰ কৰক।"</string>
<string name="lockscreen_trivial_controls_summary" product="default" msgid="42562533085885152">"আপোনাৰ ফ’নটো আনলক নকৰাকৈ"</string>
<string name="lockscreen_trivial_controls_summary" product="tablet" msgid="9052068482124729345">"আপোনাৰ টেবলেটটো আনলক নকৰাকৈ"</string>
<string name="auto_rotate_summary_a11y" product="default" msgid="2813368383309985185">"আপুনি নিজৰ ফ’নটো প’ৰ্ট্ৰেইট আৰু লেণ্ডস্কে’পৰ মাজত সালসলনি কৰিলে"</string>
diff --git a/res-product/values-az/strings.xml b/res-product/values-az/strings.xml
index 8e0d0fd..efeac52 100644
--- a/res-product/values-az/strings.xml
+++ b/res-product/values-az/strings.xml
@@ -347,12 +347,9 @@
<string name="lockpassword_confirm_your_password_details_frp" product="default" msgid="1465326741724776281">"Telefonunuz zavod ayarlarına sıfırlanıb. Telefondan istifadə etmək üçün əvvəlki parolu daxil edin."</string>
<string name="lockpassword_confirm_your_password_details_frp" product="tablet" msgid="1333164951750797865">"Planşetiniz zavod ayarlarına sıfırlanıb. Bu planşeti istifadə etmək üçün əvvəlki parolu daxil edin."</string>
<string name="lockpassword_confirm_your_password_details_frp" product="device" msgid="116667646012224967">"Cihazınız zavod ayarlarına sıfırlanıb. Bu cihazı istifadə etmək üçün əvvəlki parolu daxil edin."</string>
- <!-- no translation found for battery_tip_incompatible_charging_message (5097154279720383707) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (4208335872169818919) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (5697523201841444736) -->
- <skip />
+ <string name="battery_tip_incompatible_charging_message" product="default" msgid="5097154279720383707">"Telefon asta şarj edilə, yaxud şarj edilməyə bilər. Sürətli şarj üçün tövsiyə edilən kabel və adapter istifadə edin."</string>
+ <string name="battery_tip_incompatible_charging_message" product="device" msgid="4208335872169818919">"Cihaz asta şarj edilə, yaxud şarj edilməyə bilər. Sürətli şarj üçün tövsiyə edilən kabel və adapter istifadə edin."</string>
+ <string name="battery_tip_incompatible_charging_message" product="tablet" msgid="5697523201841444736">"Planşet asta şarj edilə, yaxud şarj edilməyə bilər. Sürətli şarj üçün tövsiyə edilən kabel və adapter istifadə edin."</string>
<string name="lockscreen_trivial_controls_summary" product="default" msgid="42562533085885152">"Telefonu kiliddən çıxarmadan"</string>
<string name="lockscreen_trivial_controls_summary" product="tablet" msgid="9052068482124729345">"Planşeti kiliddən çıxarmadan"</string>
<string name="auto_rotate_summary_a11y" product="default" msgid="2813368383309985185">"Telefon rejimini portret və landşaft arasında dəyişdikdə"</string>
diff --git a/res-product/values-b+sr+Latn/strings.xml b/res-product/values-b+sr+Latn/strings.xml
index 7d4af34..9f8486e 100644
--- a/res-product/values-b+sr+Latn/strings.xml
+++ b/res-product/values-b+sr+Latn/strings.xml
@@ -347,12 +347,9 @@
<string name="lockpassword_confirm_your_password_details_frp" product="default" msgid="1465326741724776281">"Telefon je resetovan na fabrička podešavanja. Da biste ga koristili, unesite prethodnu lozinku."</string>
<string name="lockpassword_confirm_your_password_details_frp" product="tablet" msgid="1333164951750797865">"Tablet je resetovan na fabrička podešavanja. Da biste ga koristili, unesite prethodnu lozinku."</string>
<string name="lockpassword_confirm_your_password_details_frp" product="device" msgid="116667646012224967">"Uređaj je resetovan na fabrička podešavanja. Da biste ga koristili, unesite prethodnu lozinku."</string>
- <!-- no translation found for battery_tip_incompatible_charging_message (5097154279720383707) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (4208335872169818919) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (5697523201841444736) -->
- <skip />
+ <string name="battery_tip_incompatible_charging_message" product="default" msgid="5097154279720383707">"Telefon se možda sporo puni ili se uopšte ne puni. Ako želite brže punjenje, koristite preporučeni kabl i adapter."</string>
+ <string name="battery_tip_incompatible_charging_message" product="device" msgid="4208335872169818919">"Uređaj se možda sporo puni ili se uopšte ne puni. Ako želite brže punjenje, koristite preporučeni kabl i adapter."</string>
+ <string name="battery_tip_incompatible_charging_message" product="tablet" msgid="5697523201841444736">"Tablet se možda sporo puni ili se uopšte ne puni. Ako želite brže punjenje, koristite preporučeni kabl i adapter."</string>
<string name="lockscreen_trivial_controls_summary" product="default" msgid="42562533085885152">"Bez otključavanja telefona"</string>
<string name="lockscreen_trivial_controls_summary" product="tablet" msgid="9052068482124729345">"Bez otključavanja tableta"</string>
<string name="auto_rotate_summary_a11y" product="default" msgid="2813368383309985185">"Kada okrećete telefon u uspravni ili vodoravni režim"</string>
diff --git a/res-product/values-be/strings.xml b/res-product/values-be/strings.xml
index b47d27f..2714695 100644
--- a/res-product/values-be/strings.xml
+++ b/res-product/values-be/strings.xml
@@ -347,12 +347,9 @@
<string name="lockpassword_confirm_your_password_details_frp" product="default" msgid="1465326741724776281">"Налады тэлефона скінуты да заводскіх значэнняў. Каб карыстацца ім, увядзіце свой былы пароль."</string>
<string name="lockpassword_confirm_your_password_details_frp" product="tablet" msgid="1333164951750797865">"Налады планшэта скінуты да заводскіх значэнняў. Каб карыстацца ім, увядзіце свой былы пароль."</string>
<string name="lockpassword_confirm_your_password_details_frp" product="device" msgid="116667646012224967">"Налады прылады скінуты да заводскіх значэнняў. Каб карыстацца ёю, увядзіце свой былы пароль."</string>
- <!-- no translation found for battery_tip_incompatible_charging_message (5097154279720383707) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (4208335872169818919) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (5697523201841444736) -->
- <skip />
+ <string name="battery_tip_incompatible_charging_message" product="default" msgid="5097154279720383707">"Магчыма, ваш тэлефон не зараджаецца або зараджаецца павольна. Каб паскорыць зарадку, выкарыстоўвайце рэкамендаваныя кабель і адаптар."</string>
+ <string name="battery_tip_incompatible_charging_message" product="device" msgid="4208335872169818919">"Магчыма, ваша прылада не зараджаецца або зараджаецца павольна. Каб паскорыць зарадку, выкарыстоўвайце рэкамендаваныя кабель і адаптар."</string>
+ <string name="battery_tip_incompatible_charging_message" product="tablet" msgid="5697523201841444736">"Магчыма, ваш планшэт не зараджаецца або зараджаецца павольна. Каб паскорыць зарадку, выкарыстоўвайце рэкамендаваныя кабель і адаптар."</string>
<string name="lockscreen_trivial_controls_summary" product="default" msgid="42562533085885152">"Без разблакіроўкі тэлефона"</string>
<string name="lockscreen_trivial_controls_summary" product="tablet" msgid="9052068482124729345">"Без разблакіроўкі планшэта"</string>
<string name="auto_rotate_summary_a11y" product="default" msgid="2813368383309985185">"Калі вы паварочваеце тэлефон для змянення арыентацыі экрана"</string>
diff --git a/res-product/values-bg/strings.xml b/res-product/values-bg/strings.xml
index 0adf002..78f7df4 100644
--- a/res-product/values-bg/strings.xml
+++ b/res-product/values-bg/strings.xml
@@ -347,12 +347,9 @@
<string name="lockpassword_confirm_your_password_details_frp" product="default" msgid="1465326741724776281">"Фабр. настройки на телефона са били възстановени. За да го ползвате, въведете предишната си парола."</string>
<string name="lockpassword_confirm_your_password_details_frp" product="tablet" msgid="1333164951750797865">"Фабр. настройки на таблета са били възстановени. За да го използвате, въведете предишната си парола."</string>
<string name="lockpassword_confirm_your_password_details_frp" product="device" msgid="116667646012224967">"Фабр. настройки на у-вото са били възстановени. За да го използвате, въведете предишната си парола."</string>
- <!-- no translation found for battery_tip_incompatible_charging_message (5097154279720383707) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (4208335872169818919) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (5697523201841444736) -->
- <skip />
+ <string name="battery_tip_incompatible_charging_message" product="default" msgid="5097154279720383707">"Възможно е телефонът ви да се зарежда бавно или да не се зарежда. За по-бързо зареждане използвайте препоръчителните кабел и адаптер."</string>
+ <string name="battery_tip_incompatible_charging_message" product="device" msgid="4208335872169818919">"Възможно е устройството ви да се зарежда бавно или да не се зарежда. За по-бързо зареждане използвайте препоръчителните кабел и адаптер."</string>
+ <string name="battery_tip_incompatible_charging_message" product="tablet" msgid="5697523201841444736">"Възможно е таблетът ви да се зарежда бавно или да не се зарежда. За по-бързо зареждане използвайте препоръчителните кабел и адаптер."</string>
<string name="lockscreen_trivial_controls_summary" product="default" msgid="42562533085885152">"Без отключване на телефона"</string>
<string name="lockscreen_trivial_controls_summary" product="tablet" msgid="9052068482124729345">"Без отключване на таблета"</string>
<string name="auto_rotate_summary_a11y" product="default" msgid="2813368383309985185">"Когато завъртите телефона си вертикално или хоризонтално"</string>
diff --git a/res-product/values-bn/strings.xml b/res-product/values-bn/strings.xml
index 174a34f..a3c4747 100644
--- a/res-product/values-bn/strings.xml
+++ b/res-product/values-bn/strings.xml
@@ -347,12 +347,9 @@
<string name="lockpassword_confirm_your_password_details_frp" product="default" msgid="1465326741724776281">"আপনার ফোন ফ্যাক্টরি সেটিংসে রিসেট করা হয়েছে। এই ফোনটি ব্যবহার করতে হলে, আগের পাসওয়ার্ডটি লিখুন।"</string>
<string name="lockpassword_confirm_your_password_details_frp" product="tablet" msgid="1333164951750797865">"আপনার ট্যাবলেট ফ্যাক্টরি সেটিংসে রিসেট করা হয়েছে। এই ট্যাবলেট ব্যবহার করতে, আগের পাসওয়ার্ড লিখুন।"</string>
<string name="lockpassword_confirm_your_password_details_frp" product="device" msgid="116667646012224967">"আপনার ডিভাইস ফ্যাক্টরি সেটিংসে রিসেট করা হয়েছে। এই ডিভাইস ব্যবহার করতে, আপনার আগের পাসওয়ার্ড লিখুন।"</string>
- <!-- no translation found for battery_tip_incompatible_charging_message (5097154279720383707) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (4208335872169818919) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (5697523201841444736) -->
- <skip />
+ <string name="battery_tip_incompatible_charging_message" product="default" msgid="5097154279720383707">"আপনার ফোন হয়ত ধীরে ধীরে চার্জ হচ্ছে বা চার্জ হচ্ছে না। আরও দ্রুত চার্জের জন্য সাজেস্ট করা কেবল ও অ্যাডাপ্টার ব্যবহার করুন।"</string>
+ <string name="battery_tip_incompatible_charging_message" product="device" msgid="4208335872169818919">"আপনার ডিভাইস হয়ত ধীরে ধীরে চার্জ হচ্ছে বা চার্জ হচ্ছে না। আরও দ্রুত চার্জের জন্য সাজেস্ট করা কেবল ও অ্যাডাপ্টার ব্যবহার করুন।"</string>
+ <string name="battery_tip_incompatible_charging_message" product="tablet" msgid="5697523201841444736">"আপনার ট্যাবলেট হয়ত ধীরে ধীরে চার্জ হচ্ছে বা চার্জ হচ্ছে না। আরও দ্রুত চার্জের জন্য সাজেস্ট করা কেবল ও অ্যাডাপ্টার ব্যবহার করুন।"</string>
<string name="lockscreen_trivial_controls_summary" product="default" msgid="42562533085885152">"আপনার ফোন আনলক না করে"</string>
<string name="lockscreen_trivial_controls_summary" product="tablet" msgid="9052068482124729345">"আপনার ট্যাবলেট আনলক না করে"</string>
<string name="auto_rotate_summary_a11y" product="default" msgid="2813368383309985185">"আপনার ফোন, \'পোর্ট্রেট\' ও \'ল্যান্ডস্কেপ\' মোডের মধ্যে অদলবদল করলে"</string>
diff --git a/res-product/values-bs/strings.xml b/res-product/values-bs/strings.xml
index 53710f8..bef680a 100644
--- a/res-product/values-bs/strings.xml
+++ b/res-product/values-bs/strings.xml
@@ -347,12 +347,9 @@
<string name="lockpassword_confirm_your_password_details_frp" product="default" msgid="1465326741724776281">"Telefon je vraćen na fabričke postavke. Da koristite telefon, unesite prethodnu lozinku."</string>
<string name="lockpassword_confirm_your_password_details_frp" product="tablet" msgid="1333164951750797865">"Tablet je vraćen na fabričke postavke. Da koristite tablet, unesite prethodnu lozinku."</string>
<string name="lockpassword_confirm_your_password_details_frp" product="device" msgid="116667646012224967">"Uređaj je vraćen na fabričke postavke. Da koristite uređaj, unesite prethodnu lozinku."</string>
- <!-- no translation found for battery_tip_incompatible_charging_message (5097154279720383707) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (4208335872169818919) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (5697523201841444736) -->
- <skip />
+ <string name="battery_tip_incompatible_charging_message" product="default" msgid="5097154279720383707">"Telefon se možda puni sporo ili se ne puni. Za brže punjenje koristite preporučen kabl i adapter."</string>
+ <string name="battery_tip_incompatible_charging_message" product="device" msgid="4208335872169818919">"Uređaj se možda puni sporo ili se ne puni. Za brže punjenje koristite preporučen kabl i adapter."</string>
+ <string name="battery_tip_incompatible_charging_message" product="tablet" msgid="5697523201841444736">"Tablet se možda puni sporo ili se ne puni. Za brže punjenje koristite preporučen kabl i adapter."</string>
<string name="lockscreen_trivial_controls_summary" product="default" msgid="42562533085885152">"Bez otključavanja telefona"</string>
<string name="lockscreen_trivial_controls_summary" product="tablet" msgid="9052068482124729345">"Bez otključavanja tableta"</string>
<string name="auto_rotate_summary_a11y" product="default" msgid="2813368383309985185">"Kada mijenjate prikaz na telefonu između uspravnog i vodoravnog"</string>
diff --git a/res-product/values-ca/strings.xml b/res-product/values-ca/strings.xml
index 48690a9..0575f52 100644
--- a/res-product/values-ca/strings.xml
+++ b/res-product/values-ca/strings.xml
@@ -347,12 +347,9 @@
<string name="lockpassword_confirm_your_password_details_frp" product="default" msgid="1465326741724776281">"S\'ha restablert la config. de fàbrica del dispositiu. Per utilitzar-lo, escriu la contrasenya antiga."</string>
<string name="lockpassword_confirm_your_password_details_frp" product="tablet" msgid="1333164951750797865">"S\'ha restablert la config. de fàbrica de la tauleta. Per utilitzar-la, escriu la contrasenya antiga."</string>
<string name="lockpassword_confirm_your_password_details_frp" product="device" msgid="116667646012224967">"S\'ha restablert la config. de fàbrica del dispositiu. Per utilitzar-lo, escriu la contrasenya antiga."</string>
- <!-- no translation found for battery_tip_incompatible_charging_message (5097154279720383707) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (4208335872169818919) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (5697523201841444736) -->
- <skip />
+ <string name="battery_tip_incompatible_charging_message" product="default" msgid="5097154279720383707">"És possible que el telèfon s\'estigui carregant lentament o que no s\'estigui carregant. Per carregar-lo ràpidament, utilitza un cable i un adaptador recomanats."</string>
+ <string name="battery_tip_incompatible_charging_message" product="device" msgid="4208335872169818919">"És possible que el dispositiu s\'estigui carregant lentament o que no s\'estigui carregant. Per carregar-lo ràpidament, utilitza un cable i un adaptador recomanats."</string>
+ <string name="battery_tip_incompatible_charging_message" product="tablet" msgid="5697523201841444736">"És possible que la tauleta s\'estigui carregant lentament o que no s\'estigui carregant. Per carregar-la ràpidament, utilitza un cable i un adaptador recomanats."</string>
<string name="lockscreen_trivial_controls_summary" product="default" msgid="42562533085885152">"Sense desbloquejar el telèfon"</string>
<string name="lockscreen_trivial_controls_summary" product="tablet" msgid="9052068482124729345">"Sense desbloquejar la tauleta"</string>
<string name="auto_rotate_summary_a11y" product="default" msgid="2813368383309985185">"Quan canvies entre el mode vertical i horitzontal al telèfon"</string>
diff --git a/res-product/values-cs/strings.xml b/res-product/values-cs/strings.xml
index f2d2453..c0c07d5 100644
--- a/res-product/values-cs/strings.xml
+++ b/res-product/values-cs/strings.xml
@@ -347,12 +347,9 @@
<string name="lockpassword_confirm_your_password_details_frp" product="default" msgid="1465326741724776281">"Telefon byl resetován do továrního nastavení. Chcete-li tento telefon použít, zadejte předchozí heslo."</string>
<string name="lockpassword_confirm_your_password_details_frp" product="tablet" msgid="1333164951750797865">"Tablet byl resetován do továrního nastavení. Chcete-li tento tablet použít, zadejte předchozí heslo."</string>
<string name="lockpassword_confirm_your_password_details_frp" product="device" msgid="116667646012224967">"Zařízení bylo resetováno do továrního nastavení. Chcete-li toto zařízení použít, zadejte předchozí heslo."</string>
- <!-- no translation found for battery_tip_incompatible_charging_message (5097154279720383707) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (4208335872169818919) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (5697523201841444736) -->
- <skip />
+ <string name="battery_tip_incompatible_charging_message" product="default" msgid="5097154279720383707">"Telefon se nabíjí pomalu nebo se nenabíjí vůbec. K rychlejšímu nabíjení použijte doporučený kabel a adaptér."</string>
+ <string name="battery_tip_incompatible_charging_message" product="device" msgid="4208335872169818919">"Zařízení se nabíjí pomalu nebo se nenabíjí vůbec. K rychlejšímu nabíjení použijte doporučený kabel a adaptér."</string>
+ <string name="battery_tip_incompatible_charging_message" product="tablet" msgid="5697523201841444736">"Tablet se nabíjí pomalu nebo se nenabíjí vůbec. K rychlejšímu nabíjení použijte doporučený kabel a adaptér."</string>
<string name="lockscreen_trivial_controls_summary" product="default" msgid="42562533085885152">"Bez odemknutí telefonu"</string>
<string name="lockscreen_trivial_controls_summary" product="tablet" msgid="9052068482124729345">"Bez odemknutí tabletu"</string>
<string name="auto_rotate_summary_a11y" product="default" msgid="2813368383309985185">"Když telefon otočíte z režimu na výšku do režimu na šířku nebo naopak"</string>
diff --git a/res-product/values-da/strings.xml b/res-product/values-da/strings.xml
index 9b59b6c..7225742 100644
--- a/res-product/values-da/strings.xml
+++ b/res-product/values-da/strings.xml
@@ -347,12 +347,9 @@
<string name="lockpassword_confirm_your_password_details_frp" product="default" msgid="1465326741724776281">"Fabriksindstillingerne er gendannet på telefonen. Angiv din tidligere adgangskode for at bruge den."</string>
<string name="lockpassword_confirm_your_password_details_frp" product="tablet" msgid="1333164951750797865">"Fabriksindstillingerne er gendannet på tabletten. Angiv din tidligere adgangskode for at bruge den."</string>
<string name="lockpassword_confirm_your_password_details_frp" product="device" msgid="116667646012224967">"Fabriksindstillingerne er gendannet på enheden. Angiv din tidligere adgangskode for at bruge den."</string>
- <!-- no translation found for battery_tip_incompatible_charging_message (5097154279720383707) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (4208335872169818919) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (5697523201841444736) -->
- <skip />
+ <string name="battery_tip_incompatible_charging_message" product="default" msgid="5097154279720383707">"Din telefon oplader muligvis langsomt eller slet ikke. Opnå hurtigere opladning ved at bruge et kabel og en adapter, som er anbefalet."</string>
+ <string name="battery_tip_incompatible_charging_message" product="device" msgid="4208335872169818919">"Din enhed oplader muligvis langsomt eller slet ikke. Opnå hurtigere opladning ved at bruge et kabel og en adapter, som er anbefalet."</string>
+ <string name="battery_tip_incompatible_charging_message" product="tablet" msgid="5697523201841444736">"Din tablet oplader muligvis langsomt eller slet ikke. Opnå hurtigere opladning ved at bruge et kabel og en adapter, som er anbefalet."</string>
<string name="lockscreen_trivial_controls_summary" product="default" msgid="42562533085885152">"Uden at låse op for din telefon"</string>
<string name="lockscreen_trivial_controls_summary" product="tablet" msgid="9052068482124729345">"Uden at låse op for din tablet"</string>
<string name="auto_rotate_summary_a11y" product="default" msgid="2813368383309985185">"Når du drejer telefonen til stående eller liggende format"</string>
diff --git a/res-product/values-de/strings.xml b/res-product/values-de/strings.xml
index 0ac0b0b..552073c 100644
--- a/res-product/values-de/strings.xml
+++ b/res-product/values-de/strings.xml
@@ -308,9 +308,9 @@
<string name="data_usage_auto_sync_on_dialog" product="default" msgid="7207326473052484970">"Wenn du im Web Änderungen an deinen Konten vornimmst, werden diese automatisch auf dein Telefon kopiert.\n\nIm Gegenzug werden bei manchen Konten automatisch alle Änderungen, die auf dem Telefon vorgenommen wurden, ins Web kopiert. Dazu gehören auch Google-Konten."</string>
<string name="data_usage_limit_dialog_mobile" product="tablet" msgid="5609616352941038118">"Mobile Daten werden deaktiviert, sobald das von dir festgelegte Limit erreicht wurde.\n\nDer dabei angesetzte Wert wird von deinem Tablet berechnet und kann von der Messung des genutzten Datenvolumens durch deinen Mobilfunkanbieter abweichen. Daher empfiehlt es sich, ein etwas niedrigeres Limit anzugeben."</string>
<string name="data_usage_limit_dialog_mobile" product="default" msgid="4552449053646826676">"Mobile Daten werden deaktiviert, sobald das von dir festgelegte Limit erreicht wurde.\n\nDer dabei angesetzte Wert wird von deinem Smartphone berechnet und kann von der Messung des genutzten Datenvolumens durch deinen Mobilfunkanbieter abweichen. Daher empfiehlt es sich, ein etwas niedrigeres Limit anzugeben."</string>
- <string name="user_settings_footer_text" product="device" msgid="8543171604218174424">"Du kannst dein Gerät teilen, indem du neue Nutzer hinzufügst. Jeder Nutzer hat einen privaten Bereich auf deinem Gerät für benutzerdefinierte Startbildschirme, Konten, Apps, Einstellungen usw."</string>
- <string name="user_settings_footer_text" product="tablet" msgid="4749331578207116797">"Wenn auch andere Nutzer dein Tablet verwenden dürfen, kannst du ihm neue Nutzer hinzufügen. Jeder Nutzer erhält auf deinem Tablet seinen privaten Bereich für benutzerdefinierte Startbildschirme, Konten, Apps, Einstellungen usw."</string>
- <string name="user_settings_footer_text" product="default" msgid="5440172971747221370">"Wenn du dein Smartphone mit anderen teilen möchtest, kannst du neue Nutzer hinzufügen. Jeder Nutzer erhält auf deinem Smartphone einen privaten Bereich für eigene Startbildschirme, Konten, Apps, Einstellungen usw."</string>
+ <string name="user_settings_footer_text" product="device" msgid="8543171604218174424">"Du kannst dein Gerät teilen, indem du neue Nutzer hinzufügst. Jeder Nutzer hat ein privates Profil auf deinem Gerät für benutzerdefinierte Startbildschirme, Konten, Apps, Einstellungen usw."</string>
+ <string name="user_settings_footer_text" product="tablet" msgid="4749331578207116797">"Wenn auch andere Nutzer dein Tablet verwenden dürfen, kannst du ihm neue Nutzer hinzufügen. Jeder Nutzer erhält auf deinem Tablet sein privates Profil für benutzerdefinierte Startbildschirme, Konten, Apps, Einstellungen usw."</string>
+ <string name="user_settings_footer_text" product="default" msgid="5440172971747221370">"Wenn du dein Smartphone mit anderen teilen möchtest, kannst du neue Nutzer hinzufügen. Jeder Nutzer erhält auf deinem Smartphone ein privates Profil für eigene Startbildschirme, Konten, Apps, Einstellungen usw."</string>
<string name="user_cannot_manage_message" product="tablet" msgid="5566619500245432179">"Nur der Eigentümer des Tablets kann Nutzer verwalten."</string>
<string name="user_cannot_manage_message" product="default" msgid="8596259161937605316">"Nur der Eigentümer des Telefons kann Nutzer verwalten."</string>
<string name="user_confirm_remove_self_message" product="tablet" msgid="6880861846664267876">"Dein Profil und deine Daten werden vom Tablet entfernt. Du kannst diese Aktion nicht rückgängig machen."</string>
@@ -347,12 +347,9 @@
<string name="lockpassword_confirm_your_password_details_frp" product="default" msgid="1465326741724776281">"Smartphone wurde auf Werkseinstellungen zurückgesetzt. Zum Verwenden vorheriges Passwort eingeben."</string>
<string name="lockpassword_confirm_your_password_details_frp" product="tablet" msgid="1333164951750797865">"Tablet wurde auf Werkseinstellungen zurückgesetzt. Zum Verwenden vorheriges Passwort eingeben."</string>
<string name="lockpassword_confirm_your_password_details_frp" product="device" msgid="116667646012224967">"Gerät wurde auf Werkseinstellungen zurückgesetzt. Zum Verwenden vorheriges Passwort eingeben."</string>
- <!-- no translation found for battery_tip_incompatible_charging_message (5097154279720383707) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (4208335872169818919) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (5697523201841444736) -->
- <skip />
+ <string name="battery_tip_incompatible_charging_message" product="default" msgid="5097154279720383707">"Dein Smartphone lädt möglicherweise langsamer oder gar nicht. Damit es schneller lädt, solltest du ein empfohlenes Kabel und Netzteil verwenden."</string>
+ <string name="battery_tip_incompatible_charging_message" product="device" msgid="4208335872169818919">"Dein Gerät lädt möglicherweise langsamer oder gar nicht. Damit es schneller lädt, solltest du ein empfohlenes Kabel und Netzteil verwenden."</string>
+ <string name="battery_tip_incompatible_charging_message" product="tablet" msgid="5697523201841444736">"Dein Tablet lädt möglicherweise langsamer oder gar nicht. Damit es schneller lädt, solltest du ein empfohlenes Kabel und Netzteil verwenden."</string>
<string name="lockscreen_trivial_controls_summary" product="default" msgid="42562533085885152">"Ohne dein Smartphone zu entsperren"</string>
<string name="lockscreen_trivial_controls_summary" product="tablet" msgid="9052068482124729345">"Ohne dein Tablet zu entsperren"</string>
<string name="auto_rotate_summary_a11y" product="default" msgid="2813368383309985185">"Wenn du das Smartphone drehst"</string>
diff --git a/res-product/values-el/strings.xml b/res-product/values-el/strings.xml
index f5c1e38..fc0e35e 100644
--- a/res-product/values-el/strings.xml
+++ b/res-product/values-el/strings.xml
@@ -347,12 +347,9 @@
<string name="lockpassword_confirm_your_password_details_frp" product="default" msgid="1465326741724776281">"Έγινε επαναφ. των εργοστ. ρυθμ. τηλεφ. Για να χρησιμ. το τηλέφ. εισαγάγ. τον παλιό κωδ. πρόσβασης."</string>
<string name="lockpassword_confirm_your_password_details_frp" product="tablet" msgid="1333164951750797865">"Έγινε επαναφορά των εργοστ. ρυθμίσ. του tablet. Για να χρησ. το tablet εισαγ. τον προηγ. κωδ. πρόσβ."</string>
<string name="lockpassword_confirm_your_password_details_frp" product="device" msgid="116667646012224967">"Έγινε επαναφ. των εργοστ. ρυθμίσ. της συσκευής. Για να χρησ. τη συσκ. εισαγ. τον προηγ. κωδ. πρόσβ."</string>
- <!-- no translation found for battery_tip_incompatible_charging_message (5097154279720383707) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (4208335872169818919) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (5697523201841444736) -->
- <skip />
+ <string name="battery_tip_incompatible_charging_message" product="default" msgid="5097154279720383707">"Το τηλέφωνό σας μπορεί να φορτίζει αργά ή να μην φορτίζει. Για πιο γρήγορη φόρτιση, χρησιμοποιήστε ένα προτεινόμενο καλώδιο και μετασχηματιστή."</string>
+ <string name="battery_tip_incompatible_charging_message" product="device" msgid="4208335872169818919">"Η συσκευή σας μπορεί να φορτίζει αργά ή να μην φορτίζει. Για πιο γρήγορη φόρτιση, χρησιμοποιήστε ένα προτεινόμενο καλώδιο και μετασχηματιστή."</string>
+ <string name="battery_tip_incompatible_charging_message" product="tablet" msgid="5697523201841444736">"Το tablet σας μπορεί να φορτίζει αργά ή να μην φορτίζει. Για πιο γρήγορη φόρτιση, χρησιμοποιήστε ένα προτεινόμενο καλώδιο και μετασχηματιστή."</string>
<string name="lockscreen_trivial_controls_summary" product="default" msgid="42562533085885152">"Χωρίς να ξεκλειδώσετε το τηλέφωνό σας"</string>
<string name="lockscreen_trivial_controls_summary" product="tablet" msgid="9052068482124729345">"Χωρίς να ξεκλειδώσετε το tablet σας"</string>
<string name="auto_rotate_summary_a11y" product="default" msgid="2813368383309985185">"Όταν μετακινείτε το τηλέφωνο σε κατακόρυφο ή οριζόντιο προσανατολισμό"</string>
diff --git a/res-product/values-en-rAU/strings.xml b/res-product/values-en-rAU/strings.xml
index 6a2b50d..a22553a 100644
--- a/res-product/values-en-rAU/strings.xml
+++ b/res-product/values-en-rAU/strings.xml
@@ -347,12 +347,9 @@
<string name="lockpassword_confirm_your_password_details_frp" product="default" msgid="1465326741724776281">"Your phone was reset to factory settings. To use this phone, enter your previous password."</string>
<string name="lockpassword_confirm_your_password_details_frp" product="tablet" msgid="1333164951750797865">"Your tablet was reset to factory settings. To use this tablet, enter your previous password."</string>
<string name="lockpassword_confirm_your_password_details_frp" product="device" msgid="116667646012224967">"Your device was reset to factory settings. To use this device, enter your previous password."</string>
- <!-- no translation found for battery_tip_incompatible_charging_message (5097154279720383707) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (4208335872169818919) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (5697523201841444736) -->
- <skip />
+ <string name="battery_tip_incompatible_charging_message" product="default" msgid="5097154279720383707">"Your phone may be charging slowly or not charging. For faster charging, use a recommended cable and adapter."</string>
+ <string name="battery_tip_incompatible_charging_message" product="device" msgid="4208335872169818919">"Your device may be charging slowly or not charging. For faster charging, use a recommended cable and adapter."</string>
+ <string name="battery_tip_incompatible_charging_message" product="tablet" msgid="5697523201841444736">"Your tablet may be charging slowly or not charging. For faster charging, use a recommended cable and adapter."</string>
<string name="lockscreen_trivial_controls_summary" product="default" msgid="42562533085885152">"Without unlocking your phone"</string>
<string name="lockscreen_trivial_controls_summary" product="tablet" msgid="9052068482124729345">"Without unlocking your tablet"</string>
<string name="auto_rotate_summary_a11y" product="default" msgid="2813368383309985185">"When you move your phone between portrait and landscape"</string>
diff --git a/res-product/values-en-rGB/strings.xml b/res-product/values-en-rGB/strings.xml
index 5f7cd7b..6e2f89f 100644
--- a/res-product/values-en-rGB/strings.xml
+++ b/res-product/values-en-rGB/strings.xml
@@ -347,12 +347,9 @@
<string name="lockpassword_confirm_your_password_details_frp" product="default" msgid="1465326741724776281">"Your phone was reset to factory settings. To use this phone, enter your previous password."</string>
<string name="lockpassword_confirm_your_password_details_frp" product="tablet" msgid="1333164951750797865">"Your tablet was reset to factory settings. To use this tablet, enter your previous password."</string>
<string name="lockpassword_confirm_your_password_details_frp" product="device" msgid="116667646012224967">"Your device was reset to factory settings. To use this device, enter your previous password."</string>
- <!-- no translation found for battery_tip_incompatible_charging_message (5097154279720383707) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (4208335872169818919) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (5697523201841444736) -->
- <skip />
+ <string name="battery_tip_incompatible_charging_message" product="default" msgid="5097154279720383707">"Your phone may be charging slowly or not charging. For faster charging, use a recommended cable and adapter."</string>
+ <string name="battery_tip_incompatible_charging_message" product="device" msgid="4208335872169818919">"Your device may be charging slowly or not charging. For faster charging, use a recommended cable and adapter."</string>
+ <string name="battery_tip_incompatible_charging_message" product="tablet" msgid="5697523201841444736">"Your tablet may be charging slowly or not charging. For faster charging, use a recommended cable and adapter."</string>
<string name="lockscreen_trivial_controls_summary" product="default" msgid="42562533085885152">"Without unlocking your phone"</string>
<string name="lockscreen_trivial_controls_summary" product="tablet" msgid="9052068482124729345">"Without unlocking your tablet"</string>
<string name="auto_rotate_summary_a11y" product="default" msgid="2813368383309985185">"When you move your phone between portrait and landscape"</string>
diff --git a/res-product/values-en-rIN/strings.xml b/res-product/values-en-rIN/strings.xml
index 5f7cd7b..6e2f89f 100644
--- a/res-product/values-en-rIN/strings.xml
+++ b/res-product/values-en-rIN/strings.xml
@@ -347,12 +347,9 @@
<string name="lockpassword_confirm_your_password_details_frp" product="default" msgid="1465326741724776281">"Your phone was reset to factory settings. To use this phone, enter your previous password."</string>
<string name="lockpassword_confirm_your_password_details_frp" product="tablet" msgid="1333164951750797865">"Your tablet was reset to factory settings. To use this tablet, enter your previous password."</string>
<string name="lockpassword_confirm_your_password_details_frp" product="device" msgid="116667646012224967">"Your device was reset to factory settings. To use this device, enter your previous password."</string>
- <!-- no translation found for battery_tip_incompatible_charging_message (5097154279720383707) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (4208335872169818919) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (5697523201841444736) -->
- <skip />
+ <string name="battery_tip_incompatible_charging_message" product="default" msgid="5097154279720383707">"Your phone may be charging slowly or not charging. For faster charging, use a recommended cable and adapter."</string>
+ <string name="battery_tip_incompatible_charging_message" product="device" msgid="4208335872169818919">"Your device may be charging slowly or not charging. For faster charging, use a recommended cable and adapter."</string>
+ <string name="battery_tip_incompatible_charging_message" product="tablet" msgid="5697523201841444736">"Your tablet may be charging slowly or not charging. For faster charging, use a recommended cable and adapter."</string>
<string name="lockscreen_trivial_controls_summary" product="default" msgid="42562533085885152">"Without unlocking your phone"</string>
<string name="lockscreen_trivial_controls_summary" product="tablet" msgid="9052068482124729345">"Without unlocking your tablet"</string>
<string name="auto_rotate_summary_a11y" product="default" msgid="2813368383309985185">"When you move your phone between portrait and landscape"</string>
diff --git a/res-product/values-es-rUS/strings.xml b/res-product/values-es-rUS/strings.xml
index ddbb0fc..c0b27c0 100644
--- a/res-product/values-es-rUS/strings.xml
+++ b/res-product/values-es-rUS/strings.xml
@@ -347,12 +347,9 @@
<string name="lockpassword_confirm_your_password_details_frp" product="default" msgid="1465326741724776281">"Configuración de fábrica restablecida. Para usar este teléfono, ingresa la contraseña anterior."</string>
<string name="lockpassword_confirm_your_password_details_frp" product="tablet" msgid="1333164951750797865">"Configuración de fábrica restablecida. Para usar esta tablet, ingresa la contraseña anterior."</string>
<string name="lockpassword_confirm_your_password_details_frp" product="device" msgid="116667646012224967">"Configuración de fábrica restablecida. Para usar el dispositivo, ingresa la contraseña anterior."</string>
- <!-- no translation found for battery_tip_incompatible_charging_message (5097154279720383707) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (4208335872169818919) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (5697523201841444736) -->
- <skip />
+ <string name="battery_tip_incompatible_charging_message" product="default" msgid="5097154279720383707">"Es posible que tu teléfono se esté cargando lentamente o no se esté cargando. Para una carga más rápida, usa un cable y un adaptador recomendados."</string>
+ <string name="battery_tip_incompatible_charging_message" product="device" msgid="4208335872169818919">"Es posible que tu dispositivo se esté cargando lentamente o no se esté cargando. Para una carga más rápida, usa un cable y un adaptador recomendados."</string>
+ <string name="battery_tip_incompatible_charging_message" product="tablet" msgid="5697523201841444736">"Es posible que tu tablet se esté cargando lentamente o no se esté cargando. Para una carga más rápida, usa un cable y un adaptador recomendados."</string>
<string name="lockscreen_trivial_controls_summary" product="default" msgid="42562533085885152">"Sin desbloquear tu teléfono"</string>
<string name="lockscreen_trivial_controls_summary" product="tablet" msgid="9052068482124729345">"Sin desbloquear tu tablet"</string>
<string name="auto_rotate_summary_a11y" product="default" msgid="2813368383309985185">"Cuando muevas el teléfono entre el modo vertical y el horizontal"</string>
diff --git a/res-product/values-es/strings.xml b/res-product/values-es/strings.xml
index 81ab874..657202b 100644
--- a/res-product/values-es/strings.xml
+++ b/res-product/values-es/strings.xml
@@ -347,12 +347,9 @@
<string name="lockpassword_confirm_your_password_details_frp" product="default" msgid="1465326741724776281">"Ajustes de fábrica del teléfono restablecidos. Para usarlo, introduce tu contraseña anterior."</string>
<string name="lockpassword_confirm_your_password_details_frp" product="tablet" msgid="1333164951750797865">"Ajustes de fábrica de la tablet restablecidos. Para usarla, introduce tu contraseña anterior."</string>
<string name="lockpassword_confirm_your_password_details_frp" product="device" msgid="116667646012224967">"Ajustes de fábrica del dispositivo restablecidos. Para usarlo, introduce tu contraseña anterior."</string>
- <!-- no translation found for battery_tip_incompatible_charging_message (5097154279720383707) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (4208335872169818919) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (5697523201841444736) -->
- <skip />
+ <string name="battery_tip_incompatible_charging_message" product="default" msgid="5097154279720383707">"Es posible que el teléfono se esté cargando muy lentamente o no se esté cargando. Para que se cargue más rápido, usa un cable y un adaptador recomendados."</string>
+ <string name="battery_tip_incompatible_charging_message" product="device" msgid="4208335872169818919">"Es posible que el dispositivo se esté cargando muy lentamente o no se esté cargando. Para que se cargue más rápido, usa un cable y un adaptador recomendados."</string>
+ <string name="battery_tip_incompatible_charging_message" product="tablet" msgid="5697523201841444736">"Es posible que la tablet se esté cargando muy lentamente o no se esté cargando. Para que se cargue más rápido, usa un cable y un adaptador recomendados."</string>
<string name="lockscreen_trivial_controls_summary" product="default" msgid="42562533085885152">"Sin desbloquear tu teléfono"</string>
<string name="lockscreen_trivial_controls_summary" product="tablet" msgid="9052068482124729345">"Sin desbloquear tu tablet"</string>
<string name="auto_rotate_summary_a11y" product="default" msgid="2813368383309985185">"Cuando cambias el teléfono entre vertical y horizontal"</string>
diff --git a/res-product/values-et/strings.xml b/res-product/values-et/strings.xml
index e141b84..d0881ee 100644
--- a/res-product/values-et/strings.xml
+++ b/res-product/values-et/strings.xml
@@ -347,12 +347,9 @@
<string name="lockpassword_confirm_your_password_details_frp" product="default" msgid="1465326741724776281">"Telefon lähtestati tehaseseadetele. Telefoni kasutamiseks sisestage oma eelmine parool."</string>
<string name="lockpassword_confirm_your_password_details_frp" product="tablet" msgid="1333164951750797865">"Tahvelarvuti lähtestati tehaseseadetele. Tahvelarvuti kasutamiseks sisestage oma eelmine parool."</string>
<string name="lockpassword_confirm_your_password_details_frp" product="device" msgid="116667646012224967">"Seade lähtestati tehaseseadetele. Seadme kasutamiseks sisestage oma eelmine parool."</string>
- <!-- no translation found for battery_tip_incompatible_charging_message (5097154279720383707) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (4208335872169818919) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (5697523201841444736) -->
- <skip />
+ <string name="battery_tip_incompatible_charging_message" product="default" msgid="5097154279720383707">"Teie telefoni võidakse laadida aeglaselt või üldse mitte. Kiiremaks laadimiseks kasutage soovitatavat kaablit ja adapterit."</string>
+ <string name="battery_tip_incompatible_charging_message" product="device" msgid="4208335872169818919">"Teie seadet võidakse laadida aeglaselt või üldse mitte. Kiiremaks laadimiseks kasutage soovitatavat kaablit ja adapterit."</string>
+ <string name="battery_tip_incompatible_charging_message" product="tablet" msgid="5697523201841444736">"Teie tahvelarvutit võidakse laadida aeglaselt või üldse mitte. Kiiremaks laadimiseks kasutage soovitatavat kaablit ja adapterit."</string>
<string name="lockscreen_trivial_controls_summary" product="default" msgid="42562533085885152">"Ilma telefoni avamata"</string>
<string name="lockscreen_trivial_controls_summary" product="tablet" msgid="9052068482124729345">"Ilma tahvelarvutit avamata"</string>
<string name="auto_rotate_summary_a11y" product="default" msgid="2813368383309985185">"Liigutades telefoni vertikaal- ja horisontaalrežiimi vahel"</string>
diff --git a/res-product/values-eu/strings.xml b/res-product/values-eu/strings.xml
index a91b9b6..e74a624 100644
--- a/res-product/values-eu/strings.xml
+++ b/res-product/values-eu/strings.xml
@@ -347,12 +347,9 @@
<string name="lockpassword_confirm_your_password_details_frp" product="default" msgid="1465326741724776281">"Telefonoaren jatorrizko ezarpenak berrezarri dira. Telefonoa erabiltzeko, idatzi aurreko pasahitza."</string>
<string name="lockpassword_confirm_your_password_details_frp" product="tablet" msgid="1333164951750797865">"Tabletaren jatorrizko ezarpenak berrezarri dira. Tableta erabiltzeko, idatzi aurreko pasahitza."</string>
<string name="lockpassword_confirm_your_password_details_frp" product="device" msgid="116667646012224967">"Gailuaren jatorrizko ezarpenak berrezarri dira. Gailua erabiltzeko, idatzi aurreko pasahitza."</string>
- <!-- no translation found for battery_tip_incompatible_charging_message (5097154279720383707) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (4208335872169818919) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (5697523201841444736) -->
- <skip />
+ <string name="battery_tip_incompatible_charging_message" product="default" msgid="5097154279720383707">"Agian telefonoa ez da kargatzen ari edo oso mantso kargatzen ari da. Bizkorrago karga dadin, erabili gomendatutako egokigailu bat eta kable bat."</string>
+ <string name="battery_tip_incompatible_charging_message" product="device" msgid="4208335872169818919">"Agian gailua ez da kargatzen ari edo oso mantso kargatzen ari da. Bizkorrago karga dadin, erabili gomendatutako egokigailu bat eta kable bat."</string>
+ <string name="battery_tip_incompatible_charging_message" product="tablet" msgid="5697523201841444736">"Agian tableta ez da kargatzen ari edo oso mantso kargatzen ari da. Bizkorrago karga dadin, erabili gomendatutako egokigailu bat eta kable bat."</string>
<string name="lockscreen_trivial_controls_summary" product="default" msgid="42562533085885152">"Telefonoa desblokeatu gabe"</string>
<string name="lockscreen_trivial_controls_summary" product="tablet" msgid="9052068482124729345">"Tableta desblokeatu gabe"</string>
<string name="auto_rotate_summary_a11y" product="default" msgid="2813368383309985185">"Telefonoaren pantailaren orientazioa bertikaletik horizontalera, eta alderantziz, aldatzen duzunean"</string>
diff --git a/res-product/values-fa/strings.xml b/res-product/values-fa/strings.xml
index ad77798..cd7a52f 100644
--- a/res-product/values-fa/strings.xml
+++ b/res-product/values-fa/strings.xml
@@ -347,12 +347,9 @@
<string name="lockpassword_confirm_your_password_details_frp" product="default" msgid="1465326741724776281">"تلفن به تنظیمات کارخانه بازنشانی شده است. برای استفاده از این تلفن، گذرواژه قبلی را وارد کنید."</string>
<string name="lockpassword_confirm_your_password_details_frp" product="tablet" msgid="1333164951750797865">"رایانه لوحی به تنظیمات کارخانه بازنشانی شده است. برای استفاده از این رایانه لوحی، گذرواژه قبلی را وارد کنید."</string>
<string name="lockpassword_confirm_your_password_details_frp" product="device" msgid="116667646012224967">"دستگاه به تنظیمات کارخانه بازنشانی شده است. برای استفاده از این دستگاه، گذرواژه قبلی را وارد کنید."</string>
- <!-- no translation found for battery_tip_incompatible_charging_message (5097154279720383707) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (4208335872169818919) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (5697523201841444736) -->
- <skip />
+ <string name="battery_tip_incompatible_charging_message" product="default" msgid="5097154279720383707">"ممکن است تلفن شارژ نشود یا سرعت شارژ کم باشد. برای شارژ سریعتر، از کابل و آداپتور توصیهشده استفاده کنید."</string>
+ <string name="battery_tip_incompatible_charging_message" product="device" msgid="4208335872169818919">"ممکن است دستگاه شارژ نشود یا سرعت شارژ کم باشد. برای شارژ سریعتر، از کابل و آداپتور توصیهشده استفاده کنید."</string>
+ <string name="battery_tip_incompatible_charging_message" product="tablet" msgid="5697523201841444736">"ممکن است رایانه لوحی شارژ نشود یا سرعت شارژ کم باشد. برای شارژ سریعتر، از کابل و آداپتور توصیهشده استفاده کنید."</string>
<string name="lockscreen_trivial_controls_summary" product="default" msgid="42562533085885152">"بدون باز کردن قفل تلفن"</string>
<string name="lockscreen_trivial_controls_summary" product="tablet" msgid="9052068482124729345">"بدون باز کردن قفل رایانه لوحی"</string>
<string name="auto_rotate_summary_a11y" product="default" msgid="2813368383309985185">"وقتی تلفن را بین حالت افقی و عمودی جابهجا میکنید"</string>
diff --git a/res-product/values-fi/strings.xml b/res-product/values-fi/strings.xml
index 49aaa93..3d93665 100644
--- a/res-product/values-fi/strings.xml
+++ b/res-product/values-fi/strings.xml
@@ -347,12 +347,9 @@
<string name="lockpassword_confirm_your_password_details_frp" product="default" msgid="1465326741724776281">"Puhelimen laiteasetukset palautettiin. Jos haluat käyttää tätä puhelinta, lisää aiempi salasana."</string>
<string name="lockpassword_confirm_your_password_details_frp" product="tablet" msgid="1333164951750797865">"Tabletin tehdasasetukset palautettiin. Käytä tablettia lisäämällä aiempi salasana."</string>
<string name="lockpassword_confirm_your_password_details_frp" product="device" msgid="116667646012224967">"Laitteen tehdasasetukset palautettiin. Käytä laitetta lisäämällä aiempi salasana."</string>
- <!-- no translation found for battery_tip_incompatible_charging_message (5097154279720383707) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (4208335872169818919) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (5697523201841444736) -->
- <skip />
+ <string name="battery_tip_incompatible_charging_message" product="default" msgid="5097154279720383707">"Puhelin saattaa latautua hitaasti tai ei lainkaan. Käytä suositeltua johtoa ja laturia, jotta akku latautuu nopeammin."</string>
+ <string name="battery_tip_incompatible_charging_message" product="device" msgid="4208335872169818919">"Laite saattaa latautua hitaasti tai ei lainkaan. Käytä suositeltua johtoa ja laturia, jotta akku latautuu nopeammin."</string>
+ <string name="battery_tip_incompatible_charging_message" product="tablet" msgid="5697523201841444736">"Tabletti saattaa latautua hitaasti tai ei lainkaan. Käytä suositeltua johtoa ja laturia, jotta akku latautuu nopeammin."</string>
<string name="lockscreen_trivial_controls_summary" product="default" msgid="42562533085885152">"Avaamatta puhelimen lukitusta"</string>
<string name="lockscreen_trivial_controls_summary" product="tablet" msgid="9052068482124729345">"Avaamatta tabletin lukitusta"</string>
<string name="auto_rotate_summary_a11y" product="default" msgid="2813368383309985185">"Kun käännät puhelimen pysty- tai vaaka-asentoon"</string>
diff --git a/res-product/values-fr-rCA/strings.xml b/res-product/values-fr-rCA/strings.xml
index aa23b80..5f55424 100644
--- a/res-product/values-fr-rCA/strings.xml
+++ b/res-product/values-fr-rCA/strings.xml
@@ -347,12 +347,9 @@
<string name="lockpassword_confirm_your_password_details_frp" product="default" msgid="1465326741724776281">"Téléphone réinitialisé aux paramètres par défaut Pour l\'utiliser, entrez votre ancien mot de passe."</string>
<string name="lockpassword_confirm_your_password_details_frp" product="tablet" msgid="1333164951750797865">"Tablette réinitialisée aux paramètres par défaut. Pour l\'utiliser, entrez votre ancien mot de passe."</string>
<string name="lockpassword_confirm_your_password_details_frp" product="device" msgid="116667646012224967">"Appareil réinitialisé aux paramètres par défaut. Pour l\'utiliser, entrez votre ancien mot de passe."</string>
- <!-- no translation found for battery_tip_incompatible_charging_message (5097154279720383707) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (4208335872169818919) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (5697523201841444736) -->
- <skip />
+ <string name="battery_tip_incompatible_charging_message" product="default" msgid="5097154279720383707">"Votre téléphone pourrait se recharger lentement ou ne pas se recharger. Pour une recharge plus rapide, utilisez un adaptateur et un câble recommandés."</string>
+ <string name="battery_tip_incompatible_charging_message" product="device" msgid="4208335872169818919">"Votre appareil pourrait se recharger lentement ou ne pas se recharger. Pour une recharge plus rapide, utilisez un adaptateur et un câble recommandés."</string>
+ <string name="battery_tip_incompatible_charging_message" product="tablet" msgid="5697523201841444736">"Votre tablette pourrait se recharger lentement ou ne pas se recharger. Pour une recharge plus rapide, utilisez un adaptateur et un câble recommandés."</string>
<string name="lockscreen_trivial_controls_summary" product="default" msgid="42562533085885152">"Sans déverrouiller votre téléphone"</string>
<string name="lockscreen_trivial_controls_summary" product="tablet" msgid="9052068482124729345">"Sans déverrouiller votre tablette"</string>
<string name="auto_rotate_summary_a11y" product="default" msgid="2813368383309985185">"Lorsque vous orientez votre téléphone entre les modes portrait et paysage"</string>
diff --git a/res-product/values-fr/strings.xml b/res-product/values-fr/strings.xml
index 222d414..07d19e3 100644
--- a/res-product/values-fr/strings.xml
+++ b/res-product/values-fr/strings.xml
@@ -347,12 +347,9 @@
<string name="lockpassword_confirm_your_password_details_frp" product="default" msgid="1465326741724776281">"Configuration d\'usine du téléphone rétablie. Pour l\'utiliser, saisissez votre mot passe précédent."</string>
<string name="lockpassword_confirm_your_password_details_frp" product="tablet" msgid="1333164951750797865">"Configuration d\'usine de la tablette rétablie. Pour l\'utiliser, saisissez le mot de passe précédent."</string>
<string name="lockpassword_confirm_your_password_details_frp" product="device" msgid="116667646012224967">"Configuration d\'usine de l\'appareil rétablie. Pour l\'utiliser, saisissez le mot de passe précédent."</string>
- <!-- no translation found for battery_tip_incompatible_charging_message (5097154279720383707) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (4208335872169818919) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (5697523201841444736) -->
- <skip />
+ <string name="battery_tip_incompatible_charging_message" product="default" msgid="5097154279720383707">"Votre téléphone se recharge peut-être lentement ou pas du tout. Pour une recharge plus rapide, utilisez un câble et un adaptateur recommandés."</string>
+ <string name="battery_tip_incompatible_charging_message" product="device" msgid="4208335872169818919">"Votre appareil se recharge peut-être lentement ou pas du tout. Pour une recharge plus rapide, utilisez un câble et un adaptateur recommandés."</string>
+ <string name="battery_tip_incompatible_charging_message" product="tablet" msgid="5697523201841444736">"Votre tablette se recharge peut-être lentement ou pas du tout. Pour une recharge plus rapide, utilisez un câble et un adaptateur recommandés."</string>
<string name="lockscreen_trivial_controls_summary" product="default" msgid="42562533085885152">"Sans déverrouiller votre téléphone"</string>
<string name="lockscreen_trivial_controls_summary" product="tablet" msgid="9052068482124729345">"Sans déverrouiller votre tablette"</string>
<string name="auto_rotate_summary_a11y" product="default" msgid="2813368383309985185">"Quand vous basculez votre téléphone en mode portrait ou paysage"</string>
diff --git a/res-product/values-gl/strings.xml b/res-product/values-gl/strings.xml
index b3bbcc4..62c14dc 100644
--- a/res-product/values-gl/strings.xml
+++ b/res-product/values-gl/strings.xml
@@ -347,12 +347,9 @@
<string name="lockpassword_confirm_your_password_details_frp" product="default" msgid="1465326741724776281">"Restableceuse a configuración de fábrica do teléfono. Para usalo, pon o contrasinal anterior."</string>
<string name="lockpassword_confirm_your_password_details_frp" product="tablet" msgid="1333164951750797865">"Restableceuse a configuración de fábrica da tableta. Para usala, pon o contrasinal anterior."</string>
<string name="lockpassword_confirm_your_password_details_frp" product="device" msgid="116667646012224967">"Restableceuse a configuración de fábrica do dispositivo. Para usalo, pon o contrasinal anterior."</string>
- <!-- no translation found for battery_tip_incompatible_charging_message (5097154279720383707) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (4208335872169818919) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (5697523201841444736) -->
- <skip />
+ <string name="battery_tip_incompatible_charging_message" product="default" msgid="5097154279720383707">"É posible que o teu teléfono estea cargando lentamente ou non cargue. Para acelerar a carga, usa un adaptador e un cable recomendados."</string>
+ <string name="battery_tip_incompatible_charging_message" product="device" msgid="4208335872169818919">"É posible que o teu dispositivo estea cargando lentamente ou non cargue. Para acelerar a carga, usa un adaptador e un cable recomendados."</string>
+ <string name="battery_tip_incompatible_charging_message" product="tablet" msgid="5697523201841444736">"É posible que a túa tableta estea cargando lentamente ou non cargue. Para acelerar a carga, usa un adaptador e un cable recomendados."</string>
<string name="lockscreen_trivial_controls_summary" product="default" msgid="42562533085885152">"Sen desbloquear o teléfono"</string>
<string name="lockscreen_trivial_controls_summary" product="tablet" msgid="9052068482124729345">"Sen desbloquear a tableta"</string>
<string name="auto_rotate_summary_a11y" product="default" msgid="2813368383309985185">"Ao cambiar o teléfono do modo vertical ao horizontal"</string>
diff --git a/res-product/values-gu/strings.xml b/res-product/values-gu/strings.xml
index b741021..19edabe 100644
--- a/res-product/values-gu/strings.xml
+++ b/res-product/values-gu/strings.xml
@@ -347,12 +347,9 @@
<string name="lockpassword_confirm_your_password_details_frp" product="default" msgid="1465326741724776281">"ફોન ફેક્ટરી સેટિંગ પર રીસેટ કરવામાં આવ્યો છે. આ ફોનનો ઉપયોગ કરવા માટે તમારો અગાઉનો પાસવર્ડ દાખલ કરો."</string>
<string name="lockpassword_confirm_your_password_details_frp" product="tablet" msgid="1333164951750797865">"તમારું ટૅબ્લેટ ફેક્ટરી સેટિંગ પર રીસેટ કરાયું છે. આ ટૅબ્લેટનો ઉપયોગ કરવા, તમારો અગાઉનો પાસવર્ડ દાખલ કરો."</string>
<string name="lockpassword_confirm_your_password_details_frp" product="device" msgid="116667646012224967">"તમારું ડિવાઇસ ફેક્ટરી સેટિંગ પર રીસેટ કરાયું છે. આ ડિવાઇસનો ઉપયોગ કરવા, અગાઉનો પાસવર્ડ દાખલ કરો."</string>
- <!-- no translation found for battery_tip_incompatible_charging_message (5097154279720383707) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (4208335872169818919) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (5697523201841444736) -->
- <skip />
+ <string name="battery_tip_incompatible_charging_message" product="default" msgid="5097154279720383707">"તમારો ફોન ધીમે ચાર્જ થઈ રહ્યો હોય અથવા ચાર્જ ન થઈ રહ્યો હોય એવું બની શકે છે. વધુ ઝડપી ચાર્જિંગ માટે, સુઝાવ આપેલા કેબલ અને અડૅપ્ટરનો ઉપયોગ કરો."</string>
+ <string name="battery_tip_incompatible_charging_message" product="device" msgid="4208335872169818919">"તમારું ડિવાઇસ ધીમે ચાર્જ થઈ રહ્યું હોય અથવા ચાર્જ ન થઈ રહ્યું હોય એવું બની શકે છે. વધુ ઝડપી ચાર્જિંગ માટે, સુઝાવ આપેલા કેબલ અને અડૅપ્ટરનો ઉપયોગ કરો."</string>
+ <string name="battery_tip_incompatible_charging_message" product="tablet" msgid="5697523201841444736">"તમારું ટૅબ્લેટ ધીમે ચાર્જ થઈ રહ્યું હોય અથવા ચાર્જ ન થઈ રહ્યું હોય એવું બની શકે છે. વધુ ઝડપી ચાર્જિંગ માટે, સુઝાવ આપેલા કેબલ અને અડૅપ્ટરનો ઉપયોગ કરો."</string>
<string name="lockscreen_trivial_controls_summary" product="default" msgid="42562533085885152">"તમારો ફોન અનલૉક કર્યા વિના"</string>
<string name="lockscreen_trivial_controls_summary" product="tablet" msgid="9052068482124729345">"તમારું ટૅબ્લેટ અનલૉક કર્યા વિના"</string>
<string name="auto_rotate_summary_a11y" product="default" msgid="2813368383309985185">"તમારા ફોનને પોર્ટ્રેટ અને લૅન્ડસ્કેપ વચ્ચેની સ્થિતિમાં ખસેડતી વખતે"</string>
diff --git a/res-product/values-hi/strings.xml b/res-product/values-hi/strings.xml
index 305deda..f44ecad 100644
--- a/res-product/values-hi/strings.xml
+++ b/res-product/values-hi/strings.xml
@@ -347,12 +347,9 @@
<string name="lockpassword_confirm_your_password_details_frp" product="default" msgid="1465326741724776281">"आपका फ़ोन, फ़ैक्ट्री सेटिंग पर रीसेट किया गया था. इस फ़ोन को चलाने के लिए, पिछला पासवर्ड डालें."</string>
<string name="lockpassword_confirm_your_password_details_frp" product="tablet" msgid="1333164951750797865">"आपका टैबलेट, फ़ैक्ट्री सेटिंग पर रीसेट किया गया था. इस टैबलेट को चलाने के लिए, पिछला पासवर्ड डालें."</string>
<string name="lockpassword_confirm_your_password_details_frp" product="device" msgid="116667646012224967">"आपका डिवाइस, फ़ैक्ट्री सेटिंग पर रीसेट किया गया था. इस डिवाइस को चलाने के लिए, पिछला पासवर्ड डालें."</string>
- <!-- no translation found for battery_tip_incompatible_charging_message (5097154279720383707) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (4208335872169818919) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (5697523201841444736) -->
- <skip />
+ <string name="battery_tip_incompatible_charging_message" product="default" msgid="5097154279720383707">"ऐसा हो सकता है कि आपका फ़ोन धीरे चार्ज हो रहा हो या चार्ज न हो रहा हो. इसे फ़ास्ट चार्ज करने के लिए, सुझाए गए अडैप्टर और केबल का इस्तेमाल करें."</string>
+ <string name="battery_tip_incompatible_charging_message" product="device" msgid="4208335872169818919">"ऐसा हो सकता है कि आपका डिवाइस धीरे चार्ज हो रहा हो या चार्ज न हो रहा हो. इसे फ़ास्ट चार्ज करने के लिए, सुझाए गए अडैप्टर और केबल का इस्तेमाल करें."</string>
+ <string name="battery_tip_incompatible_charging_message" product="tablet" msgid="5697523201841444736">"ऐसा हो सकता है कि आपका टैबलेट धीरे चार्ज हो रहा हो या चार्ज न हो रहा हो. इसे फ़ास्ट चार्ज करने के लिए, सुझाए गए अडैप्टर और केबल का इस्तेमाल करें."</string>
<string name="lockscreen_trivial_controls_summary" product="default" msgid="42562533085885152">"फ़ोन अनलॉक किए बिना"</string>
<string name="lockscreen_trivial_controls_summary" product="tablet" msgid="9052068482124729345">"टैबलेट अनलॉक किए बिना"</string>
<string name="auto_rotate_summary_a11y" product="default" msgid="2813368383309985185">"फ़ोन को पोर्ट्रेट से लैंडस्केप मोड में स्विच करने पर, स्क्रीन अपने-आप घूम जाएगी"</string>
diff --git a/res-product/values-hr/strings.xml b/res-product/values-hr/strings.xml
index 0f9c3b5..17b8612 100644
--- a/res-product/values-hr/strings.xml
+++ b/res-product/values-hr/strings.xml
@@ -347,12 +347,9 @@
<string name="lockpassword_confirm_your_password_details_frp" product="default" msgid="1465326741724776281">"Telefon je vraćen na tvorničke postavke. Da biste ga koristili, unesite prethodnu zaporku."</string>
<string name="lockpassword_confirm_your_password_details_frp" product="tablet" msgid="1333164951750797865">"Tablet je vraćen na tvorničke postavke. Da biste ga koristili, unesite prethodnu zaporku."</string>
<string name="lockpassword_confirm_your_password_details_frp" product="device" msgid="116667646012224967">"Uređaj je vraćen na tvorničke postavke. Da biste ga koristili, unesite prethodnu zaporku."</string>
- <!-- no translation found for battery_tip_incompatible_charging_message (5097154279720383707) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (4208335872169818919) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (5697523201841444736) -->
- <skip />
+ <string name="battery_tip_incompatible_charging_message" product="default" msgid="5097154279720383707">"Telefon se možda sporo puni ili se ne puni. Za brže punjenje upotrijebite preporučeni kabel i pretvarač napona."</string>
+ <string name="battery_tip_incompatible_charging_message" product="device" msgid="4208335872169818919">"Uređaj se možda sporo puni ili se ne puni. Za brže punjenje upotrijebite preporučeni kabel i pretvarač napona."</string>
+ <string name="battery_tip_incompatible_charging_message" product="tablet" msgid="5697523201841444736">"Tablet se možda sporo puni ili se ne puni. Za brže punjenje upotrijebite preporučeni kabel i pretvarač napona."</string>
<string name="lockscreen_trivial_controls_summary" product="default" msgid="42562533085885152">"Bez otključavanja telefona"</string>
<string name="lockscreen_trivial_controls_summary" product="tablet" msgid="9052068482124729345">"Bez otključavanja tableta"</string>
<string name="auto_rotate_summary_a11y" product="default" msgid="2813368383309985185">"Kad izmjenjujete prikaz zaslona telefona između okomitog i vodoravnog"</string>
diff --git a/res-product/values-hu/strings.xml b/res-product/values-hu/strings.xml
index ccf1caf..1f7f7db 100644
--- a/res-product/values-hu/strings.xml
+++ b/res-product/values-hu/strings.xml
@@ -347,12 +347,9 @@
<string name="lockpassword_confirm_your_password_details_frp" product="default" msgid="1465326741724776281">"A telefon gyári beállításai visszaállítva. A telefon használatához adja meg az előző jelszavát."</string>
<string name="lockpassword_confirm_your_password_details_frp" product="tablet" msgid="1333164951750797865">"A táblagép gyári beállításai visszaállítva. A táblagép használatához adja meg az előző jelszavát."</string>
<string name="lockpassword_confirm_your_password_details_frp" product="device" msgid="116667646012224967">"Az eszköz gyári beállításai visszaállítva. Az eszköz használatához adja meg az előző jelszavát."</string>
- <!-- no translation found for battery_tip_incompatible_charging_message (5097154279720383707) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (4208335872169818919) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (5697523201841444736) -->
- <skip />
+ <string name="battery_tip_incompatible_charging_message" product="default" msgid="5097154279720383707">"Előfordulhat, hogy telefonja lassan vagy egyáltalán nem tölt. A gyorsabb töltéshez használjon ajánlott kábelt és adaptert."</string>
+ <string name="battery_tip_incompatible_charging_message" product="device" msgid="4208335872169818919">"Előfordulhat, hogy eszköze lassan vagy egyáltalán nem tölt. A gyorsabb töltéshez használjon ajánlott kábelt és adaptert."</string>
+ <string name="battery_tip_incompatible_charging_message" product="tablet" msgid="5697523201841444736">"Előfordulhat, hogy táblagépe lassan vagy egyáltalán nem tölt. A gyorsabb töltéshez használjon ajánlott kábelt és adaptert."</string>
<string name="lockscreen_trivial_controls_summary" product="default" msgid="42562533085885152">"A telefon zárolásának feloldása nélkül"</string>
<string name="lockscreen_trivial_controls_summary" product="tablet" msgid="9052068482124729345">"A táblagép zárolásának feloldása nélkül"</string>
<string name="auto_rotate_summary_a11y" product="default" msgid="2813368383309985185">"Amikor Ön álló vagy fekvő helyzetbe fordítja a telefont"</string>
diff --git a/res-product/values-hy/strings.xml b/res-product/values-hy/strings.xml
index b4d081f..6861e6a 100644
--- a/res-product/values-hy/strings.xml
+++ b/res-product/values-hy/strings.xml
@@ -347,12 +347,9 @@
<string name="lockpassword_confirm_your_password_details_frp" product="default" msgid="1465326741724776281">"Ձեր հեռախոսում վերականգնվել են գործարանային կարգավորումները։ Մուտքագրեք ձեր նախորդ գաղտնաբառը։"</string>
<string name="lockpassword_confirm_your_password_details_frp" product="tablet" msgid="1333164951750797865">"Ձեր պլանշետում վերականգնվել են գործարանային կարգավորումները։ Մուտքագրեք ձեր նախորդ գաղտնաբառը։"</string>
<string name="lockpassword_confirm_your_password_details_frp" product="device" msgid="116667646012224967">"Ձեր սարքում վերականգնվել են գործարանային կարգավորումները։ Մուտքագրեք ձեր նախորդ գաղտնաբառը։"</string>
- <!-- no translation found for battery_tip_incompatible_charging_message (5097154279720383707) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (4208335872169818919) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (5697523201841444736) -->
- <skip />
+ <string name="battery_tip_incompatible_charging_message" product="default" msgid="5097154279720383707">"Ձեր հեռախոսը կարող է դանդաղ լիցքավորվել կամ ընդհանրապես չլիցքավորվել։ Արագ լիցքավորման համար օգտագործեք խորհուրդ տրվող մալուխը և ադապտերը։"</string>
+ <string name="battery_tip_incompatible_charging_message" product="device" msgid="4208335872169818919">"Ձեր սարքը կարող է դանդաղ լիցքավորվել կամ ընդհանրապես չլիցքավորվել։ Արագ լիցքավորման համար օգտագործեք խորհուրդ տրվող մալուխը և ադապտերը։"</string>
+ <string name="battery_tip_incompatible_charging_message" product="tablet" msgid="5697523201841444736">"Ձեր պլանշետը կարող է դանդաղ լիցքավորվել կամ ընդհանրապես չլիցքավորվել։ Արագ լիցքավորման համար օգտագործեք խորհուրդ տրվող մալուխը և ադապտերը։"</string>
<string name="lockscreen_trivial_controls_summary" product="default" msgid="42562533085885152">"Առանց հեռախոսն ապակողպելու"</string>
<string name="lockscreen_trivial_controls_summary" product="tablet" msgid="9052068482124729345">"Առանց պլանշետն ապակողպելու"</string>
<string name="auto_rotate_summary_a11y" product="default" msgid="2813368383309985185">"Փոխել էկրանի դիրքը ուղղաձիգի/հորիզոնականի՝ հեռախոսը պտտելիս"</string>
diff --git a/res-product/values-in/strings.xml b/res-product/values-in/strings.xml
index 202863b..295916c 100644
--- a/res-product/values-in/strings.xml
+++ b/res-product/values-in/strings.xml
@@ -347,12 +347,9 @@
<string name="lockpassword_confirm_your_password_details_frp" product="default" msgid="1465326741724776281">"Ponsel direset ke setelan pabrik. Untuk menggunakan ponsel ini, masukkan sandi sebelumnya."</string>
<string name="lockpassword_confirm_your_password_details_frp" product="tablet" msgid="1333164951750797865">"Tablet direset ke setelan pabrik. Untuk menggunakan tablet ini, masukkan sandi sebelumnya."</string>
<string name="lockpassword_confirm_your_password_details_frp" product="device" msgid="116667646012224967">"Perangkat direset ke setelan pabrik. Untuk menggunakan perangkat ini, masukkan sandi sebelumnya."</string>
- <!-- no translation found for battery_tip_incompatible_charging_message (5097154279720383707) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (4208335872169818919) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (5697523201841444736) -->
- <skip />
+ <string name="battery_tip_incompatible_charging_message" product="default" msgid="5097154279720383707">"Ponsel Anda mungkin mengisi daya lambat atau tidak mengisi daya. Untuk mengisi daya lebih cepat, gunakan kabel dan adaptor yang direkomendasikan."</string>
+ <string name="battery_tip_incompatible_charging_message" product="device" msgid="4208335872169818919">"Perangkat Anda mungkin mengisi daya lambat atau tidak mengisi daya. Untuk mengisi daya lebih cepat, gunakan kabel dan adaptor yang direkomendasikan."</string>
+ <string name="battery_tip_incompatible_charging_message" product="tablet" msgid="5697523201841444736">"Tablet Anda mungkin mengisi daya lambat atau tidak mengisi daya. Untuk mengisi daya lebih cepat, gunakan kabel dan adaptor yang direkomendasikan."</string>
<string name="lockscreen_trivial_controls_summary" product="default" msgid="42562533085885152">"Tanpa membuka kunci ponsel Anda"</string>
<string name="lockscreen_trivial_controls_summary" product="tablet" msgid="9052068482124729345">"Tanpa membuka kunci tablet Anda"</string>
<string name="auto_rotate_summary_a11y" product="default" msgid="2813368383309985185">"Saat Anda berganti mode ponsel antara potret dan lanskap"</string>
diff --git a/res-product/values-is/strings.xml b/res-product/values-is/strings.xml
index d826f66..4324989 100644
--- a/res-product/values-is/strings.xml
+++ b/res-product/values-is/strings.xml
@@ -347,12 +347,9 @@
<string name="lockpassword_confirm_your_password_details_frp" product="default" msgid="1465326741724776281">"Síminn var núllstilltur. Til að nota símann skaltu slá inn fyrra aðgangsorð."</string>
<string name="lockpassword_confirm_your_password_details_frp" product="tablet" msgid="1333164951750797865">"Spjaldtölvan var núllstillt. Til að nota spjaldtölvuna skaltu slá inn fyrra aðgangsorð."</string>
<string name="lockpassword_confirm_your_password_details_frp" product="device" msgid="116667646012224967">"Tækið var núllstillt. Til að nota tækið skaltu slá inn fyrra aðgangsorð."</string>
- <!-- no translation found for battery_tip_incompatible_charging_message (5097154279720383707) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (4208335872169818919) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (5697523201841444736) -->
- <skip />
+ <string name="battery_tip_incompatible_charging_message" product="default" msgid="5097154279720383707">"Síminn þinn hleðst hugsanlega hægt eða hleðst ekki. Notaðu straumbreyti og snúru sem mælt er með til að hlaða hraðar."</string>
+ <string name="battery_tip_incompatible_charging_message" product="device" msgid="4208335872169818919">"Tækið þitt hleðst hugsanlega hægt eða hleðst ekki. Notaðu straumbreyti og snúru sem mælt er með til að hlaða hraðar."</string>
+ <string name="battery_tip_incompatible_charging_message" product="tablet" msgid="5697523201841444736">"Spjaldtölvan þín hleðst hugsanlega hægt eða hleðst ekki. Notaðu straumbreyti og snúru sem mælt er með til að hlaða hraðar."</string>
<string name="lockscreen_trivial_controls_summary" product="default" msgid="42562533085885152">"Án þess að taka símann úr lás"</string>
<string name="lockscreen_trivial_controls_summary" product="tablet" msgid="9052068482124729345">"Án þess að taka spjaldtölvuna úr lás"</string>
<string name="auto_rotate_summary_a11y" product="default" msgid="2813368383309985185">"Þegar þú skiptir á milli skammsniðs og langsniðs í símanum"</string>
diff --git a/res-product/values-it/strings.xml b/res-product/values-it/strings.xml
index a60cc7a..a0c622c 100644
--- a/res-product/values-it/strings.xml
+++ b/res-product/values-it/strings.xml
@@ -347,12 +347,9 @@
<string name="lockpassword_confirm_your_password_details_frp" product="default" msgid="1465326741724776281">"Impostazioni di fabbrica ripristinate. Per usare il telefono, inserisci la password precedente."</string>
<string name="lockpassword_confirm_your_password_details_frp" product="tablet" msgid="1333164951750797865">"Impostazioni di fabbrica ripristinate. Per usare il tablet, inserisci la password precedente."</string>
<string name="lockpassword_confirm_your_password_details_frp" product="device" msgid="116667646012224967">"Impostazioni di fabbrica ripristinate. Per usare il dispositivo, inserisci la password precedente."</string>
- <!-- no translation found for battery_tip_incompatible_charging_message (5097154279720383707) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (4208335872169818919) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (5697523201841444736) -->
- <skip />
+ <string name="battery_tip_incompatible_charging_message" product="default" msgid="5097154279720383707">"Lo smartphone potrebbe ricaricarsi lentamente o non ricaricarsi affatto. Per velocizzare la ricarica, usa un cavo e un alimentatore consigliati."</string>
+ <string name="battery_tip_incompatible_charging_message" product="device" msgid="4208335872169818919">"Il dispositivo potrebbe ricaricarsi lentamente o non ricaricarsi affatto. Per velocizzare la ricarica, usa un cavo e un alimentatore consigliati."</string>
+ <string name="battery_tip_incompatible_charging_message" product="tablet" msgid="5697523201841444736">"Il tablet potrebbe ricaricarsi lentamente o non ricaricarsi affatto. Per velocizzare la ricarica, usa un cavo e un alimentatore consigliati."</string>
<string name="lockscreen_trivial_controls_summary" product="default" msgid="42562533085885152">"Senza sbloccare il telefono"</string>
<string name="lockscreen_trivial_controls_summary" product="tablet" msgid="9052068482124729345">"Senza sbloccare il tablet"</string>
<string name="auto_rotate_summary_a11y" product="default" msgid="2813368383309985185">"Quando ruoti il telefono in orizzontale e verticale"</string>
diff --git a/res-product/values-iw/strings.xml b/res-product/values-iw/strings.xml
index 890dc33..f7b1b4e 100644
--- a/res-product/values-iw/strings.xml
+++ b/res-product/values-iw/strings.xml
@@ -347,12 +347,9 @@
<string name="lockpassword_confirm_your_password_details_frp" product="default" msgid="1465326741724776281">"הטלפון שלך עבר איפוס להגדרות המקוריות. כדי להשתמש בטלפון הזה, יש להזין את הסיסמה הקודמת."</string>
<string name="lockpassword_confirm_your_password_details_frp" product="tablet" msgid="1333164951750797865">"הטאבלט שלך עבר איפוס להגדרות המקוריות. כדי להשתמש בטאבלט הזה, יש להזין את הסיסמה הקודמת."</string>
<string name="lockpassword_confirm_your_password_details_frp" product="device" msgid="116667646012224967">"המכשיר שלך עבר איפוס להגדרות המקוריות. כדי להשתמש במכשיר הזה, יש להזין את הסיסמה הקודמת."</string>
- <!-- no translation found for battery_tip_incompatible_charging_message (5097154279720383707) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (4208335872169818919) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (5697523201841444736) -->
- <skip />
+ <string name="battery_tip_incompatible_charging_message" product="default" msgid="5097154279720383707">"יכול להיות שהטלפון נטען לאט או לא נטען. לטעינה מהירה יותר, כדאי להשתמש במתאם ובכבל מומלצים."</string>
+ <string name="battery_tip_incompatible_charging_message" product="device" msgid="4208335872169818919">"יכול להיות שהמכשיר נטען לאט או לא נטען. לטעינה מהירה יותר, כדאי להשתמש במתאם ובכבל מומלצים."</string>
+ <string name="battery_tip_incompatible_charging_message" product="tablet" msgid="5697523201841444736">"יכול להיות שהטאבלט נטען לאט או לא נטען. לטעינה מהירה יותר, כדאי להשתמש במתאם ובכבל מומלצים."</string>
<string name="lockscreen_trivial_controls_summary" product="default" msgid="42562533085885152">"בלי לבטל את נעילת הטלפון"</string>
<string name="lockscreen_trivial_controls_summary" product="tablet" msgid="9052068482124729345">"בלי לבטל את נעילת הטאבלט"</string>
<string name="auto_rotate_summary_a11y" product="default" msgid="2813368383309985185">"כשמזיזים את הטלפון ממצב \'לאורך\' למצב \'לרוחב\' ולהפך"</string>
diff --git a/res-product/values-ja/strings.xml b/res-product/values-ja/strings.xml
index cb08c13..32e2a3e 100644
--- a/res-product/values-ja/strings.xml
+++ b/res-product/values-ja/strings.xml
@@ -347,12 +347,9 @@
<string name="lockpassword_confirm_your_password_details_frp" product="default" msgid="1465326741724776281">"スマートフォンは出荷時の設定にリセットされました。使用するには、以前のパスワードを入力してください。"</string>
<string name="lockpassword_confirm_your_password_details_frp" product="tablet" msgid="1333164951750797865">"タブレットは出荷時の設定にリセットされました。使用するには、以前のパスワードを入力してください。"</string>
<string name="lockpassword_confirm_your_password_details_frp" product="device" msgid="116667646012224967">"デバイスは出荷時の設定にリセットされました。使用するには、以前のパスワードを入力してください。"</string>
- <!-- no translation found for battery_tip_incompatible_charging_message (5097154279720383707) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (4208335872169818919) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (5697523201841444736) -->
- <skip />
+ <string name="battery_tip_incompatible_charging_message" product="default" msgid="5097154279720383707">"スマートフォンのバッテリーが充電されていないか、充電に非常に時間がかかっています。充電時間を短くするには、推奨されるケーブルとアダプターを使用してください。"</string>
+ <string name="battery_tip_incompatible_charging_message" product="device" msgid="4208335872169818919">"デバイスのバッテリーが充電されていないか、充電に非常に時間がかかっています。充電時間を短くするには、推奨されるケーブルとアダプターを使用してください。"</string>
+ <string name="battery_tip_incompatible_charging_message" product="tablet" msgid="5697523201841444736">"タブレットのバッテリーが充電されていないか、充電に非常に時間がかかっています。充電時間を短くするには、推奨されるケーブルとアダプターを使用してください。"</string>
<string name="lockscreen_trivial_controls_summary" product="default" msgid="42562533085885152">"スマートフォンのロックを解除せずに操作"</string>
<string name="lockscreen_trivial_controls_summary" product="tablet" msgid="9052068482124729345">"タブレットのロックを解除せずに操作"</string>
<string name="auto_rotate_summary_a11y" product="default" msgid="2813368383309985185">"スマートフォンを動かして縦向きと横向きを切り替えたとき"</string>
diff --git a/res-product/values-ka/strings.xml b/res-product/values-ka/strings.xml
index 6a93bec..aa1b099 100644
--- a/res-product/values-ka/strings.xml
+++ b/res-product/values-ka/strings.xml
@@ -347,12 +347,9 @@
<string name="lockpassword_confirm_your_password_details_frp" product="default" msgid="1465326741724776281">"თქვენი ტელეფონი დაბრუნდა ქარხნულ პარამეტრებზე. ამ ტელეფონის გამოსაყენებლად, შეიყვანეთ თქვენი წინა პაროლი."</string>
<string name="lockpassword_confirm_your_password_details_frp" product="tablet" msgid="1333164951750797865">"თქვენი ტაბლეტი დაბრუნდა ქარხნულ პარამეტრებზე. ამ ტაბლეტის გამოსაყენებლად შეიყვანეთ თქვენი წინა პაროლი."</string>
<string name="lockpassword_confirm_your_password_details_frp" product="device" msgid="116667646012224967">"თქვენი მოწყობილობა დაბრუნდა ქარხნულ პარამეტრებზე. ამ მოწყობილობის გამოსაყენებლად შეიყვანეთ თქვენი წინა პაროლი."</string>
- <!-- no translation found for battery_tip_incompatible_charging_message (5097154279720383707) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (4208335872169818919) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (5697523201841444736) -->
- <skip />
+ <string name="battery_tip_incompatible_charging_message" product="default" msgid="5097154279720383707">"თქვენი ტელეფონი შესაძლოა ნელა ან საერთოდ არ იტენებოდეს. უფრო სწრაფად დატენვისთვის გამოიყენეთ რეკომენდებული კაბელი და ადაპტერი."</string>
+ <string name="battery_tip_incompatible_charging_message" product="device" msgid="4208335872169818919">"თქვენი მოწყობილობა შესაძლოა ნელა ან საერთოდ არ იტენებოდეს. უფრო სწრაფად დატენვისთვის გამოიყენეთ რეკომენდებული კაბელი და ადაპტერი."</string>
+ <string name="battery_tip_incompatible_charging_message" product="tablet" msgid="5697523201841444736">"თქვენი ტაბლეტი შესაძლოა ნელა ან საერთოდ არ იტენებოდეს. უფრო სწრაფად დატენვისთვის გამოიყენეთ რეკომენდებული კაბელი და ადაპტერი."</string>
<string name="lockscreen_trivial_controls_summary" product="default" msgid="42562533085885152">"თქვენი ტელეფონის განბლოკვის გარეშე"</string>
<string name="lockscreen_trivial_controls_summary" product="tablet" msgid="9052068482124729345">"თქვენი ტაბლეტის განბლოკვის გარეშე"</string>
<string name="auto_rotate_summary_a11y" product="default" msgid="2813368383309985185">"როცა ტელეფონი პორტრეტის რეჟიმიდან პეიზაჟის რეჟიმზე გადაგყავთ"</string>
diff --git a/res-product/values-km/strings.xml b/res-product/values-km/strings.xml
index 6017a7d..4186609 100644
--- a/res-product/values-km/strings.xml
+++ b/res-product/values-km/strings.xml
@@ -347,12 +347,9 @@
<string name="lockpassword_confirm_your_password_details_frp" product="default" msgid="1465326741724776281">"ទូរសព្ទរបស់អ្នកត្រូវបានកំណត់ឡើងវិញដូចចេញពីរោងចក្រ។ ដើម្បីប្រើទូរសព្ទនេះ សូមបញ្ចូលពាក្យសម្ងាត់មុនរបស់អ្នក។"</string>
<string name="lockpassword_confirm_your_password_details_frp" product="tablet" msgid="1333164951750797865">"ថេប្លេតរបស់អ្នកត្រូវបានកំណត់ឡើងវិញទៅការកំណត់ដូចចេញពីរោងចក្រ។ ដើម្បីប្រើថេប្លេតនេះ សូមបញ្ចូលពាក្យសម្ងាត់ពីមុនរបស់អ្នក។"</string>
<string name="lockpassword_confirm_your_password_details_frp" product="device" msgid="116667646012224967">"ឧបករណ៍របស់អ្នកត្រូវបានកំណត់ឡើងវិញទៅការកំណត់ដូចចេញពីរោងចក្រ។ ដើម្បីប្រើឧបករណ៍នេះ សូមបញ្ចូលពាក្យសម្ងាត់ពីមុនរបស់អ្នក។"</string>
- <!-- no translation found for battery_tip_incompatible_charging_message (5097154279720383707) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (4208335872169818919) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (5697523201841444736) -->
- <skip />
+ <string name="battery_tip_incompatible_charging_message" product="default" msgid="5097154279720383707">"ទូរសព្ទរបស់អ្នកអាចនឹងសាកថ្មយឺត ឬមិនសាក។ សម្រាប់ការសាកថ្មរហ័ស សូមប្រើខ្សែ និងអាដាប់ទ័រតាមការណែនាំ។"</string>
+ <string name="battery_tip_incompatible_charging_message" product="device" msgid="4208335872169818919">"ឧបករណ៍របស់អ្នកអាចនឹងសាកថ្មយឺត ឬមិនសាក។ សម្រាប់ការសាកថ្មរហ័ស សូមប្រើខ្សែ និងអាដាប់ទ័រតាមការណែនាំ។"</string>
+ <string name="battery_tip_incompatible_charging_message" product="tablet" msgid="5697523201841444736">"ថេប្លេតរបស់អ្នកអាចនឹងសាកថ្មយឺត ឬមិនសាក។ សម្រាប់ការសាកថ្មរហ័ស សូមប្រើខ្សែ និងអាដាប់ទ័រតាមការណែនាំ។"</string>
<string name="lockscreen_trivial_controls_summary" product="default" msgid="42562533085885152">"ដោយមិនចាំបាច់ដោះសោទូរសព្ទរបស់អ្នក"</string>
<string name="lockscreen_trivial_controls_summary" product="tablet" msgid="9052068482124729345">"ដោយមិនចាំបាច់ដោះសោថេប្លេតរបស់អ្នក"</string>
<string name="auto_rotate_summary_a11y" product="default" msgid="2813368383309985185">"នៅពេលដែលអ្នកដាក់ទូរសព្ទរបស់អ្នកឱ្យបញ្ឈរ និងផ្ដេក"</string>
diff --git a/res-product/values-kn/strings.xml b/res-product/values-kn/strings.xml
index efdea33..9df074a 100644
--- a/res-product/values-kn/strings.xml
+++ b/res-product/values-kn/strings.xml
@@ -347,12 +347,9 @@
<string name="lockpassword_confirm_your_password_details_frp" product="default" msgid="1465326741724776281">"ನಿಮ್ಮ ಫೋನ್ ಅನ್ನು ಫ್ಯಾಕ್ಟರಿ ಸೆಟ್ಟಿಂಗ್ಗಳಿಗೆ ಮರುಹೊಂದಿಸಲಾಗಿದೆ. ಈ ಫೋನ್ ಬಳಸಲು, ನಿಮ್ಮ ಹಿಂದಿನ ಪಾಸ್ವರ್ಡ್ ನಮೂದಿಸಿ."</string>
<string name="lockpassword_confirm_your_password_details_frp" product="tablet" msgid="1333164951750797865">"ನಿಮ್ಮ ಟ್ಯಾಬ್ಲೆಟ್ ಅನ್ನು ಫ್ಯಾಕ್ಟರಿ ಸೆಟ್ಟಿಂಗ್ಗಳಿಗೆ ಮರುಹೊಂದಿಸಲಾಗಿದೆ. ಈ ಟ್ಯಾಬ್ಲೆಟ್ ಅನ್ನು ಬಳಸಲು, ನಿಮ್ಮ ಹಿಂದಿನ ಪಾಸ್ವರ್ಡ್ ಅನ್ನು ನಮೂದಿಸಿ."</string>
<string name="lockpassword_confirm_your_password_details_frp" product="device" msgid="116667646012224967">"ನಿಮ್ಮ ಸಾಧನವನ್ನು ಫ್ಯಾಕ್ಟರಿ ಸೆಟ್ಟಿಂಗ್ಗಳಿಗೆ ಮರುಹೊಂದಿಸಲಾಗಿದೆ. ಈ ಸಾಧನವನ್ನು ಬಳಸಲು, ನಿಮ್ಮ ಹಿಂದಿನ ಪಾಸ್ವರ್ಡ್ ಅನ್ನು ನಮೂದಿಸಿ."</string>
- <!-- no translation found for battery_tip_incompatible_charging_message (5097154279720383707) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (4208335872169818919) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (5697523201841444736) -->
- <skip />
+ <string name="battery_tip_incompatible_charging_message" product="default" msgid="5097154279720383707">"ನಿಮ್ಮ ಫೋನ್ ನಿಧಾನವಾಗಿ ಚಾರ್ಜ್ ಆಗುತ್ತಿರಬಹುದು ಅಥವಾ ಚಾರ್ಜ್ ಆಗದೇ ಇರಬಹುದು. ವೇಗವಾಗಿ ಚಾರ್ಜ್ ಮಾಡಲು, ಶಿಫಾರಸು ಮಾಡಲಾದ ಕೇಬಲ್ ಮತ್ತು ಅಡಾಪ್ಟರ್ ಅನ್ನು ಬಳಸಿ."</string>
+ <string name="battery_tip_incompatible_charging_message" product="device" msgid="4208335872169818919">"ನಿಮ್ಮ ಸಾಧನವು ನಿಧಾನವಾಗಿ ಚಾರ್ಜ್ ಆಗುತ್ತಿರಬಹುದು ಅಥವಾ ಚಾರ್ಜ್ ಆಗದೇ ಇರಬಹುದು. ವೇಗವಾಗಿ ಚಾರ್ಜ್ ಮಾಡಲು, ಶಿಫಾರಸು ಮಾಡಲಾದ ಕೇಬಲ್ ಮತ್ತು ಅಡಾಪ್ಟರ್ ಅನ್ನು ಬಳಸಿ."</string>
+ <string name="battery_tip_incompatible_charging_message" product="tablet" msgid="5697523201841444736">"ನಿಮ್ಮ ಟ್ಯಾಬ್ಲೆಟ್ ನಿಧಾನವಾಗಿ ಚಾರ್ಜ್ ಆಗುತ್ತಿರಬಹುದು ಅಥವಾ ಚಾರ್ಜ್ ಆಗದೇ ಇರಬಹುದು. ವೇಗವಾಗಿ ಚಾರ್ಜ್ ಮಾಡಲು, ಶಿಫಾರಸು ಮಾಡಲಾದ ಕೇಬಲ್ ಮತ್ತು ಅಡಾಪ್ಟರ್ ಅನ್ನು ಬಳಸಿ."</string>
<string name="lockscreen_trivial_controls_summary" product="default" msgid="42562533085885152">"ನಿಮ್ಮ ಫೋನ್ ಅನ್ನು ಅನ್ಲಾಕ್ ಮಾಡದೆಯೇ"</string>
<string name="lockscreen_trivial_controls_summary" product="tablet" msgid="9052068482124729345">"ನಿಮ್ಮ ಟ್ಯಾಬ್ಲೆಟ್ ಅನ್ನು ಅನ್ಲಾಕ್ ಮಾಡದೆಯೇ"</string>
<string name="auto_rotate_summary_a11y" product="default" msgid="2813368383309985185">"ಫೋನ್ ಅನ್ನು ಪೋರ್ಟ್ರೇಟ್ ಹಾಗೂ ಲ್ಯಾಂಡ್ಸ್ಕೇಪ್ ನಡುವೆ ಬದಲಾಯಿಸಿದಾಗ"</string>
diff --git a/res-product/values-ko/strings.xml b/res-product/values-ko/strings.xml
index c4b50fe..24346a6 100644
--- a/res-product/values-ko/strings.xml
+++ b/res-product/values-ko/strings.xml
@@ -347,12 +347,9 @@
<string name="lockpassword_confirm_your_password_details_frp" product="default" msgid="1465326741724776281">"휴대전화가 기본 설정으로 초기화되었습니다. 이 휴대전화를 사용하려면 이전 비밀번호를 입력하세요."</string>
<string name="lockpassword_confirm_your_password_details_frp" product="tablet" msgid="1333164951750797865">"태블릿이 기본 설정으로 초기화되었습니다. 이 태블릿을 사용하려면 이전 비밀번호를 입력하세요."</string>
<string name="lockpassword_confirm_your_password_details_frp" product="device" msgid="116667646012224967">"기기가 기본 설정으로 초기화되었습니다. 이 기기를 사용하려면 이전 비밀번호를 입력하세요."</string>
- <!-- no translation found for battery_tip_incompatible_charging_message (5097154279720383707) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (4208335872169818919) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (5697523201841444736) -->
- <skip />
+ <string name="battery_tip_incompatible_charging_message" product="default" msgid="5097154279720383707">"휴대전화가 느리게 충전되거나 충전이 되지 않을 수 있습니다. 더 빠르게 충전하려면 권장되는 케이블과 어댑터를 사용하세요."</string>
+ <string name="battery_tip_incompatible_charging_message" product="device" msgid="4208335872169818919">"기기가 느리게 충전되거나 충전이 되지 않을 수 있습니다. 더 빠르게 충전하려면 권장되는 케이블과 어댑터를 사용하세요."</string>
+ <string name="battery_tip_incompatible_charging_message" product="tablet" msgid="5697523201841444736">"태블릿이 느리게 충전되거나 충전이 되지 않을 수 있습니다. 더 빠르게 충전하려면 권장되는 케이블과 어댑터를 사용하세요."</string>
<string name="lockscreen_trivial_controls_summary" product="default" msgid="42562533085885152">"휴대전화를 잠금 해제하지 않은 채 사용"</string>
<string name="lockscreen_trivial_controls_summary" product="tablet" msgid="9052068482124729345">"태블릿을 잠금 해제하지 않은 채 사용"</string>
<string name="auto_rotate_summary_a11y" product="default" msgid="2813368383309985185">"휴대전화를 가로 또는 세로로 움직이면 자동으로 방향 전환"</string>
diff --git a/res-product/values-ky/strings.xml b/res-product/values-ky/strings.xml
index 39b0e99..f394bfd 100644
--- a/res-product/values-ky/strings.xml
+++ b/res-product/values-ky/strings.xml
@@ -347,12 +347,9 @@
<string name="lockpassword_confirm_your_password_details_frp" product="default" msgid="1465326741724776281">"Телефонуңуз демейки параметрлерге кайтарылды. Аны колдонуу үчүн мурунку сырсөзүңүздү киргизиңиз."</string>
<string name="lockpassword_confirm_your_password_details_frp" product="tablet" msgid="1333164951750797865">"Планшет демейки параметрлерге кайтарылды. Аны колдонуу үчүн мурунку сырсөзүңүздү киргизиңиз."</string>
<string name="lockpassword_confirm_your_password_details_frp" product="device" msgid="116667646012224967">"Түзмөк демейки параметрлерге кайтарылды. Аны колдонуу үчүн мурунку сырсөзүңүздү киргизиңиз."</string>
- <!-- no translation found for battery_tip_incompatible_charging_message (5097154279720383707) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (4208335872169818919) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (5697523201841444736) -->
- <skip />
+ <string name="battery_tip_incompatible_charging_message" product="default" msgid="5097154279720383707">"Телефонуңуз жай кубатталып же такыр кубатталбай жаткан болушу мүмкүн. Тезирээк кубаттоо үчүн сунушталган кабелди жана адаптерди колдонуңуз."</string>
+ <string name="battery_tip_incompatible_charging_message" product="device" msgid="4208335872169818919">"Түзмөгүңүз жай кубатталып же такыр кубатталбай жаткан болушу мүмкүн. Тезирээк кубаттоо үчүн сунушталган кабелди жана адаптерди колдонуңуз."</string>
+ <string name="battery_tip_incompatible_charging_message" product="tablet" msgid="5697523201841444736">"Планшетиңиз жай кубатталып же такыр кубатталбай жаткан болушу мүмкүн. Тезирээк кубаттоо үчүн сунушталган кабелди жана адаптерди колдонуңуз."</string>
<string name="lockscreen_trivial_controls_summary" product="default" msgid="42562533085885152">"Телефонуңуздун кулпусун ачпай туруп"</string>
<string name="lockscreen_trivial_controls_summary" product="tablet" msgid="9052068482124729345">"Планшетиңиздин кулпусун ачпай туруп"</string>
<string name="auto_rotate_summary_a11y" product="default" msgid="2813368383309985185">"Телефонду тигинен же туурасынан кармаганда"</string>
diff --git a/res-product/values-lo/strings.xml b/res-product/values-lo/strings.xml
index 5acf2a8..b40518f 100644
--- a/res-product/values-lo/strings.xml
+++ b/res-product/values-lo/strings.xml
@@ -347,12 +347,9 @@
<string name="lockpassword_confirm_your_password_details_frp" product="default" msgid="1465326741724776281">"ໂທລະສັບຂອງທ່ານຖືກຣີເຊັດເປັນຄ່າຈາກໂຮງງານແລ້ວ. ເພື່ອໃຊ້ໂທລະສັບນີ້, ໃຫ້ໃສ່ລະຫັດຜ່ານກ່ອນໜ້າຂອງທ່ານ."</string>
<string name="lockpassword_confirm_your_password_details_frp" product="tablet" msgid="1333164951750797865">"ແທັບເລັດຂອງທ່ານບໍ່ໄດ້ຖືກຣີເຊັດເປັນຄ່າຈາກໂຮງງານ. ເພື່ອໃຊ້ແທັບເລັດນີ້, ໃຫ້ໃສ່ລະຫັດຜ່ານກ່ອນໜ້າຂອງທ່ານ."</string>
<string name="lockpassword_confirm_your_password_details_frp" product="device" msgid="116667646012224967">"ອຸປະກອນຂອງທ່ານບໍ່ໄດ້ຖືກຣີເຊັດເປັນຄ່າຈາກໂຮງງານ. ເພື່ອໃຊ້ອຸປະກອນນີ້, ໃຫ້ໃສ່ລະຫັດຜ່ານກ່ອນໜ້າຂອງທ່ານ."</string>
- <!-- no translation found for battery_tip_incompatible_charging_message (5097154279720383707) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (4208335872169818919) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (5697523201841444736) -->
- <skip />
+ <string name="battery_tip_incompatible_charging_message" product="default" msgid="5097154279720383707">"ໂທລະສັບຂອງທ່ານອາດສາກຢ່າງຊ້າໆ ຫຼື ບໍ່ສາກ. ເພື່ອການສາກທີ່ໄວຂຶ້ນ, ໃຫ້ໃຊ້ສາຍ ແລະ ຫົວສາກທີ່ແນະນຳໃຫ້."</string>
+ <string name="battery_tip_incompatible_charging_message" product="device" msgid="4208335872169818919">"ອຸປະກອນຂອງທ່ານອາດສາກຢ່າງຊ້າໆ ຫຼື ບໍ່ສາກ. ເພື່ອການສາກທີ່ໄວຂຶ້ນ, ໃຫ້ໃຊ້ສາຍ ແລະ ຫົວສາກທີ່ແນະນຳໃຫ້."</string>
+ <string name="battery_tip_incompatible_charging_message" product="tablet" msgid="5697523201841444736">"ແທັບເລັດຂອງທ່ານອາດສາກຢ່າງຊ້າໆ ຫຼື ບໍ່ສາກ. ເພື່ອການສາກທີ່ໄວຂຶ້ນ, ໃຫ້ໃຊ້ສາຍ ແລະ ຫົວສາກທີ່ແນະນຳໃຫ້."</string>
<string name="lockscreen_trivial_controls_summary" product="default" msgid="42562533085885152">"ໂດຍບໍ່ຕ້ອງປົດລັອກໂທລະສັບຂອງທ່ານ"</string>
<string name="lockscreen_trivial_controls_summary" product="tablet" msgid="9052068482124729345">"ໂດຍບໍ່ຕ້ອງປົດລັອກແທັບເລັດຂອງທ່ານ"</string>
<string name="auto_rotate_summary_a11y" product="default" msgid="2813368383309985185">"ເມື່ອທ່ານປິ່ນໂທລະສັບຂອງທ່ານໄປມາລະຫວ່າງແນວຕັ້ງ ແລະ ແນວນອນ"</string>
diff --git a/res-product/values-lt/strings.xml b/res-product/values-lt/strings.xml
index e909598..9528ae9 100644
--- a/res-product/values-lt/strings.xml
+++ b/res-product/values-lt/strings.xml
@@ -347,12 +347,9 @@
<string name="lockpassword_confirm_your_password_details_frp" product="default" msgid="1465326741724776281">"Atkurti gamykliniai telefono nustatymai. Naudokite šį telefoną įvedę ankstesnį slaptažodį."</string>
<string name="lockpassword_confirm_your_password_details_frp" product="tablet" msgid="1333164951750797865">"Atkurti gamykliniai planšetinio kompiuterio nustatymai. Naudokite jį įvedę ankstesnį slaptažodį."</string>
<string name="lockpassword_confirm_your_password_details_frp" product="device" msgid="116667646012224967">"Atkurti gamykliniai įrenginio nustatymai. Naudokite šį įrenginį įvedę ankstesnį slaptažodį."</string>
- <!-- no translation found for battery_tip_incompatible_charging_message (5097154279720383707) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (4208335872169818919) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (5697523201841444736) -->
- <skip />
+ <string name="battery_tip_incompatible_charging_message" product="default" msgid="5097154279720383707">"Telefonas gali būti įkraunamas lėtai arba neįkraunamas. Kad greičiau įkrautumėte, naudokite rekomenduojamą laidą ir adapterį."</string>
+ <string name="battery_tip_incompatible_charging_message" product="device" msgid="4208335872169818919">"Įrenginys gali būti įkraunamas lėtai arba neįkraunamas. Kad greičiau įkrautumėte, naudokite rekomenduojamą laidą ir adapterį."</string>
+ <string name="battery_tip_incompatible_charging_message" product="tablet" msgid="5697523201841444736">"Planšetinis kompiuteris gali būti įkraunamas lėtai arba neįkraunamas. Kad greičiau įkrautumėte, naudokite rekomenduojamą laidą ir adapterį."</string>
<string name="lockscreen_trivial_controls_summary" product="default" msgid="42562533085885152">"Neatrakinus telefono"</string>
<string name="lockscreen_trivial_controls_summary" product="tablet" msgid="9052068482124729345">"Neatrakinus planšetinio kompiuterio"</string>
<string name="auto_rotate_summary_a11y" product="default" msgid="2813368383309985185">"Kai pasukate telefoną stačiai ar gulsčiai"</string>
diff --git a/res-product/values-lv/strings.xml b/res-product/values-lv/strings.xml
index d2c0c8f..1f064a5 100644
--- a/res-product/values-lv/strings.xml
+++ b/res-product/values-lv/strings.xml
@@ -347,12 +347,9 @@
<string name="lockpassword_confirm_your_password_details_frp" product="default" msgid="1465326741724776281">"Tālrunī atiestatīti rūpnīcas iestatījumi. Lai izmantotu tālruni, ievadiet iepriekšējo paroli."</string>
<string name="lockpassword_confirm_your_password_details_frp" product="tablet" msgid="1333164951750797865">"Atiestatīti rūpnīcas iestatījumi. Lai izmantotu šo planšetdatoru, ievadiet iepriekšējo paroli."</string>
<string name="lockpassword_confirm_your_password_details_frp" product="device" msgid="116667646012224967">"Ierīcē atiestatīti rūpnīcas iestatījumi. Lai izmantotu šo ierīci, ievadiet iepriekšējo paroli."</string>
- <!-- no translation found for battery_tip_incompatible_charging_message (5097154279720383707) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (4208335872169818919) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (5697523201841444736) -->
- <skip />
+ <string name="battery_tip_incompatible_charging_message" product="default" msgid="5097154279720383707">"Iespējams, tālruņa uzlāde notiek lēni vai nenotiek nemaz. Lai paātrinātu uzlādi, izmantojiet kādu no ieteiktajiem vadiem un adapteriem."</string>
+ <string name="battery_tip_incompatible_charging_message" product="device" msgid="4208335872169818919">"Iespējams, ierīces uzlāde notiek lēni vai nenotiek nemaz. Lai paātrinātu uzlādi, izmantojiet kādu no ieteiktajiem vadiem un adapteriem."</string>
+ <string name="battery_tip_incompatible_charging_message" product="tablet" msgid="5697523201841444736">"Iespējams, planšetdatora uzlāde notiek lēni vai nenotiek nemaz. Lai paātrinātu uzlādi, izmantojiet kādu no ieteiktajiem vadiem un adapteriem."</string>
<string name="lockscreen_trivial_controls_summary" product="default" msgid="42562533085885152">"Neatbloķējot tālruni"</string>
<string name="lockscreen_trivial_controls_summary" product="tablet" msgid="9052068482124729345">"Neatbloķējot planšetdatoru"</string>
<string name="auto_rotate_summary_a11y" product="default" msgid="2813368383309985185">"Pārvietojot tālruni no portreta režīma ainavas režīmā vai otrādi"</string>
diff --git a/res-product/values-mk/strings.xml b/res-product/values-mk/strings.xml
index 08571de..5953ecd 100644
--- a/res-product/values-mk/strings.xml
+++ b/res-product/values-mk/strings.xml
@@ -347,12 +347,9 @@
<string name="lockpassword_confirm_your_password_details_frp" product="default" msgid="1465326741724776281">"Телефонот беше ресетиран на фабрички поставки. За да го користите, внесете ја претходната лозинка."</string>
<string name="lockpassword_confirm_your_password_details_frp" product="tablet" msgid="1333164951750797865">"Таблетот беше ресетиран на фабрички поставки. За да го користите, внесете ја претходната лозинка."</string>
<string name="lockpassword_confirm_your_password_details_frp" product="device" msgid="116667646012224967">"Уредот беше ресетиран на фабрички поставки. За да го користите, внесете ја претходната лозинка."</string>
- <!-- no translation found for battery_tip_incompatible_charging_message (5097154279720383707) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (4208335872169818919) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (5697523201841444736) -->
- <skip />
+ <string name="battery_tip_incompatible_charging_message" product="default" msgid="5097154279720383707">"Можеби вашиот телефон се полни бавно или не се полни. За побрзо полнење, користете препорачан кабел и адаптер."</string>
+ <string name="battery_tip_incompatible_charging_message" product="device" msgid="4208335872169818919">"Можеби вашиот уред се полни бавно или не се полни. За побрзо полнење, користете препорачан кабел и адаптер."</string>
+ <string name="battery_tip_incompatible_charging_message" product="tablet" msgid="5697523201841444736">"Можеби вашиот таблет се полни бавно или не се полни. За побрзо полнење, користете препорачан кабел и адаптер."</string>
<string name="lockscreen_trivial_controls_summary" product="default" msgid="42562533085885152">"Без да го отклучите телефонот"</string>
<string name="lockscreen_trivial_controls_summary" product="tablet" msgid="9052068482124729345">"Без да го отклучите таблетот"</string>
<string name="auto_rotate_summary_a11y" product="default" msgid="2813368383309985185">"Менување меѓу портрет и пејзаж кога го движите телефонот"</string>
diff --git a/res-product/values-ml/strings.xml b/res-product/values-ml/strings.xml
index b186854..4e790ef 100644
--- a/res-product/values-ml/strings.xml
+++ b/res-product/values-ml/strings.xml
@@ -347,12 +347,9 @@
<string name="lockpassword_confirm_your_password_details_frp" product="default" msgid="1465326741724776281">"ഫാക്ടറി ക്രമീകരണത്തിലേക്ക് ഫോൺ റീസെറ്റ് ചെയ്തു. ഫോൺ ഉപയോഗിക്കാനായി മുമ്പത്തെ പാസ്വേഡ് നൽകുക."</string>
<string name="lockpassword_confirm_your_password_details_frp" product="tablet" msgid="1333164951750797865">"ഫാക്ടറി ക്രമീകരണത്തിലേക്ക് ടാബ്ലെറ്റ് റീസെറ്റുചെയ്തു. ഈ ടാബ്ലെറ്റ് ഉപയോഗിക്കാൻ മുമ്പത്തെ പാസ്വേഡ് നൽകൂ."</string>
<string name="lockpassword_confirm_your_password_details_frp" product="device" msgid="116667646012224967">"ഫാക്ടറി ക്രമീകരണത്തിലേക്ക് ഉപകരണം റീസെറ്റ് ചെയ്തു. ഈ ഉപകരണം ഉപയോഗിക്കാൻ, മുമ്പത്തെ പാസ്വേഡ് നൽകൂ."</string>
- <!-- no translation found for battery_tip_incompatible_charging_message (5097154279720383707) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (4208335872169818919) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (5697523201841444736) -->
- <skip />
+ <string name="battery_tip_incompatible_charging_message" product="default" msgid="5097154279720383707">"നിങ്ങളുടെ ഫോൺ പതുക്കെയായിരിക്കാം ചാർജ് ചെയ്യുന്നത് അല്ലെങ്കിൽ ചാർജ് ചെയ്യുന്നില്ലായിരിക്കാം. വേഗത്തിലുള്ള ചാർജിംഗിനായി, നിർദ്ദേശിച്ച കേബിളും അഡാപ്റ്ററും ഉപയോഗിക്കുക."</string>
+ <string name="battery_tip_incompatible_charging_message" product="device" msgid="4208335872169818919">"നിങ്ങളുടെ ഉപകരണം പതുക്കെയായിരിക്കാം ചാർജ് ചെയ്യുന്നത് അല്ലെങ്കിൽ ചാർജ് ചെയ്യുന്നില്ലായിരിക്കാം. വേഗത്തിലുള്ള ചാർജിംഗിനായി, നിർദ്ദേശിച്ച കേബിളും അഡാപ്റ്ററും ഉപയോഗിക്കുക."</string>
+ <string name="battery_tip_incompatible_charging_message" product="tablet" msgid="5697523201841444736">"നിങ്ങളുടെ ടാബ്ലെറ്റ് പതുക്കെയായിരിക്കാം ചാർജ് ചെയ്യുന്നത് അല്ലെങ്കിൽ ചാർജ് ചെയ്യുന്നില്ലായിരിക്കാം. വേഗത്തിലുള്ള ചാർജിംഗിനായി, നിർദ്ദേശിച്ച കേബിളും അഡാപ്റ്ററും ഉപയോഗിക്കുക."</string>
<string name="lockscreen_trivial_controls_summary" product="default" msgid="42562533085885152">"നിങ്ങളുടെ ഫോൺ അൺലോക്ക് ചെയ്യാതെ"</string>
<string name="lockscreen_trivial_controls_summary" product="tablet" msgid="9052068482124729345">"നിങ്ങളുടെ ടാബ്ലെറ്റ് അൺലോക്ക് ചെയ്യാതെ"</string>
<string name="auto_rotate_summary_a11y" product="default" msgid="2813368383309985185">"പോർട്രെയ്റ്റിനും ലാൻഡ്സ്കേപ്പിനും ഇടയിൽ നിങ്ങളുടെ ഫോൺ തിരിക്കുമ്പോൾ"</string>
diff --git a/res-product/values-mn/strings.xml b/res-product/values-mn/strings.xml
index 7b54dd4..e306cc9 100644
--- a/res-product/values-mn/strings.xml
+++ b/res-product/values-mn/strings.xml
@@ -347,12 +347,9 @@
<string name="lockpassword_confirm_your_password_details_frp" product="default" msgid="1465326741724776281">"Таны утсыг үйлдвэрийн тохиргоонд шинэчилсэн. Энэ утсыг ашиглахын тулд өмнөх нууц үгээ оруулна уу."</string>
<string name="lockpassword_confirm_your_password_details_frp" product="tablet" msgid="1333164951750797865">"Таны таблетыг үйлдвэрийн тохиргоонд шинэчилсэн. Өмнөх нууц үгээ оруулж энэ таблетыг ашиглана уу."</string>
<string name="lockpassword_confirm_your_password_details_frp" product="device" msgid="116667646012224967">"Таны төхөөрөмжийг үйлдвэрийн тохиргоонд шинэчилсэн. Өмнөх нууц үгээ оруулж төхөөрөмжийг ашиглана уу."</string>
- <!-- no translation found for battery_tip_incompatible_charging_message (5097154279720383707) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (4208335872169818919) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (5697523201841444736) -->
- <skip />
+ <string name="battery_tip_incompatible_charging_message" product="default" msgid="5097154279720383707">"Таны утас удаан цэнэглэгдэж эсвэл цэнэглэгдээгүй байж магадгүй. Илүү шуурхай цэнэглэхийн тулд санал болгосон кабель болон адаптерыг ашиглана уу."</string>
+ <string name="battery_tip_incompatible_charging_message" product="device" msgid="4208335872169818919">"Таны төхөөрөмж удаан цэнэглэгдэж эсвэл цэнэглэгдээгүй байж магадгүй. Илүү шуурхай цэнэглэхийн тулд санал болгосон кабель болон адаптерыг ашиглана уу."</string>
+ <string name="battery_tip_incompatible_charging_message" product="tablet" msgid="5697523201841444736">"Таны таблет удаан цэнэглэгдэж эсвэл цэнэглэгдээгүй байж магадгүй. Илүү шуурхай цэнэглэхийн тулд санал болгосон кабель болон адаптерыг ашиглана уу."</string>
<string name="lockscreen_trivial_controls_summary" product="default" msgid="42562533085885152">"Утасныхаа түгжээг тайлалгүйгээр"</string>
<string name="lockscreen_trivial_controls_summary" product="tablet" msgid="9052068482124729345">"Таблетынхаа түгжээг тайлалгүйгээр"</string>
<string name="auto_rotate_summary_a11y" product="default" msgid="2813368383309985185">"Таныг утсаа босоо болон хөндлөн чиглэлийн хооронд шилжүүлэх үед"</string>
diff --git a/res-product/values-mr/strings.xml b/res-product/values-mr/strings.xml
index 6c911f5..2707719 100644
--- a/res-product/values-mr/strings.xml
+++ b/res-product/values-mr/strings.xml
@@ -347,12 +347,9 @@
<string name="lockpassword_confirm_your_password_details_frp" product="default" msgid="1465326741724776281">"तुमचा फोन फॅक्टरी सेटिंग्जवर रीसेट केला होता. हा फोन वापरण्यासाठी, तुमचा मागील पासवर्ड एंटर करा."</string>
<string name="lockpassword_confirm_your_password_details_frp" product="tablet" msgid="1333164951750797865">"तुमचा टॅबलेट फॅक्टरी सेटिंग्जवर रीसेट केले होता. हा टॅबलेट वापरण्यासाठी, मागील पासवर्ड एंटर करा."</string>
<string name="lockpassword_confirm_your_password_details_frp" product="device" msgid="116667646012224967">"तुमचे डिव्हाइस फॅक्टरी सेटिंग्जवर रीसेट केले होते. हे डिव्हाइस वापरण्यासाठी, मागील पासवर्ड एंटर करा."</string>
- <!-- no translation found for battery_tip_incompatible_charging_message (5097154279720383707) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (4208335872169818919) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (5697523201841444736) -->
- <skip />
+ <string name="battery_tip_incompatible_charging_message" product="default" msgid="5097154279720383707">"तुमचा फोन कदाचित हळू चार्ज होत आहे किंवा चार्ज होत नाही. आणखी जलद चार्जिंगसाठी, शिफारस केलेली केबल आणि अडॅप्टर वापरा."</string>
+ <string name="battery_tip_incompatible_charging_message" product="device" msgid="4208335872169818919">"तुमचे डिव्हाइस कदाचित हळू चार्ज होत आहे किंवा चार्ज होत नाही. आणखी जलद चार्जिंगसाठी, शिफारस केलेली केबल आणि अडॅप्टर वापरा."</string>
+ <string name="battery_tip_incompatible_charging_message" product="tablet" msgid="5697523201841444736">"तुमचा टॅबलेट कदाचित हळू चार्ज होत आहे किंवा चार्ज होत नाही. आणखी जलद चार्जिंगसाठी, शिफारस केलेली केबल आणि अडॅप्टर वापरा."</string>
<string name="lockscreen_trivial_controls_summary" product="default" msgid="42562533085885152">"तुमचा फोन अनलॉक न करता"</string>
<string name="lockscreen_trivial_controls_summary" product="tablet" msgid="9052068482124729345">"तुमचा टॅबलेट अनलॉक न करता"</string>
<string name="auto_rotate_summary_a11y" product="default" msgid="2813368383309985185">"तुम्ही फोन हा पोर्ट्रेट व लॅंडस्केप मोडदरम्यान हलवल्यास"</string>
diff --git a/res-product/values-ms/strings.xml b/res-product/values-ms/strings.xml
index 614decf..f6b8740 100644
--- a/res-product/values-ms/strings.xml
+++ b/res-product/values-ms/strings.xml
@@ -347,12 +347,9 @@
<string name="lockpassword_confirm_your_password_details_frp" product="default" msgid="1465326741724776281">"Telefon ditetapkan semula kepada tetapan kilang. Masukkan kata laluan terdahulu untuk menggunakan telefon."</string>
<string name="lockpassword_confirm_your_password_details_frp" product="tablet" msgid="1333164951750797865">"Tablet ditetapkan semula kepada tetapan kilang. Masukkan kata laluan terdahulu untuk menggunakan tablet."</string>
<string name="lockpassword_confirm_your_password_details_frp" product="device" msgid="116667646012224967">"Peranti ditetapkan semula kepada tetapan kilang. Masukkan kata laluan terdahulu untuk menggunakan peranti."</string>
- <!-- no translation found for battery_tip_incompatible_charging_message (5097154279720383707) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (4208335872169818919) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (5697523201841444736) -->
- <skip />
+ <string name="battery_tip_incompatible_charging_message" product="default" msgid="5097154279720383707">"Telefon anda mungkin mengecas dengan perlahan atau tidak mengecas. Untuk pengecasan yang lebih pantas, gunakan kabel dan penyesuai yang disyorkan."</string>
+ <string name="battery_tip_incompatible_charging_message" product="device" msgid="4208335872169818919">"Peranti anda mungkin mengecas dengan perlahan atau tidak mengecas. Untuk pengecasan yang lebih pantas, gunakan kabel dan penyesuai yang disyorkan."</string>
+ <string name="battery_tip_incompatible_charging_message" product="tablet" msgid="5697523201841444736">"Tablet anda mungkin mengecas dengan perlahan atau tidak mengecas. Untuk pengecasan yang lebih pantas, gunakan kabel dan penyesuai yang disyorkan."</string>
<string name="lockscreen_trivial_controls_summary" product="default" msgid="42562533085885152">"Tanpa membuka kunci telefon anda"</string>
<string name="lockscreen_trivial_controls_summary" product="tablet" msgid="9052068482124729345">"Tanpa membuka kunci tablet anda"</string>
<string name="auto_rotate_summary_a11y" product="default" msgid="2813368383309985185">"Apabila anda menggerakkan telefon anda antara potret dengan landskap"</string>
diff --git a/res-product/values-my/strings.xml b/res-product/values-my/strings.xml
index a91ad22..0716e6e 100644
--- a/res-product/values-my/strings.xml
+++ b/res-product/values-my/strings.xml
@@ -347,12 +347,9 @@
<string name="lockpassword_confirm_your_password_details_frp" product="default" msgid="1465326741724776281">"သင့်ဖုန်းကို စက်ရုံဆက်တင်သို့ ပြင်ဆင်သတ်မှတ်ထားသည်။ ဤဖုန်းသုံးရန် ယခင်စကားဝှက် ထည့်ပါ။"</string>
<string name="lockpassword_confirm_your_password_details_frp" product="tablet" msgid="1333164951750797865">"တက်ဘလက်ကို စက်ရုံထုတ်ဆက်တင်သို့ ပြင်ဆင်သတ်မှတ်ထားသည်။ ဤတက်ဘလက်သုံးရန် ယခင်စကားဝှက် ထည့်ပါ။"</string>
<string name="lockpassword_confirm_your_password_details_frp" product="device" msgid="116667646012224967">"စက်ကို စက်ရုံထုတ်ဆက်တင်သို့ ပြင်ဆင်သတ်မှတ်ထားသည်။ ဤစက်ပစ္စည်းသုံးရန် ယခင်စကားဝှက် ထည့်ပါ။"</string>
- <!-- no translation found for battery_tip_incompatible_charging_message (5097154279720383707) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (4208335872169818919) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (5697523201841444736) -->
- <skip />
+ <string name="battery_tip_incompatible_charging_message" product="default" msgid="5097154279720383707">"သင့်ဖုန်းသည် နှေးကွေးစွာ အားသွင်းနေသည် (သို့) ၎င်းကို အားသွင်းမနေပါ။ အမြန်အားသွင်းခြင်းအတွက် အကြံပြုထားသော ကြိုးနှင့် အဒက်တာ သုံးပါ။"</string>
+ <string name="battery_tip_incompatible_charging_message" product="device" msgid="4208335872169818919">"သင့်စက်သည် နှေးကွေးစွာ အားသွင်းနေသည် (သို့) ၎င်းကို အားသွင်းမနေပါ။ အမြန်အားသွင်းခြင်းအတွက် အကြံပြုထားသော ကြိုးနှင့် အဒက်တာ သုံးပါ။"</string>
+ <string name="battery_tip_incompatible_charging_message" product="tablet" msgid="5697523201841444736">"သင့်တက်ဘလက်သည် နှေးကွေးစွာ အားသွင်းနေသည် (သို့) ၎င်းကို အားသွင်းမနေပါ။ အမြန်အားသွင်းခြင်းအတွက် အကြံပြုထားသော ကြိုးနှင့် အဒက်တာ သုံးပါ။"</string>
<string name="lockscreen_trivial_controls_summary" product="default" msgid="42562533085885152">"သင့်ဖုန်းကို လော့ခ်မဖွင့်ဘဲ"</string>
<string name="lockscreen_trivial_controls_summary" product="tablet" msgid="9052068482124729345">"သင့်တက်ဘလက်ကို လော့ခ်မဖွင့်ဘဲ"</string>
<string name="auto_rotate_summary_a11y" product="default" msgid="2813368383309985185">"သင့်ဖုန်းကို အလျားလိုက်နှင့် ဒေါင်လိုက် ပြောင်းသောအခါ"</string>
diff --git a/res-product/values-nb/strings.xml b/res-product/values-nb/strings.xml
index abb62b7..f5f348c 100644
--- a/res-product/values-nb/strings.xml
+++ b/res-product/values-nb/strings.xml
@@ -347,12 +347,9 @@
<string name="lockpassword_confirm_your_password_details_frp" product="default" msgid="1465326741724776281">"Telefonen er tilbakestilt til fabrikkstandard. For å bruke den, legg inn det forrige passordet."</string>
<string name="lockpassword_confirm_your_password_details_frp" product="tablet" msgid="1333164951750797865">"Nettbrettet er tilbakestilt til fabrikkstandard. For å bruke det, legg inn det forrige passordet."</string>
<string name="lockpassword_confirm_your_password_details_frp" product="device" msgid="116667646012224967">"Enheten er tilbakestilt til fabrikkstandard. For å bruke den, legg inn det forrige passordet."</string>
- <!-- no translation found for battery_tip_incompatible_charging_message (5097154279720383707) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (4208335872169818919) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (5697523201841444736) -->
- <skip />
+ <string name="battery_tip_incompatible_charging_message" product="default" msgid="5097154279720383707">"Det kan hende at telefonen din lader tregt eller ikke i det hele tatt. For å lade den raskere bør du bruke en anbefalt kabel og adapter."</string>
+ <string name="battery_tip_incompatible_charging_message" product="device" msgid="4208335872169818919">"Det kan hende at enheten din lader tregt eller ikke i det hele tatt. For å lade den raskere bør du bruke en anbefalt kabel og adapter."</string>
+ <string name="battery_tip_incompatible_charging_message" product="tablet" msgid="5697523201841444736">"Det kan hende at nettbrettet ditt lader tregt eller ikke i det hele tatt. For å lade det raskere bør du bruke en anbefalt kabel og adapter."</string>
<string name="lockscreen_trivial_controls_summary" product="default" msgid="42562533085885152">"Uten å låse opp telefonen"</string>
<string name="lockscreen_trivial_controls_summary" product="tablet" msgid="9052068482124729345">"Uten å låse opp nettbrettet"</string>
<string name="auto_rotate_summary_a11y" product="default" msgid="2813368383309985185">"Når du beveger telefonen mellom stående og liggende format"</string>
diff --git a/res-product/values-ne/strings.xml b/res-product/values-ne/strings.xml
index e5b106c..30f327e 100644
--- a/res-product/values-ne/strings.xml
+++ b/res-product/values-ne/strings.xml
@@ -347,12 +347,9 @@
<string name="lockpassword_confirm_your_password_details_frp" product="default" msgid="1465326741724776281">"तपाईंको फोन रिसेट गरी डिफल्ट सेटिङ लागू गरिएको छ। यो फोन प्रयोग गर्न अघिल्लो पासवर्ड हाल्नुहोस्।"</string>
<string name="lockpassword_confirm_your_password_details_frp" product="tablet" msgid="1333164951750797865">"तपाईंको ट्याब्लेट रिसेट गरी डिफल्ट सेटिङ लागू गरिएको छ। यो ट्याब्लेट प्रयोग गर्न अघिल्लो पासवर्ड हाल्नुहोस्।"</string>
<string name="lockpassword_confirm_your_password_details_frp" product="device" msgid="116667646012224967">"तपाईंको डिभाइस रिसेट गरी डिफल्ट सेटिङ लागू गरिएको छ। यो डिभाइस प्रयोग गर्न अघिल्लो पासवर्ड हाल्नुहोस्।"</string>
- <!-- no translation found for battery_tip_incompatible_charging_message (5097154279720383707) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (4208335872169818919) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (5697523201841444736) -->
- <skip />
+ <string name="battery_tip_incompatible_charging_message" product="default" msgid="5097154279720383707">"तपाईंको फोन बिस्तारै चार्ज भइरहेको वा चार्ज नै नभइरहेको हुन सक्छ। अझ छिटो चार्ज गर्न सिफारिस गरिएको केबल र एडाप्टर प्रयोग गर्नुहोस्।"</string>
+ <string name="battery_tip_incompatible_charging_message" product="device" msgid="4208335872169818919">"तपाईंको डिभाइस बिस्तारै चार्ज भइरहेको वा चार्ज नै नभइरहेको हुन सक्छ। अझ छिटो चार्ज गर्न सिफारिस गरिएको केबल र एडाप्टर प्रयोग गर्नुहोस्।"</string>
+ <string name="battery_tip_incompatible_charging_message" product="tablet" msgid="5697523201841444736">"तपाईंको ट्याब्लेट बिस्तारै चार्ज भइरहेको वा चार्ज नै नभइरहेको हुन सक्छ। अझ छिटो चार्ज गर्न सिफारिस गरिएको केबल र एडाप्टर प्रयोग गर्नुहोस्।"</string>
<string name="lockscreen_trivial_controls_summary" product="default" msgid="42562533085885152">"तपाईंको फोन अनलक नगरिकनै"</string>
<string name="lockscreen_trivial_controls_summary" product="tablet" msgid="9052068482124729345">"तपाईंको ट्याब्लेट अनलक नगरिकनै"</string>
<string name="auto_rotate_summary_a11y" product="default" msgid="2813368383309985185">"तपाईंले आफ्नो फोन पोर्ट्रेट र ल्यान्डस्केपबिच अदलबदल गर्दा"</string>
diff --git a/res-product/values-nl/strings.xml b/res-product/values-nl/strings.xml
index 98751fc..90ff019 100644
--- a/res-product/values-nl/strings.xml
+++ b/res-product/values-nl/strings.xml
@@ -347,12 +347,9 @@
<string name="lockpassword_confirm_your_password_details_frp" product="default" msgid="1465326741724776281">"Je telefoon is teruggezet op de fabrieksinstellingen. Geef je vorige wachtwoord op."</string>
<string name="lockpassword_confirm_your_password_details_frp" product="tablet" msgid="1333164951750797865">"Je tablet is teruggezet op de fabrieksinstellingen. Geef je vorige wachtwoord op."</string>
<string name="lockpassword_confirm_your_password_details_frp" product="device" msgid="116667646012224967">"Je apparaat is teruggezet op de fabrieksinstellingen. Geef je vorige wachtwoord op."</string>
- <!-- no translation found for battery_tip_incompatible_charging_message (5097154279720383707) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (4208335872169818919) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (5697523201841444736) -->
- <skip />
+ <string name="battery_tip_incompatible_charging_message" product="default" msgid="5097154279720383707">"Je telefoon laadt misschien langzaam of helemaal niet op. Gebruik een aanbevolen kabel en adapter om sneller op te laden."</string>
+ <string name="battery_tip_incompatible_charging_message" product="device" msgid="4208335872169818919">"Je apparaat laadt misschien langzaam of helemaal niet op. Gebruik een aanbevolen kabel en adapter om sneller op te laden."</string>
+ <string name="battery_tip_incompatible_charging_message" product="tablet" msgid="5697523201841444736">"Je tablet laadt misschien langzaam of helemaal niet op. Gebruik een aanbevolen kabel en adapter om sneller op te laden."</string>
<string name="lockscreen_trivial_controls_summary" product="default" msgid="42562533085885152">"Zonder je telefoon te ontgrendelen"</string>
<string name="lockscreen_trivial_controls_summary" product="tablet" msgid="9052068482124729345">"Zonder je tablet te ontgrendelen"</string>
<string name="auto_rotate_summary_a11y" product="default" msgid="2813368383309985185">"Als je wisselt tussen de staande en liggende telefoonstand"</string>
diff --git a/res-product/values-or/strings.xml b/res-product/values-or/strings.xml
index 554cc67..45eb653 100644
--- a/res-product/values-or/strings.xml
+++ b/res-product/values-or/strings.xml
@@ -347,12 +347,9 @@
<string name="lockpassword_confirm_your_password_details_frp" product="default" msgid="1465326741724776281">"ଆପଣଙ୍କ ଫୋନ ଫେକ୍ଟୋରୀ ସେଟିଂସରେ ରିସେଟ ହୋଇଛି। ଏହାକୁ ବ୍ୟବହାର କରିବାକୁ ଆପଣଙ୍କ ପୂର୍ବବର୍ତ୍ତୀ ପାସୱାର୍ଡ ଲେଖ।"</string>
<string name="lockpassword_confirm_your_password_details_frp" product="tablet" msgid="1333164951750797865">"ଆପଣଙ୍କ ଟାବଲେଟ ଫେକ୍ଟୋରୀ ସେଟିଂସରେ ରିସେଟ ହୋଇଛି। ଏହାକୁ ବ୍ୟବହାର କରିବାକୁ ଆପଣଙ୍କ ପୂର୍ବବର୍ତ୍ତୀ ପାସୱାର୍ଡ ଲେଖ।"</string>
<string name="lockpassword_confirm_your_password_details_frp" product="device" msgid="116667646012224967">"ଆପଣଙ୍କ ଡିଭାଇସ ଫେକ୍ଟୋରୀ ସେଟିଂସରେ ରିସେଟ ହୋଇଛି। ଏହାକୁ ବ୍ୟବହାର କରିବାକୁ ଆପଣଙ୍କ ପୂର୍ବବର୍ତ୍ତୀ ପାସୱାର୍ଡ ଲେଖ।"</string>
- <!-- no translation found for battery_tip_incompatible_charging_message (5097154279720383707) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (4208335872169818919) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (5697523201841444736) -->
- <skip />
+ <string name="battery_tip_incompatible_charging_message" product="default" msgid="5097154279720383707">"ଆପଣଙ୍କ ଫୋନ ଧୀରେ ଚାର୍ଜ ହେଉଥାଇପାରେ କିମ୍ବା ଚାର୍ଜ ହେଉନଥାଇପାରେ। ଆହୁରି ଶୀଘ୍ର ଚାର୍ଜ କରିବା ପାଇଁ ସୁପାରିଶ କରାଯାଇଥିବା ଏକ କେବୁଲ ଓ ଆଡାପ୍ଟର ବ୍ୟବହାର କରନ୍ତୁ।"</string>
+ <string name="battery_tip_incompatible_charging_message" product="device" msgid="4208335872169818919">"ଆପଣଙ୍କ ଡିଭାଇସ ଧୀରେ ଚାର୍ଜ ହେଉଥାଇପାରେ କିମ୍ବା ଚାର୍ଜ ହେଉନଥାଇପାରେ। ଆହୁରି ଶୀଘ୍ର ଚାର୍ଜ କରିବା ପାଇଁ ସୁପାରିଶ କରାଯାଇଥିବା ଏକ କେବୁଲ ଓ ଆଡାପ୍ଟର ବ୍ୟବହାର କରନ୍ତୁ।"</string>
+ <string name="battery_tip_incompatible_charging_message" product="tablet" msgid="5697523201841444736">"ଆପଣଙ୍କ ଟାବଲେଟ ଧୀରେ ଚାର୍ଜ ହେଉଥାଇପାରେ କିମ୍ବା ଚାର୍ଜ ହେଉନଥାଇପାରେ। ଆହୁରି ଶୀଘ୍ର ଚାର୍ଜ କରିବା ପାଇଁ ସୁପାରିଶ କରାଯାଇଥିବା ଏକ କେବୁଲ ଓ ଆଡାପ୍ଟର ବ୍ୟବହାର କରନ୍ତୁ।"</string>
<string name="lockscreen_trivial_controls_summary" product="default" msgid="42562533085885152">"ଆପଣଙ୍କ ଫୋନକୁ ଅନଲକ ନକରି"</string>
<string name="lockscreen_trivial_controls_summary" product="tablet" msgid="9052068482124729345">"ଆପଣଙ୍କ ଟାବଲେଟକୁ ଅନଲକ ନକରି"</string>
<string name="auto_rotate_summary_a11y" product="default" msgid="2813368383309985185">"ଆପଣ ଆପଣଙ୍କ ଫୋନକୁ ପୋର୍ଟ୍ରେଟ ଓ ଲାଣ୍ଡସ୍କେପ ମଧ୍ୟରେ ମୁଭ କଲେ"</string>
diff --git a/res-product/values-pa/strings.xml b/res-product/values-pa/strings.xml
index aac15f2..79d1fd2 100644
--- a/res-product/values-pa/strings.xml
+++ b/res-product/values-pa/strings.xml
@@ -347,12 +347,9 @@
<string name="lockpassword_confirm_your_password_details_frp" product="default" msgid="1465326741724776281">"ਤੁਹਾਡਾ ਫ਼ੋਨ ਫੈਕਟਰੀ ਸੈਟਿੰਗਾਂ \'ਤੇ ਰੀਸੈੱਟ ਕੀਤਾ ਗਿਆ। ਇਹ ਫ਼ੋਨ ਵਰਤਣ ਲਈ, ਆਪਣਾ ਪੁਰਾਣਾ ਪਾਸਵਰਡ ਦਾਖਲ ਕਰੋ।"</string>
<string name="lockpassword_confirm_your_password_details_frp" product="tablet" msgid="1333164951750797865">"ਤੁਹਾਡਾ ਟੈਬਲੈੱਟ ਫੈਕਟਰੀ ਸੈਟਿੰਗਾਂ \'ਤੇ ਰੀਸੈੱਟ ਕੀਤਾ ਗਿਆ। ਇਹ ਟੈਬਲੈੱਟ ਵਰਤਣ ਲਈ, ਆਪਣਾ ਪੁਰਾਣਾ ਪਾਸਵਰਡ ਦਾਖਲ ਕਰੋ।"</string>
<string name="lockpassword_confirm_your_password_details_frp" product="device" msgid="116667646012224967">"ਤੁਹਾਡਾ ਡੀਵਾਈਸ ਫੈਕਟਰੀ ਸੈਟਿੰਗਾਂ \'ਤੇ ਰੀਸੈੱਟ ਕੀਤਾ ਗਿਆ। ਇਹ ਡੀਵਾਈਸ ਵਰਤਣ ਲਈ, ਆਪਣਾ ਪੁਰਾਣਾ ਪਾਸਵਰਡ ਦਾਖਲ ਕਰੋ।"</string>
- <!-- no translation found for battery_tip_incompatible_charging_message (5097154279720383707) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (4208335872169818919) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (5697523201841444736) -->
- <skip />
+ <string name="battery_tip_incompatible_charging_message" product="default" msgid="5097154279720383707">"ਸ਼ਾਇਦ ਤੁਹਾਡਾ ਫ਼ੋਨ ਹੌਲੀ-ਹੌਲੀ ਚਾਰਜ ਹੋ ਰਿਹਾ ਹੈ ਜਾਂ ਚਾਰਜ ਨਹੀਂ ਹੋ ਰਿਹਾ। ਤੇਜ਼ੀ ਨਾਲ ਚਾਰਜ ਕਰਨ ਲਈ, ਸਿਫ਼ਾਰਸ਼ ਕੀਤੀ ਕੇਬਲ ਅਤੇ ਅਡਾਪਟਰ ਦੀ ਵਰਤੋਂ ਕਰੋ।"</string>
+ <string name="battery_tip_incompatible_charging_message" product="device" msgid="4208335872169818919">"ਸ਼ਾਇਦ ਤੁਹਾਡਾ ਡੀਵਾਈਸ ਹੌਲੀ-ਹੌਲੀ ਚਾਰਜ ਹੋ ਰਿਹਾ ਹੈ ਜਾਂ ਚਾਰਜ ਨਹੀਂ ਹੋ ਰਿਹਾ। ਤੇਜ਼ੀ ਨਾਲ ਚਾਰਜ ਕਰਨ ਲਈ, ਸਿਫ਼ਾਰਸ਼ ਕੀਤੀ ਕੇਬਲ ਅਤੇ ਅਡਾਪਟਰ ਦੀ ਵਰਤੋਂ ਕਰੋ।"</string>
+ <string name="battery_tip_incompatible_charging_message" product="tablet" msgid="5697523201841444736">"ਸ਼ਾਇਦ ਤੁਹਾਡਾ ਟੈਬਲੈੱਟ ਹੌਲੀ-ਹੌਲੀ ਚਾਰਜ ਹੋ ਰਿਹਾ ਹੈ ਜਾਂ ਚਾਰਜ ਨਹੀਂ ਹੋ ਰਿਹਾ। ਤੇਜ਼ੀ ਨਾਲ ਚਾਰਜ ਕਰਨ ਲਈ, ਸਿਫ਼ਾਰਸ਼ ਕੀਤੀ ਕੇਬਲ ਅਤੇ ਅਡਾਪਟਰ ਦੀ ਵਰਤੋਂ ਕਰੋ।"</string>
<string name="lockscreen_trivial_controls_summary" product="default" msgid="42562533085885152">"ਆਪਣੇ ਫ਼ੋਨ ਨੂੰ ਅਣਲਾਕ ਕੀਤੇ ਬਿਨਾਂ"</string>
<string name="lockscreen_trivial_controls_summary" product="tablet" msgid="9052068482124729345">"ਆਪਣੇ ਟੈਬਲੈੱਟ ਨੂੰ ਅਣਲਾਕ ਕੀਤੇ ਬਿਨਾਂ"</string>
<string name="auto_rotate_summary_a11y" product="default" msgid="2813368383309985185">"ਜਦੋਂ ਤੁਸੀਂ ਆਪਣੇ ਫ਼ੋਨ \'ਤੇ ਪੋਰਟਰੇਟ ਅਤੇ ਲੈਂਡਸਕੇਪ ਮੋਡ ਵਿਚਕਾਰ ਅਦਲਾ-ਬਦਲੀ ਕਰਦੇ ਹੋ"</string>
diff --git a/res-product/values-pl/strings.xml b/res-product/values-pl/strings.xml
index f04d427..513a72c 100644
--- a/res-product/values-pl/strings.xml
+++ b/res-product/values-pl/strings.xml
@@ -347,12 +347,9 @@
<string name="lockpassword_confirm_your_password_details_frp" product="default" msgid="1465326741724776281">"Telefon został zresetowany do ustawień fabrycznych. Aby go używać, wpisz poprzednie hasło."</string>
<string name="lockpassword_confirm_your_password_details_frp" product="tablet" msgid="1333164951750797865">"Tablet został zresetowany do ustawień fabrycznych. Aby go używać, wpisz poprzednie hasło."</string>
<string name="lockpassword_confirm_your_password_details_frp" product="device" msgid="116667646012224967">"Urządzenie zostało zresetowane do ustawień fabrycznych. Aby go używać, wpisz poprzednie hasło."</string>
- <!-- no translation found for battery_tip_incompatible_charging_message (5097154279720383707) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (4208335872169818919) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (5697523201841444736) -->
- <skip />
+ <string name="battery_tip_incompatible_charging_message" product="default" msgid="5097154279720383707">"Telefon może ładować się powoli lub w ogóle się nie ładować. Aby ładować go szybciej, użyj zalecanego kabla i ładowarki."</string>
+ <string name="battery_tip_incompatible_charging_message" product="device" msgid="4208335872169818919">"Urządzenie może ładować się powoli lub w ogóle się nie ładować. Aby ładować je szybciej, użyj zalecanego kabla i ładowarki."</string>
+ <string name="battery_tip_incompatible_charging_message" product="tablet" msgid="5697523201841444736">"Tablet może ładować się powoli lub w ogóle się nie ładować. Aby ładować go szybciej, użyj zalecanego kabla i ładowarki."</string>
<string name="lockscreen_trivial_controls_summary" product="default" msgid="42562533085885152">"Bez odblokowywania telefonu"</string>
<string name="lockscreen_trivial_controls_summary" product="tablet" msgid="9052068482124729345">"Bez odblokowywania tabletu"</string>
<string name="auto_rotate_summary_a11y" product="default" msgid="2813368383309985185">"Gdy obracasz telefon do pionu lub poziomu"</string>
diff --git a/res-product/values-pt-rBR/strings.xml b/res-product/values-pt-rBR/strings.xml
index ffabb2e..938944c 100644
--- a/res-product/values-pt-rBR/strings.xml
+++ b/res-product/values-pt-rBR/strings.xml
@@ -347,12 +347,9 @@
<string name="lockpassword_confirm_your_password_details_frp" product="default" msgid="1465326741724776281">"O smartphone foi redefinido para as configurações originais. Para usá-lo, digite a senha anterior."</string>
<string name="lockpassword_confirm_your_password_details_frp" product="tablet" msgid="1333164951750797865">"O tablet foi redefinido para as configurações originais. Para usá-lo, insira a senha anterior."</string>
<string name="lockpassword_confirm_your_password_details_frp" product="device" msgid="116667646012224967">"O dispositivo foi redefinido para as configurações originais. Para usá-lo, insira a senha anterior."</string>
- <!-- no translation found for battery_tip_incompatible_charging_message (5097154279720383707) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (4208335872169818919) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (5697523201841444736) -->
- <skip />
+ <string name="battery_tip_incompatible_charging_message" product="default" msgid="5097154279720383707">"O smartphone pode estar com o carregamento lento ou não estar carregando. Para um carregamento mais rápido, use um cabo e um adaptador recomendados."</string>
+ <string name="battery_tip_incompatible_charging_message" product="device" msgid="4208335872169818919">"O dispositivo pode estar com o carregamento lento ou não estar carregando. Para um carregamento mais rápido, use um cabo e um adaptador recomendados."</string>
+ <string name="battery_tip_incompatible_charging_message" product="tablet" msgid="5697523201841444736">"O tablet pode estar com o carregamento lento ou não estar carregando. Para um carregamento mais rápido, use um cabo e um adaptador recomendados."</string>
<string name="lockscreen_trivial_controls_summary" product="default" msgid="42562533085885152">"Sem desbloquear o smartphone"</string>
<string name="lockscreen_trivial_controls_summary" product="tablet" msgid="9052068482124729345">"Sem desbloquear o tablet"</string>
<string name="auto_rotate_summary_a11y" product="default" msgid="2813368383309985185">"Ao virar o smartphone para as posições vertical e horizontal"</string>
diff --git a/res-product/values-pt-rPT/strings.xml b/res-product/values-pt-rPT/strings.xml
index 234017a..a675d51 100644
--- a/res-product/values-pt-rPT/strings.xml
+++ b/res-product/values-pt-rPT/strings.xml
@@ -347,12 +347,9 @@
<string name="lockpassword_confirm_your_password_details_frp" product="default" msgid="1465326741724776281">"Definições de fábrica do telemóvel repostas. Para o usar, introduza a palavra-passe anterior."</string>
<string name="lockpassword_confirm_your_password_details_frp" product="tablet" msgid="1333164951750797865">"Definições de fábrica do tablet repostas. Para o usar, introduza a palavra-passe anterior."</string>
<string name="lockpassword_confirm_your_password_details_frp" product="device" msgid="116667646012224967">"Definições de fábrica do dispositivo repostas. Para o usar, introduza a palavra-passe anterior."</string>
- <!-- no translation found for battery_tip_incompatible_charging_message (5097154279720383707) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (4208335872169818919) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (5697523201841444736) -->
- <skip />
+ <string name="battery_tip_incompatible_charging_message" product="default" msgid="5097154279720383707">"O telemóvel pode estar a carregar lentamente ou não estar a carregar. Para um carregamento mais rápido, use um cabo e um transformador recomendados."</string>
+ <string name="battery_tip_incompatible_charging_message" product="device" msgid="4208335872169818919">"O dispositivo pode estar a carregar lentamente ou não estar a carregar. Para um carregamento mais rápido, use um cabo e um transformador recomendados."</string>
+ <string name="battery_tip_incompatible_charging_message" product="tablet" msgid="5697523201841444736">"O tablet pode estar a carregar lentamente ou não estar a carregar. Para um carregamento mais rápido, use um cabo e um transformador recomendados."</string>
<string name="lockscreen_trivial_controls_summary" product="default" msgid="42562533085885152">"Sem desbloquear o telemóvel"</string>
<string name="lockscreen_trivial_controls_summary" product="tablet" msgid="9052068482124729345">"Sem desbloquear o tablet"</string>
<string name="auto_rotate_summary_a11y" product="default" msgid="2813368383309985185">"Quando move o telemóvel entre o modo vertical e horizontal"</string>
diff --git a/res-product/values-pt/strings.xml b/res-product/values-pt/strings.xml
index ffabb2e..938944c 100644
--- a/res-product/values-pt/strings.xml
+++ b/res-product/values-pt/strings.xml
@@ -347,12 +347,9 @@
<string name="lockpassword_confirm_your_password_details_frp" product="default" msgid="1465326741724776281">"O smartphone foi redefinido para as configurações originais. Para usá-lo, digite a senha anterior."</string>
<string name="lockpassword_confirm_your_password_details_frp" product="tablet" msgid="1333164951750797865">"O tablet foi redefinido para as configurações originais. Para usá-lo, insira a senha anterior."</string>
<string name="lockpassword_confirm_your_password_details_frp" product="device" msgid="116667646012224967">"O dispositivo foi redefinido para as configurações originais. Para usá-lo, insira a senha anterior."</string>
- <!-- no translation found for battery_tip_incompatible_charging_message (5097154279720383707) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (4208335872169818919) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (5697523201841444736) -->
- <skip />
+ <string name="battery_tip_incompatible_charging_message" product="default" msgid="5097154279720383707">"O smartphone pode estar com o carregamento lento ou não estar carregando. Para um carregamento mais rápido, use um cabo e um adaptador recomendados."</string>
+ <string name="battery_tip_incompatible_charging_message" product="device" msgid="4208335872169818919">"O dispositivo pode estar com o carregamento lento ou não estar carregando. Para um carregamento mais rápido, use um cabo e um adaptador recomendados."</string>
+ <string name="battery_tip_incompatible_charging_message" product="tablet" msgid="5697523201841444736">"O tablet pode estar com o carregamento lento ou não estar carregando. Para um carregamento mais rápido, use um cabo e um adaptador recomendados."</string>
<string name="lockscreen_trivial_controls_summary" product="default" msgid="42562533085885152">"Sem desbloquear o smartphone"</string>
<string name="lockscreen_trivial_controls_summary" product="tablet" msgid="9052068482124729345">"Sem desbloquear o tablet"</string>
<string name="auto_rotate_summary_a11y" product="default" msgid="2813368383309985185">"Ao virar o smartphone para as posições vertical e horizontal"</string>
diff --git a/res-product/values-ro/strings.xml b/res-product/values-ro/strings.xml
index 9cbc548..0c9b9c9 100644
--- a/res-product/values-ro/strings.xml
+++ b/res-product/values-ro/strings.xml
@@ -347,12 +347,9 @@
<string name="lockpassword_confirm_your_password_details_frp" product="default" msgid="1465326741724776281">"S-a revenit la setările din fabrică ale telefonului. Ca să-l folosești, introdu parola anterioară."</string>
<string name="lockpassword_confirm_your_password_details_frp" product="tablet" msgid="1333164951750797865">"S-a revenit la setările din fabrică ale tabletei. Ca să o folosești, introdu parola anterioară."</string>
<string name="lockpassword_confirm_your_password_details_frp" product="device" msgid="116667646012224967">"S-a revenit la setările din fabrică ale dispozitivului. Ca să-l folosești, introdu parola anterioară."</string>
- <!-- no translation found for battery_tip_incompatible_charging_message (5097154279720383707) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (4208335872169818919) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (5697523201841444736) -->
- <skip />
+ <string name="battery_tip_incompatible_charging_message" product="default" msgid="5097154279720383707">"Este posibil ca telefonul tău să se încarce lent sau deloc. Pentru încărcare mai rapidă, folosește un cablu și un adaptor recomandat."</string>
+ <string name="battery_tip_incompatible_charging_message" product="device" msgid="4208335872169818919">"Este posibil ca dispozitivul tău să se încarce lent sau deloc. Pentru încărcare mai rapidă, folosește un cablu și un adaptor recomandat."</string>
+ <string name="battery_tip_incompatible_charging_message" product="tablet" msgid="5697523201841444736">"Este posibil ca tableta ta să se încarce lent sau deloc. Pentru încărcare mai rapidă, folosește un cablu și un adaptor recomandat."</string>
<string name="lockscreen_trivial_controls_summary" product="default" msgid="42562533085885152">"Fără a debloca telefonul"</string>
<string name="lockscreen_trivial_controls_summary" product="tablet" msgid="9052068482124729345">"Fără a debloca tableta"</string>
<string name="auto_rotate_summary_a11y" product="default" msgid="2813368383309985185">"Când comuți telefonul între orientările portret și peisaj"</string>
diff --git a/res-product/values-ru/strings.xml b/res-product/values-ru/strings.xml
index ac503b9..62c074c 100644
--- a/res-product/values-ru/strings.xml
+++ b/res-product/values-ru/strings.xml
@@ -347,12 +347,9 @@
<string name="lockpassword_confirm_your_password_details_frp" product="default" msgid="1465326741724776281">"Настройки телефона были сброшены. Чтобы использовать его, введите свой прежний пароль."</string>
<string name="lockpassword_confirm_your_password_details_frp" product="tablet" msgid="1333164951750797865">"Настройки планшета были сброшены. Чтобы использовать его, введите свой прежний пароль."</string>
<string name="lockpassword_confirm_your_password_details_frp" product="device" msgid="116667646012224967">"Настройки устройства были сброшены. Чтобы использовать его, введите свой прежний пароль."</string>
- <!-- no translation found for battery_tip_incompatible_charging_message (5097154279720383707) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (4208335872169818919) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (5697523201841444736) -->
- <skip />
+ <string name="battery_tip_incompatible_charging_message" product="default" msgid="5097154279720383707">"Возможно, ваш телефон заряжается медленно или не заряжается. Чтобы устранить проблему, используйте рекомендуемые кабель и адаптер питания."</string>
+ <string name="battery_tip_incompatible_charging_message" product="device" msgid="4208335872169818919">"Возможно, ваше устройство заряжается медленно или не заряжается. Чтобы устранить проблему, используйте рекомендуемые кабель и адаптер питания."</string>
+ <string name="battery_tip_incompatible_charging_message" product="tablet" msgid="5697523201841444736">"Возможно, ваш планшет заряжается медленно или не заряжается. Чтобы устранить проблему, используйте рекомендуемые кабель и адаптер питания."</string>
<string name="lockscreen_trivial_controls_summary" product="default" msgid="42562533085885152">"Без разблокировки телефона"</string>
<string name="lockscreen_trivial_controls_summary" product="tablet" msgid="9052068482124729345">"Без разблокировки планшета"</string>
<string name="auto_rotate_summary_a11y" product="default" msgid="2813368383309985185">"Переключать ориентацию при изменении положения телефона"</string>
diff --git a/res-product/values-si/strings.xml b/res-product/values-si/strings.xml
index 10ff8d0..541f5fa 100644
--- a/res-product/values-si/strings.xml
+++ b/res-product/values-si/strings.xml
@@ -347,12 +347,9 @@
<string name="lockpassword_confirm_your_password_details_frp" product="default" msgid="1465326741724776281">"ඔබේ දුරකථනය කම්හල් සැකසීම් වෙත යළි සකසා ඇත. මෙම දුරකථනය භාවිතා කිරීමට, ඔබේ පෙර මුරපදය ඇතුළු කරන්න."</string>
<string name="lockpassword_confirm_your_password_details_frp" product="tablet" msgid="1333164951750797865">"ඔබේ ටැබ්ලටය කම්හල් සැකසීම් වෙත යළි සකසන ලදි. මෙම ටැබ්ලටය භාවිතය සඳහා, ඔබේ පෙර මුරපදය ඇතුළු කරන්න."</string>
<string name="lockpassword_confirm_your_password_details_frp" product="device" msgid="116667646012224967">"ඔබේ උපාංගය කම්හල් සැකසීම් වෙත යළි සකසන ලදි. මෙම උපාංගය භාවිතය සඳහා, ඔබේ පෙර මුරපදය ඇතුළු කරන්න."</string>
- <!-- no translation found for battery_tip_incompatible_charging_message (5097154279720383707) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (4208335872169818919) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (5697523201841444736) -->
- <skip />
+ <string name="battery_tip_incompatible_charging_message" product="default" msgid="5097154279720383707">"ඔබේ දුරකථනය සෙමින් ආරෝපණය වෙමින් හෝ ආරෝපණය නොවීමට ඉඩ ඇත. වේගවත් ආරෝපණය සඳහා, නිර්දේශිත කේබලයක් සහ ඇඩප්ටරයක් භාවිත කරන්න."</string>
+ <string name="battery_tip_incompatible_charging_message" product="device" msgid="4208335872169818919">"ඔබේ උපාංගය සෙමින් ආරෝපණය වෙමින් හෝ ආරෝපණය නොවීමට ඉඩ ඇත. වේගවත් ආරෝපණය සඳහා, නිර්දේශිත කේබලයක් සහ ඇඩප්ටරයක් භාවිත කරන්න."</string>
+ <string name="battery_tip_incompatible_charging_message" product="tablet" msgid="5697523201841444736">"ඔබේ ටැබ්ලටය සෙමින් ආරෝපණය වෙමින් හෝ ආරෝපණය නොවීමට ඉඩ ඇත. වේගවත් ආරෝපණය සඳහා, නිර්දේශිත කේබලයක් සහ ඇඩප්ටරයක් භාවිත කරන්න."</string>
<string name="lockscreen_trivial_controls_summary" product="default" msgid="42562533085885152">"ඔබේ දුරකථනය අගුළු හැරීමෙන් තොරව"</string>
<string name="lockscreen_trivial_controls_summary" product="tablet" msgid="9052068482124729345">"ඔබේ ටැබ්ලටය අගුළු හැරීමෙන් තොරව"</string>
<string name="auto_rotate_summary_a11y" product="default" msgid="2813368383309985185">"ඔබ ඔබේ දුරකථනය සිරස් සහ තිරස් අතර ගෙන යන විට"</string>
diff --git a/res-product/values-sk/strings.xml b/res-product/values-sk/strings.xml
index 8ffb92d..9146769 100644
--- a/res-product/values-sk/strings.xml
+++ b/res-product/values-sk/strings.xml
@@ -347,12 +347,9 @@
<string name="lockpassword_confirm_your_password_details_frp" product="default" msgid="1465326741724776281">"V telefóne boli obnovené výrobné nastavenia. Ak ho chcete použiť, zadajte predchádzajúce heslo."</string>
<string name="lockpassword_confirm_your_password_details_frp" product="tablet" msgid="1333164951750797865">"V tablete boli obnovené výrobné nastavenia. Ak ho chcete používať, zadajte predchádzajúce heslo."</string>
<string name="lockpassword_confirm_your_password_details_frp" product="device" msgid="116667646012224967">"V zariadení boli obnovené výrobné nastavenia. Ak ho chcete používať, zadajte predchádzajúce heslo."</string>
- <!-- no translation found for battery_tip_incompatible_charging_message (5097154279720383707) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (4208335872169818919) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (5697523201841444736) -->
- <skip />
+ <string name="battery_tip_incompatible_charging_message" product="default" msgid="5097154279720383707">"Váš telefón sa zrejme nabíja pomaly alebo sa nenabíja vôbec. Ak chcete, aby sa nabíjal rýchlejšie, použite odporúčaný kábel a nabíjačku."</string>
+ <string name="battery_tip_incompatible_charging_message" product="device" msgid="4208335872169818919">"Vaše zariadenie sa zrejme nabíja pomaly alebo sa nenabíja vôbec. Ak chcete, aby sa nabíjalo rýchlejšie, použite odporúčaný kábel a nabíjačku."</string>
+ <string name="battery_tip_incompatible_charging_message" product="tablet" msgid="5697523201841444736">"Váš tablet sa zrejme nabíja pomaly alebo sa nenabíja vôbec. Ak chcete, aby sa nabíjal rýchlejšie, použite odporúčaný kábel a nabíjačku."</string>
<string name="lockscreen_trivial_controls_summary" product="default" msgid="42562533085885152">"Bez odomykania telefónu"</string>
<string name="lockscreen_trivial_controls_summary" product="tablet" msgid="9052068482124729345">"Bez odomykania tabletu"</string>
<string name="auto_rotate_summary_a11y" product="default" msgid="2813368383309985185">"Keď telefón otočíte z orientácie na výšku do polohy na šírku"</string>
diff --git a/res-product/values-sl/strings.xml b/res-product/values-sl/strings.xml
index c706abd..db4f2a9 100644
--- a/res-product/values-sl/strings.xml
+++ b/res-product/values-sl/strings.xml
@@ -347,12 +347,9 @@
<string name="lockpassword_confirm_your_password_details_frp" product="default" msgid="1465326741724776281">"Telefon je bil ponastavljen na tovarniške nastavitve. Če ga želite uporabljati, vnesite prejšnje geslo."</string>
<string name="lockpassword_confirm_your_password_details_frp" product="tablet" msgid="1333164951750797865">"Tablični računalnik je bil ponastavljen na tovarniške nastavitve. Če ga želite uporabljati, vnesite prejšnje geslo."</string>
<string name="lockpassword_confirm_your_password_details_frp" product="device" msgid="116667646012224967">"Naprava je bila ponastavljena na tovarniške nastavitve. Če jo želite uporabljati, vnesite prejšnje geslo."</string>
- <!-- no translation found for battery_tip_incompatible_charging_message (5097154279720383707) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (4208335872169818919) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (5697523201841444736) -->
- <skip />
+ <string name="battery_tip_incompatible_charging_message" product="default" msgid="5097154279720383707">"Baterija telefona se morda polni počasi ali se sploh ne polni. Za hitrejše polnjenje uporabite priporočena kabel in napajalnik."</string>
+ <string name="battery_tip_incompatible_charging_message" product="device" msgid="4208335872169818919">"Baterija naprave se morda polni počasi ali se sploh ne polni. Za hitrejše polnjenje uporabite priporočena kabel in napajalnik."</string>
+ <string name="battery_tip_incompatible_charging_message" product="tablet" msgid="5697523201841444736">"Baterija tabličnega računalnika se morda polni počasi ali se sploh ne polni. Za hitrejše polnjenje uporabite priporočena kabel in napajalnik."</string>
<string name="lockscreen_trivial_controls_summary" product="default" msgid="42562533085885152">"Brez odklepanja telefona"</string>
<string name="lockscreen_trivial_controls_summary" product="tablet" msgid="9052068482124729345">"Brez odklepanja tabličnega računalnika"</string>
<string name="auto_rotate_summary_a11y" product="default" msgid="2813368383309985185">"Ko telefon obrnete iz navpičnega v vodoravni položaj ali obratno."</string>
diff --git a/res-product/values-sq/strings.xml b/res-product/values-sq/strings.xml
index 992a579..9fc07a6 100644
--- a/res-product/values-sq/strings.xml
+++ b/res-product/values-sq/strings.xml
@@ -347,12 +347,9 @@
<string name="lockpassword_confirm_your_password_details_frp" product="default" msgid="1465326741724776281">"Telefoni u rivendos në cilësimet e fabrikës. Për të përdorur telefonin, fut fjalëkalim të mëparshëm."</string>
<string name="lockpassword_confirm_your_password_details_frp" product="tablet" msgid="1333164951750797865">"Tableti u rivendos në cilësimet e fabrikës. Për të përdorur tabletin, fut fjalëkalimin e mëparshëm."</string>
<string name="lockpassword_confirm_your_password_details_frp" product="device" msgid="116667646012224967">"Pajisja u rivendos në cilësimet e fabrikës. Për të përdorur pajisjen, fut fjalëkalimin e mëparshëm."</string>
- <!-- no translation found for battery_tip_incompatible_charging_message (5097154279720383707) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (4208335872169818919) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (5697523201841444736) -->
- <skip />
+ <string name="battery_tip_incompatible_charging_message" product="default" msgid="5097154279720383707">"Telefoni yt mund të jetë duke u karikuar ngadalë ose nuk po karikohet. Për karikim më të shpejtë, përdor një kabllo dhe përshtatës të rekomanduar."</string>
+ <string name="battery_tip_incompatible_charging_message" product="device" msgid="4208335872169818919">"Pajisja jote mund të jetë duke u karikuar ngadalë ose nuk po karikohet. Për karikim më të shpejtë, përdor një kabllo dhe përshtatës të rekomanduar."</string>
+ <string name="battery_tip_incompatible_charging_message" product="tablet" msgid="5697523201841444736">"Tableti yt mund të jetë duke u karikuar ngadalë ose nuk po karikohet. Për karikim më të shpejtë, përdor një kabllo dhe përshtatës të rekomanduar."</string>
<string name="lockscreen_trivial_controls_summary" product="default" msgid="42562533085885152">"Pa e shkyçur telefonin"</string>
<string name="lockscreen_trivial_controls_summary" product="tablet" msgid="9052068482124729345">"Pa e shkyçur tabletin"</string>
<string name="auto_rotate_summary_a11y" product="default" msgid="2813368383309985185">"Kur lëviz telefonin mes modalitetit \"portret\" e \"horizontal\""</string>
diff --git a/res-product/values-sr/strings.xml b/res-product/values-sr/strings.xml
index dd38414..a949982 100644
--- a/res-product/values-sr/strings.xml
+++ b/res-product/values-sr/strings.xml
@@ -347,12 +347,9 @@
<string name="lockpassword_confirm_your_password_details_frp" product="default" msgid="1465326741724776281">"Телефон је ресетован на фабричка подешавања. Да бисте га користили, унесите претходну лозинку."</string>
<string name="lockpassword_confirm_your_password_details_frp" product="tablet" msgid="1333164951750797865">"Таблет је ресетован на фабричка подешавања. Да бисте га користили, унесите претходну лозинку."</string>
<string name="lockpassword_confirm_your_password_details_frp" product="device" msgid="116667646012224967">"Уређај је ресетован на фабричка подешавања. Да бисте га користили, унесите претходну лозинку."</string>
- <!-- no translation found for battery_tip_incompatible_charging_message (5097154279720383707) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (4208335872169818919) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (5697523201841444736) -->
- <skip />
+ <string name="battery_tip_incompatible_charging_message" product="default" msgid="5097154279720383707">"Телефон се можда споро пуни или се уопште не пуни. Ако желите брже пуњење, користите препоручени кабл и адаптер."</string>
+ <string name="battery_tip_incompatible_charging_message" product="device" msgid="4208335872169818919">"Уређај се можда споро пуни или се уопште не пуни. Ако желите брже пуњење, користите препоручени кабл и адаптер."</string>
+ <string name="battery_tip_incompatible_charging_message" product="tablet" msgid="5697523201841444736">"Таблет се можда споро пуни или се уопште не пуни. Ако желите брже пуњење, користите препоручени кабл и адаптер."</string>
<string name="lockscreen_trivial_controls_summary" product="default" msgid="42562533085885152">"Без откључавања телефона"</string>
<string name="lockscreen_trivial_controls_summary" product="tablet" msgid="9052068482124729345">"Без откључавања таблета"</string>
<string name="auto_rotate_summary_a11y" product="default" msgid="2813368383309985185">"Када окрећете телефон у усправни или водоравни режим"</string>
diff --git a/res-product/values-sv/strings.xml b/res-product/values-sv/strings.xml
index 254c1fe..218576a 100644
--- a/res-product/values-sv/strings.xml
+++ b/res-product/values-sv/strings.xml
@@ -347,12 +347,9 @@
<string name="lockpassword_confirm_your_password_details_frp" product="default" msgid="1465326741724776281">"Telefonens standardinställningar har återställts. Ange det tidigare lösenordet för telefonen."</string>
<string name="lockpassword_confirm_your_password_details_frp" product="tablet" msgid="1333164951750797865">"Surfplattans standardinställningar har återställts. Ange det tidigare lösenordet för surfplattan."</string>
<string name="lockpassword_confirm_your_password_details_frp" product="device" msgid="116667646012224967">"Enhetens standardinställningar har återställts. Ange det tidigare lösenordet för enheten."</string>
- <!-- no translation found for battery_tip_incompatible_charging_message (5097154279720383707) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (4208335872169818919) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (5697523201841444736) -->
- <skip />
+ <string name="battery_tip_incompatible_charging_message" product="default" msgid="5097154279720383707">"Telefonen kanske laddas långsamt eller inte laddas alls. Använd en rekommenderad kabel och nätadapter för snabbare laddning."</string>
+ <string name="battery_tip_incompatible_charging_message" product="device" msgid="4208335872169818919">"Enheten kanske laddas långsamt eller inte laddas alls. Använd en rekommenderad kabel och nätadapter för snabbare laddning."</string>
+ <string name="battery_tip_incompatible_charging_message" product="tablet" msgid="5697523201841444736">"Surfplattan kanske laddas långsamt eller inte laddas alls. Använd en rekommenderad kabel och nätadapter för snabbare laddning."</string>
<string name="lockscreen_trivial_controls_summary" product="default" msgid="42562533085885152">"Utan att låsa upp telefonen"</string>
<string name="lockscreen_trivial_controls_summary" product="tablet" msgid="9052068482124729345">"Utan att låsa upp surfplattan"</string>
<string name="auto_rotate_summary_a11y" product="default" msgid="2813368383309985185">"När du vänder telefonen mellan stående och liggande läge"</string>
diff --git a/res-product/values-sw/strings.xml b/res-product/values-sw/strings.xml
index c7b900e..2db568b 100644
--- a/res-product/values-sw/strings.xml
+++ b/res-product/values-sw/strings.xml
@@ -347,12 +347,9 @@
<string name="lockpassword_confirm_your_password_details_frp" product="default" msgid="1465326741724776281">"Mipangilio ya kiwandani ilirejeshwa kwenye simu yako. Ili utumie simu hii, weka nenosiri lako la awali."</string>
<string name="lockpassword_confirm_your_password_details_frp" product="tablet" msgid="1333164951750797865">"Mipangilio ya kiwandani ilirejeshwa kwenye kompyuta kibao yako. Ili utumie kompyuta kibao hii, weka nenosiri lako la awali."</string>
<string name="lockpassword_confirm_your_password_details_frp" product="device" msgid="116667646012224967">"Mipangilio ya kiwandani ilirejeshwa kwenye kifaa chako. Ili utumie kifaa hiki, weka nenosiri lako la awali."</string>
- <!-- no translation found for battery_tip_incompatible_charging_message (5097154279720383707) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (4208335872169818919) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (5697523201841444736) -->
- <skip />
+ <string name="battery_tip_incompatible_charging_message" product="default" msgid="5097154279720383707">"Huenda simu yako inachaji polepole au haichaji. Ili uchaji kwa kasi, tumia kebo na adapta inayopendekezwa."</string>
+ <string name="battery_tip_incompatible_charging_message" product="device" msgid="4208335872169818919">"Huenda kifaa chako kinachaji polepole au hakichaji. Ili uchaji kwa kasi, tumia kebo na adapta inayopendekezwa."</string>
+ <string name="battery_tip_incompatible_charging_message" product="tablet" msgid="5697523201841444736">"Huenda kishikwambi chako kinachaji polepole au hakichaji. Ili uchaji kwa kasi, tumia kebo na adapta inayopendekezwa."</string>
<string name="lockscreen_trivial_controls_summary" product="default" msgid="42562533085885152">"Bila kufungua simu yako"</string>
<string name="lockscreen_trivial_controls_summary" product="tablet" msgid="9052068482124729345">"Bila kufungua kompyuta kibao yako"</string>
<string name="auto_rotate_summary_a11y" product="default" msgid="2813368383309985185">"Unapobadilisha mkao wa simu yako kati ya wima na mlalo"</string>
diff --git a/res-product/values-ta/strings.xml b/res-product/values-ta/strings.xml
index c0cb33e..e033621 100644
--- a/res-product/values-ta/strings.xml
+++ b/res-product/values-ta/strings.xml
@@ -347,12 +347,9 @@
<string name="lockpassword_confirm_your_password_details_frp" product="default" msgid="1465326741724776281">"உங்கள் மொபைல் ஆரம்பநிலைக்கு மீட்டமைக்கப்பட்டது. இதைப் பயன்படுத்த முந்தைய கடவுச்சொல்லை உள்ளிடுங்கள்."</string>
<string name="lockpassword_confirm_your_password_details_frp" product="tablet" msgid="1333164951750797865">"உங்கள் டேப்லெட் ஆரம்பநிலைக்கு மீட்டமைக்கப்பட்டது. இதை உபயோகிக்க முந்தைய கடவுச்சொல்லை உள்ளிடுங்கள்."</string>
<string name="lockpassword_confirm_your_password_details_frp" product="device" msgid="116667646012224967">"உங்கள் சாதனம் ஆரம்பநிலைக்கு மீட்டமைக்கப்பட்டது. இதைப் பயன்படுத்த முந்தைய கடவுச்சொல்லை உள்ளிடுங்கள்."</string>
- <!-- no translation found for battery_tip_incompatible_charging_message (5097154279720383707) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (4208335872169818919) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (5697523201841444736) -->
- <skip />
+ <string name="battery_tip_incompatible_charging_message" product="default" msgid="5097154279720383707">"உங்கள் மொபைல் மெதுவாகச் சார்ஜ் ஆகலாம் அல்லது சார்ஜ் ஆகாமல் இருக்கலாம். விரைவாகச் சார்ஜ் ஆவதற்கு, பரிந்துரைக்கப்படும் கேபிளையும் அடாப்டரையும் பயன்படுத்துங்கள்."</string>
+ <string name="battery_tip_incompatible_charging_message" product="device" msgid="4208335872169818919">"உங்கள் சாதனம் மெதுவாகச் சார்ஜ் ஆகலாம் அல்லது சார்ஜ் ஆகாமல் இருக்கலாம். விரைவாகச் சார்ஜ் ஆவதற்கு, பரிந்துரைக்கப்படும் கேபிளையும் அடாப்டரையும் பயன்படுத்துங்கள்."</string>
+ <string name="battery_tip_incompatible_charging_message" product="tablet" msgid="5697523201841444736">"உங்கள் டேப்லெட் மெதுவாகச் சார்ஜ் ஆகலாம் அல்லது சார்ஜ் ஆகாமல் இருக்கலாம். விரைவாகச் சார்ஜ் ஆவதற்கு, பரிந்துரைக்கப்படும் கேபிளையும் அடாப்டரையும் பயன்படுத்துங்கள்."</string>
<string name="lockscreen_trivial_controls_summary" product="default" msgid="42562533085885152">"உங்கள் மொபைலைத் திறக்காமலேயே"</string>
<string name="lockscreen_trivial_controls_summary" product="tablet" msgid="9052068482124729345">"உங்கள் டேப்லெட்டைத் திறக்காமலேயே"</string>
<string name="auto_rotate_summary_a11y" product="default" msgid="2813368383309985185">"போர்ட்ரெய்ட் & லேண்ட்ஸ்கேப் காட்சிக்கு மொபைலை மாற்றும்போது"</string>
diff --git a/res-product/values-te/strings.xml b/res-product/values-te/strings.xml
index 8ff91d6..157be1a 100644
--- a/res-product/values-te/strings.xml
+++ b/res-product/values-te/strings.xml
@@ -347,12 +347,9 @@
<string name="lockpassword_confirm_your_password_details_frp" product="default" msgid="1465326741724776281">"మీ ఫోన్ ఫ్యాక్టరీ సెట్టింగ్లకు రీసెట్ అయింది. ఈ ఫోన్ను వాడాలంటే, మీ పాత పాస్వర్డ్ ఎంటర్ చేయండి."</string>
<string name="lockpassword_confirm_your_password_details_frp" product="tablet" msgid="1333164951750797865">"మీ టాబ్లెట్ ఫ్యాక్టరీ సెట్టింగ్స్కు రీసెట్ అయింది. ఈ టాబ్లెట్ వాడాలంటే పాత పాస్వర్డ్ ఎంటర్ చేయండి."</string>
<string name="lockpassword_confirm_your_password_details_frp" product="device" msgid="116667646012224967">"మీ పరికరం, ఫ్యాక్టరీ సెట్టింగ్లకు రీసెట్ అయింది. ఈ పరికరం వాడాలంటే, మీ పాత పాస్వర్డ్ ఎంటర్ చేయండి."</string>
- <!-- no translation found for battery_tip_incompatible_charging_message (5097154279720383707) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (4208335872169818919) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (5697523201841444736) -->
- <skip />
+ <string name="battery_tip_incompatible_charging_message" product="default" msgid="5097154279720383707">"మీ ఫోన్ నెమ్మదిగా ఛార్జింగ్ అవుతూ ఉండవచ్చు లేదా అస్సలు ఛార్జ్ కాకపోవచ్చు. ఛార్జింగ్ మరింత వేగవంతంగా అవ్వడం కోసం, సిఫార్సు చేయబడిన కేబుల్ను, అడాప్టర్ను ఉపయోగించండి."</string>
+ <string name="battery_tip_incompatible_charging_message" product="device" msgid="4208335872169818919">"మీ పరికరం నెమ్మదిగా ఛార్జింగ్ అవుతూ ఉండవచ్చు లేదా అస్సలు ఛార్జ్ కాకపోవచ్చు. ఛార్జింగ్ మరింత వేగవంతంగా అవ్వడం కోసం, సిఫార్సు చేయబడిన కేబుల్ను, అడాప్టర్ను ఉపయోగించండి."</string>
+ <string name="battery_tip_incompatible_charging_message" product="tablet" msgid="5697523201841444736">"మీ టాబ్లెట్ నెమ్మదిగా ఛార్జింగ్ అవుతూ ఉండవచ్చు లేదా అస్సలు ఛార్జ్ కాకపోవచ్చు. ఛార్జింగ్ మరింత వేగవంతంగా అవ్వడం కోసం, సిఫార్సు చేయబడిన కేబుల్ను, అడాప్టర్ను ఉపయోగించండి."</string>
<string name="lockscreen_trivial_controls_summary" product="default" msgid="42562533085885152">"మీ ఫోన్ను అన్లాక్ చేయకుండా"</string>
<string name="lockscreen_trivial_controls_summary" product="tablet" msgid="9052068482124729345">"మీ టాబ్లెట్ను అన్లాక్ చేయకుండా"</string>
<string name="auto_rotate_summary_a11y" product="default" msgid="2813368383309985185">"ఫోన్ను పోర్ట్రెయిట్, ల్యాండ్స్కేప్ల మధ్య మార్చినప్పుడు"</string>
diff --git a/res-product/values-th/strings.xml b/res-product/values-th/strings.xml
index 85d0d63..cbf2b41 100644
--- a/res-product/values-th/strings.xml
+++ b/res-product/values-th/strings.xml
@@ -347,12 +347,9 @@
<string name="lockpassword_confirm_your_password_details_frp" product="default" msgid="1465326741724776281">"รีเซ็ตโทรศัพท์เป็นการตั้งค่าเริ่มต้นแล้ว หากต้องการใช้โทรศัพท์นี้ ให้ป้อนรหัสผ่านก่อนหน้าของคุณ"</string>
<string name="lockpassword_confirm_your_password_details_frp" product="tablet" msgid="1333164951750797865">"รีเซ็ตแท็บเล็ตเป็นการตั้งค่าเริ่มต้นแล้ว หากต้องการใช้แท็บเล็ตนี้ ให้ป้อนรหัสผ่านก่อนหน้าของคุณ"</string>
<string name="lockpassword_confirm_your_password_details_frp" product="device" msgid="116667646012224967">"รีเซ็ตอุปกรณ์เป็นการตั้งค่าเริ่มต้นแล้ว หากต้องการใช้อุปกรณ์นี้ ให้ป้อนรหัสผ่านก่อนหน้าของคุณ"</string>
- <!-- no translation found for battery_tip_incompatible_charging_message (5097154279720383707) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (4208335872169818919) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (5697523201841444736) -->
- <skip />
+ <string name="battery_tip_incompatible_charging_message" product="default" msgid="5097154279720383707">"โทรศัพท์อาจชาร์จอย่างช้าๆ หรือไม่ชาร์จ ให้ใช้สายและอะแดปเตอร์ที่แนะนำเพื่อให้ชาร์จได้เร็วขึ้น"</string>
+ <string name="battery_tip_incompatible_charging_message" product="device" msgid="4208335872169818919">"อุปกรณ์อาจชาร์จอย่างช้าๆ หรือไม่ชาร์จ ให้ใช้สายและอะแดปเตอร์ที่แนะนำเพื่อให้ชาร์จได้เร็วขึ้น"</string>
+ <string name="battery_tip_incompatible_charging_message" product="tablet" msgid="5697523201841444736">"แท็บเล็ตอาจชาร์จอย่างช้าๆ หรือไม่ชาร์จ ให้ใช้สายและอะแดปเตอร์ที่แนะนำเพื่อให้ชาร์จได้เร็วขึ้น"</string>
<string name="lockscreen_trivial_controls_summary" product="default" msgid="42562533085885152">"โดยไม่ต้องปลดล็อกโทรศัพท์"</string>
<string name="lockscreen_trivial_controls_summary" product="tablet" msgid="9052068482124729345">"โดยไม่ต้องปลดล็อกแท็บเล็ต"</string>
<string name="auto_rotate_summary_a11y" product="default" msgid="2813368383309985185">"เมื่อคุณหมุนโทรศัพท์ไปมาระหว่างแนวตั้งกับแนวนอน"</string>
diff --git a/res-product/values-tl/strings.xml b/res-product/values-tl/strings.xml
index b2f9812..91c2fa7 100644
--- a/res-product/values-tl/strings.xml
+++ b/res-product/values-tl/strings.xml
@@ -347,12 +347,9 @@
<string name="lockpassword_confirm_your_password_details_frp" product="default" msgid="1465326741724776281">"Na-reset sa mga factory setting ang iyong telepono. Ilagay ang dati mong password para magamit ito."</string>
<string name="lockpassword_confirm_your_password_details_frp" product="tablet" msgid="1333164951750797865">"Na-reset sa mga factory setting ang tablet mo. Ilagay ang dating password para magamit itong tablet."</string>
<string name="lockpassword_confirm_your_password_details_frp" product="device" msgid="116667646012224967">"Na-reset sa mga factory setting ang device mo. Ilagay ang dating password para magamit itong device."</string>
- <!-- no translation found for battery_tip_incompatible_charging_message (5097154279720383707) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (4208335872169818919) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (5697523201841444736) -->
- <skip />
+ <string name="battery_tip_incompatible_charging_message" product="default" msgid="5097154279720383707">"Posibleng mabagal mag-charge o hindi nagcha-charge ang iyong telepono. Para sa mas mabilis na pag-charge, gumamit ng inirerekomendang cable at adapter."</string>
+ <string name="battery_tip_incompatible_charging_message" product="device" msgid="4208335872169818919">"Posibleng mabagal mag-charge o hindi nagcha-charge ang iyong device. Para sa mas mabilis na pag-charge, gumamit ng inirerekomendang cable at adapter."</string>
+ <string name="battery_tip_incompatible_charging_message" product="tablet" msgid="5697523201841444736">"Posibleng mabagal mag-charge o hindi nagcha-charge ang iyong tablet. Para sa mas mabilis na pag-charge, gumamit ng inirerekomendang cable at adapter."</string>
<string name="lockscreen_trivial_controls_summary" product="default" msgid="42562533085885152">"Nang hindi ina-unlock ang iyong telepono"</string>
<string name="lockscreen_trivial_controls_summary" product="tablet" msgid="9052068482124729345">"Nang hindi ina-unlock ang iyong tablet"</string>
<string name="auto_rotate_summary_a11y" product="default" msgid="2813368383309985185">"Kapag pinalipat-lipat ang telepono sa portrait at landscape"</string>
diff --git a/res-product/values-tr/strings.xml b/res-product/values-tr/strings.xml
index b9083e7..828e86b 100644
--- a/res-product/values-tr/strings.xml
+++ b/res-product/values-tr/strings.xml
@@ -347,12 +347,9 @@
<string name="lockpassword_confirm_your_password_details_frp" product="default" msgid="1465326741724776281">"Telefonunuz fabrika ayarlarına sıfırlandı. Bu telefonu kullanmak için önceki şifrenizi girin."</string>
<string name="lockpassword_confirm_your_password_details_frp" product="tablet" msgid="1333164951750797865">"Tabletiniz fabrika ayarlarına sıfırlandı. Bu tableti kullanmak için önceki şifrenizi girin."</string>
<string name="lockpassword_confirm_your_password_details_frp" product="device" msgid="116667646012224967">"Cihazınız fabrika ayarlarına sıfırlandı. Bu cihazı kullanmak için önceki şifrenizi girin."</string>
- <!-- no translation found for battery_tip_incompatible_charging_message (5097154279720383707) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (4208335872169818919) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (5697523201841444736) -->
- <skip />
+ <string name="battery_tip_incompatible_charging_message" product="default" msgid="5097154279720383707">"Telefonunuz yavaş şarj oluyor veya hiç şarj olmuyor olabilir. Daha hızlı şarj için önerilen bir kablo ve adaptör kullanın."</string>
+ <string name="battery_tip_incompatible_charging_message" product="device" msgid="4208335872169818919">"Cihazınız yavaş şarj oluyor veya hiç şarj olmuyor olabilir. Daha hızlı şarj için önerilen bir kablo ve adaptör kullanın."</string>
+ <string name="battery_tip_incompatible_charging_message" product="tablet" msgid="5697523201841444736">"Tabletiniz yavaş şarj oluyor veya hiç şarj olmuyor olabilir. Daha hızlı şarj için önerilen bir kablo ve adaptör kullanın."</string>
<string name="lockscreen_trivial_controls_summary" product="default" msgid="42562533085885152">"Telefonunuzun kilidini açmak zorunda değilsiniz"</string>
<string name="lockscreen_trivial_controls_summary" product="tablet" msgid="9052068482124729345">"Tabletinizin kilidini açmak zorunda değilsiniz"</string>
<string name="auto_rotate_summary_a11y" product="default" msgid="2813368383309985185">"Telefonunuzu dikey/yatay mod arasında hareket ettirdiğinizde"</string>
diff --git a/res-product/values-uk/strings.xml b/res-product/values-uk/strings.xml
index bb40a2b..5b09163 100644
--- a/res-product/values-uk/strings.xml
+++ b/res-product/values-uk/strings.xml
@@ -347,12 +347,9 @@
<string name="lockpassword_confirm_your_password_details_frp" product="default" msgid="1465326741724776281">"Налаштування телефона скинуто. Щоб користуватися ним, введіть попередній пароль."</string>
<string name="lockpassword_confirm_your_password_details_frp" product="tablet" msgid="1333164951750797865">"Налаштування планшета скинуто. Щоб користуватися ним, введіть попередній пароль."</string>
<string name="lockpassword_confirm_your_password_details_frp" product="device" msgid="116667646012224967">"Налаштування пристрою скинуто. Щоб користуватися ним, введіть попередній пароль."</string>
- <!-- no translation found for battery_tip_incompatible_charging_message (5097154279720383707) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (4208335872169818919) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (5697523201841444736) -->
- <skip />
+ <string name="battery_tip_incompatible_charging_message" product="default" msgid="5097154279720383707">"Можливо, телефон заряджається повільно або взагалі не заряджається. Щоб він заряджався швидше, використовуйте рекомендований кабель і адаптер."</string>
+ <string name="battery_tip_incompatible_charging_message" product="device" msgid="4208335872169818919">"Можливо, пристрій заряджається повільно або взагалі не заряджається. Щоб він заряджався швидше, використовуйте рекомендований кабель і адаптер."</string>
+ <string name="battery_tip_incompatible_charging_message" product="tablet" msgid="5697523201841444736">"Можливо, планшет заряджається повільно або взагалі не заряджається. Щоб він заряджався швидше, використовуйте рекомендований кабель і адаптер."</string>
<string name="lockscreen_trivial_controls_summary" product="default" msgid="42562533085885152">"Не розблоковуючи телефон"</string>
<string name="lockscreen_trivial_controls_summary" product="tablet" msgid="9052068482124729345">"Не розблоковуючи планшет"</string>
<string name="auto_rotate_summary_a11y" product="default" msgid="2813368383309985185">"Змінення орієнтації телефона з портретної на альбомну й навпаки"</string>
diff --git a/res-product/values-ur/strings.xml b/res-product/values-ur/strings.xml
index 819e44e..32c1460 100644
--- a/res-product/values-ur/strings.xml
+++ b/res-product/values-ur/strings.xml
@@ -347,12 +347,9 @@
<string name="lockpassword_confirm_your_password_details_frp" product="default" msgid="1465326741724776281">"آپ کا فون فیکٹری ترتیبات پر ری سیٹ کر دیا گیا تھا۔ یہ فون استعمال کرنے کیلئے، پچھلا پاس ورڈ ڈالیں۔"</string>
<string name="lockpassword_confirm_your_password_details_frp" product="tablet" msgid="1333164951750797865">"آپ کا ٹیبلیٹ فیکٹری ترتیبات پر ری سیٹ ہوا تھا۔ یہ ٹیبلیٹ استعمال کرنے کیلئے گزشتہ پاس ورڈ ڈالیں۔"</string>
<string name="lockpassword_confirm_your_password_details_frp" product="device" msgid="116667646012224967">"آپ کا آلہ فیکٹری کی ترتیبات پر ری سیٹ ہوا تھا۔ یہ آلہ استعمال کرنے کیلئے گزشتہ پاس ورڈ درج کریں۔"</string>
- <!-- no translation found for battery_tip_incompatible_charging_message (5097154279720383707) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (4208335872169818919) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (5697523201841444736) -->
- <skip />
+ <string name="battery_tip_incompatible_charging_message" product="default" msgid="5097154279720383707">"ہو سکتا ہے کہ آپ کا فون آہستہ چارج ہو رہا ہو یا چارج نہ ہو رہا ہو۔ فاسٹ چارجنگ کے لیے، تجویز کردہ کیبل اور ایڈاپٹر استعمال کریں۔"</string>
+ <string name="battery_tip_incompatible_charging_message" product="device" msgid="4208335872169818919">"ہو سکتا ہے کہ آپ کا آلہ آہستہ چارج ہو رہا ہو یا چارج نہ ہو رہا ہو۔ فاسٹ چارجنگ کے لیے، تجویز کردہ کیبل اور ایڈاپٹر استعمال کریں۔"</string>
+ <string name="battery_tip_incompatible_charging_message" product="tablet" msgid="5697523201841444736">"ہو سکتا ہے کہ آپ کا ٹیبلیٹ آہستہ چارج ہو رہا ہو یا چارج نہ ہو رہا ہو۔ فاسٹ چارجنگ کے لیے، تجویز کردہ کیبل اور ایڈاپٹر استعمال کریں۔"</string>
<string name="lockscreen_trivial_controls_summary" product="default" msgid="42562533085885152">"اپنے فون کو اَن لاک کئے بغیر"</string>
<string name="lockscreen_trivial_controls_summary" product="tablet" msgid="9052068482124729345">"اپنے ٹیبلیٹ کو اَن لاک کئے بغیر"</string>
<string name="auto_rotate_summary_a11y" product="default" msgid="2813368383309985185">"جب آپ اپنا فون پورٹریٹ اور لینڈ اسکیپ کے درمیان گھماتے ہیں"</string>
diff --git a/res-product/values-uz/strings.xml b/res-product/values-uz/strings.xml
index b3fa298..1a050c8 100644
--- a/res-product/values-uz/strings.xml
+++ b/res-product/values-uz/strings.xml
@@ -347,12 +347,9 @@
<string name="lockpassword_confirm_your_password_details_frp" product="default" msgid="1465326741724776281">"Telefoningiz zavod sozlamalariga qaytarildi. Bu telefondan foydalanish uchun avvalgi parolni kiriting."</string>
<string name="lockpassword_confirm_your_password_details_frp" product="tablet" msgid="1333164951750797865">"Planshet zavod sozlamalariga qaytarildi. Bu planshetdan foydalanish uchun avvalgi parolni kiriting."</string>
<string name="lockpassword_confirm_your_password_details_frp" product="device" msgid="116667646012224967">"Qurilma zavod sozlamalariga qaytarildi. Bu qurilmadan foydalanish uchun avvalgi parolni kiriting."</string>
- <!-- no translation found for battery_tip_incompatible_charging_message (5097154279720383707) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (4208335872169818919) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (5697523201841444736) -->
- <skip />
+ <string name="battery_tip_incompatible_charging_message" product="default" msgid="5097154279720383707">"Telefoningiz sekin quvvat olyapti yoki umuman olmayapti. Tezroq quvvatlash uchun tavsiya etiladigan quvvat kabel va adapterdan foydalaning."</string>
+ <string name="battery_tip_incompatible_charging_message" product="device" msgid="4208335872169818919">"Qurilmangiz sekin quvvat olyapti yoki umuman olmayapti. Tezroq quvvatlash uchun tavsiya etiladigan quvvat kabel va adapterdan foydalaning."</string>
+ <string name="battery_tip_incompatible_charging_message" product="tablet" msgid="5697523201841444736">"Planshetingiz sekin quvvat olyapti yoki umuman olmayapti. Tezroq quvvatlash uchun tavsiya etiladigan quvvat kabel va adapterdan foydalaning."</string>
<string name="lockscreen_trivial_controls_summary" product="default" msgid="42562533085885152">"Telefoningizni qulfdan chiqarmasdan"</string>
<string name="lockscreen_trivial_controls_summary" product="tablet" msgid="9052068482124729345">"Planshetingizni qulfdan chiqarmasdan"</string>
<string name="auto_rotate_summary_a11y" product="default" msgid="2813368383309985185">"Telefoningizni boʻyiga va eniga burganingizda"</string>
diff --git a/res-product/values-vi/strings.xml b/res-product/values-vi/strings.xml
index 48d7e84..9605a13 100644
--- a/res-product/values-vi/strings.xml
+++ b/res-product/values-vi/strings.xml
@@ -347,12 +347,9 @@
<string name="lockpassword_confirm_your_password_details_frp" product="default" msgid="1465326741724776281">"Điện thoại đã được đặt lại về trạng thái cài đặt ban đầu. Để dùng điện thoại này, hãy nhập mật khẩu trước đây của bạn."</string>
<string name="lockpassword_confirm_your_password_details_frp" product="tablet" msgid="1333164951750797865">"Máy tính bảng đã được đặt lại về trạng thái cài đặt ban đầu. Để dùng máy tính bảng này, hãy nhập mật khẩu trước đây của bạn."</string>
<string name="lockpassword_confirm_your_password_details_frp" product="device" msgid="116667646012224967">"Thiết bị đã được đặt lại về trạng thái cài đặt ban đầu. Để dùng thiết bị này, hãy nhập mật khẩu trước đây của bạn."</string>
- <!-- no translation found for battery_tip_incompatible_charging_message (5097154279720383707) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (4208335872169818919) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (5697523201841444736) -->
- <skip />
+ <string name="battery_tip_incompatible_charging_message" product="default" msgid="5097154279720383707">"Điện thoại của bạn có thể sạc chậm hoặc không sạc được. Để sạc nhanh hơn, hãy dùng một bộ sạc và cáp sạc được đề xuất."</string>
+ <string name="battery_tip_incompatible_charging_message" product="device" msgid="4208335872169818919">"Thiết bị của bạn có thể sạc chậm hoặc không sạc được. Để sạc nhanh hơn, hãy dùng một bộ sạc và cáp sạc được đề xuất."</string>
+ <string name="battery_tip_incompatible_charging_message" product="tablet" msgid="5697523201841444736">"Máy tính bảng của bạn có thể sạc chậm hoặc không sạc được. Để sạc nhanh hơn, hãy dùng một bộ sạc và cáp sạc được đề xuất."</string>
<string name="lockscreen_trivial_controls_summary" product="default" msgid="42562533085885152">"Không cần mở khoá điện thoại của bạn"</string>
<string name="lockscreen_trivial_controls_summary" product="tablet" msgid="9052068482124729345">"Không cần mở khoá máy tính bảng của bạn"</string>
<string name="auto_rotate_summary_a11y" product="default" msgid="2813368383309985185">"Khi bạn chuyển điện thoại giữa chế độ dọc và chế độ ngang"</string>
diff --git a/res-product/values-zh-rCN/strings.xml b/res-product/values-zh-rCN/strings.xml
index a59174a..95aa501 100644
--- a/res-product/values-zh-rCN/strings.xml
+++ b/res-product/values-zh-rCN/strings.xml
@@ -347,12 +347,9 @@
<string name="lockpassword_confirm_your_password_details_frp" product="default" msgid="1465326741724776281">"您的手机已恢复出厂设置。如要使用此手机,请输入之前使用的密码。"</string>
<string name="lockpassword_confirm_your_password_details_frp" product="tablet" msgid="1333164951750797865">"您的平板电脑已恢复出厂设置。如要使用此平板电脑,请输入之前使用的密码。"</string>
<string name="lockpassword_confirm_your_password_details_frp" product="device" msgid="116667646012224967">"您的设备已恢复出厂设置。如要使用此设备,请输入之前使用的密码。"</string>
- <!-- no translation found for battery_tip_incompatible_charging_message (5097154279720383707) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (4208335872169818919) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (5697523201841444736) -->
- <skip />
+ <string name="battery_tip_incompatible_charging_message" product="default" msgid="5097154279720383707">"您的手机可能充电缓慢或未在充电。为了加快充电速度,请使用推荐的数据线和适配器。"</string>
+ <string name="battery_tip_incompatible_charging_message" product="device" msgid="4208335872169818919">"您的设备可能充电缓慢或未在充电。为了加快充电速度,请使用推荐的数据线和适配器。"</string>
+ <string name="battery_tip_incompatible_charging_message" product="tablet" msgid="5697523201841444736">"您的平板电脑可能充电缓慢或未在充电。为了加快充电速度,请使用推荐的数据线和适配器。"</string>
<string name="lockscreen_trivial_controls_summary" product="default" msgid="42562533085885152">"不解锁手机"</string>
<string name="lockscreen_trivial_controls_summary" product="tablet" msgid="9052068482124729345">"不解锁平板电脑"</string>
<string name="auto_rotate_summary_a11y" product="default" msgid="2813368383309985185">"当您在纵向与横向之间变换手机持握方向时"</string>
diff --git a/res-product/values-zh-rHK/strings.xml b/res-product/values-zh-rHK/strings.xml
index 27321d9..032e2d9 100644
--- a/res-product/values-zh-rHK/strings.xml
+++ b/res-product/values-zh-rHK/strings.xml
@@ -347,12 +347,9 @@
<string name="lockpassword_confirm_your_password_details_frp" product="default" msgid="1465326741724776281">"你的手機已回復原廠設定。如要使用此手機,請輸入先前的密碼。"</string>
<string name="lockpassword_confirm_your_password_details_frp" product="tablet" msgid="1333164951750797865">"你的平板電腦已回復原廠設定。如要使用此平板電腦,請輸入先前的密碼。"</string>
<string name="lockpassword_confirm_your_password_details_frp" product="device" msgid="116667646012224967">"你的裝置已回復原廠設定。如要使用此裝置,請輸入先前的密碼。"</string>
- <!-- no translation found for battery_tip_incompatible_charging_message (5097154279720383707) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (4208335872169818919) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (5697523201841444736) -->
- <skip />
+ <string name="battery_tip_incompatible_charging_message" product="default" msgid="5097154279720383707">"手機可能充電速度緩慢或未充電。如要快速充電,請使用建議的連接線和電源適配器。"</string>
+ <string name="battery_tip_incompatible_charging_message" product="device" msgid="4208335872169818919">"裝置可能充電速度緩慢或未充電。如要快速充電,請使用建議的連接線和電源適配器。"</string>
+ <string name="battery_tip_incompatible_charging_message" product="tablet" msgid="5697523201841444736">"平板電腦可能充電速度緩慢或未充電。如要快速充電,請使用建議的連接線和電源適配器。"</string>
<string name="lockscreen_trivial_controls_summary" product="default" msgid="42562533085885152">"無需解鎖手機"</string>
<string name="lockscreen_trivial_controls_summary" product="tablet" msgid="9052068482124729345">"無需解鎖平板電腦"</string>
<string name="auto_rotate_summary_a11y" product="default" msgid="2813368383309985185">"喺手機轉成直向或者橫向嘅時候自動旋轉畫面"</string>
diff --git a/res-product/values-zh-rTW/strings.xml b/res-product/values-zh-rTW/strings.xml
index 81f09fa..de2ee3d 100644
--- a/res-product/values-zh-rTW/strings.xml
+++ b/res-product/values-zh-rTW/strings.xml
@@ -347,12 +347,9 @@
<string name="lockpassword_confirm_your_password_details_frp" product="default" msgid="1465326741724776281">"你的手機已恢復原廠設定。如要使用這支手機,請輸入先前使用的密碼。"</string>
<string name="lockpassword_confirm_your_password_details_frp" product="tablet" msgid="1333164951750797865">"平板電腦已恢復原廠設定。如要使用這台平板電腦,請輸入先前使用的密碼。"</string>
<string name="lockpassword_confirm_your_password_details_frp" product="device" msgid="116667646012224967">"裝置已恢復原廠設定。如要使用這部裝置,請輸入先前使用的密碼。"</string>
- <!-- no translation found for battery_tip_incompatible_charging_message (5097154279720383707) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (4208335872169818919) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (5697523201841444736) -->
- <skip />
+ <string name="battery_tip_incompatible_charging_message" product="default" msgid="5097154279720383707">"你的手機可能正在緩慢充電或未充電。如要快速充電,請使用建議的傳輸線和變壓器。"</string>
+ <string name="battery_tip_incompatible_charging_message" product="device" msgid="4208335872169818919">"你的裝置可能正在緩慢充電或未充電。如要快速充電,請使用建議的傳輸線和變壓器。"</string>
+ <string name="battery_tip_incompatible_charging_message" product="tablet" msgid="5697523201841444736">"你的平板電腦可能正在緩慢充電或未充電。如要快速充電,請使用建議的傳輸線和變壓器。"</string>
<string name="lockscreen_trivial_controls_summary" product="default" msgid="42562533085885152">"不必解鎖手機"</string>
<string name="lockscreen_trivial_controls_summary" product="tablet" msgid="9052068482124729345">"不必解鎖平板電腦"</string>
<string name="auto_rotate_summary_a11y" product="default" msgid="2813368383309985185">"在手機轉成直向或橫向時自動旋轉畫面"</string>
diff --git a/res-product/values-zu/strings.xml b/res-product/values-zu/strings.xml
index f6ab35a..e4c0010 100644
--- a/res-product/values-zu/strings.xml
+++ b/res-product/values-zu/strings.xml
@@ -347,12 +347,9 @@
<string name="lockpassword_confirm_your_password_details_frp" product="default" msgid="1465326741724776281">"Ifoni yakho isethwe kabusha kumasethingi asekuqaleni. Ukusebenzisa le foni, sicela ufake iphasiwedi yakho yangaphambilini."</string>
<string name="lockpassword_confirm_your_password_details_frp" product="tablet" msgid="1333164951750797865">"Ithebulethi yakho isethwe kabusha kumasethingi asekuqaleni. Ukuze usebenzise le thebulethi, faka iphasiwedi yakho yangaphambilini."</string>
<string name="lockpassword_confirm_your_password_details_frp" product="device" msgid="116667646012224967">"Idivayisi yakho isethwe kabusha kumasethingi asekuqaleni. Ukuze usebenzise le divayisi, faka iphasiwedi yakho yangaphambilini."</string>
- <!-- no translation found for battery_tip_incompatible_charging_message (5097154279720383707) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (4208335872169818919) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (5697523201841444736) -->
- <skip />
+ <string name="battery_tip_incompatible_charging_message" product="default" msgid="5097154279720383707">"Ifoni yakho kungenzeka ishaja kancane noma ayishaji. Ukuze ushaje ngokushesha, sebenzisa ikhebula ne-adaptha enconyiwe."</string>
+ <string name="battery_tip_incompatible_charging_message" product="device" msgid="4208335872169818919">"Icebo lakho ishaja kancane noma ayishaji. Ukuze ushaje ngokushesha, sebenzisa ikhebula ne-adaptha enconyiwe."</string>
+ <string name="battery_tip_incompatible_charging_message" product="tablet" msgid="5697523201841444736">"Ithebhulethi yakho kungenzeka ishaja kancane noma ayishaji. Ukuze ushaje ngokushesha, sebenzisa ikhebula ne-adaptha enconyiwe."</string>
<string name="lockscreen_trivial_controls_summary" product="default" msgid="42562533085885152">"Ngaphandle kokuvula ifoni yakho"</string>
<string name="lockscreen_trivial_controls_summary" product="tablet" msgid="9052068482124729345">"Ngaphandle kokuvula ithebulethi yakho"</string>
<string name="auto_rotate_summary_a11y" product="default" msgid="2813368383309985185">"Uma uhambisa ifoni yakho phakathi kokuma ngobude nokuvundla"</string>
diff --git a/res/drawable/ic_private_space_icon.xml b/res/drawable/ic_private_space_icon.xml
new file mode 100644
index 0000000..fc0894d
--- /dev/null
+++ b/res/drawable/ic_private_space_icon.xml
@@ -0,0 +1,26 @@
+<!--
+ ~ Copyright (C) 2024 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24"
+ android:viewportHeight="24">
+<path
+ android:pathData="M5,3H19C20.1,3 21,3.9 21,5V19C21,20.1 20.1,21 19,21H5C3.9,21 3,20.1 3,19V5C3,3.9 3.9,3 5,3ZM13.5,15.501L12.93,12.271C13.57,11.941 14,11.271 14,10.501C14,9.401 13.1,8.501 12,8.501C10.9,8.501 10,9.401 10,10.501C10,11.271 10.43,11.941 11.07,12.271L10.5,15.501H13.5Z"
+ android:fillColor="?android:attr/colorAccent"
+ android:fillType="evenOdd"/>
+</vector>
diff --git a/res/drawable/ic_privatespace_icon.xml b/res/drawable/ic_privatespace_icon.xml
deleted file mode 100644
index b651f52..0000000
--- a/res/drawable/ic_privatespace_icon.xml
+++ /dev/null
@@ -1,27 +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.
- -->
-
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="24dp"
- android:height="24dp"
- android:viewportWidth="960"
- android:viewportHeight="960"
- android:tint="?attr/colorControlNormal">
- <path
- android:fillColor="@android:color/white"
- android:pathData="M420,600L540,600L517,471Q537,461 548.5,442Q560,423 560,400Q560,367 536.5,343.5Q513,320 480,320Q447,320 423.5,343.5Q400,367 400,400Q400,423 411.5,442Q423,461 443,471L420,600ZM480,880Q341,845 250.5,720.5Q160,596 160,444L160,200L480,80L800,200L800,444Q800,596 709.5,720.5Q619,845 480,880ZM480,796Q584,763 652,664Q720,565 720,444L720,255L480,165L240,255L240,444Q240,565 308,664Q376,763 480,796ZM480,480Q480,480 480,480Q480,480 480,480L480,480L480,480L480,480L480,480Q480,480 480,480Q480,480 480,480Z"/>
-</vector>
-
diff --git a/res/drawable/private_space_choose_lock_illustration.xml b/res/drawable/private_space_choose_lock_illustration.xml
new file mode 100644
index 0000000..f943cb8
--- /dev/null
+++ b/res/drawable/private_space_choose_lock_illustration.xml
@@ -0,0 +1,84 @@
+<!--
+ ~ Copyright (C) 2024 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="364dp"
+ android:height="266dp"
+ android:viewportWidth="364"
+ android:viewportHeight="266">
+ <group>
+ <clip-path
+ android:pathData="M0,0.95h364v265.05h-364z"/>
+ <path
+ android:pathData="M339.42,265.47H24.58C11.07,265.47 0,254.17 0,240.39V26.42C0,12.6 11.07,1.3 24.58,1.3H339.52C352.93,1.3 364,12.6 364,26.38V240.49C364,254.17 352.93,265.47 339.42,265.47Z"
+ android:fillColor="#000000"/>
+ <path
+ android:pathData="M300.32,99.22C310.82,106.16 324.97,103.31 331.93,92.85C338.89,82.39 336.03,68.29 325.54,61.35L301.31,45.32C290.82,38.38 276.67,41.24 269.7,51.69C262.74,62.15 265.6,76.26 276.1,83.19L300.32,99.22Z"
+ android:fillColor="#C7EBD4"/>
+ <path
+ android:pathData="M323.02,78.05L314.03,79.7C313.56,79.79 313.24,80.25 313.33,80.72L314.98,89.71C315.07,90.19 315.52,90.5 316,90.41L324.99,88.76C325.46,88.68 325.78,88.22 325.69,87.75L324.04,78.76C323.95,78.28 323.5,77.97 323.02,78.05Z"
+ android:fillColor="#5BB974"/>
+ <path
+ android:pathData="M310.61,70.73L310.59,70.95C311.1,73.37 309.48,75.68 307.04,76.1L298.41,77.6C295.97,78.01 293.62,76.36 293.19,73.99L293.21,73.77C292.7,71.35 294.32,69.04 296.76,68.63L305.39,67.13C307.83,66.71 310.1,68.31 310.61,70.73Z"
+ android:fillColor="#5BB974"/>
+ <path
+ android:pathData="M280.24,67.28C283.75,69.56 288.46,68.56 290.74,65.05C293.02,61.54 292.02,56.84 288.51,54.56C285,52.28 280.29,53.28 278.02,56.79C275.73,60.3 276.73,65 280.24,67.28Z"
+ android:fillColor="#5BB974"/>
+ <path
+ android:pathData="M68.38,36.61C69.99,35.55 71.95,35.17 73.84,35.55C75.73,35.92 77.39,37.02 78.48,38.6L78.71,38.97L80.09,41.3C80.7,42.37 81.58,43.26 82.64,43.89C83.7,44.52 84.9,44.87 86.14,44.89L88.76,44.96C90.69,45.04 92.52,45.87 93.84,47.28C95.16,48.69 95.87,50.56 95.82,52.49C95.77,52.62 95.77,52.77 95.83,52.91L95.52,55.59C95.39,56.8 95.58,58.03 96.06,59.15C96.54,60.28 97.3,61.26 98.27,62L100.32,63.72C101.82,64.92 102.8,66.65 103.03,68.56C103.26,70.47 102.73,72.39 101.56,73.91C101.44,73.98 101.39,74.18 101.27,74.26L99.55,76.2C98.72,77.1 98.14,78.2 97.87,79.4C97.59,80.59 97.63,81.84 97.99,83.01L98.66,85.58C99.17,87.44 98.92,89.43 97.97,91.11C97.02,92.78 95.44,94.02 93.58,94.55C93.46,94.63 93.26,94.58 93.13,94.66L90.56,95.23C89.36,95.48 88.24,96.04 87.32,96.84C86.4,97.64 85.69,98.67 85.28,99.82L84.38,102.36C83.69,104.16 82.33,105.61 80.58,106.42C78.83,107.22 76.83,107.31 75.02,106.65C74.88,106.64 74.74,106.57 74.64,106.46L72.32,105.41C71.19,104.94 69.96,104.75 68.74,104.85C67.52,104.96 66.34,105.36 65.31,106.01L63.11,107.43C61.5,108.48 59.54,108.86 57.65,108.49C55.76,108.12 54.1,107.02 53.01,105.44L52.78,105.07L51.4,102.75C50.78,101.68 49.89,100.79 48.81,100.17C47.74,99.55 46.52,99.22 45.28,99.22L42.66,99.15C40.72,99.07 38.9,98.24 37.58,96.83C36.25,95.42 35.54,93.55 35.6,91.62C35.64,91.49 35.64,91.34 35.59,91.2L35.89,88.52C36.02,87.31 35.84,86.08 35.36,84.95C34.88,83.83 34.12,82.84 33.15,82.09L31.08,80.46C30.32,79.87 29.68,79.13 29.21,78.28C28.74,77.44 28.43,76.51 28.32,75.56C28.21,74.6 28.29,73.63 28.55,72.7C28.82,71.77 29.27,70.9 29.87,70.15C29.99,70.07 30.04,69.87 30.16,69.79L31.89,67.77C32.72,66.87 33.3,65.76 33.58,64.57C33.85,63.38 33.81,62.13 33.46,60.96L32.79,58.37C32.29,56.51 32.54,54.53 33.49,52.86C34.44,51.18 36.01,49.95 37.87,49.42C37.99,49.34 38.19,49.39 38.32,49.31L40.89,48.73C42.09,48.48 43.21,47.92 44.13,47.12C45.06,46.31 45.76,45.29 46.17,44.13L47.07,41.6C47.75,39.81 49.12,38.35 50.87,37.55C52.62,36.75 54.62,36.66 56.43,37.31C56.57,37.33 56.71,37.4 56.81,37.5L59.2,38.58C60.33,39.04 61.56,39.23 62.78,39.13C64,39.02 65.18,38.63 66.21,37.97L68.38,36.61Z"
+ android:fillColor="#CEE3FF"/>
+ <path
+ android:pathData="M60.5,74.56C59.92,74.56 59.44,74.37 59.05,73.97C58.65,73.58 58.45,73.09 58.45,72.52C58.45,71.95 58.65,71.46 59.05,71.07C59.44,70.67 59.92,70.48 60.5,70.48C61.07,70.48 61.55,70.67 61.95,71.07C62.34,71.46 62.54,71.95 62.54,72.52C62.54,73.09 62.34,73.58 61.95,73.97C61.55,74.37 61.07,74.56 60.5,74.56ZM70.3,74.56C69.73,74.56 69.25,74.37 68.85,73.97C68.46,73.58 68.26,73.09 68.26,72.52C68.26,71.95 68.46,71.46 68.85,71.07C69.25,70.67 69.73,70.48 70.3,70.48C70.88,70.48 71.36,70.67 71.75,71.07C72.15,71.46 72.35,71.95 72.35,72.52C72.35,73.09 72.15,73.58 71.75,73.97C71.36,74.37 70.88,74.56 70.3,74.56ZM65.4,83.96C69.05,83.96 72.14,82.69 74.68,80.16C77.21,77.63 78.48,74.54 78.48,70.89C78.48,70.23 78.43,69.6 78.35,68.99C78.27,68.37 78.12,67.78 77.9,67.21C77.33,67.34 76.76,67.45 76.19,67.51C75.61,67.58 75.02,67.62 74.39,67.62C71.91,67.62 69.57,67.09 67.36,66.02C65.15,64.96 63.27,63.48 61.72,61.57C60.85,63.69 59.6,65.54 57.98,67.11C56.36,68.67 54.48,69.85 52.32,70.64V70.89C52.32,74.54 53.59,77.63 56.12,80.16C58.66,82.69 61.75,83.96 65.4,83.96ZM65.4,87.23C63.14,87.23 61.01,86.8 59.03,85.94C57.04,85.09 55.31,83.92 53.84,82.45C52.36,80.98 51.2,79.25 50.34,77.26C49.48,75.27 49.05,73.15 49.05,70.89C49.05,68.62 49.48,66.5 50.34,64.51C51.2,62.52 52.36,60.79 53.84,59.32C55.31,57.85 57.04,56.69 59.03,55.83C61.01,54.97 63.14,54.54 65.4,54.54C67.66,54.54 69.79,54.97 71.77,55.83C73.76,56.69 75.49,57.85 76.96,59.32C78.43,60.79 79.6,62.52 80.46,64.51C81.32,66.5 81.74,68.62 81.74,70.89C81.74,73.15 81.32,75.27 80.46,77.26C79.6,79.25 78.43,80.98 76.96,82.45C75.49,83.92 73.76,85.09 71.77,85.94C69.79,86.8 67.66,87.23 65.4,87.23ZM63.19,58.01C64.34,59.92 65.89,61.45 67.85,62.61C69.81,63.77 71.99,64.35 74.39,64.35C74.77,64.35 75.14,64.33 75.49,64.29C75.85,64.25 76.21,64.2 76.6,64.14C75.45,62.24 73.9,60.7 71.94,59.55C69.98,58.39 67.8,57.81 65.4,57.81C65.02,57.81 64.65,57.83 64.3,57.87C63.94,57.91 63.57,57.96 63.19,58.01ZM53.02,66.76C54.41,65.97 55.62,64.95 56.66,63.69C57.69,62.44 58.47,61.04 58.98,59.49C57.6,60.28 56.38,61.3 55.35,62.55C54.31,63.8 53.54,65.21 53.02,66.76Z"
+ android:fillColor="#559DFD"/>
+ <path
+ android:pathData="M185.48,137.47C186.07,137.47 186.56,137.28 186.94,136.89C187.33,136.51 187.52,136.02 187.52,135.43C187.52,134.84 187.33,134.35 186.94,133.96C186.56,133.58 186.07,133.39 185.48,133.39C184.88,133.39 184.4,133.58 184.01,133.96C183.62,134.35 183.43,134.84 183.43,135.43C183.43,136.02 183.62,136.51 184.01,136.89C184.4,137.28 184.88,137.47 185.48,137.47Z"
+ android:fillColor="#202124"/>
+ <path
+ android:pathData="M54.83,176.56L60.78,178.1C63.63,178.83 66.64,178.74 69.45,177.82L75.29,175.92C86.88,172.14 98.07,182.63 94.99,194.4L93.44,200.33C92.69,203.18 92.78,206.18 93.69,208.97L95.6,214.79C99.37,226.35 88.83,237.52 77.03,234.47L71.09,232.93C68.23,232.19 65.22,232.29 62.42,233.2L56.58,235.11C44.98,238.89 33.8,228.4 36.88,216.63L38.43,210.7C39.17,207.85 39.08,204.85 38.17,202.06L36.27,196.23C32.49,184.68 43.03,173.51 54.83,176.56Z"
+ android:fillColor="#FFF7DD"/>
+ <path
+ android:pathData="M80.51,190.74m-6.18,0a6.18,6.18 0,1 1,12.37 0a6.18,6.18 0,1 1,-12.37 0"
+ android:fillColor="#FFC800"/>
+ <path
+ android:pathData="M50.47,219.9m-6.18,0a6.18,6.18 0,1 1,12.37 0a6.18,6.18 0,1 1,-12.37 0"
+ android:fillColor="#FFC800"/>
+ <path
+ android:pathData="M80.51,219.9m-6.18,0a6.18,6.18 0,1 1,12.37 0a6.18,6.18 0,1 1,-12.37 0"
+ android:fillColor="#FFC800"/>
+ <path
+ android:pathData="M77.6,193.13L50.21,220.52"
+ android:strokeWidth="1.76699"
+ android:fillColor="#00000000"
+ android:strokeColor="#FFC800"/>
+ <path
+ android:pathData="M80.07,219.9L50.47,219.9"
+ android:strokeWidth="1.76699"
+ android:fillColor="#00000000"
+ android:strokeColor="#FFC800"/>
+ <path
+ android:pathData="M311.22,173.59L289.22,173.9C286.98,173.93 284.78,174.55 282.85,175.7C280.92,176.85 279.34,178.48 278.25,180.44L267.53,199.55C266.44,201.5 265.88,203.71 265.91,205.95C265.94,208.18 266.56,210.38 267.72,212.3L278.99,231.12C280.14,233.04 281.78,234.63 283.74,235.72C285.7,236.81 287.91,237.36 290.15,237.33L312.15,237.01C314.39,236.99 316.59,236.37 318.52,235.22C320.45,234.08 322.04,232.45 323.14,230.49L333.84,211.37C334.93,209.41 335.49,207.21 335.45,204.97C335.42,202.73 334.79,200.54 333.64,198.62L322.38,179.8C321.23,177.88 319.59,176.3 317.63,175.21C315.67,174.12 313.46,173.56 311.22,173.59Z"
+ android:fillColor="#CEE3FF"/>
+ <path
+ android:pathData="M285.54,202.36C285.35,202.24 285.23,202.07 285.18,201.88C285.14,201.68 285.19,201.47 285.35,201.25C286.94,198.95 288.98,197.13 291.46,195.8C293.93,194.48 296.6,193.77 299.45,193.68C302.3,193.59 305.02,194.11 307.58,195.24C310.15,196.37 312.32,198.05 314.08,200.28C314.28,200.51 314.35,200.72 314.28,200.91C314.22,201.1 314.11,201.26 313.96,201.4C313.8,201.53 313.61,201.6 313.4,201.59C313.18,201.59 312.99,201.48 312.82,201.27C311.28,199.25 309.32,197.72 306.96,196.69C304.6,195.66 302.11,195.19 299.5,195.27C296.89,195.35 294.46,195.98 292.21,197.15C289.95,198.33 288.11,199.97 286.67,202.09C286.51,202.33 286.33,202.47 286.11,202.51C285.9,202.54 285.71,202.49 285.54,202.36ZM304.89,221.4C302.07,220.8 299.73,219.5 297.89,217.5C296.05,215.5 295.09,213.01 294.99,210.04C294.95,208.71 295.4,207.58 296.34,206.65C297.28,205.72 298.44,205.23 299.81,205.18C301.18,205.14 302.37,205.56 303.37,206.43C304.36,207.3 304.88,208.4 304.92,209.73C304.95,210.6 305.31,211.33 306,211.9C306.69,212.48 307.5,212.76 308.41,212.73C309.33,212.7 310.1,212.38 310.73,211.76C311.35,211.14 311.65,210.39 311.62,209.52C311.53,206.44 310.3,203.89 307.95,201.86C305.6,199.84 302.83,198.87 299.66,198.97C296.48,199.07 293.79,200.21 291.56,202.38C289.34,204.54 288.28,207.15 288.37,210.21C288.39,210.84 288.48,211.64 288.63,212.59C288.78,213.54 289.11,214.65 289.6,215.9C289.69,216.14 289.69,216.35 289.6,216.54C289.51,216.73 289.36,216.87 289.15,216.96C288.94,217.04 288.73,217.04 288.52,216.96C288.32,216.87 288.17,216.72 288.09,216.51C287.65,215.49 287.33,214.47 287.12,213.45C286.92,212.44 286.79,211.38 286.76,210.29C286.65,206.77 287.86,203.77 290.38,201.3C292.9,198.83 295.96,197.54 299.57,197.42C303.2,197.31 306.36,198.4 309.05,200.71C311.73,203.02 313.13,205.94 313.24,209.47C313.28,210.79 312.84,211.92 311.91,212.84C310.98,213.76 309.83,214.24 308.46,214.28C307.09,214.32 305.9,213.91 304.89,213.06C303.88,212.2 303.35,211.1 303.31,209.78C303.28,208.9 302.93,208.18 302.25,207.6C301.57,207.02 300.78,206.75 299.86,206.78C298.95,206.81 298.17,207.13 297.53,207.75C296.89,208.37 296.58,209.11 296.61,209.99C296.69,212.56 297.53,214.69 299.13,216.36C300.73,218.04 302.77,219.18 305.24,219.8C305.48,219.87 305.65,220 305.74,220.18C305.82,220.37 305.84,220.56 305.8,220.78C305.75,220.96 305.64,221.13 305.49,221.27C305.33,221.4 305.13,221.45 304.89,221.4ZM290.53,193.88C290.32,194.02 290.1,194.06 289.89,194C289.67,193.94 289.5,193.81 289.39,193.6C289.27,193.39 289.24,193.2 289.29,193.02C289.34,192.85 289.47,192.69 289.68,192.55C291.16,191.71 292.72,191.05 294.35,190.57C295.97,190.1 297.64,189.83 299.33,189.78C301.05,189.73 302.74,189.88 304.39,190.24C306.05,190.6 307.66,191.14 309.21,191.86C309.46,191.99 309.61,192.14 309.65,192.32C309.7,192.51 309.68,192.7 309.61,192.88C309.53,193.07 309.4,193.22 309.22,193.34C309.03,193.45 308.8,193.44 308.53,193.32C307.08,192.65 305.59,192.14 304.06,191.8C302.53,191.47 300.97,191.32 299.38,191.37C297.82,191.42 296.29,191.65 294.8,192.05C293.3,192.46 291.88,193.07 290.53,193.88ZM296.15,221.12C294.51,219.52 293.24,217.88 292.34,216.2C291.44,214.51 290.95,212.5 290.88,210.17C290.8,207.75 291.63,205.69 293.35,203.97C295.07,202.26 297.19,201.36 299.69,201.28C302.19,201.21 304.37,201.97 306.23,203.57C308.08,205.17 309.05,207.18 309.12,209.6C309.13,209.84 309.06,210.03 308.92,210.18C308.77,210.33 308.58,210.41 308.34,210.42C308.12,210.42 307.93,210.36 307.77,210.22C307.6,210.07 307.52,209.88 307.51,209.65C307.45,207.66 306.65,206.01 305.11,204.72C303.58,203.43 301.79,202.81 299.74,202.88C297.7,202.94 295.96,203.66 294.54,205.05C293.11,206.44 292.43,208.13 292.49,210.12C292.56,212.27 292.99,214.08 293.79,215.55C294.59,217.03 295.74,218.5 297.24,219.97C297.41,220.12 297.5,220.31 297.5,220.52C297.51,220.73 297.44,220.92 297.28,221.08C297.12,221.25 296.94,221.33 296.72,221.34C296.51,221.35 296.32,221.27 296.15,221.12ZM308.25,218.03C305.86,218.11 303.76,217.38 301.94,215.84C300.13,214.3 299.19,212.32 299.11,209.91C299.11,209.7 299.17,209.51 299.32,209.35C299.46,209.18 299.65,209.1 299.89,209.09C300.14,209.08 300.33,209.15 300.49,209.31C300.64,209.46 300.72,209.65 300.73,209.86C300.79,211.85 301.57,213.46 303.06,214.69C304.55,215.91 306.27,216.5 308.2,216.44C308.37,216.43 308.59,216.41 308.89,216.38C309.18,216.34 309.49,216.29 309.81,216.23C310.05,216.17 310.26,216.2 310.44,216.31C310.62,216.42 310.74,216.6 310.8,216.84C310.86,217.05 310.83,217.23 310.7,217.4C310.57,217.56 310.4,217.67 310.18,217.73C309.7,217.88 309.28,217.97 308.92,217.99C308.56,218.01 308.33,218.03 308.25,218.03Z"
+ android:fillColor="#669DF6"/>
+ <path
+ android:pathData="M214.98,100.49V166.46H149.02V100.49H214.98ZM214.98,91.07H149.02C143.83,91.07 139.59,95.31 139.59,100.49V166.46C139.59,171.64 143.83,175.88 149.02,175.88H214.98C220.17,175.88 224.41,171.64 224.41,166.46V100.49C224.41,95.31 220.17,91.07 214.98,91.07Z"
+ android:fillColor="#669DF6"/>
+ <path
+ android:pathData="M186.4,134.74L189.09,149.96H174.95L177.64,134.74C174.62,133.19 172.6,130.03 172.6,126.4C172.6,121.22 176.84,116.98 182.02,116.98C187.2,116.98 191.44,121.22 191.44,126.4C191.44,130.03 189.42,133.19 186.4,134.74Z"
+ android:fillColor="#669DF6"/>
+ </group>
+</vector>
diff --git a/res/drawable/private_space_illustration.xml b/res/drawable/private_space_illustration.xml
new file mode 100644
index 0000000..7f2dba8
--- /dev/null
+++ b/res/drawable/private_space_illustration.xml
@@ -0,0 +1,82 @@
+<!--
+ ~ Copyright (C) 2024 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="412dp"
+ android:height="300dp"
+ android:viewportWidth="364"
+ android:viewportHeight="265">
+ <group>
+ <clip-path
+ android:pathData="M0,0h364v265h-364z"/>
+ <group>
+ <clip-path
+ android:pathData="M0,0h364v265.05h-364z"/>
+ <path
+ android:pathData="M339.44,265.05H24.56C11.04,265.05 0,253.74 0,239.87V25.18C0,11.31 11.04,0 24.56,0H339.53C352.96,0 364,11.31 364,25.18V240.05C364,253.74 352.96,265.05 339.44,265.05Z"
+ android:fillColor="#000000"/>
+ <path
+ android:pathData="M85.7,153.29a17.67,18.11 0,1 0,35.34 0a17.67,18.11 0,1 0,-35.34 0z"
+ android:fillColor="#3C4043"/>
+ <path
+ android:pathData="M155.05,153.29m-18.11,0a18.11,18.11 0,1 1,36.22 0a18.11,18.11 0,1 1,-36.22 0"
+ android:fillColor="#3C4043"/>
+ <path
+ android:pathData="M208.95,153.29m-18.11,0a18.11,18.11 0,1 1,36.22 0a18.11,18.11 0,1 1,-36.22 0"
+ android:fillColor="#3C4043"/>
+ <path
+ android:pathData="M75.1,76.86L288.9,76.86A8.83,8.83 0,0 1,297.74 85.7L297.74,236.78A8.83,8.83 0,0 1,288.9 245.61L75.1,245.61A8.83,8.83 0,0 1,66.26 236.78L66.26,85.7A8.83,8.83 0,0 1,75.1 76.86z"
+ android:fillColor="#E8F0FE"/>
+ <path
+ android:pathData="M288.02,104.25C288.02,112.06 281.69,118.39 273.88,118.39C266.08,118.39 259.75,112.06 259.75,104.25C259.75,96.45 266.08,90.12 273.88,90.12C281.69,90.12 288.02,96.45 288.02,104.25Z"
+ android:fillColor="#D2E3FC"/>
+ <path
+ android:pathData="M275.92,98.6C275.92,97.39 276.99,96.37 278.35,96.37C279.71,96.37 280.78,97.39 280.78,98.6V101.88H282.72V98.6C282.72,96.33 280.74,94.53 278.35,94.53C275.96,94.53 273.98,96.33 273.98,98.6V100.96H267.57C266.18,100.96 265.05,102.03 265.05,103.35V110.7C265.05,112.02 266.18,113.09 267.57,113.09H276.7C278.09,113.09 279.22,112.02 279.22,110.7V103.35C279.22,102.03 278.09,100.96 276.7,100.96H275.92V98.6ZM267.57,102.8C267.25,102.8 266.99,103.05 266.99,103.35V110.7C266.99,111 267.25,111.25 267.57,111.25H276.7C277.02,111.25 277.28,111 277.28,110.7V103.35C277.28,103.05 277.02,102.8 276.7,102.8H267.57ZM272.14,108.68C273.1,108.68 273.88,107.94 273.88,107.03C273.88,106.11 273.1,105.37 272.14,105.37C271.17,105.37 270.39,106.11 270.39,107.03C270.39,107.94 271.17,108.68 272.14,108.68Z"
+ android:fillColor="#669DF6"
+ android:fillType="evenOdd"/>
+ <path
+ android:pathData="M102.04,147.1m-19.88,0a19.88,19.88 0,1 1,39.76 0a19.88,19.88 0,1 1,-39.76 0"
+ android:fillColor="#669DF6"/>
+ <path
+ android:pathData="M155.94,147.1m-19.88,0a19.88,19.88 0,1 1,39.76 0a19.88,19.88 0,1 1,-39.76 0"
+ android:fillColor="#669DF6"/>
+ <path
+ android:pathData="M102.04,204.53m-19.88,0a19.88,19.88 0,1 1,39.76 0a19.88,19.88 0,1 1,-39.76 0"
+ android:fillColor="#669DF6"/>
+ <path
+ android:pathData="M155.94,204.53m-19.88,0a19.88,19.88 0,1 1,39.76 0a19.88,19.88 0,1 1,-39.76 0"
+ android:fillColor="#669DF6"/>
+ <path
+ android:pathData="M210.71,203.65m-19.88,0a19.88,19.88 0,1 1,39.76 0a19.88,19.88 0,1 1,-39.76 0"
+ android:fillColor="#669DF6"/>
+ <path
+ android:pathData="M265.49,203.65m-19.88,0a19.88,19.88 0,1 1,39.76 0a19.88,19.88 0,1 1,-39.76 0"
+ android:fillColor="#669DF6"/>
+ </group>
+ <path
+ android:pathData="M86.14,46.38m-19.88,0a19.88,19.88 0,1 1,39.76 0a19.88,19.88 0,1 1,-39.76 0"
+ android:fillColor="#3C4043"/>
+ <path
+ android:pathData="M150.64,46.38m-19.88,0a19.88,19.88 0,1 1,39.76 0a19.88,19.88 0,1 1,-39.76 0"
+ android:fillColor="#3C4043"/>
+ <path
+ android:pathData="M213.36,46.38m-19.88,0a19.88,19.88 0,1 1,39.76 0a19.88,19.88 0,1 1,-39.76 0"
+ android:fillColor="#3C4043"/>
+ <path
+ android:pathData="M277.86,46.38m-19.88,0a19.88,19.88 0,1 1,39.76 0a19.88,19.88 0,1 1,-39.76 0"
+ android:fillColor="#3C4043"/>
+ </group>
+</vector>
diff --git a/res/drawable/private_space_setup_notification_illustration.xml b/res/drawable/private_space_setup_notification_illustration.xml
new file mode 100644
index 0000000..ecdb486
--- /dev/null
+++ b/res/drawable/private_space_setup_notification_illustration.xml
@@ -0,0 +1,65 @@
+<!--
+ ~ Copyright (C) 2024 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="364dp"
+ android:height="265dp"
+ android:viewportWidth="364"
+ android:viewportHeight="265">
+ <group>
+ <group>
+ <clip-path
+ android:pathData="M0,0.48h364v265.05h-364z"/>
+ <path
+ android:pathData="M339.42,264.99H24.58C11.07,264.99 0,253.7 0,239.92V25.94C0,12.12 11.07,0.83 24.58,0.83H339.52C352.93,0.83 364,12.12 364,25.91V240.01C364,253.7 352.93,264.99 339.42,264.99Z"
+ android:fillColor="#000000"/>
+ </group>
+ <path
+ android:pathData="M200.49,144.8C200.49,139.45 205.07,134.95 210.92,134.95C216.77,134.95 221.36,139.45 221.36,144.8V159.36H229.71V144.8C229.71,134.78 221.21,126.82 210.92,126.82C200.64,126.82 192.14,134.78 192.14,144.8V155.29H164.58C158.59,155.29 153.73,160.02 153.73,165.86V198.4C153.73,204.24 158.59,208.98 164.58,208.98H203.82C209.82,208.98 214.68,204.24 214.68,198.4V165.86C214.68,160.02 209.82,155.29 203.82,155.29H200.49V144.8ZM164.58,163.42C163.2,163.42 162.08,164.52 162.08,165.86V198.4C162.08,199.75 163.2,200.85 164.58,200.85H203.82C205.21,200.85 206.33,199.75 206.33,198.4V165.86C206.33,164.52 205.21,163.42 203.82,163.42H164.58ZM184.2,189.46C188.35,189.46 191.72,186.18 191.72,182.13C191.72,178.09 188.35,174.81 184.2,174.81C180.05,174.81 176.69,178.09 176.69,182.13C176.69,186.18 180.05,189.46 184.2,189.46Z"
+ android:fillColor="#C58AF9"
+ android:fillType="evenOdd"/>
+ <path
+ android:pathData="M163.56,220.47C168.99,220.47 173.39,224.87 173.39,230.3C173.39,235.72 168.99,240.13 163.56,240.13C158.13,240.13 153.73,235.72 153.73,230.3C153.73,224.87 158.13,220.47 163.56,220.47Z"
+ android:fillColor="#5F6368"/>
+ <path
+ android:pathData="M201.15,220.47C206.58,220.47 210.98,224.87 210.98,230.3C210.98,235.72 206.58,240.13 201.15,240.13C195.71,240.13 191.32,235.72 191.32,230.3C191.32,224.87 195.71,220.47 201.15,220.47Z"
+ android:fillColor="#C58AF9"/>
+ <path
+ android:pathData="M89.23,28.75L257.1,28.75A13.25,13.25 0,0 1,270.35 42L270.35,79.99A13.25,13.25 0,0 1,257.1 93.24L89.23,93.24A13.25,13.25 0,0 1,75.98 79.99L75.98,42A13.25,13.25 0,0 1,89.23 28.75z"
+ android:fillColor="#E9D2FD"/>
+ <path
+ android:pathData="M145.78,43.77L241.19,43.77A5.3,5.3 0,0 1,246.49 49.07L246.49,49.07A5.3,5.3 0,0 1,241.19 54.37L145.78,54.37A5.3,5.3 0,0 1,140.48 49.07L140.48,49.07A5.3,5.3 0,0 1,145.78 43.77z"
+ android:fillColor="#C58AF9"/>
+ <path
+ android:pathData="M145.34,64.97L241.64,64.97A4.86,4.86 0,0 1,246.49 69.83L246.49,69.83A4.86,4.86 0,0 1,241.64 74.69L145.34,74.69A4.86,4.86 0,0 1,140.48 69.83L140.48,69.83A4.86,4.86 0,0 1,145.34 64.97z"
+ android:fillColor="#C58AF9"/>
+ <path
+ android:pathData="M108.23,81.76C120.18,81.76 129.87,72.07 129.87,60.11C129.87,48.16 120.18,38.47 108.23,38.47C96.27,38.47 86.58,48.16 86.58,60.11C86.58,72.07 96.27,81.76 108.23,81.76Z"
+ android:fillColor="#C58AF9"/>
+ <path
+ android:pathData="M266.37,112.68C278.33,112.68 288.02,102.99 288.02,91.03C288.02,79.08 278.33,69.39 266.37,69.39C254.42,69.39 244.73,79.08 244.73,91.03C244.73,102.99 254.42,112.68 266.37,112.68Z"
+ android:fillColor="#C58AF9"/>
+ <path
+ android:pathData="M96.3,70.05V66.96H99.39V56.14C99.39,54 100.04,52.1 101.33,50.43C102.61,48.77 104.29,47.68 106.35,47.17V46.09C106.35,45.44 106.58,44.89 107.03,44.44C107.48,43.99 108.03,43.77 108.67,43.77C109.31,43.77 109.86,43.99 110.31,44.44C110.76,44.89 110.99,45.44 110.99,46.09V47.17C113.05,47.68 114.73,48.77 116.01,50.43C117.3,52.1 117.95,54 117.95,56.14V66.96H121.04V70.05H96.3ZM108.67,74.69C107.82,74.69 107.09,74.39 106.49,73.78C105.88,73.18 105.58,72.45 105.58,71.6H111.76C111.76,72.45 111.46,73.18 110.85,73.78C110.25,74.39 109.52,74.69 108.67,74.69ZM102.49,66.96H114.85V56.14C114.85,54.43 114.25,52.98 113.04,51.77C111.83,50.56 110.37,49.95 108.67,49.95C106.97,49.95 105.51,50.56 104.3,51.77C103.09,52.98 102.49,54.43 102.49,56.14V66.96Z"
+ android:fillColor="#E9D2FD"/>
+ <path
+ android:pathData="M276.44,81.86V101.1H257.2V81.86H276.44ZM276.44,79.11H257.2C255.68,79.11 254.45,80.34 254.45,81.86V101.1C254.45,102.61 255.68,103.84 257.2,103.84H276.44C277.95,103.84 279.18,102.61 279.18,101.1V81.86C279.18,80.34 277.95,79.11 276.44,79.11Z"
+ android:fillColor="#E9D2FD"/>
+ <path
+ android:pathData="M268.09,91.85L268.87,96.29H264.75L265.54,91.85C264.65,91.39 264.06,90.47 264.06,89.42C264.06,87.9 265.3,86.67 266.81,86.67C268.33,86.67 269.56,87.9 269.56,89.42C269.56,90.47 268.97,91.39 268.09,91.85Z"
+ android:fillColor="#E9D2FD"/>
+ </group>
+</vector>
diff --git a/res/drawable/private_space_setup_preinstalled_illustration.xml b/res/drawable/private_space_setup_preinstalled_illustration.xml
new file mode 100644
index 0000000..2f01f01
--- /dev/null
+++ b/res/drawable/private_space_setup_preinstalled_illustration.xml
@@ -0,0 +1,77 @@
+<!--
+ ~ Copyright (C) 2024 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="364dp"
+ android:height="266dp"
+ android:viewportWidth="364"
+ android:viewportHeight="266">
+ <group>
+ <clip-path
+ android:pathData="M0,0.48h364v265.05h-364z"/>
+ <path
+ android:pathData="M339.42,264.99H24.58C11.07,264.99 0,253.7 0,239.92V25.94C0,12.13 11.07,0.83 24.58,0.83H339.52C352.93,0.83 364,12.13 364,25.91V240.01C364,253.7 352.93,264.99 339.42,264.99Z"
+ android:fillColor="#000000"/>
+ <path
+ android:pathData="M75.92,137.81L50.21,111.72C50.1,111.61 49.96,111.54 49.81,111.5C49.66,111.47 49.51,111.49 49.36,111.54C49.22,111.6 49.1,111.7 49.01,111.83C48.93,111.95 48.88,112.1 48.88,112.26L48.52,162.99C48.52,163.14 48.56,163.29 48.64,163.42C48.73,163.54 48.84,163.64 48.98,163.7C49.12,163.76 49.27,163.78 49.42,163.76C49.57,163.73 49.71,163.66 49.82,163.56L75.92,137.81Z"
+ android:fillColor="#C58AF9"/>
+ <path
+ android:pathData="M79.16,134.61L87.37,126.51L54.65,107.44C54.48,107.32 54.27,107.28 54.07,107.31C53.87,107.35 53.69,107.46 53.57,107.62C53.45,107.78 53.39,107.99 53.42,108.19C53.44,108.39 53.55,108.58 53.71,108.71L79.16,134.61Z"
+ android:fillColor="#C58AF9"/>
+ <path
+ android:pathData="M53.24,166.57C53.09,166.71 53.01,166.89 52.99,167.08C52.97,167.27 53.02,167.47 53.13,167.63C53.24,167.79 53.41,167.9 53.6,167.95C53.79,167.99 53.99,167.97 54.16,167.88L87.22,149.32L79.13,141.09L53.24,166.57Z"
+ android:fillColor="#C58AF9"/>
+ <path
+ android:pathData="M101.4,134.67L91.43,128.87L82.37,137.83L91.35,146.94L101.4,141.28C101.97,140.94 102.45,140.46 102.78,139.88C103.11,139.3 103.29,138.64 103.29,137.97C103.29,137.31 103.11,136.65 102.78,136.07C102.45,135.49 101.97,135.01 101.4,134.67Z"
+ android:fillColor="#C58AF9"/>
+ <path
+ android:pathData="M263.42,132.67C263.42,136.04 264.61,138.92 267,141.32C269.39,143.71 272.26,144.91 275.61,144.91C278.96,144.91 281.83,143.71 284.22,141.32C286.61,138.92 287.8,136.04 287.8,132.67C287.8,129.31 286.61,126.43 284.22,124.03C281.83,121.63 278.96,120.43 275.61,120.43C272.26,120.43 269.39,121.63 267,124.03C264.61,126.43 263.42,129.31 263.42,132.67ZM275.61,151.03C276.27,151.03 276.9,151.01 277.51,150.95C278.12,150.9 278.73,150.8 279.34,150.65L272.18,163.04C264.51,162.17 258.08,158.87 252.9,153.13C247.72,147.4 245.13,140.58 245.13,132.67C245.13,130.53 245.33,128.45 245.74,126.44C246.14,124.43 246.75,122.5 247.57,120.66L259.76,141.85C261.33,144.6 263.52,146.82 266.31,148.51C269.11,150.19 272.2,151.03 275.61,151.03ZM275.61,114.32C271.55,114.32 267.94,115.5 264.79,117.87C261.64,120.24 259.45,123.26 258.23,126.94L251.07,114.54C253.87,110.77 257.38,107.75 261.63,105.48C265.87,103.21 270.53,102.08 275.61,102.08C280.64,102.08 285.26,103.19 289.48,105.4C293.69,107.62 297.2,110.59 299.99,114.32H275.61ZM303.5,120.43C304.36,122.32 305.01,124.29 305.44,126.32C305.87,128.36 306.09,130.48 306.09,132.67C306.09,140.58 303.51,147.38 298.36,153.1C293.2,158.81 286.84,162.12 279.27,163.04L291.46,141.85C292.22,140.53 292.82,139.09 293.25,137.53C293.68,135.98 293.9,134.36 293.9,132.67C293.9,130.28 293.48,128.04 292.64,125.98C291.8,123.92 290.65,122.07 289.17,120.43H303.5Z"
+ android:fillColor="#C58AF9"/>
+ <path
+ android:pathData="M155.01,119.75h41.52v36.22h-41.52z"
+ android:fillColor="#E9D2FD"/>
+ <path
+ android:pathData="M175.77,149.2C179.47,149.2 182.62,147.91 185.21,145.33C187.8,142.76 189.09,139.63 189.09,135.95C189.09,132.26 187.8,129.13 185.21,126.56C182.62,123.98 179.47,122.69 175.77,122.69C172.07,122.69 168.93,123.98 166.34,126.56C163.75,129.13 162.46,132.26 162.46,135.95C162.46,139.63 163.75,142.76 166.34,145.33C168.93,147.91 172.07,149.2 175.77,149.2ZM175.77,143.31C173.7,143.31 171.95,142.6 170.52,141.17C169.09,139.75 168.38,138.01 168.38,135.95C168.38,133.88 169.09,132.14 170.52,130.72C171.95,129.29 173.7,128.58 175.77,128.58C177.85,128.58 179.6,129.29 181.03,130.72C182.46,132.14 183.17,133.88 183.17,135.95C183.17,138.01 182.46,139.75 181.03,141.17C179.6,142.6 177.85,143.31 175.77,143.31ZM152.1,159.51C150.47,159.51 149.07,158.93 147.92,157.77C146.76,156.62 146.18,155.24 146.18,153.62V118.28C146.18,116.65 146.76,115.27 147.92,114.11C149.07,112.96 150.47,112.39 152.1,112.39H161.42L166.9,106.5H184.65L190.13,112.39H199.45C201.08,112.39 202.47,112.96 203.63,114.11C204.79,115.27 205.37,116.65 205.37,118.28V153.62C205.37,155.24 204.79,156.62 203.63,157.77C202.47,158.93 201.08,159.51 199.45,159.51H152.1Z"
+ android:fillColor="#C58AF9"/>
+ <path
+ android:pathData="M109.51,182.48C121.47,182.48 131.16,172.78 131.16,160.83C131.16,148.88 121.47,139.18 109.51,139.18C97.56,139.18 87.87,148.88 87.87,160.83C87.87,172.78 97.56,182.48 109.51,182.48Z"
+ android:fillColor="#E9D2FD"/>
+ <path
+ android:pathData="M119.57,151.65V170.89H100.33V151.65H119.57ZM119.57,148.9H100.33C98.82,148.9 97.58,150.14 97.58,151.65V170.89C97.58,172.4 98.82,173.64 100.33,173.64H119.57C121.09,173.64 122.32,172.4 122.32,170.89V151.65C122.32,150.14 121.09,148.9 119.57,148.9Z"
+ android:fillColor="#C58AF9"/>
+ <path
+ android:pathData="M111.23,161.64L112.01,166.08H107.89L108.67,161.64C107.79,161.19 107.2,160.27 107.2,159.21C107.2,157.7 108.44,156.46 109.95,156.46C111.46,156.46 112.7,157.7 112.7,159.21C112.7,160.27 112.11,161.19 111.23,161.64Z"
+ android:fillColor="#C58AF9"/>
+ <path
+ android:pathData="M208.46,182.48C220.42,182.48 230.11,172.78 230.11,160.83C230.11,148.88 220.42,139.18 208.46,139.18C196.51,139.18 186.82,148.88 186.82,160.83C186.82,172.78 196.51,182.48 208.46,182.48Z"
+ android:fillColor="#E9D2FD"/>
+ <path
+ android:pathData="M218.52,151.65V170.89H199.29V151.65H218.52ZM218.52,148.9H199.29C197.77,148.9 196.54,150.14 196.54,151.65V170.89C196.54,172.4 197.77,173.64 199.29,173.64H218.52C220.04,173.64 221.27,172.4 221.27,170.89V151.65C221.27,150.14 220.04,148.9 218.52,148.9Z"
+ android:fillColor="#C58AF9"/>
+ <path
+ android:pathData="M210.18,161.64L210.96,166.08H206.84L207.62,161.64C206.74,161.19 206.15,160.27 206.15,159.21C206.15,157.7 207.39,156.46 208.9,156.46C210.41,156.46 211.65,157.7 211.65,159.21C211.65,160.27 211.06,161.19 210.18,161.64Z"
+ android:fillColor="#C58AF9"/>
+ <path
+ android:pathData="M312.72,182.48C324.67,182.48 334.36,172.78 334.36,160.83C334.36,148.88 324.67,139.18 312.72,139.18C300.76,139.18 291.07,148.88 291.07,160.83C291.07,172.78 300.76,182.48 312.72,182.48Z"
+ android:fillColor="#E9D2FD"/>
+ <path
+ android:pathData="M322.78,151.65V170.89H303.54V151.65H322.78ZM322.78,148.9H303.54C302.03,148.9 300.79,150.14 300.79,151.65V170.89C300.79,172.4 302.03,173.64 303.54,173.64H322.78C324.29,173.64 325.53,172.4 325.53,170.89V151.65C325.53,150.14 324.29,148.9 322.78,148.9Z"
+ android:fillColor="#C58AF9"/>
+ <path
+ android:pathData="M314.43,161.64L315.22,166.08H311.09L311.88,161.64C311,161.19 310.41,160.27 310.41,159.21C310.41,157.7 311.64,156.46 313.15,156.46C314.67,156.46 315.9,157.7 315.9,159.21C315.9,160.27 315.31,161.19 314.43,161.64Z"
+ android:fillColor="#C58AF9"/>
+ </group>
+</vector>
diff --git a/res/drawable/private_space_setup_sharing_illustration.xml b/res/drawable/private_space_setup_sharing_illustration.xml
new file mode 100644
index 0000000..8cfa77f
--- /dev/null
+++ b/res/drawable/private_space_setup_sharing_illustration.xml
@@ -0,0 +1,100 @@
+<!--
+ ~ Copyright (C) 2024 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="364dp"
+ android:height="266dp"
+ android:viewportWidth="364"
+ android:viewportHeight="266">
+ <group>
+ <clip-path
+ android:pathData="M0,0.48h364v265.05h-364z"/>
+ <path
+ android:pathData="M339.42,264.99H24.58C11.07,264.99 0,253.7 0,239.92V25.94C0,12.13 11.07,0.83 24.58,0.83H339.52C352.93,0.83 364,12.13 364,25.91V240.01C364,253.7 352.93,264.99 339.42,264.99Z"
+ android:fillColor="#000000"/>
+ <path
+ android:pathData="M201.15,182.48C195.72,182.48 191.32,186.88 191.32,192.31C191.32,197.73 195.72,202.14 201.15,202.14C206.58,202.14 210.98,197.73 210.98,192.31C210.98,186.88 206.58,182.48 201.15,182.48Z"
+ android:fillColor="#3C4043"/>
+ <path
+ android:pathData="M163.56,182.48C158.13,182.48 153.73,186.88 153.73,192.31C153.73,197.73 158.13,202.14 163.56,202.14C168.99,202.14 173.39,197.73 173.39,192.31C173.39,186.88 168.99,182.48 163.56,182.48Z"
+ android:fillColor="#669DF6"/>
+ <path
+ android:pathData="M185.48,136.99C186.07,136.99 186.56,136.8 186.94,136.41C187.33,136.03 187.52,135.54 187.52,134.95C187.52,134.36 187.33,133.88 186.94,133.49C186.56,133.1 186.07,132.91 185.48,132.91C184.88,132.91 184.4,133.1 184.01,133.49C183.62,133.88 183.43,134.36 183.43,134.95C183.43,135.54 183.62,136.03 184.01,136.41C184.4,136.8 184.88,136.99 185.48,136.99Z"
+ android:fillColor="#202124"/>
+ <path
+ android:pathData="M338.13,145.81L322.74,131.98C319.02,128.64 313.3,128.94 309.97,132.66C306.63,136.37 306.93,142.09 310.65,145.43L326.05,159.26C329.76,162.6 335.48,162.3 338.82,158.58C342.15,154.87 341.85,149.15 338.13,145.81Z"
+ android:fillColor="#AECBFA"/>
+ <path
+ android:pathData="M325.81,64.64L295.79,43.72C293.73,42.28 290.89,42.79 289.45,44.85L268.54,74.87C267.1,76.93 267.6,79.77 269.67,81.21L299.69,102.13C301.75,103.56 304.59,103.06 306.02,100.99L326.94,70.97C328.38,68.91 327.87,66.07 325.81,64.64Z"
+ android:fillColor="#E8F0FE"/>
+ <path
+ android:pathData="M297.96,73.56C299.44,74.63 301.2,75.25 303.04,75.33C304.87,75.41 306.69,74.95 308.25,74.01C309.82,73.06 311.07,71.68 311.85,70.03C312.63,68.38 312.89,66.53 312.61,64.73C312.34,62.93 311.53,61.25 310.29,59.91C309.05,58.56 307.44,57.61 305.66,57.18C303.88,56.75 302,56.85 300.28,57.47C298.56,58.09 297.06,59.21 295.97,60.68C294.52,62.65 293.91,65.11 294.28,67.53C294.65,69.94 295.98,72.11 297.96,73.56Z"
+ android:fillColor="#669DF6"/>
+ <path
+ android:pathData="M295.71,77.78C287.35,71.94 278.5,69.93 272.37,77.85L302.63,98.92C308.76,91 304.07,83.58 295.71,77.78Z"
+ android:fillColor="#669DF6"/>
+ <path
+ android:pathData="M84.13,50.89L47.87,55.78C45.37,56.11 43.63,58.4 43.96,60.89L48.85,97.15C49.18,99.65 51.47,101.39 53.97,101.06L90.23,96.17C92.72,95.84 94.47,93.55 94.13,91.05L89.25,54.79C88.91,52.3 86.62,50.55 84.13,50.89Z"
+ android:fillColor="#E9D2FD"/>
+ <path
+ android:pathData="M69.64,76.29C71.46,76.08 73.18,75.35 74.58,74.17C75.99,72.99 77.01,71.42 77.53,69.66C78.05,67.91 78.03,66.04 77.49,64.3C76.94,62.56 75.89,61.02 74.47,59.88C73.05,58.74 71.32,58.05 69.49,57.9C67.67,57.75 65.84,58.14 64.24,59.02C62.63,59.91 61.32,61.24 60.47,62.87C59.62,64.49 59.27,66.33 59.47,68.15C59.73,70.58 60.94,72.81 62.85,74.33C64.76,75.86 67.2,76.56 69.64,76.29Z"
+ android:fillColor="#C58AF9"/>
+ <path
+ android:pathData="M70.84,80.92C60.73,82.28 52.85,86.78 53.69,96.76L90.23,91.82C89.39,81.84 80.92,79.54 70.84,80.92Z"
+ android:fillColor="#C58AF9"/>
+ <path
+ android:pathData="M39.14,170.33L66.27,160.64A11.49,11.49 115.34,0 1,80.95 167.59L89.91,192.65A11.49,11.49 115.34,0 1,82.96 207.33L55.82,217.03A11.49,11.49 115.34,0 1,41.14 210.07L32.19,185.01A11.49,11.49 115.34,0 1,39.14 170.33z"
+ android:fillColor="#E8F0FE"/>
+ <path
+ android:pathData="M66.57,172.29a4.81,4.58 70.34,1 0,8.63 -3.08a4.81,4.58 70.34,1 0,-8.63 3.08z"
+ android:fillColor="#669DF6"/>
+ <group>
+ <clip-path
+ android:pathData="M39.14,170.33L66.27,160.64A11.49,11.49 115.34,0 1,80.95 167.59L89.91,192.65A11.49,11.49 115.34,0 1,82.96 207.33L55.82,217.03A11.49,11.49 115.34,0 1,41.14 210.07L32.19,185.01A11.49,11.49 115.34,0 1,39.14 170.33z"/>
+ <path
+ android:pathData="M57.86,186.51C53.39,183.04 46.83,185.22 45.32,190.67L39.9,210.23C38.18,216.44 44.17,222.01 50.24,219.85L72.6,211.86C72.78,211.79 72.95,211.72 73.12,211.65C73.31,211.59 73.49,211.54 73.68,211.47L88.87,206.04C95.09,203.82 96.05,195.42 90.49,191.86L79.38,184.73C74.99,181.92 69.13,184.01 67.52,188.97L66.21,193L57.86,186.51Z"
+ android:fillColor="#669DF6"
+ android:fillType="evenOdd"/>
+ </group>
+ <path
+ android:pathData="M297.35,169.44L324.72,178.44A11.49,11.49 63.19,0 1,332.04 192.93L323.74,218.22A11.49,11.49 63.19,0 1,309.24 225.54L281.87,216.55A11.49,11.49 63.19,0 1,274.54 202.05L282.85,176.77A11.49,11.49 63.19,0 1,297.35 169.44z"
+ android:fillColor="#E9D2FD"/>
+ <path
+ android:pathData="M317.81,187.82a4.81,4.58 108.19,1 0,8.71 2.86a4.81,4.58 108.19,1 0,-8.71 -2.86z"
+ android:fillColor="#C58AF9"/>
+ <group>
+ <clip-path
+ android:pathData="M297.35,169.44L324.72,178.44A11.49,11.49 63.19,0 1,332.04 192.93L323.74,218.22A11.49,11.49 63.19,0 1,309.24 225.54L281.87,216.55A11.49,11.49 63.19,0 1,274.54 202.05L282.85,176.77A11.49,11.49 63.19,0 1,297.35 169.44z"/>
+ <path
+ android:pathData="M302.2,193.71C300.8,188.23 294.29,185.92 289.75,189.3L273.46,201.42C268.3,205.27 269.61,213.34 275.73,215.35L298.28,222.76C298.46,222.82 298.64,222.87 298.83,222.92C299.01,222.99 299.19,223.06 299.38,223.12L314.71,228.15C320.98,230.22 326.89,224.17 324.68,217.95L320.28,205.5C318.54,200.59 312.63,198.65 308.32,201.57L304.82,203.95L302.2,193.71Z"
+ android:fillColor="#C58AF9"
+ android:fillType="evenOdd"/>
+ </group>
+ </group>
+ <path
+ android:pathData="M157.77,52.17L131.31,64.89C130.6,65.23 129.79,65.27 129.04,65.01C128.3,64.75 127.69,64.21 127.36,63.5L126.91,62.58C124.89,58.37 124.62,53.52 126.17,49.1C127.72,44.69 130.96,41.07 135.17,39.04C139.39,37.01 144.24,36.74 148.66,38.29C153.07,39.84 156.69,43.08 158.72,47.3L159.16,48.21C159.5,48.92 159.54,49.74 159.28,50.48C159.02,51.22 158.48,51.83 157.77,52.17Z"
+ android:fillColor="#669DF6"/>
+ <path
+ android:pathData="M200.49,106.81C200.49,101.46 205.07,96.96 210.92,96.96C216.77,96.96 221.36,101.46 221.36,106.81V121.37H229.71V106.81C229.71,96.79 221.21,88.83 210.92,88.83C200.64,88.83 192.14,96.79 192.14,106.81V117.3H164.58C158.59,117.3 153.73,122.03 153.73,127.87V160.41C153.73,166.26 158.59,170.99 164.58,170.99H203.82C209.82,170.99 214.68,166.26 214.68,160.41V127.87C214.68,122.03 209.82,117.3 203.82,117.3H200.49V106.81ZM164.58,125.43C163.2,125.43 162.08,126.53 162.08,127.87V160.41C162.08,161.76 163.2,162.85 164.58,162.85H203.82C205.21,162.85 206.33,161.76 206.33,160.41V127.87C206.33,126.53 205.21,125.43 203.82,125.43H164.58ZM184.2,151.47C188.35,151.47 191.72,148.19 191.72,144.14C191.72,140.1 188.35,136.82 184.2,136.82C180.05,136.82 176.69,140.1 176.69,144.14C176.69,148.19 180.05,151.47 184.2,151.47Z"
+ android:fillColor="#C58AF9"
+ android:fillType="evenOdd"/>
+ <path
+ android:pathData="M163.56,182.48C168.99,182.48 173.39,186.88 173.39,192.31C173.39,197.73 168.99,202.14 163.56,202.14C158.13,202.14 153.73,197.73 153.73,192.31C153.73,186.88 158.13,182.48 163.56,182.48Z"
+ android:fillColor="#5F6368"/>
+ <path
+ android:pathData="M201.15,182.48C206.58,182.48 210.98,186.88 210.98,192.31C210.98,197.73 206.58,202.14 201.15,202.14C195.71,202.14 191.32,197.73 191.32,192.31C191.32,186.88 195.71,182.48 201.15,182.48Z"
+ android:fillColor="#C58AF9"/>
+</vector>
diff --git a/res/drawable/privatespace_lock_placeholder.xml b/res/drawable/privatespace_lock_placeholder.xml
deleted file mode 100644
index 815ffd7..0000000
--- a/res/drawable/privatespace_lock_placeholder.xml
+++ /dev/null
@@ -1,78 +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.
- -->
-
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="380dp"
- android:height="276dp"
- android:viewportWidth="380"
- android:viewportHeight="276">
- <path
- android:pathData="M354.34,276H25.66C11.56,276 0,264.2 0,249.8V26.24C0,11.8 11.56,0 25.66,0H354.44C368.44,0 380,11.8 380,26.2V249.9C380,264.2 368.44,276 354.34,276Z"
- android:fillColor="#000000"/>
- <path
- android:pathData="M190,37.72C185.34,37.71 180.72,38.64 176.42,40.45C170.09,43.12 164.69,47.58 160.89,53.3C157.1,59.01 155.09,65.72 155.1,72.57V90.07H155.29V111.34H161.68V72.57C161.67,67.12 163.23,61.79 166.18,57.2L166.04,57.11C166.1,57.01 166.16,56.92 166.23,56.82C169.33,52.16 173.74,48.5 178.91,46.33C185.11,43.73 192.03,43.39 198.45,45.38C204.88,47.37 210.39,51.55 214.02,57.2L214.01,57.2C216.96,61.79 218.52,67.12 218.51,72.57V111.34H224.9V72.57C224.92,65.9 223,59.37 219.4,53.76L215.27,56.4L219.39,53.76C216.24,48.83 211.89,44.78 206.76,41.98C201.62,39.17 195.86,37.71 190,37.72Z"
- android:fillColor="#669DF6"
- android:fillType="evenOdd"/>
- <path
- android:pathData="M250.08,227.69H129.92C126.53,227.69 123.28,226.35 120.88,223.96C118.48,221.56 117.14,218.32 117.14,214.93V122.24C117.14,118.86 118.48,115.61 120.88,113.22C123.28,110.83 126.53,109.48 129.92,109.48H250.08C253.47,109.48 256.72,110.83 259.12,113.22C261.52,115.61 262.86,118.86 262.86,122.24V214.93C262.86,218.32 261.52,221.56 259.12,223.96C256.72,226.35 253.47,227.69 250.08,227.69ZM129.92,113.13C127.5,113.13 125.18,114.09 123.46,115.8C121.75,117.5 120.79,119.82 120.79,122.24V214.93C120.79,217.35 121.75,219.67 123.46,221.38C125.18,223.09 127.5,224.05 129.92,224.05H250.08C252.5,224.05 254.82,223.09 256.54,221.38C258.25,219.67 259.21,217.35 259.21,214.93V122.24C259.21,119.82 258.25,117.5 256.54,115.8C254.82,114.09 252.5,113.13 250.08,113.13H129.92Z"
- android:fillColor="#80868B"/>
- <path
- android:pathData="M281.77,245.93C303.27,245.93 320.69,228.59 320.69,207.21C320.69,185.83 303.27,168.49 281.77,168.49C260.28,168.49 242.86,185.83 242.86,207.21C242.86,228.59 260.28,245.93 281.77,245.93Z"
- android:fillColor="#000000"/>
- <path
- android:pathData="M281.77,168.36C260.2,168.36 242.57,185.76 242.57,207.37C242.57,228.97 260.06,246.37 281.77,246.37C303.49,246.37 320.97,228.97 320.97,207.37C320.97,185.76 303.35,168.36 281.77,168.36ZM281.77,238.37C264.57,238.37 250.47,224.34 250.47,207.22C250.47,190.11 264.57,176.08 281.77,176.08C298.98,176.08 313.08,190.11 313.08,207.22C313.08,224.48 298.98,238.37 281.77,238.37Z"
- android:fillColor="#669DF6"/>
- <path
- android:pathData="M281.77,170.07C261.13,170.07 244.27,186.71 244.27,207.37C244.27,228.02 260.99,244.66 281.77,244.66C302.55,244.66 319.27,228.02 319.27,207.37C319.27,186.71 302.42,170.07 281.77,170.07ZM281.77,240.07C263.64,240.07 248.77,225.29 248.77,207.22C248.77,189.16 263.64,174.38 281.77,174.38C299.91,174.38 314.78,189.16 314.78,207.22C314.78,225.43 299.9,240.07 281.77,240.07ZM242.57,207.37C242.57,185.76 260.2,168.36 281.77,168.36C303.35,168.36 320.97,185.76 320.97,207.37C320.97,228.97 303.49,246.37 281.77,246.37C260.06,246.37 242.57,228.97 242.57,207.37ZM250.47,207.22C250.47,224.34 264.57,238.37 281.77,238.37C298.98,238.37 313.08,224.48 313.08,207.22C313.08,190.11 298.98,176.08 281.77,176.08C264.57,176.08 250.47,190.11 250.47,207.22Z"
- android:fillColor="#000000"
- android:fillType="evenOdd"/>
- <path
- android:pathData="M301.48,193.25C301.48,191.56 300.44,190.07 298.85,189.48L283.36,183.85C282.49,183.54 281.54,183.54 280.66,183.85L265.14,189.48C263.56,190.07 262.52,191.56 262.52,193.25V203.97C262.56,205.8 262.68,207.57 262.93,209.4C264.07,217.18 268.46,226.02 280.46,232.19C281.41,232.68 282.56,232.68 283.51,232.19C295.52,225.99 299.9,217.18 301.05,209.4C301.29,207.59 301.43,205.8 301.46,203.97V193.25H301.48Z"
- android:fillColor="#000000"/>
- <path
- android:pathData="M291.62,222.69C291.74,222.13 292.45,218.26 290.38,214.37C289.21,212.19 287.7,210.92 285.63,209.28C284.21,208.18 280.46,205.76 279.52,205.17C279.56,205.19 279.64,205.27 279.68,205.29C279.17,204.97 279.2,204.97 279.52,205.17C278.47,204.46 276.67,203.04 275.3,200.59C273.67,197.68 273.62,194.96 273.62,194.45C273.62,194.4 273.62,194.38 273.62,194.33C273.62,191.05 274.64,188.5 276.27,186.67C277.49,185.3 278.88,184.51 280.05,184.05L265.14,189.48C263.56,190.04 262.52,191.56 262.52,193.25V203.97C262.56,205.8 262.68,207.57 262.93,209.4C264.07,217.18 268.46,226.02 280.46,232.18C281.41,232.68 282.56,232.68 283.51,232.18C284.63,231.62 285.65,231.01 286.63,230.4C288.14,229.27 290.79,226.78 291.6,222.69H291.62Z"
- android:fillColor="#3957E2"/>
- <path
- android:pathData="M279.69,205.29C279.69,205.29 279.57,205.19 279.52,205.17C279.2,204.97 279.17,204.97 279.69,205.29Z"
- android:fillColor="#000000"/>
- <path
- android:pathData="M298.85,189.48L283.36,183.85C282.48,183.54 281.54,183.54 280.66,183.85L280.05,184.07C278.9,184.54 277.49,185.32 276.27,186.69C274.64,188.53 273.62,191.07 273.62,194.35C273.62,194.4 273.62,194.43 273.62,194.48C273.62,194.99 273.69,197.71 275.3,200.62C276.66,203.06 278.44,204.46 279.51,205.19C280.46,205.8 284.21,208.2 285.63,209.3C287.7,210.94 289.23,212.22 290.38,214.4C292.45,218.26 291.72,222.15 291.62,222.71C290.82,226.8 288.16,229.27 286.65,230.42C296.3,224.4 300.02,216.48 301.07,209.43C301.31,207.62 301.46,205.83 301.48,203.99V193.25C301.48,191.56 300.43,190.07 298.85,189.48Z"
- android:fillColor="#698FF7"/>
- <path
- android:pathData="M157.35,137.23C157.97,136.58 158.83,136.2 159.73,136.17C160.63,136.14 161.5,136.47 162.16,137.08L162.31,137.22L163.18,138.14C163.57,138.57 164.07,138.88 164.62,139.06C165.17,139.24 165.76,139.26 166.32,139.15L167.53,138.91C168.42,138.74 169.34,138.93 170.09,139.44C170.84,139.95 171.36,140.73 171.54,141.61C171.54,141.68 171.55,141.74 171.59,141.8L171.73,143.06C171.8,143.62 172.01,144.17 172.35,144.63C172.69,145.09 173.14,145.46 173.66,145.7L174.77,146.27C175.58,146.66 176.21,147.36 176.52,148.2C176.83,149.05 176.79,149.98 176.41,150.8C176.37,150.84 176.37,150.94 176.32,150.99L175.74,152.05C175.45,152.55 175.3,153.11 175.3,153.69C175.3,154.26 175.46,154.82 175.74,155.32L176.32,156.43C176.74,157.22 176.84,158.16 176.58,159.02C176.32,159.89 175.73,160.62 174.94,161.06C174.89,161.1 174.8,161.1 174.75,161.15L173.63,161.68C173.11,161.92 172.66,162.29 172.32,162.76C171.99,163.22 171.77,163.76 171.71,164.33L171.56,165.59C171.44,166.48 170.97,167.28 170.26,167.84C169.54,168.38 168.64,168.63 167.74,168.53C167.68,168.54 167.61,168.52 167.55,168.48L166.38,168.24C165.82,168.15 165.23,168.19 164.69,168.36C164.14,168.54 163.64,168.85 163.24,169.25L162.39,170.13C161.76,170.78 160.91,171.16 160.01,171.19C159.11,171.22 158.23,170.89 157.57,170.28L157.43,170.14L156.55,169.22C156.16,168.8 155.66,168.49 155.1,168.31C154.54,168.14 153.95,168.12 153.39,168.25L152.18,168.49C151.29,168.66 150.37,168.47 149.62,167.96C148.87,167.46 148.35,166.67 148.17,165.79C148.18,165.72 148.16,165.65 148.12,165.6L147.98,164.34C147.91,163.77 147.7,163.23 147.36,162.77C147.02,162.3 146.57,161.93 146.05,161.69L144.94,161.16C144.53,160.97 144.16,160.7 143.85,160.37C143.55,160.03 143.32,159.64 143.16,159.21C143.01,158.78 142.94,158.33 142.96,157.88C142.99,157.43 143.1,156.99 143.3,156.58C143.34,156.53 143.34,156.44 143.39,156.39L143.97,155.28C144.26,154.78 144.4,154.22 144.4,153.65C144.4,153.07 144.26,152.51 143.97,152.01L143.39,150.9C142.97,150.1 142.88,149.17 143.13,148.3C143.39,147.44 143.98,146.71 144.77,146.28C144.82,146.23 144.91,146.23 144.96,146.18L146.08,145.65C146.6,145.41 147.05,145.04 147.39,144.57C147.72,144.11 147.94,143.57 148,143L148.15,141.75C148.27,140.86 148.74,140.05 149.46,139.5C150.17,138.95 151.07,138.7 151.97,138.81C152.04,138.8 152.1,138.82 152.16,138.86L153.37,139.1C153.93,139.19 154.51,139.15 155.06,138.97C155.6,138.8 156.1,138.49 156.5,138.09L157.35,137.24L157.35,137.23Z"
- android:fillColor="#EE675C"/>
- <path
- android:pathData="M165.34,152.63L157.4,148.13C156.85,147.86 156.31,147.99 156.04,148.54C155.9,148.68 155.9,148.81 155.9,149.09V158.08C155.9,158.63 156.31,159.04 156.85,159.04C156.99,159.04 157.27,159.04 157.4,158.9L165.2,154.4C165.75,154.13 165.89,153.58 165.61,153.04C165.61,152.9 165.47,152.77 165.34,152.63Z"
- android:fillColor="#ffffff"/>
- <path
- android:pathData="M236.54,176.53L226.88,171.29C226.21,170.97 225.55,171.13 225.22,171.77C225.05,171.93 225.05,172.09 225.05,172.4V182.89C225.05,183.53 225.55,184.01 226.21,184.01C226.39,184.01 226.72,184.01 226.88,183.85L236.37,178.6C237.04,178.28 237.21,177.65 236.87,177.01C236.87,176.85 236.7,176.7 236.54,176.53Z"
- android:fillColor="#3C4043"/>
- <path
- android:pathData="M148.49,207.01C143.41,207.01 139.27,202.88 139.27,197.81C139.27,192.74 143.41,188.61 148.49,188.61C153.58,188.61 157.72,192.74 157.72,197.81C157.72,202.88 153.58,207.01 148.49,207.01Z"
- android:fillColor="#3C4043"/>
- <path
- android:pathData="M224.65,129.5L213.61,128.09C212.49,127.95 211.34,128.11 210.3,128.56C209.26,129 208.34,129.71 207.66,130.61L200.9,139.5C200.21,140.4 199.78,141.48 199.63,142.61C199.49,143.74 199.65,144.89 200.09,145.93L204.37,156.22C204.81,157.27 205.52,158.18 206.42,158.87C207.33,159.55 208.4,159.99 209.52,160.13L220.56,161.52C221.69,161.67 222.83,161.51 223.88,161.07C224.93,160.63 225.84,159.92 226.53,159.01L233.26,150.14C233.95,149.23 234.39,148.16 234.53,147.03C234.67,145.9 234.52,144.75 234.08,143.7L229.79,133.42C229.35,132.37 228.65,131.45 227.74,130.76C226.84,130.07 225.77,129.64 224.65,129.5Z"
- android:fillColor="#FCC934"/>
- <path
- android:pathData="M210.34,150.41L223.25,151.73L224.57,138.86L211.66,137.54L210.34,150.41ZM210.15,152.25C209.65,152.2 209.23,151.98 208.9,151.58C208.58,151.18 208.45,150.73 208.5,150.23L209.82,137.35C209.87,136.85 210.09,136.43 210.49,136.11C210.89,135.78 211.34,135.65 211.85,135.7L224.76,137.02C225.26,137.07 225.68,137.29 226.01,137.69C226.33,138.09 226.46,138.54 226.41,139.04L225.09,151.92C225.04,152.43 224.82,152.84 224.42,153.16C224.02,153.49 223.57,153.62 223.06,153.57L210.15,152.25ZM211.45,148.67L222.51,149.8L219.53,144.85L216.38,148.24L214.59,145.27L211.45,148.67L211.45,148.67ZM211.66,137.54L210.34,150.41L211.66,137.54Z"
- android:fillColor="#ffffff"/>
- <path
- android:pathData="M178.53,187.68C174.35,181.53 179.88,173.46 187.15,175.11L188.35,175.38C190.56,175.88 192.89,175.44 194.77,174.17L195.79,173.48C201.96,169.32 210.05,174.84 208.4,182.08L208.13,183.28C207.62,185.49 208.06,187.81 209.34,189.69L210.02,190.7C214.2,196.85 208.67,204.93 201.41,203.28L200.21,203.01C197.99,202.5 195.66,202.94 193.78,204.21L192.76,204.9C186.6,209.07 178.5,203.55 180.15,196.3L180.43,195.1C180.93,192.9 180.5,190.57 179.22,188.7L178.53,187.68L178.53,187.68Z"
- android:fillColor="#5BB974"/>
- <path
- android:pathData="M189.5,195.21C190.11,194.34 190.86,193.6 191.77,192.99C192.68,192.39 193.71,191.98 194.85,191.76C196,191.55 197.1,191.55 198.17,191.78C199.24,192.01 200.21,192.42 201.1,193.01L199.08,182.41L187.48,184.61L189.5,195.21ZM194.54,190.11C195.33,189.96 195.97,189.54 196.42,188.87C196.88,188.2 197.04,187.46 196.88,186.67C196.73,185.88 196.32,185.24 195.65,184.79C194.98,184.34 194.23,184.18 193.43,184.33C192.64,184.48 192,184.89 191.55,185.57C191.09,186.24 190.93,186.97 191.09,187.77C191.24,188.56 191.65,189.2 192.33,189.65C192.99,190.1 193.74,190.26 194.54,190.11ZM189.99,197.8C189.54,197.89 189.12,197.8 188.73,197.54C188.34,197.28 188.11,196.92 188.02,196.47L185.82,184.92C185.74,184.46 185.83,184.04 186.09,183.66C186.35,183.27 186.71,183.04 187.16,182.95L198.76,180.76C199.22,180.67 199.64,180.76 200.02,181.02C200.41,181.28 200.65,181.63 200.73,182.09L202.93,193.64C203.02,194.1 202.93,194.51 202.67,194.9C202.4,195.29 202.05,195.52 201.59,195.6L189.99,197.8ZM189.68,196.15L201.28,193.96L201.1,193C200.21,192.41 199.24,192.01 198.17,191.77C197.1,191.55 195.99,191.54 194.85,191.76C193.7,191.97 192.68,192.38 191.77,192.99C190.86,193.59 190.1,194.33 189.5,195.2L189.68,196.15ZM189.5,195.21L187.48,184.61L199.08,182.41L201.1,193.01C200.21,192.42 199.24,192.01 198.17,191.78C197.1,191.55 196,191.55 194.85,191.76C193.71,191.98 192.68,192.39 191.77,192.99C190.86,193.6 190.11,194.34 189.5,195.21Z"
- android:fillColor="#ffffff"/>
-</vector>
diff --git a/res/drawable/privatespace_setup_flow_placeholder.xml b/res/drawable/privatespace_setup_flow_placeholder.xml
deleted file mode 100644
index a4ff125..0000000
--- a/res/drawable/privatespace_setup_flow_placeholder.xml
+++ /dev/null
@@ -1,48 +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.
- -->
-
-<vector android:height="265dp" android:viewportHeight="266"
- android:viewportWidth="364" android:width="362.6316dp" xmlns:android="http://schemas.android.com/apk/res/android">
- <group>
- <clip-path android:pathData="M0,0.5h364v265h-364z"/>
- <path android:fillColor="#000000" android:pathData="M339.42,265.5H24.58C11.07,265.5 0,254.17 0,240.34V25.69C0,11.83 11.07,0.5 24.58,0.5H339.52C352.93,0.5 364,11.83 364,25.66V240.44C364,254.17 352.93,265.5 339.42,265.5Z"/>
- <path android:fillColor="#80868B" android:pathData="M242.66,86.8V78.4C242.66,77.85 242.44,77.31 242.05,76.92C241.66,76.52 241.12,76.3 240.57,76.3V32.2C240.57,29.42 239.46,26.75 237.49,24.78C235.52,22.81 232.85,21.7 230.06,21.7H133.41C130.62,21.7 127.95,22.81 125.98,24.78C124.01,26.75 122.9,29.42 122.9,32.2V233.8C122.9,236.58 124.01,239.25 125.98,241.22C127.95,243.19 130.62,244.3 133.41,244.3H230.06C232.85,244.3 235.52,243.19 237.49,241.22C239.46,239.25 240.57,236.58 240.57,233.8V130.9C241.12,130.9 241.65,130.68 242.05,130.29C242.44,129.89 242.66,129.36 242.66,128.8V107.8C242.66,107.24 242.44,106.71 242.05,106.32C241.66,105.92 241.12,105.7 240.57,105.7V88.91C240.84,88.91 241.12,88.86 241.37,88.75C241.63,88.64 241.86,88.49 242.05,88.29C242.25,88.1 242.4,87.86 242.5,87.61C242.61,87.35 242.66,87.08 242.66,86.8ZM238.46,233.8C238.46,236.02 237.58,238.16 236,239.74C234.43,241.31 232.29,242.2 230.06,242.2H133.41C131.18,242.2 129.04,241.31 127.47,239.74C125.89,238.16 125.01,236.02 125.01,233.8V32.2C125.01,29.98 125.89,27.84 127.47,26.27C129.04,24.69 131.18,23.8 133.41,23.8H230.06C232.29,23.8 234.43,24.69 236,26.27C237.58,27.84 238.46,29.98 238.46,32.2V233.8Z"/>
- <path android:fillColor="#669DF6" android:pathData="M234.93,233.8C234.93,235.09 234.42,236.33 233.5,237.24C232.59,238.15 231.35,238.66 230.06,238.66H133.41C132.12,238.66 130.88,238.15 129.97,237.24C129.05,236.33 128.54,235.09 128.54,233.8V129.24H125.01V233.8C125.01,236.02 125.89,238.16 127.47,239.74C129.04,241.31 131.18,242.2 133.41,242.2H230.06C232.29,242.2 234.43,241.31 236,239.74C237.58,238.16 238.46,236.02 238.46,233.8V190.74H234.93V233.8Z"/>
- <path android:fillColor="#A142F4" android:pathData="M230.06,23.8H133.41C131.18,23.8 129.04,24.69 127.47,26.26C125.89,27.84 125.01,29.97 125.01,32.2V129.24H128.54V32.2C128.54,30.91 129.05,29.67 129.97,28.76C130.88,27.85 132.12,27.34 133.41,27.34H230.06C231.35,27.34 232.59,27.85 233.5,28.76C234.42,29.67 234.93,30.91 234.93,32.2V190.74H238.46V32.2C238.46,29.97 237.58,27.84 236,26.26C234.43,24.69 232.29,23.8 230.06,23.8Z"/>
- <path android:fillColor="#5BB974" android:pathData="M214.09,181.98H205.99C204.24,181.98 202.53,182.5 201.08,183.47C199.63,184.45 198.51,185.83 197.85,187.45C197.2,189.07 197.04,190.84 197.39,192.55C197.75,194.26 198.61,195.82 199.86,197.04L205.38,202.56L208.4,199.54H214.09C216.42,199.54 218.65,198.62 220.3,196.97C221.95,195.32 222.87,193.09 222.87,190.76C222.87,188.43 221.95,186.2 220.3,184.55C218.65,182.91 216.42,181.98 214.09,181.98Z"/>
- <path android:fillColor="#000000" android:pathData="M204.83,192.48C205.78,192.48 206.54,191.71 206.54,190.76C206.54,189.82 205.78,189.05 204.83,189.05C203.88,189.05 203.12,189.82 203.12,190.76C203.12,191.71 203.88,192.48 204.83,192.48Z"/>
- <path android:fillColor="#000000" android:pathData="M210.04,192.48C210.99,192.48 211.76,191.71 211.76,190.76C211.76,189.82 210.99,189.05 210.04,189.05C209.1,189.05 208.33,189.82 208.33,190.76C208.33,191.71 209.1,192.48 210.04,192.48Z"/>
- <path android:fillColor="#000000" android:pathData="M215.25,192.48C216.19,192.48 216.96,191.71 216.96,190.76C216.96,189.82 216.19,189.05 215.25,189.05C214.3,189.05 213.53,189.82 213.53,190.76C213.53,191.71 214.3,192.48 215.25,192.48Z"/>
- <path android:fillColor="#FCC934" android:pathData="M165.98,61.94H155.68C155.38,61.94 155.08,62 154.79,62.12C154.51,62.24 154.26,62.41 154.04,62.62C153.83,62.84 153.66,63.09 153.54,63.37C153.43,63.65 153.37,63.95 153.37,64.26V85.11C153.37,85.41 153.43,85.71 153.54,85.99C153.66,86.27 153.83,86.53 154.04,86.74C154.26,86.96 154.51,87.13 154.79,87.24C155.08,87.36 155.38,87.42 155.68,87.42H170C170.61,87.41 171.19,87.16 171.62,86.73C172.04,86.3 172.28,85.71 172.28,85.11V68.32L165.98,61.94Z"/>
- <path android:fillColor="#000000" android:pathData="M168.63,72.01H157.05V74.33H168.63V72.01Z"/>
- <path android:fillColor="#000000" android:pathData="M168.63,76.64H157.05V78.96H168.63V76.64Z"/>
- <path android:fillColor="#000000" android:pathData="M168.63,81.28H157.05V83.6H168.63V81.28Z"/>
- <path android:fillColor="#FEEFC3" android:pathData="M165.98,61.94V66.43C165.98,66.67 166.03,66.92 166.12,67.14C166.21,67.37 166.35,67.57 166.52,67.74C166.69,67.92 166.9,68.05 167.12,68.15C167.35,68.24 167.59,68.29 167.83,68.29H172.28L165.98,61.94Z"/>
- <path android:fillColor="#FAD2CF" android:pathData="M206.01,53.5L201.44,61.45C201.29,61.7 201.21,61.99 201.22,62.28C201.22,62.58 201.29,62.86 201.44,63.12C201.59,63.37 201.8,63.58 202.05,63.73C202.31,63.87 202.59,63.95 202.89,63.95H212.04C212.33,63.95 212.62,63.87 212.87,63.73C213.13,63.58 213.34,63.37 213.49,63.12C213.63,62.86 213.71,62.58 213.71,62.28C213.71,61.99 213.63,61.7 213.48,61.45L208.9,53.5C208.76,53.25 208.54,53.04 208.29,52.89C208.04,52.74 207.75,52.67 207.46,52.67C207.16,52.67 206.88,52.74 206.62,52.89C206.37,53.04 206.16,53.25 206.01,53.5Z"/>
- <path android:fillColor="#3C4043" android:pathData="M201.8,218.33L209.86,210.27C209.96,210.16 210.09,210.08 210.23,210.02C210.37,209.96 210.52,209.93 210.67,209.93C210.82,209.93 210.97,209.96 211.11,210.02C211.25,210.08 211.37,210.16 211.48,210.27L211.76,210.55C213.05,211.84 213.77,213.58 213.77,215.39C213.77,217.21 213.05,218.95 211.76,220.23C210.48,221.52 208.74,222.24 206.92,222.24C205.1,222.24 203.36,221.52 202.08,220.23L201.8,219.95C201.58,219.74 201.46,219.45 201.46,219.14C201.46,218.84 201.58,218.54 201.8,218.33Z"/>
- <path android:fillColor="#3C4043" android:pathData="M200.11,90.52C202.66,90.52 204.73,88.45 204.73,85.9C204.73,83.35 202.66,81.28 200.11,81.28C197.56,81.28 195.49,83.35 195.49,85.9C195.49,88.45 197.56,90.52 200.11,90.52Z"/>
- <path android:fillColor="#A142F4" android:pathData="M203.2,134.48C203.2,128.79 200.94,123.34 196.92,119.31C192.89,115.29 187.43,113.03 181.74,113.03V117.32C184.94,117.31 188.08,118.2 190.79,119.88C193.51,121.57 195.71,123.98 197.13,126.84C198.55,129.7 199.14,132.91 198.83,136.09C198.53,139.27 197.34,142.3 195.39,144.85C192.33,141.12 184.88,139.85 181.74,139.85V155.97C184.56,155.96 187.36,155.41 189.96,154.33C192.57,153.25 194.93,151.66 196.93,149.67C198.92,147.68 200.5,145.31 201.58,142.7C202.65,140.1 203.21,137.3 203.2,134.48Z"/>
- <path android:fillColor="#A142F4" android:pathData="M189.26,129.12C189.26,128.14 189.07,127.16 188.7,126.25C188.32,125.33 187.77,124.51 187.07,123.81C186.37,123.11 185.54,122.56 184.63,122.18C183.72,121.81 182.74,121.61 181.75,121.61V136.63C182.74,136.63 183.72,136.44 184.63,136.06C185.54,135.69 186.37,135.13 187.07,134.44C187.77,133.74 188.32,132.91 188.7,132C189.07,131.09 189.26,130.11 189.26,129.12Z"/>
- <path android:fillColor="#3C4043" android:pathData="M159.53,166.93H151.85C148.29,166.93 145.41,169.81 145.41,173.37C145.41,176.93 148.29,179.81 151.85,179.81H159.53C163.09,179.81 165.97,176.93 165.97,173.37C165.97,169.81 163.09,166.93 159.53,166.93Z"/>
- <path android:fillColor="#FAD2CF" android:pathData="M164.93,198.9V197.48H163.16V198.89H152.85V197.48H151.08V198.9C150.56,198.9 150.07,199.11 149.71,199.48C149.35,199.84 149.15,200.34 149.15,200.85V214.61C149.15,214.87 149.2,215.13 149.3,215.36C149.4,215.6 149.54,215.82 149.72,216C149.9,216.19 150.12,216.33 150.36,216.43C150.6,216.53 150.85,216.58 151.11,216.58H164.88C165.4,216.58 165.9,216.37 166.27,216C166.64,215.63 166.85,215.13 166.85,214.61V200.85C166.85,200.34 166.64,199.85 166.29,199.48C165.93,199.12 165.44,198.91 164.93,198.9Z"/>
- <path android:fillColor="#000000" android:pathData="M164.27,202.78H151.76C151.39,202.78 151.1,203.08 151.1,203.45V213.99C151.1,214.36 151.39,214.65 151.76,214.65H164.27C164.63,214.65 164.93,214.36 164.93,213.99V203.45C164.93,203.08 164.63,202.78 164.27,202.78Z"/>
- <path android:fillColor="#EE675C" android:pathData="M156.79,205.13H152.85V207.73H156.79V205.13Z"/>
- <path android:fillColor="#669DF6" android:pathData="M168.62,117.83C168.03,117.83 167.45,117.95 166.9,118.18C166.35,118.4 165.85,118.73 165.44,119.15C165.02,119.57 164.69,120.07 164.47,120.62C164.24,121.17 164.13,121.75 164.14,122.35V147.17C164.13,147.76 164.25,148.35 164.48,148.9C164.7,149.44 165.04,149.94 165.46,150.36C165.88,150.78 166.37,151.11 166.92,151.34C167.47,151.56 168.06,151.68 168.65,151.67H175.97V117.83H168.62Z"/>
- <path android:fillColor="#80868B" android:pathData="M182.95,259.5C182.95,260.32 182.63,261.11 182.05,261.69C181.47,262.27 180.68,262.59 179.86,262.59C179.04,262.59 178.26,262.27 177.68,261.69C177.1,261.11 176.77,260.32 176.77,259.5V12.75C176.77,11.93 177.1,11.15 177.68,10.57C178.26,9.99 179.04,9.66 179.86,9.66C180.68,9.66 181.47,9.99 182.05,10.57C182.63,11.15 182.95,11.93 182.95,12.75"/>
- <path android:fillColor="#000000" android:pathData="M179.86,10.99C180.33,10.99 180.78,11.17 181.11,11.5C181.44,11.83 181.63,12.28 181.63,12.75V259.5C181.63,259.97 181.44,260.42 181.11,260.75C180.78,261.08 180.33,261.27 179.86,261.27C179.39,261.27 178.94,261.08 178.61,260.75C178.28,260.42 178.1,259.97 178.1,259.5V12.75C178.1,12.28 178.28,11.83 178.61,11.5C178.94,11.17 179.39,10.99 179.86,10.99ZM179.86,8.34C178.69,8.34 177.57,8.8 176.74,9.63C175.91,10.46 175.44,11.58 175.44,12.75V259.5C175.44,260.67 175.91,261.8 176.74,262.63C177.57,263.45 178.69,263.92 179.86,263.92C181.03,263.92 182.16,263.45 182.99,262.63C183.81,261.8 184.28,260.67 184.28,259.5V12.75C184.28,11.58 183.81,10.46 182.99,9.63C182.16,8.8 181.03,8.34 179.86,8.34Z"/>
- <path android:fillColor="#ffffff" android:pathData="M70.76,140V124.25H72.63V140H70.76ZM75.78,140V124.25H77.65V140H75.78ZM80.42,140V124.25H82.29V140H80.42ZM89.13,140.35C87.75,140.35 86.71,139.95 86.01,139.15C85.32,138.34 84.97,137.24 84.97,135.85V128.78H86.84V135.56C86.84,136.67 87.1,137.47 87.61,137.96C88.13,138.43 88.76,138.66 89.53,138.66C90.19,138.66 90.76,138.49 91.24,138.15C91.73,137.8 92.1,137.36 92.36,136.81C92.63,136.27 92.76,135.71 92.76,135.12V128.78H94.63V140H92.85V138.38H92.76C92.57,138.73 92.28,139.06 91.9,139.37C91.54,139.66 91.11,139.89 90.63,140.07C90.16,140.26 89.66,140.35 89.13,140.35ZM101.2,140.35C100.36,140.35 99.62,140.22 98.98,139.96C98.35,139.68 97.82,139.31 97.39,138.86C96.98,138.39 96.68,137.88 96.47,137.34L98.14,136.59C98.44,137.27 98.86,137.79 99.42,138.15C99.98,138.52 100.61,138.71 101.33,138.71C102.02,138.71 102.59,138.57 103.05,138.29C103.52,138.01 103.75,137.6 103.75,137.05C103.75,136.72 103.66,136.44 103.47,136.22C103.28,135.98 103,135.79 102.63,135.63C102.26,135.46 101.82,135.32 101.29,135.18L99.92,134.83C99.4,134.69 98.9,134.48 98.43,134.22C97.96,133.95 97.58,133.62 97.28,133.21C97.01,132.78 96.87,132.27 96.87,131.66C96.87,130.99 97.06,130.41 97.46,129.93C97.86,129.44 98.38,129.08 99.02,128.83C99.67,128.56 100.36,128.43 101.09,128.43C101.74,128.43 102.34,128.53 102.89,128.72C103.47,128.89 103.96,129.16 104.39,129.53C104.82,129.88 105.14,130.32 105.36,130.85L103.73,131.6C103.45,131.04 103.08,130.65 102.61,130.43C102.14,130.21 101.62,130.1 101.05,130.1C100.43,130.1 99.9,130.24 99.44,130.52C98.99,130.79 98.76,131.15 98.76,131.62C98.76,132.09 98.94,132.44 99.31,132.68C99.69,132.91 100.15,133.1 100.69,133.25L102.32,133.67C103.42,133.95 104.25,134.36 104.81,134.92C105.37,135.46 105.64,136.13 105.64,136.92C105.64,137.63 105.45,138.24 105.05,138.75C104.65,139.26 104.12,139.66 103.44,139.94C102.77,140.22 102.02,140.35 101.2,140.35ZM106.81,128.78H108.76V125.61H110.63V128.78H113.38V130.48H110.63V136.59C110.63,137.18 110.75,137.63 110.99,137.96C111.24,138.28 111.64,138.44 112.19,138.44C112.44,138.44 112.67,138.4 112.88,138.33C113.08,138.26 113.27,138.17 113.43,138.07V139.89C113.24,139.98 113.02,140.05 112.79,140.09C112.57,140.15 112.27,140.18 111.89,140.18C110.95,140.18 110.19,139.91 109.62,139.37C109.05,138.81 108.76,138.04 108.76,137.05V130.48H106.81V128.78ZM115.61,140V128.78H117.39V130.59H117.48C117.63,130.16 117.87,129.79 118.21,129.49C118.56,129.16 118.96,128.91 119.39,128.74C119.85,128.55 120.3,128.45 120.74,128.45C121.07,128.45 121.34,128.48 121.53,128.52C121.72,128.55 121.89,128.6 122.06,128.67V130.7C121.82,130.58 121.57,130.49 121.29,130.43C121.02,130.37 120.75,130.35 120.47,130.35C119.93,130.35 119.43,130.5 118.98,130.81C118.52,131.12 118.15,131.53 117.88,132.04C117.61,132.55 117.48,133.12 117.48,133.73V140H115.61ZM127.02,140.35C126.18,140.35 125.45,140.19 124.82,139.87C124.19,139.55 123.69,139.11 123.32,138.55C122.97,137.98 122.79,137.33 122.79,136.62C122.79,135.79 123.01,135.1 123.43,134.55C123.86,133.98 124.43,133.55 125.15,133.27C125.87,132.98 126.66,132.83 127.52,132.83C128.02,132.83 128.48,132.88 128.91,132.96C129.33,133.04 129.7,133.13 130.01,133.25C130.33,133.35 130.57,133.45 130.74,133.56V132.88C130.74,132.02 130.43,131.35 129.83,130.85C129.23,130.35 128.5,130.1 127.63,130.1C127.02,130.1 126.44,130.24 125.89,130.52C125.37,130.79 124.95,131.16 124.64,131.64L123.23,130.59C123.53,130.15 123.89,129.77 124.33,129.44C124.77,129.12 125.27,128.87 125.83,128.7C126.4,128.52 127,128.43 127.63,128.43C129.16,128.43 130.35,128.83 131.22,129.64C132.08,130.45 132.52,131.53 132.52,132.9V140H130.74V138.4H130.65C130.46,138.72 130.18,139.04 129.83,139.34C129.48,139.64 129.06,139.88 128.58,140.07C128.11,140.26 127.59,140.35 127.02,140.35ZM127.19,138.71C127.84,138.71 128.43,138.54 128.95,138.22C129.5,137.9 129.93,137.47 130.25,136.92C130.57,136.38 130.74,135.79 130.74,135.14C130.4,134.91 129.97,134.72 129.46,134.57C128.96,134.42 128.41,134.35 127.81,134.35C126.74,134.35 125.95,134.57 125.46,135.01C124.96,135.45 124.71,135.99 124.71,136.64C124.71,137.25 124.94,137.75 125.41,138.13C125.88,138.51 126.47,138.71 127.19,138.71ZM134.13,128.78H136.09V125.61H137.96V128.78H140.71V130.48H137.96V136.59C137.96,137.18 138.08,137.63 138.31,137.96C138.56,138.28 138.97,138.44 139.52,138.44C139.77,138.44 140,138.4 140.21,138.33C140.41,138.26 140.59,138.17 140.76,138.07V139.89C140.57,139.98 140.35,140.05 140.12,140.09C139.9,140.15 139.6,140.18 139.22,140.18C138.28,140.18 137.52,139.91 136.95,139.37C136.38,138.81 136.09,138.04 136.09,137.05V130.48H134.13V128.78ZM143.22,140V128.78H145.09V140H143.22ZM144.15,126.71C143.78,126.71 143.46,126.58 143.2,126.32C142.94,126.06 142.8,125.74 142.8,125.37C142.8,124.99 142.94,124.68 143.2,124.43C143.46,124.16 143.78,124.03 144.15,124.03C144.53,124.03 144.84,124.16 145.09,124.43C145.36,124.68 145.49,124.99 145.49,125.37C145.49,125.74 145.36,126.06 145.09,126.32C144.84,126.58 144.53,126.71 144.15,126.71ZM153.07,140.35C151.94,140.35 150.95,140.09 150.08,139.56C149.21,139.04 148.53,138.32 148.03,137.43C147.55,136.52 147.31,135.51 147.31,134.39C147.31,133.28 147.55,132.27 148.03,131.38C148.53,130.47 149.21,129.75 150.08,129.22C150.95,128.7 151.94,128.43 153.07,128.43C154.2,128.43 155.2,128.7 156.06,129.24C156.93,129.77 157.6,130.49 158.09,131.4C158.59,132.3 158.84,133.29 158.84,134.39C158.84,135.51 158.59,136.52 158.09,137.43C157.6,138.32 156.93,139.04 156.06,139.56C155.2,140.09 154.2,140.35 153.07,140.35ZM153.07,138.66C153.75,138.66 154.38,138.49 154.96,138.15C155.57,137.82 156.05,137.33 156.42,136.7C156.78,136.06 156.97,135.29 156.97,134.39C156.97,133.5 156.78,132.74 156.42,132.1C156.05,131.46 155.57,130.97 154.96,130.63C154.38,130.29 153.75,130.13 153.07,130.13C152.4,130.13 151.76,130.29 151.16,130.63C150.56,130.97 150.07,131.46 149.71,132.1C149.34,132.74 149.16,133.5 149.16,134.39C149.16,135.29 149.34,136.06 149.71,136.7C150.07,137.33 150.56,137.82 151.16,138.15C151.76,138.49 152.4,138.66 153.07,138.66ZM160.79,140V128.78H162.57V130.43H162.66C162.96,129.89 163.43,129.42 164.09,129.02C164.77,128.63 165.5,128.43 166.29,128.43C167.67,128.43 168.71,128.83 169.39,129.64C170.1,130.43 170.45,131.49 170.45,132.81V140H168.58V133.1C168.58,132.01 168.32,131.25 167.79,130.81C167.27,130.35 166.61,130.13 165.79,130.13C165.17,130.13 164.63,130.3 164.16,130.65C163.69,130.99 163.32,131.43 163.06,131.97C162.79,132.52 162.66,133.09 162.66,133.69V140H160.79ZM178.61,140V124.25H183.91C184.79,124.25 185.61,124.45 186.36,124.85C187.1,125.24 187.7,125.79 188.14,126.5C188.59,127.18 188.82,127.99 188.82,128.91C188.82,129.82 188.59,130.63 188.14,131.34C187.7,132.04 187.1,132.59 186.36,132.99C185.61,133.38 184.79,133.58 183.91,133.58H180.48V140H178.61ZM180.48,131.8H183.96C184.57,131.8 185.1,131.66 185.54,131.38C185.98,131.09 186.32,130.72 186.55,130.28C186.8,129.84 186.93,129.38 186.93,128.91C186.93,128.45 186.8,127.99 186.55,127.55C186.32,127.11 185.98,126.75 185.54,126.47C185.1,126.18 184.57,126.03 183.96,126.03H180.48V131.8ZM191.02,140V124.25H192.89V140H191.02ZM199.14,140.35C198.3,140.35 197.57,140.19 196.94,139.87C196.31,139.55 195.81,139.11 195.44,138.55C195.09,137.98 194.92,137.33 194.92,136.62C194.92,135.79 195.13,135.1 195.55,134.55C195.98,133.98 196.55,133.55 197.27,133.27C197.99,132.98 198.78,132.83 199.65,132.83C200.15,132.83 200.61,132.88 201.03,132.96C201.46,133.04 201.82,133.13 202.13,133.25C202.46,133.35 202.7,133.45 202.86,133.56V132.88C202.86,132.02 202.56,131.35 201.96,130.85C201.35,130.35 200.62,130.1 199.76,130.1C199.14,130.1 198.56,130.24 198.02,130.52C197.49,130.79 197.07,131.16 196.76,131.64L195.36,130.59C195.65,130.15 196.02,129.77 196.46,129.44C196.9,129.12 197.4,128.87 197.95,128.7C198.52,128.52 199.13,128.43 199.76,128.43C201.28,128.43 202.48,128.83 203.34,129.64C204.21,130.45 204.64,131.53 204.64,132.9V140H202.86V138.4H202.77C202.58,138.72 202.31,139.04 201.96,139.34C201.6,139.64 201.19,139.88 200.7,140.07C200.23,140.26 199.71,140.35 199.14,140.35ZM199.32,138.71C199.96,138.71 200.55,138.54 201.08,138.22C201.62,137.9 202.05,137.47 202.37,136.92C202.7,136.38 202.86,135.79 202.86,135.14C202.52,134.91 202.1,134.72 201.58,134.57C201.08,134.42 200.53,134.35 199.93,134.35C198.86,134.35 198.08,134.57 197.58,135.01C197.08,135.45 196.83,135.99 196.83,136.64C196.83,137.25 197.07,137.75 197.53,138.13C198,138.51 198.6,138.71 199.32,138.71ZM212.22,140.35C211.12,140.35 210.13,140.1 209.27,139.59C208.42,139.06 207.75,138.35 207.27,137.45C206.78,136.54 206.54,135.52 206.54,134.39C206.54,133.25 206.78,132.23 207.27,131.34C207.75,130.44 208.42,129.74 209.27,129.22C210.13,128.7 211.12,128.43 212.22,128.43C213.48,128.43 214.51,128.72 215.32,129.31C216.14,129.88 216.72,130.62 217.06,131.53L215.36,132.24C215.08,131.55 214.66,131.03 214.11,130.68C213.57,130.31 212.9,130.13 212.13,130.13C211.47,130.13 210.85,130.3 210.28,130.65C209.72,131.01 209.27,131.5 208.92,132.15C208.56,132.78 208.39,133.53 208.39,134.39C208.39,135.24 208.56,135.99 208.92,136.64C209.27,137.28 209.72,137.78 210.28,138.13C210.85,138.49 211.47,138.66 212.13,138.66C212.92,138.66 213.6,138.48 214.17,138.11C214.75,137.74 215.17,137.22 215.45,136.55L217.12,137.25C216.76,138.12 216.16,138.85 215.34,139.45C214.52,140.05 213.48,140.35 212.22,140.35ZM224.03,140.35C222.95,140.35 221.98,140.1 221.13,139.59C220.29,139.07 219.63,138.37 219.15,137.47C218.68,136.58 218.44,135.56 218.44,134.41C218.44,133.34 218.66,132.35 219.1,131.45C219.56,130.54 220.19,129.81 220.99,129.27C221.82,128.71 222.78,128.43 223.88,128.43C224.99,128.43 225.94,128.68 226.74,129.18C227.54,129.66 228.16,130.34 228.58,131.2C229.02,132.07 229.24,133.06 229.24,134.17C229.24,134.28 229.24,134.38 229.22,134.48C229.22,134.58 229.21,134.67 229.2,134.74H220.31C220.36,135.55 220.54,136.23 220.86,136.79C221.23,137.42 221.7,137.89 222.27,138.2C222.86,138.51 223.47,138.66 224.1,138.66C224.92,138.66 225.59,138.47 226.12,138.09C226.66,137.69 227.1,137.21 227.42,136.64L229,137.41C228.56,138.26 227.93,138.96 227.11,139.52C226.29,140.08 225.26,140.35 224.03,140.35ZM220.42,133.21H227.26C227.25,132.9 227.18,132.57 227.04,132.21C226.93,131.85 226.73,131.51 226.45,131.2C226.19,130.88 225.84,130.62 225.42,130.43C225.01,130.23 224.49,130.13 223.88,130.13C223.14,130.13 222.51,130.32 221.96,130.7C221.43,131.06 221.03,131.57 220.75,132.21C220.61,132.52 220.5,132.85 220.42,133.21ZM231.43,140V124.25H233.3V128.89L233.21,130.43H233.3C233.6,129.88 234.07,129.41 234.73,129.02C235.41,128.63 236.15,128.43 236.96,128.43C237.91,128.43 238.69,128.62 239.31,129C239.93,129.38 240.39,129.9 240.7,130.57C241,131.21 241.16,131.96 241.16,132.81V140H239.29V133.1C239.29,132.38 239.15,131.8 238.89,131.38C238.64,130.94 238.3,130.62 237.88,130.43C237.47,130.23 237.01,130.13 236.51,130.13C235.9,130.13 235.35,130.3 234.87,130.65C234.38,131.01 234,131.46 233.72,132.02C233.44,132.57 233.3,133.15 233.3,133.76V140H231.43ZM249.02,140.35C247.89,140.35 246.89,140.09 246.03,139.56C245.16,139.04 244.48,138.32 243.98,137.43C243.5,136.52 243.26,135.51 243.26,134.39C243.26,133.28 243.5,132.27 243.98,131.38C244.48,130.47 245.16,129.75 246.03,129.22C246.89,128.7 247.89,128.43 249.02,128.43C250.15,128.43 251.15,128.7 252.01,129.24C252.88,129.77 253.55,130.49 254.04,131.4C254.54,132.3 254.79,133.29 254.79,134.39C254.79,135.51 254.54,136.52 254.04,137.43C253.55,138.32 252.88,139.04 252.01,139.56C251.15,140.09 250.15,140.35 249.02,140.35ZM249.02,138.66C249.7,138.66 250.33,138.49 250.91,138.15C251.51,137.82 252,137.33 252.37,136.7C252.73,136.06 252.91,135.29 252.91,134.39C252.91,133.5 252.73,132.74 252.37,132.1C252,131.46 251.51,130.97 250.91,130.63C250.33,130.29 249.7,130.13 249.02,130.13C248.35,130.13 247.71,130.29 247.11,130.63C246.51,130.97 246.02,131.46 245.65,132.1C245.29,132.74 245.1,133.5 245.1,134.39C245.1,135.29 245.29,136.06 245.65,136.7C246.02,137.33 246.51,137.82 247.11,138.15C247.71,138.49 248.35,138.66 249.02,138.66ZM256.85,140V124.25H258.72V140H256.85ZM266.16,140.35C265.14,140.35 264.23,140.1 263.41,139.59C262.6,139.07 261.96,138.37 261.49,137.47C261.02,136.58 260.79,135.55 260.79,134.39C260.79,133.23 261.02,132.21 261.49,131.31C261.96,130.42 262.6,129.71 263.41,129.2C264.23,128.69 265.14,128.43 266.16,128.43C266.76,128.43 267.31,128.53 267.81,128.72C268.3,128.91 268.74,129.16 269.1,129.46C269.48,129.77 269.78,130.1 269.98,130.46H270.07L269.98,128.89V124.25H271.85V140H270.07V138.35H269.98C269.78,138.69 269.48,139.01 269.1,139.32C268.74,139.63 268.3,139.88 267.81,140.07C267.31,140.26 266.76,140.35 266.16,140.35ZM266.35,138.66C267,138.66 267.6,138.49 268.16,138.15C268.73,137.8 269.19,137.31 269.54,136.68C269.9,136.04 270.07,135.27 270.07,134.39C270.07,133.51 269.9,132.76 269.54,132.13C269.19,131.48 268.73,130.99 268.16,130.65C267.6,130.3 267,130.13 266.35,130.13C265.71,130.13 265.1,130.3 264.53,130.65C263.97,130.99 263.52,131.48 263.16,132.13C262.81,132.76 262.64,133.51 262.64,134.39C262.64,135.26 262.81,136.01 263.16,136.66C263.52,137.3 263.97,137.8 264.53,138.15C265.1,138.49 265.71,138.66 266.35,138.66ZM279.5,140.35C278.42,140.35 277.45,140.1 276.6,139.59C275.76,139.07 275.1,138.37 274.62,137.47C274.15,136.58 273.92,135.56 273.92,134.41C273.92,133.34 274.14,132.35 274.58,131.45C275.03,130.54 275.66,129.81 276.47,129.27C277.29,128.71 278.25,128.43 279.35,128.43C280.46,128.43 281.42,128.68 282.21,129.18C283.02,129.66 283.63,130.34 284.06,131.2C284.5,132.07 284.72,133.06 284.72,134.17C284.72,134.28 284.71,134.38 284.7,134.48C284.7,134.58 284.69,134.67 284.67,134.74H275.79C275.83,135.55 276.01,136.23 276.33,136.79C276.7,137.42 277.17,137.89 277.74,138.2C278.33,138.51 278.94,138.66 279.57,138.66C280.39,138.66 281.07,138.47 281.59,138.09C282.14,137.69 282.57,137.21 282.89,136.64L284.48,137.41C284.04,138.26 283.4,138.96 282.58,139.52C281.76,140.08 280.73,140.35 279.5,140.35ZM275.89,133.21H282.74C282.72,132.9 282.65,132.57 282.52,132.21C282.4,131.85 282.2,131.51 281.92,131.2C281.66,130.88 281.31,130.62 280.89,130.43C280.48,130.23 279.96,130.13 279.35,130.13C278.62,130.13 277.98,130.32 277.43,130.7C276.91,131.06 276.5,131.57 276.23,132.21C276.08,132.52 275.97,132.85 275.89,133.21ZM286.91,140V128.78H288.69V130.59H288.78C288.92,130.16 289.16,129.79 289.5,129.49C289.85,129.16 290.25,128.91 290.69,128.74C291.14,128.55 291.59,128.45 292.03,128.45C292.37,128.45 292.63,128.48 292.82,128.52C293.01,128.55 293.19,128.6 293.35,128.67V130.7C293.12,130.58 292.86,130.49 292.58,130.43C292.32,130.37 292.05,130.35 291.77,130.35C291.23,130.35 290.73,130.5 290.27,130.81C289.82,131.12 289.45,131.53 289.17,132.04C288.91,132.55 288.78,133.12 288.78,133.73V140H286.91Z"/>
- </group>
-</vector>
diff --git a/res/layout/privatespace_advancing_screen.xml b/res/layout/private_space_advancing_screen.xml
similarity index 91%
rename from res/layout/privatespace_advancing_screen.xml
rename to res/layout/private_space_advancing_screen.xml
index 3a85b16..35d6462 100644
--- a/res/layout/privatespace_advancing_screen.xml
+++ b/res/layout/private_space_advancing_screen.xml
@@ -20,18 +20,18 @@
android:id="@+id/private_space_autoadvance_screen"
android:layout_width="match_parent"
android:layout_height="match_parent"
- android:icon="@drawable/ic_privatespace_icon">
+ android:icon="@drawable/ic_private_space_icon">
<LinearLayout style="@style/SudContentFrame"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<ImageView
- android:id="@+id/placeholder_image"
+ android:id="@+id/setup_advance_image"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:contentDescription="@null"
- android:src="@drawable/privatespace_setup_flow_placeholder"/>
+ android:src="@null"/>
<TextView
android:id="@+id/createMessage"
diff --git a/res/layout/privatespace_education_screen.xml b/res/layout/private_space_education_screen.xml
similarity index 96%
rename from res/layout/privatespace_education_screen.xml
rename to res/layout/private_space_education_screen.xml
index 350e780..0f57e1e 100644
--- a/res/layout/privatespace_education_screen.xml
+++ b/res/layout/private_space_education_screen.xml
@@ -23,7 +23,7 @@
android:filterTouchesWhenObscured="true"
app:sucHeaderText="@string/private_space_setup_title"
app:sudDescriptionText="@string/private_space_hide_apps_summary"
- android:icon="@drawable/ic_privatespace_icon">
+ android:icon="@drawable/ic_private_space_icon">
<ScrollView
android:id="@+id/main_clear_scrollview"
android:layout_width="match_parent"
@@ -34,13 +34,13 @@
android:layout_height="wrap_content"
android:orientation="vertical">
<ImageView
- android:id="@+id/placeholder_image"
+ android:id="@+id/setup_education_image"
style="@style/SudContentIllustration"
android:layout_width="match_parent"
android:layout_marginLeft="24dp"
android:layout_marginRight="24dp"
android:layout_height="wrap_content"
- android:src="@drawable/privatespace_placeholder_image"/>
+ android:src="@drawable/private_space_illustration"/>
<TextView
style="@style/PrivateSpaceSetupSubHeaderStyle"
android:text="@string/private_space_how_title"/>
diff --git a/res/layout/privatespace_setlock_screen.xml b/res/layout/private_space_setlock_screen.xml
similarity index 95%
rename from res/layout/privatespace_setlock_screen.xml
rename to res/layout/private_space_setlock_screen.xml
index 7211948..64a2ff2 100644
--- a/res/layout/privatespace_setlock_screen.xml
+++ b/res/layout/private_space_setlock_screen.xml
@@ -37,7 +37,7 @@
android:layout_height="match_parent"
android:scaleType="fitCenter"
android:contentDescription="@null"
- android:src="@drawable/privatespace_lock_placeholder"/>
+ android:src="@drawable/private_space_choose_lock_illustration"/>
</com.google.android.setupdesign.view.FillContentLayout>
</com.google.android.setupdesign.GlifLayout>
\ No newline at end of file
diff --git a/res/layout/privatespace_setup_success.xml b/res/layout/private_space_setup_success.xml
similarity index 79%
rename from res/layout/privatespace_setup_success.xml
rename to res/layout/private_space_setup_success.xml
index e3e6b68..759373f 100644
--- a/res/layout/privatespace_setup_success.xml
+++ b/res/layout/private_space_setup_success.xml
@@ -24,4 +24,13 @@
app:sucHeaderText="@string/private_space_success_title"
app:sudDescriptionText="@string/private_space_access_text"
android:icon="@drawable/ic_privatespace_done">
+
+ <ImageView
+ android:id="@+id/privatespace_success_image"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:layout_marginLeft="24dp"
+ android:layout_marginRight="24dp"
+ android:src="@drawable/private_space_illustration"/>
+
</com.google.android.setupdesign.GlifLayout>
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index 3e0b8d9..4b96486 100755
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -473,4 +473,8 @@
<!-- An arbitrarily large number to make the max size fit the parent -->
<dimen name="animation_max_size">1000dp</dimen>
+
+ <!-- Credential Manager settings dimensions -->
+ <dimen name="credman_primary_provider_pref_left_padding">80dp</dimen>
+ <dimen name="credman_primary_provider_pref_left_padding_compact">24dp</dimen>
</resources>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 707bc69..97a9cd5 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -1268,7 +1268,7 @@
<string name="privatespace_hide_page_summary">To stop other people knowing you have a private space on your device, you can hide it from your apps list</string>
<!-- Header in hide Private Space settings page to access Private Space when hidden. [CHAR LIMIT=60] -->
<string name="privatespace_access_header">Access private space when hidden</string>
- <!-- Text in hide Private Space settings page on how to search Private Space when hidden. [CHAR LIMIT=60] -->
+ <!-- Text in hide Private Space settings page on how to search Private Space when hidden. [CHAR LIMIT=90] -->
<string name="privatespace_search_description">From your apps list, enter \"private space\" in the search bar</string>
<!-- Text in hide Private Space settings page to tap on Private Space tile. [CHAR LIMIT=60] -->
<string name="privatespace_tap_tile_description">Tap the private space tile</string>
@@ -1521,7 +1521,7 @@
<string name="unlock_set_unlock_mode_password">Password</string>
<!-- Title of the dialog shown when the user removes the device lock [CHAR LIMIT=NONE] -->
- <string name="unlock_disable_frp_warning_title">Delete screen lock?</string>
+ <string name="unlock_disable_frp_warning_title">Remove all types of device unlock?</string>
<!-- Title of the dialog shown when the user removes the profile lock [CHAR LIMIT=NONE] -->
<string name="unlock_disable_frp_warning_title_profile">Remove profile protection?</string>
@@ -1535,12 +1535,20 @@
<string name="unlock_disable_frp_warning_content_pattern_face_fingerprint">"A pattern protects your phone if it\u2019s lost or stolen.<xliff:g id="empty_line">\n\n</xliff:g>This deletes the fingerprint model stored on your device. Your face model will also be permanently and securely deleted. You won\u2019t be able to use your face or fingerprint for authentication in apps."</string>
<!-- Content of the dialog shown when the user removes the device lock PIN [CHAR LIMIT=NONE] -->
<string name="unlock_disable_frp_warning_content_pin">"A PIN protects your phone if it\u2019s lost or stolen"</string>
+ <!-- Content of the dialog shown when the user removes the device lock PIN and there are apps with auth-bound keys that will be affected [CHAR LIMIT=NONE] -->
+ <string name="unlock_disable_frp_warning_content_pin_authbound_keys">"You will lose saved data like your PIN.<xliff:g id="empty_line">\n\n</xliff:g>Cards set up for tap to pay will be removed.<xliff:g id="empty_line">\n\n</xliff:g>Wallets and other apps that require device unlock may not work properly."</string>
<!-- Content of the dialog shown when the user removes the device lock PIN and the user has fingerprints enrolled [CHAR LIMIT=NONE] -->
<string name="unlock_disable_frp_warning_content_pin_fingerprint">"A PIN protects your phone if it\u2019s lost or stolen.<xliff:g id="empty_line">\n\n</xliff:g>This also deletes the fingerprint model stored on your device. You won\u2019t be able to use your fingerprint for authentication in apps."</string>
+ <!-- Content of the dialog shown when the user removes the device lock PIN and the user has fingerprints enrolled and there are apps with auth-bound keys that will be affected [CHAR LIMIT=NONE] -->
+ <string name="unlock_disable_frp_warning_content_pin_fingerprint_authbound_keys">"You will lose saved data like your PIN and fingerprint model.<xliff:g id="empty_line">\n\n</xliff:g>Cards set up for tap to pay will be removed.<xliff:g id="empty_line">\n\n</xliff:g>Wallets and other apps that require device unlock may not work properly."</string>
<!-- Content of the dialog shown when the user removes the device lock PIN and the user has face enrolled [CHAR LIMIT=NONE] -->
<string name="unlock_disable_frp_warning_content_pin_face">"A PIN protects your phone if it\u2019s lost or stolen.<xliff:g id="empty_line">\n\n</xliff:g>Your face model will also be permanently and securely deleted. You won\u2019t be able to use your face for authentication in apps."</string>
+ <!-- Content of the dialog shown when the user removes the device lock PIN and the user has face enrolled and there are apps with auth-bound keys that will be affected [CHAR LIMIT=NONE] -->
+ <string name="unlock_disable_frp_warning_content_pin_face_authbound_keys">"You will lose saved data like your PIN and face model.<xliff:g id="empty_line">\n\n</xliff:g>Cards set up for tap to pay will be removed.<xliff:g id="empty_line">\n\n</xliff:g>Wallets and other apps that require device unlock may not work properly."</string>
<!-- Content of the dialog shown when the user removes the device lock PIN and the user has face authentication and fingerprint enrolled [CHAR LIMIT=NONE] -->
<string name="unlock_disable_frp_warning_content_pin_face_fingerprint">"A PIN protects your phone if it\u2019s lost or stolen.<xliff:g id="empty_line">\n\n</xliff:g>This deletes the fingerprint model stored on your device. Your face model will also be permanently and securely deleted. You won\u2019t be able to use your face or fingerprint for authentication in apps."</string>
+ <!-- Content of the dialog shown when the user removes the device lock PIN and the user has face authentication and fingerprint enrolled and there are apps with auth-bound keys that will be affected [CHAR LIMIT=NONE] -->
+ <string name="unlock_disable_frp_warning_content_pin_face_fingerprint_authbound_keys">"You will lose saved data like your PIN, face and fingerprint models.<xliff:g id="empty_line">\n\n</xliff:g>Cards set up for tap to pay will be removed.<xliff:g id="empty_line">\n\n</xliff:g>Wallets and other apps that require device unlock may not work properly."</string>
<!-- Content of the dialog shown when the user removes the device lock password [CHAR LIMIT=NONE] -->
<string name="unlock_disable_frp_warning_content_password">"A password protects your phone if it\u2019s lost or stolen"</string>
<!-- Content of the dialog shown when the user removes the device lock password and the user has fingerprints enrolled [CHAR LIMIT=NONE] -->
@@ -10794,6 +10802,8 @@
<string name="credman_button_change">Change</string>
<!-- Button for opening credman service settings. [CHAR LIMIT=40] -->
<string name="credman_button_open">Open</string>
+ <!-- Label for None item in Credential Manager service selection [CHAR LIMIT=40] -->
+ <string name="credman_app_list_preference_none">None selected</string>
<!-- Message of the warning dialog for setting the auto-fill app. [CHAR_LIMIT=NONE] -->
<string name="autofill_confirmation_message">
@@ -11996,6 +12006,11 @@
<!-- Keywords for the media controls setting [CHAR LIMIT=NONE]-->
<string name="keywords_media_controls">media</string>
+ <!-- Title of toggle to enable or disable the media resumption on lockscreen [CHAR LIMIT=NONE]-->
+ <string name="camera_extensions_fallback_title">Allow camera software extensions</string>
+ <!-- Description of toggle to enable or disable the media resumption on lockscreen [CHAR LIMIT=NONE]-->
+ <string name="camera_extensions_fallback_description">Enables the default software implementation of advanced camera features, such as Eyes Free videography.</string>
+
<!-- Summary for see all preference when bluetooth is disable [CHAR LIMIT=none]-->
<string name="connected_device_see_all_summary">Bluetooth will turn on</string>
diff --git a/res/xml/more_security_privacy_settings.xml b/res/xml/more_security_privacy_settings.xml
index 5cd60f0..92c3fa7 100644
--- a/res/xml/more_security_privacy_settings.xml
+++ b/res/xml/more_security_privacy_settings.xml
@@ -93,6 +93,14 @@
settings:controller=
"com.android.settings.sound.MediaControlsLockScreenPreferenceController" />
+ <!-- Allow software fallback for camera extensions -->
+ <SwitchPreference
+ android:key="privacy_camera_extensions_fallback"
+ android:title="@string/camera_extensions_fallback_title"
+ android:summary="@string/camera_extensions_fallback_description"
+ settings:controller=
+ "com.android.settings.privacy.CameraExtensionsFallbackPreferenceController" />
+
<!-- Content Capture -->
<!-- NOTE: content capture has a different preference, depending whether or not the
ContentCaptureService implementations defines a custom settings activitiy on its manifest.
diff --git a/res/xml/private_space_settings.xml b/res/xml/private_space_settings.xml
index a3dfbf2..0ed9c93 100644
--- a/res/xml/private_space_settings.xml
+++ b/res/xml/private_space_settings.xml
@@ -23,9 +23,9 @@
settings:searchable="false">
<com.android.settingslib.widget.IllustrationPreference
- android:key="privatespace_hide_video"
+ android:key="private_space_settings"
settings:searchable="false"
- settings:lottie_rawRes="@drawable/privatespace_placeholder_image"/>
+ settings:lottie_rawRes="@drawable/private_space_illustration"/>
<Preference
android:key="private_space_description"
diff --git a/src/com/android/settings/applications/AppStateClonedAppsBridge.java b/src/com/android/settings/applications/AppStateClonedAppsBridge.java
index 719023d1..de0251d 100644
--- a/src/com/android/settings/applications/AppStateClonedAppsBridge.java
+++ b/src/com/android/settings/applications/AppStateClonedAppsBridge.java
@@ -76,7 +76,8 @@
protected void updateExtraInfo(AppEntry app, String pkg, int uid) {
// Display package if allowlisted but not yet cloned.
// Or if the app is present in clone profile alongwith being in allowlist.
- if (mAllowedApps.contains(pkg) && ((!mCloneProfileApps.contains(pkg) || (app.isCloned)))) {
+ if (mAllowedApps.contains(pkg)
+ && ((!mCloneProfileApps.contains(pkg) || (app.isClonedProfile())))) {
app.extraInfo = Boolean.TRUE;
} else {
app.extraInfo = Boolean.FALSE;
diff --git a/src/com/android/settings/applications/credentials/CredentialManagerPreferenceController.java b/src/com/android/settings/applications/credentials/CredentialManagerPreferenceController.java
index d98bc51..be0658e 100644
--- a/src/com/android/settings/applications/credentials/CredentialManagerPreferenceController.java
+++ b/src/com/android/settings/applications/credentials/CredentialManagerPreferenceController.java
@@ -568,7 +568,7 @@
*/
@VisibleForTesting
public boolean togglePackageNameEnabled(String packageName) {
- if (mEnabledPackageNames.size() >= MAX_SELECTABLE_PROVIDERS) {
+ if (hasProviderLimitBeenReached()) {
return false;
} else {
mEnabledPackageNames.add(packageName);
@@ -623,6 +623,19 @@
return mIconResizer.createIconThumbnail(providerIcon);
}
+ private boolean hasProviderLimitBeenReached() {
+ return hasProviderLimitBeenReached(mEnabledPackageNames.size());
+ }
+
+ @VisibleForTesting
+ public static boolean hasProviderLimitBeenReached(int enabledAdditionalProviderCount) {
+ // If the number of package names has reached the maximum limit then
+ // we should stop any new packages from being added. We will also
+ // reserve one place for the primary provider so if the max limit is
+ // five providers this will be four additional plus the primary.
+ return (enabledAdditionalProviderCount + 1) >= MAX_SELECTABLE_PROVIDERS;
+ }
+
private CombiPreference addProviderPreference(
@NonNull Context prefContext,
@NonNull CharSequence title,
@@ -648,19 +661,18 @@
pref.setPreferenceListener(
new CombiPreference.OnCombiPreferenceClickListener() {
@Override
- public void onCheckChanged(CombiPreference p, boolean isChecked) {
+ public boolean onCheckChanged(CombiPreference p, boolean isChecked) {
if (isChecked) {
- if (mEnabledPackageNames.size() >= MAX_SELECTABLE_PROVIDERS) {
+ if (hasProviderLimitBeenReached()) {
// Show the error if too many enabled.
- pref.setChecked(false);
final DialogFragment fragment = newErrorDialogFragment();
if (fragment == null || mFragmentManager == null) {
- return;
+ return false;
}
fragment.show(mFragmentManager, ErrorDialogFragment.TAG);
- return;
+ return false;
}
togglePackageNameEnabled(packageName);
@@ -672,6 +684,8 @@
} else {
togglePackageNameDisabled(packageName);
}
+
+ return true;
}
@Override
@@ -989,8 +1003,13 @@
@Override
public void onClick(View buttonView) {
// Forward the event.
- if (mSwitch != null) {
- mOnClickListener.onCheckChanged(CombiPreference.this, mSwitch.isChecked());
+ if (mSwitch != null && mOnClickListener != null) {
+ if (!mOnClickListener.onCheckChanged(CombiPreference.this, mSwitch.isChecked())) {
+ // The update was not successful since there were too
+ // many enabled providers to manually reset any state.
+ mChecked = false;
+ mSwitch.setChecked(false);
+ }
}
}
}
@@ -1004,7 +1023,7 @@
public interface OnCombiPreferenceClickListener {
/** Called when the check is updated */
- void onCheckChanged(CombiPreference p, boolean isChecked);
+ boolean onCheckChanged(CombiPreference p, boolean isChecked);
/** Called when the left side is clicked. */
void onLeftSideClicked();
diff --git a/src/com/android/settings/applications/credentials/DefaultCombinedPreferenceController.java b/src/com/android/settings/applications/credentials/DefaultCombinedPreferenceController.java
index 49dd7cd..032402f 100644
--- a/src/com/android/settings/applications/credentials/DefaultCombinedPreferenceController.java
+++ b/src/com/android/settings/applications/credentials/DefaultCombinedPreferenceController.java
@@ -114,7 +114,7 @@
@Nullable CharSequence packageName,
@Nullable CharSequence settingsActivity) {
if (appName == null) {
- preference.setTitle(R.string.app_list_preference_none);
+ preference.setTitle(R.string.credman_app_list_preference_none);
} else {
preference.setTitle(appName);
}
@@ -144,7 +144,7 @@
// Hide the open button if there is no defined settings activity.
primaryPref.setOpenButtonVisible(!TextUtils.isEmpty(settingsActivity));
- primaryPref.setButtonsVisible(appName != null);
+ primaryPref.setButtonsCompactMode(appName != null);
}
}
diff --git a/src/com/android/settings/applications/credentials/PrimaryProviderPreference.java b/src/com/android/settings/applications/credentials/PrimaryProviderPreference.java
index b8e2529..84459e0 100644
--- a/src/com/android/settings/applications/credentials/PrimaryProviderPreference.java
+++ b/src/com/android/settings/applications/credentials/PrimaryProviderPreference.java
@@ -46,7 +46,7 @@
private @Nullable View mButtonFrameView = null;
private @Nullable View mGearView = null;
private @Nullable Delegate mDelegate = null;
- private boolean mButtonsVisible = false;
+ private boolean mButtonsCompactMode = false;
private boolean mOpenButtonVisible = false;
/** Called to send messages back to the parent controller. */
@@ -141,26 +141,7 @@
});
mButtonFrameView = holder.findViewById(R.id.credman_button_frame);
- mButtonFrameView.setVisibility(mButtonsVisible ? View.VISIBLE : View.GONE);
-
- // There is a special case where if the provider == none then we should
- // hide the buttons and when the preference is tapped we can open the
- // provider selection dialog.
- setOnPreferenceClickListener(
- new Preference.OnPreferenceClickListener() {
- public boolean onPreferenceClick(@NonNull Preference preference) {
- return handlePreferenceClickNewSettingsUi();
- }
- });
- }
-
- private boolean handlePreferenceClickNewSettingsUi() {
- if (mDelegate != null && !mButtonsVisible) {
- mDelegate.onChangeButtonClicked();
- return true;
- }
-
- return false;
+ updateButtonFramePadding();
}
public void setOpenButtonVisible(boolean isVisible) {
@@ -172,12 +153,27 @@
mOpenButtonVisible = isVisible;
}
- public void setButtonsVisible(boolean isVisible) {
- if (mButtonFrameView != null) {
- setVisibility(mButtonFrameView, isVisible);
+ private void updateButtonFramePadding() {
+ if (mButtonFrameView == null) {
+ return;
}
- mButtonsVisible = isVisible;
+ int paddingLeft = mButtonsCompactMode ?
+ getContext().getResources().getDimensionPixelSize(
+ R.dimen.credman_primary_provider_pref_left_padding) :
+ getContext().getResources().getDimensionPixelSize(
+ R.dimen.credman_primary_provider_pref_left_padding_compact);
+
+ mButtonFrameView.setPadding(
+ paddingLeft,
+ mButtonFrameView.getPaddingTop(),
+ mButtonFrameView.getPaddingRight(),
+ mButtonFrameView.getPaddingBottom());
+ }
+
+ public void setButtonsCompactMode(boolean isCompactMode) {
+ mButtonsCompactMode = isCompactMode;
+ updateButtonFramePadding();
}
public void setDelegate(@NonNull Delegate delegate) {
diff --git a/src/com/android/settings/applications/manageapplications/ApplicationViewHolder.java b/src/com/android/settings/applications/manageapplications/ApplicationViewHolder.java
index 1d96688..cd3fd6b 100644
--- a/src/com/android/settings/applications/manageapplications/ApplicationViewHolder.java
+++ b/src/com/android/settings/applications/manageapplications/ApplicationViewHolder.java
@@ -231,7 +231,7 @@
void updateAppCloneWidget(Context context, View.OnClickListener onClickListener,
AppEntry entry) {
if (mAddIcon != null) {
- if (!entry.isCloned) {
+ if (!entry.isClonedProfile()) {
mAddIcon.setBackground(context.getDrawable(R.drawable.ic_add_24dp));
} else {
mAddIcon.setBackground(context.getDrawable(R.drawable.ic_trash_can));
@@ -254,7 +254,7 @@
String packageName = entry.info.packageName;
if (mWidgetContainer != null) {
- if (!entry.isCloned) {
+ if (!entry.isClonedProfile()) {
metricsFeatureProvider.action(context,
SettingsEnums.ACTION_CREATE_CLONE_APP);
mAddIcon.setVisibility(View.INVISIBLE);
@@ -285,7 +285,7 @@
}
}.execute();
- } else if (entry.isCloned) {
+ } else if (entry.isClonedProfile()) {
metricsFeatureProvider.action(context,
SettingsEnums.ACTION_DELETE_CLONE_APP);
cloneBackend.uninstallClonedApp(packageName, /*allUsers*/ false,
diff --git a/src/com/android/settings/applications/manageapplications/ManageApplications.java b/src/com/android/settings/applications/manageapplications/ManageApplications.java
index e370f3e..c2fabff 100644
--- a/src/com/android/settings/applications/manageapplications/ManageApplications.java
+++ b/src/com/android/settings/applications/manageapplications/ManageApplications.java
@@ -295,6 +295,7 @@
private String mVolumeUuid;
private int mStorageType;
private boolean mIsWorkOnly;
+ private boolean mIsPrivateProfileOnly;
private int mWorkUserId;
private boolean mIsPersonalOnly;
private View mEmptyView;
@@ -378,6 +379,8 @@
== ProfileSelectFragment.ProfileType.PERSONAL;
mIsWorkOnly = args != null && args.getInt(ProfileSelectFragment.EXTRA_PROFILE)
== ProfileSelectFragment.ProfileType.WORK;
+ mIsPrivateProfileOnly = args != null && args.getInt(ProfileSelectFragment.EXTRA_PROFILE)
+ == ProfileSelectFragment.ProfileType.PRIVATE;
mWorkUserId = args != null ? args.getInt(EXTRA_WORK_ID) : UserHandle.myUserId();
if (mIsWorkOnly && mWorkUserId == UserHandle.myUserId()) {
mWorkUserId = Utils.getManagedProfileId(mUserManager, UserHandle.myUserId());
@@ -660,6 +663,10 @@
if (mIsWorkOnly) {
compositeFilter = new CompoundFilter(compositeFilter, ApplicationsState.FILTER_WORK);
}
+ if (mIsPrivateProfileOnly) {
+ compositeFilter =
+ new CompoundFilter(compositeFilter, ApplicationsState.FILTER_PRIVATE_PROFILE);
+ }
if (mIsPersonalOnly) {
compositeFilter = new CompoundFilter(compositeFilter,
ApplicationsState.FILTER_PERSONAL);
diff --git a/src/com/android/settings/biometrics/fingerprint2/conversion/Util.kt b/src/com/android/settings/biometrics/fingerprint2/conversion/Util.kt
index 58ef509..0ef1d25 100644
--- a/src/com/android/settings/biometrics/fingerprint2/conversion/Util.kt
+++ b/src/com/android/settings/biometrics/fingerprint2/conversion/Util.kt
@@ -20,8 +20,8 @@
import android.hardware.biometrics.BiometricFingerprintConstants.FINGERPRINT_ERROR_UNABLE_TO_PROCESS
import android.hardware.fingerprint.FingerprintManager
import com.android.settings.R
-import com.android.settings.biometrics.fingerprint2.shared.model.EnrollReason
-import com.android.settings.biometrics.fingerprint2.shared.model.FingerEnrollState
+import com.android.settings.biometrics.fingerprint2.lib.model.EnrollReason
+import com.android.settings.biometrics.fingerprint2.lib.model.FingerEnrollState
object Util {
fun EnrollReason.toOriginalReason(): Int {
@@ -71,6 +71,4 @@
this == FINGERPRINT_ERROR_CANCELED,
)
}
-
}
-
diff --git a/src/com/android/settings/biometrics/fingerprint2/data/repository/FingerprintSensorRepo.kt b/src/com/android/settings/biometrics/fingerprint2/data/repository/FingerprintSensorRepo.kt
new file mode 100644
index 0000000..c045b0e
--- /dev/null
+++ b/src/com/android/settings/biometrics/fingerprint2/data/repository/FingerprintSensorRepo.kt
@@ -0,0 +1,90 @@
+/*
+ * Copyright (C) 2024 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.fingerprint2.data.repository
+
+import android.hardware.biometrics.ComponentInfoInternal
+import android.hardware.biometrics.SensorLocationInternal
+import android.hardware.biometrics.SensorProperties
+import android.hardware.fingerprint.FingerprintManager
+import android.hardware.fingerprint.FingerprintSensorProperties
+import android.hardware.fingerprint.FingerprintSensorPropertiesInternal
+import android.hardware.fingerprint.IFingerprintAuthenticatorsRegisteredCallback
+import com.android.systemui.biometrics.shared.model.FingerprintSensor
+import com.android.systemui.biometrics.shared.model.toFingerprintSensor
+import kotlinx.coroutines.CoroutineDispatcher
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.channels.awaitClose
+import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.SharingStarted
+import kotlinx.coroutines.flow.callbackFlow
+import kotlinx.coroutines.flow.stateIn
+import kotlinx.coroutines.withContext
+
+/**
+ * Provides the [FingerprintSensor]
+ *
+ * TODO(b/313493336): Move this to systemui
+ */
+interface FingerprintSensorRepo {
+ /** Get the [FingerprintSensor] */
+ val fingerprintSensor: Flow<FingerprintSensor>
+}
+
+class FingerprintSensorRepoImpl(
+ fingerprintManager: FingerprintManager,
+ backgroundDispatcher: CoroutineDispatcher,
+ activityScope: CoroutineScope,
+) : FingerprintSensorRepo {
+
+ override val fingerprintSensor: Flow<FingerprintSensor> =
+ callbackFlow {
+ val callback =
+ object : IFingerprintAuthenticatorsRegisteredCallback.Stub() {
+ override fun onAllAuthenticatorsRegistered(
+ sensors: List<FingerprintSensorPropertiesInternal>
+ ) {
+ if (sensors.isEmpty()) {
+ trySend(DEFAULT_PROPS)
+ } else {
+ trySend(sensors[0].toFingerprintSensor())
+ }
+ }
+ }
+ withContext(backgroundDispatcher) {
+ fingerprintManager?.addAuthenticatorsRegisteredCallback(callback)
+ }
+ awaitClose {}
+ }
+ .stateIn(activityScope, started = SharingStarted.Eagerly, initialValue = DEFAULT_PROPS)
+
+ companion object {
+ private const val TAG = "FingerprintSensorRepoImpl"
+
+ private val DEFAULT_PROPS =
+ FingerprintSensorPropertiesInternal(
+ -1 /* sensorId */,
+ SensorProperties.STRENGTH_CONVENIENCE,
+ 0 /* maxEnrollmentsPerUser */,
+ listOf<ComponentInfoInternal>(),
+ FingerprintSensorProperties.TYPE_UNKNOWN,
+ false /* halControlsIllumination */,
+ true /* resetLockoutRequiresHardwareAuthToken */,
+ listOf<SensorLocationInternal>(SensorLocationInternal.DEFAULT),
+ )
+ .toFingerprintSensor()
+ }
+}
diff --git a/src/com/android/settings/biometrics/fingerprint2/repository/PressToAuthProviderImpl.kt b/src/com/android/settings/biometrics/fingerprint2/data/repository/PressToAuthRepo.kt
similarity index 67%
rename from src/com/android/settings/biometrics/fingerprint2/repository/PressToAuthProviderImpl.kt
rename to src/com/android/settings/biometrics/fingerprint2/data/repository/PressToAuthRepo.kt
index 38c5335..5909825 100644
--- a/src/com/android/settings/biometrics/fingerprint2/repository/PressToAuthProviderImpl.kt
+++ b/src/com/android/settings/biometrics/fingerprint2/data/repository/PressToAuthRepo.kt
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2023 The Android Open Source Project
+ * Copyright (C) 2024 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.
@@ -14,13 +14,24 @@
* limitations under the License.
*/
-package com.android.settings.biometrics.fingerprint2.repository
+package com.android.settings.biometrics.fingerprint2.data.repository
import android.content.Context
import android.provider.Settings
-import com.android.settings.biometrics.fingerprint2.shared.data.repository.PressToAuthProvider
-class PressToAuthProviderImpl(val context: Context) : PressToAuthProvider {
+/** Interface that indicates if press to auth is on or off. */
+interface PressToAuthRepo {
+ /** Indicates true if the PressToAuth feature is enabled, false otherwise. */
+ val isEnabled: Boolean
+}
+
+/** Indicates whether or not the press to auth feature is enabled. */
+class PressToAuthRepoImpl(private val context: Context) : PressToAuthRepo {
+ /**
+ * Gets the status of the press to auth feature.
+ *
+ * Returns whether or not the press to auth feature is enabled.
+ */
override val isEnabled: Boolean
get() {
var toReturn: Int =
@@ -43,7 +54,7 @@
context.contentResolver,
Settings.Secure.SFPS_PERFORMANT_AUTH_ENABLED,
toReturn,
- context.userId
+ context.userId,
)
}
return (toReturn == 1)
diff --git a/src/com/android/settings/biometrics/fingerprint2/domain/interactor/FingerprintManagerInteractorImpl.kt b/src/com/android/settings/biometrics/fingerprint2/domain/interactor/FingerprintManagerInteractorImpl.kt
index 984d04c..1fbeb44 100644
--- a/src/com/android/settings/biometrics/fingerprint2/domain/interactor/FingerprintManagerInteractorImpl.kt
+++ b/src/com/android/settings/biometrics/fingerprint2/domain/interactor/FingerprintManagerInteractorImpl.kt
@@ -26,16 +26,16 @@
import com.android.settings.biometrics.GatekeeperPasswordProvider
import com.android.settings.biometrics.fingerprint2.conversion.Util.toEnrollError
import com.android.settings.biometrics.fingerprint2.conversion.Util.toOriginalReason
-import com.android.settings.biometrics.fingerprint2.shared.data.repository.PressToAuthProvider
-import com.android.settings.biometrics.fingerprint2.shared.domain.interactor.FingerprintManagerInteractor
-import com.android.settings.biometrics.fingerprint2.shared.model.EnrollReason
-import com.android.settings.biometrics.fingerprint2.shared.model.FingerprintFlow
-import com.android.settings.biometrics.fingerprint2.shared.model.FingerEnrollState
-import com.android.settings.biometrics.fingerprint2.shared.model.FingerprintAuthAttemptModel
-import com.android.settings.biometrics.fingerprint2.shared.model.FingerprintData
-import com.android.settings.biometrics.fingerprint2.shared.model.SetupWizard
+import com.android.settings.biometrics.fingerprint2.data.repository.FingerprintSensorRepo
+import com.android.settings.biometrics.fingerprint2.data.repository.PressToAuthRepo
+import com.android.settings.biometrics.fingerprint2.lib.domain.interactor.FingerprintManagerInteractor
+import com.android.settings.biometrics.fingerprint2.lib.model.EnrollReason
+import com.android.settings.biometrics.fingerprint2.lib.model.FingerEnrollState
+import com.android.settings.biometrics.fingerprint2.lib.model.FingerprintAuthAttemptModel
+import com.android.settings.biometrics.fingerprint2.lib.model.FingerprintData
+import com.android.settings.biometrics.fingerprint2.lib.model.FingerprintFlow
+import com.android.settings.biometrics.fingerprint2.lib.model.SetupWizard
import com.android.settings.password.ChooseLockSettingsHelper
-import com.android.systemui.biometrics.shared.model.toFingerprintSensor
import kotlin.coroutines.resume
import kotlin.coroutines.suspendCoroutine
import kotlinx.coroutines.CancellableContinuation
@@ -57,8 +57,9 @@
applicationContext: Context,
private val backgroundDispatcher: CoroutineDispatcher,
private val fingerprintManager: FingerprintManager,
+ fingerprintSensorRepo: FingerprintSensorRepo,
private val gatekeeperPasswordProvider: GatekeeperPasswordProvider,
- private val pressToAuthProvider: PressToAuthProvider,
+ private val pressToAuthRepo: PressToAuthRepo,
private val fingerprintFlow: FingerprintFlow,
) : FingerprintManagerInteractor {
@@ -100,13 +101,7 @@
)
}
- override val sensorPropertiesInternal = flow {
- val sensorPropertiesInternal = fingerprintManager.sensorPropertiesInternal
- emit(
- if (sensorPropertiesInternal.isEmpty()) null
- else sensorPropertiesInternal.first().toFingerprintSensor()
- )
- }
+ override val sensorPropertiesInternal = fingerprintSensorRepo.fingerprintSensor
override val maxEnrollableFingerprints = flow { emit(maxFingerprints) }
@@ -136,8 +131,7 @@
totalSteps = remaining + 1
}
- trySend(FingerEnrollState.EnrollProgress(remaining, totalSteps!!)).onFailure {
- error ->
+ trySend(FingerEnrollState.EnrollProgress(remaining, totalSteps!!)).onFailure { error ->
Log.d(TAG, "onEnrollmentProgress($remaining) failed to send, due to $error")
}
@@ -148,13 +142,16 @@
}
override fun onEnrollmentHelp(helpMsgId: Int, helpString: CharSequence?) {
- trySend(FingerEnrollState.EnrollHelp(helpMsgId, helpString.toString()))
- .onFailure { error -> Log.d(TAG, "onEnrollmentHelp failed to send, due to $error") }
+ trySend(FingerEnrollState.EnrollHelp(helpMsgId, helpString.toString())).onFailure { error
+ ->
+ Log.d(TAG, "onEnrollmentHelp failed to send, due to $error")
+ }
}
override fun onEnrollmentError(errMsgId: Int, errString: CharSequence?) {
- trySend(errMsgId.toEnrollError(fingerprintFlow == SetupWizard))
- .onFailure { error -> Log.d(TAG, "onEnrollmentError failed to send, due to $error") }
+ trySend(errMsgId.toEnrollError(fingerprintFlow == SetupWizard)).onFailure { error ->
+ Log.d(TAG, "onEnrollmentError failed to send, due to $error")
+ }
Log.d(TAG, "onEnrollmentError($errMsgId)")
streamEnded = true
enrollRequestOutstanding.update { false }
@@ -185,14 +182,14 @@
override fun onRemovalError(
fp: android.hardware.fingerprint.Fingerprint,
errMsgId: Int,
- errString: CharSequence
+ errString: CharSequence,
) {
it.resume(false)
}
override fun onRemovalSucceeded(
fp: android.hardware.fingerprint.Fingerprint?,
- remaining: Int
+ remaining: Int,
) {
it.resume(true)
}
@@ -200,7 +197,7 @@
fingerprintManager.remove(
android.hardware.fingerprint.Fingerprint(fp.name, fp.fingerId, fp.deviceId),
applicationContext.userId,
- callback
+ callback,
)
}
@@ -215,7 +212,7 @@
}
override suspend fun pressToAuthEnabled(): Boolean = suspendCancellableCoroutine {
- it.resume(pressToAuthProvider.isEnabled)
+ it.resume(pressToAuthRepo.isEnabled)
}
override suspend fun authenticate(): FingerprintAuthAttemptModel =
@@ -249,7 +246,7 @@
cancellationSignal,
authenticationCallback,
null,
- applicationContext.userId
+ applicationContext.userId,
)
}
}
diff --git a/src/com/android/settings/biometrics/fingerprint2/shared/Android.bp b/src/com/android/settings/biometrics/fingerprint2/lib/Android.bp
similarity index 64%
rename from src/com/android/settings/biometrics/fingerprint2/shared/Android.bp
rename to src/com/android/settings/biometrics/fingerprint2/lib/Android.bp
index 145f3d6..9f753b2 100644
--- a/src/com/android/settings/biometrics/fingerprint2/shared/Android.bp
+++ b/src/com/android/settings/biometrics/fingerprint2/lib/Android.bp
@@ -2,13 +2,17 @@
// unit/robo/screenshot etc.
//
// This library shouldn't have many dependencies.
+package {
+ default_team: "trendy_team_android_settings_app",
+}
+
android_library {
name: "FingerprintManagerInteractor",
srcs: [
- "**/*.kt"
+ "**/*.kt",
],
static_libs: [
- "BiometricsSharedLib",
- "kotlinx-coroutines-android",
+ "BiometricsSharedLib",
+ "kotlinx-coroutines-android",
],
-}
\ No newline at end of file
+}
diff --git a/src/com/android/settings/biometrics/fingerprint2/shared/AndroidManifest.xml b/src/com/android/settings/biometrics/fingerprint2/lib/AndroidManifest.xml
similarity index 91%
rename from src/com/android/settings/biometrics/fingerprint2/shared/AndroidManifest.xml
rename to src/com/android/settings/biometrics/fingerprint2/lib/AndroidManifest.xml
index e2c97fc..250f0af 100644
--- a/src/com/android/settings/biometrics/fingerprint2/shared/AndroidManifest.xml
+++ b/src/com/android/settings/biometrics/fingerprint2/lib/AndroidManifest.xml
@@ -14,5 +14,5 @@
~ limitations under the License.
-->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.android.settings.biometrics.fingerprint2.shared">
+ package="com.android.settings.biometrics.fingerprint2.lib">
</manifest>
diff --git a/src/com/android/settings/biometrics/fingerprint2/shared/domain/interactor/FingerprintManagerInteractor.kt b/src/com/android/settings/biometrics/fingerprint2/lib/domain/interactor/FingerprintManagerInteractor.kt
similarity index 82%
rename from src/com/android/settings/biometrics/fingerprint2/shared/domain/interactor/FingerprintManagerInteractor.kt
rename to src/com/android/settings/biometrics/fingerprint2/lib/domain/interactor/FingerprintManagerInteractor.kt
index 94afa49..6e6df23 100644
--- a/src/com/android/settings/biometrics/fingerprint2/shared/domain/interactor/FingerprintManagerInteractor.kt
+++ b/src/com/android/settings/biometrics/fingerprint2/lib/domain/interactor/FingerprintManagerInteractor.kt
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2023 The Android Open Source Project
+ * Copyright (C) 2024 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.
@@ -14,12 +14,12 @@
* limitations under the License.
*/
-package com.android.settings.biometrics.fingerprint2.shared.domain.interactor
+package com.android.settings.biometrics.fingerprint2.lib.domain.interactor
-import com.android.settings.biometrics.fingerprint2.shared.model.EnrollReason
-import com.android.settings.biometrics.fingerprint2.shared.model.FingerprintAuthAttemptModel
-import com.android.settings.biometrics.fingerprint2.shared.model.FingerprintData
-import com.android.settings.biometrics.fingerprint2.shared.model.FingerEnrollState
+import com.android.settings.biometrics.fingerprint2.lib.model.EnrollReason
+import com.android.settings.biometrics.fingerprint2.lib.model.FingerEnrollState
+import com.android.settings.biometrics.fingerprint2.lib.model.FingerprintAuthAttemptModel
+import com.android.settings.biometrics.fingerprint2.lib.model.FingerprintData
import com.android.systemui.biometrics.shared.model.FingerprintSensor
import kotlinx.coroutines.flow.Flow
@@ -56,12 +56,12 @@
/**
* Runs [FingerprintManager.enroll] with the [hardwareAuthToken] and [EnrollReason] for this
- * enrollment. Returning the [FingerEnrollState] that represents this fingerprint
- * enrollment state.
+ * enrollment. Returning the [FingerEnrollState] that represents this fingerprint enrollment
+ * state.
*/
suspend fun enroll(
- hardwareAuthToken: ByteArray?,
- enrollReason: EnrollReason,
+ hardwareAuthToken: ByteArray?,
+ enrollReason: EnrollReason,
): Flow<FingerEnrollState>
/**
@@ -78,5 +78,4 @@
/** Indicates if the press to auth feature has been enabled */
suspend fun pressToAuthEnabled(): Boolean
-
}
diff --git a/src/com/android/settings/biometrics/fingerprint2/shared/model/EnrollReason.kt b/src/com/android/settings/biometrics/fingerprint2/lib/model/EnrollReason.kt
similarity index 93%
rename from src/com/android/settings/biometrics/fingerprint2/shared/model/EnrollReason.kt
rename to src/com/android/settings/biometrics/fingerprint2/lib/model/EnrollReason.kt
index 47a0af0..3cc6497 100644
--- a/src/com/android/settings/biometrics/fingerprint2/shared/model/EnrollReason.kt
+++ b/src/com/android/settings/biometrics/fingerprint2/lib/model/EnrollReason.kt
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.android.settings.biometrics.fingerprint2.shared.model
+package com.android.settings.biometrics.fingerprint2.lib.model
/** The reason for enrollment */
enum class EnrollReason {
diff --git a/src/com/android/settings/biometrics/fingerprint2/shared/model/FingerEnrollState.kt b/src/com/android/settings/biometrics/fingerprint2/lib/model/FingerEnrollState.kt
similarity index 81%
rename from src/com/android/settings/biometrics/fingerprint2/shared/model/FingerEnrollState.kt
rename to src/com/android/settings/biometrics/fingerprint2/lib/model/FingerEnrollState.kt
index 4766d59..683397f 100644
--- a/src/com/android/settings/biometrics/fingerprint2/shared/model/FingerEnrollState.kt
+++ b/src/com/android/settings/biometrics/fingerprint2/lib/model/FingerEnrollState.kt
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.android.settings.biometrics.fingerprint2.shared.model
+package com.android.settings.biometrics.fingerprint2.lib.model
import android.annotation.StringRes
@@ -28,16 +28,12 @@
*
* Progress is obtained by (totalStepsRequired - remainingSteps) / totalStepsRequired
*/
- data class EnrollProgress(
- val remainingSteps: Int,
- val totalStepsRequired: Int,
- ) : FingerEnrollState()
+ data class EnrollProgress(val remainingSteps: Int, val totalStepsRequired: Int) :
+ FingerEnrollState()
/** Represents that recoverable error has been encountered during enrollment. */
- data class EnrollHelp(
- @StringRes val helpMsgId: Int,
- val helpString: String,
- ) : FingerEnrollState()
+ data class EnrollHelp(@StringRes val helpMsgId: Int, val helpString: String) :
+ FingerEnrollState()
/** Represents that an unrecoverable error has been encountered and the operation is complete. */
data class EnrollError(
diff --git a/src/com/android/settings/biometrics/fingerprint2/lib/model/FingerprintAuthAttemptModel.kt b/src/com/android/settings/biometrics/fingerprint2/lib/model/FingerprintAuthAttemptModel.kt
new file mode 100644
index 0000000..45259e9
--- /dev/null
+++ b/src/com/android/settings/biometrics/fingerprint2/lib/model/FingerprintAuthAttemptModel.kt
@@ -0,0 +1,26 @@
+/*
+ * Copyright (C) 2024 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.fingerprint2.lib.model
+
+/** Information indicating whether an auth was successful or not */
+sealed class FingerprintAuthAttemptModel {
+ /** Indicates a successful auth attempt has occurred for [fingerId] */
+ data class Success(val fingerId: Int) : FingerprintAuthAttemptModel()
+
+ /** Indicates a failed auth attempt has occurred. */
+ data class Error(val error: Int, val message: String) : FingerprintAuthAttemptModel()
+}
diff --git a/src/com/android/settings/biometrics/fingerprint2/shared/data/repository/PressToAuthProvider.kt b/src/com/android/settings/biometrics/fingerprint2/lib/model/FingerprintData.kt
similarity index 67%
rename from src/com/android/settings/biometrics/fingerprint2/shared/data/repository/PressToAuthProvider.kt
rename to src/com/android/settings/biometrics/fingerprint2/lib/model/FingerprintData.kt
index e776b9a..62aa2c7 100644
--- a/src/com/android/settings/biometrics/fingerprint2/shared/data/repository/PressToAuthProvider.kt
+++ b/src/com/android/settings/biometrics/fingerprint2/lib/model/FingerprintData.kt
@@ -14,14 +14,7 @@
* limitations under the License.
*/
-package com.android.settings.biometrics.fingerprint2.shared.data.repository
+package com.android.settings.biometrics.fingerprint2.lib.model
-/**
- * Interface that indicates if press to auth is on or off.
- */
-interface PressToAuthProvider {
- /**
- * Indicates true if the PressToAuth feature is enabled, false otherwise.
- */
- val isEnabled: Boolean
-}
\ No newline at end of file
+/** Basic information about an enrolled fingerprint */
+data class FingerprintData(val name: String, val fingerId: Int, val deviceId: Long)
diff --git a/src/com/android/settings/biometrics/fingerprint2/shared/model/FingerprintFlow.kt b/src/com/android/settings/biometrics/fingerprint2/lib/model/FingerprintFlow.kt
similarity index 83%
rename from src/com/android/settings/biometrics/fingerprint2/shared/model/FingerprintFlow.kt
rename to src/com/android/settings/biometrics/fingerprint2/lib/model/FingerprintFlow.kt
index 93c7577..40d7a03 100644
--- a/src/com/android/settings/biometrics/fingerprint2/shared/model/FingerprintFlow.kt
+++ b/src/com/android/settings/biometrics/fingerprint2/lib/model/FingerprintFlow.kt
@@ -14,10 +14,11 @@
* limitations under the License.
*/
-package com.android.settings.biometrics.fingerprint2.shared.model
+package com.android.settings.biometrics.fingerprint2.lib.model
/**
- * The [FingerprintFlow] for fingerprint enrollment indicates information on how the flow should behave.
+ * The [FingerprintFlow] for fingerprint enrollment indicates information on how the flow should
+ * behave.
*/
sealed class FingerprintFlow
@@ -32,3 +33,6 @@
/** Flow to specify settings type */
data object Settings : FingerprintFlow()
+
+/** Indicates that the fast enroll experience should occur */
+data object FastEnroll : FingerprintFlow()
diff --git a/src/com/android/settings/biometrics/fingerprint2/shared/model/FingerprintData.kt b/src/com/android/settings/biometrics/fingerprint2/shared/model/FingerprintData.kt
deleted file mode 100644
index b2aa25c..0000000
--- a/src/com/android/settings/biometrics/fingerprint2/shared/model/FingerprintData.kt
+++ /dev/null
@@ -1,34 +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.fingerprint2.shared.model
-
-data class FingerprintData(
- val name: String,
- val fingerId: Int,
- val deviceId: Long,
-)
-
-sealed class FingerprintAuthAttemptModel {
- data class Success(
- val fingerId: Int,
- ) : FingerprintAuthAttemptModel()
-
- data class Error(
- val error: Int,
- val message: String,
- ) : FingerprintAuthAttemptModel()
-}
diff --git a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/activity/FingerprintEnrollmentV2Activity.kt b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/activity/FingerprintEnrollmentV2Activity.kt
index 06307a4..f7e6135 100644
--- a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/activity/FingerprintEnrollmentV2Activity.kt
+++ b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/activity/FingerprintEnrollmentV2Activity.kt
@@ -21,7 +21,6 @@
import android.content.res.Configuration
import android.hardware.fingerprint.FingerprintManager
import android.os.Bundle
-import android.provider.Settings
import android.util.Log
import android.view.accessibility.AccessibilityManager
import androidx.activity.result.contract.ActivityResultContracts
@@ -31,16 +30,18 @@
import androidx.lifecycle.lifecycleScope
import com.android.internal.widget.LockPatternUtils
import com.android.settings.R
+import com.android.settings.SettingsApplication
import com.android.settings.SetupWizardUtils
import com.android.settings.Utils.SETTINGS_PACKAGE_NAME
import com.android.settings.biometrics.BiometricEnrollBase
import com.android.settings.biometrics.BiometricEnrollBase.CONFIRM_REQUEST
import com.android.settings.biometrics.BiometricEnrollBase.RESULT_FINISHED
import com.android.settings.biometrics.GatekeeperPasswordProvider
+import com.android.settings.biometrics.fingerprint2.data.repository.FingerprintSensorRepoImpl
+import com.android.settings.biometrics.fingerprint2.data.repository.PressToAuthRepoImpl
import com.android.settings.biometrics.fingerprint2.domain.interactor.FingerprintManagerInteractorImpl
-import com.android.settings.biometrics.fingerprint2.shared.model.Default
-import com.android.settings.biometrics.fingerprint2.shared.model.SetupWizard
-import com.android.settings.biometrics.fingerprint2.repository.PressToAuthProviderImpl
+import com.android.settings.biometrics.fingerprint2.lib.model.Default
+import com.android.settings.biometrics.fingerprint2.lib.model.SetupWizard
import com.android.settings.biometrics.fingerprint2.ui.enrollment.fragment.FingerprintEnrollConfirmationV2Fragment
import com.android.settings.biometrics.fingerprint2.ui.enrollment.fragment.FingerprintEnrollEnrollingV2Fragment
import com.android.settings.biometrics.fingerprint2.ui.enrollment.fragment.FingerprintEnrollFindSensorV2Fragment
@@ -49,20 +50,24 @@
import com.android.settings.biometrics.fingerprint2.ui.enrollment.modules.enrolling.rfps.ui.viewmodel.RFPSViewModel
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.AccessibilityViewModel
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.BackgroundViewModel
-import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.Confirmation
-import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.Education
-import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.Enrollment
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintAction
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintEnrollEnrollingViewModel
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintEnrollFindSensorViewModel
-import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintEnrollNavigationViewModel
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintEnrollIntroViewModel
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintEnrollViewModel
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintFlowViewModel
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintGatekeeperViewModel
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintNavigationStep.ConfirmDeviceCredential
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintNavigationStep.Confirmation
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintNavigationStep.Education
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintNavigationStep.Enrollment
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintNavigationStep.Init
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintNavigationStep.Introduction
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintNavigationStep.TransitionStep
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintNavigationViewModel
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintScrollViewModel
-import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.Finish
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FoldStateViewModel
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.GatekeeperInfo
-import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.Intro
-import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.LaunchConfirmDeviceCredential
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.OrientationStateViewModel
import com.android.settings.password.ChooseLockGeneric
import com.android.settings.password.ChooseLockSettingsHelper
@@ -71,7 +76,6 @@
import com.google.android.setupcompat.util.WizardManagerHelper
import com.google.android.setupdesign.util.ThemeHelper
import kotlinx.coroutines.Dispatchers
-import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.filterNotNull
import kotlinx.coroutines.launch
@@ -83,7 +87,7 @@
*/
class FingerprintEnrollmentV2Activity : FragmentActivity() {
private lateinit var fingerprintEnrollEnrollingViewModel: FingerprintEnrollEnrollingViewModel
- private lateinit var navigationViewModel: FingerprintEnrollNavigationViewModel
+ private lateinit var navigationViewModel: FingerprintNavigationViewModel
private lateinit var gatekeeperViewModel: FingerprintGatekeeperViewModel
private lateinit var fingerprintEnrollViewModel: FingerprintEnrollViewModel
private lateinit var accessibilityViewModel: AccessibilityViewModel
@@ -91,6 +95,7 @@
private lateinit var orientationStateViewModel: OrientationStateViewModel
private lateinit var fingerprintScrollViewModel: FingerprintScrollViewModel
private lateinit var backgroundViewModel: BackgroundViewModel
+ private lateinit var fingerprintFlowViewModel: FingerprintFlowViewModel
private val coroutineDispatcher = Dispatchers.Default
/** Result listener for ChooseLock activity flow. */
@@ -119,6 +124,7 @@
super.onResume()
backgroundViewModel.inForeground()
}
+
override fun onConfigurationChanged(newConfig: Configuration) {
super.onConfigurationChanged(newConfig)
foldStateViewModel.onConfigurationChange(newConfig)
@@ -127,8 +133,20 @@
private fun onConfirmDevice(resultCode: Int, data: Intent?) {
val wasSuccessful = resultCode == RESULT_FINISHED || resultCode == Activity.RESULT_OK
val gateKeeperPasswordHandle = data?.getExtra(EXTRA_KEY_GK_PW_HANDLE) as Long?
+
lifecycleScope.launch {
+ val confirmDeviceResult =
+ if (wasSuccessful) {
+ FingerprintAction.CONFIRM_DEVICE_SUCCESS
+ } else {
+ FingerprintAction.CONFIRM_DEVICE_FAIL
+ }
gatekeeperViewModel.onConfirmDevice(wasSuccessful, gateKeeperPasswordHandle)
+ navigationViewModel.update(
+ confirmDeviceResult,
+ ConfirmDeviceCredential::class,
+ "$TAG#onConfirmDevice",
+ )
}
}
@@ -156,14 +174,21 @@
ViewModelProvider(this, BackgroundViewModel.BackgroundViewModelFactory())[
BackgroundViewModel::class.java]
+ fingerprintFlowViewModel =
+ ViewModelProvider(this, FingerprintFlowViewModel.FingerprintFlowViewModelFactory(enrollType))[
+ FingerprintFlowViewModel::class.java]
- val interactor =
+ val fingerprintSensorRepo =
+ FingerprintSensorRepoImpl(fingerprintManager, backgroundDispatcher, lifecycleScope)
+
+ val fingerprintManagerInteractor =
FingerprintManagerInteractorImpl(
context,
backgroundDispatcher,
fingerprintManager,
+ fingerprintSensorRepo,
GatekeeperPasswordProvider(LockPatternUtils(context)),
- PressToAuthProviderImpl(context),
+ PressToAuthRepoImpl(context),
enrollType,
)
@@ -171,27 +196,37 @@
val token = intent.getByteArrayExtra(ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE_TOKEN)
val gatekeeperInfo = FingerprintGatekeeperViewModel.toGateKeeperInfo(challenge, token)
+ val hasConfirmedDeviceCredential = gatekeeperInfo is GatekeeperInfo.GatekeeperPasswordInfo
+
+ navigationViewModel =
+ ViewModelProvider(
+ this,
+ FingerprintNavigationViewModel.FingerprintNavigationViewModelFactory(
+ Init,
+ hasConfirmedDeviceCredential,
+ fingerprintFlowViewModel,
+ fingerprintManagerInteractor,
+ ),
+ )[FingerprintNavigationViewModel::class.java]
+ // Initialize FingerprintEnrollIntroViewModel
+ ViewModelProvider(
+ this,
+ FingerprintEnrollIntroViewModel.FingerprintEnrollIntoViewModelFactory(
+ navigationViewModel,
+ fingerprintFlowViewModel,
+ fingerprintManagerInteractor,
+ ),
+ )[FingerprintEnrollIntroViewModel::class.java]
+
gatekeeperViewModel =
ViewModelProvider(
this,
FingerprintGatekeeperViewModel.FingerprintGatekeeperViewModelFactory(
gatekeeperInfo,
- interactor,
- )
+ fingerprintManagerInteractor,
+ ),
)[FingerprintGatekeeperViewModel::class.java]
- navigationViewModel =
- ViewModelProvider(
- this,
- FingerprintEnrollNavigationViewModel.FingerprintEnrollNavigationViewModelFactory(
- backgroundDispatcher,
- interactor,
- gatekeeperViewModel,
- gatekeeperInfo is GatekeeperInfo.GatekeeperPasswordInfo,
- enrollType,
- )
- )[FingerprintEnrollNavigationViewModel::class.java]
-
// Initialize FoldStateViewModel
foldStateViewModel =
ViewModelProvider(this, FoldStateViewModel.FoldStateViewModelFactory(context))[
@@ -203,10 +238,10 @@
ViewModelProvider(
this,
FingerprintEnrollViewModel.FingerprintEnrollViewModelFactory(
- interactor,
+ fingerprintManagerInteractor,
gatekeeperViewModel,
navigationViewModel,
- )
+ ),
)[FingerprintEnrollViewModel::class.java]
// Initialize scroll view model
@@ -220,7 +255,7 @@
this,
AccessibilityViewModel.AccessibilityViewModelFactory(
getSystemService(AccessibilityManager::class.java)!!
- )
+ ),
)[AccessibilityViewModel::class.java]
// Initialize OrientationViewModel
@@ -234,8 +269,8 @@
this,
FingerprintEnrollEnrollingViewModel.FingerprintEnrollEnrollingViewModelFactory(
fingerprintEnrollViewModel,
- backgroundViewModel
- )
+ backgroundViewModel,
+ ),
)[FingerprintEnrollEnrollingViewModel::class.java]
// Initialize FingerprintEnrollFindSensorViewModel
@@ -248,36 +283,48 @@
backgroundViewModel,
accessibilityViewModel,
foldStateViewModel,
- orientationStateViewModel
- )
+ orientationStateViewModel,
+ fingerprintFlowViewModel,
+ ),
)[FingerprintEnrollFindSensorViewModel::class.java]
// Initialize RFPS View Model
ViewModelProvider(
this,
- RFPSViewModel.RFPSViewModelFactory(fingerprintEnrollEnrollingViewModel)
+ RFPSViewModel.RFPSViewModelFactory(fingerprintEnrollEnrollingViewModel, navigationViewModel),
)[RFPSViewModel::class.java]
+ lifecycleScope.launch {
+ navigationViewModel.currentStep.collect { step ->
+ if (step is Init) {
+ Log.d(TAG, "FingerprintNav.init($step)")
+ navigationViewModel.update(FingerprintAction.ACTIVITY_CREATED, Init::class, "$TAG#init")
+ }
+ }
+ }
lifecycleScope.launch {
- navigationViewModel.navigationViewModel
- .filterNotNull()
- .combine(fingerprintEnrollViewModel.sensorType) { nav, sensorType -> Pair(nav, sensorType) }
- .collect { (nav, sensorType) ->
- Log.d(TAG, "navigationStep $nav")
- fingerprintEnrollViewModel.sensorTypeCached = sensorType
- val isForward = nav.forward
- val currStep = nav.currStep
- val theClass: Class<Fragment>? =
- when (currStep) {
- Confirmation -> FingerprintEnrollConfirmationV2Fragment::class.java as Class<Fragment>
- Education -> FingerprintEnrollFindSensorV2Fragment::class.java as Class<Fragment>
+ navigationViewModel.navigateTo.filterNotNull().collect { step ->
+ if (step is ConfirmDeviceCredential) {
+ launchConfirmOrChooseLock(userId)
+ navigationViewModel.update(
+ FingerprintAction.TRANSITION_FINISHED,
+ TransitionStep::class,
+ "$TAG#launchConfirmOrChooseLock",
+ )
+ } else {
+ val theClass: Fragment? =
+ when (step) {
+ Confirmation -> FingerprintEnrollConfirmationV2Fragment()
+ is Education -> {
+ FingerprintEnrollFindSensorV2Fragment(step.sensor.sensorType)
+ }
is Enrollment -> {
- when (sensorType) {
- FingerprintSensorType.REAR -> RFPSEnrollFragment::class.java as Class<Fragment>
- else -> FingerprintEnrollEnrollingV2Fragment::class.java as Class<Fragment>
+ when (step.sensor.sensorType) {
+ FingerprintSensorType.REAR -> RFPSEnrollFragment()
+ else -> FingerprintEnrollEnrollingV2Fragment()
}
}
- Intro -> FingerprintEnrollIntroV2Fragment::class.java as Class<Fragment>
+ Introduction -> FingerprintEnrollIntroV2Fragment()
else -> null
}
@@ -291,19 +338,31 @@
.setReorderingAllowed(true)
.add(R.id.fragment_container_view, theClass, null)
.commit()
- } else {
-
- if (currStep is Finish) {
- if (currStep.resultCode != null) {
- finishActivity(currStep.resultCode)
- } else {
- finish()
- }
- } else if (currStep == LaunchConfirmDeviceCredential) {
- launchConfirmOrChooseLock(userId)
- }
+ navigationViewModel.update(
+ FingerprintAction.TRANSITION_FINISHED,
+ TransitionStep::class,
+ "$TAG#fragmentManager.add($theClass)",
+ )
}
}
+ }
+ }
+
+ lifecycleScope.launch {
+ navigationViewModel.shouldFinish.filterNotNull().collect {
+ Log.d(TAG, "FingerprintSettingsNav.finishing($it)")
+ if (it.result != null) {
+ finishActivity(it.result as Int)
+ } else {
+ finish()
+ }
+ }
+ }
+
+ lifecycleScope.launch {
+ navigationViewModel.currentScreen.filterNotNull().collect { screen ->
+ Log.d(TAG, "FingerprintSettingsNav.currentScreen($screen)")
+ }
}
val fromSettingsSummary =
@@ -313,7 +372,7 @@
) {
overridePendingTransition(
com.google.android.setupdesign.R.anim.sud_slide_next_in,
- com.google.android.setupdesign.R.anim.sud_slide_next_out
+ com.google.android.setupdesign.R.anim.sud_slide_next_out,
)
}
}
diff --git a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/fragment/FingerprintEnrollConfirmationV2Fragment.kt b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/fragment/FingerprintEnrollConfirmationV2Fragment.kt
index b12491f..fd07a95 100644
--- a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/fragment/FingerprintEnrollConfirmationV2Fragment.kt
+++ b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/fragment/FingerprintEnrollConfirmationV2Fragment.kt
@@ -18,8 +18,6 @@
import android.os.Bundle
import androidx.fragment.app.Fragment
-import androidx.lifecycle.ViewModelProvider
-import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintEnrollNavigationViewModel
/**
* A fragment to indicate that fingerprint enrollment has been completed.
@@ -31,9 +29,5 @@
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
- if (savedInstanceState == null) {
- val navigationViewModel =
- ViewModelProvider(requireActivity())[FingerprintEnrollNavigationViewModel::class.java]
- }
}
}
diff --git a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/fragment/FingerprintEnrollEnrollingV2Fragment.kt b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/fragment/FingerprintEnrollEnrollingV2Fragment.kt
index 0140d57..be30346 100644
--- a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/fragment/FingerprintEnrollEnrollingV2Fragment.kt
+++ b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/fragment/FingerprintEnrollEnrollingV2Fragment.kt
@@ -18,18 +18,12 @@
import android.os.Bundle
import androidx.fragment.app.Fragment
-import androidx.lifecycle.ViewModelProvider
import com.android.settings.R
-import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintEnrollNavigationViewModel
/** A fragment that is responsible for enrolling a users fingerprint. */
class FingerprintEnrollEnrollingV2Fragment : Fragment(R.layout.fingerprint_enroll_enrolling) {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
- if (savedInstanceState == null) {
- val navigationViewModel =
- ViewModelProvider(requireActivity())[FingerprintEnrollNavigationViewModel::class.java]
- }
}
}
diff --git a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/fragment/FingerprintEnrollFindSensorV2Fragment.kt b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/fragment/FingerprintEnrollFindSensorV2Fragment.kt
index bfd4264..9603e6b 100644
--- a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/fragment/FingerprintEnrollFindSensorV2Fragment.kt
+++ b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/fragment/FingerprintEnrollFindSensorV2Fragment.kt
@@ -50,7 +50,7 @@
* 2. Explain to the user how the enrollment process shown by [FingerprintEnrollEnrollingV2Fragment]
* will work.
*/
-class FingerprintEnrollFindSensorV2Fragment : Fragment() {
+class FingerprintEnrollFindSensorV2Fragment(val sensorType: FingerprintSensorType) : Fragment() {
// This is only for non-udfps or non-sfps sensor. For udfps and sfps, we show lottie.
private var animation: FingerprintFindSensorAnimation? = null
@@ -62,7 +62,7 @@
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
- savedInstanceState: Bundle?
+ savedInstanceState: Bundle?,
): View? {
val sensorType =
@@ -104,8 +104,7 @@
}
lifecycleScope.launch {
viewModel.showRfpsAnimation.collect {
- animation =
- view.findViewById(R.id.fingerprint_sensor_location_animation)
+ animation = view.findViewById(R.id.fingerprint_sensor_location_animation)
animation!!.startAnimation()
}
}
@@ -128,14 +127,7 @@
footerBarMixin.secondaryButton =
FooterButton.Builder(requireActivity())
.setText(R.string.security_settings_fingerprint_enroll_enrolling_skip)
- .setListener {
- run {
- // TODO: Show the dialog for suw
- Log.d(TAG, "onSkipClicked")
- // TODO: Finish activity in the root activity instead.
- requireActivity().finish()
- }
- }
+ .setListener { viewModel.secondaryButtonClicked() }
.setButtonType(FooterButton.ButtonType.SKIP)
.setTheme(com.google.android.setupdesign.R.style.SudGlifButton_Secondary)
.build()
@@ -146,10 +138,8 @@
FooterButton.Builder(requireActivity())
.setText(R.string.security_settings_udfps_enroll_find_sensor_start_button)
.setListener {
- run {
- Log.d(TAG, "onStartButtonClick")
- viewModel.proceedToEnrolling()
- }
+ Log.d(TAG, "onStartButtonClick")
+ viewModel.proceedToEnrolling()
}
.setButtonType(FooterButton.ButtonType.NEXT)
.setTheme(com.google.android.setupdesign.R.style.SudGlifButton_Primary)
@@ -159,7 +149,7 @@
private fun setupLottie(
view: View,
lottieAnimation: Int,
- lottieClickListener: View.OnClickListener? = null
+ lottieClickListener: View.OnClickListener? = null,
) {
val illustrationLottie: LottieAnimationView? = view.findViewById(R.id.illustration_lottie)
illustrationLottie?.setAnimation(lottieAnimation)
diff --git a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/fragment/FingerprintEnrollIntroV2Fragment.kt b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/fragment/FingerprintEnrollIntroV2Fragment.kt
index 32d201d..53d0ddf 100644
--- a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/fragment/FingerprintEnrollIntroV2Fragment.kt
+++ b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/fragment/FingerprintEnrollIntroV2Fragment.kt
@@ -24,7 +24,6 @@
import android.os.Bundle
import android.text.Html
import android.text.method.LinkMovementMethod
-import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
@@ -36,9 +35,8 @@
import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.lifecycleScope
import com.android.settings.R
-import com.android.settings.biometrics.fingerprint2.shared.model.Unicorn
-import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintEnrollNavigationViewModel
-import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintEnrollViewModel
+import com.android.settings.biometrics.fingerprint2.lib.model.Unicorn
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintEnrollIntroViewModel
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintGatekeeperViewModel
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintScrollViewModel
import com.android.systemui.biometrics.shared.model.FingerprintSensorType
@@ -48,6 +46,7 @@
import com.google.android.setupdesign.template.RequireScrollMixin
import com.google.android.setupdesign.util.DynamicColorPalette
import kotlinx.coroutines.flow.combine
+import kotlinx.coroutines.flow.filterNotNull
import kotlinx.coroutines.launch
private const val TAG = "FingerprintEnrollmentIntroV2Fragment"
@@ -96,16 +95,14 @@
private lateinit var footerBarMixin: FooterBarMixin
private lateinit var textModel: TextModel
- // Note that the ViewModels cannot be requested before the onCreate call
- private val navigationViewModel: FingerprintEnrollNavigationViewModel by lazy {
- viewModelProvider[FingerprintEnrollNavigationViewModel::class.java]
+ private val viewModel: FingerprintEnrollIntroViewModel by lazy {
+ viewModelProvider[FingerprintEnrollIntroViewModel::class.java]
}
- private val fingerprintViewModel: FingerprintEnrollViewModel by lazy {
- viewModelProvider[FingerprintEnrollViewModel::class.java]
- }
+
private val fingerprintScrollViewModel: FingerprintScrollViewModel by lazy {
viewModelProvider[FingerprintScrollViewModel::class.java]
}
+
private val gateKeeperViewModel: FingerprintGatekeeperViewModel by lazy {
viewModelProvider[FingerprintGatekeeperViewModel::class.java]
}
@@ -113,17 +110,16 @@
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
- savedInstanceState: Bundle?
+ savedInstanceState: Bundle?,
): View? =
super.onCreateView(inflater, container, savedInstanceState).also { theView ->
val view = theView!!
viewLifecycleOwner.lifecycleScope.launch {
- combine(
- navigationViewModel.fingerprintFlow,
- fingerprintViewModel.sensorType,
- ) { enrollType, sensorType ->
- Pair(enrollType, sensorType)
+ combine(viewModel.fingerprintFlow, viewModel.sensor.filterNotNull()) {
+ enrollType,
+ sensorType ->
+ Pair(enrollType, sensorType.sensorType)
}
.collect { (enrollType, sensorType) ->
textModel =
@@ -147,7 +143,7 @@
R.id.icon_trash_can,
R.id.icon_info,
R.id.icon_shield,
- R.id.icon_link
+ R.id.icon_link,
)
.forEach { icon ->
view.requireViewById<ImageView>(icon).drawable.colorFilter = colorFilter
@@ -186,31 +182,24 @@
return view
}
- /**
- * TODO (b/305269201): This link isn't displaying for screenshot tests.
- */
+ /** TODO (b/305269201): This link isn't displaying for screenshot tests. */
private fun setFooterLink(view: View) {
val footerLink: TextView = view.requireViewById(R.id.footer_learn_more)
footerLink.movementMethod = LinkMovementMethod.getInstance()
footerLink.text =
Html.fromHtml(
getString(R.string.security_settings_fingerprint_v2_enroll_introduction_message_learn_more),
- Html.FROM_HTML_MODE_LEGACY
+ Html.FROM_HTML_MODE_LEGACY,
)
}
- private fun setupFooterBarAndScrollView(
- view: View,
- ) {
+ private fun setupFooterBarAndScrollView(view: View) {
val scrollView: ScrollView =
view.requireViewById(com.google.android.setupdesign.R.id.sud_scroll_view)
scrollView.importantForAccessibility = View.IMPORTANT_FOR_ACCESSIBILITY_YES
// Next button responsible for starting the next fragment.
val onNextButtonClick: View.OnClickListener =
- View.OnClickListener {
- Log.d(TAG, "OnNextClicked")
- navigationViewModel.nextStep()
- }
+ View.OnClickListener { viewModel.primaryButtonClicked() }
val layout: GlifLayout = view.findViewById(R.id.setup_wizard_layout)!!
footerBarMixin = layout.getMixin(FooterBarMixin::class.java)
@@ -225,11 +214,11 @@
footerBarMixin.setSecondaryButton(
FooterButton.Builder(requireContext())
.setText(textModel.negativeButton)
- .setListener({ Log.d(TAG, "prevClicked") })
+ .setListener { viewModel.onSecondaryButtonClicked() }
.setButtonType(FooterButton.ButtonType.NEXT)
.setTheme(com.google.android.setupdesign.R.style.SudGlifButton_Primary)
.build(),
- true /* usePrimaryStyle */
+ true, /* usePrimaryStyle */
)
val primaryButton = footerBarMixin.primaryButton
@@ -242,7 +231,7 @@
requireContext(),
primaryButton,
R.string.security_settings_face_enroll_introduction_more,
- onNextButtonClick
+ onNextButtonClick,
)
requireScrollMixin.setOnRequireScrollStateChangedListener { scrollNeeded: Boolean ->
@@ -257,7 +246,7 @@
if (consented) {
primaryButton.setText(
requireContext(),
- R.string.security_settings_fingerprint_enroll_introduction_agree
+ R.string.security_settings_fingerprint_enroll_introduction_agree,
)
secondaryButton.visibility = View.VISIBLE
} else {
@@ -309,7 +298,7 @@
private fun getIconColorFilter(): PorterDuffColorFilter {
return PorterDuffColorFilter(
DynamicColorPalette.getColor(context, DynamicColorPalette.ColorType.ACCENT),
- PorterDuff.Mode.SRC_IN
+ PorterDuff.Mode.SRC_IN,
)
}
}
diff --git a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/modules/enrolling/rfps/ui/fragment/RFPSEnrollFragment.kt b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/modules/enrolling/rfps/ui/fragment/RFPSEnrollFragment.kt
index d8c2f5a..c6e284a 100644
--- a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/modules/enrolling/rfps/ui/fragment/RFPSEnrollFragment.kt
+++ b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/modules/enrolling/rfps/ui/fragment/RFPSEnrollFragment.kt
@@ -32,13 +32,15 @@
import androidx.lifecycle.lifecycleScope
import androidx.lifecycle.repeatOnLifecycle
import com.android.settings.R
-import com.android.settings.biometrics.fingerprint2.shared.model.FingerEnrollState
+import com.android.settings.biometrics.fingerprint2.lib.model.FingerEnrollState
import com.android.settings.biometrics.fingerprint2.ui.enrollment.modules.enrolling.rfps.ui.viewmodel.RFPSIconTouchViewModel
import com.android.settings.biometrics.fingerprint2.ui.enrollment.modules.enrolling.rfps.ui.viewmodel.RFPSViewModel
import com.android.settings.biometrics.fingerprint2.ui.enrollment.modules.enrolling.rfps.ui.widget.FingerprintErrorDialog
import com.android.settings.biometrics.fingerprint2.ui.enrollment.modules.enrolling.rfps.ui.widget.IconTouchDialog
import com.android.settings.biometrics.fingerprint2.ui.enrollment.modules.enrolling.rfps.ui.widget.RFPSProgressBar
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.BackgroundViewModel
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintNavigationStep
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintNavigationViewModel
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.OrientationStateViewModel
import com.android.settings.core.instrumentation.InstrumentedDialogFragment
import com.google.android.setupcompat.template.FooterBarMixin
@@ -49,8 +51,6 @@
import kotlinx.coroutines.flow.filterNotNull
import kotlinx.coroutines.launch
-private const val TAG = "RFPSEnrollFragment"
-
/** This fragment is responsible for taking care of rear fingerprint enrollment. */
class RFPSEnrollFragment : Fragment(R.layout.fingerprint_v2_rfps_enroll_enrolling) {
@@ -74,11 +74,14 @@
private val backgroundViewModel: BackgroundViewModel by lazy {
ViewModelProvider(requireActivity())[BackgroundViewModel::class.java]
}
+ private val navigationViewModel: FingerprintNavigationViewModel by lazy {
+ ViewModelProvider(requireActivity())[FingerprintNavigationViewModel::class.java]
+ }
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
- savedInstanceState: Bundle?
+ savedInstanceState: Bundle?,
): View? {
val view = super.onCreateView(inflater, container, savedInstanceState)!!
val fragment = this
@@ -99,7 +102,7 @@
footerBarMixin.secondaryButton =
FooterButton.Builder(context)
.setText(R.string.security_settings_fingerprint_enroll_enrolling_skip)
- .setListener { Log.e(TAG, "skip enrollment!") }
+ .setListener { rfpsViewModel.negativeButtonClicked() }
.setButtonType(FooterButton.ButtonType.SKIP)
.setTheme(com.google.android.setupdesign.R.style.SudGlifButton_Secondary)
.build()
@@ -150,7 +153,7 @@
viewLifecycleOwner.lifecycleScope.launch {
backgroundViewModel.background
.filter { inBackground -> inBackground }
- .collect { rfpsViewModel.stopEnrollment() }
+ .collect { rfpsViewModel.didGoToBackground() }
}
viewLifecycleOwner.lifecycleScope.launch {
@@ -171,7 +174,6 @@
.setDuration(200)
.setInterpolator(linearOutSlowInInterpolator)
.start()
-
}
}
@@ -207,6 +209,12 @@
dismissDialogs()
}
}
+
+ viewLifecycleOwner.lifecycleScope.launch {
+ rfpsViewModel.didCompleteEnrollment
+ .filter { it }
+ .collect { rfpsViewModel.finishedSuccessfully() }
+ }
return view
}
@@ -215,29 +223,19 @@
viewLifecycleOwner.lifecycleScope.launch {
try {
val shouldRestartEnrollment = FingerprintErrorDialog.showInstance(error, fragment)
+ rfpsViewModel.userClickedStopEnrollDialog()
} catch (exception: Exception) {
Log.e(TAG, "Exception occurred $exception")
}
- onEnrollmentFailed()
}
}
- private fun onEnrollmentFailed() {
- rfpsViewModel.stopEnrollment()
- }
-
private fun handleEnrollProgress(progress: FingerEnrollState.EnrollProgress) {
progressBar.updateProgress(
progress.remainingSteps.toFloat() / progress.totalStepsRequired.toFloat()
)
-
- if (progress.remainingSteps == 0) {
- performNextStepSuccess()
- }
}
- private fun performNextStepSuccess() {}
-
private fun dismissDialogs() {
val transaction = parentFragmentManager.beginTransaction()
for (frag in parentFragmentManager.fragments) {
@@ -249,4 +247,9 @@
}
transaction.commitAllowingStateLoss()
}
+
+ companion object {
+ private const val TAG = "RFPSEnrollFragment"
+ private val navStep = FingerprintNavigationStep.Enrollment::class
+ }
}
diff --git a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/modules/enrolling/rfps/ui/viewmodel/RFPSIconTouchViewModel.kt b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/modules/enrolling/rfps/ui/viewmodel/RFPSIconTouchViewModel.kt
index c16e65c..cbcb1d4 100644
--- a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/modules/enrolling/rfps/ui/viewmodel/RFPSIconTouchViewModel.kt
+++ b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/modules/enrolling/rfps/ui/viewmodel/RFPSIconTouchViewModel.kt
@@ -38,9 +38,9 @@
private val _touches: MutableStateFlow<Int> = MutableStateFlow(0)
/**
- * Whether or not the UI should be showing the dialog. By making this SharingStarted.Eagerly
- * the first event 0 % 3 == 0 will fire as soon as this view model is created, so it should
- * be ignored and work as intended.
+ * Whether or not the UI should be showing the dialog. By making this SharingStarted.Eagerly the
+ * first event 0 % 3 == 0 will fire as soon as this view model is created, so it should be ignored
+ * and work as intended.
*/
val shouldShowDialog: Flow<Boolean> =
_touches
diff --git a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/modules/enrolling/rfps/ui/viewmodel/RFPSViewModel.kt b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/modules/enrolling/rfps/ui/viewmodel/RFPSViewModel.kt
index 58d604e..99250e6 100644
--- a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/modules/enrolling/rfps/ui/viewmodel/RFPSViewModel.kt
+++ b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/modules/enrolling/rfps/ui/viewmodel/RFPSViewModel.kt
@@ -19,13 +19,17 @@
import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.viewModelScope
-import com.android.settings.biometrics.fingerprint2.shared.model.FingerEnrollState
+import com.android.settings.biometrics.fingerprint2.lib.model.FingerEnrollState
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintAction
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintEnrollEnrollingViewModel
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintNavigationStep.Enrollment
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintNavigationViewModel
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.SharingStarted
import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.flow.filterIsInstance
+import kotlinx.coroutines.flow.filterNotNull
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.flow.shareIn
import kotlinx.coroutines.flow.transform
@@ -34,9 +38,10 @@
/** View Model used by the rear fingerprint enrollment fragment. */
class RFPSViewModel(
private val fingerprintEnrollViewModel: FingerprintEnrollEnrollingViewModel,
+ private val navigationViewModel: FingerprintNavigationViewModel,
) : ViewModel() {
- /** Value to indicate if the text view is visible or not **/
+ /** Value to indicate if the text view is visible or not */
private val _textViewIsVisible = MutableStateFlow<Boolean>(false)
val textViewIsVisible: Flow<Boolean> = _textViewIsVisible.asStateFlow()
@@ -61,9 +66,8 @@
val helpMessage: Flow<FingerEnrollState.EnrollHelp?> =
enrollFlow
.filterIsInstance<FingerEnrollState.EnrollHelp>()
- .shareIn(viewModelScope, SharingStarted.Eagerly, 0).transform {
- _textViewIsVisible.update { true }
- }
+ .shareIn(viewModelScope, SharingStarted.Eagerly, 0)
+ .transform { _textViewIsVisible.update { true } }
/**
* The error message should only be shown once, for scenarios like screen rotations, we don't want
@@ -74,6 +78,8 @@
.filterIsInstance<FingerEnrollState.EnrollError>()
.shareIn(viewModelScope, SharingStarted.Eagerly, 0)
+ val didCompleteEnrollment: Flow<Boolean> = progress.filterNotNull().map { it.remainingSteps == 0 }
+
/** Indicates if the consumer is ready for enrollment */
fun readyForEnrollment() {
fingerprintEnrollViewModel.canEnroll()
@@ -88,15 +94,51 @@
_textViewIsVisible.update { isVisible }
}
+ /** Indicates that the user is done with trying to enroll a fingerprint */
+ fun userClickedStopEnrollDialog() {
+ navigationViewModel.update(
+ FingerprintAction.USER_CLICKED_FINISH,
+ navStep,
+ "${TAG}#userClickedStopEnrollingDialog",
+ )
+ }
+
+ /** Indicates that the application went to the background. */
+ fun didGoToBackground() {
+ navigationViewModel.update(
+ FingerprintAction.DID_GO_TO_BACKGROUND,
+ navStep,
+ "${TAG}#didGoToBackground",
+ )
+ stopEnrollment()
+ }
+
+ /** Indicates the negative button has been clicked */
+ fun negativeButtonClicked() {
+ navigationViewModel.update(
+ FingerprintAction.NEGATIVE_BUTTON_PRESSED,
+ navStep,
+ "${TAG}negativeButtonClicked",
+ )
+ }
+
+ fun finishedSuccessfully() {
+ navigationViewModel.update(FingerprintAction.NEXT, navStep, "${TAG}#progressFinished")
+ }
+
class RFPSViewModelFactory(
private val fingerprintEnrollEnrollingViewModel: FingerprintEnrollEnrollingViewModel,
+ private val navigationViewModel: FingerprintNavigationViewModel,
) : ViewModelProvider.Factory {
@Suppress("UNCHECKED_CAST")
- override fun <T : ViewModel> create(
- modelClass: Class<T>,
- ): T {
- return RFPSViewModel(fingerprintEnrollEnrollingViewModel) as T
+ override fun <T : ViewModel> create(modelClass: Class<T>): T {
+ return RFPSViewModel(fingerprintEnrollEnrollingViewModel, navigationViewModel) as T
}
}
+
+ companion object {
+ private val navStep = Enrollment::class
+ private const val TAG = "RFPSViewModel"
+ }
}
diff --git a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/modules/enrolling/rfps/ui/widget/FingerprintErrorDialog.kt b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/modules/enrolling/rfps/ui/widget/FingerprintErrorDialog.kt
index b9c628e..9c0040b 100644
--- a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/modules/enrolling/rfps/ui/widget/FingerprintErrorDialog.kt
+++ b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/modules/enrolling/rfps/ui/widget/FingerprintErrorDialog.kt
@@ -24,7 +24,7 @@
import android.util.Log
import androidx.fragment.app.Fragment
import com.android.settings.R
-import com.android.settings.biometrics.fingerprint2.shared.model.FingerEnrollState
+import com.android.settings.biometrics.fingerprint2.lib.model.FingerEnrollState
import com.android.settings.core.instrumentation.InstrumentedDialogFragment
import kotlin.coroutines.resume
import kotlinx.coroutines.suspendCancellableCoroutine
@@ -86,39 +86,28 @@
private const val KEY_TITLE = "fingerprint_title"
private const val KEY_SHOULD_TRY_AGAIN = "should_try_again"
- suspend fun showInstance(
- error: FingerEnrollState.EnrollError,
- fragment: Fragment,
- ) = suspendCancellableCoroutine { continuation ->
- val dialog = FingerprintErrorDialog()
- dialog.onTryAgain = DialogInterface.OnClickListener { _, _ -> continuation.resume(true) }
+ suspend fun showInstance(error: FingerEnrollState.EnrollError, fragment: Fragment) =
+ suspendCancellableCoroutine { continuation ->
+ val dialog = FingerprintErrorDialog()
+ dialog.onTryAgain = DialogInterface.OnClickListener { _, _ -> continuation.resume(true) }
- dialog.onContinue = DialogInterface.OnClickListener { _, _ -> continuation.resume(false) }
+ dialog.onContinue = DialogInterface.OnClickListener { _, _ -> continuation.resume(false) }
- dialog.onCancelListener =
- DialogInterface.OnCancelListener {
- Log.d(TAG, "onCancelListener clicked $dialog")
- continuation.resume(null)
- }
+ dialog.onCancelListener =
+ DialogInterface.OnCancelListener {
+ Log.d(TAG, "onCancelListener clicked $dialog")
+ continuation.resume(null)
+ }
- continuation.invokeOnCancellation { Log.d(TAG, "invokeOnCancellation $dialog") }
+ continuation.invokeOnCancellation { Log.d(TAG, "invokeOnCancellation $dialog") }
- val bundle = Bundle()
- bundle.putInt(
- KEY_TITLE,
- error.errTitle,
- )
- bundle.putInt(
- KEY_MESSAGE,
- error.errString,
- )
- bundle.putBoolean(
- KEY_SHOULD_TRY_AGAIN,
- error.shouldRetryEnrollment,
- )
- dialog.arguments = bundle
- Log.d(TAG, "showing dialog $dialog")
- dialog.show(fragment.parentFragmentManager, FingerprintErrorDialog::class.java.toString())
- }
+ val bundle = Bundle()
+ bundle.putInt(KEY_TITLE, error.errTitle)
+ bundle.putInt(KEY_MESSAGE, error.errString)
+ bundle.putBoolean(KEY_SHOULD_TRY_AGAIN, error.shouldRetryEnrollment)
+ dialog.arguments = bundle
+ Log.d(TAG, "showing dialog $dialog")
+ dialog.show(fragment.parentFragmentManager, FingerprintErrorDialog::class.java.toString())
+ }
}
}
diff --git a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/AccessibilityViewModel.kt b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/AccessibilityViewModel.kt
index a86ad5d..608b370 100644
--- a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/AccessibilityViewModel.kt
+++ b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/AccessibilityViewModel.kt
@@ -41,15 +41,13 @@
.stateIn(
viewModelScope, // This is going to tied to the view model scope
SharingStarted.WhileSubscribed(), // When no longer subscribed, we removeTheListener
- false
+ false,
)
class AccessibilityViewModelFactory(private val accessibilityManager: AccessibilityManager) :
ViewModelProvider.Factory {
@Suppress("UNCHECKED_CAST")
- override fun <T : ViewModel> create(
- modelClass: Class<T>,
- ): T {
+ override fun <T : ViewModel> create(modelClass: Class<T>): T {
return AccessibilityViewModel(accessibilityManager) as T
}
}
diff --git a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/FingerprintEnrollEnrollingViewModel.kt b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/FingerprintEnrollEnrollingViewModel.kt
index 7ab315e..63182bb 100644
--- a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/FingerprintEnrollEnrollingViewModel.kt
+++ b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/FingerprintEnrollEnrollingViewModel.kt
@@ -25,8 +25,8 @@
import kotlinx.coroutines.flow.update
/**
- * This class is a wrapper around the [FingerprintEnrollViewModel] and decides when
- * the user should or should not be enrolling.
+ * This class is a wrapper around the [FingerprintEnrollViewModel] and decides when the user should
+ * or should not be enrolling.
*/
class FingerprintEnrollEnrollingViewModel(
private val fingerprintEnrollViewModel: FingerprintEnrollViewModel,
@@ -72,12 +72,10 @@
class FingerprintEnrollEnrollingViewModelFactory(
private val fingerprintEnrollViewModel: FingerprintEnrollViewModel,
- private val backgroundViewModel: BackgroundViewModel
+ private val backgroundViewModel: BackgroundViewModel,
) : ViewModelProvider.Factory {
@Suppress("UNCHECKED_CAST")
- override fun <T : ViewModel> create(
- modelClass: Class<T>,
- ): T {
+ override fun <T : ViewModel> create(modelClass: Class<T>): T {
return FingerprintEnrollEnrollingViewModel(fingerprintEnrollViewModel, backgroundViewModel)
as T
}
diff --git a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/FingerprintEnrollFindSensorViewModel.kt b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/FingerprintEnrollFindSensorViewModel.kt
index 7722a46..92261b1 100644
--- a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/FingerprintEnrollFindSensorViewModel.kt
+++ b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/FingerprintEnrollFindSensorViewModel.kt
@@ -19,8 +19,10 @@
import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.viewModelScope
-import com.android.settings.biometrics.fingerprint2.shared.model.FingerEnrollState
-import com.android.settings.biometrics.fingerprint2.shared.model.SetupWizard
+import com.android.settings.biometrics.fingerprint2.lib.model.FingerEnrollState
+import com.android.settings.biometrics.fingerprint2.lib.model.SetupWizard
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.fragment.FingerprintEnrollFindSensorV2Fragment
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintNavigationStep.Education
import com.android.systemui.biometrics.shared.model.FingerprintSensorType
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableStateFlow
@@ -36,20 +38,22 @@
/** Models the UI state for [FingerprintEnrollFindSensorV2Fragment]. */
class FingerprintEnrollFindSensorViewModel(
- private val navigationViewModel: FingerprintEnrollNavigationViewModel,
+ private val navigationViewModel: FingerprintNavigationViewModel,
private val fingerprintEnrollViewModel: FingerprintEnrollViewModel,
private val gatekeeperViewModel: FingerprintGatekeeperViewModel,
backgroundViewModel: BackgroundViewModel,
accessibilityViewModel: AccessibilityViewModel,
foldStateViewModel: FoldStateViewModel,
- orientationStateViewModel: OrientationStateViewModel
+ orientationStateViewModel: OrientationStateViewModel,
+ fingerprintFlowViewModel: FingerprintFlowViewModel,
) : ViewModel() {
+
/** Represents the stream of sensor type. */
val sensorType: Flow<FingerprintSensorType> =
fingerprintEnrollViewModel.sensorType.shareIn(
viewModelScope,
SharingStarted.WhileSubscribed(),
- 1
+ 1,
)
private val _isUdfps: Flow<Boolean> =
sensorType.map {
@@ -103,10 +107,10 @@
fingerprintEnrollViewModel.sensorType,
gatekeeperViewModel.hasValidGatekeeperInfo,
gatekeeperViewModel.gatekeeperInfo,
- navigationViewModel.navigationViewModel
- ) { sensorType, hasValidGatekeeperInfo, gatekeeperInfo, navigationViewModel ->
+ navigationViewModel.currentScreen,
+ ) { sensorType, hasValidGatekeeperInfo, gatekeeperInfo, currStep ->
val shouldStartEnroll =
- navigationViewModel.currStep == Education &&
+ currStep is Education &&
sensorType != FingerprintSensorType.UDFPS_OPTICAL &&
sensorType != FingerprintSensorType.UDFPS_ULTRASONIC &&
hasValidGatekeeperInfo
@@ -128,22 +132,19 @@
// Only collect the flow when we should be running.
if (it) {
combine(
- navigationViewModel.fingerprintFlow,
fingerprintEnrollViewModel.educationEnrollFlow.filterNotNull(),
- ) { enrollType, educationFlow ->
- Pair(enrollType, educationFlow)
+ fingerprintFlowViewModel.fingerprintFlow,
+ ) { educationFlow, type ->
+ Pair(educationFlow, type)
}
- .collect { (enrollType, educationFlow) ->
+ .collect { (educationFlow, type) ->
when (educationFlow) {
- // TODO: Cancel the enroll() when EnrollProgress is received instead of proceeding
- // to
- // Enrolling page. Otherwise Enrolling page will receive the EnrollError.
is FingerEnrollState.EnrollProgress -> proceedToEnrolling()
is FingerEnrollState.EnrollError -> {
if (educationFlow.isCancelled) {
proceedToEnrolling()
} else {
- _showErrorDialog.update { Pair(educationFlow.errString, enrollType == SetupWizard) }
+ _showErrorDialog.update { Pair(educationFlow.errString, type == SetupWizard) }
}
}
is FingerEnrollState.EnrollHelp -> {}
@@ -169,17 +170,28 @@
/** Proceed to EnrollEnrolling page. */
fun proceedToEnrolling() {
- navigationViewModel.nextStep()
+ stopEducation()
+ navigationViewModel.update(FingerprintAction.NEXT, navStep, "$TAG#proceedToEnrolling")
+ }
+
+ /** Indicates the secondary button has been clicked */
+ fun secondaryButtonClicked() {
+ navigationViewModel.update(
+ FingerprintAction.NEGATIVE_BUTTON_PRESSED,
+ navStep,
+ "${TAG}#secondaryButtonClicked",
+ )
}
class FingerprintEnrollFindSensorViewModelFactory(
- private val navigationViewModel: FingerprintEnrollNavigationViewModel,
+ private val navigationViewModel: FingerprintNavigationViewModel,
private val fingerprintEnrollViewModel: FingerprintEnrollViewModel,
private val gatekeeperViewModel: FingerprintGatekeeperViewModel,
private val backgroundViewModel: BackgroundViewModel,
private val accessibilityViewModel: AccessibilityViewModel,
private val foldStateViewModel: FoldStateViewModel,
- private val orientationStateViewModel: OrientationStateViewModel
+ private val orientationStateViewModel: OrientationStateViewModel,
+ private val fingerprintFlowViewModel: FingerprintFlowViewModel,
) : ViewModelProvider.Factory {
@Suppress("UNCHECKED_CAST")
override fun <T : ViewModel> create(modelClass: Class<T>): T {
@@ -190,9 +202,15 @@
backgroundViewModel,
accessibilityViewModel,
foldStateViewModel,
- orientationStateViewModel
+ orientationStateViewModel,
+ fingerprintFlowViewModel,
)
as T
}
}
+
+ companion object {
+ private const val TAG = "FingerprintEnrollFindSensorViewModel"
+ private val navStep = Education::class
+ }
}
diff --git a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/FingerprintEnrollIntroViewModel.kt b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/FingerprintEnrollIntroViewModel.kt
new file mode 100644
index 0000000..3bf003c
--- /dev/null
+++ b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/FingerprintEnrollIntroViewModel.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.biometrics.fingerprint2.ui.enrollment.viewmodel
+
+import androidx.lifecycle.ViewModel
+import androidx.lifecycle.ViewModelProvider
+import com.android.settings.biometrics.fingerprint2.lib.domain.interactor.FingerprintManagerInteractor
+import com.android.settings.biometrics.fingerprint2.lib.model.FingerprintFlow
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintNavigationStep.Introduction
+import com.android.systemui.biometrics.shared.model.FingerprintSensor
+import kotlinx.coroutines.flow.Flow
+
+/** A view model for fingerprint enroll introduction. */
+class FingerprintEnrollIntroViewModel(
+ val navigationViewModel: FingerprintNavigationViewModel,
+ private val fingerprintFlowViewModel: FingerprintFlowViewModel,
+ private val fingerprintManagerInteractor: FingerprintManagerInteractor,
+) : ViewModel() {
+
+ /** Represents a stream of [FingerprintSensor] */
+ val sensor: Flow<FingerprintSensor?> = fingerprintManagerInteractor.sensorPropertiesInternal
+
+ /** Represents a stream of [FingerprintFlow] */
+ val fingerprintFlow: Flow<FingerprintFlow?> = fingerprintFlowViewModel.fingerprintFlow
+
+ /** Indicates the primary button has been clicked */
+ fun primaryButtonClicked() {
+ navigationViewModel.update(FingerprintAction.NEXT, navStep, "${TAG}#onNextClicked")
+ }
+
+ /** Indicates the secondary button has been clicked */
+ fun onSecondaryButtonClicked() {
+ navigationViewModel.update(
+ FingerprintAction.NEGATIVE_BUTTON_PRESSED,
+ navStep,
+ "${TAG}#negativeButtonClicked",
+ )
+ }
+
+ class FingerprintEnrollIntoViewModelFactory(
+ val navigationViewModel: FingerprintNavigationViewModel,
+ val fingerprintFlowViewModel: FingerprintFlowViewModel,
+ val fingerprintManagerInteractor: FingerprintManagerInteractor,
+ ) : ViewModelProvider.Factory {
+
+ @Suppress("UNCHECKED_CAST")
+ override fun <T : ViewModel> create(modelClass: Class<T>): T {
+ return FingerprintEnrollIntroViewModel(
+ navigationViewModel,
+ fingerprintFlowViewModel,
+ fingerprintManagerInteractor,
+ )
+ as T
+ }
+ }
+
+ companion object {
+ val navStep = Introduction::class
+ private const val TAG = "FingerprintEnrollIntroViewModel"
+ }
+}
diff --git a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/FingerprintEnrollViewModel.kt b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/FingerprintEnrollViewModel.kt
index c7a1071..c2cff5e 100644
--- a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/FingerprintEnrollViewModel.kt
+++ b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/FingerprintEnrollViewModel.kt
@@ -18,9 +18,11 @@
import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.viewModelScope
-import com.android.settings.biometrics.fingerprint2.shared.domain.interactor.FingerprintManagerInteractor
-import com.android.settings.biometrics.fingerprint2.shared.model.EnrollReason
-import com.android.settings.biometrics.fingerprint2.shared.model.FingerEnrollState
+import com.android.settings.biometrics.fingerprint2.lib.domain.interactor.FingerprintManagerInteractor
+import com.android.settings.biometrics.fingerprint2.lib.model.EnrollReason
+import com.android.settings.biometrics.fingerprint2.lib.model.FingerEnrollState
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintNavigationStep.Education
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintNavigationStep.Enrollment
import com.android.systemui.biometrics.shared.model.FingerprintSensorType
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.SharingStarted
@@ -34,7 +36,7 @@
class FingerprintEnrollViewModel(
private val fingerprintManagerInteractor: FingerprintManagerInteractor,
gatekeeperViewModel: FingerprintGatekeeperViewModel,
- navigationViewModel: FingerprintEnrollNavigationViewModel,
+ val navigationViewModel: FingerprintNavigationViewModel,
) : ViewModel() {
/**
@@ -45,8 +47,8 @@
*/
var sensorTypeCached: FingerprintSensorType? = null
private var _enrollReason: Flow<EnrollReason?> =
- navigationViewModel.navigationViewModel.map {
- when (it.currStep) {
+ navigationViewModel.currentScreen.map {
+ when (it) {
is Enrollment -> EnrollReason.EnrollEnrolling
is Education -> EnrollReason.FindSensor
else -> null
@@ -64,8 +66,7 @@
* This flow should be the only flow which calls enroll().
*/
val _enrollFlow: Flow<FingerEnrollState> =
- combine(gatekeeperViewModel.gatekeeperInfo, _enrollReason) { hardwareAuthToken, enrollReason,
- ->
+ combine(gatekeeperViewModel.gatekeeperInfo, _enrollReason) { hardwareAuthToken, enrollReason ->
Pair(hardwareAuthToken, enrollReason)
}
.transformLatest {
@@ -110,18 +111,11 @@
class FingerprintEnrollViewModelFactory(
val interactor: FingerprintManagerInteractor,
val gatekeeperViewModel: FingerprintGatekeeperViewModel,
- val navigationViewModel: FingerprintEnrollNavigationViewModel,
+ val navigationViewModel: FingerprintNavigationViewModel,
) : ViewModelProvider.Factory {
@Suppress("UNCHECKED_CAST")
- override fun <T : ViewModel> create(
- modelClass: Class<T>,
- ): T {
- return FingerprintEnrollViewModel(
- interactor,
- gatekeeperViewModel,
- navigationViewModel,
- )
- as T
+ override fun <T : ViewModel> create(modelClass: Class<T>): T {
+ return FingerprintEnrollViewModel(interactor, gatekeeperViewModel, navigationViewModel) as T
}
}
}
diff --git a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/FingerprintEnrolllNavigationViewModel.kt b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/FingerprintEnrolllNavigationViewModel.kt
deleted file mode 100644
index 2e5dce0..0000000
--- a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/FingerprintEnrolllNavigationViewModel.kt
+++ /dev/null
@@ -1,141 +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.fingerprint2.ui.enrollment.viewmodel
-
-import android.util.Log
-import androidx.lifecycle.ViewModel
-import androidx.lifecycle.ViewModelProvider
-import androidx.lifecycle.viewModelScope
-import com.android.settings.biometrics.fingerprint2.shared.domain.interactor.FingerprintManagerInteractor
-import com.android.settings.biometrics.fingerprint2.shared.model.FingerprintFlow
-import kotlinx.coroutines.CoroutineDispatcher
-import kotlinx.coroutines.flow.Flow
-import kotlinx.coroutines.flow.MutableStateFlow
-import kotlinx.coroutines.flow.SharingStarted
-import kotlinx.coroutines.flow.asStateFlow
-import kotlinx.coroutines.flow.filterNotNull
-import kotlinx.coroutines.flow.shareIn
-import kotlinx.coroutines.flow.update
-import kotlinx.coroutines.launch
-
-private const val TAG = "FingerprintEnrollNavigationViewModel"
-
-/**
- * This class is responsible for sending a [NavigationStep] which indicates where the user is in the
- * Fingerprint Enrollment flow
- */
-class FingerprintEnrollNavigationViewModel(
- private val dispatcher: CoroutineDispatcher,
- private val fingerprintManagerInteractor: FingerprintManagerInteractor,
- private val gatekeeperViewModel: FingerprintGatekeeperViewModel,
- private val firstStep: NextStepViewModel,
- private val navState: NavState,
- private val theFingerprintFlow: FingerprintFlow,
-) : ViewModel() {
-
- private class InternalNavigationStep(
- lastStep: NextStepViewModel,
- nextStep: NextStepViewModel,
- forward: Boolean,
- var canNavigate: Boolean,
- ) : NavigationStep(lastStep, nextStep, forward)
-
- private var _fingerprintFlow = MutableStateFlow<FingerprintFlow?>(theFingerprintFlow)
-
- /** A flow that indicates the [FingerprintFlow] */
- val fingerprintFlow: Flow<FingerprintFlow?> = _fingerprintFlow.asStateFlow()
-
- private val _navigationStep =
- MutableStateFlow(
- InternalNavigationStep(PlaceHolderState, firstStep, forward = false, canNavigate = true)
- )
-
- init {
- viewModelScope.launch {
- gatekeeperViewModel.credentialConfirmed.filterNotNull().collect {
- if (_navigationStep.value.currStep is LaunchConfirmDeviceCredential) {
- if (it) nextStep() else finish()
- }
- }
- }
- }
-
- /**
- * A flow that contains the [NavigationStep] used to indicate where in the enrollment process the
- * user is.
- */
- val navigationViewModel: Flow<NavigationStep> = _navigationStep.asStateFlow()
-
- /** This action indicates that the UI should actually update the navigation to the given step. */
- val navigationAction: Flow<NavigationStep?> =
- _navigationStep.shareIn(viewModelScope, SharingStarted.Lazily, 0)
-
- /** Used to start the next step of Fingerprint Enrollment. */
- fun nextStep() {
- viewModelScope.launch {
- val currStep = _navigationStep.value.currStep
- val nextStep = currStep.next(navState)
- Log.d(TAG, "nextStep(${currStep} -> $nextStep)")
- _navigationStep.update {
- InternalNavigationStep(currStep, nextStep, forward = true, canNavigate = false)
- }
- }
- }
-
- /** Go back a step of fingerprint enrollment. */
- fun prevStep() {
- viewModelScope.launch {
- val currStep = _navigationStep.value.currStep
- val nextStep = currStep.prev(navState)
- _navigationStep.update {
- InternalNavigationStep(currStep, nextStep, forward = false, canNavigate = false)
- }
- }
- }
-
- private fun finish() {
- _navigationStep.update {
- InternalNavigationStep(Finish(null), Finish(null), forward = false, canNavigate = false)
- }
- }
-
- class FingerprintEnrollNavigationViewModelFactory(
- private val backgroundDispatcher: CoroutineDispatcher,
- private val fingerprintManagerInteractor: FingerprintManagerInteractor,
- private val fingerprintGatekeeperViewModel: FingerprintGatekeeperViewModel,
- private val canSkipConfirm: Boolean,
- private val fingerprintFlow: FingerprintFlow,
- ) : ViewModelProvider.Factory {
-
- @Suppress("UNCHECKED_CAST")
- override fun <T : ViewModel> create(
- modelClass: Class<T>,
- ): T {
-
- val navState = NavState(canSkipConfirm)
- return FingerprintEnrollNavigationViewModel(
- backgroundDispatcher,
- fingerprintManagerInteractor,
- fingerprintGatekeeperViewModel,
- Start.next(navState),
- navState,
- fingerprintFlow,
- )
- as T
- }
- }
-}
diff --git a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/FingerprintFlowViewModel.kt b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/FingerprintFlowViewModel.kt
new file mode 100644
index 0000000..f076524
--- /dev/null
+++ b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/FingerprintFlowViewModel.kt
@@ -0,0 +1,39 @@
+/*
+ * Copyright (C) 2024 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.fingerprint2.ui.enrollment.viewmodel
+
+import androidx.lifecycle.ViewModel
+import androidx.lifecycle.ViewModelProvider
+import androidx.lifecycle.viewModelScope
+import com.android.settings.biometrics.fingerprint2.lib.model.FingerprintFlow
+import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.SharingStarted
+import kotlinx.coroutines.flow.flowOf
+import kotlinx.coroutines.flow.shareIn
+
+class FingerprintFlowViewModel(private val fingerprintFlowType: FingerprintFlow) : ViewModel() {
+ val fingerprintFlow: Flow<FingerprintFlow> =
+ flowOf(fingerprintFlowType).shareIn(viewModelScope, SharingStarted.Eagerly, 1)
+
+ class FingerprintFlowViewModelFactory(val flowType: FingerprintFlow) : ViewModelProvider.Factory {
+
+ @Suppress("UNCHECKED_CAST")
+ override fun <T : ViewModel> create(modelClass: Class<T>): T {
+ return FingerprintFlowViewModel(flowType) as T
+ }
+ }
+}
diff --git a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/FingerprintGatekeeperViewModel.kt b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/FingerprintGatekeeperViewModel.kt
index db93d02..322be6a 100644
--- a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/FingerprintGatekeeperViewModel.kt
+++ b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/FingerprintGatekeeperViewModel.kt
@@ -21,7 +21,7 @@
import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.viewModelScope
-import com.android.settings.biometrics.fingerprint2.shared.domain.interactor.FingerprintManagerInteractor
+import com.android.settings.biometrics.fingerprint2.lib.domain.interactor.FingerprintManagerInteractor
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.asStateFlow
@@ -29,11 +29,11 @@
import kotlinx.coroutines.flow.update
import kotlinx.coroutines.launch
-private const val TAG = "FingerprintGatekeeperViewModel"
-
sealed interface GatekeeperInfo {
object Invalid : GatekeeperInfo
+
object Timeout : GatekeeperInfo
+
data class GatekeeperPasswordInfo(val token: ByteArray?, val passwordHandle: Long?) :
GatekeeperInfo
}
@@ -97,7 +97,19 @@
}
}
+ class FingerprintGatekeeperViewModelFactory(
+ private val gatekeeperInfo: GatekeeperInfo?,
+ private val fingerprintManagerInteractor: FingerprintManagerInteractor,
+ ) : ViewModelProvider.Factory {
+
+ @Suppress("UNCHECKED_CAST")
+ override fun <T : ViewModel> create(modelClass: Class<T>): T {
+ return FingerprintGatekeeperViewModel(gatekeeperInfo, fingerprintManagerInteractor) as T
+ }
+ }
+
companion object {
+ private const val TAG = "FingerprintGatekeeperViewModel"
/**
* A function that checks if the challenge and token are valid, in which case a
* [GatekeeperInfo.GatekeeperPasswordInfo] is provided, else [GatekeeperInfo.Invalid]
@@ -110,17 +122,4 @@
return GatekeeperInfo.GatekeeperPasswordInfo(token, challenge)
}
}
-
- class FingerprintGatekeeperViewModelFactory(
- private val gatekeeperInfo: GatekeeperInfo?,
- private val fingerprintManagerInteractor: FingerprintManagerInteractor,
- ) : ViewModelProvider.Factory {
-
- @Suppress("UNCHECKED_CAST")
- override fun <T : ViewModel> create(
- modelClass: Class<T>,
- ): T {
- return FingerprintGatekeeperViewModel(gatekeeperInfo, fingerprintManagerInteractor) as T
- }
- }
}
diff --git a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/FingerprintNavigationStep.kt b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/FingerprintNavigationStep.kt
new file mode 100644
index 0000000..979f953
--- /dev/null
+++ b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/FingerprintNavigationStep.kt
@@ -0,0 +1,186 @@
+/*
+ * 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.fingerprint2.ui.enrollment.viewmodel
+
+import com.android.settings.biometrics.fingerprint2.lib.model.FastEnroll
+import com.android.settings.biometrics.fingerprint2.lib.model.FingerprintFlow
+import com.android.systemui.biometrics.shared.model.FingerprintSensor
+
+/**
+ * A [FingerprintAction] event notifies the current [FingerprintNavigationStep] that an event
+ * occurred. Depending on the type of [FingerprintAction] and the current
+ * [FingerprintNavigationStep], the navstep will potentially produce a new
+ * [FingerprintNavigationStep] indicating either 1). Control flow has changed 2). The activity has
+ * finished 3). A transition is required
+ */
+enum class FingerprintAction {
+ NEXT,
+ PREV,
+ CONFIRM_DEVICE_SUCCESS,
+ CONFIRM_DEVICE_FAIL,
+ TRANSITION_FINISHED,
+ DID_GO_TO_BACKGROUND,
+ ACTIVITY_CREATED,
+ NEGATIVE_BUTTON_PRESSED,
+ USER_CLICKED_FINISH,
+}
+
+/** State that can be used to help a [FingerprintNavigationStep] determine the next step to take. */
+data class NavigationState(
+ val flowType: FingerprintFlow,
+ val hasConfirmedDeviceCredential: Boolean,
+ val fingerprintSensor: FingerprintSensor?,
+)
+
+/**
+ * A generic interface for operating on (state, action) -> state? which will produce either another
+ * FingerprintNavStep if something is required, or nothing.
+ *
+ * Note during the lifetime of the Activity, their should only be one [FingerprintNavigationStep] at
+ * a time.
+ */
+sealed interface FingerprintNavigationStep {
+ fun update(state: NavigationState, action: FingerprintAction): FingerprintNavigationStep?
+
+ /**
+ * This indicates that a transition should occur from one screen to another. This class should
+ * contain all necessary info about the transition.
+ *
+ * A transition step will cause a screen to change ownership from the current screen to the
+ * [nextUiStep], after the transition has been completed and a
+ * [FingerprintAction.TRANSITION_FINISHED] has been sent, the [nextUiStep] will be given control.
+ */
+ class TransitionStep(val nextUiStep: UiStep) : FingerprintNavigationStep {
+ override fun update(
+ state: NavigationState,
+ action: FingerprintAction,
+ ): FingerprintNavigationStep? {
+ return when (action) {
+ FingerprintAction.TRANSITION_FINISHED -> nextUiStep
+ else -> null
+ }
+ }
+
+ override fun toString(): String = "TransitionStep(nextUiStep=$nextUiStep)"
+ }
+
+ /** Indicates we should finish the enrolling activity */
+ data class Finish(val result: Int?) : FingerprintNavigationStep {
+ override fun update(
+ state: NavigationState,
+ action: FingerprintAction,
+ ): FingerprintNavigationStep? = null
+ }
+
+ /** UiSteps should have a 1 to 1 mapping between each screen of FingerprintEnrollment */
+ sealed class UiStep : FingerprintNavigationStep
+
+ /** This is the landing page for enrollment, where no content is shown. */
+ data object Init : UiStep() {
+ override fun update(
+ state: NavigationState,
+ action: FingerprintAction,
+ ): FingerprintNavigationStep? {
+ return when (action) {
+ FingerprintAction.ACTIVITY_CREATED -> {
+ if (!state.hasConfirmedDeviceCredential) {
+ TransitionStep(ConfirmDeviceCredential)
+ } else if (state.flowType is FastEnroll) {
+ TransitionStep(Enrollment(state.fingerprintSensor!!))
+ } else {
+ TransitionStep(Introduction)
+ }
+ }
+ else -> null
+ }
+ }
+ }
+
+ /** Indicates the ConfirmDeviceCredential activity is being presented to the user */
+ data object ConfirmDeviceCredential : UiStep() {
+ override fun update(
+ state: NavigationState,
+ action: FingerprintAction,
+ ): FingerprintNavigationStep? {
+ return when (action) {
+ FingerprintAction.CONFIRM_DEVICE_SUCCESS -> TransitionStep(Introduction)
+ FingerprintAction.CONFIRM_DEVICE_FAIL -> Finish(null)
+ else -> null
+ }
+ }
+ }
+
+ /** Indicates the FingerprintIntroduction screen is being presented to the user */
+ data object Introduction : UiStep() {
+ override fun update(
+ state: NavigationState,
+ action: FingerprintAction,
+ ): FingerprintNavigationStep? {
+ return when (action) {
+ FingerprintAction.NEXT -> TransitionStep(Education(state.fingerprintSensor!!))
+ FingerprintAction.NEGATIVE_BUTTON_PRESSED,
+ FingerprintAction.PREV -> Finish(null)
+ else -> null
+ }
+ }
+ }
+
+ /** Indicates the FingerprintEducation screen is being presented to the user */
+ data class Education(val sensor: FingerprintSensor) : UiStep() {
+ override fun update(
+ state: NavigationState,
+ action: FingerprintAction,
+ ): FingerprintNavigationStep? {
+ return when (action) {
+ FingerprintAction.NEXT -> TransitionStep(Enrollment(state.fingerprintSensor!!))
+ FingerprintAction.NEGATIVE_BUTTON_PRESSED,
+ FingerprintAction.PREV -> TransitionStep(Introduction)
+ else -> null
+ }
+ }
+ }
+
+ /** Indicates the Enrollment screen is being presented to the user */
+ data class Enrollment(val sensor: FingerprintSensor) : UiStep() {
+ override fun update(
+ state: NavigationState,
+ action: FingerprintAction,
+ ): FingerprintNavigationStep? {
+ return when (action) {
+ FingerprintAction.NEXT -> TransitionStep(Confirmation)
+ FingerprintAction.NEGATIVE_BUTTON_PRESSED,
+ FingerprintAction.USER_CLICKED_FINISH,
+ FingerprintAction.DID_GO_TO_BACKGROUND -> Finish(null)
+ else -> null
+ }
+ }
+ }
+
+ /** Indicates the Confirmation screen is being presented to the user */
+ data object Confirmation : UiStep() {
+ override fun update(
+ state: NavigationState,
+ action: FingerprintAction,
+ ): FingerprintNavigationStep? {
+ return when (action) {
+ FingerprintAction.NEXT -> Finish(null)
+ FingerprintAction.PREV -> TransitionStep(Education(state.fingerprintSensor!!))
+ else -> null
+ }
+ }
+ }
+}
diff --git a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/FingerprintNavigationViewModel.kt b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/FingerprintNavigationViewModel.kt
new file mode 100644
index 0000000..26c20cf
--- /dev/null
+++ b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/FingerprintNavigationViewModel.kt
@@ -0,0 +1,147 @@
+/*
+ * 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.fingerprint2.ui.enrollment.viewmodel
+
+import android.util.Log
+import androidx.lifecycle.ViewModel
+import androidx.lifecycle.ViewModelProvider
+import androidx.lifecycle.viewModelScope
+import com.android.settings.biometrics.fingerprint2.lib.domain.interactor.FingerprintManagerInteractor
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintNavigationStep.Finish
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintNavigationStep.TransitionStep
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintNavigationStep.UiStep
+import java.lang.NullPointerException
+import kotlin.reflect.KClass
+import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.MutableStateFlow
+import kotlinx.coroutines.flow.asStateFlow
+import kotlinx.coroutines.flow.combineTransform
+import kotlinx.coroutines.flow.filterNotNull
+import kotlinx.coroutines.flow.update
+import kotlinx.coroutines.launch
+
+/**
+ * This class is essentially a wrapper around [FingerprintNavigationStep] that will be used by
+ * fragments/viewmodels that want to consume these events. It should provide no additional
+ * functionality beyond what is available in [FingerprintNavigationStep].
+ */
+class FingerprintNavigationViewModel(
+ step: UiStep,
+ hasConfirmedDeviceCredential: Boolean,
+ flowViewModel: FingerprintFlowViewModel,
+ fingerprintManagerInteractor: FingerprintManagerInteractor,
+) : ViewModel() {
+
+ private var _navStateInternal: MutableStateFlow<NavigationState?> = MutableStateFlow(null)
+
+ init {
+ viewModelScope.launch {
+ flowViewModel.fingerprintFlow
+ .combineTransform(fingerprintManagerInteractor.sensorPropertiesInternal) { flow, props ->
+ if (props?.sensorId != -1) {
+ emit(NavigationState(flow, hasConfirmedDeviceCredential, props))
+ }
+ }
+ .collect { navState -> _navStateInternal.update { navState } }
+ }
+ }
+
+ private var _currentStep = MutableStateFlow<FingerprintNavigationStep?>(step)
+
+ private var _navigateTo: MutableStateFlow<UiStep?> = MutableStateFlow(null)
+ val navigateTo: Flow<UiStep?> = _navigateTo.asStateFlow()
+
+ /**
+ * This indicates a navigation event should occur. Navigation depends on navStateInternal being
+ * present.
+ */
+ val currentStep: Flow<FingerprintNavigationStep> =
+ _currentStep.filterNotNull().combineTransform(_navStateInternal.filterNotNull()) { navigation, _
+ ->
+ emit(navigation)
+ }
+
+ private var _finishState = MutableStateFlow<Finish?>(null)
+
+ /** This indicates the activity should finish. */
+ val shouldFinish: Flow<Finish?> = _finishState.asStateFlow()
+
+ private var _currentScreen = MutableStateFlow<UiStep?>(null)
+
+ /** This indicates what screen should currently be presenting to the user. */
+ val currentScreen: Flow<UiStep?> = _currentScreen.asStateFlow()
+
+ /** See [updateInternal] for more details */
+ fun update(action: FingerprintAction, caller: KClass<*>, debugStr: String) {
+ Log.d(TAG, "$caller.update($action) $debugStr")
+ val currentStep = _currentStep.value
+ val isUiStep = currentStep is UiStep
+ if (currentStep == null) {
+ throw NullPointerException("current step is null")
+ }
+ if (isUiStep && currentStep::class != caller) {
+ throw IllegalAccessError(
+ "Error $currentStep != $caller, $caller should not be sending any events at this time"
+ )
+ }
+ val navState = _navStateInternal.value
+ if (navState == null) {
+ throw NullPointerException("nav state is null")
+ }
+ val nextStep = currentStep.update(navState, action) ?: return
+ Log.d(TAG, "nextStep=$nextStep")
+ // Whenever an state update occurs, everything should be cleared.
+ _currentStep.update { nextStep }
+ _finishState.update { null }
+ _currentScreen.update { null }
+
+ when (nextStep) {
+ is TransitionStep -> {
+ _navigateTo.update { nextStep.nextUiStep }
+ }
+ is Finish -> {
+ _finishState.update { nextStep }
+ }
+ is UiStep -> {
+ _currentScreen.update { nextStep }
+ }
+ }
+ }
+
+ class FingerprintNavigationViewModelFactory(
+ private val step: UiStep,
+ private val hasConfirmedDeviceCredential: Boolean,
+ private val flowViewModel: FingerprintFlowViewModel,
+ private val fingerprintManagerInteractor: FingerprintManagerInteractor,
+ ) : ViewModelProvider.Factory {
+
+ @Suppress("UNCHECKED_CAST")
+ override fun <T : ViewModel> create(modelClass: Class<T>): T {
+ return FingerprintNavigationViewModel(
+ step,
+ hasConfirmedDeviceCredential,
+ flowViewModel,
+ fingerprintManagerInteractor,
+ )
+ as T
+ }
+ }
+
+ companion object {
+ private const val TAG = "FingerprintNavigationViewModel"
+ }
+}
diff --git a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/FingerprintScrollViewModel.kt b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/FingerprintScrollViewModel.kt
index 989d4d3..bc9703d 100644
--- a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/FingerprintScrollViewModel.kt
+++ b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/FingerprintScrollViewModel.kt
@@ -39,9 +39,7 @@
class FingerprintScrollViewModelFactory : ViewModelProvider.Factory {
@Suppress("UNCHECKED_CAST")
- override fun <T : ViewModel> create(
- modelClass: Class<T>,
- ): T {
+ override fun <T : ViewModel> create(modelClass: Class<T>): T {
return FingerprintScrollViewModel() as T
}
}
diff --git a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/FoldStateViewModel.kt b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/FoldStateViewModel.kt
index a4c7ff2..94a70b0 100644
--- a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/FoldStateViewModel.kt
+++ b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/FoldStateViewModel.kt
@@ -49,9 +49,7 @@
class FoldStateViewModelFactory(private val context: Context) : ViewModelProvider.Factory {
@Suppress("UNCHECKED_CAST")
- override fun <T : ViewModel> create(
- modelClass: Class<T>,
- ): T {
+ override fun <T : ViewModel> create(modelClass: Class<T>): T {
return FoldStateViewModel(context) as T
}
}
diff --git a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/NextStepViewModel.kt b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/NextStepViewModel.kt
deleted file mode 100644
index b68f6d6..0000000
--- a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/NextStepViewModel.kt
+++ /dev/null
@@ -1,104 +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.fingerprint2.ui.enrollment.viewmodel
-
-/**
- * A class that represents an action that the consumer should transition between lastStep and
- * currStep and in what direction this transition is occurring (e.g. forward or backwards)
- */
-open class NavigationStep(
- val lastStep: NextStepViewModel,
- val currStep: NextStepViewModel,
- val forward: Boolean
-) {
- override fun toString(): String {
- return "lastStep=$lastStep, currStep=$currStep, forward=$forward"
- }
-}
-
-/** The navigation state used by a [NavStep] to determine what the [NextStepViewModel] should be. */
-class NavState(val confirmedDevice: Boolean)
-
-interface NavStep<T> {
- fun next(state: NavState): T
- fun prev(state: NavState): T
-}
-
-/**
- * A class to represent a high level step (I.E. EnrollmentIntroduction) for FingerprintEnrollment.
- */
-sealed class NextStepViewModel : NavStep<NextStepViewModel>
-
-/**
- * This is the initial state for the previous step, used to indicate that there have been no
- * previous states.
- */
-object PlaceHolderState : NextStepViewModel() {
- override fun next(state: NavState): NextStepViewModel = Finish(null)
-
- override fun prev(state: NavState): NextStepViewModel = Finish(null)
-}
-
-/**
- * This state is the initial state for the current step, and will be used to determine if the user
- * needs to [LaunchConfirmDeviceCredential] if not, it will go to [Intro]
- */
-data object Start : NextStepViewModel() {
- override fun next(state: NavState): NextStepViewModel =
- if (state.confirmedDevice) Intro else LaunchConfirmDeviceCredential
-
- override fun prev(state: NavState): NextStepViewModel = Finish(null)
-}
-
-/** State indicating enrollment has been completed */
-class Finish(val resultCode: Int?) : NextStepViewModel() {
- override fun next(state: NavState): NextStepViewModel = Finish(resultCode)
- override fun prev(state: NavState): NextStepViewModel = Finish(null)
-}
-
-/** State for the FingerprintEnrollment introduction */
-data object Intro : NextStepViewModel() {
- override fun next(state: NavState): NextStepViewModel = Education
- override fun prev(state: NavState): NextStepViewModel = Finish(null)
-}
-
-/** State for the FingerprintEnrollment education */
-data object Education : NextStepViewModel() {
- override fun next(state: NavState): NextStepViewModel = Enrollment
- override fun prev(state: NavState): NextStepViewModel = Intro
-}
-
-/** State for the FingerprintEnrollment enrollment */
-data object Enrollment : NextStepViewModel() {
- override fun next(state: NavState): NextStepViewModel = Confirmation
- override fun prev(state: NavState): NextStepViewModel = Education
-}
-
-/** State for the FingerprintEnrollment confirmation */
-object Confirmation : NextStepViewModel() {
- override fun next(state: NavState): NextStepViewModel = Finish(0)
- override fun prev(state: NavState): NextStepViewModel = Intro
-}
-
-/**
- * State used to send the user to the ConfirmDeviceCredential activity. This activity can either
- * confirm a users device credential, or have them create one.
- */
-object LaunchConfirmDeviceCredential : NextStepViewModel() {
- override fun next(state: NavState): NextStepViewModel = Intro
- override fun prev(state: NavState): NextStepViewModel = Finish(0)
-}
diff --git a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/OrientationStateViewModel.kt b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/OrientationStateViewModel.kt
index 2e5f734..dd266e1 100644
--- a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/OrientationStateViewModel.kt
+++ b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/OrientationStateViewModel.kt
@@ -58,7 +58,7 @@
.stateIn(
viewModelScope, // This is going to tied to the view model scope
SharingStarted.WhileSubscribed(), // When no longer subscribed, we removeTheListener
- context.display!!.rotation
+ context.display!!.rotation,
)
fun getRotationFromDefault(rotation: Int): Int {
@@ -73,9 +73,7 @@
class OrientationViewModelFactory(private val context: Context) : ViewModelProvider.Factory {
@Suppress("UNCHECKED_CAST")
- override fun <T : ViewModel> create(
- modelClass: Class<T>,
- ): T {
+ override fun <T : ViewModel> create(modelClass: Class<T>): T {
return OrientationStateViewModel(context) as T
}
}
diff --git a/src/com/android/settings/biometrics/fingerprint2/ui/settings/binder/FingerprintSettingsViewBinder.kt b/src/com/android/settings/biometrics/fingerprint2/ui/settings/binder/FingerprintSettingsViewBinder.kt
index debdfb8..540e5ee 100644
--- a/src/com/android/settings/biometrics/fingerprint2/ui/settings/binder/FingerprintSettingsViewBinder.kt
+++ b/src/com/android/settings/biometrics/fingerprint2/ui/settings/binder/FingerprintSettingsViewBinder.kt
@@ -19,8 +19,8 @@
import android.hardware.fingerprint.FingerprintManager
import android.util.Log
import androidx.lifecycle.LifecycleCoroutineScope
-import com.android.settings.biometrics.fingerprint2.shared.model.FingerprintAuthAttemptModel
-import com.android.settings.biometrics.fingerprint2.shared.model.FingerprintData
+import com.android.settings.biometrics.fingerprint2.lib.model.FingerprintAuthAttemptModel
+import com.android.settings.biometrics.fingerprint2.lib.model.FingerprintData
import com.android.settings.biometrics.fingerprint2.ui.settings.binder.FingerprintSettingsViewBinder.FingerprintView
import com.android.settings.biometrics.fingerprint2.ui.settings.viewmodel.EnrollAdditionalFingerprint
import com.android.settings.biometrics.fingerprint2.ui.settings.viewmodel.EnrollFirstFingerprint
@@ -52,7 +52,7 @@
userId: Int,
gateKeeperPasswordHandle: Long?,
challenge: Long?,
- challengeToken: ByteArray?
+ challengeToken: ByteArray?,
)
/** Helper to launch an add fingerprint request */
fun launchAddFingerprint(userId: Int, challengeToken: ByteArray?)
@@ -158,7 +158,7 @@
nextStep.userId,
nextStep.gateKeeperPasswordHandle,
nextStep.challenge,
- nextStep.challengeToken
+ nextStep.challengeToken,
)
is EnrollAdditionalFingerprint ->
view.launchAddFingerprint(nextStep.userId, nextStep.challengeToken)
diff --git a/src/com/android/settings/biometrics/fingerprint2/ui/settings/fragment/FingerprintDeletionDialog.kt b/src/com/android/settings/biometrics/fingerprint2/ui/settings/fragment/FingerprintDeletionDialog.kt
index 71a22eb..46f64de 100644
--- a/src/com/android/settings/biometrics/fingerprint2/ui/settings/fragment/FingerprintDeletionDialog.kt
+++ b/src/com/android/settings/biometrics/fingerprint2/ui/settings/fragment/FingerprintDeletionDialog.kt
@@ -26,7 +26,7 @@
import android.os.UserManager
import androidx.appcompat.app.AlertDialog
import com.android.settings.R
-import com.android.settings.biometrics.fingerprint2.shared.model.FingerprintData
+import com.android.settings.biometrics.fingerprint2.lib.model.FingerprintData
import com.android.settings.core.instrumentation.InstrumentedDialogFragment
import kotlin.coroutines.resume
import kotlinx.coroutines.suspendCancellableCoroutine
@@ -75,8 +75,7 @@
message =
devicePolicyManager?.resources?.getString(messageId) {
message + "\n\n" + context.getString(defaultMessageId)
- }
- ?: ""
+ } ?: ""
}
alertDialog =
@@ -85,7 +84,7 @@
.setMessage(message)
.setPositiveButton(
R.string.security_settings_fingerprint_enroll_dialog_delete,
- onClickListener
+ onClickListener,
)
.setNegativeButton(R.string.cancel, onNegativeClickListener)
.create()
@@ -94,10 +93,11 @@
companion object {
private const val KEY_FINGERPRINT = "fingerprint"
+
suspend fun showInstance(
- fp: FingerprintData,
- lastFingerprint: Boolean,
- target: FingerprintSettingsV2Fragment,
+ fp: FingerprintData,
+ lastFingerprint: Boolean,
+ target: FingerprintSettingsV2Fragment,
) = suspendCancellableCoroutine { continuation ->
val dialog = FingerprintDeletionDialog()
dialog.onClickListener = DialogInterface.OnClickListener { _, _ -> continuation.resume(true) }
@@ -109,7 +109,7 @@
val bundle = Bundle()
bundle.putObject(
KEY_FINGERPRINT,
- android.hardware.fingerprint.Fingerprint(fp.name, fp.fingerId, fp.deviceId)
+ android.hardware.fingerprint.Fingerprint(fp.name, fp.fingerId, fp.deviceId),
)
bundle.putBoolean(KEY_IS_LAST_FINGERPRINT, lastFingerprint)
dialog.arguments = bundle
diff --git a/src/com/android/settings/biometrics/fingerprint2/ui/settings/fragment/FingerprintSettingsPreference.kt b/src/com/android/settings/biometrics/fingerprint2/ui/settings/fragment/FingerprintSettingsPreference.kt
index ea26946..09dcb81 100644
--- a/src/com/android/settings/biometrics/fingerprint2/ui/settings/fragment/FingerprintSettingsPreference.kt
+++ b/src/com/android/settings/biometrics/fingerprint2/ui/settings/fragment/FingerprintSettingsPreference.kt
@@ -22,7 +22,7 @@
import androidx.lifecycle.lifecycleScope
import androidx.preference.PreferenceViewHolder
import com.android.settings.R
-import com.android.settings.biometrics.fingerprint2.shared.model.FingerprintData
+import com.android.settings.biometrics.fingerprint2.lib.model.FingerprintData
import com.android.settingslib.widget.TwoTargetPreference
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
@@ -30,10 +30,10 @@
private const val TAG = "FingerprintSettingsPreference"
class FingerprintSettingsPreference(
- context: Context,
- val fingerprintViewModel: FingerprintData,
- val fragment: FingerprintSettingsV2Fragment,
- val isLastFingerprint: Boolean
+ context: Context,
+ val fingerprintViewModel: FingerprintData,
+ val fragment: FingerprintSettingsV2Fragment,
+ val isLastFingerprint: Boolean,
) : TwoTargetPreference(context) {
private lateinit var myView: View
diff --git a/src/com/android/settings/biometrics/fingerprint2/ui/settings/fragment/FingerprintSettingsRenameDialog.kt b/src/com/android/settings/biometrics/fingerprint2/ui/settings/fragment/FingerprintSettingsRenameDialog.kt
index ff469f1..9fef0c5 100644
--- a/src/com/android/settings/biometrics/fingerprint2/ui/settings/fragment/FingerprintSettingsRenameDialog.kt
+++ b/src/com/android/settings/biometrics/fingerprint2/ui/settings/fragment/FingerprintSettingsRenameDialog.kt
@@ -27,7 +27,7 @@
import android.widget.ImeAwareEditText
import androidx.appcompat.app.AlertDialog
import com.android.settings.R
-import com.android.settings.biometrics.fingerprint2.shared.model.FingerprintData
+import com.android.settings.biometrics.fingerprint2.lib.model.FingerprintData
import com.android.settings.core.instrumentation.InstrumentedDialogFragment
import kotlin.coroutines.resume
import kotlinx.coroutines.suspendCancellableCoroutine
@@ -78,7 +78,7 @@
end: Int,
dest: Spanned?,
dstart: Int,
- dend: Int
+ dend: Int,
): CharSequence? {
for (index in start until end) {
val c = source[index]
@@ -133,13 +133,13 @@
val bundle = Bundle()
bundle.putObject(
KEY_FINGERPRINT,
- android.hardware.fingerprint.Fingerprint(fp.name, fp.fingerId, fp.deviceId)
+ android.hardware.fingerprint.Fingerprint(fp.name, fp.fingerId, fp.deviceId),
)
dialog.arguments = bundle
Log.d(TAG, "showing dialog $dialog")
dialog.show(
target.parentFragmentManager,
- FingerprintSettingsRenameDialog::class.java.toString()
+ FingerprintSettingsRenameDialog::class.java.toString(),
)
}
}
diff --git a/src/com/android/settings/biometrics/fingerprint2/ui/settings/fragment/FingerprintSettingsV2Fragment.kt b/src/com/android/settings/biometrics/fingerprint2/ui/settings/fragment/FingerprintSettingsV2Fragment.kt
index c22a5a7..05bb329 100644
--- a/src/com/android/settings/biometrics/fingerprint2/ui/settings/fragment/FingerprintSettingsV2Fragment.kt
+++ b/src/com/android/settings/biometrics/fingerprint2/ui/settings/fragment/FingerprintSettingsV2Fragment.kt
@@ -45,11 +45,12 @@
import com.android.settings.biometrics.GatekeeperPasswordProvider
import com.android.settings.biometrics.fingerprint.FingerprintEnrollEnrolling
import com.android.settings.biometrics.fingerprint.FingerprintEnrollIntroductionInternal
+import com.android.settings.biometrics.fingerprint2.data.repository.FingerprintSensorRepoImpl
+import com.android.settings.biometrics.fingerprint2.data.repository.PressToAuthRepoImpl
import com.android.settings.biometrics.fingerprint2.domain.interactor.FingerprintManagerInteractorImpl
-import com.android.settings.biometrics.fingerprint2.repository.PressToAuthProviderImpl
-import com.android.settings.biometrics.fingerprint2.shared.model.FingerprintAuthAttemptModel
-import com.android.settings.biometrics.fingerprint2.shared.model.FingerprintData
-import com.android.settings.biometrics.fingerprint2.shared.model.Settings
+import com.android.settings.biometrics.fingerprint2.lib.model.FingerprintAuthAttemptModel
+import com.android.settings.biometrics.fingerprint2.lib.model.FingerprintData
+import com.android.settings.biometrics.fingerprint2.lib.model.Settings
import com.android.settings.biometrics.fingerprint2.ui.settings.binder.FingerprintSettingsViewBinder
import com.android.settings.biometrics.fingerprint2.ui.settings.viewmodel.FingerprintSettingsNavigationViewModel
import com.android.settings.biometrics.fingerprint2.ui.settings.viewmodel.FingerprintSettingsViewModel
@@ -128,12 +129,12 @@
if (resultCode == BiometricEnrollBase.RESULT_TIMEOUT) {
navigationViewModel.onEnrollFirstFailure(
"Received RESULT_TIMEOUT when enrolling",
- resultCode
+ resultCode,
)
} else {
navigationViewModel.onEnrollFirstFailure(
"Incorrect resultCode or data was null",
- resultCode
+ resultCode,
)
}
} else {
@@ -212,21 +213,24 @@
context.contentResolver,
Secure.SFPS_PERFORMANT_AUTH_ENABLED,
toReturn,
- userHandle
+ userHandle,
)
}
toReturn == 1
}
+ val fingerprintSensorProvider =
+ FingerprintSensorRepoImpl(fingerprintManager, backgroundDispatcher, lifecycleScope)
val interactor =
FingerprintManagerInteractorImpl(
context.applicationContext,
backgroundDispatcher,
fingerprintManager,
+ fingerprintSensorProvider,
GatekeeperPasswordProvider(LockPatternUtils(context.applicationContext)),
- PressToAuthProviderImpl(context),
- isAnySuw
+ PressToAuthRepoImpl(context),
+ Settings,
)
val token = intent.getByteArrayExtra(ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE_TOKEN)
@@ -240,8 +244,8 @@
interactor,
backgroundDispatcher,
token,
- challenge
- )
+ challenge,
+ ),
)[FingerprintSettingsNavigationViewModel::class.java]
settingsViewModel =
@@ -252,15 +256,10 @@
interactor,
backgroundDispatcher,
navigationViewModel,
- )
+ ),
)[FingerprintSettingsViewModel::class.java]
- FingerprintSettingsViewBinder.bind(
- this,
- settingsViewModel,
- navigationViewModel,
- lifecycleScope,
- )
+ FingerprintSettingsViewBinder.bind(this, settingsViewModel, navigationViewModel, lifecycleScope)
}
override fun getMetricsCategory(): Int {
@@ -364,7 +363,7 @@
RestrictedLockUtilsInternal.checkIfKeyguardFeaturesDisabled(
activity,
DevicePolicyManager.KEYGUARD_DISABLE_FINGERPRINT,
- requireActivity().userId
+ requireActivity().userId,
)
val activity = requireActivity()
val helpIntent =
@@ -404,7 +403,7 @@
column.title =
getString(
R.string.security_settings_fingerprint_enroll_introduction_v3_message,
- DeviceHelper.getDeviceName(requireActivity())
+ DeviceHelper.getDeviceName(requireActivity()),
)
column.learnMoreOnClickListener = learnMoreClickListener
column.learnMoreOverrideText =
@@ -437,13 +436,12 @@
val willDelete =
fingerprintPreferences()
.first { it?.fingerprintViewModel == fingerprintViewModel }
- ?.askUserToDeleteDialog()
- ?: false
+ ?.askUserToDeleteDialog() ?: false
if (willDelete) {
mMetricsFeatureProvider.action(
context,
SettingsEnums.ACTION_FINGERPRINT_DELETE,
- fingerprintViewModel.fingerId
+ fingerprintViewModel.fingerId,
)
}
return willDelete
@@ -466,7 +464,7 @@
mMetricsFeatureProvider.action(
context,
SettingsEnums.ACTION_FINGERPRINT_RENAME,
- toReturn.first.fingerId
+ toReturn.first.fingerId,
)
}
return toReturn
@@ -518,12 +516,12 @@
val intent = Intent()
intent.setClassName(
SETTINGS_PACKAGE_NAME,
- FingerprintEnrollIntroductionInternal::class.java.name
+ FingerprintEnrollIntroductionInternal::class.java.name,
)
intent.putExtra(EXTRA_FROM_SETTINGS_SUMMARY, true)
intent.putExtra(
SettingsBaseActivity.EXTRA_PAGE_TRANSITION_TYPE,
- SettingsTransitionHelper.TransitionType.TRANSITION_SLIDE
+ SettingsTransitionHelper.TransitionType.TRANSITION_SLIDE,
)
intent.putExtra(Intent.EXTRA_USER_ID, userId)
@@ -546,7 +544,7 @@
val intent = Intent()
intent.setClassName(
SETTINGS_PACKAGE_NAME,
- FingerprintEnrollEnrolling::class.qualifiedName.toString()
+ FingerprintEnrollEnrolling::class.qualifiedName.toString(),
)
intent.putExtra(Intent.EXTRA_USER_ID, userId)
intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE_TOKEN, challengeToken)
@@ -568,8 +566,7 @@
return category?.let { cat ->
cat.childrenToList().map { it as FingerprintSettingsPreference? }
- }
- ?: emptyList()
+ } ?: emptyList()
}
private fun PreferenceCategory.childrenToList(): List<Preference> {
diff --git a/src/com/android/settings/biometrics/fingerprint2/ui/settings/viewmodel/FingerprintSettingsNavigationViewModel.kt b/src/com/android/settings/biometrics/fingerprint2/ui/settings/viewmodel/FingerprintSettingsNavigationViewModel.kt
index 22a25e1..00b91a8 100644
--- a/src/com/android/settings/biometrics/fingerprint2/ui/settings/viewmodel/FingerprintSettingsNavigationViewModel.kt
+++ b/src/com/android/settings/biometrics/fingerprint2/ui/settings/viewmodel/FingerprintSettingsNavigationViewModel.kt
@@ -21,7 +21,7 @@
import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.viewModelScope
import com.android.settings.biometrics.BiometricEnrollBase
-import com.android.settings.biometrics.fingerprint2.shared.domain.interactor.FingerprintManagerInteractor
+import com.android.settings.biometrics.fingerprint2.lib.domain.interactor.FingerprintManagerInteractor
import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
@@ -32,11 +32,11 @@
/** A Viewmodel that represents the navigation of the FingerprintSettings activity. */
class FingerprintSettingsNavigationViewModel(
- private val userId: Int,
- private val fingerprintManagerInteractor: FingerprintManagerInteractor,
- private val backgroundDispatcher: CoroutineDispatcher,
- tokenInit: ByteArray?,
- challengeInit: Long?,
+ private val userId: Int,
+ private val fingerprintManagerInteractor: FingerprintManagerInteractor,
+ private val backgroundDispatcher: CoroutineDispatcher,
+ tokenInit: ByteArray?,
+ challengeInit: Long?,
) : ViewModel() {
private var token = tokenInit
@@ -173,17 +173,15 @@
}
class FingerprintSettingsNavigationModelFactory(
- private val userId: Int,
- private val interactor: FingerprintManagerInteractor,
- private val backgroundDispatcher: CoroutineDispatcher,
- private val token: ByteArray?,
- private val challenge: Long?,
+ private val userId: Int,
+ private val interactor: FingerprintManagerInteractor,
+ private val backgroundDispatcher: CoroutineDispatcher,
+ private val token: ByteArray?,
+ private val challenge: Long?,
) : ViewModelProvider.Factory {
@Suppress("UNCHECKED_CAST")
- override fun <T : ViewModel> create(
- modelClass: Class<T>,
- ): T {
+ override fun <T : ViewModel> create(modelClass: Class<T>): T {
return FingerprintSettingsNavigationViewModel(
userId,
diff --git a/src/com/android/settings/biometrics/fingerprint2/ui/settings/viewmodel/FingerprintSettingsViewModel.kt b/src/com/android/settings/biometrics/fingerprint2/ui/settings/viewmodel/FingerprintSettingsViewModel.kt
index 164f79f..80bbb43 100644
--- a/src/com/android/settings/biometrics/fingerprint2/ui/settings/viewmodel/FingerprintSettingsViewModel.kt
+++ b/src/com/android/settings/biometrics/fingerprint2/ui/settings/viewmodel/FingerprintSettingsViewModel.kt
@@ -21,9 +21,9 @@
import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.viewModelScope
-import com.android.settings.biometrics.fingerprint2.shared.domain.interactor.FingerprintManagerInteractor
-import com.android.settings.biometrics.fingerprint2.shared.model.FingerprintAuthAttemptModel
-import com.android.settings.biometrics.fingerprint2.shared.model.FingerprintData
+import com.android.settings.biometrics.fingerprint2.lib.domain.interactor.FingerprintManagerInteractor
+import com.android.settings.biometrics.fingerprint2.lib.model.FingerprintAuthAttemptModel
+import com.android.settings.biometrics.fingerprint2.lib.model.FingerprintData
import com.android.systemui.biometrics.shared.model.FingerprintSensorType
import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.flow.Flow
@@ -66,7 +66,7 @@
emit(
Pair(
fingerprintManagerInteractor.canEnrollFingerprints.first(),
- fingerprintManagerInteractor.maxEnrollableFingerprints.first()
+ fingerprintManagerInteractor.maxEnrollableFingerprints.first(),
)
)
}
@@ -120,7 +120,7 @@
_isLockedOut,
_attemptsSoFar,
_fingerprintSensorType,
- _sensorNullOrEmpty
+ _sensorNullOrEmpty,
) {
dialogShowing,
step,
@@ -140,7 +140,7 @@
"lockedOut=${isLockedOut}," +
"attempts=${attempts}," +
"sensorType=${sensorType}" +
- "sensorNullOrEmpty=${sensorNullOrEmpty}"
+ "sensorNullOrEmpty=${sensorNullOrEmpty}",
)
}
if (sensorNullOrEmpty) {
@@ -294,9 +294,7 @@
) : ViewModelProvider.Factory {
@Suppress("UNCHECKED_CAST")
- override fun <T : ViewModel> create(
- modelClass: Class<T>,
- ): T {
+ override fun <T : ViewModel> create(modelClass: Class<T>): T {
return FingerprintSettingsViewModel(
userId,
@@ -318,7 +316,7 @@
flow6: Flow<T6>,
flow7: Flow<T7>,
flow8: Flow<T8>,
- crossinline transform: suspend (T1, T2, T3, T4, T5, T6, T7, T8) -> R
+ crossinline transform: suspend (T1, T2, T3, T4, T5, T6, T7, T8) -> R,
): Flow<R> {
return combine(flow, flow2, flow3, flow4, flow5, flow6, flow7, flow8) { args: Array<*> ->
@Suppress("UNCHECKED_CAST")
diff --git a/src/com/android/settings/biometrics/fingerprint2/ui/settings/viewmodel/NextStepViewModel.kt b/src/com/android/settings/biometrics/fingerprint2/ui/settings/viewmodel/NextStepViewModel.kt
index d9155b6..3acedb1 100644
--- a/src/com/android/settings/biometrics/fingerprint2/ui/settings/viewmodel/NextStepViewModel.kt
+++ b/src/com/android/settings/biometrics/fingerprint2/ui/settings/viewmodel/NextStepViewModel.kt
@@ -29,10 +29,8 @@
val challengeToken: ByteArray?,
) : NextStepViewModel()
-data class EnrollAdditionalFingerprint(
- val userId: Int,
- val challengeToken: ByteArray?,
-) : NextStepViewModel()
+data class EnrollAdditionalFingerprint(val userId: Int, val challengeToken: ByteArray?) :
+ NextStepViewModel()
data class FinishSettings(val reason: String) : NextStepViewModel()
diff --git a/src/com/android/settings/biometrics/fingerprint2/ui/settings/viewmodel/PreferenceViewModel.kt b/src/com/android/settings/biometrics/fingerprint2/ui/settings/viewmodel/PreferenceViewModel.kt
index 181da4e..2a1d9c6 100644
--- a/src/com/android/settings/biometrics/fingerprint2/ui/settings/viewmodel/PreferenceViewModel.kt
+++ b/src/com/android/settings/biometrics/fingerprint2/ui/settings/viewmodel/PreferenceViewModel.kt
@@ -16,15 +16,11 @@
package com.android.settings.biometrics.fingerprint2.ui.settings.viewmodel
-import com.android.settings.biometrics.fingerprint2.shared.model.FingerprintData
+import com.android.settings.biometrics.fingerprint2.lib.model.FingerprintData
/** Classed use to represent a Dialogs state. */
sealed class PreferenceViewModel {
- data class RenameDialog(
- val fingerprintViewModel: FingerprintData,
- ) : PreferenceViewModel()
+ data class RenameDialog(val fingerprintViewModel: FingerprintData) : PreferenceViewModel()
- data class DeleteDialog(
- val fingerprintViewModel: FingerprintData,
- ) : PreferenceViewModel()
+ data class DeleteDialog(val fingerprintViewModel: FingerprintData) : PreferenceViewModel()
}
diff --git a/src/com/android/settings/display/DisplayFeatureProvider.java b/src/com/android/settings/display/DisplayFeatureProvider.java
new file mode 100644
index 0000000..a7c8dbb
--- /dev/null
+++ b/src/com/android/settings/display/DisplayFeatureProvider.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.settings.display;
+
+import android.content.Context;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.preference.PreferenceScreen;
+
+import com.android.settings.core.TogglePreferenceController;
+
+/** Feature provider for display settings */
+public interface DisplayFeatureProvider {
+
+ /** Create toggle preference */
+ @Nullable
+ TogglePreferenceController createAdditionalPreference(@NonNull Context context);
+
+ /** Update toggle preference */
+ void updatePreference(@Nullable TogglePreferenceController togglePreferenceController);
+
+ /** Add toggle preference to PreferenceScreen */
+ void addToScreen(@Nullable TogglePreferenceController togglePreferenceController,
+ @NonNull PreferenceScreen screen);
+}
diff --git a/src/com/android/settings/display/DisplayFeatureProviderImpl.java b/src/com/android/settings/display/DisplayFeatureProviderImpl.java
new file mode 100644
index 0000000..c9ec791
--- /dev/null
+++ b/src/com/android/settings/display/DisplayFeatureProviderImpl.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.settings.display;
+
+import android.content.Context;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.preference.PreferenceScreen;
+
+import com.android.settings.core.TogglePreferenceController;
+
+public class DisplayFeatureProviderImpl implements DisplayFeatureProvider {
+
+ @Override
+ @Nullable
+ public TogglePreferenceController createAdditionalPreference(@NonNull Context context) {
+ return null;
+ }
+
+ @Override
+ public void updatePreference(@Nullable TogglePreferenceController togglePreferenceController) {
+
+ }
+
+ @Override
+ public void addToScreen(@Nullable TogglePreferenceController togglePreferenceController,
+ @NonNull PreferenceScreen screen) {
+
+ }
+}
diff --git a/src/com/android/settings/display/ScreenTimeoutSettings.java b/src/com/android/settings/display/ScreenTimeoutSettings.java
index 1c99d5f..2d229a3 100644
--- a/src/com/android/settings/display/ScreenTimeoutSettings.java
+++ b/src/com/android/settings/display/ScreenTimeoutSettings.java
@@ -34,9 +34,11 @@
import android.provider.Settings;
import android.util.Log;
+import androidx.annotation.Nullable;
import androidx.preference.PreferenceScreen;
import com.android.settings.R;
+import com.android.settings.core.TogglePreferenceController;
import com.android.settings.flags.Flags;
import com.android.settings.overlay.FeatureFactory;
import com.android.settings.search.BaseSearchIndexProvider;
@@ -106,6 +108,9 @@
@VisibleForTesting
AdaptiveSleepBatterySaverPreferenceController mAdaptiveSleepBatterySaverPreferenceController;
+ @Nullable
+ TogglePreferenceController mAdditionalTogglePreferenceController;
+
public ScreenTimeoutSettings() {
super();
mMetricsFeatureProvider = FeatureFactory.getFeatureFactory().getMetricsFeatureProvider();
@@ -133,6 +138,8 @@
com.android.settingslib.widget.preference.footer.R.layout.preference_footer);
mPrivacyManager = SensorPrivacyManager.getInstance(context);
mPrivacyChangedListener = (sensor, enabled) -> mAdaptiveSleepController.updatePreference();
+ mAdditionalTogglePreferenceController = FeatureFactory.getFeatureFactory()
+ .getDisplayFeatureProvider().createAdditionalPreference(context);
}
@Override
@@ -164,6 +171,8 @@
mReceiver, new IntentFilter(PowerManager.ACTION_POWER_SAVE_MODE_CHANGED));
mPrivacyManager.addSensorPrivacyListener(CAMERA, mPrivacyChangedListener);
mIsUserAuthenticated = false;
+ FeatureFactory.getFeatureFactory().getDisplayFeatureProvider().updatePreference(
+ mAdditionalTogglePreferenceController);
}
@Override
@@ -210,6 +219,9 @@
mPrivacyPreference.setLayoutResource(
com.android.settingslib.widget.preference.footer.R.layout.preference_footer);
+ FeatureFactory.getFeatureFactory().getDisplayFeatureProvider()
+ .addToScreen(mAdditionalTogglePreferenceController, screen);
+
if (isScreenAttentionAvailable(getContext())) {
mAdaptiveSleepPermissionController.addToScreen(screen);
mAdaptiveSleepCameraStatePreferenceController.addToScreen(screen);
diff --git a/src/com/android/settings/fuelgauge/batterytip/tips/BatteryTip.java b/src/com/android/settings/fuelgauge/batterytip/tips/BatteryTip.java
index 1345032..1d08617 100644
--- a/src/com/android/settings/fuelgauge/batterytip/tips/BatteryTip.java
+++ b/src/com/android/settings/fuelgauge/batterytip/tips/BatteryTip.java
@@ -62,7 +62,8 @@
TipType.BATTERY_DEFENDER,
TipType.DOCK_DEFENDER,
TipType.INCOMPATIBLE_CHARGER,
- TipType.BATTERY_WARNING
+ TipType.BATTERY_WARNING,
+ TipType.WIRELESS_CHARGING_WARNING
})
public @interface TipType {
int SMART_BATTERY_MANAGER = 0;
@@ -77,6 +78,7 @@
int DOCK_DEFENDER = 9;
int INCOMPATIBLE_CHARGER = 10;
int BATTERY_WARNING = 11;
+ int WIRELESS_CHARGING_WARNING = 12;
}
@VisibleForTesting static final SparseIntArray TIP_ORDER;
@@ -95,6 +97,7 @@
TIP_ORDER.append(TipType.REDUCED_BATTERY, 9);
TIP_ORDER.append(TipType.REMOVE_APP_RESTRICTION, 10);
TIP_ORDER.append(TipType.BATTERY_WARNING, 11);
+ TIP_ORDER.append(TipType.WIRELESS_CHARGING_WARNING, 12);
}
private static final String KEY_PREFIX = "key_battery_tip";
diff --git a/src/com/android/settings/fuelgauge/protos/Android.bp b/src/com/android/settings/fuelgauge/protos/Android.bp
index 531bdc32..462962b 100644
--- a/src/com/android/settings/fuelgauge/protos/Android.bp
+++ b/src/com/android/settings/fuelgauge/protos/Android.bp
@@ -1,4 +1,5 @@
package {
+ default_team: "trendy_team_android_settings_app",
// See: http://go/android-license-faq
// A large-scale-change added 'default_applicable_licenses' to import
// all of the 'license_kinds' from "packages_apps_Settings_license"
diff --git a/src/com/android/settings/overlay/FeatureFactory.kt b/src/com/android/settings/overlay/FeatureFactory.kt
index 8a68122..37507a8 100644
--- a/src/com/android/settings/overlay/FeatureFactory.kt
+++ b/src/com/android/settings/overlay/FeatureFactory.kt
@@ -29,6 +29,7 @@
import com.android.settings.dashboard.DashboardFeatureProvider
import com.android.settings.dashboard.suggestions.SuggestionFeatureProvider
import com.android.settings.deviceinfo.hardwareinfo.HardwareInfoFeatureProvider
+import com.android.settings.display.DisplayFeatureProvider
import com.android.settings.enterprise.EnterprisePrivacyFeatureProvider
import com.android.settings.fuelgauge.BatterySettingsFeatureProvider
import com.android.settings.fuelgauge.BatteryStatusFeatureProvider
@@ -176,6 +177,11 @@
*/
abstract val privateSpaceLoginFeatureProvider: PrivateSpaceLoginFeatureProvider
+ /**
+ * Gets implementation for Display feature.
+ */
+ abstract val displayFeatureProvider: DisplayFeatureProvider
+
companion object {
private var _factory: FeatureFactory? = null
diff --git a/src/com/android/settings/overlay/FeatureFactoryImpl.kt b/src/com/android/settings/overlay/FeatureFactoryImpl.kt
index 28dbb23..e0313b7 100644
--- a/src/com/android/settings/overlay/FeatureFactoryImpl.kt
+++ b/src/com/android/settings/overlay/FeatureFactoryImpl.kt
@@ -45,6 +45,8 @@
import com.android.settings.dashboard.suggestions.SuggestionFeatureProviderImpl
import com.android.settings.deviceinfo.hardwareinfo.HardwareInfoFeatureProvider
import com.android.settings.deviceinfo.hardwareinfo.HardwareInfoFeatureProviderImpl
+import com.android.settings.display.DisplayFeatureProvider
+import com.android.settings.display.DisplayFeatureProviderImpl
import com.android.settings.enterprise.EnterprisePrivacyFeatureProviderImpl
import com.android.settings.fuelgauge.BatterySettingsFeatureProviderImpl
import com.android.settings.fuelgauge.BatteryStatusFeatureProviderImpl
@@ -190,4 +192,7 @@
override val privateSpaceLoginFeatureProvider: PrivateSpaceLoginFeatureProvider by lazy {
PrivateSpaceLoginFeatureProviderImpl()
}
+ override val displayFeatureProvider: DisplayFeatureProvider by lazy {
+ DisplayFeatureProviderImpl()
+ }
}
diff --git a/src/com/android/settings/password/ChooseLockGeneric.java b/src/com/android/settings/password/ChooseLockGeneric.java
index db031e7..178c387 100644
--- a/src/com/android/settings/password/ChooseLockGeneric.java
+++ b/src/com/android/settings/password/ChooseLockGeneric.java
@@ -50,6 +50,9 @@
import android.os.UserHandle;
import android.os.UserManager;
import android.os.storage.StorageManager;
+import android.security.AndroidKeyStoreMaintenance;
+import android.security.GateKeeper;
+import android.security.KeyStoreException;
import android.service.persistentdata.PersistentDataBlockManager;
import android.text.TextUtils;
import android.util.EventLog;
@@ -147,7 +150,6 @@
* ChooseLockGeneric can be relaunched with the same extras.
*/
public static final String EXTRA_CHOOSE_LOCK_GENERIC_EXTRAS = "choose_lock_generic_extras";
-
@VisibleForTesting
static final int CONFIRM_EXISTING_REQUEST = 100;
@VisibleForTesting
@@ -438,7 +440,7 @@
if (!isUnlockMethodSecure(key) && mLockPatternUtils.isSecure(mUserId)) {
// Show the disabling FRP warning only when the user is switching from a secure
// unlock method to an insecure one
- showFactoryResetProtectionWarningDialog(key);
+ showFactoryResetProtectionWarningDialog(key, GateKeeper.getSecureUserId(mUserId));
return true;
} else if (KEY_SKIP_FINGERPRINT.equals(key) || KEY_SKIP_FACE.equals(key)
|| KEY_SKIP_BIOMETRICS.equals(key)) {
@@ -906,7 +908,8 @@
: R.string.unlock_disable_frp_warning_title;
}
- private int getResIdForFactoryResetProtectionWarningMessage() {
+ private int getResIdForFactoryResetProtectionWarningMessage(
+ boolean hasAppsWithAuthBoundKeys) {
final boolean hasFingerprints;
final boolean hasFace;
if (mFingerprintManager != null && mFingerprintManager.isHardwareDetected()) {
@@ -935,13 +938,24 @@
case DevicePolicyManager.PASSWORD_QUALITY_NUMERIC:
case DevicePolicyManager.PASSWORD_QUALITY_NUMERIC_COMPLEX:
if (hasFingerprints && hasFace) {
- return R.string.unlock_disable_frp_warning_content_pin_face_fingerprint;
+ return hasAppsWithAuthBoundKeys
+ ?
+ R.string.unlock_disable_frp_warning_content_pin_face_fingerprint_authbound_keys
+ : R.string.unlock_disable_frp_warning_content_pin_face_fingerprint;
} else if (hasFingerprints) {
- return R.string.unlock_disable_frp_warning_content_pin_fingerprint;
+ return hasAppsWithAuthBoundKeys
+ ?
+ R.string.unlock_disable_frp_warning_content_pin_fingerprint_authbound_keys
+ : R.string.unlock_disable_frp_warning_content_pin_fingerprint;
} else if (hasFace) {
- return R.string.unlock_disable_frp_warning_content_pin_face;
+ return hasAppsWithAuthBoundKeys
+ ?
+ R.string.unlock_disable_frp_warning_content_pin_face_authbound_keys
+ : R.string.unlock_disable_frp_warning_content_pin_face;
} else {
- return R.string.unlock_disable_frp_warning_content_pin;
+ return hasAppsWithAuthBoundKeys
+ ? R.string.unlock_disable_frp_warning_content_pin_authbound_keys
+ : R.string.unlock_disable_frp_warning_content_pin;
}
case DevicePolicyManager.PASSWORD_QUALITY_ALPHABETIC:
case DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC:
@@ -998,9 +1012,26 @@
return false;
}
- private void showFactoryResetProtectionWarningDialog(String unlockMethodToSet) {
+ private void showFactoryResetProtectionWarningDialog(String unlockMethodToSet,
+ long userSecureId) {
+ // Call Keystore to find out if this user has apps with authentication-bound
+ // keys associated with the userSecureId of the LSKF to be removed.
+ boolean appsAffectedByFRPRemovalExist;
+ try {
+ long[] appsAffectedByFRPRemoval =
+ AndroidKeyStoreMaintenance.getAllAppUidsAffectedBySid(mUserId,
+ userSecureId);
+ appsAffectedByFRPRemovalExist = appsAffectedByFRPRemoval.length > 0;
+ } catch (KeyStoreException e) {
+ Log.w(TAG, String.format("Failed to get list of apps affected by SID %d removal",
+ userSecureId), e);
+ // Fail closed: If Settings can't reach Keystore, assume (out of caution) that
+ // there are authentication-bound keys that will be invalidated.
+ appsAffectedByFRPRemovalExist = true;
+ }
int title = getResIdForFactoryResetProtectionWarningTitle();
- int message = getResIdForFactoryResetProtectionWarningMessage();
+ int message = getResIdForFactoryResetProtectionWarningMessage(
+ appsAffectedByFRPRemovalExist);
FactoryResetProtectionWarningDialog dialog =
FactoryResetProtectionWarningDialog.newInstance(
title, message, unlockMethodToSet);
diff --git a/src/com/android/settings/privacy/CameraExtensionsFallbackPreferenceController.java b/src/com/android/settings/privacy/CameraExtensionsFallbackPreferenceController.java
new file mode 100644
index 0000000..1d9c354
--- /dev/null
+++ b/src/com/android/settings/privacy/CameraExtensionsFallbackPreferenceController.java
@@ -0,0 +1,64 @@
+/*
+ * 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.privacy;
+
+import static android.provider.Settings.Secure.CAMERA_EXTENSIONS_FALLBACK;
+
+import android.content.Context;
+import android.provider.Settings;
+
+import com.android.settings.R;
+import com.android.settings.core.TogglePreferenceController;
+
+/**
+ * Toggle for camera extensions software fallback
+ */
+public class CameraExtensionsFallbackPreferenceController extends TogglePreferenceController {
+ public CameraExtensionsFallbackPreferenceController(Context context, String key) {
+ super(context, key);
+ }
+
+ @Override
+ public boolean isChecked() {
+ int val = Settings.Secure.getInt(mContext.getContentResolver(),
+ CAMERA_EXTENSIONS_FALLBACK, 1);
+ return val == 1;
+ }
+
+ @Override
+ public boolean setChecked(boolean isChecked) {
+ int val = isChecked ? 1 : 0;
+ return Settings.Secure.putInt(mContext.getContentResolver(),
+ CAMERA_EXTENSIONS_FALLBACK, val);
+ }
+
+ @Override
+ public int getAvailabilityStatus() {
+ return AVAILABLE;
+ }
+
+ @Override
+ public boolean isSliceable() {
+ return false;
+ }
+
+ @Override
+ public int getSliceHighlightMenuRes() {
+ // not needed since it's not sliceable
+ return NO_RES;
+ }
+}
diff --git a/src/com/android/settings/privatespace/AutoAdvanceSetupFragment.java b/src/com/android/settings/privatespace/AutoAdvanceSetupFragment.java
index 9e905f2..13c0681 100644
--- a/src/com/android/settings/privatespace/AutoAdvanceSetupFragment.java
+++ b/src/com/android/settings/privatespace/AutoAdvanceSetupFragment.java
@@ -59,11 +59,11 @@
private static final List<Pair<Integer, Integer>> HEADER_IMAGE_PAIRS =
ImmutableList.of(
new Pair(R.string.private_space_notifications_hidden_title,
- R.drawable.privatespace_setup_flow_placeholder),
+ R.drawable.private_space_setup_notification_illustration),
new Pair(R.string.private_space_share_photos_title,
- R.drawable.privatespace_setup_flow_placeholder),
+ R.drawable.private_space_setup_sharing_illustration),
new Pair(R.string.private_space_apps_installed_title,
- R.drawable.privatespace_setup_flow_placeholder));
+ R.drawable.private_space_setup_preinstalled_illustration));
private Runnable mUpdateScreenResources =
new Runnable() {
@@ -116,7 +116,7 @@
}
mRootView =
(GlifLayout)
- inflater.inflate(R.layout.privatespace_advancing_screen, container, false);
+ inflater.inflate(R.layout.private_space_advancing_screen, container, false);
mRootView.getHeaderTextView().setMaxLines(HEADER_TEXT_MAX_LINES);
updateHeaderAndImage();
mHandler = new Handler(Looper.getMainLooper());
@@ -157,7 +157,7 @@
private void updateHeaderAndImage() {
mRootView.setHeaderText(HEADER_IMAGE_PAIRS.get(mScreenTitleIndex).first);
- ((ImageView) mRootView.findViewById(R.id.placeholder_image))
+ ((ImageView) mRootView.findViewById(R.id.setup_advance_image))
.setImageResource(HEADER_IMAGE_PAIRS.get(mScreenTitleIndex).second);
startFadeInAnimation();
}
@@ -166,7 +166,7 @@
ValueAnimator textView = ObjectAnimator.ofFloat(
mRootView.getHeaderTextView(), View.ALPHA, 0f, 1f);
ValueAnimator imageView = ObjectAnimator.ofFloat(
- mRootView.findViewById(R.id.placeholder_image), View.ALPHA, 0, 1f);
+ mRootView.findViewById(R.id.setup_advance_image), View.ALPHA, 0, 1f);
AnimatorSet fadeIn = new AnimatorSet();
fadeIn.playTogether(textView, imageView);
fadeIn.setDuration(ANIMATION_DURATION_MILLIS).start();
@@ -177,7 +177,7 @@
ValueAnimator textView = ObjectAnimator.ofFloat(
mRootView.getHeaderTextView(), View.ALPHA, 1f, 0f);
ValueAnimator imageView = ObjectAnimator.ofFloat(
- mRootView.findViewById(R.id.placeholder_image), View.ALPHA, 1f, 0f);
+ mRootView.findViewById(R.id.setup_advance_image), View.ALPHA, 1f, 0f);
fadeOut.playTogether(textView, imageView);
fadeOut.setDuration(ANIMATION_DURATION_MILLIS).start();
fadeOut.addListener(new AnimatorListenerAdapter() {
diff --git a/src/com/android/settings/privatespace/PrivateSpaceDashboardFragment.java b/src/com/android/settings/privatespace/PrivateSpaceDashboardFragment.java
index e426477..726567e 100644
--- a/src/com/android/settings/privatespace/PrivateSpaceDashboardFragment.java
+++ b/src/com/android/settings/privatespace/PrivateSpaceDashboardFragment.java
@@ -34,7 +34,8 @@
public void onCreate(Bundle icicle) {
if (android.os.Flags.allowPrivateProfile()) {
super.onCreate(icicle);
- if (getIntent().getBooleanExtra(EXTRA_SHOW_PRIVATE_SPACE_UNLOCKED, false)) {
+ if (icicle == null
+ && getIntent().getBooleanExtra(EXTRA_SHOW_PRIVATE_SPACE_UNLOCKED, false)) {
Log.i(TAG, "Private space unlocked showing toast");
Toast.makeText(getContext(), R.string.private_space_unlocked, Toast.LENGTH_SHORT)
.show();
diff --git a/src/com/android/settings/privatespace/PrivateSpaceEducation.java b/src/com/android/settings/privatespace/PrivateSpaceEducation.java
index e54982b..7b06f5b 100644
--- a/src/com/android/settings/privatespace/PrivateSpaceEducation.java
+++ b/src/com/android/settings/privatespace/PrivateSpaceEducation.java
@@ -48,7 +48,7 @@
}
GlifLayout rootView =
(GlifLayout)
- inflater.inflate(R.layout.privatespace_education_screen, container, false);
+ inflater.inflate(R.layout.private_space_education_screen, container, false);
final FooterBarMixin mixin = rootView.getMixin(FooterBarMixin.class);
mixin.setPrimaryButton(
new FooterButton.Builder(getContext())
diff --git a/src/com/android/settings/privatespace/PrivateSpaceSetLockFragment.java b/src/com/android/settings/privatespace/PrivateSpaceSetLockFragment.java
index 9e2e5cc..56add6d 100644
--- a/src/com/android/settings/privatespace/PrivateSpaceSetLockFragment.java
+++ b/src/com/android/settings/privatespace/PrivateSpaceSetLockFragment.java
@@ -56,7 +56,7 @@
}
GlifLayout rootView =
(GlifLayout)
- inflater.inflate(R.layout.privatespace_setlock_screen, container, false);
+ inflater.inflate(R.layout.private_space_setlock_screen, container, false);
final FooterBarMixin mixin = rootView.getMixin(FooterBarMixin.class);
mixin.setPrimaryButton(
new FooterButton.Builder(getContext())
diff --git a/src/com/android/settings/privatespace/SetupSuccessFragment.java b/src/com/android/settings/privatespace/SetupSuccessFragment.java
index b1e0edc..13de1fc 100644
--- a/src/com/android/settings/privatespace/SetupSuccessFragment.java
+++ b/src/com/android/settings/privatespace/SetupSuccessFragment.java
@@ -52,7 +52,7 @@
}
GlifLayout rootView =
(GlifLayout)
- inflater.inflate(R.layout.privatespace_setup_success, container, false);
+ inflater.inflate(R.layout.private_space_setup_success, container, false);
final FooterBarMixin mixin = rootView.getMixin(FooterBarMixin.class);
mixin.setPrimaryButton(
new FooterButton.Builder(getContext())
diff --git a/src/com/android/settings/webview/WebViewUpdateServiceWrapper.java b/src/com/android/settings/webview/WebViewUpdateServiceWrapper.java
index 05855e4..546320c 100644
--- a/src/com/android/settings/webview/WebViewUpdateServiceWrapper.java
+++ b/src/com/android/settings/webview/WebViewUpdateServiceWrapper.java
@@ -20,12 +20,12 @@
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
-import android.os.RemoteException;
import android.util.Log;
import android.webkit.IWebViewUpdateService;
import android.webkit.UserPackage;
import android.webkit.WebViewFactory;
import android.webkit.WebViewProviderInfo;
+import android.webkit.WebViewUpdateManager;
import android.widget.Toast;
import androidx.annotation.Nullable;
@@ -44,8 +44,12 @@
*/
public PackageInfo getCurrentWebViewPackage() {
try {
- return WebViewFactory.getUpdateService().getCurrentWebViewPackage();
- } catch (RemoteException e) {
+ if (android.webkit.Flags.updateServiceIpcWrapper()) {
+ return WebViewUpdateManager.getInstance().getCurrentWebViewPackage();
+ } else {
+ return WebViewFactory.getUpdateService().getCurrentWebViewPackage();
+ }
+ } catch (Exception e) {
Log.e(TAG, e.toString());
}
return null;
@@ -59,8 +63,13 @@
public List<ApplicationInfo> getValidWebViewApplicationInfos(Context context) {
WebViewProviderInfo[] providers = null;
try {
- providers = WebViewFactory.getUpdateService().getValidWebViewPackages();
- } catch (RemoteException e) {
+ if (android.webkit.Flags.updateServiceIpcWrapper()) {
+ providers = context.getSystemService(WebViewUpdateManager.class)
+ .getValidWebViewPackages();
+ } else {
+ providers = WebViewFactory.getUpdateService().getValidWebViewPackages();
+ }
+ } catch (Exception e) {
}
List<ApplicationInfo> pkgs = new ArrayList<>();
for (WebViewProviderInfo provider : providers) {
@@ -80,10 +89,15 @@
*/
public boolean setWebViewProvider(String packageName) {
try {
- return packageName.equals(
- WebViewFactory.getUpdateService().changeProviderAndSetting(packageName));
- } catch (RemoteException e) {
- Log.e(TAG, "RemoteException when trying to change provider to " + packageName, e);
+ if (android.webkit.Flags.updateServiceIpcWrapper()) {
+ return packageName.equals(
+ WebViewUpdateManager.getInstance().changeProviderAndSetting(packageName));
+ } else {
+ return packageName.equals(
+ WebViewFactory.getUpdateService().changeProviderAndSetting(packageName));
+ }
+ } catch (Exception e) {
+ Log.e(TAG, "Exception when trying to change provider to " + packageName, e);
}
return false;
}
@@ -112,18 +126,23 @@
*/
@Nullable
public String getDefaultWebViewPackageName() {
+ WebViewProviderInfo provider = null;
try {
- IWebViewUpdateService service = WebViewFactory.getUpdateService();
- if (service != null) {
- WebViewProviderInfo provider = service.getDefaultWebViewPackage();
- if (provider != null) {
- return provider.packageName;
+ if (android.webkit.Flags.updateServiceIpcWrapper()) {
+ WebViewUpdateManager manager = WebViewUpdateManager.getInstance();
+ if (manager != null) {
+ provider = manager.getDefaultWebViewPackage();
+ }
+ } else {
+ IWebViewUpdateService service = WebViewFactory.getUpdateService();
+ if (service != null) {
+ provider = service.getDefaultWebViewPackage();
}
}
- } catch (RemoteException e) {
- Log.e(TAG, "RemoteException when trying to fetch default WebView package Name", e);
+ } catch (Exception e) {
+ Log.e(TAG, "Exception when trying to fetch default WebView package Name", e);
}
- return null;
+ return provider != null ? provider.packageName : null;
}
static final int PACKAGE_FLAGS = PackageManager.MATCH_ANY_USER;
diff --git a/tests/anomaly-tester/Android.bp b/tests/anomaly-tester/Android.bp
index 0b05e04..d437a6c 100644
--- a/tests/anomaly-tester/Android.bp
+++ b/tests/anomaly-tester/Android.bp
@@ -1,4 +1,5 @@
package {
+ default_team: "trendy_team_android_settings_app",
// See: http://go/android-license-faq
// A large-scale-change added 'default_applicable_licenses' to import
// all of the 'license_kinds' from "packages_apps_Settings_license"
diff --git a/tests/componenttests/Android.bp b/tests/componenttests/Android.bp
index 300a338..48d3ab0 100644
--- a/tests/componenttests/Android.bp
+++ b/tests/componenttests/Android.bp
@@ -2,6 +2,7 @@
// Settings Component test target. #
//############################################################
package {
+ default_team: "trendy_team_android_settings_app",
// See: http://go/android-license-faq
// A large-scale-change added 'default_applicable_licenses' to import
// all of the 'license_kinds' from "packages_apps_Settings_license"
diff --git a/tests/legacy_unit/InstrumentedEntitlementApp/Android.bp b/tests/legacy_unit/InstrumentedEntitlementApp/Android.bp
index 1ec108a..cc0e63d 100644
--- a/tests/legacy_unit/InstrumentedEntitlementApp/Android.bp
+++ b/tests/legacy_unit/InstrumentedEntitlementApp/Android.bp
@@ -13,6 +13,7 @@
// limitations under the License.
package {
+ default_team: "trendy_team_android_settings_app",
// See: http://go/android-license-faq
// A large-scale-change added 'default_applicable_licenses' to import
// all of the 'license_kinds' from "packages_apps_Settings_license"
diff --git a/tests/perftests/Android.bp b/tests/perftests/Android.bp
index 7d3b75b..7e3a8aa 100644
--- a/tests/perftests/Android.bp
+++ b/tests/perftests/Android.bp
@@ -1,4 +1,5 @@
package {
+ default_team: "trendy_team_android_settings_app",
// See: http://go/android-license-faq
// A large-scale-change added 'default_applicable_licenses' to import
// all of the 'license_kinds' from "packages_apps_Settings_license"
diff --git a/tests/robotests/Android.bp b/tests/robotests/Android.bp
index d313878..5648290 100644
--- a/tests/robotests/Android.bp
+++ b/tests/robotests/Android.bp
@@ -1,4 +1,5 @@
package {
+ default_team: "trendy_team_android_settings_app",
// See: http://go/android-license-faq
// A large-scale-change added 'default_applicable_licenses' to import
// all of the 'license_kinds' from "packages_apps_Settings_license"
diff --git a/tests/robotests/src/com/android/settings/biometrics/fingerprint2/fragment/FingerprintEnrollIntroFragmentTest.kt b/tests/robotests/src/com/android/settings/biometrics/fingerprint2/fragment/FingerprintEnrollIntroFragmentTest.kt
index 024f346..cea72aa 100644
--- a/tests/robotests/src/com/android/settings/biometrics/fingerprint2/fragment/FingerprintEnrollIntroFragmentTest.kt
+++ b/tests/robotests/src/com/android/settings/biometrics/fingerprint2/fragment/FingerprintEnrollIntroFragmentTest.kt
@@ -33,16 +33,20 @@
import androidx.test.espresso.matcher.ViewMatchers.withText
import androidx.test.runner.AndroidJUnit4
import com.android.settings.R
-import com.android.settings.biometrics.fingerprint2.shared.model.Default
+import com.android.settings.biometrics.fingerprint2.lib.model.Default
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintNavigationStep.Introduction
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.NavigationState
import com.android.settings.biometrics.fingerprint2.ui.enrollment.fragment.FingerprintEnrollIntroV2Fragment
-import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintEnrollNavigationViewModel
-import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintEnrollViewModel
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintEnrollIntroViewModel
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintFlowViewModel
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintGatekeeperViewModel
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintNavigationViewModel
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintScrollViewModel
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.GatekeeperInfo
-import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.Intro
-import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.NavState
import com.android.settings.testutils2.FakeFingerprintManagerInteractor
+import com.android.systemui.biometrics.shared.model.FingerprintSensor
+import com.android.systemui.biometrics.shared.model.FingerprintSensorType
+import com.android.systemui.biometrics.shared.model.SensorStrength
import com.google.android.setupdesign.GlifLayout
import com.google.android.setupdesign.template.RequireScrollMixin
import kotlinx.coroutines.test.StandardTestDispatcher
@@ -62,18 +66,27 @@
)
private val backgroundDispatcher = StandardTestDispatcher()
private lateinit var fragmentScenario: FragmentScenario<FingerprintEnrollIntroV2Fragment>
+ private val fingerprintSensor =
+ FingerprintSensor(1, SensorStrength.STRONG, 5, FingerprintSensorType.POWER_BUTTON)
+
+ var enrollFlow = Default
+ val flowViewModel = FingerprintFlowViewModel(enrollFlow)
private val navigationViewModel =
- FingerprintEnrollNavigationViewModel(
- backgroundDispatcher,
- interactor,
- gatekeeperViewModel,
- Intro,
- NavState(true),
- Default,
+ FingerprintNavigationViewModel(
+ Introduction,
+ false,
+ flowViewModel,
+ interactor
)
+
private var fingerprintViewModel =
- FingerprintEnrollViewModel(interactor, gatekeeperViewModel, navigationViewModel)
+ FingerprintEnrollIntroViewModel(
+ navigationViewModel,
+ flowViewModel,
+ interactor,
+ )
+
private var fingerprintScrollViewModel = FingerprintScrollViewModel()
@Before
@@ -85,9 +98,9 @@
modelClass: Class<T>,
): T {
return when (modelClass) {
- FingerprintEnrollViewModel::class.java -> fingerprintViewModel
+ FingerprintEnrollIntroViewModel::class.java -> fingerprintViewModel
FingerprintScrollViewModel::class.java -> fingerprintScrollViewModel
- FingerprintEnrollNavigationViewModel::class.java -> navigationViewModel
+ FingerprintNavigationViewModel::class.java -> navigationViewModel
FingerprintGatekeeperViewModel::class.java -> gatekeeperViewModel
else -> null
}
diff --git a/tests/robotests/src/com/android/settings/connecteddevice/stylus/StylusDevicesControllerTest.java b/tests/robotests/src/com/android/settings/connecteddevice/stylus/StylusDevicesControllerTest.java
index 135be4b..6c96f85 100644
--- a/tests/robotests/src/com/android/settings/connecteddevice/stylus/StylusDevicesControllerTest.java
+++ b/tests/robotests/src/com/android/settings/connecteddevice/stylus/StylusDevicesControllerTest.java
@@ -108,6 +108,9 @@
MockitoAnnotations.initMocks(this);
mContext = spy(ApplicationProvider.getApplicationContext());
+ final var spiedResources = spy(mContext.getResources());
+ when(mContext.getResources()).thenReturn(spiedResources);
+
PreferenceManager preferenceManager = new PreferenceManager(mContext);
mScreen = preferenceManager.createPreferenceScreen(mContext);
mPreferenceContainer = new PreferenceCategory(mContext);
@@ -144,6 +147,9 @@
when(mInputDevice.hasKeys(KEYCODE_STYLUS_BUTTON_TAIL)).thenReturn(
new boolean[]{true});
+ when(spiedResources.getBoolean(
+ com.android.internal.R.bool.config_enableStylusPointerIcon)).thenReturn(true);
+
mController = new StylusDevicesController(mContext, mInputDevice, null, mLifecycle);
}
@@ -237,7 +243,7 @@
Preference handwritingPref = mPreferenceContainer.getPreference(0);
Preference buttonPref = mPreferenceContainer.getPreference(1);
- assertThat(mPreferenceContainer.getPreferenceCount()).isEqualTo(2);
+ assertThat(mPreferenceContainer.getPreferenceCount()).isEqualTo(3);
assertThat(handwritingPref.getTitle().toString()).isEqualTo(
mContext.getString(R.string.stylus_textfield_handwriting));
assertThat(handwritingPref.isVisible()).isTrue();
diff --git a/tests/robotests/testutils/com/android/settings/testutils/FakeFeatureFactory.java b/tests/robotests/testutils/com/android/settings/testutils/FakeFeatureFactory.java
index 5a5008c..a11b226 100644
--- a/tests/robotests/testutils/com/android/settings/testutils/FakeFeatureFactory.java
+++ b/tests/robotests/testutils/com/android/settings/testutils/FakeFeatureFactory.java
@@ -33,6 +33,7 @@
import com.android.settings.dashboard.suggestions.SuggestionFeatureProvider;
import com.android.settings.deviceinfo.hardwareinfo.HardwareInfoFeatureProvider;
import com.android.settings.deviceinfo.hardwareinfo.HardwareInfoFeatureProviderImpl;
+import com.android.settings.display.DisplayFeatureProvider;
import com.android.settings.enterprise.EnterprisePrivacyFeatureProvider;
import com.android.settings.fuelgauge.BatterySettingsFeatureProvider;
import com.android.settings.fuelgauge.BatteryStatusFeatureProvider;
@@ -101,6 +102,7 @@
public OnboardingFeatureProvider mOnboardingFeatureProvider;
public FastPairFeatureProvider mFastPairFeatureProvider;
public PrivateSpaceLoginFeatureProvider mPrivateSpaceLoginFeatureProvider;
+ public DisplayFeatureProvider mDisplayFeatureProvider;
/**
* Call this in {@code @Before} method of the test class to use fake factory.
@@ -149,6 +151,7 @@
mOnboardingFeatureProvider = mock(OnboardingFeatureProvider.class);
mFastPairFeatureProvider = mock(FastPairFeatureProvider.class);
mPrivateSpaceLoginFeatureProvider = mock(PrivateSpaceLoginFeatureProvider.class);
+ mDisplayFeatureProvider = mock(DisplayFeatureProvider.class);
}
@Override
@@ -331,5 +334,10 @@
public PrivateSpaceLoginFeatureProvider getPrivateSpaceLoginFeatureProvider() {
return mPrivateSpaceLoginFeatureProvider;
}
+
+ @Override
+ public DisplayFeatureProvider getDisplayFeatureProvider() {
+ return mDisplayFeatureProvider;
+ }
}
diff --git a/tests/screenshot/Android.bp b/tests/screenshot/Android.bp
index 5989381..5130fe5 100644
--- a/tests/screenshot/Android.bp
+++ b/tests/screenshot/Android.bp
@@ -13,6 +13,10 @@
// See the License for the specific language governing permissions and
// limitations under the License.
+package {
+ default_team: "trendy_team_android_settings_app",
+}
+
android_app {
name: "ScreenshotTestStub",
defaults: [
diff --git a/tests/screenshot/src/com/android/settings/tests/screenshot/BasicScreenshotTest.kt b/tests/screenshot/src/com/android/settings/tests/screenshot/BasicScreenshotTest.kt
index bf28b54..493a669 100644
--- a/tests/screenshot/src/com/android/settings/tests/screenshot/BasicScreenshotTest.kt
+++ b/tests/screenshot/src/com/android/settings/tests/screenshot/BasicScreenshotTest.kt
@@ -30,16 +30,19 @@
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.platform.app.InstrumentationRegistry
import com.android.settings.R
-import com.android.settings.biometrics.fingerprint2.shared.model.Default
+import com.android.settings.biometrics.fingerprint2.lib.model.Default
import com.android.settings.biometrics.fingerprint2.ui.enrollment.fragment.FingerprintEnrollIntroV2Fragment
-import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintEnrollNavigationViewModel
-import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintEnrollViewModel
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintEnrollIntroViewModel
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintFlowViewModel
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintGatekeeperViewModel
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintNavigationStep
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintNavigationViewModel
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintScrollViewModel
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.GatekeeperInfo
-import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.NavState
-import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.Start
import com.android.settings.testutils2.FakeFingerprintManagerInteractor
+import com.android.systemui.biometrics.shared.model.FingerprintSensor
+import com.android.systemui.biometrics.shared.model.FingerprintSensorType
+import com.android.systemui.biometrics.shared.model.SensorStrength
import kotlinx.coroutines.test.StandardTestDispatcher
import org.junit.Before
import org.junit.Rule
@@ -60,7 +63,7 @@
InstrumentationRegistry.getInstrumentation()
.getTargetContext()
.getFilesDir()
- .getAbsolutePath() + "/settings_screenshots"
+ .getAbsolutePath() + "/settings_screenshots",
)
)
@@ -70,24 +73,27 @@
private val gatekeeperViewModel =
FingerprintGatekeeperViewModel(
GatekeeperInfo.GatekeeperPasswordInfo(byteArrayOf(1, 2, 3), 100L),
- interactor
+ interactor,
)
private val backgroundDispatcher = StandardTestDispatcher()
private lateinit var fragmentScenario: FragmentScenario<FingerprintEnrollIntroV2Fragment>
- val navState = NavState(true)
+ private val fingerprintSensor =
+ FingerprintSensor(1, SensorStrength.STRONG, 5, FingerprintSensorType.POWER_BUTTON)
- private val navigationViewModel = FingerprintEnrollNavigationViewModel(
- backgroundDispatcher,
+ var enrollFlow = Default
+ val flowViewModel = FingerprintFlowViewModel(enrollFlow)
+
+ private val navigationViewModel =
+ FingerprintNavigationViewModel(
+ FingerprintNavigationStep.Introduction,
+ false,
+ flowViewModel,
interactor,
- gatekeeperViewModel,
- Start.next(navState),
- navState,
- Default,
)
- private var fingerprintViewModel = FingerprintEnrollViewModel(
- interactor, gatekeeperViewModel, navigationViewModel,
- )
+
+ private var fingerprintViewModel =
+ FingerprintEnrollIntroViewModel(navigationViewModel, flowViewModel, interactor)
private var fingerprintScrollViewModel = FingerprintScrollViewModel()
@Before
@@ -95,13 +101,11 @@
val factory =
object : ViewModelProvider.Factory {
@Suppress("UNCHECKED_CAST")
- override fun <T : ViewModel> create(
- modelClass: Class<T>,
- ): T {
+ override fun <T : ViewModel> create(modelClass: Class<T>): T {
return when (modelClass) {
- FingerprintEnrollViewModel::class.java -> fingerprintViewModel
+ FingerprintEnrollIntroViewModel::class.java -> fingerprintViewModel
FingerprintScrollViewModel::class.java -> fingerprintScrollViewModel
- FingerprintEnrollNavigationViewModel::class.java -> navigationViewModel
+ FingerprintNavigationViewModel::class.java -> navigationViewModel
FingerprintGatekeeperViewModel::class.java -> gatekeeperViewModel
else -> null
}
@@ -118,11 +122,7 @@
/** Renders a [view] into a [Bitmap]. */
private fun viewToBitmap(view: View): Bitmap {
val bitmap =
- Bitmap.createBitmap(
- view.measuredWidth,
- view.measuredHeight,
- Bitmap.Config.ARGB_8888,
- )
+ Bitmap.createBitmap(view.measuredWidth, view.measuredHeight, Bitmap.Config.ARGB_8888)
val canvas = Canvas(bitmap)
view.draw(canvas)
return bitmap
@@ -136,12 +136,7 @@
}
fragmentScenario.onFragment { fragment ->
val view = fragment.requireView().findViewById<View>(R.id.enroll_intro_content_view)!!
- rule.assertBitmapAgainstGolden(
- viewToBitmap(view),
- "fp_enroll_intro",
- MSSIMMatcher()
- )
+ rule.assertBitmapAgainstGolden(viewToBitmap(view), "fp_enroll_intro", MSSIMMatcher())
}
-
}
}
diff --git a/tests/shared/Android.bp b/tests/shared/Android.bp
index 27573e8..6fd9f64 100644
--- a/tests/shared/Android.bp
+++ b/tests/shared/Android.bp
@@ -1,7 +1,11 @@
+package {
+ default_team: "trendy_team_android_settings_app",
+}
+
android_library {
name: "Settings-testutils2",
srcs: [
- "src/**/*.kt"
+ "src/**/*.kt",
],
libs: [
"BiometricsSharedLib",
diff --git a/tests/shared/src/com/android/settings/testutils2/FakeFingerprintManagerInteractor.kt b/tests/shared/src/com/android/settings/testutils2/FakeFingerprintManagerInteractor.kt
index dd8658c..7991ff1 100644
--- a/tests/shared/src/com/android/settings/testutils2/FakeFingerprintManagerInteractor.kt
+++ b/tests/shared/src/com/android/settings/testutils2/FakeFingerprintManagerInteractor.kt
@@ -16,11 +16,11 @@
package com.android.settings.testutils2
-import com.android.settings.biometrics.fingerprint2.shared.domain.interactor.FingerprintManagerInteractor
-import com.android.settings.biometrics.fingerprint2.shared.model.EnrollReason
-import com.android.settings.biometrics.fingerprint2.shared.model.FingerEnrollState
-import com.android.settings.biometrics.fingerprint2.shared.model.FingerprintAuthAttemptModel
-import com.android.settings.biometrics.fingerprint2.shared.model.FingerprintData
+import com.android.settings.biometrics.fingerprint2.lib.domain.interactor.FingerprintManagerInteractor
+import com.android.settings.biometrics.fingerprint2.lib.model.EnrollReason
+import com.android.settings.biometrics.fingerprint2.lib.model.FingerEnrollState
+import com.android.settings.biometrics.fingerprint2.lib.model.FingerprintAuthAttemptModel
+import com.android.settings.biometrics.fingerprint2.lib.model.FingerprintData
import com.android.systemui.biometrics.shared.model.FingerprintSensor
import com.android.systemui.biometrics.shared.model.FingerprintSensorType
import com.android.systemui.biometrics.shared.model.SensorStrength
diff --git a/tests/spa_unit/Android.bp b/tests/spa_unit/Android.bp
index 4df6254..d98cf42 100644
--- a/tests/spa_unit/Android.bp
+++ b/tests/spa_unit/Android.bp
@@ -15,6 +15,7 @@
//
package {
+ default_team: "trendy_team_android_settings_app",
default_applicable_licenses: ["packages_apps_Settings_license"],
}
diff --git a/tests/spa_unit/src/com/android/settings/testutils/FakeFeatureFactory.kt b/tests/spa_unit/src/com/android/settings/testutils/FakeFeatureFactory.kt
index 9b098a7..4048c24 100644
--- a/tests/spa_unit/src/com/android/settings/testutils/FakeFeatureFactory.kt
+++ b/tests/spa_unit/src/com/android/settings/testutils/FakeFeatureFactory.kt
@@ -30,6 +30,7 @@
import com.android.settings.dashboard.DashboardFeatureProvider
import com.android.settings.dashboard.suggestions.SuggestionFeatureProvider
import com.android.settings.deviceinfo.hardwareinfo.HardwareInfoFeatureProvider
+import com.android.settings.display.DisplayFeatureProvider
import com.android.settings.enterprise.EnterprisePrivacyFeatureProvider
import com.android.settings.fuelgauge.BatterySettingsFeatureProvider
import com.android.settings.fuelgauge.BatteryStatusFeatureProvider
@@ -146,4 +147,6 @@
get() = TODO("Not yet implemented")
override val privateSpaceLoginFeatureProvider: PrivateSpaceLoginFeatureProvider
get() = TODO("Not yet implemented")
+ override val displayFeatureProvider: DisplayFeatureProvider
+ get() = TODO("Not yet implemented")
}
diff --git a/tests/uitests/Android.bp b/tests/uitests/Android.bp
index f3f5201..d5852b3 100644
--- a/tests/uitests/Android.bp
+++ b/tests/uitests/Android.bp
@@ -13,6 +13,7 @@
// limitations under the License.
package {
+ default_team: "trendy_team_android_settings_app",
// See: http://go/android-license-faq
// A large-scale-change added 'default_applicable_licenses' to import
// all of the 'license_kinds' from "packages_apps_Settings_license"
diff --git a/tests/unit/Android.bp b/tests/unit/Android.bp
index 9d2d686..0f844d0 100644
--- a/tests/unit/Android.bp
+++ b/tests/unit/Android.bp
@@ -1,4 +1,5 @@
package {
+ default_team: "trendy_team_android_settings_app",
// See: http://go/android-license-faq
// A large-scale-change added 'default_applicable_licenses' to import
// all of the 'license_kinds' from "packages_apps_Settings_license"
diff --git a/tests/unit/src/com/android/settings/applications/credentials/CredentialManagerPreferenceControllerTest.java b/tests/unit/src/com/android/settings/applications/credentials/CredentialManagerPreferenceControllerTest.java
index b5aeac7..0a04a73 100644
--- a/tests/unit/src/com/android/settings/applications/credentials/CredentialManagerPreferenceControllerTest.java
+++ b/tests/unit/src/com/android/settings/applications/credentials/CredentialManagerPreferenceControllerTest.java
@@ -217,33 +217,33 @@
assertThat(controller.isHiddenDueToNoProviderSet()).isFalse();
assertThat(controller.getAvailabilityStatus()).isEqualTo(AVAILABLE);
- // Ensure that we stay under 5 providers.
+ // Ensure that we stay under 5 providers (one is reserved for primary).
assertThat(controller.togglePackageNameEnabled("com.android.provider1")).isTrue();
assertThat(controller.togglePackageNameEnabled("com.android.provider2")).isTrue();
assertThat(controller.togglePackageNameEnabled("com.android.provider3")).isTrue();
assertThat(controller.togglePackageNameEnabled("com.android.provider4")).isTrue();
- assertThat(controller.togglePackageNameEnabled("com.android.provider5")).isTrue();
+ assertThat(controller.togglePackageNameEnabled("com.android.provider5")).isFalse();
assertThat(controller.togglePackageNameEnabled("com.android.provider6")).isFalse();
// Check that they are all actually registered.
Set<String> enabledProviders = controller.getEnabledProviders();
- assertThat(enabledProviders.size()).isEqualTo(5);
+ assertThat(enabledProviders.size()).isEqualTo(4);
assertThat(enabledProviders.contains("com.android.provider1")).isTrue();
assertThat(enabledProviders.contains("com.android.provider2")).isTrue();
assertThat(enabledProviders.contains("com.android.provider3")).isTrue();
assertThat(enabledProviders.contains("com.android.provider4")).isTrue();
- assertThat(enabledProviders.contains("com.android.provider5")).isTrue();
+ assertThat(enabledProviders.contains("com.android.provider5")).isFalse();
assertThat(enabledProviders.contains("com.android.provider6")).isFalse();
// Check that the settings string has the right component names.
List<String> enabledServices = controller.getEnabledSettings();
- assertThat(enabledServices.size()).isEqualTo(6);
+ assertThat(enabledServices.size()).isEqualTo(5);
assertThat(enabledServices.contains("com.android.provider1/ClassA")).isTrue();
assertThat(enabledServices.contains("com.android.provider1/ClassB")).isTrue();
assertThat(enabledServices.contains("com.android.provider2/ClassA")).isTrue();
assertThat(enabledServices.contains("com.android.provider3/ClassA")).isTrue();
assertThat(enabledServices.contains("com.android.provider4/ClassA")).isTrue();
- assertThat(enabledServices.contains("com.android.provider5/ClassA")).isTrue();
+ assertThat(enabledServices.contains("com.android.provider5/ClassA")).isFalse();
assertThat(enabledServices.contains("com.android.provider6/ClassA")).isFalse();
// Toggle the provider disabled.
@@ -251,22 +251,22 @@
// Check that the provider was removed from the list of providers.
Set<String> currentlyEnabledProviders = controller.getEnabledProviders();
- assertThat(currentlyEnabledProviders.size()).isEqualTo(4);
+ assertThat(currentlyEnabledProviders.size()).isEqualTo(3);
assertThat(currentlyEnabledProviders.contains("com.android.provider1")).isTrue();
assertThat(currentlyEnabledProviders.contains("com.android.provider2")).isFalse();
assertThat(currentlyEnabledProviders.contains("com.android.provider3")).isTrue();
assertThat(currentlyEnabledProviders.contains("com.android.provider4")).isTrue();
- assertThat(currentlyEnabledProviders.contains("com.android.provider5")).isTrue();
+ assertThat(currentlyEnabledProviders.contains("com.android.provider5")).isFalse();
assertThat(currentlyEnabledProviders.contains("com.android.provider6")).isFalse();
// Check that the provider was removed from the list of services stored in the setting.
List<String> currentlyEnabledServices = controller.getEnabledSettings();
- assertThat(currentlyEnabledServices.size()).isEqualTo(5);
+ assertThat(currentlyEnabledServices.size()).isEqualTo(4);
assertThat(currentlyEnabledServices.contains("com.android.provider1/ClassA")).isTrue();
assertThat(currentlyEnabledServices.contains("com.android.provider1/ClassB")).isTrue();
assertThat(currentlyEnabledServices.contains("com.android.provider3/ClassA")).isTrue();
assertThat(currentlyEnabledServices.contains("com.android.provider4/ClassA")).isTrue();
- assertThat(currentlyEnabledServices.contains("com.android.provider5/ClassA")).isTrue();
+ assertThat(currentlyEnabledServices.contains("com.android.provider5/ClassA")).isFalse();
assertThat(currentlyEnabledServices.contains("com.android.provider6/ClassA")).isFalse();
}
@@ -528,6 +528,17 @@
assertThat(thumbnail.getIntrinsicWidth()).isEqualTo(getIconSize());
}
+ @Test
+ public void testProviderLimitReached() {
+ // The limit is 5 with one slot reserved for primary.
+ assertThat(CredentialManagerPreferenceController.hasProviderLimitBeenReached(0)).isFalse();
+ assertThat(CredentialManagerPreferenceController.hasProviderLimitBeenReached(1)).isFalse();
+ assertThat(CredentialManagerPreferenceController.hasProviderLimitBeenReached(2)).isFalse();
+ assertThat(CredentialManagerPreferenceController.hasProviderLimitBeenReached(3)).isFalse();
+ assertThat(CredentialManagerPreferenceController.hasProviderLimitBeenReached(4)).isTrue();
+ assertThat(CredentialManagerPreferenceController.hasProviderLimitBeenReached(5)).isTrue();
+ }
+
private int getIconSize() {
final Resources resources = mContext.getResources();
return (int) resources.getDimension(android.R.dimen.app_icon_size);
diff --git a/tests/unit/src/com/android/settings/applications/credentials/PrimaryProviderPreferenceTest.java b/tests/unit/src/com/android/settings/applications/credentials/PrimaryProviderPreferenceTest.java
index 51a1fc4..9ea16bb 100644
--- a/tests/unit/src/com/android/settings/applications/credentials/PrimaryProviderPreferenceTest.java
+++ b/tests/unit/src/com/android/settings/applications/credentials/PrimaryProviderPreferenceTest.java
@@ -114,50 +114,21 @@
}
@Test
- public void ensureButtonsClicksCallDelegate_newDesign_buttonsHidden() {
+ public void ensureButtonsClicksCallDelegate_newDesign_buttonsCompactMode() {
if (!PrimaryProviderPreference.shouldUseNewSettingsUi()) {
return;
}
PrimaryProviderPreference ppp = createTestPreferenceWithNewLayout();
+ int initialPaddingLeft = ppp.getButtonFrameView().getPaddingLeft();
- // Test that the buttons are visible.
- assertThat(ppp.getButtonFrameView()).isNotNull();
- assertThat(ppp.getButtonFrameView().getVisibility()).isEqualTo(View.GONE);
- assertThat(mReceivedChangeButtonClicked).isFalse();
+ // If we show the buttons the left padding should be updated.
+ ppp.setButtonsCompactMode(true);
+ assertThat(ppp.getButtonFrameView().getPaddingLeft()).isNotEqualTo(initialPaddingLeft);
- // If we show the buttons the visiblility should be updated.
- ppp.setButtonsVisible(true);
- assertThat(ppp.getButtonFrameView().getVisibility()).isEqualTo(View.VISIBLE);
-
- // If we hide the buttons the visibility should be updated.
- ppp.setButtonsVisible(false);
- assertThat(ppp.getButtonFrameView().getVisibility()).isEqualTo(View.GONE);
- }
-
- @Test
- public void ensureButtonsClicksCallDelegate_oldDesign() {
- if (PrimaryProviderPreference.shouldUseNewSettingsUi()) {
- return;
- }
-
- PrimaryProviderPreference ppp = createTestPreference("preference_widget_gear");
-
- // Test that clicking the preference results in the delegate being
- // called.
- assertThat(mReceivedOpenButtonClicked).isFalse();
- ppp.getOnPreferenceClickListener().onPreferenceClick(ppp);
- assertThat(mReceivedOpenButtonClicked).isTrue();
-
- // Test that the gear button is present and visible.
- assertThat(ppp.getGearView()).isNotNull();
- assertThat(ppp.getGearView().getVisibility()).isEqualTo(View.VISIBLE);
-
- // Test that clicking the gear button results in the delegate being
- // called.
- assertThat(mReceivedChangeButtonClicked).isFalse();
- ppp.getGearView().performClick();
- assertThat(mReceivedChangeButtonClicked).isTrue();
+ // If we hide the buttons the left padding should be updated.
+ ppp.setButtonsCompactMode(false);
+ assertThat(ppp.getButtonFrameView().getPaddingLeft()).isEqualTo(initialPaddingLeft);
}
private PrimaryProviderPreference createTestPreferenceWithNewLayout() {
diff --git a/tests/unit/src/com/android/settings/fingerprint2/domain/interactor/FingerprintManagerInteractorTest.kt b/tests/unit/src/com/android/settings/fingerprint2/domain/interactor/FingerprintManagerInteractorTest.kt
index 3440d2a..f1808e3 100644
--- a/tests/unit/src/com/android/settings/fingerprint2/domain/interactor/FingerprintManagerInteractorTest.kt
+++ b/tests/unit/src/com/android/settings/fingerprint2/domain/interactor/FingerprintManagerInteractorTest.kt
@@ -26,17 +26,23 @@
import android.os.Handler
import androidx.test.core.app.ApplicationProvider
import com.android.settings.biometrics.GatekeeperPasswordProvider
+import com.android.settings.biometrics.fingerprint2.data.repository.FingerprintSensorRepo
import com.android.settings.biometrics.fingerprint2.domain.interactor.FingerprintManagerInteractorImpl
-import com.android.settings.biometrics.fingerprint2.shared.data.repository.PressToAuthProvider
-import com.android.settings.biometrics.fingerprint2.shared.domain.interactor.FingerprintManagerInteractor
-import com.android.settings.biometrics.fingerprint2.shared.model.Default
-import com.android.settings.biometrics.fingerprint2.shared.model.EnrollReason
-import com.android.settings.biometrics.fingerprint2.shared.model.FingerEnrollState
-import com.android.settings.biometrics.fingerprint2.shared.model.FingerprintAuthAttemptModel
-import com.android.settings.biometrics.fingerprint2.shared.model.FingerprintData
+import com.android.settings.biometrics.fingerprint2.data.repository.PressToAuthRepo
+import com.android.settings.biometrics.fingerprint2.lib.domain.interactor.FingerprintManagerInteractor
+import com.android.settings.biometrics.fingerprint2.lib.model.Default
+import com.android.settings.biometrics.fingerprint2.lib.model.EnrollReason
+import com.android.settings.biometrics.fingerprint2.lib.model.FingerEnrollState
+import com.android.settings.biometrics.fingerprint2.lib.model.FingerprintAuthAttemptModel
+import com.android.settings.biometrics.fingerprint2.lib.model.FingerprintData
import com.android.settings.password.ChooseLockSettingsHelper
+import com.android.systemui.biometrics.shared.model.FingerprintSensor
+import com.android.systemui.biometrics.shared.model.FingerprintSensorType
+import com.android.systemui.biometrics.shared.model.SensorStrength
import com.google.common.truth.Truth.assertThat
import kotlinx.coroutines.cancelAndJoin
+import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.flowOf
import kotlinx.coroutines.flow.last
import kotlinx.coroutines.launch
import kotlinx.coroutines.test.StandardTestDispatcher
@@ -71,21 +77,28 @@
@Mock private lateinit var gateKeeperPasswordProvider: GatekeeperPasswordProvider
private var testScope = TestScope(backgroundDispatcher)
- private var pressToAuthProvider =
- object : PressToAuthProvider {
+ private var pressToAuthRepo =
+ object : PressToAuthRepo {
override val isEnabled: Boolean
get() = false
}
@Before
fun setup() {
+ val sensor = FingerprintSensor(1, SensorStrength.STRONG, 5, FingerprintSensorType.POWER_BUTTON)
+ val fingerprintSensorRepo =
+ object : FingerprintSensorRepo {
+ override val fingerprintSensor: Flow<FingerprintSensor> = flowOf(sensor)
+ }
+
underTest =
FingerprintManagerInteractorImpl(
context,
backgroundDispatcher,
fingerprintManager,
+ fingerprintSensorRepo,
gateKeeperPasswordProvider,
- pressToAuthProvider,
+ pressToAuthRepo,
Default,
)
}
diff --git a/tests/unit/src/com/android/settings/fingerprint2/enrollment/viewmodel/FingerprintEnrollFindSensorViewModelV2Test.kt b/tests/unit/src/com/android/settings/fingerprint2/enrollment/viewmodel/FingerprintEnrollFindSensorViewModelV2Test.kt
index bd94cba..3b02d49 100644
--- a/tests/unit/src/com/android/settings/fingerprint2/enrollment/viewmodel/FingerprintEnrollFindSensorViewModelV2Test.kt
+++ b/tests/unit/src/com/android/settings/fingerprint2/enrollment/viewmodel/FingerprintEnrollFindSensorViewModelV2Test.kt
@@ -21,16 +21,17 @@
import android.view.accessibility.AccessibilityManager
import androidx.arch.core.executor.testing.InstantTaskExecutorRule
import androidx.test.core.app.ApplicationProvider
-import com.android.settings.biometrics.fingerprint2.shared.model.Default
+import com.android.settings.biometrics.fingerprint2.lib.model.Default
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.AccessibilityViewModel
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.BackgroundViewModel
-import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.Education
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintEnrollFindSensorViewModel
-import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintEnrollNavigationViewModel
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintEnrollViewModel
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintFlowViewModel
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintGatekeeperViewModel
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintNavigationStep.Education
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintNavigationViewModel
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FoldStateViewModel
-import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.NextStepViewModel
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.NavigationState
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.OrientationStateViewModel
import com.android.settings.testutils2.FakeFingerprintManagerInteractor
import com.android.systemui.biometrics.shared.model.FingerprintSensor
@@ -38,7 +39,6 @@
import com.android.systemui.biometrics.shared.model.SensorStrength
import com.google.common.truth.Truth.assertThat
import kotlinx.coroutines.Dispatchers
-import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.launch
import kotlinx.coroutines.test.StandardTestDispatcher
import kotlinx.coroutines.test.TestScope
@@ -67,7 +67,7 @@
private lateinit var fakeFingerprintManagerInteractor: FakeFingerprintManagerInteractor
private lateinit var gatekeeperViewModel: FingerprintGatekeeperViewModel
private lateinit var enrollViewModel: FingerprintEnrollViewModel
- private lateinit var navigationViewModel: FingerprintEnrollNavigationViewModel
+ private lateinit var navigationViewModel: FingerprintNavigationViewModel
private lateinit var accessibilityViewModel: AccessibilityViewModel
private lateinit var foldStateViewModel: FoldStateViewModel
private lateinit var orientationStateViewModel: OrientationStateViewModel
@@ -87,18 +87,19 @@
gatekeeperViewModel =
FingerprintGatekeeperViewModel.FingerprintGatekeeperViewModelFactory(
null,
- fakeFingerprintManagerInteractor
+ fakeFingerprintManagerInteractor,
)
.create(FingerprintGatekeeperViewModel::class.java)
+
+ val sensor = FingerprintSensor(1, SensorStrength.STRONG, 5, FingerprintSensorType.POWER_BUTTON)
+ val fingerprintFlowViewModel = FingerprintFlowViewModel(Default)
navigationViewModel =
- FingerprintEnrollNavigationViewModel.FingerprintEnrollNavigationViewModelFactory(
- backgroundDispatcher,
- fakeFingerprintManagerInteractor,
- gatekeeperViewModel,
- canSkipConfirm = true,
- Default,
- )
- .create(FingerprintEnrollNavigationViewModel::class.java)
+ FingerprintNavigationViewModel(
+ Education(sensor),
+ false,
+ fingerprintFlowViewModel,
+ fakeFingerprintManagerInteractor,
+ )
backgroundViewModel =
BackgroundViewModel.BackgroundViewModelFactory().create(BackgroundViewModel::class.java)
@@ -126,12 +127,10 @@
backgroundViewModel,
accessibilityViewModel,
foldStateViewModel,
- orientationStateViewModel
+ orientationStateViewModel,
+ fingerprintFlowViewModel,
)
.create(FingerprintEnrollFindSensorViewModel::class.java)
-
- // Navigate to Education page
- navigationViewModel.nextStep()
}
@After
@@ -142,18 +141,6 @@
// TODO(b/305094585): test enroll() logic
@Test
- fun currentStepIsEducation() =
- testScope.runTest {
- var step: NextStepViewModel? = null
- val job = launch {
- navigationViewModel.navigationViewModel.collectLatest { step = it.currStep }
- }
- advanceUntilIdle()
- assertThat(step).isEqualTo(Education)
- job.cancel()
- }
-
- @Test
fun udfpsLottieInfo() =
testScope.runTest {
fakeFingerprintManagerInteractor.sensorProp =
@@ -161,7 +148,7 @@
0 /* sensorId */,
SensorStrength.STRONG,
5,
- FingerprintSensorType.UDFPS_OPTICAL
+ FingerprintSensorType.UDFPS_OPTICAL,
)
var udfpsLottieInfo: Boolean? = null
@@ -234,7 +221,7 @@
0 /* sensorId */,
SensorStrength.STRONG,
5,
- FingerprintSensorType.UDFPS_OPTICAL
+ FingerprintSensorType.UDFPS_OPTICAL,
)
var showPrimaryButton: Boolean? = null
diff --git a/tests/unit/src/com/android/settings/fingerprint2/ui/enrollment/viewmodel/FingerprintEnrollEnrollingViewModelTest.kt b/tests/unit/src/com/android/settings/fingerprint2/ui/enrollment/viewmodel/FingerprintEnrollEnrollingViewModelTest.kt
index efb4a07..4678da1 100644
--- a/tests/unit/src/com/android/settings/fingerprint2/ui/enrollment/viewmodel/FingerprintEnrollEnrollingViewModelTest.kt
+++ b/tests/unit/src/com/android/settings/fingerprint2/ui/enrollment/viewmodel/FingerprintEnrollEnrollingViewModelTest.kt
@@ -17,16 +17,20 @@
package com.android.settings.fingerprint2.ui.enrollment.viewmodel
import androidx.arch.core.executor.testing.InstantTaskExecutorRule
-import com.android.settings.biometrics.fingerprint2.shared.model.Default
+import com.android.settings.biometrics.fingerprint2.lib.model.Default
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.BackgroundViewModel
-import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.Enrollment
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintEnrollEnrollingViewModel
-import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintEnrollNavigationViewModel
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintEnrollViewModel
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintFlowViewModel
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintGatekeeperViewModel
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintNavigationStep.Enrollment
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintNavigationViewModel
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.GatekeeperInfo
-import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.NavState
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.NavigationState
import com.android.settings.testutils2.FakeFingerprintManagerInteractor
+import com.android.systemui.biometrics.shared.model.FingerprintSensor
+import com.android.systemui.biometrics.shared.model.FingerprintSensorType
+import com.android.systemui.biometrics.shared.model.SensorStrength
import com.google.common.truth.Truth.assertThat
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
@@ -54,7 +58,7 @@
private lateinit var enrollEnrollingViewModel: FingerprintEnrollEnrollingViewModel
private lateinit var backgroundViewModel: BackgroundViewModel
private lateinit var gateKeeperViewModel: FingerprintGatekeeperViewModel
- private lateinit var navigationViewModel: FingerprintEnrollNavigationViewModel
+ private lateinit var navigationViewModel: FingerprintNavigationViewModel
private val defaultGatekeeperInfo = GatekeeperInfo.GatekeeperPasswordInfo(byteArrayOf(1, 3), 3)
private var testScope = TestScope(backgroundDispatcher)
@@ -65,18 +69,18 @@
gateKeeperViewModel =
FingerprintGatekeeperViewModel.FingerprintGatekeeperViewModelFactory(
gatekeeperInfo,
- fakeFingerprintManagerInteractor
+ fakeFingerprintManagerInteractor,
)
.create(FingerprintGatekeeperViewModel::class.java)
+ val sensor = FingerprintSensor(1, SensorStrength.STRONG, 5, FingerprintSensorType.POWER_BUTTON)
+ val fingerprintFlowViewModel = FingerprintFlowViewModel(Default)
navigationViewModel =
- FingerprintEnrollNavigationViewModel(
- backgroundDispatcher,
+ FingerprintNavigationViewModel(
+ Enrollment(sensor),
+ false,
+ fingerprintFlowViewModel,
fakeFingerprintManagerInteractor,
- gateKeeperViewModel,
- Enrollment,
- NavState(true),
- Default,
)
backgroundViewModel =
diff --git a/tests/unit/src/com/android/settings/fingerprint2/ui/settings/FingerprintSettingsNavigationViewModelTest.kt b/tests/unit/src/com/android/settings/fingerprint2/ui/settings/FingerprintSettingsNavigationViewModelTest.kt
index 064e087..201fffa 100644
--- a/tests/unit/src/com/android/settings/fingerprint2/ui/settings/FingerprintSettingsNavigationViewModelTest.kt
+++ b/tests/unit/src/com/android/settings/fingerprint2/ui/settings/FingerprintSettingsNavigationViewModelTest.kt
@@ -18,7 +18,7 @@
import androidx.arch.core.executor.testing.InstantTaskExecutorRule
import com.android.settings.biometrics.BiometricEnrollBase
-import com.android.settings.biometrics.fingerprint2.shared.model.FingerprintData
+import com.android.settings.biometrics.fingerprint2.lib.model.FingerprintData
import com.android.settings.biometrics.fingerprint2.ui.settings.viewmodel.EnrollFirstFingerprint
import com.android.settings.biometrics.fingerprint2.ui.settings.viewmodel.FingerprintSettingsNavigationViewModel
import com.android.settings.biometrics.fingerprint2.ui.settings.viewmodel.FinishSettings
diff --git a/tests/unit/src/com/android/settings/fingerprint2/ui/settings/FingerprintSettingsViewModelTest.kt b/tests/unit/src/com/android/settings/fingerprint2/ui/settings/FingerprintSettingsViewModelTest.kt
index 4bd9121..6577c95 100644
--- a/tests/unit/src/com/android/settings/fingerprint2/ui/settings/FingerprintSettingsViewModelTest.kt
+++ b/tests/unit/src/com/android/settings/fingerprint2/ui/settings/FingerprintSettingsViewModelTest.kt
@@ -17,8 +17,8 @@
package com.android.settings.fingerprint2.ui.settings
import androidx.arch.core.executor.testing.InstantTaskExecutorRule
-import com.android.settings.biometrics.fingerprint2.shared.model.FingerprintAuthAttemptModel
-import com.android.settings.biometrics.fingerprint2.shared.model.FingerprintData
+import com.android.settings.biometrics.fingerprint2.lib.model.FingerprintAuthAttemptModel
+import com.android.settings.biometrics.fingerprint2.lib.model.FingerprintData
import com.android.settings.biometrics.fingerprint2.ui.settings.viewmodel.FingerprintSettingsNavigationViewModel
import com.android.settings.biometrics.fingerprint2.ui.settings.viewmodel.FingerprintSettingsViewModel
import com.android.settings.biometrics.fingerprint2.ui.settings.viewmodel.PreferenceViewModel
diff --git a/tests/unit/src/com/android/settings/privacy/CameraExtensionsFallbackPreferenceControllerTest.java b/tests/unit/src/com/android/settings/privacy/CameraExtensionsFallbackPreferenceControllerTest.java
new file mode 100644
index 0000000..8871be9
--- /dev/null
+++ b/tests/unit/src/com/android/settings/privacy/CameraExtensionsFallbackPreferenceControllerTest.java
@@ -0,0 +1,91 @@
+/*
+ * 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.privacy;
+
+import static com.android.settings.core.BasePreferenceController.AVAILABLE;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.content.ContentResolver;
+import android.content.Context;
+import android.provider.Settings;
+
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import com.android.settings.privacy.CameraExtensionsFallbackPreferenceController;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(AndroidJUnit4.class)
+public class CameraExtensionsFallbackPreferenceControllerTest {
+
+ private static final String KEY = "camera_extensions_fallback";
+ private final Context mContext = ApplicationProvider.getApplicationContext();
+
+ private int mOriginalPreference;
+ private ContentResolver mContentResolver;
+ private CameraExtensionsFallbackPreferenceController mController;
+
+ @Before
+ public void setUp() {
+ mContentResolver = mContext.getContentResolver();
+ mOriginalPreference = Settings.Secure.getInt(mContentResolver,
+ Settings.Secure.CAMERA_EXTENSIONS_FALLBACK, 1);
+ mController = new CameraExtensionsFallbackPreferenceController(mContext, KEY);
+ }
+
+ @After
+ public void tearDown() {
+ Settings.Secure.putInt(mContentResolver, Settings.Secure.CAMERA_EXTENSIONS_FALLBACK,
+ mOriginalPreference);
+ }
+
+ @Test
+ public void getAvailability_returnAvailable() {
+ assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE);
+ }
+
+ @Test
+ public void setChecked_disable_shouldTurnOff() {
+ Settings.Secure.putInt(mContentResolver,
+ Settings.Secure.CAMERA_EXTENSIONS_FALLBACK, 1);
+
+ assertThat(mController.isChecked()).isTrue();
+
+ mController.setChecked(false);
+
+ assertThat(Settings.Secure.getInt(mContentResolver,
+ Settings.Secure.CAMERA_EXTENSIONS_FALLBACK, -1)).isEqualTo(0);
+ }
+
+ @Test
+ public void setChecked_enable_shouldTurnOn() {
+ Settings.Secure.putInt(mContentResolver,
+ Settings.Secure.CAMERA_EXTENSIONS_FALLBACK, 0);
+
+ assertThat(mController.isChecked()).isFalse();
+
+ mController.setChecked(true);
+
+ assertThat(Settings.Secure.getInt(mContentResolver,
+ Settings.Secure.CAMERA_EXTENSIONS_FALLBACK, -1)).isEqualTo(1);
+ }
+}
diff --git a/tests/unit/src/com/android/settings/testutils/FakeFeatureFactory.java b/tests/unit/src/com/android/settings/testutils/FakeFeatureFactory.java
index 6c4c5b4..9e7948c 100644
--- a/tests/unit/src/com/android/settings/testutils/FakeFeatureFactory.java
+++ b/tests/unit/src/com/android/settings/testutils/FakeFeatureFactory.java
@@ -33,6 +33,7 @@
import com.android.settings.dashboard.suggestions.SuggestionFeatureProvider;
import com.android.settings.deviceinfo.hardwareinfo.HardwareInfoFeatureProvider;
import com.android.settings.deviceinfo.hardwareinfo.HardwareInfoFeatureProviderImpl;
+import com.android.settings.display.DisplayFeatureProvider;
import com.android.settings.enterprise.EnterprisePrivacyFeatureProvider;
import com.android.settings.fuelgauge.BatterySettingsFeatureProvider;
import com.android.settings.fuelgauge.BatteryStatusFeatureProvider;
@@ -100,6 +101,7 @@
public OnboardingFeatureProvider mOnboardingFeatureProvider;
public FastPairFeatureProvider mFastPairFeatureProvider;
public PrivateSpaceLoginFeatureProvider mPrivateSpaceLoginFeatureProvider;
+ public DisplayFeatureProvider mDisplayFeatureProvider;
/** Call this in {@code @Before} method of the test class to use fake factory. */
public static FakeFeatureFactory setupForTest() {
@@ -150,6 +152,7 @@
mOnboardingFeatureProvider = mock(OnboardingFeatureProvider.class);
mFastPairFeatureProvider = mock(FastPairFeatureProvider.class);
mPrivateSpaceLoginFeatureProvider = mock(PrivateSpaceLoginFeatureProvider.class);
+ mDisplayFeatureProvider = mock(DisplayFeatureProvider.class);
}
@Override
@@ -332,4 +335,9 @@
public PrivateSpaceLoginFeatureProvider getPrivateSpaceLoginFeatureProvider() {
return mPrivateSpaceLoginFeatureProvider;
}
+
+ @Override
+ public DisplayFeatureProvider getDisplayFeatureProvider() {
+ return mDisplayFeatureProvider;
+ }
}