[go: nahoru, domu]

Correctly dispose in WithConstraints

Test: new test
Change-Id: Ie9e7b0694c89682e58cf3ead5b3252b6d0b13925
diff --git a/ui/ui-core/src/androidTest/java/androidx/ui/core/test/WithConstraintsTest.kt b/ui/ui-core/src/androidTest/java/androidx/ui/core/test/WithConstraintsTest.kt
index cc7b67c..242bec2 100644
--- a/ui/ui-core/src/androidTest/java/androidx/ui/core/test/WithConstraintsTest.kt
+++ b/ui/ui-core/src/androidTest/java/androidx/ui/core/test/WithConstraintsTest.kt
@@ -23,6 +23,8 @@
 import androidx.compose.Composable
 import androidx.compose.emptyContent
 import androidx.compose.getValue
+import androidx.compose.mutableStateOf
+import androidx.compose.onDispose
 import androidx.compose.remember
 import androidx.compose.setValue
 import androidx.compose.state
@@ -689,6 +691,32 @@
         assertTrue(childMeasureLatch.await(1, TimeUnit.SECONDS))
     }
 
+    @Test
+    fun onDisposeInsideWithConstraintsCalled() {
+        var emit by mutableStateOf(true)
+        val composedLatch = CountDownLatch(1)
+        val disposedLatch = CountDownLatch(1)
+        rule.runOnUiThreadIR {
+            activity.setContent {
+                if (emit) {
+                    WithConstraints { _, _ ->
+                        composedLatch.countDown()
+                        onDispose {
+                            disposedLatch.countDown()
+                        }
+                    }
+                }
+            }
+        }
+
+        assertTrue(composedLatch.await(1, TimeUnit.SECONDS))
+
+        rule.runOnUiThread {
+            emit = false
+        }
+        assertTrue(disposedLatch.await(1, TimeUnit.SECONDS))
+    }
+
     private fun takeScreenShot(size: Int): Bitmap {
         assertTrue(drawLatch.await(1, TimeUnit.SECONDS))
         val bitmap = rule.waitAndScreenShot()
diff --git a/ui/ui-core/src/main/java/androidx/ui/core/Layout.kt b/ui/ui-core/src/main/java/androidx/ui/core/Layout.kt
index 47b130a..030a960 100644
--- a/ui/ui-core/src/main/java/androidx/ui/core/Layout.kt
+++ b/ui/ui-core/src/main/java/androidx/ui/core/Layout.kt
@@ -18,12 +18,14 @@
 
 import android.content.Context
 import androidx.compose.Composable
+import androidx.compose.Composition
 import androidx.compose.CompositionReference
 import androidx.compose.FrameManager
 import androidx.compose.Recomposer
 import androidx.compose.Untracked
 import androidx.compose.compositionReference
 import androidx.compose.currentComposer
+import androidx.compose.onDispose
 import androidx.compose.remember
 import androidx.ui.unit.Density
 import androidx.ui.unit.IntPx
@@ -476,6 +478,9 @@
     if (!layoutNode.needsRemeasure && layoutNode.owner != null) {
         state.subcompose()
     }
+    onDispose {
+        state.composition?.dispose()
+    }
 }
 
 private class WithConstrainsState {
@@ -486,6 +491,7 @@
     var lastConstraints: Constraints? = null
     var children: @Composable() (Constraints, LayoutDirection) -> Unit = { _, _ -> }
     var forceRecompose = false
+    var composition: Composition? = null
 
     val measureBlocks = object : LayoutNode.NoIntrinsicsMeasureBlocks(
         error = "Intrinsic measurements are not supported by WithConstraints"
@@ -529,7 +535,7 @@
         val node = nodeRef.value!!
         val constraints = lastConstraints!!
         // TODO(b/150390669): Review use of @Untracked
-        subcomposeInto(context, node, recomposer, compositionRef) @Untracked {
+        composition = subcomposeInto(context, node, recomposer, compositionRef) @Untracked {
             children(constraints, node.measureScope.layoutDirection)
         }
         forceRecompose = false