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