17
17
package androidx.compose.ui.test
18
18
19
19
import androidx.compose.runtime.Composable
20
+ import androidx.compose.runtime.CompositionLocalProvider
20
21
import androidx.compose.runtime.snapshots.Snapshot
21
22
import androidx.compose.ui.ExperimentalComposeUiApi
22
23
import androidx.compose.ui.InternalComposeUiApi
@@ -26,6 +27,7 @@ import androidx.compose.ui.graphics.asComposeCanvas
26
27
import androidx.compose.ui.graphics.toComposeImageBitmap
27
28
import androidx.compose.ui.node.RootForTest
28
29
import androidx.compose.ui.platform.InfiniteAnimationPolicy
30
+ import androidx.compose.ui.platform.LocalLifecycleOwner
29
31
import androidx.compose.ui.platform.PlatformContext
30
32
import androidx.compose.ui.platform.WindowInfo
31
33
import androidx.compose.ui.scene.ComposeScene
@@ -39,6 +41,9 @@ import androidx.compose.ui.text.input.PlatformTextInputService
39
41
import androidx.compose.ui.text.input.TextFieldValue
40
42
import androidx.compose.ui.unit.Density
41
43
import androidx.compose.ui.unit.IntSize
44
+ import androidx.lifecycle.Lifecycle
45
+ import androidx.lifecycle.LifecycleOwner
46
+ import androidx.lifecycle.LifecycleRegistry
42
47
import kotlin.coroutines.CoroutineContext
43
48
import kotlin.coroutines.EmptyCoroutineContext
44
49
import kotlin.coroutines.cancellation.CancellationException
@@ -318,11 +323,14 @@ class SkikoComposeUiTest @InternalTestApi constructor(
318
323
}
319
324
320
325
override fun setContent (composable : @Composable () -> Unit ) {
326
+ val content: @Composable () -> Unit = {
327
+ CompositionLocalProvider (LocalLifecycleOwner provides lifecycleOwner, content = composable)
328
+ }
321
329
if (isOnUiThread()) {
322
- scene.setContent(content = composable )
330
+ scene.setContent(content = content )
323
331
} else {
324
332
runOnUiThread {
325
- scene.setContent(content = composable )
333
+ scene.setContent(content = content )
326
334
}
327
335
328
336
// Only wait for idleness if not on the UI thread. If we are on the UI thread, the
@@ -332,6 +340,10 @@ class SkikoComposeUiTest @InternalTestApi constructor(
332
340
}
333
341
}
334
342
343
+ private val lifecycleOwner = TestLifecycleOwner ()
344
+ override val lifecycleRegistry: LifecycleRegistry
345
+ get() = lifecycleOwner.lifecycleRegistry
346
+
335
347
override fun onNode (
336
348
matcher : SemanticsMatcher ,
337
349
useUnmergedTree : Boolean
@@ -443,4 +455,11 @@ actual sealed interface ComposeUiTest : SemanticsNodeInteractionsProvider {
443
455
actual fun registerIdlingResource (idlingResource : IdlingResource )
444
456
actual fun unregisterIdlingResource (idlingResource : IdlingResource )
445
457
actual fun setContent (composable : @Composable () -> Unit )
458
+ val lifecycleRegistry: LifecycleRegistry
446
459
}
460
+
461
+ class TestLifecycleOwner : LifecycleOwner {
462
+ override val lifecycle: Lifecycle
463
+ get() = lifecycleRegistry
464
+ val lifecycleRegistry = LifecycleRegistry (this )
465
+ }
0 commit comments