Remove scheduling methods from EmbeddingContext

Callers should use appropriate coroutine scopes to launch deferred work
instead.

Relnote: Removed scheduling methods from EmbeddingContext
Test: Existing tests
Change-Id: I7b9bea6af71d1b610ce68c89938bbbc793193457
diff --git a/compose/desktop/desktop/src/jvmMain/kotlin/androidx/compose/desktop/test/SkijaTest.kt b/compose/desktop/desktop/src/jvmMain/kotlin/androidx/compose/desktop/test/SkijaTest.kt
index e4b343a..746f833 100644
--- a/compose/desktop/desktop/src/jvmMain/kotlin/androidx/compose/desktop/test/SkijaTest.kt
+++ b/compose/desktop/desktop/src/jvmMain/kotlin/androidx/compose/desktop/test/SkijaTest.kt
@@ -1,6 +1,5 @@
 package androidx.compose.desktop.test
 
-import androidx.compose.runtime.ChoreographerFrameCallback
 import androidx.compose.runtime.EmbeddingContext
 import androidx.compose.runtime.EmbeddingContextFactory
 import kotlinx.coroutines.Dispatchers
@@ -205,24 +204,4 @@
 
     override fun isMainThread() = true
     override fun mainThreadCompositionContext() = Dispatchers.Main
-
-    override fun postOnMainThread(block: () -> Unit) {
-        executionQueue.add(block)
-    }
-
-    private val cancelled = mutableSetOf<ChoreographerFrameCallback>()
-
-    override fun postFrameCallback(callback: ChoreographerFrameCallback) {
-        postOnMainThread {
-            if (callback !in cancelled) {
-                callback.doFrame(System.currentTimeMillis() * 1000000)
-            } else {
-                cancelled.remove(callback)
-            }
-        }
-    }
-
-    override fun cancelFrameCallback(callback: ChoreographerFrameCallback) {
-        cancelled += callback
-    }
 }
