Add favorites settings screen

This commit is contained in:
MM20 2022-09-26 20:32:43 +02:00
parent 8b162dea01
commit a2aca9bded
No known key found for this signature in database
GPG Key ID: 0B61A8F2DEAFA389
8 changed files with 150 additions and 4 deletions

View File

@ -617,6 +617,9 @@
<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_wikipedia_customurl">Wikipedia URL</string>
<string name="preference_edit_favorites_summary">Change the order of pinned items</string>
<string name="preference_category_favorites_frequently_used">Frequently used</string>
<string name="preference_favorites_frequently_used_summary">Show frequently used items in favorites</string>
<!-- Used in an info banner if a specific feature requires a Nextcloud account -->
<string name="no_account_nextcloud">You haven\'t connected a Nextcloud account yet</string>
<!-- Used in an info banner if a specific feature requires an Owncloud account -->

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -147,7 +147,20 @@ object FavoritesWidget : Widget() {
)
}
override val isConfigurable: Boolean = false
override val isConfigurable: Boolean = true
override fun configure(context: Activity, appWidgetHost: AppWidgetHost) {
val intent = Intent()
intent.component = ComponentName(
context.getPackageName(),
"de.mm20.launcher2.ui.settings.SettingsActivity"
)
intent.putExtra(
"de.mm20.launcher2.settings.ROUTE",
"settings/favorites"
)
context.tryStartActivity(intent)
}
}