diff --git a/app/src/debug/res/drawable/ic_start_reading_24dp.xml b/app/src/debug/res/drawable/ic_start_reading_24dp.xml new file mode 100644 index 000000000..1587b5033 --- /dev/null +++ b/app/src/debug/res/drawable/ic_start_reading_24dp.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/debug/res/drawable/round_play_background.xml b/app/src/debug/res/drawable/round_play_background.xml new file mode 100644 index 000000000..9452dd735 --- /dev/null +++ b/app/src/debug/res/drawable/round_play_background.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file 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 778de0d05..f19427b12 100755 --- a/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferenceKeys.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferenceKeys.kt @@ -278,4 +278,6 @@ object PreferenceKeys { const val enhancedEHentaiView = "enhanced_e_hentai_view" const val webtoonEnableZoomOut = "webtoon_enable_zoom_out" + + const val startReadingButton = "start_reading_button" } 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 b915cd1a3..4c764224e 100755 --- a/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferencesHelper.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferencesHelper.kt @@ -382,4 +382,6 @@ class PreferencesHelper(val context: Context) { fun enhancedEHentaiView() = flowPrefs.getBoolean(Keys.enhancedEHentaiView, true) fun webtoonEnableZoomOut() = flowPrefs.getBoolean(Keys.webtoonEnableZoomOut, false) + + fun startReadingButton() = flowPrefs.getBoolean(Keys.startReadingButton, true) } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryCategoryAdapter.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryCategoryAdapter.kt index 416b5fb80..f8170745a 100755 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryCategoryAdapter.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryCategoryAdapter.kt @@ -36,7 +36,7 @@ import uy.kohesive.injekt.injectLazy * * @param view the fragment containing this adapter. */ -class LibraryCategoryAdapter(view: LibraryCategoryView) : +class LibraryCategoryAdapter(view: LibraryCategoryView, val controller: LibraryController) : FlexibleAdapter(null, view, true) { // EXH --> private val db: DatabaseHelper by injectLazy() @@ -61,6 +61,8 @@ class LibraryCategoryAdapter(view: LibraryCategoryView) : */ private var mangas: List = emptyList() + val libraryListener: LibraryListener = controller + // SY --> val onItemReleaseListener: CategoryAdapter.OnItemReleaseListener = view // SY <-- @@ -226,5 +228,9 @@ class LibraryCategoryAdapter(view: LibraryCategoryView) : return@any false } } + + interface LibraryListener { + fun startReading(manga: Manga, adapter: LibraryCategoryAdapter) + } // EXH <-- } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryCategoryView.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryCategoryView.kt index 3289ad3e8..a8422767f 100755 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryCategoryView.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryCategoryView.kt @@ -106,7 +106,7 @@ class LibraryCategoryView @JvmOverloads constructor(context: Context, attrs: Att } } - adapter = LibraryCategoryAdapter(this) + adapter = LibraryCategoryAdapter(this, controller) recycler.setHasFixedSize(true) recycler.adapter = adapter diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryComfortableGridHolder.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryComfortableGridHolder.kt index 33d06a953..de6e4c96d 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryComfortableGridHolder.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryComfortableGridHolder.kt @@ -13,9 +13,13 @@ import kotlinx.android.synthetic.main.source_comfortable_grid_item.badges import kotlinx.android.synthetic.main.source_comfortable_grid_item.card import kotlinx.android.synthetic.main.source_comfortable_grid_item.download_text import kotlinx.android.synthetic.main.source_comfortable_grid_item.local_text +import kotlinx.android.synthetic.main.source_comfortable_grid_item.play_layout import kotlinx.android.synthetic.main.source_comfortable_grid_item.thumbnail import kotlinx.android.synthetic.main.source_comfortable_grid_item.title import kotlinx.android.synthetic.main.source_comfortable_grid_item.unread_text +import kotlinx.coroutines.flow.launchIn +import kotlinx.coroutines.flow.onEach +import reactivecircus.flowbinding.android.view.clicks /** * Class used to hold the displayed data of a manga in the library, like the cover or the title. @@ -31,6 +35,16 @@ class LibraryComfortableGridHolder( adapter: FlexibleAdapter> ) : LibraryCompactGridHolder(view, adapter) { + // SY --> + init { + play_layout.clicks() + .onEach { + playButtonClicked() + } + .launchIn((adapter as LibraryCategoryAdapter).controller.scope) + } + // SY <-- + /** * Method called from [LibraryCategoryAdapter.onBindViewHolder]. It updates the data for this * holder with the given manga. @@ -38,6 +52,9 @@ class LibraryComfortableGridHolder( * @param item the manga item to bind. */ override fun onSetValues(item: LibraryItem) { + // SY --> + manga = item.manga + // SY <-- // Update the title of the manga. title.text = item.manga.title @@ -57,6 +74,10 @@ class LibraryComfortableGridHolder( // set local visibility if its local manga local_text.isVisible = item.manga.isLocal() + // SY --> + play_layout.isVisible = (item.manga.unread > 0 && item.startReadingButton) + // SY <-- + // For rounded corners card.clipToOutline = true diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryCompactGridHolder.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryCompactGridHolder.kt index 5cff4cdc8..c54a8172e 100755 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryCompactGridHolder.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryCompactGridHolder.kt @@ -6,6 +6,7 @@ import androidx.recyclerview.widget.RecyclerView import com.bumptech.glide.load.engine.DiskCacheStrategy import eu.davidea.flexibleadapter.FlexibleAdapter import eu.davidea.flexibleadapter.items.IFlexible +import eu.kanade.tachiyomi.data.database.models.Manga import eu.kanade.tachiyomi.data.glide.GlideApp import eu.kanade.tachiyomi.data.glide.toMangaThumbnail import eu.kanade.tachiyomi.util.isLocal @@ -13,9 +14,13 @@ import kotlinx.android.synthetic.main.source_compact_grid_item.badges import kotlinx.android.synthetic.main.source_compact_grid_item.card import kotlinx.android.synthetic.main.source_compact_grid_item.download_text import kotlinx.android.synthetic.main.source_compact_grid_item.local_text +import kotlinx.android.synthetic.main.source_compact_grid_item.play_layout import kotlinx.android.synthetic.main.source_compact_grid_item.thumbnail import kotlinx.android.synthetic.main.source_compact_grid_item.title import kotlinx.android.synthetic.main.source_compact_grid_item.unread_text +import kotlinx.coroutines.flow.launchIn +import kotlinx.coroutines.flow.onEach +import reactivecircus.flowbinding.android.view.clicks /** * Class used to hold the displayed data of a manga in the library, like the cover or the title. @@ -33,6 +38,18 @@ open class LibraryCompactGridHolder( // SY <-- ) : LibraryHolder(view, adapter) { + var manga: Manga? = null + + // SY --> + init { + play_layout.clicks() + .onEach { + playButtonClicked() + } + .launchIn((adapter as LibraryCategoryAdapter).controller.scope) + } + // SY <-- + /** * Method called from [LibraryCategoryAdapter.onBindViewHolder]. It updates the data for this * holder with the given manga. @@ -40,6 +57,9 @@ open class LibraryCompactGridHolder( * @param item the manga item to bind. */ override fun onSetValues(item: LibraryItem) { + // SY --> + manga = item.manga + // SY <-- // Update the title of the manga. title.text = item.manga.title @@ -59,6 +79,10 @@ open class LibraryCompactGridHolder( // set local visibility if its local manga local_text.isVisible = item.manga.isLocal() + // SY --> + play_layout.isVisible = (item.manga.unread > 0 && item.startReadingButton) + // SY <-- + // For rounded corners card.clipToOutline = true @@ -71,4 +95,10 @@ open class LibraryCompactGridHolder( .dontAnimate() .into(thumbnail) } + + // SY --> + fun playButtonClicked() { + manga?.let { (adapter as LibraryCategoryAdapter).controller.startReading(it, (adapter as LibraryCategoryAdapter)) } + } + // SY <-- } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryController.kt index 2b03921c3..922d20fe8 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryController.kt @@ -21,6 +21,7 @@ import com.google.android.material.tabs.TabLayout import com.jakewharton.rxrelay.BehaviorRelay import com.jakewharton.rxrelay.PublishRelay import com.tfcporciuncula.flow.Preference +import eu.davidea.flexibleadapter.SelectableAdapter import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.data.database.models.Category import eu.kanade.tachiyomi.data.database.models.Manga @@ -39,6 +40,7 @@ import eu.kanade.tachiyomi.ui.browse.source.globalsearch.GlobalSearchController import eu.kanade.tachiyomi.ui.main.MainActivity import eu.kanade.tachiyomi.ui.main.offsetAppbarHeight import eu.kanade.tachiyomi.ui.manga.MangaController +import eu.kanade.tachiyomi.ui.reader.ReaderActivity import eu.kanade.tachiyomi.util.system.getResourceColor import eu.kanade.tachiyomi.util.system.toast import exh.EH_SOURCE_ID @@ -69,7 +71,8 @@ class LibraryController( TabbedController, ActionMode.Callback, ChangeMangaCategoriesDialog.Listener, - DeleteLibraryMangasDialog.Listener { + DeleteLibraryMangasDialog.Listener, + LibraryCategoryAdapter.LibraryListener { /** * Position of the active category. @@ -792,5 +795,17 @@ class LibraryController( } oldSyncStatus = status } + + override fun startReading(manga: Manga, adapter: LibraryCategoryAdapter) { + if (adapter.mode == SelectableAdapter.Mode.MULTI) { + toggleSelection(manga) + return + } + val activity = activity ?: return + val chapter = presenter.getFirstUnread(manga) ?: return + val intent = ReaderActivity.newIntent(activity, manga, chapter) + destroyActionModeIfNeeded() + startActivity(intent) + } // <-- EXH } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryItem.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryItem.kt index 8f89b79d5..69cd2f767 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryItem.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryItem.kt @@ -44,6 +44,10 @@ class LibraryItem(val manga: LibraryManga, private val libraryDisplayMode: Prefe var downloadCount = -1 var unreadCount = -1 + // SY --> + var startReadingButton = false + // SY <-- + override fun getLayoutRes(): Int { return when (libraryDisplayMode.get()) { DisplayMode.COMPACT_GRID -> R.layout.source_compact_grid_item diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryPresenter.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryPresenter.kt index c1fb207a7..cd2553176 100755 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryPresenter.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryPresenter.kt @@ -5,6 +5,7 @@ import com.jakewharton.rxrelay.BehaviorRelay import eu.kanade.tachiyomi.data.cache.CoverCache import eu.kanade.tachiyomi.data.database.DatabaseHelper import eu.kanade.tachiyomi.data.database.models.Category +import eu.kanade.tachiyomi.data.database.models.Chapter import eu.kanade.tachiyomi.data.database.models.Manga import eu.kanade.tachiyomi.data.database.models.MangaCategory import eu.kanade.tachiyomi.data.download.DownloadManager @@ -181,6 +182,7 @@ class LibraryPresenter( private fun setBadges(map: LibraryMap) { val showDownloadBadges = preferences.downloadBadge().get() val showUnreadBadges = preferences.unreadBadge().get() + val startReadingButton = preferences.startReadingButton().get() for ((_, itemList) in map) { for (item in itemList) { @@ -197,6 +199,10 @@ class LibraryPresenter( // Unset unread count if not enabled -1 } + + // SY --> + item.startReadingButton = startReadingButton + // SY <-- } } } @@ -443,4 +449,17 @@ class LibraryPresenter( db.setMangaCategories(mc, mangas) } + + // SY --> + /** Returns first unread chapter of a manga */ + fun getFirstUnread(manga: Manga): Chapter? { + val chapters = db.getChapters(manga).executeAsBlocking() + return if (manga.source == EH_SOURCE_ID || manga.source == EXH_SOURCE_ID) { + val chapter = chapters.sortedBy { it.source_order }.getOrNull(0) + if (chapter?.read == false) chapter else null + } else { + chapters.sortedByDescending { it.source_order }.find { !it.read } + } + } + // SY <-- } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibrarySettingsSheet.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibrarySettingsSheet.kt index 0875fea49..651250656 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibrarySettingsSheet.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibrarySettingsSheet.kt @@ -236,7 +236,7 @@ class LibrarySettingsSheet( Settings(context, attrs) { init { - setGroups(listOf(DisplayGroup(), BadgeGroup(), TabsGroup())) + setGroups(listOf(DisplayGroup(), BadgeGroup(), /* SY --> */ ButtonsGroup(), /* SY <-- */ TabsGroup())) } inner class DisplayGroup : Group { @@ -300,6 +300,29 @@ class LibrarySettingsSheet( } } + // SY --> + inner class ButtonsGroup : Group { + private val startReadingButton = Item.CheckboxGroup(R.string.action_start_reading_button, this) + + override val header = Item.Header(R.string.buttons_header) + override val items = listOf(startReadingButton) + override val footer = null + + override fun initModels() { + startReadingButton.checked = preferences.startReadingButton().get() + } + + override fun onItemClicked(item: Item) { + item as Item.CheckboxGroup + item.checked = !item.checked + when (item) { + startReadingButton -> preferences.startReadingButton().set((item.checked)) + } + adapter.notifyItemChanged(item) + } + } + // SY <-- + inner class TabsGroup : Group { private val showTabs = Item.CheckboxGroup(R.string.action_display_show_tabs, this) diff --git a/app/src/main/res/layout/source_comfortable_grid_item.xml b/app/src/main/res/layout/source_comfortable_grid_item.xml index 6063c9937..597f51ed4 100644 --- a/app/src/main/res/layout/source_comfortable_grid_item.xml +++ b/app/src/main/res/layout/source_comfortable_grid_item.xml @@ -28,6 +28,32 @@ tools:ignore="ContentDescription" tools:src="@mipmap/ic_launcher" /> + + + + + + + + + + Migrate now Copy now Clean titles + Start reading button + + + Buttons Manhwa @@ -437,6 +441,7 @@ %1$s (%2$s, %3$d) %1$s (%2$s) %1$s TR + Start reading