Add preference to hide hidden items button
This commit is contained in:
parent
e370a32b66
commit
5c7d162c88
@ -67,6 +67,7 @@ class SearchVM : ViewModel(), KoinComponent {
|
||||
val unitConverterResults = mutableStateOf<List<UnitConverter>>(emptyList())
|
||||
val searchActionResults = mutableStateOf<List<SearchAction>>(emptyList())
|
||||
|
||||
val hiddenResultsButton = dataStore.data.map { it.searchBar.hiddenItemsButton }
|
||||
val hiddenResults = mutableStateOf<List<SavableSearchable>>(emptyList())
|
||||
|
||||
val favoritesEnabled = dataStore.data.map { it.favorites.enabled }
|
||||
|
||||
@ -12,6 +12,7 @@ import androidx.compose.material3.Icon
|
||||
import androidx.compose.material3.IconButtonDefaults
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.runtime.LaunchedEffect
|
||||
import androidx.compose.runtime.collectAsState
|
||||
import androidx.compose.runtime.getValue
|
||||
import androidx.compose.runtime.remember
|
||||
import androidx.compose.ui.Modifier
|
||||
@ -47,6 +48,7 @@ fun LauncherSearchBar(
|
||||
val sheetManager = LocalBottomSheetManager.current
|
||||
|
||||
val searchVM: SearchVM = viewModel()
|
||||
val hiddenItemsButtonEnabled by searchVM.hiddenResultsButton.collectAsState(false)
|
||||
|
||||
val hiddenItems by searchVM.hiddenResults
|
||||
|
||||
@ -64,7 +66,7 @@ fun LauncherSearchBar(
|
||||
darkColors = darkColors,
|
||||
menu = {
|
||||
AnimatedVisibility(
|
||||
showHiddenItemsButton && hiddenItems.isNotEmpty(),
|
||||
hiddenItemsButtonEnabled && showHiddenItemsButton && hiddenItems.isNotEmpty(),
|
||||
enter = scaleIn(tween(100)),
|
||||
exit = scaleOut(tween(100))
|
||||
) {
|
||||
|
||||
@ -2,13 +2,26 @@ package de.mm20.launcher2.ui.settings.hiddenitems
|
||||
|
||||
import androidx.compose.foundation.background
|
||||
import androidx.compose.foundation.combinedClickable
|
||||
import androidx.compose.foundation.layout.*
|
||||
import androidx.compose.foundation.layout.Box
|
||||
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.foundation.lazy.items
|
||||
import androidx.compose.material.icons.Icons
|
||||
import androidx.compose.material.icons.rounded.Visibility
|
||||
import androidx.compose.material.icons.rounded.VisibilityOff
|
||||
import androidx.compose.material3.*
|
||||
import androidx.compose.runtime.*
|
||||
import androidx.compose.material3.DropdownMenu
|
||||
import androidx.compose.material3.DropdownMenuItem
|
||||
import androidx.compose.material3.Icon
|
||||
import androidx.compose.material3.MaterialTheme
|
||||
import androidx.compose.material3.Text
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.runtime.collectAsState
|
||||
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.draw.alpha
|
||||
@ -21,7 +34,9 @@ import androidx.lifecycle.viewmodel.compose.viewModel
|
||||
import de.mm20.launcher2.icons.LauncherIcon
|
||||
import de.mm20.launcher2.ui.R
|
||||
import de.mm20.launcher2.ui.component.ShapedLauncherIcon
|
||||
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 HiddenItemsSettingsScreen() {
|
||||
@ -32,7 +47,20 @@ fun HiddenItemsSettingsScreen() {
|
||||
|
||||
val apps by viewModel.allApps.collectAsState()
|
||||
val other by viewModel.hiddenItems.collectAsState()
|
||||
|
||||
val showButton by viewModel.hiddenItemsButton.collectAsState()
|
||||
|
||||
PreferenceScreen(title = stringResource(R.string.preference_hidden_items)) {
|
||||
item {
|
||||
PreferenceCategory {
|
||||
SwitchPreference(
|
||||
title = stringResource(R.string.preference_hidden_items_reveal_button),
|
||||
summary = stringResource(R.string.preference_hidden_items_reveal_button_summary),
|
||||
value = showButton,
|
||||
onValueChanged = { viewModel.setHiddenItemsButton(it) }
|
||||
)
|
||||
}
|
||||
}
|
||||
items(apps, key = { it.key }) { searchable ->
|
||||
val icon by remember(searchable.key) {
|
||||
viewModel.getIcon(searchable, with(density) { 32.dp.roundToPx() })
|
||||
@ -178,13 +206,13 @@ fun HiddenItem(
|
||||
) {
|
||||
Row(
|
||||
modifier = modifier
|
||||
.padding(vertical = 12.dp, horizontal = 16.dp),
|
||||
.padding(vertical = 12.dp, horizontal = 20.dp),
|
||||
verticalAlignment = Alignment.CenterVertically
|
||||
) {
|
||||
ShapedLauncherIcon(
|
||||
size = 32.dp,
|
||||
icon = { icon },
|
||||
modifier = Modifier.padding(end = 16.dp)
|
||||
modifier = Modifier.padding(end = 20.dp)
|
||||
)
|
||||
Text(
|
||||
label,
|
||||
|
||||
@ -12,6 +12,7 @@ import de.mm20.launcher2.searchable.SearchableRepository
|
||||
import de.mm20.launcher2.icons.IconService
|
||||
import de.mm20.launcher2.icons.LauncherIcon
|
||||
import de.mm20.launcher2.ktx.isAtLeastApiLevel
|
||||
import de.mm20.launcher2.preferences.LauncherDataStore
|
||||
import de.mm20.launcher2.search.SavableSearchable
|
||||
import de.mm20.launcher2.search.data.LauncherApp
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
@ -22,6 +23,7 @@ import kotlinx.coroutines.flow.first
|
||||
import kotlinx.coroutines.flow.flow
|
||||
import kotlinx.coroutines.flow.map
|
||||
import kotlinx.coroutines.flow.stateIn
|
||||
import kotlinx.coroutines.launch
|
||||
import kotlinx.coroutines.withContext
|
||||
import org.koin.core.component.KoinComponent
|
||||
import org.koin.core.component.inject
|
||||
@ -30,12 +32,14 @@ class HiddenItemsSettingsScreenVM : ViewModel(), KoinComponent {
|
||||
private val appRepository: AppRepository by inject()
|
||||
private val searchableRepository: SearchableRepository by inject()
|
||||
private val iconService: IconService by inject()
|
||||
private val dataStore: LauncherDataStore by inject()
|
||||
|
||||
val allApps = appRepository.getAllInstalledApps().map {
|
||||
withContext(Dispatchers.Default) { it.sorted() }
|
||||
}.stateIn(viewModelScope, SharingStarted.WhileSubscribed(), emptyList())
|
||||
val hiddenItems: StateFlow<List<SavableSearchable>> = flow {
|
||||
val hidden = searchableRepository.get(hidden = true).first().filter { it !is LauncherApp }.sorted()
|
||||
val hidden =
|
||||
searchableRepository.get(hidden = true).first().filter { it !is LauncherApp }.sorted()
|
||||
emit(hidden)
|
||||
}.stateIn(viewModelScope, SharingStarted.WhileSubscribed(), emptyList())
|
||||
|
||||
@ -44,7 +48,7 @@ class HiddenItemsSettingsScreenVM : ViewModel(), KoinComponent {
|
||||
}
|
||||
|
||||
fun setHidden(searchable: SavableSearchable, hidden: Boolean) {
|
||||
if(hidden) {
|
||||
if (hidden) {
|
||||
searchableRepository.upsert(searchable, hidden = true, pinned = false)
|
||||
} else {
|
||||
searchableRepository.update(searchable, hidden = false)
|
||||
@ -73,4 +77,17 @@ class HiddenItemsSettingsScreenVM : ViewModel(), KoinComponent {
|
||||
null
|
||||
)
|
||||
}
|
||||
|
||||
val hiddenItemsButton = dataStore.data.map { it.searchBar.hiddenItemsButton }
|
||||
.stateIn(viewModelScope, SharingStarted.WhileSubscribed(), false)
|
||||
|
||||
fun setHiddenItemsButton(hidden: Boolean) {
|
||||
viewModelScope.launch {
|
||||
dataStore.updateData {
|
||||
it.toBuilder()
|
||||
.setSearchBar(it.searchBar.toBuilder().setHiddenItemsButton(hidden)).build()
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -650,6 +650,8 @@
|
||||
<string name="preference_search_bar_launch_on_enter_summary">Launch highlighted match or quick action upon tapping go</string>
|
||||
<string name="preference_hidden_items">Hidden search results</string>
|
||||
<string name="preference_hidden_items_summary">Manage hidden apps and search results</string>
|
||||
<string name="preference_hidden_items_reveal_button">Show reveal button</string>
|
||||
<string name="preference_hidden_items_reveal_button_summary">Show a button to reveal hidden search results</string>
|
||||
<string name="preference_screen_tags">Tags</string>
|
||||
<string name="preference_screen_tags_summary">Manage tags and tagged items</string>
|
||||
<string name="preference_wikipedia_customurl">Wikipedia URL</string>
|
||||
|
||||
@ -22,7 +22,7 @@ internal val Context.dataStore: LauncherDataStore by dataStore(
|
||||
}
|
||||
)
|
||||
|
||||
internal const val SchemaVersion = 14
|
||||
internal const val SchemaVersion = 15
|
||||
|
||||
internal fun getMigrations(context: Context): List<DataMigration<Settings>> {
|
||||
return listOf(
|
||||
@ -40,5 +40,6 @@ internal fun getMigrations(context: Context): List<DataMigration<Settings>> {
|
||||
Migration_11_12(),
|
||||
Migration_12_13(),
|
||||
Migration_13_14(),
|
||||
Migration_14_15(),
|
||||
)
|
||||
}
|
||||
@ -136,6 +136,7 @@ fun createFactorySettings(context: Context): Settings {
|
||||
.setAutoFocus(true)
|
||||
.setLaunchOnEnter(true)
|
||||
.setColor(SearchBarColors.Auto)
|
||||
.setHiddenItemsButton(true)
|
||||
.build()
|
||||
)
|
||||
.setIcons(
|
||||
|
||||
@ -0,0 +1,12 @@
|
||||
package de.mm20.launcher2.preferences.migrations
|
||||
|
||||
import de.mm20.launcher2.preferences.Settings
|
||||
|
||||
class Migration_14_15: VersionedMigration(14, 15) {
|
||||
override suspend fun applyMigrations(builder: Settings.Builder): Settings.Builder {
|
||||
return builder.setSearchBar(
|
||||
builder.searchBar.toBuilder()
|
||||
.setHiddenItemsButton(true)
|
||||
)
|
||||
}
|
||||
}
|
||||
@ -225,6 +225,7 @@ message Settings {
|
||||
}
|
||||
SearchBarColors color = 3;
|
||||
bool launch_on_enter = 4;
|
||||
bool hidden_items_button = 5;
|
||||
}
|
||||
SearchBarSettings search_bar = 20;
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user