瀏覽代碼

Adjust inset consumption in Compose controllers (fixes #7085)

Co-authored-by: jobobby04 <[email protected]>
arkon 2 年之前
父節點
當前提交
6993e88265
共有 1 個文件被更改,包括 41 次插入23 次删除
  1. 41 23
      app/src/main/java/eu/kanade/tachiyomi/ui/base/controller/ComposeController.kt

+ 41 - 23
app/src/main/java/eu/kanade/tachiyomi/ui/base/controller/ComposeController.kt

@@ -3,8 +3,10 @@ package eu.kanade.tachiyomi.ui.base.controller
 import android.os.Bundle
 import android.view.LayoutInflater
 import android.view.View
+import androidx.compose.foundation.layout.consumeWindowInsets
 import androidx.compose.runtime.Composable
 import androidx.compose.ui.input.nestedscroll.NestedScrollConnection
+import androidx.compose.ui.platform.ViewCompositionStrategy
 import androidx.compose.ui.platform.rememberNestedScrollInteropConnection
 import eu.kanade.presentation.theme.TachiyomiTheme
 import eu.kanade.tachiyomi.databinding.ComposeControllerBinding
@@ -14,62 +16,78 @@ import nucleus.presenter.Presenter
 /**
  * Compose controller with a Nucleus presenter.
  */
-abstract class ComposeController<P : Presenter<*>>(bundle: Bundle? = null) : NucleusController<ComposeControllerBinding, P>(bundle) {
+abstract class ComposeController<P : Presenter<*>>(bundle: Bundle? = null) :
+    NucleusController<ComposeControllerBinding, P>(bundle),
+    ComposeContentController {
 
-    override fun createBinding(inflater: LayoutInflater): ComposeControllerBinding =
+    override fun createBinding(inflater: LayoutInflater) =
         ComposeControllerBinding.inflate(inflater)
 
     override fun onViewCreated(view: View) {
         super.onViewCreated(view)
 
-        binding.root.setContent {
-            val nestedScrollInterop = rememberNestedScrollInteropConnection(binding.root)
-            TachiyomiTheme {
-                ComposeContent(nestedScrollInterop)
+        binding.root.apply {
+            consumeWindowInsets = false
+            setViewCompositionStrategy(ViewCompositionStrategy.DisposeOnViewTreeLifecycleDestroyed)
+            setContent {
+                val nestedScrollInterop = rememberNestedScrollInteropConnection(binding.root)
+                TachiyomiTheme {
+                    ComposeContent(nestedScrollInterop)
+                }
             }
         }
     }
-
-    @Composable abstract fun ComposeContent(nestedScrollInterop: NestedScrollConnection)
 }
 
 /**
  * Basic Compose controller without a presenter.
  */
-abstract class BasicComposeController : BaseController<ComposeControllerBinding>() {
+abstract class BasicComposeController :
+    BaseController<ComposeControllerBinding>(),
+    ComposeContentController {
 
-    override fun createBinding(inflater: LayoutInflater): ComposeControllerBinding =
+    override fun createBinding(inflater: LayoutInflater) =
         ComposeControllerBinding.inflate(inflater)
 
     override fun onViewCreated(view: View) {
         super.onViewCreated(view)
 
-        binding.root.setContent {
-            val nestedScrollInterop = rememberNestedScrollInteropConnection(binding.root)
-            TachiyomiTheme {
-                ComposeContent(nestedScrollInterop)
+        binding.root.apply {
+            consumeWindowInsets = false
+            setViewCompositionStrategy(ViewCompositionStrategy.DisposeOnViewTreeLifecycleDestroyed)
+            setContent {
+                val nestedScrollInterop = rememberNestedScrollInteropConnection(binding.root)
+                TachiyomiTheme {
+                    ComposeContent(nestedScrollInterop)
+                }
             }
         }
     }
-
-    @Composable abstract fun ComposeContent(nestedScrollInterop: NestedScrollConnection)
 }
 
-abstract class SearchableComposeController<P : BasePresenter<*>>(bundle: Bundle? = null) : SearchableNucleusController<ComposeControllerBinding, P>(bundle) {
+abstract class SearchableComposeController<P : BasePresenter<*>>(bundle: Bundle? = null) :
+    SearchableNucleusController<ComposeControllerBinding, P>(bundle),
+    ComposeContentController {
 
-    override fun createBinding(inflater: LayoutInflater): ComposeControllerBinding =
+    override fun createBinding(inflater: LayoutInflater) =
         ComposeControllerBinding.inflate(inflater)
 
     override fun onViewCreated(view: View) {
         super.onViewCreated(view)
 
-        binding.root.setContent {
-            val nestedScrollInterop = rememberNestedScrollInteropConnection(binding.root)
-            TachiyomiTheme {
-                ComposeContent(nestedScrollInterop)
+        binding.root.apply {
+            consumeWindowInsets = false
+            setViewCompositionStrategy(ViewCompositionStrategy.DisposeOnViewTreeLifecycleDestroyed)
+            setContent {
+                val nestedScrollInterop = rememberNestedScrollInteropConnection(binding.root)
+                TachiyomiTheme {
+                    ComposeContent(nestedScrollInterop)
+                }
             }
         }
     }
+}
 
-    @Composable abstract fun ComposeContent(nestedScrollInterop: NestedScrollConnection)
+interface ComposeContentController {
+    @Composable fun ComposeContent(nestedScrollInterop: NestedScrollConnection)
 }