diff --git a/i18n/src/main/res/values/strings.xml b/i18n/src/main/res/values/strings.xml index 3f911830..004e2fb7 100644 --- a/i18n/src/main/res/values/strings.xml +++ b/i18n/src/main/res/values/strings.xml @@ -617,6 +617,7 @@ Ignore media sessions of apps that are not music apps Style Customize search bar appearance + Color Open keyboard Automatically show the keyboard when opening the search Hidden search results diff --git a/preferences/src/main/java/de/mm20/launcher2/preferences/Defaults.kt b/preferences/src/main/java/de/mm20/launcher2/preferences/Defaults.kt index 9e54e865..1737a70e 100644 --- a/preferences/src/main/java/de/mm20/launcher2/preferences/Defaults.kt +++ b/preferences/src/main/java/de/mm20/launcher2/preferences/Defaults.kt @@ -2,6 +2,7 @@ package de.mm20.launcher2.preferences import android.content.Context import android.graphics.Color +import de.mm20.launcher2.preferences.Settings.SearchBarSettings.SearchBarColors import scheme.Scheme fun createFactorySettings(context: Context): Settings { @@ -133,6 +134,7 @@ fun createFactorySettings(context: Context): Settings { Settings.SearchBarSettings.newBuilder() .setSearchBarStyle(Settings.SearchBarSettings.SearchBarStyle.Transparent) .setAutoFocus(false) + .setColor(SearchBarColors.Auto) .build() ) .setIcons( diff --git a/preferences/src/main/proto/settings.proto b/preferences/src/main/proto/settings.proto index e5383b21..d12b9158 100644 --- a/preferences/src/main/proto/settings.proto +++ b/preferences/src/main/proto/settings.proto @@ -216,6 +216,12 @@ message Settings { } SearchBarStyle search_bar_style = 1; bool auto_focus = 2; + enum SearchBarColors { + Auto = 0; + Light = 1; + Dark = 2; + } + SearchBarColors color = 3; } SearchBarSettings search_bar = 20; diff --git a/ui/src/main/java/de/mm20/launcher2/ui/launcher/search/SearchBar.kt b/ui/src/main/java/de/mm20/launcher2/ui/launcher/search/SearchBar.kt index ec999652..aaa18cc1 100644 --- a/ui/src/main/java/de/mm20/launcher2/ui/launcher/search/SearchBar.kt +++ b/ui/src/main/java/de/mm20/launcher2/ui/launcher/search/SearchBar.kt @@ -44,12 +44,14 @@ import coil.compose.AsyncImage import de.mm20.launcher2.ktx.tryStartActivity import de.mm20.launcher2.preferences.LauncherDataStore import de.mm20.launcher2.preferences.Settings.SearchBarSettings +import de.mm20.launcher2.preferences.Settings.SearchBarSettings.SearchBarColors import de.mm20.launcher2.search.data.Websearch import de.mm20.launcher2.ui.R import de.mm20.launcher2.ui.component.LauncherCard import de.mm20.launcher2.ui.launcher.LauncherActivityVM import de.mm20.launcher2.ui.layout.BottomReversed import de.mm20.launcher2.ui.locals.LocalCardStyle +import de.mm20.launcher2.ui.locals.LocalPreferDarkContentOverWallpaper import de.mm20.launcher2.ui.settings.SettingsActivity import kotlinx.coroutines.awaitCancellation import kotlinx.coroutines.flow.map @@ -72,6 +74,9 @@ fun SearchBar( val style by remember { dataStore.data.map { it.searchBar.searchBarStyle } } .collectAsState(SearchBarSettings.SearchBarStyle.Hidden) + val color by remember { dataStore.data.map { it.searchBar.color } } + .collectAsState(SearchBarSettings.SearchBarColors.Auto) + val focusManager = LocalFocusManager.current val focusRequester = remember { FocusRequester() } @@ -135,7 +140,8 @@ fun SearchBar( onUnfocus = { onFocusChange(false) }, - reverse = reverse + reverse = reverse, + darkColors = color == SearchBarColors.Dark || color == SearchBarColors.Auto && LocalPreferDarkContentOverWallpaper.current ) } @@ -152,6 +158,7 @@ fun SearchBar( onUnfocus: () -> Unit = {}, focusRequester: FocusRequester = remember { FocusRequester() }, reverse: Boolean = false, + darkColors: Boolean = false, ) { val context = LocalContext.current @@ -212,7 +219,7 @@ fun SearchBar( }) { when { style != SearchBarSettings.SearchBarStyle.Transparent -> MaterialTheme.colorScheme.onSurface - it == SearchBarLevel.Resting -> Color.White + it == SearchBarLevel.Resting -> if (darkColors) Color(0,0,0, 180) else Color.White else -> MaterialTheme.colorScheme.onSurface } } diff --git a/ui/src/main/java/de/mm20/launcher2/ui/settings/appearance/AppearanceSettingsScreen.kt b/ui/src/main/java/de/mm20/launcher2/ui/settings/appearance/AppearanceSettingsScreen.kt index 733fef6f..01fe1275 100644 --- a/ui/src/main/java/de/mm20/launcher2/ui/settings/appearance/AppearanceSettingsScreen.kt +++ b/ui/src/main/java/de/mm20/launcher2/ui/settings/appearance/AppearanceSettingsScreen.kt @@ -2,6 +2,7 @@ package de.mm20.launcher2.ui.settings.appearance import android.graphics.drawable.ColorDrawable import androidx.appcompat.app.AppCompatActivity +import androidx.compose.animation.AnimatedVisibility import androidx.compose.foundation.background import androidx.compose.foundation.layout.* import androidx.compose.foundation.lazy.grid.GridCells @@ -33,6 +34,8 @@ import de.mm20.launcher2.ktx.isAtLeastApiLevel import de.mm20.launcher2.preferences.Settings.* import de.mm20.launcher2.preferences.Settings.AppearanceSettings.ColorScheme import de.mm20.launcher2.preferences.Settings.AppearanceSettings.Theme +import de.mm20.launcher2.preferences.Settings.SearchBarSettings.SearchBarColors +import de.mm20.launcher2.preferences.Settings.SearchBarSettings.SearchBarStyle import de.mm20.launcher2.preferences.Settings.SystemBarsSettings.SystemBarColors import de.mm20.launcher2.ui.R import de.mm20.launcher2.ui.component.ShapedLauncherIcon @@ -250,6 +253,21 @@ fun AppearanceSettingsScreen() { viewModel.setSearchBarStyle(it) } ) + AnimatedVisibility(searchBarStyle == SearchBarStyle.Transparent) { + val searchBarColor by viewModel.searchBarColor.observeAsState() + ListPreference( + title = stringResource(R.string.preference_search_bar_color), + value = searchBarColor, + items = listOf( + stringResource(R.string.preference_system_bar_icons_auto) to SearchBarColors.Auto, + stringResource(R.string.preference_system_bar_icons_light) to SearchBarColors.Light, + stringResource(R.string.preference_system_bar_icons_dark) to SearchBarColors.Dark, + ), + onValueChanged = { + if (it != null) viewModel.setSearchBarColor(it) + } + ) + } } PreferenceCategory(stringResource(R.string.preference_category_system_bars)) { val lightStatusBar by viewModel.statusBarIcons.observeAsState() diff --git a/ui/src/main/java/de/mm20/launcher2/ui/settings/appearance/AppearanceSettingsScreenVM.kt b/ui/src/main/java/de/mm20/launcher2/ui/settings/appearance/AppearanceSettingsScreenVM.kt index 8cc48e30..7ca67299 100644 --- a/ui/src/main/java/de/mm20/launcher2/ui/settings/appearance/AppearanceSettingsScreenVM.kt +++ b/ui/src/main/java/de/mm20/launcher2/ui/settings/appearance/AppearanceSettingsScreenVM.kt @@ -13,6 +13,7 @@ import de.mm20.launcher2.preferences.LauncherDataStore import de.mm20.launcher2.preferences.Settings import de.mm20.launcher2.preferences.Settings.AppearanceSettings.* import de.mm20.launcher2.preferences.Settings.SearchBarSettings +import de.mm20.launcher2.preferences.Settings.SearchBarSettings.SearchBarColors import de.mm20.launcher2.preferences.Settings.SystemBarsSettings import kotlinx.coroutines.flow.map import kotlinx.coroutines.launch @@ -218,6 +219,20 @@ class AppearanceSettingsScreenVM : ViewModel(), KoinComponent { } } + val searchBarColor = dataStore.data.map { it.searchBar.color }.asLiveData() + fun setSearchBarColor(color: SearchBarColors) { + viewModelScope.launch { + dataStore.updateData { + it.toBuilder() + .setSearchBar( + it.searchBar.toBuilder() + .setColor(color) + ) + .build() + } + } + } + val statusBarIcons = dataStore.data.map { it.systemBars.statusBarColor }.asLiveData() fun setLightStatusBar(statusBarColor: SystemBarsSettings.SystemBarColors) { viewModelScope.launch {