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.