From 0545780ae9258117651a7b3129d4eb5114194587 Mon Sep 17 00:00:00 2001 From: Jays2Kings Date: Tue, 6 Apr 2021 21:36:30 -0400 Subject: [PATCH] Recents Options *Show Downloads on all, unread, or none of the items *Show manga title first *Show/Hide Reset History Button *Show read chapters in Grouped/All --- .../data/database/queries/ChapterQueries.kt | 18 ++++-- .../data/database/queries/HistoryQueries.kt | 37 +++++++++-- .../data/database/queries/RawQueries.kt | 46 +++++++++++++ .../data/preference/PreferenceKeys.kt | 5 ++ .../data/preference/PreferencesHelper.kt | 9 +++ .../ui/recents/RecentMangaAdapter.kt | 45 ++++++++++++- .../tachiyomi/ui/recents/RecentMangaHolder.kt | 25 ++++++-- .../tachiyomi/ui/recents/RecentMangaItem.kt | 5 +- .../tachiyomi/ui/recents/RecentsController.kt | 36 ++++------- .../ui/recents/RecentsOptionsSheet.kt | 55 ++++++++++++++++ .../tachiyomi/ui/recents/RecentsPresenter.kt | 22 ++++++- .../main/res/layout/recents_options_sheet.xml | 64 +++++++++++++++++++ app/src/main/res/menu/recents.xml | 27 ++------ app/src/main/res/values/arrays.xml | 6 ++ app/src/main/res/values/strings.xml | 6 ++ 15 files changed, 337 insertions(+), 69 deletions(-) create mode 100644 app/src/main/java/eu/kanade/tachiyomi/ui/recents/RecentsOptionsSheet.kt create mode 100644 app/src/main/res/layout/recents_options_sheet.xml diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/database/queries/ChapterQueries.kt b/app/src/main/java/eu/kanade/tachiyomi/data/database/queries/ChapterQueries.kt index 66d1875278..c6eae700e2 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/database/queries/ChapterQueries.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/database/queries/ChapterQueries.kt @@ -32,24 +32,34 @@ interface ChapterQueries : DbProvider { ) .prepare() - fun getRecentChapters(date: Date) = db.get() + fun getRecentChapters(date: Date) = getRecentChapters(Date(), date) + + fun getRecentChapters(startDate: Date, date: Date) = db.get() .listOfObjects(MangaChapter::class.java) .withQuery( RawQuery.builder() .query(getRecentsQuery()) - .args(date.time) + .args(date.time, startDate.time) .observesTables(ChapterTable.TABLE) .build() ) .withGetResolver(MangaChapterGetResolver.INSTANCE) .prepare() - fun getUpdatedManga(date: Date, search: String = "", endless: Boolean) = db.get() + /** + * Returns history of recent manga containing last read chapter in 25s + * @param date recent date range + * @offset offset the db by + */ + fun getUpdatedManga(date: Date, search: String = "", endless: Boolean) = + getUpdatedManga(Date(), date, search, endless) + + fun getUpdatedManga(startDate: Date, date: Date, search: String = "", endless: Boolean) = db.get() .listOfObjects(MangaChapterHistory::class.java) .withQuery( RawQuery.builder() .query(getRecentsQueryDistinct(search.sqLite, endless)) - .args(date.time) + .args(date.time, startDate.time) .observesTables(ChapterTable.TABLE) .build() ) diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/database/queries/HistoryQueries.kt b/app/src/main/java/eu/kanade/tachiyomi/data/database/queries/HistoryQueries.kt index 58d6f28659..647678c8d1 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/database/queries/HistoryQueries.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/database/queries/HistoryQueries.kt @@ -42,12 +42,12 @@ interface HistoryQueries : DbProvider { * @param date recent date range * @offset offset the db by */ - fun getRecentlyAdded(date: Date, search: String = "", endless: Boolean) = db.get() + fun getRecentlyAdded(startDate: Date, date: Date, search: String = "", endless: Boolean) = db.get() .listOfObjects(MangaChapterHistory::class.java) .withQuery( RawQuery.builder() .query(getRecentAdditionsQuery(search.sqLite, endless)) - .args(date.time) + .args(date.time, startDate.time) .observesTables(MangaTable.TABLE) .build() ) @@ -59,12 +59,20 @@ interface HistoryQueries : DbProvider { * @param date recent date range * @offset offset the db by */ - fun getRecentMangaLimit(date: Date, limit: Int = 0, search: String = "") = db.get() + fun getRecentMangaLimit(date: Date, limit: Int = 0, search: String = "") = + getRecentMangaLimit(Date(), date, limit, search) + + /** + * Returns history of recent manga containing last read chapter in 25s + * @param date recent date range + * @offset offset the db by + */ + fun getRecentMangaLimit(startDate: Date, date: Date, limit: Int = 0, search: String = "") = db.get() .listOfObjects(MangaChapterHistory::class.java) .withQuery( RawQuery.builder() .query(getRecentMangasLimitQuery(limit, search.sqLite)) - .args(date.time) + .args(date.time, startDate.time) .observesTables(HistoryTable.TABLE) .build() ) @@ -76,12 +84,29 @@ interface HistoryQueries : DbProvider { * @param date recent date range * @offset offset the db by */ - fun getRecentsWithUnread(date: Date, search: String = "", endless: Boolean) = db.get() + fun getRecentsWithUnread(startDate: Date, date: Date, search: String = "", endless: Boolean) = db.get() .listOfObjects(MangaChapterHistory::class.java) .withQuery( RawQuery.builder() .query(getRecentReadWithUnreadChapters(search.sqLite, endless)) - .args(date.time) + .args(date.time, startDate.time) + .observesTables(HistoryTable.TABLE) + .build() + ) + .withGetResolver(MangaChapterHistoryGetResolver.INSTANCE) + .prepare() + + /** + * Returns history of recent manga containing last read chapter in 25s + * @param date recent date range + * @offset offset the db by + */ + fun getAllRecents(startDate: Date, date: Date, search: String = "", endless: Boolean) = db.get() + .listOfObjects(MangaChapterHistory::class.java) + .withQuery( + RawQuery.builder() + .query(getRecentRead(search.sqLite, endless)) + .args(date.time, startDate.time) .observesTables(HistoryTable.TABLE) .build() ) diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/database/queries/RawQueries.kt b/app/src/main/java/eu/kanade/tachiyomi/data/database/queries/RawQueries.kt index eb96a2b0e7..2751eff9d0 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/database/queries/RawQueries.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/database/queries/RawQueries.kt @@ -47,6 +47,7 @@ fun getRecentsQuery() = ON ${Manga.TABLE}.${Manga.COL_ID} = ${Chapter.TABLE}.${Chapter.COL_MANGA_ID} WHERE ${Manga.COL_FAVORITE} = 1 AND ${Chapter.COL_DATE_UPLOAD} > ? + AND ${Chapter.COL_DATE_UPLOAD} < ? AND ${Chapter.COL_DATE_FETCH} > ${Manga.COL_DATE_ADDED} ORDER BY ${Chapter.COL_DATE_UPLOAD} DESC """ @@ -59,6 +60,7 @@ fun getRecentAdditionsQuery(search: String, endless: Boolean) = SELECT ${Manga.TABLE}.${Manga.COL_URL} as mangaUrl, * FROM ${Manga.TABLE} WHERE ${Manga.COL_FAVORITE} = 1 AND ${Manga.COL_DATE_ADDED} > ? + AND ${Manga.COL_DATE_ADDED} < ? AND lower(${Manga.COL_TITLE}) LIKE '%$search%' ORDER BY ${Manga.COL_DATE_ADDED} DESC ${if (endless) "" else "LIMIT 8"} @@ -78,6 +80,7 @@ fun getRecentsQueryDistinct(search: String, endless: Boolean) = FROM ${Chapter.TABLE} JOIN ${Manga.TABLE} ON ${Manga.TABLE}.${Manga.COL_ID} = ${Chapter.TABLE}.${Chapter.COL_MANGA_ID} WHERE ${Chapter.COL_DATE_UPLOAD} > ? + AND ${Chapter.COL_DATE_UPLOAD} < ? AND ${Chapter.COL_READ} = 0 GROUP BY ${Chapter.TABLE}.${Chapter.COL_MANGA_ID}) AS newest_chapter ON ${Chapter.TABLE}.${Chapter.COL_MANGA_ID} = newest_chapter.${Chapter.COL_MANGA_ID} @@ -138,6 +141,7 @@ fun getRecentMangasLimitQuery(limit: Int = 25, search: String = "") = GROUP BY ${Chapter.TABLE}.${Chapter.COL_MANGA_ID}) AS max_last_read ON ${Chapter.TABLE}.${Chapter.COL_MANGA_ID} = max_last_read.${Chapter.COL_MANGA_ID} WHERE ${History.TABLE}.${History.COL_LAST_READ} > ? + AND ${History.TABLE}.${History.COL_LAST_READ} < ? AND max_last_read.${History.COL_CHAPTER_ID} = ${History.TABLE}.${History.COL_CHAPTER_ID} AND lower(${Manga.TABLE}.${Manga.COL_TITLE}) LIKE '%$search%' ORDER BY max_last_read.${History.COL_LAST_READ} DESC @@ -179,6 +183,48 @@ fun getRecentReadWithUnreadChapters(search: String = "", endless: Boolean) = GROUP BY ${Chapter.TABLE}.${Chapter.COL_MANGA_ID}) AS max_last_read ON ${Chapter.TABLE}.${Chapter.COL_MANGA_ID} = max_last_read.${Chapter.COL_MANGA_ID} WHERE ${History.TABLE}.${History.COL_LAST_READ} > ? + AND ${History.TABLE}.${History.COL_LAST_READ} < ? + AND max_last_read.${History.COL_CHAPTER_ID} = ${History.TABLE}.${History.COL_CHAPTER_ID} + AND lower(${Manga.TABLE}.${Manga.COL_TITLE}) LIKE '%$search%' + ORDER BY max_last_read.${History.COL_LAST_READ} DESC + ${if (endless) "" else "LIMIT 8"} +""" + +/** + * Query to get the recently read manga that has more chapters to read + * The first from checks that there's an unread chapter + * The max_last_read table contains the most recent chapters grouped by manga + * The select statement returns all information of chapters that have the same id as the chapter in max_last_read + * and are read after the given time period + */ +fun getRecentRead(search: String = "", endless: Boolean) = + """ + SELECT ${Manga.TABLE}.${Manga.COL_URL} as mangaUrl, ${Manga.TABLE}.*, ${Chapter.TABLE}.*, ${History.TABLE}.* + FROM ( + SELECT ${Manga.TABLE}.* + FROM ${Manga.TABLE} + LEFT JOIN ( + SELECT ${Chapter.COL_MANGA_ID}, COUNT(*) AS unread + FROM ${Chapter.TABLE} + GROUP BY ${Chapter.COL_MANGA_ID} + ) AS C + ON ${Manga.COL_ID} = C.${Chapter.COL_MANGA_ID} + WHERE C.unread > 0 + GROUP BY ${Manga.COL_ID} + ORDER BY ${Manga.COL_TITLE} + ) AS ${Manga.TABLE} + JOIN ${Chapter.TABLE} + ON ${Manga.TABLE}.${Manga.COL_ID} = ${Chapter.TABLE}.${Chapter.COL_MANGA_ID} + JOIN ${History.TABLE} + ON ${Chapter.TABLE}.${Chapter.COL_ID} = ${History.TABLE}.${History.COL_CHAPTER_ID} + JOIN ( + SELECT ${Chapter.TABLE}.${Chapter.COL_MANGA_ID},${Chapter.TABLE}.${Chapter.COL_ID} as ${History.COL_CHAPTER_ID}, MAX(${History.TABLE}.${History.COL_LAST_READ}) as ${History.COL_LAST_READ} + FROM ${Chapter.TABLE} JOIN ${History.TABLE} + ON ${Chapter.TABLE}.${Chapter.COL_ID} = ${History.TABLE}.${History.COL_CHAPTER_ID} + GROUP BY ${Chapter.TABLE}.${Chapter.COL_MANGA_ID}) AS max_last_read + ON ${Chapter.TABLE}.${Chapter.COL_MANGA_ID} = max_last_read.${Chapter.COL_MANGA_ID} + WHERE ${History.TABLE}.${History.COL_LAST_READ} > ? + AND ${History.TABLE}.${History.COL_LAST_READ} < ? AND max_last_read.${History.COL_CHAPTER_ID} = ${History.TABLE}.${History.COL_CHAPTER_ID} AND lower(${Manga.TABLE}.${Manga.COL_TITLE}) LIKE '%$search%' ORDER BY max_last_read.${History.COL_LAST_READ} DESC diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferenceKeys.kt b/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferenceKeys.kt index e93b4b850d..f5f6e3c822 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferenceKeys.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferenceKeys.kt @@ -170,6 +170,11 @@ object PreferenceKeys { const val updateOnRefresh = "update_on_refresh" + const val showDLsInRecents = "show_dls_in_recents" + const val showRemHistoryInRecents = "show_rem_history_in_recents" + const val showReadInAllRecents = "show_read_in_all_recents" + const val showTitleFirstInRecents = "show_title_first_in_recents" + const val showLibraryUpdateErrors = "show_library_update_errors" const val alwaysShowChapterTransition = "always_show_chapter_transition" 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 75dea89ff0..6280c9f1d3 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 @@ -12,6 +12,7 @@ import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.data.track.TrackService import eu.kanade.tachiyomi.ui.reader.viewer.ViewerNavigation import eu.kanade.tachiyomi.ui.reader.viewer.pager.PageLayout +import eu.kanade.tachiyomi.ui.recents.RecentMangaAdapter import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.onEach import java.io.File @@ -285,6 +286,14 @@ class PreferencesHelper(val context: Context) { fun recentsViewType() = flowPrefs.getInt("recents_view_type", 0) + fun showRecentsDownloads() = flowPrefs.getEnum(Keys.showDLsInRecents, RecentMangaAdapter.ShowRecentsDLs.All) + + fun showRecentsRemHistory() = flowPrefs.getBoolean(Keys.showRemHistoryInRecents, true) + + fun showReadInAllRecents() = flowPrefs.getBoolean(Keys.showReadInAllRecents, false) + + fun showTitleFirstInRecents() = flowPrefs.getBoolean(Keys.showTitleFirstInRecents, false) + fun lastExtCheck() = rxPrefs.getLong("last_ext_check", 0) fun lastAppCheck() = flowPrefs.getLong("last_app_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 5c049546a7..35d0943d0b 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 @@ -2,16 +2,23 @@ package eu.kanade.tachiyomi.ui.recents import androidx.recyclerview.widget.ItemTouchHelper import eu.davidea.flexibleadapter.items.IFlexible +import eu.kanade.tachiyomi.data.preference.PreferencesHelper import eu.kanade.tachiyomi.ui.manga.chapter.BaseChapterAdapter +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.flow.launchIn +import kotlinx.coroutines.flow.onEach +import uy.kohesive.injekt.injectLazy import java.text.DecimalFormat import java.text.DecimalFormatSymbols class RecentMangaAdapter(val delegate: RecentsInterface) : BaseChapterAdapter>(delegate) { - init { - setDisplayHeadersAtStartUp(true) - } + private val preferences: PreferencesHelper by injectLazy() + + var showDownloads = ShowRecentsDLs.All + var showRemoveHistory = true + var showTitleFirst = false fun updateItems(items: List>?) { updateDataSet(items) @@ -23,6 +30,31 @@ class RecentMangaAdapter(val delegate: RecentsInterface) : .apply { decimalSeparator = '.' } ) + init { + setDisplayHeadersAtStartUp(true) + preferences.showRecentsDownloads() + .asFlow() + .onEach { + showDownloads = it + notifyDataSetChanged() + } + .launchIn(delegate.scope()) + preferences.showRecentsRemHistory() + .asFlow() + .onEach { + showRemoveHistory = it + notifyDataSetChanged() + } + .launchIn(delegate.scope()) + preferences.showTitleFirstInRecents() + .asFlow() + .onEach { + showTitleFirst = it + notifyDataSetChanged() + } + .launchIn(delegate.scope()) + } + interface RecentsInterface : RecentMangaInterface, DownloadInterface interface RecentMangaInterface { @@ -32,6 +64,7 @@ class RecentMangaAdapter(val delegate: RecentsInterface) : fun isSearching(): Boolean fun setViewType(viewType: Int) fun getViewType(): Int + fun scope(): CoroutineScope } override fun onItemSwiped(position: Int, direction: Int) { @@ -40,4 +73,10 @@ class RecentMangaAdapter(val delegate: RecentsInterface) : ItemTouchHelper.LEFT -> delegate.markAsRead(position) } } + + enum class ShowRecentsDLs { + None, + OnlyUnread, + All, + } } 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 a212676d7d..573494eac0 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 @@ -4,14 +4,13 @@ import android.app.Activity import android.view.View import androidx.core.view.isVisible import eu.kanade.tachiyomi.R -import eu.kanade.tachiyomi.data.image.coil.loadLibraryManga import eu.kanade.tachiyomi.data.download.model.Download +import eu.kanade.tachiyomi.data.image.coil.loadLibraryManga import eu.kanade.tachiyomi.databinding.RecentMangaItemBinding import eu.kanade.tachiyomi.source.LocalSource import eu.kanade.tachiyomi.ui.manga.chapter.BaseChapterHolder import eu.kanade.tachiyomi.util.chapter.ChapterUtil import eu.kanade.tachiyomi.util.system.timeSpanFromNow -import eu.kanade.tachiyomi.util.view.visibleIf class RecentMangaHolder( view: View, @@ -25,16 +24,28 @@ class RecentMangaHolder( binding.removeHistory.setOnClickListener { adapter.delegate.onRemoveHistoryClicked(flexibleAdapterPosition) } } - fun bind(item: RecentMangaItem) { - binding.downloadButton.downloadButton.visibleIf(item.mch.manga.source != LocalSource.ID) + fun bind(item: RecentMangaItem, showDLs: RecentMangaAdapter.ShowRecentsDLs, showRemoveHistory: Boolean, showTitleFirst: Boolean) { + binding.downloadButton.downloadButton.isVisible = item.mch.manga.source != LocalSource.ID && when (showDLs) { + RecentMangaAdapter.ShowRecentsDLs.None -> false + RecentMangaAdapter.ShowRecentsDLs.OnlyUnread -> !item.mch.chapter.read + RecentMangaAdapter.ShowRecentsDLs.All -> true + } - binding.removeHistory.isVisible = item.mch.history.id != null + binding.removeHistory.isVisible = item.mch.history.id != null && showRemoveHistory binding.title.apply { - text = item.chapter.name + text = if (!showTitleFirst) { + item.chapter.name + } else { + item.mch.manga.title + } ChapterUtil.setTextViewForChapter(this, item) } binding.subtitle.apply { - text = item.mch.manga.title + text = if (!showTitleFirst) { + item.mch.manga.title + } else { + item.chapter.name + } setTextColor(ChapterUtil.readColor(context, item)) } val notValidNum = item.mch.chapter.chapter_number <= 0 diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/recents/RecentMangaItem.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/recents/RecentMangaItem.kt index 5baacc54f3..5f1067c336 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/recents/RecentMangaItem.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/recents/RecentMangaItem.kt @@ -57,7 +57,10 @@ class RecentMangaItem( position: Int, payloads: MutableList? ) { + val showDLs = (adapter as? RecentMangaAdapter)?.showDownloads ?: RecentMangaAdapter.ShowRecentsDLs.All + val showRemoveHistory = (adapter as? RecentMangaAdapter)?.showRemoveHistory ?: true + val showTitleFirst = (adapter as? RecentMangaAdapter)?.showTitleFirst ?: false if (mch.manga.id == null) (holder as? RecentMangaFooterHolder)?.bind((header as? RecentMangaHeaderItem)?.recentsType ?: 0) - else (holder as? RecentMangaHolder)?.bind(this) + else (holder as? RecentMangaHolder)?.bind(this, showDLs, showRemoveHistory, showTitleFirst) } } 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 648dd451aa..9b58ca96ce 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 @@ -9,7 +9,6 @@ import android.view.MenuInflater import android.view.MenuItem import android.view.View import android.view.ViewGroup -import android.widget.Toast import androidx.appcompat.widget.SearchView import androidx.recyclerview.widget.ItemTouchHelper import androidx.recyclerview.widget.LinearLayoutManager @@ -38,7 +37,6 @@ import eu.kanade.tachiyomi.ui.recently_read.RemoveHistoryDialog import eu.kanade.tachiyomi.ui.source.browse.ProgressItem import eu.kanade.tachiyomi.util.system.dpToPx import eu.kanade.tachiyomi.util.system.spToPx -import eu.kanade.tachiyomi.util.system.toast import eu.kanade.tachiyomi.util.view.activityBinding import eu.kanade.tachiyomi.util.view.expand import eu.kanade.tachiyomi.util.view.isExpanded @@ -50,6 +48,10 @@ import eu.kanade.tachiyomi.util.view.snack import eu.kanade.tachiyomi.util.view.updateLayoutParams import eu.kanade.tachiyomi.util.view.updatePaddingRelative import eu.kanade.tachiyomi.util.view.withFadeTransaction +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.Job +import kotlinx.coroutines.cancel import kotlin.math.abs import kotlin.math.max @@ -78,6 +80,8 @@ class RecentsController(bundle: Bundle? = null) : presenter.toggleGroupRecents(viewType, false) } + private val adapterScope: CoroutineScope = CoroutineScope(Job() + Dispatchers.Main) + /** * Adapter containing the recent manga. */ @@ -290,6 +294,8 @@ class RecentsController(bundle: Bundle? = null) : snack?.dismiss() presenter.onDestroy() snack = null + adapterScope.cancel() + presenter.cancelScope() } fun refresh() = presenter.getRecents() @@ -384,6 +390,8 @@ class RecentsController(bundle: Bundle? = null) : override fun getViewType() = presenter.viewType + override fun scope() = adapterScope + override fun onItemClick(view: View?, position: Int): Boolean { val item = adapter.getItem(position) ?: return false if (item is RecentMangaItem) { @@ -462,14 +470,6 @@ class RecentsController(bundle: Bundle? = null) : } else { inflater.inflate(R.menu.recents, menu) - when (presenter.viewType) { - 0 -> menu.findItem(R.id.action_group_all) - 1 -> menu.findItem(R.id.action_ungroup_all) - 2 -> menu.findItem(R.id.action_only_history) - 3 -> menu.findItem(R.id.action_only_updates) - else -> null - }?.isChecked = true - val searchItem = menu.findItem(R.id.action_search) val searchView = searchItem.actionView as SearchView searchView.queryHint = view?.context?.getString(R.string.search_recents) @@ -539,21 +539,7 @@ class RecentsController(bundle: Bundle? = null) : return binding.downloadBottomSheet.dlBottomSheet.onOptionsItemSelected(item) } when (item.itemId) { - R.id.action_group_all, R.id.action_ungroup_all, R.id.action_only_history, - R.id.action_only_updates -> { - presenter.toggleGroupRecents( - when (item.itemId) { - R.id.action_ungroup_all -> 1 - R.id.action_only_history -> 2 - R.id.action_only_updates -> 3 - else -> 0 - } - ) - if (item.itemId == R.id.action_only_history) { - activity?.toast(R.string.press_and_hold_to_reset_history, Toast.LENGTH_LONG) - } - activity?.invalidateOptionsMenu() - } + R.id.display_options -> RecentsOptionsSheet(activity!!).show() } return super.onOptionsItemSelected(item) } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/recents/RecentsOptionsSheet.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/recents/RecentsOptionsSheet.kt new file mode 100644 index 0000000000..5bb3754b01 --- /dev/null +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/recents/RecentsOptionsSheet.kt @@ -0,0 +1,55 @@ +package eu.kanade.tachiyomi.ui.recents + +import android.app.Activity +import android.text.Spannable +import android.text.SpannableStringBuilder +import android.text.style.ForegroundColorSpan +import android.view.ViewGroup +import androidx.core.text.set +import com.google.android.material.bottomsheet.BottomSheetBehavior +import com.google.android.material.bottomsheet.BottomSheetDialog +import eu.kanade.tachiyomi.R +import eu.kanade.tachiyomi.data.preference.PreferencesHelper +import eu.kanade.tachiyomi.databinding.RecentsOptionsSheetBinding +import eu.kanade.tachiyomi.util.bindToPreference +import eu.kanade.tachiyomi.util.system.getResourceColor +import eu.kanade.tachiyomi.util.view.RecyclerWindowInsetsListener +import eu.kanade.tachiyomi.util.view.setEdgeToEdge +import uy.kohesive.injekt.injectLazy + +class RecentsOptionsSheet(activity: Activity) : + BottomSheetDialog(activity, R.style.BottomSheetDialogTheme) { + + private val binding = RecentsOptionsSheetBinding.inflate(activity.layoutInflater) + private val preferences by injectLazy() + + init { + setContentView(binding.root) + setEdgeToEdge(activity, binding.root) + initGeneralPreferences() + binding.settingsScrollView.setOnApplyWindowInsetsListener(RecyclerWindowInsetsListener) + } + + override fun onStart() { + super.onStart() + BottomSheetBehavior.from(binding.root.parent as ViewGroup).skipCollapsed = true + + val titleText = context.getString(R.string.show_reset_history_button) + val subtitleText = context.getString(R.string.press_and_hold_to_also_reset) + val spannable = SpannableStringBuilder(titleText + "\n" + subtitleText) + spannable.setSpan( + ForegroundColorSpan(binding.showRemoveHistory.context.getResourceColor(android.R.attr.textColorSecondary)), + titleText.length + 1, + spannable.length, + Spannable.SPAN_EXCLUSIVE_EXCLUSIVE + ) + binding.showRemoveHistory.text = spannable + } + + private fun initGeneralPreferences() { + binding.showRecentsDownload.bindToPreference(preferences.showRecentsDownloads()) + binding.showRemoveHistory.bindToPreference(preferences.showRecentsRemHistory()) + binding.showReadInAll.bindToPreference(preferences.showReadInAllRecents()) + binding.showTitleFirst.bindToPreference(preferences.showTitleFirstInRecents()) + } +} 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 160ae7aa0b..6d9dd77eb3 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 @@ -19,6 +19,9 @@ import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Job import kotlinx.coroutines.cancel +import kotlinx.coroutines.flow.drop +import kotlinx.coroutines.flow.launchIn +import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import uy.kohesive.injekt.Injekt @@ -74,6 +77,13 @@ class RecentsPresenter( lastRecents = null } getRecents() + preferences.showReadInAllRecents() + .asFlow() + .drop(1) + .onEach { + getRecents() + } + .launchIn(scope) } fun getRecents(updatePageCount: Boolean = false, retryCount: Int = 0, itemCount: Int = 0) { @@ -85,6 +95,7 @@ class RecentsPresenter( withContext(Dispatchers.Main) { controller.showLists(recentItems, false) } } + val showRead = preferences.showReadInAllRecents().get() if (updatePageCount) { page++ } @@ -129,8 +140,13 @@ class RecentsPresenter( val cReading = if (viewType != VIEW_TYPE_ONLY_UPDATES) { if (query.isEmpty() && viewType != VIEW_TYPE_ONLY_HISTORY) { - db.getRecentsWithUnread(startCal.time, cal.time, query, isUngrouped) - .executeOnIO() + if (showRead) { + db.getAllRecents(startCal.time, cal.time, query, isUngrouped) + .executeOnIO() + } else { + db.getRecentsWithUnread(startCal.time, cal.time, query, isUngrouped) + .executeOnIO() + } } else db.getRecentMangaLimit( startCal.time, cal.time, @@ -164,7 +180,9 @@ class RecentsPresenter( val chapter = when { viewType == VIEW_TYPE_ONLY_HISTORY -> it.chapter it.chapter.read || it.chapter.id == null -> getNextChapter(it.manga) + ?: if (showRead && it.chapter.id != null) it.chapter else null it.history.id == null -> getFirstUpdatedChapter(it.manga, it.chapter) + ?: if (showRead && it.chapter.id != null) it.chapter else null else -> it.chapter } if (chapter == null) if ((query.isNotEmpty() || viewType > VIEW_TYPE_UNGROUP_ALL) && diff --git a/app/src/main/res/layout/recents_options_sheet.xml b/app/src/main/res/layout/recents_options_sheet.xml new file mode 100644 index 0000000000..3c12909327 --- /dev/null +++ b/app/src/main/res/layout/recents_options_sheet.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/menu/recents.xml b/app/src/main/res/menu/recents.xml index e56db3d6b8..ff43557517 100644 --- a/app/src/main/res/menu/recents.xml +++ b/app/src/main/res/menu/recents.xml @@ -9,28 +9,13 @@ android:visible="false" app:actionViewClass="androidx.appcompat.widget.SearchView" app:showAsAction="ifRoom|collapseActionView" /> + - - - - - - - - - + android:id="@+id/display_options" + android:icon="@drawable/ic_tune_24dp" + android:title="@string/display_options" + app:showAsAction="ifRoom" /> + @string/screen + + @string/never + @string/only_unread + @string/always + + @string/default_value @string/l_nav diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index cd3bd6f3cc..2875749ed7 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -231,6 +231,12 @@ Only updates Reset chapter? Press and hold to reset chapter history + Press and hold can also reset chapter history + Show download button + Only unread + Show reset history button + Show read in all + Show title first Search filters