Add favorites settings screen
This commit is contained in:
parent
8b162dea01
commit
a2aca9bded
@ -617,6 +617,9 @@
|
|||||||
<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_wikipedia_customurl">Wikipedia URL</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 -->
|
<!-- 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>
|
<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 -->
|
<!-- Used in an info banner if a specific feature requires an Owncloud account -->
|
||||||
|
|||||||
@ -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.crashreporter.CrashReporterScreen
|
||||||
import de.mm20.launcher2.ui.settings.debug.DebugSettingsScreen
|
import de.mm20.launcher2.ui.settings.debug.DebugSettingsScreen
|
||||||
import de.mm20.launcher2.ui.settings.easteregg.EasterEggSettingsScreen
|
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.filesearch.FileSearchSettingsScreen
|
||||||
import de.mm20.launcher2.ui.settings.hiddenitems.HiddenItemsSettingsScreen
|
import de.mm20.launcher2.ui.settings.hiddenitems.HiddenItemsSettingsScreen
|
||||||
import de.mm20.launcher2.ui.settings.license.LicenseScreen
|
import de.mm20.launcher2.ui.settings.license.LicenseScreen
|
||||||
@ -132,6 +133,9 @@ class SettingsActivity : BaseActivity() {
|
|||||||
composable("settings/widgets/clock") {
|
composable("settings/widgets/clock") {
|
||||||
ClockWidgetSettingsScreen()
|
ClockWidgetSettingsScreen()
|
||||||
}
|
}
|
||||||
|
composable("settings/favorites") {
|
||||||
|
FavoritesSettingsScreen()
|
||||||
|
}
|
||||||
composable("settings/badges") {
|
composable("settings/badges") {
|
||||||
BadgeSettingsScreen()
|
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 {
|
item {
|
||||||
PreferenceCategory {
|
PreferenceCategory {
|
||||||
val favorites by viewModel.favorites.observeAsState()
|
val favorites by viewModel.favorites.observeAsState()
|
||||||
SwitchPreference(
|
PreferenceWithSwitch(
|
||||||
title = stringResource(R.string.preference_search_favorites),
|
title = stringResource(R.string.preference_search_favorites),
|
||||||
summary = stringResource(R.string.preference_search_favorites_summary),
|
summary = stringResource(R.string.preference_search_favorites_summary),
|
||||||
icon = Icons.Rounded.Star,
|
icon = Icons.Rounded.Star,
|
||||||
value = favorites == true,
|
switchValue = favorites == true,
|
||||||
onValueChanged = {
|
onSwitchChanged = {
|
||||||
viewModel.setFavorites(it)
|
viewModel.setFavorites(it)
|
||||||
|
},
|
||||||
|
onClick = {
|
||||||
|
navController?.navigate("settings/favorites")
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@ -13,4 +13,5 @@ class WidgetSettingsScreenVM: ViewModel(), KoinComponent {
|
|||||||
val calendarWidget = widgetRepository.isCalendarWidgetEnabled().asLiveData()
|
val calendarWidget = widgetRepository.isCalendarWidgetEnabled().asLiveData()
|
||||||
val musicWidget = widgetRepository.isMusicWidgetEnabled().asLiveData()
|
val musicWidget = widgetRepository.isMusicWidgetEnabled().asLiveData()
|
||||||
val weatherWidget = widgetRepository.isWeatherWidgetEnabled().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.Audiotrack
|
||||||
import androidx.compose.material.icons.rounded.LightMode
|
import androidx.compose.material.icons.rounded.LightMode
|
||||||
import androidx.compose.material.icons.rounded.Schedule
|
import androidx.compose.material.icons.rounded.Schedule
|
||||||
|
import androidx.compose.material.icons.rounded.Star
|
||||||
import androidx.compose.material.icons.rounded.Today
|
import androidx.compose.material.icons.rounded.Today
|
||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
import androidx.compose.runtime.getValue
|
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")
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -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)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user