Add preference to hide hidden items button

This commit is contained in:
MM20 2023-05-09 19:47:16 +02:00
parent e370a32b66
commit 5c7d162c88
No known key found for this signature in database
GPG Key ID: 0B61A8F2DEAFA389
9 changed files with 74 additions and 9 deletions

View File

@ -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 }

View File

@ -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))
) {

View File

@ -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,

View File

@ -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()
}
}
}
}

View File

@ -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>

View File

@ -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(),
)
}

View File

@ -136,6 +136,7 @@ fun createFactorySettings(context: Context): Settings {
.setAutoFocus(true)
.setLaunchOnEnter(true)
.setColor(SearchBarColors.Auto)
.setHiddenItemsButton(true)
.build()
)
.setIcons(

View File

@ -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)
)
}
}

View File

@ -225,6 +225,7 @@ message Settings {
}
SearchBarColors color = 3;
bool launch_on_enter = 4;
bool hidden_items_button = 5;
}
SearchBarSettings search_bar = 20;