diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/assistant/AssistantScaffold.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/assistant/AssistantScaffold.kt index de855a2a..a7ab9a01 100644 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/assistant/AssistantScaffold.kt +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/assistant/AssistantScaffold.kt @@ -39,6 +39,7 @@ fun AssistantScaffold( darkNavBarIcons: Boolean = false, bottomSearchBar: Boolean = false, reverseSearchResults: Boolean = false, + fixedSearchBar: Boolean = false, ) { val viewModel: LauncherScaffoldVM = viewModel() @@ -185,7 +186,7 @@ fun AssistantScaffold( .windowInsetsPadding(WindowInsets.safeDrawing) .padding(8.dp) .offset { - if (searchBarFocused) IntOffset.Zero + if (searchBarFocused || fixedSearchBar) IntOffset.Zero else IntOffset( 0, searchBarOffset.toInt() * if (bottomSearchBar) -1 else 1 diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/LauncherScaffoldVM.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/LauncherScaffoldVM.kt index 226f9c6f..0394ed68 100644 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/LauncherScaffoldVM.kt +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/LauncherScaffoldVM.kt @@ -66,6 +66,7 @@ class LauncherScaffoldVM : ViewModel(), KoinComponent { val baseLayout = dataStore.data.map { it.layout.baseLayout }.asLiveData() val bottomSearchBar = dataStore.data.map { it.layout.bottomSearchBar }.asLiveData() val reverseSearchResults = dataStore.data.map { it.layout.reverseSearchResults }.asLiveData() + val fixedSearchBar = dataStore.data.map { it.layout.fixedSearchBar }.asLiveData() val isSearchOpen = MutableLiveData(false) val isWidgetEditMode = MutableLiveData(false) diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/PagerScaffold.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/PagerScaffold.kt index 3d0d75aa..b12551f2 100644 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/PagerScaffold.kt +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/PagerScaffold.kt @@ -91,6 +91,7 @@ fun PagerScaffold( reverse: Boolean = false, bottomSearchBar: Boolean = true, reverseSearchResults: Boolean = true, + fixedSearchBar: Boolean = false, ) { val viewModel: LauncherScaffoldVM = viewModel() val searchVM: SearchVM = viewModel() @@ -488,7 +489,7 @@ fun PagerScaffold( .offset { IntOffset( 0, - if (focusSearchBar) 0 else searchBarOffset.value.toInt() * if (bottomSearchBar) 1 else -1 + if (focusSearchBar || fixedSearchBar) 0 else searchBarOffset.value.toInt() * if (bottomSearchBar) 1 else -1 ) } .offset(y = widgetEditModeOffset), diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/PullDownScaffold.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/PullDownScaffold.kt index f38315c6..89e15e0e 100644 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/PullDownScaffold.kt +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/PullDownScaffold.kt @@ -88,6 +88,7 @@ fun PullDownScaffold( darkNavBarIcons: Boolean = false, bottomSearchBar: Boolean = false, reverseSearchResults: Boolean = false, + fixedSearchBar: Boolean = false, ) { val viewModel: LauncherScaffoldVM = viewModel() val searchVM: SearchVM = viewModel() @@ -520,7 +521,7 @@ fun PullDownScaffold( .offset { IntOffset( 0, - if (searchBarFocused) 0 else searchBarOffset.value.toInt() * (if (bottomSearchBar) 1 else -1) + if (searchBarFocused || fixedSearchBar) 0 else searchBarOffset.value.toInt() * (if (bottomSearchBar) 1 else -1) ) } .offset { diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/SharedLauncherActivity.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/SharedLauncherActivity.kt index 7b040c94..0f0a2b7c 100644 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/SharedLauncherActivity.kt +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/SharedLauncherActivity.kt @@ -125,6 +125,7 @@ abstract class SharedLauncherActivity( val layout by viewModel.baseLayout.observeAsState(null) val bottomSearchBar by viewModel.bottomSearchBar.observeAsState(false) val reverseSearchResults by viewModel.reverseSearchResults.observeAsState(false) + val fixedSearchBar by viewModel.fixedSearchBar.observeAsState(false) val systemUiController = rememberSystemUiController() @@ -182,6 +183,7 @@ abstract class SharedLauncherActivity( darkNavBarIcons = lightNav, bottomSearchBar = bottomSearchBar, reverseSearchResults = reverseSearchResults, + fixedSearchBar = fixedSearchBar, ) } } else { @@ -202,6 +204,7 @@ abstract class SharedLauncherActivity( darkNavBarIcons = lightNav, bottomSearchBar = bottomSearchBar, reverseSearchResults = reverseSearchResults, + fixedSearchBar = fixedSearchBar, ) } } @@ -222,6 +225,7 @@ abstract class SharedLauncherActivity( reverse = layout == Settings.LayoutSettings.Layout.PagerReversed, bottomSearchBar = bottomSearchBar, reverseSearchResults = reverseSearchResults, + fixedSearchBar = fixedSearchBar, ) } } diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/layout/LayoutSettingsScreen.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/layout/LayoutSettingsScreen.kt index a6ce00b1..6bc64c1b 100644 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/layout/LayoutSettingsScreen.kt +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/layout/LayoutSettingsScreen.kt @@ -10,6 +10,7 @@ import de.mm20.launcher2.ui.R import de.mm20.launcher2.ui.component.preferences.ListPreference import de.mm20.launcher2.ui.component.preferences.PreferenceCategory import de.mm20.launcher2.ui.component.preferences.PreferenceScreen +import de.mm20.launcher2.ui.component.preferences.SwitchPreference @Composable fun LayoutSettingsScreen() { @@ -43,6 +44,15 @@ fun LayoutSettingsScreen() { if (it != null) viewModel.setBottomSearchBar(it) }, ) + val fixedSearchBar by viewModel.fixedSearchBar.observeAsState() + SwitchPreference( + title = stringResource(R.string.preference_layout_fixed_search_bar), + summary = stringResource(R.string.preference_layout_fixed_search_bar_summary), + value = fixedSearchBar == true, + onValueChanged = { + viewModel.setFixedSearchBar(it) + }, + ) val reverseSearchResults by viewModel.reverseSearchResults.observeAsState() ListPreference(title = stringResource(R.string.preference_layout_search_results), items = listOf( diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/layout/LayoutSettingsScreenVM.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/layout/LayoutSettingsScreenVM.kt index 2957f301..d6d7b1fc 100644 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/layout/LayoutSettingsScreenVM.kt +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/layout/LayoutSettingsScreenVM.kt @@ -46,4 +46,15 @@ class LayoutSettingsScreenVM: ViewModel(), KoinComponent { } } } + + val fixedSearchBar = dataStore.data.map { it.layout.fixedSearchBar }.asLiveData() + fun setFixedSearchBar(fixedSearchBar: Boolean) { + viewModelScope.launch { + dataStore.updateData { + it.toBuilder() + .setLayout(it.layout.toBuilder().setFixedSearchBar(fixedSearchBar)) + .build() + } + } + } } \ No newline at end of file diff --git a/core/i18n/src/main/res/values/strings.xml b/core/i18n/src/main/res/values/strings.xml index 2f9d263a..2b2340d0 100644 --- a/core/i18n/src/main/res/values/strings.xml +++ b/core/i18n/src/main/res/values/strings.xml @@ -732,6 +732,8 @@ Arrangement of search results Top-down Bottom-up + Fixed search bar + Don\'t scroll the search bar out of view Gestures Gestures and gesture actions Swipe down diff --git a/core/preferences/src/main/proto/settings.proto b/core/preferences/src/main/proto/settings.proto index 2bbf2f28..afb2a63d 100644 --- a/core/preferences/src/main/proto/settings.proto +++ b/core/preferences/src/main/proto/settings.proto @@ -297,6 +297,7 @@ message Settings { Layout base_layout = 1; bool bottom_search_bar = 2; bool reverse_search_results = 3; + bool fixed_search_bar = 4; } LayoutSettings layout = 27;