Add favorites settings screen

This commit is contained in:
MM20
2022-09-26 20:32:43 +02:00
parent 8b162dea01
commit a2aca9bded
8 changed files with 150 additions and 4 deletions
@@ -35,6 +35,7 @@ import de.mm20.launcher2.ui.settings.crashreporter.CrashReportScreen
import de.mm20.launcher2.ui.settings.crashreporter.CrashReporterScreen
import de.mm20.launcher2.ui.settings.debug.DebugSettingsScreen
import de.mm20.launcher2.ui.settings.easteregg.EasterEggSettingsScreen
import de.mm20.launcher2.ui.settings.favorites.FavoritesSettingsScreen
import de.mm20.launcher2.ui.settings.filesearch.FileSearchSettingsScreen
import de.mm20.launcher2.ui.settings.hiddenitems.HiddenItemsSettingsScreen
import de.mm20.launcher2.ui.settings.license.LicenseScreen
@@ -132,6 +133,9 @@ class SettingsActivity : BaseActivity() {
composable("settings/widgets/clock") {
ClockWidgetSettingsScreen()
}
composable("settings/favorites") {
FavoritesSettingsScreen()
}
composable("settings/badges") {
BadgeSettingsScreen()
}
@@ -0,0 +1,68 @@
package de.mm20.launcher2.ui.settings.favorites
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.livedata.observeAsState
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.res.stringResource
import androidx.lifecycle.viewmodel.compose.viewModel
import de.mm20.launcher2.ui.R
import de.mm20.launcher2.ui.component.preferences.Preference
import de.mm20.launcher2.ui.component.preferences.PreferenceCategory
import de.mm20.launcher2.ui.component.preferences.PreferenceScreen
import de.mm20.launcher2.ui.component.preferences.SliderPreference
import de.mm20.launcher2.ui.component.preferences.SwitchPreference
import de.mm20.launcher2.ui.launcher.modals.EditFavoritesSheet
@Composable
fun FavoritesSettingsScreen() {
val viewModel: FavoritesSettingsScreenVM = viewModel()
var showEditSheet by remember { mutableStateOf(false) }
PreferenceScreen(
title = stringResource(R.string.preference_search_favorites)
) {
item {
PreferenceCategory {
Preference(
title = stringResource(R.string.menu_item_edit_favs),
summary = stringResource(R.string.preference_edit_favorites_summary),
onClick = {
showEditSheet = true
}
)
}
}
item {
PreferenceCategory(stringResource(R.string.preference_category_favorites_frequently_used)) {
val frequentlyUsed by viewModel.frequentlyUsed.observeAsState()
SwitchPreference(
title = stringResource(R.string.frequently_used_show_in_favorites),
summary = stringResource(R.string.preference_favorites_frequently_used_summary),
value = frequentlyUsed == true,
onValueChanged = {
viewModel.setFrequentlyUsed(it)
}
)
val frequentlyUsedRows by viewModel.frequentlyUsedRows.observeAsState(1)
SliderPreference(
title = stringResource(R.string.frequently_used_rows),
value = frequentlyUsedRows,
enabled = frequentlyUsed == true,
min = 1,
max = 4,
onValueChanged = {
viewModel.setFrequentlyUsedRows(it)
}
)
}
}
}
if (showEditSheet) {
EditFavoritesSheet(
onDismiss = { showEditSheet = false }
)
}
}
@@ -0,0 +1,42 @@
package de.mm20.launcher2.ui.settings.favorites
import androidx.lifecycle.ViewModel
import androidx.lifecycle.asLiveData
import androidx.lifecycle.viewModelScope
import de.mm20.launcher2.preferences.LauncherDataStore
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.launch
import org.koin.core.component.KoinComponent
import org.koin.core.component.inject
class FavoritesSettingsScreenVM: ViewModel(), KoinComponent {
private val dataStore: LauncherDataStore by inject()
val frequentlyUsed = dataStore.data.map { it.favorites.frequentlyUsed }.asLiveData()
fun setFrequentlyUsed(frequentlyUsed: Boolean) {
viewModelScope.launch {
dataStore.updateData {
it.toBuilder()
.setFavorites(
it.favorites.toBuilder()
.setFrequentlyUsed(frequentlyUsed)
)
.build()
}
}
}
val frequentlyUsedRows = dataStore.data.map { it.favorites.frequentlyUsedRows }.asLiveData()
fun setFrequentlyUsedRows(frequentlyUsedRows: Int) {
viewModelScope.launch {
dataStore.updateData {
it.toBuilder()
.setFavorites(
it.favorites.toBuilder()
.setFrequentlyUsedRows(frequentlyUsedRows)
)
.build()
}
}
}
}
@@ -31,13 +31,16 @@ fun SearchSettingsScreen() {
item {
PreferenceCategory {
val favorites by viewModel.favorites.observeAsState()
SwitchPreference(
PreferenceWithSwitch(
title = stringResource(R.string.preference_search_favorites),
summary = stringResource(R.string.preference_search_favorites_summary),
icon = Icons.Rounded.Star,
value = favorites == true,
onValueChanged = {
switchValue = favorites == true,
onSwitchChanged = {
viewModel.setFavorites(it)
},
onClick = {
navController?.navigate("settings/favorites")
}
)
@@ -13,4 +13,5 @@ class WidgetSettingsScreenVM: ViewModel(), KoinComponent {
val calendarWidget = widgetRepository.isCalendarWidgetEnabled().asLiveData()
val musicWidget = widgetRepository.isMusicWidgetEnabled().asLiveData()
val weatherWidget = widgetRepository.isWeatherWidgetEnabled().asLiveData()
val favoritesWidget = widgetRepository.isFavoritesWidgetEnabled().asLiveData()
}
@@ -4,6 +4,7 @@ import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.rounded.Audiotrack
import androidx.compose.material.icons.rounded.LightMode
import androidx.compose.material.icons.rounded.Schedule
import androidx.compose.material.icons.rounded.Star
import androidx.compose.material.icons.rounded.Today
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
@@ -61,6 +62,17 @@ fun WidgetsSettingsScreen() {
}
)
}
val favoritesWidget by viewModel.favoritesWidget.observeAsState()
if (favoritesWidget == true) {
Preference(
title = stringResource(R.string.favorites),
icon = Icons.Rounded.Star,
onClick = {
navController?.navigate("settings/favorites")
}
)
}
}
}
}