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

View File

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

View File

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

View File

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

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

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

View File

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

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