From a3c9060daa6c59011d37eb29c4d4ebcf430434d2 Mon Sep 17 00:00:00 2001 From: tonihei Date: Thu, 27 Feb 2025 02:25:02 -0800 Subject: [PATCH] Work around SurfaceView creation issues on API<26 for tests PiperOrigin-RevId: 731643287 --- .../exoplayer/ExoPlayerBinderStressTest.java | 3 ++- ...DefaultPreloadManagerBinderStressTest.java | 3 ++- .../androidx/media3/test/utils/TestUtil.java | 19 +++++++++++++++++++ 3 files changed, 23 insertions(+), 2 deletions(-) diff --git a/libraries/exoplayer/src/androidTest/java/androidx/media3/exoplayer/ExoPlayerBinderStressTest.java b/libraries/exoplayer/src/androidTest/java/androidx/media3/exoplayer/ExoPlayerBinderStressTest.java index fa3b1ba77e..78539075a4 100644 --- a/libraries/exoplayer/src/androidTest/java/androidx/media3/exoplayer/ExoPlayerBinderStressTest.java +++ b/libraries/exoplayer/src/androidTest/java/androidx/media3/exoplayer/ExoPlayerBinderStressTest.java @@ -24,6 +24,7 @@ import androidx.media3.common.TrackSelectionParameters; import androidx.media3.exoplayer.upstream.DefaultBandwidthMeter; import androidx.media3.exoplayer.util.EventLogger; import androidx.media3.test.utils.BinderStressCreator; +import androidx.media3.test.utils.TestUtil; import androidx.test.core.app.ApplicationProvider; import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.filters.SdkSuppress; @@ -41,7 +42,7 @@ public class ExoPlayerBinderStressTest { @Test public void binderStressTest() throws Exception { Context context = ApplicationProvider.getApplicationContext(); - SurfaceView surfaceView = new SurfaceView(context); + SurfaceView surfaceView = TestUtil.createSurfaceView(context); BinderStressCreator.verifyNoSystemBinderCalls( /* systemUnderTest= */ () -> { diff --git a/libraries/exoplayer/src/androidTest/java/androidx/media3/exoplayer/source/preload/DefaultPreloadManagerBinderStressTest.java b/libraries/exoplayer/src/androidTest/java/androidx/media3/exoplayer/source/preload/DefaultPreloadManagerBinderStressTest.java index df1f136b3f..4e6f62e7a1 100644 --- a/libraries/exoplayer/src/androidTest/java/androidx/media3/exoplayer/source/preload/DefaultPreloadManagerBinderStressTest.java +++ b/libraries/exoplayer/src/androidTest/java/androidx/media3/exoplayer/source/preload/DefaultPreloadManagerBinderStressTest.java @@ -27,6 +27,7 @@ import androidx.media3.exoplayer.ExoPlayer; import androidx.media3.exoplayer.upstream.DefaultBandwidthMeter; import androidx.media3.exoplayer.util.EventLogger; import androidx.media3.test.utils.BinderStressCreator; +import androidx.media3.test.utils.TestUtil; import androidx.test.core.app.ApplicationProvider; import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.filters.SdkSuppress; @@ -45,7 +46,7 @@ public class DefaultPreloadManagerBinderStressTest { @Test public void binderStressTest() throws Exception { Context context = ApplicationProvider.getApplicationContext(); - SurfaceView surfaceView = new SurfaceView(context); + SurfaceView surfaceView = TestUtil.createSurfaceView(context); BinderStressCreator.verifyNoSystemBinderCalls( /* systemUnderTest= */ () -> { diff --git a/libraries/test_utils/src/main/java/androidx/media3/test/utils/TestUtil.java b/libraries/test_utils/src/main/java/androidx/media3/test/utils/TestUtil.java index 8fd691b18c..5ce31b7063 100644 --- a/libraries/test_utils/src/main/java/androidx/media3/test/utils/TestUtil.java +++ b/libraries/test_utils/src/main/java/androidx/media3/test/utils/TestUtil.java @@ -29,7 +29,9 @@ import android.graphics.Color; import android.media.MediaCodec; import android.net.Uri; import android.os.Bundle; +import android.os.Looper; import android.os.Parcel; +import android.view.SurfaceView; import androidx.annotation.Nullable; import androidx.media3.common.C; import androidx.media3.common.Format; @@ -54,6 +56,7 @@ import androidx.media3.extractor.ExtractorInput; import androidx.media3.extractor.PositionHolder; import androidx.media3.extractor.SeekMap; import androidx.media3.extractor.metadata.MetadataInputBuffer; +import androidx.test.platform.app.InstrumentationRegistry; import com.google.common.base.Function; import com.google.common.collect.BoundType; import com.google.common.collect.ImmutableList; @@ -90,6 +93,7 @@ import java.util.Random; import java.util.Set; import java.util.UUID; import java.util.concurrent.ExecutionException; +import java.util.concurrent.atomic.AtomicReference; import org.checkerframework.checker.nullness.qual.NonNull; import org.mockito.Mockito; @@ -939,6 +943,21 @@ public class TestUtil { return buffer; } + /** + * Creates a {@link SurfaceView} for tests where the creation is moved to the main thread if run + * on a non-Looper thread. This is needed on API < 26 where {@link SurfaceView} cannot be + * created on a non-Looper thread. + */ + public static SurfaceView createSurfaceView(Context context) { + if (Util.SDK_INT >= 26 || Looper.myLooper() != null) { + return new SurfaceView(context); + } + AtomicReference surfaceView = new AtomicReference<>(); + InstrumentationRegistry.getInstrumentation() + .runOnMainSync(() -> surfaceView.set(new SurfaceView(context))); + return surfaceView.get(); + } + private static final class NoUidOrShufflingTimeline extends Timeline { private final Timeline delegate;