From a86d453f4ec58826f64eadcfe7965b74254a66ce Mon Sep 17 00:00:00 2001 From: MM20 <15646950+MM2-0@users.noreply.github.com> Date: Wed, 30 Mar 2022 21:52:40 +0200 Subject: [PATCH] Show pinned calendar events in favorites if calendar widget is disabled --- .../de/mm20/launcher2/database/SearchDao.kt | 4 ++-- .../de/mm20/launcher2/database/WidgetDao.kt | 3 +++ .../favorites/FavoritesRepository.kt | 23 ++++++------------- .../launcher2/ui/launcher/search/SearchVM.kt | 19 ++++++++++++--- .../launcher2/widgets/WidgetRepository.kt | 5 ++++ 5 files changed, 33 insertions(+), 21 deletions(-) diff --git a/database/src/main/java/de/mm20/launcher2/database/SearchDao.kt b/database/src/main/java/de/mm20/launcher2/database/SearchDao.kt index 4a6f2521..19fff42d 100644 --- a/database/src/main/java/de/mm20/launcher2/database/SearchDao.kt +++ b/database/src/main/java/de/mm20/launcher2/database/SearchDao.kt @@ -18,8 +18,8 @@ interface SearchDao { @Insert(onConflict = OnConflictStrategy.IGNORE) fun insertSkipExisting(items: FavoritesItemEntity) - @Query("SELECT * FROM Searchable WHERE pinned > 0 AND NOT `key` LIKE 'calendar://%' ORDER BY pinned DESC, launchCount DESC") - fun getFavorites(): Flow> + @Query("SELECT * FROM Searchable WHERE pinned > 0 AND (NOT :excludeCalendarEvents OR NOT `key` LIKE 'calendar://%') ORDER BY pinned DESC, launchCount DESC") + fun getFavorites(excludeCalendarEvents: Boolean = false): Flow> @Query("SELECT * FROM Searchable WHERE pinned > 0 AND `key` LIKE 'calendar://%' ORDER BY pinned DESC, launchCount DESC") fun getPinnedCalendarEvents(): Flow> diff --git a/database/src/main/java/de/mm20/launcher2/database/WidgetDao.kt b/database/src/main/java/de/mm20/launcher2/database/WidgetDao.kt index 1116806d..983287b6 100644 --- a/database/src/main/java/de/mm20/launcher2/database/WidgetDao.kt +++ b/database/src/main/java/de/mm20/launcher2/database/WidgetDao.kt @@ -33,4 +33,7 @@ interface WidgetDao { @Query("UPDATE Widget SET height = :newHeight WHERE data = :data AND type = :type") fun updateHeight(type: String, data: String, newHeight: Int) + + @Query("SELECT EXISTS(SELECT 1 FROM Widget WHERE type = :type AND data = :data)") + fun exists(type: String, data: String) : Flow } \ No newline at end of file diff --git a/favorites/src/main/java/de/mm20/launcher2/favorites/FavoritesRepository.kt b/favorites/src/main/java/de/mm20/launcher2/favorites/FavoritesRepository.kt index 585ee9d6..6ca66edb 100644 --- a/favorites/src/main/java/de/mm20/launcher2/favorites/FavoritesRepository.kt +++ b/favorites/src/main/java/de/mm20/launcher2/favorites/FavoritesRepository.kt @@ -9,15 +9,13 @@ import de.mm20.launcher2.search.SearchableDeserializer import de.mm20.launcher2.search.data.CalendarEvent import de.mm20.launcher2.search.data.Searchable import kotlinx.coroutines.* -import kotlinx.coroutines.channels.awaitClose -import kotlinx.coroutines.channels.trySendBlocking import kotlinx.coroutines.flow.* import org.koin.core.component.KoinComponent import org.koin.core.component.get import org.koin.core.parameter.parametersOf interface FavoritesRepository { - fun getFavorites(): Flow> + fun getFavorites(excludeCalendarEvents: Boolean = false): Flow> fun getPinnedCalendarEvents(): Flow> fun isPinned(searchable: Searchable): Flow fun pinItem(searchable: Searchable) @@ -39,21 +37,15 @@ internal class FavoritesRepositoryImpl( private val scope = CoroutineScope(Job() + Dispatchers.Default) - override fun getFavorites(): Flow> = channelFlow { + override fun getFavorites(excludeCalendarEvents: Boolean): Flow> = + channelFlow { - withContext(Dispatchers.IO) { + withContext(Dispatchers.IO) { - val gridColumns = dataStore.data.map { it.grid.columnCount }.distinctUntilChanged() - val enableFavorites = dataStore.data.map { it.favorites.enabled}.distinctUntilChanged() - val dao = database.searchDao() + val gridColumns = dataStore.data.map { it.grid.columnCount }.distinctUntilChanged() + val dao = database.searchDao() - enableFavorites.collectLatest { - if (!it) { - send(emptyList()) - return@collectLatest - } - - val pinnedFavorites = dao.getFavorites().map { + val pinnedFavorites = dao.getFavorites(excludeCalendarEvents).map { it.mapNotNull { val item = fromDatabaseEntity(it).searchable if (item == null) { @@ -79,7 +71,6 @@ internal class FavoritesRepositoryImpl( } } } - } override fun getPinnedCalendarEvents(): Flow> { return database.searchDao().getPinnedCalendarEvents().map { diff --git a/ui/src/main/java/de/mm20/launcher2/ui/launcher/search/SearchVM.kt b/ui/src/main/java/de/mm20/launcher2/ui/launcher/search/SearchVM.kt index 763998e4..880dc713 100644 --- a/ui/src/main/java/de/mm20/launcher2/ui/launcher/search/SearchVM.kt +++ b/ui/src/main/java/de/mm20/launcher2/ui/launcher/search/SearchVM.kt @@ -19,6 +19,7 @@ import de.mm20.launcher2.search.WebsearchRepository import de.mm20.launcher2.search.data.* import de.mm20.launcher2.unitconverter.UnitConverterRepository import de.mm20.launcher2.websites.WebsiteRepository +import de.mm20.launcher2.widgets.WidgetRepository import de.mm20.launcher2.wikipedia.WikipediaRepository import kotlinx.coroutines.* import kotlinx.coroutines.flow.collectLatest @@ -31,6 +32,7 @@ import org.koin.core.component.inject class SearchVM : ViewModel(), KoinComponent { private val favoritesRepository: FavoritesRepository by inject() + private val widgetRepository: WidgetRepository by inject() private val permissionsManager: PermissionsManager by inject() private val dataStore: LauncherDataStore by inject() @@ -49,9 +51,7 @@ class SearchVM : ViewModel(), KoinComponent { val searchQuery = MutableLiveData("") val isSearchEmpty = MutableLiveData(true) - val favorites by lazy { - favoritesRepository.getFavorites().asLiveData() - } + val favorites = MutableLiveData>(emptyList()) val appResults = MutableLiveData>(emptyList()) val appShortcutResults = MutableLiveData>(emptyList()) @@ -68,6 +68,19 @@ class SearchVM : ViewModel(), KoinComponent { init { search("") + viewModelScope.launch { + dataStore.data.map { it.favorites.enabled }.collectLatest { enabled -> + if (!enabled) { + favorites.value = emptyList() + return@collectLatest + } + widgetRepository.isCalendarWidgetEnabled().collectLatest { excludeCalendar -> + favoritesRepository.getFavorites(excludeCalendarEvents = excludeCalendar).collectLatest { + favorites.value = it + } + } + } + } } var searchJob: Job? = null 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 fb30ab6e..1ad164db 100644 --- a/widgets/src/main/java/de/mm20/launcher2/widgets/WidgetRepository.kt +++ b/widgets/src/main/java/de/mm20/launcher2/widgets/WidgetRepository.kt @@ -13,6 +13,7 @@ interface WidgetRepository { fun addWidget(widget: Widget, position: Int) fun removeWidget(widget: Widget) fun setWidgetHeight(widget: Widget, newHeight: Int) + fun isCalendarWidgetEnabled(): Flow } internal class WidgetRepositoryImpl( @@ -76,4 +77,8 @@ internal class WidgetRepositoryImpl( } } + override fun isCalendarWidgetEnabled(): Flow { + return database.widgetDao().exists("internal", "calendar") + } + } \ No newline at end of file