From f9609edea578b939fcd4892af3a3f40e70086d96 Mon Sep 17 00:00:00 2001 From: Koitharu Date: Sun, 3 Sep 2023 15:38:14 +0300 Subject: [PATCH] Fallback to old systemUiVisibility in reader --- .../kotatsu/core/ui/BaseFullscreenActivity.kt | 19 ++---- .../core/ui/util/SystemUiController.kt | 60 +++++++++++++++++++ .../kotatsu/reader/ui/ReaderActivity.kt | 23 ++++--- 3 files changed, 76 insertions(+), 26 deletions(-) create mode 100644 app/src/main/kotlin/org/koitharu/kotatsu/core/ui/util/SystemUiController.kt diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/core/ui/BaseFullscreenActivity.kt b/app/src/main/kotlin/org/koitharu/kotatsu/core/ui/BaseFullscreenActivity.kt index e5faecd51..7852c1b50 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/core/ui/BaseFullscreenActivity.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/core/ui/BaseFullscreenActivity.kt @@ -5,20 +5,19 @@ import android.os.Build import android.os.Bundle import android.view.WindowManager import androidx.core.content.ContextCompat -import androidx.core.view.WindowInsetsCompat -import androidx.core.view.WindowInsetsControllerCompat import androidx.viewbinding.ViewBinding import org.koitharu.kotatsu.R +import org.koitharu.kotatsu.core.ui.util.SystemUiController abstract class BaseFullscreenActivity : BaseActivity() { - private lateinit var insetsControllerCompat: WindowInsetsControllerCompat + protected lateinit var systemUiController: SystemUiController override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) with(window) { - insetsControllerCompat = WindowInsetsControllerCompat(this, decorView) + systemUiController = SystemUiController(this) statusBarColor = Color.TRANSPARENT navigationBarColor = if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) { ContextCompat.getColor(this@BaseFullscreenActivity, R.color.dim) @@ -30,15 +29,7 @@ abstract class BaseFullscreenActivity : WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES } } - insetsControllerCompat.systemBarsBehavior = WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE - showSystemUI() - } - - protected fun hideSystemUI() { - insetsControllerCompat.hide(WindowInsetsCompat.Type.systemBars()) - } - - protected fun showSystemUI() { - insetsControllerCompat.show(WindowInsetsCompat.Type.systemBars()) + // insetsControllerCompat.systemBarsBehavior = WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE + systemUiController.setSystemUiVisible(true) } } diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/core/ui/util/SystemUiController.kt b/app/src/main/kotlin/org/koitharu/kotatsu/core/ui/util/SystemUiController.kt new file mode 100644 index 000000000..d5887d12f --- /dev/null +++ b/app/src/main/kotlin/org/koitharu/kotatsu/core/ui/util/SystemUiController.kt @@ -0,0 +1,60 @@ +package org.koitharu.kotatsu.core.ui.util + +import android.os.Build +import android.view.View +import android.view.Window +import android.view.WindowInsets +import android.view.WindowInsetsController +import androidx.annotation.RequiresApi + +sealed class SystemUiController( + protected val window: Window, +) { + + abstract fun setSystemUiVisible(value: Boolean) + + @RequiresApi(Build.VERSION_CODES.S) + private class Api30Impl(window: Window) : SystemUiController(window) { + + private val insetsController = checkNotNull(window.decorView.windowInsetsController) + + override fun setSystemUiVisible(value: Boolean) { + if (value) { + insetsController.show(WindowInsets.Type.systemBars()) + insetsController.systemBarsBehavior = WindowInsetsController.BEHAVIOR_DEFAULT + } else { + insetsController.systemBarsBehavior = WindowInsetsController.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE + insetsController.hide(WindowInsets.Type.systemBars()) + } + } + } + + @Suppress("DEPRECATION") + private class LegacyImpl(window: Window) : SystemUiController(window) { + + override fun setSystemUiVisible(value: Boolean) { + window.decorView.systemUiVisibility = if (value) { + View.SYSTEM_UI_FLAG_LAYOUT_STABLE or + View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION or + View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN + } else { + View.SYSTEM_UI_FLAG_LAYOUT_STABLE or + View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION or + View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN or + View.SYSTEM_UI_FLAG_HIDE_NAVIGATION or + View.SYSTEM_UI_FLAG_FULLSCREEN or + View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY + } + } + } + + companion object { + + operator fun invoke(window: Window): SystemUiController = + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { + Api30Impl(window) + } else { + LegacyImpl(window) + } + } +} diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/reader/ui/ReaderActivity.kt b/app/src/main/kotlin/org/koitharu/kotatsu/reader/ui/ReaderActivity.kt index 4e8f25a78..b9dbdc5e3 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/reader/ui/ReaderActivity.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/reader/ui/ReaderActivity.kt @@ -44,6 +44,7 @@ import org.koitharu.kotatsu.core.util.GridTouchHelper 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 @@ -309,22 +310,20 @@ class ReaderActivity : private fun setUiIsVisible(isUiVisible: Boolean) { if (viewBinding.appbarTop.isVisible != isUiVisible) { - val transition = TransitionSet() - .setOrdering(TransitionSet.ORDERING_TOGETHER) - .addTransition(Slide(Gravity.TOP).addTarget(viewBinding.appbarTop)) - .addTransition(Fade().addTarget(viewBinding.infoBar)) - viewBinding.appbarBottom?.let { bottomBar -> - transition.addTransition(Slide(Gravity.BOTTOM).addTarget(bottomBar)) + if (isAnimationsEnabled) { + val transition = TransitionSet() + .setOrdering(TransitionSet.ORDERING_TOGETHER) + .addTransition(Slide(Gravity.TOP).addTarget(viewBinding.appbarTop)) + .addTransition(Fade().addTarget(viewBinding.infoBar)) + viewBinding.appbarBottom?.let { bottomBar -> + transition.addTransition(Slide(Gravity.BOTTOM).addTarget(bottomBar)) + } + TransitionManager.beginDelayedTransition(viewBinding.root, transition) } - TransitionManager.beginDelayedTransition(viewBinding.root, transition) viewBinding.appbarTop.isVisible = isUiVisible viewBinding.appbarBottom?.isVisible = isUiVisible viewBinding.infoBar.isGone = isUiVisible || (!viewModel.isInfoBarEnabled.value) - if (isUiVisible) { - showSystemUI() - } else { - hideSystemUI() - } + systemUiController.setSystemUiVisible(isUiVisible) } }