Tablet manga view

This commit is contained in:
arkon
2021-05-23 12:36:47 -04:00
parent 685736b9ec
commit 7875f363a8
4 changed files with 135 additions and 28 deletions

View File

@ -206,11 +206,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)
@ -220,33 +226,42 @@ class MangaController :
if (manga == null || source == null) return
// Init RecyclerView and adapter
mangaInfoAdapter = MangaInfoHeaderAdapter(this, fromSource)
mangaInfoAdapter = MangaInfoHeaderAdapter(this, fromSource, binding.infoRecycler != null)
chaptersHeaderAdapter = MangaChaptersHeaderAdapter(this)
chaptersAdapter = ChaptersAdapter(this, view.context)
binding.recycler.adapter = ConcatAdapter(mangaInfoAdapter, chaptersHeaderAdapter, chaptersAdapter)
binding.recycler.layoutManager = LinearLayoutManager(view.context)
binding.recycler.setHasFixedSize(true)
// Phone layout
binding.fullRecycler?.let {
it.adapter = ConcatAdapter(mangaInfoAdapter, chaptersHeaderAdapter, chaptersAdapter)
it.scrollEvents()
.onEach { updateToolbarTitleAlpha() }
.launchIn(viewScope)
}
// Tablet layout
binding.infoRecycler?.let {
it.adapter = mangaInfoAdapter
}
binding.chaptersRecycler?.let {
it.adapter = ConcatAdapter(chaptersHeaderAdapter, chaptersAdapter)
}
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)
@ -269,15 +284,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(
@ -321,7 +340,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
}
@ -1084,6 +1103,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"

View File

@ -28,7 +28,8 @@ import uy.kohesive.injekt.injectLazy
class MangaInfoHeaderAdapter(
private val controller: MangaController,
private val fromSource: Boolean
private val fromSource: Boolean,
private val isTablet: Boolean,
) :
RecyclerView.Adapter<MangaInfoHeaderAdapter.HeaderViewHolder>() {
@ -194,10 +195,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.
@ -282,8 +289,9 @@ class MangaInfoHeaderAdapter(
.onEach { toggleMangaInfo() }
.launchIn(controller.viewScope)
// Expand manga info if navigated from source listing
if (initialLoad && fromSource) {
// Expand manga info if navigated from source listing or explicitly set to
// (e.g. on tablets)
if (initialLoad && (fromSource || isTablet)) {
toggleMangaInfo()
initialLoad = false
}