From 5c7d162c88b84a808e5c0c52efdb5afd39cfb135 Mon Sep 17 00:00:00 2001 From: MM20 <15646950+MM2-0@users.noreply.github.com> Date: Tue, 9 May 2023 19:47:16 +0200 Subject: [PATCH] Add preference to hide hidden items button --- .../launcher2/ui/launcher/search/SearchVM.kt | 1 + .../launcher/searchbar/LauncherSearchBar.kt | 4 +- .../hiddenitems/HiddenItemsSettingsScreen.kt | 38 ++++++++++++++++--- .../HiddenItemsSettingsScreenVM.kt | 21 +++++++++- core/i18n/src/main/res/values/strings.xml | 2 + .../mm20/launcher2/preferences/DataStore.kt | 3 +- .../de/mm20/launcher2/preferences/Defaults.kt | 1 + .../preferences/migrations/Migration_14_15.kt | 12 ++++++ .../preferences/src/main/proto/settings.proto | 1 + 9 files changed, 74 insertions(+), 9 deletions(-) create mode 100644 core/preferences/src/main/java/de/mm20/launcher2/preferences/migrations/Migration_14_15.kt diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/search/SearchVM.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/search/SearchVM.kt index 7889760b..2f6f11ba 100644 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/search/SearchVM.kt +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/search/SearchVM.kt @@ -67,6 +67,7 @@ class SearchVM : ViewModel(), KoinComponent { val unitConverterResults = mutableStateOf>(emptyList()) val searchActionResults = mutableStateOf>(emptyList()) + val hiddenResultsButton = dataStore.data.map { it.searchBar.hiddenItemsButton } val hiddenResults = mutableStateOf>(emptyList()) val favoritesEnabled = dataStore.data.map { it.favorites.enabled } diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/searchbar/LauncherSearchBar.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/searchbar/LauncherSearchBar.kt index 2337a325..8764192e 100644 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/searchbar/LauncherSearchBar.kt +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/searchbar/LauncherSearchBar.kt @@ -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)) ) { diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/hiddenitems/HiddenItemsSettingsScreen.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/hiddenitems/HiddenItemsSettingsScreen.kt index 4b0bb166..886c152a 100644 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/hiddenitems/HiddenItemsSettingsScreen.kt +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/hiddenitems/HiddenItemsSettingsScreen.kt @@ -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, diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/hiddenitems/HiddenItemsSettingsScreenVM.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/hiddenitems/HiddenItemsSettingsScreenVM.kt index 8d58bfff..c6d9313f 100644 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/settings/hiddenitems/HiddenItemsSettingsScreenVM.kt +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/settings/hiddenitems/HiddenItemsSettingsScreenVM.kt @@ -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> = 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() + + } + } + } } \ 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 f95e5588..07fcf417 100644 --- a/core/i18n/src/main/res/values/strings.xml +++ b/core/i18n/src/main/res/values/strings.xml @@ -650,6 +650,8 @@ Launch highlighted match or quick action upon tapping go Hidden search results Manage hidden apps and search results + Show reveal button + Show a button to reveal hidden search results Tags Manage tags and tagged items Wikipedia URL diff --git a/core/preferences/src/main/java/de/mm20/launcher2/preferences/DataStore.kt b/core/preferences/src/main/java/de/mm20/launcher2/preferences/DataStore.kt index 532e4adc..1b1b87df 100644 --- a/core/preferences/src/main/java/de/mm20/launcher2/preferences/DataStore.kt +++ b/core/preferences/src/main/java/de/mm20/launcher2/preferences/DataStore.kt @@ -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> { return listOf( @@ -40,5 +40,6 @@ internal fun getMigrations(context: Context): List> { Migration_11_12(), Migration_12_13(), Migration_13_14(), + Migration_14_15(), ) } \ No newline at end of file diff --git a/core/preferences/src/main/java/de/mm20/launcher2/preferences/Defaults.kt b/core/preferences/src/main/java/de/mm20/launcher2/preferences/Defaults.kt index f6c9ecf8..a2f38c10 100644 --- a/core/preferences/src/main/java/de/mm20/launcher2/preferences/Defaults.kt +++ b/core/preferences/src/main/java/de/mm20/launcher2/preferences/Defaults.kt @@ -136,6 +136,7 @@ fun createFactorySettings(context: Context): Settings { .setAutoFocus(true) .setLaunchOnEnter(true) .setColor(SearchBarColors.Auto) + .setHiddenItemsButton(true) .build() ) .setIcons( diff --git a/core/preferences/src/main/java/de/mm20/launcher2/preferences/migrations/Migration_14_15.kt b/core/preferences/src/main/java/de/mm20/launcher2/preferences/migrations/Migration_14_15.kt new file mode 100644 index 00000000..9c570466 --- /dev/null +++ b/core/preferences/src/main/java/de/mm20/launcher2/preferences/migrations/Migration_14_15.kt @@ -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) + ) + } +} \ No newline at end of file diff --git a/core/preferences/src/main/proto/settings.proto b/core/preferences/src/main/proto/settings.proto index bb75f81e..d40f4252 100644 --- a/core/preferences/src/main/proto/settings.proto +++ b/core/preferences/src/main/proto/settings.proto @@ -225,6 +225,7 @@ message Settings { } SearchBarColors color = 3; bool launch_on_enter = 4; + bool hidden_items_button = 5; } SearchBarSettings search_bar = 20;