Composition preview tests with surfaces
Add abilitiy to use real surfaces in instrumentation tests using the ActivityScenarioRule and an activity class for testing purposes. PiperOrigin-RevId: 611421490
This commit is contained in:
parent
bba45b8b35
commit
1355f4734d
@ -27,7 +27,11 @@
|
||||
<application
|
||||
android:allowBackup="false"
|
||||
tools:ignore="MissingApplicationIcon,HardcodedDebugMode"
|
||||
android:usesCleartextTraffic="true"/>
|
||||
android:usesCleartextTraffic="true">
|
||||
|
||||
<activity android:name="androidx.media3.transformer.SurfaceTestActivity"
|
||||
android:configChanges="keyboardHidden|orientation|screenSize"/>
|
||||
</application>
|
||||
|
||||
<instrumentation
|
||||
android:targetPackage="androidx.media3.transformer.test"
|
||||
|
@ -31,6 +31,7 @@ public final class PlayerTestListener implements Player.Listener, AnalyticsListe
|
||||
|
||||
private final ConditionVariable playerReady;
|
||||
private final ConditionVariable playerEnded;
|
||||
private final ConditionVariable firstFrameRendered;
|
||||
private final AtomicReference<@NullableType PlaybackException> playbackException;
|
||||
private final long testTimeoutMs;
|
||||
private @MonotonicNonNull DecoderCounters decoderCounters;
|
||||
@ -44,6 +45,7 @@ public final class PlayerTestListener implements Player.Listener, AnalyticsListe
|
||||
public PlayerTestListener(long testTimeoutMs) {
|
||||
playerReady = new ConditionVariable();
|
||||
playerEnded = new ConditionVariable();
|
||||
firstFrameRendered = new ConditionVariable();
|
||||
playbackException = new AtomicReference<>();
|
||||
this.testTimeoutMs = testTimeoutMs;
|
||||
}
|
||||
@ -58,6 +60,14 @@ public final class PlayerTestListener implements Player.Listener, AnalyticsListe
|
||||
waitOrThrow(playerEnded);
|
||||
}
|
||||
|
||||
/**
|
||||
* Waits until the {@link Player player} {@linkplain Player.Listener#onRenderedFirstFrame()
|
||||
* renders the first frame}.
|
||||
*/
|
||||
public void waitUntilFirstFrameRendered() throws PlaybackException, TimeoutException {
|
||||
waitOrThrow(firstFrameRendered);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the {@link DecoderCounters} from {@link AnalyticsListener#onVideoEnabled(EventTime,
|
||||
* DecoderCounters)}, {@code null} if not available.
|
||||
@ -78,11 +88,17 @@ public final class PlayerTestListener implements Player.Listener, AnalyticsListe
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onRenderedFirstFrame() {
|
||||
firstFrameRendered.open();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onPlayerError(PlaybackException error) {
|
||||
playbackException.set(error);
|
||||
playerReady.open();
|
||||
playerEnded.open();
|
||||
firstFrameRendered.open();
|
||||
}
|
||||
|
||||
// AnalyticsListener methods
|
||||
|
@ -0,0 +1,70 @@
|
||||
/*
|
||||
* Copyright 2024 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* https://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package androidx.media3.transformer;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.app.KeyguardManager;
|
||||
import android.os.Bundle;
|
||||
import android.view.SurfaceView;
|
||||
import android.view.TextureView;
|
||||
import android.view.WindowManager;
|
||||
import androidx.media3.common.util.Util;
|
||||
import androidx.media3.transformer.test.R;
|
||||
|
||||
/** An activity with surfaces for testing purposes. */
|
||||
public final class SurfaceTestActivity extends Activity {
|
||||
|
||||
private SurfaceView surfaceView;
|
||||
private TextureView textureView;
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
setKeepScreenOn(this);
|
||||
setContentView(R.layout.surface_test_activity);
|
||||
surfaceView = findViewById(R.id.surface_view);
|
||||
textureView = findViewById(R.id.texture_view);
|
||||
}
|
||||
|
||||
/** Gets this activity's {@link SurfaceView}. */
|
||||
public SurfaceView getSurfaceView() {
|
||||
return surfaceView;
|
||||
}
|
||||
|
||||
/** Gets this activity's {@link TextureView}. */
|
||||
public TextureView getTextureView() {
|
||||
return textureView;
|
||||
}
|
||||
|
||||
private static void setKeepScreenOn(Activity activity) {
|
||||
if (Util.SDK_INT >= 27) {
|
||||
activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
|
||||
activity.setTurnScreenOn(true);
|
||||
activity.setShowWhenLocked(true);
|
||||
KeyguardManager keyguardManager =
|
||||
(KeyguardManager) activity.getSystemService(KEYGUARD_SERVICE);
|
||||
keyguardManager.requestDismissKeyguard(activity, /* callback= */ null);
|
||||
} else {
|
||||
activity
|
||||
.getWindow()
|
||||
.addFlags(
|
||||
WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
|
||||
| WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
|
||||
| WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
|
||||
| WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,32 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!--
|
||||
~ Copyright 2024 The Android Open Source Project
|
||||
~
|
||||
~ Licensed under the Apache License, Version 2.0 (the "License");
|
||||
~ you may not use this file except in compliance with the License.
|
||||
~ You may obtain a copy of the License at
|
||||
~
|
||||
~ http://www.apache.org/licenses/LICENSE-2.0
|
||||
~
|
||||
~ Unless required by applicable law or agreed to in writing, software
|
||||
~ distributed under the License is distributed on an "AS IS" BASIS,
|
||||
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
~ See the License for the specific language governing permissions and
|
||||
~ limitations under the License.
|
||||
-->
|
||||
<LinearLayout
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:id="@+id/root_view_group"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent">
|
||||
<SurfaceView
|
||||
android:id="@+id/surface_view"
|
||||
android:layout_width="30dp"
|
||||
android:layout_height="40dp">
|
||||
</SurfaceView>
|
||||
<TextureView
|
||||
android:id="@+id/texture_view"
|
||||
android:layout_width="70dp"
|
||||
android:layout_height="80dp">
|
||||
</TextureView>
|
||||
</LinearLayout>
|
Loading…
x
Reference in New Issue
Block a user