diff --git a/i18n/src/main/res/values/strings.xml b/i18n/src/main/res/values/strings.xml
index d5f68956..2d24f681 100644
--- a/i18n/src/main/res/values/strings.xml
+++ b/i18n/src/main/res/values/strings.xml
@@ -617,6 +617,9 @@
Hidden search results
Manage hidden apps and search results
Wikipedia URL
+ Change the order of pinned items
+ Frequently used
+ Show frequently used items in favorites
You haven\'t connected a Nextcloud account yet
diff --git a/ui/src/main/java/de/mm20/launcher2/ui/settings/SettingsActivity.kt b/ui/src/main/java/de/mm20/launcher2/ui/settings/SettingsActivity.kt
index 3609bd9d..1a100a54 100644
--- a/ui/src/main/java/de/mm20/launcher2/ui/settings/SettingsActivity.kt
+++ b/ui/src/main/java/de/mm20/launcher2/ui/settings/SettingsActivity.kt
@@ -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()
}
diff --git a/ui/src/main/java/de/mm20/launcher2/ui/settings/favorites/FavoritesSettingsScreen.kt b/ui/src/main/java/de/mm20/launcher2/ui/settings/favorites/FavoritesSettingsScreen.kt
new file mode 100644
index 00000000..be71e1f7
--- /dev/null
+++ b/ui/src/main/java/de/mm20/launcher2/ui/settings/favorites/FavoritesSettingsScreen.kt
@@ -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 }
+ )
+ }
+}
\ No newline at end of file
diff --git a/ui/src/main/java/de/mm20/launcher2/ui/settings/favorites/FavoritesSettingsScreenVM.kt b/ui/src/main/java/de/mm20/launcher2/ui/settings/favorites/FavoritesSettingsScreenVM.kt
new file mode 100644
index 00000000..daa95021
--- /dev/null
+++ b/ui/src/main/java/de/mm20/launcher2/ui/settings/favorites/FavoritesSettingsScreenVM.kt
@@ -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()
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/ui/src/main/java/de/mm20/launcher2/ui/settings/search/SearchSettingsScreen.kt b/ui/src/main/java/de/mm20/launcher2/ui/settings/search/SearchSettingsScreen.kt
index 1fed3425..21c62f28 100644
--- a/ui/src/main/java/de/mm20/launcher2/ui/settings/search/SearchSettingsScreen.kt
+++ b/ui/src/main/java/de/mm20/launcher2/ui/settings/search/SearchSettingsScreen.kt
@@ -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")
}
)
diff --git a/ui/src/main/java/de/mm20/launcher2/ui/settings/widgets/WidgetSettingsScreenVM.kt b/ui/src/main/java/de/mm20/launcher2/ui/settings/widgets/WidgetSettingsScreenVM.kt
index d73d0e37..eceeb3be 100644
--- a/ui/src/main/java/de/mm20/launcher2/ui/settings/widgets/WidgetSettingsScreenVM.kt
+++ b/ui/src/main/java/de/mm20/launcher2/ui/settings/widgets/WidgetSettingsScreenVM.kt
@@ -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()
}
\ No newline at end of file
diff --git a/ui/src/main/java/de/mm20/launcher2/ui/settings/widgets/WidgetsSettingsScreen.kt b/ui/src/main/java/de/mm20/launcher2/ui/settings/widgets/WidgetsSettingsScreen.kt
index 0deba0bd..42e95f38 100644
--- a/ui/src/main/java/de/mm20/launcher2/ui/settings/widgets/WidgetsSettingsScreen.kt
+++ b/ui/src/main/java/de/mm20/launcher2/ui/settings/widgets/WidgetsSettingsScreen.kt
@@ -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")
+ }
+ )
+ }
}
}
}
\ No newline at end of file
diff --git a/widgets/src/main/java/de/mm20/launcher2/widgets/Widget.kt b/widgets/src/main/java/de/mm20/launcher2/widgets/Widget.kt
index b72c31eb..7f082b59 100644
--- a/widgets/src/main/java/de/mm20/launcher2/widgets/Widget.kt
+++ b/widgets/src/main/java/de/mm20/launcher2/widgets/Widget.kt
@@ -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)
+ }
}