Update reader activity ui

This commit is contained in:
Koitharu
2023-05-30 08:49:21 +03:00
parent 2442e7cbe1
commit 3d05541f61
19 changed files with 142 additions and 80 deletions

View File

@@ -14,6 +14,7 @@ import android.view.Menu
import android.view.MenuItem
import android.view.MotionEvent
import android.view.View
import android.view.ViewGroup.MarginLayoutParams
import android.view.WindowManager
import androidx.activity.viewModels
import androidx.core.graphics.Insets
@@ -21,6 +22,7 @@ import androidx.core.view.OnApplyWindowInsetsListener
import androidx.core.view.WindowInsetsCompat
import androidx.core.view.isGone
import androidx.core.view.isVisible
import androidx.core.view.updateLayoutParams
import androidx.core.view.updatePadding
import androidx.lifecycle.lifecycleScope
import com.google.android.material.snackbar.Snackbar
@@ -333,11 +335,11 @@ class ReaderActivity :
right = systemBars.right,
left = systemBars.left,
)
viewBinding.appbarBottom?.updatePadding(
bottom = systemBars.bottom,
right = systemBars.right,
left = systemBars.left,
)
viewBinding.appbarBottom?.updateLayoutParams<MarginLayoutParams> {
bottomMargin = systemBars.bottom + topMargin
rightMargin = systemBars.right + topMargin
leftMargin = systemBars.left + topMargin
}
return WindowInsetsCompat.Builder(insets)
.setInsets(WindowInsetsCompat.Type.systemBars(), Insets.NONE)
.build()
@@ -373,19 +375,15 @@ class ReaderActivity :
}
private fun onUiStateChanged(pair: Pair<ReaderUiState?, ReaderUiState?>) {
val (uiState: ReaderUiState?, previous: ReaderUiState?) = pair
title = uiState?.chapterName ?: uiState?.mangaName ?: getString(R.string.loading_)
val (previous: ReaderUiState?, uiState: ReaderUiState?) = pair
title = uiState?.resolveTitle(this) ?: getString(R.string.loading_)
viewBinding.infoBar.update(uiState)
if (uiState == null) {
supportActionBar?.subtitle = null
viewBinding.slider.isVisible = false
return
}
supportActionBar?.subtitle = if (uiState.chapterNumber in 1..uiState.chaptersTotal) {
getString(R.string.chapter_d_of_d, uiState.chapterNumber, uiState.chaptersTotal)
} else {
null
}
supportActionBar?.subtitle = uiState.chapterName
if (previous?.chapterName != null && uiState.chapterName != previous.chapterName) {
if (!uiState.chapterName.isNullOrEmpty()) {
viewBinding.toastView.showTemporary(uiState.chapterName, TOAST_DURATION)

View File

@@ -366,6 +366,7 @@ class ReaderViewModel @Inject constructor(
val chapter = state?.chapterId?.let { chaptersLoader.peekChapter(it) }
val newState = ReaderUiState(
mangaName = manga?.any?.title,
branch = chapter?.branch,
chapterName = chapter?.name,
chapterNumber = chapter?.number ?: 0,
chaptersTotal = manga?.any?.getChapters(chapter?.branch)?.size ?: 0,

View File

@@ -41,7 +41,8 @@ class ReaderConfigBottomSheet :
ActivityResultCallback<Uri?>,
View.OnClickListener,
MaterialButtonToggleGroup.OnButtonCheckedListener,
Slider.OnChangeListener, CompoundButton.OnCheckedChangeListener {
Slider.OnChangeListener,
CompoundButton.OnCheckedChangeListener {
private val viewModel by activityViewModels<ReaderViewModel>()
private val savePageRequest = registerForActivityResult(PageSaveContract(), this)

View File

@@ -1,7 +1,11 @@
package org.koitharu.kotatsu.reader.ui.pager
import android.content.Context
import org.koitharu.kotatsu.R
data class ReaderUiState(
val mangaName: String?,
val branch: String?,
val chapterName: String?,
val chapterNumber: Int,
val chaptersTotal: Int,
@@ -14,4 +18,10 @@ data class ReaderUiState(
fun isSliderAvailable(): Boolean {
return isSliderEnabled && totalPages > 1 && currentPage < totalPages
}
fun resolveTitle(context: Context): String? = when {
mangaName == null -> null
branch == null -> mangaName
else -> context.getString(R.string.manga_branch_title_template, mangaName, branch)
}
}

View File

@@ -124,6 +124,7 @@ class PagesThumbnailsSheet :
} else {
headerBar.subtitle = null
}
viewBinding?.recyclerView?.isFastScrollerEnabled = isExpanded
}
private inner class ScrollListener : BoundsScrollListener(3, 3) {

View File

@@ -1,10 +1,12 @@
package org.koitharu.kotatsu.reader.ui.thumbnails.adapter
import android.content.Context
import androidx.lifecycle.LifecycleOwner
import androidx.recyclerview.widget.DiffUtil
import coil.ImageLoader
import com.hannesdorfmann.adapterdelegates4.AsyncListDifferDelegationAdapter
import org.koitharu.kotatsu.core.ui.list.OnListItemClickListener
import org.koitharu.kotatsu.core.ui.list.fastscroll.FastScroller
import org.koitharu.kotatsu.list.ui.adapter.listHeaderAD
import org.koitharu.kotatsu.list.ui.adapter.loadingFooterAD
import org.koitharu.kotatsu.list.ui.model.ListHeader
@@ -16,7 +18,7 @@ class PageThumbnailAdapter(
coil: ImageLoader,
lifecycleOwner: LifecycleOwner,
clickListener: OnListItemClickListener<PageThumbnail>,
) : AsyncListDifferDelegationAdapter<ListModel>(DiffCallback()) {
) : AsyncListDifferDelegationAdapter<ListModel>(DiffCallback()), FastScroller.SectionIndexer {
init {
delegatesManager.addDelegate(ITEM_TYPE_THUMBNAIL, pageThumbnailAD(coil, lifecycleOwner, clickListener))
@@ -24,6 +26,17 @@ class PageThumbnailAdapter(
.addDelegate(ITEM_LOADING, loadingFooterAD())
}
override fun getSectionText(context: Context, position: Int): CharSequence? {
val list = items
for (i in (0..position).reversed()) {
val item = list.getOrNull(i) ?: continue
if (item is ListHeader) {
return item.getText(context)
}
}
return null
}
private class DiffCallback : DiffUtil.ItemCallback<ListModel>() {
override fun areItemsTheSame(oldItem: ListModel, newItem: ListModel): Boolean {