From 597a37f1c275abcacad0677eb391f1e5964af0e8 Mon Sep 17 00:00:00 2001 From: Jays2Kings Date: Fri, 3 Mar 2023 16:05:59 -0500 Subject: [PATCH] More recents updates *Add option to expand/collapse grouped chapters separately from updates *Show "more chapters" in body text when collapsed in updates section *Only take last set of recentsitems to check if theres an existing *Shrink the size of sub chapters text --- .../data/preference/PreferencesHelper.kt | 2 + .../ui/recents/RecentMangaAdapter.kt | 10 ++++- .../tachiyomi/ui/recents/RecentMangaHolder.kt | 37 +++++++++++++++---- .../tachiyomi/ui/recents/RecentsController.kt | 4 +- .../tachiyomi/ui/recents/RecentsPresenter.kt | 10 ++--- .../ui/recents/options/RecentsHistoryView.kt | 3 ++ .../res/layout/recent_sub_chapter_item.xml | 2 +- .../main/res/layout/recents_history_view.xml | 9 ++++- 8 files changed, 60 insertions(+), 17 deletions(-) diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferencesHelper.kt b/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferencesHelper.kt index 0c28aabad6..0fa194d7f2 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferencesHelper.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferencesHelper.kt @@ -377,6 +377,8 @@ class PreferencesHelper(val context: Context) { fun groupChaptersHistory() = flowPrefs.getBoolean(Keys.groupChaptersHistory, true) + fun collapseGroupedHistory() = flowPrefs.getBoolean("collapse_group_history", false) + fun showTitleFirstInRecents() = flowPrefs.getBoolean(Keys.showTitleFirstInRecents, false) fun lastExtCheck() = flowPrefs.getLong("last_ext_check", 0) diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/recents/RecentMangaAdapter.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/recents/RecentMangaAdapter.kt index 2201d4c3f8..4f84582fae 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/recents/RecentMangaAdapter.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/recents/RecentMangaAdapter.kt @@ -28,7 +28,14 @@ class RecentMangaAdapter(val delegate: RecentsInterface) : var uniformCovers = preferences.uniformGrid().get() var showOutline = preferences.outlineOnCovers().get() var sortByFetched = preferences.sortFetchedTime().get() - var collapseGroupedUpdates = preferences.collapseGroupedUpdates().get() + private var collapseGroupedUpdates = preferences.collapseGroupedUpdates().get() + private var collapseGroupedHistory = preferences.collapseGroupedHistory().get() + val collapseGrouped: Boolean + get() = if (viewType == RecentsPresenter.VIEW_TYPE_ONLY_HISTORY) { + collapseGroupedHistory + } else { + collapseGroupedUpdates + } val viewType: Int get() = delegate.getViewType() @@ -50,6 +57,7 @@ class RecentMangaAdapter(val delegate: RecentsInterface) : preferences.showUpdatedTime().register { showUpdatedTime = it } preferences.uniformGrid().register { uniformCovers = it } preferences.collapseGroupedUpdates().register { collapseGroupedUpdates = it } + preferences.collapseGroupedHistory().register { collapseGroupedHistory = it } preferences.sortFetchedTime().asImmediateFlowIn(delegate.scope()) { sortByFetched = it } preferences.outlineOnCovers().register(false) { showOutline = it diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/recents/RecentMangaHolder.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/recents/RecentMangaHolder.kt index ce26350324..75c49a0b43 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/recents/RecentMangaHolder.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/recents/RecentMangaHolder.kt @@ -10,7 +10,6 @@ import android.view.ViewGroup import android.widget.ImageView import androidx.constraintlayout.widget.ConstraintLayout import androidx.core.view.children -import androidx.core.view.forEach import androidx.core.view.isVisible import androidx.core.view.updateLayoutParams import androidx.core.view.updatePaddingRelative @@ -69,6 +68,8 @@ class RecentMangaHolder( } ) { showScanlatorInBody(moreVisible) + } else { + addMoreUpdatesText(!moreVisible) } binding.endView.updateLayoutParams { height = binding.mainView.height @@ -237,6 +238,8 @@ class RecentMangaHolder( } ) { showScanlatorInBody(moreVisible, item) + } else { + addMoreUpdatesText(!moreVisible, item) } } else { binding.moreChaptersLayout.removeAllViews() @@ -261,6 +264,7 @@ class RecentMangaHolder( } } } + addMoreUpdatesText(!moreVisible, item) } else { chapterId = null } @@ -282,9 +286,27 @@ class RecentMangaHolder( } } + private fun addMoreUpdatesText(add: Boolean, originalItem: RecentMangaItem? = null) { + val item = originalItem ?: adapter.getItem(bindingAdapterPosition) as? RecentMangaItem ?: return + val originalText = binding.body.text.toString() + val andMoreText = itemView.context.resources.getQuantityString( + R.plurals.notification_and_n_more, + (item.mch.extraChapters.size), + (item.mch.extraChapters.size), + ) + if (add && item.mch.extraChapters.isNotEmpty() && isUpdates && + !isSmallUpdates && !originalText.contains(andMoreText) + ) { + val text = "${originalText.substringBefore("\n")}\n$andMoreText" + binding.body.text = text + } else if (!add && originalText.contains(andMoreText)) { + binding.body.text = originalText.removeSuffix("\n$andMoreText") + } + } + private fun showScanlatorInBody(add: Boolean, originalItem: RecentMangaItem? = null) { val item = originalItem ?: adapter.getItem(bindingAdapterPosition) as? RecentMangaItem ?: return - val originalText = binding.body.text + val originalText = binding.body.text.toString() binding.body.maxLines = 2 val scanlator = item.chapter.scanlator ?: return if (add) { @@ -293,7 +315,7 @@ class RecentMangaHolder( binding.body.text = item.chapter.scanlator binding.body.isVisible = true } else if (!originalText.contains(scanlator)) { - val text = "$originalText\n$scanlator" + val text = "${originalText.substringBefore("\n")}\n$scanlator" binding.body.text = text } } else { @@ -301,6 +323,7 @@ class RecentMangaHolder( binding.body.isVisible = false } else { binding.body.text = originalText.removeSuffix("\n$scanlator") + addMoreUpdatesText(true, item) } } } @@ -311,10 +334,10 @@ class RecentMangaHolder( val showDLs = adapter.showDownloads title.text = chapter.preferredChapterName(context, item.mch.manga, adapter.preferences) title.setTextColor(ChapterUtil.readColor(context, chapter)) - chapter.dateRead?.let { dateRead -> - subtitle.text = context.timeSpanFromNow(R.string.read_, dateRead) - subtitle.isVisible = true - } + subtitle.isVisible = chapter.dateRead != null + subtitle.text = chapter.dateRead?.let { dateRead -> + context.timeSpanFromNow(R.string.read_, dateRead) + } ?: "" root.setOnClickListener { adapter.delegate.onSubChapterClicked( bindingAdapterPosition, diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/recents/RecentsController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/recents/RecentsController.kt index 665aca2a1d..e39d4dd4ca 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/recents/RecentsController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/recents/RecentsController.kt @@ -653,7 +653,7 @@ class RecentsController(bundle: Bundle? = null) : override fun areExtraChaptersExpanded(position: Int): Boolean { val item = (adapter.getItem(position) as? RecentMangaItem) ?: return false val date = presenter.dateFormat.format(item.chapter.dateRead ?: item.chapter.date_fetch) - val invertDefault = !adapter.collapseGroupedUpdates + val invertDefault = !adapter.collapseGrouped return presenter.expandedSectionsMap["${item.mch.manga} - $date"]?.xor(invertDefault) ?: invertDefault } @@ -661,7 +661,7 @@ class RecentsController(bundle: Bundle? = null) : override fun updateExpandedExtraChapters(position: Int, expanded: Boolean) { val item = (adapter.getItem(position) as? RecentMangaItem) ?: return val date = presenter.dateFormat.format(item.chapter.dateRead ?: item.chapter.date_fetch) - val invertDefault = !adapter.collapseGroupedUpdates + val invertDefault = !adapter.collapseGrouped presenter.expandedSectionsMap["${item.mch.manga} - $date"] = expanded.xor(invertDefault) } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/recents/RecentsPresenter.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/recents/RecentsPresenter.kt index a935d06d26..4151844f02 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/recents/RecentsPresenter.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/recents/RecentsPresenter.kt @@ -187,7 +187,7 @@ class RecentsPresenter( }.filterChaptersByScanlators(manga) extraCount += mchs.size - chapters.size if (chapters.isEmpty()) return@mapNotNull null - val existingItem = recentItems.find { + val existingItem = recentItems.takeLast(ENDLESS_LIMIT).find { val date = Date(it.mch.history.last_read) key == it.manga_id to dateFormat.format(date) }?.takeIf { updatePageCount } @@ -220,7 +220,7 @@ class RecentsPresenter( val chapters = mcs.map { it.chapter }.filterChaptersByScanlators(manga) extraCount += mcs.size - chapters.size if (chapters.isEmpty()) return@mapNotNull null - val existingItem = recentItems.find { + val existingItem = recentItems.takeLast(ENDLESS_LIMIT).find { val date = Date(it.chapter.date_fetch) key == it.manga_id to dateFormat.format(date) }?.takeIf { updatePageCount } @@ -279,9 +279,9 @@ class RecentsPresenter( if (viewType == VIEW_TYPE_ONLY_HISTORY && nextChapter != null) { val unreadChapterIsAlreadyInList = recentItems.any { item -> item.mch.manga.id == it.manga.id } || - mangaList.indexOfFirst { item -> - item.manga.id == it.manga.id - } > mangaList.indexOf(it) + mangaList.indexOfFirst { item -> + item.manga.id == it.manga.id + } > mangaList.indexOf(it) if (unreadChapterIsAlreadyInList) { return@result it.chapter } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/recents/options/RecentsHistoryView.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/recents/options/RecentsHistoryView.kt index 9a63f7c652..0440165cde 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/recents/options/RecentsHistoryView.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/recents/options/RecentsHistoryView.kt @@ -14,6 +14,9 @@ class RecentsHistoryView @JvmOverloads constructor(context: Context, attrs: Attr override fun inflateBinding() = RecentsHistoryViewBinding.bind(this) override fun initGeneralPreferences() { binding.groupChapters.bindToPreference(preferences.groupChaptersHistory()) + binding.collapseGroupedChapters.bindToPreference(preferences.collapseGroupedHistory()) { + controller?.presenter?.expandedSectionsMap?.clear() + } binding.clearHistory.setOnClickListener { val activity = controller?.activity ?: return@setOnClickListener activity.materialAlertDialog() diff --git a/app/src/main/res/layout/recent_sub_chapter_item.xml b/app/src/main/res/layout/recent_sub_chapter_item.xml index 870f03a750..f28f06ded5 100644 --- a/app/src/main/res/layout/recent_sub_chapter_item.xml +++ b/app/src/main/res/layout/recent_sub_chapter_item.xml @@ -34,7 +34,7 @@ + + - \ No newline at end of file