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;