From 6993cec85e27ac7c5467966e4a5ca661430c3889 Mon Sep 17 00:00:00 2001 From: Koitharu Date: Thu, 12 Oct 2023 09:33:17 +0300 Subject: [PATCH] Fix new chapters counter in details screen --- .../kotatsu/details/ui/DetailsActivity.kt | 9 ------- .../kotatsu/details/ui/DetailsFragment.kt | 25 ++++++++++++++++--- .../kotatsu/details/ui/DetailsViewModel.kt | 11 +++++--- 3 files changed, 29 insertions(+), 16 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 ffa143919..341dec69f 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 @@ -39,7 +39,6 @@ import org.koitharu.kotatsu.core.os.AppShortcutManager import org.koitharu.kotatsu.core.parser.MangaIntent import org.koitharu.kotatsu.core.ui.BaseActivity import org.koitharu.kotatsu.core.ui.util.MenuInvalidator -import org.koitharu.kotatsu.core.util.ViewBadge import org.koitharu.kotatsu.core.util.ext.doOnExpansionsChanged import org.koitharu.kotatsu.core.util.ext.getAnimationDuration import org.koitharu.kotatsu.core.util.ext.getThemeColor @@ -75,7 +74,6 @@ class DetailsActivity : @Inject lateinit var appShortcutManager: AppShortcutManager - private lateinit var viewBadge: ViewBadge private var buttonTip: WeakReference? = null private val viewModel: DetailsViewModel by viewModels() @@ -92,8 +90,6 @@ class DetailsActivity : viewBinding.buttonRead.setOnLongClickListener(this) viewBinding.buttonRead.setOnContextClickListenerCompat(this) viewBinding.buttonDropdown.setOnClickListener(this) - viewBadge = ViewBadge(viewBinding.buttonRead, this) - viewBadge.setMaxCharacterCount(1) if (viewBinding.layoutBottom != null) { val behavior = BottomSheetBehavior.from(checkNotNull(viewBinding.layoutBottom)) @@ -114,7 +110,6 @@ class DetailsActivity : onBackPressedDispatcher.addCallback(chaptersMenuProvider) viewModel.manga.filterNotNull().observe(this, ::onMangaUpdated) - viewModel.newChaptersCount.observe(this, ::onNewChaptersChanged) viewModel.onMangaRemoved.observeEvent(this, ::onMangaRemoved) viewModel.onError.observeEvent( this, @@ -296,10 +291,6 @@ class DetailsActivity : viewBinding.textViewTitle?.text = text } - private fun onNewChaptersChanged(newChapters: Int) { - viewBadge.counter = newChapters - } - private fun showBranchPopupMenu(v: View) { val menu = PopupMenu(v.context, v) val branches = viewModel.branches.value diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/details/ui/DetailsFragment.kt b/app/src/main/kotlin/org/koitharu/kotatsu/details/ui/DetailsFragment.kt index f6726cd74..5194e53f1 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/details/ui/DetailsFragment.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/details/ui/DetailsFragment.kt @@ -11,6 +11,8 @@ import android.widget.Toast import androidx.appcompat.widget.PopupMenu import androidx.core.content.ContextCompat import androidx.core.graphics.Insets +import androidx.core.text.buildSpannedString +import androidx.core.text.color import androidx.core.view.isGone import androidx.core.view.isVisible import androidx.core.view.updatePadding @@ -21,6 +23,7 @@ import coil.request.SuccessResult import coil.util.CoilUtils import com.google.android.material.chip.Chip import dagger.hilt.android.AndroidEntryPoint +import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.filterNotNull import org.koitharu.kotatsu.R import org.koitharu.kotatsu.bookmarks.domain.Bookmark @@ -37,6 +40,7 @@ import org.koitharu.kotatsu.core.util.FileSize import org.koitharu.kotatsu.core.util.ext.crossfade import org.koitharu.kotatsu.core.util.ext.drawableTop import org.koitharu.kotatsu.core.util.ext.enqueueWith +import org.koitharu.kotatsu.core.util.ext.getThemeColor import org.koitharu.kotatsu.core.util.ext.ifNullOrEmpty import org.koitharu.kotatsu.core.util.ext.isTextTruncated import org.koitharu.kotatsu.core.util.ext.observe @@ -70,6 +74,7 @@ import org.koitharu.kotatsu.scrobbling.common.ui.selector.ScrobblingSelectorShee import org.koitharu.kotatsu.search.ui.MangaListActivity import org.koitharu.kotatsu.search.ui.SearchActivity import javax.inject.Inject +import com.google.android.material.R as materialR @AndroidEntryPoint class DetailsFragment : @@ -113,9 +118,9 @@ class DetailsFragment : viewModel.bookmarks.observe(viewLifecycleOwner, ::onBookmarksChanged) viewModel.scrobblingInfo.observe(viewLifecycleOwner, ::onScrobblingInfoChanged) viewModel.description.observe(viewLifecycleOwner, ::onDescriptionChanged) - viewModel.chapters.observe(viewLifecycleOwner, ::onChaptersChanged) viewModel.localSize.observe(viewLifecycleOwner, ::onLocalSizeChanged) viewModel.relatedManga.observe(viewLifecycleOwner, ::onRelatedMangaChanged) + combine(viewModel.chapters, viewModel.newChaptersCount, ::Pair).observe(viewLifecycleOwner, ::onChaptersChanged) } override fun onItemClick(item: Bookmark, view: View) { @@ -191,14 +196,28 @@ class DetailsFragment : } } - private fun onChaptersChanged(chapters: List?) { + private fun onChaptersChanged(data: Pair?, Int>) { + val (chapters, newChapters) = data val infoLayout = requireViewBinding().infoLayout if (chapters.isNullOrEmpty()) { infoLayout.textViewChapters.isVisible = false } else { val count = chapters.countChaptersByBranch() infoLayout.textViewChapters.isVisible = true - infoLayout.textViewChapters.text = resources.getQuantityString(R.plurals.chapters, count, count) + val chaptersText = resources.getQuantityString(R.plurals.chapters, count, count) + infoLayout.textViewChapters.text = if (newChapters == 0) { + chaptersText + } else { + buildSpannedString { + append(chaptersText) + append(' ') + color(infoLayout.textViewChapters.context.getThemeColor(materialR.attr.colorError)) { + append("(+") + append(newChapters.toString()) + append(')') + } + } + } } } 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 1348d62b9..7c1a699b5 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 @@ -24,7 +24,6 @@ import org.koitharu.kotatsu.R import org.koitharu.kotatsu.bookmarks.domain.Bookmark import org.koitharu.kotatsu.bookmarks.domain.BookmarksRepository import org.koitharu.kotatsu.core.model.getPreferredBranch -import org.koitharu.kotatsu.core.os.NetworkState import org.koitharu.kotatsu.core.parser.MangaIntent import org.koitharu.kotatsu.core.prefs.AppSettings import org.koitharu.kotatsu.core.prefs.ListMode @@ -71,7 +70,6 @@ class DetailsViewModel @Inject constructor( private val relatedMangaUseCase: RelatedMangaUseCase, private val extraProvider: ListExtraProvider, private val detailsLoadUseCase: DetailsLoadUseCase, - networkState: NetworkState, ) : BaseViewModel() { private val intent = MangaIntent(savedStateHandle) @@ -93,8 +91,13 @@ class DetailsViewModel @Inject constructor( val favouriteCategories = interactor.observeIsFavourite(mangaId) .stateIn(viewModelScope + Dispatchers.Default, SharingStarted.Eagerly, false) - val newChaptersCount = interactor.observeNewChapters(mangaId) - .stateIn(viewModelScope + Dispatchers.Default, SharingStarted.Eagerly, 0) + val newChaptersCount = details.flatMapLatest { d -> + if (d?.isLocal == false) { + interactor.observeNewChapters(mangaId) + } else { + flowOf(0) + } + }.stateIn(viewModelScope + Dispatchers.Default, SharingStarted.Eagerly, 0) private val chaptersQuery = MutableStateFlow("") val selectedBranch = MutableStateFlow(null)