Change inset handling in reader

This commit is contained in:
Koitharu
2025-09-21 12:28:32 +03:00
parent d9612f3427
commit 61bf2abb6c
3 changed files with 24 additions and 22 deletions

View File

@@ -3,7 +3,6 @@ package org.koitharu.kotatsu.reader.ui
import android.app.assist.AssistContent
import android.content.DialogInterface
import android.content.Intent
import android.os.Build
import android.os.Bundle
import android.view.Gravity
import android.view.KeyEvent
@@ -372,9 +371,7 @@ class ReaderActivity :
viewBinding.infoBar.isTimeVisible = isFullscreen
updateScrollTimerButton()
systemUiController.setSystemUiVisible(isUiVisible || !isFullscreen)
val topOffset = if (isUiVisible) viewBinding.appbarTop.height else 0
val bottomOffset = if (isUiVisible) (viewBinding.toolbarDocked?.height ?: 0) else 0
viewModel.setReaderUiOffsets(topOffset, bottomOffset)
viewBinding.root.requestApplyInsets()
}
}
@@ -396,12 +393,14 @@ class ReaderActivity :
viewBinding.infoBar.updatePadding(
top = systemBars.top,
)
viewModel.setReaderUiOffsets(
(if (viewBinding.appbarTop.isVisible) viewBinding.appbarTop.height else 0) + systemBars.top,
(if (viewBinding.toolbarDocked?.isVisible == true) (viewBinding.toolbarDocked?.height ?: 0) else 0) + systemBars.bottom,
val innerInsets = Insets.of(
systemBars.left,
if (viewBinding.appbarTop.isVisible) viewBinding.appbarTop.height else systemBars.top,
systemBars.right,
viewBinding.toolbarDocked?.takeIf { it.isVisible }?.height ?: systemBars.bottom,
)
return WindowInsetsCompat.Builder(insets)
.setInsets(WindowInsetsCompat.Type.systemBars(), Insets.NONE)
.setInsets(WindowInsetsCompat.Type.systemBars(), innerInsets)
.build()
}

View File

@@ -120,9 +120,6 @@ class ReaderViewModel @Inject constructor(
val onAskNsfwIncognito = MutableEventFlow<Unit>()
val uiState = MutableStateFlow<ReaderUiState?>(null)
val readerUiTopOffset = MutableStateFlow(0)
val readerUiBottomOffset = MutableStateFlow(0)
val isIncognitoMode = MutableStateFlow(savedStateHandle.get<Boolean>(ReaderIntent.EXTRA_INCOGNITO))
val content = MutableStateFlow(ReaderContent(emptyList(), null))
@@ -230,11 +227,6 @@ class ReaderViewModel @Inject constructor(
discordRpc.setIdle()
}
fun setReaderUiOffsets(top: Int, bottom: Int) {
readerUiTopOffset.value = top
readerUiBottomOffset.value = bottom
}
fun switchMode(newMode: ReaderMode) {
launchJob {
val manga = checkNotNull(getMangaOrNull())

View File

@@ -2,9 +2,13 @@ package org.koitharu.kotatsu.reader.ui.pager.webtoon
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.view.ViewGroup.MarginLayoutParams
import android.view.animation.DecelerateInterpolator
import android.widget.TextView
import androidx.core.view.WindowInsetsCompat
import androidx.core.view.updateLayoutParams
import androidx.recyclerview.widget.RecyclerView
import com.google.android.material.snackbar.Snackbar
import dagger.hilt.android.AndroidEntryPoint
@@ -50,12 +54,6 @@ class WebtoonReaderFragment : BaseReaderFragment<FragmentReaderWebtoonBinding>()
override fun onViewBindingCreated(binding: FragmentReaderWebtoonBinding, savedInstanceState: Bundle?) {
super.onViewBindingCreated(binding, savedInstanceState)
viewModel.readerUiTopOffset.observe(viewLifecycleOwner) { top ->
binding.feedbackTop.translationY = top.toFloat()
}
viewModel.readerUiBottomOffset.observe(viewLifecycleOwner) { bottom ->
binding.feedbackBottom.translationY = -bottom.toFloat()
}
with(binding.recyclerView) {
setHasFixedSize(true)
adapter = readerAdapter
@@ -101,6 +99,19 @@ class WebtoonReaderFragment : BaseReaderFragment<FragmentReaderWebtoonBinding>()
super.onDestroyView()
}
override fun onApplyWindowInsets(v: View, insets: WindowInsetsCompat): WindowInsetsCompat {
val offsetInsets = insets.getInsets(WindowInsetsCompat.Type.systemBars())
viewBinding?.apply {
feedbackTop.updateLayoutParams<MarginLayoutParams> {
topMargin = bottomMargin + offsetInsets.top
}
feedbackBottom.updateLayoutParams<MarginLayoutParams> {
bottomMargin = topMargin + offsetInsets.bottom
}
}
return super.onApplyWindowInsets(v, insets)
}
override fun onCreateAdapter() = WebtoonAdapter(
lifecycleOwner = viewLifecycleOwner,
loader = pageLoader,