33
33
import androidx .media3 .common .Timeline ;
34
34
import androidx .media3 .common .audio .AudioProcessor ;
35
35
import androidx .media3 .common .audio .SpeedProvider ;
36
+ import androidx .media3 .common .util .ConditionVariable ;
36
37
import androidx .media3 .effect .GlEffect ;
37
38
import androidx .test .ext .junit .rules .ActivityScenarioRule ;
38
39
import androidx .test .ext .junit .runners .AndroidJUnit4 ;
@@ -129,6 +130,7 @@ public void setComposition_withChangedRemoveAudio_playbackCompletes() throws Exc
129
130
.build ();
130
131
EditedMediaItem mediaItemRemoveAudio = mediaItem .buildUpon ().setRemoveAudio (true ).build ();
131
132
AtomicBoolean changedComposition = new AtomicBoolean ();
133
+ ConditionVariable playerEnded = new ConditionVariable ();
132
134
CopyOnWriteArrayList <Integer > playerStates = new CopyOnWriteArrayList <>();
133
135
134
136
instrumentation .runOnMainSync (
@@ -149,13 +151,18 @@ public void onPlaybackStateChanged(@State int playbackState) {
149
151
compositionPlayer .play ();
150
152
changedComposition .set (true );
151
153
}
154
+ } else if (playbackState == Player .STATE_ENDED ) {
155
+ playerEnded .open ();
152
156
}
153
157
}
154
158
});
155
159
compositionPlayer .setComposition (createSingleSequenceComposition (mediaItem , mediaItem ));
156
160
compositionPlayer .prepare ();
157
161
});
158
162
163
+ // Wait until the final state is added to playerStates.
164
+ playerEnded .block (TEST_TIMEOUT_MS );
165
+ // waitUntilPlayerEnded should return immediate and will throw any player error.
159
166
playerTestListener .waitUntilPlayerEnded ();
160
167
// Asserts that changing removeAudio does not cause the player to get back to buffering state,
161
168
// because the player should not be re-prepared.
0 commit comments