Work around SurfaceView creation issues on API<26 for tests

PiperOrigin-RevId: 731643287
This commit is contained in:
tonihei 2025-02-27 02:25:02 -08:00 committed by Copybara-Service
parent addf01b9a8
commit a3c9060daa
3 changed files with 23 additions and 2 deletions

View File

@ -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= */ () -> {

View File

@ -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= */ () -> {

View File

@ -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 &lt; 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> 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;