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

View File

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

View File

@@ -2,9 +2,13 @@ package org.koitharu.kotatsu.reader.ui.pager.webtoon
import android.os.Bundle import android.os.Bundle
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.view.ViewGroup.MarginLayoutParams
import android.view.animation.DecelerateInterpolator import android.view.animation.DecelerateInterpolator
import android.widget.TextView import android.widget.TextView
import androidx.core.view.WindowInsetsCompat
import androidx.core.view.updateLayoutParams
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import com.google.android.material.snackbar.Snackbar import com.google.android.material.snackbar.Snackbar
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
@@ -50,12 +54,6 @@ class WebtoonReaderFragment : BaseReaderFragment<FragmentReaderWebtoonBinding>()
override fun onViewBindingCreated(binding: FragmentReaderWebtoonBinding, savedInstanceState: Bundle?) { override fun onViewBindingCreated(binding: FragmentReaderWebtoonBinding, savedInstanceState: Bundle?) {
super.onViewBindingCreated(binding, savedInstanceState) 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) { with(binding.recyclerView) {
setHasFixedSize(true) setHasFixedSize(true)
adapter = readerAdapter adapter = readerAdapter
@@ -101,6 +99,19 @@ class WebtoonReaderFragment : BaseReaderFragment<FragmentReaderWebtoonBinding>()
super.onDestroyView() 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( override fun onCreateAdapter() = WebtoonAdapter(
lifecycleOwner = viewLifecycleOwner, lifecycleOwner = viewLifecycleOwner,
loader = pageLoader, loader = pageLoader,