Tablet manga view
(cherry picked from commit 7875f363a8)
# Conflicts:
# app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaController.kt
# app/src/main/java/eu/kanade/tachiyomi/ui/manga/info/MangaInfoHeaderAdapter.kt
This commit is contained in:
@@ -109,7 +109,6 @@ import exh.metadata.metadata.base.FlatMetadata
|
||||
import exh.recs.RecommendsController
|
||||
import exh.source.MERGED_SOURCE_ID
|
||||
import exh.source.getMainSource
|
||||
import exh.source.isEhBasedSource
|
||||
import exh.source.isMdBasedSource
|
||||
import kotlinx.coroutines.CancellationException
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
@@ -281,11 +280,17 @@ class MangaController :
|
||||
override fun onViewCreated(view: View) {
|
||||
super.onViewCreated(view)
|
||||
|
||||
binding.recycler.applyInsetter {
|
||||
type(navigationBars = true) {
|
||||
padding()
|
||||
listOfNotNull(binding.fullRecycler, binding.infoRecycler, binding.chaptersRecycler)
|
||||
.forEach {
|
||||
it.applyInsetter {
|
||||
type(navigationBars = true) {
|
||||
padding()
|
||||
}
|
||||
}
|
||||
|
||||
it.layoutManager = LinearLayoutManager(view.context)
|
||||
it.setHasFixedSize(true)
|
||||
}
|
||||
}
|
||||
binding.actionToolbar.applyInsetter {
|
||||
type(navigationBars = true) {
|
||||
margin(bottom = true)
|
||||
@@ -293,59 +298,70 @@ class MangaController :
|
||||
}
|
||||
|
||||
if (manga == null || source == null) return
|
||||
val adapters: MutableList<RecyclerView.Adapter<out RecyclerView.ViewHolder>?> = mutableListOf()
|
||||
|
||||
// Init RecyclerView and adapter
|
||||
mangaInfoAdapter = MangaInfoHeaderAdapter(this, binding.infoRecycler != null)
|
||||
chaptersHeaderAdapter = MangaChaptersHeaderAdapter(this)
|
||||
chaptersAdapter = ChaptersAdapter(this, view.context)
|
||||
// SY -->
|
||||
mangaInfoAdapter = MangaInfoHeaderAdapter(this)
|
||||
|
||||
adapters += mangaInfoAdapter
|
||||
|
||||
val mainSource = presenter.source.getMainSource()
|
||||
if (mainSource is MetadataSource<*, *>) {
|
||||
mangaMetaInfoAdapter = mainSource.getDescriptionAdapter(this)
|
||||
mangaMetaInfoAdapter?.let { adapters += it }
|
||||
}
|
||||
mangaInfoItemAdapter = MangaInfoItemAdapter(this, fromSource)
|
||||
adapters += mangaInfoItemAdapter
|
||||
|
||||
if (!preferences.recommendsInOverflow().get() || smartSearchConfig != null) {
|
||||
mangaInfoButtonsAdapter = MangaInfoButtonsAdapter(this)
|
||||
adapters += mangaInfoButtonsAdapter
|
||||
}
|
||||
mangaInfoItemAdapter = MangaInfoItemAdapter(this, fromSource, binding.infoRecycler != null)
|
||||
// SY <--
|
||||
|
||||
// Phone layout
|
||||
binding.fullRecycler?.let {
|
||||
it.adapter = ConcatAdapter(
|
||||
listOfNotNull(
|
||||
mangaInfoAdapter,
|
||||
mangaMetaInfoAdapter,
|
||||
mangaInfoItemAdapter,
|
||||
mangaInfoButtonsAdapter,
|
||||
chaptersHeaderAdapter,
|
||||
chaptersAdapter
|
||||
)
|
||||
)
|
||||
|
||||
it.scrollEvents()
|
||||
.onEach { updateToolbarTitleAlpha() }
|
||||
.launchIn(viewScope)
|
||||
}
|
||||
// Tablet layout
|
||||
binding.infoRecycler?.let {
|
||||
it.adapter = ConcatAdapter(
|
||||
listOfNotNull(
|
||||
mangaInfoAdapter,
|
||||
mangaMetaInfoAdapter,
|
||||
mangaInfoItemAdapter,
|
||||
mangaInfoButtonsAdapter
|
||||
)
|
||||
)
|
||||
}
|
||||
binding.chaptersRecycler?.let {
|
||||
it.adapter = ConcatAdapter(chaptersHeaderAdapter, chaptersAdapter)
|
||||
}
|
||||
|
||||
chaptersHeaderAdapter = MangaChaptersHeaderAdapter(this)
|
||||
|
||||
adapters += chaptersHeaderAdapter
|
||||
|
||||
chaptersAdapter = ChaptersAdapter(this, view.context)
|
||||
|
||||
adapters += chaptersAdapter
|
||||
|
||||
binding.recycler.adapter = ConcatAdapter(adapters)
|
||||
// SY <--
|
||||
binding.recycler.layoutManager = LinearLayoutManager(view.context)
|
||||
binding.recycler.setHasFixedSize(true)
|
||||
chaptersAdapter?.fastScroller = binding.fastScroller
|
||||
|
||||
actionFabScrollListener = actionFab?.shrinkOnScroll(binding.recycler)
|
||||
actionFabScrollListener = actionFab?.shrinkOnScroll(chaptersRecycler)
|
||||
|
||||
// Skips directly to chapters list if navigated to from the library
|
||||
binding.recycler.post {
|
||||
chaptersRecycler.post {
|
||||
if (!fromSource && preferences.jumpToChapters()) {
|
||||
(binding.recycler.layoutManager as LinearLayoutManager).scrollToPositionWithOffset(1, 0)
|
||||
(chaptersRecycler.layoutManager as LinearLayoutManager).scrollToPositionWithOffset(1, 0)
|
||||
}
|
||||
|
||||
// Delayed in case we need to jump to chapters
|
||||
binding.recycler.post {
|
||||
binding.fullRecycler?.post {
|
||||
updateToolbarTitleAlpha()
|
||||
}
|
||||
}
|
||||
|
||||
binding.recycler.scrollEvents()
|
||||
.onEach { updateToolbarTitleAlpha() }
|
||||
.launchIn(viewScope)
|
||||
|
||||
binding.swipeRefresh.refreshes()
|
||||
.onEach {
|
||||
fetchMangaInfoFromSource(manualFetch = true)
|
||||
@@ -376,15 +392,19 @@ class MangaController :
|
||||
}
|
||||
|
||||
private fun updateToolbarTitleAlpha(alpha: Int? = null) {
|
||||
if (binding.fullRecycler == null) {
|
||||
return
|
||||
}
|
||||
|
||||
val calculatedAlpha = when {
|
||||
// Specific alpha provided
|
||||
alpha != null -> alpha
|
||||
|
||||
// First item isn't in view, full opacity
|
||||
((binding.recycler.layoutManager as LinearLayoutManager).findFirstVisibleItemPosition() > 0) -> 255
|
||||
((binding.fullRecycler!!.layoutManager as LinearLayoutManager).findFirstVisibleItemPosition() > 0) -> 255
|
||||
|
||||
// Based on scroll amount when first item is in view
|
||||
else -> min(binding.recycler.computeVerticalScrollOffset(), 255)
|
||||
else -> min(binding.fullRecycler!!.computeVerticalScrollOffset(), 255)
|
||||
}
|
||||
|
||||
(activity as? MainActivity)?.binding?.toolbar?.setTitleTextColor(
|
||||
@@ -428,7 +448,7 @@ class MangaController :
|
||||
|
||||
override fun cleanupFab(fab: ExtendedFloatingActionButton) {
|
||||
fab.setOnClickListener(null)
|
||||
actionFabScrollListener?.let { binding.recycler.removeOnScrollListener(it) }
|
||||
actionFabScrollListener?.let { binding.fullRecycler?.removeOnScrollListener(it) }
|
||||
actionFab = null
|
||||
}
|
||||
|
||||
@@ -1497,6 +1517,9 @@ class MangaController :
|
||||
|
||||
// Tracker sheet - end
|
||||
|
||||
private val chaptersRecycler: RecyclerView
|
||||
get() = binding.fullRecycler ?: binding.chaptersRecycler!!
|
||||
|
||||
companion object {
|
||||
const val FROM_SOURCE_EXTRA = "from_source"
|
||||
const val MANGA_EXTRA = "manga"
|
||||
|
||||
@@ -30,7 +30,8 @@ import uy.kohesive.injekt.api.get
|
||||
import uy.kohesive.injekt.injectLazy
|
||||
|
||||
class MangaInfoHeaderAdapter(
|
||||
private val controller: MangaController
|
||||
private val controller: MangaController,
|
||||
private val isTablet: Boolean
|
||||
) :
|
||||
RecyclerView.Adapter<MangaInfoHeaderAdapter.HeaderViewHolder>() {
|
||||
|
||||
@@ -223,10 +224,16 @@ class MangaInfoHeaderAdapter(
|
||||
*/
|
||||
private fun setMangaInfo(manga: Manga, source: Source?) {
|
||||
// Update full title TextView.
|
||||
binding.mangaFullTitle.text = if (manga.title.isBlank()) {
|
||||
view.context.getString(R.string.unknown)
|
||||
} else {
|
||||
manga.title
|
||||
with(binding.mangaFullTitle) {
|
||||
if (isTablet) {
|
||||
isVisible = false
|
||||
} else {
|
||||
text = if (manga.title.isBlank()) {
|
||||
view.context.getString(R.string.unknown)
|
||||
} else {
|
||||
manga.title
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Update author TextView.
|
||||
|
||||
@@ -33,7 +33,8 @@ import reactivecircus.flowbinding.android.view.longClicks
|
||||
|
||||
class MangaInfoItemAdapter(
|
||||
private val controller: MangaController,
|
||||
private val fromSource: Boolean
|
||||
private val fromSource: Boolean,
|
||||
private val isTablet: Boolean
|
||||
) :
|
||||
RecyclerView.Adapter<MangaInfoItemAdapter.HeaderViewHolder>() {
|
||||
|
||||
@@ -191,7 +192,7 @@ class MangaInfoItemAdapter(
|
||||
.launchIn(controller.viewScope)
|
||||
|
||||
// Expand manga info if navigated from source listing
|
||||
if (initialLoad && fromSource) {
|
||||
if (initialLoad && (fromSource || isTablet)) {
|
||||
toggleMangaInfo()
|
||||
initialLoad = false
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user