From 0b7704cdf2db26be690e87719c3ec3bf56815bb6 Mon Sep 17 00:00:00 2001 From: MM20 <15646950+MM2-0@users.noreply.github.com> Date: Wed, 30 Mar 2022 22:29:20 +0200 Subject: [PATCH] Add favorites widget --- i18n/src/main/res/values/strings.xml | 1 + .../mm20/launcher2/ui/base/ProvideSettings.kt | 8 ++++- .../ui/launcher/widgets/WidgetItem.kt | 4 +++ .../widgets/favorites/FavoritesWidget.kt | 15 ++++++++++ .../widgets/favorites/FavoritesWidgetVM.kt | 30 +++++++++++++++++++ .../java/de/mm20/launcher2/widgets/Widget.kt | 19 ++++++++++++ .../launcher2/widgets/WidgetRepository.kt | 7 ++++- 7 files changed, 82 insertions(+), 2 deletions(-) create mode 100644 ui/src/main/java/de/mm20/launcher2/ui/launcher/widgets/favorites/FavoritesWidget.kt create mode 100644 ui/src/main/java/de/mm20/launcher2/ui/launcher/widgets/favorites/FavoritesWidgetVM.kt diff --git a/i18n/src/main/res/values/strings.xml b/i18n/src/main/res/values/strings.xml index 0d8b3261..f916a7bc 100644 --- a/i18n/src/main/res/values/strings.xml +++ b/i18n/src/main/res/values/strings.xml @@ -204,6 +204,7 @@ Weather Calendar Music + Favorites Add widget More diff --git a/ui/src/main/java/de/mm20/launcher2/ui/base/ProvideSettings.kt b/ui/src/main/java/de/mm20/launcher2/ui/base/ProvideSettings.kt index 73be8429..04713652 100644 --- a/ui/src/main/java/de/mm20/launcher2/ui/base/ProvideSettings.kt +++ b/ui/src/main/java/de/mm20/launcher2/ui/base/ProvideSettings.kt @@ -7,6 +7,8 @@ import de.mm20.launcher2.ui.component.ProvideIconShape import de.mm20.launcher2.ui.locals.LocalCardStyle import de.mm20.launcher2.ui.locals.LocalFavoritesEnabled import de.mm20.launcher2.ui.locals.LocalGridColumns +import de.mm20.launcher2.widgets.WidgetRepository +import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.map import org.koin.androidx.compose.inject @@ -16,6 +18,7 @@ fun ProvideSettings( content: @Composable () -> Unit ) { val dataStore: LauncherDataStore by inject() + val widgetRepository: WidgetRepository by inject() val cardStyle by remember { dataStore.data.map { it.cards }.distinctUntilChanged() @@ -30,7 +33,10 @@ fun ProvideSettings( }.collectAsState(Settings.IconSettings.IconShape.Circle) val favoritesEnabled by remember { - dataStore.data.map { it.favorites.enabled }.distinctUntilChanged() + combine( + widgetRepository.isFavoritesWidgetEnabled(), + dataStore.data.map { it.favorites.enabled } + ) { a, b -> a || b }.distinctUntilChanged() }.collectAsState(true) val gridColumns by remember { diff --git a/ui/src/main/java/de/mm20/launcher2/ui/launcher/widgets/WidgetItem.kt b/ui/src/main/java/de/mm20/launcher2/ui/launcher/widgets/WidgetItem.kt index 48cb35ba..63481fb8 100644 --- a/ui/src/main/java/de/mm20/launcher2/ui/launcher/widgets/WidgetItem.kt +++ b/ui/src/main/java/de/mm20/launcher2/ui/launcher/widgets/WidgetItem.kt @@ -25,6 +25,7 @@ import de.mm20.launcher2.ui.R import de.mm20.launcher2.ui.component.LauncherCard import de.mm20.launcher2.ui.launcher.widgets.calendar.CalendarWidget import de.mm20.launcher2.ui.launcher.widgets.external.ExternalWidget +import de.mm20.launcher2.ui.launcher.widgets.favorites.FavoritesWidget import de.mm20.launcher2.ui.launcher.widgets.music.MusicWidget import de.mm20.launcher2.ui.launcher.widgets.weather.WeatherWidget import de.mm20.launcher2.widgets.* @@ -120,6 +121,9 @@ fun WidgetItem( is CalendarWidget -> { CalendarWidget() } + is FavoritesWidget -> { + FavoritesWidget() + } is ExternalWidget -> { var height by remember(widget) { mutableStateOf(widget.height) } Column { diff --git a/ui/src/main/java/de/mm20/launcher2/ui/launcher/widgets/favorites/FavoritesWidget.kt b/ui/src/main/java/de/mm20/launcher2/ui/launcher/widgets/favorites/FavoritesWidget.kt new file mode 100644 index 00000000..2023f4ec --- /dev/null +++ b/ui/src/main/java/de/mm20/launcher2/ui/launcher/widgets/favorites/FavoritesWidget.kt @@ -0,0 +1,15 @@ +package de.mm20.launcher2.ui.launcher.widgets.favorites + +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.livedata.observeAsState +import androidx.lifecycle.viewmodel.compose.viewModel +import de.mm20.launcher2.ui.launcher.search.common.grid.SearchResultGrid + +@Composable +fun FavoritesWidget() { + val viewModel: FavoritesWidgetVM = viewModel() + val favorites by viewModel.favorites.observeAsState(emptyList()) + + SearchResultGrid(favorites) +} \ No newline at end of file diff --git a/ui/src/main/java/de/mm20/launcher2/ui/launcher/widgets/favorites/FavoritesWidgetVM.kt b/ui/src/main/java/de/mm20/launcher2/ui/launcher/widgets/favorites/FavoritesWidgetVM.kt new file mode 100644 index 00000000..e040c8e6 --- /dev/null +++ b/ui/src/main/java/de/mm20/launcher2/ui/launcher/widgets/favorites/FavoritesWidgetVM.kt @@ -0,0 +1,30 @@ +package de.mm20.launcher2.ui.launcher.widgets.favorites + +import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import de.mm20.launcher2.favorites.FavoritesRepository +import de.mm20.launcher2.preferences.LauncherDataStore +import de.mm20.launcher2.search.data.Searchable +import de.mm20.launcher2.widgets.WidgetRepository +import kotlinx.coroutines.flow.collectLatest +import kotlinx.coroutines.flow.map +import kotlinx.coroutines.launch +import org.koin.core.component.KoinComponent +import org.koin.core.component.inject + +class FavoritesWidgetVM: ViewModel(), KoinComponent { + private val favoritesRepository: FavoritesRepository by inject() + private val widgetRepository: WidgetRepository by inject() + val favorites = MutableLiveData>(emptyList()) + + init { + viewModelScope.launch { + widgetRepository.isCalendarWidgetEnabled().collectLatest { excludeCalendar -> + favoritesRepository.getFavorites(excludeCalendarEvents = excludeCalendar).collectLatest { + favorites.value = it + } + } + } + } +} \ 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 cea16880..b72c31eb 100644 --- a/widgets/src/main/java/de/mm20/launcher2/widgets/Widget.kt +++ b/widgets/src/main/java/de/mm20/launcher2/widgets/Widget.kt @@ -24,6 +24,7 @@ sealed class Widget { "weather" -> WeatherWidget "music" -> MusicWidget "calendar" -> CalendarWidget + "favorites" -> FavoritesWidget else -> null } } else { @@ -132,6 +133,24 @@ object CalendarWidget : Widget() { } } +object FavoritesWidget : Widget() { + override fun loadLabel(context: Context): String { + return context.getString(R.string.widget_name_favorites) + } + + override fun toDatabaseEntity(position: Int): WidgetEntity { + return WidgetEntity( + type = WidgetType.INTERNAL.value, + data = "favorites", + height = -1, + position = position + ) + } + + override val isConfigurable: Boolean = false +} + + class ExternalWidget( var height: Int, val widgetId: Int, diff --git a/widgets/src/main/java/de/mm20/launcher2/widgets/WidgetRepository.kt b/widgets/src/main/java/de/mm20/launcher2/widgets/WidgetRepository.kt index 1ad164db..675df1bd 100644 --- a/widgets/src/main/java/de/mm20/launcher2/widgets/WidgetRepository.kt +++ b/widgets/src/main/java/de/mm20/launcher2/widgets/WidgetRepository.kt @@ -14,6 +14,7 @@ interface WidgetRepository { fun removeWidget(widget: Widget) fun setWidgetHeight(widget: Widget, newHeight: Int) fun isCalendarWidgetEnabled(): Flow + fun isFavoritesWidgetEnabled(): Flow } internal class WidgetRepositoryImpl( @@ -30,7 +31,7 @@ internal class WidgetRepositoryImpl( } override fun getInternalWidgets(): List { - return listOf(WeatherWidget, MusicWidget, CalendarWidget) + return listOf(WeatherWidget, MusicWidget, CalendarWidget, FavoritesWidget) } @@ -81,4 +82,8 @@ internal class WidgetRepositoryImpl( return database.widgetDao().exists("internal", "calendar") } + override fun isFavoritesWidgetEnabled(): Flow { + return database.widgetDao().exists("internal", "favorites") + } + } \ No newline at end of file