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 unitConverterResults = mutableStateOf<List<UnitConverter>>(emptyList())
|
||||||
val searchActionResults = mutableStateOf<List<SearchAction>>(emptyList())
|
val searchActionResults = mutableStateOf<List<SearchAction>>(emptyList())
|
||||||
|
|
||||||
|
val hiddenResultsButton = dataStore.data.map { it.searchBar.hiddenItemsButton }
|
||||||
val hiddenResults = mutableStateOf<List<SavableSearchable>>(emptyList())
|
val hiddenResults = mutableStateOf<List<SavableSearchable>>(emptyList())
|
||||||
|
|
||||||
val favoritesEnabled = dataStore.data.map { it.favorites.enabled }
|
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.material3.IconButtonDefaults
|
||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
import androidx.compose.runtime.LaunchedEffect
|
import androidx.compose.runtime.LaunchedEffect
|
||||||
|
import androidx.compose.runtime.collectAsState
|
||||||
import androidx.compose.runtime.getValue
|
import androidx.compose.runtime.getValue
|
||||||
import androidx.compose.runtime.remember
|
import androidx.compose.runtime.remember
|
||||||
import androidx.compose.ui.Modifier
|
import androidx.compose.ui.Modifier
|
||||||
@ -47,6 +48,7 @@ fun LauncherSearchBar(
|
|||||||
val sheetManager = LocalBottomSheetManager.current
|
val sheetManager = LocalBottomSheetManager.current
|
||||||
|
|
||||||
val searchVM: SearchVM = viewModel()
|
val searchVM: SearchVM = viewModel()
|
||||||
|
val hiddenItemsButtonEnabled by searchVM.hiddenResultsButton.collectAsState(false)
|
||||||
|
|
||||||
val hiddenItems by searchVM.hiddenResults
|
val hiddenItems by searchVM.hiddenResults
|
||||||
|
|
||||||
@ -64,7 +66,7 @@ fun LauncherSearchBar(
|
|||||||
darkColors = darkColors,
|
darkColors = darkColors,
|
||||||
menu = {
|
menu = {
|
||||||
AnimatedVisibility(
|
AnimatedVisibility(
|
||||||
showHiddenItemsButton && hiddenItems.isNotEmpty(),
|
hiddenItemsButtonEnabled && showHiddenItemsButton && hiddenItems.isNotEmpty(),
|
||||||
enter = scaleIn(tween(100)),
|
enter = scaleIn(tween(100)),
|
||||||
exit = scaleOut(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.background
|
||||||
import androidx.compose.foundation.combinedClickable
|
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.foundation.lazy.items
|
||||||
import androidx.compose.material.icons.Icons
|
import androidx.compose.material.icons.Icons
|
||||||
import androidx.compose.material.icons.rounded.Visibility
|
import androidx.compose.material.icons.rounded.Visibility
|
||||||
import androidx.compose.material.icons.rounded.VisibilityOff
|
import androidx.compose.material.icons.rounded.VisibilityOff
|
||||||
import androidx.compose.material3.*
|
import androidx.compose.material3.DropdownMenu
|
||||||
import androidx.compose.runtime.*
|
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.Alignment
|
||||||
import androidx.compose.ui.Modifier
|
import androidx.compose.ui.Modifier
|
||||||
import androidx.compose.ui.draw.alpha
|
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.icons.LauncherIcon
|
||||||
import de.mm20.launcher2.ui.R
|
import de.mm20.launcher2.ui.R
|
||||||
import de.mm20.launcher2.ui.component.ShapedLauncherIcon
|
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.PreferenceScreen
|
||||||
|
import de.mm20.launcher2.ui.component.preferences.SwitchPreference
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
fun HiddenItemsSettingsScreen() {
|
fun HiddenItemsSettingsScreen() {
|
||||||
@ -32,7 +47,20 @@ fun HiddenItemsSettingsScreen() {
|
|||||||
|
|
||||||
val apps by viewModel.allApps.collectAsState()
|
val apps by viewModel.allApps.collectAsState()
|
||||||
val other by viewModel.hiddenItems.collectAsState()
|
val other by viewModel.hiddenItems.collectAsState()
|
||||||
|
|
||||||
|
val showButton by viewModel.hiddenItemsButton.collectAsState()
|
||||||
|
|
||||||
PreferenceScreen(title = stringResource(R.string.preference_hidden_items)) {
|
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 ->
|
items(apps, key = { it.key }) { searchable ->
|
||||||
val icon by remember(searchable.key) {
|
val icon by remember(searchable.key) {
|
||||||
viewModel.getIcon(searchable, with(density) { 32.dp.roundToPx() })
|
viewModel.getIcon(searchable, with(density) { 32.dp.roundToPx() })
|
||||||
@ -178,13 +206,13 @@ fun HiddenItem(
|
|||||||
) {
|
) {
|
||||||
Row(
|
Row(
|
||||||
modifier = modifier
|
modifier = modifier
|
||||||
.padding(vertical = 12.dp, horizontal = 16.dp),
|
.padding(vertical = 12.dp, horizontal = 20.dp),
|
||||||
verticalAlignment = Alignment.CenterVertically
|
verticalAlignment = Alignment.CenterVertically
|
||||||
) {
|
) {
|
||||||
ShapedLauncherIcon(
|
ShapedLauncherIcon(
|
||||||
size = 32.dp,
|
size = 32.dp,
|
||||||
icon = { icon },
|
icon = { icon },
|
||||||
modifier = Modifier.padding(end = 16.dp)
|
modifier = Modifier.padding(end = 20.dp)
|
||||||
)
|
)
|
||||||
Text(
|
Text(
|
||||||
label,
|
label,
|
||||||
|
|||||||
@ -12,6 +12,7 @@ import de.mm20.launcher2.searchable.SearchableRepository
|
|||||||
import de.mm20.launcher2.icons.IconService
|
import de.mm20.launcher2.icons.IconService
|
||||||
import de.mm20.launcher2.icons.LauncherIcon
|
import de.mm20.launcher2.icons.LauncherIcon
|
||||||
import de.mm20.launcher2.ktx.isAtLeastApiLevel
|
import de.mm20.launcher2.ktx.isAtLeastApiLevel
|
||||||
|
import de.mm20.launcher2.preferences.LauncherDataStore
|
||||||
import de.mm20.launcher2.search.SavableSearchable
|
import de.mm20.launcher2.search.SavableSearchable
|
||||||
import de.mm20.launcher2.search.data.LauncherApp
|
import de.mm20.launcher2.search.data.LauncherApp
|
||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
@ -22,6 +23,7 @@ import kotlinx.coroutines.flow.first
|
|||||||
import kotlinx.coroutines.flow.flow
|
import kotlinx.coroutines.flow.flow
|
||||||
import kotlinx.coroutines.flow.map
|
import kotlinx.coroutines.flow.map
|
||||||
import kotlinx.coroutines.flow.stateIn
|
import kotlinx.coroutines.flow.stateIn
|
||||||
|
import kotlinx.coroutines.launch
|
||||||
import kotlinx.coroutines.withContext
|
import kotlinx.coroutines.withContext
|
||||||
import org.koin.core.component.KoinComponent
|
import org.koin.core.component.KoinComponent
|
||||||
import org.koin.core.component.inject
|
import org.koin.core.component.inject
|
||||||
@ -30,12 +32,14 @@ class HiddenItemsSettingsScreenVM : ViewModel(), KoinComponent {
|
|||||||
private val appRepository: AppRepository by inject()
|
private val appRepository: AppRepository by inject()
|
||||||
private val searchableRepository: SearchableRepository by inject()
|
private val searchableRepository: SearchableRepository by inject()
|
||||||
private val iconService: IconService by inject()
|
private val iconService: IconService by inject()
|
||||||
|
private val dataStore: LauncherDataStore by inject()
|
||||||
|
|
||||||
val allApps = appRepository.getAllInstalledApps().map {
|
val allApps = appRepository.getAllInstalledApps().map {
|
||||||
withContext(Dispatchers.Default) { it.sorted() }
|
withContext(Dispatchers.Default) { it.sorted() }
|
||||||
}.stateIn(viewModelScope, SharingStarted.WhileSubscribed(), emptyList())
|
}.stateIn(viewModelScope, SharingStarted.WhileSubscribed(), emptyList())
|
||||||
val hiddenItems: StateFlow<List<SavableSearchable>> = flow {
|
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)
|
emit(hidden)
|
||||||
}.stateIn(viewModelScope, SharingStarted.WhileSubscribed(), emptyList())
|
}.stateIn(viewModelScope, SharingStarted.WhileSubscribed(), emptyList())
|
||||||
|
|
||||||
@ -44,7 +48,7 @@ class HiddenItemsSettingsScreenVM : ViewModel(), KoinComponent {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun setHidden(searchable: SavableSearchable, hidden: Boolean) {
|
fun setHidden(searchable: SavableSearchable, hidden: Boolean) {
|
||||||
if(hidden) {
|
if (hidden) {
|
||||||
searchableRepository.upsert(searchable, hidden = true, pinned = false)
|
searchableRepository.upsert(searchable, hidden = true, pinned = false)
|
||||||
} else {
|
} else {
|
||||||
searchableRepository.update(searchable, hidden = false)
|
searchableRepository.update(searchable, hidden = false)
|
||||||
@ -73,4 +77,17 @@ class HiddenItemsSettingsScreenVM : ViewModel(), KoinComponent {
|
|||||||
null
|
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_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">Hidden search results</string>
|
||||||
<string name="preference_hidden_items_summary">Manage hidden apps and 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">Tags</string>
|
||||||
<string name="preference_screen_tags_summary">Manage tags and tagged items</string>
|
<string name="preference_screen_tags_summary">Manage tags and tagged items</string>
|
||||||
<string name="preference_wikipedia_customurl">Wikipedia URL</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>> {
|
internal fun getMigrations(context: Context): List<DataMigration<Settings>> {
|
||||||
return listOf(
|
return listOf(
|
||||||
@ -40,5 +40,6 @@ internal fun getMigrations(context: Context): List<DataMigration<Settings>> {
|
|||||||
Migration_11_12(),
|
Migration_11_12(),
|
||||||
Migration_12_13(),
|
Migration_12_13(),
|
||||||
Migration_13_14(),
|
Migration_13_14(),
|
||||||
|
Migration_14_15(),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@ -136,6 +136,7 @@ fun createFactorySettings(context: Context): Settings {
|
|||||||
.setAutoFocus(true)
|
.setAutoFocus(true)
|
||||||
.setLaunchOnEnter(true)
|
.setLaunchOnEnter(true)
|
||||||
.setColor(SearchBarColors.Auto)
|
.setColor(SearchBarColors.Auto)
|
||||||
|
.setHiddenItemsButton(true)
|
||||||
.build()
|
.build()
|
||||||
)
|
)
|
||||||
.setIcons(
|
.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;
|
SearchBarColors color = 3;
|
||||||
bool launch_on_enter = 4;
|
bool launch_on_enter = 4;
|
||||||
|
bool hidden_items_button = 5;
|
||||||
}
|
}
|
||||||
SearchBarSettings search_bar = 20;
|
SearchBarSettings search_bar = 20;
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user