|
|
|
|
@ -45,11 +45,9 @@ import org.koitharu.kotatsu.core.util.IdlingDetector
|
|
|
|
|
import org.koitharu.kotatsu.core.util.ShareHelper
|
|
|
|
|
import org.koitharu.kotatsu.core.util.ext.hasGlobalPoint
|
|
|
|
|
import org.koitharu.kotatsu.core.util.ext.isAnimationsEnabled
|
|
|
|
|
import org.koitharu.kotatsu.core.util.ext.isRtl
|
|
|
|
|
import org.koitharu.kotatsu.core.util.ext.observe
|
|
|
|
|
import org.koitharu.kotatsu.core.util.ext.observeEvent
|
|
|
|
|
import org.koitharu.kotatsu.core.util.ext.postDelayed
|
|
|
|
|
import org.koitharu.kotatsu.core.util.ext.setValueRounded
|
|
|
|
|
import org.koitharu.kotatsu.core.util.ext.zipWithPrevious
|
|
|
|
|
import org.koitharu.kotatsu.databinding.ActivityReaderBinding
|
|
|
|
|
import org.koitharu.kotatsu.details.ui.DetailsActivity
|
|
|
|
|
@ -105,6 +103,7 @@ class ReaderActivity :
|
|
|
|
|
private var gestureInsets: Insets = Insets.NONE
|
|
|
|
|
private lateinit var readerManager: ReaderManager
|
|
|
|
|
private val hideUiRunnable = Runnable { setUiIsVisible(false) }
|
|
|
|
|
private lateinit var bottomMenuProvider: ReaderBottomMenuProvider
|
|
|
|
|
|
|
|
|
|
override fun onCreate(savedInstanceState: Bundle?) {
|
|
|
|
|
super.onCreate(savedInstanceState)
|
|
|
|
|
@ -114,9 +113,8 @@ class ReaderActivity :
|
|
|
|
|
touchHelper = TapGridDispatcher(this, this)
|
|
|
|
|
scrollTimer = scrollTimerFactory.create(this, this)
|
|
|
|
|
controlDelegate = ReaderControlDelegate(resources, settings, tapGridSettings, this)
|
|
|
|
|
viewBinding.slider.setLabelFormatter(PageLabelFormatter())
|
|
|
|
|
bottomMenuProvider = ReaderBottomMenuProvider(this, readerManager, viewModel, this)
|
|
|
|
|
viewBinding.zoomControl.listener = this
|
|
|
|
|
ReaderSliderListener(viewModel, this).attachToSlider(viewBinding.slider)
|
|
|
|
|
insetsDelegate.interceptingWindowInsetsListener = this
|
|
|
|
|
idlingDetector.bindToLifecycle(this)
|
|
|
|
|
|
|
|
|
|
@ -142,11 +140,10 @@ class ReaderActivity :
|
|
|
|
|
viewModel.content.observe(this) {
|
|
|
|
|
onLoadingStateChanged(viewModel.isLoading.value)
|
|
|
|
|
}
|
|
|
|
|
viewModel.incognitoMode.observe(this, MenuInvalidator(this))
|
|
|
|
|
viewModel.isScreenshotsBlockEnabled.observe(this, this::setWindowSecure)
|
|
|
|
|
viewModel.isKeepScreenOnEnabled.observe(this, this::setKeepScreenOn)
|
|
|
|
|
viewModel.isInfoBarEnabled.observe(this, ::onReaderBarChanged)
|
|
|
|
|
viewModel.isBookmarkAdded.observe(this, MenuInvalidator(viewBinding.toolbarBottom))
|
|
|
|
|
viewModel.isBookmarkAdded.observe(this, MenuInvalidator(this))
|
|
|
|
|
viewModel.onShowToast.observeEvent(this) { msgId ->
|
|
|
|
|
Snackbar.make(viewBinding.container, msgId, Snackbar.LENGTH_SHORT)
|
|
|
|
|
.setAnchorView(viewBinding.appbarBottom)
|
|
|
|
|
@ -156,7 +153,8 @@ class ReaderActivity :
|
|
|
|
|
viewBinding.zoomControl.isVisible = it
|
|
|
|
|
}
|
|
|
|
|
addMenuProvider(ReaderTopMenuProvider(this, viewModel))
|
|
|
|
|
viewBinding.toolbarBottom.addMenuProvider(ReaderBottomMenuProvider(this, readerManager, viewModel))
|
|
|
|
|
viewBinding.toolbarBottom.addMenuProvider(bottomMenuProvider)
|
|
|
|
|
onBackPressedDispatcher.addCallback(bottomMenuProvider)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
override fun onActivityResult(result: Uri?) {
|
|
|
|
|
@ -198,10 +196,9 @@ class ReaderActivity :
|
|
|
|
|
if (readerManager.currentMode != mode) {
|
|
|
|
|
readerManager.replace(mode)
|
|
|
|
|
}
|
|
|
|
|
if (viewBinding.appbarTop.isVisible) {
|
|
|
|
|
if (viewBinding.appbarTop.isVisible && !bottomMenuProvider.isSliderExpanded()) {
|
|
|
|
|
lifecycle.postDelayed(TimeUnit.SECONDS.toMillis(1), hideUiRunnable)
|
|
|
|
|
}
|
|
|
|
|
viewBinding.slider.isRtl = mode == ReaderMode.REVERSED
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private fun onLoadingStateChanged(isLoading: Boolean) {
|
|
|
|
|
@ -213,6 +210,7 @@ class ReaderActivity :
|
|
|
|
|
viewBinding.toastView.hide()
|
|
|
|
|
}
|
|
|
|
|
viewBinding.toolbarBottom.invalidateMenu()
|
|
|
|
|
invalidateMenu()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
override fun onGridTouch(area: TapGridArea): Boolean {
|
|
|
|
|
@ -330,6 +328,9 @@ class ReaderActivity :
|
|
|
|
|
viewBinding.infoBar.isGone = isUiVisible || (!viewModel.isInfoBarEnabled.value)
|
|
|
|
|
viewBinding.infoBar.isTimeVisible = isFullscreen
|
|
|
|
|
systemUiController.setSystemUiVisible(isUiVisible || !isFullscreen)
|
|
|
|
|
if (!isUiVisible) {
|
|
|
|
|
bottomMenuProvider.collapseSlider()
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@ -394,26 +395,21 @@ class ReaderActivity :
|
|
|
|
|
|
|
|
|
|
private fun onUiStateChanged(pair: Pair<ReaderUiState?, ReaderUiState?>) {
|
|
|
|
|
val (previous: ReaderUiState?, uiState: ReaderUiState?) = pair
|
|
|
|
|
title = uiState?.resolveTitle(this) ?: getString(R.string.loading_)
|
|
|
|
|
title = uiState?.mangaName ?: getString(R.string.loading_)
|
|
|
|
|
supportActionBar?.subtitle = uiState?.chapterName
|
|
|
|
|
with(viewBinding.toolbarBottom) {
|
|
|
|
|
title = uiState?.resolveSummary(context)
|
|
|
|
|
subtitle = uiState?.resolveSubtitle(context)
|
|
|
|
|
}
|
|
|
|
|
viewBinding.infoBar.update(uiState)
|
|
|
|
|
if (uiState == null) {
|
|
|
|
|
supportActionBar?.subtitle = null
|
|
|
|
|
viewBinding.slider.isVisible = false
|
|
|
|
|
return
|
|
|
|
|
if (!bottomMenuProvider.updateState(uiState)) {
|
|
|
|
|
viewBinding.toolbarBottom.invalidateMenu()
|
|
|
|
|
}
|
|
|
|
|
supportActionBar?.subtitle = uiState.chapterName
|
|
|
|
|
if (previous?.chapterName != null && uiState.chapterName != previous.chapterName) {
|
|
|
|
|
if (uiState != null && previous?.chapterName != null && uiState.chapterName != previous.chapterName) {
|
|
|
|
|
if (!uiState.chapterName.isNullOrEmpty()) {
|
|
|
|
|
viewBinding.toastView.showTemporary(uiState.chapterName, TOAST_DURATION)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (uiState.isSliderAvailable()) {
|
|
|
|
|
viewBinding.slider.valueTo = uiState.totalPages.toFloat() - 1
|
|
|
|
|
viewBinding.slider.setValueRounded(uiState.currentPage.toFloat())
|
|
|
|
|
viewBinding.slider.isVisible = true
|
|
|
|
|
} else {
|
|
|
|
|
viewBinding.slider.isVisible = false
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
class IntentBuilder(context: Context) {
|
|
|
|
|
|