From e4e14214d970dcad11d9c4d887ff0cf252219c83 Mon Sep 17 00:00:00 2001 From: Koitharu Date: Mon, 11 Mar 2024 12:49:20 +0200 Subject: [PATCH] Check if has stats on details screen --- .../kotatsu/details/ui/DetailsActivity.kt | 2 +- .../kotatsu/details/ui/DetailsMenuProvider.kt | 2 +- .../kotatsu/details/ui/DetailsViewModel.kt | 7 ++++--- .../koitharu/kotatsu/stats/data/StatsDao.kt | 3 +++ .../kotatsu/stats/data/StatsRepository.kt | 20 +++++++++++++++++++ 5 files changed, 29 insertions(+), 5 deletions(-) diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/details/ui/DetailsActivity.kt b/app/src/main/kotlin/org/koitharu/kotatsu/details/ui/DetailsActivity.kt index 2a134a95f..8d56c0d1b 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/details/ui/DetailsActivity.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/details/ui/DetailsActivity.kt @@ -153,7 +153,7 @@ class DetailsActivity : viewModel.isChaptersEmpty.observe(this, chaptersMenuInvalidator) val menuInvalidator = MenuInvalidator(this) viewModel.favouriteCategories.observe(this, menuInvalidator) - viewModel.isStatsEnabled.observe(this, menuInvalidator) + viewModel.isStatsAvailable.observe(this, menuInvalidator) viewModel.remoteManga.observe(this, menuInvalidator) viewModel.branches.observe(this) { viewBinding.buttonDropdown.isVisible = it.size > 1 diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/details/ui/DetailsMenuProvider.kt b/app/src/main/kotlin/org/koitharu/kotatsu/details/ui/DetailsMenuProvider.kt index ffd456380..0c9be69b9 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/details/ui/DetailsMenuProvider.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/details/ui/DetailsMenuProvider.kt @@ -44,7 +44,7 @@ class DetailsMenuProvider( menu.findItem(R.id.action_shortcut).isVisible = ShortcutManagerCompat.isRequestPinShortcutSupported(activity) menu.findItem(R.id.action_scrobbling).isVisible = viewModel.isScrobblingAvailable menu.findItem(R.id.action_online).isVisible = viewModel.remoteManga.value != null - menu.findItem(R.id.action_stats).isVisible = viewModel.isStatsEnabled.value + menu.findItem(R.id.action_stats).isVisible = viewModel.isStatsAvailable.value menu.findItem(R.id.action_favourite).setIcon( if (viewModel.favouriteCategories.value) R.drawable.ic_heart else R.drawable.ic_heart_outline, ) diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/details/ui/DetailsViewModel.kt b/app/src/main/kotlin/org/koitharu/kotatsu/details/ui/DetailsViewModel.kt index 77e79e46c..679652100 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/details/ui/DetailsViewModel.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/details/ui/DetailsViewModel.kt @@ -61,6 +61,7 @@ import org.koitharu.kotatsu.parsers.util.runCatchingCancellable import org.koitharu.kotatsu.scrobbling.common.domain.Scrobbler import org.koitharu.kotatsu.scrobbling.common.domain.model.ScrobblingInfo import org.koitharu.kotatsu.scrobbling.common.domain.model.ScrobblingStatus +import org.koitharu.kotatsu.stats.data.StatsRepository import javax.inject.Inject @HiltViewModel @@ -79,6 +80,7 @@ class DetailsViewModel @Inject constructor( private val detailsLoadUseCase: DetailsLoadUseCase, private val progressUpdateUseCase: ProgressUpdateUseCase, private val readingTimeUseCase: ReadingTimeUseCase, + private val statsRepository: StatsRepository, ) : BaseViewModel() { private val intent = MangaIntent(savedStateHandle) @@ -100,9 +102,8 @@ class DetailsViewModel @Inject constructor( val favouriteCategories = interactor.observeIsFavourite(mangaId) .stateIn(viewModelScope + Dispatchers.Default, SharingStarted.Eagerly, false) - val isStatsEnabled = settings.observeAsStateFlow(viewModelScope + Dispatchers.Default, AppSettings.KEY_STATS_ENABLED) { - isStatsEnabled - } + val isStatsAvailable = statsRepository.observeHasStats(mangaId) + .stateIn(viewModelScope + Dispatchers.Default, SharingStarted.Eagerly, false) val remoteManga = MutableStateFlow(null) diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/stats/data/StatsDao.kt b/app/src/main/kotlin/org/koitharu/kotatsu/stats/data/StatsDao.kt index 5e144a769..a071d10e6 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/stats/data/StatsDao.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/stats/data/StatsDao.kt @@ -41,6 +41,9 @@ abstract class StatsDao { @Query("DELETE FROM stats") abstract suspend fun clear() + @Query("SELECT COUNT(*) FROM stats WHERE manga_id = :mangaId") + abstract fun observeRowCount(mangaId: Long): Flow + @Upsert abstract suspend fun upsert(entity: StatsEntity) diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/stats/data/StatsRepository.kt b/app/src/main/kotlin/org/koitharu/kotatsu/stats/data/StatsRepository.kt index 70bb61f81..7facb67e0 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/stats/data/StatsRepository.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/stats/data/StatsRepository.kt @@ -3,8 +3,17 @@ package org.koitharu.kotatsu.stats.data import androidx.collection.LongIntMap import androidx.collection.MutableLongIntMap import androidx.room.withTransaction +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.combine +import kotlinx.coroutines.flow.distinctUntilChanged +import kotlinx.coroutines.flow.flatMapLatest +import kotlinx.coroutines.flow.flowOf +import kotlinx.coroutines.flow.map import org.koitharu.kotatsu.core.db.MangaDatabase import org.koitharu.kotatsu.core.db.entity.toManga +import org.koitharu.kotatsu.core.prefs.AppSettings +import org.koitharu.kotatsu.core.prefs.observeAsFlow +import org.koitharu.kotatsu.core.util.ext.combine import org.koitharu.kotatsu.stats.domain.StatsPeriod import org.koitharu.kotatsu.stats.domain.StatsRecord import java.util.NavigableMap @@ -13,6 +22,7 @@ import java.util.concurrent.TimeUnit import javax.inject.Inject class StatsRepository @Inject constructor( + private val settings: AppSettings, private val db: MangaDatabase, ) { @@ -71,4 +81,14 @@ class StatsRepository @Inject constructor( suspend fun clearStats() { db.getStatsDao().clear() } + + fun observeHasStats(mangaId: Long): Flow = settings.observeAsFlow(AppSettings.KEY_STATS_ENABLED) { + isStatsEnabled + }.flatMapLatest { isEnabled -> + if (isEnabled) { + db.getStatsDao().observeRowCount(mangaId).map { it > 0 } + } else { + flowOf(false) + } + }.distinctUntilChanged() }