Merge "Revert "Use Mockito 4.6.1 API"" into tm-qpr-dev
diff --git a/Android.bp b/Android.bp
index 64fc327..6d9ff8f 100644
--- a/Android.bp
+++ b/Android.bp
@@ -28,6 +28,14 @@
}
filegroup {
+ name: "ThemePicker_src_overrides",
+ srcs: [
+ "src_override/**/*.java",
+ "src_override/**/*.kt",
+ ],
+}
+
+filegroup {
name: "ThemePicker_Manifest",
srcs: [
"AndroidManifest.xml",
@@ -46,11 +54,20 @@
+ "$(location soong_zip) -o $(out) -C $$RES_DIR -D $$RES_DIR"
}
-//
-// Build app code.
-//
-android_app {
- name: "ThemePicker",
+genrule {
+ name: "ThemePicker_res_overrides",
+ tools: ["soong_zip"],
+ srcs: [
+ "res_override/**/*",
+ ],
+ out: ["ThemePicker_res_overrides.zip"],
+ cmd: "INPUTS=($(in)) && "
+ + "RES_DIR=$$(dirname $$(dirname $${INPUTS[0]})) && "
+ + "$(location soong_zip) -o $(out) -C $$RES_DIR -D $$RES_DIR"
+}
+
+java_defaults {
+ name: "ThemePicker_defaults",
static_libs: [
"guava",
@@ -73,17 +90,12 @@
srcs: [
":WallpaperPicker2_srcs",
":ThemePicker_srcs",
- "src_override/**/*.java",
- "src_override/**/*.kt",
- ],
-
- resource_dirs: [
- "res_override",
+ ":ThemePicker_src_overrides",
],
use_embedded_native_libs: true,
- resource_zips: [":WallpaperPicker2_res", ":ThemePicker_res"],
+ resource_zips: [":WallpaperPicker2_res", ":ThemePicker_res", ":ThemePicker_res_overrides"],
optimize: {
enabled: false,
@@ -93,6 +105,15 @@
privileged: true,
system_ext_specific: true,
+}
+
+//
+// Build app code.
+//
+android_app {
+ name: "ThemePicker",
+ defaults: ["ThemePicker_defaults"],
+
platform_apis: true,
manifest: "AndroidManifest.xml",
additional_manifests: [":WallpaperPicker2_Manifest"],
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 4282a08..4e71bcc 100755
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -10,7 +10,7 @@
<uses-permission android:name="android.permission.SET_WALLPAPER_COMPONENT" />
<uses-permission android:name="android.permission.READ_DEVICE_CONFIG" />
<uses-permission android:name="android.permission.MODIFY_DAY_NIGHT_MODE" />
- <uses-permission android:name="android.permission.ACCESS_KEYGUARD_QUICK_AFFORDANCES" />
+ <uses-permission android:name="android.permission.CUSTOMIZE_SYSTEM_UI" />
<queries>
<!-- Specific intents Wallpaper picker query for -->
diff --git a/res/drawable/button_background.xml b/res/drawable/button_background.xml
new file mode 100644
index 0000000..24c7253
--- /dev/null
+++ b/res/drawable/button_background.xml
@@ -0,0 +1,20 @@
+<!--
+ Copyright (C) 2021 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+ android:shape="rectangle">
+ <corners android:radius="50dp" />
+ <solid android:color="@color/color_accent_primary" />
+</shape>
diff --git a/res/layout/keyguard_quick_affordance_enablement_dialog.xml b/res/layout/keyguard_quick_affordance_enablement_dialog.xml
new file mode 100644
index 0000000..d6ba105
--- /dev/null
+++ b/res/layout/keyguard_quick_affordance_enablement_dialog.xml
@@ -0,0 +1,59 @@
+<?xml version="1.0" encoding="utf-8"?><!--
+ ~ Copyright (C) 2022 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ ~
+ -->
+
+<LinearLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:background="@drawable/keyguard_quick_affordance_picker_background"
+ android:orientation="vertical"
+ android:padding="24dp">
+
+ <ImageView
+ android:id="@+id/icon"
+ android:layout_width="32dp"
+ android:layout_height="32dp"
+ android:tint="@color/color_accent_primary"
+ android:layout_gravity="center_horizontal"
+ android:layout_marginBottom="16dp" />
+
+ <TextView
+ android:id="@+id/title"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:gravity="center"
+ android:textAppearance="@style/TextAppearance.MaterialComponents.Headline4"
+ android:layout_gravity="center_horizontal"
+ android:layout_marginBottom="16dp" />
+
+ <TextView
+ android:id="@+id/message"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:textAppearance="@style/TextAppearance.MaterialComponents.Body1"
+ android:layout_gravity="center_horizontal"
+ android:layout_marginBottom="38dp" />
+
+ <Button
+ android:id="@+id/button"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ style="@style/ActionPrimaryButton"
+ android:background="@drawable/button_background"
+ android:layout_gravity="end" />
+
+</LinearLayout>
diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml
index 5144dc7..09414f7 100644
--- a/res/values-af/strings.xml
+++ b/res/values-af/strings.xml
@@ -94,7 +94,8 @@
<string name="keyguard_slot_name_bottom_start" msgid="6717374042663171860">"Linkerknoppie"</string>
<string name="keyguard_slot_name_bottom_end" msgid="7636885379738905151">"Regterknoppie"</string>
<string name="keyguard_affordance_none" msgid="1751643933430782312">"Geen"</string>
- <string name="keyguard_affordance_enablement_dialog_title" msgid="307756993596011884">"Bykomende opstelling word benodig"</string>
+ <!-- no translation found for keyguard_affordance_enablement_dialog_title (3389730825561696493) -->
+ <skip />
<string name="keyguard_affordance_enablement_dialog_action_template" msgid="8117011931337357438">"Maak <xliff:g id="APPNAME">%1$s</xliff:g> oop"</string>
<string name="keyguard_affordance_enablement_dialog_message" msgid="6136286758939253570">"Om die <xliff:g id="APPNAME">%1$s</xliff:g>-app as ’n kortpad by te voeg, moet jy seker maak dat"</string>
<string name="keyguard_affordance_enablement_dialog_dismiss_button" msgid="629754625264422508">"Klaar"</string>
diff --git a/res/values-am/strings.xml b/res/values-am/strings.xml
index e7e5e12..eb7dc2f 100644
--- a/res/values-am/strings.xml
+++ b/res/values-am/strings.xml
@@ -94,7 +94,8 @@
<string name="keyguard_slot_name_bottom_start" msgid="6717374042663171860">"የግራ አዝራር"</string>
<string name="keyguard_slot_name_bottom_end" msgid="7636885379738905151">"የቀኝ አዝራር"</string>
<string name="keyguard_affordance_none" msgid="1751643933430782312">"ምንም"</string>
- <string name="keyguard_affordance_enablement_dialog_title" msgid="307756993596011884">"ተጨማሪ ውቅረት ያስፈልጋል"</string>
+ <!-- no translation found for keyguard_affordance_enablement_dialog_title (3389730825561696493) -->
+ <skip />
<string name="keyguard_affordance_enablement_dialog_action_template" msgid="8117011931337357438">"<xliff:g id="APPNAME">%1$s</xliff:g> ይክፈቱ"</string>
<string name="keyguard_affordance_enablement_dialog_message" msgid="6136286758939253570">"የ<xliff:g id="APPNAME">%1$s</xliff:g> መተግበሪያን እንደ አቋራጭ ለማከል የሚከተሉትን ማድረግዎን እርግጠኛ ይሁኑ"</string>
<string name="keyguard_affordance_enablement_dialog_dismiss_button" msgid="629754625264422508">"ተከናውኗል"</string>
diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml
index c7750d2..f3acb4a 100644
--- a/res/values-ar/strings.xml
+++ b/res/values-ar/strings.xml
@@ -94,7 +94,8 @@
<string name="keyguard_slot_name_bottom_start" msgid="6717374042663171860">"الزر الأيسر"</string>
<string name="keyguard_slot_name_bottom_end" msgid="7636885379738905151">"الزر الأيمن"</string>
<string name="keyguard_affordance_none" msgid="1751643933430782312">"بدون أزرار"</string>
- <string name="keyguard_affordance_enablement_dialog_title" msgid="307756993596011884">"يجب ضبط إعدادات إضافية"</string>
+ <!-- no translation found for keyguard_affordance_enablement_dialog_title (3389730825561696493) -->
+ <skip />
<string name="keyguard_affordance_enablement_dialog_action_template" msgid="8117011931337357438">"فتح <xliff:g id="APPNAME">%1$s</xliff:g>"</string>
<string name="keyguard_affordance_enablement_dialog_message" msgid="6136286758939253570">"لإضافة تطبيق \"<xliff:g id="APPNAME">%1$s</xliff:g>\" كاختصار، تأكَّد من"</string>
<string name="keyguard_affordance_enablement_dialog_dismiss_button" msgid="629754625264422508">"تم"</string>
diff --git a/res/values-as/strings.xml b/res/values-as/strings.xml
index 17cb28d..1c0c031 100644
--- a/res/values-as/strings.xml
+++ b/res/values-as/strings.xml
@@ -94,7 +94,8 @@
<string name="keyguard_slot_name_bottom_start" msgid="6717374042663171860">"বাওঁফালৰ বুটাম"</string>
<string name="keyguard_slot_name_bottom_end" msgid="7636885379738905151">"সোঁফালৰ বুটাম"</string>
<string name="keyguard_affordance_none" msgid="1751643933430782312">"নাই"</string>
- <string name="keyguard_affordance_enablement_dialog_title" msgid="307756993596011884">"অতিৰিক্ত ছেটআপৰ আৱশ্যক"</string>
+ <!-- no translation found for keyguard_affordance_enablement_dialog_title (3389730825561696493) -->
+ <skip />
<string name="keyguard_affordance_enablement_dialog_action_template" msgid="8117011931337357438">"<xliff:g id="APPNAME">%1$s</xliff:g> খোলক"</string>
<string name="keyguard_affordance_enablement_dialog_message" msgid="6136286758939253570">"<xliff:g id="APPNAME">%1$s</xliff:g> এপ্টোক এটা শ্বৰ্টকাট হিচাপে যোগ দিবলৈ, এইকেইটা কথা নিশ্চিত কৰক"</string>
<string name="keyguard_affordance_enablement_dialog_dismiss_button" msgid="629754625264422508">"কৰা হ’ল"</string>
diff --git a/res/values-az/strings.xml b/res/values-az/strings.xml
index 791c879..5a5bb5d 100644
--- a/res/values-az/strings.xml
+++ b/res/values-az/strings.xml
@@ -94,7 +94,8 @@
<string name="keyguard_slot_name_bottom_start" msgid="6717374042663171860">"Sol düymə"</string>
<string name="keyguard_slot_name_bottom_end" msgid="7636885379738905151">"Sağ düymə"</string>
<string name="keyguard_affordance_none" msgid="1751643933430782312">"Heç bir"</string>
- <string name="keyguard_affordance_enablement_dialog_title" msgid="307756993596011884">"Əlavə ayarlama tələb olunur"</string>
+ <!-- no translation found for keyguard_affordance_enablement_dialog_title (3389730825561696493) -->
+ <skip />
<string name="keyguard_affordance_enablement_dialog_action_template" msgid="8117011931337357438">"<xliff:g id="APPNAME">%1$s</xliff:g> linkini açın"</string>
<string name="keyguard_affordance_enablement_dialog_message" msgid="6136286758939253570">"<xliff:g id="APPNAME">%1$s</xliff:g> tətbiqini qısayol kimi əlavə etmək üçün bunları təmin edin:"</string>
<string name="keyguard_affordance_enablement_dialog_dismiss_button" msgid="629754625264422508">"Hazırdır"</string>
diff --git a/res/values-b+sr+Latn/strings.xml b/res/values-b+sr+Latn/strings.xml
index b7316d1..1cd8b29 100644
--- a/res/values-b+sr+Latn/strings.xml
+++ b/res/values-b+sr+Latn/strings.xml
@@ -94,7 +94,8 @@
<string name="keyguard_slot_name_bottom_start" msgid="6717374042663171860">"Levo dugme"</string>
<string name="keyguard_slot_name_bottom_end" msgid="7636885379738905151">"Desno dugme"</string>
<string name="keyguard_affordance_none" msgid="1751643933430782312">"Ništa"</string>
- <string name="keyguard_affordance_enablement_dialog_title" msgid="307756993596011884">"Potrebno je dodatno podešavanje"</string>
+ <!-- no translation found for keyguard_affordance_enablement_dialog_title (3389730825561696493) -->
+ <skip />
<string name="keyguard_affordance_enablement_dialog_action_template" msgid="8117011931337357438">"Otvorite: <xliff:g id="APPNAME">%1$s</xliff:g>"</string>
<string name="keyguard_affordance_enablement_dialog_message" msgid="6136286758939253570">"Da biste dodali aplikaciju <xliff:g id="APPNAME">%1$s</xliff:g> kao prečicu, uverite se"</string>
<string name="keyguard_affordance_enablement_dialog_dismiss_button" msgid="629754625264422508">"Gotovo"</string>
diff --git a/res/values-be/strings.xml b/res/values-be/strings.xml
index d223bfb..088752f 100644
--- a/res/values-be/strings.xml
+++ b/res/values-be/strings.xml
@@ -94,7 +94,8 @@
<string name="keyguard_slot_name_bottom_start" msgid="6717374042663171860">"Левая кнопка"</string>
<string name="keyguard_slot_name_bottom_end" msgid="7636885379738905151">"Правая кнопка"</string>
<string name="keyguard_affordance_none" msgid="1751643933430782312">"Няма"</string>
- <string name="keyguard_affordance_enablement_dialog_title" msgid="307756993596011884">"Патрабуецца дадатковае наладжванне"</string>
+ <!-- no translation found for keyguard_affordance_enablement_dialog_title (3389730825561696493) -->
+ <skip />
<string name="keyguard_affordance_enablement_dialog_action_template" msgid="8117011931337357438">"Адкрыць \"<xliff:g id="APPNAME">%1$s</xliff:g>\""</string>
<string name="keyguard_affordance_enablement_dialog_message" msgid="6136286758939253570">"Каб дадаць ярлык для праграмы \"<xliff:g id="APPNAME">%1$s</xliff:g>\", патрабуюцца наступныя ўмовы:"</string>
<string name="keyguard_affordance_enablement_dialog_dismiss_button" msgid="629754625264422508">"Гатова"</string>
diff --git a/res/values-bg/strings.xml b/res/values-bg/strings.xml
index 1c6dbac..8b355ea 100644
--- a/res/values-bg/strings.xml
+++ b/res/values-bg/strings.xml
@@ -94,7 +94,8 @@
<string name="keyguard_slot_name_bottom_start" msgid="6717374042663171860">"Ляв бутон"</string>
<string name="keyguard_slot_name_bottom_end" msgid="7636885379738905151">"Десен бутон"</string>
<string name="keyguard_affordance_none" msgid="1751643933430782312">"Без"</string>
- <string name="keyguard_affordance_enablement_dialog_title" msgid="307756993596011884">"Необходимо е допълнително настройване"</string>
+ <!-- no translation found for keyguard_affordance_enablement_dialog_title (3389730825561696493) -->
+ <skip />
<string name="keyguard_affordance_enablement_dialog_action_template" msgid="8117011931337357438">"Отваряне на <xliff:g id="APPNAME">%1$s</xliff:g>"</string>
<string name="keyguard_affordance_enablement_dialog_message" msgid="6136286758939253570">"За да добавите пряк път към приложението <xliff:g id="APPNAME">%1$s</xliff:g>, трябва да се уверите в следното:"</string>
<string name="keyguard_affordance_enablement_dialog_dismiss_button" msgid="629754625264422508">"Готово"</string>
diff --git a/res/values-bn/strings.xml b/res/values-bn/strings.xml
index 0059504..1513cc3 100644
--- a/res/values-bn/strings.xml
+++ b/res/values-bn/strings.xml
@@ -94,7 +94,8 @@
<string name="keyguard_slot_name_bottom_start" msgid="6717374042663171860">"বাঁদিকের বোতাম"</string>
<string name="keyguard_slot_name_bottom_end" msgid="7636885379738905151">"ডানদিকের বোতাম"</string>
<string name="keyguard_affordance_none" msgid="1751643933430782312">"কোনওটিই নয়"</string>
- <string name="keyguard_affordance_enablement_dialog_title" msgid="307756993596011884">"অতিরিক্ত সেট-আপ করতে হবে"</string>
+ <!-- no translation found for keyguard_affordance_enablement_dialog_title (3389730825561696493) -->
+ <skip />
<string name="keyguard_affordance_enablement_dialog_action_template" msgid="8117011931337357438">"<xliff:g id="APPNAME">%1$s</xliff:g> খুলুন"</string>
<string name="keyguard_affordance_enablement_dialog_message" msgid="6136286758939253570">"শর্টকাট হিসেবে <xliff:g id="APPNAME">%1$s</xliff:g> অ্যাপ যোগ করতে, এইসব বিষয় নিশ্চিত করতে হবে"</string>
<string name="keyguard_affordance_enablement_dialog_dismiss_button" msgid="629754625264422508">"হয়ে গেছে"</string>
diff --git a/res/values-bs/strings.xml b/res/values-bs/strings.xml
index d1dae4e..ff4ff2f 100644
--- a/res/values-bs/strings.xml
+++ b/res/values-bs/strings.xml
@@ -94,7 +94,8 @@
<string name="keyguard_slot_name_bottom_start" msgid="6717374042663171860">"Lijevo dugme"</string>
<string name="keyguard_slot_name_bottom_end" msgid="7636885379738905151">"Desno dugme"</string>
<string name="keyguard_affordance_none" msgid="1751643933430782312">"Ništa"</string>
- <string name="keyguard_affordance_enablement_dialog_title" msgid="307756993596011884">"Potrebno je dodatno postavljanje"</string>
+ <!-- no translation found for keyguard_affordance_enablement_dialog_title (3389730825561696493) -->
+ <skip />
<string name="keyguard_affordance_enablement_dialog_action_template" msgid="8117011931337357438">"Otvori aplikaciju <xliff:g id="APPNAME">%1$s</xliff:g>"</string>
<string name="keyguard_affordance_enablement_dialog_message" msgid="6136286758939253570">"Da dodate aplikaciju <xliff:g id="APPNAME">%1$s</xliff:g> kao prečicu, pobrinite se za sljedeće"</string>
<string name="keyguard_affordance_enablement_dialog_dismiss_button" msgid="629754625264422508">"Gotovo"</string>
diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml
index 81d1807..b6d9632 100644
--- a/res/values-ca/strings.xml
+++ b/res/values-ca/strings.xml
@@ -94,7 +94,8 @@
<string name="keyguard_slot_name_bottom_start" msgid="6717374042663171860">"Botó esquerre"</string>
<string name="keyguard_slot_name_bottom_end" msgid="7636885379738905151">"Botó dret"</string>
<string name="keyguard_affordance_none" msgid="1751643933430782312">"Cap"</string>
- <string name="keyguard_affordance_enablement_dialog_title" msgid="307756993596011884">"Configuració addicional necessària"</string>
+ <!-- no translation found for keyguard_affordance_enablement_dialog_title (3389730825561696493) -->
+ <skip />
<string name="keyguard_affordance_enablement_dialog_action_template" msgid="8117011931337357438">"Obre <xliff:g id="APPNAME">%1$s</xliff:g>"</string>
<string name="keyguard_affordance_enablement_dialog_message" msgid="6136286758939253570">"Per afegir l\'aplicació <xliff:g id="APPNAME">%1$s</xliff:g> com a drecera, assegura\'t que:"</string>
<string name="keyguard_affordance_enablement_dialog_dismiss_button" msgid="629754625264422508">"Fet"</string>
diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml
index 824ef8b..299e5b0 100644
--- a/res/values-cs/strings.xml
+++ b/res/values-cs/strings.xml
@@ -94,7 +94,8 @@
<string name="keyguard_slot_name_bottom_start" msgid="6717374042663171860">"Levé tlačítko"</string>
<string name="keyguard_slot_name_bottom_end" msgid="7636885379738905151">"Pravé tlačítko"</string>
<string name="keyguard_affordance_none" msgid="1751643933430782312">"Žádné"</string>
- <string name="keyguard_affordance_enablement_dialog_title" msgid="307756993596011884">"Je potřeba další nastavení"</string>
+ <!-- no translation found for keyguard_affordance_enablement_dialog_title (3389730825561696493) -->
+ <skip />
<string name="keyguard_affordance_enablement_dialog_action_template" msgid="8117011931337357438">"Otevřít aplikaci <xliff:g id="APPNAME">%1$s</xliff:g>"</string>
<string name="keyguard_affordance_enablement_dialog_message" msgid="6136286758939253570">"Podmínky pro to, aby aplikaci <xliff:g id="APPNAME">%1$s</xliff:g> bylo možné přidat jako zkratku:"</string>
<string name="keyguard_affordance_enablement_dialog_dismiss_button" msgid="629754625264422508">"Hotovo"</string>
diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml
index 32ddf84..d7e007b 100644
--- a/res/values-da/strings.xml
+++ b/res/values-da/strings.xml
@@ -94,7 +94,8 @@
<string name="keyguard_slot_name_bottom_start" msgid="6717374042663171860">"Venstre knap"</string>
<string name="keyguard_slot_name_bottom_end" msgid="7636885379738905151">"Højre knap"</string>
<string name="keyguard_affordance_none" msgid="1751643933430782312">"Ingen"</string>
- <string name="keyguard_affordance_enablement_dialog_title" msgid="307756993596011884">"Der kræves yderligere konfiguration"</string>
+ <!-- no translation found for keyguard_affordance_enablement_dialog_title (3389730825561696493) -->
+ <skip />
<string name="keyguard_affordance_enablement_dialog_action_template" msgid="8117011931337357438">"Åbn <xliff:g id="APPNAME">%1$s</xliff:g>"</string>
<string name="keyguard_affordance_enablement_dialog_message" msgid="6136286758939253570">"Før du tilføjer <xliff:g id="APPNAME">%1$s</xliff:g>-appen som en genvej, skal du sørge for følgende:"</string>
<string name="keyguard_affordance_enablement_dialog_dismiss_button" msgid="629754625264422508">"Udfør"</string>
diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml
index b2a4b45..1465ad8 100644
--- a/res/values-de/strings.xml
+++ b/res/values-de/strings.xml
@@ -94,7 +94,8 @@
<string name="keyguard_slot_name_bottom_start" msgid="6717374042663171860">"Linke Taste"</string>
<string name="keyguard_slot_name_bottom_end" msgid="7636885379738905151">"Rechte Taste"</string>
<string name="keyguard_affordance_none" msgid="1751643933430782312">"Keine"</string>
- <string name="keyguard_affordance_enablement_dialog_title" msgid="307756993596011884">"Zusätzliche Einrichtung erforderlich"</string>
+ <!-- no translation found for keyguard_affordance_enablement_dialog_title (3389730825561696493) -->
+ <skip />
<string name="keyguard_affordance_enablement_dialog_action_template" msgid="8117011931337357438">"<xliff:g id="APPNAME">%1$s</xliff:g> öffnen"</string>
<string name="keyguard_affordance_enablement_dialog_message" msgid="6136286758939253570">"Wenn du die <xliff:g id="APPNAME">%1$s</xliff:g> App als eine Verknüpfung hinzufügen möchtest, müssen folgende Bedingungen erfüllt sein"</string>
<string name="keyguard_affordance_enablement_dialog_dismiss_button" msgid="629754625264422508">"Fertig"</string>
diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml
index ae67feb..775b9f5 100644
--- a/res/values-el/strings.xml
+++ b/res/values-el/strings.xml
@@ -94,7 +94,8 @@
<string name="keyguard_slot_name_bottom_start" msgid="6717374042663171860">"Κουμπί αριστερά"</string>
<string name="keyguard_slot_name_bottom_end" msgid="7636885379738905151">"Κουμπί δεξιά"</string>
<string name="keyguard_affordance_none" msgid="1751643933430782312">"Καμία"</string>
- <string name="keyguard_affordance_enablement_dialog_title" msgid="307756993596011884">"Χρειάζεται πρόσθετη ρύθμιση"</string>
+ <!-- no translation found for keyguard_affordance_enablement_dialog_title (3389730825561696493) -->
+ <skip />
<string name="keyguard_affordance_enablement_dialog_action_template" msgid="8117011931337357438">"Άνοιγμα <xliff:g id="APPNAME">%1$s</xliff:g>"</string>
<string name="keyguard_affordance_enablement_dialog_message" msgid="6136286758939253570">"Για να προσθέσετε την εφαρμογή <xliff:g id="APPNAME">%1$s</xliff:g> ως συντόμευση, βεβαιωθείτε ότι"</string>
<string name="keyguard_affordance_enablement_dialog_dismiss_button" msgid="629754625264422508">"Τέλος"</string>
diff --git a/res/values-en-rAU/strings.xml b/res/values-en-rAU/strings.xml
index d04059a..d962d7a 100644
--- a/res/values-en-rAU/strings.xml
+++ b/res/values-en-rAU/strings.xml
@@ -94,7 +94,8 @@
<string name="keyguard_slot_name_bottom_start" msgid="6717374042663171860">"Left button"</string>
<string name="keyguard_slot_name_bottom_end" msgid="7636885379738905151">"Right button"</string>
<string name="keyguard_affordance_none" msgid="1751643933430782312">"None"</string>
- <string name="keyguard_affordance_enablement_dialog_title" msgid="307756993596011884">"Additional setup needed"</string>
+ <!-- no translation found for keyguard_affordance_enablement_dialog_title (3389730825561696493) -->
+ <skip />
<string name="keyguard_affordance_enablement_dialog_action_template" msgid="8117011931337357438">"Open <xliff:g id="APPNAME">%1$s</xliff:g>"</string>
<string name="keyguard_affordance_enablement_dialog_message" msgid="6136286758939253570">"To add the <xliff:g id="APPNAME">%1$s</xliff:g> app as a shortcut, make sure"</string>
<string name="keyguard_affordance_enablement_dialog_dismiss_button" msgid="629754625264422508">"Done"</string>
diff --git a/res/values-en-rCA/strings.xml b/res/values-en-rCA/strings.xml
index 9f43df3..5025853 100644
--- a/res/values-en-rCA/strings.xml
+++ b/res/values-en-rCA/strings.xml
@@ -97,7 +97,7 @@
<skip />
<!-- no translation found for keyguard_affordance_none (1751643933430782312) -->
<skip />
- <!-- no translation found for keyguard_affordance_enablement_dialog_title (307756993596011884) -->
+ <!-- no translation found for keyguard_affordance_enablement_dialog_title (3389730825561696493) -->
<skip />
<!-- no translation found for keyguard_affordance_enablement_dialog_action_template (8117011931337357438) -->
<skip />
diff --git a/res/values-en-rGB/strings.xml b/res/values-en-rGB/strings.xml
index d04059a..d962d7a 100644
--- a/res/values-en-rGB/strings.xml
+++ b/res/values-en-rGB/strings.xml
@@ -94,7 +94,8 @@
<string name="keyguard_slot_name_bottom_start" msgid="6717374042663171860">"Left button"</string>
<string name="keyguard_slot_name_bottom_end" msgid="7636885379738905151">"Right button"</string>
<string name="keyguard_affordance_none" msgid="1751643933430782312">"None"</string>
- <string name="keyguard_affordance_enablement_dialog_title" msgid="307756993596011884">"Additional setup needed"</string>
+ <!-- no translation found for keyguard_affordance_enablement_dialog_title (3389730825561696493) -->
+ <skip />
<string name="keyguard_affordance_enablement_dialog_action_template" msgid="8117011931337357438">"Open <xliff:g id="APPNAME">%1$s</xliff:g>"</string>
<string name="keyguard_affordance_enablement_dialog_message" msgid="6136286758939253570">"To add the <xliff:g id="APPNAME">%1$s</xliff:g> app as a shortcut, make sure"</string>
<string name="keyguard_affordance_enablement_dialog_dismiss_button" msgid="629754625264422508">"Done"</string>
diff --git a/res/values-en-rIN/strings.xml b/res/values-en-rIN/strings.xml
index d04059a..d962d7a 100644
--- a/res/values-en-rIN/strings.xml
+++ b/res/values-en-rIN/strings.xml
@@ -94,7 +94,8 @@
<string name="keyguard_slot_name_bottom_start" msgid="6717374042663171860">"Left button"</string>
<string name="keyguard_slot_name_bottom_end" msgid="7636885379738905151">"Right button"</string>
<string name="keyguard_affordance_none" msgid="1751643933430782312">"None"</string>
- <string name="keyguard_affordance_enablement_dialog_title" msgid="307756993596011884">"Additional setup needed"</string>
+ <!-- no translation found for keyguard_affordance_enablement_dialog_title (3389730825561696493) -->
+ <skip />
<string name="keyguard_affordance_enablement_dialog_action_template" msgid="8117011931337357438">"Open <xliff:g id="APPNAME">%1$s</xliff:g>"</string>
<string name="keyguard_affordance_enablement_dialog_message" msgid="6136286758939253570">"To add the <xliff:g id="APPNAME">%1$s</xliff:g> app as a shortcut, make sure"</string>
<string name="keyguard_affordance_enablement_dialog_dismiss_button" msgid="629754625264422508">"Done"</string>
diff --git a/res/values-en-rXC/strings.xml b/res/values-en-rXC/strings.xml
index 24e213d..51643a9 100644
--- a/res/values-en-rXC/strings.xml
+++ b/res/values-en-rXC/strings.xml
@@ -94,7 +94,8 @@
<string name="keyguard_slot_name_bottom_start" msgid="6717374042663171860">"Left button"</string>
<string name="keyguard_slot_name_bottom_end" msgid="7636885379738905151">"Right button"</string>
<string name="keyguard_affordance_none" msgid="1751643933430782312">"None"</string>
- <string name="keyguard_affordance_enablement_dialog_title" msgid="307756993596011884">"Additional setup needed"</string>
+ <!-- no translation found for keyguard_affordance_enablement_dialog_title (3389730825561696493) -->
+ <skip />
<string name="keyguard_affordance_enablement_dialog_action_template" msgid="8117011931337357438">"Open <xliff:g id="APPNAME">%1$s</xliff:g>"</string>
<string name="keyguard_affordance_enablement_dialog_message" msgid="6136286758939253570">"To add the <xliff:g id="APPNAME">%1$s</xliff:g> app as a shortcut, make sure"</string>
<string name="keyguard_affordance_enablement_dialog_dismiss_button" msgid="629754625264422508">"Done"</string>
diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml
index d465416..20a96c2 100644
--- a/res/values-es-rUS/strings.xml
+++ b/res/values-es-rUS/strings.xml
@@ -94,7 +94,8 @@
<string name="keyguard_slot_name_bottom_start" msgid="6717374042663171860">"Botón izquierdo"</string>
<string name="keyguard_slot_name_bottom_end" msgid="7636885379738905151">"Botón derecho"</string>
<string name="keyguard_affordance_none" msgid="1751643933430782312">"Ninguno"</string>
- <string name="keyguard_affordance_enablement_dialog_title" msgid="307756993596011884">"Se necesitan parámetros de configuración adicionales"</string>
+ <!-- no translation found for keyguard_affordance_enablement_dialog_title (3389730825561696493) -->
+ <skip />
<string name="keyguard_affordance_enablement_dialog_action_template" msgid="8117011931337357438">"Abrir <xliff:g id="APPNAME">%1$s</xliff:g>"</string>
<string name="keyguard_affordance_enablement_dialog_message" msgid="6136286758939253570">"Para agregar la app <xliff:g id="APPNAME">%1$s</xliff:g> como acceso directo, asegúrate que se cumplan los siguientes requisitos:"</string>
<string name="keyguard_affordance_enablement_dialog_dismiss_button" msgid="629754625264422508">"Listo"</string>
diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml
index 4cfe671..3258bde 100644
--- a/res/values-es/strings.xml
+++ b/res/values-es/strings.xml
@@ -94,7 +94,8 @@
<string name="keyguard_slot_name_bottom_start" msgid="6717374042663171860">"Botón izquierdo"</string>
<string name="keyguard_slot_name_bottom_end" msgid="7636885379738905151">"Botón derecho"</string>
<string name="keyguard_affordance_none" msgid="1751643933430782312">"Ninguno"</string>
- <string name="keyguard_affordance_enablement_dialog_title" msgid="307756993596011884">"Se necesitan ajustes adicionales"</string>
+ <!-- no translation found for keyguard_affordance_enablement_dialog_title (3389730825561696493) -->
+ <skip />
<string name="keyguard_affordance_enablement_dialog_action_template" msgid="8117011931337357438">"Abrir <xliff:g id="APPNAME">%1$s</xliff:g>"</string>
<string name="keyguard_affordance_enablement_dialog_message" msgid="6136286758939253570">"Para añadir la aplicación <xliff:g id="APPNAME">%1$s</xliff:g> como acceso directo:"</string>
<string name="keyguard_affordance_enablement_dialog_dismiss_button" msgid="629754625264422508">"Hecho"</string>
diff --git a/res/values-et/strings.xml b/res/values-et/strings.xml
index cb8569e..e452b41 100644
--- a/res/values-et/strings.xml
+++ b/res/values-et/strings.xml
@@ -94,7 +94,8 @@
<string name="keyguard_slot_name_bottom_start" msgid="6717374042663171860">"Vasak nupp"</string>
<string name="keyguard_slot_name_bottom_end" msgid="7636885379738905151">"Parem nupp"</string>
<string name="keyguard_affordance_none" msgid="1751643933430782312">"Puudub"</string>
- <string name="keyguard_affordance_enablement_dialog_title" msgid="307756993596011884">"Vajalik on täiendav seadistus"</string>
+ <!-- no translation found for keyguard_affordance_enablement_dialog_title (3389730825561696493) -->
+ <skip />
<string name="keyguard_affordance_enablement_dialog_action_template" msgid="8117011931337357438">"Ava <xliff:g id="APPNAME">%1$s</xliff:g>"</string>
<string name="keyguard_affordance_enablement_dialog_message" msgid="6136286758939253570">"Rakenduse <xliff:g id="APPNAME">%1$s</xliff:g> otsetee lisamiseks veenduge järgmises."</string>
<string name="keyguard_affordance_enablement_dialog_dismiss_button" msgid="629754625264422508">"Valmis"</string>
diff --git a/res/values-eu/strings.xml b/res/values-eu/strings.xml
index 163f56a..838df31 100644
--- a/res/values-eu/strings.xml
+++ b/res/values-eu/strings.xml
@@ -94,7 +94,8 @@
<string name="keyguard_slot_name_bottom_start" msgid="6717374042663171860">"Ezkerreko botoia"</string>
<string name="keyguard_slot_name_bottom_end" msgid="7636885379738905151">"Eskuineko botoia"</string>
<string name="keyguard_affordance_none" msgid="1751643933430782312">"Bat ere ez"</string>
- <string name="keyguard_affordance_enablement_dialog_title" msgid="307756993596011884">"Beste ezarpen batzuk konfiguratu behar dira"</string>
+ <!-- no translation found for keyguard_affordance_enablement_dialog_title (3389730825561696493) -->
+ <skip />
<string name="keyguard_affordance_enablement_dialog_action_template" msgid="8117011931337357438">"Ireki <xliff:g id="APPNAME">%1$s</xliff:g>"</string>
<string name="keyguard_affordance_enablement_dialog_message" msgid="6136286758939253570">"<xliff:g id="APPNAME">%1$s</xliff:g> aplikazioa lasterbide gisa gehitzeko, ziurtatu hauek betetzen direla:"</string>
<string name="keyguard_affordance_enablement_dialog_dismiss_button" msgid="629754625264422508">"Eginda"</string>
diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml
index 341f7cc..b75fc07 100644
--- a/res/values-fa/strings.xml
+++ b/res/values-fa/strings.xml
@@ -94,7 +94,8 @@
<string name="keyguard_slot_name_bottom_start" msgid="6717374042663171860">"دکمه چپ"</string>
<string name="keyguard_slot_name_bottom_end" msgid="7636885379738905151">"دکمه راست"</string>
<string name="keyguard_affordance_none" msgid="1751643933430782312">"هیچکدام"</string>
- <string name="keyguard_affordance_enablement_dialog_title" msgid="307756993596011884">"راهاندازی اضافهای نیاز است"</string>
+ <!-- no translation found for keyguard_affordance_enablement_dialog_title (3389730825561696493) -->
+ <skip />
<string name="keyguard_affordance_enablement_dialog_action_template" msgid="8117011931337357438">"باز کردن <xliff:g id="APPNAME">%1$s</xliff:g>"</string>
<string name="keyguard_affordance_enablement_dialog_message" msgid="6136286758939253570">"برای افزودن برنامه <xliff:g id="APPNAME">%1$s</xliff:g> بهعنوان میانبر، مطمئن شوید"</string>
<string name="keyguard_affordance_enablement_dialog_dismiss_button" msgid="629754625264422508">"تمام"</string>
diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml
index 8347bad..e63fe52 100644
--- a/res/values-fi/strings.xml
+++ b/res/values-fi/strings.xml
@@ -94,7 +94,8 @@
<string name="keyguard_slot_name_bottom_start" msgid="6717374042663171860">"Vasen painike"</string>
<string name="keyguard_slot_name_bottom_end" msgid="7636885379738905151">"Oikea painike"</string>
<string name="keyguard_affordance_none" msgid="1751643933430782312">"–"</string>
- <string name="keyguard_affordance_enablement_dialog_title" msgid="307756993596011884">"Käyttöönotto edellyttää lisävaiheita"</string>
+ <!-- no translation found for keyguard_affordance_enablement_dialog_title (3389730825561696493) -->
+ <skip />
<string name="keyguard_affordance_enablement_dialog_action_template" msgid="8117011931337357438">"Avaa <xliff:g id="APPNAME">%1$s</xliff:g>"</string>
<string name="keyguard_affordance_enablement_dialog_message" msgid="6136286758939253570">"Jos haluat, että <xliff:g id="APPNAME">%1$s</xliff:g> lisätään pikakuvakkeeksi, varmista nämä:"</string>
<string name="keyguard_affordance_enablement_dialog_dismiss_button" msgid="629754625264422508">"Valmis"</string>
diff --git a/res/values-fr-rCA/strings.xml b/res/values-fr-rCA/strings.xml
index 95965b1..904860a 100644
--- a/res/values-fr-rCA/strings.xml
+++ b/res/values-fr-rCA/strings.xml
@@ -94,7 +94,8 @@
<string name="keyguard_slot_name_bottom_start" msgid="6717374042663171860">"Bouton gauche"</string>
<string name="keyguard_slot_name_bottom_end" msgid="7636885379738905151">"Bouton droit"</string>
<string name="keyguard_affordance_none" msgid="1751643933430782312">"Aucune"</string>
- <string name="keyguard_affordance_enablement_dialog_title" msgid="307756993596011884">"Configuration supplémentaire requise"</string>
+ <!-- no translation found for keyguard_affordance_enablement_dialog_title (3389730825561696493) -->
+ <skip />
<string name="keyguard_affordance_enablement_dialog_action_template" msgid="8117011931337357438">"Ouvrir <xliff:g id="APPNAME">%1$s</xliff:g>"</string>
<string name="keyguard_affordance_enablement_dialog_message" msgid="6136286758939253570">"Pour ajouter l\'application <xliff:g id="APPNAME">%1$s</xliff:g> en tant que raccourci, assurez-vous"</string>
<string name="keyguard_affordance_enablement_dialog_dismiss_button" msgid="629754625264422508">"OK"</string>
diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml
index b8acbea..20b6738 100644
--- a/res/values-fr/strings.xml
+++ b/res/values-fr/strings.xml
@@ -94,7 +94,8 @@
<string name="keyguard_slot_name_bottom_start" msgid="6717374042663171860">"Bouton gauche"</string>
<string name="keyguard_slot_name_bottom_end" msgid="7636885379738905151">"Bouton droit"</string>
<string name="keyguard_affordance_none" msgid="1751643933430782312">"Aucun"</string>
- <string name="keyguard_affordance_enablement_dialog_title" msgid="307756993596011884">"Configuration supplémentaire nécessaire"</string>
+ <!-- no translation found for keyguard_affordance_enablement_dialog_title (3389730825561696493) -->
+ <skip />
<string name="keyguard_affordance_enablement_dialog_action_template" msgid="8117011931337357438">"Ouvrir <xliff:g id="APPNAME">%1$s</xliff:g>"</string>
<string name="keyguard_affordance_enablement_dialog_message" msgid="6136286758939253570">"Pour ajouter l\'appli <xliff:g id="APPNAME">%1$s</xliff:g> comme raccourci, procédez aux vérifications suivantes"</string>
<string name="keyguard_affordance_enablement_dialog_dismiss_button" msgid="629754625264422508">"OK"</string>
diff --git a/res/values-gl/strings.xml b/res/values-gl/strings.xml
index 23369be..04dd999 100644
--- a/res/values-gl/strings.xml
+++ b/res/values-gl/strings.xml
@@ -94,7 +94,8 @@
<string name="keyguard_slot_name_bottom_start" msgid="6717374042663171860">"Botón esquerdo"</string>
<string name="keyguard_slot_name_bottom_end" msgid="7636885379738905151">"Botón dereito"</string>
<string name="keyguard_affordance_none" msgid="1751643933430782312">"Ningunha"</string>
- <string name="keyguard_affordance_enablement_dialog_title" msgid="307756993596011884">"É preciso facer axustes adicionais"</string>
+ <!-- no translation found for keyguard_affordance_enablement_dialog_title (3389730825561696493) -->
+ <skip />
<string name="keyguard_affordance_enablement_dialog_action_template" msgid="8117011931337357438">"Abrir <xliff:g id="APPNAME">%1$s</xliff:g>"</string>
<string name="keyguard_affordance_enablement_dialog_message" msgid="6136286758939253570">"Para engadir a aplicación <xliff:g id="APPNAME">%1$s</xliff:g> como atallo, asegúrate de que se cumpra o seguinte:"</string>
<string name="keyguard_affordance_enablement_dialog_dismiss_button" msgid="629754625264422508">"Feito"</string>
diff --git a/res/values-gu/strings.xml b/res/values-gu/strings.xml
index a03f093..5dd61aa 100644
--- a/res/values-gu/strings.xml
+++ b/res/values-gu/strings.xml
@@ -94,7 +94,8 @@
<string name="keyguard_slot_name_bottom_start" msgid="6717374042663171860">"ડાબી બાજુનું બટન"</string>
<string name="keyguard_slot_name_bottom_end" msgid="7636885379738905151">"જમણી બાજુનું બટન"</string>
<string name="keyguard_affordance_none" msgid="1751643933430782312">"એકપણ નહીં"</string>
- <string name="keyguard_affordance_enablement_dialog_title" msgid="307756993596011884">"વધારાનું સેટઅપ જરૂરી છે"</string>
+ <!-- no translation found for keyguard_affordance_enablement_dialog_title (3389730825561696493) -->
+ <skip />
<string name="keyguard_affordance_enablement_dialog_action_template" msgid="8117011931337357438">"<xliff:g id="APPNAME">%1$s</xliff:g> ખોલો"</string>
<string name="keyguard_affordance_enablement_dialog_message" msgid="6136286758939253570">"<xliff:g id="APPNAME">%1$s</xliff:g> ઍપને શૉર્ટકટ તરીકે ઉમેરવા માટે, આ બાબતોની ખાતરી કરો"</string>
<string name="keyguard_affordance_enablement_dialog_dismiss_button" msgid="629754625264422508">"થઈ ગયું"</string>
diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml
index 3448954..65544bf 100644
--- a/res/values-hi/strings.xml
+++ b/res/values-hi/strings.xml
@@ -94,7 +94,8 @@
<string name="keyguard_slot_name_bottom_start" msgid="6717374042663171860">"बायां बटन"</string>
<string name="keyguard_slot_name_bottom_end" msgid="7636885379738905151">"दायां बटन"</string>
<string name="keyguard_affordance_none" msgid="1751643933430782312">"कोई नहीं"</string>
- <string name="keyguard_affordance_enablement_dialog_title" msgid="307756993596011884">"अलग से सेटअप करने की ज़रूरत है"</string>
+ <!-- no translation found for keyguard_affordance_enablement_dialog_title (3389730825561696493) -->
+ <skip />
<string name="keyguard_affordance_enablement_dialog_action_template" msgid="8117011931337357438">"<xliff:g id="APPNAME">%1$s</xliff:g> खोलें"</string>
<string name="keyguard_affordance_enablement_dialog_message" msgid="6136286758939253570">"<xliff:g id="APPNAME">%1$s</xliff:g> ऐप्लिकेशन को शॉर्टकट के तौर पर जोड़ने के लिए, इन बातों का ध्यान रखें"</string>
<string name="keyguard_affordance_enablement_dialog_dismiss_button" msgid="629754625264422508">"हो गया"</string>
diff --git a/res/values-hr/strings.xml b/res/values-hr/strings.xml
index 8e76df2..e032beb 100644
--- a/res/values-hr/strings.xml
+++ b/res/values-hr/strings.xml
@@ -94,7 +94,8 @@
<string name="keyguard_slot_name_bottom_start" msgid="6717374042663171860">"Lijevi gumb"</string>
<string name="keyguard_slot_name_bottom_end" msgid="7636885379738905151">"Desni gumb"</string>
<string name="keyguard_affordance_none" msgid="1751643933430782312">"Ništa"</string>
- <string name="keyguard_affordance_enablement_dialog_title" msgid="307756993596011884">"Potrebno je dodatno postavljanje"</string>
+ <!-- no translation found for keyguard_affordance_enablement_dialog_title (3389730825561696493) -->
+ <skip />
<string name="keyguard_affordance_enablement_dialog_action_template" msgid="8117011931337357438">"Otvori <xliff:g id="APPNAME">%1$s</xliff:g>"</string>
<string name="keyguard_affordance_enablement_dialog_message" msgid="6136286758939253570">"Da biste aplikaciju <xliff:g id="APPNAME">%1$s</xliff:g> dodali kao prečac, učinite sljedeće"</string>
<string name="keyguard_affordance_enablement_dialog_dismiss_button" msgid="629754625264422508">"Gotovo"</string>
diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml
index acad8aa..b1d9f41 100644
--- a/res/values-hu/strings.xml
+++ b/res/values-hu/strings.xml
@@ -94,7 +94,8 @@
<string name="keyguard_slot_name_bottom_start" msgid="6717374042663171860">"Balra gomb"</string>
<string name="keyguard_slot_name_bottom_end" msgid="7636885379738905151">"Jobbra gomb"</string>
<string name="keyguard_affordance_none" msgid="1751643933430782312">"Nincs"</string>
- <string name="keyguard_affordance_enablement_dialog_title" msgid="307756993596011884">"További beállítás szükséges"</string>
+ <!-- no translation found for keyguard_affordance_enablement_dialog_title (3389730825561696493) -->
+ <skip />
<string name="keyguard_affordance_enablement_dialog_action_template" msgid="8117011931337357438">"A(z) <xliff:g id="APPNAME">%1$s</xliff:g> megnyitása"</string>
<string name="keyguard_affordance_enablement_dialog_message" msgid="6136286758939253570">"Ha szeretné felvenni a(z) <xliff:g id="APPNAME">%1$s</xliff:g> alkalmazást parancsikonként, gondoskodjon a következőkről:"</string>
<string name="keyguard_affordance_enablement_dialog_dismiss_button" msgid="629754625264422508">"Kész"</string>
diff --git a/res/values-hy/strings.xml b/res/values-hy/strings.xml
index a627df8..bc549af 100644
--- a/res/values-hy/strings.xml
+++ b/res/values-hy/strings.xml
@@ -94,7 +94,8 @@
<string name="keyguard_slot_name_bottom_start" msgid="6717374042663171860">"«Ձախ» կոճակ"</string>
<string name="keyguard_slot_name_bottom_end" msgid="7636885379738905151">"«Աջ» կոճակ"</string>
<string name="keyguard_affordance_none" msgid="1751643933430782312">"Ոչ մեկը"</string>
- <string name="keyguard_affordance_enablement_dialog_title" msgid="307756993596011884">"Պահանջվում է լրացուցիչ կարգավորում"</string>
+ <!-- no translation found for keyguard_affordance_enablement_dialog_title (3389730825561696493) -->
+ <skip />
<string name="keyguard_affordance_enablement_dialog_action_template" msgid="8117011931337357438">"Բացել <xliff:g id="APPNAME">%1$s</xliff:g> հավելվածը"</string>
<string name="keyguard_affordance_enablement_dialog_message" msgid="6136286758939253570">"<xliff:g id="APPNAME">%1$s</xliff:g> հավելվածի դյուրանցումն ավելացնելու համար համոզվեք, որ՝"</string>
<string name="keyguard_affordance_enablement_dialog_dismiss_button" msgid="629754625264422508">"Պատրաստ է"</string>
diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml
index ba6ed0c..9e06245 100644
--- a/res/values-in/strings.xml
+++ b/res/values-in/strings.xml
@@ -94,7 +94,8 @@
<string name="keyguard_slot_name_bottom_start" msgid="6717374042663171860">"Tombol kiri"</string>
<string name="keyguard_slot_name_bottom_end" msgid="7636885379738905151">"Tombol kanan"</string>
<string name="keyguard_affordance_none" msgid="1751643933430782312">"Tidak ada"</string>
- <string name="keyguard_affordance_enablement_dialog_title" msgid="307756993596011884">"Perlu penyiapan tambahan"</string>
+ <!-- no translation found for keyguard_affordance_enablement_dialog_title (3389730825561696493) -->
+ <skip />
<string name="keyguard_affordance_enablement_dialog_action_template" msgid="8117011931337357438">"Buka <xliff:g id="APPNAME">%1$s</xliff:g>"</string>
<string name="keyguard_affordance_enablement_dialog_message" msgid="6136286758939253570">"Untuk menambahkan aplikasi <xliff:g id="APPNAME">%1$s</xliff:g> sebagai pintasan, pastikan"</string>
<string name="keyguard_affordance_enablement_dialog_dismiss_button" msgid="629754625264422508">"Selesai"</string>
diff --git a/res/values-is/strings.xml b/res/values-is/strings.xml
index 2dba024..a2381d1 100644
--- a/res/values-is/strings.xml
+++ b/res/values-is/strings.xml
@@ -94,7 +94,8 @@
<string name="keyguard_slot_name_bottom_start" msgid="6717374042663171860">"Vinstri hnappur"</string>
<string name="keyguard_slot_name_bottom_end" msgid="7636885379738905151">"Hægri hnappur"</string>
<string name="keyguard_affordance_none" msgid="1751643933430782312">"Ekkert"</string>
- <string name="keyguard_affordance_enablement_dialog_title" msgid="307756993596011884">"Þörf á viðbótaruppsetningu"</string>
+ <!-- no translation found for keyguard_affordance_enablement_dialog_title (3389730825561696493) -->
+ <skip />
<string name="keyguard_affordance_enablement_dialog_action_template" msgid="8117011931337357438">"Opna <xliff:g id="APPNAME">%1$s</xliff:g>"</string>
<string name="keyguard_affordance_enablement_dialog_message" msgid="6136286758939253570">"Til að bæta forritinu <xliff:g id="APPNAME">%1$s</xliff:g> við sem flýtileið skaltu ganga úr skugga um að"</string>
<string name="keyguard_affordance_enablement_dialog_dismiss_button" msgid="629754625264422508">"Lokið"</string>
diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml
index 4dc54c2..8783904 100644
--- a/res/values-it/strings.xml
+++ b/res/values-it/strings.xml
@@ -94,7 +94,8 @@
<string name="keyguard_slot_name_bottom_start" msgid="6717374042663171860">"Puls. sinistro"</string>
<string name="keyguard_slot_name_bottom_end" msgid="7636885379738905151">"Puls. destro"</string>
<string name="keyguard_affordance_none" msgid="1751643933430782312">"Nessuno"</string>
- <string name="keyguard_affordance_enablement_dialog_title" msgid="307756993596011884">"È necessaria ulteriore configurazione"</string>
+ <!-- no translation found for keyguard_affordance_enablement_dialog_title (3389730825561696493) -->
+ <skip />
<string name="keyguard_affordance_enablement_dialog_action_template" msgid="8117011931337357438">"Apri <xliff:g id="APPNAME">%1$s</xliff:g>"</string>
<string name="keyguard_affordance_enablement_dialog_message" msgid="6136286758939253570">"Per aggiungere l\'app <xliff:g id="APPNAME">%1$s</xliff:g> come scorciatoia, assicurati che:"</string>
<string name="keyguard_affordance_enablement_dialog_dismiss_button" msgid="629754625264422508">"Fine"</string>
diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml
index 1aa6c2c..318f01b 100644
--- a/res/values-iw/strings.xml
+++ b/res/values-iw/strings.xml
@@ -94,7 +94,8 @@
<string name="keyguard_slot_name_bottom_start" msgid="6717374042663171860">"הלחצן השמאלי"</string>
<string name="keyguard_slot_name_bottom_end" msgid="7636885379738905151">"הלחצן הימני"</string>
<string name="keyguard_affordance_none" msgid="1751643933430782312">"ללא"</string>
- <string name="keyguard_affordance_enablement_dialog_title" msgid="307756993596011884">"נדרשת הגדרה נוספת"</string>
+ <!-- no translation found for keyguard_affordance_enablement_dialog_title (3389730825561696493) -->
+ <skip />
<string name="keyguard_affordance_enablement_dialog_action_template" msgid="8117011931337357438">"פתיחת <xliff:g id="APPNAME">%1$s</xliff:g>"</string>
<string name="keyguard_affordance_enablement_dialog_message" msgid="6136286758939253570">"כדי להוסיף את האפליקציה <xliff:g id="APPNAME">%1$s</xliff:g> כקיצור דרך, צריך לוודא"</string>
<string name="keyguard_affordance_enablement_dialog_dismiss_button" msgid="629754625264422508">"סיום"</string>
diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml
index ace60d0..ed66e57 100644
--- a/res/values-ja/strings.xml
+++ b/res/values-ja/strings.xml
@@ -94,7 +94,8 @@
<string name="keyguard_slot_name_bottom_start" msgid="6717374042663171860">"左ボタン"</string>
<string name="keyguard_slot_name_bottom_end" msgid="7636885379738905151">"右ボタン"</string>
<string name="keyguard_affordance_none" msgid="1751643933430782312">"なし"</string>
- <string name="keyguard_affordance_enablement_dialog_title" msgid="307756993596011884">"追加のセットアップが必要です"</string>
+ <!-- no translation found for keyguard_affordance_enablement_dialog_title (3389730825561696493) -->
+ <skip />
<string name="keyguard_affordance_enablement_dialog_action_template" msgid="8117011931337357438">"<xliff:g id="APPNAME">%1$s</xliff:g> を開きます。"</string>
<string name="keyguard_affordance_enablement_dialog_message" msgid="6136286758939253570">"<xliff:g id="APPNAME">%1$s</xliff:g> アプリをショートカットとして追加するための手順"</string>
<string name="keyguard_affordance_enablement_dialog_dismiss_button" msgid="629754625264422508">"完了"</string>
diff --git a/res/values-ka/strings.xml b/res/values-ka/strings.xml
index eb6729b..7a11202 100644
--- a/res/values-ka/strings.xml
+++ b/res/values-ka/strings.xml
@@ -94,7 +94,8 @@
<string name="keyguard_slot_name_bottom_start" msgid="6717374042663171860">"მარცხენა ღილაკი"</string>
<string name="keyguard_slot_name_bottom_end" msgid="7636885379738905151">"მარჯვენა ღილაკი"</string>
<string name="keyguard_affordance_none" msgid="1751643933430782312">"არცერთი"</string>
- <string name="keyguard_affordance_enablement_dialog_title" msgid="307756993596011884">"საჭიროა დამატებითი დაყენება"</string>
+ <!-- no translation found for keyguard_affordance_enablement_dialog_title (3389730825561696493) -->
+ <skip />
<string name="keyguard_affordance_enablement_dialog_action_template" msgid="8117011931337357438">"<xliff:g id="APPNAME">%1$s</xliff:g>-ის გახსნა"</string>
<string name="keyguard_affordance_enablement_dialog_message" msgid="6136286758939253570">"<xliff:g id="APPNAME">%1$s</xliff:g> აპი რომ მალსახმობის სახით დაამატოთ, დარწმუნდით, რომ"</string>
<string name="keyguard_affordance_enablement_dialog_dismiss_button" msgid="629754625264422508">"მზადაა"</string>
diff --git a/res/values-kk/strings.xml b/res/values-kk/strings.xml
index e39fad3..ebe641b 100644
--- a/res/values-kk/strings.xml
+++ b/res/values-kk/strings.xml
@@ -94,7 +94,8 @@
<string name="keyguard_slot_name_bottom_start" msgid="6717374042663171860">"Сол жақ түйме"</string>
<string name="keyguard_slot_name_bottom_end" msgid="7636885379738905151">"Оң жақ түйме"</string>
<string name="keyguard_affordance_none" msgid="1751643933430782312">"Жоқ"</string>
- <string name="keyguard_affordance_enablement_dialog_title" msgid="307756993596011884">"Қосымша реттеу қажет"</string>
+ <!-- no translation found for keyguard_affordance_enablement_dialog_title (3389730825561696493) -->
+ <skip />
<string name="keyguard_affordance_enablement_dialog_action_template" msgid="8117011931337357438">"<xliff:g id="APPNAME">%1$s</xliff:g> қолданбасын ашу"</string>
<string name="keyguard_affordance_enablement_dialog_message" msgid="6136286758939253570">"<xliff:g id="APPNAME">%1$s</xliff:g> қолданбасын таңбаша ретінде қосу үшін келесі әрекеттерді орындауды ұмытпаңыз:"</string>
<string name="keyguard_affordance_enablement_dialog_dismiss_button" msgid="629754625264422508">"Дайын"</string>
diff --git a/res/values-km/strings.xml b/res/values-km/strings.xml
index 7b0f0d9..b844e66 100644
--- a/res/values-km/strings.xml
+++ b/res/values-km/strings.xml
@@ -94,7 +94,8 @@
<string name="keyguard_slot_name_bottom_start" msgid="6717374042663171860">"ប៊ូតុងឆ្វេង"</string>
<string name="keyguard_slot_name_bottom_end" msgid="7636885379738905151">"ប៊ូតុងស្ដាំ"</string>
<string name="keyguard_affordance_none" msgid="1751643933430782312">"គ្មាន"</string>
- <string name="keyguard_affordance_enablement_dialog_title" msgid="307756993596011884">"ចាំបាច់ត្រូវរៀបចំបន្ថែម"</string>
+ <!-- no translation found for keyguard_affordance_enablement_dialog_title (3389730825561696493) -->
+ <skip />
<string name="keyguard_affordance_enablement_dialog_action_template" msgid="8117011931337357438">"បើក <xliff:g id="APPNAME">%1$s</xliff:g>"</string>
<string name="keyguard_affordance_enablement_dialog_message" msgid="6136286758939253570">"ដើម្បីបញ្ចូលកម្មវិធី <xliff:g id="APPNAME">%1$s</xliff:g> ជាផ្លូវកាត់ សូមប្រាកដថា"</string>
<string name="keyguard_affordance_enablement_dialog_dismiss_button" msgid="629754625264422508">"រួចរាល់"</string>
diff --git a/res/values-kn/strings.xml b/res/values-kn/strings.xml
index e04ab28..f97c523 100644
--- a/res/values-kn/strings.xml
+++ b/res/values-kn/strings.xml
@@ -94,7 +94,8 @@
<string name="keyguard_slot_name_bottom_start" msgid="6717374042663171860">"ಎಡಗಡೆಯ ಬಟನ್"</string>
<string name="keyguard_slot_name_bottom_end" msgid="7636885379738905151">"ಬಲಗಡೆಯ ಬಟನ್"</string>
<string name="keyguard_affordance_none" msgid="1751643933430782312">"ಯಾವುದೂ ಅಲ್ಲ"</string>
- <string name="keyguard_affordance_enablement_dialog_title" msgid="307756993596011884">"ಹೆಚ್ಚುವರಿ ಸೆಟಪ್ ಮಾಡಬೇಕಾಗಿದೆ"</string>
+ <!-- no translation found for keyguard_affordance_enablement_dialog_title (3389730825561696493) -->
+ <skip />
<string name="keyguard_affordance_enablement_dialog_action_template" msgid="8117011931337357438">"<xliff:g id="APPNAME">%1$s</xliff:g> ಅನ್ನು ತೆರೆಯಿರಿ"</string>
<string name="keyguard_affordance_enablement_dialog_message" msgid="6136286758939253570">"<xliff:g id="APPNAME">%1$s</xliff:g> ಆ್ಯಪ್ ಅನ್ನು ಶಾರ್ಟ್ಕಟ್ ಆಗಿ ಸೇರಿಸಲು ಕೆಳಗಿನವುಗಳನ್ನು ಖಚಿತಪಡಿಸಿಕೊಳ್ಳಿ"</string>
<string name="keyguard_affordance_enablement_dialog_dismiss_button" msgid="629754625264422508">"ಮುಗಿದಿದೆ"</string>
diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml
index 304fc99..3f829ba 100644
--- a/res/values-ko/strings.xml
+++ b/res/values-ko/strings.xml
@@ -94,7 +94,8 @@
<string name="keyguard_slot_name_bottom_start" msgid="6717374042663171860">"왼쪽 버튼"</string>
<string name="keyguard_slot_name_bottom_end" msgid="7636885379738905151">"오른쪽 버튼"</string>
<string name="keyguard_affordance_none" msgid="1751643933430782312">"없음"</string>
- <string name="keyguard_affordance_enablement_dialog_title" msgid="307756993596011884">"추가 설정 필요"</string>
+ <!-- no translation found for keyguard_affordance_enablement_dialog_title (3389730825561696493) -->
+ <skip />
<string name="keyguard_affordance_enablement_dialog_action_template" msgid="8117011931337357438">"<xliff:g id="APPNAME">%1$s</xliff:g> 열기"</string>
<string name="keyguard_affordance_enablement_dialog_message" msgid="6136286758939253570">"<xliff:g id="APPNAME">%1$s</xliff:g> 앱을 바로가기로 추가하려면 다음을 확인하세요."</string>
<string name="keyguard_affordance_enablement_dialog_dismiss_button" msgid="629754625264422508">"완료"</string>
diff --git a/res/values-ky/strings.xml b/res/values-ky/strings.xml
index aca5694..7f6a7bd 100644
--- a/res/values-ky/strings.xml
+++ b/res/values-ky/strings.xml
@@ -94,7 +94,8 @@
<string name="keyguard_slot_name_bottom_start" msgid="6717374042663171860">"Сол баскыч"</string>
<string name="keyguard_slot_name_bottom_end" msgid="7636885379738905151">"Оң баскыч"</string>
<string name="keyguard_affordance_none" msgid="1751643933430782312">"Жок"</string>
- <string name="keyguard_affordance_enablement_dialog_title" msgid="307756993596011884">"Кошумча тууралоо керек"</string>
+ <!-- no translation found for keyguard_affordance_enablement_dialog_title (3389730825561696493) -->
+ <skip />
<string name="keyguard_affordance_enablement_dialog_action_template" msgid="8117011931337357438">"<xliff:g id="APPNAME">%1$s</xliff:g> ачуу"</string>
<string name="keyguard_affordance_enablement_dialog_message" msgid="6136286758939253570">"<xliff:g id="APPNAME">%1$s</xliff:g> колдонмосун ыкчам баскыч катары кошуу үчүн төмөнкүлөрдү аткарыңыз:"</string>
<string name="keyguard_affordance_enablement_dialog_dismiss_button" msgid="629754625264422508">"Бүттү"</string>
diff --git a/res/values-lo/strings.xml b/res/values-lo/strings.xml
index 8a9cdb2..3e958e1 100644
--- a/res/values-lo/strings.xml
+++ b/res/values-lo/strings.xml
@@ -94,7 +94,8 @@
<string name="keyguard_slot_name_bottom_start" msgid="6717374042663171860">"ປຸ່ມຊ້າຍ"</string>
<string name="keyguard_slot_name_bottom_end" msgid="7636885379738905151">"ປຸ່ມຂວາ"</string>
<string name="keyguard_affordance_none" msgid="1751643933430782312">"ບໍ່ມີ"</string>
- <string name="keyguard_affordance_enablement_dialog_title" msgid="307756993596011884">"ຕ້ອງຕັ້ງຄ່າເພີ່ມເຕີມ"</string>
+ <!-- no translation found for keyguard_affordance_enablement_dialog_title (3389730825561696493) -->
+ <skip />
<string name="keyguard_affordance_enablement_dialog_action_template" msgid="8117011931337357438">"ເປີດ <xliff:g id="APPNAME">%1$s</xliff:g>"</string>
<string name="keyguard_affordance_enablement_dialog_message" msgid="6136286758939253570">"ເພື່ອເພີ່ມແອັບ <xliff:g id="APPNAME">%1$s</xliff:g> ເປັນທາງລັດ, ກະລຸນາກວດສອບໃຫ້ແນ່ໃຈວ່າ"</string>
<string name="keyguard_affordance_enablement_dialog_dismiss_button" msgid="629754625264422508">"ແລ້ວໆ"</string>
diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml
index e4542e2..c802dd0 100644
--- a/res/values-lt/strings.xml
+++ b/res/values-lt/strings.xml
@@ -94,7 +94,8 @@
<string name="keyguard_slot_name_bottom_start" msgid="6717374042663171860">"Mygtukas kairėn"</string>
<string name="keyguard_slot_name_bottom_end" msgid="7636885379738905151">"Mygtukas dešinėn"</string>
<string name="keyguard_affordance_none" msgid="1751643933430782312">"Nėra"</string>
- <string name="keyguard_affordance_enablement_dialog_title" msgid="307756993596011884">"Reikalinga papildoma sąranka"</string>
+ <!-- no translation found for keyguard_affordance_enablement_dialog_title (3389730825561696493) -->
+ <skip />
<string name="keyguard_affordance_enablement_dialog_action_template" msgid="8117011931337357438">"Atidaryti „<xliff:g id="APPNAME">%1$s</xliff:g>“"</string>
<string name="keyguard_affordance_enablement_dialog_message" msgid="6136286758939253570">"Jei norite pridėti programą „<xliff:g id="APPNAME">%1$s</xliff:g>“ kaip šaukinį, įsitikinkite, kad atitinkate reikalavimus."</string>
<string name="keyguard_affordance_enablement_dialog_dismiss_button" msgid="629754625264422508">"Atlikta"</string>
diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml
index be7c320..2810f39 100644
--- a/res/values-lv/strings.xml
+++ b/res/values-lv/strings.xml
@@ -94,7 +94,8 @@
<string name="keyguard_slot_name_bottom_start" msgid="6717374042663171860">"Kreisā poga"</string>
<string name="keyguard_slot_name_bottom_end" msgid="7636885379738905151">"Labā poga"</string>
<string name="keyguard_affordance_none" msgid="1751643933430782312">"Nav"</string>
- <string name="keyguard_affordance_enablement_dialog_title" msgid="307756993596011884">"Jāveic papildu iestatīšana"</string>
+ <!-- no translation found for keyguard_affordance_enablement_dialog_title (3389730825561696493) -->
+ <skip />
<string name="keyguard_affordance_enablement_dialog_action_template" msgid="8117011931337357438">"Atvērt lietotni <xliff:g id="APPNAME">%1$s</xliff:g>"</string>
<string name="keyguard_affordance_enablement_dialog_message" msgid="6136286758939253570">"Lai pievienotu lietotni <xliff:g id="APPNAME">%1$s</xliff:g> kā saīsni, jābūt izpildītiem tālāk minētajiem nosacījumiem."</string>
<string name="keyguard_affordance_enablement_dialog_dismiss_button" msgid="629754625264422508">"Gatavs"</string>
diff --git a/res/values-mk/strings.xml b/res/values-mk/strings.xml
index 812dd4d..d95e400 100644
--- a/res/values-mk/strings.xml
+++ b/res/values-mk/strings.xml
@@ -94,7 +94,8 @@
<string name="keyguard_slot_name_bottom_start" msgid="6717374042663171860">"Лево копче"</string>
<string name="keyguard_slot_name_bottom_end" msgid="7636885379738905151">"Десно копче"</string>
<string name="keyguard_affordance_none" msgid="1751643933430782312">"Нема"</string>
- <string name="keyguard_affordance_enablement_dialog_title" msgid="307756993596011884">"Потребно е дополнително поставување"</string>
+ <!-- no translation found for keyguard_affordance_enablement_dialog_title (3389730825561696493) -->
+ <skip />
<string name="keyguard_affordance_enablement_dialog_action_template" msgid="8117011931337357438">"Отворете ја <xliff:g id="APPNAME">%1$s</xliff:g>"</string>
<string name="keyguard_affordance_enablement_dialog_message" msgid="6136286758939253570">"За да ја додадете апликацијата <xliff:g id="APPNAME">%1$s</xliff:g> како кратенка, треба да бидат исполнети следниве услови"</string>
<string name="keyguard_affordance_enablement_dialog_dismiss_button" msgid="629754625264422508">"Готово"</string>
diff --git a/res/values-ml/strings.xml b/res/values-ml/strings.xml
index 8a57b86..4a49da0 100644
--- a/res/values-ml/strings.xml
+++ b/res/values-ml/strings.xml
@@ -94,7 +94,8 @@
<string name="keyguard_slot_name_bottom_start" msgid="6717374042663171860">"ഇടതുവശത്തെ ബട്ടൺ"</string>
<string name="keyguard_slot_name_bottom_end" msgid="7636885379738905151">"വലതുവശത്തെ ബട്ടൺ"</string>
<string name="keyguard_affordance_none" msgid="1751643933430782312">"ഒന്നുമില്ല"</string>
- <string name="keyguard_affordance_enablement_dialog_title" msgid="307756993596011884">"കൂടുതൽ സജ്ജീകരണം ആവശ്യമാണ്"</string>
+ <!-- no translation found for keyguard_affordance_enablement_dialog_title (3389730825561696493) -->
+ <skip />
<string name="keyguard_affordance_enablement_dialog_action_template" msgid="8117011931337357438">"<xliff:g id="APPNAME">%1$s</xliff:g> തുറക്കുക"</string>
<string name="keyguard_affordance_enablement_dialog_message" msgid="6136286758939253570">"കുറുക്കുവഴിയായി <xliff:g id="APPNAME">%1$s</xliff:g> ആപ്പ് ചേർക്കാൻ, ഇനിപ്പറയുന്ന കാര്യങ്ങൾ ഉറപ്പാക്കുക"</string>
<string name="keyguard_affordance_enablement_dialog_dismiss_button" msgid="629754625264422508">"പൂർത്തിയായി"</string>
diff --git a/res/values-mn/strings.xml b/res/values-mn/strings.xml
index 1ee0c91..e13fc69 100644
--- a/res/values-mn/strings.xml
+++ b/res/values-mn/strings.xml
@@ -94,7 +94,8 @@
<string name="keyguard_slot_name_bottom_start" msgid="6717374042663171860">"Зүүн товчлуур"</string>
<string name="keyguard_slot_name_bottom_end" msgid="7636885379738905151">"Баруун товчлуур"</string>
<string name="keyguard_affordance_none" msgid="1751643933430782312">"Байхгүй"</string>
- <string name="keyguard_affordance_enablement_dialog_title" msgid="307756993596011884">"Нэмэлт тохируулга шаардлагатай"</string>
+ <!-- no translation found for keyguard_affordance_enablement_dialog_title (3389730825561696493) -->
+ <skip />
<string name="keyguard_affordance_enablement_dialog_action_template" msgid="8117011931337357438">"<xliff:g id="APPNAME">%1$s</xliff:g>-г нээх"</string>
<string name="keyguard_affordance_enablement_dialog_message" msgid="6136286758939253570">"<xliff:g id="APPNAME">%1$s</xliff:g> аппыг товчлолоор нэмэхийн тулд дараахыг баталгаажуулна уу"</string>
<string name="keyguard_affordance_enablement_dialog_dismiss_button" msgid="629754625264422508">"Болсон"</string>
diff --git a/res/values-mr/strings.xml b/res/values-mr/strings.xml
index fcf5639..f654286 100644
--- a/res/values-mr/strings.xml
+++ b/res/values-mr/strings.xml
@@ -94,7 +94,8 @@
<string name="keyguard_slot_name_bottom_start" msgid="6717374042663171860">"डावीकडील बटण"</string>
<string name="keyguard_slot_name_bottom_end" msgid="7636885379738905151">"उजवीकडील बटण"</string>
<string name="keyguard_affordance_none" msgid="1751643933430782312">"काहीही नाही"</string>
- <string name="keyguard_affordance_enablement_dialog_title" msgid="307756993596011884">"अतिरिक्त सेटअप आवश्यक आहे"</string>
+ <!-- no translation found for keyguard_affordance_enablement_dialog_title (3389730825561696493) -->
+ <skip />
<string name="keyguard_affordance_enablement_dialog_action_template" msgid="8117011931337357438">"<xliff:g id="APPNAME">%1$s</xliff:g> उघडा"</string>
<string name="keyguard_affordance_enablement_dialog_message" msgid="6136286758939253570">"<xliff:g id="APPNAME">%1$s</xliff:g> हे अॅप शॉर्टकट म्हणून जोडण्यासाठी, पुढील गोष्टींची खात्री करा"</string>
<string name="keyguard_affordance_enablement_dialog_dismiss_button" msgid="629754625264422508">"पूर्ण झाले"</string>
diff --git a/res/values-ms/strings.xml b/res/values-ms/strings.xml
index e83e617..7a83aeb 100644
--- a/res/values-ms/strings.xml
+++ b/res/values-ms/strings.xml
@@ -94,7 +94,8 @@
<string name="keyguard_slot_name_bottom_start" msgid="6717374042663171860">"Butang kiri"</string>
<string name="keyguard_slot_name_bottom_end" msgid="7636885379738905151">"Butang kanan"</string>
<string name="keyguard_affordance_none" msgid="1751643933430782312">"Tiada"</string>
- <string name="keyguard_affordance_enablement_dialog_title" msgid="307756993596011884">"Persediaan tambahan diperlukan"</string>
+ <!-- no translation found for keyguard_affordance_enablement_dialog_title (3389730825561696493) -->
+ <skip />
<string name="keyguard_affordance_enablement_dialog_action_template" msgid="8117011931337357438">"Buka <xliff:g id="APPNAME">%1$s</xliff:g>"</string>
<string name="keyguard_affordance_enablement_dialog_message" msgid="6136286758939253570">"Untuk menambahkan apl <xliff:g id="APPNAME">%1$s</xliff:g> sebagai pintasan, pastikan"</string>
<string name="keyguard_affordance_enablement_dialog_dismiss_button" msgid="629754625264422508">"Selesai"</string>
diff --git a/res/values-my/strings.xml b/res/values-my/strings.xml
index 0b9fe4f..522c9c5 100644
--- a/res/values-my/strings.xml
+++ b/res/values-my/strings.xml
@@ -94,7 +94,8 @@
<string name="keyguard_slot_name_bottom_start" msgid="6717374042663171860">"ဘယ်ခလုတ်"</string>
<string name="keyguard_slot_name_bottom_end" msgid="7636885379738905151">"ညာခလုတ်"</string>
<string name="keyguard_affordance_none" msgid="1751643933430782312">"မရှိ"</string>
- <string name="keyguard_affordance_enablement_dialog_title" msgid="307756993596011884">"နောက်ထပ်စနစ်ထည့်သွင်းမှု လိုအပ်သည်"</string>
+ <!-- no translation found for keyguard_affordance_enablement_dialog_title (3389730825561696493) -->
+ <skip />
<string name="keyguard_affordance_enablement_dialog_action_template" msgid="8117011931337357438">"<xliff:g id="APPNAME">%1$s</xliff:g> ဖွင့်ရန်"</string>
<string name="keyguard_affordance_enablement_dialog_message" msgid="6136286758939253570">"<xliff:g id="APPNAME">%1$s</xliff:g> အက်ပ်ကို ဖြတ်လမ်းလင့်ခ်အဖြစ် ထည့်ရန် အောက်ပါတို့နှင့်ကိုက်ညီရမည်"</string>
<string name="keyguard_affordance_enablement_dialog_dismiss_button" msgid="629754625264422508">"ပြီးပြီ"</string>
diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml
index 9f5fb59..556a582 100644
--- a/res/values-nb/strings.xml
+++ b/res/values-nb/strings.xml
@@ -94,7 +94,8 @@
<string name="keyguard_slot_name_bottom_start" msgid="6717374042663171860">"Venstreknapp"</string>
<string name="keyguard_slot_name_bottom_end" msgid="7636885379738905151">"Høyreknapp"</string>
<string name="keyguard_affordance_none" msgid="1751643933430782312">"Ingen"</string>
- <string name="keyguard_affordance_enablement_dialog_title" msgid="307756993596011884">"Det er nødvendig med mer konfigurering"</string>
+ <!-- no translation found for keyguard_affordance_enablement_dialog_title (3389730825561696493) -->
+ <skip />
<string name="keyguard_affordance_enablement_dialog_action_template" msgid="8117011931337357438">"Åpne <xliff:g id="APPNAME">%1$s</xliff:g>"</string>
<string name="keyguard_affordance_enablement_dialog_message" msgid="6136286758939253570">"For å legge til <xliff:g id="APPNAME">%1$s</xliff:g>-appen som en snarvei må du sørge for at"</string>
<string name="keyguard_affordance_enablement_dialog_dismiss_button" msgid="629754625264422508">"Ferdig"</string>
diff --git a/res/values-ne/strings.xml b/res/values-ne/strings.xml
index aff2143..332653b 100644
--- a/res/values-ne/strings.xml
+++ b/res/values-ne/strings.xml
@@ -94,7 +94,8 @@
<string name="keyguard_slot_name_bottom_start" msgid="6717374042663171860">"बायाँतिरको बटन"</string>
<string name="keyguard_slot_name_bottom_end" msgid="7636885379738905151">"दायाँतिरको बटन"</string>
<string name="keyguard_affordance_none" msgid="1751643933430782312">"कुनै पनि होइन"</string>
- <string name="keyguard_affordance_enablement_dialog_title" msgid="307756993596011884">"अतिरिक्त सेटअप गर्नु पर्ने हुन्छ"</string>
+ <!-- no translation found for keyguard_affordance_enablement_dialog_title (3389730825561696493) -->
+ <skip />
<string name="keyguard_affordance_enablement_dialog_action_template" msgid="8117011931337357438">"<xliff:g id="APPNAME">%1$s</xliff:g> खोल्नुहोस्"</string>
<string name="keyguard_affordance_enablement_dialog_message" msgid="6136286758939253570">"<xliff:g id="APPNAME">%1$s</xliff:g> एपलाई सर्टकटका रूपमा हाल्न, निम्न कुरा सुनिश्चित गर्नुहोस्:"</string>
<string name="keyguard_affordance_enablement_dialog_dismiss_button" msgid="629754625264422508">"पूरा भयो"</string>
diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml
index 8a458c5..168e3a2 100644
--- a/res/values-nl/strings.xml
+++ b/res/values-nl/strings.xml
@@ -94,7 +94,8 @@
<string name="keyguard_slot_name_bottom_start" msgid="6717374042663171860">"Linkerknop"</string>
<string name="keyguard_slot_name_bottom_end" msgid="7636885379738905151">"Rechterknop"</string>
<string name="keyguard_affordance_none" msgid="1751643933430782312">"Geen"</string>
- <string name="keyguard_affordance_enablement_dialog_title" msgid="307756993596011884">"Aanvullende instelling nodig"</string>
+ <!-- no translation found for keyguard_affordance_enablement_dialog_title (3389730825561696493) -->
+ <skip />
<string name="keyguard_affordance_enablement_dialog_action_template" msgid="8117011931337357438">"<xliff:g id="APPNAME">%1$s</xliff:g> openen"</string>
<string name="keyguard_affordance_enablement_dialog_message" msgid="6136286758939253570">"Zorg voor het volgende om de <xliff:g id="APPNAME">%1$s</xliff:g>-app toe te voegen als snelkoppeling:"</string>
<string name="keyguard_affordance_enablement_dialog_dismiss_button" msgid="629754625264422508">"Klaar"</string>
diff --git a/res/values-or/strings.xml b/res/values-or/strings.xml
index 4fa64e1..27deed4 100644
--- a/res/values-or/strings.xml
+++ b/res/values-or/strings.xml
@@ -94,7 +94,8 @@
<string name="keyguard_slot_name_bottom_start" msgid="6717374042663171860">"ବାମପଟ ବଟନ"</string>
<string name="keyguard_slot_name_bottom_end" msgid="7636885379738905151">"ଡାହାଣପଟ ବଟନ"</string>
<string name="keyguard_affordance_none" msgid="1751643933430782312">"କିଛି ନାହିଁ"</string>
- <string name="keyguard_affordance_enablement_dialog_title" msgid="307756993596011884">"ଅତିରିକ୍ତ ସେଟଅପ ଆବଶ୍ୟକ"</string>
+ <!-- no translation found for keyguard_affordance_enablement_dialog_title (3389730825561696493) -->
+ <skip />
<string name="keyguard_affordance_enablement_dialog_action_template" msgid="8117011931337357438">"<xliff:g id="APPNAME">%1$s</xliff:g> ଖୋଲନ୍ତୁ"</string>
<string name="keyguard_affordance_enablement_dialog_message" msgid="6136286758939253570">"ଏକ ସର୍ଟକଟ ଭାବେ <xliff:g id="APPNAME">%1$s</xliff:g> ଆପ ଯୋଗ କରିବାକୁ, ଏହା ସୁନିଶ୍ଚିତ କରନ୍ତୁ"</string>
<string name="keyguard_affordance_enablement_dialog_dismiss_button" msgid="629754625264422508">"ହୋଇଗଲା"</string>
diff --git a/res/values-pa/strings.xml b/res/values-pa/strings.xml
index c07470b..d7546b6 100644
--- a/res/values-pa/strings.xml
+++ b/res/values-pa/strings.xml
@@ -94,7 +94,8 @@
<string name="keyguard_slot_name_bottom_start" msgid="6717374042663171860">"ਖੱਬਾ ਬਟਨ"</string>
<string name="keyguard_slot_name_bottom_end" msgid="7636885379738905151">"ਸੱਜਾ ਬਟਨ"</string>
<string name="keyguard_affordance_none" msgid="1751643933430782312">"ਕੋਈ ਨਹੀਂ"</string>
- <string name="keyguard_affordance_enablement_dialog_title" msgid="307756993596011884">"ਵਧੀਕ ਸੈੱਟਅੱਪ ਦੀ ਲੋੜ ਹੈ"</string>
+ <!-- no translation found for keyguard_affordance_enablement_dialog_title (3389730825561696493) -->
+ <skip />
<string name="keyguard_affordance_enablement_dialog_action_template" msgid="8117011931337357438">"<xliff:g id="APPNAME">%1$s</xliff:g> ਖੋਲ੍ਹੋ"</string>
<string name="keyguard_affordance_enablement_dialog_message" msgid="6136286758939253570">"<xliff:g id="APPNAME">%1$s</xliff:g> ਐਪ ਨੂੰ ਸ਼ਾਰਟਕੱਟ ਵਜੋਂ ਸ਼ਾਮਲ ਕਰਨ ਲਈ, ਪੱਕਾ ਕਰੋ ਕਿ"</string>
<string name="keyguard_affordance_enablement_dialog_dismiss_button" msgid="629754625264422508">"ਹੋ ਗਿਆ"</string>
diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml
index 29f6e12..2d9ed24 100644
--- a/res/values-pl/strings.xml
+++ b/res/values-pl/strings.xml
@@ -94,7 +94,8 @@
<string name="keyguard_slot_name_bottom_start" msgid="6717374042663171860">"Lewy przycisk"</string>
<string name="keyguard_slot_name_bottom_end" msgid="7636885379738905151">"Prawy przycisk"</string>
<string name="keyguard_affordance_none" msgid="1751643933430782312">"Brak"</string>
- <string name="keyguard_affordance_enablement_dialog_title" msgid="307756993596011884">"Konieczna jest dodatkowa konfiguracja"</string>
+ <!-- no translation found for keyguard_affordance_enablement_dialog_title (3389730825561696493) -->
+ <skip />
<string name="keyguard_affordance_enablement_dialog_action_template" msgid="8117011931337357438">"Otwórz: <xliff:g id="APPNAME">%1$s</xliff:g>"</string>
<string name="keyguard_affordance_enablement_dialog_message" msgid="6136286758939253570">"Aby dodać aplikację <xliff:g id="APPNAME">%1$s</xliff:g> jako skrót, upewnij się, że spełnione zostały te warunki:"</string>
<string name="keyguard_affordance_enablement_dialog_dismiss_button" msgid="629754625264422508">"Gotowe"</string>
diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml
index 4ffe2eb..6f58cd4 100644
--- a/res/values-pt-rPT/strings.xml
+++ b/res/values-pt-rPT/strings.xml
@@ -94,7 +94,8 @@
<string name="keyguard_slot_name_bottom_start" msgid="6717374042663171860">"Botão esquerdo"</string>
<string name="keyguard_slot_name_bottom_end" msgid="7636885379738905151">"Botão direito"</string>
<string name="keyguard_affordance_none" msgid="1751643933430782312">"Nenhum"</string>
- <string name="keyguard_affordance_enablement_dialog_title" msgid="307756993596011884">"Configuração adicional necessária"</string>
+ <!-- no translation found for keyguard_affordance_enablement_dialog_title (3389730825561696493) -->
+ <skip />
<string name="keyguard_affordance_enablement_dialog_action_template" msgid="8117011931337357438">"Abrir <xliff:g id="APPNAME">%1$s</xliff:g>"</string>
<string name="keyguard_affordance_enablement_dialog_message" msgid="6136286758939253570">"Para adicionar a app <xliff:g id="APPNAME">%1$s</xliff:g> como um atalho, garanta"</string>
<string name="keyguard_affordance_enablement_dialog_dismiss_button" msgid="629754625264422508">"Concluído"</string>
diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml
index a793fa5..32f2231 100644
--- a/res/values-pt/strings.xml
+++ b/res/values-pt/strings.xml
@@ -94,7 +94,8 @@
<string name="keyguard_slot_name_bottom_start" msgid="6717374042663171860">"Botão esquerdo"</string>
<string name="keyguard_slot_name_bottom_end" msgid="7636885379738905151">"Botão direito"</string>
<string name="keyguard_affordance_none" msgid="1751643933430782312">"Nenhum"</string>
- <string name="keyguard_affordance_enablement_dialog_title" msgid="307756993596011884">"Configuração extra necessária"</string>
+ <!-- no translation found for keyguard_affordance_enablement_dialog_title (3389730825561696493) -->
+ <skip />
<string name="keyguard_affordance_enablement_dialog_action_template" msgid="8117011931337357438">"Abrir <xliff:g id="APPNAME">%1$s</xliff:g>"</string>
<string name="keyguard_affordance_enablement_dialog_message" msgid="6136286758939253570">"Para adicionar o app <xliff:g id="APPNAME">%1$s</xliff:g> como um atalho, confira se"</string>
<string name="keyguard_affordance_enablement_dialog_dismiss_button" msgid="629754625264422508">"Concluído"</string>
diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml
index 58038dd..2fdcd24 100644
--- a/res/values-ro/strings.xml
+++ b/res/values-ro/strings.xml
@@ -94,7 +94,8 @@
<string name="keyguard_slot_name_bottom_start" msgid="6717374042663171860">"Butonul stâng"</string>
<string name="keyguard_slot_name_bottom_end" msgid="7636885379738905151">"Butonul drept"</string>
<string name="keyguard_affordance_none" msgid="1751643933430782312">"Fără"</string>
- <string name="keyguard_affordance_enablement_dialog_title" msgid="307756993596011884">"Configurare suplimentară necesară"</string>
+ <!-- no translation found for keyguard_affordance_enablement_dialog_title (3389730825561696493) -->
+ <skip />
<string name="keyguard_affordance_enablement_dialog_action_template" msgid="8117011931337357438">"Deschide <xliff:g id="APPNAME">%1$s</xliff:g>"</string>
<string name="keyguard_affordance_enablement_dialog_message" msgid="6136286758939253570">"Pentru a adăuga aplicația <xliff:g id="APPNAME">%1$s</xliff:g> drept comandă rapidă, asigură-te"</string>
<string name="keyguard_affordance_enablement_dialog_dismiss_button" msgid="629754625264422508">"Gata"</string>
diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml
index b734b39..0d3e54b 100644
--- a/res/values-ru/strings.xml
+++ b/res/values-ru/strings.xml
@@ -94,7 +94,8 @@
<string name="keyguard_slot_name_bottom_start" msgid="6717374042663171860">"Левая кнопка"</string>
<string name="keyguard_slot_name_bottom_end" msgid="7636885379738905151">"Правая кнопка"</string>
<string name="keyguard_affordance_none" msgid="1751643933430782312">"Нет"</string>
- <string name="keyguard_affordance_enablement_dialog_title" msgid="307756993596011884">"Требуется дополнительная настройка"</string>
+ <!-- no translation found for keyguard_affordance_enablement_dialog_title (3389730825561696493) -->
+ <skip />
<string name="keyguard_affordance_enablement_dialog_action_template" msgid="8117011931337357438">"Открыть: <xliff:g id="APPNAME">%1$s</xliff:g>"</string>
<string name="keyguard_affordance_enablement_dialog_message" msgid="6136286758939253570">"Для добавления ярлыка приложения \"<xliff:g id="APPNAME">%1$s</xliff:g>\" должны выполняться следующие условия:"</string>
<string name="keyguard_affordance_enablement_dialog_dismiss_button" msgid="629754625264422508">"ОК"</string>
diff --git a/res/values-si/strings.xml b/res/values-si/strings.xml
index 60d243f..58a7c8a 100644
--- a/res/values-si/strings.xml
+++ b/res/values-si/strings.xml
@@ -94,7 +94,8 @@
<string name="keyguard_slot_name_bottom_start" msgid="6717374042663171860">"වම් බොත්තම"</string>
<string name="keyguard_slot_name_bottom_end" msgid="7636885379738905151">"දකුණු බොත්තම"</string>
<string name="keyguard_affordance_none" msgid="1751643933430782312">"කිසිත් නැත"</string>
- <string name="keyguard_affordance_enablement_dialog_title" msgid="307756993596011884">"අතිරේක පිහිටුවීම අවශ්යයි"</string>
+ <!-- no translation found for keyguard_affordance_enablement_dialog_title (3389730825561696493) -->
+ <skip />
<string name="keyguard_affordance_enablement_dialog_action_template" msgid="8117011931337357438">"<xliff:g id="APPNAME">%1$s</xliff:g> විවෘත කරන්න"</string>
<string name="keyguard_affordance_enablement_dialog_message" msgid="6136286758939253570">"කෙටිමඟක් ලෙස <xliff:g id="APPNAME">%1$s</xliff:g> එක් කිරීමට, තහවුරු කර ගන්න"</string>
<string name="keyguard_affordance_enablement_dialog_dismiss_button" msgid="629754625264422508">"නිමයි"</string>
diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml
index c9ee735..743ac8f 100644
--- a/res/values-sk/strings.xml
+++ b/res/values-sk/strings.xml
@@ -94,7 +94,8 @@
<string name="keyguard_slot_name_bottom_start" msgid="6717374042663171860">"Ľavé tlačidlo"</string>
<string name="keyguard_slot_name_bottom_end" msgid="7636885379738905151">"Pravé tlačidlo"</string>
<string name="keyguard_affordance_none" msgid="1751643933430782312">"Žiadne"</string>
- <string name="keyguard_affordance_enablement_dialog_title" msgid="307756993596011884">"Vyžaduje sa ďalšie nastavenie"</string>
+ <!-- no translation found for keyguard_affordance_enablement_dialog_title (3389730825561696493) -->
+ <skip />
<string name="keyguard_affordance_enablement_dialog_action_template" msgid="8117011931337357438">"Otvoriť <xliff:g id="APPNAME">%1$s</xliff:g>"</string>
<string name="keyguard_affordance_enablement_dialog_message" msgid="6136286758939253570">"Ak chcete aplikáciu <xliff:g id="APPNAME">%1$s</xliff:g> pridať ako odkaz, uistite sa, že"</string>
<string name="keyguard_affordance_enablement_dialog_dismiss_button" msgid="629754625264422508">"Hotovo"</string>
diff --git a/res/values-sl/strings.xml b/res/values-sl/strings.xml
index 7896b0a..eff0128 100644
--- a/res/values-sl/strings.xml
+++ b/res/values-sl/strings.xml
@@ -94,7 +94,8 @@
<string name="keyguard_slot_name_bottom_start" msgid="6717374042663171860">"Levi gumb"</string>
<string name="keyguard_slot_name_bottom_end" msgid="7636885379738905151">"Desni gumb"</string>
<string name="keyguard_affordance_none" msgid="1751643933430782312">"Brez"</string>
- <string name="keyguard_affordance_enablement_dialog_title" msgid="307756993596011884">"Potrebna je dodatna nastavitev"</string>
+ <!-- no translation found for keyguard_affordance_enablement_dialog_title (3389730825561696493) -->
+ <skip />
<string name="keyguard_affordance_enablement_dialog_action_template" msgid="8117011931337357438">"Odpri <xliff:g id="APPNAME">%1$s</xliff:g>"</string>
<string name="keyguard_affordance_enablement_dialog_message" msgid="6136286758939253570">"Če želite aplikacijo <xliff:g id="APPNAME">%1$s</xliff:g> dodati kot bližnjico, zagotovite naslednje:"</string>
<string name="keyguard_affordance_enablement_dialog_dismiss_button" msgid="629754625264422508">"Končano"</string>
diff --git a/res/values-sq/strings.xml b/res/values-sq/strings.xml
index a44d210..45b99a7 100644
--- a/res/values-sq/strings.xml
+++ b/res/values-sq/strings.xml
@@ -94,7 +94,8 @@
<string name="keyguard_slot_name_bottom_start" msgid="6717374042663171860">"Butoni i majtë"</string>
<string name="keyguard_slot_name_bottom_end" msgid="7636885379738905151">"Butoni i djathtë"</string>
<string name="keyguard_affordance_none" msgid="1751643933430782312">"Asnjë"</string>
- <string name="keyguard_affordance_enablement_dialog_title" msgid="307756993596011884">"Nevojitet konfigurimi shtesë"</string>
+ <!-- no translation found for keyguard_affordance_enablement_dialog_title (3389730825561696493) -->
+ <skip />
<string name="keyguard_affordance_enablement_dialog_action_template" msgid="8117011931337357438">"Hap \"<xliff:g id="APPNAME">%1$s</xliff:g>\""</string>
<string name="keyguard_affordance_enablement_dialog_message" msgid="6136286758939253570">"Për të shtuar aplikacionin \"<xliff:g id="APPNAME">%1$s</xliff:g>\" si një shkurtore, sigurohu që"</string>
<string name="keyguard_affordance_enablement_dialog_dismiss_button" msgid="629754625264422508">"U krye"</string>
diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml
index 26e34ff..affe566 100644
--- a/res/values-sr/strings.xml
+++ b/res/values-sr/strings.xml
@@ -94,7 +94,8 @@
<string name="keyguard_slot_name_bottom_start" msgid="6717374042663171860">"Лево дугме"</string>
<string name="keyguard_slot_name_bottom_end" msgid="7636885379738905151">"Десно дугме"</string>
<string name="keyguard_affordance_none" msgid="1751643933430782312">"Ништа"</string>
- <string name="keyguard_affordance_enablement_dialog_title" msgid="307756993596011884">"Потребно је додатно подешавање"</string>
+ <!-- no translation found for keyguard_affordance_enablement_dialog_title (3389730825561696493) -->
+ <skip />
<string name="keyguard_affordance_enablement_dialog_action_template" msgid="8117011931337357438">"Отворите: <xliff:g id="APPNAME">%1$s</xliff:g>"</string>
<string name="keyguard_affordance_enablement_dialog_message" msgid="6136286758939253570">"Да бисте додали апликацију <xliff:g id="APPNAME">%1$s</xliff:g> као пречицу, уверите се"</string>
<string name="keyguard_affordance_enablement_dialog_dismiss_button" msgid="629754625264422508">"Готово"</string>
diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml
index 258e6fb..e1f248d 100644
--- a/res/values-sv/strings.xml
+++ b/res/values-sv/strings.xml
@@ -94,7 +94,8 @@
<string name="keyguard_slot_name_bottom_start" msgid="6717374042663171860">"Vänsterknapp"</string>
<string name="keyguard_slot_name_bottom_end" msgid="7636885379738905151">"Högerknapp"</string>
<string name="keyguard_affordance_none" msgid="1751643933430782312">"Inga"</string>
- <string name="keyguard_affordance_enablement_dialog_title" msgid="307756993596011884">"Ytterligare konfigurering krävs"</string>
+ <!-- no translation found for keyguard_affordance_enablement_dialog_title (3389730825561696493) -->
+ <skip />
<string name="keyguard_affordance_enablement_dialog_action_template" msgid="8117011931337357438">"Öppna <xliff:g id="APPNAME">%1$s</xliff:g>"</string>
<string name="keyguard_affordance_enablement_dialog_message" msgid="6136286758939253570">"Om du vill lägga till <xliff:g id="APPNAME">%1$s</xliff:g>-appen som en genväg ser du till att"</string>
<string name="keyguard_affordance_enablement_dialog_dismiss_button" msgid="629754625264422508">"Klar"</string>
diff --git a/res/values-sw/strings.xml b/res/values-sw/strings.xml
index 84946eb..644898f 100644
--- a/res/values-sw/strings.xml
+++ b/res/values-sw/strings.xml
@@ -94,7 +94,8 @@
<string name="keyguard_slot_name_bottom_start" msgid="6717374042663171860">"Kitufe cha kushoto"</string>
<string name="keyguard_slot_name_bottom_end" msgid="7636885379738905151">"Kitufe cha kulia"</string>
<string name="keyguard_affordance_none" msgid="1751643933430782312">"Hamna"</string>
- <string name="keyguard_affordance_enablement_dialog_title" msgid="307756993596011884">"Mipangilio ya ziada inahitajika"</string>
+ <!-- no translation found for keyguard_affordance_enablement_dialog_title (3389730825561696493) -->
+ <skip />
<string name="keyguard_affordance_enablement_dialog_action_template" msgid="8117011931337357438">"Fungua <xliff:g id="APPNAME">%1$s</xliff:g>"</string>
<string name="keyguard_affordance_enablement_dialog_message" msgid="6136286758939253570">"Ili kuweka programu ya <xliff:g id="APPNAME">%1$s</xliff:g> kuwa njia ya mkato, hakikisha"</string>
<string name="keyguard_affordance_enablement_dialog_dismiss_button" msgid="629754625264422508">"Nimemaliza"</string>
diff --git a/res/values-ta/strings.xml b/res/values-ta/strings.xml
index ecd4d0f..55d54aa 100644
--- a/res/values-ta/strings.xml
+++ b/res/values-ta/strings.xml
@@ -94,7 +94,8 @@
<string name="keyguard_slot_name_bottom_start" msgid="6717374042663171860">"இடது பட்டன்"</string>
<string name="keyguard_slot_name_bottom_end" msgid="7636885379738905151">"வலது பட்டன்"</string>
<string name="keyguard_affordance_none" msgid="1751643933430782312">"ஏதுமில்லை"</string>
- <string name="keyguard_affordance_enablement_dialog_title" msgid="307756993596011884">"கூடுதல் அமைவு தேவை"</string>
+ <!-- no translation found for keyguard_affordance_enablement_dialog_title (3389730825561696493) -->
+ <skip />
<string name="keyguard_affordance_enablement_dialog_action_template" msgid="8117011931337357438">"<xliff:g id="APPNAME">%1$s</xliff:g> ஐத் திறக்கும்"</string>
<string name="keyguard_affordance_enablement_dialog_message" msgid="6136286758939253570">"<xliff:g id="APPNAME">%1$s</xliff:g> ஆப்ஸை ஷார்ட்கட்டாகச் சேர்க்க இவற்றைப் பின்பற்றுவதை உறுதிசெய்துகொள்ளவும்:"</string>
<string name="keyguard_affordance_enablement_dialog_dismiss_button" msgid="629754625264422508">"சரி"</string>
diff --git a/res/values-te/strings.xml b/res/values-te/strings.xml
index 57d5383..ffa36f1 100644
--- a/res/values-te/strings.xml
+++ b/res/values-te/strings.xml
@@ -56,7 +56,7 @@
<string name="custom_theme" msgid="1618351922263478163">"అనుకూలం"</string>
<string name="custom_theme_title" msgid="2192300350332693631">"అనుకూల <xliff:g id="ID_1">%1$d</xliff:g>"</string>
<string name="custom_theme_fragment_title" msgid="6615547284702040280">"అనుకూల శైలి"</string>
- <string name="custom_theme_delete" msgid="4744494663184126202">"తొలగించు"</string>
+ <string name="custom_theme_delete" msgid="4744494663184126202">"తొలగించండి"</string>
<string name="font_component_title" msgid="8800340833695292049">"ఫాంట్ను ఎంచుకోండి"</string>
<string name="icon_component_title" msgid="5779787138399083903">"చిహ్నాలను ఎంచుకోండి"</string>
<string name="color_component_title" msgid="1194089273921078816">"రంగును ఎంచుకోండి"</string>
@@ -64,12 +64,12 @@
<string name="name_component_title" msgid="532425087968663437">"మీ శైలికి పేరు పెట్టండి"</string>
<string name="icon_component_label" msgid="2625784884001407944">"<xliff:g id="ID_1">%1$d</xliff:g> చిహ్నాలు"</string>
<string name="delete_custom_theme_confirmation" msgid="4452137183628769394">"అనుకూల శైలిని తొలగించాలా?"</string>
- <string name="delete_custom_theme_button" msgid="5102462988130208824">"తొలగించు"</string>
- <string name="cancel" msgid="4651030493668562067">"రద్దు చేయి"</string>
+ <string name="delete_custom_theme_button" msgid="5102462988130208824">"తొలగించండి"</string>
+ <string name="cancel" msgid="4651030493668562067">"రద్దు చేయండి"</string>
<string name="set_theme_wallpaper_dialog_message" msgid="2179661027350908003">"వాల్పేపర్ శైలిని సెట్ చేయండి"</string>
<string name="use_style_instead_title" msgid="1578754995763917502">"బదులుగా <xliff:g id="ID_1">%1$s</xliff:g>ని ఉపయోగించాలా?"</string>
<string name="use_style_instead_body" msgid="3051937045807471496">"మీరు ఎంచుకున్న భాగాలు <xliff:g id="ID_1">%1$s</xliff:g> శైలికి సరిపోతాయి. బదులుగా మీరు <xliff:g id="ID_2">%1$s</xliff:g>ని ఉపయోగించాలనుకుంటున్నారా?"</string>
- <string name="use_style_button" msgid="1754493078383627019">"<xliff:g id="ID_1">%1$s</xliff:g>ని ఉపయోగించు"</string>
+ <string name="use_style_button" msgid="1754493078383627019">"<xliff:g id="ID_1">%1$s</xliff:g>ని ఉపయోగించండి"</string>
<string name="no_thanks" msgid="7286616980115687627">"వద్దు, ధన్యవాదం"</string>
<string name="clock_preview_content_description" msgid="5460561185905717460">"<xliff:g id="ID_1">%1$s</xliff:g> గడియార ప్రివ్యూ"</string>
<string name="something_went_wrong" msgid="529840112449799117">"అయ్యో, ఏదో తప్పు జరిగింది."</string>
@@ -94,7 +94,8 @@
<string name="keyguard_slot_name_bottom_start" msgid="6717374042663171860">"ఎడమవైపు బటన్"</string>
<string name="keyguard_slot_name_bottom_end" msgid="7636885379738905151">"కుడివైపు బటన్"</string>
<string name="keyguard_affordance_none" msgid="1751643933430782312">"ఏదీ లేదు"</string>
- <string name="keyguard_affordance_enablement_dialog_title" msgid="307756993596011884">"అదనపు సెటప్ అవసరం"</string>
+ <!-- no translation found for keyguard_affordance_enablement_dialog_title (3389730825561696493) -->
+ <skip />
<string name="keyguard_affordance_enablement_dialog_action_template" msgid="8117011931337357438">"<xliff:g id="APPNAME">%1$s</xliff:g>ను తెరవండి"</string>
<string name="keyguard_affordance_enablement_dialog_message" msgid="6136286758939253570">"<xliff:g id="APPNAME">%1$s</xliff:g> యాప్ను షార్ట్కట్గా జోడించడానికి, వీటిని నిర్ధారించుకోండి"</string>
<string name="keyguard_affordance_enablement_dialog_dismiss_button" msgid="629754625264422508">"పూర్తయింది"</string>
diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml
index 3371e67..f2fff2f 100644
--- a/res/values-th/strings.xml
+++ b/res/values-th/strings.xml
@@ -94,7 +94,8 @@
<string name="keyguard_slot_name_bottom_start" msgid="6717374042663171860">"ปุ่มซ้าย"</string>
<string name="keyguard_slot_name_bottom_end" msgid="7636885379738905151">"ปุ่มขวา"</string>
<string name="keyguard_affordance_none" msgid="1751643933430782312">"ไม่มี"</string>
- <string name="keyguard_affordance_enablement_dialog_title" msgid="307756993596011884">"ต้องตั้งค่าเพิ่มเติม"</string>
+ <!-- no translation found for keyguard_affordance_enablement_dialog_title (3389730825561696493) -->
+ <skip />
<string name="keyguard_affordance_enablement_dialog_action_template" msgid="8117011931337357438">"เปิด <xliff:g id="APPNAME">%1$s</xliff:g>"</string>
<string name="keyguard_affordance_enablement_dialog_message" msgid="6136286758939253570">"หากต้องการเพิ่มแอป <xliff:g id="APPNAME">%1$s</xliff:g> เป็นทางลัด โปรดตรวจสอบดังต่อไปนี้"</string>
<string name="keyguard_affordance_enablement_dialog_dismiss_button" msgid="629754625264422508">"เสร็จสิ้น"</string>
diff --git a/res/values-tl/strings.xml b/res/values-tl/strings.xml
index b16d210..9fdb612 100644
--- a/res/values-tl/strings.xml
+++ b/res/values-tl/strings.xml
@@ -94,7 +94,8 @@
<string name="keyguard_slot_name_bottom_start" msgid="6717374042663171860">"Kaliwang button"</string>
<string name="keyguard_slot_name_bottom_end" msgid="7636885379738905151">"Kanang button"</string>
<string name="keyguard_affordance_none" msgid="1751643933430782312">"Wala"</string>
- <string name="keyguard_affordance_enablement_dialog_title" msgid="307756993596011884">"Kailangan ng karagdagang pag-set up"</string>
+ <!-- no translation found for keyguard_affordance_enablement_dialog_title (3389730825561696493) -->
+ <skip />
<string name="keyguard_affordance_enablement_dialog_action_template" msgid="8117011931337357438">"Buksan ang <xliff:g id="APPNAME">%1$s</xliff:g>"</string>
<string name="keyguard_affordance_enablement_dialog_message" msgid="6136286758939253570">"Para idagdag ang <xliff:g id="APPNAME">%1$s</xliff:g> app bilang shortcut, tiyaking"</string>
<string name="keyguard_affordance_enablement_dialog_dismiss_button" msgid="629754625264422508">"Tapos na"</string>
diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml
index 2d765f5..bfe9c18 100644
--- a/res/values-tr/strings.xml
+++ b/res/values-tr/strings.xml
@@ -94,7 +94,8 @@
<string name="keyguard_slot_name_bottom_start" msgid="6717374042663171860">"Sol düğmesi"</string>
<string name="keyguard_slot_name_bottom_end" msgid="7636885379738905151">"Sağ düğmesi"</string>
<string name="keyguard_affordance_none" msgid="1751643933430782312">"Yok"</string>
- <string name="keyguard_affordance_enablement_dialog_title" msgid="307756993596011884">"Ek kurulum gerekiyor"</string>
+ <!-- no translation found for keyguard_affordance_enablement_dialog_title (3389730825561696493) -->
+ <skip />
<string name="keyguard_affordance_enablement_dialog_action_template" msgid="8117011931337357438">"<xliff:g id="APPNAME">%1$s</xliff:g> uygulamasını aç"</string>
<string name="keyguard_affordance_enablement_dialog_message" msgid="6136286758939253570">"<xliff:g id="APPNAME">%1$s</xliff:g> uygulamasını kısayol olarak ekleyebilmeniz için gerekenler"</string>
<string name="keyguard_affordance_enablement_dialog_dismiss_button" msgid="629754625264422508">"Bitti"</string>
diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml
index e2a0f70..be7a4a8 100644
--- a/res/values-uk/strings.xml
+++ b/res/values-uk/strings.xml
@@ -94,7 +94,8 @@
<string name="keyguard_slot_name_bottom_start" msgid="6717374042663171860">"Ліва кнопка"</string>
<string name="keyguard_slot_name_bottom_end" msgid="7636885379738905151">"Права кнопка"</string>
<string name="keyguard_affordance_none" msgid="1751643933430782312">"Немає"</string>
- <string name="keyguard_affordance_enablement_dialog_title" msgid="307756993596011884">"Потрібне додаткове налаштування"</string>
+ <!-- no translation found for keyguard_affordance_enablement_dialog_title (3389730825561696493) -->
+ <skip />
<string name="keyguard_affordance_enablement_dialog_action_template" msgid="8117011931337357438">"Відкрити <xliff:g id="APPNAME">%1$s</xliff:g>"</string>
<string name="keyguard_affordance_enablement_dialog_message" msgid="6136286758939253570">"Щоб додати можливість швидкого ввімкнення додатка <xliff:g id="APPNAME">%1$s</xliff:g>, переконайтеся, що виконано вимоги нижче."</string>
<string name="keyguard_affordance_enablement_dialog_dismiss_button" msgid="629754625264422508">"Готово"</string>
diff --git a/res/values-ur/strings.xml b/res/values-ur/strings.xml
index 52b1822..fe88788 100644
--- a/res/values-ur/strings.xml
+++ b/res/values-ur/strings.xml
@@ -94,7 +94,8 @@
<string name="keyguard_slot_name_bottom_start" msgid="6717374042663171860">"دایاں بٹن"</string>
<string name="keyguard_slot_name_bottom_end" msgid="7636885379738905151">"بایاں بٹن"</string>
<string name="keyguard_affordance_none" msgid="1751643933430782312">"کوئی نہیں"</string>
- <string name="keyguard_affordance_enablement_dialog_title" msgid="307756993596011884">"اضافی سیٹ اپ درکار ہے"</string>
+ <!-- no translation found for keyguard_affordance_enablement_dialog_title (3389730825561696493) -->
+ <skip />
<string name="keyguard_affordance_enablement_dialog_action_template" msgid="8117011931337357438">"<xliff:g id="APPNAME">%1$s</xliff:g> کھولیں"</string>
<string name="keyguard_affordance_enablement_dialog_message" msgid="6136286758939253570">"<xliff:g id="APPNAME">%1$s</xliff:g> ایپ کو شارٹ کٹ کے طور پر شامل کرنے کے لیے درج ذیل کو یقینی بنائیں"</string>
<string name="keyguard_affordance_enablement_dialog_dismiss_button" msgid="629754625264422508">"ہو گیا"</string>
diff --git a/res/values-uz/strings.xml b/res/values-uz/strings.xml
index 82c67ba..52b45ce 100644
--- a/res/values-uz/strings.xml
+++ b/res/values-uz/strings.xml
@@ -94,7 +94,8 @@
<string name="keyguard_slot_name_bottom_start" msgid="6717374042663171860">"Chap tugma"</string>
<string name="keyguard_slot_name_bottom_end" msgid="7636885379738905151">"Oʻng tugma"</string>
<string name="keyguard_affordance_none" msgid="1751643933430782312">"Hech biri"</string>
- <string name="keyguard_affordance_enablement_dialog_title" msgid="307756993596011884">"Qoʻshimcha sozlash kerak"</string>
+ <!-- no translation found for keyguard_affordance_enablement_dialog_title (3389730825561696493) -->
+ <skip />
<string name="keyguard_affordance_enablement_dialog_action_template" msgid="8117011931337357438">"Ochish: <xliff:g id="APPNAME">%1$s</xliff:g>"</string>
<string name="keyguard_affordance_enablement_dialog_message" msgid="6136286758939253570">"<xliff:g id="APPNAME">%1$s</xliff:g> ilovasini yorliq sifatida qoʻshish uchun"</string>
<string name="keyguard_affordance_enablement_dialog_dismiss_button" msgid="629754625264422508">"Tayyor"</string>
diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml
index 308cb6b..e1151a9 100644
--- a/res/values-vi/strings.xml
+++ b/res/values-vi/strings.xml
@@ -94,7 +94,8 @@
<string name="keyguard_slot_name_bottom_start" msgid="6717374042663171860">"Nút bên trái"</string>
<string name="keyguard_slot_name_bottom_end" msgid="7636885379738905151">"Nút bên phải"</string>
<string name="keyguard_affordance_none" msgid="1751643933430782312">"Không có"</string>
- <string name="keyguard_affordance_enablement_dialog_title" msgid="307756993596011884">"Cần thiết lập thêm"</string>
+ <!-- no translation found for keyguard_affordance_enablement_dialog_title (3389730825561696493) -->
+ <skip />
<string name="keyguard_affordance_enablement_dialog_action_template" msgid="8117011931337357438">"Mở <xliff:g id="APPNAME">%1$s</xliff:g>"</string>
<string name="keyguard_affordance_enablement_dialog_message" msgid="6136286758939253570">"Để tạo lối tắt cho ứng dụng <xliff:g id="APPNAME">%1$s</xliff:g>, hãy đảm bảo"</string>
<string name="keyguard_affordance_enablement_dialog_dismiss_button" msgid="629754625264422508">"Xong"</string>
diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml
index baf650b..817d95f 100644
--- a/res/values-zh-rCN/strings.xml
+++ b/res/values-zh-rCN/strings.xml
@@ -94,7 +94,8 @@
<string name="keyguard_slot_name_bottom_start" msgid="6717374042663171860">"左侧按钮"</string>
<string name="keyguard_slot_name_bottom_end" msgid="7636885379738905151">"右侧按钮"</string>
<string name="keyguard_affordance_none" msgid="1751643933430782312">"无"</string>
- <string name="keyguard_affordance_enablement_dialog_title" msgid="307756993596011884">"需要完成其他设置"</string>
+ <!-- no translation found for keyguard_affordance_enablement_dialog_title (3389730825561696493) -->
+ <skip />
<string name="keyguard_affordance_enablement_dialog_action_template" msgid="8117011931337357438">"打开<xliff:g id="APPNAME">%1$s</xliff:g>"</string>
<string name="keyguard_affordance_enablement_dialog_message" msgid="6136286758939253570">"若要将<xliff:g id="APPNAME">%1$s</xliff:g>应用添加为快捷方式,请确保:"</string>
<string name="keyguard_affordance_enablement_dialog_dismiss_button" msgid="629754625264422508">"完成"</string>
diff --git a/res/values-zh-rHK/strings.xml b/res/values-zh-rHK/strings.xml
index 9acfee0..40e1da3 100644
--- a/res/values-zh-rHK/strings.xml
+++ b/res/values-zh-rHK/strings.xml
@@ -94,7 +94,8 @@
<string name="keyguard_slot_name_bottom_start" msgid="6717374042663171860">"左鍵"</string>
<string name="keyguard_slot_name_bottom_end" msgid="7636885379738905151">"右鍵"</string>
<string name="keyguard_affordance_none" msgid="1751643933430782312">"無"</string>
- <string name="keyguard_affordance_enablement_dialog_title" msgid="307756993596011884">"需要進行其他設定"</string>
+ <!-- no translation found for keyguard_affordance_enablement_dialog_title (3389730825561696493) -->
+ <skip />
<string name="keyguard_affordance_enablement_dialog_action_template" msgid="8117011931337357438">"開啟「<xliff:g id="APPNAME">%1$s</xliff:g>」"</string>
<string name="keyguard_affordance_enablement_dialog_message" msgid="6136286758939253570">"如要新增「<xliff:g id="APPNAME">%1$s</xliff:g>」應用程式為快速鍵,請確保:"</string>
<string name="keyguard_affordance_enablement_dialog_dismiss_button" msgid="629754625264422508">"完成"</string>
diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml
index c9b7e12..51666c7 100644
--- a/res/values-zh-rTW/strings.xml
+++ b/res/values-zh-rTW/strings.xml
@@ -94,7 +94,8 @@
<string name="keyguard_slot_name_bottom_start" msgid="6717374042663171860">"左側按鈕"</string>
<string name="keyguard_slot_name_bottom_end" msgid="7636885379738905151">"右側按鈕"</string>
<string name="keyguard_affordance_none" msgid="1751643933430782312">"無"</string>
- <string name="keyguard_affordance_enablement_dialog_title" msgid="307756993596011884">"需要進行額外設定"</string>
+ <!-- no translation found for keyguard_affordance_enablement_dialog_title (3389730825561696493) -->
+ <skip />
<string name="keyguard_affordance_enablement_dialog_action_template" msgid="8117011931337357438">"開啟「<xliff:g id="APPNAME">%1$s</xliff:g>」"</string>
<string name="keyguard_affordance_enablement_dialog_message" msgid="6136286758939253570">"如要將「<xliff:g id="APPNAME">%1$s</xliff:g>」應用程式新增為捷徑,必須滿足以下條件"</string>
<string name="keyguard_affordance_enablement_dialog_dismiss_button" msgid="629754625264422508">"完成"</string>
diff --git a/res/values-zu/strings.xml b/res/values-zu/strings.xml
index 5503bf2..e46dff3 100644
--- a/res/values-zu/strings.xml
+++ b/res/values-zu/strings.xml
@@ -94,7 +94,8 @@
<string name="keyguard_slot_name_bottom_start" msgid="6717374042663171860">"Inkinobho engakwesobunxele"</string>
<string name="keyguard_slot_name_bottom_end" msgid="7636885379738905151">"Inkinobho yakwesokudla"</string>
<string name="keyguard_affordance_none" msgid="1751643933430782312">"Lutho"</string>
- <string name="keyguard_affordance_enablement_dialog_title" msgid="307756993596011884">"Kudingeka ukusetha okwengeziwe"</string>
+ <!-- no translation found for keyguard_affordance_enablement_dialog_title (3389730825561696493) -->
+ <skip />
<string name="keyguard_affordance_enablement_dialog_action_template" msgid="8117011931337357438">"Vula i-<xliff:g id="APPNAME">%1$s</xliff:g>"</string>
<string name="keyguard_affordance_enablement_dialog_message" msgid="6136286758939253570">"Ukwengeza i-app ye-<xliff:g id="APPNAME">%1$s</xliff:g> njengesinqamuleli, qinisekisa"</string>
<string name="keyguard_affordance_enablement_dialog_dismiss_button" msgid="629754625264422508">"Kwenziwe"</string>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 63fb560..13fc8a0 100755
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -294,7 +294,7 @@
enabled. The dialog contains a list of instructions that the user needs to take in order to
enable the option before it can be selected again. [CHAR LIMIT=NONE].
-->
- <string name="keyguard_affordance_enablement_dialog_title">Additional setup needed</string>
+ <string name="keyguard_affordance_enablement_dialog_title">To select `<xliff:g id="appName" example="Wallet">%1$s</xliff:g>` check the following</string>
<!--
Template for an action that opens a specific app. [CHAR LIMIT=16]
diff --git a/src/com/android/customization/model/clock/ClockSectionController.java b/src/com/android/customization/model/clock/ClockSectionController.java
deleted file mode 100644
index 545c1c4..0000000
--- a/src/com/android/customization/model/clock/ClockSectionController.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Copyright (C) 2022 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.customization.model.clock;
-
-import android.content.Context;
-import android.view.LayoutInflater;
-
-import androidx.annotation.Nullable;
-
-import com.android.customization.picker.clock.ClockCustomDemoFragment;
-import com.android.customization.picker.clock.ClockSectionView;
-import com.android.wallpaper.R;
-import com.android.wallpaper.config.Flags;
-import com.android.wallpaper.model.CustomizationSectionController;
-
-/** A {@link CustomizationSectionController} for clock customization. */
-public class ClockSectionController implements CustomizationSectionController<ClockSectionView> {
-
- private final CustomizationSectionNavigationController mNavigationController;
-
- public ClockSectionController(CustomizationSectionNavigationController navigationController) {
- mNavigationController = navigationController;
- }
-
- @Override
- public boolean isAvailable(@Nullable Context context) {
- return Flags.enableCustomClocks;
- }
-
- @Override
- public ClockSectionView createView(Context context) {
- ClockSectionView view = (ClockSectionView) LayoutInflater.from(context).inflate(
- R.layout.clock_section_view,
- null);
- view.setOnClickListener(v ->
- mNavigationController.navigateTo(new ClockCustomDemoFragment()));
- return view;
- }
-}
diff --git a/src/com/android/customization/model/clock/ClockSectionController.kt b/src/com/android/customization/model/clock/ClockSectionController.kt
new file mode 100644
index 0000000..1e339bb
--- /dev/null
+++ b/src/com/android/customization/model/clock/ClockSectionController.kt
@@ -0,0 +1,50 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.customization.model.clock
+
+import android.content.Context
+import android.view.LayoutInflater
+import com.android.customization.picker.clock.ClockCustomDemoFragment
+import com.android.customization.picker.clock.ClockSectionView
+import com.android.systemui.shared.customization.data.content.CustomizationProviderClient
+import com.android.systemui.shared.customization.data.content.CustomizationProviderContract as Contract
+import com.android.wallpaper.R
+import com.android.wallpaper.model.CustomizationSectionController
+import com.android.wallpaper.model.CustomizationSectionController.CustomizationSectionNavigationController
+import kotlinx.coroutines.runBlocking
+
+/** A [CustomizationSectionController] for clock customization. */
+class ClockSectionController(
+ private val navigationController: CustomizationSectionNavigationController,
+ private val customizationProviderClient: CustomizationProviderClient,
+) : CustomizationSectionController<ClockSectionView?> {
+ override fun isAvailable(context: Context?): Boolean {
+ return runBlocking { customizationProviderClient.queryFlags() }
+ .firstOrNull { it.name == Contract.FlagsTable.FLAG_NAME_CUSTOM_CLOCKS_ENABLED }
+ ?.value == true
+ }
+
+ override fun createView(context: Context): ClockSectionView {
+ val view =
+ LayoutInflater.from(context)
+ .inflate(
+ R.layout.clock_section_view,
+ null,
+ ) as ClockSectionView
+ view.setOnClickListener { navigationController.navigateTo(ClockCustomDemoFragment()) }
+ return view
+ }
+}
diff --git a/src/com/android/customization/model/color/ColorProvider.kt b/src/com/android/customization/model/color/ColorProvider.kt
index c1a4552..3d2cc7e 100644
--- a/src/com/android/customization/model/color/ColorProvider.kt
+++ b/src/com/android/customization/model/color/ColorProvider.kt
@@ -37,7 +37,6 @@
import com.android.systemui.monet.ColorScheme
import com.android.systemui.monet.Style
import com.android.wallpaper.compat.WallpaperManagerCompat
-import com.android.wallpaper.config.Flags
import com.android.wallpaper.module.InjectorProvider
import java.util.*
import kotlinx.coroutines.CoroutineScope
@@ -287,7 +286,10 @@
Style.TONAL_SPOT
}
- if (style == Style.MONOCHROMATIC && !Flags.isMonochromaticFlagEnabled) {
+ if (
+ style == Style.MONOCHROMATIC &&
+ !InjectorProvider.getInjector().getFlags().isMonochromaticFlagEnabled()
+ ) {
continue
}
diff --git a/src/com/android/customization/module/CustomizationInjector.java b/src/com/android/customization/module/CustomizationInjector.java
deleted file mode 100644
index 2cc1245..0000000
--- a/src/com/android/customization/module/CustomizationInjector.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright (C) 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.customization.module;
-
-import android.content.Context;
-
-import androidx.fragment.app.FragmentActivity;
-
-import com.android.customization.model.theme.OverlayManagerCompat;
-import com.android.customization.model.theme.ThemeBundleProvider;
-import com.android.customization.model.theme.ThemeManager;
-import com.android.customization.picker.quickaffordance.domain.interactor.KeyguardQuickAffordancePickerInteractor;
-import com.android.wallpaper.module.Injector;
-
-public interface CustomizationInjector extends Injector {
-
- CustomizationPreferences getCustomizationPreferences(Context context);
-
- ThemeManager getThemeManager(ThemeBundleProvider provider, FragmentActivity activity,
- OverlayManagerCompat overlayManagerCompat, ThemesUserEventLogger logger);
-
-
- /**
- * Get {@link KeyguardQuickAffordancePickerInteractor}
- */
- KeyguardQuickAffordancePickerInteractor getKeyguardQuickAffordancePickerInteractor(
- Context context);
-}
diff --git a/src/com/android/customization/module/CustomizationInjector.kt b/src/com/android/customization/module/CustomizationInjector.kt
new file mode 100644
index 0000000..3cf8393
--- /dev/null
+++ b/src/com/android/customization/module/CustomizationInjector.kt
@@ -0,0 +1,39 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.customization.module
+
+import android.content.Context
+import androidx.fragment.app.FragmentActivity
+import com.android.customization.model.theme.OverlayManagerCompat
+import com.android.customization.model.theme.ThemeBundleProvider
+import com.android.customization.model.theme.ThemeManager
+import com.android.customization.picker.quickaffordance.domain.interactor.KeyguardQuickAffordancePickerInteractor
+import com.android.wallpaper.module.Injector
+
+interface CustomizationInjector : Injector {
+ fun getCustomizationPreferences(context: Context): CustomizationPreferences
+
+ fun getThemeManager(
+ provider: ThemeBundleProvider,
+ activity: FragmentActivity,
+ overlayManagerCompat: OverlayManagerCompat,
+ logger: ThemesUserEventLogger
+ ): ThemeManager
+
+ fun getKeyguardQuickAffordancePickerInteractor(
+ context: Context
+ ): KeyguardQuickAffordancePickerInteractor
+}
diff --git a/src/com/android/customization/module/DefaultCustomizationSections.java b/src/com/android/customization/module/DefaultCustomizationSections.java
index 7eb8865..1097a71 100644
--- a/src/com/android/customization/module/DefaultCustomizationSections.java
+++ b/src/com/android/customization/module/DefaultCustomizationSections.java
@@ -5,6 +5,7 @@
import androidx.annotation.Nullable;
import androidx.fragment.app.FragmentActivity;
import androidx.lifecycle.LifecycleOwner;
+import androidx.lifecycle.ViewModelProvider;
import com.android.customization.model.color.ColorSectionController;
import com.android.customization.model.grid.GridOptionsManager;
@@ -12,6 +13,9 @@
import com.android.customization.model.mode.DarkModeSectionController;
import com.android.customization.model.themedicon.ThemedIconSectionController;
import com.android.customization.model.themedicon.ThemedIconSwitchProvider;
+import com.android.customization.picker.quickaffordance.domain.interactor.KeyguardQuickAffordancePickerInteractor;
+import com.android.customization.picker.quickaffordance.ui.section.KeyguardQuickAffordanceSectionController;
+import com.android.customization.picker.quickaffordance.ui.viewmodel.KeyguardQuickAffordancePickerViewModel;
import com.android.wallpaper.model.CustomizationSectionController;
import com.android.wallpaper.model.CustomizationSectionController.CustomizationSectionNavigationController;
import com.android.wallpaper.model.PermissionRequester;
@@ -19,7 +23,9 @@
import com.android.wallpaper.model.WallpaperPreviewNavigator;
import com.android.wallpaper.model.WallpaperSectionController;
import com.android.wallpaper.model.WorkspaceViewModel;
+import com.android.wallpaper.module.CurrentWallpaperInfoFactory;
import com.android.wallpaper.module.CustomizationSections;
+import com.android.wallpaper.picker.customization.ui.section.ScreenPreviewSectionController;
import java.util.ArrayList;
import java.util.List;
@@ -27,6 +33,79 @@
/** {@link CustomizationSections} for the customization picker. */
public final class DefaultCustomizationSections implements CustomizationSections {
+ private final KeyguardQuickAffordancePickerInteractor mKeyguardQuickAffordancePickerInteractor;
+ private final KeyguardQuickAffordancePickerViewModel.Factory
+ mKeyguardQuickAffordancePickerViewModelFactory;
+
+ public DefaultCustomizationSections(
+ KeyguardQuickAffordancePickerInteractor keyguardQuickAffordancePickerInteractor,
+ KeyguardQuickAffordancePickerViewModel.Factory
+ keyguardQuickAffordancePickerViewModelFactory) {
+ mKeyguardQuickAffordancePickerInteractor = keyguardQuickAffordancePickerInteractor;
+ mKeyguardQuickAffordancePickerViewModelFactory =
+ keyguardQuickAffordancePickerViewModelFactory;
+ }
+
+ @Override
+ public List<CustomizationSectionController<?>> getSectionControllersForScreen(
+ Screen screen,
+ FragmentActivity activity,
+ LifecycleOwner lifecycleOwner,
+ WallpaperColorsViewModel wallpaperColorsViewModel,
+ WorkspaceViewModel workspaceViewModel,
+ PermissionRequester permissionRequester,
+ WallpaperPreviewNavigator wallpaperPreviewNavigator,
+ CustomizationSectionNavigationController sectionNavigationController,
+ @Nullable Bundle savedInstanceState,
+ CurrentWallpaperInfoFactory wallpaperInfoFactory) {
+ List<CustomizationSectionController<?>> sectionControllers = new ArrayList<>();
+
+ // Wallpaper section.
+ sectionControllers.add(
+ new ScreenPreviewSectionController(
+ activity,
+ lifecycleOwner,
+ screen,
+ wallpaperInfoFactory,
+ wallpaperColorsViewModel));
+
+ // Theme color section.
+ sectionControllers.add(new ColorSectionController(
+ activity, wallpaperColorsViewModel, lifecycleOwner, savedInstanceState));
+
+ switch (screen) {
+ case LOCK_SCREEN:
+ // Lock screen quick affordances section.
+ sectionControllers.add(
+ new KeyguardQuickAffordanceSectionController(
+ sectionNavigationController,
+ mKeyguardQuickAffordancePickerInteractor,
+ new ViewModelProvider(
+ activity,
+ mKeyguardQuickAffordancePickerViewModelFactory)
+ .get(KeyguardQuickAffordancePickerViewModel.class),
+ lifecycleOwner));
+ break;
+
+ case HOME_SCREEN:
+ // Dark/Light theme section.
+ sectionControllers.add(new DarkModeSectionController(activity,
+ lifecycleOwner.getLifecycle()));
+
+ // Themed app icon section.
+ sectionControllers.add(new ThemedIconSectionController(
+ ThemedIconSwitchProvider.getInstance(activity), workspaceViewModel,
+ savedInstanceState));
+
+ // App grid section.
+ sectionControllers.add(new GridSectionController(
+ GridOptionsManager.getInstance(activity), sectionNavigationController));
+ break;
+ }
+
+ return sectionControllers;
+ }
+
@Override
public List<CustomizationSectionController<?>> getAllSectionControllers(
FragmentActivity activity,
diff --git a/src/com/android/customization/module/StatsLogUserEventLogger.java b/src/com/android/customization/module/StatsLogUserEventLogger.java
index 605c173..2b6767b 100644
--- a/src/com/android/customization/module/StatsLogUserEventLogger.java
+++ b/src/com/android/customization/module/StatsLogUserEventLogger.java
@@ -188,6 +188,15 @@
.log();
}
+ @Override
+ public void logEffectProbe(String effect, @EffectStatus int status) {
+ new SysUiStatsLogger()
+ .setAction(StyleEnums.WALLPAPER_EFFECT_PROBE)
+ .setEffectPreference(status)
+ .setEffectIdHash(getIdHashCode(effect))
+ .log();
+ }
+
@Nullable
private String getThemePackage(ThemeBundle theme, String category) {
Map<String, String> packages = theme.getPackagesByCategory();
diff --git a/src/com/android/customization/module/ThemePickerInjector.java b/src/com/android/customization/module/ThemePickerInjector.java
deleted file mode 100644
index 9a304e9..0000000
--- a/src/com/android/customization/module/ThemePickerInjector.java
+++ /dev/null
@@ -1,173 +0,0 @@
-/*
- * Copyright (C) 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.customization.module;
-
-import static com.android.wallpaper.picker.PreviewFragment.ARG_FULL_SCREEN;
-import static com.android.wallpaper.picker.PreviewFragment.ARG_PREVIEW_MODE;
-import static com.android.wallpaper.picker.PreviewFragment.ARG_TESTING_MODE_ENABLED;
-import static com.android.wallpaper.picker.PreviewFragment.ARG_VIEW_AS_HOME;
-import static com.android.wallpaper.picker.PreviewFragment.ARG_WALLPAPER;
-
-import android.app.Activity;
-import android.content.Context;
-import android.content.Intent;
-import android.net.Uri;
-import android.os.Bundle;
-
-import androidx.fragment.app.Fragment;
-import androidx.fragment.app.FragmentActivity;
-
-import com.android.customization.model.theme.OverlayManagerCompat;
-import com.android.customization.model.theme.ThemeBundleProvider;
-import com.android.customization.model.theme.ThemeManager;
-import com.android.customization.picker.quickaffordance.data.repository.KeyguardQuickAffordancePickerRepository;
-import com.android.customization.picker.quickaffordance.domain.interactor.KeyguardQuickAffordancePickerInteractor;
-import com.android.customization.picker.quickaffordance.ui.viewmodel.KeyguardQuickAffordancePickerViewModel;
-import com.android.systemui.shared.quickaffordance.data.content.KeyguardQuickAffordanceProviderClient;
-import com.android.systemui.shared.quickaffordance.data.content.KeyguardQuickAffordanceProviderClientImpl;
-import com.android.wallpaper.model.LiveWallpaperInfo;
-import com.android.wallpaper.model.WallpaperInfo;
-import com.android.wallpaper.module.CustomizationSections;
-import com.android.wallpaper.module.FragmentFactory;
-import com.android.wallpaper.module.WallpaperPicker2Injector;
-import com.android.wallpaper.module.WallpaperPreferences;
-import com.android.wallpaper.picker.CustomizationPickerActivity;
-import com.android.wallpaper.picker.ImagePreviewFragment;
-import com.android.wallpaper.picker.LivePreviewFragment;
-import com.android.wallpaper.picker.PreviewFragment;
-
-import kotlinx.coroutines.Dispatchers;
-
-/**
- * A concrete, real implementation of the dependency provider.
- */
-public class ThemePickerInjector extends WallpaperPicker2Injector
- implements CustomizationInjector {
- private CustomizationSections mCustomizationSections;
- private ThemesUserEventLogger mUserEventLogger;
- private WallpaperPreferences mPrefs;
- private KeyguardQuickAffordancePickerInteractor mKeyguardQuickAffordancePickerInteractor;
- private KeyguardQuickAffordancePickerViewModel.Factory
- mKeyguardQuickAffordancePickerViewModelFactory;
- private FragmentFactory mFragmentFactory;
-
- @Override
- public CustomizationSections getCustomizationSections(Activity activity) {
- if (mCustomizationSections == null) {
- mCustomizationSections = new DefaultCustomizationSections();
- }
- return mCustomizationSections;
- }
-
- @Override
- public Intent getDeepLinkRedirectIntent(Context context, Uri uri) {
- Intent intent = new Intent();
- intent.setClass(context, CustomizationPickerActivity.class);
- intent.setData(uri);
- intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
- return intent;
- }
-
- @Override
- public String getDownloadableIntentAction() {
- return null;
- }
-
- @Override
- public Fragment getPreviewFragment(
- Context context,
- WallpaperInfo wallpaperInfo,
- int mode,
- boolean viewAsHome,
- boolean viewFullScreen,
- boolean testingModeEnabled) {
- Bundle args = new Bundle();
- args.putParcelable(ARG_WALLPAPER, wallpaperInfo);
- args.putInt(ARG_PREVIEW_MODE, mode);
- args.putBoolean(ARG_VIEW_AS_HOME, viewAsHome);
- args.putBoolean(ARG_FULL_SCREEN, viewFullScreen);
- args.putBoolean(ARG_TESTING_MODE_ENABLED, testingModeEnabled);
- PreviewFragment fragment = wallpaperInfo instanceof LiveWallpaperInfo
- ? new LivePreviewFragment() : new ImagePreviewFragment();
- fragment.setArguments(args);
- return fragment;
- }
-
- @Override
- public synchronized ThemesUserEventLogger getUserEventLogger(Context context) {
- if (mUserEventLogger == null) {
- mUserEventLogger = new StatsLogUserEventLogger(context);
- }
- return mUserEventLogger;
- }
-
- @Override
- public synchronized WallpaperPreferences getPreferences(Context context) {
- if (mPrefs == null) {
- mPrefs = new DefaultCustomizationPreferences(context.getApplicationContext());
- }
- return mPrefs;
- }
-
- //
- // Functions from {@link CustomizationInjector}
- //
- @Override
- public CustomizationPreferences getCustomizationPreferences(Context context) {
- return (CustomizationPreferences) getPreferences(context);
- }
-
- @Override
- public ThemeManager getThemeManager(ThemeBundleProvider provider, FragmentActivity activity,
- OverlayManagerCompat overlayManagerCompat, ThemesUserEventLogger logger) {
- return new ThemeManager(provider, activity, overlayManagerCompat, logger);
- }
-
- @Override
- public KeyguardQuickAffordancePickerInteractor getKeyguardQuickAffordancePickerInteractor(
- Context context) {
- if (mKeyguardQuickAffordancePickerInteractor == null) {
- final KeyguardQuickAffordanceProviderClient client =
- new KeyguardQuickAffordanceProviderClientImpl(context, Dispatchers.getIO());
- mKeyguardQuickAffordancePickerInteractor = new KeyguardQuickAffordancePickerInteractor(
- new KeyguardQuickAffordancePickerRepository(client, Dispatchers.getIO()),
- client);
- }
- return mKeyguardQuickAffordancePickerInteractor;
- }
-
- /**
- * Returns a {@link KeyguardQuickAffordancePickerViewModel.Factory}.
- */
- public KeyguardQuickAffordancePickerViewModel.Factory
- getKeyguardQuickAffordancePickerViewModelFactory(Context context) {
- if (mKeyguardQuickAffordancePickerViewModelFactory == null) {
- mKeyguardQuickAffordancePickerViewModelFactory =
- new KeyguardQuickAffordancePickerViewModel.Factory(
- context,
- getKeyguardQuickAffordancePickerInteractor(context));
- }
- return mKeyguardQuickAffordancePickerViewModelFactory;
- }
-
- @Override
- public FragmentFactory getFragmentFactory() {
- if (mFragmentFactory == null) {
- mFragmentFactory = new ThemePickerFragmentFactory();
- }
- return mFragmentFactory;
- }
-}
diff --git a/src/com/android/customization/module/ThemePickerInjector.kt b/src/com/android/customization/module/ThemePickerInjector.kt
new file mode 100644
index 0000000..b3f95d5
--- /dev/null
+++ b/src/com/android/customization/module/ThemePickerInjector.kt
@@ -0,0 +1,205 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.customization.module
+
+import android.app.Activity
+import android.content.Context
+import android.content.Intent
+import android.net.Uri
+import android.os.Bundle
+import androidx.fragment.app.Fragment
+import androidx.fragment.app.FragmentActivity
+import com.android.customization.model.theme.OverlayManagerCompat
+import com.android.customization.model.theme.ThemeBundleProvider
+import com.android.customization.model.theme.ThemeManager
+import com.android.customization.picker.quickaffordance.data.repository.KeyguardQuickAffordancePickerRepository
+import com.android.customization.picker.quickaffordance.domain.interactor.KeyguardQuickAffordancePickerInteractor
+import com.android.customization.picker.quickaffordance.domain.interactor.KeyguardQuickAffordanceSnapshotRestorer
+import com.android.customization.picker.quickaffordance.ui.viewmodel.KeyguardQuickAffordancePickerViewModel
+import com.android.systemui.shared.customization.data.content.CustomizationProviderClient
+import com.android.systemui.shared.customization.data.content.CustomizationProviderClientImpl
+import com.android.wallpaper.model.LiveWallpaperInfo
+import com.android.wallpaper.model.WallpaperInfo
+import com.android.wallpaper.module.CustomizationSections
+import com.android.wallpaper.module.FragmentFactory
+import com.android.wallpaper.module.UserEventLogger
+import com.android.wallpaper.module.WallpaperPicker2Injector
+import com.android.wallpaper.module.WallpaperPreferences
+import com.android.wallpaper.picker.CustomizationPickerActivity
+import com.android.wallpaper.picker.ImagePreviewFragment
+import com.android.wallpaper.picker.LivePreviewFragment
+import com.android.wallpaper.picker.PreviewFragment
+import com.android.wallpaper.picker.undo.domain.interactor.SnapshotRestorer
+import kotlinx.coroutines.Dispatchers.IO
+
+open class ThemePickerInjector : WallpaperPicker2Injector(), CustomizationInjector {
+ private var customizationSections: CustomizationSections? = null
+ private var userEventLogger: UserEventLogger? = null
+ private var prefs: WallpaperPreferences? = null
+ private var keyguardQuickAffordancePickerInteractor: KeyguardQuickAffordancePickerInteractor? =
+ null
+ private var keyguardQuickAffordancePickerViewModelFactory:
+ KeyguardQuickAffordancePickerViewModel.Factory? =
+ null
+ private var customizationProviderClient: CustomizationProviderClient? = null
+ private var fragmentFactory: FragmentFactory? = null
+ private var keyguardQuickAffordanceSnapshotRestorer: KeyguardQuickAffordanceSnapshotRestorer? =
+ null
+
+ override fun getCustomizationSections(activity: Activity): CustomizationSections {
+ return customizationSections
+ ?: DefaultCustomizationSections(
+ getKeyguardQuickAffordancePickerInteractor(activity),
+ getKeyguardQuickAffordancePickerViewModelFactory(activity)
+ )
+ .also { customizationSections = it }
+ }
+
+ override fun getDeepLinkRedirectIntent(context: Context, uri: Uri): Intent {
+ val intent = Intent()
+ intent.setClass(context, CustomizationPickerActivity::class.java)
+ intent.data = uri
+ intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
+ return intent
+ }
+
+ override fun getDownloadableIntentAction(): String? {
+ return null
+ }
+
+ override fun getPreviewFragment(
+ context: Context,
+ wallpaperInfo: WallpaperInfo,
+ mode: Int,
+ viewAsHome: Boolean,
+ viewFullScreen: Boolean,
+ testingModeEnabled: Boolean
+ ): Fragment {
+ return if (wallpaperInfo is LiveWallpaperInfo) LivePreviewFragment()
+ else
+ ImagePreviewFragment().apply {
+ arguments =
+ Bundle().apply {
+ putParcelable(PreviewFragment.ARG_WALLPAPER, wallpaperInfo)
+ putInt(PreviewFragment.ARG_PREVIEW_MODE, mode)
+ putBoolean(PreviewFragment.ARG_VIEW_AS_HOME, viewAsHome)
+ putBoolean(PreviewFragment.ARG_FULL_SCREEN, viewFullScreen)
+ putBoolean(PreviewFragment.ARG_TESTING_MODE_ENABLED, testingModeEnabled)
+ }
+ }
+ }
+
+ @Synchronized
+ override fun getUserEventLogger(context: Context): ThemesUserEventLogger {
+ return if (userEventLogger != null) userEventLogger as ThemesUserEventLogger
+ else StatsLogUserEventLogger(context).also { userEventLogger = it }
+ }
+
+ @Synchronized
+ override fun getPreferences(context: Context): WallpaperPreferences {
+ return prefs
+ ?: DefaultCustomizationPreferences(context.applicationContext).also { prefs = it }
+ }
+
+ override fun getFragmentFactory(): FragmentFactory? {
+ return fragmentFactory ?: ThemePickerFragmentFactory().also { fragmentFactory }
+ }
+
+ override fun getSnapshotRestorers(context: Context): Map<Int, SnapshotRestorer> {
+ return super<WallpaperPicker2Injector>.getSnapshotRestorers(context).toMutableMap().apply {
+ this[KEY_QUICK_AFFORDANCE_SNAPSHOT_RESTORER] =
+ getKeyguardQuickAffordanceSnapshotRestorer(context)
+ }
+ }
+
+ override fun getCustomizationPreferences(context: Context): CustomizationPreferences {
+ return getPreferences(context) as CustomizationPreferences
+ }
+
+ override fun getThemeManager(
+ provider: ThemeBundleProvider,
+ activity: FragmentActivity,
+ overlayManagerCompat: OverlayManagerCompat,
+ logger: ThemesUserEventLogger
+ ): ThemeManager {
+ return ThemeManager(provider, activity, overlayManagerCompat, logger)
+ }
+
+ override fun getKeyguardQuickAffordancePickerInteractor(
+ context: Context
+ ): KeyguardQuickAffordancePickerInteractor {
+ return keyguardQuickAffordancePickerInteractor
+ ?: getKeyguardQuickAffordancePickerInteractorImpl(context).also {
+ keyguardQuickAffordancePickerInteractor = it
+ }
+ }
+
+ fun getKeyguardQuickAffordancePickerViewModelFactory(
+ context: Context
+ ): KeyguardQuickAffordancePickerViewModel.Factory {
+ return keyguardQuickAffordancePickerViewModelFactory
+ ?: KeyguardQuickAffordancePickerViewModel.Factory(
+ context,
+ getKeyguardQuickAffordancePickerInteractor(context),
+ getUndoInteractor(context),
+ getCurrentWallpaperInfoFactory(context),
+ )
+ .also { keyguardQuickAffordancePickerViewModelFactory = it }
+ }
+
+ private fun getKeyguardQuickAffordancePickerInteractorImpl(
+ context: Context
+ ): KeyguardQuickAffordancePickerInteractor {
+ val client = getKeyguardQuickAffordancePickerProviderClient(context)
+ return KeyguardQuickAffordancePickerInteractor(
+ KeyguardQuickAffordancePickerRepository(client, IO),
+ client
+ ) { getKeyguardQuickAffordanceSnapshotRestorer(context) }
+ }
+
+ protected fun getKeyguardQuickAffordancePickerProviderClient(
+ context: Context
+ ): CustomizationProviderClient {
+ return customizationProviderClient
+ ?: CustomizationProviderClientImpl(context, IO).also {
+ customizationProviderClient = it
+ }
+ }
+
+ protected fun getKeyguardQuickAffordanceSnapshotRestorer(
+ context: Context
+ ): KeyguardQuickAffordanceSnapshotRestorer {
+ return keyguardQuickAffordanceSnapshotRestorer
+ ?: KeyguardQuickAffordanceSnapshotRestorer(
+ getKeyguardQuickAffordancePickerInteractor(context),
+ getKeyguardQuickAffordancePickerProviderClient(context)
+ )
+ .also { keyguardQuickAffordanceSnapshotRestorer = it }
+ }
+
+ companion object {
+ @JvmStatic
+ private val KEY_QUICK_AFFORDANCE_SNAPSHOT_RESTORER =
+ WallpaperPicker2Injector.MIN_SNAPSHOT_RESTORER_KEY
+
+ /**
+ * When this injector is overridden, this is the minimal value that should be used by
+ * restorers returns in [getSnapshotRestorers].
+ */
+ @JvmStatic
+ protected val MIN_SNAPSHOT_RESTORER_KEY = KEY_QUICK_AFFORDANCE_SNAPSHOT_RESTORER + 1
+ }
+}
diff --git a/src/com/android/customization/picker/clock/domain/interactor/ClocksSnapshotRestorer.kt b/src/com/android/customization/picker/clock/domain/interactor/ClocksSnapshotRestorer.kt
new file mode 100644
index 0000000..63b4a9b
--- /dev/null
+++ b/src/com/android/customization/picker/clock/domain/interactor/ClocksSnapshotRestorer.kt
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package com.android.customization.picker.clock.domain.interactor
+
+import com.android.wallpaper.picker.undo.domain.interactor.SnapshotRestorer
+import com.android.wallpaper.picker.undo.shared.model.RestorableSnapshot
+
+/** Handles state restoration for clocks. */
+class ClocksSnapshotRestorer : SnapshotRestorer {
+ override suspend fun setUpSnapshotRestorer(
+ updater: (RestorableSnapshot) -> Unit,
+ ): RestorableSnapshot {
+ // TODO(b/262924055): implement as part of the clock settings screen.
+ return RestorableSnapshot(mapOf())
+ }
+
+ override suspend fun restoreToSnapshot(snapshot: RestorableSnapshot) {
+ // TODO(b/262924055): implement as part of the clock settings screen.
+ }
+}
diff --git a/src/com/android/customization/picker/quickaffordance/data/repository/KeyguardQuickAffordancePickerRepository.kt b/src/com/android/customization/picker/quickaffordance/data/repository/KeyguardQuickAffordancePickerRepository.kt
index 5846107..fd553fe 100644
--- a/src/com/android/customization/picker/quickaffordance/data/repository/KeyguardQuickAffordancePickerRepository.kt
+++ b/src/com/android/customization/picker/quickaffordance/data/repository/KeyguardQuickAffordancePickerRepository.kt
@@ -20,8 +20,8 @@
import com.android.customization.picker.quickaffordance.shared.model.KeyguardQuickAffordancePickerAffordanceModel as AffordanceModel
import com.android.customization.picker.quickaffordance.shared.model.KeyguardQuickAffordancePickerSelectionModel as SelectionModel
import com.android.customization.picker.quickaffordance.shared.model.KeyguardQuickAffordancePickerSlotModel as SlotModel
-import com.android.systemui.shared.quickaffordance.data.content.KeyguardQuickAffordanceProviderClient as Client
-import com.android.systemui.shared.quickaffordance.data.content.KeyguardQuickAffordanceProviderContract as Contract
+import com.android.systemui.shared.customization.data.content.CustomizationProviderClient as Client
+import com.android.systemui.shared.customization.data.content.CustomizationProviderContract as Contract
import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.map
@@ -60,8 +60,11 @@
}
private fun List<Client.Flag>.isFeatureEnabled(): Boolean {
- return find { flag -> flag.name == Contract.FlagsTable.FLAG_NAME_FEATURE_ENABLED }?.value ==
- true
+ return find { flag ->
+ flag.name ==
+ Contract.FlagsTable.FLAG_NAME_CUSTOM_LOCK_SCREEN_QUICK_AFFORDANCES_ENABLED
+ }
+ ?.value == true
}
private fun Client.Slot.toModel(): SlotModel {
diff --git a/src/com/android/customization/picker/quickaffordance/domain/interactor/KeyguardQuickAffordancePickerInteractor.kt b/src/com/android/customization/picker/quickaffordance/domain/interactor/KeyguardQuickAffordancePickerInteractor.kt
index 87cedf5..fbe303b 100644
--- a/src/com/android/customization/picker/quickaffordance/domain/interactor/KeyguardQuickAffordancePickerInteractor.kt
+++ b/src/com/android/customization/picker/quickaffordance/domain/interactor/KeyguardQuickAffordancePickerInteractor.kt
@@ -23,7 +23,8 @@
import com.android.customization.picker.quickaffordance.shared.model.KeyguardQuickAffordancePickerAffordanceModel as AffordanceModel
import com.android.customization.picker.quickaffordance.shared.model.KeyguardQuickAffordancePickerSelectionModel as SelectionModel
import com.android.customization.picker.quickaffordance.shared.model.KeyguardQuickAffordancePickerSlotModel as SlotModel
-import com.android.systemui.shared.quickaffordance.data.content.KeyguardQuickAffordanceProviderClient as Client
+import com.android.systemui.shared.customization.data.content.CustomizationProviderClient as Client
+import javax.inject.Provider
import kotlinx.coroutines.flow.Flow
/**
@@ -33,10 +34,8 @@
class KeyguardQuickAffordancePickerInteractor(
private val repository: KeyguardQuickAffordancePickerRepository,
private val client: Client,
+ private val snapshotRestorer: Provider<KeyguardQuickAffordanceSnapshotRestorer>,
) {
- /** Whether the feature is enabled. */
- val isFeatureEnabled: Flow<Boolean> = repository.isFeatureEnabled
-
/** List of slots available on the device. */
val slots: Flow<List<SlotModel>> = repository.slots
@@ -60,6 +59,8 @@
slotId = slotId,
affordanceId = affordanceId,
)
+
+ snapshotRestorer.get().storeSnapshot()
}
/** Unselects an affordance with the given ID from the slot with the given ID. */
@@ -68,6 +69,8 @@
slotId = slotId,
affordanceId = affordanceId,
)
+
+ snapshotRestorer.get().storeSnapshot()
}
/** Unselects all affordances from the slot with the given ID. */
@@ -75,6 +78,8 @@
client.deleteAllSelections(
slotId = slotId,
)
+
+ snapshotRestorer.get().storeSnapshot()
}
/** Returns a [Drawable] for the given resource ID, from the system UI package. */
diff --git a/src/com/android/customization/picker/quickaffordance/domain/interactor/KeyguardQuickAffordanceSnapshotRestorer.kt b/src/com/android/customization/picker/quickaffordance/domain/interactor/KeyguardQuickAffordanceSnapshotRestorer.kt
new file mode 100644
index 0000000..cb2dbdc
--- /dev/null
+++ b/src/com/android/customization/picker/quickaffordance/domain/interactor/KeyguardQuickAffordanceSnapshotRestorer.kt
@@ -0,0 +1,75 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package com.android.customization.picker.quickaffordance.domain.interactor
+
+import com.android.systemui.shared.customization.data.content.CustomizationProviderClient
+import com.android.wallpaper.picker.undo.domain.interactor.SnapshotRestorer
+import com.android.wallpaper.picker.undo.shared.model.RestorableSnapshot
+
+/** Handles state restoration for the quick affordances system. */
+class KeyguardQuickAffordanceSnapshotRestorer(
+ private val interactor: KeyguardQuickAffordancePickerInteractor,
+ private val client: CustomizationProviderClient,
+) : SnapshotRestorer {
+
+ private lateinit var snapshotUpdater: (RestorableSnapshot) -> Unit
+
+ suspend fun storeSnapshot() {
+ snapshotUpdater(snapshot())
+ }
+
+ override suspend fun setUpSnapshotRestorer(
+ updater: (RestorableSnapshot) -> Unit,
+ ): RestorableSnapshot {
+ snapshotUpdater = updater
+ return snapshot()
+ }
+
+ override suspend fun restoreToSnapshot(snapshot: RestorableSnapshot) {
+ val selections: List<Pair<String, String>> =
+ checkNotNull(snapshot.args[KEY_SELECTIONS]).split(SELECTION_SEPARATOR).map { selection
+ ->
+ val (slotId, affordanceId) = selection.split(SLOT_AFFORDANCE_SEPARATOR)
+ slotId to affordanceId
+ }
+
+ selections.forEach { (slotId, affordanceId) ->
+ interactor.select(
+ slotId,
+ affordanceId,
+ )
+ }
+ }
+
+ private suspend fun snapshot(): RestorableSnapshot {
+ return RestorableSnapshot(
+ mapOf(
+ KEY_SELECTIONS to
+ client.querySelections().joinToString(SELECTION_SEPARATOR) { selection ->
+ "${selection.slotId}${SLOT_AFFORDANCE_SEPARATOR}${selection.affordanceId}"
+ }
+ )
+ )
+ }
+
+ companion object {
+ private const val KEY_SELECTIONS = "selections"
+ private const val SLOT_AFFORDANCE_SEPARATOR = "->"
+ private const val SELECTION_SEPARATOR = "|"
+ }
+}
diff --git a/src/com/android/customization/picker/quickaffordance/ui/binder/KeyguardQuickAffordanceEnablementDialogBinder.kt b/src/com/android/customization/picker/quickaffordance/ui/binder/KeyguardQuickAffordanceEnablementDialogBinder.kt
new file mode 100644
index 0000000..809e09d
--- /dev/null
+++ b/src/com/android/customization/picker/quickaffordance/ui/binder/KeyguardQuickAffordanceEnablementDialogBinder.kt
@@ -0,0 +1,58 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package com.android.customization.picker.quickaffordance.ui.binder
+
+import android.view.View
+import android.widget.ImageView
+import android.widget.TextView
+import com.android.customization.picker.quickaffordance.ui.viewmodel.KeyguardQuickAffordancePickerViewModel
+import com.android.wallpaper.R
+
+object KeyguardQuickAffordanceEnablementDialogBinder {
+
+ fun bind(
+ view: View,
+ viewModel: KeyguardQuickAffordancePickerViewModel.DialogViewModel,
+ onDismissed: () -> Unit,
+ ) {
+ view.requireViewById<ImageView>(R.id.icon).setImageDrawable(viewModel.icon)
+ view.requireViewById<TextView>(R.id.title).text =
+ view.context.getString(
+ R.string.keyguard_affordance_enablement_dialog_title,
+ viewModel.name
+ )
+ view.requireViewById<TextView>(R.id.message).text = buildString {
+ viewModel.instructions.forEachIndexed { index, instruction ->
+ append(instruction)
+ if (index < viewModel.instructions.size - 1) {
+ append("\n")
+ }
+ }
+ }
+ view.requireViewById<TextView>(R.id.button).apply {
+ text = viewModel.actionText
+ setOnClickListener {
+ if (viewModel.intent != null) {
+ view.context.startActivity(viewModel.intent)
+ } else {
+ onDismissed()
+ }
+ }
+ }
+ }
+}
diff --git a/src/com/android/customization/picker/quickaffordance/ui/binder/KeyguardQuickAffordancePickerBinder.kt b/src/com/android/customization/picker/quickaffordance/ui/binder/KeyguardQuickAffordancePickerBinder.kt
index 62f2e26..389f8f6 100644
--- a/src/com/android/customization/picker/quickaffordance/ui/binder/KeyguardQuickAffordancePickerBinder.kt
+++ b/src/com/android/customization/picker/quickaffordance/ui/binder/KeyguardQuickAffordancePickerBinder.kt
@@ -20,8 +20,8 @@
import android.app.AlertDialog
import android.app.Dialog
import android.content.Context
-import android.content.DialogInterface
import android.graphics.Rect
+import android.view.LayoutInflater
import android.view.View
import androidx.core.view.ViewCompat
import androidx.lifecycle.Lifecycle
@@ -88,7 +88,6 @@
onDismissed = viewModel::onDialogDismissed
)
} else {
- dialog?.dismiss()
null
}
}
@@ -102,34 +101,21 @@
request: KeyguardQuickAffordancePickerViewModel.DialogViewModel,
onDismissed: () -> Unit,
): Dialog {
- // TODO(b/254858701): make this dialog prettier and probably use a DialogFragment.
- return AlertDialog.Builder(context, context.themeResId)
- .setTitle(context.getString(R.string.keyguard_affordance_enablement_dialog_title))
- .setMessage(
- buildString {
- append(request.instructionHeader)
- if (request.instructions.isNotEmpty()) {
- append("\n")
- }
- request.instructions.forEachIndexed { index, instruction ->
- append(instruction)
- if (index < request.instructions.size - 1) {
- append("\n")
- }
- }
- }
- )
- .setOnDismissListener { onDismissed.invoke() }
- .setPositiveButton(
- request.actionText,
- if (request.intent != null) {
- DialogInterface.OnClickListener { _, _ ->
- context.startActivity(request.intent)
- }
- } else {
- DialogInterface.OnClickListener { _, _ -> onDismissed() }
- },
- )
+ val view: View =
+ LayoutInflater.from(context)
+ .inflate(
+ R.layout.keyguard_quick_affordance_enablement_dialog,
+ null,
+ )
+ KeyguardQuickAffordanceEnablementDialogBinder.bind(
+ view = view,
+ viewModel = request,
+ onDismissed = onDismissed,
+ )
+
+ return AlertDialog.Builder(context, R.style.LightDialogTheme)
+ .setView(view)
+ .setOnDismissListener { onDismissed() }
.show()
}
diff --git a/src/com/android/customization/picker/quickaffordance/ui/binder/KeyguardQuickAffordancePreviewBinder.kt b/src/com/android/customization/picker/quickaffordance/ui/binder/KeyguardQuickAffordancePreviewBinder.kt
index 0af6bf4..c8fea0f 100644
--- a/src/com/android/customization/picker/quickaffordance/ui/binder/KeyguardQuickAffordancePreviewBinder.kt
+++ b/src/com/android/customization/picker/quickaffordance/ui/binder/KeyguardQuickAffordancePreviewBinder.kt
@@ -18,29 +18,16 @@
package com.android.customization.picker.quickaffordance.ui.binder
import android.app.Activity
-import android.content.Intent
import android.os.Bundle
-import android.service.wallpaper.WallpaperService
-import android.view.SurfaceView
import androidx.cardview.widget.CardView
import androidx.lifecycle.Lifecycle
-import androidx.lifecycle.LifecycleEventObserver
import androidx.lifecycle.LifecycleOwner
import androidx.lifecycle.flowWithLifecycle
import androidx.lifecycle.lifecycleScope
import com.android.customization.picker.quickaffordance.ui.viewmodel.KeyguardQuickAffordancePickerViewModel
import com.android.systemui.shared.quickaffordance.shared.model.KeyguardQuickAffordancePreviewConstants
import com.android.wallpaper.R
-import com.android.wallpaper.asset.Asset
-import com.android.wallpaper.asset.BitmapCachingAsset
-import com.android.wallpaper.model.LiveWallpaperInfo
-import com.android.wallpaper.model.WallpaperInfo
-import com.android.wallpaper.picker.WorkspaceSurfaceHolderCallback
-import com.android.wallpaper.util.PreviewUtils
-import com.android.wallpaper.util.ResourceUtils
-import com.android.wallpaper.util.WallpaperConnection
-import com.android.wallpaper.util.WallpaperSurfaceCallback
-import java.util.concurrent.CompletableFuture
+import com.android.wallpaper.picker.customization.ui.binder.ScreenPreviewBinder
import kotlinx.coroutines.launch
object KeyguardQuickAffordancePreviewBinder {
@@ -52,125 +39,25 @@
previewView: CardView,
viewModel: KeyguardQuickAffordancePickerViewModel,
lifecycleOwner: LifecycleOwner,
- wallpaperInfoProvider: suspend () -> WallpaperInfo?,
) {
- val workspaceSurface: SurfaceView = previewView.requireViewById(R.id.workspace_surface)
- val wallpaperSurface: SurfaceView = previewView.requireViewById(R.id.wallpaper_surface)
+ val binding =
+ ScreenPreviewBinder.bind(
+ activity = activity,
+ previewView = previewView,
+ viewModel = viewModel.preview,
+ lifecycleOwner = lifecycleOwner,
+ )
- previewView.radius =
- previewView.resources.getDimension(R.dimen.wallpaper_picker_entry_card_corner_radius)
previewView.contentDescription =
previewView.context.getString(
R.string.lockscreen_wallpaper_preview_card_content_description
)
- var previewSurfaceCallback: WorkspaceSurfaceHolderCallback? = null
- var wallpaperSurfaceCallback: WallpaperSurfaceCallback? = null
- var wallpaperConnection: WallpaperConnection? = null
- var wallpaperInfo: WallpaperInfo? = null
-
- lifecycleOwner.lifecycle.addObserver(
- LifecycleEventObserver { _, event ->
- when (event) {
- Lifecycle.Event.ON_CREATE -> {
- previewSurfaceCallback =
- WorkspaceSurfaceHolderCallback(
- workspaceSurface,
- PreviewUtils(
- context = previewView.context,
- authority =
- previewView.context.getString(
- R.string.lock_screen_preview_provider_authority
- ),
- ),
- Bundle().apply {
- putString(
- KeyguardQuickAffordancePreviewConstants
- .KEY_INITIALLY_SELECTED_SLOT_ID,
- viewModel.selectedSlotId.value,
- )
- },
- )
- workspaceSurface.holder.addCallback(previewSurfaceCallback)
- workspaceSurface.setZOrderMediaOverlay(true)
-
- wallpaperSurfaceCallback =
- WallpaperSurfaceCallback(
- previewView.context,
- previewView,
- wallpaperSurface,
- CompletableFuture.completedFuture(
- WallpaperInfo.ColorInfo(
- /* wallpaperColors= */ null,
- ResourceUtils.getColorAttr(
- previewView.context,
- android.R.attr.colorSecondary,
- )
- )
- ),
- ) {
- maybeLoadThumbnail(
- activity = activity,
- wallpaperInfo = wallpaperInfo,
- surfaceCallback = wallpaperSurfaceCallback,
- )
- }
- wallpaperSurface.holder.addCallback(wallpaperSurfaceCallback)
- wallpaperSurface.setZOrderMediaOverlay(true)
- }
- Lifecycle.Event.ON_DESTROY -> {
- workspaceSurface.holder.removeCallback(previewSurfaceCallback)
- previewSurfaceCallback?.cleanUp()
- wallpaperSurface.holder.removeCallback(wallpaperSurfaceCallback)
- wallpaperSurfaceCallback?.cleanUp()
- }
- Lifecycle.Event.ON_RESUME -> {
- lifecycleOwner.lifecycleScope.launch {
- wallpaperInfo = wallpaperInfoProvider()
- (wallpaperInfo as? LiveWallpaperInfo)?.let { liveWallpaperInfo ->
- if (WallpaperConnection.isPreviewAvailable()) {
- wallpaperConnection =
- WallpaperConnection(
- Intent(WallpaperService.SERVICE_INTERFACE).apply {
- setClassName(
- liveWallpaperInfo.wallpaperComponent
- .packageName,
- liveWallpaperInfo.wallpaperComponent.serviceName
- )
- },
- previewView.context,
- null,
- wallpaperSurface,
- null,
- )
-
- wallpaperConnection?.connect()
- wallpaperConnection?.setVisibility(true)
- }
- }
- maybeLoadThumbnail(
- activity = activity,
- wallpaperInfo = wallpaperInfo,
- surfaceCallback = wallpaperSurfaceCallback,
- )
- }
- }
- Lifecycle.Event.ON_PAUSE -> {
- wallpaperConnection?.setVisibility(false)
- }
- Lifecycle.Event.ON_STOP -> {
- wallpaperConnection?.disconnect()
- }
- else -> Unit
- }
- }
- )
-
lifecycleOwner.lifecycleScope.launch {
viewModel.selectedSlotId
.flowWithLifecycle(lifecycleOwner.lifecycle, Lifecycle.State.STARTED)
.collect { slotId ->
- previewSurfaceCallback?.send(
+ binding.sendMessage(
KeyguardQuickAffordancePreviewConstants.MESSAGE_ID_SLOT_SELECTED,
Bundle().apply {
putString(KeyguardQuickAffordancePreviewConstants.KEY_SLOT_ID, slotId)
@@ -179,24 +66,4 @@
}
}
}
-
- private fun maybeLoadThumbnail(
- activity: Activity,
- wallpaperInfo: WallpaperInfo?,
- surfaceCallback: WallpaperSurfaceCallback?,
- ) {
- if (wallpaperInfo == null || surfaceCallback == null) {
- return
- }
-
- val imageView = surfaceCallback.homeImageWallpaper
- val thumbAsset: Asset = BitmapCachingAsset(activity, wallpaperInfo.getThumbAsset(activity))
- if (imageView != null && imageView.drawable == null) {
- thumbAsset.loadPreviewImage(
- activity,
- imageView,
- ResourceUtils.getColorAttr(activity, android.R.attr.colorSecondary)
- )
- }
- }
}
diff --git a/src/com/android/customization/picker/quickaffordance/ui/fragment/KeyguardQuickAffordancePickerFragment.kt b/src/com/android/customization/picker/quickaffordance/ui/fragment/KeyguardQuickAffordancePickerFragment.kt
index 251cdca..d2245db 100644
--- a/src/com/android/customization/picker/quickaffordance/ui/fragment/KeyguardQuickAffordancePickerFragment.kt
+++ b/src/com/android/customization/picker/quickaffordance/ui/fragment/KeyguardQuickAffordancePickerFragment.kt
@@ -30,8 +30,8 @@
import com.android.wallpaper.R
import com.android.wallpaper.module.InjectorProvider
import com.android.wallpaper.picker.AppbarFragment
+import com.android.wallpaper.picker.undo.ui.binder.RevertToolbarButtonBinder
import kotlinx.coroutines.ExperimentalCoroutinesApi
-import kotlinx.coroutines.suspendCancellableCoroutine
@OptIn(ExperimentalCoroutinesApi::class)
class KeyguardQuickAffordancePickerFragment : AppbarFragment() {
@@ -56,28 +56,24 @@
)
setUpToolbar(view)
val injector = InjectorProvider.getInjector() as ThemePickerInjector
- val wallpaperInfoFactory = injector.getCurrentWallpaperInfoFactory(requireContext())
val viewModel: KeyguardQuickAffordancePickerViewModel =
ViewModelProvider(
requireActivity(),
injector.getKeyguardQuickAffordancePickerViewModelFactory(requireContext()),
)
.get()
+ setUpToolbarMenu(R.menu.undoable_customization_menu)
+ RevertToolbarButtonBinder.bind(
+ view = view.requireViewById(toolbarId),
+ viewModel = viewModel.undo,
+ lifecycleOwner = this,
+ )
+
KeyguardQuickAffordancePreviewBinder.bind(
activity = requireActivity(),
previewView = view.requireViewById(R.id.preview),
viewModel = viewModel,
lifecycleOwner = this,
- wallpaperInfoProvider = {
- suspendCancellableCoroutine { continuation ->
- wallpaperInfoFactory.createCurrentWallpaperInfos(
- { homeWallpaper, lockWallpaper, _ ->
- continuation.resume(lockWallpaper ?: homeWallpaper, null)
- },
- /* forceRefresh= */ true,
- )
- }
- },
)
KeyguardQuickAffordancePickerBinder.bind(
view = view,
diff --git a/src/com/android/customization/picker/quickaffordance/ui/viewmodel/KeyguardQuickAffordancePickerViewModel.kt b/src/com/android/customization/picker/quickaffordance/ui/viewmodel/KeyguardQuickAffordancePickerViewModel.kt
index 774ff22..d879045 100644
--- a/src/com/android/customization/picker/quickaffordance/ui/viewmodel/KeyguardQuickAffordancePickerViewModel.kt
+++ b/src/com/android/customization/picker/quickaffordance/ui/viewmodel/KeyguardQuickAffordancePickerViewModel.kt
@@ -21,14 +21,21 @@
import android.content.Context
import android.content.Intent
import android.graphics.drawable.Drawable
+import android.os.Bundle
import androidx.annotation.DrawableRes
import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.viewModelScope
import com.android.customization.picker.quickaffordance.domain.interactor.KeyguardQuickAffordancePickerInteractor
+import com.android.systemui.shared.customization.data.content.CustomizationProviderContract
import com.android.systemui.shared.keyguard.shared.model.KeyguardQuickAffordanceSlots
-import com.android.systemui.shared.quickaffordance.data.content.KeyguardQuickAffordanceProviderContract as Contract
+import com.android.systemui.shared.quickaffordance.shared.model.KeyguardQuickAffordancePreviewConstants
import com.android.wallpaper.R
+import com.android.wallpaper.module.CurrentWallpaperInfoFactory
+import com.android.wallpaper.picker.customization.ui.viewmodel.ScreenPreviewViewModel
+import com.android.wallpaper.picker.undo.domain.interactor.UndoInteractor
+import com.android.wallpaper.picker.undo.ui.viewmodel.UndoViewModel
+import com.android.wallpaper.util.PreviewUtils
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableStateFlow
@@ -37,26 +44,64 @@
import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.launch
+import kotlinx.coroutines.suspendCancellableCoroutine
/** Models UI state for a lock screen quick affordance picker experience. */
@OptIn(ExperimentalCoroutinesApi::class)
class KeyguardQuickAffordancePickerViewModel
private constructor(
context: Context,
- private val interactor: KeyguardQuickAffordancePickerInteractor,
+ private val quickAffordanceInteractor: KeyguardQuickAffordancePickerInteractor,
+ undoInteractor: UndoInteractor,
+ private val wallpaperInfoFactory: CurrentWallpaperInfoFactory,
) : ViewModel() {
@SuppressLint("StaticFieldLeak") private val applicationContext = context.applicationContext
+ val preview =
+ ScreenPreviewViewModel(
+ previewUtils =
+ PreviewUtils(
+ context = applicationContext,
+ authority =
+ applicationContext.getString(
+ R.string.lock_screen_preview_provider_authority,
+ ),
+ ),
+ initialExtrasProvider = {
+ Bundle().apply {
+ putString(
+ KeyguardQuickAffordancePreviewConstants.KEY_INITIALLY_SELECTED_SLOT_ID,
+ selectedSlotId.value,
+ )
+ }
+ },
+ wallpaperInfoProvider = {
+ suspendCancellableCoroutine { continuation ->
+ wallpaperInfoFactory.createCurrentWallpaperInfos(
+ { homeWallpaper, lockWallpaper, _ ->
+ continuation.resume(lockWallpaper ?: homeWallpaper, null)
+ },
+ /* forceRefresh= */ true,
+ )
+ }
+ },
+ )
+
+ val undo: UndoViewModel =
+ UndoViewModel(
+ interactor = undoInteractor,
+ )
+
private val _selectedSlotId = MutableStateFlow<String?>(null)
val selectedSlotId: StateFlow<String?> = _selectedSlotId.asStateFlow()
/** View-models for each slot, keyed by slot ID. */
val slots: Flow<Map<String, KeyguardQuickAffordanceSlotViewModel>> =
combine(
- interactor.slots,
- interactor.affordances,
- interactor.selections,
+ quickAffordanceInteractor.slots,
+ quickAffordanceInteractor.affordances,
+ quickAffordanceInteractor.selections,
selectedSlotId,
) { slots, affordances, selections, selectedSlotIdOrNull ->
slots
@@ -102,9 +147,9 @@
/** The list of all available quick affordances for the selected slot. */
val quickAffordances: Flow<List<KeyguardQuickAffordanceViewModel>> =
combine(
- interactor.slots,
- interactor.affordances,
- interactor.selections,
+ quickAffordanceInteractor.slots,
+ quickAffordanceInteractor.affordances,
+ quickAffordanceInteractor.selections,
selectedSlotId,
) { slots, affordances, selections, selectedSlotIdOrNull ->
val selectedSlot =
@@ -122,8 +167,9 @@
) +
affordances.map { affordance ->
val isSelected = selectedAffordanceIds.contains(affordance.id)
+ val affordanceIcon = getAffordanceIcon(affordance.iconResourceId)
KeyguardQuickAffordanceViewModel(
- icon = getAffordanceIcon(affordance.iconResourceId),
+ icon = affordanceIcon,
contentDescription = affordance.name,
isSelected = isSelected,
onClicked =
@@ -131,12 +177,12 @@
{
viewModelScope.launch {
if (isSelected) {
- interactor.unselect(
+ quickAffordanceInteractor.unselect(
slotId = selectedSlot.id,
affordanceId = affordance.id,
)
} else {
- interactor.select(
+ quickAffordanceInteractor.select(
slotId = selectedSlot.id,
affordanceId = affordance.id,
)
@@ -146,13 +192,9 @@
} else {
{
showEnablementDialog(
- instructionHeader =
- affordance.enablementInstructions.first(),
- instructions =
- affordance.enablementInstructions.subList(
- 1,
- affordance.enablementInstructions.size
- ),
+ icon = affordanceIcon,
+ name = affordance.name,
+ instructions = affordance.enablementInstructions,
actionText = affordance.enablementActionText,
actionComponentName =
affordance.enablementActionComponentName,
@@ -204,14 +246,16 @@
}
private fun showEnablementDialog(
- instructionHeader: String,
+ icon: Drawable,
+ name: String,
instructions: List<String>,
actionText: String?,
actionComponentName: String?,
) {
_dialog.value =
DialogViewModel(
- instructionHeader = instructionHeader,
+ icon = icon,
+ name = name,
instructions = instructions,
actionText = actionText
?: applicationContext.getString(
@@ -229,7 +273,9 @@
return KeyguardQuickAffordanceViewModel.none(
context = applicationContext,
isSelected = isSelected,
- onSelected = { viewModelScope.launch { interactor.unselectAll(slotId) } },
+ onSelected = {
+ viewModelScope.launch { quickAffordanceInteractor.unselectAll(slotId) }
+ },
)
}
@@ -246,7 +292,7 @@
}
private suspend fun getAffordanceIcon(@DrawableRes iconResourceId: Int): Drawable {
- return interactor.getAffordanceIcon(iconResourceId)
+ return quickAffordanceInteractor.getAffordanceIcon(iconResourceId)
}
private fun String?.toIntent(): Intent? {
@@ -254,11 +300,15 @@
return null
}
- val splitUp = split(Contract.AffordanceTable.COMPONENT_NAME_SEPARATOR)
+ val splitUp =
+ split(
+ CustomizationProviderContract.LockScreenQuickAffordances.AffordanceTable
+ .COMPONENT_NAME_SEPARATOR
+ )
check(splitUp.size == 1 || splitUp.size == 2) {
"Illegal component name \"$this\". Must be either just an action or a package and an" +
" action separated by a" +
- " \"${Contract.AffordanceTable.COMPONENT_NAME_SEPARATOR}\"!"
+ " \"${CustomizationProviderContract.LockScreenQuickAffordances.AffordanceTable.COMPONENT_NAME_SEPARATOR}\"!"
}
return Intent(splitUp.last()).apply {
@@ -270,8 +320,11 @@
/** Encapsulates a request to show a dialog. */
data class DialogViewModel(
- /** The header for the instructions section. */
- val instructionHeader: String,
+ /** An icon to show. */
+ val icon: Drawable,
+
+ /** Name of the affordance. */
+ val name: String,
/** The set of instructions to show below the header. */
val instructions: List<String>,
@@ -318,13 +371,17 @@
class Factory(
private val context: Context,
- private val interactor: KeyguardQuickAffordancePickerInteractor,
+ private val quickAffordanceInteractor: KeyguardQuickAffordancePickerInteractor,
+ private val undoInteractor: UndoInteractor,
+ private val wallpaperInfoFactory: CurrentWallpaperInfoFactory,
) : ViewModelProvider.Factory {
override fun <T : ViewModel> create(modelClass: Class<T>): T {
@Suppress("UNCHECKED_CAST")
return KeyguardQuickAffordancePickerViewModel(
context = context,
- interactor = interactor,
+ quickAffordanceInteractor = quickAffordanceInteractor,
+ undoInteractor = undoInteractor,
+ wallpaperInfoFactory = wallpaperInfoFactory,
)
as T
}
diff --git a/src_override/com/android/wallpaper/config/Flags.java b/src_override/com/android/wallpaper/config/Flags.java
index 42731de..d35d88f 100644
--- a/src_override/com/android/wallpaper/config/Flags.java
+++ b/src_override/com/android/wallpaper/config/Flags.java
@@ -16,5 +16,4 @@
package com.android.wallpaper.config;
public class Flags extends BaseFlags {
- public static boolean enableCustomClocks = false;
}
diff --git a/tests/Android.bp b/tests/Android.bp
new file mode 100644
index 0000000..9fed740
--- /dev/null
+++ b/tests/Android.bp
@@ -0,0 +1,47 @@
+// Copyright (C) 2022 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+//
+// Build rule for WallpaperPicker2 tests
+//
+package {
+ default_applicable_licenses: ["Android-Apache-2.0"],
+}
+
+android_test {
+ name: "ThemePickerTests",
+
+ defaults: ["ThemePicker_defaults"],
+ srcs: [
+ "src/**/*.java",
+ "src/**/*.kt",
+ ],
+ static_libs: [
+ "WallpaperPicker2TestLib",
+ "androidx.test.rules",
+ "junit",
+ "kotlinx_coroutines_test",
+ "truth-prebuilt",
+ ],
+ libs: [
+ "android.test.runner",
+ "android.test.base",
+ "android.test.mock",
+ ],
+
+ kotlincflags: ["-Xjvm-default=enable"],
+ platform_apis: true,
+ test_suites: ["device-tests"],
+}
diff --git a/tests/AndroidManifest.xml b/tests/AndroidManifest.xml
new file mode 100644
index 0000000..2fd6b3f
--- /dev/null
+++ b/tests/AndroidManifest.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2022 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="com.android.wallpaper">
+
+ <application>
+ <uses-library android:name="android.test.runner" />
+ </application>
+
+ <instrumentation android:name="androidx.test.runner.AndroidJUnitRunner"
+ android:targetPackage="com.android.wallpaper"
+ android:label="Tests for ThemePicker" />
+
+</manifest>
diff --git a/tests/AndroidTest.xml b/tests/AndroidTest.xml
new file mode 100644
index 0000000..be2119b
--- /dev/null
+++ b/tests/AndroidTest.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2022 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<configuration description="Runs Tests for ThemePicker.">
+ <target_preparer class="com.android.tradefed.targetprep.TestAppInstallSetup">
+ <option name="test-file-name" value="ThemePickerTests.apk" />
+ </target_preparer>
+
+ <option name="test-suite-tag" value="apct" />
+ <option name="test-tag" value="ThemePickerTests" />
+ <test class="com.android.tradefed.testtype.AndroidJUnitTest" >
+ <option name="package" value="com.android.wallpaper" />
+ <option name="runner" value="androidx.test.runner.AndroidJUnitRunner" />
+ <option name="hidden-api-checks" value="false"/>
+ </test>
+</configuration>
diff --git a/tests/src/com/android/customization/model/picker/quickaffordance/data/repository/KeyguardQuickAffordancePickerRepositoryTest.kt b/tests/src/com/android/customization/model/picker/quickaffordance/data/repository/KeyguardQuickAffordancePickerRepositoryTest.kt
index 4a88f3b..3f22ced 100644
--- a/tests/src/com/android/customization/model/picker/quickaffordance/data/repository/KeyguardQuickAffordancePickerRepositoryTest.kt
+++ b/tests/src/com/android/customization/model/picker/quickaffordance/data/repository/KeyguardQuickAffordancePickerRepositoryTest.kt
@@ -19,7 +19,8 @@
import androidx.test.filters.SmallTest
import com.android.customization.picker.quickaffordance.data.repository.KeyguardQuickAffordancePickerRepository
-import com.android.systemui.shared.quickaffordance.data.content.FakeKeyguardQuickAffordanceProviderClient
+import com.android.systemui.shared.customization.data.content.CustomizationProviderContract
+import com.android.systemui.shared.customization.data.content.FakeCustomizationProviderClient
import com.google.common.truth.Truth.assertThat
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.ExperimentalCoroutinesApi
@@ -44,11 +45,11 @@
private lateinit var underTest: KeyguardQuickAffordancePickerRepository
private lateinit var testScope: TestScope
- private lateinit var client: FakeKeyguardQuickAffordanceProviderClient
+ private lateinit var client: FakeCustomizationProviderClient
@Before
fun setUp() {
- client = FakeKeyguardQuickAffordanceProviderClient()
+ client = FakeCustomizationProviderClient()
val coroutineDispatcher = UnconfinedTestDispatcher()
testScope = TestScope(coroutineDispatcher)
Dispatchers.setMain(coroutineDispatcher)
@@ -69,10 +70,8 @@
fun `isFeatureEnabled - enabled`() =
testScope.runTest {
client.setFlag(
- com.android.systemui.shared.quickaffordance.data.content
- .KeyguardQuickAffordanceProviderContract
- .FlagsTable
- .FLAG_NAME_FEATURE_ENABLED,
+ CustomizationProviderContract.FlagsTable
+ .FLAG_NAME_CUSTOM_LOCK_SCREEN_QUICK_AFFORDANCES_ENABLED,
true,
)
val values = mutableListOf<Boolean>()
@@ -87,10 +86,8 @@
fun `isFeatureEnabled - not enabled`() =
testScope.runTest {
client.setFlag(
- com.android.systemui.shared.quickaffordance.data.content
- .KeyguardQuickAffordanceProviderContract
- .FlagsTable
- .FLAG_NAME_FEATURE_ENABLED,
+ CustomizationProviderContract.FlagsTable
+ .FLAG_NAME_CUSTOM_LOCK_SCREEN_QUICK_AFFORDANCES_ENABLED,
false,
)
val values = mutableListOf<Boolean>()
diff --git a/tests/src/com/android/customization/model/picker/quickaffordance/domain/interactor/KeyguardQuickAffordancePickerInteractorTest.kt b/tests/src/com/android/customization/model/picker/quickaffordance/domain/interactor/KeyguardQuickAffordancePickerInteractorTest.kt
index d8a136d..9a2a0af 100644
--- a/tests/src/com/android/customization/model/picker/quickaffordance/domain/interactor/KeyguardQuickAffordancePickerInteractorTest.kt
+++ b/tests/src/com/android/customization/model/picker/quickaffordance/domain/interactor/KeyguardQuickAffordancePickerInteractorTest.kt
@@ -20,16 +20,17 @@
import androidx.test.filters.SmallTest
import com.android.customization.picker.quickaffordance.data.repository.KeyguardQuickAffordancePickerRepository
import com.android.customization.picker.quickaffordance.domain.interactor.KeyguardQuickAffordancePickerInteractor
+import com.android.customization.picker.quickaffordance.domain.interactor.KeyguardQuickAffordanceSnapshotRestorer
import com.android.customization.picker.quickaffordance.shared.model.KeyguardQuickAffordancePickerSelectionModel
+import com.android.systemui.shared.customization.data.content.FakeCustomizationProviderClient
import com.android.systemui.shared.keyguard.shared.model.KeyguardQuickAffordanceSlots
-import com.android.systemui.shared.quickaffordance.data.content.FakeKeyguardQuickAffordanceProviderClient
+import com.android.wallpaper.testing.collectLastValue
import com.google.common.truth.Truth.assertThat
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.ExperimentalCoroutinesApi
-import kotlinx.coroutines.flow.toList
-import kotlinx.coroutines.launch
+import kotlinx.coroutines.runBlocking
+import kotlinx.coroutines.test.StandardTestDispatcher
import kotlinx.coroutines.test.TestScope
-import kotlinx.coroutines.test.UnconfinedTestDispatcher
import kotlinx.coroutines.test.resetMain
import kotlinx.coroutines.test.runTest
import kotlinx.coroutines.test.setMain
@@ -47,22 +48,29 @@
private lateinit var underTest: KeyguardQuickAffordancePickerInteractor
private lateinit var testScope: TestScope
- private lateinit var client: FakeKeyguardQuickAffordanceProviderClient
+ private lateinit var client: FakeCustomizationProviderClient
@Before
fun setUp() {
- val coroutineDispatcher = UnconfinedTestDispatcher()
- testScope = TestScope(coroutineDispatcher)
- Dispatchers.setMain(coroutineDispatcher)
- client = FakeKeyguardQuickAffordanceProviderClient()
+ val testDispatcher = StandardTestDispatcher()
+ testScope = TestScope(testDispatcher)
+ Dispatchers.setMain(testDispatcher)
+ client = FakeCustomizationProviderClient()
underTest =
KeyguardQuickAffordancePickerInteractor(
repository =
KeyguardQuickAffordancePickerRepository(
client = client,
- backgroundDispatcher = coroutineDispatcher,
+ backgroundDispatcher = testDispatcher,
),
client = client,
+ snapshotRestorer = {
+ KeyguardQuickAffordanceSnapshotRestorer(
+ interactor = underTest,
+ client = client,
+ )
+ .apply { runBlocking { setUpSnapshotRestorer {} } }
+ },
)
}
@@ -74,85 +82,76 @@
@Test
fun select() =
testScope.runTest {
- val selections = mutableListOf<List<KeyguardQuickAffordancePickerSelectionModel>>()
- val job = launch { underTest.selections.toList(selections) }
+ val selections = collectLastValue(underTest.selections)
underTest.select(
slotId = KeyguardQuickAffordanceSlots.SLOT_ID_BOTTOM_START,
- affordanceId = FakeKeyguardQuickAffordanceProviderClient.AFFORDANCE_1,
+ affordanceId = FakeCustomizationProviderClient.AFFORDANCE_1,
)
- assertThat(selections.last())
+ assertThat(selections())
.isEqualTo(
listOf(
KeyguardQuickAffordancePickerSelectionModel(
slotId = KeyguardQuickAffordanceSlots.SLOT_ID_BOTTOM_START,
- affordanceId = FakeKeyguardQuickAffordanceProviderClient.AFFORDANCE_1,
+ affordanceId = FakeCustomizationProviderClient.AFFORDANCE_1,
),
)
)
underTest.select(
slotId = KeyguardQuickAffordanceSlots.SLOT_ID_BOTTOM_START,
- affordanceId = FakeKeyguardQuickAffordanceProviderClient.AFFORDANCE_2,
+ affordanceId = FakeCustomizationProviderClient.AFFORDANCE_2,
)
- assertThat(selections.last())
+ assertThat(selections())
.isEqualTo(
listOf(
KeyguardQuickAffordancePickerSelectionModel(
slotId = KeyguardQuickAffordanceSlots.SLOT_ID_BOTTOM_START,
- affordanceId = FakeKeyguardQuickAffordanceProviderClient.AFFORDANCE_2,
+ affordanceId = FakeCustomizationProviderClient.AFFORDANCE_2,
),
)
)
-
- job.cancel()
}
@Test
fun unselect() =
testScope.runTest {
- val selections = mutableListOf<List<KeyguardQuickAffordancePickerSelectionModel>>()
- val job = launch { underTest.selections.toList(selections) }
+ val selections = collectLastValue(underTest.selections)
underTest.select(
slotId = KeyguardQuickAffordanceSlots.SLOT_ID_BOTTOM_START,
- affordanceId = FakeKeyguardQuickAffordanceProviderClient.AFFORDANCE_1,
+ affordanceId = FakeCustomizationProviderClient.AFFORDANCE_1,
)
underTest.unselect(
slotId = KeyguardQuickAffordanceSlots.SLOT_ID_BOTTOM_START,
- affordanceId = FakeKeyguardQuickAffordanceProviderClient.AFFORDANCE_1,
+ affordanceId = FakeCustomizationProviderClient.AFFORDANCE_1,
)
- assertThat(selections.last()).isEmpty()
-
- job.cancel()
+ assertThat(selections()).isEmpty()
}
@Test
fun unselectAll() =
testScope.runTest {
client.setSlotCapacity(KeyguardQuickAffordanceSlots.SLOT_ID_BOTTOM_END, 3)
- val selections = mutableListOf<List<KeyguardQuickAffordancePickerSelectionModel>>()
- val job = launch { underTest.selections.toList(selections) }
+ val selections = collectLastValue(underTest.selections)
underTest.select(
slotId = KeyguardQuickAffordanceSlots.SLOT_ID_BOTTOM_END,
- affordanceId = FakeKeyguardQuickAffordanceProviderClient.AFFORDANCE_1,
+ affordanceId = FakeCustomizationProviderClient.AFFORDANCE_1,
)
underTest.select(
slotId = KeyguardQuickAffordanceSlots.SLOT_ID_BOTTOM_END,
- affordanceId = FakeKeyguardQuickAffordanceProviderClient.AFFORDANCE_2,
+ affordanceId = FakeCustomizationProviderClient.AFFORDANCE_2,
)
underTest.select(
slotId = KeyguardQuickAffordanceSlots.SLOT_ID_BOTTOM_END,
- affordanceId = FakeKeyguardQuickAffordanceProviderClient.AFFORDANCE_3,
+ affordanceId = FakeCustomizationProviderClient.AFFORDANCE_3,
)
underTest.unselectAll(
slotId = KeyguardQuickAffordanceSlots.SLOT_ID_BOTTOM_END,
)
- assertThat(selections.last()).isEmpty()
-
- job.cancel()
+ assertThat(selections()).isEmpty()
}
}
diff --git a/tests/src/com/android/customization/model/picker/quickaffordance/ui/viewmodel/KeyguardQuickAffordancePickerViewModelTest.kt b/tests/src/com/android/customization/model/picker/quickaffordance/ui/viewmodel/KeyguardQuickAffordancePickerViewModelTest.kt
index d446e1b..7a54a4b 100644
--- a/tests/src/com/android/customization/model/picker/quickaffordance/ui/viewmodel/KeyguardQuickAffordancePickerViewModelTest.kt
+++ b/tests/src/com/android/customization/model/picker/quickaffordance/ui/viewmodel/KeyguardQuickAffordancePickerViewModelTest.kt
@@ -22,21 +22,26 @@
import androidx.test.platform.app.InstrumentationRegistry
import com.android.customization.picker.quickaffordance.data.repository.KeyguardQuickAffordancePickerRepository
import com.android.customization.picker.quickaffordance.domain.interactor.KeyguardQuickAffordancePickerInteractor
+import com.android.customization.picker.quickaffordance.domain.interactor.KeyguardQuickAffordanceSnapshotRestorer
import com.android.customization.picker.quickaffordance.ui.viewmodel.KeyguardQuickAffordancePickerViewModel
import com.android.customization.picker.quickaffordance.ui.viewmodel.KeyguardQuickAffordanceSlotViewModel
import com.android.customization.picker.quickaffordance.ui.viewmodel.KeyguardQuickAffordanceSummaryViewModel
import com.android.customization.picker.quickaffordance.ui.viewmodel.KeyguardQuickAffordanceViewModel
+import com.android.systemui.shared.customization.data.content.CustomizationProviderClient
+import com.android.systemui.shared.customization.data.content.FakeCustomizationProviderClient
import com.android.systemui.shared.keyguard.shared.model.KeyguardQuickAffordanceSlots
-import com.android.systemui.shared.quickaffordance.data.content.FakeKeyguardQuickAffordanceProviderClient
-import com.android.systemui.shared.quickaffordance.data.content.KeyguardQuickAffordanceProviderClient
+import com.android.wallpaper.picker.undo.data.repository.UndoRepository
+import com.android.wallpaper.picker.undo.domain.interactor.UndoInteractor
+import com.android.wallpaper.testing.FAKE_RESTORERS
+import com.android.wallpaper.testing.TestCurrentWallpaperInfoFactory
+import com.android.wallpaper.testing.collectLastValue
import com.google.common.truth.Truth.assertThat
import com.google.common.truth.Truth.assertWithMessage
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.ExperimentalCoroutinesApi
-import kotlinx.coroutines.flow.toList
-import kotlinx.coroutines.launch
+import kotlinx.coroutines.runBlocking
+import kotlinx.coroutines.test.StandardTestDispatcher
import kotlinx.coroutines.test.TestScope
-import kotlinx.coroutines.test.UnconfinedTestDispatcher
import kotlinx.coroutines.test.resetMain
import kotlinx.coroutines.test.runTest
import kotlinx.coroutines.test.setMain
@@ -55,28 +60,45 @@
private lateinit var context: Context
private lateinit var testScope: TestScope
- private lateinit var client: FakeKeyguardQuickAffordanceProviderClient
+ private lateinit var client: FakeCustomizationProviderClient
+ private lateinit var quickAffordanceInteractor: KeyguardQuickAffordancePickerInteractor
@Before
fun setUp() {
context = InstrumentationRegistry.getInstrumentation().targetContext
- val coroutineDispatcher = UnconfinedTestDispatcher()
- testScope = TestScope(coroutineDispatcher)
- Dispatchers.setMain(coroutineDispatcher)
- client = FakeKeyguardQuickAffordanceProviderClient()
+ val testDispatcher = StandardTestDispatcher()
+ testScope = TestScope(testDispatcher)
+ Dispatchers.setMain(testDispatcher)
+ client = FakeCustomizationProviderClient()
+ quickAffordanceInteractor =
+ KeyguardQuickAffordancePickerInteractor(
+ repository =
+ KeyguardQuickAffordancePickerRepository(
+ client = client,
+ backgroundDispatcher = testDispatcher,
+ ),
+ client = client,
+ snapshotRestorer = {
+ KeyguardQuickAffordanceSnapshotRestorer(
+ interactor = quickAffordanceInteractor,
+ client = client,
+ )
+ .apply { runBlocking { setUpSnapshotRestorer {} } }
+ },
+ )
+ val undoInteractor =
+ UndoInteractor(
+ scope = testScope.backgroundScope,
+ repository = UndoRepository(),
+ restorerByOwnerId = FAKE_RESTORERS,
+ )
underTest =
KeyguardQuickAffordancePickerViewModel.Factory(
context = context,
- interactor =
- KeyguardQuickAffordancePickerInteractor(
- repository =
- KeyguardQuickAffordancePickerRepository(
- client = client,
- backgroundDispatcher = coroutineDispatcher,
- ),
- client = client,
- ),
+ quickAffordanceInteractor = quickAffordanceInteractor,
+ undoInteractor = undoInteractor,
+ wallpaperInfoFactory = TestCurrentWallpaperInfoFactory(context),
)
.create(KeyguardQuickAffordancePickerViewModel::class.java)
}
@@ -89,23 +111,18 @@
@Test
fun `Select an affordance for each side`() =
testScope.runTest {
- val slots = mutableListOf<Map<String, KeyguardQuickAffordanceSlotViewModel>>()
- val quickAffordances = mutableListOf<List<KeyguardQuickAffordanceViewModel>>()
-
- val jobs = buildList {
- add(launch { underTest.slots.toList(slots) })
- add(launch { underTest.quickAffordances.toList(quickAffordances) })
- }
+ val slots = collectLastValue(underTest.slots)
+ val quickAffordances = collectLastValue(underTest.quickAffordances)
// Initially, the first slot is selected with the "none" affordance selected.
assertPickerUiState(
- slots = slots.last(),
- affordances = quickAffordances.last(),
+ slots = slots(),
+ affordances = quickAffordances(),
selectedSlotText = "Left button",
selectedAffordanceText = "None",
)
assertPreviewUiState(
- slots = slots.last(),
+ slots = slots(),
expectedAffordanceNameBySlotId =
mapOf(
KeyguardQuickAffordanceSlots.SLOT_ID_BOTTOM_START to null,
@@ -114,123 +131,109 @@
)
// Select "affordance 1" for the first slot.
- quickAffordances.last()[1].onClicked?.invoke()
+ quickAffordances()?.get(1)?.onClicked?.invoke()
assertPickerUiState(
- slots = slots.last(),
- affordances = quickAffordances.last(),
+ slots = slots(),
+ affordances = quickAffordances(),
selectedSlotText = "Left button",
- selectedAffordanceText = FakeKeyguardQuickAffordanceProviderClient.AFFORDANCE_1,
+ selectedAffordanceText = FakeCustomizationProviderClient.AFFORDANCE_1,
)
assertPreviewUiState(
- slots = slots.last(),
+ slots = slots(),
expectedAffordanceNameBySlotId =
mapOf(
KeyguardQuickAffordanceSlots.SLOT_ID_BOTTOM_START to
- FakeKeyguardQuickAffordanceProviderClient.AFFORDANCE_1,
+ FakeCustomizationProviderClient.AFFORDANCE_1,
KeyguardQuickAffordanceSlots.SLOT_ID_BOTTOM_END to null,
),
)
// Select an affordance for the second slot.
// First, switch to the second slot:
- slots.last()[KeyguardQuickAffordanceSlots.SLOT_ID_BOTTOM_END]?.onClicked?.invoke()
+ slots()?.get(KeyguardQuickAffordanceSlots.SLOT_ID_BOTTOM_END)?.onClicked?.invoke()
// Second, select the "affordance 3" affordance:
- quickAffordances.last()[3].onClicked?.invoke()
+ quickAffordances()?.get(3)?.onClicked?.invoke()
assertPickerUiState(
- slots = slots.last(),
- affordances = quickAffordances.last(),
+ slots = slots(),
+ affordances = quickAffordances(),
selectedSlotText = "Right button",
- selectedAffordanceText = FakeKeyguardQuickAffordanceProviderClient.AFFORDANCE_3,
+ selectedAffordanceText = FakeCustomizationProviderClient.AFFORDANCE_3,
)
assertPreviewUiState(
- slots = slots.last(),
+ slots = slots(),
expectedAffordanceNameBySlotId =
mapOf(
KeyguardQuickAffordanceSlots.SLOT_ID_BOTTOM_START to
- FakeKeyguardQuickAffordanceProviderClient.AFFORDANCE_1,
+ FakeCustomizationProviderClient.AFFORDANCE_1,
KeyguardQuickAffordanceSlots.SLOT_ID_BOTTOM_END to
- FakeKeyguardQuickAffordanceProviderClient.AFFORDANCE_3,
+ FakeCustomizationProviderClient.AFFORDANCE_3,
),
)
// Select a different affordance for the second slot.
- quickAffordances.last()[2].onClicked?.invoke()
+ quickAffordances()?.get(2)?.onClicked?.invoke()
assertPickerUiState(
- slots = slots.last(),
- affordances = quickAffordances.last(),
+ slots = slots(),
+ affordances = quickAffordances(),
selectedSlotText = "Right button",
- selectedAffordanceText = FakeKeyguardQuickAffordanceProviderClient.AFFORDANCE_2,
+ selectedAffordanceText = FakeCustomizationProviderClient.AFFORDANCE_2,
)
assertPreviewUiState(
- slots = slots.last(),
+ slots = slots(),
expectedAffordanceNameBySlotId =
mapOf(
KeyguardQuickAffordanceSlots.SLOT_ID_BOTTOM_START to
- FakeKeyguardQuickAffordanceProviderClient.AFFORDANCE_1,
+ FakeCustomizationProviderClient.AFFORDANCE_1,
KeyguardQuickAffordanceSlots.SLOT_ID_BOTTOM_END to
- FakeKeyguardQuickAffordanceProviderClient.AFFORDANCE_2,
+ FakeCustomizationProviderClient.AFFORDANCE_2,
),
)
-
- jobs.forEach { it.cancel() }
}
@Test
fun `Unselect - AKA selecting the none affordance - on one side`() =
testScope.runTest {
- val slots = mutableListOf<Map<String, KeyguardQuickAffordanceSlotViewModel>>()
- val quickAffordances = mutableListOf<List<KeyguardQuickAffordanceViewModel>>()
-
- val jobs = buildList {
- add(launch { underTest.slots.toList(slots) })
- add(launch { underTest.quickAffordances.toList(quickAffordances) })
- }
+ val slots = collectLastValue(underTest.slots)
+ val quickAffordances = collectLastValue(underTest.quickAffordances)
// Select "affordance 1" for the first slot.
- quickAffordances.last()[1].onClicked?.invoke()
+ quickAffordances()?.get(1)?.onClicked?.invoke()
// Select an affordance for the second slot.
// First, switch to the second slot:
- slots.last()[KeyguardQuickAffordanceSlots.SLOT_ID_BOTTOM_END]?.onClicked?.invoke()
+ slots()?.get(KeyguardQuickAffordanceSlots.SLOT_ID_BOTTOM_END)?.onClicked?.invoke()
// Second, select the "affordance 3" affordance:
- quickAffordances.last()[3].onClicked?.invoke()
+ quickAffordances()?.get(3)?.onClicked?.invoke()
// Switch back to the first slot:
- slots.last()[KeyguardQuickAffordanceSlots.SLOT_ID_BOTTOM_START]?.onClicked?.invoke()
+ slots()?.get(KeyguardQuickAffordanceSlots.SLOT_ID_BOTTOM_START)?.onClicked?.invoke()
// Select the "none" affordance, which is always in position 0:
- quickAffordances.last()[0].onClicked?.invoke()
+ quickAffordances()?.get(0)?.onClicked?.invoke()
assertPickerUiState(
- slots = slots.last(),
- affordances = quickAffordances.last(),
+ slots = slots(),
+ affordances = quickAffordances(),
selectedSlotText = "Left button",
selectedAffordanceText = "None",
)
assertPreviewUiState(
- slots = slots.last(),
+ slots = slots(),
expectedAffordanceNameBySlotId =
mapOf(
KeyguardQuickAffordanceSlots.SLOT_ID_BOTTOM_START to null,
KeyguardQuickAffordanceSlots.SLOT_ID_BOTTOM_END to
- FakeKeyguardQuickAffordanceProviderClient.AFFORDANCE_3,
+ FakeCustomizationProviderClient.AFFORDANCE_3,
),
)
-
- jobs.forEach { it.cancel() }
}
@Test
fun `Show enablement dialog when selecting a disabled affordance`() =
testScope.runTest {
- val slots = mutableListOf<Map<String, KeyguardQuickAffordanceSlotViewModel>>()
- val quickAffordances = mutableListOf<List<KeyguardQuickAffordanceViewModel>>()
- val dialog = mutableListOf<KeyguardQuickAffordancePickerViewModel.DialogViewModel?>()
+ val slots = collectLastValue(underTest.slots)
+ val quickAffordances = collectLastValue(underTest.quickAffordances)
+ val dialog = collectLastValue(underTest.dialog)
- val jobs = buildList {
- add(launch { underTest.slots.toList(slots) })
- add(launch { underTest.quickAffordances.toList(quickAffordances) })
- add(launch { underTest.dialog.toList(dialog) })
- }
- val enablementInstructions = listOf("header", "enablementInstructions")
+ val enablementInstructions = listOf("instruction1", "instruction2")
val enablementActionText = "enablementActionText"
val packageName = "packageName"
val action = "action"
@@ -238,10 +241,10 @@
// Lets add a disabled affordance to the picker:
val affordanceIndex =
client.addAffordance(
- KeyguardQuickAffordanceProviderClient.Affordance(
+ CustomizationProviderClient.Affordance(
id = "disabled",
name = "disabled",
- iconResourceId = 0,
+ iconResourceId = 1,
isEnabled = false,
enablementInstructions = enablementInstructions,
enablementActionText = enablementActionText,
@@ -250,129 +253,102 @@
)
// Lets try to select that disabled affordance:
- quickAffordances.last()[affordanceIndex + 1].onClicked?.invoke()
+ quickAffordances()?.get(affordanceIndex + 1)?.onClicked?.invoke()
// We expect there to be a dialog that should be shown:
- assertThat(dialog.last()?.instructionHeader).isEqualTo(enablementInstructions[0])
- assertThat(dialog.last()?.instructions)
- .isEqualTo(enablementInstructions.subList(1, enablementInstructions.size))
- assertThat(dialog.last()?.actionText).isEqualTo(enablementActionText)
- assertThat(dialog.last()?.intent?.`package`).isEqualTo(packageName)
- assertThat(dialog.last()?.intent?.action).isEqualTo(action)
+ assertThat(dialog()?.icon).isEqualTo(FakeCustomizationProviderClient.ICON_1)
+ assertThat(dialog()?.instructions).isEqualTo(enablementInstructions)
+ assertThat(dialog()?.actionText).isEqualTo(enablementActionText)
+ assertThat(dialog()?.intent?.`package`).isEqualTo(packageName)
+ assertThat(dialog()?.intent?.action).isEqualTo(action)
// Once we report that the dialog has been dismissed by the user, we expect there to be
// no
// dialog to be shown:
underTest.onDialogDismissed()
- assertThat(dialog.last()).isNull()
-
- jobs.forEach { it.cancel() }
+ assertThat(dialog()).isNull()
}
@Test
fun `summary - affordance selected in both bottom-start and bottom-end`() =
testScope.runTest {
- val slots = mutableListOf<Map<String, KeyguardQuickAffordanceSlotViewModel>>()
- val quickAffordances = mutableListOf<List<KeyguardQuickAffordanceViewModel>>()
- val summary = mutableListOf<KeyguardQuickAffordanceSummaryViewModel>()
- val jobs = buildList {
- add(launch { underTest.slots.toList(slots) })
- add(launch { underTest.quickAffordances.toList(quickAffordances) })
- add(launch { underTest.summary.toList(summary) })
- }
+ val slots = collectLastValue(underTest.slots)
+ val quickAffordances = collectLastValue(underTest.quickAffordances)
+ val summary = collectLastValue(underTest.summary)
// Select "affordance 1" for the first slot.
- quickAffordances.last()[1].onClicked?.invoke()
+ quickAffordances()?.get(1)?.onClicked?.invoke()
// Select an affordance for the second slot.
// First, switch to the second slot:
- slots.last()[KeyguardQuickAffordanceSlots.SLOT_ID_BOTTOM_END]?.onClicked?.invoke()
+ slots()?.get(KeyguardQuickAffordanceSlots.SLOT_ID_BOTTOM_END)?.onClicked?.invoke()
// Second, select the "affordance 3" affordance:
- quickAffordances.last()[3].onClicked?.invoke()
+ quickAffordances()?.get(3)?.onClicked?.invoke()
- assertThat(summary.last())
+ assertThat(summary())
.isEqualTo(
KeyguardQuickAffordanceSummaryViewModel(
description =
- "${FakeKeyguardQuickAffordanceProviderClient.AFFORDANCE_1}," +
- " ${FakeKeyguardQuickAffordanceProviderClient.AFFORDANCE_3}",
- icon1 = FakeKeyguardQuickAffordanceProviderClient.ICON_1,
- icon2 = FakeKeyguardQuickAffordanceProviderClient.ICON_3,
+ "${FakeCustomizationProviderClient.AFFORDANCE_1}," +
+ " ${FakeCustomizationProviderClient.AFFORDANCE_3}",
+ icon1 = FakeCustomizationProviderClient.ICON_1,
+ icon2 = FakeCustomizationProviderClient.ICON_3,
)
)
- jobs.forEach { it.cancel() }
}
@Test
fun `summary - affordance selected only on bottom-start`() =
testScope.runTest {
- val slots = mutableListOf<Map<String, KeyguardQuickAffordanceSlotViewModel>>()
- val quickAffordances = mutableListOf<List<KeyguardQuickAffordanceViewModel>>()
- val summary = mutableListOf<KeyguardQuickAffordanceSummaryViewModel>()
- val jobs = buildList {
- add(launch { underTest.slots.toList(slots) })
- add(launch { underTest.quickAffordances.toList(quickAffordances) })
- add(launch { underTest.summary.toList(summary) })
- }
+ val slots = collectLastValue(underTest.slots)
+ val quickAffordances = collectLastValue(underTest.quickAffordances)
+ val summary = collectLastValue(underTest.summary)
// Select "affordance 1" for the first slot.
- quickAffordances.last()[1].onClicked?.invoke()
+ quickAffordances()?.get(1)?.onClicked?.invoke()
- assertThat(summary.last())
+ assertThat(summary())
.isEqualTo(
KeyguardQuickAffordanceSummaryViewModel(
- description = FakeKeyguardQuickAffordanceProviderClient.AFFORDANCE_1,
- icon1 = FakeKeyguardQuickAffordanceProviderClient.ICON_1,
+ description = FakeCustomizationProviderClient.AFFORDANCE_1,
+ icon1 = FakeCustomizationProviderClient.ICON_1,
icon2 = null,
)
)
- jobs.forEach { it.cancel() }
}
@Test
fun `summary - affordance selected only on bottom-end`() =
testScope.runTest {
- val slots = mutableListOf<Map<String, KeyguardQuickAffordanceSlotViewModel>>()
- val quickAffordances = mutableListOf<List<KeyguardQuickAffordanceViewModel>>()
- val summary = mutableListOf<KeyguardQuickAffordanceSummaryViewModel>()
- val jobs = buildList {
- add(launch { underTest.slots.toList(slots) })
- add(launch { underTest.quickAffordances.toList(quickAffordances) })
- add(launch { underTest.summary.toList(summary) })
- }
+ val slots = collectLastValue(underTest.slots)
+ val quickAffordances = collectLastValue(underTest.quickAffordances)
+ val summary = collectLastValue(underTest.summary)
// Select an affordance for the second slot.
// First, switch to the second slot:
- slots.last()[KeyguardQuickAffordanceSlots.SLOT_ID_BOTTOM_END]?.onClicked?.invoke()
+ slots()?.get(KeyguardQuickAffordanceSlots.SLOT_ID_BOTTOM_END)?.onClicked?.invoke()
// Second, select the "affordance 3" affordance:
- quickAffordances.last()[3].onClicked?.invoke()
+ quickAffordances()?.get(3)?.onClicked?.invoke()
- assertThat(summary.last())
+ assertThat(summary())
.isEqualTo(
KeyguardQuickAffordanceSummaryViewModel(
- description = FakeKeyguardQuickAffordanceProviderClient.AFFORDANCE_3,
+ description = FakeCustomizationProviderClient.AFFORDANCE_3,
icon1 = null,
- icon2 = FakeKeyguardQuickAffordanceProviderClient.ICON_3,
+ icon2 = FakeCustomizationProviderClient.ICON_3,
)
)
- jobs.forEach { it.cancel() }
}
@Test
fun `summary - no affordances selected`() =
testScope.runTest {
- val slots = mutableListOf<Map<String, KeyguardQuickAffordanceSlotViewModel>>()
- val quickAffordances = mutableListOf<List<KeyguardQuickAffordanceViewModel>>()
- val summary = mutableListOf<KeyguardQuickAffordanceSummaryViewModel>()
- val jobs = buildList {
- add(launch { underTest.slots.toList(slots) })
- add(launch { underTest.quickAffordances.toList(quickAffordances) })
- add(launch { underTest.summary.toList(summary) })
- }
+ val slots = collectLastValue(underTest.slots)
+ val quickAffordances = collectLastValue(underTest.quickAffordances)
+ val summary = collectLastValue(underTest.summary)
- assertThat(summary.last().description).isEqualTo("None")
- assertThat(summary.last().icon1).isNotNull()
- assertThat(summary.last().icon2).isNull()
- jobs.forEach { it.cancel() }
+ assertThat(summary()?.description).isEqualTo("None")
+ assertThat(summary()?.icon1).isNotNull()
+ assertThat(summary()?.icon2).isNull()
}
/**
@@ -385,8 +361,8 @@
* @param selectedAffordanceText The text of the affordance that's expected to be selected
*/
private fun assertPickerUiState(
- slots: Map<String, KeyguardQuickAffordanceSlotViewModel>,
- affordances: List<KeyguardQuickAffordanceViewModel>,
+ slots: Map<String, KeyguardQuickAffordanceSlotViewModel>?,
+ affordances: List<KeyguardQuickAffordanceViewModel>?,
selectedSlotText: String,
selectedAffordanceText: String,
) {
@@ -402,7 +378,8 @@
)
var foundSelectedAffordance = false
- affordances.forEach { affordance ->
+ assertThat(affordances).isNotNull()
+ affordances?.forEach { affordance ->
val nameMatchesSelectedName = affordance.contentDescription == selectedAffordanceText
assertWithMessage(
"Expected affordance with name \"${affordance.contentDescription}\" to have" +
@@ -423,11 +400,11 @@
* @param isSelected Whether that slot should be selected
*/
private fun assertSlotTabUiState(
- slots: Map<String, KeyguardQuickAffordanceSlotViewModel>,
+ slots: Map<String, KeyguardQuickAffordanceSlotViewModel>?,
slotId: String,
isSelected: Boolean,
) {
- val viewModel = slots[slotId] ?: error("No slot with ID \"$slotId\"!")
+ val viewModel = slots?.get(slotId) ?: error("No slot with ID \"$slotId\"!")
assertThat(viewModel.isSelected).isEqualTo(isSelected)
}
@@ -439,10 +416,11 @@
* slot ID or `null` if it's expected for there to be no affordance for that slot in the preview
*/
private fun assertPreviewUiState(
- slots: Map<String, KeyguardQuickAffordanceSlotViewModel>,
+ slots: Map<String, KeyguardQuickAffordanceSlotViewModel>?,
expectedAffordanceNameBySlotId: Map<String, String?>,
) {
- slots.forEach { (slotId, slotViewModel) ->
+ assertThat(slots).isNotNull()
+ slots?.forEach { (slotId, slotViewModel) ->
val expectedAffordanceName = expectedAffordanceNameBySlotId[slotId]
val actualAffordanceName =
slotViewModel.selectedQuickAffordances.firstOrNull()?.contentDescription
diff --git a/tests/src/com/android/customization/testing/TestCustomizationInjector.java b/tests/src/com/android/customization/testing/TestCustomizationInjector.java
index 15898c1..d609335 100644
--- a/tests/src/com/android/customization/testing/TestCustomizationInjector.java
+++ b/tests/src/com/android/customization/testing/TestCustomizationInjector.java
@@ -12,14 +12,19 @@
import com.android.customization.module.ThemesUserEventLogger;
import com.android.customization.picker.quickaffordance.data.repository.KeyguardQuickAffordancePickerRepository;
import com.android.customization.picker.quickaffordance.domain.interactor.KeyguardQuickAffordancePickerInteractor;
-import com.android.customization.picker.quickaffordance.ui.viewmodel.KeyguardQuickAffordancePickerViewModel;
-import com.android.systemui.shared.quickaffordance.data.content.KeyguardQuickAffordanceProviderClient;
-import com.android.systemui.shared.quickaffordance.data.content.KeyguardQuickAffordanceProviderClientImpl;
+import com.android.customization.picker.quickaffordance.domain.interactor.KeyguardQuickAffordanceSnapshotRestorer;
+import com.android.systemui.shared.customization.data.content.CustomizationProviderClient;
+import com.android.systemui.shared.customization.data.content.CustomizationProviderClientImpl;
+import com.android.wallpaper.config.BaseFlags;
import com.android.wallpaper.module.DrawableLayerResolver;
import com.android.wallpaper.module.PackageStatusNotifier;
import com.android.wallpaper.module.UserEventLogger;
+import com.android.wallpaper.picker.undo.domain.interactor.SnapshotRestorer;
import com.android.wallpaper.testing.TestInjector;
+import java.util.HashMap;
+import java.util.Map;
+
import kotlinx.coroutines.Dispatchers;
/**
@@ -32,8 +37,9 @@
private DrawableLayerResolver mDrawableLayerResolver;
private UserEventLogger mUserEventLogger;
private KeyguardQuickAffordancePickerInteractor mKeyguardQuickAffordancePickerInteractor;
- private KeyguardQuickAffordancePickerViewModel.Factory
- mKeyguardQuickAffordancePickerViewModelFactory;
+ private BaseFlags mFlags;
+ private CustomizationProviderClient mCustomizationProviderClient;
+ private KeyguardQuickAffordanceSnapshotRestorer mKeyguardQuickAffordanceSnapshotRestorer;
@Override
public CustomizationPreferences getCustomizationPreferences(Context context) {
@@ -83,12 +89,55 @@
public KeyguardQuickAffordancePickerInteractor getKeyguardQuickAffordancePickerInteractor(
Context context) {
if (mKeyguardQuickAffordancePickerInteractor == null) {
- final KeyguardQuickAffordanceProviderClient client =
- new KeyguardQuickAffordanceProviderClientImpl(context, Dispatchers.getIO());
+ final CustomizationProviderClient client =
+ new CustomizationProviderClientImpl(context, Dispatchers.getIO());
mKeyguardQuickAffordancePickerInteractor = new KeyguardQuickAffordancePickerInteractor(
new KeyguardQuickAffordancePickerRepository(client, Dispatchers.getIO()),
- client);
+ client,
+ () -> getKeyguardQuickAffordanceSnapshotRestorer(context));
}
return mKeyguardQuickAffordancePickerInteractor;
}
+
+ @Override
+ public BaseFlags getFlags() {
+ if (mFlags == null) {
+ mFlags = new BaseFlags() {};
+ }
+
+ return mFlags;
+ }
+
+ @Override
+ public Map<Integer, SnapshotRestorer> getSnapshotRestorers(Context context) {
+ final Map<Integer, SnapshotRestorer> restorers = new HashMap<>();
+ restorers.put(
+ KEY_QUICK_AFFORDANCE_SNAPSHOT_RESTORER,
+ getKeyguardQuickAffordanceSnapshotRestorer(context));
+ return restorers;
+ }
+
+ /** Returns the {@link CustomizationProviderClient}. */
+ private CustomizationProviderClient getKeyguardQuickAffordancePickerProviderClient(
+ Context context) {
+ if (mCustomizationProviderClient == null) {
+ mCustomizationProviderClient =
+ new CustomizationProviderClientImpl(context, Dispatchers.getIO());
+ }
+
+ return mCustomizationProviderClient;
+ }
+
+ private KeyguardQuickAffordanceSnapshotRestorer getKeyguardQuickAffordanceSnapshotRestorer(
+ Context context) {
+ if (mKeyguardQuickAffordanceSnapshotRestorer == null) {
+ mKeyguardQuickAffordanceSnapshotRestorer = new KeyguardQuickAffordanceSnapshotRestorer(
+ getKeyguardQuickAffordancePickerInteractor(context),
+ getKeyguardQuickAffordancePickerProviderClient(context));
+ }
+
+ return mKeyguardQuickAffordanceSnapshotRestorer;
+ }
+
+ private static final int KEY_QUICK_AFFORDANCE_SNAPSHOT_RESTORER = 1;
}