From 045b964281e10d6c6bac3bc16a12db3bbc65944a Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 28 Mar 2024 15:20:30 +0800 Subject: [PATCH 1/7] Update protocVersion to v4.26.1 (#4155) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index bfee0845a2e..7c7a21411ab 100644 --- a/build.gradle +++ b/build.gradle @@ -41,7 +41,7 @@ allprojects { } plugins.withId('com.google.protobuf') { - def protocVersion = '4.26.0' + def protocVersion = '4.26.1' protobuf { // Configure the protoc executable protoc { From 8d0c4f244e05589fa40f6f6cbc6009bd4e15e3d2 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 29 Mar 2024 09:15:53 +0800 Subject: [PATCH 2/7] Update retrofitVersion to v2.11.0 (#4160) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 7c7a21411ab..daec1a28171 100644 --- a/build.gradle +++ b/build.gradle @@ -388,7 +388,7 @@ dependencies { implementation "com.patrykmichalik.opto:core:$optoVersion" implementation "com.patrykmichalik.opto:compose:$optoVersion" implementation "androidx.datastore:datastore-preferences:1.0.0" - def retrofitVersion = "2.10.0" + def retrofitVersion = "2.11.0" implementation "com.squareup.retrofit2:retrofit:$retrofitVersion" implementation "com.squareup.retrofit2:converter-kotlinx-serialization:$retrofitVersion" From 28a9e9e00c678bd1081bb1ce84093eb2e472a4d4 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 29 Mar 2024 09:16:02 +0800 Subject: [PATCH 3/7] Update plugin app.cash.licensee to v1.10.0 (#4159) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index daec1a28171..6635d6c8fd8 100644 --- a/build.gradle +++ b/build.gradle @@ -12,7 +12,7 @@ plugins { id 'org.jetbrains.kotlin.plugin.serialization' version "1.9.23" id "com.google.devtools.ksp" version "1.9.23-1.0.19" id 'com.google.protobuf' version "0.9.4" - id 'app.cash.licensee' version "1.9.1" + id 'app.cash.licensee' version "1.10.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 '6.25.0' From ef119b317b2f9e722e47e48b8e107caaf7b7343e Mon Sep 17 00:00:00 2001 From: SuperDragonXD <70206496+SuperDragonXD@users.noreply.github.com> Date: Fri, 29 Mar 2024 18:51:33 +0800 Subject: [PATCH 4/7] Refresh and improve Compose UI (#4082) This PR mainly does the following: * Removes the deprecated `accompanist-insets` UI * Migrates all components to use Material 3 * Adds basic support for expanded window classes * Updates copy to reflect Material design guidelines There are also minor changes in this PR: * Move font preferences to General settings * Update styling of `PreferenceCategory` * Add previews and documentation for some components * Fix paddings/layout consistency of certain UI elements Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Goooler --- build.gradle | 8 +- lawnchair/res/values-af-rZA/strings.xml | 2 +- lawnchair/res/values-am-rET/strings.xml | 2 +- lawnchair/res/values-ar-rSA/strings.xml | 2 +- lawnchair/res/values-b+sr+Latn/strings.xml | 2 +- lawnchair/res/values-bn-rBD/strings.xml | 2 +- lawnchair/res/values-ca-rES/strings.xml | 2 +- lawnchair/res/values-cs-rCZ/strings.xml | 2 +- lawnchair/res/values-da-rDK/strings.xml | 2 +- lawnchair/res/values-de-rDE/strings.xml | 2 +- lawnchair/res/values-el-rGR/strings.xml | 2 +- lawnchair/res/values-en-rCA/strings.xml | 2 +- lawnchair/res/values-en-rGB/strings.xml | 2 +- lawnchair/res/values-es-rES/strings.xml | 2 +- lawnchair/res/values-fa-rIR/strings.xml | 2 +- lawnchair/res/values-fi-rFI/strings.xml | 2 +- lawnchair/res/values-fil-rPH/strings.xml | 2 +- lawnchair/res/values-fr-rFR/strings.xml | 2 +- lawnchair/res/values-gl-rES/strings.xml | 2 +- lawnchair/res/values-he/strings.xml | 2 +- lawnchair/res/values-hi-rIN/strings.xml | 2 +- lawnchair/res/values-hu-rHU/strings.xml | 2 +- lawnchair/res/values-id/strings.xml | 2 +- lawnchair/res/values-in-rID/strings.xml | 2 +- lawnchair/res/values-it-rIT/strings.xml | 2 +- lawnchair/res/values-iw-rIL/strings.xml | 2 +- lawnchair/res/values-ja-rJP/strings.xml | 2 +- lawnchair/res/values-kmr-rTR/strings.xml | 2 +- lawnchair/res/values-ko-rKR/strings.xml | 2 +- lawnchair/res/values-ku/strings.xml | 2 +- lawnchair/res/values-lt-rLT/strings.xml | 2 +- lawnchair/res/values-ml-rIN/strings.xml | 2 +- lawnchair/res/values-mr-rIN/strings.xml | 2 +- lawnchair/res/values-nl-rNL/strings.xml | 2 +- lawnchair/res/values-no-rNO/strings.xml | 2 +- lawnchair/res/values-pl-rPL/strings.xml | 2 +- lawnchair/res/values-pt-rBR/strings.xml | 2 +- lawnchair/res/values-pt-rPT/strings.xml | 2 +- lawnchair/res/values-ro-rRO/strings.xml | 2 +- lawnchair/res/values-ru-rRU/strings.xml | 2 +- lawnchair/res/values-sk-rSK/strings.xml | 2 +- lawnchair/res/values-sl-rSI/strings.xml | 2 +- lawnchair/res/values-sq-rAL/strings.xml | 2 +- lawnchair/res/values-sr/strings.xml | 2 +- lawnchair/res/values-sv-rSE/strings.xml | 2 +- lawnchair/res/values-sw-rKE/strings.xml | 2 +- lawnchair/res/values-sw/strings.xml | 2 +- lawnchair/res/values-ta-rIN/strings.xml | 2 +- lawnchair/res/values-te-rIN/strings.xml | 2 +- lawnchair/res/values-th-rTH/strings.xml | 2 +- lawnchair/res/values-tr-rTR/strings.xml | 2 +- lawnchair/res/values-uk-rUA/strings.xml | 2 +- lawnchair/res/values-ur-rIN/strings.xml | 2 +- lawnchair/res/values-ur-rPK/strings.xml | 2 +- lawnchair/res/values-uz-rUZ/strings.xml | 2 +- lawnchair/res/values-vi-rVN/strings.xml | 2 +- lawnchair/res/values-zh-rCN/strings.xml | 6 +- lawnchair/res/values-zh-rTW/strings.xml | 2 +- lawnchair/res/values/strings.xml | 315 ++++++++---------- lawnchair/src/app/lawnchair/BlankActivity.kt | 6 +- lawnchair/src/app/lawnchair/LawnchairApp.kt | 4 +- .../backup/ui/RestoreBackupScreen.kt | 2 +- .../gestures/handlers/SleepGestureHandler.kt | 4 +- .../app/lawnchair/override/CustomizeDialog.kt | 14 +- .../app/lawnchair/theme/ColorSchemeUtils.kt | 136 ++++---- .../lawnchair/ui/AlertBottomSheetContent.kt | 27 +- .../src/app/lawnchair/ui/OverflowMenu.kt | 2 +- lawnchair/src/app/lawnchair/ui/TouchTarget.kt | 95 ------ .../lawnchair/ui/placeholder/Placeholder.kt | 30 +- .../ui/placeholder/PlaceholderHighlight.kt | 19 +- .../ui/placeholder/material/Placeholder.kt | 125 ------- .../material/PlaceholderHighlight.kt | 61 ---- .../ui/preferences/PreferenceActivity.kt | 38 ++- .../lawnchair/ui/preferences/Preferences.kt | 19 +- .../lawnchair/ui/preferences/about/About.kt | 4 +- .../ui/preferences/about/ContributorRow.kt | 7 +- .../ui/preferences/about/LawnchairLink.kt | 5 +- .../components/AnnouncementPreference.kt | 13 +- .../ui/preferences/components/AppItem.kt | 4 +- .../components/GestureHandlerPreference.kt | 10 +- .../components/IconShapePreference.kt | 2 +- .../preferences/components/LauncherPreview.kt | 3 +- .../components/NotificationDotsPreference.kt | 7 +- .../components/colorpreference/ColorDot.kt | 8 +- .../components/colorpreference/ColorSlider.kt | 12 +- .../colorpreference/pickers/SwatchGrid.kt | 13 +- .../controls/ClickablePreference.kt | 4 +- .../components/controls/ListPreference.kt | 10 +- .../controls/MainSwitchPreference.kt | 6 +- .../components/controls/PreferenceCategory.kt | 119 +++++++ .../components/controls/SliderPreference.kt | 17 +- .../components/controls/SwitchPreference.kt | 18 + .../components/controls/TextPreference.kt | 6 +- .../components/layout/BottomSpacer.kt | 3 + .../components/layout/ClickableIcon.kt | 7 +- .../components/layout/ExpandAndShrink.kt | 5 + .../components/layout/LazyColumnGrid.kt | 6 + .../components/layout/LoadingScreen.kt | 12 +- .../components/layout/NestedScrollStretch.kt | 6 + .../components/layout/PreferenceCategory.kt | 69 ---- .../components/layout/PreferenceDivider.kt | 4 +- .../components/layout/PreferenceGroup.kt | 13 +- .../components/layout/PreferenceLayout.kt | 39 +++ .../components/layout/PreferenceScaffold.kt | 12 +- .../layout/PreferenceSearchScaffold.kt | 228 ++++++++----- .../components/layout/PreferenceTemplate.kt | 15 +- .../components/layout/ScrollContainers.kt | 71 ++-- .../components/layout/SearchTextField.kt | 68 ---- .../preferences/components/layout/TopBar.kt | 73 ++-- .../destinations/CustomIconShapePreference.kt | 15 +- .../destinations/DebugMenuPreferences.kt | 16 - .../destinations/FontSelectionPreference.kt | 71 ++-- .../destinations/GeneralPreferences.kt | 26 +- .../destinations/HiddenAppsPreferences.kt | 8 +- .../destinations/HomeScreenGridPreferences.kt | 3 +- .../destinations/IconPackPreferences.kt | 1 + .../destinations/IconPickerPreference.kt | 68 ++-- .../destinations/PickAppForGesture.kt | 6 +- .../destinations/PreferencesDashboard.kt | 37 +- .../destinations/QuickstepPreferences.kt | 4 +- .../destinations/SearchProviderPreferences.kt | 4 +- .../destinations/SmartspacePreferences.kt | 2 +- lawnchair/src/app/lawnchair/ui/theme/Color.kt | 4 +- lawnchair/src/app/lawnchair/ui/theme/Shape.kt | 8 +- lawnchair/src/app/lawnchair/ui/theme/Theme.kt | 68 ++-- lawnchair/src/app/lawnchair/ui/theme/Type.kt | 75 +---- .../src/app/lawnchair/ui/util/PreviewUtils.kt | 37 ++ .../ui/util/ProvideBottomSheetHandler.kt | 125 +++---- .../app/lawnchair/views/ComposeBottomSheet.kt | 15 +- 129 files changed, 1116 insertions(+), 1399 deletions(-) delete mode 100644 lawnchair/src/app/lawnchair/ui/TouchTarget.kt delete mode 100644 lawnchair/src/app/lawnchair/ui/placeholder/material/Placeholder.kt delete mode 100644 lawnchair/src/app/lawnchair/ui/placeholder/material/PlaceholderHighlight.kt create mode 100644 lawnchair/src/app/lawnchair/ui/preferences/components/controls/PreferenceCategory.kt delete mode 100644 lawnchair/src/app/lawnchair/ui/preferences/components/layout/PreferenceCategory.kt delete mode 100644 lawnchair/src/app/lawnchair/ui/preferences/components/layout/SearchTextField.kt create mode 100644 lawnchair/src/app/lawnchair/ui/util/PreviewUtils.kt diff --git a/build.gradle b/build.gradle index 6635d6c8fd8..63c3fa893ed 100644 --- a/build.gradle +++ b/build.gradle @@ -146,7 +146,6 @@ android { buildConfigField "int", "QUICKSTEP_MIN_SDK", quickstepMinSdk buildConfigField "int", "QUICKSTEP_MAX_SDK", quickstepMaxSdk } - androidComponents { onVariants(selector().all()) { variant -> def capName = variant.name.capitalize() @@ -357,7 +356,7 @@ dependencies { implementation 'com.github.ChickenHook:RestrictionBypass:2.2' implementation 'dev.rikka.tools.refine:runtime:4.4.0' - implementation platform("androidx.compose:compose-bom:2024.01.00") + implementation platform("androidx.compose:compose-bom:2024.02.00") implementation "androidx.compose.ui:ui" implementation "androidx.compose.ui:ui-util" debugImplementation "androidx.compose.ui:ui-tooling" @@ -367,7 +366,8 @@ dependencies { implementation "androidx.compose.material:material-icons-extended" implementation "androidx.compose.material:material" implementation "androidx.compose.runtime:runtime-livedata" - implementation 'androidx.compose.material3:material3' + implementation 'androidx.compose.material3:material3:1.3.0-alpha03' + implementation 'androidx.compose.material3:material3-window-size-class:1.3.0-alpha03' implementation "androidx.constraintlayout:constraintlayout:2.1.4" implementation "androidx.activity:activity-compose:1.8.2" implementation "androidx.lifecycle:lifecycle-viewmodel-compose:2.7.0" @@ -375,8 +375,8 @@ dependencies { implementation "androidx.palette:palette-ktx:1.0.0" implementation "androidx.slice:slice-core:1.1.0-alpha02" def accompanistVersion = '0.34.0' + implementation "com.google.accompanist:accompanist-adaptive:$accompanistVersion" implementation "com.google.accompanist:accompanist-drawablepainter:$accompanistVersion" - implementation "com.google.accompanist:accompanist-insets-ui:$accompanistVersion" implementation "com.google.accompanist:accompanist-permissions:$accompanistVersion" implementation "com.google.android.material:material:1.11.0" implementation "io.github.fornewid:material-motion-compose-core:1.2.0" diff --git a/lawnchair/res/values-af-rZA/strings.xml b/lawnchair/res/values-af-rZA/strings.xml index 74ea1eaf5c1..89d33d56ffb 100644 --- a/lawnchair/res/values-af-rZA/strings.xml +++ b/lawnchair/res/values-af-rZA/strings.xml @@ -56,7 +56,7 @@ Use transparent background on themed icons Tuisskermrotasie - Wanneer die toestel gedraai word. + Wanneer die toestel gedraai word. Lettertipe (eksperimenteel) Ikoon styl diff --git a/lawnchair/res/values-am-rET/strings.xml b/lawnchair/res/values-am-rET/strings.xml index b3715d95e25..9787ff2c6c0 100644 --- a/lawnchair/res/values-am-rET/strings.xml +++ b/lawnchair/res/values-am-rET/strings.xml @@ -56,7 +56,7 @@ Use transparent background on themed icons Home Screen Rotation - When device is rotated. + When device is rotated. Font (Experimental) Icon Style diff --git a/lawnchair/res/values-ar-rSA/strings.xml b/lawnchair/res/values-ar-rSA/strings.xml index fc09c8bfcda..5b41f12f765 100644 --- a/lawnchair/res/values-ar-rSA/strings.xml +++ b/lawnchair/res/values-ar-rSA/strings.xml @@ -56,7 +56,7 @@ استخدم خلفيه شفافه مع تغير مظهر الأيقونات تدوير الشاشة الرئيسة - عندما يُدَوَّر الجهاز. + عندما يُدَوَّر الجهاز. الخط (تجريبي) نمط الأيقونة diff --git a/lawnchair/res/values-b+sr+Latn/strings.xml b/lawnchair/res/values-b+sr+Latn/strings.xml index 105450e4f89..08eb71594f3 100644 --- a/lawnchair/res/values-b+sr+Latn/strings.xml +++ b/lawnchair/res/values-b+sr+Latn/strings.xml @@ -56,7 +56,7 @@ Koristi prozirnu pozadinu na tematskim ikonama Rotacija početnog ekrana - Kada se uređaj rotira. + Kada se uređaj rotira. Font (eksperimentalno) Stil ikona diff --git a/lawnchair/res/values-bn-rBD/strings.xml b/lawnchair/res/values-bn-rBD/strings.xml index 4b7ea53afe9..5682e4cd78a 100644 --- a/lawnchair/res/values-bn-rBD/strings.xml +++ b/lawnchair/res/values-bn-rBD/strings.xml @@ -56,7 +56,7 @@ স্বচ্ছ আইকন ব্যাবহার করুন থিম-যুক্ত আইকন গুলিতে মূল পেজ ঘোরানো - যখন ডিভাইস ঘোরানো হয়. + যখন ডিভাইস ঘোরানো হয়. হরফ (পরীক্ষামূলক) আইকন আকৃতি diff --git a/lawnchair/res/values-ca-rES/strings.xml b/lawnchair/res/values-ca-rES/strings.xml index fa80a0d0b4d..dd2d9525215 100644 --- a/lawnchair/res/values-ca-rES/strings.xml +++ b/lawnchair/res/values-ca-rES/strings.xml @@ -56,7 +56,7 @@ Utilitza un fons transparent a les icones temàtiques Rotació de la Pantalla d\'inici - Quan es gira el dispositiu. + Quan es gira el dispositiu. Font (Experimental) Estil de les icones diff --git a/lawnchair/res/values-cs-rCZ/strings.xml b/lawnchair/res/values-cs-rCZ/strings.xml index a384a63e606..94686120fa3 100644 --- a/lawnchair/res/values-cs-rCZ/strings.xml +++ b/lawnchair/res/values-cs-rCZ/strings.xml @@ -56,7 +56,7 @@ Použít průhledné pozadí u ikon s tématem Otáčení domovské obrazovky - Při otočení zařízení. + Při otočení zařízení. Písmo (experimentální) Styl ikon diff --git a/lawnchair/res/values-da-rDK/strings.xml b/lawnchair/res/values-da-rDK/strings.xml index 515cc33cece..27d44c0512e 100644 --- a/lawnchair/res/values-da-rDK/strings.xml +++ b/lawnchair/res/values-da-rDK/strings.xml @@ -56,7 +56,7 @@ Use transparent background on themed icons Startskærms rotation - Når enheden roteres. + Når enheden roteres. Font (Experimental) Icon Style diff --git a/lawnchair/res/values-de-rDE/strings.xml b/lawnchair/res/values-de-rDE/strings.xml index dd369dbaf42..030feba7802 100644 --- a/lawnchair/res/values-de-rDE/strings.xml +++ b/lawnchair/res/values-de-rDE/strings.xml @@ -58,7 +58,7 @@ workspace_increase_max_grid_size_label Transparenten Hintergrund für Symboldesigns verwenden Startbildschirm-Drehung - Wenn Gerät gedreht wird. + Wenn Gerät gedreht wird. Schriftart (experimentell) Symbolstil diff --git a/lawnchair/res/values-el-rGR/strings.xml b/lawnchair/res/values-el-rGR/strings.xml index 05312c18c50..92f831d1339 100644 --- a/lawnchair/res/values-el-rGR/strings.xml +++ b/lawnchair/res/values-el-rGR/strings.xml @@ -56,7 +56,7 @@ Χρήση διαφανούς φόντου στα θεματοποιημένα εικονίδια Περιστροφή Αρχικής Οθόνης - Όταν η συσκευή περιστρέφεται. + Όταν η συσκευή περιστρέφεται. Γραμματοσειρά (Πειραματικό χαρακτηριστικό) Στυλ Εικονιδίου diff --git a/lawnchair/res/values-en-rCA/strings.xml b/lawnchair/res/values-en-rCA/strings.xml index d5a394bee47..f11552308b0 100644 --- a/lawnchair/res/values-en-rCA/strings.xml +++ b/lawnchair/res/values-en-rCA/strings.xml @@ -56,7 +56,7 @@ Use transparent background on themed icons Home Screen Rotation - When device is rotated. + When device is rotated. Font (Experimental) Icon Style diff --git a/lawnchair/res/values-en-rGB/strings.xml b/lawnchair/res/values-en-rGB/strings.xml index e8a5099c13f..e73794b1975 100644 --- a/lawnchair/res/values-en-rGB/strings.xml +++ b/lawnchair/res/values-en-rGB/strings.xml @@ -27,7 +27,7 @@ General Notification Dots, Icon Pack Home Screen Rotation - When device is rotated. + When device is rotated. Add New Apps to Home Screen Dock Icon Count diff --git a/lawnchair/res/values-es-rES/strings.xml b/lawnchair/res/values-es-rES/strings.xml index ab0b1ed73c5..cd7d22556f3 100644 --- a/lawnchair/res/values-es-rES/strings.xml +++ b/lawnchair/res/values-es-rES/strings.xml @@ -56,7 +56,7 @@ Usar fondo transparente en iconos temáticos Rotación de Pantalla de Inicio - Cuando se rota el dispositivo. + Cuando se rota el dispositivo. Fuente (Experimental) Estilo del icono diff --git a/lawnchair/res/values-fa-rIR/strings.xml b/lawnchair/res/values-fa-rIR/strings.xml index c0cab3416de..96ec3af86a6 100644 --- a/lawnchair/res/values-fa-rIR/strings.xml +++ b/lawnchair/res/values-fa-rIR/strings.xml @@ -56,7 +56,7 @@ استفاده از پس زمینه شفاف در آیکون‌های خاص چرخش صفحه‌ اصلی - هنگام چرخش دستگاه. + هنگام چرخش دستگاه. قلم‌ (آزمایشی) ظاهر آیکون diff --git a/lawnchair/res/values-fi-rFI/strings.xml b/lawnchair/res/values-fi-rFI/strings.xml index af8bd6f7e1c..434ce5def4f 100644 --- a/lawnchair/res/values-fi-rFI/strings.xml +++ b/lawnchair/res/values-fi-rFI/strings.xml @@ -56,7 +56,7 @@ Käytä läpinäkyvää taustaa teemojen kuvakkeissa Aloitusnäytön kierto - Kun laite on käännetty. + Kun laite on käännetty. Kirjasin (kokeellinen) Kuvakkeen tyyli diff --git a/lawnchair/res/values-fil-rPH/strings.xml b/lawnchair/res/values-fil-rPH/strings.xml index e5a872e87f5..be1e366c518 100644 --- a/lawnchair/res/values-fil-rPH/strings.xml +++ b/lawnchair/res/values-fil-rPH/strings.xml @@ -56,7 +56,7 @@ Gumamit ng transparent na background sa themed icons Pag-iikot ng Home Screen - Kapag ihiniga ang device. + Kapag ihiniga ang device. Font (Eksperimento) Estilo ng Icon diff --git a/lawnchair/res/values-fr-rFR/strings.xml b/lawnchair/res/values-fr-rFR/strings.xml index 71eb589d9ae..28e8914bddf 100644 --- a/lawnchair/res/values-fr-rFR/strings.xml +++ b/lawnchair/res/values-fr-rFR/strings.xml @@ -56,7 +56,7 @@ Utiliser un fond transparent sur les icônes thématiques Rotation de l\'écran d\'accueil - Lorsque l\'appareil est tourné. + Lorsque l\'appareil est tourné. Police (Expérimental) Style d\'icône diff --git a/lawnchair/res/values-gl-rES/strings.xml b/lawnchair/res/values-gl-rES/strings.xml index 1e8aeec8c5e..0367c3cedaf 100644 --- a/lawnchair/res/values-gl-rES/strings.xml +++ b/lawnchair/res/values-gl-rES/strings.xml @@ -56,7 +56,7 @@ Use transparent background on themed icons Home Screen Rotation - When device is rotated. + When device is rotated. Font (Experimental) Icon Style diff --git a/lawnchair/res/values-he/strings.xml b/lawnchair/res/values-he/strings.xml index e71675a5e57..5cbc046a528 100644 --- a/lawnchair/res/values-he/strings.xml +++ b/lawnchair/res/values-he/strings.xml @@ -22,7 +22,7 @@ כללי Notification Dots, Icon Pack סיבוב מסך הבית - כאשר המכשיר מסובב. + כאשר המכשיר מסובב. הוספת יישומים חדשים למסך הבית מעגנים סרגל חיפוש, כמות סמלים diff --git a/lawnchair/res/values-hi-rIN/strings.xml b/lawnchair/res/values-hi-rIN/strings.xml index 676752efd97..439317573a5 100644 --- a/lawnchair/res/values-hi-rIN/strings.xml +++ b/lawnchair/res/values-hi-rIN/strings.xml @@ -56,7 +56,7 @@ थीम्ड आइकन की पृष्ठभूमि पारदर्शी रखें होम स्क्रीन रोटेशन - जब फोन घुमाया जाता है। + जब फोन घुमाया जाता है। फोंट (प्रायोगिक) आइकन स्टाइल diff --git a/lawnchair/res/values-hu-rHU/strings.xml b/lawnchair/res/values-hu-rHU/strings.xml index ece387f99fe..955e5b6e1c8 100644 --- a/lawnchair/res/values-hu-rHU/strings.xml +++ b/lawnchair/res/values-hu-rHU/strings.xml @@ -56,7 +56,7 @@ Áttetsző háttér használata témázott ikonok esetén Kezdőképernyő tájolása - Amikor az eszköz el van forgatva. + Amikor az eszköz el van forgatva. Betűtípus (kísérleti) Ikon stílus diff --git a/lawnchair/res/values-id/strings.xml b/lawnchair/res/values-id/strings.xml index 644690ac8a0..ce552fe01d4 100644 --- a/lawnchair/res/values-id/strings.xml +++ b/lawnchair/res/values-id/strings.xml @@ -22,7 +22,7 @@ Umum Warna, Titik Notifikasi, Paket Ikon Rotasi Layar Beranda - Ketika perangkat dirotasi. + Ketika perangkat dirotasi. Tambahkan aplikasi baru ke layar beranda Dock Bilah pencarian, Jumlah Ikon diff --git a/lawnchair/res/values-in-rID/strings.xml b/lawnchair/res/values-in-rID/strings.xml index 50437481e27..812266b1e5e 100644 --- a/lawnchair/res/values-in-rID/strings.xml +++ b/lawnchair/res/values-in-rID/strings.xml @@ -56,7 +56,7 @@ Gunakan latar belakang transparan pada ikon bertema Rotasi Layar Beranda - Ketika perangkat diputar. + Ketika perangkat diputar. Font (Eksperimental) Gaya Ikon diff --git a/lawnchair/res/values-it-rIT/strings.xml b/lawnchair/res/values-it-rIT/strings.xml index 411953bc5a8..4fd6d577c4d 100644 --- a/lawnchair/res/values-it-rIT/strings.xml +++ b/lawnchair/res/values-it-rIT/strings.xml @@ -56,7 +56,7 @@ Usa sfondo trasparente nelle icone a tema Rotazione schermata home - Quando il dispositivo viene ruotato. + Quando il dispositivo viene ruotato. Tipo di carattere (Sperimentale) Stile delle icone diff --git a/lawnchair/res/values-iw-rIL/strings.xml b/lawnchair/res/values-iw-rIL/strings.xml index 0d8a43d1e87..b1243502003 100644 --- a/lawnchair/res/values-iw-rIL/strings.xml +++ b/lawnchair/res/values-iw-rIL/strings.xml @@ -56,7 +56,7 @@ השתמש ברקע שקוף עבור סמלי סגנון סיבוב מסך הבית - כאשר המכשיר מסובב. + כאשר המכשיר מסובב. פונט (ניסיוני) סגנון אייקון diff --git a/lawnchair/res/values-ja-rJP/strings.xml b/lawnchair/res/values-ja-rJP/strings.xml index 03f9f8760a3..98b4afa91e3 100644 --- a/lawnchair/res/values-ja-rJP/strings.xml +++ b/lawnchair/res/values-ja-rJP/strings.xml @@ -56,7 +56,7 @@ テーマアイコンの背景を透明にします ホーム画面の回転 - デバイスを回転させた時 + デバイスを回転させた時 フォント (実験的) アイコンのスタイル diff --git a/lawnchair/res/values-kmr-rTR/strings.xml b/lawnchair/res/values-kmr-rTR/strings.xml index b24f5ca298a..4356f0e0d3a 100644 --- a/lawnchair/res/values-kmr-rTR/strings.xml +++ b/lawnchair/res/values-kmr-rTR/strings.xml @@ -56,7 +56,7 @@ Use transparent background on themed icons Home Screen Rotation - When device is rotated. + When device is rotated. Font (Experimental) Icon Style diff --git a/lawnchair/res/values-ko-rKR/strings.xml b/lawnchair/res/values-ko-rKR/strings.xml index 4c9489ace44..fc82f268ab8 100644 --- a/lawnchair/res/values-ko-rKR/strings.xml +++ b/lawnchair/res/values-ko-rKR/strings.xml @@ -56,7 +56,7 @@ 테마 아이콘에 투명한 배경 사용하기 홈 화면 회전 - 기기가 회전되었을 때. + 기기가 회전되었을 때. 폰트 (실험적 기능) 아이콘 스타일 diff --git a/lawnchair/res/values-ku/strings.xml b/lawnchair/res/values-ku/strings.xml index f4fc4d26eb7..31e14da8813 100644 --- a/lawnchair/res/values-ku/strings.xml +++ b/lawnchair/res/values-ku/strings.xml @@ -22,7 +22,7 @@ General Colors, Icon Pack, Notification Dots Home Screen Rotation - When device is rotated. + When device is rotated. Add New Apps to Home Screen Dock Search Bar, Icon Count diff --git a/lawnchair/res/values-lt-rLT/strings.xml b/lawnchair/res/values-lt-rLT/strings.xml index cd8006d91e6..d8d72d9644b 100644 --- a/lawnchair/res/values-lt-rLT/strings.xml +++ b/lawnchair/res/values-lt-rLT/strings.xml @@ -56,7 +56,7 @@ Naudoti permatoma foną temintoms piktogramoms Namu Ekrano Sukimas - Kai įrenginys yra pasuktas. + Kai įrenginys yra pasuktas. Šriftas (Eksperimentinis) Piktogramų Stilius diff --git a/lawnchair/res/values-ml-rIN/strings.xml b/lawnchair/res/values-ml-rIN/strings.xml index 8f580094b98..8df628fb673 100644 --- a/lawnchair/res/values-ml-rIN/strings.xml +++ b/lawnchair/res/values-ml-rIN/strings.xml @@ -56,7 +56,7 @@ Use transparent background on themed icons ഹോം സ്ക്രീൻ റൊട്ടേഷൻ - ഉപകരണം കറക്ക്‌ബോൾ. + ഉപകരണം കറക്ക്‌ബോൾ. ഫോണ്ട് (പരീക്ഷണാത്മക) ഐക്കൺ ശൈലി diff --git a/lawnchair/res/values-mr-rIN/strings.xml b/lawnchair/res/values-mr-rIN/strings.xml index cde483093f8..d0eb4d9499b 100644 --- a/lawnchair/res/values-mr-rIN/strings.xml +++ b/lawnchair/res/values-mr-rIN/strings.xml @@ -56,7 +56,7 @@ थीम असलेल्या चिन्हांवर पारदर्शक पार्श्वभूमी वापरा मुखपृष्ठाचे चक्रगति - जेव्हा उपकरण फिरवले जाते + जेव्हा उपकरण फिरवले जाते फॉन्ट (प्रायोगिक) चिन्ह_गाठोडा diff --git a/lawnchair/res/values-nl-rNL/strings.xml b/lawnchair/res/values-nl-rNL/strings.xml index 6a44717545e..c52ff5af8db 100644 --- a/lawnchair/res/values-nl-rNL/strings.xml +++ b/lawnchair/res/values-nl-rNL/strings.xml @@ -56,7 +56,7 @@ Gebruik transparante achtergrond bij gethematiseerde iconen Startscherm rotatie - Wanneer het apparaat is gedraaid. + Wanneer het apparaat is gedraaid. Lettertype (Experimenteel) Icoon stijl diff --git a/lawnchair/res/values-no-rNO/strings.xml b/lawnchair/res/values-no-rNO/strings.xml index d0d87c51cfc..714c4a057c1 100644 --- a/lawnchair/res/values-no-rNO/strings.xml +++ b/lawnchair/res/values-no-rNO/strings.xml @@ -56,7 +56,7 @@ Use transparent background on themed icons Hjemskjerm rotasjon - Når enheten er rotert. + Når enheten er rotert. Font (Experimental) Icon Style diff --git a/lawnchair/res/values-pl-rPL/strings.xml b/lawnchair/res/values-pl-rPL/strings.xml index 47cfdac2ee1..f9911acc477 100644 --- a/lawnchair/res/values-pl-rPL/strings.xml +++ b/lawnchair/res/values-pl-rPL/strings.xml @@ -56,7 +56,7 @@ Użyj przezroczystego tła na ikonach motywu Obrót Ekranu głównego - Po obróceniu urządzenia. + Po obróceniu urządzenia. Czcionka (eksperymentalna) Styl ikon diff --git a/lawnchair/res/values-pt-rBR/strings.xml b/lawnchair/res/values-pt-rBR/strings.xml index be24fc2f05d..df4924391ad 100644 --- a/lawnchair/res/values-pt-rBR/strings.xml +++ b/lawnchair/res/values-pt-rBR/strings.xml @@ -56,7 +56,7 @@ Usar fundo transparente nos ícones temáticos Rotação da Tela Inicial - Quando o dispositivo for rotacionado. + Quando o dispositivo for rotacionado. Fonte (Experimental) Estilo do Ícone diff --git a/lawnchair/res/values-pt-rPT/strings.xml b/lawnchair/res/values-pt-rPT/strings.xml index b3049104cd1..a77cfb2e55d 100644 --- a/lawnchair/res/values-pt-rPT/strings.xml +++ b/lawnchair/res/values-pt-rPT/strings.xml @@ -56,7 +56,7 @@ Usar fundo transparente nos ícones temáticos Rotação de Ecrã Inicial - Quando o dispositivo é rodado. + Quando o dispositivo é rodado. Fonte (Experimental) Estilo de Ícones diff --git a/lawnchair/res/values-ro-rRO/strings.xml b/lawnchair/res/values-ro-rRO/strings.xml index 197d544d447..474e0b0516f 100644 --- a/lawnchair/res/values-ro-rRO/strings.xml +++ b/lawnchair/res/values-ro-rRO/strings.xml @@ -56,7 +56,7 @@ Utilizează fundal transparent pe pictograme tematice Rotația ecranului de pornire - Când dispozitivul este rotit. + Când dispozitivul este rotit. Font (experimental) Stilul pictogramelor diff --git a/lawnchair/res/values-ru-rRU/strings.xml b/lawnchair/res/values-ru-rRU/strings.xml index 7c3e35473ba..15bb9706867 100644 --- a/lawnchair/res/values-ru-rRU/strings.xml +++ b/lawnchair/res/values-ru-rRU/strings.xml @@ -56,7 +56,7 @@ Использовать прозрачный фон на тематических значках Поворачивать домашний экран - При повороте устройства. + При повороте устройства. Шрифт (экспериментально) Стиль значка diff --git a/lawnchair/res/values-sk-rSK/strings.xml b/lawnchair/res/values-sk-rSK/strings.xml index 76a38eb7ae7..80073a12ca2 100644 --- a/lawnchair/res/values-sk-rSK/strings.xml +++ b/lawnchair/res/values-sk-rSK/strings.xml @@ -56,7 +56,7 @@ Použiť priehľadné pozadie na tematických ikonách Rotácia domovskej obrazovky - Keď je zariadenie otočené. + Keď je zariadenie otočené. Font (Experimentálne) Štýl ikon diff --git a/lawnchair/res/values-sl-rSI/strings.xml b/lawnchair/res/values-sl-rSI/strings.xml index 6ebad8609cf..f121c9751b6 100644 --- a/lawnchair/res/values-sl-rSI/strings.xml +++ b/lawnchair/res/values-sl-rSI/strings.xml @@ -56,7 +56,7 @@ Use transparent background on themed icons Rotacija Začetnega zaslona - Ko je naprava rotirana. + Ko je naprava rotirana. Font (Experimental) Stil ikone diff --git a/lawnchair/res/values-sq-rAL/strings.xml b/lawnchair/res/values-sq-rAL/strings.xml index 1765bbdb10f..51a841a3f16 100644 --- a/lawnchair/res/values-sq-rAL/strings.xml +++ b/lawnchair/res/values-sq-rAL/strings.xml @@ -56,7 +56,7 @@ Përdor sfond transfarent në ikonat me temë Rrotullimi i ekranit - Kur pajisja rrotullohet. + Kur pajisja rrotullohet. Fonte (Eksperimentale) Sili i ikonave diff --git a/lawnchair/res/values-sr/strings.xml b/lawnchair/res/values-sr/strings.xml index 7f1ef828f12..7d16d163514 100644 --- a/lawnchair/res/values-sr/strings.xml +++ b/lawnchair/res/values-sr/strings.xml @@ -56,7 +56,7 @@ Користи прозирну позадину на тематским иконама Ротација почетног екрана - Када се уређај ротира. + Када се уређај ротира. Фонт (експериментално) Стил икона diff --git a/lawnchair/res/values-sv-rSE/strings.xml b/lawnchair/res/values-sv-rSE/strings.xml index 7692a8fabf6..263e6c80b4f 100644 --- a/lawnchair/res/values-sv-rSE/strings.xml +++ b/lawnchair/res/values-sv-rSE/strings.xml @@ -56,7 +56,7 @@ Använd transparent bakgrund på tematiserade ikoner Rotation av startskärmen - När enheten roteras. + När enheten roteras. Typsnitt (experimentellt) Ikonstil diff --git a/lawnchair/res/values-sw-rKE/strings.xml b/lawnchair/res/values-sw-rKE/strings.xml index 28c697f662b..25a900ce739 100644 --- a/lawnchair/res/values-sw-rKE/strings.xml +++ b/lawnchair/res/values-sw-rKE/strings.xml @@ -56,7 +56,7 @@ Tumia mandharinyuma yenye uwazi kwenye ikoni zenye mada Mzunguko wa Skrini ya Nyumbani - Kifaa kikizungushwa. + Kifaa kikizungushwa. Fonti (ya Majaribio) Mtindo wa ikoni diff --git a/lawnchair/res/values-sw/strings.xml b/lawnchair/res/values-sw/strings.xml index 2948e44b907..d201b4d363e 100644 --- a/lawnchair/res/values-sw/strings.xml +++ b/lawnchair/res/values-sw/strings.xml @@ -56,7 +56,7 @@ Uchaguzi wa mtoaji Kwa Mtazamo Mzunguko wa Skrini ya Nyumbani - Kifaa kikizungushwa. + Kifaa kikizungushwa. Fonti (ya Majaribio) Mtindo wa ikoni diff --git a/lawnchair/res/values-ta-rIN/strings.xml b/lawnchair/res/values-ta-rIN/strings.xml index 8cd38d5913a..eda9d4b9a5e 100644 --- a/lawnchair/res/values-ta-rIN/strings.xml +++ b/lawnchair/res/values-ta-rIN/strings.xml @@ -56,7 +56,7 @@ Use transparent background on themed icons முகப்புத் திரைச் சுழற்சி - கருவி சுழற்றப்படும் போது. + கருவி சுழற்றப்படும் போது. எழுத்துரு (பரீட்சார்த்த) சின்னங்களின் பாங்கு diff --git a/lawnchair/res/values-te-rIN/strings.xml b/lawnchair/res/values-te-rIN/strings.xml index 7c0b87dd725..4c333ca4e0c 100644 --- a/lawnchair/res/values-te-rIN/strings.xml +++ b/lawnchair/res/values-te-rIN/strings.xml @@ -56,7 +56,7 @@ Use transparent background on themed icons హోమ్ స్క్రీన్ భ్రమణం - పరికరం తిప్పబడినప్పుడు. + పరికరం తిప్పబడినప్పుడు. Font (Experimental) Icon Style diff --git a/lawnchair/res/values-th-rTH/strings.xml b/lawnchair/res/values-th-rTH/strings.xml index 0c5704736b6..125e628c9ab 100644 --- a/lawnchair/res/values-th-rTH/strings.xml +++ b/lawnchair/res/values-th-rTH/strings.xml @@ -56,7 +56,7 @@ ใช้พื้นหลังโปร่งใสบนไอคอนที่มีธีม อนุญาตให้หมุนหน้าจอหลัก - เมื่อโทรศัพท์หมุน + เมื่อโทรศัพท์หมุน แบบอักษร (อยู่ในการทดลอง) รูปแบบไอคอน diff --git a/lawnchair/res/values-tr-rTR/strings.xml b/lawnchair/res/values-tr-rTR/strings.xml index 1b9d91c78b7..c428e847bae 100644 --- a/lawnchair/res/values-tr-rTR/strings.xml +++ b/lawnchair/res/values-tr-rTR/strings.xml @@ -56,7 +56,7 @@ Temalı ikonlarda saydam arkaplan kullan Ana Ekran Rotasyonu - Cihaz döndürüldüğü zaman. + Cihaz döndürüldüğü zaman. Yazı Tipi (Deneysel) Simge Şekli diff --git a/lawnchair/res/values-uk-rUA/strings.xml b/lawnchair/res/values-uk-rUA/strings.xml index d828e206574..107aef0372d 100644 --- a/lawnchair/res/values-uk-rUA/strings.xml +++ b/lawnchair/res/values-uk-rUA/strings.xml @@ -56,7 +56,7 @@ Використовувати прозорий фон на тематичних іконках Обертання Головного Екрану - При обертанні пристрою. + При обертанні пристрою. Шрифт (експериментально) Стиль значка diff --git a/lawnchair/res/values-ur-rIN/strings.xml b/lawnchair/res/values-ur-rIN/strings.xml index 2ff5ecc975e..48f16435741 100644 --- a/lawnchair/res/values-ur-rIN/strings.xml +++ b/lawnchair/res/values-ur-rIN/strings.xml @@ -56,7 +56,7 @@ Use transparent background on themed icons Home Screen Rotation - When device is rotated. + When device is rotated. Font (Experimental) Icon Style diff --git a/lawnchair/res/values-ur-rPK/strings.xml b/lawnchair/res/values-ur-rPK/strings.xml index ff375d8a1f4..259c8a5a5cc 100644 --- a/lawnchair/res/values-ur-rPK/strings.xml +++ b/lawnchair/res/values-ur-rPK/strings.xml @@ -56,7 +56,7 @@ Use transparent background on themed icons ہوم اسکرین کی گردش - جب آلہ گھمایا ہوا ہو. + جب آلہ گھمایا ہوا ہو. Font (Experimental) Icon Style diff --git a/lawnchair/res/values-uz-rUZ/strings.xml b/lawnchair/res/values-uz-rUZ/strings.xml index c4451e55bc0..85045087d03 100644 --- a/lawnchair/res/values-uz-rUZ/strings.xml +++ b/lawnchair/res/values-uz-rUZ/strings.xml @@ -56,7 +56,7 @@ Use transparent background on themed icons Asosiy ekranni aylantirish - Qurilma aylantirilganda. + Qurilma aylantirilganda. Font (Experimental) Icon Style diff --git a/lawnchair/res/values-vi-rVN/strings.xml b/lawnchair/res/values-vi-rVN/strings.xml index 3cfa41862d8..b8cd86b34e9 100644 --- a/lawnchair/res/values-vi-rVN/strings.xml +++ b/lawnchair/res/values-vi-rVN/strings.xml @@ -56,7 +56,7 @@ Dùng nền trong suốt cho biểu tượng theo chủ đề Xoay màn hình chính - Khi thiết bị được xoay. + Khi thiết bị được xoay. Font (Experimental) Kiểu biểu tượng diff --git a/lawnchair/res/values-zh-rCN/strings.xml b/lawnchair/res/values-zh-rCN/strings.xml index da44694757e..0c7849eaa97 100644 --- a/lawnchair/res/values-zh-rCN/strings.xml +++ b/lawnchair/res/values-zh-rCN/strings.xml @@ -55,9 +55,9 @@ 透明的带主题图标 在带主题的图标上使用透明背景 - 允许主屏幕旋转 - 当设备旋转时不保持竖屏 - 字体(实验性功能) + 主屏幕旋转 + 当设备旋转时 + 字体 (实验性功能) 图标样式 图标形状 diff --git a/lawnchair/res/values-zh-rTW/strings.xml b/lawnchair/res/values-zh-rTW/strings.xml index 63c8acb2d09..7e3df9bf06c 100644 --- a/lawnchair/res/values-zh-rTW/strings.xml +++ b/lawnchair/res/values-zh-rTW/strings.xml @@ -56,7 +56,7 @@ 在套用主題色的圖示上使用透明背景 旋轉主螢幕 - 當手機旋轉時 + 當手機旋轉時 Font (Experimental) 圖示風格 diff --git a/lawnchair/res/values/strings.xml b/lawnchair/res/values/strings.xml index 47df2d1f98a..a629224679a 100644 --- a/lawnchair/res/values/strings.xml +++ b/lawnchair/res/values/strings.xml @@ -15,19 +15,16 @@ ~ limitations under the License. --> - + "" - + - Tap this card to set Lawnchair as your default launcher. + Set Lawnchair as your default launcher to access shortcuts and more. Settings General Colors, Icon Pack, Notification Dots Home Screen Feed, Grid, Icons - What to Show Dock Search Bar, Icon Count @@ -40,9 +37,7 @@ Recents Clear All Button, Corner Radius About - - App Info Restart Lawnchair Experimental Features @@ -50,50 +45,65 @@ Font Customization - Some text remains unchanged. + Some text remains unchanged At a Glance Calendar Customization - Allow showing date in non-Gregorian calendar systems. + Allow showing date in non-Gregorian calendar systems Increased Max Home Screen Grid Size - Increase the max allowed Home Screen grid size from 10 x 10 to 20 x 20. + Increase the max allowed Home Screen grid size from 10 x 10 to 20 x 20o Always Reload Icons Avoid using cached icons from icon packs - Transparent Themed Icons - Use transparent background on themed icons + Lock/Unlock + Prevent selected app from closing when pressing “Clear All” + + + Icons + Icon Size + Show Labels + Label Size Home Screen Rotation - When device is rotated. + When device is rotated + Font (Experimental) + General + Headings + Headings (Medium) + Body + Body (Medium) - - Icon Style - Icon Shape - Auto Adaptive Icons - For all non-Adaptive icons. - Background Lightness - Use 100% background lightness for white. + Icon Style + Transparent Themed Icons + Use transparent background on themed icons + Icon Shape + Auto Adaptive Icons + For all non-Adaptive icons. + Background Lightness + Use 100% background lightness for white. + + Reset Custom Icons + All custom icons will be reset. Do you want to continue? Notification Dots - - Show Notification Count - Notification Dot Color - Notification Count Color - Warning: Notification Dot & Counter colors do not have enough contrast with each other - Warning: Notification Dot & Counter colors might not always have enough contrast with each other - - - Notification Access Needed - Notification access needed. - To use Notification Dots, grant %1$s access to notifications. - Change Settings + Show Notification Count + Notification Dot Color + Notification Count Color + Warning: Notification Dot & Counter colors do not have enough contrast with each other + Warning: Notification Dot & Counter colors might not always have enough contrast with each other + + + Notification Access Needed + Notification access needed + To use Notification Dots, grant %1$s access to notifications. + Change Settings Colors - Theme - Light - Dark - System - Match Wallpaper - Accent Color + Theme + Light + Dark + System + Match Wallpaper + Accent Color Custom Icon Shape @@ -108,54 +118,50 @@ Bottom Left Bottom Right Create + Clipboard Export to Clipboard Import from Clipboard Clipboard does not contain a valid icon shape - Icon Pack Themed Icon Source - System Icons + System Icons Themed Icons - Off - Home Screen - Home Screen & App Drawer - Lawnicons not installed. - + Off + Home Screen + Home Screen & App Drawer + No supported icon packs - - System - Circle - Cylinder - Diamond - Egg - iOS - Octagon - One UI - Rounded Square - Sharp Square - Square - Squircle - Teardrop + System + Circle + Cylinder + Diamond + Egg + iOS + Octagon + One UI + Rounded Square + Sharp Square + Square + Squircle + Teardrop Add Fonts - OTF & TTF supported. + OTF & TTF fonts are supported - Font not found. + Font not found Italic Thin Extra Light - Light Regular Medium Semibold - Bold Extra Bold Black @@ -183,62 +189,50 @@ Invalid Color Managed by Lawnchair - - - Add New Apps to Home Screen - - Show Feed - No feed installed. - Feed - Feed Provider - Default + > + Add New Apps to Home Screen + + Show Feed + No feed apps installed + Feed + Feed Provider + Default Wallpaper - Scroll Wallpaper - Wallpaper Depth Effect - Zoom into and out of the wallpaper when transitioning between areas of the launcher. - Top Shadow + Scroll Wallpaper + Wallpaper Depth Effect + Zoom into and out of the wallpaper when transitioning between areas of the launcher + Top Shadow Layout - Home Screen Grid - Lock Home Screen - Prevents changes to the home screen layout. - Unlock Home Screen - Home Screen is locked. - Show dot pagination - Enable showing dot pagination in workspace. - Show Material U Popup - Enable bouncy and slightly consolidated popup. + Home Screen Grid + Lock Home Screen + Prevent changes to the home screen layout + Unlock Home Screen + Home Screen is locked + Use dot pagination + Use dots instead of lines to show page number + Use new popup style + Use Material You’s bouncy and slightly consolidated popup style Pop-up Menu - Show Lock Button - Show System Settings Entry + Show Lock Button + Show System Settings Entry Show Edit Button - Status Bar Show Status Bar Dark Status Bar - Icons - Icon Size - Show Labels - Label Size - - Reset Custom Icons - All custom icons will be reset. Do you want to continue? - Text Color Light Dark - - Rounded Corners - Allow Overlap + Rounded Corners + Allow Overlap - Columns Rows Apply @@ -284,10 +278,10 @@ Preferences Show on Home Screen - At a Glance can be manually added by placing the "Lawnchair" widget. + At a Glance can be manually added to the home screen by placing the “Lawnchair” widget At a Glance Provider - Lawnchair + Lawnchair Google Google Search Smartspacer @@ -295,22 +289,22 @@ Show Dock + + Search Bar Search Bar Widget - Disabled - Lawnchair - Google Search Bar - Search Bar - Corner Radius - Apply Accent Color - Search Provider - Bottom Padding + Disabled + Lawnchair + Google Search Bar + Corner Radius + Apply Accent Color + Search Provider Grid - Dock Icons + Dock Icons + Bottom Padding - App Search Startpage Google @@ -327,58 +321,49 @@ %1$s & Lawnchair have a revenue share agreement.\n\nSearching with %1$s helps support Lawnchair. App Website - App required. + App required - - - Background Opacity - + + Background Opacity + Hidden Apps Show when Full Name is Typed Hide in Search Results Load Apps in Bulk - Load and display icons in bulk instead of individually loading and displaying icons + Load and display all icons at once instead of individually loading and displaying icons. Can fix issues with search but will increase loading time. Remember Position - Remember the position when you left off instead of the top + Remember app drawer position after leaving drawer Show Scrollbar Search - Show Search Bar - Automatically Show Keyboard - Fuzzy Search - Approximate matching for app searches. - Max Search Result Count - Max People Result Count - Max Files Result Count - Max Suggestion Result Count - Max Settings Entry Result Count - Max History Result Count - Max Web Suggestion Delay + Show Search Bar + Automatically Show Keyboard + Fuzzy Search + Approximate matching for app searches. + Clear Search History - Clear - - - - App Drawer Columns - Row Height - Horizontal Padding + App Drawer Columns + Row Height + Horizontal Padding Device Search Files Suggestions Web suggestions (via Startpage) Advanced Search - Search your contacts, files, and settings in app drawer search. + Search your phone’s contacts, files, and settings History - + + Max Search Result Count + Max People Result Count + Max Files Result Count + Max Suggestion Result Count + Max Settings Entry Result Count + Max History Result Count + Max Web Suggestion Delay Hidden Apps (%1$d) @@ -388,17 +373,13 @@ - - - Icon Background Opacity - Icon Background Color + Icon Background Opacity + Icon Background Color - Max. Folder Columns Max. Folder Rows - Double Tap Swipe Up Swipe Down @@ -417,25 +398,22 @@ Pick App - - These settings will be ignored as Lawnchair is not set as the Recents provider. Translucent Background Quick Actions - - Share - Lens - Clear All + Share + Lens + Clear All Force close Screen Corner Radius - Custom Screen Corner Radius - When you swipe up to open Recents, the current app follows your finger, shrinking into a card. Use this slider to adjust the corner radius of the card when it’s nearly full-screen such that it matches the corners of your screen. + Custom Screen Corner Radius + When you swipe up to open Recents, the current app follows your finger, shrinking into a card. Use this slider to adjust the corner radius of the card when it’s nearly full-screen such that it matches the corners of your screen. Taskbar - Enable Taskbar (Experimental) + Show Taskbar (Experimental) News @@ -452,11 +430,6 @@ Support & PR - - Acknowledgements Translate @@ -471,7 +444,7 @@ Search apps Home Settings - Item removed. + Item removed No apps found matching “%1$s”. Admin Permissions Required @@ -485,11 +458,11 @@ System Customize - Label - Hide from App Drawer + Label + Hide from App Drawer Suggestions - Show suggested apps at drawer top + Show suggested apps at the top of the app drawer %1$d%% @@ -557,14 +530,14 @@ Failed to restore backup. Invalid backup file. + Google %1$d × %2$d %s & %s System Settings + Unlock Lock - Lock/Unlock - Prevent selected app from clearing when using "Clear All" diff --git a/lawnchair/src/app/lawnchair/BlankActivity.kt b/lawnchair/src/app/lawnchair/BlankActivity.kt index ed252ce8ab4..a64f01cbbaf 100644 --- a/lawnchair/src/app/lawnchair/BlankActivity.kt +++ b/lawnchair/src/app/lawnchair/BlankActivity.kt @@ -12,9 +12,10 @@ import androidx.activity.result.ActivityResult import androidx.activity.result.contract.ActivityResultContracts import androidx.appcompat.app.AppCompatActivity import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.material.ModalBottomSheetDefaults import androidx.compose.material3.AlertDialog +import androidx.compose.material3.BottomSheetDefaults import androidx.compose.material3.Button +import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.OutlinedButton import androidx.compose.material3.Surface import androidx.compose.material3.Text @@ -33,6 +34,7 @@ class BlankActivity : AppCompatActivity() { private var firstResume = true private var targetStarted = false + @OptIn(ExperimentalMaterial3Api::class) override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) enableEdgeToEdge() @@ -44,7 +46,7 @@ class BlankActivity : AppCompatActivity() { LawnchairTheme { Surface( modifier = Modifier.fillMaxSize(), - color = ModalBottomSheetDefaults.scrimColor, + color = BottomSheetDefaults.ScrimColor, ) { AlertDialog( onDismissRequest = { if (!targetStarted) finish() }, diff --git a/lawnchair/src/app/lawnchair/LawnchairApp.kt b/lawnchair/src/app/lawnchair/LawnchairApp.kt index e75c407c0ff..8bd7f43e661 100644 --- a/lawnchair/src/app/lawnchair/LawnchairApp.kt +++ b/lawnchair/src/app/lawnchair/LawnchairApp.kt @@ -38,7 +38,7 @@ import androidx.compose.ui.unit.dp import androidx.core.content.FileProvider import app.lawnchair.backup.LawnchairBackup import app.lawnchair.preferences.PreferenceManager -import app.lawnchair.ui.AlertBottomSheetContent +import app.lawnchair.ui.ModalBottomSheetContent import app.lawnchair.ui.preferences.destinations.openAppInfo import app.lawnchair.util.restartLauncher import app.lawnchair.util.unsafeLazy @@ -211,7 +211,7 @@ class LawnchairApp : Application() { val launcher = this if (!lawnchairApp.isRecentsComponent || isRecentsEnabled) return ComposeBottomSheet.show(this) { - AlertBottomSheetContent( + ModalBottomSheetContent( title = { Text(text = stringResource(id = R.string.quickstep_incompatible)) }, text = { val description = stringResource( diff --git a/lawnchair/src/app/lawnchair/backup/ui/RestoreBackupScreen.kt b/lawnchair/src/app/lawnchair/backup/ui/RestoreBackupScreen.kt index dca0ab9b42b..071bb5367ae 100644 --- a/lawnchair/src/app/lawnchair/backup/ui/RestoreBackupScreen.kt +++ b/lawnchair/src/app/lawnchair/backup/ui/RestoreBackupScreen.kt @@ -16,8 +16,8 @@ import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.rememberScrollState -import androidx.compose.material.CircularProgressIndicator import androidx.compose.material3.Button +import androidx.compose.material3.CircularProgressIndicator import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable diff --git a/lawnchair/src/app/lawnchair/gestures/handlers/SleepGestureHandler.kt b/lawnchair/src/app/lawnchair/gestures/handlers/SleepGestureHandler.kt index d210f894758..99a34f54ed4 100644 --- a/lawnchair/src/app/lawnchair/gestures/handlers/SleepGestureHandler.kt +++ b/lawnchair/src/app/lawnchair/gestures/handlers/SleepGestureHandler.kt @@ -37,7 +37,7 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import app.lawnchair.LawnchairLauncher import app.lawnchair.lawnchairApp -import app.lawnchair.ui.AlertBottomSheetContent +import app.lawnchair.ui.ModalBottomSheetContent import app.lawnchair.util.requireSystemService import app.lawnchair.views.ComposeBottomSheet import com.android.launcher3.R @@ -136,7 +136,7 @@ fun ServiceWarningDialog( handleClose: () -> Unit, ) { val context = LocalContext.current - AlertBottomSheetContent( + ModalBottomSheetContent( title = { Text(text = stringResource(id = title)) }, text = { Text(text = stringResource(id = description)) }, buttons = { diff --git a/lawnchair/src/app/lawnchair/override/CustomizeDialog.kt b/lawnchair/src/app/lawnchair/override/CustomizeDialog.kt index a25c3a367ea..36273e1c02b 100644 --- a/lawnchair/src/app/lawnchair/override/CustomizeDialog.kt +++ b/lawnchair/src/app/lawnchair/override/CustomizeDialog.kt @@ -11,10 +11,10 @@ import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size -import androidx.compose.material.MaterialTheme -import androidx.compose.material.OutlinedTextField -import androidx.compose.material.Text -import androidx.compose.material.TextFieldDefaults +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.OutlinedTextField +import androidx.compose.material3.OutlinedTextFieldDefaults +import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.DisposableEffect import androidx.compose.runtime.getValue @@ -91,9 +91,9 @@ fun CustomizeDialog( } }, singleLine = true, - colors = TextFieldDefaults.outlinedTextFieldColors( - unfocusedBorderColor = MaterialTheme.colors.onSurface.copy(alpha = 0.12F), - textColor = MaterialTheme.colors.onSurface, + colors = OutlinedTextFieldDefaults.colors( + unfocusedContainerColor = MaterialTheme.colorScheme.surface, + focusedTextColor = MaterialTheme.colorScheme.onSurface, ), shape = MaterialTheme.shapes.large, label = { Text(text = stringResource(id = R.string.label)) }, diff --git a/lawnchair/src/app/lawnchair/theme/ColorSchemeUtils.kt b/lawnchair/src/app/lawnchair/theme/ColorSchemeUtils.kt index 8801fb674cf..2c4fe014025 100644 --- a/lawnchair/src/app/lawnchair/theme/ColorSchemeUtils.kt +++ b/lawnchair/src/app/lawnchair/theme/ColorSchemeUtils.kt @@ -1,91 +1,69 @@ package app.lawnchair.theme -import androidx.compose.material.Colors -import androidx.compose.material3.ColorScheme as M3ColorScheme +import androidx.compose.material3.ColorScheme import androidx.compose.material3.darkColorScheme import androidx.compose.material3.lightColorScheme import androidx.compose.runtime.Composable import androidx.compose.runtime.remember -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.graphics.compositeOver -import androidx.compose.ui.unit.Dp -import androidx.compose.ui.unit.dp -import dev.kdrag0n.monet.theme.ColorScheme -import kotlin.math.ln @Composable -fun m3ColorScheme(colorScheme: ColorScheme, isDark: Boolean) = remember(colorScheme, isDark) { - when (isDark) { - false -> lightColorScheme( - primary = colorScheme.primary(40), - onPrimary = colorScheme.primary(100), - primaryContainer = colorScheme.primary(90), - onPrimaryContainer = colorScheme.primary(10), - inversePrimary = colorScheme.primary(80), - secondary = colorScheme.secondary(40), - onSecondary = colorScheme.secondary(100), - secondaryContainer = colorScheme.secondary(90), - onSecondaryContainer = colorScheme.secondary(10), - tertiaryContainer = colorScheme.tertiary(90), - onTertiaryContainer = colorScheme.tertiary(10), - background = colorScheme.neutral(99), - onBackground = colorScheme.neutral(10), - surface = colorScheme.neutral(99), - onSurface = colorScheme.neutral(10), - surfaceVariant = colorScheme.neutralVariant(90), - onSurfaceVariant = colorScheme.neutralVariant(30), - inverseSurface = colorScheme.neutral(20), - inverseOnSurface = colorScheme.neutral(95), - outline = colorScheme.neutralVariant(50), +fun dev.kdrag0n.monet.theme.ColorScheme.toM3ColorScheme(isDark: Boolean): ColorScheme = remember(this, isDark) { + if (isDark) { + darkColorScheme( + primary = primary(80), + onPrimary = primary(20), + primaryContainer = primary(30), + onPrimaryContainer = primary(90), + inversePrimary = primary(40), + secondary = secondary(80), + onSecondary = secondary(20), + secondaryContainer = secondary(30), + onSecondaryContainer = secondary(90), + tertiary = tertiary(80), + onTertiary = tertiary(20), + background = neutral(10), + onBackground = neutral(90), + surface = neutral(10), + onSurface = neutral(90), + surfaceVariant = neutralVariant(30), + onSurfaceVariant = neutralVariant(80), + inverseSurface = neutral(90), + inverseOnSurface = neutral(20), + outline = neutralVariant(60), + outlineVariant = neutralVariant(30), + scrim = neutral(0), + surfaceContainer = neutral(20), + surfaceContainerLow = neutral(20), + surfaceContainerHighest = neutral(30), ) - true -> darkColorScheme( - primary = colorScheme.primary(80), - onPrimary = colorScheme.primary(20), - primaryContainer = colorScheme.primary(30), - onPrimaryContainer = colorScheme.primary(90), - inversePrimary = colorScheme.primary(40), - secondary = colorScheme.secondary(80), - onSecondary = colorScheme.secondary(20), - secondaryContainer = colorScheme.secondary(30), - onSecondaryContainer = colorScheme.secondary(90), - tertiaryContainer = colorScheme.tertiary(30), - onTertiaryContainer = colorScheme.tertiary(90), - background = colorScheme.neutral(10), - onBackground = colorScheme.neutral(90), - surface = colorScheme.neutral(10), - onSurface = colorScheme.neutral(90), - surfaceVariant = colorScheme.neutralVariant(30), - onSurfaceVariant = colorScheme.neutralVariant(80), - inverseSurface = colorScheme.neutral(90), - inverseOnSurface = colorScheme.neutral(20), - outline = colorScheme.neutralVariant(60), + } else { + lightColorScheme( + primary = primary(40), + onPrimary = primary(100), + primaryContainer = primary(90), + onPrimaryContainer = primary(10), + inversePrimary = primary(80), + secondary = secondary(40), + onSecondary = secondary(100), + secondaryContainer = secondary(90), + onSecondaryContainer = secondary(10), + tertiaryContainer = tertiary(90), + onTertiaryContainer = tertiary(10), + background = neutral(99), + onBackground = neutral(10), + surface = neutral(99), + onSurface = neutral(10), + surfaceVariant = neutralVariant(90), + onSurfaceVariant = neutralVariant(30), + inverseSurface = neutral(20), + inverseOnSurface = neutral(95), + outline = neutralVariant(50), + outlineVariant = neutralVariant(80), + scrim = neutral(0), + // Temporary colors until we fully migrate to material-color-utilities + surfaceContainer = neutral(90), + surfaceContainerLow = neutral(95), + surfaceContainerHighest = neutral(90), ) } } - -internal fun M3ColorScheme.surfaceColorAtElevation( - elevation: Dp, -): Color { - if (elevation == 0.dp) return surface - val alpha = ((4.5f * ln(elevation.value + 1)) + 2f) / 100f - return primary.copy(alpha = alpha).compositeOver(surface) -} - -@Composable -fun materialColors(colorScheme: M3ColorScheme, isDark: Boolean) = remember(colorScheme, isDark) { - Colors( - primary = colorScheme.primary, - primaryVariant = colorScheme.primaryContainer, - secondary = colorScheme.primary, - secondaryVariant = colorScheme.primaryContainer, - background = colorScheme.background, - surface = colorScheme.surfaceColorAtElevation(1.dp), - error = colorScheme.error, - onPrimary = colorScheme.onPrimary, - onSecondary = colorScheme.onSecondary, - onBackground = colorScheme.onBackground, - onSurface = colorScheme.onSurface, - onError = colorScheme.onError, - isLight = !isDark, - ) -} diff --git a/lawnchair/src/app/lawnchair/ui/AlertBottomSheetContent.kt b/lawnchair/src/app/lawnchair/ui/AlertBottomSheetContent.kt index 1ba1275e433..66f94157a21 100644 --- a/lawnchair/src/app/lawnchair/ui/AlertBottomSheetContent.kt +++ b/lawnchair/src/app/lawnchair/ui/AlertBottomSheetContent.kt @@ -7,18 +7,14 @@ import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.RowScope import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding -import androidx.compose.material.ContentAlpha -import androidx.compose.material.LocalContentAlpha import androidx.compose.material3.MaterialTheme import androidx.compose.material3.ProvideTextStyle import androidx.compose.runtime.Composable -import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp -import app.lawnchair.util.navigationBarsOrDisplayCutoutPadding @Composable -fun AlertBottomSheetContent( +fun ModalBottomSheetContent( buttons: @Composable RowScope.() -> Unit, modifier: Modifier = Modifier, title: (@Composable () -> Unit)? = null, @@ -29,25 +25,26 @@ fun AlertBottomSheetContent( Column( modifier = modifier - .navigationBarsOrDisplayCutoutPadding() .fillMaxWidth(), ) { - if (title != null) { - Box(modifier = contentPadding) { - CompositionLocalProvider(LocalContentAlpha provides ContentAlpha.high) { - val textStyle = MaterialTheme.typography.titleLarge - ProvideTextStyle(textStyle, title) - } + title?.let { + Box(modifier = Modifier.padding(start = 16.dp, end = 16.dp)) { + val textStyle = MaterialTheme.typography.titleLarge + ProvideTextStyle(textStyle, title) } } - if (text != null) { + text?.let { Box(modifier = contentPadding) { val textStyle = MaterialTheme.typography.bodyMedium ProvideTextStyle(textStyle, text) } } - if (content != null) { - Box(modifier = Modifier.padding(top = if (title != null || text != null) 16.dp else 0.dp)) { + content?.let { + Box( + modifier = Modifier.padding( + top = if (title != null || text != null) 16.dp else 0.dp, + ), + ) { content() } } diff --git a/lawnchair/src/app/lawnchair/ui/OverflowMenu.kt b/lawnchair/src/app/lawnchair/ui/OverflowMenu.kt index 97195c03329..fa3d0f9f101 100644 --- a/lawnchair/src/app/lawnchair/ui/OverflowMenu.kt +++ b/lawnchair/src/app/lawnchair/ui/OverflowMenu.kt @@ -1,9 +1,9 @@ package app.lawnchair.ui import androidx.compose.foundation.layout.Box -import androidx.compose.material.DropdownMenu import androidx.compose.material.icons.Icons import androidx.compose.material.icons.rounded.MoreVert +import androidx.compose.material3.DropdownMenu import androidx.compose.runtime.Composable import androidx.compose.runtime.MutableState import androidx.compose.runtime.mutableStateOf diff --git a/lawnchair/src/app/lawnchair/ui/TouchTarget.kt b/lawnchair/src/app/lawnchair/ui/TouchTarget.kt deleted file mode 100644 index ec5838668a2..00000000000 --- a/lawnchair/src/app/lawnchair/ui/TouchTarget.kt +++ /dev/null @@ -1,95 +0,0 @@ -/* - * Copyright 2021 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package app.lawnchair.ui - -import androidx.compose.material.Button -import androidx.compose.material.ExperimentalMaterialApi -import androidx.compose.runtime.ProvidableCompositionLocal -import androidx.compose.runtime.staticCompositionLocalOf -import androidx.compose.ui.Modifier -import androidx.compose.ui.composed -import androidx.compose.ui.layout.LayoutModifier -import androidx.compose.ui.layout.Measurable -import androidx.compose.ui.layout.MeasureResult -import androidx.compose.ui.layout.MeasureScope -import androidx.compose.ui.platform.LocalViewConfiguration -import androidx.compose.ui.platform.debugInspectorInfo -import androidx.compose.ui.unit.Constraints -import androidx.compose.ui.unit.DpSize -import kotlin.math.roundToInt - -@OptIn(ExperimentalMaterialApi::class) -@Suppress("ModifierInspectorInfo") -internal fun Modifier.minimumTouchTargetSize(): Modifier = composed( - inspectorInfo = debugInspectorInfo { - name = "minimumTouchTargetSize" - // TODO: b/214589635 - surface this information through the layout inspector in a better way - // - for now just add some information to help developers debug what this size represents. - properties["README"] = "Adds outer padding to measure at least 48.dp (default) in " + - "size to disambiguate touch interactions if the element would measure smaller" - }, -) { - if (LocalMinimumTouchTargetEnforcement.current) { - // TODO: consider using a hardcoded value of 48.dp instead to avoid inconsistent UI if the - // LocalViewConfiguration changes across devices / during runtime. - val size = LocalViewConfiguration.current.minimumTouchTargetSize - MinimumTouchTargetModifier(size) - } else { - Modifier - } -} - -/** - * CompositionLocal that configures whether Material components that have a visual size that is - * lower than the minimum touch target size for accessibility (such as [Button]) will include - * extra space outside the component to ensure that they are accessible. If set to false there - * will be no extra space, and so it is possible that if the component is placed near the edge of - * a layout / near to another component without any padding, there will not be enough space for - * an accessible touch target. - */ -@Suppress("OPT_IN_MARKER_ON_WRONG_TARGET") -@ExperimentalMaterialApi -val LocalMinimumTouchTargetEnforcement: ProvidableCompositionLocal = - staticCompositionLocalOf { true } - -private class MinimumTouchTargetModifier(val size: DpSize) : LayoutModifier { - override fun MeasureScope.measure( - measurable: Measurable, - constraints: Constraints, - ): MeasureResult { - val placeable = measurable.measure(constraints) - - // Be at least as big as the minimum dimension in both dimensions - val width = maxOf(placeable.width, size.width.roundToPx()) - val height = maxOf(placeable.height, size.height.roundToPx()) - - return layout(width, height) { - val centerX = ((width - placeable.width) / 2f).roundToInt() - val centerY = ((height - placeable.height) / 2f).roundToInt() - placeable.place(centerX, centerY) - } - } - - override fun equals(other: Any?): Boolean { - val otherModifier = other as? MinimumTouchTargetModifier ?: return false - return size == otherModifier.size - } - - override fun hashCode(): Int { - return size.hashCode() - } -} diff --git a/lawnchair/src/app/lawnchair/ui/placeholder/Placeholder.kt b/lawnchair/src/app/lawnchair/ui/placeholder/Placeholder.kt index 4e64aaaef3d..e5191fae5ff 100644 --- a/lawnchair/src/app/lawnchair/ui/placeholder/Placeholder.kt +++ b/lawnchair/src/app/lawnchair/ui/placeholder/Placeholder.kt @@ -24,9 +24,11 @@ import androidx.compose.animation.core.Transition import androidx.compose.animation.core.animateFloat import androidx.compose.animation.core.infiniteRepeatable import androidx.compose.animation.core.rememberInfiniteTransition +import androidx.compose.animation.core.rememberTransition import androidx.compose.animation.core.spring import androidx.compose.animation.core.tween -import androidx.compose.animation.core.updateTransition +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.contentColorFor import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableFloatStateOf @@ -42,6 +44,7 @@ import androidx.compose.ui.graphics.Outline import androidx.compose.ui.graphics.Paint import androidx.compose.ui.graphics.RectangleShape import androidx.compose.ui.graphics.Shape +import androidx.compose.ui.graphics.compositeOver import androidx.compose.ui.graphics.drawOutline import androidx.compose.ui.graphics.drawscope.DrawScope import androidx.compose.ui.graphics.drawscope.drawIntoCanvas @@ -100,10 +103,13 @@ object PlaceholderDefaults { * @param contentFadeTransitionSpec The transition spec to use when fading the content * on/off screen. The boolean parameter defined for the transition is [visible]. */ +// TODO: need to migrate to Modifier.Node, see https://mrmans0n.github.io/compose-rules/rules/#avoid-modifier-extension-factory-functions +@Suppress("ktlint:compose:modifier-composable-check") +@Composable fun Modifier.placeholder( visible: Boolean, - color: Color, - shape: Shape = RectangleShape, + color: Color = color(), + shape: Shape = MaterialTheme.shapes.small, highlight: PlaceholderHighlight? = null, placeholderFadeTransitionSpec: @Composable Transition.Segment.() -> FiniteAnimationSpec = { spring() }, contentFadeTransitionSpec: @Composable Transition.Segment.() -> FiniteAnimationSpec = { spring() }, @@ -129,7 +135,7 @@ fun Modifier.placeholder( val transitionState = remember { MutableTransitionState(visible) }.apply { targetState = visible } - val transition = updateTransition(transitionState, "placeholder_crossfade") + val transition = rememberTransition(transitionState, "placeholder_crossfade") val placeholderAlpha by transition.animateFloat( transitionSpec = placeholderFadeTransitionSpec, @@ -207,6 +213,22 @@ fun Modifier.placeholder( } } +/** + * Returns the value used as the the `color` parameter value on [Modifier.placeholder]. + * + * @param backgroundColor The current background color of the layout. Defaults to + * `MaterialTheme.colors.surface`. + * @param contentColor The content color to be used on top of [backgroundColor]. + * @param contentAlpha The alpha component to set on [contentColor] when compositing the color + * on top of [backgroundColor]. Defaults to `0.1f`. + */ +@Composable +private fun color( + backgroundColor: Color = MaterialTheme.colorScheme.surface, + contentColor: Color = contentColorFor(backgroundColor), + contentAlpha: Float = 0.1f, +): Color = contentColor.copy(contentAlpha).compositeOver(backgroundColor) + private fun DrawScope.drawPlaceholder( shape: Shape, color: Color, diff --git a/lawnchair/src/app/lawnchair/ui/placeholder/PlaceholderHighlight.kt b/lawnchair/src/app/lawnchair/ui/placeholder/PlaceholderHighlight.kt index 12dcf6a8f8e..fdc560feddc 100644 --- a/lawnchair/src/app/lawnchair/ui/placeholder/PlaceholderHighlight.kt +++ b/lawnchair/src/app/lawnchair/ui/placeholder/PlaceholderHighlight.kt @@ -19,6 +19,8 @@ package app.lawnchair.ui.placeholder import androidx.annotation.FloatRange import androidx.compose.animation.core.AnimationSpec import androidx.compose.animation.core.InfiniteRepeatableSpec +import androidx.compose.material3.MaterialTheme +import androidx.compose.runtime.Composable import androidx.compose.runtime.Stable import androidx.compose.ui.geometry.Offset import androidx.compose.ui.geometry.Size @@ -66,8 +68,9 @@ interface PlaceholderHighlight { * @param highlightColor the color of the highlight which is faded in/out. * @param animationSpec the [AnimationSpec] to configure the animation. */ +@Composable fun PlaceholderHighlight.Companion.fade( - highlightColor: Color, + highlightColor: Color = fadeHighlightColor(), animationSpec: InfiniteRepeatableSpec = PlaceholderDefaults.fadeAnimationSpec, ): PlaceholderHighlight = Fade( highlightColor = highlightColor, @@ -96,6 +99,20 @@ fun PlaceholderHighlight.Companion.shimmer( progressForMaxAlpha = progressForMaxAlpha, ) +/** + * Returns the value used as the the `highlightColor` parameter value of + * [PlaceholderHighlight.Companion.fade]. + * + * @param backgroundColor The current background color of the layout. Defaults to + * `MaterialTheme.colors.surface`. + * @param alpha The alpha component to set on [backgroundColor]. Defaults to `0.3f`. + */ +@Composable +fun fadeHighlightColor( + backgroundColor: Color = MaterialTheme.colorScheme.surface, + alpha: Float = 0.3f, +): Color = backgroundColor.copy(alpha = alpha) + private data class Fade( private val highlightColor: Color, override val animationSpec: InfiniteRepeatableSpec, diff --git a/lawnchair/src/app/lawnchair/ui/placeholder/material/Placeholder.kt b/lawnchair/src/app/lawnchair/ui/placeholder/material/Placeholder.kt deleted file mode 100644 index 14f75e3daad..00000000000 --- a/lawnchair/src/app/lawnchair/ui/placeholder/material/Placeholder.kt +++ /dev/null @@ -1,125 +0,0 @@ -/* - * Copyright 2021 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package app.lawnchair.ui.placeholder.material - -import androidx.compose.animation.core.FiniteAnimationSpec -import androidx.compose.animation.core.Transition -import androidx.compose.animation.core.spring -import androidx.compose.material.MaterialTheme -import androidx.compose.material.contentColorFor -import androidx.compose.runtime.Composable -import androidx.compose.ui.Modifier -import androidx.compose.ui.composed -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.graphics.Shape -import androidx.compose.ui.graphics.compositeOver -import androidx.compose.ui.graphics.isSpecified -import app.lawnchair.ui.placeholder.PlaceholderDefaults -import app.lawnchair.ui.placeholder.PlaceholderHighlight -import app.lawnchair.ui.placeholder.placeholder - -/** - * Returns the value used as the the `color` parameter value on [Modifier.placeholder]. - * - * @param backgroundColor The current background color of the layout. Defaults to - * `MaterialTheme.colors.surface`. - * @param contentColor The content color to be used on top of [backgroundColor]. - * @param contentAlpha The alpha component to set on [contentColor] when compositing the color - * on top of [backgroundColor]. Defaults to `0.1f`. - */ -@Composable -fun PlaceholderDefaults.color( - backgroundColor: Color = MaterialTheme.colors.surface, - contentColor: Color = contentColorFor(backgroundColor), - contentAlpha: Float = 0.1f, -): Color = contentColor.copy(contentAlpha).compositeOver(backgroundColor) - -/** - * Returns the value used as the the `highlightColor` parameter value of - * [PlaceholderHighlight.Companion.fade]. - * - * @param backgroundColor The current background color of the layout. Defaults to - * `MaterialTheme.colors.surface`. - * @param alpha The alpha component to set on [backgroundColor]. Defaults to `0.3f`. - */ -@Composable -fun PlaceholderDefaults.fadeHighlightColor( - backgroundColor: Color = MaterialTheme.colors.surface, - alpha: Float = 0.3f, -): Color = backgroundColor.copy(alpha = alpha) - -/** - * Returns the value used as the the `highlightColor` parameter value of - * [PlaceholderHighlight.Companion.shimmer]. - * - * @param backgroundColor The current background color of the layout. Defaults to - * `MaterialTheme.colors.surface`. - * @param alpha The alpha component to set on [backgroundColor]. Defaults to `0.75f`. - */ -@Composable -fun PlaceholderDefaults.shimmerHighlightColor( - backgroundColor: Color = MaterialTheme.colors.surface, - alpha: Float = 0.75f, -): Color { - return backgroundColor.copy(alpha = alpha) -} - -/** - * Draws some skeleton UI which is typically used whilst content is 'loading'. - * - * To customize the color and shape of the placeholder, you can use the foundation version of - * [Modifier.placeholder], along with the values provided by [PlaceholderDefaults]. - * - * A cross-fade transition will be applied to the content and placeholder UI when the [visible] - * value changes. The transition can be customized via the [contentFadeTransitionSpec] and - * [placeholderFadeTransitionSpec] parameters. - * - * You can provide a [PlaceholderHighlight] which runs an highlight animation on the placeholder. - * The [shimmer] and [fade] implementations are provided for easy usage. - * - * You can find more information on the pattern at the Material Theming - * [Placeholder UI](https://material.io/design/communication/launch-screen.html#placeholder-ui) - * guidelines. - * - * @param visible whether the placeholder should be visible or not. - * @param color the color used to draw the placeholder UI. If [Color.Unspecified] is provided, - * the placeholder will use [PlaceholderDefaults.color]. - * @param shape desired shape of the placeholder. If null is provided the placeholder - * will use the small shape set in [MaterialTheme.shapes]. - * @param highlight optional highlight animation. - * @param placeholderFadeTransitionSpec The transition spec to use when fading the placeholder - * on/off screen. The boolean parameter defined for the transition is [visible]. - * @param contentFadeTransitionSpec The transition spec to use when fading the content - * on/off screen. The boolean parameter defined for the transition is [visible]. - */ -fun Modifier.placeholder( - visible: Boolean, - color: Color = Color.Unspecified, - shape: Shape? = null, - highlight: PlaceholderHighlight? = null, - placeholderFadeTransitionSpec: @Composable Transition.Segment.() -> FiniteAnimationSpec = { spring() }, - contentFadeTransitionSpec: @Composable Transition.Segment.() -> FiniteAnimationSpec = { spring() }, -): Modifier = composed { - Modifier.placeholder( - visible = visible, - color = if (color.isSpecified) color else PlaceholderDefaults.color(), - shape = shape ?: MaterialTheme.shapes.small, - highlight = highlight, - placeholderFadeTransitionSpec = placeholderFadeTransitionSpec, - contentFadeTransitionSpec = contentFadeTransitionSpec, - ) -} diff --git a/lawnchair/src/app/lawnchair/ui/placeholder/material/PlaceholderHighlight.kt b/lawnchair/src/app/lawnchair/ui/placeholder/material/PlaceholderHighlight.kt deleted file mode 100644 index 810979958b0..00000000000 --- a/lawnchair/src/app/lawnchair/ui/placeholder/material/PlaceholderHighlight.kt +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Copyright 2021 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package app.lawnchair.ui.placeholder.material - -import androidx.annotation.FloatRange -import androidx.compose.animation.core.AnimationSpec -import androidx.compose.animation.core.InfiniteRepeatableSpec -import androidx.compose.runtime.Composable -import app.lawnchair.ui.placeholder.PlaceholderDefaults -import app.lawnchair.ui.placeholder.PlaceholderHighlight -import app.lawnchair.ui.placeholder.fade -import app.lawnchair.ui.placeholder.shimmer - -/** - * Creates a [PlaceholderHighlight] which fades in an appropriate color, using the - * given [animationSpec]. - * - * @param animationSpec the [AnimationSpec] to configure the animation. - */ -@Composable -fun PlaceholderHighlight.Companion.fade( - animationSpec: InfiniteRepeatableSpec = PlaceholderDefaults.fadeAnimationSpec, -): PlaceholderHighlight = PlaceholderHighlight.fade( - highlightColor = PlaceholderDefaults.fadeHighlightColor(), - animationSpec = animationSpec, -) - -/** - * Creates a [PlaceholderHighlight] which 'shimmers', using a default color. - * - * The highlight starts at the top-start, and then grows to the bottom-end during the animation. - * During that time it is also faded in, from 0f..progressForMaxAlpha, and then faded out from - * progressForMaxAlpha..1f. - * - * @param animationSpec the [AnimationSpec] to configure the animation. - * @param progressForMaxAlpha The progress where the shimmer should be at it's peak opacity. - * Defaults to 0.6f. - */ -@Composable -fun PlaceholderHighlight.Companion.shimmer( - animationSpec: InfiniteRepeatableSpec = PlaceholderDefaults.shimmerAnimationSpec, - @FloatRange(from = 0.0, to = 1.0) progressForMaxAlpha: Float = 0.6f, -): PlaceholderHighlight = PlaceholderHighlight.shimmer( - highlightColor = PlaceholderDefaults.shimmerHighlightColor(), - animationSpec = animationSpec, - progressForMaxAlpha = progressForMaxAlpha, -) diff --git a/lawnchair/src/app/lawnchair/ui/preferences/PreferenceActivity.kt b/lawnchair/src/app/lawnchair/ui/preferences/PreferenceActivity.kt index ccbdabe9900..7c1477b3199 100644 --- a/lawnchair/src/app/lawnchair/ui/preferences/PreferenceActivity.kt +++ b/lawnchair/src/app/lawnchair/ui/preferences/PreferenceActivity.kt @@ -18,20 +18,44 @@ package app.lawnchair.ui.preferences import android.content.Context import android.content.Intent +import android.graphics.Color import android.os.Bundle +import androidx.activity.SystemBarStyle import androidx.activity.compose.setContent import androidx.activity.enableEdgeToEdge import androidx.appcompat.app.AppCompatActivity +import androidx.compose.material3.windowsizeclass.ExperimentalMaterial3WindowSizeClassApi +import androidx.compose.material3.windowsizeclass.calculateWindowSizeClass +import androidx.compose.runtime.DisposableEffect import androidx.core.net.toUri import app.lawnchair.ui.theme.LawnchairTheme +import app.lawnchair.ui.theme.isSelectedThemeDark class PreferenceActivity : AppCompatActivity() { + @OptIn(ExperimentalMaterial3WindowSizeClassApi::class) override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) enableEdgeToEdge() setContent { + val windowSizeClass = calculateWindowSizeClass(this) + val darkTheme = isSelectedThemeDark + + DisposableEffect(darkTheme) { + enableEdgeToEdge( + statusBarStyle = SystemBarStyle.auto( + Color.TRANSPARENT, + Color.TRANSPARENT, + ) { darkTheme }, + navigationBarStyle = SystemBarStyle.auto( + lightScrim, + darkScrim, + ) { darkTheme }, + ) + onDispose {} + } + LawnchairTheme { - Preferences() + Preferences(windowSizeClass) } } } @@ -44,3 +68,15 @@ class PreferenceActivity : AppCompatActivity() { } } } + +/** + * The default light scrim, as defined by androidx and the platform: + * https://cs.android.com/androidx/platform/frameworks/support/+/androidx-main:activity/activity/src/main/java/androidx/activity/EdgeToEdge.kt;l=35-38;drc=27e7d52e8604a080133e8b842db10c89b4482598 + */ +private val lightScrim = Color.argb(0xe6, 0xFF, 0xFF, 0xFF) + +/** + * The default dark scrim, as defined by androidx and the platform: + * https://cs.android.com/androidx/platform/frameworks/support/+/androidx-main:activity/activity/src/main/java/androidx/activity/EdgeToEdge.kt;l=40-44;drc=27e7d52e8604a080133e8b842db10c89b4482598 + */ +private val darkScrim = Color.argb(0x80, 0x1b, 0x1b, 0x1b) diff --git a/lawnchair/src/app/lawnchair/ui/preferences/Preferences.kt b/lawnchair/src/app/lawnchair/ui/preferences/Preferences.kt index 92ca402cef0..c34210dd065 100644 --- a/lawnchair/src/app/lawnchair/ui/preferences/Preferences.kt +++ b/lawnchair/src/app/lawnchair/ui/preferences/Preferences.kt @@ -17,8 +17,11 @@ package app.lawnchair.ui.preferences import androidx.compose.material3.Surface +import androidx.compose.material3.windowsizeclass.WindowSizeClass +import androidx.compose.material3.windowsizeclass.WindowWidthSizeClass import androidx.compose.runtime.Composable import androidx.compose.runtime.CompositionLocalProvider +import androidx.compose.runtime.compositionLocalOf import androidx.compose.runtime.staticCompositionLocalOf import androidx.compose.ui.platform.LocalLayoutDirection import androidx.compose.ui.unit.LayoutDirection @@ -84,13 +87,16 @@ val LocalPreferenceInteractor = staticCompositionLocalOf { @Composable fun Preferences( + windowSizeClass: WindowSizeClass, interactor: PreferenceInteractor = viewModel(), ) { val navController = rememberNavController() val isRtl = LocalLayoutDirection.current == LayoutDirection.Rtl val slideDistance = rememberSlideDistance() - Providers { + val isExpandedScreen = windowSizeClass.widthSizeClass == WindowWidthSizeClass.Expanded + + Providers(isExpandedScreen) { Surface { CompositionLocalProvider( LocalNavController provides navController, @@ -133,11 +139,16 @@ fun Preferences( @Composable private fun Providers( + isExpandedScreen: Boolean = false, content: @Composable () -> Unit, ) { - ProvideLifecycleState { - ProvideBottomSheetHandler { - content() + CompositionLocalProvider(LocalIsExpandedScreen provides isExpandedScreen) { + ProvideLifecycleState { + ProvideBottomSheetHandler { + content() + } } } } + +val LocalIsExpandedScreen = compositionLocalOf { false } diff --git a/lawnchair/src/app/lawnchair/ui/preferences/about/About.kt b/lawnchair/src/app/lawnchair/ui/preferences/about/About.kt index 0708094f158..f76f8dd738a 100644 --- a/lawnchair/src/app/lawnchair/ui/preferences/about/About.kt +++ b/lawnchair/src/app/lawnchair/ui/preferences/about/About.kt @@ -32,8 +32,6 @@ import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.requiredHeight import androidx.compose.foundation.layout.size import androidx.compose.foundation.shape.CircleShape -import androidx.compose.material.ContentAlpha -import androidx.compose.material3.LocalContentColor import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable @@ -245,7 +243,7 @@ fun About() { Text( text = BuildConfig.VERSION_DISPLAY_NAME, style = MaterialTheme.typography.bodyLarge, - color = LocalContentColor.current.copy(alpha = ContentAlpha.medium), + color = MaterialTheme.colorScheme.onSurfaceVariant, modifier = Modifier.combinedClickable( onClick = {}, onLongClick = { diff --git a/lawnchair/src/app/lawnchair/ui/preferences/about/ContributorRow.kt b/lawnchair/src/app/lawnchair/ui/preferences/about/ContributorRow.kt index 4886d20c524..eb18fa0810a 100644 --- a/lawnchair/src/app/lawnchair/ui/preferences/about/ContributorRow.kt +++ b/lawnchair/src/app/lawnchair/ui/preferences/about/ContributorRow.kt @@ -31,10 +31,9 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.unit.dp -import app.lawnchair.theme.surfaceColorAtElevation import app.lawnchair.ui.placeholder.PlaceholderHighlight -import app.lawnchair.ui.placeholder.material.fade -import app.lawnchair.ui.placeholder.material.placeholder +import app.lawnchair.ui.placeholder.fade +import app.lawnchair.ui.placeholder.placeholder import app.lawnchair.ui.preferences.components.layout.PreferenceTemplate import coil.compose.SubcomposeAsyncImage @@ -65,7 +64,7 @@ fun ContributorRow( modifier = Modifier .clip(CircleShape) .size(32.dp) - .background(MaterialTheme.colorScheme.surfaceColorAtElevation(3.dp)), + .background(MaterialTheme.colorScheme.surfaceContainer), loading = { Box( modifier = Modifier diff --git a/lawnchair/src/app/lawnchair/ui/preferences/about/LawnchairLink.kt b/lawnchair/src/app/lawnchair/ui/preferences/about/LawnchairLink.kt index c84f24ea427..4998f1c2ae8 100644 --- a/lawnchair/src/app/lawnchair/ui/preferences/about/LawnchairLink.kt +++ b/lawnchair/src/app/lawnchair/ui/preferences/about/LawnchairLink.kt @@ -27,9 +27,8 @@ import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.requiredHeight import androidx.compose.foundation.layout.size -import androidx.compose.material.MaterialTheme import androidx.compose.material3.LocalContentColor -import androidx.compose.material3.MaterialTheme as Material3Theme +import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment @@ -73,7 +72,7 @@ fun LawnchairLink( Spacer(modifier = Modifier.requiredHeight(4.dp)) Text( text = label, - style = Material3Theme.typography.bodyMedium, + style = MaterialTheme.typography.bodyMedium, maxLines = 1, overflow = TextOverflow.Ellipsis, ) diff --git a/lawnchair/src/app/lawnchair/ui/preferences/components/AnnouncementPreference.kt b/lawnchair/src/app/lawnchair/ui/preferences/components/AnnouncementPreference.kt index 934b8c86149..918431bd870 100644 --- a/lawnchair/src/app/lawnchair/ui/preferences/components/AnnouncementPreference.kt +++ b/lawnchair/src/app/lawnchair/ui/preferences/components/AnnouncementPreference.kt @@ -62,19 +62,20 @@ fun AnnouncementPreference( announcements: ImmutableList, ) { Column { - announcements.forEach { announcement -> - AnnouncementItem(announcement) - Spacer(modifier = Modifier.height(16.dp)) + announcements.forEachIndexed { index, announcement -> + var show by remember { mutableStateOf(true) } + AnnouncementItem(show, { show = false }, announcement) + if (index != announcements.lastIndex && show) Spacer(modifier = Modifier.height(16.dp)) } } } @Composable private fun AnnouncementItem( + show: Boolean, + onClose: () -> Unit, announcement: Announcement, ) { - var show by remember { mutableStateOf(true) } - ExpandAndShrink( visible = show && announcement.active && announcement.text.isNotBlank() && @@ -83,7 +84,7 @@ private fun AnnouncementItem( AnnouncementItemContent( text = announcement.text, url = announcement.url, - onClose = { show = false }, + onClose = onClose, ) } } diff --git a/lawnchair/src/app/lawnchair/ui/preferences/components/AppItem.kt b/lawnchair/src/app/lawnchair/ui/preferences/components/AppItem.kt index 838590d125c..bb9336caaa5 100644 --- a/lawnchair/src/app/lawnchair/ui/preferences/components/AppItem.kt +++ b/lawnchair/src/app/lawnchair/ui/preferences/components/AppItem.kt @@ -30,8 +30,8 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.asImageBitmap import androidx.compose.ui.unit.dp import app.lawnchair.ui.placeholder.PlaceholderHighlight -import app.lawnchair.ui.placeholder.material.fade -import app.lawnchair.ui.placeholder.material.placeholder +import app.lawnchair.ui.placeholder.fade +import app.lawnchair.ui.placeholder.placeholder import app.lawnchair.ui.preferences.components.layout.PreferenceTemplate import app.lawnchair.util.App diff --git a/lawnchair/src/app/lawnchair/ui/preferences/components/GestureHandlerPreference.kt b/lawnchair/src/app/lawnchair/ui/preferences/components/GestureHandlerPreference.kt index 3ae3af95877..99853aac9a7 100644 --- a/lawnchair/src/app/lawnchair/ui/preferences/components/GestureHandlerPreference.kt +++ b/lawnchair/src/app/lawnchair/ui/preferences/components/GestureHandlerPreference.kt @@ -1,12 +1,12 @@ package app.lawnchair.ui.preferences.components -import android.R +import android.R as AndroidR import android.app.Activity import androidx.compose.foundation.clickable import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.itemsIndexed -import androidx.compose.material.RadioButton import androidx.compose.material3.OutlinedButton +import androidx.compose.material3.RadioButton import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.rememberCoroutineScope @@ -17,7 +17,7 @@ import androidx.compose.ui.unit.dp import app.lawnchair.gestures.config.GestureHandlerConfig import app.lawnchair.gestures.config.GestureHandlerOption import app.lawnchair.preferences.PreferenceAdapter -import app.lawnchair.ui.AlertBottomSheetContent +import app.lawnchair.ui.ModalBottomSheetContent import app.lawnchair.ui.preferences.components.layout.PreferenceDivider import app.lawnchair.ui.preferences.components.layout.PreferenceTemplate import app.lawnchair.ui.util.LocalBottomSheetHandler @@ -56,11 +56,11 @@ fun GestureHandlerPreference( description = { Text(text = currentConfig.getLabel(context)) }, modifier = Modifier.clickable { bottomSheetHandler.show { - AlertBottomSheetContent( + ModalBottomSheetContent( title = { Text(label) }, buttons = { OutlinedButton(onClick = { bottomSheetHandler.hide() }) { - Text(text = stringResource(id = R.string.cancel)) + Text(text = stringResource(id = AndroidR.string.cancel)) } }, ) { diff --git a/lawnchair/src/app/lawnchair/ui/preferences/components/IconShapePreference.kt b/lawnchair/src/app/lawnchair/ui/preferences/components/IconShapePreference.kt index 4c4c3f9458c..baf734a4a89 100644 --- a/lawnchair/src/app/lawnchair/ui/preferences/components/IconShapePreference.kt +++ b/lawnchair/src/app/lawnchair/ui/preferences/components/IconShapePreference.kt @@ -26,7 +26,6 @@ import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.requiredSize import androidx.compose.foundation.layout.requiredWidth -import androidx.compose.material.RadioButton import androidx.compose.material.icons.Icons import androidx.compose.material.icons.rounded.Add import androidx.compose.material.icons.rounded.Edit @@ -34,6 +33,7 @@ import androidx.compose.material3.Icon import androidx.compose.material3.LocalContentColor import androidx.compose.material3.LocalTextStyle import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.RadioButton import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.CompositionLocalProvider diff --git a/lawnchair/src/app/lawnchair/ui/preferences/components/LauncherPreview.kt b/lawnchair/src/app/lawnchair/ui/preferences/components/LauncherPreview.kt index 2031c7e32f6..d4dfe18f994 100644 --- a/lawnchair/src/app/lawnchair/ui/preferences/components/LauncherPreview.kt +++ b/lawnchair/src/app/lawnchair/ui/preferences/components/LauncherPreview.kt @@ -17,7 +17,6 @@ import androidx.compose.ui.unit.dp import androidx.compose.ui.viewinterop.AndroidView import androidx.lifecycle.Lifecycle import app.lawnchair.LauncherPreviewManager -import app.lawnchair.theme.surfaceColorAtElevation import app.lawnchair.ui.theme.LawnchairTheme import app.lawnchair.util.lifecycleState import app.lawnchair.wallpaper.WallpaperColorsCompat @@ -41,7 +40,7 @@ fun DummyLauncherBox( Spacer( modifier = Modifier .fillMaxSize() - .background(MaterialTheme.colorScheme.surfaceColorAtElevation(1.dp)), + .background(MaterialTheme.colorScheme.surfaceContainerHigh), ) } content() diff --git a/lawnchair/src/app/lawnchair/ui/preferences/components/NotificationDotsPreference.kt b/lawnchair/src/app/lawnchair/ui/preferences/components/NotificationDotsPreference.kt index 44b6987c869..f7ccaca7118 100644 --- a/lawnchair/src/app/lawnchair/ui/preferences/components/NotificationDotsPreference.kt +++ b/lawnchair/src/app/lawnchair/ui/preferences/components/NotificationDotsPreference.kt @@ -26,7 +26,6 @@ import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.requiredWidth import androidx.compose.foundation.layout.size -import androidx.compose.material.ContentAlpha import androidx.compose.material3.Button import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme @@ -43,7 +42,7 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import androidx.core.os.bundleOf import androidx.lifecycle.Lifecycle -import app.lawnchair.ui.AlertBottomSheetContent +import app.lawnchair.ui.ModalBottomSheetContent import app.lawnchair.ui.preferences.components.layout.PreferenceTemplate import app.lawnchair.ui.util.bottomSheetHandler import app.lawnchair.util.lifecycleState @@ -81,7 +80,7 @@ fun NotificationDotsPreference( .size(24.dp), painter = painterResource(id = R.drawable.ic_warning), contentDescription = "", - tint = MaterialTheme.colorScheme.onBackground.copy(alpha = ContentAlpha.medium), + tint = MaterialTheme.colorScheme.onSurfaceVariant, ) } } else { @@ -111,7 +110,7 @@ fun NotificationAccessConfirmation( ) { val context = LocalContext.current - AlertBottomSheetContent( + ModalBottomSheetContent( title = { Text(text = stringResource(id = R.string.missing_notification_access_label)) }, text = { val appName = stringResource(id = R.string.derived_app_name) diff --git a/lawnchair/src/app/lawnchair/ui/preferences/components/colorpreference/ColorDot.kt b/lawnchair/src/app/lawnchair/ui/preferences/components/colorpreference/ColorDot.kt index c5c3a5604a9..1bf92987871 100644 --- a/lawnchair/src/app/lawnchair/ui/preferences/components/colorpreference/ColorDot.kt +++ b/lawnchair/src/app/lawnchair/ui/preferences/components/colorpreference/ColorDot.kt @@ -4,7 +4,6 @@ import androidx.compose.foundation.background import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.size import androidx.compose.foundation.shape.CircleShape -import androidx.compose.material.MaterialTheme import androidx.compose.material.icons.Icons import androidx.compose.material.icons.rounded.HdrAuto import androidx.compose.material3.Icon @@ -15,6 +14,7 @@ import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.unit.dp +import app.lawnchair.ui.theme.isSelectedThemeDark @Composable fun ColorDot( @@ -26,11 +26,7 @@ fun ColorDot( val colorLight = entry.lightColor(context) val colorDark = entry.darkColor(context) - val color = if (MaterialTheme.colors.isLight) { - colorLight - } else { - colorDark - } + val color = if (isSelectedThemeDark) colorDark else colorLight if (colorLight != 0) { ColorDot( diff --git a/lawnchair/src/app/lawnchair/ui/preferences/components/colorpreference/ColorSlider.kt b/lawnchair/src/app/lawnchair/ui/preferences/components/colorpreference/ColorSlider.kt index 8bd493da45b..c5256dbe65d 100644 --- a/lawnchair/src/app/lawnchair/ui/preferences/components/colorpreference/ColorSlider.kt +++ b/lawnchair/src/app/lawnchair/ui/preferences/components/colorpreference/ColorSlider.kt @@ -12,10 +12,8 @@ import androidx.compose.foundation.layout.requiredHeight import androidx.compose.foundation.layout.requiredSize import androidx.compose.foundation.shape.CircleShape import androidx.compose.foundation.shape.RoundedCornerShape -import androidx.compose.material.ContentAlpha -import androidx.compose.material.LocalContentAlpha -import androidx.compose.material.MaterialTheme import androidx.compose.material3.LocalContentColor +import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Slider import androidx.compose.material3.SliderDefaults import androidx.compose.material3.Text @@ -59,12 +57,11 @@ fun RgbColorSlider( ) { Text(text = label) CompositionLocalProvider( - LocalContentAlpha provides ContentAlpha.medium, - LocalContentColor provides MaterialTheme.colors.onBackground, + LocalContentColor provides MaterialTheme.colorScheme.onBackground, ) { val valueText = snapSliderValue(rgbRange.start, value.toFloat(), step) .roundToInt().toString() - Text(text = valueText) + Text(text = valueText, color = MaterialTheme.colorScheme.onSurfaceVariant) } } }, @@ -137,8 +134,7 @@ fun HsbColorSlider( ) { Text(text = label) CompositionLocalProvider( - LocalContentAlpha provides ContentAlpha.medium, - LocalContentColor provides MaterialTheme.colors.onBackground, + LocalContentColor provides MaterialTheme.colorScheme.onBackground, ) { val valueText = snapSliderValue(range.start, value, step) Text( diff --git a/lawnchair/src/app/lawnchair/ui/preferences/components/colorpreference/pickers/SwatchGrid.kt b/lawnchair/src/app/lawnchair/ui/preferences/components/colorpreference/pickers/SwatchGrid.kt index 6c7a2bb8473..5f1501c6dbe 100644 --- a/lawnchair/src/app/lawnchair/ui/preferences/components/colorpreference/pickers/SwatchGrid.kt +++ b/lawnchair/src/app/lawnchair/ui/preferences/components/colorpreference/pickers/SwatchGrid.kt @@ -13,10 +13,10 @@ import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.width import androidx.compose.foundation.layout.widthIn import androidx.compose.foundation.shape.CircleShape -import androidx.compose.material.Icon -import androidx.compose.material.MaterialTheme import androidx.compose.material.icons.Icons import androidx.compose.material.icons.rounded.Done +import androidx.compose.material3.Icon +import androidx.compose.material3.MaterialTheme import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier @@ -27,6 +27,7 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import app.lawnchair.ui.preferences.components.colorpreference.ColorPreferenceEntry import app.lawnchair.ui.preferences.components.layout.PreferenceGroup +import app.lawnchair.ui.theme.isSelectedThemeDark import com.android.launcher3.R import kotlinx.collections.immutable.ImmutableList @@ -92,10 +93,10 @@ fun ColorSwatch( selected: Boolean, modifier: Modifier = Modifier, ) { - val color = if (MaterialTheme.colors.isLight) { - entry.lightColor(LocalContext.current) - } else { + val color = if (isSelectedThemeDark) { entry.darkColor(LocalContext.current) + } else { + entry.lightColor(LocalContext.current) } Box( @@ -112,7 +113,7 @@ fun ColorSwatch( Icon( imageVector = Icons.Rounded.Done, contentDescription = null, - tint = MaterialTheme.colors.onPrimary, + tint = MaterialTheme.colorScheme.onPrimary, ) } } diff --git a/lawnchair/src/app/lawnchair/ui/preferences/components/controls/ClickablePreference.kt b/lawnchair/src/app/lawnchair/ui/preferences/components/controls/ClickablePreference.kt index 3689158cb72..c9054ebc9f1 100644 --- a/lawnchair/src/app/lawnchair/ui/preferences/components/controls/ClickablePreference.kt +++ b/lawnchair/src/app/lawnchair/ui/preferences/components/controls/ClickablePreference.kt @@ -26,7 +26,7 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp -import app.lawnchair.ui.AlertBottomSheetContent +import app.lawnchair.ui.ModalBottomSheetContent import app.lawnchair.ui.preferences.components.layout.PreferenceTemplate import app.lawnchair.ui.util.bottomSheetHandler @@ -66,7 +66,7 @@ fun PreferenceClickConfirmation( onDismissRequest: () -> Unit, onConfirm: () -> Unit, ) { - AlertBottomSheetContent( + ModalBottomSheetContent( title = { Text(text = title) }, text = { Text(text = text) }, buttons = { diff --git a/lawnchair/src/app/lawnchair/ui/preferences/components/controls/ListPreference.kt b/lawnchair/src/app/lawnchair/ui/preferences/components/controls/ListPreference.kt index 28248367190..54056490073 100644 --- a/lawnchair/src/app/lawnchair/ui/preferences/components/controls/ListPreference.kt +++ b/lawnchair/src/app/lawnchair/ui/preferences/components/controls/ListPreference.kt @@ -16,21 +16,21 @@ package app.lawnchair.ui.preferences.components.controls -import android.R +import android.R as AndroidR import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.fillMaxHeight import androidx.compose.foundation.layout.padding import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.itemsIndexed -import androidx.compose.material.RadioButton import androidx.compose.material3.OutlinedButton +import androidx.compose.material3.RadioButton import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import app.lawnchair.preferences.PreferenceAdapter -import app.lawnchair.ui.AlertBottomSheetContent +import app.lawnchair.ui.ModalBottomSheetContent import app.lawnchair.ui.preferences.components.layout.PreferenceDivider import app.lawnchair.ui.preferences.components.layout.PreferenceTemplate import app.lawnchair.ui.util.addIf @@ -84,11 +84,11 @@ fun ListPreference( applyPaddings = false, modifier = Modifier.clickable(enabled) { bottomSheetHandler.show { - AlertBottomSheetContent( + ModalBottomSheetContent( title = { Text(label) }, buttons = { OutlinedButton(onClick = { bottomSheetHandler.hide() }) { - Text(text = stringResource(id = R.string.cancel)) + Text(text = stringResource(id = AndroidR.string.cancel)) } }, ) { diff --git a/lawnchair/src/app/lawnchair/ui/preferences/components/controls/MainSwitchPreference.kt b/lawnchair/src/app/lawnchair/ui/preferences/components/controls/MainSwitchPreference.kt index 00d4facf763..34bac204b93 100644 --- a/lawnchair/src/app/lawnchair/ui/preferences/components/controls/MainSwitchPreference.kt +++ b/lawnchair/src/app/lawnchair/ui/preferences/components/controls/MainSwitchPreference.kt @@ -3,8 +3,6 @@ package app.lawnchair.ui.preferences.components.controls import androidx.compose.animation.Crossfade import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.padding -import androidx.compose.material.ContentAlpha -import androidx.compose.material3.LocalContentColor import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Surface import androidx.compose.material3.Text @@ -30,7 +28,7 @@ fun MainSwitchPreference( Surface( modifier = Modifier.padding(horizontal = 16.dp), - shape = androidx.compose.material.MaterialTheme.shapes.large, + shape = MaterialTheme.shapes.large, color = if (checked) MaterialTheme.colorScheme.primaryContainer else MaterialTheme.colorScheme.surfaceVariant, ) { SwitchPreference( @@ -47,7 +45,7 @@ fun MainSwitchPreference( Text( text = description, style = MaterialTheme.typography.bodyMedium, - color = LocalContentColor.current.copy(alpha = ContentAlpha.medium), + color = MaterialTheme.colorScheme.onSurfaceVariant, ) } } diff --git a/lawnchair/src/app/lawnchair/ui/preferences/components/controls/PreferenceCategory.kt b/lawnchair/src/app/lawnchair/ui/preferences/components/controls/PreferenceCategory.kt new file mode 100644 index 00000000000..4b12c45396a --- /dev/null +++ b/lawnchair/src/app/lawnchair/ui/preferences/components/controls/PreferenceCategory.kt @@ -0,0 +1,119 @@ +/* + * Copyright 2021, Lawnchair + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package app.lawnchair.ui.preferences.components.controls + +import androidx.annotation.DrawableRes +import androidx.compose.foundation.clickable +import androidx.compose.foundation.interaction.MutableInteractionSource +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.material3.Icon +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.material3.ripple +import androidx.compose.runtime.Composable +import androidx.compose.runtime.remember +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.unit.dp +import app.lawnchair.ui.preferences.LocalNavController +import app.lawnchair.ui.preferences.components.layout.PreferenceTemplate +import app.lawnchair.ui.preferences.subRoute +import app.lawnchair.ui.theme.LawnchairTheme +import app.lawnchair.ui.util.PreviewLawnchair +import com.android.launcher3.R + +@Composable +fun PreferenceCategory( + label: String, + @DrawableRes iconResource: Int, + route: String, + description: String? = null, +) { + val navController = LocalNavController.current + val resolvedRoute = subRoute(name = route) + + PreferenceCategory( + label = label, + iconResource = iconResource, + onNavigate = { navController.navigate(resolvedRoute) }, + description = description, + ) +} + +@Composable +private fun PreferenceCategory( + label: String, + @DrawableRes iconResource: Int, + onNavigate: () -> Unit, + description: String? = null, +) { + Row( + modifier = Modifier.padding(horizontal = 16.dp), + ) { + PreferenceTemplate( + modifier = Modifier + .clip(MaterialTheme.shapes.large) + .clickable( + interactionSource = remember { MutableInteractionSource() }, + indication = ripple( + bounded = true, + color = MaterialTheme.colorScheme.primaryContainer, + ), + ) { onNavigate() }, + verticalPadding = 14.dp, + title = { + Text(text = label) + }, + description = { + if (description != null) { + Text(text = description) + } + }, + startWidget = { + Box( + contentAlignment = Alignment.Center, + modifier = Modifier.size(32.dp), + ) { + Icon( + painter = painterResource(id = iconResource), + contentDescription = null, + modifier = Modifier.size(24.dp), + tint = MaterialTheme.colorScheme.primary, + ) + } + }, + ) + } +} + +@PreviewLawnchair +@Composable +private fun PreferenceCategoryPreview() { + LawnchairTheme { + PreferenceCategory( + label = "Example", + description = "Example description here", + iconResource = R.drawable.ic_general, + onNavigate = {}, + ) + } +} diff --git a/lawnchair/src/app/lawnchair/ui/preferences/components/controls/SliderPreference.kt b/lawnchair/src/app/lawnchair/ui/preferences/components/controls/SliderPreference.kt index f4a839f472d..21a1ca9bf83 100644 --- a/lawnchair/src/app/lawnchair/ui/preferences/components/controls/SliderPreference.kt +++ b/lawnchair/src/app/lawnchair/ui/preferences/components/controls/SliderPreference.kt @@ -21,12 +21,10 @@ import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding -import androidx.compose.material.ContentAlpha -import androidx.compose.material.LocalContentAlpha -import androidx.compose.material.LocalContentColor -import androidx.compose.material.MaterialTheme -import androidx.compose.material.Text +import androidx.compose.material3.LocalContentColor +import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Slider +import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.DisposableEffect @@ -97,10 +95,12 @@ fun SliderPreference( .padding(top = 16.dp) .padding(horizontal = 16.dp), ) { - Text(text = label) + Text( + text = label, + color = MaterialTheme.colorScheme.onBackground, + ) CompositionLocalProvider( - LocalContentAlpha provides ContentAlpha.medium, - LocalContentColor provides MaterialTheme.colors.onBackground, + LocalContentColor provides MaterialTheme.colorScheme.onBackground, ) { val value = snapSliderValue(valueRange.start, sliderValue, step) Text( @@ -112,6 +112,7 @@ fun SliderPreference( } else { value.roundToInt().toString() + " $showUnit" }, + color = MaterialTheme.colorScheme.onSurfaceVariant, ) } } diff --git a/lawnchair/src/app/lawnchair/ui/preferences/components/controls/SwitchPreference.kt b/lawnchair/src/app/lawnchair/ui/preferences/components/controls/SwitchPreference.kt index 7e70bae0331..b9d2e3a7f57 100644 --- a/lawnchair/src/app/lawnchair/ui/preferences/components/controls/SwitchPreference.kt +++ b/lawnchair/src/app/lawnchair/ui/preferences/components/controls/SwitchPreference.kt @@ -30,7 +30,9 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp import app.lawnchair.preferences.PreferenceAdapter import app.lawnchair.ui.preferences.components.layout.PreferenceTemplate +import app.lawnchair.ui.theme.LawnchairTheme import app.lawnchair.ui.theme.dividerColor +import app.lawnchair.ui.util.PreviewLawnchair @Composable fun SwitchPreference( @@ -51,6 +53,9 @@ fun SwitchPreference( ) } +/** + * A Preference that provides a two-state toggleable option. + */ @Composable fun SwitchPreference( checked: Boolean, @@ -97,3 +102,16 @@ fun SwitchPreference( applyPaddings = false, ) } + +@PreviewLawnchair +@Composable +private fun SwitchPreferencePreview() { + LawnchairTheme { + SwitchPreference( + checked = true, + onCheckedChange = {}, + label = "Example switch", + description = "Sample description text", + ) + } +} diff --git a/lawnchair/src/app/lawnchair/ui/preferences/components/controls/TextPreference.kt b/lawnchair/src/app/lawnchair/ui/preferences/components/controls/TextPreference.kt index 1c9eb6b4bcb..d240b60c934 100644 --- a/lawnchair/src/app/lawnchair/ui/preferences/components/controls/TextPreference.kt +++ b/lawnchair/src/app/lawnchair/ui/preferences/components/controls/TextPreference.kt @@ -4,9 +4,9 @@ import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.requiredWidth -import androidx.compose.material.OutlinedTextField import androidx.compose.material3.Button import androidx.compose.material3.OutlinedButton +import androidx.compose.material3.OutlinedTextField import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue @@ -17,7 +17,7 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import app.lawnchair.preferences.PreferenceAdapter -import app.lawnchair.ui.AlertBottomSheetContent +import app.lawnchair.ui.ModalBottomSheetContent import app.lawnchair.ui.preferences.components.layout.PreferenceTemplate import app.lawnchair.ui.util.bottomSheetHandler @@ -73,7 +73,7 @@ fun TextPreferenceDialog( onConfirm: (String) -> Unit, ) { var value by remember { mutableStateOf(initialValue) } - AlertBottomSheetContent( + ModalBottomSheetContent( title = { Text(text = title) }, text = { OutlinedTextField( diff --git a/lawnchair/src/app/lawnchair/ui/preferences/components/layout/BottomSpacer.kt b/lawnchair/src/app/lawnchair/ui/preferences/components/layout/BottomSpacer.kt index a709ea5af6e..b2e824c31c3 100644 --- a/lawnchair/src/app/lawnchair/ui/preferences/components/layout/BottomSpacer.kt +++ b/lawnchair/src/app/lawnchair/ui/preferences/components/layout/BottomSpacer.kt @@ -13,6 +13,9 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.input.pointer.pointerInput +/** + * Creates a spacer that respects the [navigation bars][WindowInsets.Companion.navigationBars]. + */ @Composable fun BottomSpacer() { Box( diff --git a/lawnchair/src/app/lawnchair/ui/preferences/components/layout/ClickableIcon.kt b/lawnchair/src/app/lawnchair/ui/preferences/components/layout/ClickableIcon.kt index 8ddf003c5d2..7bd790c2067 100644 --- a/lawnchair/src/app/lawnchair/ui/preferences/components/layout/ClickableIcon.kt +++ b/lawnchair/src/app/lawnchair/ui/preferences/components/layout/ClickableIcon.kt @@ -1,9 +1,8 @@ package app.lawnchair.ui.preferences.components.layout import androidx.compose.animation.core.animateFloatAsState -import androidx.compose.material.ContentAlpha -import androidx.compose.material.Icon -import androidx.compose.material.IconButton +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton import androidx.compose.material3.LocalContentColor import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue @@ -26,7 +25,7 @@ fun ClickableIcon( modifier = modifier, enabled = enabled, ) { - val contentAlpha = if (enabled) tint.alpha else ContentAlpha.disabled + val contentAlpha = if (enabled) tint.alpha else 0.38f val alpha by animateFloatAsState(targetValue = contentAlpha, label = "") Icon( painter = painter, diff --git a/lawnchair/src/app/lawnchair/ui/preferences/components/layout/ExpandAndShrink.kt b/lawnchair/src/app/lawnchair/ui/preferences/components/layout/ExpandAndShrink.kt index c2bef33dbba..accb63bdeea 100644 --- a/lawnchair/src/app/lawnchair/ui/preferences/components/layout/ExpandAndShrink.kt +++ b/lawnchair/src/app/lawnchair/ui/preferences/components/layout/ExpandAndShrink.kt @@ -8,6 +8,11 @@ import androidx.compose.animation.fadeOut import androidx.compose.animation.shrinkVertically import androidx.compose.runtime.Composable +/** + * Animates the appearance and disappearance of [content] via an expanding and shrinking animation, respectively. + * @param visible Defines whether the content should be visible + * @param content Content to appear or disappear based on the value of [visible] + */ @Composable fun ExpandAndShrink( visible: Boolean, diff --git a/lawnchair/src/app/lawnchair/ui/preferences/components/layout/LazyColumnGrid.kt b/lawnchair/src/app/lawnchair/ui/preferences/components/layout/LazyColumnGrid.kt index 8f5b707af87..e7989f95f87 100644 --- a/lawnchair/src/app/lawnchair/ui/preferences/components/layout/LazyColumnGrid.kt +++ b/lawnchair/src/app/lawnchair/ui/preferences/components/layout/LazyColumnGrid.kt @@ -9,11 +9,17 @@ import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.requiredWidth import androidx.compose.foundation.lazy.LazyListScope import androidx.compose.foundation.lazy.LazyListState +import androidx.compose.foundation.lazy.grid.LazyVerticalGrid import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.dp +/** + * Creates a vertical grid of items via LazyList + * + * TODO: use [LazyVerticalGrid] + */ fun LazyListScope.verticalGridItems( modifier: Modifier = Modifier, count: Int, diff --git a/lawnchair/src/app/lawnchair/ui/preferences/components/layout/LoadingScreen.kt b/lawnchair/src/app/lawnchair/ui/preferences/components/layout/LoadingScreen.kt index bc8d1154786..8cda771a4be 100644 --- a/lawnchair/src/app/lawnchair/ui/preferences/components/layout/LoadingScreen.kt +++ b/lawnchair/src/app/lawnchair/ui/preferences/components/layout/LoadingScreen.kt @@ -20,11 +20,16 @@ import androidx.compose.animation.Crossfade import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.material.CircularProgressIndicator +import androidx.compose.material3.CircularProgressIndicator import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +/** + * Creates a simple loading animation with [Crossfade] and [CircularProgressIndicator]. + * @param isLoading Defines whether the content is still loading or not + * @param content Content to appear or disappear based on the value of [isLoading] + */ @Composable fun LoadingScreen( isLoading: Boolean, @@ -45,6 +50,11 @@ fun LoadingScreen( } } +/** + * Creates a simple loading animation with [Crossfade] and [CircularProgressIndicator]. [obj] will be passed as a parameter of [content]. + * @param obj A key representing the content object + * @param content Content to appear or disappear based on the value of [obj]. + */ @Composable fun LoadingScreen( obj: T?, diff --git a/lawnchair/src/app/lawnchair/ui/preferences/components/layout/NestedScrollStretch.kt b/lawnchair/src/app/lawnchair/ui/preferences/components/layout/NestedScrollStretch.kt index 4d38c8a9e30..67c5a79b019 100644 --- a/lawnchair/src/app/lawnchair/ui/preferences/components/layout/NestedScrollStretch.kt +++ b/lawnchair/src/app/lawnchair/ui/preferences/components/layout/NestedScrollStretch.kt @@ -18,6 +18,12 @@ import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.unit.Velocity import app.lawnchair.ui.StretchEdgeEffect +/** + * Creates a custom overscroll effect based off the Android 12 "stretch" animation. + * @param content The content to animate. + * + * TODO: Allow horizontal stretch + */ @Composable fun NestedScrollStretch( content: @Composable () -> Unit, diff --git a/lawnchair/src/app/lawnchair/ui/preferences/components/layout/PreferenceCategory.kt b/lawnchair/src/app/lawnchair/ui/preferences/components/layout/PreferenceCategory.kt deleted file mode 100644 index d1a8eeb9678..00000000000 --- a/lawnchair/src/app/lawnchair/ui/preferences/components/layout/PreferenceCategory.kt +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Copyright 2021, Lawnchair - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package app.lawnchair.ui.preferences.components.layout - -import androidx.annotation.DrawableRes -import androidx.compose.foundation.clickable -import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.size -import androidx.compose.material3.Icon -import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.Text -import androidx.compose.runtime.Composable -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.res.painterResource -import androidx.compose.ui.unit.dp -import app.lawnchair.ui.preferences.LocalNavController -import app.lawnchair.ui.preferences.subRoute - -@Composable -fun PreferenceCategory( - label: String, - @DrawableRes iconResource: Int, - route: String, - description: String? = null, -) { - val navController = LocalNavController.current - val resolvedRoute = subRoute(name = route) - - PreferenceTemplate( - verticalPadding = 14.dp, - modifier = Modifier.clickable(onClick = { navController.navigate(resolvedRoute) }), - title = { - Text(text = label) - }, - description = { - if (description != null) { - Text(text = description) - } - }, - startWidget = { - Box( - contentAlignment = Alignment.Center, - modifier = Modifier.size(32.dp), - ) { - Icon( - painter = painterResource(id = iconResource), - contentDescription = null, - modifier = Modifier.size(24.dp), - tint = MaterialTheme.colorScheme.primary, - ) - } - }, - ) -} diff --git a/lawnchair/src/app/lawnchair/ui/preferences/components/layout/PreferenceDivider.kt b/lawnchair/src/app/lawnchair/ui/preferences/components/layout/PreferenceDivider.kt index 72996307723..cb8fb49b05a 100644 --- a/lawnchair/src/app/lawnchair/ui/preferences/components/layout/PreferenceDivider.kt +++ b/lawnchair/src/app/lawnchair/ui/preferences/components/layout/PreferenceDivider.kt @@ -1,7 +1,7 @@ package app.lawnchair.ui.preferences.components.layout import androidx.compose.foundation.layout.padding -import androidx.compose.material.Divider +import androidx.compose.material3.HorizontalDivider import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.unit.Dp @@ -14,7 +14,7 @@ fun PreferenceDivider( startIndent: Dp = 0.dp, endIndent: Dp = 0.dp, ) { - Divider( + HorizontalDivider( modifier = modifier .padding(start = startIndent + 16.dp, end = endIndent + 16.dp), color = dividerColor(), diff --git a/lawnchair/src/app/lawnchair/ui/preferences/components/layout/PreferenceGroup.kt b/lawnchair/src/app/lawnchair/ui/preferences/components/layout/PreferenceGroup.kt index e9201334ae4..83f34ce8f5b 100644 --- a/lawnchair/src/app/lawnchair/ui/preferences/components/layout/PreferenceGroup.kt +++ b/lawnchair/src/app/lawnchair/ui/preferences/components/layout/PreferenceGroup.kt @@ -24,10 +24,7 @@ import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.requiredHeight -import androidx.compose.material.ContentAlpha -import androidx.compose.material.MaterialTheme -import androidx.compose.material3.LocalContentColor -import androidx.compose.material3.MaterialTheme as Material3Theme +import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Surface import androidx.compose.material3.Text import androidx.compose.runtime.Composable @@ -85,8 +82,8 @@ fun PreferenceGroupHeading( ) { Text( text = heading, - style = Material3Theme.typography.titleSmall, - color = Material3Theme.colorScheme.primary, + style = MaterialTheme.typography.titleSmall, + color = MaterialTheme.colorScheme.primary, ) } } else { @@ -104,8 +101,8 @@ fun PreferenceGroupDescription( Row(modifier = Modifier.padding(start = 32.dp, end = 32.dp, top = 16.dp)) { Text( text = it, - style = Material3Theme.typography.bodyMedium, - color = LocalContentColor.current.copy(alpha = ContentAlpha.medium), + style = MaterialTheme.typography.bodyMedium, + color = MaterialTheme.colorScheme.onSurfaceVariant, ) } } diff --git a/lawnchair/src/app/lawnchair/ui/preferences/components/layout/PreferenceLayout.kt b/lawnchair/src/app/lawnchair/ui/preferences/components/layout/PreferenceLayout.kt index 539c66c8a8f..8cc37e2f024 100644 --- a/lawnchair/src/app/lawnchair/ui/preferences/components/layout/PreferenceLayout.kt +++ b/lawnchair/src/app/lawnchair/ui/preferences/components/layout/PreferenceLayout.kt @@ -28,11 +28,29 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp +import app.lawnchair.ui.preferences.LocalIsExpandedScreen +/** + * Represents the layout of all Preference screens. + * Uses a combination of [PreferenceScaffold] and [PreferenceColumn] to represent the layout. + * + * @param label the text to be displayed at the top of the screen + * @param backArrowVisible whether to show the back arrow or not + * @param verticalArrangement the vertical arrangement of the layout's children + * @param horizontalAlignment the horizontal alignment of the layout's children + * @param scrollState the [ScrollState] to use to allow vertical overflow + * @param actions what content to show at the top-right of the layout + * @param bottomBar what content to show at the bottom of the layout + * @param content the actual content + * @see [PreferenceLayoutLazyColumn] + * + * TODO: use DSL to represent all preferences + */ @Composable fun PreferenceLayout( label: String, backArrowVisible: Boolean = true, + isExpandedScreen: Boolean = LocalIsExpandedScreen.current, verticalArrangement: Arrangement.Vertical = Arrangement.spacedBy(8.dp), horizontalAlignment: Alignment.Horizontal = Alignment.Start, scrollState: ScrollState? = rememberScrollState(), @@ -43,10 +61,12 @@ fun PreferenceLayout( PreferenceScaffold( backArrowVisible = backArrowVisible, label = label, + isExpandedScreen = isExpandedScreen, actions = actions, bottomBar = bottomBar, ) { PreferenceColumn( + contentPadding = it, verticalArrangement = verticalArrangement, horizontalAlignment = horizontalAlignment, scrollState = scrollState, @@ -55,10 +75,27 @@ fun PreferenceLayout( } } +/** + * Represents the layout of all Preference screens. + * This composable only composes and lays out the currently visible items. + * Uses a combination of [PreferenceScaffold] and [PreferenceLazyColumn] to represent the layout. + * + * @param label the text to be displayed at the top of the screen + * @param modifier the [Modifier] to apply at [PreferenceLazyColumn] + * @param enabled whether the layout allows user input or not + * @param backArrowVisible whether to show the back arrow or not + * @param state the state object to be used to control or observe the list's state + * @param actions what content to show at the top-right of the layout + * @param content the actual content + * @see [PreferenceLayout] + * + * TODO: use DSL to represent all preferences + */ @Composable fun PreferenceLayoutLazyColumn( label: String, modifier: Modifier = Modifier, + isExpandedScreen: Boolean = LocalIsExpandedScreen.current, enabled: Boolean = true, backArrowVisible: Boolean = true, state: LazyListState = rememberLazyListState(), @@ -68,9 +105,11 @@ fun PreferenceLayoutLazyColumn( PreferenceScaffold( backArrowVisible = backArrowVisible, label = label, + isExpandedScreen = isExpandedScreen, actions = actions, ) { PreferenceLazyColumn( + contentPadding = it, modifier = modifier, enabled = enabled, state = state, diff --git a/lawnchair/src/app/lawnchair/ui/preferences/components/layout/PreferenceScaffold.kt b/lawnchair/src/app/lawnchair/ui/preferences/components/layout/PreferenceScaffold.kt index cdfe8c92035..bcec08007eb 100644 --- a/lawnchair/src/app/lawnchair/ui/preferences/components/layout/PreferenceScaffold.kt +++ b/lawnchair/src/app/lawnchair/ui/preferences/components/layout/PreferenceScaffold.kt @@ -19,40 +19,36 @@ package app.lawnchair.ui.preferences.components.layout import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.RowScope -import androidx.compose.foundation.layout.WindowInsets -import androidx.compose.foundation.layout.WindowInsetsSides -import androidx.compose.foundation.layout.asPaddingValues -import androidx.compose.foundation.layout.only -import androidx.compose.foundation.layout.systemBars import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.Scaffold import androidx.compose.material3.TopAppBarDefaults import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.input.nestedscroll.nestedScroll -import com.google.accompanist.insets.ui.Scaffold @OptIn(ExperimentalMaterial3Api::class) @Composable fun PreferenceScaffold( label: String, + isExpandedScreen: Boolean, backArrowVisible: Boolean = true, actions: @Composable RowScope.() -> Unit = {}, bottomBar: @Composable () -> Unit = { BottomSpacer() }, content: @Composable (PaddingValues) -> Unit, ) { - val scrollBehavior = TopAppBarDefaults.exitUntilCollapsedScrollBehavior() + val scrollBehavior = if (isExpandedScreen) TopAppBarDefaults.pinnedScrollBehavior() else TopAppBarDefaults.exitUntilCollapsedScrollBehavior() Scaffold( modifier = Modifier.nestedScroll(scrollBehavior.nestedScrollConnection), topBar = { TopBar( backArrowVisible = backArrowVisible, label = label, + isExpandedScreen = isExpandedScreen, actions = actions, scrollBehavior = scrollBehavior, ) }, bottomBar = bottomBar, - contentPadding = WindowInsets.systemBars.only(WindowInsetsSides.Horizontal).asPaddingValues(), ) { content(it) } diff --git a/lawnchair/src/app/lawnchair/ui/preferences/components/layout/PreferenceSearchScaffold.kt b/lawnchair/src/app/lawnchair/ui/preferences/components/layout/PreferenceSearchScaffold.kt index 40c28eb5f2e..1aacf35c0dd 100644 --- a/lawnchair/src/app/lawnchair/ui/preferences/components/layout/PreferenceSearchScaffold.kt +++ b/lawnchair/src/app/lawnchair/ui/preferences/components/layout/PreferenceSearchScaffold.kt @@ -1,132 +1,182 @@ package app.lawnchair.ui.preferences.components.layout +import androidx.activity.OnBackPressedDispatcher import androidx.activity.compose.LocalOnBackPressedDispatcherOwner +import androidx.compose.animation.Crossfade +import androidx.compose.foundation.background +import androidx.compose.foundation.interaction.MutableInteractionSource import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.RowScope -import androidx.compose.foundation.layout.WindowInsets -import androidx.compose.foundation.layout.WindowInsetsSides -import androidx.compose.foundation.layout.asPaddingValues +import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxHeight -import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height -import androidx.compose.foundation.layout.navigationBars -import androidx.compose.foundation.layout.only import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.statusBars +import androidx.compose.foundation.layout.requiredHeight import androidx.compose.foundation.layout.statusBarsPadding -import androidx.compose.foundation.layout.systemBars -import androidx.compose.foundation.layout.windowInsetsPadding -import androidx.compose.material.ContentAlpha -import androidx.compose.material.LocalContentAlpha -import androidx.compose.material.MaterialTheme -import androidx.compose.material.Surface +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.foundation.text.BasicTextField +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.automirrored.rounded.ArrowBack +import androidx.compose.material.icons.rounded.Clear +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.LocalContentColor +import androidx.compose.material3.LocalTextStyle +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.OutlinedTextFieldDefaults +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Surface +import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.CompositionLocalProvider -import androidx.compose.runtime.Stable -import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember -import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.platform.LocalDensity -import androidx.compose.ui.platform.LocalLayoutDirection -import androidx.compose.ui.unit.Dp -import androidx.compose.ui.unit.LayoutDirection +import androidx.compose.ui.graphics.SolidColor +import androidx.compose.ui.text.TextStyle +import androidx.compose.ui.text.input.VisualTransformation import androidx.compose.ui.unit.dp -import com.google.accompanist.insets.ui.LocalScaffoldPadding -import com.google.accompanist.insets.ui.Scaffold +import androidx.compose.ui.zIndex +import app.lawnchair.ui.theme.LawnchairTheme +import app.lawnchair.ui.util.PreviewLawnchair @Composable fun PreferenceSearchScaffold( - searchInput: @Composable () -> Unit, + value: String, + onValueChange: (String) -> Unit, + placeholder: @Composable (() -> Unit)? = null, actions: @Composable RowScope.() -> Unit = {}, content: @Composable (PaddingValues) -> Unit, ) { - val innerPadding = remember { MutablePaddingValues() } val backDispatcher = LocalOnBackPressedDispatcherOwner.current?.onBackPressedDispatcher - val searchBarVerticalMargin = 8.dp - val searchBarHeight = 56.dp - val statusBarHeight = with(LocalDensity.current) { WindowInsets.statusBars.getTop(this).toDp() } - val contentShift = statusBarHeight + searchBarVerticalMargin + searchBarHeight / 2 - Scaffold( topBar = { Surface( - modifier = Modifier - .statusBarsPadding() - .windowInsetsPadding(WindowInsets.navigationBars.only(WindowInsetsSides.Horizontal + WindowInsetsSides.Top)) - .padding(horizontal = 16.dp, vertical = searchBarVerticalMargin) - .height(searchBarHeight), - shape = MaterialTheme.shapes.small, - elevation = 2.dp, + color = MaterialTheme.colorScheme.background, ) { - Box( - modifier = Modifier - .fillMaxWidth() - .height(topBarSize) - .padding(horizontal = 4.dp), - contentAlignment = Alignment.CenterStart, - ) { - ClickableIcon( - imageVector = backIcon(), - onClick = { backDispatcher?.onBackPressed() }, - ) - Row( - verticalAlignment = Alignment.CenterVertically, - modifier = Modifier - .fillMaxSize() - .padding(start = 36.dp), - ) { - Box(modifier = Modifier.weight(1f)) { - searchInput() - } - CompositionLocalProvider(LocalContentAlpha provides ContentAlpha.medium) { - Row( - Modifier.fillMaxHeight(), - horizontalArrangement = Arrangement.End, - verticalAlignment = Alignment.CenterVertically, - content = actions, - ) - } - } - } + SearchBar( + value, + onValueChange, + backDispatcher, + placeholder, + actions, + ) + Spacer(modifier = Modifier.requiredHeight(16.dp)) } }, bottomBar = { BottomSpacer() }, - contentPadding = WindowInsets.systemBars.only(WindowInsetsSides.Horizontal).asPaddingValues(), ) { - val layoutDirection = LocalLayoutDirection.current - innerPadding.left = it.calculateLeftPadding(layoutDirection) - innerPadding.top = it.calculateTopPadding() - contentShift - innerPadding.right = it.calculateRightPadding(layoutDirection) - innerPadding.bottom = it.calculateBottomPadding() - CompositionLocalProvider( - LocalScaffoldPadding provides innerPadding, - ) { - Box(modifier = Modifier.padding(top = contentShift)) { - content(it) + content(it) + } +} + +@Composable +private fun SearchBar( + value: String, + onValueChange: (String) -> Unit, + backDispatcher: OnBackPressedDispatcher?, + placeholder: @Composable (() -> Unit)? = null, + actions: @Composable RowScope.() -> Unit = {}, +) { + Row( + verticalAlignment = Alignment.CenterVertically, + modifier = Modifier + .zIndex(1f) + .statusBarsPadding() + .padding(top = 8.dp) + .padding(horizontal = 16.dp) + .fillMaxWidth() + .height(56.dp) + .background( + color = MaterialTheme.colorScheme.surfaceContainerHighest, + shape = RoundedCornerShape(100), + ), + ) { + ClickableIcon( + imageVector = Icons.AutoMirrored.Rounded.ArrowBack, + onClick = { backDispatcher?.onBackPressed() }, + ) + Box(modifier = Modifier.weight(1f)) { + SearchTextField( + value, + onValueChange, + ) { + if (placeholder != null) { + placeholder() + } + } + } + CompositionLocalProvider(LocalContentColor provides MaterialTheme.colorScheme.onSurfaceVariant) { + Row( + Modifier.fillMaxHeight(), + horizontalArrangement = Arrangement.End, + verticalAlignment = Alignment.CenterVertically, + ) { + Crossfade(value != "", label = "Close button animation") { + if (it) { + ClickableIcon( + imageVector = Icons.Rounded.Clear, + onClick = { onValueChange("") }, + ) + } + } + actions() } } } } -@Stable -internal class MutablePaddingValues : PaddingValues { - var left: Dp by mutableStateOf(0.dp) - var top: Dp by mutableStateOf(0.dp) - var right: Dp by mutableStateOf(0.dp) - var bottom: Dp by mutableStateOf(0.dp) - - override fun calculateLeftPadding(layoutDirection: LayoutDirection) = left +@OptIn(ExperimentalMaterial3Api::class) +@Composable +private fun SearchTextField( + value: String, + onValueChange: (String) -> Unit, + placeholder: @Composable (() -> Unit)? = null, +) { + val textStyle: TextStyle = LocalTextStyle.current - override fun calculateTopPadding(): Dp = top + val textColor = MaterialTheme.colorScheme.onSurfaceVariant + val mergedTextStyle = textStyle.merge(TextStyle(color = textColor)) - override fun calculateRightPadding(layoutDirection: LayoutDirection) = right + Row( + modifier = Modifier.fillMaxWidth(), + verticalAlignment = Alignment.CenterVertically, + ) { + BasicTextField( + value = value, + onValueChange = onValueChange, + modifier = Modifier.fillMaxWidth(), + decorationBox = @Composable { innerTextField -> + OutlinedTextFieldDefaults.DecorationBox( + value = value, + innerTextField = innerTextField, + enabled = true, + singleLine = true, + visualTransformation = VisualTransformation.None, + interactionSource = remember { MutableInteractionSource() }, + placeholder = placeholder, + colors = OutlinedTextFieldDefaults.colors(), + contentPadding = PaddingValues(4.dp), + container = {}, + ) + }, + cursorBrush = SolidColor(MaterialTheme.colorScheme.primary), + textStyle = mergedTextStyle, + ) + } +} - override fun calculateBottomPadding(): Dp = bottom +@PreviewLawnchair +@Composable +private fun SearchTextFieldPreview() { + LawnchairTheme { + SearchTextField( + value = "Example", + onValueChange = {}, + placeholder = { Text("Example placeholder") }, + ) + } } diff --git a/lawnchair/src/app/lawnchair/ui/preferences/components/layout/PreferenceTemplate.kt b/lawnchair/src/app/lawnchair/ui/preferences/components/layout/PreferenceTemplate.kt index d05972b4ce8..d85a03cc389 100644 --- a/lawnchair/src/app/lawnchair/ui/preferences/components/layout/PreferenceTemplate.kt +++ b/lawnchair/src/app/lawnchair/ui/preferences/components/layout/PreferenceTemplate.kt @@ -24,10 +24,9 @@ import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.requiredWidth -import androidx.compose.material.ContentAlpha import androidx.compose.material3.LocalContentColor import androidx.compose.material3.LocalTextStyle -import androidx.compose.material3.MaterialTheme as Material3Theme +import androidx.compose.material3.MaterialTheme import androidx.compose.runtime.Composable import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.ui.Alignment @@ -55,7 +54,7 @@ fun PreferenceTemplate( startWidget: (@Composable () -> Unit)? = null, endWidget: (@Composable () -> Unit)? = null, ) { - val contentAlphaDisabled = ContentAlpha.disabled + val contentAlphaDisabled = MaterialTheme.colorScheme.onSurface.copy(alpha = 0.38f) Column { Row( verticalAlignment = verticalAlignment, @@ -76,20 +75,20 @@ fun PreferenceTemplate( modifier = contentModifier .weight(1f) .addIf(!enabled) { - alpha(contentAlphaDisabled) + alpha(0.38f) }, verticalAlignment = verticalAlignment, ) { Column(Modifier.weight(1f)) { CompositionLocalProvider( - LocalContentColor provides Material3Theme.colorScheme.onBackground, - LocalTextStyle provides Material3Theme.typography.bodyLarge, + LocalContentColor provides MaterialTheme.colorScheme.onBackground, + LocalTextStyle provides MaterialTheme.typography.bodyLarge, ) { title() } CompositionLocalProvider( - LocalContentColor provides Material3Theme.colorScheme.onBackground.copy(alpha = ContentAlpha.medium), - LocalTextStyle provides Material3Theme.typography.bodyMedium, + LocalContentColor provides MaterialTheme.colorScheme.onSurfaceVariant, + LocalTextStyle provides MaterialTheme.typography.bodyMedium, ) { description() } diff --git a/lawnchair/src/app/lawnchair/ui/preferences/components/layout/ScrollContainers.kt b/lawnchair/src/app/lawnchair/ui/preferences/components/layout/ScrollContainers.kt index 14c45daa8ba..76d6cd5c1b9 100644 --- a/lawnchair/src/app/lawnchair/ui/preferences/components/layout/ScrollContainers.kt +++ b/lawnchair/src/app/lawnchair/ui/preferences/components/layout/ScrollContainers.kt @@ -15,43 +15,41 @@ import androidx.compose.foundation.lazy.rememberLazyListState import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.verticalScroll import androidx.compose.runtime.Composable -import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.LaunchedEffect import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp import app.lawnchair.ui.util.addIf -import app.lawnchair.ui.util.rememberExtendPadding -import com.google.accompanist.insets.ui.LocalScaffoldPadding import kotlinx.coroutines.awaitCancellation @Composable fun PreferenceColumn( + contentPadding: PaddingValues, verticalArrangement: Arrangement.Vertical = Arrangement.Top, horizontalAlignment: Alignment.Horizontal = Alignment.Start, scrollState: ScrollState? = rememberScrollState(), content: @Composable ColumnScope.() -> Unit, ) { - ConsumeScaffoldPadding { contentPadding -> - NestedScrollStretch { - Column( - verticalArrangement = verticalArrangement, - horizontalAlignment = horizontalAlignment, - modifier = Modifier - .fillMaxHeight() - .addIf(scrollState != null) { - this - .verticalScroll(scrollState!!) - } - .padding(rememberExtendPadding(contentPadding, bottom = 16.dp)), - content = content, - ) - } + NestedScrollStretch { + Column( + verticalArrangement = verticalArrangement, + horizontalAlignment = horizontalAlignment, + modifier = Modifier + .fillMaxHeight() + .addIf(scrollState != null) { + this + .verticalScroll(scrollState!!) + } + .padding(contentPadding) + .padding(top = 8.dp, bottom = 16.dp), + content = content, + ) } } @Composable fun PreferenceLazyColumn( + contentPadding: PaddingValues, modifier: Modifier = Modifier, enabled: Boolean = true, isChild: Boolean = false, @@ -65,32 +63,15 @@ fun PreferenceLazyColumn( } } } - ConsumeScaffoldPadding { contentPadding -> - NestedScrollStretch { - LazyColumn( - modifier = modifier - .addIf(!isChild) { - fillMaxHeight() - }, - contentPadding = rememberExtendPadding( - contentPadding, - bottom = if (isChild) 0.dp else 16.dp, - ), - state = state, - content = content, - ) - } - } -} - -@Composable -fun ConsumeScaffoldPadding( - content: @Composable (contentPadding: PaddingValues) -> Unit, -) { - val contentPadding = LocalScaffoldPadding.current - CompositionLocalProvider( - LocalScaffoldPadding provides PaddingValues(0.dp), - ) { - content(contentPadding) + NestedScrollStretch { + LazyColumn( + modifier = modifier + .addIf(!isChild) { + fillMaxHeight() + }, + contentPadding = contentPadding, + state = state, + content = content, + ) } } diff --git a/lawnchair/src/app/lawnchair/ui/preferences/components/layout/SearchTextField.kt b/lawnchair/src/app/lawnchair/ui/preferences/components/layout/SearchTextField.kt deleted file mode 100644 index 6e158e11f6d..00000000000 --- a/lawnchair/src/app/lawnchair/ui/preferences/components/layout/SearchTextField.kt +++ /dev/null @@ -1,68 +0,0 @@ -package app.lawnchair.ui.preferences.components.layout - -import androidx.compose.foundation.interaction.MutableInteractionSource -import androidx.compose.foundation.text.KeyboardActions -import androidx.compose.foundation.text.KeyboardOptions -import androidx.compose.material.MaterialTheme -import androidx.compose.material.OutlinedTextField -import androidx.compose.material.TextFieldColors -import androidx.compose.material.TextFieldDefaults -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.rounded.Clear -import androidx.compose.runtime.Composable -import androidx.compose.runtime.remember -import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.graphics.Shape -import androidx.compose.ui.text.input.VisualTransformation - -@Composable -fun SearchTextField( - value: String, - onValueChange: (String) -> Unit, - modifier: Modifier = Modifier, - enabled: Boolean = true, - readOnly: Boolean = false, - isError: Boolean = false, - singleLine: Boolean = false, - maxLines: Int = Int.MAX_VALUE, - visualTransformation: VisualTransformation = VisualTransformation.None, - keyboardOptions: KeyboardOptions = KeyboardOptions.Default, - keyboardActions: KeyboardActions = KeyboardActions.Default, - interactionSource: MutableInteractionSource = remember { MutableInteractionSource() }, - shape: Shape = MaterialTheme.shapes.small, - colors: TextFieldColors = TextFieldDefaults.outlinedTextFieldColors( - focusedBorderColor = Color.Transparent, - unfocusedBorderColor = Color.Transparent, - disabledBorderColor = Color.Transparent, - ), - placeholder: @Composable (() -> Unit)? = null, - leadingIcon: @Composable (() -> Unit)? = null, -) { - OutlinedTextField( - value = value, - onValueChange = onValueChange, - modifier = modifier, - enabled = enabled, - readOnly = readOnly, - placeholder = placeholder, - leadingIcon = leadingIcon, - trailingIcon = { - if (value.isNotEmpty()) { - ClickableIcon( - imageVector = Icons.Rounded.Clear, - onClick = { onValueChange("") }, - ) - } - }, - isError = isError, - visualTransformation = visualTransformation, - keyboardOptions = keyboardOptions, - keyboardActions = keyboardActions, - singleLine = singleLine, - maxLines = maxLines, - interactionSource = interactionSource, - shape = shape, - colors = colors, - ) -} diff --git a/lawnchair/src/app/lawnchair/ui/preferences/components/layout/TopBar.kt b/lawnchair/src/app/lawnchair/ui/preferences/components/layout/TopBar.kt index e3a4c617ca9..cf96bbe4c97 100644 --- a/lawnchair/src/app/lawnchair/ui/preferences/components/layout/TopBar.kt +++ b/lawnchair/src/app/lawnchair/ui/preferences/components/layout/TopBar.kt @@ -19,56 +19,63 @@ package app.lawnchair.ui.preferences.components.layout import androidx.activity.compose.LocalOnBackPressedDispatcherOwner import androidx.compose.foundation.layout.RowScope import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.rounded.ArrowBack -import androidx.compose.material.icons.rounded.ArrowForward +import androidx.compose.material.icons.automirrored.rounded.ArrowBack import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.LargeTopAppBar import androidx.compose.material3.Text +import androidx.compose.material3.TopAppBar import androidx.compose.material3.TopAppBarScrollBehavior import androidx.compose.runtime.Composable -import androidx.compose.ui.graphics.vector.ImageVector -import androidx.compose.ui.platform.LocalLayoutDirection import androidx.compose.ui.text.style.TextOverflow -import androidx.compose.ui.unit.LayoutDirection -import androidx.compose.ui.unit.dp @OptIn(ExperimentalMaterial3Api::class) @Composable fun TopBar( backArrowVisible: Boolean, label: String, + isExpandedScreen: Boolean, scrollBehavior: TopAppBarScrollBehavior? = null, actions: @Composable RowScope.() -> Unit = {}, ) { val backDispatcher = LocalOnBackPressedDispatcherOwner.current?.onBackPressedDispatcher - LargeTopAppBar( - title = { - Text( - text = label, - maxLines = 1, - overflow = TextOverflow.Ellipsis, - ) - }, - actions = actions, - navigationIcon = { - if (backArrowVisible) { - ClickableIcon( - imageVector = backIcon(), - onClick = { backDispatcher?.onBackPressed() }, + if (isExpandedScreen) { + TopAppBar( + title = { + Text( + text = label, + maxLines = 1, + overflow = TextOverflow.Ellipsis, ) - } - }, - scrollBehavior = scrollBehavior, - ) -} - -@Composable -fun backIcon(): ImageVector = - if (LocalLayoutDirection.current == LayoutDirection.Ltr) { - Icons.Rounded.ArrowBack + }, + actions = actions, + navigationIcon = { + if (backArrowVisible) { + ClickableIcon( + imageVector = Icons.AutoMirrored.Rounded.ArrowBack, + onClick = { backDispatcher?.onBackPressed() }, + ) + } + }, + scrollBehavior = scrollBehavior, + ) } else { - Icons.Rounded.ArrowForward + LargeTopAppBar( + title = { + Text( + text = label, + ) + }, + actions = actions, + navigationIcon = { + if (backArrowVisible) { + ClickableIcon( + imageVector = Icons.AutoMirrored.Rounded.ArrowBack, + onClick = { backDispatcher?.onBackPressed() }, + ) + } + }, + scrollBehavior = scrollBehavior, + ) } - -val topBarSize = 64.dp +} diff --git a/lawnchair/src/app/lawnchair/ui/preferences/destinations/CustomIconShapePreference.kt b/lawnchair/src/app/lawnchair/ui/preferences/destinations/CustomIconShapePreference.kt index 1b36fab3f40..1abe849decd 100644 --- a/lawnchair/src/app/lawnchair/ui/preferences/destinations/CustomIconShapePreference.kt +++ b/lawnchair/src/app/lawnchair/ui/preferences/destinations/CustomIconShapePreference.kt @@ -12,18 +12,16 @@ import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.requiredWidthIn import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.itemsIndexed -import androidx.compose.material.ContentAlpha -import androidx.compose.material.Icon -import androidx.compose.material.LocalContentAlpha -import androidx.compose.material.RadioButton import androidx.compose.material.icons.Icons import androidx.compose.material.icons.rounded.ArrowDropDown import androidx.compose.material.icons.rounded.ContentCopy import androidx.compose.material.icons.rounded.ContentPaste import androidx.compose.material3.Button +import androidx.compose.material3.Icon import androidx.compose.material3.LocalContentColor import androidx.compose.material3.MaterialTheme import androidx.compose.material3.OutlinedButton +import androidx.compose.material3.RadioButton import androidx.compose.material3.Slider import androidx.compose.material3.Text import androidx.compose.runtime.Composable @@ -45,7 +43,7 @@ import app.lawnchair.icons.shape.IconCornerShape import app.lawnchair.icons.shape.IconShape import app.lawnchair.preferences.getAdapter import app.lawnchair.preferences2.preferenceManager2 -import app.lawnchair.ui.AlertBottomSheetContent +import app.lawnchair.ui.ModalBottomSheetContent import app.lawnchair.ui.preferences.components.IconShapePreview import app.lawnchair.ui.preferences.components.controls.getSteps import app.lawnchair.ui.preferences.components.controls.snapSliderValue @@ -233,7 +231,7 @@ private fun ClipboardButton( description = { description?.let { Text(text = it) } }, startWidget = { val tint = LocalContentColor.current - val contentAlpha = if (enabled) tint.alpha else ContentAlpha.disabled + val contentAlpha = if (enabled) tint.alpha else 0.38f val alpha by animateFloatAsState(targetValue = contentAlpha, label = "") Icon( imageVector = imageVector, @@ -299,8 +297,7 @@ private fun CornerSlider( ) { Text(text = label) CompositionLocalProvider( - LocalContentAlpha provides ContentAlpha.medium, - LocalContentColor provides MaterialTheme.colorScheme.onBackground, + LocalContentColor provides MaterialTheme.colorScheme.onSurfaceVariant, ) { val valueText = stringResource( id = R.string.n_percent, @@ -337,7 +334,7 @@ private fun CornerSlider( .clip(shape = MaterialTheme.shapes.small) .clickable { bottomSheetHandler.show { - AlertBottomSheetContent( + ModalBottomSheetContent( title = { Text(stringResource(id = R.string.icon_shape_corner)) }, buttons = { OutlinedButton(onClick = { bottomSheetHandler.hide() }) { diff --git a/lawnchair/src/app/lawnchair/ui/preferences/destinations/DebugMenuPreferences.kt b/lawnchair/src/app/lawnchair/ui/preferences/destinations/DebugMenuPreferences.kt index 15e2c109bd9..6d65a7069b6 100644 --- a/lawnchair/src/app/lawnchair/ui/preferences/destinations/DebugMenuPreferences.kt +++ b/lawnchair/src/app/lawnchair/ui/preferences/destinations/DebugMenuPreferences.kt @@ -11,7 +11,6 @@ import app.lawnchair.preferences.getAdapter import app.lawnchair.preferences.preferenceManager import app.lawnchair.preferences2.PreferenceManager2 import app.lawnchair.preferences2.preferenceManager2 -import app.lawnchair.ui.preferences.components.FontPreference import app.lawnchair.ui.preferences.components.controls.ClickablePreference import app.lawnchair.ui.preferences.components.controls.MainSwitchPreference import app.lawnchair.ui.preferences.components.controls.SwitchPreference @@ -37,7 +36,6 @@ fun DebugMenuPreferences() { val flags = remember { prefs.debugFlags } val flags2 = remember { prefs2.debugFlags } val textFlags = remember { prefs2.textFlags } - val fontFlags = remember { prefs.fontFlags } val context = LocalContext.current val enableDebug = prefs.enableDebugMenu.getAdapter() @@ -81,12 +79,6 @@ fun DebugMenuPreferences() { label = it.key.name, ) } - fontFlags.forEach { - FontPreference( - fontPref = it, - label = it.key, - ) - } } } } @@ -107,11 +99,3 @@ private val PreferenceManager.debugFlags searchResultSettings, ignoreFeedWhitelist, ) - -private val PreferenceManager.fontFlags - get() = listOf( - fontHeading, - fontHeadingMedium, - fontBody, - fontBodyMedium, - ) diff --git a/lawnchair/src/app/lawnchair/ui/preferences/destinations/FontSelectionPreference.kt b/lawnchair/src/app/lawnchair/ui/preferences/destinations/FontSelectionPreference.kt index 6a4ce72234e..ede4ede0d89 100644 --- a/lawnchair/src/app/lawnchair/ui/preferences/destinations/FontSelectionPreference.kt +++ b/lawnchair/src/app/lawnchair/ui/preferences/destinations/FontSelectionPreference.kt @@ -10,25 +10,22 @@ import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Row -import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.wrapContentWidth import androidx.compose.foundation.lazy.itemsIndexed -import androidx.compose.material.ContentAlpha -import androidx.compose.material.DropdownMenu -import androidx.compose.material.DropdownMenuItem -import androidx.compose.material.RadioButton import androidx.compose.material.icons.Icons import androidx.compose.material.icons.rounded.Add import androidx.compose.material.icons.rounded.ArrowDropDown import androidx.compose.material.icons.rounded.Delete import androidx.compose.material3.ButtonDefaults +import androidx.compose.material3.DropdownMenu +import androidx.compose.material3.DropdownMenuItem import androidx.compose.material3.Icon import androidx.compose.material3.IconButton -import androidx.compose.material3.LocalContentColor import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.RadioButton import androidx.compose.material3.Text import androidx.compose.material3.TextButton import androidx.compose.runtime.Composable @@ -62,7 +59,6 @@ import app.lawnchair.ui.preferences.components.layout.PreferenceGroupItem import app.lawnchair.ui.preferences.components.layout.PreferenceLazyColumn import app.lawnchair.ui.preferences.components.layout.PreferenceSearchScaffold import app.lawnchair.ui.preferences.components.layout.PreferenceTemplate -import app.lawnchair.ui.preferences.components.layout.SearchTextField import app.lawnchair.ui.preferences.components.layout.preferenceGroupItems import app.lawnchair.ui.preferences.preferenceGraph import com.android.launcher3.R @@ -137,33 +133,29 @@ fun FontSelection( } PreferenceSearchScaffold( - searchInput = { - SearchTextField( - value = searchQuery, - onValueChange = { searchQuery = it }, - modifier = Modifier - .fillMaxSize(), - placeholder = { - Text( - text = stringResource(id = R.string.label_search), - color = MaterialTheme.colorScheme.onSurface.copy(alpha = ContentAlpha.medium), - ) - }, - singleLine = true, + value = searchQuery, + onValueChange = { searchQuery = it }, + placeholder = { + Text( + text = stringResource(id = R.string.label_search), + color = MaterialTheme.colorScheme.onSurfaceVariant, ) }, actions = { OverflowMenu { - DropdownMenuItem(onClick = { - fontPref.set(fontPref.defaultValue) - hideMenu() - }) { - Text(text = stringResource(id = R.string.reset_font)) - } + DropdownMenuItem( + onClick = { + fontPref.set(fontPref.defaultValue) + hideMenu() + }, + text = { + Text(text = stringResource(id = R.string.reset_font)) + }, + ) } }, - ) { - PreferenceLazyColumn { + ) { padding -> + PreferenceLazyColumn(padding) { if (!hasFilter) { item(contentType = { ContentType.ADD_BUTTON }) { PreferenceGroupItem( @@ -269,7 +261,7 @@ private fun FontSelectionItem( Icon( imageVector = Icons.Rounded.Delete, contentDescription = stringResource(id = R.string.delete), - tint = LocalContentColor.current.copy(alpha = ContentAlpha.medium), + tint = MaterialTheme.colorScheme.onSurfaceVariant, ) } } @@ -332,15 +324,18 @@ private fun VariantDropdown( onDismissRequest = { showVariants = false }, ) { family.sortedVariants.forEach { font -> - DropdownMenuItem(onClick = { - adapter.onChange(font) - showVariants = false - }) { - Text( - text = font.displayName, - fontFamily = font.composeFontFamily, - ) - } + DropdownMenuItem( + onClick = { + adapter.onChange(font) + showVariants = false + }, + text = { + Text( + text = font.displayName, + fontFamily = font.composeFontFamily, + ) + }, + ) } } } diff --git a/lawnchair/src/app/lawnchair/ui/preferences/destinations/GeneralPreferences.kt b/lawnchair/src/app/lawnchair/ui/preferences/destinations/GeneralPreferences.kt index a1d01cd5f46..cc97d62480e 100644 --- a/lawnchair/src/app/lawnchair/ui/preferences/destinations/GeneralPreferences.kt +++ b/lawnchair/src/app/lawnchair/ui/preferences/destinations/GeneralPreferences.kt @@ -99,17 +99,33 @@ fun GeneralPreferences() { SwitchPreference( adapter = prefs.allowRotation.getAdapter(), label = stringResource(id = R.string.home_screen_rotation_label), - description = stringResource(id = R.string.home_screen_rotaton_description), + description = stringResource(id = R.string.home_screen_rotation_description), ) - val enableFontSelection = prefs2.enableFontSelection.asState().value - if (enableFontSelection) { + } + ExpandAndShrink(prefs2.enableFontSelection.asState().value) { + PreferenceGroup(heading = stringResource(id = R.string.font_label)) { FontPreference( fontPref = prefs.fontWorkspace, - label = stringResource(id = R.string.font_label), + label = stringResource(R.string.fontWorkspace), + ) + FontPreference( + fontPref = prefs.fontHeading, + label = stringResource(R.string.fontHeading), + ) + FontPreference( + fontPref = prefs.fontHeadingMedium, + label = stringResource(R.string.fontHeadingMedium), + ) + FontPreference( + fontPref = prefs.fontBody, + label = stringResource(R.string.fontBody), + ) + FontPreference( + fontPref = prefs.fontBodyMedium, + label = stringResource(R.string.fontBodyMedium), ) } } - val wrapAdaptiveIcons = prefs.wrapAdaptiveIcons.getAdapter() val transparentIconBackground = prefs.transparentIconBackground.getAdapter() PreferenceGroup( diff --git a/lawnchair/src/app/lawnchair/ui/preferences/destinations/HiddenAppsPreferences.kt b/lawnchair/src/app/lawnchair/ui/preferences/destinations/HiddenAppsPreferences.kt index afaede01a7a..d8379032a68 100644 --- a/lawnchair/src/app/lawnchair/ui/preferences/destinations/HiddenAppsPreferences.kt +++ b/lawnchair/src/app/lawnchair/ui/preferences/destinations/HiddenAppsPreferences.kt @@ -20,7 +20,7 @@ import androidx.compose.animation.Crossfade import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.width import androidx.compose.foundation.lazy.rememberLazyListState -import androidx.compose.material.Checkbox +import androidx.compose.material3.Checkbox import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.remember @@ -30,6 +30,7 @@ import androidx.compose.ui.unit.dp import androidx.navigation.NavGraphBuilder import app.lawnchair.preferences.getAdapter import app.lawnchair.preferences2.preferenceManager2 +import app.lawnchair.ui.preferences.LocalIsExpandedScreen import app.lawnchair.ui.preferences.components.AppItem import app.lawnchair.ui.preferences.components.AppItemPlaceholder import app.lawnchair.ui.preferences.components.layout.PreferenceLazyColumn @@ -62,10 +63,11 @@ fun HiddenAppsPreferences() { val state = rememberLazyListState() PreferenceScaffold( label = pageTitle, + isExpandedScreen = LocalIsExpandedScreen.current, ) { Crossfade(targetState = apps.isNotEmpty(), label = "") { present -> if (present) { - PreferenceLazyColumn(state = state) { + PreferenceLazyColumn(it, state = state) { val toggleHiddenApp = { app: App -> val key = app.key.toString() val newSet = apps.asSequence() @@ -93,7 +95,7 @@ fun HiddenAppsPreferences() { } } } else { - PreferenceLazyColumn(enabled = false) { + PreferenceLazyColumn(it, enabled = false) { preferenceGroupItems( count = 20, isFirstChild = true, diff --git a/lawnchair/src/app/lawnchair/ui/preferences/destinations/HomeScreenGridPreferences.kt b/lawnchair/src/app/lawnchair/ui/preferences/destinations/HomeScreenGridPreferences.kt index c2f88286f81..212b94a20d0 100644 --- a/lawnchair/src/app/lawnchair/ui/preferences/destinations/HomeScreenGridPreferences.kt +++ b/lawnchair/src/app/lawnchair/ui/preferences/destinations/HomeScreenGridPreferences.kt @@ -5,8 +5,8 @@ import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.rememberScrollState -import androidx.compose.material.MaterialTheme import androidx.compose.material3.Button +import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.mutableIntStateOf @@ -42,6 +42,7 @@ fun HomeScreenGridPreferences() { val scrollState = rememberScrollState() PreferenceLayout( label = stringResource(id = R.string.home_screen_grid), + isExpandedScreen = true, scrollState = if (isPortrait) null else scrollState, ) { val prefs = preferenceManager() diff --git a/lawnchair/src/app/lawnchair/ui/preferences/destinations/IconPackPreferences.kt b/lawnchair/src/app/lawnchair/ui/preferences/destinations/IconPackPreferences.kt index 8a38f208451..0636d57bbfa 100644 --- a/lawnchair/src/app/lawnchair/ui/preferences/destinations/IconPackPreferences.kt +++ b/lawnchair/src/app/lawnchair/ui/preferences/destinations/IconPackPreferences.kt @@ -120,6 +120,7 @@ fun IconPackPreferences() { PreferenceLayout( label = stringResource(id = R.string.icon_style), + isExpandedScreen = true, scrollState = if (isPortrait) null else scrollState, ) { if (isPortrait) { diff --git a/lawnchair/src/app/lawnchair/ui/preferences/destinations/IconPickerPreference.kt b/lawnchair/src/app/lawnchair/ui/preferences/destinations/IconPickerPreference.kt index bc9f1e61cce..b509ad2e086 100644 --- a/lawnchair/src/app/lawnchair/ui/preferences/destinations/IconPickerPreference.kt +++ b/lawnchair/src/app/lawnchair/ui/preferences/destinations/IconPickerPreference.kt @@ -12,19 +12,14 @@ import androidx.compose.foundation.Image import androidx.compose.foundation.background import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.aspectRatio -import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding -import androidx.compose.material.ContentAlpha -import androidx.compose.material.DropdownMenuItem -import androidx.compose.material.MaterialTheme as Material2Theme +import androidx.compose.material3.DropdownMenuItem import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable -import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.SideEffect import androidx.compose.runtime.collectAsState import androidx.compose.runtime.derivedStateOf @@ -37,7 +32,6 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalDensity -import androidx.compose.ui.platform.LocalLayoutDirection import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import androidx.navigation.NavGraphBuilder @@ -50,11 +44,9 @@ import app.lawnchair.icons.IconPackProvider import app.lawnchair.icons.IconPickerItem import app.lawnchair.icons.filter import app.lawnchair.ui.OverflowMenu -import app.lawnchair.ui.preferences.components.layout.MutablePaddingValues import app.lawnchair.ui.preferences.components.layout.PreferenceGroupDescription import app.lawnchair.ui.preferences.components.layout.PreferenceLazyColumn import app.lawnchair.ui.preferences.components.layout.PreferenceSearchScaffold -import app.lawnchair.ui.preferences.components.layout.SearchTextField import app.lawnchair.ui.preferences.components.layout.verticalGridItems import app.lawnchair.ui.preferences.preferenceGraph import app.lawnchair.ui.util.LazyGridLayout @@ -62,7 +54,6 @@ import app.lawnchair.ui.util.resultSender import app.lawnchair.util.requireSystemService import com.android.launcher3.R import com.google.accompanist.drawablepainter.rememberDrawablePainter -import com.google.accompanist.insets.ui.LocalScaffoldPadding import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.catch import kotlinx.coroutines.launch @@ -117,18 +108,12 @@ fun IconPickerPreference( } PreferenceSearchScaffold( - searchInput = { - SearchTextField( - value = searchQuery, - onValueChange = { searchQuery = it }, - modifier = Modifier.fillMaxSize(), - placeholder = { - Text( - text = iconPack.label, - color = MaterialTheme.colorScheme.onSurface.copy(alpha = ContentAlpha.medium), - ) - }, - singleLine = true, + value = searchQuery, + onValueChange = { searchQuery = it }, + placeholder = { + Text( + text = iconPack.label, + color = MaterialTheme.colorScheme.onSurfaceVariant, ) }, actions = { @@ -140,36 +125,20 @@ fun IconPickerPreference( .setComponent(pickerComponent) pickerLauncher.launch(intent) hideMenu() - }) { + }, text = { Text(text = stringResource(id = R.string.icon_pack_external_picker)) - } + }) } } }, ) { - val scaffoldPadding = LocalScaffoldPadding.current - val innerPadding = remember { MutablePaddingValues() } - val layoutDirection = LocalLayoutDirection.current - innerPadding.left = scaffoldPadding.calculateLeftPadding(layoutDirection) - innerPadding.right = scaffoldPadding.calculateRightPadding(layoutDirection) - innerPadding.bottom = scaffoldPadding.calculateBottomPadding() - - val topPadding = scaffoldPadding.calculateTopPadding() + val scaffoldPadding = it - CompositionLocalProvider(LocalScaffoldPadding provides innerPadding) { - IconPickerGrid( - iconPack = iconPack, - searchQuery = searchQuery, - onClickItem = onClickItem, - modifier = Modifier - .padding(top = topPadding), - ) - } - Spacer( - modifier = Modifier - .background(MaterialTheme.colorScheme.background) - .fillMaxWidth() - .height(topPadding), + IconPickerGrid( + scaffoldPadding = scaffoldPadding, + iconPack = iconPack, + searchQuery = searchQuery, + onClickItem = onClickItem, ) } } @@ -177,6 +146,7 @@ fun IconPickerPreference( @OptIn(ExperimentalFoundationApi::class) @Composable fun IconPickerGrid( + scaffoldPadding: PaddingValues, iconPack: IconPack, searchQuery: String, onClickItem: (item: IconPickerItem) -> Unit, @@ -206,7 +176,7 @@ fun IconPickerGrid( ) } val numColumns by gridLayout.numColumns - PreferenceLazyColumn(modifier = modifier.then(gridLayout.onSizeChanged())) { + PreferenceLazyColumn(scaffoldPadding, modifier = modifier.then(gridLayout.onSizeChanged())) { if (numColumns != 0) { filteredCategories.forEach { category -> stickyHeader { @@ -259,7 +229,7 @@ fun IconPreview( } Box( modifier = Modifier - .clip(Material2Theme.shapes.small) + .clip(MaterialTheme.shapes.small) .clickable(onClick = onClick) .padding(8.dp), ) { diff --git a/lawnchair/src/app/lawnchair/ui/preferences/destinations/PickAppForGesture.kt b/lawnchair/src/app/lawnchair/ui/preferences/destinations/PickAppForGesture.kt index 549b0cca800..eb5b2db4964 100644 --- a/lawnchair/src/app/lawnchair/ui/preferences/destinations/PickAppForGesture.kt +++ b/lawnchair/src/app/lawnchair/ui/preferences/destinations/PickAppForGesture.kt @@ -11,6 +11,7 @@ import androidx.compose.ui.res.stringResource import androidx.navigation.NavGraphBuilder import app.lawnchair.gestures.config.GestureHandlerConfig import app.lawnchair.gestures.handlers.OpenAppTarget +import app.lawnchair.ui.preferences.LocalIsExpandedScreen import app.lawnchair.ui.preferences.components.AppItem import app.lawnchair.ui.preferences.components.AppItemPlaceholder import app.lawnchair.ui.preferences.components.layout.PreferenceLazyColumn @@ -45,10 +46,11 @@ fun PickAppForGesture() { PreferenceScaffold( label = stringResource(id = R.string.pick_app_for_gesture), + isExpandedScreen = LocalIsExpandedScreen.current, ) { Crossfade(targetState = apps.isNotEmpty(), label = "") { present -> if (present) { - PreferenceLazyColumn(state = state) { + PreferenceLazyColumn(it, state = state) { preferenceGroupItems( items = apps, isFirstChild = true, @@ -60,7 +62,7 @@ fun PickAppForGesture() { } } } else { - PreferenceLazyColumn(enabled = false) { + PreferenceLazyColumn(it, enabled = false) { preferenceGroupItems( count = 20, isFirstChild = true, diff --git a/lawnchair/src/app/lawnchair/ui/preferences/destinations/PreferencesDashboard.kt b/lawnchair/src/app/lawnchair/ui/preferences/destinations/PreferencesDashboard.kt index 3ead3f778e2..e3f4ce78c32 100644 --- a/lawnchair/src/app/lawnchair/ui/preferences/destinations/PreferencesDashboard.kt +++ b/lawnchair/src/app/lawnchair/ui/preferences/destinations/PreferencesDashboard.kt @@ -12,13 +12,12 @@ import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding -import androidx.compose.material.DropdownMenuItem -import androidx.compose.material.MaterialTheme import androidx.compose.material.icons.Icons import androidx.compose.material.icons.rounded.Build import androidx.compose.material.icons.rounded.TipsAndUpdates +import androidx.compose.material3.DropdownMenuItem import androidx.compose.material3.Icon -import androidx.compose.material3.MaterialTheme as Material3Theme +import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Surface import androidx.compose.material3.Text import androidx.compose.runtime.Composable @@ -37,9 +36,9 @@ import app.lawnchair.ui.OverflowMenu import app.lawnchair.ui.preferences.LocalNavController import app.lawnchair.ui.preferences.Routes import app.lawnchair.ui.preferences.components.AnnouncementPreference +import app.lawnchair.ui.preferences.components.controls.PreferenceCategory import app.lawnchair.ui.preferences.components.controls.WarningPreference import app.lawnchair.ui.preferences.components.layout.ClickableIcon -import app.lawnchair.ui.preferences.components.layout.PreferenceCategory import app.lawnchair.ui.preferences.components.layout.PreferenceDivider import app.lawnchair.ui.preferences.components.layout.PreferenceLayout import app.lawnchair.ui.preferences.components.layout.PreferenceTemplate @@ -155,34 +154,34 @@ fun PreferencesOverflowMenu() { DropdownMenuItem(onClick = { openAppInfo(context) hideMenu() - }) { + }, text = { Text(text = stringResource(id = R.string.app_info_drop_target_label)) - } + }) DropdownMenuItem(onClick = { restartLauncher(context) hideMenu() - }) { + }, text = { Text(text = stringResource(id = R.string.debug_restart_launcher)) - } + }) DropdownMenuItem(onClick = { navController.navigate(experimentalFeaturesRoute) hideMenu() - }) { + }, text = { Text(text = stringResource(id = R.string.experimental_features_label)) - } + }) PreferenceDivider(modifier = Modifier.padding(vertical = 8.dp)) DropdownMenuItem(onClick = { navController.navigate("/${Routes.CREATE_BACKUP}/") hideMenu() - }) { + }, text = { Text(text = stringResource(id = R.string.create_backup)) - } + }) DropdownMenuItem(onClick = { openRestoreBackup() hideMenu() - }) { + }, text = { Text(text = stringResource(id = R.string.restore_backup)) - } + }) } } @@ -191,11 +190,11 @@ fun PreferencesDebugWarning() { Surface( modifier = Modifier.padding(horizontal = 16.dp), shape = MaterialTheme.shapes.large, - color = Material3Theme.colorScheme.errorContainer, + color = MaterialTheme.colorScheme.errorContainer, ) { WarningPreference( // Don't move to strings.xml, no need to translate this warning - text = "You are currently using a development build. Use at your own risk!", + text = "You are using a development build, which may contain bugs and broken features. Use at your own risk!", ) } } @@ -206,7 +205,7 @@ fun PreferencesSetDefaultLauncherWarning() { Surface( modifier = Modifier.padding(horizontal = 16.dp), shape = MaterialTheme.shapes.large, - color = Material3Theme.colorScheme.surfaceVariant, + color = MaterialTheme.colorScheme.surfaceVariant, ) { PreferenceTemplate( modifier = Modifier.clickable { @@ -219,13 +218,13 @@ fun PreferencesSetDefaultLauncherWarning() { description = { Text( text = stringResource(id = R.string.set_default_launcher_tip), - color = androidx.compose.material3.MaterialTheme.colorScheme.onSurfaceVariant, + color = MaterialTheme.colorScheme.onSurfaceVariant, ) }, startWidget = { Icon( imageVector = Icons.Rounded.TipsAndUpdates, - tint = androidx.compose.material3.MaterialTheme.colorScheme.onSurfaceVariant, + tint = MaterialTheme.colorScheme.onSurfaceVariant, contentDescription = null, ) }, diff --git a/lawnchair/src/app/lawnchair/ui/preferences/destinations/QuickstepPreferences.kt b/lawnchair/src/app/lawnchair/ui/preferences/destinations/QuickstepPreferences.kt index 3cfbaa9b0b3..3ceb3227746 100644 --- a/lawnchair/src/app/lawnchair/ui/preferences/destinations/QuickstepPreferences.kt +++ b/lawnchair/src/app/lawnchair/ui/preferences/destinations/QuickstepPreferences.kt @@ -1,7 +1,7 @@ package app.lawnchair.ui.preferences.destinations import androidx.compose.foundation.layout.padding -import androidx.compose.material.MaterialTheme +import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Surface import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue @@ -109,7 +109,7 @@ fun QuickSwitchIgnoredWarning() { Surface( modifier = Modifier.padding(horizontal = 16.dp), shape = MaterialTheme.shapes.large, - color = androidx.compose.material3.MaterialTheme.colorScheme.errorContainer, + color = MaterialTheme.colorScheme.errorContainer, ) { WarningPreference( text = stringResource(id = R.string.quickswitch_ignored_warning), diff --git a/lawnchair/src/app/lawnchair/ui/preferences/destinations/SearchProviderPreferences.kt b/lawnchair/src/app/lawnchair/ui/preferences/destinations/SearchProviderPreferences.kt index 0d06dcc257d..7ecb9950f70 100644 --- a/lawnchair/src/app/lawnchair/ui/preferences/destinations/SearchProviderPreferences.kt +++ b/lawnchair/src/app/lawnchair/ui/preferences/destinations/SearchProviderPreferences.kt @@ -22,7 +22,7 @@ import app.lawnchair.preferences.getAdapter import app.lawnchair.preferences2.preferenceManager2 import app.lawnchair.qsb.providers.QsbSearchProvider import app.lawnchair.qsb.providers.QsbSearchProviderType -import app.lawnchair.ui.AlertBottomSheetContent +import app.lawnchair.ui.ModalBottomSheetContent import app.lawnchair.ui.preferences.components.layout.ClickableIcon import app.lawnchair.ui.preferences.components.layout.DividerColumn import app.lawnchair.ui.preferences.components.layout.ExpandAndShrink @@ -200,7 +200,7 @@ private fun SponsorDisclaimer( sponsor: String, onAcknowledge: () -> Unit, ) { - AlertBottomSheetContent( + ModalBottomSheetContent( buttons = { OutlinedButton(onClick = onAcknowledge) { Text(text = stringResource(id = android.R.string.ok)) diff --git a/lawnchair/src/app/lawnchair/ui/preferences/destinations/SmartspacePreferences.kt b/lawnchair/src/app/lawnchair/ui/preferences/destinations/SmartspacePreferences.kt index 02bf65f2691..020c3707f92 100644 --- a/lawnchair/src/app/lawnchair/ui/preferences/destinations/SmartspacePreferences.kt +++ b/lawnchair/src/app/lawnchair/ui/preferences/destinations/SmartspacePreferences.kt @@ -155,7 +155,7 @@ fun SmartspaceProviderPreference( @Composable fun SmartspacePreview() { - val themeRes = if (isSelectedThemeDark()) R.style.AppTheme_Dark else R.style.AppTheme_DarkText + val themeRes = if (isSelectedThemeDark) R.style.AppTheme_Dark else R.style.AppTheme_DarkText val context = LocalContext.current val themedContext = remember(themeRes) { ContextThemeWrapper(context, themeRes) } diff --git a/lawnchair/src/app/lawnchair/ui/theme/Color.kt b/lawnchair/src/app/lawnchair/ui/theme/Color.kt index edec3764538..7fe3c3a6f27 100644 --- a/lawnchair/src/app/lawnchair/ui/theme/Color.kt +++ b/lawnchair/src/app/lawnchair/ui/theme/Color.kt @@ -7,11 +7,9 @@ import android.view.ContextThemeWrapper import androidx.annotation.ColorInt import androidx.compose.material3.MaterialTheme import androidx.compose.runtime.Composable -import androidx.compose.ui.unit.dp import androidx.core.graphics.ColorUtils import app.lawnchair.theme.UiColorMode import app.lawnchair.theme.color.ColorTokens -import app.lawnchair.theme.surfaceColorAtElevation import com.android.launcher3.R import com.android.launcher3.Utilities import com.android.launcher3.util.Themes @@ -63,4 +61,4 @@ fun Context.getSystemAccent(darkTheme: Boolean): Int { } @Composable -fun dividerColor() = MaterialTheme.colorScheme.surfaceColorAtElevation(32.dp) +fun dividerColor() = MaterialTheme.colorScheme.surfaceVariant diff --git a/lawnchair/src/app/lawnchair/ui/theme/Shape.kt b/lawnchair/src/app/lawnchair/ui/theme/Shape.kt index 92a4a860ab4..0804f4120fb 100644 --- a/lawnchair/src/app/lawnchair/ui/theme/Shape.kt +++ b/lawnchair/src/app/lawnchair/ui/theme/Shape.kt @@ -17,11 +17,13 @@ package app.lawnchair.ui.theme import androidx.compose.foundation.shape.RoundedCornerShape -import androidx.compose.material.Shapes +import androidx.compose.material3.Shapes import androidx.compose.ui.unit.dp val Shapes = Shapes( + extraSmall = RoundedCornerShape(4.dp), small = RoundedCornerShape(8.dp), - medium = RoundedCornerShape(8.dp), - large = RoundedCornerShape(12.dp), + medium = RoundedCornerShape(12.dp), + large = RoundedCornerShape(16.dp), + extraLarge = RoundedCornerShape(28.dp), ) diff --git a/lawnchair/src/app/lawnchair/ui/theme/Theme.kt b/lawnchair/src/app/lawnchair/ui/theme/Theme.kt index 643c436dab7..27300818eb8 100644 --- a/lawnchair/src/app/lawnchair/ui/theme/Theme.kt +++ b/lawnchair/src/app/lawnchair/ui/theme/Theme.kt @@ -17,9 +17,8 @@ package app.lawnchair.ui.theme import androidx.compose.foundation.isSystemInDarkTheme -import androidx.compose.material.MaterialTheme import androidx.compose.material3.ColorScheme -import androidx.compose.material3.MaterialTheme as Material3Theme +import androidx.compose.material3.MaterialTheme import androidx.compose.runtime.Composable import androidx.compose.runtime.DisposableEffect import androidx.compose.runtime.getValue @@ -32,29 +31,23 @@ import app.lawnchair.preferences.preferenceManager import app.lawnchair.preferences2.asState import app.lawnchair.preferences2.preferenceManager2 import app.lawnchair.theme.ThemeProvider -import app.lawnchair.theme.m3ColorScheme -import app.lawnchair.theme.materialColors +import app.lawnchair.theme.toM3ColorScheme import app.lawnchair.ui.preferences.components.ThemeChoice import app.lawnchair.wallpaper.WallpaperManagerCompat import com.android.launcher3.Utilities @Composable fun LawnchairTheme( - darkTheme: Boolean = isSelectedThemeDark(), + darkTheme: Boolean = isSelectedThemeDark, content: @Composable () -> Unit, ) { val colorScheme = getColorScheme(darkTheme = darkTheme) MaterialTheme( - colors = materialColors(colorScheme, darkTheme), + colorScheme = colorScheme, typography = Typography, + content = content, shapes = Shapes, - ) { - Material3Theme( - colorScheme = colorScheme, - typography = M3Typography, - content = content, - ) - } + ) } @Composable @@ -65,39 +58,40 @@ fun getColorScheme(darkTheme: Boolean): ColorScheme { val colorScheme = remember(accentColor) { ThemeProvider.INSTANCE.get(context).colorScheme } +// +// colorScheme.accent1 - return m3ColorScheme(colorScheme = colorScheme, isDark = darkTheme) + return colorScheme.toM3ColorScheme(isDark = darkTheme) } -@Composable -fun isSelectedThemeDark(): Boolean { - val themeChoice by preferenceManager().launcherTheme.observeAsState() - return when (themeChoice) { - ThemeChoice.LIGHT -> false - ThemeChoice.DARK -> true - else -> isAutoThemeDark() +val isSelectedThemeDark: Boolean + @Composable get() { + val themeChoice by preferenceManager().launcherTheme.observeAsState() + return when (themeChoice) { + ThemeChoice.LIGHT -> false + ThemeChoice.DARK -> true + else -> isAutoThemeDark + } } -} -@Composable -fun isAutoThemeDark() = when { +val isAutoThemeDark: Boolean @Composable get() = when { Utilities.ATLEAST_P -> isSystemInDarkTheme() - else -> wallpaperSupportsDarkTheme() + else -> wallpaperSupportsDarkTheme } -@Composable -fun wallpaperSupportsDarkTheme(): Boolean { - val wallpaperManager = WallpaperManagerCompat.INSTANCE.get(LocalContext.current) - var supportsDarkTheme by remember { mutableStateOf(wallpaperManager.supportsDarkTheme) } +val wallpaperSupportsDarkTheme: Boolean + @Composable get() { + val wallpaperManager = WallpaperManagerCompat.INSTANCE.get(LocalContext.current) + var supportsDarkTheme by remember { mutableStateOf(wallpaperManager.supportsDarkTheme) } - DisposableEffect(wallpaperManager) { - val listener = object : WallpaperManagerCompat.OnColorsChangedListener { - override fun onColorsChanged() { - supportsDarkTheme = wallpaperManager.supportsDarkTheme + DisposableEffect(wallpaperManager) { + val listener = object : WallpaperManagerCompat.OnColorsChangedListener { + override fun onColorsChanged() { + supportsDarkTheme = wallpaperManager.supportsDarkTheme + } } + wallpaperManager.addOnChangeListener(listener) + onDispose { wallpaperManager.removeOnChangeListener(listener) } } - wallpaperManager.addOnChangeListener(listener) - onDispose { wallpaperManager.removeOnChangeListener(listener) } + return supportsDarkTheme } - return supportsDarkTheme -} diff --git a/lawnchair/src/app/lawnchair/ui/theme/Type.kt b/lawnchair/src/app/lawnchair/ui/theme/Type.kt index 045d19e635b..63d450ce948 100644 --- a/lawnchair/src/app/lawnchair/ui/theme/Type.kt +++ b/lawnchair/src/app/lawnchair/ui/theme/Type.kt @@ -16,9 +16,7 @@ package app.lawnchair.ui.theme -import androidx.compose.material.Typography -import androidx.compose.material3.Typography as Material3Typography -import androidx.compose.ui.text.TextStyle +import androidx.compose.material3.Typography import androidx.compose.ui.text.font.Font import androidx.compose.ui.text.font.FontFamily import androidx.compose.ui.text.font.FontWeight @@ -32,77 +30,8 @@ private val InterFontFamily = FontFamily( Font(R.font.inter_bold, FontWeight.Bold), ) +private val base = Typography() val Typography = Typography( - defaultFontFamily = InterFontFamily, - h1 = TextStyle( - fontWeight = FontWeight.Light, - fontSize = 96.sp, - letterSpacing = (-1.5).sp, - ), - h2 = TextStyle( - fontWeight = FontWeight.Light, - fontSize = 60.sp, - letterSpacing = (-0.5).sp, - ), - h3 = TextStyle( - fontWeight = FontWeight.Normal, - fontSize = 48.sp, - letterSpacing = 0.sp, - ), - h4 = TextStyle( - fontWeight = FontWeight.SemiBold, - fontSize = 30.sp, - letterSpacing = 0.sp, - ), - h5 = TextStyle( - fontWeight = FontWeight.SemiBold, - fontSize = 24.sp, - letterSpacing = 0.sp, - ), - h6 = TextStyle( - fontSize = 20.sp, - letterSpacing = (-0.5).sp, - ), - subtitle1 = TextStyle( - fontWeight = FontWeight.Normal, - fontSize = 16.sp, - ), - subtitle2 = TextStyle( - fontWeight = FontWeight.Bold, - fontSize = 14.sp, - letterSpacing = 0.1.sp, - ), - body1 = TextStyle( - fontWeight = FontWeight.Normal, - fontSize = 16.sp, - letterSpacing = 0.sp, - lineHeight = 20.sp, - ), - body2 = TextStyle( - fontWeight = FontWeight.Normal, - fontSize = 14.sp, - lineHeight = 20.sp, - letterSpacing = 0.1.sp, - ), - button = TextStyle( - fontWeight = FontWeight.SemiBold, - fontSize = 14.sp, - letterSpacing = 0.25.sp, - ), - caption = TextStyle( - fontWeight = FontWeight.Bold, - fontSize = 12.sp, - letterSpacing = 0.15.sp, - ), - overline = TextStyle( - fontWeight = FontWeight.SemiBold, - fontSize = 12.sp, - letterSpacing = 1.sp, - ), -) - -private val base = Material3Typography() -val M3Typography = Material3Typography( displayLarge = base.displayLarge.copy(fontFamily = InterFontFamily), displayMedium = base.displayMedium.copy(fontFamily = InterFontFamily), displaySmall = base.displaySmall.copy(fontFamily = InterFontFamily), diff --git a/lawnchair/src/app/lawnchair/ui/util/PreviewUtils.kt b/lawnchair/src/app/lawnchair/ui/util/PreviewUtils.kt new file mode 100644 index 00000000000..9d768c59f2c --- /dev/null +++ b/lawnchair/src/app/lawnchair/ui/util/PreviewUtils.kt @@ -0,0 +1,37 @@ +package app.lawnchair.ui.util + +import android.content.res.Configuration +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.tooling.preview.Wallpapers + +@Preview( + apiLevel = 33, + name = "Normal", + showBackground = true, + wallpaper = Wallpapers.NONE, +) +@Preview( + apiLevel = 33, + name = "Normal Night", + showBackground = true, + uiMode = Configuration.UI_MODE_NIGHT_YES, + wallpaper = Wallpapers.NONE, +) +@Preview( + apiLevel = 33, + name = "Themed", + showBackground = true, + wallpaper = Wallpapers.RED_DOMINATED_EXAMPLE, +) +@Preview( + apiLevel = 33, + name = "Themed Night", + showBackground = true, + uiMode = Configuration.UI_MODE_NIGHT_YES, + wallpaper = Wallpapers.RED_DOMINATED_EXAMPLE, +) +annotation class PreviewLawnchair + +object PreviewUtils { + // todo +} diff --git a/lawnchair/src/app/lawnchair/ui/util/ProvideBottomSheetHandler.kt b/lawnchair/src/app/lawnchair/ui/util/ProvideBottomSheetHandler.kt index 16ac5c59ae3..1ccbe4c63ce 100644 --- a/lawnchair/src/app/lawnchair/ui/util/ProvideBottomSheetHandler.kt +++ b/lawnchair/src/app/lawnchair/ui/util/ProvideBottomSheetHandler.kt @@ -16,19 +16,12 @@ package app.lawnchair.ui.util -import androidx.activity.compose.BackHandler -import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.WindowInsets -import androidx.compose.foundation.layout.displayCutout -import androidx.compose.foundation.layout.statusBars -import androidx.compose.foundation.shape.CornerSize -import androidx.compose.material.ExperimentalMaterialApi -import androidx.compose.material.MaterialTheme as Material2Theme -import androidx.compose.material.ModalBottomSheetLayout -import androidx.compose.material.ModalBottomSheetState -import androidx.compose.material.ModalBottomSheetValue -import androidx.compose.material3.LocalContentColor -import androidx.compose.material3.MaterialTheme +import androidx.compose.foundation.layout.navigationBars +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.ModalBottomSheet +import androidx.compose.material3.SheetValue +import androidx.compose.material3.rememberModalBottomSheetState import androidx.compose.runtime.Composable import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.ReadOnlyComposable @@ -38,12 +31,7 @@ import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.setValue import androidx.compose.runtime.staticCompositionLocalOf -import androidx.compose.ui.Modifier -import androidx.compose.ui.layout.layout -import androidx.compose.ui.platform.LocalDensity -import androidx.compose.ui.unit.Constraints import androidx.compose.ui.unit.dp -import kotlin.math.max import kotlinx.coroutines.launch internal val LocalBottomSheetHandler = staticCompositionLocalOf { BottomSheetHandler() } @@ -53,62 +41,57 @@ val bottomSheetHandler: BottomSheetHandler @ReadOnlyComposable get() = LocalBottomSheetHandler.current -@OptIn(ExperimentalMaterialApi::class) +/** + * Provides the handler for managing the bottom sheets in preferences. + */ +@OptIn(ExperimentalMaterial3Api::class) @Composable fun ProvideBottomSheetHandler( content: @Composable () -> Unit, ) { val coroutineScope = rememberCoroutineScope() var onDismiss by remember { mutableStateOf({}) } - val density = LocalDensity.current - val bottomSheetState = remember { - ModalBottomSheetState( - initialValue = ModalBottomSheetValue.Hidden, - density = density, - confirmValueChange = { - if (it == ModalBottomSheetValue.Hidden) onDismiss() - true - }, - ) - } + val bottomSheetState = rememberModalBottomSheetState( + confirmValueChange = { + if (it == SheetValue.Hidden) onDismiss() + true + }, + ) var bottomSheetContent by remember { mutableStateOf(emptyBottomSheetContent) } + var showBottomSheet by remember { mutableStateOf(false) } val bottomSheetHandler = remember { BottomSheetHandler( show = { sheetContent -> + showBottomSheet = true bottomSheetContent = BottomSheetContent(content = sheetContent) - if (bottomSheetState.isVisible.not()) coroutineScope.launch { bottomSheetState.show() } }, hide = { - onDismiss() - coroutineScope.launch { - bottomSheetState.hide() + coroutineScope.launch { bottomSheetState.hide() }.invokeOnCompletion { + if (!bottomSheetState.isVisible) { + showBottomSheet = false + } } }, - onDismiss = { - onDismiss = it - }, - ) + ) { + onDismiss = it + } } - ModalBottomSheetLayout( - sheetContent = { - BackHandler(enabled = bottomSheetState.isVisible) { - bottomSheetHandler.hide() - } - CompositionLocalProvider(LocalContentColor provides MaterialTheme.colorScheme.onSurface) { - StatusBarOffset { - bottomSheetContent.content() - } + CompositionLocalProvider(LocalBottomSheetHandler provides bottomSheetHandler) { + content() + + val windowInsets = if (bottomSheetState.isVisible) WindowInsets.navigationBars else WindowInsets(0.dp) + + if (showBottomSheet) { + ModalBottomSheet( + sheetState = bottomSheetState, + onDismissRequest = { + showBottomSheet = false + }, + windowInsets = windowInsets, + ) { + bottomSheetContent.content() } - }, - sheetState = bottomSheetState, - sheetShape = Material2Theme.shapes.large.copy( - bottomStart = CornerSize(0.dp), - bottomEnd = CornerSize(0.dp), - ), - ) { - CompositionLocalProvider(LocalBottomSheetHandler provides bottomSheetHandler) { - content() } } } @@ -118,35 +101,3 @@ class BottomSheetHandler( val hide: () -> Unit = {}, val onDismiss: (() -> Unit) -> Unit = {}, ) - -@Composable -fun StatusBarOffset( - content: @Composable () -> Unit, -) { - val statusBar = WindowInsets.statusBars.getTop(LocalDensity.current) - val displayCutout = WindowInsets.displayCutout.getTop(LocalDensity.current) - val statusBarHeight = max(statusBar, displayCutout) - val topOffset = statusBarHeight + with(LocalDensity.current) { 8.dp.roundToPx() } - - Box( - modifier = Modifier - .layout { measurable, constraints -> - val newConstraints = Constraints( - minWidth = constraints.minWidth, - maxWidth = constraints.maxWidth, - minHeight = constraints.minHeight, - maxHeight = when (constraints.maxHeight) { - Constraints.Infinity -> Constraints.Infinity - else -> constraints.maxHeight - topOffset - }, - ) - val placeable = measurable.measure(newConstraints) - - layout(placeable.width, placeable.height) { - placeable.placeRelative(0, 0) - } - }, - ) { - content() - } -} diff --git a/lawnchair/src/app/lawnchair/views/ComposeBottomSheet.kt b/lawnchair/src/app/lawnchair/views/ComposeBottomSheet.kt index 14c90ca4e3e..067bb69fc0e 100644 --- a/lawnchair/src/app/lawnchair/views/ComposeBottomSheet.kt +++ b/lawnchair/src/app/lawnchair/views/ComposeBottomSheet.kt @@ -17,10 +17,8 @@ import androidx.compose.foundation.layout.ime import androidx.compose.foundation.layout.only import androidx.compose.foundation.layout.padding import androidx.compose.foundation.shape.RoundedCornerShape -import androidx.compose.material.LocalContentColor -import androidx.compose.material.MaterialTheme -import androidx.compose.material3.LocalContentColor as M3LocalContentColor -import androidx.compose.material3.MaterialTheme as Material3Theme +import androidx.compose.material3.LocalContentColor +import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Surface import androidx.compose.runtime.Composable import androidx.compose.runtime.CompositionLocalProvider @@ -155,7 +153,8 @@ class ComposeBottomSheet(context: Context) : @Composable private fun SystemUi(setStatusBar: Boolean = true, setNavBar: Boolean = true) { - val useDarkIcons = MaterialTheme.colors.isLight + // todo change to isLight + val useDarkIcons = true SideEffect { var flags = 0 @@ -188,8 +187,8 @@ class ComposeBottomSheet(context: Context) : LawnchairTheme { ProvideLifecycleState { CompositionLocalProvider( - LocalContentColor provides MaterialTheme.colors.onSurface, - M3LocalContentColor provides Material3Theme.colorScheme.onSurface, + LocalContentColor provides MaterialTheme.colorScheme.onSurface, + LocalContentColor provides MaterialTheme.colorScheme.onSurface, ) { content() } @@ -214,7 +213,7 @@ class ComposeBottomSheet(context: Context) : modifier = Modifier .fillMaxWidth(), shape = backgroundShape, - color = Material3Theme.colorScheme.background, + color = MaterialTheme.colorScheme.background, ) { Box( modifier = Modifier From bdb1cb81d1b58d06e0f986e3432786e564a28db5 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 30 Mar 2024 12:42:17 +0800 Subject: [PATCH 5/7] Update plugin app.cash.licensee to v1.11.0 (#4162) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 63c3fa893ed..e163d6478b1 100644 --- a/build.gradle +++ b/build.gradle @@ -12,7 +12,7 @@ plugins { id 'org.jetbrains.kotlin.plugin.serialization' version "1.9.23" id "com.google.devtools.ksp" version "1.9.23-1.0.19" id 'com.google.protobuf' version "0.9.4" - id 'app.cash.licensee' version "1.10.0" + id 'app.cash.licensee' version "1.11.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 '6.25.0' From daffc89acea5a29d4690f8b6ca261fcd494ffe59 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 30 Mar 2024 12:42:25 +0800 Subject: [PATCH 6/7] Update Dagger to v2.51.1 (#4161) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index e163d6478b1..e19e6358e05 100644 --- a/build.gradle +++ b/build.gradle @@ -77,7 +77,7 @@ allprojects { ext { FRAMEWORK_PREBUILTS_DIR = "$rootDir/prebuilts/libs" - daggerVersion = '2.51' + daggerVersion = '2.51.1' addFrameworkJar = { String name -> def frameworkJar = new File(FRAMEWORK_PREBUILTS_DIR, name) From 6df8a2648309bb520dd6d6576b5989f8543b55ce Mon Sep 17 00:00:00 2001 From: Goooler Date: Sat, 30 Mar 2024 13:18:19 +0800 Subject: [PATCH 7/7] Simplify Licensee output dependency --- build.gradle | 31 +++++++++++++++++-------------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/build.gradle b/build.gradle index e19e6358e05..85469cd3bc1 100644 --- a/build.gradle +++ b/build.gradle @@ -146,20 +146,6 @@ android { buildConfigField "int", "QUICKSTEP_MIN_SDK", quickstepMinSdk buildConfigField "int", "QUICKSTEP_MAX_SDK", quickstepMaxSdk } - androidComponents { - onVariants(selector().all()) { variant -> - def capName = variant.name.capitalize() - def licenseeTask = tasks.named("licenseeAndroid$capName", LicenseeTask) - def copyArtifactsTask = tasks.register("copy${capName}Artifacts", Copy) { - dependsOn(licenseeTask) - from(licenseeTask.map { it.outputDir.file("artifacts.json") }) - into(layout.buildDirectory.dir("generated/dependencyAssets/${variant.name}")) - } - variant.sources.assets?.addGeneratedSourceDirectory(licenseeTask) { - objects.directoryProperty().fileProvider(copyArtifactsTask.map { it.destinationDir }) - } - } - } applicationVariants.configureEach { variant -> variant.outputs.configureEach { @@ -310,6 +296,23 @@ android { } } +androidComponents { + onVariants(selector().all()) { variant -> + def capName = variant.name.capitalize() + def licenseeTask = tasks.named("licenseeAndroid$capName", LicenseeTask) + def copyArtifactsTask = tasks.register("copy${capName}Artifacts", Copy) { + dependsOn(licenseeTask) + from(licenseeTask.map { it.jsonOutput }) + // Copy artifacts.json to a new directory. + into(layout.buildDirectory.dir("generated/dependencyAssets/${variant.name}")) + } + variant.sources.assets?.addGeneratedSourceDirectory(licenseeTask) { + // Avoid using LicenseeTask::outputDir as it contains extra files that we don't need. + objects.directoryProperty().fileProvider(copyArtifactsTask.map { it.destinationDir }) + } + } +} + addFrameworkJar('framework-14.jar') dependencies {