Refactor MotionValueDebugger to use CompositionLocal
Bug: 391553479
Test: Unit tests
Test: Unit tests
Flag: EXEMPT No production use / debug code only
Change-Id: I88af1a57fae3441619e6927e48d066ae20189192
diff --git a/packages/SystemUI/compose/core/src/com/android/compose/gesture/OverscrollToDismiss.kt b/packages/SystemUI/compose/core/src/com/android/compose/gesture/OverscrollToDismiss.kt
index 531d635..8d94e77 100644
--- a/packages/SystemUI/compose/core/src/com/android/compose/gesture/OverscrollToDismiss.kt
+++ b/packages/SystemUI/compose/core/src/com/android/compose/gesture/OverscrollToDismiss.kt
@@ -41,7 +41,7 @@
import androidx.compose.ui.unit.dp
import com.android.mechanics.DistanceGestureContext
import com.android.mechanics.MotionValue
-import com.android.mechanics.debug.findMotionValueDebugger
+import com.android.mechanics.debug.DebugMotionValueNode
import com.android.mechanics.effects.MagneticDetach
import com.android.mechanics.effects.MagneticDetach.Defaults.AttachDetachState
import com.android.mechanics.spec.InputDirection
@@ -140,6 +140,10 @@
spec = spec::value,
)
+ init {
+ delegate(DebugMotionValueNode(motionValue))
+ }
+
private var delegateNode =
delegate(NestedDraggableRootNode(this, orientation, null, enabled, true))
@@ -220,16 +224,11 @@
}
private suspend fun keepRunningUntilDismissed() {
- val debuggerHandle = findMotionValueDebugger()?.register(motionValue)
- try {
- motionValue.keepRunningWhile {
- val isDismissed = get(isDismissedState) ?: false
- !(isDismissed && isStable)
- }
- onDismissed()
- } finally {
- debuggerHandle?.dispose()
+ motionValue.keepRunningWhile {
+ val isDismissed = get(isDismissedState) ?: false
+ !(isDismissed && isStable)
}
+ onDismissed()
}
companion object {
diff --git a/packages/SystemUI/compose/core/tests/src/com/android/compose/gesture/OverscrollToDismissTest.kt b/packages/SystemUI/compose/core/tests/src/com/android/compose/gesture/OverscrollToDismissTest.kt
index a4ea4f3..f85b718 100644
--- a/packages/SystemUI/compose/core/tests/src/com/android/compose/gesture/OverscrollToDismissTest.kt
+++ b/packages/SystemUI/compose/core/tests/src/com/android/compose/gesture/OverscrollToDismissTest.kt
@@ -27,6 +27,7 @@
import androidx.compose.foundation.pager.PagerState
import androidx.compose.foundation.pager.rememberPagerState
import androidx.compose.runtime.Composable
+import androidx.compose.runtime.CompositionLocalProvider
import androidx.compose.ui.Modifier
import androidx.compose.ui.geometry.Offset
import androidx.compose.ui.graphics.Color
@@ -41,8 +42,8 @@
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp
import androidx.test.ext.junit.runners.AndroidJUnit4
-import com.android.mechanics.debug.MotionValueDebuggerState
-import com.android.mechanics.debug.motionValueDebugger
+import com.android.mechanics.debug.LocalMotionValueDebugController
+import com.android.mechanics.debug.MotionValueDebugController
import com.android.mechanics.spec.builder.rememberMotionBuilderContext
import com.google.common.truth.Truth.assertThat
import kotlin.math.sin
@@ -148,7 +149,7 @@
}
private fun performGesture(gestureControl: TouchInjectionScope.() -> Unit) = MotionControl {
- val debugInspector = debugger.observedMotionValues.single().debugInspector()
+ val debugInspector = debugger.observed.single().debugInspector()
try {
performTouchInputAsync(onNodeWithTag("DismissContainer")) { gestureControl() }
awaitCondition { !debugInspector.isAnimating && !pagerState.isScrollInProgress }
@@ -158,7 +159,7 @@
}
private var isDismissed = false
- private val debugger = MotionValueDebuggerState()
+ private val debugger = MotionValueDebugController()
private lateinit var pagerState: PagerState
@Composable
@@ -169,33 +170,33 @@
isSwipingEnabled: Boolean = true,
) {
pagerState = rememberPagerState(initialPage) { pageCount }
-
- Box(
- modifier =
- Modifier.motionValueDebugger(debugger)
- .size(150.dp, 100.dp)
- .background(Color.Blue)
- .testTag("DismissContainer")
- .overscrollToDismiss(
- rememberMotionBuilderContext(),
- enabled = isSwipingEnabled,
- onDismissed = { isDismissed = true },
+ CompositionLocalProvider(LocalMotionValueDebugController provides debugger) {
+ Box(
+ modifier =
+ Modifier.size(150.dp, 100.dp)
+ .background(Color.Blue)
+ .testTag("DismissContainer")
+ .overscrollToDismiss(
+ rememberMotionBuilderContext(),
+ enabled = isSwipingEnabled,
+ onDismissed = { isDismissed = true },
+ )
+ ) {
+ HorizontalPager(
+ state = pagerState,
+ userScrollEnabled = isSwipingEnabled,
+ pageSpacing = 8.dp,
+ key = { it },
+ modifier = Modifier.fillMaxSize(),
+ ) { pageIndex: Int ->
+ Box(
+ modifier =
+ Modifier.height(64.dp)
+ .fillMaxWidth()
+ .background(Color.Red)
+ .testTag("Page$pageIndex")
)
- ) {
- HorizontalPager(
- state = pagerState,
- userScrollEnabled = isSwipingEnabled,
- pageSpacing = 8.dp,
- key = { it },
- modifier = Modifier.fillMaxSize(),
- ) { pageIndex: Int ->
- Box(
- modifier =
- Modifier.height(64.dp)
- .fillMaxWidth()
- .background(Color.Red)
- .testTag("Page$pageIndex")
- )
+ }
}
}
}