\ No newline at end of file
diff --git a/compose/runtime/runtime/api/current.txt b/compose/runtime/runtime/api/current.txt
index 0b832e0..0a377cd 100644
--- a/compose/runtime/runtime/api/current.txt
+++ b/compose/runtime/runtime/api/current.txt
@@ -42,11 +42,8 @@
 
   public final class AndroidEmbeddingContext implements androidx.compose.runtime.EmbeddingContext {
     ctor public AndroidEmbeddingContext();
-    method public void cancelFrameCallback(android.view.Choreographer.FrameCallback callback);
     method public boolean isMainThread();
     method public kotlin.coroutines.CoroutineContext mainThreadCompositionContext();
-    method public void postFrameCallback(android.view.Choreographer.FrameCallback callback);
-    method public void postOnMainThread(kotlin.jvm.functions.Function0<kotlin.Unit> block);
   }
 
   @androidx.compose.runtime.ExperimentalComposeApi public interface Applier<N> {
@@ -205,11 +202,8 @@
   }
 
   public interface EmbeddingContext {
-    method public void cancelFrameCallback(android.view.Choreographer.FrameCallback callback);
     method public boolean isMainThread();
     method public kotlin.coroutines.CoroutineContext mainThreadCompositionContext();
-    method public void postFrameCallback(android.view.Choreographer.FrameCallback callback);
-    method public void postOnMainThread(kotlin.jvm.functions.Function0<kotlin.Unit> block);
   }
 
   public final class EmitKt {
diff --git a/compose/runtime/runtime/api/public_plus_experimental_current.txt b/compose/runtime/runtime/api/public_plus_experimental_current.txt
index 0b832e0..0a377cd 100644
--- a/compose/runtime/runtime/api/public_plus_experimental_current.txt
+++ b/compose/runtime/runtime/api/public_plus_experimental_current.txt
@@ -42,11 +42,8 @@
 
   public final class AndroidEmbeddingContext implements androidx.compose.runtime.EmbeddingContext {
     ctor public AndroidEmbeddingContext();
-    method public void cancelFrameCallback(android.view.Choreographer.FrameCallback callback);
     method public boolean isMainThread();
     method public kotlin.coroutines.CoroutineContext mainThreadCompositionContext();
-    method public void postFrameCallback(android.view.Choreographer.FrameCallback callback);
-    method public void postOnMainThread(kotlin.jvm.functions.Function0<kotlin.Unit> block);
   }
 
   @androidx.compose.runtime.ExperimentalComposeApi public interface Applier<N> {
@@ -205,11 +202,8 @@
   }
 
   public interface EmbeddingContext {
-    method public void cancelFrameCallback(android.view.Choreographer.FrameCallback callback);
     method public boolean isMainThread();
     method public kotlin.coroutines.CoroutineContext mainThreadCompositionContext();
-    method public void postFrameCallback(android.view.Choreographer.FrameCallback callback);
-    method public void postOnMainThread(kotlin.jvm.functions.Function0<kotlin.Unit> block);
   }
 
   public final class EmitKt {
diff --git a/compose/runtime/runtime/api/restricted_current.txt b/compose/runtime/runtime/api/restricted_current.txt
index 5f7b005..9cf68f0 100644
--- a/compose/runtime/runtime/api/restricted_current.txt
+++ b/compose/runtime/runtime/api/restricted_current.txt
@@ -42,11 +42,8 @@
 
   public final class AndroidEmbeddingContext implements androidx.compose.runtime.EmbeddingContext {
     ctor public AndroidEmbeddingContext();
-    method public void cancelFrameCallback(android.view.Choreographer.FrameCallback callback);
     method public boolean isMainThread();
     method public kotlin.coroutines.CoroutineContext mainThreadCompositionContext();
-    method public void postFrameCallback(android.view.Choreographer.FrameCallback callback);
-    method public void postOnMainThread(kotlin.jvm.functions.Function0<kotlin.Unit> block);
   }
 
   @androidx.compose.runtime.ExperimentalComposeApi public interface Applier<N> {
@@ -224,11 +221,8 @@
   }
 
   public interface EmbeddingContext {
-    method public void cancelFrameCallback(android.view.Choreographer.FrameCallback callback);
     method public boolean isMainThread();
     method public kotlin.coroutines.CoroutineContext mainThreadCompositionContext();
-    method public void postFrameCallback(android.view.Choreographer.FrameCallback callback);
-    method public void postOnMainThread(kotlin.jvm.functions.Function0<kotlin.Unit> block);
   }
 
   public final class EmitKt {
diff --git a/compose/runtime/runtime/src/androidAndroidTest/kotlin/androidx/compose/runtime/BaseComposeTest.kt b/compose/runtime/runtime/src/androidAndroidTest/kotlin/androidx/compose/runtime/BaseComposeTest.kt
index cdacd935..c0999de 100644
--- a/compose/runtime/runtime/src/androidAndroidTest/kotlin/androidx/compose/runtime/BaseComposeTest.kt
+++ b/compose/runtime/runtime/src/androidAndroidTest/kotlin/androidx/compose/runtime/BaseComposeTest.kt
@@ -20,6 +20,7 @@
 import android.app.Activity
 import android.os.Bundle
 import android.os.Looper
+import android.view.Choreographer
 import android.view.ViewGroup
 import android.widget.LinearLayout
 import androidx.compose.runtime.snapshots.Snapshot
@@ -93,10 +94,7 @@
     }
     val latch = CountDownLatch(1)
     uiThread {
-        android.view.Choreographer.getInstance().postFrameCallback(object :
-            ChoreographerFrameCallback {
-                override fun doFrame(frameTimeNanos: Long) = latch.countDown()
-            })
+        Choreographer.getInstance().postFrameCallback { latch.countDown() }
     }
     assertTrue(latch.await(1, TimeUnit.HOURS), "Time-out waiting for choreographer frame")
 }
diff --git a/compose/runtime/runtime/src/androidAndroidTest/kotlin/androidx/compose/runtime/SuspendingEffectsTests.kt b/compose/runtime/runtime/src/androidAndroidTest/kotlin/androidx/compose/runtime/SuspendingEffectsTests.kt
index e6f60a8..447706b 100644
--- a/compose/runtime/runtime/src/androidAndroidTest/kotlin/androidx/compose/runtime/SuspendingEffectsTests.kt
+++ b/compose/runtime/runtime/src/androidAndroidTest/kotlin/androidx/compose/runtime/SuspendingEffectsTests.kt
@@ -16,6 +16,7 @@
 
 package androidx.compose.runtime
 
+import android.view.Choreographer
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.MediumTest
 import kotlinx.coroutines.CoroutineScope
@@ -78,12 +79,9 @@
                 }
             }
             onCommit(true) {
-                Recomposer.current().embeddingContext
-                    .postFrameCallback(object : ChoreographerFrameCallback {
-                    override fun doFrame(frameTimeNanos: Long) {
-                        choreographerTime = frameTimeNanos
-                    }
-                })
+                Choreographer.getInstance().postFrameCallback { frameTimeNanos ->
+                    choreographerTime = frameTimeNanos
+                }
             }
         }.then {
             assertNotEquals(choreographerTime, Long.MIN_VALUE, "Choreographer callback never ran")
diff --git a/compose/runtime/runtime/src/androidMain/kotlin/androidx/compose/runtime/ActualAndroid.kt b/compose/runtime/runtime/src/androidMain/kotlin/androidx/compose/runtime/ActualAndroid.kt
index fe95a79..94f2757 100644
--- a/compose/runtime/runtime/src/androidMain/kotlin/androidx/compose/runtime/ActualAndroid.kt
+++ b/compose/runtime/runtime/src/androidMain/kotlin/androidx/compose/runtime/ActualAndroid.kt
@@ -16,16 +16,12 @@
 
 package androidx.compose.runtime
 
-import android.os.Handler
 import android.os.Looper
 import androidx.compose.runtime.dispatch.AndroidUiDispatcher
 import kotlinx.coroutines.Dispatchers
 import kotlin.coroutines.CoroutineContext
 
 class AndroidEmbeddingContext : EmbeddingContext {
-    private val handler by lazy {
-        Handler(Looper.getMainLooper())
-    }
 
     override fun isMainThread(): Boolean {
         return Looper.myLooper() == Looper.getMainLooper()
@@ -34,25 +30,10 @@
     override fun mainThreadCompositionContext(): CoroutineContext {
         return MainAndroidUiContext
     }
-
-    override fun postOnMainThread(block: () -> Unit) {
-        handler.post(block)
-    }
-
-    override fun postFrameCallback(callback: ChoreographerFrameCallback) {
-        android.view.Choreographer.getInstance().postFrameCallback(callback)
-    }
-
-    override fun cancelFrameCallback(callback: ChoreographerFrameCallback) {
-        android.view.Choreographer.getInstance().removeFrameCallback(callback)
-    }
 }
 
 actual fun EmbeddingContext(): EmbeddingContext = AndroidEmbeddingContext()
 
-// TODO(b/137794558): Create portable abstraction for scheduling
-internal actual typealias ChoreographerFrameCallback = android.view.Choreographer.FrameCallback
-
 // TODO: Our host-side tests still grab the Android actuals based on SDK stubs that return null.
 // Satisfy their dependencies.
 private val MainAndroidUiContext: CoroutineContext by lazy {
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/EmbeddingContext.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/EmbeddingContext.kt
index 6ead116..d2958264 100644
--- a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/EmbeddingContext.kt
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/EmbeddingContext.kt
@@ -18,16 +18,9 @@
 
 import kotlin.coroutines.CoroutineContext
 
-expect interface ChoreographerFrameCallback {
-    fun doFrame(frameTimeNanos: Long)
-}
-
 interface EmbeddingContext {
     fun isMainThread(): Boolean
     fun mainThreadCompositionContext(): CoroutineContext
-    fun postOnMainThread(block: () -> Unit)
-    fun postFrameCallback(callback: ChoreographerFrameCallback)
-    fun cancelFrameCallback(callback: ChoreographerFrameCallback)
 }
 
 expect fun EmbeddingContext(): EmbeddingContext
diff --git a/compose/runtime/runtime/src/desktopMain/kotlin/androidx/compose/runtime/ActualDesktop.kt b/compose/runtime/runtime/src/desktopMain/kotlin/androidx/compose/runtime/ActualDesktop.kt
index 8806b4b..c610e73 100644
--- a/compose/runtime/runtime/src/desktopMain/kotlin/androidx/compose/runtime/ActualDesktop.kt
+++ b/compose/runtime/runtime/src/desktopMain/kotlin/androidx/compose/runtime/ActualDesktop.kt
@@ -31,34 +31,11 @@
     override fun mainThreadCompositionContext(): CoroutineContext {
         return DesktopUiDispatcher.Main
     }
-
-    override fun postOnMainThread(block: () -> Unit) {
-        DesktopUiDispatcher.Dispatcher.scheduleCallback { block() }
-    }
-
-    private val cancelled = mutableSetOf<ChoreographerFrameCallback>()
-
-    override fun postFrameCallback(callback: ChoreographerFrameCallback) {
-        DesktopUiDispatcher.Dispatcher.scheduleCallback { now ->
-            if (callback !in cancelled) {
-                callback.doFrame(now)
-            } else {
-                cancelled.remove(callback)
-            }
-        }
-    }
-    override fun cancelFrameCallback(callback: ChoreographerFrameCallback) {
-        cancelled += callback
-    }
 }
 
 actual fun EmbeddingContext(): EmbeddingContext =
     EmbeddingContextFactory?.let { it() } ?: SwingEmbeddingContext()
 
-actual interface ChoreographerFrameCallback {
-    actual fun doFrame(frameTimeNanos: Long)
-}
-
 internal actual object Trace {
     actual fun beginSection(name: String) {
         // Do nothing.