diff --git a/.editorconfig b/.editorconfig index a3824c6cfaa..87cc9903e4b 100644 --- a/.editorconfig +++ b/.editorconfig @@ -19,8 +19,10 @@ ij_kotlin_name_count_to_use_star_import = 999 ij_kotlin_name_count_to_use_star_import_for_members = 999 ij_kotlin_packages_to_use_import_on_demand = unset ktlint_code_style = intellij_idea -ktlint_standard_discouraged-comment-location = disabled ktlint_function_naming_ignore_when_annotated_with = Composable +ktlint_standard_discouraged-comment-location = disabled +ktlint_standard_function-expression-body = disabled +ktlint_compose_lambda-param-event-trailing = disabled [*.md] trim_trailing_whitespace = false diff --git a/build.gradle b/build.gradle index b9bfe819eed..b3641a6f1eb 100644 --- a/build.gradle +++ b/build.gradle @@ -3,9 +3,9 @@ import com.android.build.gradle.api.AndroidBasePlugin import org.jetbrains.kotlin.gradle.tasks.KotlinCompile plugins { - id 'com.android.application' version "8.7.3" - id 'com.android.library' version "8.7.3" apply false - id 'com.android.test' version '8.7.3' apply false + id 'com.android.application' version "8.8.0" + id 'com.android.library' version "8.8.0" apply false + id 'com.android.test' version '8.8.0' apply false id 'androidx.baselineprofile' version '1.3.3' id 'org.jetbrains.kotlin.android' version "2.1.0" id 'org.jetbrains.kotlin.plugin.compose' version "2.1.0" @@ -16,7 +16,7 @@ plugins { id 'app.cash.licensee' version "1.12.0" id 'dev.rikka.tools.refine' version "4.4.0" id 'org.gradle.android.cache-fix' version '3.0.1' - id 'com.diffplug.spotless' version '7.0.0' + id 'com.diffplug.spotless' version '7.0.1' } @@ -42,7 +42,7 @@ allprojects { } plugins.withId('com.google.protobuf') { - def protocVersion = '4.29.2' + def protocVersion = '4.29.3' protobuf { // Configure the protoc executable protoc { @@ -78,7 +78,7 @@ allprojects { ext { FRAMEWORK_PREBUILTS_DIR = "$rootDir/prebuilts/libs" - daggerVersion = '2.54' + daggerVersion = '2.55' addFrameworkJar = { String name -> def frameworkJar = new File(FRAMEWORK_PREBUILTS_DIR, name) diff --git a/hidden-api/src/main/java/com/android/internal/util/ScreenshotRequest.aidl b/hidden-api/src/main/java/com/android/internal/util/ScreenshotRequest.aidl deleted file mode 100644 index 05d7e4c2e71..00000000000 --- a/hidden-api/src/main/java/com/android/internal/util/ScreenshotRequest.aidl +++ /dev/null @@ -1,3 +0,0 @@ -package com.android.internal.util; - -parcelable ScreenshotRequest; \ No newline at end of file diff --git a/lawnchair/res/layout/wallpaper_options_popup.xml b/lawnchair/res/layout/wallpaper_options_popup.xml new file mode 100644 index 00000000000..e9ebdbc05ad --- /dev/null +++ b/lawnchair/res/layout/wallpaper_options_popup.xml @@ -0,0 +1,21 @@ + + + + + + diff --git a/lawnchair/res/layout/wallpaper_options_popup_item.xml b/lawnchair/res/layout/wallpaper_options_popup_item.xml new file mode 100644 index 00000000000..9a218d11e47 --- /dev/null +++ b/lawnchair/res/layout/wallpaper_options_popup_item.xml @@ -0,0 +1,8 @@ + + + + diff --git a/lawnchair/res/values-af-rZA/strings.xml b/lawnchair/res/values-af-rZA/strings.xml index 3fedea171cb..259fb81fd6d 100644 --- a/lawnchair/res/values-af-rZA/strings.xml +++ b/lawnchair/res/values-af-rZA/strings.xml @@ -71,6 +71,7 @@ Item removed What to show + Wallpapers To lock your phone when performing a gesture, and to open Recents via gesture, Lawnchair requires accessibility access.\n\nLawnchair doesn\'t watch any user action, though the privilege to do so is required for all accessibility services. Lawnchair discards any event sent by the system.\n\nIn order to lock your phone, or to open Recents, Lawnchair uses the performGlobalAction Accessibility service. %1$d x %2$d @@ -400,9 +401,9 @@ Use new pop-up style Use Material You\'s bouncy and slightly consolidated pop-up style Pop-up menu - Show lock button - Show system settings button - Show edit home screen button + Pop-up menu items + Edit pop-up menu items + Wallpaper quick picker Status bar Show status bar Dark status bar @@ -419,7 +420,9 @@ Remove the minimum and maximum size restrictions of widgets Show dock + Search bar settings are available when the Dock is visible. Tap to show the Dock. Search bar + Search bar settings Search bar widget Disabled Google Search bar @@ -430,10 +433,12 @@ Apply accent color Search provider Show background - Horizontal inset (Left) - Horizontal inset (Right) - Vertical inset (Top) - Vertical inset (Bottom) + Left margin + Right margin + Top margin + Bottom margin + Background color + Background opacity Pause Pause %1$s? @@ -464,6 +469,7 @@ App drawer columns Row height Horizontal padding + Background color Hide from app drawer Hidden apps (%1$d) diff --git a/lawnchair/res/values-am-rET/strings.xml b/lawnchair/res/values-am-rET/strings.xml index 483e15ad1f2..de6c0a2c4bb 100644 --- a/lawnchair/res/values-am-rET/strings.xml +++ b/lawnchair/res/values-am-rET/strings.xml @@ -71,6 +71,7 @@ Item removed What to show + Wallpapers To lock your phone when performing a gesture, and to open Recents via gesture, Lawnchair requires accessibility access.\n\nLawnchair doesn\'t watch any user action, though the privilege to do so is required for all accessibility services. Lawnchair discards any event sent by the system.\n\nIn order to lock your phone, or to open Recents, Lawnchair uses the performGlobalAction Accessibility service. %1$d x %2$d @@ -400,9 +401,9 @@ Use new pop-up style Use Material You\'s bouncy and slightly consolidated pop-up style Pop-up menu - Show lock button - Show system settings button - Show edit home screen button + Pop-up menu items + Edit pop-up menu items + Wallpaper quick picker Status bar Show status bar Dark status bar @@ -419,7 +420,9 @@ Remove the minimum and maximum size restrictions of widgets Show dock + Search bar settings are available when the Dock is visible. Tap to show the Dock. Search bar + Search bar settings Search bar widget Disabled Google Search bar @@ -430,10 +433,12 @@ Apply accent color Search provider Show background - Horizontal inset (Left) - Horizontal inset (Right) - Vertical inset (Top) - Vertical inset (Bottom) + Left margin + Right margin + Top margin + Bottom margin + Background color + Background opacity Pause Pause %1$s? @@ -464,6 +469,7 @@ App drawer columns Row height Horizontal padding + Background color Hide from app drawer Hidden apps (%1$d) diff --git a/lawnchair/res/values-ar-rSA/strings.xml b/lawnchair/res/values-ar-rSA/strings.xml index 6a3cb76fb79..2ba39660db2 100644 --- a/lawnchair/res/values-ar-rSA/strings.xml +++ b/lawnchair/res/values-ar-rSA/strings.xml @@ -71,6 +71,7 @@ تم إزالة العنصر ماذا يُعرض + Wallpapers لقفل هاتفك عند تنفيذ إيماءة، ولفتح التطبيقات الحديثة عبر الإيماءة، يحتاج Lawnchair إلى الوصول إلى خدمات الوصول. لا يراقب Lawnchair أي إجراء من المستخدم، على الرغم من أن هذه الصلاحية مطلوبة لجميع خدمات الوصول. يتجاهل Lawnchair أي حدث يتم إرساله من النظام. لقفل هاتفك، أو لفتح التطبيقات الحديثة، يستخدم Lawnchair خدمة الوصول performGlobalAction. %1$d x %2$d @@ -400,9 +401,9 @@ استخدام نمط النافذة المنبثقة الجديد استخدام نمط النافذة المنبثقة النابض والمجدد في Material You القائمة المنبثقة - إظهار زر القفل - إظهار زر إعدادات النظام - إظهار زر تعديل الشاشة الرئيسية + Pop-up menu items + Edit pop-up menu items + Wallpaper quick picker شريط الحالة إظهار شريط الحالة شريط الحالة الداكن @@ -419,7 +420,9 @@ إزالة قيود الحد الأدنى والحد الأقصى لحجم التطبيقات المصغرة إظهار شريط Dock + Search bar settings are available when the Dock is visible. Tap to show the Dock. شريط البحث + Search bar settings أداة شريط البحث معطل شريط بحث Google @@ -430,10 +433,12 @@ تطبيق لون التمييز مزود البحث أظهر الخلفية - المساحة البينية الأفقية (جهة اليسار) - المساحة البينية الأفقية (جهة اليمين) - المساحة البينية العمودية (جهة الأعلى) - المساحة البينية العمودية (جهة الأسفل) + Left margin + Right margin + Top margin + Bottom margin + Background color + شفافية الخلفية Pause Pause %1$s? @@ -464,6 +469,7 @@ أعمدة درج التطبيقات ارتفاع الصف التوسيع الأفقي + Background color إخفاء من درج التطبيقات التطبيقات المخفية (%1$d) diff --git a/lawnchair/res/values-az-rAZ/strings.xml b/lawnchair/res/values-az-rAZ/strings.xml index b94d74a32a3..145f1ad3f91 100644 --- a/lawnchair/res/values-az-rAZ/strings.xml +++ b/lawnchair/res/values-az-rAZ/strings.xml @@ -71,6 +71,7 @@ Item removed What to show + Wallpapers To lock your phone when performing a gesture, and to open Recents via gesture, Lawnchair requires accessibility access.\n\nLawnchair doesn\'t watch any user action, though the privilege to do so is required for all accessibility services. Lawnchair discards any event sent by the system.\n\nIn order to lock your phone, or to open Recents, Lawnchair uses the performGlobalAction Accessibility service. %1$d x %2$d @@ -400,9 +401,9 @@ Use new pop-up style Use Material You\'s bouncy and slightly consolidated pop-up style Pop-up menu - Show lock button - Show system settings button - Show edit home screen button + Pop-up menu items + Edit pop-up menu items + Wallpaper quick picker Status bar Show status bar Dark status bar @@ -419,7 +420,9 @@ Remove the minimum and maximum size restrictions of widgets Show dock + Search bar settings are available when the Dock is visible. Tap to show the Dock. Search bar + Search bar settings Search bar widget Disabled Google Search bar @@ -430,10 +433,12 @@ Apply accent color Search provider Show background - Horizontal inset (Left) - Horizontal inset (Right) - Vertical inset (Top) - Vertical inset (Bottom) + Left margin + Right margin + Top margin + Bottom margin + Background color + Background opacity Pause Pause %1$s? @@ -464,6 +469,7 @@ App drawer columns Row height Horizontal padding + Background color Hide from app drawer Hidden apps (%1$d) diff --git a/lawnchair/res/values-b+sr+Latn/strings.xml b/lawnchair/res/values-b+sr+Latn/strings.xml index bc3ba0158d6..20d7a9d7041 100644 --- a/lawnchair/res/values-b+sr+Latn/strings.xml +++ b/lawnchair/res/values-b+sr+Latn/strings.xml @@ -71,6 +71,7 @@ Stavka je uklonjena Informacije za prikaz + Wallpapers Da biste zaključali uređaj pokretom ili otvorili meni sa nedavnim aplikacijama, Lawnchairu je potreban pristup usluzi pristupačnosti.\n\nPomoću nje se mogu nadgledati korisničke radnje, ali je Lawnchair ne koristi u te svrhe. %1$d x %2$d @@ -400,9 +401,9 @@ Novi stil iskačućeg prozora Koristite animirane i kompaktnije iskačuće prozore u skladu sa dizajnom Material You Iskačući meni - Prikaži dugme za zaključavanje - Prikaži dugme za sistemska podešavanja - Prikaži dugme za uređivanje početnog ekrana + Pop-up menu items + Edit pop-up menu items + Wallpaper quick picker Statusna traka Prikaži statusnu traku Tamna statusna traka @@ -419,7 +420,9 @@ Uklonite ograničenje minimalne i maksimalne veličine vidžeta Prikaži dok + Search bar settings are available when the Dock is visible. Tap to show the Dock. Traka za pretragu + Search bar settings Vidžet trake za pretragu Onemogućeno Google traka za pretragu @@ -430,10 +433,12 @@ Primeni boju za naglašavanje Pretraživač Prikaži pozadinu - Horizontalni pomak (levo) - Horizontalni pomak (desno) - Vertikalni pomak (gore) - Vertikalni pomak (dole) + Left margin + Right margin + Top margin + Bottom margin + Background color + Neprozirnost pozadine Pause Pause %1$s? @@ -464,6 +469,7 @@ Broj kolona na listi aplikacija Visina reda Horizontalni razmak + Background color Sakrij sa liste aplikacija Skrivene aplikacije (%1$d) diff --git a/lawnchair/res/values-bn-rBD/strings.xml b/lawnchair/res/values-bn-rBD/strings.xml index 87707bc511c..4985257268b 100644 --- a/lawnchair/res/values-bn-rBD/strings.xml +++ b/lawnchair/res/values-bn-rBD/strings.xml @@ -71,6 +71,7 @@ আইটেম রিমুভ করা হয়েছে যা দেখাবে + Wallpapers To lock your phone when performing a gesture, and to open Recents via gesture, Lawnchair requires accessibility access.\n\nLawnchair doesn\'t watch any user action, though the privilege to do so is required for all accessibility services. Lawnchair discards any event sent by the system.\n\nIn order to lock your phone, or to open Recents, Lawnchair uses the performGlobalAction Accessibility service. %1$d x %2$d @@ -400,9 +401,9 @@ Use new pop-up style Use Material You\'s bouncy and slightly consolidated pop-up style Pop-up menu - Show lock button - Show system settings button - Show edit home screen button + Pop-up menu items + Edit pop-up menu items + Wallpaper quick picker Status bar Show status bar Dark status bar @@ -419,7 +420,9 @@ Remove the minimum and maximum size restrictions of widgets Show dock + Search bar settings are available when the Dock is visible. Tap to show the Dock. Search bar + Search bar settings Search bar widget Disabled Google Search bar @@ -430,10 +433,12 @@ Apply accent color Search provider Show background - Horizontal inset (Left) - Horizontal inset (Right) - Vertical inset (Top) - Vertical inset (Bottom) + Left margin + Right margin + Top margin + Bottom margin + Background color + ব্যাকগ্রাউন্ডের অস্বচ্ছতা Pause Pause %1$s? @@ -464,6 +469,7 @@ App drawer columns Row height Horizontal padding + Background color Hide from app drawer Hidden apps (%1$d) diff --git a/lawnchair/res/values-bs-rBA/strings.xml b/lawnchair/res/values-bs-rBA/strings.xml index c69e33d8eec..bef71d995a6 100644 --- a/lawnchair/res/values-bs-rBA/strings.xml +++ b/lawnchair/res/values-bs-rBA/strings.xml @@ -71,6 +71,7 @@ Item removed What to show + Wallpapers To lock your phone when performing a gesture, and to open Recents via gesture, Lawnchair requires accessibility access.\n\nLawnchair doesn\'t watch any user action, though the privilege to do so is required for all accessibility services. Lawnchair discards any event sent by the system.\n\nIn order to lock your phone, or to open Recents, Lawnchair uses the performGlobalAction Accessibility service. %1$d x %2$d @@ -400,9 +401,9 @@ Use new pop-up style Use Material You\'s bouncy and slightly consolidated pop-up style Pop-up menu - Show lock button - Show system settings button - Show edit home screen button + Pop-up menu items + Edit pop-up menu items + Wallpaper quick picker Status bar Show status bar Dark status bar @@ -419,7 +420,9 @@ Remove the minimum and maximum size restrictions of widgets Show dock + Search bar settings are available when the Dock is visible. Tap to show the Dock. Search bar + Search bar settings Search bar widget Disabled Google Search bar @@ -430,10 +433,12 @@ Apply accent color Search provider Show background - Horizontal inset (Left) - Horizontal inset (Right) - Vertical inset (Top) - Vertical inset (Bottom) + Left margin + Right margin + Top margin + Bottom margin + Background color + Background opacity Pause Pause %1$s? @@ -464,6 +469,7 @@ App drawer columns Row height Horizontal padding + Background color Hide from app drawer Hidden apps (%1$d) diff --git a/lawnchair/res/values-ca-rES/strings.xml b/lawnchair/res/values-ca-rES/strings.xml index 95f5045e335..41ad6ce26aa 100644 --- a/lawnchair/res/values-ca-rES/strings.xml +++ b/lawnchair/res/values-ca-rES/strings.xml @@ -23,7 +23,7 @@ --> Vista prèvia Crea - Backup + Còpia de seguretat Restaura Elimina Reiniciar @@ -34,16 +34,16 @@ Sempre Mai Porta-retalls - Copy link + Copia l\'enllaç Copia Enganxar Carregant… Gestionat per Lawnchair Preferències - Home settings - System settings - Change settings + Configuració d\'inici + Configuració del sistema + Canvia la configuració Fons de pantalla - Background opacity + Opacitat del fons - Copied to clipboard + S\'ha copiat al porta-retalls Result copied to clipboard Item removed What to show + Wallpapers To lock your phone when performing a gesture, and to open Recents via gesture, Lawnchair requires accessibility access.\n\nLawnchair doesn\'t watch any user action, though the privilege to do so is required for all accessibility services. Lawnchair discards any event sent by the system.\n\nIn order to lock your phone, or to open Recents, Lawnchair uses the performGlobalAction Accessibility service. %1$d x %2$d @@ -400,9 +401,9 @@ Use new pop-up style Use Material You\'s bouncy and slightly consolidated pop-up style Pop-up menu - Show lock button - Show system settings button - Show edit home screen button + Pop-up menu items + Edit pop-up menu items + Wallpaper quick picker Status bar Show status bar Dark status bar @@ -419,7 +420,9 @@ Remove the minimum and maximum size restrictions of widgets Show dock + Search bar settings are available when the Dock is visible. Tap to show the Dock. Search bar + Search bar settings Search bar widget Desactivat Google Search bar @@ -430,10 +433,12 @@ Apply accent color Search provider Show background - Horizontal inset (Left) - Horizontal inset (Right) - Vertical inset (Top) - Vertical inset (Bottom) + Left margin + Right margin + Top margin + Bottom margin + Background color + Background opacity Pause Pause %1$s? @@ -464,6 +469,7 @@ App drawer columns Row height Horizontal padding + Background color Hide from app drawer Hidden apps (%1$d) diff --git a/lawnchair/res/values-cs-rCZ/strings.xml b/lawnchair/res/values-cs-rCZ/strings.xml index b4e5c53c387..e1123dc63c1 100644 --- a/lawnchair/res/values-cs-rCZ/strings.xml +++ b/lawnchair/res/values-cs-rCZ/strings.xml @@ -71,6 +71,7 @@ Položka odebrána Co Zobrazit + Wallpapers To lock your phone when performing a gesture, and to open Recents via gesture, Lawnchair requires accessibility access.\n\nLawnchair doesn\'t watch any user action, though the privilege to do so is required for all accessibility services. Lawnchair discards any event sent by the system.\n\nIn order to lock your phone, or to open Recents, Lawnchair uses the performGlobalAction Accessibility service. %1$d x %2$d @@ -400,9 +401,9 @@ Use new pop-up style Use Material You\'s bouncy and slightly consolidated pop-up style Pop-up menu - Show lock button - Show system settings button - Show edit home screen button + Pop-up menu items + Edit pop-up menu items + Wallpaper quick picker Status bar Show status bar Dark status bar @@ -419,7 +420,9 @@ Odstranit minimální a maximální omezení velikosti widgetů Show dock + Search bar settings are available when the Dock is visible. Tap to show the Dock. Search bar + Search bar settings Search bar widget Zakázáno Google Search bar @@ -430,10 +433,12 @@ Apply accent color Poskytovatel vyhledávání Show background - Horizontal inset (Left) - Horizontal inset (Right) - Vertical inset (Top) - Vertical inset (Bottom) + Left margin + Right margin + Top margin + Bottom margin + Background color + Průhlednost pozadí Pozastavit Pozastavit %1$s? @@ -464,6 +469,7 @@ Sloupce seznamu aplikací Výška řádku Vodorovná mezera + Background color Skrýt v seznamu aplikací Skryté aplikace (%1$d) diff --git a/lawnchair/res/values-da-rDK/strings.xml b/lawnchair/res/values-da-rDK/strings.xml index e677366a93d..863d2d5d926 100644 --- a/lawnchair/res/values-da-rDK/strings.xml +++ b/lawnchair/res/values-da-rDK/strings.xml @@ -71,6 +71,7 @@ Element fjernet Hvad der skal vises + Wallpapers To lock your phone when performing a gesture, and to open Recents via gesture, Lawnchair requires accessibility access.\n\nLawnchair doesn\'t watch any user action, though the privilege to do so is required for all accessibility services. Lawnchair discards any event sent by the system.\n\nIn order to lock your phone, or to open Recents, Lawnchair uses the performGlobalAction Accessibility service. %1$d × %2$d @@ -400,9 +401,9 @@ Use new pop-up style Use Material You\'s bouncy and slightly consolidated pop-up style Pop-up menu - Show lock button - Show system settings button - Show edit home screen button + Pop-up menu items + Edit pop-up menu items + Wallpaper quick picker Status bar Show status bar Dark status bar @@ -419,7 +420,9 @@ Fjern de minimale og maksimale størrelsesbegrænsninger for widgets Show dock + Search bar settings are available when the Dock is visible. Tap to show the Dock. Search bar + Search bar settings Search bar widget Deaktiveret Google Search bar @@ -430,10 +433,12 @@ Apply accent color Search provider Show background - Horizontal inset (Left) - Horizontal inset (Right) - Vertical inset (Top) - Vertical inset (Bottom) + Left margin + Right margin + Top margin + Bottom margin + Background color + Baggrundsgennemsigtighed Pause Pause %1$s? @@ -464,6 +469,7 @@ App drawer columns Row height Horizontal padding + Background color Hide from app drawer Hidden apps (%1$d) diff --git a/lawnchair/res/values-de-rDE/strings.xml b/lawnchair/res/values-de-rDE/strings.xml index 050cd1290af..5f6a65cf097 100644 --- a/lawnchair/res/values-de-rDE/strings.xml +++ b/lawnchair/res/values-de-rDE/strings.xml @@ -71,6 +71,7 @@ Element entfernt Was angezeigt werden soll + Hintergrundbilder Um Ihr Telefon bei der Ausführung einer Geste zu sperren und um zuletzt geöffnete Apps per Geste zu öffnen, benötigt Lawnchair Bedienungshilfen-Zugriff.\n\nLawnchair beobachtet keine Benutzeraktionen, obwohl die Berechtigung dies ermöglicht. Lawnchair verwirft alle vom System gesendeten Ereignisse.\n\nUm Ihr Telefon zu sperren oder zuletzt geöffnete Apps zu öffnen, nutzt Lawnchair den performGlobalAction Accessibility Dienst. %1$d × %2$d @@ -400,9 +401,9 @@ Neuen Popup-Stil verwenden Benutze den hüpfenden und etwas kompakteren Popup-Stil von Material You Pop-up-Menü - Sperrschaltfläche anzeigen - Systemeinstellungstaste anzeigen - Startbildschirm-Bearbeiten-Taste anzeigen + Pop-up-Menü-Einträge + Pop-up-Menü-Einträge bearbeiten + Hintergrundbild-Schnellwahl Statusleiste Statusleiste anzeigen Dunkle Statusleiste @@ -419,7 +420,9 @@ Entfernt die minimale und maximale Größenvorgabe von Widgets Dock anzeigen + Einstellungen für die Suchleiste sind verfügbar, wenn das Dock sichtbar ist. Tippe, um das Dock anzuzeigen. Suchleiste + Suchleisten-Einstellungen Suchleisten-Widget Deaktiviert Google-Suchleiste @@ -430,10 +433,12 @@ Akzentfarbe verwenden Suchanbieter Hintergrund anzeigen - Horizontale Einrückung (links) - Horizontale Einrückung (rechts) - Vertikale Einrückung (oben) - Vertikale Einrückung (unten) + Linker Rand + Rechter Rand + Oberer Abstand + Unterer Abstand + Hintergrundfarbe + Hintergrunddeckkraft Anhalten %1$s anhalten? @@ -464,6 +469,7 @@ Spalten in der Anwendungsübersicht Zeilenhöhe Horizontaler Abstand + Hintergrundfarbe Aus der Anwendungsübersicht ausblenden Versteckte Apps (%1$d) diff --git a/lawnchair/res/values-el-rGR/strings.xml b/lawnchair/res/values-el-rGR/strings.xml index 7f856ed43c1..512bd4ee09a 100644 --- a/lawnchair/res/values-el-rGR/strings.xml +++ b/lawnchair/res/values-el-rGR/strings.xml @@ -41,7 +41,7 @@ Διαχειριζόμενο από τον εκκινητή Lawnchair Προτιμήσεις - Ρυθμίσεις αρχικής οθόνης + Ρυθμίσεις εκκινητή Ρυθμίσεις συστήματος Αλλαγή ρυθμίσεων Τι να εμφανίζεται + Ταπετσαρίες & στιλ Για να κλειδώσετε το τηλέφωνό σας όταν εκτελείτε μια χειρονομία, όπως και για να ανοίξετε τα Πρόσφατα μέσω χειρονομίας, ο εκκινητής Lawnchair χρειάζεται δικαιώματα Προσβασιμότητας.\n\nΟ εκκινητής Lawnchair δεν παρακολουθεί καμία ενέργεια του χρήστη, αν και το δικαίωμα να το κάνει απαιτείται για όλες τις υπηρεσίες προσβασιμότητας. Ο εκκινητής Lawnchair απορρίπτει οποιοδήποτε συμβάν που αποστέλλεται από το σύστημα.\n\nΓια να κλειδώσει το τηλέφωνό σας ή να ανοίξει τις Πρόσφατες εφαρμογές, ο εκκινητής Lawnchair χρησιμοποιεί την υπηρεσία προσβασιμότητας `performanceGlobalAction`. %1$d × %2$d @@ -400,14 +401,14 @@ Χρήση νέου αναδυόμενου στυλ Χρήση του ελαφρώς ενοποιημένου αναδυόμενου στυλ, βασισμένο στον σχεδιασμό Material U Αναδυόμενο μενού - Εμφάνιση κουμπιού κλειδώματος - Εμφάνιση κουμπιού ρυθμίσεων συστήματος - Εμφάνιση κουμπιού επεξεργασίας αρχικής οθόνης + Στοιχεία αναδυόμενου μενού + Επεξεργασία στοιχείων αναδυόμενου μενού + Wallpaper quick picker Γραμμή κατάστασης Εμφάνιση γραμμής κατάστασης Σκοτεινή γραμμή κατάστασης - Status bar clock - Dynamically hide status bar clock in first screen + Ρολόι γραμμής κατάστασης + Δυναμική απόκρυψη του ρολογιού της γραμμής κατάστασης στην πρώτη επιφάνεια εργασίας Χρώμα κειμένου Ελαφριά γραμματοσειρά Σκοτεινό @@ -419,7 +420,9 @@ Αφαίρεση των περιορισμών ελάχιστου και μέγιστου μεγέθους των γραφικών στοιχείων Εμφάνιση μπάρας εφαρμογών + Οι ρυθμίσεις της γραμμής αναζήτησης είναι διαθέσιμες όταν η μπάρα εφαρμογών είναι ορατή. Πατήστε για να εμφανίσετε την μπάρα εφαρμογών (Ράφι). Μπάρα αναζήτησης + Ρυθμίσεις μπάρας αναζήτησης Γραφικό στοιχείο μπάρας αναζήτησης Απενεργοποιημένο Μπάρα αναζήτησης Google @@ -429,21 +432,23 @@ Ακτίνα γωνίας Εφαρμογή χρώματος έμφασης Πάροχος αναζήτησης - Show background - Horizontal inset (Left) - Horizontal inset (Right) - Vertical inset (Top) - Vertical inset (Bottom) + Εμφάνιση φόντου + Αριστερό περιθώριο + Δεξί περιθώριο + Επάνω περιθώριο + Κάτω περιθώριο + Χρώμα φόντου φακέλου + Αδιαφάνεια φόντου - Pause - Pause %1$s? - Notifications for %1$s will be paused - App paused - %1$s was directly paused from the launcher - Pause app + Παύση + Παύση %1$s? + Θα γίνει παύση των ειδοποιήσεων για το %1$s + Η εφαρμογή τέθηκε σε παύση + Το %1$s τέθηκε απευθείας σε παύση από τον εκκινητή + Παύση εφαρμογής Εικονίδια μπάρας εφαρμογών Κάτω περιθώριο - Page indicator height + Ύψος ένδειξης σελίδας Αναζήτηση εφαρμογών %1$s και ο εκκινητής Lawnchair έχουν συμφωνία μεριδίου εσόδων.\n\nΗ αναζήτηση μέσω του %1$s βοηθά στην υποστήριξη του Lawnchair. @@ -464,6 +469,7 @@ Στήλες συρταριού εφαρμογών Ύψος γραμμής Οριζόντιο περιθώριο + Χρώμα φόντου συρταριού εφαρμογών Απόκρυψη από το συρτάρι εφαρμογών Κρυφές εφαρμογές (%1$d) diff --git a/lawnchair/res/values-en-rCA/strings.xml b/lawnchair/res/values-en-rCA/strings.xml index 3f40715cabf..e4dd97077d4 100644 --- a/lawnchair/res/values-en-rCA/strings.xml +++ b/lawnchair/res/values-en-rCA/strings.xml @@ -21,9 +21,9 @@ Actions and Verbs --> - Solanvip1 + Preview Create - + Backup Restore Delete Reset @@ -71,6 +71,7 @@ Item removed What to show + Wallpapers To lock your phone when performing a gesture, and to open Recents via gesture, Lawnchair requires accessibility access.\n\nLawnchair doesn\'t watch any user action, though the privilege to do so is required for all accessibility services. Lawnchair discards any event sent by the system.\n\nIn order to lock your phone, or to open Recents, Lawnchair uses the performGlobalAction Accessibility service. %1$d x %2$d @@ -400,9 +401,9 @@ Use new pop-up style Use Material You\'s bouncy and slightly consolidated pop-up style Pop-up menu - Show lock button - Show system settings button - Show edit home screen button + Pop-up menu items + Edit pop-up menu items + Wallpaper quick picker Status bar Show status bar Dark status bar @@ -419,7 +420,9 @@ Remove the minimum and maximum size restrictions of widgets Show dock + Search bar settings are available when the Dock is visible. Tap to show the Dock. Search bar + Search bar settings Search bar widget Disabled Google Search bar @@ -430,10 +433,12 @@ Apply accent color Search provider Show background - Horizontal inset (Left) - Horizontal inset (Right) - Vertical inset (Top) - Vertical inset (Bottom) + Left margin + Right margin + Top margin + Bottom margin + Background color + Background opacity Pause Pause %1$s? @@ -464,6 +469,7 @@ App drawer columns Row height Horizontal padding + Background color Hide from app drawer Hidden apps (%1$d) diff --git a/lawnchair/res/values-es-rES/strings.xml b/lawnchair/res/values-es-rES/strings.xml index e924c3a15d2..acd605587aa 100644 --- a/lawnchair/res/values-es-rES/strings.xml +++ b/lawnchair/res/values-es-rES/strings.xml @@ -71,6 +71,7 @@ Se ha borrado el elemento Qué mostrar + Fondos de pantalla Para bloquear el teléfono al realizar un gesto, y para abrir Recientes mediante un gesto, Lawnchair requiere permiso de accesibilidad. \n\nLawnchair no observa ninguna acción del usuario, aunque el privilegio de hacerlo es necesario para todos los servicios de accesibilidad. Lawnchair descarta cualquier evento enviado por el sistema. \n\nPara bloquear el teléfono, o para abrir recientes, Lawnchair utiliza el servicio de accesibilidad performGlobalAction. @@ -125,7 +126,7 @@ Cuidado: Los colores de las burbujas de notificación y contadores no tienen suficiente contraste para ser legibles Cuidado: Puede que los colores de las burbujas de notificación y contadores no se lean del todo bien al ser tan parecidos Se necesita acceso a las notificaciones - Para poder ver las burbujas de notificación tienes que concedernos permiso + Para poder ver las burbujas de notificación tienes que conceder permiso a %1$s Calendario @@ -325,7 +326,7 @@ Fondo de pantalla Copia de seguridad creada No se pudo crear la copia de seguridad - Restaurar respaldo + Restaurar copia de seguridad Qué restaurar Copia de seguridad restaurada No se pudo restaurar la copia de seguridad @@ -335,7 +336,7 @@ Gesture settings --> - Doble pulsación + Doble toque Deslizar hacia arriba Deslizar hacia abajo Botón de inicio @@ -351,12 +352,12 @@ Abrir búsqueda Elegir aplicación Se necesitan permisos de administrador - Para usar el doble toque para apagar la pantalla, establece Lawnchair como una app de administrador de dispositivos. Pulsa en \"Abrir Configuración\", luego en \"Activar esta aplicación de administrador de dispositivos.\" + Para hacer que funcione el doble toque para apagar pantalla, establece Lawnchair como aplicación del administrador de dispositivos. Pulsa en «Abrir ajustes», luego en «Activar esta aplicación de administrador de dispositivos». Se desactivará el doble toque para apagar la pantalla. Activar el servicio de accesibilidad - Para utilizar el doble toque para apagar pantalla, Active el servicio de accesibilidad para Lawnchair. Presione \"abrir ajustes\", Seleccione \"Lawnchair\" y active \"Usar Lawnchair\". \n\nLawnchair utiliza el método de Accesibilidad para realizar esta acción. Este es un permiso sensible que permite supervisar otras apps. Sin embargo, Lawnchair no está configurada para esa funcionalidad y no recibe eventos. + Para hacer que funcione el doble toque para apagar pantalla activa el servicio de accesibilidad de Lawnchair. Pulsa en «Abrir ajustes», elige «Lawnchair» y activa «Usar Lawnchair». \n\nLawnchair solo utiliza el método `performGlobalAction` de la función de accesibilidad para realizar esta acción. Este es un permiso muy amplio que permite controlar otras aplicaciones, pero Lawnchair no hace nada más, ni recibe eventos. Abrir ajustes - Para utilizar el doble toque para apagar pantalla, Active el servicio de accesibilidad para Lawnchair. Presione \"abrir ajustes\", Seleccione \"Lawnchair\" y active \"Usar Lawnchair\". \n\nLawnchair utiliza el método de Accesibilidad para realizar esta acción. Este es un permiso sensible que permite supervisar otras apps. Sin embargo, Lawnchair no está configurada para esa funcionalidad y no recibe eventos. + Para hacer que funcione «Aplicaciones recientes» activa el servicio de accesibilidad de Lawnchair. Pulsa en «Abrir ajustes», elige «Lawnchair» y activa «Usar Lawnchair». \n\nLawnchair solo utiliza el método `performGlobalAction` de la función de accesibilidad para realizar esta acción. Este es un permiso muy amplio que permite controlar otras aplicaciones, pero Lawnchair no hace nada más, ni recibe eventos. - Rotación de la pantalla de inicio + Girar pantalla de inicio Permitir que la pantalla de inicio gire al hacerlo el dispositivo Desenfocar fondo de pantalla (experimental) Intensidad del desenfoque @@ -399,11 +400,11 @@ Mostrar paginación de puntos Usar puntos en vez de líneas para mostrar el número de página Usar el nuevo estilo del menú emergente - Usar el estilo de Material You animado y minimalista para los menús emergentes + Usar el estilo de «Material You» animado y minimalista para los menús emergentes Menú emergente - Mostrar botón de bloqueo - Mostrar botón de configuración del sistema - Mostrar el botón de edición de la pantalla de inicio + Elementos del menú emergente + Editar los elementos del menú emergente + Wallpaper quick picker Barra de estado Mostrar la barra de estado Barra de estado oscura @@ -420,7 +421,9 @@ Ignora las restricciones de tamaño mínimo y máximo de los widgets Mostrar dock + Los ajustes de la barra de búsqueda aparecen cuando lo hace el Dock, toca aquí para activarlo. Barra de búsqueda + Ajustes de la barra de búsqueda Widget de barra de búsqueda Desactivado Barra de búsqueda de Google @@ -430,21 +433,23 @@ Radio de esquina Aplicar acento de color Proveedor de búsqueda - Show background - Horizontal inset (Left) - Horizontal inset (Right) - Vertical inset (Top) - Vertical inset (Bottom) + Mostrar fondo + Margen izquierdo + Margen derecho + Margen superior + Margen inferior + Color de fondo + Opacidad del fondo - Pause - Pause %1$s? - Notifications for %1$s will be paused - App paused - %1$s was directly paused from the launcher - Pause app + Pausar + ¿Quieres pausar %1$s? + Se pausarán las notificaciones de %1$s + Aplicación en pausa + %1$s se ha pausado directamente desde el lanzador + Pausar aplicación Iconos del dock Relleno inferior - Page indicator height + Altura del indicador de página Búsqueda de aplicaciones %1$s y Lawnchair tienen un acuerdo de reparto de ingresos.\n\nPor lo que al buscar con %1$s nos ayudas económicamente. @@ -465,6 +470,7 @@ Columnas del cajón de aplicaciones Altura de fila Relleno horizontal + Color de fondo Ocultar del cajón de aplicaciones Aplicaciones ocultas (%1$d) @@ -519,10 +525,10 @@ Búsqueda aproximada Muestra nombres parecidos e ignora errores de escritura al buscar aplicaciones Sugerencias - Muestra las aplicaciones sugeridas siempre al principio del cajón de aplicaciones + Mostrar las aplicaciones sugeridas siempre al principio del cajón de aplicaciones Buscar en el dispositivo Busca entre tus contactos, tus archivos y en ajustes - Muestra aplicaciones ocultas entre los resultados de búsqueda + Mostrar aplicaciones ocultas entre los resultados de búsqueda Si se escribe el nombre entero Algoritmo de búsqueda Búsqueda de aplicaciones diff --git a/lawnchair/res/values-et-rEE/strings.xml b/lawnchair/res/values-et-rEE/strings.xml index fee3b1b7503..e4dd97077d4 100644 --- a/lawnchair/res/values-et-rEE/strings.xml +++ b/lawnchair/res/values-et-rEE/strings.xml @@ -71,6 +71,7 @@ Item removed What to show + Wallpapers To lock your phone when performing a gesture, and to open Recents via gesture, Lawnchair requires accessibility access.\n\nLawnchair doesn\'t watch any user action, though the privilege to do so is required for all accessibility services. Lawnchair discards any event sent by the system.\n\nIn order to lock your phone, or to open Recents, Lawnchair uses the performGlobalAction Accessibility service. %1$d x %2$d @@ -400,9 +401,9 @@ Use new pop-up style Use Material You\'s bouncy and slightly consolidated pop-up style Pop-up menu - Show lock button - Show system settings button - Show edit home screen button + Pop-up menu items + Edit pop-up menu items + Wallpaper quick picker Status bar Show status bar Dark status bar @@ -419,7 +420,9 @@ Remove the minimum and maximum size restrictions of widgets Show dock + Search bar settings are available when the Dock is visible. Tap to show the Dock. Search bar + Search bar settings Search bar widget Disabled Google Search bar @@ -430,10 +433,12 @@ Apply accent color Search provider Show background - Horizontal inset (Left) - Horizontal inset (Right) - Vertical inset (Top) - Vertical inset (Bottom) + Left margin + Right margin + Top margin + Bottom margin + Background color + Background opacity Pause Pause %1$s? @@ -464,6 +469,7 @@ App drawer columns Row height Horizontal padding + Background color Hide from app drawer Hidden apps (%1$d) diff --git a/lawnchair/res/values-fa-rIR/strings.xml b/lawnchair/res/values-fa-rIR/strings.xml index 8ce6d120f65..7d6400991c6 100644 --- a/lawnchair/res/values-fa-rIR/strings.xml +++ b/lawnchair/res/values-fa-rIR/strings.xml @@ -71,6 +71,7 @@ Item removed What to show + Wallpapers To lock your phone when performing a gesture, and to open Recents via gesture, Lawnchair requires accessibility access.\n\nLawnchair doesn\'t watch any user action, though the privilege to do so is required for all accessibility services. Lawnchair discards any event sent by the system.\n\nIn order to lock your phone, or to open Recents, Lawnchair uses the performGlobalAction Accessibility service. %1$d x %2$d @@ -400,9 +401,9 @@ Use new pop-up style Use Material You\'s bouncy and slightly consolidated pop-up style Pop-up menu - Show lock button - Show system settings button - Show edit home screen button + Pop-up menu items + Edit pop-up menu items + Wallpaper quick picker Status bar Show status bar Dark status bar @@ -419,7 +420,9 @@ Remove the minimum and maximum size restrictions of widgets Show dock + Search bar settings are available when the Dock is visible. Tap to show the Dock. Search bar + Search bar settings Search bar widget غیر فعال Google Search bar @@ -430,10 +433,12 @@ Apply accent color Search provider Show background - Horizontal inset (Left) - Horizontal inset (Right) - Vertical inset (Top) - Vertical inset (Bottom) + Left margin + Right margin + Top margin + Bottom margin + Background color + Background opacity Pause Pause %1$s? @@ -464,6 +469,7 @@ App drawer columns Row height Horizontal padding + Background color Hide from app drawer Hidden apps (%1$d) diff --git a/lawnchair/res/values-fi-rFI/strings.xml b/lawnchair/res/values-fi-rFI/strings.xml index b2c660a5998..6e54e95777a 100644 --- a/lawnchair/res/values-fi-rFI/strings.xml +++ b/lawnchair/res/values-fi-rFI/strings.xml @@ -71,6 +71,7 @@ Item removed What to show + Wallpapers To lock your phone when performing a gesture, and to open Recents via gesture, Lawnchair requires accessibility access.\n\nLawnchair doesn\'t watch any user action, though the privilege to do so is required for all accessibility services. Lawnchair discards any event sent by the system.\n\nIn order to lock your phone, or to open Recents, Lawnchair uses the performGlobalAction Accessibility service. %1$d x %2$d @@ -400,9 +401,9 @@ Use new pop-up style Use Material You\'s bouncy and slightly consolidated pop-up style Pop-up menu - Show lock button - Show system settings button - Show edit home screen button + Pop-up menu items + Edit pop-up menu items + Wallpaper quick picker Status bar Show status bar Dark status bar @@ -419,7 +420,9 @@ Remove the minimum and maximum size restrictions of widgets Show dock + Search bar settings are available when the Dock is visible. Tap to show the Dock. Search bar + Search bar settings Search bar widget Pois käytöstä Google Search bar @@ -430,10 +433,12 @@ Apply accent color Search provider Show background - Horizontal inset (Left) - Horizontal inset (Right) - Vertical inset (Top) - Vertical inset (Bottom) + Left margin + Right margin + Top margin + Bottom margin + Background color + Background opacity Pause Pause %1$s? @@ -464,6 +469,7 @@ App drawer columns Row height Horizontal padding + Background color Hide from app drawer Hidden apps (%1$d) diff --git a/lawnchair/res/values-fil-rPH/strings.xml b/lawnchair/res/values-fil-rPH/strings.xml index de3445cfc0d..2638ec6deb6 100644 --- a/lawnchair/res/values-fil-rPH/strings.xml +++ b/lawnchair/res/values-fil-rPH/strings.xml @@ -71,6 +71,7 @@ Item removed What to show + Wallpapers To lock your phone when performing a gesture, and to open Recents via gesture, Lawnchair requires accessibility access.\n\nLawnchair doesn\'t watch any user action, though the privilege to do so is required for all accessibility services. Lawnchair discards any event sent by the system.\n\nIn order to lock your phone, or to open Recents, Lawnchair uses the performGlobalAction Accessibility service. %1$d x %2$d @@ -400,9 +401,9 @@ Use new pop-up style Use Material You\'s bouncy and slightly consolidated pop-up style Pop-up menu - Show lock button - Show system settings button - Show edit home screen button + Pop-up menu items + Edit pop-up menu items + Wallpaper quick picker Status bar Show status bar Dark status bar @@ -419,7 +420,9 @@ Remove the minimum and maximum size restrictions of widgets Show dock + Search bar settings are available when the Dock is visible. Tap to show the Dock. Search bar + Search bar settings Search bar widget Disabled Google Search bar @@ -430,10 +433,12 @@ Apply accent color Search provider Show background - Horizontal inset (Left) - Horizontal inset (Right) - Vertical inset (Top) - Vertical inset (Bottom) + Left margin + Right margin + Top margin + Bottom margin + Background color + Background opacity Pause Pause %1$s? @@ -464,6 +469,7 @@ App drawer columns Row height Horizontal padding + Background color Hide from app drawer Hidden apps (%1$d) diff --git a/lawnchair/res/values-fr-rFR/strings.xml b/lawnchair/res/values-fr-rFR/strings.xml index 24b028c86fa..f3d2a472b33 100644 --- a/lawnchair/res/values-fr-rFR/strings.xml +++ b/lawnchair/res/values-fr-rFR/strings.xml @@ -71,6 +71,7 @@ Élément supprimé Informations à afficher + Fonds d\'écran Pour pouvoir verrouiller votre téléphone et ouvrir Récents en un seul geste, Lawnchair a besoin des droits d\'accessibilité.\n\nLawnchair n\'observe aucune action utilisateur, mais ce privilège est accordé à tous les services d\'accessibilité. Lawnchair rejette tout événement envoyé par le système.\n\nAfin de verrouiller votre téléphone ou ouvrir Récents, Lawnchair utilise le service d\'accessibilité performGlobalAction. %1$d x %2$d @@ -400,9 +401,9 @@ Utiliser le nouveau style de pop-up Utiliser le style de pop-up Material You Menu pop-up - Afficher le bouton Verrouiller - Afficher le bouton Paramètres du système - Afficher le bouton Modifier l\'écran d\'accueil + Éléments du menu pop-up + Modifier les éléments du menu pop-up + Wallpaper quick picker Barre d\'état Afficher la barre d\'état Barre d\'état sombre @@ -419,7 +420,9 @@ Supprimer les restrictions de taille minimale et maximale des widgets Afficher le dock + Les paramètres de la barre de recherche sont disponibles lorsque le dock est visible. Appuyez pour afficher le dock. Barre de recherche + Paramètres de la barre de recherche Widget Barre de recherche Désactivé Barre de recherche Google @@ -430,20 +433,22 @@ Appliquer la couleur d\'accentuation Fournisseur des résultats de recherche Afficher l\'arrière-plan - Marge horizontale (gauche) - Marge horizontale (droite) - Marge verticale (haut) - Marge verticale (bas) + Marge gauche + Marge droite + Marge haut + Marge bas + Couleur d\'arrière-plan + Opacité de l\'arrière-plan - Pause - Pause %1$s? - Notifications for %1$s will be paused - App paused - %1$s was directly paused from the launcher - Pause app + Suspendre + Suspendre %1$s ? + Les notifications de %1$s seront suspendues + Appli suspendue + %1$s a été suspendu à partir du lanceur d\'applications + Suspendre l\'appli Icônes dans le dock Décalage vers le haut - Page indicator height + Hauteur de l\'indicateur de page Recherche d\'applications Lawnchair a un accord de partage des revenus avec %1$s.\n\nEn effectuant vos recherches avec %1$s, vous soutenez Lawnchair. @@ -464,6 +469,7 @@ Colonnes du tiroir d\'applications Hauteur de ligne Décalage vers le centre + Couleur d\'arrière-plan Masquer dans le tiroir d\'applications Applications masquées (%1$d) diff --git a/lawnchair/res/values-gl-rES/strings.xml b/lawnchair/res/values-gl-rES/strings.xml index ff638771986..9390ede10b2 100644 --- a/lawnchair/res/values-gl-rES/strings.xml +++ b/lawnchair/res/values-gl-rES/strings.xml @@ -71,6 +71,7 @@ Item removed What to show + Wallpapers To lock your phone when performing a gesture, and to open Recents via gesture, Lawnchair requires accessibility access.\n\nLawnchair doesn\'t watch any user action, though the privilege to do so is required for all accessibility services. Lawnchair discards any event sent by the system.\n\nIn order to lock your phone, or to open Recents, Lawnchair uses the performGlobalAction Accessibility service. %1$d x %2$d @@ -400,9 +401,9 @@ Use new pop-up style Use Material You\'s bouncy and slightly consolidated pop-up style Pop-up menu - Show lock button - Show system settings button - Show edit home screen button + Pop-up menu items + Edit pop-up menu items + Wallpaper quick picker Status bar Show status bar Dark status bar @@ -419,7 +420,9 @@ Remove the minimum and maximum size restrictions of widgets Show dock + Search bar settings are available when the Dock is visible. Tap to show the Dock. Search bar + Search bar settings Search bar widget Disabled Google Search bar @@ -430,10 +433,12 @@ Apply accent color Search provider Show background - Horizontal inset (Left) - Horizontal inset (Right) - Vertical inset (Top) - Vertical inset (Bottom) + Left margin + Right margin + Top margin + Bottom margin + Background color + Background opacity Pause Pause %1$s? @@ -464,6 +469,7 @@ App drawer columns Row height Horizontal padding + Background color Hide from app drawer Hidden apps (%1$d) diff --git a/lawnchair/res/values-hi-rIN/strings.xml b/lawnchair/res/values-hi-rIN/strings.xml index a0aeda4bab5..289a0e121cc 100644 --- a/lawnchair/res/values-hi-rIN/strings.xml +++ b/lawnchair/res/values-hi-rIN/strings.xml @@ -71,6 +71,7 @@ आइटम हटाया गया क्या दिखाएं? + Wallpapers जेस्चर करते समय अपने फ़ोन को लॉक करने के लिए, और जेस्चर के ज़रिए हाल ही में खोलने के लिए, लॉनचेयर को एक्सेसिबिलिटी एक्सेस की आवश्यकता होती है।\n\nलॉनचेयर किसी भी उपयोगकर्ता की कार्रवाई को नहीं देखता है, हालाँकि ऐसा करने का विशेषाधिकार सभी एक्सेसिबिलिटी सेवाओं के लिए आवश्यक है। लॉनचेयर सिस्टम द्वारा भेजे गए किसी भी ईवेंट को त्याग देता है।\n\n लॉनचेयर आपके फ़ोन को लॉक करने या हाल ही में खोलने के लिए परफ़ॉर्मग्लोबलएक्शन एक्सेसिबिलिटी सेवा का उपयोग करता है। %1$d x %2$d @@ -400,9 +401,9 @@ Use new pop-up style Use Material You\'s bouncy and slightly consolidated pop-up style Pop-up menu - Show lock button - Show system settings button - Show edit home screen button + Pop-up menu items + Edit pop-up menu items + Wallpaper quick picker Status bar Show status bar Dark status bar @@ -419,7 +420,9 @@ Remove the minimum and maximum size restrictions of widgets Show dock + Search bar settings are available when the Dock is visible. Tap to show the Dock. Search bar + Search bar settings Search bar widget अक्षम करें Google Search bar @@ -430,10 +433,12 @@ Apply accent color Search provider Show background - Horizontal inset (Left) - Horizontal inset (Right) - Vertical inset (Top) - Vertical inset (Bottom) + Left margin + Right margin + Top margin + Bottom margin + Background color + पृष्ठभूमि अपारदर्शिता Pause Pause %1$s? @@ -464,6 +469,7 @@ App drawer columns Row height Horizontal padding + Background color Hide from app drawer Hidden apps (%1$d) diff --git a/lawnchair/res/values-hr-rHR/strings.xml b/lawnchair/res/values-hr-rHR/strings.xml index 2a92ee38f45..42ce2dd3ec5 100644 --- a/lawnchair/res/values-hr-rHR/strings.xml +++ b/lawnchair/res/values-hr-rHR/strings.xml @@ -71,6 +71,7 @@ Stavka uklonjena Što prikazati + Wallpapers Kako biste otključali telefon ili otvorili Nedavno putem pokreta, Lawnchair zahtijeva pristup značajkama pristupačnosti.\n\nLawnchair ne prati nikakvu radnju korisnika, iako je odobrenje za to potrebno za sve usluge pristupačnosti. Lawnchair odbacuje svaki događaj koji šalje sustav.\n\nKako bi zaključao vaš telefon ili otvorio Nedavno, Lawnchair koristi uslugu pristupačnosti performGlobalAction. %1$d x %2$d @@ -400,9 +401,9 @@ Use new pop-up style Use Material You\'s bouncy and slightly consolidated pop-up style Pop-up menu - Show lock button - Show system settings button - Show edit home screen button + Pop-up menu items + Edit pop-up menu items + Wallpaper quick picker Status bar Show status bar Dark status bar @@ -419,7 +420,9 @@ Remove the minimum and maximum size restrictions of widgets Show dock + Search bar settings are available when the Dock is visible. Tap to show the Dock. Search bar + Search bar settings Search bar widget Disabled Google Search bar @@ -430,10 +433,12 @@ Apply accent color Search provider Show background - Horizontal inset (Left) - Horizontal inset (Right) - Vertical inset (Top) - Vertical inset (Bottom) + Left margin + Right margin + Top margin + Bottom margin + Background color + Prozirnost pozadine Pause Pause %1$s? @@ -464,6 +469,7 @@ App drawer columns Row height Horizontal padding + Background color Hide from app drawer Hidden apps (%1$d) diff --git a/lawnchair/res/values-hu-rHU/strings.xml b/lawnchair/res/values-hu-rHU/strings.xml index b17540f3b91..0301807f52f 100644 --- a/lawnchair/res/values-hu-rHU/strings.xml +++ b/lawnchair/res/values-hu-rHU/strings.xml @@ -71,6 +71,7 @@ Elem eltávolítva Mi jelenjen meg + Háttérképek A telefon zárolásához kézmozdulat végrehajtása közben, illetve az Előzmények gesztussal történő megnyitásához a Lawnchair kisegítő hozzáférést igényel.\n\nA Lawnchair nem figyel semmilyen felhasználói műveletet, bár az ehhez szükséges jogosultság minden kisegítő lehetőséghez szükséges. A Lawnchair nem rögzít rendszer által küldött eseményeket.\n\nA telefon zárolásához vagy az Előzmények megnyitásához a Lawnchair a performGlobalAction akadálymentesítési szolgáltatást használja. %1$d × %2$d @@ -400,9 +401,9 @@ Az új felugró ablakstílus használata Egy lendületes és konszolidált pop-up stílus (Material You) Felugró menü - Látható \'Lezárás\' gomb - Látható \'Rendszerbeállítások\' gomb - Látható \'Kezdőképernyő szerkesztő\' gomb + Felugrómenü-elemek + A felugrómenü-elemek szerkesztése + Wallpaper quick picker Állapotsor Látható \'Állapotsor\' Sötét \'Állapotsor\' @@ -419,7 +420,9 @@ Eltávolítja a kisalkalmazások minimális és maximális méretkorlátozását Látható dokk + A keresősáv beállításai akkor érhetők el, ha a Dokk látható. Érintse meg a Dokk megjelenítéséhez. Keresősor + A keresősáv beállításai Kisalkalmazás a kereséshez Letiltva Google Keresősor @@ -430,20 +433,22 @@ A kiemelőszín alkalmazása Keresési szolgáltató Háttér-megjelenítés - Vízszintes szegély (Bal) - Vízszintes szegély (Jobb) - Függőleges szegély (Felső) - Függőleges szegély (Alsó) + Bal margó + Jobb margó + Felső margó + Alsó margó + Háttérszín + A háttér átlátszósága - Pause - Pause %1$s? - Notifications for %1$s will be paused - App paused - %1$s was directly paused from the launcher - Pause app + Szüneteltetés + %1$s szüneteltetése? + %1$s-értesítések felfüggesztésre kerülnek + Az alkalmazás felfüggesztve + %1$s közvetlenül szüneteltetve a Launcherből + Alkalmazás-szüneteltetés A Dokk ikonjai Alsó kitöltés - Page indicator height + Az oldaljelzés magassága Alkalmazáskereső %1$s és a Lawnchair bevételmegosztási megállapodást kötött.\n\nHa %1$s végzi a keresést, azzal segít a Lawnchair-nek is. @@ -464,6 +469,7 @@ Az Alkalmazástár oszlopai Sormagasság Vízszintes kitöltés + Háttérszín Elrejtés az Alkalmazástárban Rejtett alkalmazások (%1$d) diff --git a/lawnchair/res/values-in-rID/strings.xml b/lawnchair/res/values-in-rID/strings.xml index c33760b1376..bb3d563bca7 100644 --- a/lawnchair/res/values-in-rID/strings.xml +++ b/lawnchair/res/values-in-rID/strings.xml @@ -71,6 +71,7 @@ Butir dihapus Yang ditampilkan + Wallpaper Untuk mengunci layar dan membuka aplikasi Terbaru dengan gerakan, Lawnchair perlu izin aksesibilitas.\n\nLawnchair tidak melacak apa yang Anda lakukan di ponsel. Izin ini hanya digunakan untuk mengaktifkan gerakan-gerakan tersebut.\n\nLawnchair menggunakan fitur aksesibilitas performGlobalAction untuk mengunci layar atau membuka aplikasi Terbaru. %1$d × %2$d @@ -400,9 +401,9 @@ Gunakan gaya pop-up baru Gunakan gaya pop-up Material You yang bulat dan sedikit terkonsolidasi Gaya pop-up - Tampilkan tombol kunci - Tampilkan tombol pengaturan sistem - Tampilkan tombol ubah tampilan utama + Pop-up menu items + Edit pop-up menu items + Wallpaper quick picker Bar status Tampilkan bar status Bar status gelap @@ -419,7 +420,9 @@ Menghapus batasan ukuran minimum dan maksimum widget Tampilkan dok + Pengaturan bilah pencarian hanya tersedia bila Dok ditampilkan. Ketuk untuk menampilkan Dok. Bilah pencarian + Pengaturan bilah pencarian Widget bilah pencarian Dimatikan Bilah Penelusuran Google @@ -430,10 +433,12 @@ Terapkan warna aksen Penyedia pencarian Show background - Horizontal inset (Left) - Horizontal inset (Right) - Vertical inset (Top) - Vertical inset (Bottom) + Margin kiri + Margin kanan + Margin atas + Margin bawah + Background color + Tingkat transparan latar belakang Jeda Jeda %1$s? @@ -464,6 +469,7 @@ Kolom laci apli Tinggi baris Padding horizontal + Background color Sembunyikan dari laci apli Apli tersembunyi (%1$d) diff --git a/lawnchair/res/values-it-rIT/strings.xml b/lawnchair/res/values-it-rIT/strings.xml index 26c074a8cc4..f7741ee8c36 100644 --- a/lawnchair/res/values-it-rIT/strings.xml +++ b/lawnchair/res/values-it-rIT/strings.xml @@ -71,6 +71,7 @@ Elemento rimosso Cosa mostrare + Sfondi Per bloccare il telefono quando si esegue un gesto e per aprire Recenti tramite gesto, Lawnchair richiede l\'accesso all\'accessibilità.\n\nLawnchair non monitora alcuna azione dell\'utente, sebbene il privilegio per farlo sia richiesto per tutti i servizi di accessibilità. Lawnchair ignora qualsiasi evento inviato dal sistema.\n\nPer bloccare il telefono o per aprire Recenti, Lawnchair utilizza il servizio di accessibilità performGlobalAction. %1$d × %2$d @@ -400,9 +401,9 @@ Usa il nuovo stile popup Usa lo stile popup di Material You, elastico e leggermente consolidato Menu popup - Mostra il pulsante di blocco - Mostra il pulsante delle impostazioni di sistema - Mostra il pulsante di modifica della schermata home + Voci del menu a comparsa + Modifica le voci del menu a comparsa + Selettore rapido sfondo Barra di stato Mostra la barra di stato Barra di stato a tema scuro @@ -419,7 +420,9 @@ Rimuovi le restrizioni di dimensione minima e massima dei widget Mostra la dock + Search bar settings are available when the Dock is visible. Tap to show the Dock. Barra di ricerca + Search bar settings Widget della barra di ricerca Disabilitato Barra di ricerca Google @@ -430,10 +433,12 @@ Applica il colore primario Fornitore di ricerca Mostra sfondo - Inset orizzontale (sinistra) - Inset orizzontale (destra) - Inset verticale (Sopra) - Inset verticale (Sotto) + Left margin + Right margin + Top margin + Bottom margin + Colore di sfondo + Opacità dello sfondo Sospendi Sospendere %1$s? @@ -464,6 +469,7 @@ Colonne nel menu delle app Altezza delle righe Margine orizzontale + Colore di sfondo Nascondi dal menu delle app App nascoste (%1$d) diff --git a/lawnchair/res/values-iw-rIL/strings.xml b/lawnchair/res/values-iw-rIL/strings.xml index 06757735029..49437b1eb4b 100644 --- a/lawnchair/res/values-iw-rIL/strings.xml +++ b/lawnchair/res/values-iw-rIL/strings.xml @@ -71,6 +71,7 @@ Item removed What to show + Wallpapers To lock your phone when performing a gesture, and to open Recents via gesture, Lawnchair requires accessibility access.\n\nLawnchair doesn\'t watch any user action, though the privilege to do so is required for all accessibility services. Lawnchair discards any event sent by the system.\n\nIn order to lock your phone, or to open Recents, Lawnchair uses the performGlobalAction Accessibility service. %1$d x %2$d @@ -400,9 +401,9 @@ Use new pop-up style Use Material You\'s bouncy and slightly consolidated pop-up style Pop-up menu - Show lock button - Show system settings button - Show edit home screen button + Pop-up menu items + Edit pop-up menu items + Wallpaper quick picker Status bar Show status bar Dark status bar @@ -419,7 +420,9 @@ Remove the minimum and maximum size restrictions of widgets Show dock + Search bar settings are available when the Dock is visible. Tap to show the Dock. Search bar + Search bar settings Search bar widget השבת Google Search bar @@ -430,10 +433,12 @@ Apply accent color Search provider Show background - Horizontal inset (Left) - Horizontal inset (Right) - Vertical inset (Top) - Vertical inset (Bottom) + Left margin + Right margin + Top margin + Bottom margin + Background color + Background opacity Pause Pause %1$s? @@ -464,6 +469,7 @@ App drawer columns Row height Horizontal padding + Background color Hide from app drawer Hidden apps (%1$d) diff --git a/lawnchair/res/values-ja-rJP/strings.xml b/lawnchair/res/values-ja-rJP/strings.xml index 52c9d8ae3e3..649bf2687a8 100644 --- a/lawnchair/res/values-ja-rJP/strings.xml +++ b/lawnchair/res/values-ja-rJP/strings.xml @@ -71,6 +71,7 @@ アイテムを削除しました 表示する項目 + Wallpapers To lock your phone when performing a gesture, and to open Recents via gesture, Lawnchair requires accessibility access.\n\nLawnchair doesn\'t watch any user action, though the privilege to do so is required for all accessibility services. Lawnchair discards any event sent by the system.\n\nIn order to lock your phone, or to open Recents, Lawnchair uses the performGlobalAction Accessibility service. %1$d × %2$d @@ -400,9 +401,9 @@ 新しいポップアップスタイルを使用する Use Material You\'s bouncy and slightly consolidated pop-up style ポップアップメニュー - ロックボタンを表示 - システムの設定ボタンを表示 - ホーム画面の編集ボタンを表示 + Pop-up menu items + Edit pop-up menu items + Wallpaper quick picker ステータスバー ステータスバーを表示 ダークステータスバー @@ -419,7 +420,9 @@ Remove the minimum and maximum size restrictions of widgets ドックを表示 + Search bar settings are available when the Dock is visible. Tap to show the Dock. 検索バー + Search bar settings 検索バーウィジェット 無効 Google 検索バー @@ -430,10 +433,12 @@ アクセントカラーを適用 検索プロバイダー Show background - Horizontal inset (Left) - Horizontal inset (Right) - Vertical inset (Top) - Vertical inset (Bottom) + Left margin + Right margin + Top margin + Bottom margin + Background color + 背景の透明度 Pause Pause %1$s? @@ -464,6 +469,7 @@ アプリドロワーの列数 Row height Horizontal padding + Background color アプリドロワーから隠す 隠したアプリ (%1$d) diff --git a/lawnchair/res/values-ka-rGE/strings.xml b/lawnchair/res/values-ka-rGE/strings.xml index 8305987f8cd..bd3b67de946 100644 --- a/lawnchair/res/values-ka-rGE/strings.xml +++ b/lawnchair/res/values-ka-rGE/strings.xml @@ -71,6 +71,7 @@ ხატულა მოშლილია რა ვავენო + Wallpapers To lock your phone when performing a gesture, and to open Recents via gesture, Lawnchair requires accessibility access.\n\nLawnchair doesn\'t watch any user action, though the privilege to do so is required for all accessibility services. Lawnchair discards any event sent by the system.\n\nIn order to lock your phone, or to open Recents, Lawnchair uses the performGlobalAction Accessibility service. %1$d x %2$d @@ -400,9 +401,9 @@ Use new pop-up style Use Material You\'s bouncy and slightly consolidated pop-up style Pop-up menu - Show lock button - Show system settings button - Show edit home screen button + Pop-up menu items + Edit pop-up menu items + Wallpaper quick picker Status bar Show status bar Dark status bar @@ -419,7 +420,9 @@ Remove the minimum and maximum size restrictions of widgets Show dock + Search bar settings are available when the Dock is visible. Tap to show the Dock. Search bar + Search bar settings Search bar widget Disabled Google Search bar @@ -430,10 +433,12 @@ Apply accent color Search provider Show background - Horizontal inset (Left) - Horizontal inset (Right) - Vertical inset (Top) - Vertical inset (Bottom) + Left margin + Right margin + Top margin + Bottom margin + Background color + ფონის გამჭვირვალობა Pause Pause %1$s? @@ -464,6 +469,7 @@ App drawer columns Row height Horizontal padding + Background color Hide from app drawer Hidden apps (%1$d) diff --git a/lawnchair/res/values-kmr-rTR/strings.xml b/lawnchair/res/values-kmr-rTR/strings.xml index 94d456dfd14..fcf9307e537 100644 --- a/lawnchair/res/values-kmr-rTR/strings.xml +++ b/lawnchair/res/values-kmr-rTR/strings.xml @@ -71,6 +71,7 @@ Item removed What to show + Wallpapers To lock your phone when performing a gesture, and to open Recents via gesture, Lawnchair requires accessibility access.\n\nLawnchair doesn\'t watch any user action, though the privilege to do so is required for all accessibility services. Lawnchair discards any event sent by the system.\n\nIn order to lock your phone, or to open Recents, Lawnchair uses the performGlobalAction Accessibility service. %1$d x %2$d @@ -400,9 +401,9 @@ Use new pop-up style Use Material You\'s bouncy and slightly consolidated pop-up style Pop-up menu - Show lock button - Show system settings button - Show edit home screen button + Pop-up menu items + Edit pop-up menu items + Wallpaper quick picker Status bar Show status bar Dark status bar @@ -419,7 +420,9 @@ Remove the minimum and maximum size restrictions of widgets Show dock + Search bar settings are available when the Dock is visible. Tap to show the Dock. Search bar + Search bar settings Search bar widget Disabled Google Search bar @@ -430,10 +433,12 @@ Apply accent color Search provider Show background - Horizontal inset (Left) - Horizontal inset (Right) - Vertical inset (Top) - Vertical inset (Bottom) + Left margin + Right margin + Top margin + Bottom margin + Background color + Background opacity Pause Pause %1$s? @@ -464,6 +469,7 @@ App drawer columns Row height Horizontal padding + Background color Hide from app drawer Hidden apps (%1$d) diff --git a/lawnchair/res/values-ko-rKR/strings.xml b/lawnchair/res/values-ko-rKR/strings.xml index 5f09f408799..d65e445ae95 100644 --- a/lawnchair/res/values-ko-rKR/strings.xml +++ b/lawnchair/res/values-ko-rKR/strings.xml @@ -71,6 +71,7 @@ 항목을 삭제했습니다. 표시할 항목 + Wallpapers Lawnchair에서 제스처로 기기를 잠그거나 최근 앱 화면을 열기 위해서는 접근성 권한이 필요합니다.\n\n모든 접근성 서비스에는 대화 상자에 나오는 권한이 필요합니다. Lawnchair는 사용자의 동작을 전혀 감시하지 않으며, 시스템에서 보내는 이벤트를 모두 무시합니다.\n\nLawnchair는 기기를 잠그거나 최근 앱 화면을 열기 위해 접근성 서비스의 performGlobalAction 메소드를 사용합니다. %1$d x %2$d @@ -400,9 +401,9 @@ 새로운 팝업 스타일 사용 Material You의 탄력 있고 통합된 팝업 스타일 사용 팝업 메뉴 - 잠그기 버튼 표시 - 시스템 설정 버튼 표시 - 홈 화면 편집 버튼 표시 + Pop-up menu items + Edit pop-up menu items + Wallpaper quick picker 상태 표시줄 상태 표시줄 표시 어두운 상태 표시줄 @@ -419,7 +420,9 @@ 위젯의 최소 및 최대 크기 제한 제거 독 표시 + Search bar settings are available when the Dock is visible. Tap to show the Dock. 검색 표시줄 + Search bar settings 검색 표시줄 위젯 비활성화됨 Google 검색 표시줄 @@ -430,10 +433,12 @@ 강조 색상 적용 검색 제공자 Show background - Horizontal inset (Left) - Horizontal inset (Right) - Vertical inset (Top) - Vertical inset (Bottom) + Left margin + Right margin + Top margin + Bottom margin + Background color + 배경 투명도 Pause Pause %1$s? @@ -464,6 +469,7 @@ 앱 서랍 아이콘 가로 배치 수 가로 행 높이 가로 패딩 + Background color 앱 서랍에서 숨기기 숨겨진 앱 (%1$d) diff --git a/lawnchair/res/values-lt-rLT/strings.xml b/lawnchair/res/values-lt-rLT/strings.xml index 4e9c79e0c17..8432b239efd 100644 --- a/lawnchair/res/values-lt-rLT/strings.xml +++ b/lawnchair/res/values-lt-rLT/strings.xml @@ -71,6 +71,7 @@ Elementas pašalintas Ką rodyti + Wallpapers To lock your phone when performing a gesture, and to open Recents via gesture, Lawnchair requires accessibility access.\n\nLawnchair doesn\'t watch any user action, though the privilege to do so is required for all accessibility services. Lawnchair discards any event sent by the system.\n\nIn order to lock your phone, or to open Recents, Lawnchair uses the performGlobalAction Accessibility service. %1$d x %2$d @@ -400,9 +401,9 @@ Use new pop-up style Use Material You\'s bouncy and slightly consolidated pop-up style Pop-up menu - Show lock button - Show system settings button - Show edit home screen button + Pop-up menu items + Edit pop-up menu items + Wallpaper quick picker Status bar Show status bar Dark status bar @@ -419,7 +420,9 @@ Remove the minimum and maximum size restrictions of widgets Show dock + Search bar settings are available when the Dock is visible. Tap to show the Dock. Search bar + Search bar settings Search bar widget Išjungta Google Search bar @@ -430,10 +433,12 @@ Apply accent color Search provider Show background - Horizontal inset (Left) - Horizontal inset (Right) - Vertical inset (Top) - Vertical inset (Bottom) + Left margin + Right margin + Top margin + Bottom margin + Background color + Fono skaidrumas Pause Pause %1$s? @@ -464,6 +469,7 @@ App drawer columns Row height Horizontal padding + Background color Hide from app drawer Hidden apps (%1$d) diff --git a/lawnchair/res/values-ml-rIN/strings.xml b/lawnchair/res/values-ml-rIN/strings.xml index 490d651fa77..82e8fcd4697 100644 --- a/lawnchair/res/values-ml-rIN/strings.xml +++ b/lawnchair/res/values-ml-rIN/strings.xml @@ -71,6 +71,7 @@ Item removed What to show + Wallpapers To lock your phone when performing a gesture, and to open Recents via gesture, Lawnchair requires accessibility access.\n\nLawnchair doesn\'t watch any user action, though the privilege to do so is required for all accessibility services. Lawnchair discards any event sent by the system.\n\nIn order to lock your phone, or to open Recents, Lawnchair uses the performGlobalAction Accessibility service. %1$d x %2$d @@ -400,9 +401,9 @@ Use new pop-up style Use Material You\'s bouncy and slightly consolidated pop-up style Pop-up menu - Show lock button - Show system settings button - Show edit home screen button + Pop-up menu items + Edit pop-up menu items + Wallpaper quick picker Status bar Show status bar Dark status bar @@ -419,7 +420,9 @@ Remove the minimum and maximum size restrictions of widgets Show dock + Search bar settings are available when the Dock is visible. Tap to show the Dock. Search bar + Search bar settings Search bar widget Disabled Google Search bar @@ -430,10 +433,12 @@ Apply accent color Search provider Show background - Horizontal inset (Left) - Horizontal inset (Right) - Vertical inset (Top) - Vertical inset (Bottom) + Left margin + Right margin + Top margin + Bottom margin + Background color + Background opacity Pause Pause %1$s? @@ -464,6 +469,7 @@ App drawer columns Row height Horizontal padding + Background color Hide from app drawer Hidden apps (%1$d) diff --git a/lawnchair/res/values-mr-rIN/strings.xml b/lawnchair/res/values-mr-rIN/strings.xml index 15c7faf1420..2f4cfed1889 100644 --- a/lawnchair/res/values-mr-rIN/strings.xml +++ b/lawnchair/res/values-mr-rIN/strings.xml @@ -71,6 +71,7 @@ Item removed What to show + Wallpapers To lock your phone when performing a gesture, and to open Recents via gesture, Lawnchair requires accessibility access.\n\nLawnchair doesn\'t watch any user action, though the privilege to do so is required for all accessibility services. Lawnchair discards any event sent by the system.\n\nIn order to lock your phone, or to open Recents, Lawnchair uses the performGlobalAction Accessibility service. %1$d x %2$d @@ -400,9 +401,9 @@ Use new pop-up style Use Material You\'s bouncy and slightly consolidated pop-up style Pop-up menu - Show lock button - Show system settings button - Show edit home screen button + Pop-up menu items + Edit pop-up menu items + Wallpaper quick picker Status bar Show status bar Dark status bar @@ -419,7 +420,9 @@ Remove the minimum and maximum size restrictions of widgets Show dock + Search bar settings are available when the Dock is visible. Tap to show the Dock. Search bar + Search bar settings Search bar widget Disabled Google Search bar @@ -430,10 +433,12 @@ Apply accent color Search provider Show background - Horizontal inset (Left) - Horizontal inset (Right) - Vertical inset (Top) - Vertical inset (Bottom) + Left margin + Right margin + Top margin + Bottom margin + Background color + Background opacity Pause Pause %1$s? @@ -464,6 +469,7 @@ App drawer columns Row height Horizontal padding + Background color Hide from app drawer Hidden apps (%1$d) diff --git a/lawnchair/res/values-nl-rNL/strings.xml b/lawnchair/res/values-nl-rNL/strings.xml index 2357b2065c0..d19756ecbdf 100644 --- a/lawnchair/res/values-nl-rNL/strings.xml +++ b/lawnchair/res/values-nl-rNL/strings.xml @@ -71,6 +71,7 @@ Item verwijderd Weergeven + Achtergrond Om je telefoon te vergrendelen tijdens het uitvoeren van een gebaar en om Recente apps via een gebaar te openen, heeft Lawnchair toegankelijkheidsrechten nodig.\n\nLawnchair kijkt niet naar gebruikersacties, hoewel het recht om dit te doen vereist is voor alle toegankelijkheidsservices. Lawnchair verwijdert elke gebeurtenis die door het systeem wordt verzonden.\n\nOm je telefoon te kunnen vergrendelen of Recente apps te openen, maakt Lawnchair gebruik van de toegankelijkheidsservice performGlobalAction. %1$d x %2$d @@ -400,9 +401,9 @@ Nieuwe pop-upstijl gebruiken Material You\'s stuiterende en enigszins geconsolideerde pop-upstijl gebruiken Pop-upmenu - Knop Vergrendelen weergeven - Knop Systeeminstellingen weergeven - Knop voor bewerken startscherm weergeven + Pop-up menu-items + Pop-up menu-items bewerken + Achtergrond-snelkiezer Statusbalk Statusbalk weergeven Donkere statusbalk @@ -419,7 +420,9 @@ Beperkingen van min/max grootte van widgets verwijderen Dok weergeven + Zoekbalkinstellingen zijn beschikbaar wanneer het dok zichtbaar is. Tik om het dok te tonen. Zoekbalk + Zoekbalkinstellingen Zoekbalkwidget Uitgeschakeld Google Zoekbalk @@ -430,10 +433,12 @@ Accentkleur toepassen Zoekmachine Achtergrond weergeven - Horizontale inset (links) - Horizontale inset (rechts) - Verticale inset (boven) - Verticale inset (onder) + Afstand links + Afstand rechts + Afstand boven + Afstand onder + Achtergrondkleur + Achtergronddekking Pauzeren %1$s pauzeren? @@ -464,6 +469,7 @@ App-lade kolommen Rijhoogte Horizontale tussenruimte + Achtergrondkleur Verbergen in app-lade Verborgen apps (%1$d) diff --git a/lawnchair/res/values-no-rNO/strings.xml b/lawnchair/res/values-no-rNO/strings.xml index 67665198a40..c197f5342c5 100644 --- a/lawnchair/res/values-no-rNO/strings.xml +++ b/lawnchair/res/values-no-rNO/strings.xml @@ -71,6 +71,7 @@ Objekt fjernet Hva som skal vises + Wallpapers For å låse telefonen når du gjør en bevegelse %1$d x %2$d @@ -400,9 +401,9 @@ Bruk ny pop-opp stil Bruk Material You\'s spenstige og litt konsoliderte pop-up-stil Popp-opp meny - Vis låseknapp - Vis systeminstillinger-knapp - Vis rediger hjemskjerm-knapp + Pop-up menu items + Edit pop-up menu items + Wallpaper quick picker Statuslinje Vis statuslinje Mørk statuslinje @@ -419,7 +420,9 @@ Fjern minimums- og maksimumsstørrelsesbegrensningene for widgets Vis dokk + Search bar settings are available when the Dock is visible. Tap to show the Dock. Søkefelt + Search bar settings Søkefelt widget Deaktivert Google søkefelt @@ -430,10 +433,12 @@ Bruk uthevingsfarge Søkeleverandør Show background - Horizontal inset (Left) - Horizontal inset (Right) - Vertical inset (Top) - Vertical inset (Bottom) + Left margin + Right margin + Top margin + Bottom margin + Background color + Gjennomsiktighet bakgrunn Pause Pause %1$s? @@ -464,6 +469,7 @@ Appskuffkolonner Radhøyde Horisontalt fyll + Background color Skul fra appskuff Skjulte apper (%1$d) diff --git a/lawnchair/res/values-pl-rPL/strings.xml b/lawnchair/res/values-pl-rPL/strings.xml index d8c3f3bca11..cfc82a7c61c 100644 --- a/lawnchair/res/values-pl-rPL/strings.xml +++ b/lawnchair/res/values-pl-rPL/strings.xml @@ -71,6 +71,7 @@ Element usunięty Co wyświetlić + Wallpapers To lock your phone when performing a gesture, and to open Recents via gesture, Lawnchair requires accessibility access.\n\nLawnchair doesn\'t watch any user action, though the privilege to do so is required for all accessibility services. Lawnchair discards any event sent by the system.\n\nIn order to lock your phone, or to open Recents, Lawnchair uses the performGlobalAction Accessibility service. %1$d x %2$d @@ -400,9 +401,9 @@ Używaj nowego stylu wyskakującego menu Używaj sprężystego i bardziej kompaktowego stylu wyskakującego menu Material You Wyskakujące menu - Pokazuj przycisk blokady - Pokaż przycisk ustawień systemu - Pokaż przycisk edycji ekranu głównego + Pop-up menu items + Edit pop-up menu items + Wallpaper quick picker Pasek stanu Pokaż pasek stanu Ciemny pasek stanu @@ -419,7 +420,9 @@ Usuwa ograniczenia minimalnego i maksymalnego rozmiaru widżetów Pokaż dock + Search bar settings are available when the Dock is visible. Tap to show the Dock. Pasek wyszukiwania + Search bar settings Widżet paska wyszukiwania Wyłączono Pasek wyszukiwania Google @@ -430,10 +433,12 @@ Zastosuj kolor akcentu Silnik wyszukiwania Show background - Horizontal inset (Left) - Horizontal inset (Right) - Vertical inset (Top) - Vertical inset (Bottom) + Left margin + Right margin + Top margin + Bottom margin + Background color + Przezroczystość tła Pause Pause %1$s? @@ -464,6 +469,7 @@ Kolumny szuflady aplikacji Wysokość wiersza Odstęp poziomy + Background color Ukryj z szuflady aplikacji Ukryte aplikacje (%1$d) diff --git a/lawnchair/res/values-pt-rBR/strings.xml b/lawnchair/res/values-pt-rBR/strings.xml index 87d7d054733..b99a0a10ae5 100644 --- a/lawnchair/res/values-pt-rBR/strings.xml +++ b/lawnchair/res/values-pt-rBR/strings.xml @@ -71,6 +71,7 @@ Itens removidos O que mostrar + Wallpapers %1$d x %2$d @@ -400,9 +401,9 @@ Usar novo estilo de pop-up Usar o estilo de pop-up animado e ligeiramente consolidado do Material You Menu flutuante - Mostrar o botão de bloqueio - Mostrar botão de configurações do sistema - Mostrar botão de editar tela inicial + Pop-up menu items + Edit pop-up menu items + Wallpaper quick picker Barra de status Mostrar barra de status Barra de status escura @@ -419,7 +420,9 @@ Remover as restrições de tamanho mínimo e máximo de widgets Mostrar dock + Search bar settings are available when the Dock is visible. Tap to show the Dock. Barra de pesquisa + Search bar settings Widget da barra de pesquisa Desativado Barra de Pesquisa do Google @@ -430,10 +433,12 @@ Aplicar cor de destaque Provedor de pesquisa Show background - Inserção horizontal (esquerda) - Inserção horizontal (direita) - Inserção vertical (em cima) - Inserção vertical (em baixo) + Left margin + Right margin + Top margin + Bottom margin + Background color + Opacidade do fundo Pausar Pausar por %1$s? @@ -464,6 +469,7 @@ Colunas da gaveta de aplicativos Altura da linha Preenchimento horizontal + Background color Esconder da gaveta de aplicativos Aplicativos ocultos (%1$d) diff --git a/lawnchair/res/values-pt-rPT/strings.xml b/lawnchair/res/values-pt-rPT/strings.xml index 76ff72d74be..730a0f3bd25 100644 --- a/lawnchair/res/values-pt-rPT/strings.xml +++ b/lawnchair/res/values-pt-rPT/strings.xml @@ -71,6 +71,7 @@ Item removido O que mostrar + Wallpapers Para bloquear o smartphone ao executar um gesto e abrir Recentes por gesto, o Lawnchair requer acesso de acessibilidade. O Lawnchair não monitora nenhuma ação do usuário, embora o privilégio para fazer isso seja necessário para todos os serviços de acessibilidade. O Lawnchair descarta qualquer evento enviado pelo sistema. Para bloquear seu telefone ou abrir Recentes, o Lawnchair usa o serviço performGlobalAction Accessibility. %1$d x %2$d @@ -401,9 +402,9 @@ Transparentes Use new pop-up style Use Material You\'s bouncy and slightly consolidated pop-up style Pop-up menu - Show lock button - Show system settings button - Show edit home screen button + Pop-up menu items + Edit pop-up menu items + Wallpaper quick picker Status bar Show status bar Dark status bar @@ -420,7 +421,9 @@ Transparentes Remover as restrições de tamanho mínimo e máximo de widgets Show dock + Search bar settings are available when the Dock is visible. Tap to show the Dock. Search bar + Search bar settings Search bar widget Desativado Google Search bar @@ -431,10 +434,12 @@ Transparentes Apply accent color Search provider Show background - Horizontal inset (Left) - Horizontal inset (Right) - Vertical inset (Top) - Vertical inset (Bottom) + Left margin + Right margin + Top margin + Bottom margin + Background color + Opacidade De Fundo Pause Pause %1$s? @@ -465,6 +470,7 @@ Transparentes App drawer columns Row height Horizontal padding + Background color Hide from app drawer Hidden apps (%1$d) diff --git a/lawnchair/res/values-ro-rRO/strings.xml b/lawnchair/res/values-ro-rRO/strings.xml index a6471bc2e17..f9ea42b865f 100644 --- a/lawnchair/res/values-ro-rRO/strings.xml +++ b/lawnchair/res/values-ro-rRO/strings.xml @@ -71,6 +71,7 @@ Item removed What to show + Wallpapers To lock your phone when performing a gesture, and to open Recents via gesture, Lawnchair requires accessibility access.\n\nLawnchair doesn\'t watch any user action, though the privilege to do so is required for all accessibility services. Lawnchair discards any event sent by the system.\n\nIn order to lock your phone, or to open Recents, Lawnchair uses the performGlobalAction Accessibility service. %1$d x %2$d @@ -400,9 +401,9 @@ Use new pop-up style Use Material You\'s bouncy and slightly consolidated pop-up style Pop-up menu - Show lock button - Show system settings button - Show edit home screen button + Pop-up menu items + Edit pop-up menu items + Wallpaper quick picker Status bar Show status bar Dark status bar @@ -419,7 +420,9 @@ Remove the minimum and maximum size restrictions of widgets Show dock + Search bar settings are available when the Dock is visible. Tap to show the Dock. Search bar + Search bar settings Search bar widget Dezactivat Google Search bar @@ -430,10 +433,12 @@ Apply accent color Search provider Show background - Horizontal inset (Left) - Horizontal inset (Right) - Vertical inset (Top) - Vertical inset (Bottom) + Left margin + Right margin + Top margin + Bottom margin + Background color + Background opacity Pause Pause %1$s? @@ -464,6 +469,7 @@ App drawer columns Row height Horizontal padding + Background color Hide from app drawer Hidden apps (%1$d) diff --git a/lawnchair/res/values-ru-rRU/strings.xml b/lawnchair/res/values-ru-rRU/strings.xml index 9b57fa8605b..32036893f07 100644 --- a/lawnchair/res/values-ru-rRU/strings.xml +++ b/lawnchair/res/values-ru-rRU/strings.xml @@ -71,6 +71,7 @@ Элемент удален Что показывать + Wallpapers Чтобы заблокировать телефон с помощью жеста или открыть меню недавних приложений, Lawnchair требуется доступ к специальным возможностям.\n\nLawnchair не отслеживает никакие действия пользователя, хотя это требуется для всех служб специальных возможностей. Lawnchair не берёт в расчёт любые события, отправленные системой.\n\nЧтобы заблокировать ваш телефон или открыть меню недавних приложений, Lawnchair использует службу специальных возможностей PerformGlobalAction. %1$d × %2$d @@ -400,9 +401,9 @@ Использовать новый стиль всплывающего окна Использовать стиль Material You для всплывающих окон Всплывающее меню - Показывать кнопку блокировки - Показывать кнопку системных настроек - Показывать кнопку редактирования экрана + Pop-up menu items + Edit pop-up menu items + Wallpaper quick picker Строка состояния Показывать строку состояния Темная строка состояния @@ -419,7 +420,9 @@ Убрать мин. и макс. ограничения размера виджетов Отображать док-панель + Search bar settings are available when the Dock is visible. Tap to show the Dock. Панель поиска + Search bar settings Виджет панели поиска Отключено Панель поиска Google @@ -430,10 +433,12 @@ Применить цвет акцента Провайдер поиска Show background - Horizontal inset (Left) - Horizontal inset (Right) - Vertical inset (Top) - Vertical inset (Bottom) + Left margin + Right margin + Top margin + Bottom margin + Background color + Прозрачность фона Pause Pause %1$s? @@ -464,6 +469,7 @@ Количество столбцов в меню приложений Высота строки Горизонт. отступ + Background color Скрыть из Меню приложений Скрытые приложения (%1$d) diff --git a/lawnchair/res/values-sk-rSK/strings.xml b/lawnchair/res/values-sk-rSK/strings.xml index c8e1012ccd1..c531d47eb74 100644 --- a/lawnchair/res/values-sk-rSK/strings.xml +++ b/lawnchair/res/values-sk-rSK/strings.xml @@ -71,6 +71,7 @@ Odstránená položka Čo ukázať + Wallpapers Na uzamknutie telefónu pri vykonávaní gesta vyžaduje aplikácia Lawnchair prístup k funkciám prístupnosti.\n\nLawnchair nesleduje žiadnu činnosť používateľa, hoci oprávnenie na to sa vyžaduje pre všetky služby prístupnosti. Služba Lawnchair zahodí akúkoľvek udalosť odoslanú systémom.\n\nNa uzamknutie telefónu používa služba sprístupnenia performGlobalAction. %1$d × %2$d @@ -400,9 +401,9 @@ Use new pop-up style Use Material You\'s bouncy and slightly consolidated pop-up style Vyskakovacia ponuka - Ukázať tlačidlo zamknutia - Ukázať systémove nastavenie tlačidlo - Zobrazenie tlačidla na úpravu domovskej obrazovky + Pop-up menu items + Edit pop-up menu items + Wallpaper quick picker Stavový riadok Zobraziť stavový riadok Tmavý stavový riadok @@ -419,7 +420,9 @@ Vymazať minimálne a maximálne obmedzenie veľkosť widgetu Zobraziť dok + Search bar settings are available when the Dock is visible. Tap to show the Dock. Vyhľadávací panel + Search bar settings Widget vyhľadávacieho panelu Vypnuté Vyhľadávací panel Google @@ -430,10 +433,12 @@ Použiť farebný akcent Poskytovateľ vyhľadávania Show background - Horizontal inset (Left) - Horizontal inset (Right) - Vertical inset (Top) - Vertical inset (Bottom) + Left margin + Right margin + Top margin + Bottom margin + Background color + Sýtosť pozadia Pause Pause %1$s? @@ -464,6 +469,7 @@ Stĺpce v Ponuke aplikácií Výška riadka Vodorovná medzera + Background color Skryť z ponuky aplikácií Skryté aplikácie (%1$d) diff --git a/lawnchair/res/values-sl-rSI/strings.xml b/lawnchair/res/values-sl-rSI/strings.xml index a24f48a4193..19bf2caeacf 100644 --- a/lawnchair/res/values-sl-rSI/strings.xml +++ b/lawnchair/res/values-sl-rSI/strings.xml @@ -71,6 +71,7 @@ Item removed What to show + Wallpapers To lock your phone when performing a gesture, and to open Recents via gesture, Lawnchair requires accessibility access.\n\nLawnchair doesn\'t watch any user action, though the privilege to do so is required for all accessibility services. Lawnchair discards any event sent by the system.\n\nIn order to lock your phone, or to open Recents, Lawnchair uses the performGlobalAction Accessibility service. %1$d x %2$d @@ -400,9 +401,9 @@ Use new pop-up style Use Material You\'s bouncy and slightly consolidated pop-up style Pop-up menu - Show lock button - Show system settings button - Show edit home screen button + Pop-up menu items + Edit pop-up menu items + Wallpaper quick picker Status bar Show status bar Dark status bar @@ -419,7 +420,9 @@ Remove the minimum and maximum size restrictions of widgets Show dock + Search bar settings are available when the Dock is visible. Tap to show the Dock. Search bar + Search bar settings Search bar widget Disabled Google Search bar @@ -430,10 +433,12 @@ Apply accent color Search provider Show background - Horizontal inset (Left) - Horizontal inset (Right) - Vertical inset (Top) - Vertical inset (Bottom) + Left margin + Right margin + Top margin + Bottom margin + Background color + Background opacity Pause Pause %1$s? @@ -464,6 +469,7 @@ App drawer columns Row height Horizontal padding + Background color Hide from app drawer Hidden apps (%1$d) diff --git a/lawnchair/res/values-sq-rAL/strings.xml b/lawnchair/res/values-sq-rAL/strings.xml index 17a4b9f706e..1eca7911f16 100644 --- a/lawnchair/res/values-sq-rAL/strings.xml +++ b/lawnchair/res/values-sq-rAL/strings.xml @@ -71,6 +71,7 @@ Artikulli i hequr Çfarë të shfaqet + Wallpapers Që te kyçësh telefonin tuaj me një lëvizje apo gjest, apo të hapësh gjërat e fundit me një lëvizje apo gjest, Lawnchair-it i duhet mundësia e përdorimit (Accessability access).\n\nLawnchair nuk shikon veprimet që i kryen përdoruesi, por privilegji për ta bërë atë është i domosdoshëm. Lawnchair i fshin të gjitha aksionet që vijnë nga sistemi. \n\nPër ta kyçur telefonin tuaj, ose për të hapur gjërat e fundit, Lawnchair përdor mundësinë e përdorimit performGlobalAction. %1$d × %2$d @@ -400,9 +401,9 @@ Use new pop-up style Use Material You\'s bouncy and slightly consolidated pop-up style Pop-up menu - Show lock button - Show system settings button - Show edit home screen button + Pop-up menu items + Edit pop-up menu items + Wallpaper quick picker Status bar Show status bar Dark status bar @@ -419,7 +420,9 @@ Remove the minimum and maximum size restrictions of widgets Show dock + Search bar settings are available when the Dock is visible. Tap to show the Dock. Search bar + Search bar settings Search bar widget Fikur Google Search bar @@ -430,10 +433,12 @@ Apply accent color Search provider Show background - Horizontal inset (Left) - Horizontal inset (Right) - Vertical inset (Top) - Vertical inset (Bottom) + Left margin + Right margin + Top margin + Bottom margin + Background color + Tejdukshmëria e sfondit Pause Pause %1$s? @@ -464,6 +469,7 @@ App drawer columns Row height Horizontal padding + Background color Hide from app drawer Hidden apps (%1$d) diff --git a/lawnchair/res/values-sr/strings.xml b/lawnchair/res/values-sr/strings.xml index f842106d8db..3e51d5efe2e 100644 --- a/lawnchair/res/values-sr/strings.xml +++ b/lawnchair/res/values-sr/strings.xml @@ -71,6 +71,7 @@ Ставка је уклоњена Информације за приказ + Wallpapers Да бисте закључали уређај покретом или отворили мени са недавним апликацијама, Lawnchair-у је потребан приступ услузи приступачности.\n\nПомоћу ње се могу надгледати корисничке радње, али је Lawnchair не користи у те сврхе. %1$d x %2$d @@ -400,9 +401,9 @@ Нови стил искачућег прозора Користите анимиране и компактније искачуће прозоре у складу са дизајном Material You Искачући мени - Прикажи дугме за закључавање - Прикажи дугме за системска подешавања - Прикажи дугме за уређивање почетног екрана + Pop-up menu items + Edit pop-up menu items + Wallpaper quick picker Статусна трака Прикажи статусну траку Тамна статусна трака @@ -419,7 +420,9 @@ Уклоните ограничење минималне и максималне величине виџета Прикажи док + Search bar settings are available when the Dock is visible. Tap to show the Dock. Трака за претрагу + Search bar settings Виџет траке за претрагу Онемогућено Google трака за претрагу @@ -430,10 +433,12 @@ Примени боју за наглашавање Претраживач Прикажи позадину - Хоризонтални помак (лево) - Хоризонтални помак (десно) - Вертикални помак (горе) - Вертикални помак (доле) + Left margin + Right margin + Top margin + Bottom margin + Background color + Непрозирност позадине Pause Pause %1$s? @@ -464,6 +469,7 @@ Број колона на листи апликација Висина реда Хоризонтални размак + Background color Сакриј са листе апликација Скривене апликације (%1$d) diff --git a/lawnchair/res/values-sv-rSE/strings.xml b/lawnchair/res/values-sv-rSE/strings.xml index 24abea08805..475c7fbf2ba 100644 --- a/lawnchair/res/values-sv-rSE/strings.xml +++ b/lawnchair/res/values-sv-rSE/strings.xml @@ -71,6 +71,7 @@ Objekt borttaget Vad ska visas + Bakgrundsbilder För att kunna låsa din telefon när en gest görs och för att kunna öppna Senaste med en gest kräver Lawnchair tillgänglighetsåtkomst.\n\nLawnchair övervakar inte några användaraktiviteter, men behörigheten att kunna göra detta krävs för alla tillgänglighetstjänster. Lawnchair förkastar alla händelser som skickas av systemet.\n\nFör att kunna låsa din telefon och för att kunna öppna Senaste använder Lawnchair tillgänglighetstjänsten performGlobalAction. %1$d x %2$d @@ -400,9 +401,9 @@ Använd ny popup-stil Använd Material Yous studsiga och något tätare popup-stil Snabbmeny - Visa låsknapp - Visa systeminställningar-knapp - Visa redigera startskärm-knapp + Objekt i snabbmenyn + Redigera objekt i snabbmenyn + Snabbväljare för bakgrundsbild Statusfält Visa statusfält Mörkt statusfält @@ -419,7 +420,9 @@ Ta bort begränsningarna av minimi- och maximistorlek på widgetar Visa favoritfält + Sökfältsinställningar är tillgängliga när favoritfältet är synligt. Tryck för att visa favoritfältet. Sökfält + Sökfältsinställningar Sökfältswidget Inaktiverad Google Sök-fält @@ -430,10 +433,12 @@ Använd accentfärg Sökleverantör Visa bakgrund - Horisontell infällning (vänster) - Horisontell infällning (höger) - Vertikal infällning (överkant) - Vertikal infällning (nederkant) + Vänsterkant + Högerkant + Överkant + Nederkant + Bakgrundsfärg + Bakgrundens opacitet Pausa Pausa %1$s? @@ -464,6 +469,7 @@ Kolumner i applådan Radhöjd Vågrätt avstånd + Bakgrundsfärg Dölj från applådan Dolda appar (%1$d) diff --git a/lawnchair/res/values-sw-rKE/strings.xml b/lawnchair/res/values-sw-rKE/strings.xml index 8c6d824fa3a..4d4ab903941 100644 --- a/lawnchair/res/values-sw-rKE/strings.xml +++ b/lawnchair/res/values-sw-rKE/strings.xml @@ -71,6 +71,7 @@ Item removed What to show + Wallpapers To lock your phone when performing a gesture, and to open Recents via gesture, Lawnchair requires accessibility access.\n\nLawnchair doesn\'t watch any user action, though the privilege to do so is required for all accessibility services. Lawnchair discards any event sent by the system.\n\nIn order to lock your phone, or to open Recents, Lawnchair uses the performGlobalAction Accessibility service. %1$d x %2$d @@ -400,9 +401,9 @@ Use new pop-up style Use Material You\'s bouncy and slightly consolidated pop-up style Pop-up menu - Show lock button - Show system settings button - Show edit home screen button + Pop-up menu items + Edit pop-up menu items + Wallpaper quick picker Status bar Show status bar Dark status bar @@ -419,7 +420,9 @@ Remove the minimum and maximum size restrictions of widgets Show dock + Search bar settings are available when the Dock is visible. Tap to show the Dock. Search bar + Search bar settings Search bar widget Imezimwa Google Search bar @@ -430,10 +433,12 @@ Apply accent color Search provider Show background - Horizontal inset (Left) - Horizontal inset (Right) - Vertical inset (Top) - Vertical inset (Bottom) + Left margin + Right margin + Top margin + Bottom margin + Background color + Background opacity Pause Pause %1$s? @@ -464,6 +469,7 @@ App drawer columns Row height Horizontal padding + Background color Hide from app drawer Hidden apps (%1$d) diff --git a/lawnchair/res/values-ta-rIN/strings.xml b/lawnchair/res/values-ta-rIN/strings.xml index 3315e820dab..8daebf6a009 100644 --- a/lawnchair/res/values-ta-rIN/strings.xml +++ b/lawnchair/res/values-ta-rIN/strings.xml @@ -71,6 +71,7 @@ பொருள் நீக்கப்பட்டது எதைக் காட்ட + Wallpapers To lock your phone when performing a gesture, and to open Recents via gesture, Lawnchair requires accessibility access.\n\nLawnchair doesn\'t watch any user action, though the privilege to do so is required for all accessibility services. Lawnchair discards any event sent by the system.\n\nIn order to lock your phone, or to open Recents, Lawnchair uses the performGlobalAction Accessibility service. %1$d x %2$d @@ -400,9 +401,9 @@ புதிய பாப்அப் பாணியைப் பயன்படுத்து மெட்டீரியல் யூ துள்ளல் மற்றும் சற்று ஒருங்கிணைக்கப்பட்ட பாப்-அப் பாணியைப் பயன்படுத்தவும் பாப்அப் மெனு - பூட்டு பொத்தானைக் காட்டு - Show system settings button - Show edit home screen button + Pop-up menu items + Edit pop-up menu items + Wallpaper quick picker நிலைப்பட்டி நிலைப்பலகையை காட்டு இருண்ட நிலைப்பட்டி @@ -419,7 +420,9 @@ விட்ஜெட்களின் குறைந்தபட்ச மற்றும் அதிகபட்ச அளவுக் கட்டுப்பாடுகளை அகற்றவும் டாக்கை காட்டு + Search bar settings are available when the Dock is visible. Tap to show the Dock. தேடல் பட்டை + Search bar settings தேடல் பட்டி விட்ஜெட் முடக்கப்பட்டுள்ளது கூகிள் தேடல் @@ -430,10 +433,12 @@ உரப்பு நிறத்தைச் செயற்படுத்து தேடல் வழங்கி Show background - Horizontal inset (Left) - Horizontal inset (Right) - Vertical inset (Top) - Vertical inset (Bottom) + Left margin + Right margin + Top margin + Bottom margin + Background color + பின்னணி ஒளிபுகாநிலை Pause Pause %1$s? @@ -464,6 +469,7 @@ செயலி டிராயர் நெடுவரிசைகள் வரிசை உயரம் கிடைமட்ட திணிப்பு + Background color செயலி இழுப்பறையிலிருந்து மறை மறைக்கப்பட்ட செயலிகள்(%1$d) diff --git a/lawnchair/res/values-te-rIN/strings.xml b/lawnchair/res/values-te-rIN/strings.xml index 0ded47fc30d..41849ab67c5 100644 --- a/lawnchair/res/values-te-rIN/strings.xml +++ b/lawnchair/res/values-te-rIN/strings.xml @@ -71,6 +71,7 @@ Item removed What to show + Wallpapers To lock your phone when performing a gesture, and to open Recents via gesture, Lawnchair requires accessibility access.\n\nLawnchair doesn\'t watch any user action, though the privilege to do so is required for all accessibility services. Lawnchair discards any event sent by the system.\n\nIn order to lock your phone, or to open Recents, Lawnchair uses the performGlobalAction Accessibility service. %1$d x %2$d @@ -400,9 +401,9 @@ Use new pop-up style Use Material You\'s bouncy and slightly consolidated pop-up style Pop-up menu - Show lock button - Show system settings button - Show edit home screen button + Pop-up menu items + Edit pop-up menu items + Wallpaper quick picker Status bar Show status bar Dark status bar @@ -419,7 +420,9 @@ Remove the minimum and maximum size restrictions of widgets Show dock + Search bar settings are available when the Dock is visible. Tap to show the Dock. Search bar + Search bar settings Search bar widget Disabled Google Search bar @@ -430,10 +433,12 @@ Apply accent color Search provider Show background - Horizontal inset (Left) - Horizontal inset (Right) - Vertical inset (Top) - Vertical inset (Bottom) + Left margin + Right margin + Top margin + Bottom margin + Background color + Background opacity Pause Pause %1$s? @@ -464,6 +469,7 @@ App drawer columns Row height Horizontal padding + Background color Hide from app drawer Hidden apps (%1$d) diff --git a/lawnchair/res/values-th-rTH/strings.xml b/lawnchair/res/values-th-rTH/strings.xml index 06fba17ecc5..0619cd22d75 100644 --- a/lawnchair/res/values-th-rTH/strings.xml +++ b/lawnchair/res/values-th-rTH/strings.xml @@ -71,6 +71,7 @@ นำรายการออกแล้ว สิ่งที่อยากให้แสดง + Wallpapers To lock your phone when performing a gesture, and to open Recents via gesture, Lawnchair requires accessibility access.\n\nLawnchair doesn\'t watch any user action, though the privilege to do so is required for all accessibility services. Lawnchair discards any event sent by the system.\n\nIn order to lock your phone, or to open Recents, Lawnchair uses the performGlobalAction Accessibility service. %1$d x %2$d @@ -400,9 +401,9 @@ ใช้ลักษณะป็อปอัพแบบใหม่ ใช้ลักษณะป๊อปอัพที่เด้งรวมกับ Material You เมนูป็อปอัพ - แสดงปุ่มล็อค - แสดงรายการตั้งค่าระบบ - Show edit home screen button + Pop-up menu items + Edit pop-up menu items + Wallpaper quick picker แถบสถานะ แสดงแถบสถานะ แถบสถานะสีดำ @@ -419,7 +420,9 @@ ลบข้อจำกัดขนาดขั้นต่ำและสูงสุดของวิดเจ็ต แสดงแถบรายการโปรด + Search bar settings are available when the Dock is visible. Tap to show the Dock. แถบค้นหา + Search bar settings วิดเจ็ตแถบค้นหา ปิด แถบค้นหาของ Google @@ -430,10 +433,12 @@ ใช้งานสีที่เน้น ผู้ให้บริการค้นหา Show background - Horizontal inset (Left) - Horizontal inset (Right) - Vertical inset (Top) - Vertical inset (Bottom) + Left margin + Right margin + Top margin + Bottom margin + Background color + ความทึบของพื้นหลัง Pause Pause %1$s? @@ -464,6 +469,7 @@ App drawer columns ความสูงของแถว เว้นขอบข้าง + Background color ซ่อนจากรายการแอป แอปที่ซ่อนอยู่ (%1$d) diff --git a/lawnchair/res/values-tr-rTR/strings.xml b/lawnchair/res/values-tr-rTR/strings.xml index cbdf68ae3b3..7b2fdc9004c 100644 --- a/lawnchair/res/values-tr-rTR/strings.xml +++ b/lawnchair/res/values-tr-rTR/strings.xml @@ -71,6 +71,7 @@ Öğe kaldırıldı Ne gösterilsin + Wallpapers Telefonunuzu hareketle kilitlemek ve son kullanılanları hareketle açmak için Lawnchair\'a erişilebilirlik izni vermeniz gerekir.\n\nLawnchair, tüm erişilebilirlik hizmetlerinin sahip olduğu izinlere sahip olmasına rağmen, hiçbir zaman kullanıcı eylemlerini izlemez. Lawnchair sistem tarafından gönderilen herhangi bir olayı görmezden gelir.\n\n Telefonunuzu kilitlemek veya Son uygulamaları açmak için Lawnchair, performGlobalAction erişilebilirllik hizmetini kullanır. %1$d x %2$d @@ -400,9 +401,9 @@ Yeni açılır pencere stilini kullan Material You\'nun hareketli ve biraz birleştirilmiş pop-up stilini kullanın Açılır menü - Kilit düğmesini göster - Sistem ayarları butonunu göster - Ana ekranı düzenle butonunu göster + Pop-up menu items + Edit pop-up menu items + Wallpaper quick picker Durum çubuğu Durum çubuğunu göster Karanlık durum çubuğu @@ -419,7 +420,9 @@ Widget\'ların maksimum ve minimum boyut sınırlamalarını kaldırır Dock\'u göster + Search bar settings are available when the Dock is visible. Tap to show the Dock. Arama çubuğu + Search bar settings Arama çubuğu widget\'ı Devre dışı Google Arama çubuğu @@ -430,10 +433,12 @@ Vurgu rengini uygula Arama sağlayıcısı Show background - Horizontal inset (Left) - Horizontal inset (Right) - Vertical inset (Top) - Vertical inset (Bottom) + Left margin + Right margin + Top margin + Bottom margin + Background color + Arka plan opaklığı Pause Pause %1$s? @@ -464,6 +469,7 @@ Uygulama çekmecesi sütunları Satır yüksekliği Yatay dolgu + Background color Uygulama çekmecesinden gizle Gizli uygulamalar (%1$d) diff --git a/lawnchair/res/values-uk-rUA/strings.xml b/lawnchair/res/values-uk-rUA/strings.xml index 9eacc8fd6e0..6a3384a9725 100644 --- a/lawnchair/res/values-uk-rUA/strings.xml +++ b/lawnchair/res/values-uk-rUA/strings.xml @@ -71,6 +71,7 @@ Елемент видалено Що показати + Wallpapers Щоб заблокувати телефон виконанням жесту, а також щоб відкрити Недавні за допомогою жесту, Lawnchair потребує дозволу служби доступності.\n\nLawnchair не спостерігає за діями користувача, хоча привілей на це потрібен для всіх служб доступності. Lawnchair відкидає будь-яку подію, надіслану системою.\n\nЩоб заблокувати телефон або відкрити Недавні, Lawnchair використовує службу доступності `performGlobalAction`. %1$d на %2$d @@ -400,9 +401,9 @@ Використовувати новий стиль спливаючих вікон Використовувати пружний і злегка консолідований стиль спливаючих вікон Material You Спливаюче меню - Показувати кнопку блокування - Показати кнопку системних налаштувань - Показати кнопку редагування головного екрану + Pop-up menu items + Edit pop-up menu items + Wallpaper quick picker Рядок стану Показати рядок стану Темний рядок стану @@ -419,7 +420,9 @@ Зняти обмеження на мінімальний та максимальний розмір віджетів Показати нижню панель + Search bar settings are available when the Dock is visible. Tap to show the Dock. Панель пошуку + Search bar settings Віджет панелі пошуку Вимкнено Панель пошуку Google @@ -430,10 +433,12 @@ Застосувати колір акценту Пошукова система Show background - Horizontal inset (Left) - Horizontal inset (Right) - Vertical inset (Top) - Vertical inset (Bottom) + Left margin + Right margin + Top margin + Bottom margin + Background color + Прозорість фону Pause Pause %1$s? @@ -464,6 +469,7 @@ Кількість стовпців панелі додатків Висота рядка Горизонтальний відступ + Background color Сховати з панелі додатків Приховані додатки (%1$d) diff --git a/lawnchair/res/values-ur-rIN/strings.xml b/lawnchair/res/values-ur-rIN/strings.xml index c8a3ddd4b6a..2038add7ad1 100644 --- a/lawnchair/res/values-ur-rIN/strings.xml +++ b/lawnchair/res/values-ur-rIN/strings.xml @@ -71,6 +71,7 @@ Item removed What to show + Wallpapers To lock your phone when performing a gesture, and to open Recents via gesture, Lawnchair requires accessibility access.\n\nLawnchair doesn\'t watch any user action, though the privilege to do so is required for all accessibility services. Lawnchair discards any event sent by the system.\n\nIn order to lock your phone, or to open Recents, Lawnchair uses the performGlobalAction Accessibility service. %1$d x %2$d @@ -400,9 +401,9 @@ Use new pop-up style Use Material You\'s bouncy and slightly consolidated pop-up style Pop-up menu - Show lock button - Show system settings button - Show edit home screen button + Pop-up menu items + Edit pop-up menu items + Wallpaper quick picker Status bar Show status bar Dark status bar @@ -419,7 +420,9 @@ Remove the minimum and maximum size restrictions of widgets Show dock + Search bar settings are available when the Dock is visible. Tap to show the Dock. Search bar + Search bar settings Search bar widget Disabled Google Search bar @@ -430,10 +433,12 @@ Apply accent color Search provider Show background - Horizontal inset (Left) - Horizontal inset (Right) - Vertical inset (Top) - Vertical inset (Bottom) + Left margin + Right margin + Top margin + Bottom margin + Background color + Background opacity Pause Pause %1$s? @@ -464,6 +469,7 @@ App drawer columns Row height Horizontal padding + Background color Hide from app drawer Hidden apps (%1$d) diff --git a/lawnchair/res/values-ur-rPK/strings.xml b/lawnchair/res/values-ur-rPK/strings.xml index 38f6f4c3de4..b971a15a87f 100644 --- a/lawnchair/res/values-ur-rPK/strings.xml +++ b/lawnchair/res/values-ur-rPK/strings.xml @@ -71,6 +71,7 @@ آئٹم ہٹا دیا گیا کیا دکھانا ہے + Wallpapers اشارہ کرتے وقت اپنے فون کو لاک کرنے کے لیے، اور اشاروں کے ذریعے حالیہ کھولنے کے لیے، Lawnchair کو قابل رسائی رسائی درکار ہوتی ہے۔\n\nLawnchair صارف کی کسی کارروائی کو نہیں دیکھتا، حالانکہ ایسا کرنے کا استحقاق تمام قابل رسائی خدمات کے لیے درکار ہے۔ Lawnchair سسٹم کی طرف سے بھیجے گئے کسی بھی ایونٹ کو رد کر دیتا ہے۔\n\nآپ کے فون کو لاک کرنے، یا Recents کھولنے کے لیے، Lawnchair پرفارم گلوبل ایکشن ایکسیسبیلٹی سروس استعمال کرتا ہے۔. %1$d x %2$d @@ -400,9 +401,9 @@ Use new pop-up style Use Material You\'s bouncy and slightly consolidated pop-up style Pop-up menu - Show lock button - Show system settings button - Show edit home screen button + Pop-up menu items + Edit pop-up menu items + Wallpaper quick picker Status bar Show status bar Dark status bar @@ -419,7 +420,9 @@ Remove the minimum and maximum size restrictions of widgets Show dock + Search bar settings are available when the Dock is visible. Tap to show the Dock. Search bar + Search bar settings Search bar widget Disabled Google Search bar @@ -430,10 +433,12 @@ Apply accent color Search provider Show background - Horizontal inset (Left) - Horizontal inset (Right) - Vertical inset (Top) - Vertical inset (Bottom) + Left margin + Right margin + Top margin + Bottom margin + Background color + پس منظر کا دھندلاپن Pause Pause %1$s? @@ -464,6 +469,7 @@ App drawer columns Row height Horizontal padding + Background color Hide from app drawer Hidden apps (%1$d) diff --git a/lawnchair/res/values-uz-rUZ/strings.xml b/lawnchair/res/values-uz-rUZ/strings.xml index a56bf4b8a9a..23549ac4250 100644 --- a/lawnchair/res/values-uz-rUZ/strings.xml +++ b/lawnchair/res/values-uz-rUZ/strings.xml @@ -71,6 +71,7 @@ Item removed What to show + Wallpapers To lock your phone when performing a gesture, and to open Recents via gesture, Lawnchair requires accessibility access.\n\nLawnchair doesn\'t watch any user action, though the privilege to do so is required for all accessibility services. Lawnchair discards any event sent by the system.\n\nIn order to lock your phone, or to open Recents, Lawnchair uses the performGlobalAction Accessibility service. %1$d x %2$d @@ -400,9 +401,9 @@ Use new pop-up style Use Material You\'s bouncy and slightly consolidated pop-up style Pop-up menu - Show lock button - Show system settings button - Show edit home screen button + Pop-up menu items + Edit pop-up menu items + Wallpaper quick picker Status bar Show status bar Dark status bar @@ -419,7 +420,9 @@ Remove the minimum and maximum size restrictions of widgets Show dock + Search bar settings are available when the Dock is visible. Tap to show the Dock. Search bar + Search bar settings Search bar widget Disabled Google Search bar @@ -430,10 +433,12 @@ Apply accent color Search provider Show background - Horizontal inset (Left) - Horizontal inset (Right) - Vertical inset (Top) - Vertical inset (Bottom) + Left margin + Right margin + Top margin + Bottom margin + Background color + Background opacity Pause Pause %1$s? @@ -464,6 +469,7 @@ App drawer columns Row height Horizontal padding + Background color Hide from app drawer Hidden apps (%1$d) diff --git a/lawnchair/res/values-vi-rVN/strings.xml b/lawnchair/res/values-vi-rVN/strings.xml index 19e454e9c8e..c3f423a3d17 100644 --- a/lawnchair/res/values-vi-rVN/strings.xml +++ b/lawnchair/res/values-vi-rVN/strings.xml @@ -71,6 +71,7 @@ Đã xoá mục Những gì để hiển thị + Wallpapers Để khóa điện thoại khi thực hiện cử chỉ và để mở mục Gần đây bằng cử chỉ, Lawnchair yêu cầu quyền truy cập trợ năng.\n\nLawnchair không theo dõi bất kỳ hành động nào của người dùng, mặc dù quyền theo dõi là bắt buộc đối với tất cả các dịch vụ trợ năng. Lawnchair loại bỏ mọi sự kiện được hệ thống gửi đi.\n\nĐể khóa điện thoại hoặc mở mục Gần đây, Lawnchair sử dụng dịch vụ Trợ năng performGlobalAction. %1$d x %2$d @@ -400,9 +401,9 @@ Use new pop-up style Sử dụng phong cách pop-up có độ nảy và hơi cố định của Material You Menu Pop-up - Hiển thị nút khóa màn hình - Hiển thị Cài đặt điện thoại - Show edit home screen button + Pop-up menu items + Edit pop-up menu items + Wallpaper quick picker Thanh trạng thái Hiển thị thanh trạng thái Thanh trạng thái màu tối @@ -419,7 +420,9 @@ Remove the minimum and maximum size restrictions of widgets Show dock + Search bar settings are available when the Dock is visible. Tap to show the Dock. Search bar + Search bar settings Search bar widget Đã vô hiệu hoá Google Search bar @@ -430,10 +433,12 @@ Apply accent color Search provider Show background - Horizontal inset (Left) - Horizontal inset (Right) - Vertical inset (Top) - Vertical inset (Bottom) + Left margin + Right margin + Top margin + Bottom margin + Background color + Background opacity Pause Pause %1$s? @@ -464,6 +469,7 @@ App drawer columns Row height Horizontal padding + Background color Hide from app drawer Hidden apps (%1$d) diff --git a/lawnchair/res/values-zh-rCN/strings.xml b/lawnchair/res/values-zh-rCN/strings.xml index c0779e0be96..ff95314ac23 100644 --- a/lawnchair/res/values-zh-rCN/strings.xml +++ b/lawnchair/res/values-zh-rCN/strings.xml @@ -71,6 +71,7 @@ 项目已移除 选择要显示的项目 + Wallpapers 要通过手势锁定手机和打开最近任务界面, Lawnchair 需要获取无障碍功能访问权限。\n\nLawnchair 不会监视任何用户操作, 即使此权限允许。Lawnchair 会忽略系统发送的任何事件。\n\n为了锁定手机或打开最近任务界面, Lawnchair 使用 performGlobalAction 无障碍服务。 %1$d x %2$d @@ -400,9 +401,9 @@ 使用新的弹出样式 使用 Material You 的弹性和略微缩小的弹出样式 弹出菜单 - 显示锁定按钮 - 显示系统设置按钮 - 显示编辑主屏幕按钮 + Pop-up menu items + Edit pop-up menu items + Wallpaper quick picker 状态栏 显示状态栏 深色状态栏 @@ -419,7 +420,9 @@ 删除小部件的最小和最大大小限制 显示 Dock 栏 + Search bar settings are available when the Dock is visible. Tap to show the Dock. 搜索栏 + Search bar settings 搜索栏小部件 已禁用 Google 搜索栏 @@ -430,10 +433,12 @@ 应用强调色 搜索提供程序 Show background - Horizontal inset (Left) - Horizontal inset (Right) - Vertical inset (Top) - Vertical inset (Bottom) + Left margin + Right margin + Top margin + Bottom margin + Background color + 背景不透明度 Pause Pause %1$s? @@ -464,6 +469,7 @@ 应用程序抽屉列数 行高 水平边距 + Background color 从应用抽屉中隐藏 隐藏的应用(%1$d) diff --git a/lawnchair/res/values-zh-rTW/strings.xml b/lawnchair/res/values-zh-rTW/strings.xml index d5147ba4992..7ccae387689 100644 --- a/lawnchair/res/values-zh-rTW/strings.xml +++ b/lawnchair/res/values-zh-rTW/strings.xml @@ -71,6 +71,7 @@ 已移除物件 選擇需要顯示的項目 + Wallpapers To lock your phone when performing a gesture, and to open Recents via gesture, Lawnchair requires accessibility access.\n\nLawnchair doesn\'t watch any user action, though the privilege to do so is required for all accessibility services. Lawnchair discards any event sent by the system.\n\nIn order to lock your phone, or to open Recents, Lawnchair uses the performGlobalAction Accessibility service. %1$d × %2$d @@ -400,9 +401,9 @@ Use new pop-up style Use Material You\'s bouncy and slightly consolidated pop-up style Pop-up menu - Show lock button - Show system settings button - Show edit home screen button + Pop-up menu items + Edit pop-up menu items + Wallpaper quick picker Status bar Show status bar Dark status bar @@ -419,7 +420,9 @@ 移除小工具的最小和最大尺寸限制 Show dock + Search bar settings are available when the Dock is visible. Tap to show the Dock. Search bar + Search bar settings Search bar widget 停用 Google Search bar @@ -430,10 +433,12 @@ Apply accent color Search provider Show background - Horizontal inset (Left) - Horizontal inset (Right) - Vertical inset (Top) - Vertical inset (Bottom) + Left margin + Right margin + Top margin + Bottom margin + Background color + 背景不透明度 Pause Pause %1$s? @@ -464,6 +469,7 @@ App drawer columns Row height Horizontal padding + Background color 從應用程式抽屜隱藏 Hidden apps (%1$d) diff --git a/lawnchair/res/values/dimens.xml b/lawnchair/res/values/dimens.xml index ece4192fb3f..4060aa256ce 100644 --- a/lawnchair/res/values/dimens.xml +++ b/lawnchair/res/values/dimens.xml @@ -105,4 +105,6 @@ 64dp 18dp + 120dp + diff --git a/lawnchair/res/values/strings.xml b/lawnchair/res/values/strings.xml index 5fa620692d4..ec328e3f9a1 100644 --- a/lawnchair/res/values/strings.xml +++ b/lawnchair/res/values/strings.xml @@ -518,6 +518,8 @@ Pop-up menu items Edit pop-up menu items + Wallpaper quick picker + Status bar Show status bar Dark status bar diff --git a/lawnchair/src/app/lawnchair/BlankActivity.kt b/lawnchair/src/app/lawnchair/BlankActivity.kt index d379425dffb..64ced507562 100644 --- a/lawnchair/src/app/lawnchair/BlankActivity.kt +++ b/lawnchair/src/app/lawnchair/BlankActivity.kt @@ -135,28 +135,34 @@ class BlankActivity : ComponentActivity() { ) } - suspend fun startBlankActivityForResult(activity: Activity, targetIntent: Intent): ActivityResult = start(activity, targetIntent, Bundle.EMPTY) + suspend fun startBlankActivityForResult(activity: Activity, targetIntent: Intent): ActivityResult { + return start(activity, targetIntent, Bundle.EMPTY) + } - private suspend fun start(activity: Activity, targetIntent: Intent, extras: Bundle): ActivityResult = suspendCancellableCoroutine { continuation -> - val intent = Intent(activity, BlankActivity::class.java) - .putExtras(extras) - .putExtra("intent", targetIntent) - val resultReceiver = createResultReceiver { - if (continuation.isActive) { - continuation.resume(it) + private suspend fun start(activity: Activity, targetIntent: Intent, extras: Bundle): ActivityResult { + return suspendCancellableCoroutine { continuation -> + val intent = Intent(activity, BlankActivity::class.java) + .putExtras(extras) + .putExtra("intent", targetIntent) + val resultReceiver = createResultReceiver { + if (continuation.isActive) { + continuation.resume(it) + } } + activity.startActivity(intent.putExtra("callback", resultReceiver)) } - activity.startActivity(intent.putExtra("callback", resultReceiver)) } - private fun createResultReceiver(callback: (ActivityResult) -> Unit): ResultReceiver = object : ResultReceiver(Handler(Looper.myLooper()!!)) { + private fun createResultReceiver(callback: (ActivityResult) -> Unit): ResultReceiver { + return object : ResultReceiver(Handler(Looper.myLooper()!!)) { - override fun onReceiveResult(resultCode: Int, resultData: Bundle?) { - val data = Intent() - if (resultData != null) { - data.putExtras(resultData) + override fun onReceiveResult(resultCode: Int, resultData: Bundle?) { + val data = Intent() + if (resultData != null) { + data.putExtras(resultData) + } + callback(ActivityResult(resultCode, data)) } - callback(ActivityResult(resultCode, data)) } } } diff --git a/lawnchair/src/app/lawnchair/FeedBridge.kt b/lawnchair/src/app/lawnchair/FeedBridge.kt index 28f0198373f..f7224095512 100644 --- a/lawnchair/src/app/lawnchair/FeedBridge.kt +++ b/lawnchair/src/app/lawnchair/FeedBridge.kt @@ -56,19 +56,25 @@ class FeedBridge(private val context: Context) { } } - private fun customBridgeOrNull(customPackage: String = prefs.feedProvider.get()): CustomBridgeInfo? = if (customPackage.isNotBlank()) { - val bridge = CustomBridgeInfo(customPackage) - if (bridge.isAvailable()) bridge else null - } else { - null + private fun customBridgeOrNull(customPackage: String = prefs.feedProvider.get()): CustomBridgeInfo? { + return if (customPackage.isNotBlank()) { + val bridge = CustomBridgeInfo(customPackage) + if (bridge.isAvailable()) bridge else null + } else { + null + } } private fun customBridgeAvailable() = customBridgeOrNull()?.isAvailable() == true - fun isInstalled(): Boolean = customBridgeAvailable() || !shouldUseFeed || bridgePackages.any { it.isAvailable() } + fun isInstalled(): Boolean { + return customBridgeAvailable() || !shouldUseFeed || bridgePackages.any { it.isAvailable() } + } - fun resolveSmartspace(): String = bridgePackages.firstOrNull { it.supportsSmartspace }?.packageName - ?: "com.google.android.googlequicksearchbox" + fun resolveSmartspace(): String { + return bridgePackages.firstOrNull { it.supportsSmartspace }?.packageName + ?: "com.google.android.googlequicksearchbox" + } open inner class BridgeInfo(val packageName: String, signatureHashRes: Int) { protected open val signatureHash = diff --git a/lawnchair/src/app/lawnchair/HeadlessWidgetsManager.kt b/lawnchair/src/app/lawnchair/HeadlessWidgetsManager.kt index 29bad711ec0..b46756c0309 100644 --- a/lawnchair/src/app/lawnchair/HeadlessWidgetsManager.kt +++ b/lawnchair/src/app/lawnchair/HeadlessWidgetsManager.kt @@ -61,7 +61,9 @@ class HeadlessWidgetsManager(private val context: Context) : SafeCloseable { context: Context, appWidgetId: Int, appWidget: AppWidgetProviderInfo?, - ): AppWidgetHostView = HeadlessAppWidgetHostView(context) + ): AppWidgetHostView { + return HeadlessAppWidgetHostView(context) + } } @SuppressLint("ViewConstructor") diff --git a/lawnchair/src/app/lawnchair/LawnchairApp.kt b/lawnchair/src/app/lawnchair/LawnchairApp.kt index d0f82ed8f78..c1e1b757387 100644 --- a/lawnchair/src/app/lawnchair/LawnchairApp.kt +++ b/lawnchair/src/app/lawnchair/LawnchairApp.kt @@ -209,11 +209,13 @@ class LawnchairApp : Application() { fun isAccessibilityServiceBound(): Boolean = accessibilityService != null - fun performGlobalAction(action: Int): Boolean = accessibilityService?.performGlobalAction(action) ?: run { - Intent(Settings.ACTION_ACCESSIBILITY_SETTINGS) - .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) - .let(::startActivity) - false + fun performGlobalAction(action: Int): Boolean { + return accessibilityService?.performGlobalAction(action) ?: run { + Intent(Settings.ACTION_ACCESSIBILITY_SETTINGS) + .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + .let(::startActivity) + false + } } companion object { @@ -263,7 +265,9 @@ class LawnchairApp : Application() { } } - fun getUriForFile(context: Context, file: File): Uri = FileProvider.getUriForFile(context, "${BuildConfig.APPLICATION_ID}.fileprovider", file) + fun getUriForFile(context: Context, file: File): Uri { + return FileProvider.getUriForFile(context, "${BuildConfig.APPLICATION_ID}.fileprovider", file) + } } } diff --git a/lawnchair/src/app/lawnchair/LawnchairAppWidgetHostView.kt b/lawnchair/src/app/lawnchair/LawnchairAppWidgetHostView.kt index bada2222ce7..f01aae00b80 100644 --- a/lawnchair/src/app/lawnchair/LawnchairAppWidgetHostView.kt +++ b/lawnchair/src/app/lawnchair/LawnchairAppWidgetHostView.kt @@ -54,7 +54,9 @@ class LawnchairAppWidgetHostView @JvmOverloads constructor( return super.getErrorView() } - private fun getEmptyView(): View = View(context) + private fun getEmptyView(): View { + return View(context) + } companion object { diff --git a/lawnchair/src/app/lawnchair/LawnchairLauncher.kt b/lawnchair/src/app/lawnchair/LawnchairLauncher.kt index 8ea33b8f60e..aeebf8f3f11 100644 --- a/lawnchair/src/app/lawnchair/LawnchairLauncher.kt +++ b/lawnchair/src/app/lawnchair/LawnchairLauncher.kt @@ -21,6 +21,7 @@ import android.app.ActivityOptions import android.content.Context import android.content.Intent import android.graphics.Color +import android.graphics.RectF import android.graphics.drawable.Drawable import android.os.Bundle import android.util.Pair @@ -47,6 +48,8 @@ import app.lawnchair.theme.ThemeProvider import app.lawnchair.ui.popup.LawnchairShortcut import app.lawnchair.util.getThemedIconPacksInstalled import app.lawnchair.util.unsafeLazy +import app.lawnchair.wallpaper.service.WallpaperDatabase +import app.lawnchair.wallpaper.service.WallpaperService import com.android.launcher3.AbstractFloatingView import com.android.launcher3.BaseActivity import com.android.launcher3.BubbleTextView @@ -57,6 +60,7 @@ import com.android.launcher3.R import com.android.launcher3.Utilities import com.android.launcher3.model.data.ItemInfo import com.android.launcher3.popup.SystemShortcut +import com.android.launcher3.shortcuts.DeepShortcutView import com.android.launcher3.statemanager.StateManager import com.android.launcher3.statemanager.StateManager.StateHandler import com.android.launcher3.uioverrides.QuickstepLauncher @@ -69,7 +73,10 @@ import com.android.launcher3.util.RunnableList import com.android.launcher3.util.SystemUiController.UI_STATE_BASE_WINDOW import com.android.launcher3.util.Themes import com.android.launcher3.util.TouchController +import com.android.launcher3.views.ActivityContext import com.android.launcher3.views.FloatingSurfaceView +import com.android.launcher3.views.OptionsPopupView +import com.android.launcher3.views.OptionsPopupView.OptionItem import com.android.launcher3.widget.LauncherWidgetHolder import com.android.launcher3.widget.RoundedCornerEnforcement import com.android.systemui.plugins.shared.LauncherOverlayManager @@ -227,6 +234,8 @@ class LawnchairLauncher : QuickstepLauncher() { showQuickstepWarningIfNecessary() reloadIconsIfNeeded() + + WallpaperDatabase.INSTANCE.get(this).checkpointSync() } override fun collectStateHandlers(out: MutableList>) { @@ -298,6 +307,52 @@ class LawnchairLauncher : QuickstepLauncher() { } } + override fun showDefaultOptions(x: Float, y: Float) { + val showWallpaperCarousel = "+carousel" in preferenceManager2.launcherPopupOrder.firstBlocking() + + if (showWallpaperCarousel) { + show( + this, + getPopupTarget(x, y), + OptionsPopupView.getOptions(this), + ) + } else { + super.showDefaultOptions(x, y) + } + } + + private fun show( + activityContext: ActivityContext?, + targetRect: RectF, + items: List, + shouldAddArrow: Boolean = false, + width: Int = 0, + ): OptionsPopupView? where T : Context?, T : ActivityContext? { + if (activityContext == null) return null + + val isEmpty = WallpaperService.INSTANCE.get(this).getTopWallpapers().isEmpty() + val layout = if (isEmpty) R.layout.longpress_options_menu else R.layout.wallpaper_options_popup + + val popup = activityContext.layoutInflater.inflate(layout, activityContext.dragLayer, false) as OptionsPopupView + popup.setTargetRect(targetRect) + popup.setShouldAddArrow(shouldAddArrow) + + for (item in items) { + val deepLayout = if (isEmpty) R.layout.system_shortcut else R.layout.wallpaper_options_popup_item + + val view = popup.inflateAndAdd(deepLayout, popup) + if (width > 0) view.layoutParams.width = width + view.iconView.setBackgroundDrawable(item.icon) + view.bubbleText.text = item.label + view.setOnClickListener(popup) +// view.onLongClickListener = popup + popup.mItemMap[view] = item + } + + popup.show() + return popup + } + override fun createAppWidgetHolder(): LauncherWidgetHolder { val factory = LauncherWidgetHolder.HolderFactory.newFactory(this) as LawnchairWidgetHolder.LawnchairHolderFactory return factory.newInstance( @@ -332,10 +387,12 @@ class LawnchairLauncher : QuickstepLauncher() { return ActivityOptionsWrapper(options, callbacks) } - override fun getActivityLaunchOptions(v: View?, item: ItemInfo?): ActivityOptionsWrapper = runCatching { - super.getActivityLaunchOptions(v, item) - }.getOrElse { - getActivityLaunchOptionsDefault(v) + override fun getActivityLaunchOptions(v: View?, item: ItemInfo?): ActivityOptionsWrapper { + return runCatching { + super.getActivityLaunchOptions(v, item) + }.getOrElse { + getActivityLaunchOptionsDefault(v) + } } private fun getActivityLaunchOptionsDefault(v: View?): ActivityOptionsWrapper { @@ -372,21 +429,23 @@ class LawnchairLauncher : QuickstepLauncher() { super.onResume() restartIfPending() - dragLayer.viewTreeObserver.addOnDrawListener(object : ViewTreeObserver.OnDrawListener { - private var handled = false + dragLayer.viewTreeObserver.addOnDrawListener( + object : ViewTreeObserver.OnDrawListener { + private var handled = false - override fun onDraw() { - if (handled) { - return - } - handled = true + override fun onDraw() { + if (handled) { + return + } + handled = true - dragLayer.post { - dragLayer.viewTreeObserver.removeOnDrawListener(this) + dragLayer.post { + dragLayer.viewTreeObserver.removeOnDrawListener(this) + } + depthController } - depthController - } - }) + }, + ) } override fun onDestroy() { diff --git a/lawnchair/src/app/lawnchair/LawnchairLayoutFactory.kt b/lawnchair/src/app/lawnchair/LawnchairLayoutFactory.kt index b226216c3ac..67bbe9b4508 100644 --- a/lawnchair/src/app/lawnchair/LawnchairLayoutFactory.kt +++ b/lawnchair/src/app/lawnchair/LawnchairLayoutFactory.kt @@ -36,7 +36,9 @@ class LawnchairLayoutFactory(context: Context) : return view } - override fun onCreateView(name: String, context: Context, attrs: AttributeSet): View? = onCreateView(null, name, context, attrs) + override fun onCreateView(name: String, context: Context, attrs: AttributeSet): View? { + return onCreateView(null, name, context, attrs) + } override fun close() { TODO("Not yet implemented") diff --git a/lawnchair/src/app/lawnchair/allapps/AllAppsSearchInput.kt b/lawnchair/src/app/lawnchair/allapps/AllAppsSearchInput.kt index 4b1af943b8b..6a40a63f5ba 100644 --- a/lawnchair/src/app/lawnchair/allapps/AllAppsSearchInput.kt +++ b/lawnchair/src/app/lawnchair/allapps/AllAppsSearchInput.kt @@ -2,8 +2,10 @@ package app.lawnchair.allapps import android.animation.ValueAnimator import android.content.Context +import android.content.res.ColorStateList import android.graphics.Color import android.graphics.Rect +import android.graphics.drawable.RippleDrawable import android.provider.SearchRecentSuggestions import android.text.Selection import android.text.SpannableStringBuilder @@ -15,6 +17,8 @@ import android.view.KeyEvent import android.view.View import android.view.View.OnFocusChangeListener import android.view.ViewTreeObserver +import android.view.animation.AccelerateDecelerateInterpolator +import android.view.animation.DecelerateInterpolator import android.widget.FrameLayout import android.widget.ImageButton import android.widget.TextView @@ -22,6 +26,7 @@ import androidx.core.view.ViewCompat import androidx.core.view.isInvisible import androidx.core.view.isVisible import androidx.core.widget.addTextChangedListener +import androidx.interpolator.view.animation.FastOutSlowInInterpolator import androidx.lifecycle.lifecycleScope import app.lawnchair.launcher import app.lawnchair.preferences.PreferenceManager @@ -87,18 +92,35 @@ class AllAppsSearchInput(context: Context, attrs: AttributeSet?) : private var canShowHint = false private val bg = DrawableTokens.SearchInputFg.resolve(context) - private val bgAlphaAnimator = ValueAnimator.ofFloat(0f, 1f).apply { duration = 300 } + private val bgAlphaAnimator = ValueAnimator.ofFloat(0f, 1f).apply { + duration = 300 + interpolator = DecelerateInterpolator() + } + private val rippleBackground = RippleDrawable( + ColorStateList.valueOf(Themes.getAttrColor(context, android.R.attr.colorControlHighlight)), + bg, + null, + ) private var bgVisible = true private var bgAlpha = 1f private val suggestionsRecent = SearchRecentSuggestions(launcher, LawnchairRecentSuggestionProvider.AUTHORITY, LawnchairRecentSuggestionProvider.MODE) private val prefs = PreferenceManager.getInstance(launcher) private val prefs2 = PreferenceManager2.getInstance(launcher) + private var initialPaddingLeft: Int = 0 + private var initialPaddingRight: Int = 0 + override fun onFinishInflate() { super.onFinishInflate() val wrapper = ViewCompat.requireViewById(this, R.id.search_wrapper) wrapper.background = bg + launcher.deviceProfile.let { dp -> + val padding = dp.desiredWorkspaceHorizontalMarginPx * 2 + dp.allAppsPadding.run { left + right * 2 } + initialPaddingLeft = padding + initialPaddingRight = padding + setPadding(padding, paddingTop, padding, paddingBottom) + } bgAlphaAnimator.addUpdateListener { updateBgAlpha() } hint = ViewCompat.requireViewById(this, R.id.hint) @@ -122,11 +144,6 @@ class AllAppsSearchInput(context: Context, attrs: AttributeSet?) : lensIcon.isVisible = shouldShowIcons && supportsLens && lensIntent != null with(input) { - if (prefs2.searchAlgorithm.firstBlocking() != LawnchairSearchAlgorithm.APP_SEARCH) { - setHint(R.string.all_apps_device_search_hint) - } else { - setHint(R.string.all_apps_search_bar_hint) - } addTextChangedListener { actionButton.isVisible = !it.isNullOrEmpty() micIcon.isVisible = shouldShowIcons && voiceIntent != null && it.isNullOrEmpty() @@ -139,6 +156,7 @@ class AllAppsSearchInput(context: Context, attrs: AttributeSet?) : isVisible = false setOnClickListener { input.reset() + updateHint() } } @@ -147,20 +165,15 @@ class AllAppsSearchInput(context: Context, attrs: AttributeSet?) : isVisible = true val iconRes = if (themed) searchProvider.themedIcon else searchProvider.icon - if (shouldShowIcons) { - setThemedIconResource( - resId = iconRes, - themed = themed || iconRes == R.drawable.ic_qsb_search, - method = searchProvider.themingMethod, - ) - } else { - // Always theme default search icon - setThemedIconResource( - resId = R.drawable.ic_qsb_search, - themed = true, - method = ThemingMethod.TINT, - ) - } + val resId = if (shouldShowIcons) iconRes else R.drawable.ic_qsb_search + val isThemed = themed || resId == R.drawable.ic_qsb_search + val method = if (shouldShowIcons) searchProvider.themingMethod else ThemingMethod.TINT + + setThemedIconResource( + resId = resId, + themed = isThemed, + method = method, + ) setOnClickListener { val launcher = context.launcher @@ -184,13 +197,34 @@ class AllAppsSearchInput(context: Context, attrs: AttributeSet?) : } } } + val currentPaddingLeft = initialPaddingLeft + val currentPaddingRight = initialPaddingRight + input.onFocusChangeListener = OnFocusChangeListener { _, hasFocus -> - if (prefs.searchResulRecentSuggestion.get()) { - input.onFocusChangeListener = OnFocusChangeListener { _, hasFocus -> - if (!hasFocus) { + if (hasFocus) { + if (prefs2.searchAlgorithm.firstBlocking() != LawnchairSearchAlgorithm.APP_SEARCH) { + input.setHint(R.string.all_apps_device_search_hint) + } else { + input.setHint(R.string.all_apps_search_bar_hint) + } + + triggerRippleEffect(true) + setBackgroundVisibility(false, 0f) + animateHintVisibility(true) + animatePadding(currentPaddingLeft / 2, currentPaddingRight / 2) + } else { + triggerRippleEffect(false) + setBackgroundVisibility(true, 1f) + animateHintVisibility(false) + if (prefs.searchResulRecentSuggestion.get()) { val query = editText.text.toString() suggestionsRecent.saveRecentQuery(query, null) } + + animatePadding(currentPaddingLeft, currentPaddingRight) + focusedResultTitle = "" + input.setHint("") + hint.text = "" } } @@ -201,20 +235,69 @@ class AllAppsSearchInput(context: Context, attrs: AttributeSet?) : afterTextChanged = { updateHint() if (input.text.toString() == "/lawnchairdebug") { - val enableDebugMenu = PreferenceManager.getInstance(context).enableDebugMenu + val enableDebugMenu = prefs.enableDebugMenu enableDebugMenu.set(!enableDebugMenu.get()) launcher.stateManager.goToState(LauncherState.NORMAL) } }, ) - val hide = PreferenceManager2.getInstance(context).hideAppDrawerSearchBar.firstBlocking() + val hide = prefs2.hideAppDrawerSearchBar.firstBlocking() if (hide) { isInvisible = true layoutParams.height = 0 } } + private fun animateHintVisibility(visible: Boolean) { + val targetAlpha = if (visible) 1f else 0f + val duration = if (visible) 300L else 200L + + if (visible) { + hint.alpha = 0f + hint.isVisible = true + } + + hint.animate() + .alpha(targetAlpha) + .setDuration(duration) + .setInterpolator(FastOutSlowInInterpolator()) + .withEndAction { + if (!visible) hint.isVisible = false + } + .start() + } + + private fun triggerRippleEffect(expand: Boolean) { + rippleBackground.setHotspot(width / 2f, height / 2f) + ValueAnimator.ofFloat(if (expand) 1f else 0f, if (expand) 0f else 1f).apply { + duration = 500 + interpolator = AccelerateDecelerateInterpolator() + addUpdateListener { + val alpha = it.animatedValue as Float + rippleBackground.alpha = (alpha * 255).toInt() + } + start() + } + } + + private fun animatePadding(newPaddingLeft: Int, newPaddingRight: Int) { + val currentPaddingLeft = paddingLeft + val currentPaddingRight = paddingRight + + ValueAnimator.ofFloat(0f, 1f).apply { + duration = 300 + interpolator = FastOutSlowInInterpolator() + addUpdateListener { animation -> + val fraction = animation.animatedFraction + val leftPadding = currentPaddingLeft + (newPaddingLeft - currentPaddingLeft) * fraction + val rightPadding = currentPaddingRight + (newPaddingRight - currentPaddingRight) * fraction + setPadding(leftPadding.toInt(), paddingTop, rightPadding.toInt(), paddingBottom) + } + start() + } + } + override fun setFocusedResultTitle(title: CharSequence?, sub: CharSequence?, showArrow: Boolean) { focusedResultTitle = title?.toString().orEmpty() updateHint() @@ -323,16 +406,13 @@ class AllAppsSearchInput(context: Context, attrs: AttributeSet?) : } override fun setInsets(insets: Rect) { - val lp = layoutParams as MarginLayoutParams - if (isInvisible) { - lp.topMargin = insets.top - allAppsSearchVerticalOffset - return + (layoutParams as MarginLayoutParams).apply { + topMargin = if (isInvisible) { + insets.top - allAppsSearchVerticalOffset + } else { + max(-allAppsSearchVerticalOffset, insets.top - qsbMarginTopAdjusting) + } } - lp.topMargin = max(-allAppsSearchVerticalOffset, insets.top - qsbMarginTopAdjusting) - - val dp = launcher.deviceProfile - val horizontalPadding = dp.desiredWorkspaceHorizontalMarginPx + dp.desiredWorkspaceHorizontalMarginPx - setPadding(horizontalPadding, paddingTop, horizontalPadding, paddingBottom) requestLayout() } @@ -359,7 +439,9 @@ class AllAppsSearchInput(context: Context, attrs: AttributeSet?) : } } - override fun getBackgroundVisibility(): Boolean = bgVisible + override fun getBackgroundVisibility(): Boolean { + return bgVisible + } private fun updateBgAlpha() { val fraction = bgAlphaAnimator.animatedFraction diff --git a/lawnchair/src/app/lawnchair/allapps/views/SearchResultView.kt b/lawnchair/src/app/lawnchair/allapps/views/SearchResultView.kt index 11d3c34a4ba..7334ee58a2f 100644 --- a/lawnchair/src/app/lawnchair/allapps/views/SearchResultView.kt +++ b/lawnchair/src/app/lawnchair/allapps/views/SearchResultView.kt @@ -36,7 +36,9 @@ sealed interface SearchResultView { return flags } - fun hasFlag(flags: Int, flag: Int): Boolean = (flags and flag) != 0 + fun hasFlag(flags: Int, flag: Int): Boolean { + return (flags and flag) != 0 + } fun shouldHandleClick(targetCompat: SearchTargetCompat): Boolean { val packageName = targetCompat.packageName diff --git a/lawnchair/src/app/lawnchair/animation/PhysicsAnimator.kt b/lawnchair/src/app/lawnchair/animation/PhysicsAnimator.kt index bae9ec258f5..828a5363824 100644 --- a/lawnchair/src/app/lawnchair/animation/PhysicsAnimator.kt +++ b/lawnchair/src/app/lawnchair/animation/PhysicsAnimator.kt @@ -202,13 +202,15 @@ class PhysicsAnimator private constructor(target: T) { toPosition: Float, startVelocity: Float, config: SpringConfig = defaultSpring, - ): PhysicsAnimator = spring( - property, - toPosition, - startVelocity, - config.stiffness, - config.dampingRatio, - ) + ): PhysicsAnimator { + return spring( + property, + toPosition, + startVelocity, + config.stiffness, + config.dampingRatio, + ) + } /** * Springs a property to a given value using the provided configuration options, and a start @@ -220,7 +222,9 @@ class PhysicsAnimator private constructor(target: T) { property: FloatPropertyCompat, toPosition: Float, config: SpringConfig = defaultSpring, - ): PhysicsAnimator = spring(property, toPosition, 0f, config) + ): PhysicsAnimator { + return spring(property, toPosition, 0f, config) + } /** * Springs a property to a given value using the provided configuration options, and a start @@ -231,7 +235,9 @@ class PhysicsAnimator private constructor(target: T) { fun spring( property: FloatPropertyCompat, toPosition: Float, - ): PhysicsAnimator = spring(property, toPosition, 0f) + ): PhysicsAnimator { + return spring(property, toPosition, 0f) + } /** * Flings a property using the given start velocity, using a [FlingAnimation] configured using @@ -283,7 +289,9 @@ class PhysicsAnimator private constructor(target: T) { property: FloatPropertyCompat, startVelocity: Float, config: FlingConfig = defaultFling, - ): PhysicsAnimator = fling(property, startVelocity, config.friction, config.min, config.max) + ): PhysicsAnimator { + return fling(property, startVelocity, config.friction, config.min, config.max) + } /** * Flings a property using the given start velocity. If the fling animation reaches the min/max @@ -618,15 +626,19 @@ class PhysicsAnimator private constructor(target: T) { private fun getSpringAnimation( property: FloatPropertyCompat, target: T, - ): SpringAnimation = springAnimations.getOrPut(property) { - configureDynamicAnimation(SpringAnimation(target, property), property) - as SpringAnimation + ): SpringAnimation { + return springAnimations.getOrPut(property) { + configureDynamicAnimation(SpringAnimation(target, property), property) + as SpringAnimation + } } /** Retrieves a fling animation for the given property, building one if needed. */ - private fun getFlingAnimation(property: FloatPropertyCompat, target: T): FlingAnimation = flingAnimations.getOrPut(property) { - configureDynamicAnimation(FlingAnimation(target, property), property) - as FlingAnimation + private fun getFlingAnimation(property: FloatPropertyCompat, target: T): FlingAnimation { + return flingAnimations.getOrPut(property) { + configureDynamicAnimation(FlingAnimation(target, property), property) + as FlingAnimation + } } /** @@ -782,17 +794,25 @@ class PhysicsAnimator private constructor(target: T) { } /** Return true if any animations are running on the object. */ - fun isRunning(): Boolean = arePropertiesAnimating(springAnimations.keys.union(flingAnimations.keys)) + fun isRunning(): Boolean { + return arePropertiesAnimating(springAnimations.keys.union(flingAnimations.keys)) + } /** Returns whether the given property is animating. */ - fun isPropertyAnimating(property: FloatPropertyCompat): Boolean = springAnimations[property]?.isRunning ?: false || - flingAnimations[property]?.isRunning ?: false + fun isPropertyAnimating(property: FloatPropertyCompat): Boolean { + return springAnimations[property]?.isRunning ?: false || + flingAnimations[property]?.isRunning ?: false + } /** Returns whether any of the given properties are animating. */ - fun arePropertiesAnimating(properties: Set>): Boolean = properties.any { isPropertyAnimating(it) } + fun arePropertiesAnimating(properties: Set>): Boolean { + return properties.any { isPropertyAnimating(it) } + } /** Return the set of properties that will begin animating upon calling [start]. */ - internal fun getAnimatedProperties(): Set> = springConfigs.keys.union(flingConfigs.keys) + internal fun getAnimatedProperties(): Set> { + return springConfigs.keys.union(flingConfigs.keys) + } /** * Cancels the given properties. This is typically called immediately by [cancel], unless this @@ -1025,19 +1045,21 @@ class PhysicsAnimator private constructor(target: T) { } @JvmStatic - fun getReadablePropertyName(property: FloatPropertyCompat<*>): String = when (property) { - DynamicAnimation.TRANSLATION_X -> "translationX" - DynamicAnimation.TRANSLATION_Y -> "translationY" - DynamicAnimation.TRANSLATION_Z -> "translationZ" - DynamicAnimation.SCALE_X -> "scaleX" - DynamicAnimation.SCALE_Y -> "scaleY" - DynamicAnimation.ROTATION -> "rotation" - DynamicAnimation.ROTATION_X -> "rotationX" - DynamicAnimation.ROTATION_Y -> "rotationY" - DynamicAnimation.SCROLL_X -> "scrollX" - DynamicAnimation.SCROLL_Y -> "scrollY" - DynamicAnimation.ALPHA -> "alpha" - else -> "Custom FloatPropertyCompat instance" + fun getReadablePropertyName(property: FloatPropertyCompat<*>): String { + return when (property) { + DynamicAnimation.TRANSLATION_X -> "translationX" + DynamicAnimation.TRANSLATION_Y -> "translationY" + DynamicAnimation.TRANSLATION_Z -> "translationZ" + DynamicAnimation.SCALE_X -> "scaleX" + DynamicAnimation.SCALE_Y -> "scaleY" + DynamicAnimation.ROTATION -> "rotation" + DynamicAnimation.ROTATION_X -> "rotationX" + DynamicAnimation.ROTATION_Y -> "rotationY" + DynamicAnimation.SCROLL_X -> "scrollX" + DynamicAnimation.SCROLL_Y -> "scrollY" + DynamicAnimation.ALPHA -> "alpha" + else -> "Custom FloatPropertyCompat instance" + } } } } diff --git a/lawnchair/src/app/lawnchair/backup/LawnchairBackup.kt b/lawnchair/src/app/lawnchair/backup/LawnchairBackup.kt index 867ae063502..18f5b3fdb38 100644 --- a/lawnchair/src/app/lawnchair/backup/LawnchairBackup.kt +++ b/lawnchair/src/app/lawnchair/backup/LawnchairBackup.kt @@ -132,12 +132,14 @@ class LawnchairBackup( return "$fileName.lawnchairbackup" } - fun getFiles(context: Context, forRestore: Boolean): Map = mapOf( - LAUNCHER_DB_FILE_NAME to launcherDbFile(context, forRestore), - PREFS_FILE_NAME to prefsFile(context), - PREFS_DB_FILE_NAME to prefsDbFile(context), - PREFS_DATASTORE_FILE_NAME to prefsDataStoreFile(context), - ) + fun getFiles(context: Context, forRestore: Boolean): Map { + return mapOf( + LAUNCHER_DB_FILE_NAME to launcherDbFile(context, forRestore), + PREFS_FILE_NAME to prefsFile(context), + PREFS_DB_FILE_NAME to prefsDbFile(context), + PREFS_DATASTORE_FILE_NAME to prefsDataStoreFile(context), + ) + } @SuppressLint("MissingPermission") suspend fun create(context: Context, contents: Int, screenshotBitmap: Bitmap, fileUri: Uri) { @@ -198,8 +200,12 @@ class LawnchairBackup( return File(dir, "shared_prefs/$PREFS_FILE_NAME") } - private fun prefsDbFile(context: Context): File = context.getDatabasePath(PREFS_DB_FILE_NAME) + private fun prefsDbFile(context: Context): File { + return context.getDatabasePath(PREFS_DB_FILE_NAME) + } - private fun prefsDataStoreFile(context: Context): File = File(context.filesDir, "datastore/${PREFS_DATASTORE_FILE_NAME}") + private fun prefsDataStoreFile(context: Context): File { + return File(context.filesDir, "datastore/${PREFS_DATASTORE_FILE_NAME}") + } } } diff --git a/lawnchair/src/app/lawnchair/backup/ui/CreateBackupViewModel.kt b/lawnchair/src/app/lawnchair/backup/ui/CreateBackupViewModel.kt index aa9da95797c..1d59b93a4aa 100644 --- a/lawnchair/src/app/lawnchair/backup/ui/CreateBackupViewModel.kt +++ b/lawnchair/src/app/lawnchair/backup/ui/CreateBackupViewModel.kt @@ -40,40 +40,42 @@ class CreateBackupViewModel( } } - private suspend fun captureScreenshot(): Bitmap? = suspendCancellableCoroutine { continuation -> - val app = getApplication() + private suspend fun captureScreenshot(): Bitmap? { + return suspendCancellableCoroutine { continuation -> + val app = getApplication() - val config = Configuration(app.resources.configuration).apply { - orientation = Configuration.ORIENTATION_PORTRAIT - val width = screenWidthDp - val height = screenHeightDp - screenWidthDp = min(width, height) - screenHeightDp = max(width, height) - } - val context = app.createConfigurationContext(config) + val config = Configuration(app.resources.configuration).apply { + orientation = Configuration.ORIENTATION_PORTRAIT + val width = screenWidthDp + val height = screenHeightDp + screenWidthDp = min(width, height) + screenHeightDp = max(width, height) + } + val context = app.createConfigurationContext(config) - val idp = LauncherAppState.getIDP(context) - val themedContext = ContextThemeWrapper(context, R.style.Theme_Lawnchair) - val previewView = LauncherPreviewView( - context = themedContext, - idp = idp, - dummyInsets = true, - dummySmartspace = true, - appContext = themedContext, - ) - continuation.invokeOnCancellation { previewView.destroy() } - previewView.addOnReadyCallback { - val dp = idp.getDeviceProfile(context) - val width = dp.widthPx - val height = dp.heightPx - previewView.measure( - MeasureSpec.makeMeasureSpec(width, EXACTLY), - MeasureSpec.makeMeasureSpec(height, EXACTLY), + val idp = LauncherAppState.getIDP(context) + val themedContext = ContextThemeWrapper(context, R.style.Theme_Lawnchair) + val previewView = LauncherPreviewView( + context = themedContext, + idp = idp, + dummyInsets = true, + dummySmartspace = true, + appContext = themedContext, ) - previewView.layout(0, 0, width, height) - val bitmap = BitmapRenderer.createHardwareBitmap(width, height, previewView::draw) - continuation.resume(bitmap) - previewView.destroy() + continuation.invokeOnCancellation { previewView.destroy() } + previewView.addOnReadyCallback { + val dp = idp.getDeviceProfile(context) + val width = dp.widthPx + val height = dp.heightPx + previewView.measure( + MeasureSpec.makeMeasureSpec(width, EXACTLY), + MeasureSpec.makeMeasureSpec(height, EXACTLY), + ) + previewView.layout(0, 0, width, height) + val bitmap = BitmapRenderer.createHardwareBitmap(width, height, previewView::draw) + continuation.resume(bitmap) + previewView.destroy() + } } } diff --git a/lawnchair/src/app/lawnchair/bugreport/LawnchairBugReporter.kt b/lawnchair/src/app/lawnchair/bugreport/LawnchairBugReporter.kt index 6bad1d13352..d9520f6a8d1 100644 --- a/lawnchair/src/app/lawnchair/bugreport/LawnchairBugReporter.kt +++ b/lawnchair/src/app/lawnchair/bugreport/LawnchairBugReporter.kt @@ -79,7 +79,9 @@ class LawnchairBugReporter(private val context: Context) { return BugReport(id, error, getDescription(throwable ?: return null), contentsWithHeader, reportFile) } - private fun getDescription(throwable: Throwable): String = "${throwable::class.java.name}: ${throwable.message}" + private fun getDescription(throwable: Throwable): String { + return "${throwable::class.java.name}: ${throwable.message}" + } private fun save(contents: String, id: Int): File? { val dest = File(logsFolder, String.format("%x", id)) diff --git a/lawnchair/src/app/lawnchair/factory/LawnchairWidgetHolder.kt b/lawnchair/src/app/lawnchair/factory/LawnchairWidgetHolder.kt index d5c71b93346..1d3b5910396 100644 --- a/lawnchair/src/app/lawnchair/factory/LawnchairWidgetHolder.kt +++ b/lawnchair/src/app/lawnchair/factory/LawnchairWidgetHolder.kt @@ -19,10 +19,12 @@ class LawnchairWidgetHolder(context: Context, intConsumer: IntConsumer?) : Launc override fun newInstance( context: Context, appWidgetRemovedCallback: IntConsumer?, - ): LauncherWidgetHolder = try { - newInstance(context, appWidgetRemovedCallback, null) - } catch (t: Throwable) { - super.newInstance(context, appWidgetRemovedCallback) + ): LauncherWidgetHolder { + return try { + newInstance(context, appWidgetRemovedCallback, null) + } catch (t: Throwable) { + super.newInstance(context, appWidgetRemovedCallback) + } } /** diff --git a/lawnchair/src/app/lawnchair/font/FontCache.kt b/lawnchair/src/app/lawnchair/font/FontCache.kt index 0ac6fbde93e..4a61cb9488d 100644 --- a/lawnchair/src/app/lawnchair/font/FontCache.kt +++ b/lawnchair/src/app/lawnchair/font/FontCache.kt @@ -73,7 +73,9 @@ class FontCache private constructor(private val context: Context) : SafeCloseabl val uiText = ResourceFont(context, R.font.inter_regular, "Inter v3 " + context.getString(R.string.font_weight_regular)) val uiTextMedium = ResourceFont(context, R.font.inter_medium, "Inter v3 " + context.getString(R.string.font_weight_medium)) - suspend fun getTypeface(font: Font): Typeface? = loadFontAsync(font).await()?.typeface + suspend fun getTypeface(font: Font): Typeface? { + return loadFontAsync(font).await()?.typeface + } fun preloadFont(font: Font) { @Suppress("DeferredResultUnused") @@ -87,9 +89,11 @@ class FontCache private constructor(private val context: Context) : SafeCloseabl return deferredFont.getCompleted() } - private fun loadFontAsync(font: Font): Deferred = deferredFonts.getOrPut(font) { - scope.async { - font.load()?.let { LoadedFont(it) } + private fun loadFontAsync(font: Font): Deferred { + return deferredFonts.getOrPut(font) { + scope.async { + font.load()?.let { LoadedFont(it) } + } } } @@ -150,7 +154,9 @@ class FontCache private constructor(private val context: Context) : SafeCloseabl obj.put(KEY_CLASS_NAME, this::class.java.name) } - open fun createWithWeight(weight: Int): Font = this + open fun createWithWeight(weight: Int): Font { + return this + } fun toJsonString(): String { val obj = JSONObject() @@ -176,11 +182,17 @@ class FontCache private constructor(private val context: Context) : SafeCloseabl override val fullDisplayName = typeface.toString() override val displayName get() = fullDisplayName - override suspend fun load(): Typeface? = typeface + override suspend fun load(): Typeface? { + return typeface + } - override fun equals(other: Any?): Boolean = other is TypefaceFont && typeface == other.typeface + override fun equals(other: Any?): Boolean { + return other is TypefaceFont && typeface == other.typeface + } - override fun hashCode(): Int = fullDisplayName.hashCode() + override fun hashCode(): Int { + return fullDisplayName.hashCode() + } } class DummyFont : TypefaceFont(null) { @@ -189,15 +201,21 @@ class FontCache private constructor(private val context: Context) : SafeCloseabl override val composeFontFamily = FontFamily(Typeface.DEFAULT) - override fun equals(other: Any?): Boolean = other is DummyFont + override fun equals(other: Any?): Boolean { + return other is DummyFont + } - override fun hashCode(): Int = hashCode + override fun hashCode(): Int { + return hashCode + } companion object { @Keep @JvmStatic - fun fromJson(context: Context, obj: JSONObject): Font = DummyFont() + fun fromJson(context: Context, obj: JSONObject): Font { + return DummyFont() + } } } @@ -220,7 +238,9 @@ class FontCache private constructor(private val context: Context) : SafeCloseabl obj.put(KEY_FONT_NAME, fullDisplayName) } - override fun equals(other: Any?): Boolean = other is TTFFont && actualName == other.actualName + override fun equals(other: Any?): Boolean { + return other is TTFFont && actualName == other.actualName + } override fun hashCode() = actualName.hashCode() @@ -228,9 +248,13 @@ class FontCache private constructor(private val context: Context) : SafeCloseabl fun createTypeface(file: File): Typeface? = runCatching { Typeface.createFromFile(file) }.getOrNull() - fun getFontsDir(context: Context): File = File(context.filesDir, "customFonts").apply { mkdirs() } + fun getFontsDir(context: Context): File { + return File(context.filesDir, "customFonts").apply { mkdirs() } + } - fun getFile(context: Context, name: String): File = File(getFontsDir(context), Uri.encode(name)) + fun getFile(context: Context, name: String): File { + return File(getFontsDir(context), Uri.encode(name)) + } @Keep @JvmStatic @@ -257,9 +281,13 @@ class FontCache private constructor(private val context: Context) : SafeCloseabl obj.put(KEY_STYLE, style) } - override fun equals(other: Any?): Boolean = other is SystemFont && family == other.family && style == other.style + override fun equals(other: Any?): Boolean { + return other is SystemFont && family == other.family && style == other.style + } - override fun hashCode(): Int = hashCode + override fun hashCode(): Int { + return hashCode + } override fun createWithWeight(weight: Int): Font { if (weight >= 700) { @@ -295,9 +323,13 @@ class FontCache private constructor(private val context: Context) : SafeCloseabl obj.put(KEY_FAMILY_NAME, name) } - override fun equals(other: Any?): Boolean = other is AssetFont && name == other.name + override fun equals(other: Any?): Boolean { + return other is AssetFont && name == other.name + } - override fun hashCode(): Int = hashCode + override fun hashCode(): Int { + return hashCode + } companion object { @@ -328,9 +360,13 @@ class FontCache private constructor(private val context: Context) : SafeCloseabl obj.put(KEY_FAMILY_NAME, name) } - override fun equals(other: Any?): Boolean = other is ResourceFont && name == other.name + override fun equals(other: Any?): Boolean { + return other is ResourceFont && name == other.name + } - override fun hashCode(): Int = hashCode + override fun hashCode(): Int { + return hashCode + } companion object { @@ -416,9 +452,13 @@ class FontCache private constructor(private val context: Context) : SafeCloseabl obj.put(KEY_VARIANTS, variantsArray) } - override fun equals(other: Any?): Boolean = other is GoogleFont && family == other.family && variant == other.variant + override fun equals(other: Any?): Boolean { + return other is GoogleFont && family == other.family && variant == other.variant + } - override fun hashCode(): Int = hashCode + override fun hashCode(): Int { + return hashCode + } override fun createWithWeight(weight: Int): Font { if (weight == -1) return this diff --git a/lawnchair/src/app/lawnchair/font/googlefonts/GoogleFontsListing.kt b/lawnchair/src/app/lawnchair/font/googlefonts/GoogleFontsListing.kt index 641ca3cee42..a856624702b 100644 --- a/lawnchair/src/app/lawnchair/font/googlefonts/GoogleFontsListing.kt +++ b/lawnchair/src/app/lawnchair/font/googlefonts/GoogleFontsListing.kt @@ -63,7 +63,9 @@ class GoogleFontsListing private constructor(private val context: Context) : Saf return fonts } - suspend fun getFonts(): List = fonts.await() + suspend fun getFonts(): List { + return fonts.await() + } override fun close() { TODO("Not yet implemented") @@ -84,7 +86,9 @@ class GoogleFontsListing private constructor(private val context: Context) : Saf class GoogleFontInfo(val family: String, val variants: List) : Comparable { - override fun compareTo(other: GoogleFontInfo): Int = family.compareTo(other.family) + override fun compareTo(other: GoogleFontInfo): Int { + return family.compareTo(other.family) + } } companion object { @@ -101,7 +105,9 @@ class GoogleFontsListing private constructor(private val context: Context) : Saf return variant.replace("italic", "").replace("regular", "400") } - fun isItalic(variant: String): Boolean = variant.contains("italic") + fun isItalic(variant: String): Boolean { + return variant.contains("italic") + } fun buildQuery(family: String, variant: String): String { val weight = getWeight(variant) diff --git a/lawnchair/src/app/lawnchair/gestures/DirectionalGestureListener.kt b/lawnchair/src/app/lawnchair/gestures/DirectionalGestureListener.kt index 504fe467d48..6c79898a563 100644 --- a/lawnchair/src/app/lawnchair/gestures/DirectionalGestureListener.kt +++ b/lawnchair/src/app/lawnchair/gestures/DirectionalGestureListener.kt @@ -13,32 +13,38 @@ open class DirectionalGestureListener(ctx: Context?) : OnTouchListener { private val mGestureDetector: GestureDetector @SuppressLint("ClickableViewAccessibility") - override fun onTouch(v: View, event: MotionEvent): Boolean = mGestureDetector.onTouchEvent(event) + override fun onTouch(v: View, event: MotionEvent): Boolean { + return mGestureDetector.onTouchEvent(event) + } private inner class GestureListener : SimpleOnGestureListener() { - override fun onDown(e: MotionEvent): Boolean = true + override fun onDown(e: MotionEvent): Boolean { + return true + } private fun shouldReactToSwipe(diff: Float, velocity: Float): Boolean = abs(diff) > SWIPE_THRESHOLD && abs(velocity) > SWIPE_VELOCITY_THRESHOLD - override fun onFling(e1: MotionEvent?, e2: MotionEvent, velocityX: Float, velocityY: Float): Boolean = try { - val diffY = e2.y - (e1?.y ?: 0f) - val diffX = e2.x - (e1?.x ?: 0f) + override fun onFling(e1: MotionEvent?, e2: MotionEvent, velocityX: Float, velocityY: Float): Boolean { + return try { + val diffY = e2.y - (e1?.y ?: 0f) + val diffX = e2.x - (e1?.x ?: 0f) - when { - abs(diffX) > abs(diffY) && shouldReactToSwipe(diffX, velocityX) -> { - if (diffX > 0) onSwipeRight() else onSwipeLeft() - true - } - shouldReactToSwipe(diffY, velocityY) -> { - if (diffY > 0) onSwipeBottom() else onSwipeTop() - true + when { + abs(diffX) > abs(diffY) && shouldReactToSwipe(diffX, velocityX) -> { + if (diffX > 0) onSwipeRight() else onSwipeLeft() + true + } + shouldReactToSwipe(diffY, velocityY) -> { + if (diffY > 0) onSwipeBottom() else onSwipeTop() + true + } + else -> false } - else -> false + } catch (e: Exception) { + e.printStackTrace() + false } - } catch (e: Exception) { - e.printStackTrace() - false } } diff --git a/lawnchair/src/app/lawnchair/gestures/VerticalSwipeTouchController.kt b/lawnchair/src/app/lawnchair/gestures/VerticalSwipeTouchController.kt index 4a5588ec3b0..c872089b098 100644 --- a/lawnchair/src/app/lawnchair/gestures/VerticalSwipeTouchController.kt +++ b/lawnchair/src/app/lawnchair/gestures/VerticalSwipeTouchController.kt @@ -60,7 +60,9 @@ class VerticalSwipeTouchController( return detector.isDraggingOrSettling } - override fun onControllerTouchEvent(ev: MotionEvent): Boolean = detector.onTouchEvent(ev) + override fun onControllerTouchEvent(ev: MotionEvent): Boolean { + return detector.onTouchEvent(ev) + } private fun canInterceptTouch(ev: MotionEvent): Boolean { if ((ev.edgeFlags and Utilities.EDGE_NAV_BAR) != 0) { @@ -121,7 +123,9 @@ class VerticalSwipeTouchController( /** * Returns a time-dependent dampening factor using delta time. */ - private fun computeDampeningFactor(deltaTime: Float): Float = deltaTime / (SCROLL_VELOCITY_DAMPENING_RC + deltaTime) + private fun computeDampeningFactor(deltaTime: Float): Float { + return deltaTime / (SCROLL_VELOCITY_DAMPENING_RC + deltaTime) + } companion object { private const val SCROLL_VELOCITY_DAMPENING_RC = 1000f / (2f * Math.PI.toFloat() * 10f) diff --git a/lawnchair/src/app/lawnchair/gestures/handlers/SleepGestureHandler.kt b/lawnchair/src/app/lawnchair/gestures/handlers/SleepGestureHandler.kt index 395c113f801..00fdfdfef7f 100644 --- a/lawnchair/src/app/lawnchair/gestures/handlers/SleepGestureHandler.kt +++ b/lawnchair/src/app/lawnchair/gestures/handlers/SleepGestureHandler.kt @@ -123,7 +123,9 @@ class SleepMethodDeviceAdmin(context: Context) : SleepGestureHandler.SleepMethod class SleepDeviceAdmin : DeviceAdminReceiver() { - override fun onDisableRequested(context: Context, intent: Intent): CharSequence = context.getString(R.string.dt2s_admin_warning) + override fun onDisableRequested(context: Context, intent: Intent): CharSequence { + return context.getString(R.string.dt2s_admin_warning) + } } } diff --git a/lawnchair/src/app/lawnchair/icons/IconPack.kt b/lawnchair/src/app/lawnchair/icons/IconPack.kt index 80099385eab..cac86385527 100644 --- a/lawnchair/src/app/lawnchair/icons/IconPack.kt +++ b/lawnchair/src/app/lawnchair/icons/IconPack.kt @@ -32,7 +32,9 @@ sealed class IconPack( } } - suspend fun load() = deferredLoad.await() + suspend fun load() { + return deferredLoad.await() + } fun loadBlocking() { waiter?.run { @@ -66,15 +68,17 @@ sealed class IconPack( return filtered } - protected fun categorize(allItems: List): List = allItems - .groupBy { alphabeticIndexCompat.computeSectionName(it.label) } - .map { (sectionName, items) -> - IconPickerCategory( - title = sectionName, - items = items, - ) - } - .sortedBy { it.title } + protected fun categorize(allItems: List): List { + return allItems + .groupBy { alphabeticIndexCompat.computeSectionName(it.label) } + .map { (sectionName, items) -> + IconPickerCategory( + title = sectionName, + items = items, + ) + } + .sortedBy { it.title } + } companion object { private val scope = CoroutineScope(Dispatchers.IO) + CoroutineName("IconPack") diff --git a/lawnchair/src/app/lawnchair/icons/IconPickerCategory.kt b/lawnchair/src/app/lawnchair/icons/IconPickerCategory.kt index 01c6fd2e056..2cb20a82f0f 100644 --- a/lawnchair/src/app/lawnchair/icons/IconPickerCategory.kt +++ b/lawnchair/src/app/lawnchair/icons/IconPickerCategory.kt @@ -5,8 +5,10 @@ data class IconPickerCategory( val items: List, ) -fun IconPickerCategory.filter(searchQuery: String): IconPickerCategory = IconPickerCategory( - title = title, - items = items - .filter { it.label.lowercase().contains(searchQuery.lowercase()) }, -) +fun IconPickerCategory.filter(searchQuery: String): IconPickerCategory { + return IconPickerCategory( + title = title, + items = items + .filter { it.label.lowercase().contains(searchQuery.lowercase()) }, + ) +} diff --git a/lawnchair/src/app/lawnchair/icons/LawnchairIconProvider.kt b/lawnchair/src/app/lawnchair/icons/LawnchairIconProvider.kt index a1f2549434b..e5d75c07093 100644 --- a/lawnchair/src/app/lawnchair/icons/LawnchairIconProvider.kt +++ b/lawnchair/src/app/lawnchair/icons/LawnchairIconProvider.kt @@ -197,7 +197,9 @@ class LawnchairIconProvider @JvmOverloads constructor( return defaultIcon } - override fun isThemeEnabled(): Boolean = _themeMap != DISABLED_MAP + override fun isThemeEnabled(): Boolean { + return _themeMap != DISABLED_MAP + } override fun getThemeData(componentName: ComponentName): ThemedIconDrawable.ThemeData? { val td = getDynamicIconsFromMap(context, themeMap, componentName) @@ -207,23 +209,35 @@ class LawnchairIconProvider @JvmOverloads constructor( return themeMap[componentName] ?: themeMap[ComponentName(componentName.packageName, "")] } - override fun getIcon(info: ActivityInfo?): Drawable = CustomAdaptiveIconDrawable.wrapNonNull(super.getIcon(info)) + override fun getIcon(info: ActivityInfo?): Drawable { + return CustomAdaptiveIconDrawable.wrapNonNull(super.getIcon(info)) + } - override fun getIcon(info: ActivityInfo?, iconDpi: Int): Drawable = CustomAdaptiveIconDrawable.wrapNonNull(super.getIcon(info, iconDpi)) + override fun getIcon(info: ActivityInfo?, iconDpi: Int): Drawable { + return CustomAdaptiveIconDrawable.wrapNonNull(super.getIcon(info, iconDpi)) + } - override fun getIcon(info: LauncherActivityInfo?, iconDpi: Int): Drawable = CustomAdaptiveIconDrawable.wrapNonNull(super.getIcon(info, iconDpi)) + override fun getIcon(info: LauncherActivityInfo?, iconDpi: Int): Drawable { + return CustomAdaptiveIconDrawable.wrapNonNull(super.getIcon(info, iconDpi)) + } - override fun getSystemStateForPackage(systemState: String, packageName: String): String = super.getSystemStateForPackage(systemState, packageName) + ",$isThemeEnabled" + override fun getSystemStateForPackage(systemState: String, packageName: String): String { + return super.getSystemStateForPackage(systemState, packageName) + ",$isThemeEnabled" + } - override fun getSystemIconState(): String = super.getSystemIconState() + ",pack:${iconPackPref.get()}/${themedIconPackPref.get()},ver:$iconPackVersion" + override fun getSystemIconState(): String { + return super.getSystemIconState() + ",pack:${iconPackPref.get()}/${themedIconPackPref.get()},ver:$iconPackVersion" + } override fun registerIconChangeListener( callback: IconChangeListener, handler: Handler, - ): SafeCloseable = MultiSafeCloseable().apply { - add(super.registerIconChangeListener(callback, handler)) - add(IconPackChangeReceiver(context, handler, callback)) - add(LawniconsChangeReceiver(context, handler, callback)) + ): SafeCloseable { + return MultiSafeCloseable().apply { + add(super.registerIconChangeListener(callback, handler)) + add(IconPackChangeReceiver(context, handler, callback)) + add(LawniconsChangeReceiver(context, handler, callback)) + } } private inner class IconPackChangeReceiver( diff --git a/lawnchair/src/app/lawnchair/icons/ThemedIconCompat.kt b/lawnchair/src/app/lawnchair/icons/ThemedIconCompat.kt index 9a1b37034f1..698e228a2b4 100644 --- a/lawnchair/src/app/lawnchair/icons/ThemedIconCompat.kt +++ b/lawnchair/src/app/lawnchair/icons/ThemedIconCompat.kt @@ -29,14 +29,16 @@ object ThemedIconCompat { return drawable } - private fun resolveActivityInfo(context: Context, componentName: ComponentName): ActivityInfo? = try { - context.packageManager.getActivityInfo( - componentName, - 0, - ) - } catch (e: PackageManager.NameNotFoundException) { - // Handle the case where the activity is not found - null + private fun resolveActivityInfo(context: Context, componentName: ComponentName): ActivityInfo? { + return try { + context.packageManager.getActivityInfo( + componentName, + 0, + ) + } catch (e: PackageManager.NameNotFoundException) { + // Handle the case where the activity is not found + null + } } @SuppressLint("UseCompatLoadingForDrawables") diff --git a/lawnchair/src/app/lawnchair/icons/shape/IconCornerShape.kt b/lawnchair/src/app/lawnchair/icons/shape/IconCornerShape.kt index 5408768f0c8..d1d572a83db 100644 --- a/lawnchair/src/app/lawnchair/icons/shape/IconCornerShape.kt +++ b/lawnchair/src/app/lawnchair/icons/shape/IconCornerShape.kt @@ -36,13 +36,21 @@ sealed class IconCornerShape { protected open val controlDistanceX: Float get() = controlDistance protected open val controlDistanceY: Float get() = controlDistance - private fun getControl1X(position: Position, controlDistance: Float): Float = Utilities.mapRange(controlDistance, position.controlX, position.startX) + private fun getControl1X(position: Position, controlDistance: Float): Float { + return Utilities.mapRange(controlDistance, position.controlX, position.startX) + } - private fun getControl1Y(position: Position, controlDistance: Float): Float = Utilities.mapRange(controlDistance, position.controlY, position.startY) + private fun getControl1Y(position: Position, controlDistance: Float): Float { + return Utilities.mapRange(controlDistance, position.controlY, position.startY) + } - private fun getControl2X(position: Position, controlDistance: Float): Float = Utilities.mapRange(controlDistance, position.controlX, position.endX) + private fun getControl2X(position: Position, controlDistance: Float): Float { + return Utilities.mapRange(controlDistance, position.controlX, position.endX) + } - private fun getControl2Y(position: Position, controlDistance: Float): Float = Utilities.mapRange(controlDistance, position.controlY, position.endY) + private fun getControl2Y(position: Position, controlDistance: Float): Float { + return Utilities.mapRange(controlDistance, position.controlY, position.endY) + } override fun addCorner( path: Path, @@ -120,7 +128,9 @@ sealed class IconCornerShape { } } - override fun toString(): String = "cuthex" + override fun toString(): String { + return "cuthex" + } } object LightSquircle : BaseBezierPath() { @@ -299,17 +309,19 @@ sealed class IconCornerShape { val arc = Arc() - fun fromString(value: String): IconCornerShape = when (value) { - "cut" -> Cut - "cuthex" -> CutHex - "lightsquircle" -> LightSquircle - "cubic", "squircle" -> Squircle - "strongsquircle" -> StrongSquircle - "ultrasquircle" -> UltraSquircle - "sammy" -> Sammy - "arc" -> arc - "cupertino" -> Cupertino - else -> error("invalid corner shape $value") + fun fromString(value: String): IconCornerShape { + return when (value) { + "cut" -> Cut + "cuthex" -> CutHex + "lightsquircle" -> LightSquircle + "cubic", "squircle" -> Squircle + "strongsquircle" -> StrongSquircle + "ultrasquircle" -> UltraSquircle + "sammy" -> Sammy + "arc" -> arc + "cupertino" -> Cupertino + else -> error("invalid corner shape $value") + } } } } diff --git a/lawnchair/src/app/lawnchair/icons/shape/IconShape.kt b/lawnchair/src/app/lawnchair/icons/shape/IconShape.kt index d7a898a744c..eab13da5233 100644 --- a/lawnchair/src/app/lawnchair/icons/shape/IconShape.kt +++ b/lawnchair/src/app/lawnchair/icons/shape/IconShape.kt @@ -80,7 +80,9 @@ open class IconShape( private val tmpPoint = PointF() open val windowTransitionRadius = 1f - open fun getMaskPath(): Path = Path().also { addToPath(it, 0f, 0f, 100f, 100f, 50f) } + open fun getMaskPath(): Path { + return Path().also { addToPath(it, 0f, 0f, 100f, 100f, 50f) } + } open fun addShape(path: Path, x: Float, y: Float, radius: Float) { if (isCircle) { @@ -193,7 +195,9 @@ open class IconShape( path.lineTo(x2, y2) } - override fun toString(): String = "v1|$topLeft|$topRight|$bottomLeft|$bottomRight" + override fun toString(): String { + return "v1|$topLeft|$topRight|$bottomLeft|$bottomRight" + } open fun getHashString() = toString() @@ -221,7 +225,9 @@ open class IconShape( constructor(shape: IconCornerShape, scale: Float) : this(shape, PointF(scale, scale)) - override fun toString(): String = "$shape,${scale.x},${scale.y}" + override fun toString(): String { + return "$shape,${scale.x},${scale.y}" + } companion object { @@ -249,7 +255,9 @@ open class IconShape( 1f, ) { - override fun toString(): String = "circle" + override fun toString(): String { + return "circle" + } } object Square : IconShape( @@ -265,7 +273,9 @@ open class IconShape( override val windowTransitionRadius = .16f - override fun toString(): String = "square" + override fun toString(): String { + return "square" + } } object SharpSquare : IconShape( @@ -281,7 +291,9 @@ open class IconShape( override val windowTransitionRadius = 0f - override fun toString(): String = "sharpSquare" + override fun toString(): String { + return "sharpSquare" + } } object RoundedSquare : IconShape( @@ -297,7 +309,9 @@ open class IconShape( override val windowTransitionRadius = .6f - override fun toString(): String = "roundedSquare" + override fun toString(): String { + return "roundedSquare" + } } object Squircle : IconShape( @@ -311,7 +325,9 @@ open class IconShape( 1f, ) { - override fun toString(): String = "squircle" + override fun toString(): String { + return "squircle" + } } object Sammy : IconShape( @@ -325,7 +341,9 @@ open class IconShape( 1f, ) { - override fun toString(): String = "sammy" + override fun toString(): String { + return "sammy" + } } object Teardrop : IconShape( @@ -339,7 +357,9 @@ open class IconShape( .3f, ) { - override fun toString(): String = "teardrop" + override fun toString(): String { + return "teardrop" + } } object Cylinder : IconShape( @@ -353,7 +373,9 @@ open class IconShape( PointF(1f, .6f), ) { - override fun toString(): String = "cylinder" + override fun toString(): String { + return "cylinder" + } } object Cupertino : IconShape( @@ -369,7 +391,9 @@ open class IconShape( override val windowTransitionRadius = .45f - override fun toString(): String = "cupertino" + override fun toString(): String { + return "cupertino" + } } object Octagon : IconShape( @@ -383,7 +407,9 @@ open class IconShape( .5f, ) { - override fun toString(): String = "octagon" + override fun toString(): String { + return "octagon" + } } object Hexagon : IconShape( @@ -397,7 +423,9 @@ open class IconShape( PointF(1f, .5f), ) { - override fun toString(): String = "hexagon" + override fun toString(): String { + return "hexagon" + } } object Diamond : IconShape( @@ -413,7 +441,9 @@ open class IconShape( override val windowTransitionRadius = 0f - override fun toString(): String = "diamond" + override fun toString(): String { + return "diamond" + } } object Egg : IconShape( @@ -429,7 +459,9 @@ open class IconShape( override val windowTransitionRadius = 0.85f - override fun toString(): String = "egg" + override fun toString(): String { + return "egg" + } } companion object { @@ -473,12 +505,14 @@ open class IconShape( ) } - fun isCustomShape(iconShape: IconShape): Boolean = try { - parseCustomShape(iconShape.toString()) - true - } catch (e: Exception) { - Log.e("IconShape", "Error creating shape $iconShape", e) - false + fun isCustomShape(iconShape: IconShape): Boolean { + return try { + parseCustomShape(iconShape.toString()) + true + } catch (e: Exception) { + Log.e("IconShape", "Error creating shape $iconShape", e) + false + } } } } diff --git a/lawnchair/src/app/lawnchair/icons/shape/IconShapeManager.kt b/lawnchair/src/app/lawnchair/icons/shape/IconShapeManager.kt index b9253bbbb18..a8c5b52c40a 100644 --- a/lawnchair/src/app/lawnchair/icons/shape/IconShapeManager.kt +++ b/lawnchair/src/app/lawnchair/icons/shape/IconShapeManager.kt @@ -42,7 +42,9 @@ class IconShapeManager(private val context: Context) : SafeCloseable { val systemShape = findNearestShape(iconMask) return object : IconShape(systemShape) { - override fun getMaskPath(): Path = Path(iconMask) + override fun getMaskPath(): Path { + return Path(iconMask) + } override fun toString() = "system" diff --git a/lawnchair/src/app/lawnchair/nexuslauncher/OverlayCallbackImpl.kt b/lawnchair/src/app/lawnchair/nexuslauncher/OverlayCallbackImpl.kt index 43193aab397..0ce332c3834 100644 --- a/lawnchair/src/app/lawnchair/nexuslauncher/OverlayCallbackImpl.kt +++ b/lawnchair/src/app/lawnchair/nexuslauncher/OverlayCallbackImpl.kt @@ -146,8 +146,10 @@ class OverlayCallbackImpl(private val mLauncher: LawnchairLauncher) : companion object { private const val PREF_PERSIST_FLAGS = "pref_persistent_flags" - fun minusOneAvailable(context: Context): Boolean = FeedBridge.useBridge(context) || - context.applicationInfo.flags and - (ApplicationInfo.FLAG_DEBUGGABLE or ApplicationInfo.FLAG_SYSTEM) != 0 + fun minusOneAvailable(context: Context): Boolean { + return FeedBridge.useBridge(context) || + context.applicationInfo.flags and + (ApplicationInfo.FLAG_DEBUGGABLE or ApplicationInfo.FLAG_SYSTEM) != 0 + } } } diff --git a/lawnchair/src/app/lawnchair/nexuslauncher/SmartSpaceHostView.kt b/lawnchair/src/app/lawnchair/nexuslauncher/SmartSpaceHostView.kt index 6f812cee02d..51fcc500a76 100644 --- a/lawnchair/src/app/lawnchair/nexuslauncher/SmartSpaceHostView.kt +++ b/lawnchair/src/app/lawnchair/nexuslauncher/SmartSpaceHostView.kt @@ -30,7 +30,9 @@ sealed class SmartSpaceHostView(context: Context) : @Suppress("LeakingThis") private val mLongPressHelper: CheckLongPressHelper = CheckLongPressHelper(this, this) - override fun getErrorView(): View = SmartspaceQsb.getDateView(this) + override fun getErrorView(): View { + return SmartspaceQsb.getDateView(this) + } override fun onLongClick(view: View): Boolean { if (!hasSettings(view.context)) { @@ -107,14 +109,16 @@ sealed class SmartSpaceHostView(context: Context) : return info != null } - fun createSettingsIntent(): Intent = Intent(SETTINGS_INTENT_ACTION) - .setPackage(SmartspaceQsb.WIDGET_PACKAGE_NAME) - .setFlags( - Intent.FLAG_RECEIVER_FOREGROUND - or Intent.FLAG_ACTIVITY_NO_HISTORY - or Intent.FLAG_ACTIVITY_NEW_TASK - or Intent.FLAG_ACTIVITY_NEW_DOCUMENT, - ) + fun createSettingsIntent(): Intent { + return Intent(SETTINGS_INTENT_ACTION) + .setPackage(SmartspaceQsb.WIDGET_PACKAGE_NAME) + .setFlags( + Intent.FLAG_RECEIVER_FOREGROUND + or Intent.FLAG_ACTIVITY_NO_HISTORY + or Intent.FLAG_ACTIVITY_NEW_TASK + or Intent.FLAG_ACTIVITY_NEW_DOCUMENT, + ) + } } } @@ -122,5 +126,7 @@ enum class NexusLauncherEnum(private val mId: Int) : EventEnum { SMARTSPACE_TAP_OR_LONGPRESS(520), ; - override fun getId(): Int = mId + override fun getId(): Int { + return mId + } } diff --git a/lawnchair/src/app/lawnchair/nexuslauncher/SmartspaceQsb.kt b/lawnchair/src/app/lawnchair/nexuslauncher/SmartspaceQsb.kt index 1f0721c2857..f60d4d48503 100644 --- a/lawnchair/src/app/lawnchair/nexuslauncher/SmartspaceQsb.kt +++ b/lawnchair/src/app/lawnchair/nexuslauncher/SmartspaceQsb.kt @@ -15,10 +15,12 @@ import com.android.launcher3.qsb.QsbContainerView class SmartspaceQsb @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0) : QsbContainerView(context, attrs, defStyleAttr) { class SmartSpaceFragment : QsbFragment() { - override fun createHost(): QsbWidgetHost = QsbWidgetHost( - context, - SMART_SPACE_WIDGET_HOST_ID, - ) { c: Context -> ThemedSmartSpaceHostView(c) } + override fun createHost(): QsbWidgetHost { + return QsbWidgetHost( + context, + SMART_SPACE_WIDGET_HOST_ID, + ) { c: Context -> ThemedSmartSpaceHostView(c) } + } @SuppressLint("NewApi") override fun getSearchWidgetProvider(): AppWidgetProviderInfo? { @@ -31,7 +33,9 @@ class SmartspaceQsb @JvmOverloads constructor(context: Context, attrs: Attribute return null } - override fun getDefaultView(container: ViewGroup, showSetupIcon: Boolean): View = getDateView(container) + override fun getDefaultView(container: ViewGroup, showSetupIcon: Boolean): View { + return getDateView(container) + } override fun createBindOptions(): Bundle { val opts = super.createBindOptions() @@ -54,7 +58,9 @@ class SmartspaceQsb @JvmOverloads constructor(context: Context, attrs: Attribute private const val WIDGET_CLASS_NAME = "com.google.android.apps.gsa.staticplugins.smartspace.widget.SmartspaceWidgetProvider" - fun getDateView(parent: ViewGroup): View = LayoutInflater.from(parent.context) - .inflate(R.layout.smart_space_date_view, parent, false) + fun getDateView(parent: ViewGroup): View { + return LayoutInflater.from(parent.context) + .inflate(R.layout.smart_space_date_view, parent, false) + } } } diff --git a/lawnchair/src/app/lawnchair/nexuslauncher/ThemedSmartSpaceHostView.kt b/lawnchair/src/app/lawnchair/nexuslauncher/ThemedSmartSpaceHostView.kt index 3ff09405d0b..fa8ebe1196c 100644 --- a/lawnchair/src/app/lawnchair/nexuslauncher/ThemedSmartSpaceHostView.kt +++ b/lawnchair/src/app/lawnchair/nexuslauncher/ThemedSmartSpaceHostView.kt @@ -27,7 +27,9 @@ class ThemedSmartSpaceHostView(context: Context) : SmartSpaceHostView(context) { private val templateTextView = LayoutInflater.from(context) .inflate(R.layout.smartspace_text_template, this, false) as DoubleShadowBubbleTextView - override fun getErrorView(): View = super.getErrorView().also { overrideStyles(it as ViewGroup) } + override fun getErrorView(): View { + return super.getErrorView().also { overrideStyles(it as ViewGroup) } + } override fun updateAppWidget(remoteViews: RemoteViews?) { super.updateAppWidget(remoteViews) @@ -83,12 +85,14 @@ class ThemedSmartSpaceHostView(context: Context) : SmartSpaceHostView(context) { } } - private fun addShadowToBitmap(bitmap: Bitmap): Bitmap = if (!bitmap.isRecycled) { - val newBitmap = Bitmap.createBitmap(bitmap.width, bitmap.height, Bitmap.Config.ARGB_8888) - val canvas = Canvas(newBitmap) - shadowGenerator.recreateIcon(bitmap, canvas) - newBitmap - } else { - bitmap + private fun addShadowToBitmap(bitmap: Bitmap): Bitmap { + return if (!bitmap.isRecycled) { + val newBitmap = Bitmap.createBitmap(bitmap.width, bitmap.height, Bitmap.Config.ARGB_8888) + val canvas = Canvas(newBitmap) + shadowGenerator.recreateIcon(bitmap, canvas) + newBitmap + } else { + bitmap + } } } diff --git a/lawnchair/src/app/lawnchair/overview/LawnchairOverviewActionsView.kt b/lawnchair/src/app/lawnchair/overview/LawnchairOverviewActionsView.kt index c96614ccab8..e5328234ac2 100644 --- a/lawnchair/src/app/lawnchair/overview/LawnchairOverviewActionsView.kt +++ b/lawnchair/src/app/lawnchair/overview/LawnchairOverviewActionsView.kt @@ -86,8 +86,10 @@ class LawnchairOverviewActionsView @JvmOverloads constructor( return lensIntent != null } - private fun createSpace(): View = Space(context).apply { - layoutParams = LinearLayout.LayoutParams(0, 1).apply { weight = 1f } + private fun createSpace(): View { + return Space(context).apply { + layoutParams = LinearLayout.LayoutParams(0, 1).apply { weight = 1f } + } } override fun setClearAllClickListener(clearAllClickListener: OnClickListener?) { diff --git a/lawnchair/src/app/lawnchair/preferences/BasePreferenceManager.kt b/lawnchair/src/app/lawnchair/preferences/BasePreferenceManager.kt index 7a2269c9e93..c8119d90a74 100644 --- a/lawnchair/src/app/lawnchair/preferences/BasePreferenceManager.kt +++ b/lawnchair/src/app/lawnchair/preferences/BasePreferenceManager.kt @@ -233,7 +233,9 @@ sealed class BasePreferenceManager(private val context: Context) : SharedPrefere error("unsupported") } - fun defaultValue(defaultGrid: InvariantDeviceProfile.GridOption): Int = selectDefaultValue(defaultGrid) + fun defaultValue(defaultGrid: InvariantDeviceProfile.GridOption): Int { + return selectDefaultValue(defaultGrid) + } fun get(defaultGrid: InvariantDeviceProfile.GridOption): Int { val value = super.get() @@ -348,7 +350,9 @@ sealed class BasePreferenceManager(private val context: Context) : SharedPrefere override fun get() = HashMap(valueMap) - override fun set(newValue: Map): Unit = throw NotImplementedError() + override fun set(newValue: Map) { + throw NotImplementedError() + } open fun flattenKey(key: K) = key.toString() abstract fun unflattenKey(key: String): K @@ -371,7 +375,9 @@ sealed class BasePreferenceManager(private val context: Context) : SharedPrefere editSp { putString(key, obj.toString()) } } - operator fun get(key: K): V? = valueMap[key] + operator fun get(key: K): V? { + return valueMap[key] + } fun clear() { valueMap.clear() diff --git a/lawnchair/src/app/lawnchair/preferences/PreferenceAdapter.kt b/lawnchair/src/app/lawnchair/preferences/PreferenceAdapter.kt index bbcee0b1a81..f73146f0fe4 100644 --- a/lawnchair/src/app/lawnchair/preferences/PreferenceAdapter.kt +++ b/lawnchair/src/app/lawnchair/preferences/PreferenceAdapter.kt @@ -118,7 +118,9 @@ private fun getAdapter( } @Composable -fun Preference.getAdapter(): PreferenceAdapter = createStateAdapter(state = asState(), set = this::set) +fun Preference.getAdapter(): PreferenceAdapter { + return createStateAdapter(state = asState(), set = this::set) +} @Composable fun IdpPreference.getAdapter(): PreferenceAdapter { @@ -152,7 +154,9 @@ fun rememberTransformAdapter( } @Composable -fun MutableState.asPreferenceAdapter(): PreferenceAdapter = remember(this) { MutableStatePreferenceAdapter(this) } +fun MutableState.asPreferenceAdapter(): PreferenceAdapter { + return remember(this) { MutableStatePreferenceAdapter(this) } +} private class TransformPreferenceAdapter( private val parent: PreferenceAdapter, @@ -179,4 +183,6 @@ fun customPreferenceAdapter(value: T, onValueChange: (T) -> Unit): Preferenc } @Composable -operator fun PreferenceAdapter.not(): PreferenceAdapter = rememberTransformAdapter(adapter = this, transformGet = { !it }, transformSet = { !it }) +operator fun PreferenceAdapter.not(): PreferenceAdapter { + return rememberTransformAdapter(adapter = this, transformGet = { !it }, transformSet = { !it }) +} diff --git a/lawnchair/src/app/lawnchair/preferences2/PreferenceManager2.kt b/lawnchair/src/app/lawnchair/preferences2/PreferenceManager2.kt index f86206f83b7..495b4c5542c 100644 --- a/lawnchair/src/app/lawnchair/preferences2/PreferenceManager2.kt +++ b/lawnchair/src/app/lawnchair/preferences2/PreferenceManager2.kt @@ -273,6 +273,16 @@ class PreferenceManager2 private constructor(private val context: Context) : val lockHomeScreen = preference( key = booleanPreferencesKey(name = "lock_home_screen"), defaultValue = context.resources.getBoolean(R.bool.config_default_lock_home_screen), + onSet = { + if (it) { + LauncherOptionsPopup.disableUnavailableItems(context) + } + }, + ) + + val legacyPopupOptionsMigrated = preference( + key = booleanPreferencesKey(name = "legacy_popup_options_migrated"), + defaultValue = false, ) val launcherPopupOrder = preference( diff --git a/lawnchair/src/app/lawnchair/root/RootHelperManager.kt b/lawnchair/src/app/lawnchair/root/RootHelperManager.kt index 6c76e925eaa..c4a6fcabaab 100644 --- a/lawnchair/src/app/lawnchair/root/RootHelperManager.kt +++ b/lawnchair/src/app/lawnchair/root/RootHelperManager.kt @@ -45,19 +45,21 @@ class RootHelperManager(private val context: Context) { return rootHelperDeferred!!.await() } - private suspend fun bindImpl(onDisconnected: () -> Unit): IRootHelper = withContext(Dispatchers.IO) { - val intent = Intent(context, RootHelper::class.java) - suspendCoroutine { - val connection = object : ServiceConnection { - override fun onServiceConnected(name: ComponentName, service: IBinder) { - it.resume(IRootHelper.Stub.asInterface(service)) - } + private suspend fun bindImpl(onDisconnected: () -> Unit): IRootHelper { + return withContext(Dispatchers.IO) { + val intent = Intent(context, RootHelper::class.java) + suspendCoroutine { + val connection = object : ServiceConnection { + override fun onServiceConnected(name: ComponentName, service: IBinder) { + it.resume(IRootHelper.Stub.asInterface(service)) + } - override fun onServiceDisconnected(name: ComponentName) { - onDisconnected() + override fun onServiceDisconnected(name: ComponentName) { + onDisconnected() + } } + RootService.bind(intent, connection) } - RootService.bind(intent, connection) } } diff --git a/lawnchair/src/app/lawnchair/search/LawnchairSearchUiDelegate.kt b/lawnchair/src/app/lawnchair/search/LawnchairSearchUiDelegate.kt index 9f7636f8ec5..f956c66b016 100644 --- a/lawnchair/src/app/lawnchair/search/LawnchairSearchUiDelegate.kt +++ b/lawnchair/src/app/lawnchair/search/LawnchairSearchUiDelegate.kt @@ -7,5 +7,7 @@ import com.android.launcher3.views.ActivityContext class LawnchairSearchUiDelegate(private val appsView: ActivityAllAppsContainerView<*>) : AllAppsSearchUiDelegate(appsView) { - override fun createMainAdapterProvider(): SearchAdapterProvider<*> = LawnchairSearchAdapterProvider(ActivityContext.lookupContext(appsView.context), appsView) + override fun createMainAdapterProvider(): SearchAdapterProvider<*> { + return LawnchairSearchAdapterProvider(ActivityContext.lookupContext(appsView.context), appsView) + } } diff --git a/lawnchair/src/app/lawnchair/search/adapter/SearchTargetFactory.kt b/lawnchair/src/app/lawnchair/search/adapter/SearchTargetFactory.kt index e6460402357..143b89dd141 100644 --- a/lawnchair/src/app/lawnchair/search/adapter/SearchTargetFactory.kt +++ b/lawnchair/src/app/lawnchair/search/adapter/SearchTargetFactory.kt @@ -57,15 +57,17 @@ class SearchTargetFactory( }.build() } - fun createShortcutTarget(shortcutInfo: ShortcutInfo): SearchTargetCompat = SearchTargetCompat.Builder( - SearchTargetCompat.RESULT_TYPE_SHORTCUT, - LayoutType.SMALL_ICON_HORIZONTAL_TEXT, - "shortcut_" + generateHashKey("${shortcutInfo.`package`}|${shortcutInfo.userHandle}|${shortcutInfo.id}"), - ).apply { - setShortcutInfo(shortcutInfo) - setUserHandle(shortcutInfo.userHandle) - setExtras(Bundle()) - }.build() + fun createShortcutTarget(shortcutInfo: ShortcutInfo): SearchTargetCompat { + return SearchTargetCompat.Builder( + SearchTargetCompat.RESULT_TYPE_SHORTCUT, + LayoutType.SMALL_ICON_HORIZONTAL_TEXT, + "shortcut_" + generateHashKey("${shortcutInfo.`package`}|${shortcutInfo.userHandle}|${shortcutInfo.id}"), + ).apply { + setShortcutInfo(shortcutInfo) + setUserHandle(shortcutInfo.userHandle) + setExtras(Bundle()) + }.build() + } fun createWebSuggestionsTarget(suggestion: String, suggestionProvider: String): SearchTargetCompat { val url = WebSearchProvider.fromString(suggestionProvider).getSearchUrl(suggestion) @@ -196,16 +198,18 @@ class SearchTargetFactory( action: SearchActionCompat, pkg: String, extras: Bundle = Bundle(), - ): SearchTargetCompat = SearchTargetCompat.Builder( - SearchTargetCompat.RESULT_TYPE_REDIRECTION, - LayoutType.ICON_HORIZONTAL_TEXT, - generateHashKey(id), - ) - .setPackageName(pkg) - .setUserHandle(Process.myUserHandle()) - .setSearchAction(action) - .setExtras(extras) - .build() + ): SearchTargetCompat { + return SearchTargetCompat.Builder( + SearchTargetCompat.RESULT_TYPE_REDIRECTION, + LayoutType.ICON_HORIZONTAL_TEXT, + generateHashKey(id), + ) + .setPackageName(pkg) + .setUserHandle(Process.myUserHandle()) + .setSearchAction(action) + .setExtras(extras) + .build() + } internal fun createMarketSearchTarget(query: String): SearchTargetCompat? { val marketSearchComponent = SearchLinksTarget.resolveMarketSearchActivity(context) ?: return null @@ -320,16 +324,18 @@ class SearchTargetFactory( targetCompat: Int, pkg: String, extras: Bundle = Bundle(), - ): SearchTargetCompat = SearchTargetCompat.Builder( - targetCompat, - layoutType, - generateHashKey(id), - ).apply { - setPackageName(pkg) - setUserHandle(Process.myUserHandle()) - setSearchAction(action) - setExtras(extras) - }.build() + ): SearchTargetCompat { + return SearchTargetCompat.Builder( + targetCompat, + layoutType, + generateHashKey(id), + ).apply { + setPackageName(pkg) + setUserHandle(Process.myUserHandle()) + setSearchAction(action) + setExtras(extras) + }.build() + } } } @@ -386,13 +392,15 @@ object SettingsTarget { return resolveInfo?.activityInfo?.exported == true } - fun formatSettingTitle(rawTitle: String?): String = rawTitle?.replace('_', ' ') - ?.replace("ACTION", "") - ?.lowercase() - ?.split(' ') - ?.joinToString(" ") { - it.replaceFirstChar { char -> char.uppercase(Locale.ROOT) } - }.orEmpty() + fun formatSettingTitle(rawTitle: String?): String { + return rawTitle?.replace('_', ' ') + ?.replace("ACTION", "") + ?.lowercase() + ?.split(' ') + ?.joinToString(" ") { + it.replaceFirstChar { char -> char.uppercase(Locale.ROOT) } + }.orEmpty() + } } // keys used in `pkg` param diff --git a/lawnchair/src/app/lawnchair/search/algorithms/LawnchairLocalSearchAlgorithm.kt b/lawnchair/src/app/lawnchair/search/algorithms/LawnchairLocalSearchAlgorithm.kt index 9f835823270..3acf9221517 100644 --- a/lawnchair/src/app/lawnchair/search/algorithms/LawnchairLocalSearchAlgorithm.kt +++ b/lawnchair/src/app/lawnchair/search/algorithms/LawnchairLocalSearchAlgorithm.kt @@ -422,5 +422,7 @@ class LawnchairLocalSearchAlgorithm(context: Context) : LawnchairSearchAlgorithm results } - private fun filterByType(results: List, type: String): List = results.filter { it.resultType == type } + private fun filterByType(results: List, type: String): List { + return results.filter { it.resultType == type } + } } diff --git a/lawnchair/src/app/lawnchair/search/algorithms/LawnchairSearchAlgorithm.kt b/lawnchair/src/app/lawnchair/search/algorithms/LawnchairSearchAlgorithm.kt index e2917a7be76..9ce375e561d 100644 --- a/lawnchair/src/app/lawnchair/search/algorithms/LawnchairSearchAlgorithm.kt +++ b/lawnchair/src/app/lawnchair/search/algorithms/LawnchairSearchAlgorithm.kt @@ -126,8 +126,10 @@ sealed class LawnchairSearchAlgorithm( } } - private fun findIndices(filtered: List, layoutType: String): List = filtered.indices.filter { - filtered[it].layoutType == layoutType && !filtered[it].isApp + private fun findIndices(filtered: List, layoutType: String): List { + return filtered.indices.filter { + filtered[it].layoutType == layoutType && !filtered[it].isApp + } } private fun findAppAndShorcutIndices(filtered: List): List { diff --git a/lawnchair/src/app/lawnchair/search/algorithms/SearchUtils.kt b/lawnchair/src/app/lawnchair/search/algorithms/SearchUtils.kt index fca7e6006f6..8d18a3f0324 100644 --- a/lawnchair/src/app/lawnchair/search/algorithms/SearchUtils.kt +++ b/lawnchair/src/app/lawnchair/search/algorithms/SearchUtils.kt @@ -54,17 +54,19 @@ fun Sequence.filterHiddenApps( query: String, hiddenApps: Set, hiddenAppsInSearch: String, -): Sequence = when (hiddenAppsInSearch) { - HiddenAppsInSearch.ALWAYS -> { - this - } - HiddenAppsInSearch.IF_NAME_TYPED -> { - filter { - it.toComponentKey().toString() !in hiddenApps || - it.title.toString().lowercase(Locale.getDefault()) == query +): Sequence { + return when (hiddenAppsInSearch) { + HiddenAppsInSearch.ALWAYS -> { + this + } + HiddenAppsInSearch.IF_NAME_TYPED -> { + filter { + it.toComponentKey().toString() !in hiddenApps || + it.title.toString().lowercase(Locale.getDefault()) == query + } + } + else -> { + filter { it.toComponentKey().toString() !in hiddenApps } } - } - else -> { - filter { it.toComponentKey().toString() !in hiddenApps } } } diff --git a/lawnchair/src/app/lawnchair/search/algorithms/data/Calculation.kt b/lawnchair/src/app/lawnchair/search/algorithms/data/Calculation.kt index 797f6cc605a..e05585b32f0 100644 --- a/lawnchair/src/app/lawnchair/search/algorithms/data/Calculation.kt +++ b/lawnchair/src/app/lawnchair/search/algorithms/data/Calculation.kt @@ -12,28 +12,30 @@ data class Calculation( fun calculateEquationFromString( query: String, -): Calculation = try { - val evaluatedValue = Expressions().eval(query) - val roundedValue = evaluatedValue.round(MathContext.DECIMAL64) - val formattedValue = roundedValue.stripTrailingZeros() - val absoluteValue = formattedValue.abs() - val threshold = BigDecimal("9999999999999999") +): Calculation { + return try { + val evaluatedValue = Expressions().eval(query) + val roundedValue = evaluatedValue.round(MathContext.DECIMAL64) + val formattedValue = roundedValue.stripTrailingZeros() + val absoluteValue = formattedValue.abs() + val threshold = BigDecimal("9999999999999999") - val result = if (absoluteValue > threshold) { - formattedValue.toString() - } else { - formattedValue.toPlainString() - } + val result = if (absoluteValue > threshold) { + formattedValue.toString() + } else { + formattedValue.toPlainString() + } - Calculation( - equation = query, - result = result, - isValid = true, - ) -} catch (_: Exception) { - Calculation( - equation = "", - result = "", - isValid = false, - ) + Calculation( + equation = query, + result = result, + isValid = true, + ) + } catch (_: Exception) { + Calculation( + equation = "", + result = "", + isValid = false, + ) + } } diff --git a/lawnchair/src/app/lawnchair/search/algorithms/data/History.kt b/lawnchair/src/app/lawnchair/search/algorithms/data/History.kt index 665f369aa65..2608fdae0d0 100644 --- a/lawnchair/src/app/lawnchair/search/algorithms/data/History.kt +++ b/lawnchair/src/app/lawnchair/search/algorithms/data/History.kt @@ -12,7 +12,9 @@ import kotlinx.coroutines.withContext data class RecentKeyword( val data: Map, ) { - fun getValueByKey(key: String): String? = data[key] + fun getValueByKey(key: String): String? { + return data[key] + } } suspend fun getRecentKeyword(context: Context, query: String, max: Int, callback: SearchCallback) { diff --git a/lawnchair/src/app/lawnchair/search/algorithms/data/SettingInfo.kt b/lawnchair/src/app/lawnchair/search/algorithms/data/SettingInfo.kt index 5545c1f830e..fbf2c5c8ebf 100644 --- a/lawnchair/src/app/lawnchair/search/algorithms/data/SettingInfo.kt +++ b/lawnchair/src/app/lawnchair/search/algorithms/data/SettingInfo.kt @@ -26,9 +26,9 @@ suspend fun findSettingsByNameAndAction(query: String, max: Int): List diff --git a/lawnchair/src/app/lawnchair/search/algorithms/data/calculator/Expressions.kt b/lawnchair/src/app/lawnchair/search/algorithms/data/calculator/Expressions.kt index 63b27f91791..a0817c37023 100644 --- a/lawnchair/src/app/lawnchair/search/algorithms/data/calculator/Expressions.kt +++ b/lawnchair/src/app/lawnchair/search/algorithms/data/calculator/Expressions.kt @@ -163,7 +163,9 @@ class Expressions { return this } - fun eval(expression: String): BigDecimal = evaluator.eval(parse(expression)) + fun eval(expression: String): BigDecimal { + return evaluator.eval(parse(expression)) + } /** * eval an expression then round it with {@link Evaluator#mathContext} and call toEngineeringString
@@ -171,16 +173,24 @@ class Expressions { * @param expression String * @return String */ - fun evalToString(expression: String): String = try { - evaluator.eval(parse(expression)).round(evaluator.mathContext).stripTrailingZeros() - .toEngineeringString() - } catch (e: Throwable) { - e.cause?.message ?: e.message ?: "unknown error" + fun evalToString(expression: String): String { + return try { + evaluator.eval(parse(expression)).round(evaluator.mathContext).stripTrailingZeros() + .toEngineeringString() + } catch (e: Throwable) { + e.cause?.message ?: e.message ?: "unknown error" + } } - private fun parse(expression: String): Expr = parse(scan(expression)) + private fun parse(expression: String): Expr { + return parse(scan(expression)) + } - private fun parse(tokens: List): Expr = Parser(tokens).parse() + private fun parse(tokens: List): Expr { + return Parser(tokens).parse() + } - private fun scan(expression: String): List = Scanner(expression, evaluator.mathContext).scanTokens() + private fun scan(expression: String): List { + return Scanner(expression, evaluator.mathContext).scanTokens() + } } diff --git a/lawnchair/src/app/lawnchair/search/algorithms/data/calculator/internal/Evaluator.kt b/lawnchair/src/app/lawnchair/search/algorithms/data/calculator/internal/Evaluator.kt index 069a1350090..8e9ff478ae6 100644 --- a/lawnchair/src/app/lawnchair/search/algorithms/data/calculator/internal/Evaluator.kt +++ b/lawnchair/src/app/lawnchair/search/algorithms/data/calculator/internal/Evaluator.kt @@ -44,7 +44,9 @@ internal class Evaluator : ExprVisitor { return this } - fun eval(expr: Expr): BigDecimal = expr.accept(this) + fun eval(expr: Expr): BigDecimal { + return expr.accept(this) + } override fun visitAssignExpr(expr: AssignExpr): BigDecimal { val value = eval(expr.value) @@ -112,7 +114,9 @@ internal class Evaluator : ExprVisitor { return function.call(expr.arguments.map { eval(it) }) } - override fun visitLiteralExpr(expr: LiteralExpr): BigDecimal = expr.value + override fun visitLiteralExpr(expr: LiteralExpr): BigDecimal { + return expr.value + } override fun visitVariableExpr(expr: VariableExpr): BigDecimal { val name = expr.name.lexeme @@ -121,7 +125,9 @@ internal class Evaluator : ExprVisitor { ?: throw ExpressionException("Undefined variable '$name'") } - override fun visitGroupingExpr(expr: GroupingExpr): BigDecimal = eval(expr.expression) + override fun visitGroupingExpr(expr: GroupingExpr): BigDecimal { + return eval(expr.expression) + } private infix fun Expr.or(right: Expr): BigDecimal { val left = eval(this) @@ -141,9 +147,13 @@ internal class Evaluator : ExprVisitor { return eval(right).isTruthy().toBigDecimal() } - private fun BigDecimal.isTruthy(): Boolean = this != BigDecimal.ZERO + private fun BigDecimal.isTruthy(): Boolean { + return this != BigDecimal.ZERO + } - private fun Boolean.toBigDecimal(): BigDecimal = if (this) BigDecimal.ONE else BigDecimal.ZERO + private fun Boolean.toBigDecimal(): BigDecimal { + return if (this) BigDecimal.ONE else BigDecimal.ZERO + } private infix fun BigDecimal.pow(n: BigDecimal): BigDecimal { var right = n diff --git a/lawnchair/src/app/lawnchair/search/algorithms/data/calculator/internal/Expr.kt b/lawnchair/src/app/lawnchair/search/algorithms/data/calculator/internal/Expr.kt index c6fc5f0de54..f5c58a0fc0e 100644 --- a/lawnchair/src/app/lawnchair/search/algorithms/data/calculator/internal/Expr.kt +++ b/lawnchair/src/app/lawnchair/search/algorithms/data/calculator/internal/Expr.kt @@ -12,7 +12,9 @@ internal class AssignExpr( val value: Expr, ) : Expr() { - override fun accept(visitor: ExprVisitor): R = visitor.visitAssignExpr(this) + override fun accept(visitor: ExprVisitor): R { + return visitor.visitAssignExpr(this) + } } internal class LogicalExpr( @@ -21,7 +23,9 @@ internal class LogicalExpr( val right: Expr, ) : Expr() { - override fun accept(visitor: ExprVisitor): R = visitor.visitLogicalExpr(this) + override fun accept(visitor: ExprVisitor): R { + return visitor.visitLogicalExpr(this) + } } internal class BinaryExpr( @@ -30,7 +34,9 @@ internal class BinaryExpr( val right: Expr, ) : Expr() { - override fun accept(visitor: ExprVisitor): R = visitor.visitBinaryExpr(this) + override fun accept(visitor: ExprVisitor): R { + return visitor.visitBinaryExpr(this) + } } internal class UnaryExpr( @@ -38,7 +44,9 @@ internal class UnaryExpr( val right: Expr, ) : Expr() { - override fun accept(visitor: ExprVisitor): R = visitor.visitUnaryExpr(this) + override fun accept(visitor: ExprVisitor): R { + return visitor.visitUnaryExpr(this) + } } internal class CallExpr( @@ -46,22 +54,30 @@ internal class CallExpr( val arguments: List, ) : Expr() { - override fun accept(visitor: ExprVisitor): R = visitor.visitCallExpr(this) + override fun accept(visitor: ExprVisitor): R { + return visitor.visitCallExpr(this) + } } internal class LiteralExpr(val value: BigDecimal) : Expr() { - override fun accept(visitor: ExprVisitor): R = visitor.visitLiteralExpr(this) + override fun accept(visitor: ExprVisitor): R { + return visitor.visitLiteralExpr(this) + } } internal class VariableExpr(val name: Token) : Expr() { - override fun accept(visitor: ExprVisitor): R = visitor.visitVariableExpr(this) + override fun accept(visitor: ExprVisitor): R { + return visitor.visitVariableExpr(this) + } } internal class GroupingExpr(val expression: Expr) : Expr() { - override fun accept(visitor: ExprVisitor): R = visitor.visitGroupingExpr(this) + override fun accept(visitor: ExprVisitor): R { + return visitor.visitGroupingExpr(this) + } } internal interface ExprVisitor { diff --git a/lawnchair/src/app/lawnchair/search/algorithms/data/calculator/internal/Parser.kt b/lawnchair/src/app/lawnchair/search/algorithms/data/calculator/internal/Parser.kt index 17353392deb..412856fb0cf 100644 --- a/lawnchair/src/app/lawnchair/search/algorithms/data/calculator/internal/Parser.kt +++ b/lawnchair/src/app/lawnchair/search/algorithms/data/calculator/internal/Parser.kt @@ -39,7 +39,9 @@ internal class Parser(private val tokens: List) { return expr } - private fun expression(): Expr = assignment() + private fun expression(): Expr { + return assignment() + } private fun assignment(): Expr { val expr = or() @@ -235,10 +237,12 @@ internal class Parser(private val tokens: List) { return false } - private fun check(tokenType: TokenType): Boolean = if (isAtEnd()) { - false - } else { - peek().type === tokenType + private fun check(tokenType: TokenType): Boolean { + return if (isAtEnd()) { + false + } else { + peek().type === tokenType + } } private fun consume(type: TokenType, message: String): Token { diff --git a/lawnchair/src/app/lawnchair/search/algorithms/data/calculator/internal/Scanner.kt b/lawnchair/src/app/lawnchair/search/algorithms/data/calculator/internal/Scanner.kt index f87d5dcccc6..5190cce396d 100644 --- a/lawnchair/src/app/lawnchair/search/algorithms/data/calculator/internal/Scanner.kt +++ b/lawnchair/src/app/lawnchair/search/algorithms/data/calculator/internal/Scanner.kt @@ -25,7 +25,9 @@ import app.lawnchair.search.algorithms.data.calculator.internal.TokenType.SQUARE import app.lawnchair.search.algorithms.data.calculator.internal.TokenType.STAR import java.math.MathContext -private fun invalidToken(c: Char): Unit = throw ExpressionException("Invalid token '$c'") +private fun invalidToken(c: Char) { + throw ExpressionException("Invalid token '$c'") +} internal class Scanner( private val source: String, @@ -45,7 +47,9 @@ internal class Scanner( return tokens } - private fun isAtEnd(): Boolean = current >= source.length + private fun isAtEnd(): Boolean { + return current >= source.length + } private fun scanToken() { start = current @@ -56,7 +60,6 @@ internal class Scanner( -> { // Ignore whitespace. } - '+' -> addToken(PLUS) '-' -> addToken(MINUS) '*' -> addToken(STAR) @@ -87,13 +90,15 @@ internal class Scanner( char: Char, previousChar: Char = '\u0000', nextChar: Char = '\u0000', - ): Boolean = char.isDigit() || - when (char) { - '.' -> true - 'e', 'E' -> previousChar.isDigit() && (nextChar.isDigit() || nextChar == '+' || nextChar == '-') - '+', '-' -> (previousChar == 'e' || previousChar == 'E') && nextChar.isDigit() - else -> false - } + ): Boolean { + return char.isDigit() || + when (char) { + '.' -> true + 'e', 'E' -> previousChar.isDigit() && (nextChar.isDigit() || nextChar == '+' || nextChar == '-') + '+', '-' -> (previousChar == 'e' || previousChar == 'E') && nextChar.isDigit() + else -> false + } + } private fun number() { while (peek().isDigit()) advance() @@ -118,18 +123,22 @@ internal class Scanner( private fun advance() = source[current++] - private fun peek(): Char = if (isAtEnd()) { - '\u0000' - } else { - source[current] + private fun peek(): Char { + return if (isAtEnd()) { + '\u0000' + } else { + source[current] + } } private fun peekPrevious(): Char = if (current > 0) source[current - 1] else '\u0000' - private fun peekNext(): Char = if (current + 1 >= source.length) { - '\u0000' - } else { - source[current + 1] + private fun peekNext(): Char { + return if (current + 1 >= source.length) { + '\u0000' + } else { + source[current + 1] + } } private fun match(expected: Char): Boolean { diff --git a/lawnchair/src/app/lawnchair/search/algorithms/data/calculator/internal/Token.kt b/lawnchair/src/app/lawnchair/search/algorithms/data/calculator/internal/Token.kt index c1780c9e313..ee03386d2a8 100644 --- a/lawnchair/src/app/lawnchair/search/algorithms/data/calculator/internal/Token.kt +++ b/lawnchair/src/app/lawnchair/search/algorithms/data/calculator/internal/Token.kt @@ -6,5 +6,7 @@ internal class Token( val literal: Any?, ) { - override fun toString(): String = "$type $lexeme $literal" + override fun toString(): String { + return "$type $lexeme $literal" + } } diff --git a/lawnchair/src/app/lawnchair/smartspace/BcSmartSpaceUtil.kt b/lawnchair/src/app/lawnchair/smartspace/BcSmartSpaceUtil.kt index 1c5b47eccd7..c5ef9804418 100644 --- a/lawnchair/src/app/lawnchair/smartspace/BcSmartSpaceUtil.kt +++ b/lawnchair/src/app/lawnchair/smartspace/BcSmartSpaceUtil.kt @@ -45,10 +45,12 @@ object BcSmartSpaceUtil { } } - fun getOpenCalendarIntent(): Intent = Intent(Intent.ACTION_VIEW).setData( - ContentUris.appendId( - CalendarContract.CONTENT_URI.buildUpon().appendPath("time"), - System.currentTimeMillis(), - ).build(), - ).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED) + fun getOpenCalendarIntent(): Intent { + return Intent(Intent.ACTION_VIEW).setData( + ContentUris.appendId( + CalendarContract.CONTENT_URI.buildUpon().appendPath("time"), + System.currentTimeMillis(), + ).build(), + ).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED) + } } diff --git a/lawnchair/src/app/lawnchair/smartspace/CardPagerAdapter.kt b/lawnchair/src/app/lawnchair/smartspace/CardPagerAdapter.kt index 12868feed9b..4129f31d4d4 100644 --- a/lawnchair/src/app/lawnchair/smartspace/CardPagerAdapter.kt +++ b/lawnchair/src/app/lawnchair/smartspace/CardPagerAdapter.kt @@ -76,7 +76,9 @@ class CardPagerAdapter(context: Context) : PagerAdapter() { override fun getCount() = smartspaceTargets.size - override fun isViewFromObject(view: View, obj: Any): Boolean = view === (obj as ViewHolder).card + override fun isViewFromObject(view: View, obj: Any): Boolean { + return view === (obj as ViewHolder).card + } private fun createBaseCard( container: ViewGroup, diff --git a/lawnchair/src/app/lawnchair/smartspace/InterceptingViewPager.kt b/lawnchair/src/app/lawnchair/smartspace/InterceptingViewPager.kt index 4f7acb94b62..5c8e488cd5e 100644 --- a/lawnchair/src/app/lawnchair/smartspace/InterceptingViewPager.kt +++ b/lawnchair/src/app/lawnchair/smartspace/InterceptingViewPager.kt @@ -55,10 +55,14 @@ class InterceptingViewPager @JvmOverloads constructor( } } - override fun onInterceptTouchEvent(ev: MotionEvent): Boolean = handleTouchOverride(ev, superOnIntercept) + override fun onInterceptTouchEvent(ev: MotionEvent): Boolean { + return handleTouchOverride(ev, superOnIntercept) + } @SuppressLint("ClickableViewAccessibility") - override fun onTouchEvent(ev: MotionEvent): Boolean = handleTouchOverride(ev, superOnTouch) + override fun onTouchEvent(ev: MotionEvent): Boolean { + return handleTouchOverride(ev, superOnTouch) + } private fun cancelScheduledLongPress() { if (hasPostedLongPress) { diff --git a/lawnchair/src/app/lawnchair/smartspace/provider/SmartspaceDataSource.kt b/lawnchair/src/app/lawnchair/smartspace/provider/SmartspaceDataSource.kt index 08f705192b1..47e62c6ccf0 100644 --- a/lawnchair/src/app/lawnchair/smartspace/provider/SmartspaceDataSource.kt +++ b/lawnchair/src/app/lawnchair/smartspace/provider/SmartspaceDataSource.kt @@ -80,9 +80,11 @@ sealed class SmartspaceDataSource( val targets: List = emptyList(), val requiresSetup: List = emptyList(), ) { - operator fun plus(other: State): State = State( - targets = this.targets + other.targets, - requiresSetup = this.requiresSetup + other.requiresSetup, - ) + operator fun plus(other: State): State { + return State( + targets = this.targets + other.targets, + requiresSetup = this.requiresSetup + other.requiresSetup, + ) + } } } diff --git a/lawnchair/src/app/lawnchair/smartspace/provider/SmartspaceWidgetReader.kt b/lawnchair/src/app/lawnchair/smartspace/provider/SmartspaceWidgetReader.kt index 849f4ce6d0e..cac8168b080 100644 --- a/lawnchair/src/app/lawnchair/smartspace/provider/SmartspaceWidgetReader.kt +++ b/lawnchair/src/app/lawnchair/smartspace/provider/SmartspaceWidgetReader.kt @@ -141,7 +141,9 @@ class SmartspaceWidgetReader(context: Context) : ) } - private fun extractBitmap(imageView: ImageView?): Bitmap? = (imageView?.drawable as? BitmapDrawable)?.bitmap + private fun extractBitmap(imageView: ImageView?): Bitmap? { + return (imageView?.drawable as? BitmapDrawable)?.bitmap + } data class WeatherData( val icon: Bitmap, @@ -151,7 +153,9 @@ class SmartspaceWidgetReader(context: Context) : val pendingIntent: PendingIntent? = null, ) { - fun getTitle(unit: Temperature.Unit = temperature.unit): String = "${temperature.inUnit(unit)}${unit.suffix}" + fun getTitle(unit: Temperature.Unit = temperature.unit): String { + return "${temperature.inUnit(unit)}${unit.suffix}" + } } companion object { @@ -165,29 +169,31 @@ class SmartspaceWidgetReader(context: Context) : featureType = SmartspaceTarget.FeatureType.FEATURE_WEATHER, ) - fun parseWeatherData(weatherIcon: Bitmap?, temperature: String?, intent: PendingIntent? = null): WeatherData? = if (weatherIcon != null && temperature != null) { - try { - val value = temperature.substring(0, temperature.indexOfFirst { (it < '0' || it > '9') && it != '-' }).toInt() - WeatherData( - weatherIcon, - Temperature( - value, - when { - temperature.contains("C") -> Temperature.Unit.Celsius - temperature.contains("F") -> Temperature.Unit.Fahrenheit - temperature.contains("K") -> Temperature.Unit.Kelvin - else -> throw IllegalArgumentException("only supports C, F and K") - }, - ), - pendingIntent = intent, - ) - } catch (_: NumberFormatException) { - null - } catch (_: IllegalArgumentException) { + fun parseWeatherData(weatherIcon: Bitmap?, temperature: String?, intent: PendingIntent? = null): WeatherData? { + return if (weatherIcon != null && temperature != null) { + try { + val value = temperature.substring(0, temperature.indexOfFirst { (it < '0' || it > '9') && it != '-' }).toInt() + WeatherData( + weatherIcon, + Temperature( + value, + when { + temperature.contains("C") -> Temperature.Unit.Celsius + temperature.contains("F") -> Temperature.Unit.Fahrenheit + temperature.contains("K") -> Temperature.Unit.Kelvin + else -> throw IllegalArgumentException("only supports C, F and K") + }, + ), + pendingIntent = intent, + ) + } catch (_: NumberFormatException) { + null + } catch (_: IllegalArgumentException) { + null + } + } else { null } - } else { - null } } } diff --git a/lawnchair/src/app/lawnchair/theme/ThemeProvider.kt b/lawnchair/src/app/lawnchair/theme/ThemeProvider.kt index 165ddaada1c..c6f539fd2d5 100644 --- a/lawnchair/src/app/lawnchair/theme/ThemeProvider.kt +++ b/lawnchair/src/app/lawnchair/theme/ThemeProvider.kt @@ -136,8 +136,10 @@ class ThemeProvider(private val context: Context) : SafeCloseable { } } -fun Color.toAndroidColor(): Int = when (this) { - is AndroidColor -> color - is Srgb -> ColorUtils.setAlphaComponent(toRgb8(), 255) - else -> convert().toAndroidColor() +fun Color.toAndroidColor(): Int { + return when (this) { + is AndroidColor -> color + is Srgb -> ColorUtils.setAlphaComponent(toRgb8(), 255) + else -> convert().toAndroidColor() + } } diff --git a/lawnchair/src/app/lawnchair/theme/color/tokens/ColorStateListToken.kt b/lawnchair/src/app/lawnchair/theme/color/tokens/ColorStateListToken.kt index 1c04dea3b03..a33aef09ac8 100644 --- a/lawnchair/src/app/lawnchair/theme/color/tokens/ColorStateListToken.kt +++ b/lawnchair/src/app/lawnchair/theme/color/tokens/ColorStateListToken.kt @@ -12,7 +12,9 @@ data class NewColorStateList( private val factory: (context: Context, scheme: ColorScheme, uiColorMode: UiColorMode) -> ColorStateList, ) : ColorStateListToken { - override fun resolve(context: Context, scheme: ColorScheme, uiColorMode: UiColorMode): ColorStateList = factory(context, scheme, uiColorMode) + override fun resolve(context: Context, scheme: ColorScheme, uiColorMode: UiColorMode): ColorStateList { + return factory(context, scheme, uiColorMode) + } } class DayNightColorStateList( @@ -20,9 +22,11 @@ class DayNightColorStateList( private val darkToken: ColorStateListToken, ) : ColorStateListToken { - override fun resolve(context: Context, scheme: ColorScheme, uiColorMode: UiColorMode): ColorStateList = if (uiColorMode.isDarkTheme) { - darkToken.resolve(context, scheme, uiColorMode) - } else { - lightToken.resolve(context, scheme, uiColorMode) + override fun resolve(context: Context, scheme: ColorScheme, uiColorMode: UiColorMode): ColorStateList { + return if (uiColorMode.isDarkTheme) { + darkToken.resolve(context, scheme, uiColorMode) + } else { + lightToken.resolve(context, scheme, uiColorMode) + } } } diff --git a/lawnchair/src/app/lawnchair/theme/color/tokens/ColorToken.kt b/lawnchair/src/app/lawnchair/theme/color/tokens/ColorToken.kt index 0f04bda24de..6610b9f265d 100644 --- a/lawnchair/src/app/lawnchair/theme/color/tokens/ColorToken.kt +++ b/lawnchair/src/app/lawnchair/theme/color/tokens/ColorToken.kt @@ -20,11 +20,13 @@ sealed interface ColorToken : ResourceToken { val themeProvider = ThemeProvider.INSTANCE.get(context) return resolveColor(context, themeProvider.colorScheme, uiColorMode) } - fun resolveColor(context: Context, scheme: ColorScheme, uiColorMode: UiColorMode): Int = try { - resolve(context, scheme, uiColorMode).toAndroidColor() - } catch (t: Throwable) { - Log.e("ColorToken", "failed to resolve color", t) - android.graphics.Color.WHITE + fun resolveColor(context: Context, scheme: ColorScheme, uiColorMode: UiColorMode): Int { + return try { + resolve(context, scheme, uiColorMode).toAndroidColor() + } catch (t: Throwable) { + Log.e("ColorToken", "failed to resolve color", t) + android.graphics.Color.WHITE + } } } @@ -50,13 +52,17 @@ data class DayNightColorToken( private val darkToken: ColorToken, ) : ColorToken { - override fun resolve(context: Context, scheme: ColorScheme, uiColorMode: UiColorMode): Color = if (uiColorMode.isDarkTheme) { - darkToken.resolve(context, scheme, uiColorMode) - } else { - lightToken.resolve(context, scheme, uiColorMode) + override fun resolve(context: Context, scheme: ColorScheme, uiColorMode: UiColorMode): Color { + return if (uiColorMode.isDarkTheme) { + darkToken.resolve(context, scheme, uiColorMode) + } else { + lightToken.resolve(context, scheme, uiColorMode) + } } - fun inverse(): DayNightColorToken = DayNightColorToken(darkToken, lightToken) + fun inverse(): DayNightColorToken { + return DayNightColorToken(darkToken, lightToken) + } } data class DarkTextColorToken( @@ -64,10 +70,12 @@ data class DarkTextColorToken( private val darkToken: ColorToken, ) : ColorToken { - override fun resolve(context: Context, scheme: ColorScheme, uiColorMode: UiColorMode): Color = if (uiColorMode.isDarkText) { - darkToken.resolve(context, scheme, uiColorMode) - } else { - lightToken.resolve(context, scheme, uiColorMode) + override fun resolve(context: Context, scheme: ColorScheme, uiColorMode: UiColorMode): Color { + return if (uiColorMode.isDarkText) { + darkToken.resolve(context, scheme, uiColorMode) + } else { + lightToken.resolve(context, scheme, uiColorMode) + } } } @@ -75,7 +83,9 @@ data class StaticColorToken( private val color: Long, ) : ColorToken { - override fun resolve(context: Context, scheme: ColorScheme, uiColorMode: UiColorMode): Color = AndroidColor(color.toInt()) + override fun resolve(context: Context, scheme: ColorScheme, uiColorMode: UiColorMode): Color { + return AndroidColor(color.toInt()) + } } data class SetAlphaColorToken( @@ -106,7 +116,9 @@ class WithContextColorToken( private val transform: ColorToken.(Context) -> ColorToken, ) : ColorToken { - override fun resolve(context: Context, scheme: ColorScheme, uiColorMode: UiColorMode): Color = transform(token, context).resolve(context, scheme, uiColorMode) + override fun resolve(context: Context, scheme: ColorScheme, uiColorMode: UiColorMode): Color { + return transform(token, context).resolve(context, scheme, uiColorMode) + } } enum class Swatch { Neutral1, Neutral2, Accent1, Accent2, Accent3 } diff --git a/lawnchair/src/app/lawnchair/theme/drawable/DrawableToken.kt b/lawnchair/src/app/lawnchair/theme/drawable/DrawableToken.kt index e9c8bb7606e..12ee52800c8 100644 --- a/lawnchair/src/app/lawnchair/theme/drawable/DrawableToken.kt +++ b/lawnchair/src/app/lawnchair/theme/drawable/DrawableToken.kt @@ -19,7 +19,9 @@ interface DrawableToken : ResourceToken data class ResourceDrawableToken(@DrawableRes private val resId: Int) : DrawableToken { @Suppress("UNCHECKED_CAST") - override fun resolve(context: Context, scheme: ColorScheme, uiColorMode: UiColorMode): T = AppCompatResources.getDrawable(context, resId) as T + override fun resolve(context: Context, scheme: ColorScheme, uiColorMode: UiColorMode): T { + return AppCompatResources.getDrawable(context, resId) as T + } } data class AttributeDrawableToken(@AttrRes private val attr: Int) : DrawableToken { @@ -46,7 +48,9 @@ data class NewDrawable( private val factory: (context: Context, scheme: ColorScheme, uiColorMode: UiColorMode) -> T, ) : DrawableToken { - override fun resolve(context: Context, scheme: ColorScheme, uiColorMode: UiColorMode): T = factory(context, scheme, uiColorMode) + override fun resolve(context: Context, scheme: ColorScheme, uiColorMode: UiColorMode): T { + return factory(context, scheme, uiColorMode) + } } fun DrawableToken.mutate( diff --git a/lawnchair/src/app/lawnchair/ui/AndroidText.kt b/lawnchair/src/app/lawnchair/ui/AndroidText.kt index 7d40739f722..736655275f0 100644 --- a/lawnchair/src/app/lawnchair/ui/AndroidText.kt +++ b/lawnchair/src/app/lawnchair/ui/AndroidText.kt @@ -54,7 +54,9 @@ fun AndroidText( } @Composable -fun toIntColor(color: Color): Int = remember(color) { - val (r, g, b, a) = color.convert(ColorSpaces.Srgb) - android.graphics.Color.argb((a * 255).toInt(), (r * 255).toInt(), (g * 255).toInt(), (b * 255).toInt()) +fun toIntColor(color: Color): Int { + return remember(color) { + val (r, g, b, a) = color.convert(ColorSpaces.Srgb) + android.graphics.Color.argb((a * 255).toInt(), (r * 255).toInt(), (g * 255).toInt(), (b * 255).toInt()) + } } diff --git a/lawnchair/src/app/lawnchair/ui/StretchRecyclerViewContainer.kt b/lawnchair/src/app/lawnchair/ui/StretchRecyclerViewContainer.kt index 41c23f90967..44bfca94896 100644 --- a/lawnchair/src/app/lawnchair/ui/StretchRecyclerViewContainer.kt +++ b/lawnchair/src/app/lawnchair/ui/StretchRecyclerViewContainer.kt @@ -38,10 +38,12 @@ open class StretchRecyclerViewContainer @JvmOverloads constructor( override fun createEdgeEffectFactory(): RecyclerView.EdgeEffectFactory { if (Utilities.ATLEAST_S) return super.createEdgeEffectFactory() return object : RecyclerView.EdgeEffectFactory() { - override fun createEdgeEffect(view: RecyclerView, direction: Int): EdgeEffect = when (direction) { - DIRECTION_TOP -> edgeEffectTop - DIRECTION_BOTTOM -> childEffect - else -> super.createEdgeEffect(view, direction) + override fun createEdgeEffect(view: RecyclerView, direction: Int): EdgeEffect { + return when (direction) { + DIRECTION_TOP -> edgeEffectTop + DIRECTION_BOTTOM -> childEffect + else -> super.createEdgeEffect(view, direction) + } } } } diff --git a/lawnchair/src/app/lawnchair/ui/StretchRelativeLayout.kt b/lawnchair/src/app/lawnchair/ui/StretchRelativeLayout.kt index e3c3ef33df1..933815d1d99 100644 --- a/lawnchair/src/app/lawnchair/ui/StretchRelativeLayout.kt +++ b/lawnchair/src/app/lawnchair/ui/StretchRelativeLayout.kt @@ -51,10 +51,12 @@ sealed class StretchRelativeLayout @JvmOverloads constructor( override fun createEdgeEffectFactory(): RecyclerView.EdgeEffectFactory { if (Utilities.ATLEAST_S) return super.createEdgeEffectFactory() return object : RecyclerView.EdgeEffectFactory() { - override fun createEdgeEffect(view: RecyclerView, direction: Int): EdgeEffect = when (direction) { - DIRECTION_TOP -> edgeEffectTop - DIRECTION_BOTTOM -> edgeEffectBottom - else -> super.createEdgeEffect(view, direction) + override fun createEdgeEffect(view: RecyclerView, direction: Int): EdgeEffect { + return when (direction) { + DIRECTION_TOP -> edgeEffectTop + DIRECTION_BOTTOM -> edgeEffectBottom + else -> super.createEdgeEffect(view, direction) + } } } } diff --git a/lawnchair/src/app/lawnchair/ui/popup/LauncherOptionsPopup.kt b/lawnchair/src/app/lawnchair/ui/popup/LauncherOptionsPopup.kt index 3a70297ab7c..bc72b731d47 100644 --- a/lawnchair/src/app/lawnchair/ui/popup/LauncherOptionsPopup.kt +++ b/lawnchair/src/app/lawnchair/ui/popup/LauncherOptionsPopup.kt @@ -1,5 +1,6 @@ package app.lawnchair.ui.popup +import android.content.Context import android.view.View import androidx.annotation.DrawableRes import androidx.annotation.StringRes @@ -13,7 +14,25 @@ import com.patrykmichalik.opto.core.firstBlocking import com.patrykmichalik.opto.core.setBlocking object LauncherOptionsPopup { - const val DEFAULT_ORDER = "-lock|-edit_mode|+wallpaper|+widgets|+home_settings|-sys_settings" + const val DEFAULT_ORDER = "+carousel|-lock|-edit_mode|+wallpaper|+widgets|+home_settings|-sys_settings" + + fun disableUnavailableItems( + context: Context, + ) { + val prefs2 = getInstance(context) + val optionOrder = prefs2.launcherPopupOrder.firstBlocking() + + prefs2.launcherPopupOrder.setBlocking( + optionOrder.split("|") + .joinToString("|") { item -> + when (item) { + "+edit_mode" -> "-edit_mode" + "+widgets" -> "-widgets" + else -> item + } + }, + ) + } /** * Returns the list of supported actions @@ -31,18 +50,7 @@ object LauncherOptionsPopup { val lockHomeScreen = prefs2.lockHomeScreen.firstBlocking() val optionOrder = prefs2.launcherPopupOrder.firstBlocking() - if (lockHomeScreen) { - prefs2.launcherPopupOrder.setBlocking( - optionOrder.split("|") - .joinToString("|") { item -> - when (item) { - "+edit_mode" -> "-edit_mode" - "+widgets" -> "-widgets" - else -> item - } - }, - ) - } + migrateLegacyPreferences(launcher) val wallpaperResString = if (Utilities.existsStyleWallpapers(launcher)) R.string.styles_wallpaper_button_text else R.string.wallpapers @@ -101,7 +109,7 @@ object LauncherOptionsPopup { item.startsWith("-") -> item.drop(1) to false else -> item to true // Default to enabled if no prefix } - if (isEnabled) { + if (isEnabled && identifier != "carousel") { optionsList[identifier]?.let { option -> options.add(option) } @@ -111,32 +119,72 @@ object LauncherOptionsPopup { return options } - fun getMetadataForOption(identifier: String): LauncherOptionMetadata = when (identifier) { - "lock" -> LauncherOptionMetadata( - label = R.string.home_screen_lock, - icon = R.drawable.ic_lock, - ) - "sys_settings" -> LauncherOptionMetadata( - label = R.string.system_settings, - icon = R.drawable.ic_setting, - ) - "edit_mode" -> LauncherOptionMetadata( - label = R.string.edit_home_screen, - icon = R.drawable.enter_home_gardening_icon, - ) - "wallpaper" -> LauncherOptionMetadata( - label = R.string.styles_wallpaper_button_text, - icon = R.drawable.ic_palette, - ) - "widgets" -> LauncherOptionMetadata( - label = R.string.widget_button_text, - icon = R.drawable.ic_widget, - ) - "home_settings" -> LauncherOptionMetadata( - label = R.string.settings_button_text, - icon = R.drawable.ic_home_screen, - ) - else -> throw IllegalArgumentException("invalid popup option") + fun getMetadataForOption(identifier: String): LauncherOptionMetadata { + return when (identifier) { + "carousel" -> LauncherOptionMetadata( + label = R.string.wallpaper_quick_picker, + icon = R.drawable.ic_wallpaper, + isCarousel = true, + ) + "lock" -> LauncherOptionMetadata( + label = R.string.home_screen_lock, + icon = R.drawable.ic_lock, + ) + "sys_settings" -> LauncherOptionMetadata( + label = R.string.system_settings, + icon = R.drawable.ic_setting, + ) + "edit_mode" -> LauncherOptionMetadata( + label = R.string.edit_home_screen, + icon = R.drawable.enter_home_gardening_icon, + ) + "wallpaper" -> LauncherOptionMetadata( + label = R.string.styles_wallpaper_button_text, + icon = R.drawable.ic_palette, + ) + "widgets" -> LauncherOptionMetadata( + label = R.string.widget_button_text, + icon = R.drawable.ic_widget, + ) + "home_settings" -> LauncherOptionMetadata( + label = R.string.settings_button_text, + icon = R.drawable.ic_home_screen, + ) + else -> throw IllegalArgumentException("invalid popup option") + } + } + + private fun migrateLegacyPreferences( + launcher: Launcher, + ) { + val prefs2 = getInstance(launcher) + + val lockHomeScreenButtonOnPopUp = prefs2.lockHomeScreenButtonOnPopUp.firstBlocking() + val editHomeScreenButtonOnPopUp = prefs2.editHomeScreenButtonOnPopUp.firstBlocking() + val showSystemSettingsEntryOnPopUp = prefs2.showSystemSettingsEntryOnPopUp.firstBlocking() + + val optionOrder = prefs2.launcherPopupOrder + val legacyPopupOptionsMigrated = prefs2.legacyPopupOptionsMigrated.firstBlocking() + + if (!legacyPopupOptionsMigrated) { + prefs2.legacyPopupOptionsMigrated.setBlocking(true) + + val options = optionOrder.firstBlocking().toLauncherOptions() + + options.forEachIndexed { index, item -> + if (item.identifier == "lock") { + options[index].isEnabled = lockHomeScreenButtonOnPopUp + } + if (item.identifier == "edit_mode") { + options[index].isEnabled = editHomeScreenButtonOnPopUp + } + if (item.identifier == "sys_settings") { + options[index].isEnabled = showSystemSettingsEntryOnPopUp + } + } + + optionOrder.setBlocking(options.toOptionOrderString()) + } } } @@ -148,17 +196,22 @@ data class LauncherOptionPopupItem( data class LauncherOptionMetadata( @StringRes val label: Int, @DrawableRes val icon: Int, + val isCarousel: Boolean = false, ) -fun String.toLauncherOptions(): List = this.split("|").map { item -> - val (identifier, isEnabled) = when { - item.startsWith("+") -> item.drop(1) to true - item.startsWith("-") -> item.drop(1) to false - else -> item to true // Default to enabled if no prefix +fun String.toLauncherOptions(): List { + return this.split("|").map { item -> + val (identifier, isEnabled) = when { + item.startsWith("+") -> item.drop(1) to true + item.startsWith("-") -> item.drop(1) to false + else -> item to true // Default to enabled if no prefix + } + LauncherOptionPopupItem(identifier, isEnabled) } - LauncherOptionPopupItem(identifier, isEnabled) } -fun List.toOptionOrderString(): String = this.joinToString("|") { - if (it.isEnabled) "+${it.identifier}" else "-${it.identifier}" +fun List.toOptionOrderString(): String { + return this.joinToString("|") { + if (it.isEnabled) "+${it.identifier}" else "-${it.identifier}" + } } diff --git a/lawnchair/src/app/lawnchair/ui/popup/LawnchairPopupDialog.kt b/lawnchair/src/app/lawnchair/ui/popup/LawnchairPopupDialog.kt new file mode 100644 index 00000000000..19fe1eb6c02 --- /dev/null +++ b/lawnchair/src/app/lawnchair/ui/popup/LawnchairPopupDialog.kt @@ -0,0 +1,16 @@ +package app.lawnchair.ui.popup + +import android.content.Context +import android.util.AttributeSet +import android.view.View +import com.android.launcher3.R +import com.android.launcher3.views.ActivityContext +import com.android.launcher3.views.OptionsPopupView + +class LawnchairPopupDialog { + class LawnchairOptionsPopUp(context: T, attributeSet: AttributeSet) : OptionsPopupView(context, attributeSet) + where T : Context, T : ActivityContext { + + override fun isShortcutOrWrapper(view: View): Boolean = view.id == R.id.wallpaper_container || super.isShortcutOrWrapper(view) + } +} diff --git a/lawnchair/src/app/lawnchair/ui/popup/WallpaperCarouselView.kt b/lawnchair/src/app/lawnchair/ui/popup/WallpaperCarouselView.kt new file mode 100644 index 00000000000..d88960058e9 --- /dev/null +++ b/lawnchair/src/app/lawnchair/ui/popup/WallpaperCarouselView.kt @@ -0,0 +1,218 @@ +package app.lawnchair.ui.popup + +import android.animation.ValueAnimator +import android.annotation.SuppressLint +import android.app.WallpaperManager +import android.content.Context +import android.graphics.Bitmap +import android.graphics.BitmapFactory +import android.util.AttributeSet +import android.util.Log +import android.view.Gravity +import android.view.ViewGroup +import android.widget.FrameLayout +import android.widget.ImageView +import android.widget.LinearLayout +import android.widget.ProgressBar +import androidx.cardview.widget.CardView +import androidx.core.content.ContextCompat +import androidx.lifecycle.LifecycleOwner +import androidx.lifecycle.ViewModelProvider +import androidx.lifecycle.ViewModelStoreOwner +import app.lawnchair.LawnchairLauncher +import app.lawnchair.views.component.IconFrame +import app.lawnchair.wallpaper.model.WallpaperViewModel +import app.lawnchair.wallpaper.model.WallpaperViewModelFactory +import app.lawnchair.wallpaper.service.Wallpaper +import com.android.launcher3.R +import com.android.launcher3.util.Themes +import com.android.launcher3.views.ActivityContext +import java.io.File +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext + +class WallpaperCarouselView @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0, +) : LinearLayout(context, attrs, defStyleAttr) { + + private val viewModel: WallpaperViewModel + private val deviceProfile = ActivityContext.lookupContext(context).deviceProfile + private var currentItemIndex = 0 + private val iconFrame = IconFrame(context).apply { + setIcon(R.drawable.ic_tick) + setBackgroundWithRadius(Themes.getColorAccent(context), 100F) + } + private val loadingView = ProgressBar(context).apply { isIndeterminate = true } + + init { + orientation = HORIZONTAL + addView(loadingView) + viewModel = ViewModelProvider( + context as ViewModelStoreOwner, + WallpaperViewModelFactory(context), + )[WallpaperViewModel::class.java] + + observeWallpapers() + } + + private fun observeWallpapers() { + viewModel.wallpapers.observe(context as LifecycleOwner) { wallpapers -> + visibility = if (wallpapers.isEmpty()) GONE else VISIBLE + loadingView.visibility = if (wallpapers.isEmpty()) GONE else VISIBLE + if (wallpapers.isNotEmpty()) displayWallpapers(wallpapers) + } + } + + private fun displayWallpapers(wallpapers: List) { + removeAllViews() + val totalWidth = calculateTotalWidth() + val firstItemWidth = totalWidth * 0.4 + val itemWidth = calculateItemWidth(totalWidth, wallpapers.size, firstItemWidth) + val margin = (totalWidth * 0.03).toInt() + + wallpapers.forEachIndexed { index, wallpaper -> + val cardView = createCardView(index, firstItemWidth, itemWidth, margin, wallpaper) + addView(cardView) + loadWallpaperImage(wallpaper, cardView, index == currentItemIndex) + } + loadingView.visibility = GONE + } + + private fun calculateTotalWidth(): Int { + return width.takeIf { it > 0 } ?: (deviceProfile.widthPx * if (deviceProfile.isLandscape || deviceProfile.isTablet) 0.5 else 0.8).toInt() + } + + private fun calculateItemWidth(totalWidth: Int, itemCount: Int, firstItemWidth: Double): Double { + val remainingWidth = totalWidth - firstItemWidth + val marginBetweenItems = totalWidth * 0.03 + return (remainingWidth - (marginBetweenItems * (itemCount - 1))) / (itemCount - 1) + } + + @SuppressLint("ClickableViewAccessibility") + private fun createCardView( + index: Int, + firstItemWidth: Double, + itemWidth: Double, + margin: Int, + wallpaper: Wallpaper, + ): CardView { + return CardView(context).apply { + radius = Themes.getDialogCornerRadius(context) / 2 + layoutParams = LayoutParams( + if (index == currentItemIndex) firstItemWidth.toInt() else itemWidth.toInt(), + LayoutParams.MATCH_PARENT, + ).apply { setMargins(if (index > 0) margin else 0, 0, 0, 0) } + + setOnTouchListener { _, _ -> + if (index != currentItemIndex) { + animateWidthTransition(index, firstItemWidth, itemWidth) + } else { + setWallpaper(wallpaper) + } + true + } + } + } + + private fun loadWallpaperImage(wallpaper: Wallpaper, cardView: CardView, isCurrent: Boolean) { + CoroutineScope(Dispatchers.IO).launch { + val bitmap = File(wallpaper.imagePath).takeIf { it.exists() }?.let { BitmapFactory.decodeFile(it.path) } + withContext(Dispatchers.Main) { addImageView(cardView, bitmap, isCurrent) } + } + } + + private fun addImageView(cardView: CardView, bitmap: Bitmap?, isCurrent: Boolean) { + val imageView = ImageView(context).apply { + setImageDrawable(ContextCompat.getDrawable(context, R.drawable.ic_deepshortcut_placeholder)) + scaleType = ImageView.ScaleType.CENTER_CROP + alpha = 0f + } + cardView.addView(imageView) + if (bitmap != null) { + imageView.setImageBitmap(bitmap) + imageView.animate().alpha(1f).setDuration(200L).withEndAction { + if (isCurrent) addIconFrameToCenter(cardView) + }.start() + } + } + + private fun setWallpaper(wallpaper: Wallpaper) { + val currentCardView = getChildAt(currentItemIndex) as CardView + val spinner = createLoadingSpinner() + + currentCardView.removeView(iconFrame) + currentCardView.addView(spinner) + + CoroutineScope(Dispatchers.IO).launch { + try { + WallpaperManager.getInstance(context).setBitmap( + BitmapFactory.decodeFile(wallpaper.imagePath), + null, + true, + WallpaperManager.FLAG_SYSTEM, + ) + viewModel.updateWallpaperRank(wallpaper) + } catch (e: Exception) { + Log.e("WallpaperCarouselView", "Failed to set wallpaper: ${e.message}") + } finally { + withContext(Dispatchers.Main) { + currentCardView.removeView(spinner) + addIconFrameToCenter(currentCardView) + } + } + } + } + + private fun createLoadingSpinner() = ProgressBar(context).apply { + isIndeterminate = true + layoutParams = FrameLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT).apply { + gravity = Gravity.CENTER + } + } + + private fun addIconFrameToCenter(cardView: CardView? = getChildAt(currentItemIndex) as CardView) { + (iconFrame.parent as? ViewGroup)?.removeView(iconFrame) + cardView?.addView( + iconFrame, + FrameLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT).apply { + gravity = Gravity.CENTER + }, + ) + } + + override fun onSizeChanged(w: Int, h: Int, oldw: Int, oldh: Int) { + super.onSizeChanged(w, h, oldw, oldh) + viewModel.wallpapers.value?.let { displayWallpapers(it) } + } + + override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) { + super.onMeasure( + MeasureSpec.makeMeasureSpec(calculateTotalWidth(), MeasureSpec.EXACTLY), + heightMeasureSpec, + ) + } + + private fun animateWidthTransition(newIndex: Int, firstItemWidth: Double, itemWidth: Double) { + currentItemIndex = newIndex + for (i in 0 until childCount) { + (getChildAt(i) as? CardView)?.let { cardView -> + val targetWidth = if (i == currentItemIndex) firstItemWidth.toInt() else itemWidth.toInt() + if (cardView.layoutParams.width != targetWidth) { + ValueAnimator.ofInt(cardView.layoutParams.width, targetWidth).apply { + duration = 300L + addUpdateListener { + cardView.layoutParams.width = it.animatedValue as Int + cardView.requestLayout() + } + start() + } + } + if (i == currentItemIndex) addIconFrameToCenter(cardView) + } + } + } +} diff --git a/lawnchair/src/app/lawnchair/ui/preferences/components/AnnouncementPreference.kt b/lawnchair/src/app/lawnchair/ui/preferences/components/AnnouncementPreference.kt index 02d690d51e9..e9c48bc2083 100644 --- a/lawnchair/src/app/lawnchair/ui/preferences/components/AnnouncementPreference.kt +++ b/lawnchair/src/app/lawnchair/ui/preferences/components/AnnouncementPreference.kt @@ -178,9 +178,11 @@ private fun AnnouncementItemContent( } } -private fun calculateAlpha(progress: Float): Float = when { - progress < 0.5f -> 1f // Fully opaque until halfway - else -> 1f - (progress - 0.5f) * 2 // Fade out linearly from halfway to the end +private fun calculateAlpha(progress: Float): Float { + return when { + progress < 0.5f -> 1f // Fully opaque until halfway + else -> 1f - (progress - 0.5f) * 2 // Fade out linearly from halfway to the end + } } @Composable diff --git a/lawnchair/src/app/lawnchair/ui/preferences/components/DraggablePreference.kt b/lawnchair/src/app/lawnchair/ui/preferences/components/DraggablePreference.kt index fef79b4cfbd..404b91a0be4 100644 --- a/lawnchair/src/app/lawnchair/ui/preferences/components/DraggablePreference.kt +++ b/lawnchair/src/app/lawnchair/ui/preferences/components/DraggablePreference.kt @@ -41,6 +41,7 @@ import app.lawnchair.ui.preferences.components.layout.ExpandAndShrink import app.lawnchair.ui.preferences.components.layout.PreferenceGroup import app.lawnchair.ui.preferences.components.layout.PreferenceGroupHeading import app.lawnchair.ui.preferences.components.layout.PreferenceTemplate +import app.lawnchair.ui.util.addIf import com.android.launcher3.R import com.android.launcher3.Utilities import sh.calvin.reorderable.ReorderableColumn @@ -53,7 +54,12 @@ fun DraggablePreferenceGroup( defaultList: List, onOrderChange: (List) -> Unit, modifier: Modifier = Modifier, - itemContent: @Composable ReorderableScope.(item: T, index: Int, isDragging: Boolean, onDraggingChange: (Boolean) -> Unit) -> Unit, + itemContent: @Composable ReorderableScope.( + item: T, + index: Int, + isDragging: Boolean, + onDraggingChange: (Boolean) -> Unit, + ) -> Unit, ) { var localItems = items var isAnyDragging by remember { mutableStateOf(false) } @@ -95,17 +101,20 @@ fun DraggablePreferenceGroup( key(item) { Column { DraggablePreferenceContainer( - index = index, - items = localItems, isDragging = isDragging, - onMoveUp = { - localItems = it - }, - onMoveDown = { - localItems = it - }, + modifier = Modifier + .a11yDrag( + index = index, + items = items, + onMoveUp = { localItems = it }, + onMoveDown = { localItems = it }, + ), ) { - itemContent(item, index, isDragging) { + itemContent( + item, + index, + isDragging, + ) { isAnyDragging = it } } @@ -128,12 +137,8 @@ fun DraggablePreferenceGroup( } @Composable -fun DraggablePreferenceContainer( - index: Int, - items: List, +fun DraggablePreferenceContainer( isDragging: Boolean, - onMoveUp: (List) -> Unit, - onMoveDown: (List) -> Unit, modifier: Modifier = Modifier, content: @Composable () -> Unit, ) { @@ -152,13 +157,7 @@ fun DraggablePreferenceContainer( Color.Transparent, ) }, - modifier = modifier - .a11yDrag( - index = index, - items = items, - onMoveUp = onMoveUp, - onMoveDown = onMoveDown, - ), + modifier = modifier, ) { content() } @@ -213,25 +212,29 @@ fun DragHandle( scope: ReorderableScope, interactionSource: MutableInteractionSource, modifier: Modifier = Modifier, + isDraggable: Boolean = true, onDragStop: () -> Unit = {}, ) { val view = LocalView.current IconButton( modifier = with(scope) { - modifier.longPressDraggableHandle( - onDragStarted = { - if (Utilities.ATLEAST_U) { - view.performHapticFeedback(HapticFeedbackConstants.DRAG_START) - } - }, - onDragStopped = { - if (Utilities.ATLEAST_R) { - view.performHapticFeedback(HapticFeedbackConstants.GESTURE_END) - } - onDragStop() - }, - ) + modifier.addIf(isDraggable) { + longPressDraggableHandle( + onDragStarted = { + if (Utilities.ATLEAST_U) { + view.performHapticFeedback(HapticFeedbackConstants.DRAG_START) + } + }, + onDragStopped = { + if (Utilities.ATLEAST_R) { + view.performHapticFeedback(HapticFeedbackConstants.GESTURE_END) + } + onDragStop() + }, + ) + } }, + enabled = isDraggable, onClick = {}, interactionSource = interactionSource, ) { diff --git a/lawnchair/src/app/lawnchair/ui/preferences/components/LauncherPreview.kt b/lawnchair/src/app/lawnchair/ui/preferences/components/LauncherPreview.kt index 3a0369a71ee..58294f0d743 100644 --- a/lawnchair/src/app/lawnchair/ui/preferences/components/LauncherPreview.kt +++ b/lawnchair/src/app/lawnchair/ui/preferences/components/LauncherPreview.kt @@ -90,25 +90,29 @@ fun createPreviewView(idp: InvariantDeviceProfile = invariantDeviceProfile()): V return remember(idp) { previewManager.createPreviewView(idp) } } -fun Modifier.clipToPercentage(percentage: Float): Modifier = this.then( - Modifier.layout { measurable, constraints -> - val placeable = measurable.measure(constraints) - val height = (placeable.height * percentage).toInt() - layout(placeable.width, height) { - placeable.place(0, 0) - } - }, -) +fun Modifier.clipToPercentage(percentage: Float): Modifier { + return this.then( + Modifier.layout { measurable, constraints -> + val placeable = measurable.measure(constraints) + val height = (placeable.height * percentage).toInt() + layout(placeable.width, height) { + placeable.place(0, 0) + } + }, + ) +} -fun Modifier.clipToVisiblePercentage(percentage: Float): Modifier = this.then( - Modifier.layout { measurable, constraints -> - val placeable = measurable.measure(constraints) - val totalHeight = placeable.height - val visibleHeight = (totalHeight * percentage).toInt() - val offsetY = totalHeight - visibleHeight +fun Modifier.clipToVisiblePercentage(percentage: Float): Modifier { + return this.then( + Modifier.layout { measurable, constraints -> + val placeable = measurable.measure(constraints) + val totalHeight = placeable.height + val visibleHeight = (totalHeight * percentage).toInt() + val offsetY = totalHeight - visibleHeight - layout(placeable.width, visibleHeight) { - placeable.place(0, -offsetY) - } - }, -) + layout(placeable.width, visibleHeight) { + placeable.place(0, -offsetY) + } + }, + ) +} diff --git a/lawnchair/src/app/lawnchair/ui/preferences/components/layout/DividerColumn.kt b/lawnchair/src/app/lawnchair/ui/preferences/components/layout/DividerColumn.kt index f437435e56f..d6b915a9756 100644 --- a/lawnchair/src/app/lawnchair/ui/preferences/components/layout/DividerColumn.kt +++ b/lawnchair/src/app/lawnchair/ui/preferences/components/layout/DividerColumn.kt @@ -78,13 +78,15 @@ private fun Modifier.drawDividers( thickness: Float, startIndentPx: Float, endIndentPx: Float, -): Modifier = drawBehind { - state.dividerPositions.forEach { yPos -> - drawRect( - color = color, - topLeft = Offset(startIndentPx, yPos.toFloat()), - size = Size(size.width - startIndentPx - endIndentPx, thickness), - ) +): Modifier { + return drawBehind { + state.dividerPositions.forEach { yPos -> + drawRect( + color = color, + topLeft = Offset(startIndentPx, yPos.toFloat()), + size = Size(size.width - startIndentPx - endIndentPx, thickness), + ) + } } } diff --git a/lawnchair/src/app/lawnchair/ui/preferences/destinations/FontSelectionPreference.kt b/lawnchair/src/app/lawnchair/ui/preferences/destinations/FontSelectionPreference.kt index 87d7eccdb34..70dfc48bf42 100644 --- a/lawnchair/src/app/lawnchair/ui/preferences/destinations/FontSelectionPreference.kt +++ b/lawnchair/src/app/lawnchair/ui/preferences/destinations/FontSelectionPreference.kt @@ -269,7 +269,9 @@ private val VariantButtonContentPadding = PaddingValues( private fun removeFamilyPrefix( familyName: CharSequence, fontName: CharSequence, -): String = fontName.removePrefix(familyName).trim().toString() +): String { + return fontName.removePrefix(familyName).trim().toString() +} @Composable private fun VariantDropdown( diff --git a/lawnchair/src/app/lawnchair/ui/preferences/destinations/LauncherPopupPreference.kt b/lawnchair/src/app/lawnchair/ui/preferences/destinations/LauncherPopupPreference.kt index 853d896936a..a53cbe881f8 100644 --- a/lawnchair/src/app/lawnchair/ui/preferences/destinations/LauncherPopupPreference.kt +++ b/lawnchair/src/app/lawnchair/ui/preferences/destinations/LauncherPopupPreference.kt @@ -1,7 +1,9 @@ package app.lawnchair.ui.preferences.destinations import androidx.compose.animation.AnimatedVisibility +import androidx.compose.foundation.background import androidx.compose.foundation.interaction.MutableInteractionSource +import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer @@ -90,7 +92,7 @@ fun LauncherPopupPreference( optionsPref.onChange(it.toOptionOrderString()) }, ) { item, index, _, onDraggingChange -> - val label = LauncherOptionsPopup.getMetadataForOption(item.identifier).label + val metadata = LauncherOptionsPopup.getMetadataForOption(item.identifier) val enabled = when (item.identifier) { "edit_mode", "widgets" -> (!isHomeScreenLocked) @@ -101,7 +103,7 @@ fun LauncherPopupPreference( val interactionSource = remember { MutableInteractionSource() } DraggableSwitchPreference( - label = stringResource(label), + label = stringResource(metadata.label), description = if (!enabled && item.identifier != "home_settings") stringResource(R.string.home_screen_locked) else null, checked = item.isEnabled, onCheckedChange = { @@ -111,7 +113,8 @@ fun LauncherPopupPreference( dragIndicator = { DragHandle( scope = this, - interactionSource = interactionSource, + interactionSource = if (!metadata.isCarousel) interactionSource else remember { MutableInteractionSource() }, + isDraggable = !metadata.isCarousel, onDragStop = { onDraggingChange(false) }, @@ -175,10 +178,14 @@ private fun LauncherPopupPreview(optionsList: List) { modifier = Modifier .widthIn(max = 240.dp), ) { - OptionsItemRow( - icon = painterResource(metadata.icon), - label = stringResource(metadata.label), - ) + if (metadata.isCarousel) { + WallpaperCarouselPreview() + } else { + OptionsItemRow( + icon = painterResource(metadata.icon), + label = stringResource(metadata.label), + ) + } } } if (!isLast && enabledItems.indexOf(it) != -1) { @@ -190,6 +197,42 @@ private fun LauncherPopupPreview(optionsList: List) { } } +@Composable +private fun WallpaperCarouselPreview(modifier: Modifier = Modifier) { + val height = 100.dp + val width = 50.dp + + Row( + verticalAlignment = Alignment.CenterVertically, + modifier = modifier + .padding(16.dp) + .fillMaxWidth(), + ) { + Box( + Modifier + .clip(MaterialTheme.shapes.medium) + .background(MaterialTheme.colorScheme.surfaceVariant) + .size(height), + ) {} + Spacer(Modifier.width(8.dp)) + Box( + Modifier + .clip(MaterialTheme.shapes.medium) + .background(MaterialTheme.colorScheme.surfaceVariant) + .height(height) + .width(width), + ) {} + Spacer(Modifier.width(8.dp)) + Box( + Modifier + .clip(MaterialTheme.shapes.medium) + .background(MaterialTheme.colorScheme.surfaceVariant) + .height(height) + .width(width), + ) {} + } +} + @Composable private fun OptionsItemRow( icon: Painter, diff --git a/lawnchair/src/app/lawnchair/ui/theme/Color.kt b/lawnchair/src/app/lawnchair/ui/theme/Color.kt index 2baa585c895..ca4e829b781 100644 --- a/lawnchair/src/app/lawnchair/ui/theme/Color.kt +++ b/lawnchair/src/app/lawnchair/ui/theme/Color.kt @@ -15,7 +15,9 @@ import com.android.launcher3.Utilities import com.android.launcher3.util.Themes @JvmOverloads -fun Context.getAccentColor(darkTheme: Boolean = Themes.getAttrBoolean(this, R.attr.isMainColorDark)): Int = ColorTokens.ColorAccent.resolveColor(this, if (darkTheme) UiColorMode.Dark else UiColorMode.Light) +fun Context.getAccentColor(darkTheme: Boolean = Themes.getAttrBoolean(this, R.attr.isMainColorDark)): Int { + return ColorTokens.ColorAccent.resolveColor(this, if (darkTheme) UiColorMode.Dark else UiColorMode.Light) +} @ColorInt fun lightenColor(@ColorInt color: Int): Int { diff --git a/lawnchair/src/app/lawnchair/ui/util/ViewPool.kt b/lawnchair/src/app/lawnchair/ui/util/ViewPool.kt index 4f2e485d5d1..1e43d06bdd8 100644 --- a/lawnchair/src/app/lawnchair/ui/util/ViewPool.kt +++ b/lawnchair/src/app/lawnchair/ui/util/ViewPool.kt @@ -13,7 +13,9 @@ class ViewPool( private val factory: (Context) -> T, ) : RecyclerView.RecycledViewPool() where T : View, T : ViewPool.Recyclable { - private fun getOrCreateHolder(): RecyclerView.ViewHolder = getRecycledView(RecyclerView.INVALID_TYPE) ?: ViewHolder(factory(context)) + private fun getOrCreateHolder(): RecyclerView.ViewHolder { + return getRecycledView(RecyclerView.INVALID_TYPE) ?: ViewHolder(factory(context)) + } @Composable fun rememberView(): T { diff --git a/lawnchair/src/app/lawnchair/util/FileExtensions.kt b/lawnchair/src/app/lawnchair/util/FileExtensions.kt index d5154953aba..89dd48d4f65 100644 --- a/lawnchair/src/app/lawnchair/util/FileExtensions.kt +++ b/lawnchair/src/app/lawnchair/util/FileExtensions.kt @@ -12,14 +12,16 @@ internal fun Path.list( fileSystem: FileSystem = FileSystem.SYSTEM, isShowHidden: Boolean = false, isRecursively: Boolean = false, -): Sequence = runCatching { - if (isRecursively) { - fileSystem.listRecursively(this) - } else { - fileSystem.list(this).asSequence() +): Sequence { + return runCatching { + if (isRecursively) { + fileSystem.listRecursively(this) + } else { + fileSystem.list(this).asSequence() + } + }.getOrDefault(emptySequence()).filter { + if (isShowHidden) true else !it.isHidden } -}.getOrDefault(emptySequence()).filter { - if (isShowHidden) true else !it.isHidden } internal fun Path.getMetadata(fileSystem: FileSystem = FileSystem.SYSTEM): FileMetadata? = fileSystem.metadataOrNull(this) diff --git a/lawnchair/src/app/lawnchair/util/FileUilts.kt b/lawnchair/src/app/lawnchair/util/FileUilts.kt index a1820d8cc84..1aeceb63767 100644 --- a/lawnchair/src/app/lawnchair/util/FileUilts.kt +++ b/lawnchair/src/app/lawnchair/util/FileUilts.kt @@ -19,17 +19,19 @@ fun File.subscribeFiles() = callbackFlow> { awaitClose { observer.stopWatching() } } -fun createFileObserver(file: File, events: Int, onEvent: (event: Int, path: String?) -> Unit): FileObserver = if (Utilities.ATLEAST_Q) { - object : FileObserver(file, events) { - override fun onEvent(event: Int, path: String?) { - onEvent(event, path) +fun createFileObserver(file: File, events: Int, onEvent: (event: Int, path: String?) -> Unit): FileObserver { + return if (Utilities.ATLEAST_Q) { + object : FileObserver(file, events) { + override fun onEvent(event: Int, path: String?) { + onEvent(event, path) + } } - } -} else { - @Suppress("DEPRECATION") - object : FileObserver(file.path, events) { - override fun onEvent(event: Int, path: String?) { - onEvent(event, path) + } else { + @Suppress("DEPRECATION") + object : FileObserver(file.path, events) { + override fun onEvent(event: Int, path: String?) { + onEvent(event, path) + } } } } diff --git a/lawnchair/src/app/lawnchair/util/FlagUtils.kt b/lawnchair/src/app/lawnchair/util/FlagUtils.kt index e0eca3e1ec0..7c3a3a9b171 100644 --- a/lawnchair/src/app/lawnchair/util/FlagUtils.kt +++ b/lawnchair/src/app/lawnchair/util/FlagUtils.kt @@ -1,15 +1,25 @@ package app.lawnchair.util -fun Int.hasFlag(flag: Int): Boolean = (this and flag) == flag +fun Int.hasFlag(flag: Int): Boolean { + return (this and flag) == flag +} -fun Int.addFlag(flag: Int): Int = this or flag +fun Int.addFlag(flag: Int): Int { + return this or flag +} -fun Int.removeFlag(flag: Int): Int = this and flag.inv() +fun Int.removeFlag(flag: Int): Int { + return this and flag.inv() +} -fun Int.toggleFlag(flag: Int): Int = if (hasFlag(flag)) removeFlag(flag) else addFlag(flag) +fun Int.toggleFlag(flag: Int): Int { + return if (hasFlag(flag)) removeFlag(flag) else addFlag(flag) +} -fun Int.setFlag(flag: Int, value: Boolean): Int = if (value) { - addFlag(flag) -} else { - removeFlag(flag) +fun Int.setFlag(flag: Int, value: Boolean): Int { + return if (value) { + addFlag(flag) + } else { + removeFlag(flag) + } } diff --git a/lawnchair/src/app/lawnchair/util/LawnchairLockedStateController.kt b/lawnchair/src/app/lawnchair/util/LawnchairLockedStateController.kt index c555fa352b2..f92024690f0 100644 --- a/lawnchair/src/app/lawnchair/util/LawnchairLockedStateController.kt +++ b/lawnchair/src/app/lawnchair/util/LawnchairLockedStateController.kt @@ -124,7 +124,9 @@ object LawnchairLockedStateController { } } - fun getTaskLockState(taskIdentifier: String, userId: Int): Boolean = lockedListWithUserId.contains(appendUserWithBrace(taskIdentifier, userId.toString())) + fun getTaskLockState(taskIdentifier: String, userId: Int): Boolean { + return lockedListWithUserId.contains(appendUserWithBrace(taskIdentifier, userId.toString())) + } // TODO Implement this, when the app is uninstalled fun removeTaskLockState(taskIdentifier: String, userId: Int) { @@ -145,13 +147,21 @@ object LawnchairLockedStateController { } } - fun isTaskLocked(taskIdentifier: String): Boolean = lockedPackageNameListWithUserId.contains(taskIdentifier) + fun isTaskLocked(taskIdentifier: String): Boolean { + return lockedPackageNameListWithUserId.contains(taskIdentifier) + } - private fun appendUserWithoutBrace(input: String, userId: String): String = input.replace("{", "") + "#$userId" + private fun appendUserWithoutBrace(input: String, userId: String): String { + return input.replace("{", "") + "#$userId" + } - private fun appendUserWithBrace(input: String, userId: String): String = input.replace("}", "") + "#$userId}" + private fun appendUserWithBrace(input: String, userId: String): String { + return input.replace("}", "") + "#$userId}" + } - private fun removeUserWithBrace(input: String): String = input.substring(0, input.lastIndexOf("#")) + "}" + private fun removeUserWithBrace(input: String): String { + return input.substring(0, input.lastIndexOf("#")) + "}" + } private fun writeToProvider() { val sb = StringBuilder() diff --git a/lawnchair/src/app/lawnchair/util/LawnchairUtils.kt b/lawnchair/src/app/lawnchair/util/LawnchairUtils.kt index f2a159d1ccd..42bf46f69c8 100644 --- a/lawnchair/src/app/lawnchair/util/LawnchairUtils.kt +++ b/lawnchair/src/app/lawnchair/util/LawnchairUtils.kt @@ -53,6 +53,7 @@ import com.android.launcher3.util.Executors.MAIN_EXECUTOR import com.android.launcher3.util.Themes import com.android.systemui.shared.system.QuickStepContract import com.patrykmichalik.opto.core.firstBlocking +import java.io.ByteArrayOutputStream import java.util.concurrent.Callable import java.util.concurrent.ExecutionException import kotlin.math.max @@ -110,10 +111,12 @@ fun killLauncher() { exitProcess(0) } -fun getPrefsIfUnlocked(context: Context): PreferenceManager? = if (UserManagerCompat.isUserUnlocked(context)) { - PreferenceManager.getInstance(context) -} else { - null +fun getPrefsIfUnlocked(context: Context): PreferenceManager? { + return if (UserManagerCompat.isUserUnlocked(context)) { + PreferenceManager.getInstance(context) + } else { + null + } } fun getWindowCornerRadius(context: Context): Float { @@ -252,6 +255,12 @@ fun Size.scaleDownTo(maxSize: Int): Size { } } +fun bitmapToByteArray(bitmap: Bitmap): ByteArray { + val stream = ByteArrayOutputStream() + bitmap.compress(Bitmap.CompressFormat.PNG, 100, stream) + return stream.toByteArray() +} + fun Context.isDefaultLauncher(): Boolean = getDefaultLauncherPackageName() == packageName fun Context.getDefaultLauncherPackageName(): String? = runCatching { getDefaultResolveInfo()?.activityInfo?.packageName }.getOrNull() @@ -289,19 +298,21 @@ fun createRoundedBitmap(color: Int, cornerRadius: Float): Bitmap { return bitmap } -fun getSignatureHash(context: Context, packageName: String): Long? = try { - val packageInfo = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { - context.packageManager.getPackageInfo(packageName, PackageManager.GET_SIGNING_CERTIFICATES) - } else { - context.packageManager.getPackageInfo(packageName, PackageManager.GET_SIGNATURES) - } +fun getSignatureHash(context: Context, packageName: String): Long? { + return try { + val packageInfo = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { + context.packageManager.getPackageInfo(packageName, PackageManager.GET_SIGNING_CERTIFICATES) + } else { + context.packageManager.getPackageInfo(packageName, PackageManager.GET_SIGNATURES) + } - val signatures = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { - packageInfo.signingInfo?.apkContentsSigners - } else { - packageInfo.signatures + val signatures = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { + packageInfo.signingInfo?.apkContentsSigners + } else { + packageInfo.signatures + } + signatures?.firstOrNull()?.hashCode()?.toLong() + } catch (_: PackageManager.NameNotFoundException) { + null } - signatures?.firstOrNull()?.hashCode()?.toLong() -} catch (_: PackageManager.NameNotFoundException) { - null } diff --git a/lawnchair/src/app/lawnchair/util/LawnchairWindowManagerProxy.kt b/lawnchair/src/app/lawnchair/util/LawnchairWindowManagerProxy.kt index d46319a8a96..c63afa9fb64 100644 --- a/lawnchair/src/app/lawnchair/util/LawnchairWindowManagerProxy.kt +++ b/lawnchair/src/app/lawnchair/util/LawnchairWindowManagerProxy.kt @@ -181,18 +181,20 @@ class LawnchairWindowManagerProxy(context: Context) : WindowManagerProxy(Utiliti return 0 } - override fun getDisplay(displayInfoContext: Context): Display? = try { - if (Utilities.ATLEAST_R) { - displayInfoContext.display - } else { + override fun getDisplay(displayInfoContext: Context): Display? { + return try { + if (Utilities.ATLEAST_R) { + displayInfoContext.display + } else { + displayInfoContext.getSystemService(DisplayManager::class.java)?.getDisplay( + DEFAULT_DISPLAY, + ) + } + } catch (e: UnsupportedOperationException) { displayInfoContext.getSystemService(DisplayManager::class.java)?.getDisplay( DEFAULT_DISPLAY, ) } - } catch (e: UnsupportedOperationException) { - displayInfoContext.getSystemService(DisplayManager::class.java)?.getDisplay( - DEFAULT_DISPLAY, - ) } override fun getRotation(context: Context): Int { @@ -200,5 +202,7 @@ class LawnchairWindowManagerProxy(context: Context) : WindowManagerProxy(Utiliti return display?.rotation ?: Surface.ROTATION_0 } - private fun dpToPx(resources: Resources, dp: Int): Int = (dp * resources.displayMetrics.density).toInt() + private fun dpToPx(resources: Resources, dp: Int): Int { + return (dp * resources.displayMetrics.density).toInt() + } } diff --git a/lawnchair/src/app/lawnchair/util/Lifecycle.kt b/lawnchair/src/app/lawnchair/util/Lifecycle.kt index beba77a159d..26892079868 100644 --- a/lawnchair/src/app/lawnchair/util/Lifecycle.kt +++ b/lawnchair/src/app/lawnchair/util/Lifecycle.kt @@ -45,8 +45,10 @@ private fun observeLifecycleState(): Lifecycle.State { return state } -fun Context.lookupLifecycleOwner(): LifecycleOwner? = when (this) { - is LifecycleOwner -> this - is ContextWrapper -> baseContext.lookupLifecycleOwner() - else -> null +fun Context.lookupLifecycleOwner(): LifecycleOwner? { + return when (this) { + is LifecycleOwner -> this + is ContextWrapper -> baseContext.lookupLifecycleOwner() + else -> null + } } diff --git a/lawnchair/src/app/lawnchair/util/PackagePermissionManager.kt b/lawnchair/src/app/lawnchair/util/PackagePermissionManager.kt index 7fc00788333..88b94d3530b 100644 --- a/lawnchair/src/app/lawnchair/util/PackagePermissionManager.kt +++ b/lawnchair/src/app/lawnchair/util/PackagePermissionManager.kt @@ -38,7 +38,9 @@ fun requestContactPermissionGranted(context: Context, prefs: PreferenceManager): return isGranted } -fun contactPermissionGranted(context: Context): Boolean = context.checkSelfPermission(Manifest.permission.READ_CONTACTS) == PackageManager.PERMISSION_GRANTED +fun contactPermissionGranted(context: Context): Boolean { + return context.checkSelfPermission(Manifest.permission.READ_CONTACTS) == PackageManager.PERMISSION_GRANTED +} fun checkAndRequestFilesPermission(context: Context, prefs: PreferenceManager): Boolean { when { @@ -71,11 +73,13 @@ fun checkAndRequestFilesPermission(context: Context, prefs: PreferenceManager): return true } -fun filesAndStorageGranted(context: Context): Boolean = when { - Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU -> - Environment.isExternalStorageManager() && hasReadMediaImagesPermission(context) - Build.VERSION.SDK_INT >= Build.VERSION_CODES.R -> Environment.isExternalStorageManager() - else -> hasReadExternalStoragePermission(context) +fun filesAndStorageGranted(context: Context): Boolean { + return when { + Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU -> + Environment.isExternalStorageManager() && hasReadMediaImagesPermission(context) + Build.VERSION.SDK_INT >= Build.VERSION_CODES.R -> Environment.isExternalStorageManager() + else -> hasReadExternalStoragePermission(context) + } } @RequiresApi(Build.VERSION_CODES.R) @@ -85,10 +89,12 @@ private fun requestManageAllFilesAccessPermission(context: Context) { context.startActivity(intent) } -private fun hasReadExternalStoragePermission(context: Context): Boolean = ContextCompat.checkSelfPermission( - context, - Manifest.permission.READ_EXTERNAL_STORAGE, -) == PackageManager.PERMISSION_GRANTED +private fun hasReadExternalStoragePermission(context: Context): Boolean { + return ContextCompat.checkSelfPermission( + context, + Manifest.permission.READ_EXTERNAL_STORAGE, + ) == PackageManager.PERMISSION_GRANTED +} private fun requestReadExternalStoragePermission(context: Context) { ActivityCompat.requestPermissions( @@ -99,10 +105,12 @@ private fun requestReadExternalStoragePermission(context: Context) { } @RequiresApi(Build.VERSION_CODES.TIRAMISU) -private fun hasReadMediaImagesPermission(context: Context): Boolean = ContextCompat.checkSelfPermission( - context, - Manifest.permission.READ_MEDIA_IMAGES, -) == PackageManager.PERMISSION_GRANTED +private fun hasReadMediaImagesPermission(context: Context): Boolean { + return ContextCompat.checkSelfPermission( + context, + Manifest.permission.READ_MEDIA_IMAGES, + ) == PackageManager.PERMISSION_GRANTED +} @RequiresApi(Build.VERSION_CODES.TIRAMISU) private fun requestReadMediaImagesPermission(context: Context) { diff --git a/lawnchair/src/app/lawnchair/util/Padding.kt b/lawnchair/src/app/lawnchair/util/Padding.kt index f0477bd79a9..a81afd024ca 100644 --- a/lawnchair/src/app/lawnchair/util/Padding.kt +++ b/lawnchair/src/app/lawnchair/util/Padding.kt @@ -29,19 +29,27 @@ fun Modifier.navigationBarsOrDisplayCutoutPadding(): Modifier = composed { @Composable fun max(a: PaddingValues, b: PaddingValues) = remember(a, b) { object : PaddingValues { - override fun calculateLeftPadding(layoutDirection: LayoutDirection): Dp = max( - a.calculateLeftPadding(layoutDirection), - b.calculateLeftPadding(layoutDirection), - ) + override fun calculateLeftPadding(layoutDirection: LayoutDirection): Dp { + return max( + a.calculateLeftPadding(layoutDirection), + b.calculateLeftPadding(layoutDirection), + ) + } - override fun calculateTopPadding(): Dp = max(a.calculateTopPadding(), b.calculateTopPadding()) + override fun calculateTopPadding(): Dp { + return max(a.calculateTopPadding(), b.calculateTopPadding()) + } - override fun calculateRightPadding(layoutDirection: LayoutDirection): Dp = max( - a.calculateRightPadding(layoutDirection), - b.calculateRightPadding(layoutDirection), - ) + override fun calculateRightPadding(layoutDirection: LayoutDirection): Dp { + return max( + a.calculateRightPadding(layoutDirection), + b.calculateRightPadding(layoutDirection), + ) + } - override fun calculateBottomPadding(): Dp = max(a.calculateBottomPadding(), b.calculateBottomPadding()) + override fun calculateBottomPadding(): Dp { + return max(a.calculateBottomPadding(), b.calculateBottomPadding()) + } } } diff --git a/lawnchair/src/app/lawnchair/util/Serializers.kt b/lawnchair/src/app/lawnchair/util/Serializers.kt index 26a87de6b2f..1113fa10664 100644 --- a/lawnchair/src/app/lawnchair/util/Serializers.kt +++ b/lawnchair/src/app/lawnchair/util/Serializers.kt @@ -18,7 +18,9 @@ import kotlinx.serialization.encoding.Encoder object ComponentKeySerializer : KSerializer { override val descriptor = PrimitiveSerialDescriptor("ComponentKey", PrimitiveKind.STRING) - override fun deserialize(decoder: Decoder): ComponentKey = ComponentKey.fromString(decoder.decodeString())!! + override fun deserialize(decoder: Decoder): ComponentKey { + return ComponentKey.fromString(decoder.decodeString())!! + } override fun serialize(encoder: Encoder, value: ComponentKey) { encoder.encodeString(value.toString()) @@ -29,16 +31,24 @@ object ComponentKeySerializer : KSerializer { object IntentSerializer : KSerializer { override val descriptor = PrimitiveSerialDescriptor("Intent", PrimitiveKind.STRING) - override fun deserialize(decoder: Decoder): Intent = Intent.parseUri(decoder.decodeString(), 0) + override fun deserialize(decoder: Decoder): Intent { + return Intent.parseUri(decoder.decodeString(), 0) + } - override fun serialize(encoder: Encoder, value: Intent) = encoder.encodeString(value.toUri(0)) + override fun serialize(encoder: Encoder, value: Intent) { + return encoder.encodeString(value.toUri(0)) + } } @Serializer(forClass = UserHandle::class) object UserHandlerSerializer : KSerializer { override val descriptor = PrimitiveSerialDescriptor("UserHandle", PrimitiveKind.INT) - override fun deserialize(decoder: Decoder): UserHandle = UserHandleCompat.getUserHandleForUid(decoder.decodeInt()) + override fun deserialize(decoder: Decoder): UserHandle { + return UserHandleCompat.getUserHandleForUid(decoder.decodeInt()) + } - override fun serialize(encoder: Encoder, value: UserHandle) = encoder.encodeInt(value.hashCode()) + override fun serialize(encoder: Encoder, value: UserHandle) { + return encoder.encodeInt(value.hashCode()) + } } diff --git a/lawnchair/src/app/lawnchair/util/TaskUtilLockState.kt b/lawnchair/src/app/lawnchair/util/TaskUtilLockState.kt index 25ee633b558..0e82aaa7944 100644 --- a/lawnchair/src/app/lawnchair/util/TaskUtilLockState.kt +++ b/lawnchair/src/app/lawnchair/util/TaskUtilLockState.kt @@ -27,7 +27,9 @@ object TaskUtilLockState { } } - private fun toFormatLockedAppStr(packageName: String, userId: Int): String = "$packageName$SEPARATOR$userId" + private fun toFormatLockedAppStr(packageName: String, userId: Int): String { + return "$packageName$SEPARATOR$userId" + } private fun saveLockedApps(lockedApps: List?) { lockedApps?.let { @@ -56,7 +58,9 @@ object TaskUtilLockState { } } - fun getTaskLockState(context: Context, componentName: ComponentName, taskKey: Task.TaskKey): Boolean = updateSpecifiedTaskLockState(context, componentName, taskKey) + fun getTaskLockState(context: Context, componentName: ComponentName, taskKey: Task.TaskKey): Boolean { + return updateSpecifiedTaskLockState(context, componentName, taskKey) + } private fun updateSpecifiedTaskLockState(context: Context, componentName: ComponentName, taskKey: Task.TaskKey): Boolean { val taskLockState = LawnchairLockedStateController.initialize(context) diff --git a/lawnchair/src/app/lawnchair/util/Temperature.kt b/lawnchair/src/app/lawnchair/util/Temperature.kt index 48b4b0d0917..7c3609bce07 100644 --- a/lawnchair/src/app/lawnchair/util/Temperature.kt +++ b/lawnchair/src/app/lawnchair/util/Temperature.kt @@ -28,27 +28,31 @@ class Temperature(val value: Int, val unit: Unit) { // TODO: Use Unit directly after https://github.com/pinterest/ktlint/issues/2353 is fixed. @Suppress("RemoveRedundantQualifierName") - fun unitFromString(unit: String): Temperature.Unit = when (unit) { - "metric" -> Unit.Celsius - "imperial" -> Unit.Fahrenheit - "kelvin" -> Unit.Kelvin - "rakine" -> Unit.Rakine - "delisle" -> Unit.Delisle - "newton" -> Unit.Newton - "reaumur" -> Unit.Reaumur - "romer" -> Unit.Romer - else -> throw IllegalArgumentException("unknown unit $unit") + fun unitFromString(unit: String): Temperature.Unit { + return when (unit) { + "metric" -> Unit.Celsius + "imperial" -> Unit.Fahrenheit + "kelvin" -> Unit.Kelvin + "rakine" -> Unit.Rakine + "delisle" -> Unit.Delisle + "newton" -> Unit.Newton + "reaumur" -> Unit.Reaumur + "romer" -> Unit.Romer + else -> throw IllegalArgumentException("unknown unit $unit") + } } - fun unitToString(unit: Unit): String = when (unit) { - Unit.Celsius -> "metric" - Unit.Fahrenheit -> "imperial" - Unit.Kelvin -> "kelvin" - Unit.Rakine -> "rakine" - Unit.Delisle -> "delisle" - Unit.Newton -> "newton" - Unit.Reaumur -> "reaumur" - Unit.Romer -> "romer" + fun unitToString(unit: Unit): String { + return when (unit) { + Unit.Celsius -> "metric" + Unit.Fahrenheit -> "imperial" + Unit.Kelvin -> "kelvin" + Unit.Rakine -> "rakine" + Unit.Delisle -> "delisle" + Unit.Newton -> "newton" + Unit.Reaumur -> "reaumur" + Unit.Romer -> "romer" + } } } } diff --git a/lawnchair/src/app/lawnchair/views/ComposeBottomSheet.kt b/lawnchair/src/app/lawnchair/views/ComposeBottomSheet.kt index 51b8e2bd395..d12ba71f47d 100644 --- a/lawnchair/src/app/lawnchair/views/ComposeBottomSheet.kt +++ b/lawnchair/src/app/lawnchair/views/ComposeBottomSheet.kt @@ -109,9 +109,13 @@ class ComposeBottomSheet(context: Context) : AbstractSlideInView(context, setSystemUiFlags(0) } - override fun isOfType(type: Int): Boolean = type and TYPE_COMPOSE_VIEW != 0 + override fun isOfType(type: Int): Boolean { + return type and TYPE_COMPOSE_VIEW != 0 + } - override fun getScrimColor(context: Context): Int = ColorTokens.WidgetsPickerScrim.resolveColor(context) + override fun getScrimColor(context: Context): Int { + return ColorTokens.WidgetsPickerScrim.resolveColor(context) + } override fun setTranslationShift(translationShift: Float) { mTranslationShift = translationShift diff --git a/lawnchair/src/app/lawnchair/views/component/IconFrame.kt b/lawnchair/src/app/lawnchair/views/component/IconFrame.kt new file mode 100644 index 00000000000..e95ffc2a570 --- /dev/null +++ b/lawnchair/src/app/lawnchair/views/component/IconFrame.kt @@ -0,0 +1,73 @@ +package app.lawnchair.views.component + +import android.content.Context +import android.graphics.drawable.GradientDrawable +import android.util.AttributeSet +import android.widget.FrameLayout +import android.widget.ImageView +import androidx.annotation.DrawableRes +import androidx.core.content.ContextCompat +import com.android.launcher3.R +import com.android.launcher3.util.Themes + +class IconFrame @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0, +) : FrameLayout(context, attrs, defStyleAttr) { + + private val imageView: ImageView + + init { + layoutParams = LayoutParams( + LayoutParams.WRAP_CONTENT, + LayoutParams.WRAP_CONTENT, + ) + + imageView = ImageView(context).apply { + layoutParams = LayoutParams( + LayoutParams.WRAP_CONTENT, + LayoutParams.WRAP_CONTENT, + ) + setPadding(12.dpToPx(context), 12.dpToPx(context), 12.dpToPx(context), 12.dpToPx(context)) + } + addView(imageView) + + setBackgroundWithRadius( + bgColor = ContextCompat.getColor(context, R.color.accent_primary_device_default), + cornerRadius = Themes.getDialogCornerRadius(context), + ) + } + + /** + * Convert dp to pixels for consistent padding across devices. + */ + private fun Int.dpToPx(context: Context): Int { + val density = context.resources.displayMetrics.density + return (this * density).toInt() + } + + /** + * Set the vector drawable for the ImageView. + * + * @param drawableRes The resource ID of the vector drawable. + */ + fun setIcon(@DrawableRes drawableRes: Int) { + imageView.setImageResource(drawableRes) + } + + /** + * Set the background color and corner radius of the FrameLayout. + * + * @param bgColor The background color. + * @param cornerRadius The corner radius in pixels. + */ + fun setBackgroundWithRadius(bgColor: Int, cornerRadius: Float) { + val backgroundDrawable = GradientDrawable().apply { + shape = GradientDrawable.RECTANGLE + setColor(bgColor) + this.cornerRadius = cornerRadius + } + background = backgroundDrawable + } +} diff --git a/lawnchair/src/app/lawnchair/wallpaper/WallpaperManagerCompat.kt b/lawnchair/src/app/lawnchair/wallpaper/WallpaperManagerCompat.kt index 2aa6ac266ef..79a84cfaccb 100644 --- a/lawnchair/src/app/lawnchair/wallpaper/WallpaperManagerCompat.kt +++ b/lawnchair/src/app/lawnchair/wallpaper/WallpaperManagerCompat.kt @@ -5,13 +5,18 @@ import android.content.Context import app.lawnchair.util.MainThreadInitializedObject import app.lawnchair.util.requireSystemService import app.lawnchair.wallpaper.WallpaperColorsCompat.Companion.HINT_SUPPORTS_DARK_THEME +import app.lawnchair.wallpaper.service.WallpaperService import com.android.launcher3.Utilities +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch sealed class WallpaperManagerCompat(val context: Context) { private val listeners = mutableListOf() private val colorHints: Int get() = wallpaperColors?.colorHints ?: 0 - protected val wallpaperManager: WallpaperManager = context.requireSystemService() + val wallpaperManager: WallpaperManager = context.requireSystemService() + val service = WallpaperService(context) abstract val wallpaperColors: WallpaperColorsCompat? @@ -26,6 +31,12 @@ sealed class WallpaperManagerCompat(val context: Context) { } protected fun notifyChange() { + if (service.getTopWallpapers().isEmpty()) { + CoroutineScope(Dispatchers.IO).launch { + service.saveWallpaper(wallpaperManager) + } + } + listeners.toTypedArray().forEach { it.onColorsChanged() } diff --git a/lawnchair/src/app/lawnchair/wallpaper/model/WallpaperViewModel.kt b/lawnchair/src/app/lawnchair/wallpaper/model/WallpaperViewModel.kt new file mode 100644 index 00000000000..cc0b1053a33 --- /dev/null +++ b/lawnchair/src/app/lawnchair/wallpaper/model/WallpaperViewModel.kt @@ -0,0 +1,60 @@ +package app.lawnchair.wallpaper.model + +import android.app.WallpaperManager +import android.content.Context +import androidx.lifecycle.LiveData +import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import app.lawnchair.wallpaper.WallpaperManagerCompat +import app.lawnchair.wallpaper.service.Wallpaper +import kotlinx.coroutines.launch +import kotlinx.coroutines.sync.Mutex +import kotlinx.coroutines.sync.withLock + +class WallpaperViewModel(context: Context) : ViewModel() { + private val wallpaperManagerCompat = WallpaperManagerCompat.INSTANCE.get(context) + + private val _wallpapers = MutableLiveData>() + val wallpapers: LiveData> = _wallpapers + + private val mutex = Mutex() + + private val listener = object : WallpaperManagerCompat.OnColorsChangedListener { + override fun onColorsChanged() { + viewModelScope.launch { + mutex.withLock { + saveWallpaper(wallpaperManagerCompat.wallpaperManager) + } + } + } + } + + init { + loadTopWallpapers() + wallpaperManagerCompat.addOnChangeListener(listener) + } + + private suspend fun saveWallpaper(wallpaperManager: WallpaperManager) { + wallpaperManagerCompat.service.saveWallpaper(wallpaperManager) + refreshWallpapers() + } + + private suspend fun refreshWallpapers() { + val topWallpapers = wallpaperManagerCompat.service.dao.getTopWallpapers() + _wallpapers.postValue(topWallpapers) + } + + private fun loadTopWallpapers() { + viewModelScope.launch { + mutex.withLock { + refreshWallpapers() + } + } + } + + suspend fun updateWallpaperRank(wallpaper: Wallpaper) { + wallpaperManagerCompat.service.updateWallpaperRank(wallpaper) + loadTopWallpapers() + } +} diff --git a/lawnchair/src/app/lawnchair/wallpaper/model/WallpaperViewModelFactory.kt b/lawnchair/src/app/lawnchair/wallpaper/model/WallpaperViewModelFactory.kt new file mode 100644 index 00000000000..805eae11189 --- /dev/null +++ b/lawnchair/src/app/lawnchair/wallpaper/model/WallpaperViewModelFactory.kt @@ -0,0 +1,15 @@ +package app.lawnchair.wallpaper.model + +import android.content.Context +import androidx.lifecycle.ViewModel +import androidx.lifecycle.ViewModelProvider + +class WallpaperViewModelFactory(private val context: Context) : ViewModelProvider.Factory { + override fun create(modelClass: Class): T { + if (modelClass.isAssignableFrom(WallpaperViewModel::class.java)) { + @Suppress("UNCHECKED_CAST") + return WallpaperViewModel(context) as T + } + throw IllegalArgumentException("Unknown ViewModel class") + } +} diff --git a/lawnchair/src/app/lawnchair/wallpaper/service/Wallpaper.kt b/lawnchair/src/app/lawnchair/wallpaper/service/Wallpaper.kt new file mode 100644 index 00000000000..df8aa46b2b9 --- /dev/null +++ b/lawnchair/src/app/lawnchair/wallpaper/service/Wallpaper.kt @@ -0,0 +1,13 @@ +package app.lawnchair.wallpaper.service + +import androidx.room.Entity +import androidx.room.PrimaryKey + +@Entity(tableName = "wallpapers") +data class Wallpaper( + @PrimaryKey(autoGenerate = true) val id: Long = 0, + val imagePath: String, + val rank: Int, + val timestamp: Long, + val checksum: String? = null, +) diff --git a/lawnchair/src/app/lawnchair/wallpaper/service/WallpaperDao.kt b/lawnchair/src/app/lawnchair/wallpaper/service/WallpaperDao.kt new file mode 100644 index 00000000000..56c3a66df1c --- /dev/null +++ b/lawnchair/src/app/lawnchair/wallpaper/service/WallpaperDao.kt @@ -0,0 +1,28 @@ +package app.lawnchair.wallpaper.service + +import androidx.room.Dao +import androidx.room.Insert +import androidx.room.Query +import androidx.room.RawQuery +import androidx.sqlite.db.SupportSQLiteQuery + +@Dao +interface WallpaperDao { + @Insert + suspend fun insert(wallpaper: Wallpaper) + + @Query("SELECT * FROM wallpapers ORDER BY timestamp DESC LIMIT 4") + suspend fun getTopWallpapers(): List + + @Query("UPDATE wallpapers SET rank = rank + 1 WHERE rank >= :rank") + suspend fun updateRank(rank: Int) + + @Query("UPDATE wallpapers SET rank = :rank, timestamp = :timestamp WHERE id = :id") + suspend fun updateWallpaper(id: Long, rank: Int, timestamp: Long) + + @Query("DELETE FROM wallpapers WHERE id = :id") + suspend fun deleteWallpaper(id: Long) + + @RawQuery + suspend fun checkpoint(supportSQLiteQuery: SupportSQLiteQuery): Int +} diff --git a/lawnchair/src/app/lawnchair/wallpaper/service/WallpaperDatabase.kt b/lawnchair/src/app/lawnchair/wallpaper/service/WallpaperDatabase.kt new file mode 100644 index 00000000000..af7bf1cb8bf --- /dev/null +++ b/lawnchair/src/app/lawnchair/wallpaper/service/WallpaperDatabase.kt @@ -0,0 +1,41 @@ +package app.lawnchair.wallpaper.service + +import androidx.room.Database +import androidx.room.Room +import androidx.room.RoomDatabase +import androidx.room.migration.Migration +import androidx.sqlite.db.SimpleSQLiteQuery +import androidx.sqlite.db.SupportSQLiteDatabase +import app.lawnchair.util.MainThreadInitializedObject +import kotlinx.coroutines.runBlocking + +@Database(entities = [Wallpaper::class], version = 2, exportSchema = false) +abstract class WallpaperDatabase : RoomDatabase() { + + abstract fun wallpaperDao(): WallpaperDao + + private suspend fun checkpoint() { + wallpaperDao().checkpoint(SimpleSQLiteQuery("pragma wal_checkpoint(full)")) + } + + fun checkpointSync() { + runBlocking { + checkpoint() + } + } + + companion object { + private val MIGRATION_1_2 = object : Migration(1, 2) { + override fun migrate(db: SupportSQLiteDatabase) { + db.execSQL("ALTER TABLE wallpapers ADD COLUMN checksum TEXT DEFAULT 'undefined'") + } + } + val INSTANCE = MainThreadInitializedObject { context -> + Room.databaseBuilder( + context, + WallpaperDatabase::class.java, + "wallpaper_database", + ).addMigrations(MIGRATION_1_2).build() + } + } +} diff --git a/lawnchair/src/app/lawnchair/wallpaper/service/WallpaperService.kt b/lawnchair/src/app/lawnchair/wallpaper/service/WallpaperService.kt new file mode 100644 index 00000000000..5b0fb77c11c --- /dev/null +++ b/lawnchair/src/app/lawnchair/wallpaper/service/WallpaperService.kt @@ -0,0 +1,123 @@ +package app.lawnchair.wallpaper.service + +import android.app.WallpaperManager +import android.content.Context +import android.graphics.drawable.BitmapDrawable +import android.util.Log +import androidx.core.graphics.drawable.toBitmap +import app.lawnchair.util.bitmapToByteArray +import com.android.launcher3.util.MainThreadInitializedObject +import com.android.launcher3.util.SafeCloseable +import java.io.File +import java.io.FileOutputStream +import java.security.MessageDigest +import kotlinx.coroutines.runBlocking + +class WallpaperService(val context: Context) : SafeCloseable { + + val dao = WallpaperDatabase.INSTANCE.get(context).wallpaperDao() + + suspend fun saveWallpaper(wallpaperManager: WallpaperManager) { + try { + val wallpaperDrawable = wallpaperManager.drawable + val currentBitmap = (wallpaperDrawable as BitmapDrawable).toBitmap() + + val byteArray = bitmapToByteArray(currentBitmap) + + saveWallpaper(byteArray) + } catch (e: Exception) { + Log.e("WallpaperChange", "Error detecting wallpaper change: ${e.message}") + } + } + + private fun calculateChecksum(imageData: ByteArray): String { + return MessageDigest.getInstance("MD5") + .digest(imageData) + .joinToString("") { "%02x".format(it) } + } + + private suspend fun saveWallpaper(imageData: ByteArray) { + val timestamp = System.currentTimeMillis() + + val checksum = calculateChecksum(imageData) + + val existingWallpapers = dao.getTopWallpapers() + + if (existingWallpapers.any { it.checksum == checksum }) { + Log.d("WallpaperService", "Wallpaper already exists with checksum: $checksum") + return + } + val imagePath = saveImageToAppStorage(imageData) + if (existingWallpapers.size < 4) { + val wallpaper = Wallpaper(imagePath = imagePath, rank = existingWallpapers.size, timestamp = timestamp, checksum = checksum) + dao.insert(wallpaper) + } else { + val lowestRankedWallpaper = existingWallpapers.minByOrNull { it.timestamp } + + if (lowestRankedWallpaper != null) { + dao.deleteWallpaper(lowestRankedWallpaper.id) + deleteWallpaperFile(lowestRankedWallpaper.imagePath) + } + + for (wallpaper in existingWallpapers) { + if (wallpaper.rank >= (lowestRankedWallpaper?.rank ?: 0)) { + dao.updateRank(wallpaper.rank) + } + } + + val wallpaper = Wallpaper(imagePath = imagePath, rank = 0, timestamp = timestamp, checksum = checksum) + dao.insert(wallpaper) + } + } + + suspend fun updateWallpaperRank(selectedWallpaper: Wallpaper) { + val topWallpapers = dao.getTopWallpapers() + val currentTime = System.currentTimeMillis() + + dao.updateWallpaper(selectedWallpaper.id, rank = 0, timestamp = currentTime) + + for (wallpaper in topWallpapers) { + if (wallpaper.id != selectedWallpaper.id) { + dao.updateRank(wallpaper.rank) + } + } + } + + fun getTopWallpapers(): List = runBlocking { + val wallpapers = dao.getTopWallpapers() + wallpapers.ifEmpty { emptyList() } + } + + private fun deleteWallpaperFile(imagePath: String) { + val file = File(imagePath) + if (file.exists()) { + file.delete() + } + } + + private fun saveImageToAppStorage(imageData: ByteArray): String { + val storageDir = File(context.filesDir, "wallpapers") + if (!storageDir.exists()) { + storageDir.mkdirs() + } + + val imageHash = imageData.hashCode().toString() + val imageFile = File(storageDir, "wallpaper_$imageHash.jpg") + + if (!imageFile.exists()) { + FileOutputStream(imageFile).use { fos -> + fos.write(imageData) + } + } + + return imageFile.absolutePath + } + + override fun close() { + TODO("Not yet implemented") + } + companion object { + @JvmField + val INSTANCE = MainThreadInitializedObject(::WallpaperService) + } +} diff --git a/lawnchair/src/com/android/systemui/monet/ColorScheme.kt b/lawnchair/src/com/android/systemui/monet/ColorScheme.kt index 72f8eab2056..14847295064 100644 --- a/lawnchair/src/com/android/systemui/monet/ColorScheme.kt +++ b/lawnchair/src/com/android/systemui/monet/ColorScheme.kt @@ -60,15 +60,21 @@ internal interface Hue { } internal class HueSource : Hue { - override fun get(sourceColor: Cam): Double = sourceColor.hue.toDouble() + override fun get(sourceColor: Cam): Double { + return sourceColor.hue.toDouble() + } } internal class HueAdd(val amountDegrees: Double) : Hue { - override fun get(sourceColor: Cam): Double = ColorScheme.wrapDegreesDouble(sourceColor.hue.toDouble() + amountDegrees) + override fun get(sourceColor: Cam): Double { + return ColorScheme.wrapDegreesDouble(sourceColor.hue.toDouble() + amountDegrees) + } } internal class HueSubtract(val amountDegrees: Double) : Hue { - override fun get(sourceColor: Cam): Double = ColorScheme.wrapDegreesDouble(sourceColor.hue.toDouble() - amountDegrees) + override fun get(sourceColor: Cam): Double { + return ColorScheme.wrapDegreesDouble(sourceColor.hue.toDouble() - amountDegrees) + } } internal class HueVibrantSecondary : Hue { @@ -85,7 +91,9 @@ internal class HueVibrantSecondary : Hue { Pair(360, 12), ) - override fun get(sourceColor: Cam): Double = getHueRotation(sourceColor.hue, hueToRotations) + override fun get(sourceColor: Cam): Double { + return getHueRotation(sourceColor.hue, hueToRotations) + } } internal class HueVibrantTertiary : Hue { @@ -102,7 +110,9 @@ internal class HueVibrantTertiary : Hue { Pair(360, 25), ) - override fun get(sourceColor: Cam): Double = getHueRotation(sourceColor.hue, hueToRotations) + override fun get(sourceColor: Cam): Double { + return getHueRotation(sourceColor.hue, hueToRotations) + } } internal class HueExpressiveSecondary : Hue { @@ -119,7 +129,9 @@ internal class HueExpressiveSecondary : Hue { Pair(360, 45), ) - override fun get(sourceColor: Cam): Double = getHueRotation(sourceColor.hue, hueToRotations) + override fun get(sourceColor: Cam): Double { + return getHueRotation(sourceColor.hue, hueToRotations) + } } internal class HueExpressiveTertiary : Hue { @@ -136,7 +148,9 @@ internal class HueExpressiveTertiary : Hue { Pair(360, 120), ) - override fun get(sourceColor: Cam): Double = getHueRotation(sourceColor.hue, hueToRotations) + override fun get(sourceColor: Cam): Double { + return getHueRotation(sourceColor.hue, hueToRotations) + } } internal interface Chroma { @@ -157,11 +171,15 @@ internal class ChromaMaxOut : Chroma { } internal class ChromaMultiple(val multiple: Double) : Chroma { - override fun get(sourceColor: Cam): Double = sourceColor.chroma * multiple + override fun get(sourceColor: Cam): Double { + return sourceColor.chroma * multiple + } } internal class ChromaAdd(val amount: Double) : Chroma { - override fun get(sourceColor: Cam): Double = sourceColor.chroma + amount + override fun get(sourceColor: Cam): Double { + return sourceColor.chroma + amount + } } internal class ChromaBound( @@ -176,11 +194,15 @@ internal class ChromaBound( } internal class ChromaConstant(val chroma: Double) : Chroma { - override fun get(sourceColor: Cam): Double = chroma + override fun get(sourceColor: Cam): Double { + return chroma + } } internal class ChromaSource : Chroma { - override fun get(sourceColor: Cam): Double = sourceColor.chroma.toDouble() + override fun get(sourceColor: Cam): Double { + return sourceColor.chroma.toDouble() + } } internal class TonalSpec(val hue: Hue = HueSource(), val chroma: Chroma) { @@ -404,45 +426,53 @@ class ColorScheme( val seedTone: Float get() = 1000f - CamUtils.lstarFromInt(seed) * 10f - override fun toString(): String = "ColorScheme {\n" + - " seed color: ${stringForColor(seed)}\n" + - " style: $style\n" + - " palettes: \n" + - " ${humanReadable("PRIMARY", accent1.allShades)}\n" + - " ${humanReadable("SECONDARY", accent2.allShades)}\n" + - " ${humanReadable("TERTIARY", accent3.allShades)}\n" + - " ${humanReadable("NEUTRAL", neutral1.allShades)}\n" + - " ${humanReadable("NEUTRAL VARIANT", neutral2.allShades)}\n" + - "}" + override fun toString(): String { + return "ColorScheme {\n" + + " seed color: ${stringForColor(seed)}\n" + + " style: $style\n" + + " palettes: \n" + + " ${humanReadable("PRIMARY", accent1.allShades)}\n" + + " ${humanReadable("SECONDARY", accent2.allShades)}\n" + + " ${humanReadable("TERTIARY", accent3.allShades)}\n" + + " ${humanReadable("NEUTRAL", neutral1.allShades)}\n" + + " ${humanReadable("NEUTRAL VARIANT", neutral2.allShades)}\n" + + "}" + } companion object { - private fun wrapDegrees(degrees: Int): Int = when { - degrees < 0 -> { - (degrees % 360) + 360 - } - degrees >= 360 -> { - degrees % 360 - } - else -> { - degrees + private fun wrapDegrees(degrees: Int): Int { + return when { + degrees < 0 -> { + (degrees % 360) + 360 + } + degrees >= 360 -> { + degrees % 360 + } + else -> { + degrees + } } } - public fun wrapDegreesDouble(degrees: Double): Double = when { - degrees < 0 -> { - (degrees % 360) + 360 - } + public fun wrapDegreesDouble(degrees: Double): Double { + return when { + degrees < 0 -> { + (degrees % 360) + 360 + } - degrees >= 360 -> { - degrees % 360 - } + degrees >= 360 -> { + degrees % 360 + } - else -> { - degrees + else -> { + degrees + } } } - private fun hueDiff(a: Float, b: Float): Float = 180f - ((a - b).absoluteValue - 180f).absoluteValue + private fun hueDiff(a: Float, b: Float): Float { + return 180f - ((a - b).absoluteValue - 180f).absoluteValue + } private fun stringForColor(color: Int): String { val width = 4 @@ -454,8 +484,10 @@ class ColorScheme( return "$h$c$t = #$hex" } - private fun humanReadable(paletteName: String, colors: List): String = "$paletteName\n" + - colors.map { stringForColor(it) }.joinToString(separator = "\n") { it } + private fun humanReadable(paletteName: String, colors: List): String { + return "$paletteName\n" + + colors.map { stringForColor(it) }.joinToString(separator = "\n") { it } + } private fun score(cam: Cam, proportion: Double): Double { val proportionScore = 0.7 * 100.0 * proportion diff --git a/lawnchair/src/dev/kdrag0n/monet/theme/DynamicColorScheme.kt b/lawnchair/src/dev/kdrag0n/monet/theme/DynamicColorScheme.kt index 69fe602de01..4f73c299461 100644 --- a/lawnchair/src/dev/kdrag0n/monet/theme/DynamicColorScheme.kt +++ b/lawnchair/src/dev/kdrag0n/monet/theme/DynamicColorScheme.kt @@ -51,17 +51,19 @@ class DynamicColorScheme( swatch: ColorSwatch, seed: Zcam, referenceSwatch: ColorSwatch, - ): ColorSwatch = swatch.map { (shade, color) -> - val target = color as? Zcam - ?: color.convert().toAbs(cond.referenceWhite.y).toZcam(cond, include2D = false) - val reference = referenceSwatch[shade]!! as? Zcam - ?: color.convert().toAbs(cond.referenceWhite.y).toZcam(cond, include2D = false) - val newLch = transformColor(target, seed, reference) - val newSrgb = newLch.convert() - - Log.d(TAG, "Transform: [$shade] $target => $newLch => ${newSrgb.toHex()}") - shade to newSrgb - }.toMap() + ): ColorSwatch { + return swatch.map { (shade, color) -> + val target = color as? Zcam + ?: color.convert().toAbs(cond.referenceWhite.y).toZcam(cond, include2D = false) + val reference = referenceSwatch[shade]!! as? Zcam + ?: color.convert().toAbs(cond.referenceWhite.y).toZcam(cond, include2D = false) + val newLch = transformColor(target, seed, reference) + val newSrgb = newLch.convert() + + Log.d(TAG, "Transform: [$shade] $target => $newLch => ${newSrgb.toHex()}") + shade to newSrgb + }.toMap() + } private fun transformColor(target: Zcam, seed: Zcam, reference: Zcam): Color { // Keep target lightness. @@ -92,11 +94,13 @@ class DynamicColorScheme( } } - override fun equals(other: Any?): Boolean = other is DynamicColorScheme && - other.seedColor == seedColor && - other.chromaFactor == chromaFactor && - other.cond == cond && - other.accurateShades == accurateShades + override fun equals(other: Any?): Boolean { + return other is DynamicColorScheme && + other.seedColor == seedColor && + other.chromaFactor == chromaFactor && + other.cond == cond && + other.accurateShades == accurateShades + } override fun hashCode() = Objects.hash(seedColor, chromaFactor, cond, accurateShades) diff --git a/src/com/android/launcher3/config/FeatureFlags.java b/src/com/android/launcher3/config/FeatureFlags.java index 191b662946b..e2cf536ad68 100644 --- a/src/com/android/launcher3/config/FeatureFlags.java +++ b/src/com/android/launcher3/config/FeatureFlags.java @@ -347,7 +347,7 @@ public static boolean enableHomeTransitionListener() { // TODO(Block 26): Clean up flags public static final BooleanFlag ENABLE_WIDGET_HOST_IN_BACKGROUND = getDebugFlag(270394384, - "ENABLE_WIDGET_HOST_IN_BACKGROUND", DISABLED, + "ENABLE_WIDGET_HOST_IN_BACKGROUND", ENABLED, "Enable background widget updates listening for widget holder"); // TODO(Block 27): Clean up flags diff --git a/src/com/android/launcher3/popup/ArrowPopup.java b/src/com/android/launcher3/popup/ArrowPopup.java index b1b05127081..51caf99ffb1 100644 --- a/src/com/android/launcher3/popup/ArrowPopup.java +++ b/src/com/android/launcher3/popup/ArrowPopup.java @@ -150,8 +150,6 @@ public ArrowPopup(Context context, AttributeSet attrs, int defStyleAttr) { // Initialize arrow view final Resources resources = getResources(); - mArrowColor = getColorStateList(getContext(), R.color.popup_color_background) - .getDefaultColor(); mChildContainerMargin = resources.getDimensionPixelSize(R.dimen.popup_margin); mArrowWidth = resources.getDimensionPixelSize(R.dimen.popup_arrow_width); mArrowHeight = resources.getDimensionPixelSize(R.dimen.popup_arrow_height); diff --git a/src/com/android/launcher3/views/OptionsPopupView.java b/src/com/android/launcher3/views/OptionsPopupView.java index e577b332c7d..4f3ec7d8c88 100644 --- a/src/com/android/launcher3/views/OptionsPopupView.java +++ b/src/com/android/launcher3/views/OptionsPopupView.java @@ -56,6 +56,7 @@ import app.lawnchair.preferences2.PreferenceManager2; import app.lawnchair.ui.popup.LauncherOptionsPopup; +import app.lawnchair.wallpaper.service.WallpaperService; /** * Popup shown on long pressing an empty space in launcher @@ -71,7 +72,7 @@ public class OptionsPopupView extends Arrow // An intent extra to indicate the launch source by launcher. private static final String EXTRA_WALLPAPER_LAUNCH_SOURCE = "com.android.wallpaper.LAUNCH_SOURCE"; - private final ArrayMap mItemMap = new ArrayMap<>(); + public final ArrayMap mItemMap = new ArrayMap<>(); private RectF mTargetRect; private boolean mShouldAddArrow; @@ -171,6 +172,7 @@ private static OptionsPopupView show( if (activityContext == null) { return null; } + OptionsPopupView popup = (OptionsPopupView) activityContext.getLayoutInflater() .inflate(R.layout.longpress_options_menu, activityContext.getDragLayer(), false); popup.mTargetRect = targetRect;