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")
-                )
+                }
             }
         }
     }