diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/common/FavoritesVM.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/common/FavoritesVM.kt index f891a740..9ffc9687 100644 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/common/FavoritesVM.kt +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/common/FavoritesVM.kt @@ -16,7 +16,7 @@ import org.koin.core.component.inject abstract class FavoritesVM : ViewModel(), KoinComponent { private val favoritesRepository: FavoritesRepository by inject() - private val widgetRepository: WidgetRepository by inject() + internal val widgetRepository: WidgetRepository by inject() private val customAttributesRepository: CustomAttributesRepository by inject() internal val dataStore: LauncherDataStore by inject() @@ -33,7 +33,7 @@ abstract class FavoritesVM : ViewModel(), KoinComponent { it.filterIsInstance() } - val favorites: Flow> = selectedTag.flatMapLatest { tag -> + open val favorites: Flow> = selectedTag.flatMapLatest { tag -> if (tag == null) { val columns = dataStore.data.map { it.grid.columnCount } val excludeCalendar = widgetRepository.isCalendarWidgetEnabled() diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/widgets/favorites/FavoritesWidgetVM.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/widgets/favorites/FavoritesWidgetVM.kt index 8e00f29c..de4a27eb 100644 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/widgets/favorites/FavoritesWidgetVM.kt +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/widgets/favorites/FavoritesWidgetVM.kt @@ -1,17 +1,37 @@ package de.mm20.launcher2.ui.launcher.widgets.favorites import androidx.lifecycle.viewModelScope +import de.mm20.launcher2.preferences.Settings.ClockWidgetSettings.ClockWidgetLayout import de.mm20.launcher2.ui.common.FavoritesVM import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.SharingStarted +import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.shareIn import kotlinx.coroutines.launch -class FavoritesWidgetVM: FavoritesVM() { +class FavoritesWidgetVM : FavoritesVM() { + override val tagsExpanded: Flow = dataStore.data.map { it.ui.widgetTagsMultiline } .shareIn(viewModelScope, SharingStarted.Lazily) + private val isTopWidget = widgetRepository.isFavoritesWidgetFirst() + private val clockWidgetFavSlots = dataStore.data.combine(isTopWidget) { data, isTop -> + if (!isTop) 0 + else { + if (data.clockWidget.layout == ClockWidgetLayout.Horizontal) data.grid.columnCount - 2 + else data.grid.columnCount + } + } + + override val favorites = super.favorites.combine(clockWidgetFavSlots) { favs, slots -> + if (selectedTag.value == null) { + favs.subList(slots, favs.size) + } else { + favs + } + } + override fun setTagsExpanded(expanded: Boolean) { viewModelScope.launch { dataStore.updateData { diff --git a/core/database/src/main/java/de/mm20/launcher2/database/WidgetDao.kt b/core/database/src/main/java/de/mm20/launcher2/database/WidgetDao.kt index 983287b6..0d377c45 100644 --- a/core/database/src/main/java/de/mm20/launcher2/database/WidgetDao.kt +++ b/core/database/src/main/java/de/mm20/launcher2/database/WidgetDao.kt @@ -36,4 +36,7 @@ interface WidgetDao { @Query("SELECT EXISTS(SELECT 1 FROM Widget WHERE type = :type AND data = :data)") fun exists(type: String, data: String) : Flow + + @Query("SELECT * FROM Widget ORDER BY position ASC LIMIT 1") + fun getFirst() : Flow } \ No newline at end of file diff --git a/data/widgets/src/main/java/de/mm20/launcher2/widgets/WidgetRepository.kt b/data/widgets/src/main/java/de/mm20/launcher2/widgets/WidgetRepository.kt index 0b3b69c7..c7611a10 100644 --- a/data/widgets/src/main/java/de/mm20/launcher2/widgets/WidgetRepository.kt +++ b/data/widgets/src/main/java/de/mm20/launcher2/widgets/WidgetRepository.kt @@ -24,6 +24,8 @@ interface WidgetRepository { fun isCalendarWidgetEnabled(): Flow fun isFavoritesWidgetEnabled(): Flow + fun isFavoritesWidgetFirst(): Flow + suspend fun export(toDir: File) suspend fun import(fromDir: File) } @@ -105,6 +107,10 @@ internal class WidgetRepositoryImpl( return database.widgetDao().exists("internal", "favorites") } + override fun isFavoritesWidgetFirst(): Flow { + return database.widgetDao().getFirst().map { it?.type == "internal" && it.data == "favorites" } + } + override suspend fun export(toDir: File) = withContext(Dispatchers.IO) { val dao = database.backupDao() var page = 0