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