Commit e5e903eb by tonihei Committed by kim-vde

Add EventTimes to AnalyticsListener.onEvents

The EventTime wasn't part of the onEvents callbacks so far because the
individual events may have different event times (e.g. if they relate to
different media periods). By adding a query method to obtain the
EventTime by event type, we can solve this issue.

#exofixit

PiperOrigin-RevId: 343818819
parent 7d339976
...@@ -15,7 +15,10 @@ ...@@ -15,7 +15,10 @@
*/ */
package com.google.android.exoplayer2.analytics; package com.google.android.exoplayer2.analytics;
import static com.google.android.exoplayer2.util.Assertions.checkNotNull;
import android.os.Looper; import android.os.Looper;
import android.util.SparseArray;
import android.view.Surface; import android.view.Surface;
import androidx.annotation.IntDef; import androidx.annotation.IntDef;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
...@@ -63,6 +66,38 @@ public interface AnalyticsListener { ...@@ -63,6 +66,38 @@ public interface AnalyticsListener {
/** A set of {@link EventFlags}. */ /** A set of {@link EventFlags}. */
final class Events extends MutableFlags { final class Events extends MutableFlags {
private final SparseArray<EventTime> eventTimes;
/** Creates the set of event flags. */
public Events() {
eventTimes = new SparseArray<>(/* initialCapacity= */ 0);
}
/**
* Returns the {@link EventTime} for the specified event.
*
* @param event The {@link EventFlags event}.
* @return The {@link EventTime} of this event.
*/
public EventTime getEventTime(@EventFlags int event) {
return checkNotNull(eventTimes.get(event));
}
/**
* Sets the {@link EventTime} values for events recorded in this set.
*
* @param eventTimes A map from {@link EventFlags} to {@link EventTime}. Must at least contain
* all the events recorded in this set.
*/
public void setEventTimes(SparseArray<EventTime> eventTimes) {
this.eventTimes.clear();
for (int i = 0; i < size(); i++) {
@EventFlags int eventFlag = get(i);
this.eventTimes.append(eventFlag, checkNotNull(eventTimes.get(eventFlag)));
}
}
/** /**
* Returns whether the given event occurred. * Returns whether the given event occurred.
* *
......
...@@ -8849,7 +8849,7 @@ public final class ExoPlayerTest { ...@@ -8849,7 +8849,7 @@ public final class ExoPlayerTest {
} }
@Test @Test
public void onStateChangedFlags_correspondToListenerCalls() throws Exception { public void onEvents_correspondToListenerCalls() throws Exception {
ExoPlayer player = new TestExoPlayerBuilder(context).build(); ExoPlayer player = new TestExoPlayerBuilder(context).build();
EventListener listener = mock(EventListener.class); EventListener listener = mock(EventListener.class);
player.addListener(listener); player.addListener(listener);
...@@ -8897,13 +8897,14 @@ public final class ExoPlayerTest { ...@@ -8897,13 +8897,14 @@ public final class ExoPlayerTest {
assertThat(events.contains(Player.EVENT_SHUFFLE_MODE_ENABLED_CHANGED)).isTrue(); assertThat(events.contains(Player.EVENT_SHUFFLE_MODE_ENABLED_CHANGED)).isTrue();
// Ensure all other events are called (even though we can't control how exactly they are // Ensure all other events are called (even though we can't control how exactly they are
// combined together in onStateChanged calls). // combined together in onEvents calls).
player.prepare(); player.prepare();
TestPlayerRunHelper.runUntilPlaybackState(player, Player.STATE_READY); TestPlayerRunHelper.runUntilPlaybackState(player, Player.STATE_READY);
player.play(); player.play();
player.setMediaItem(MediaItem.fromUri("http://this-will-throw-an-exception.mp4")); player.setMediaItem(MediaItem.fromUri("http://this-will-throw-an-exception.mp4"));
TestPlayerRunHelper.runUntilPlaybackState(player, Player.STATE_IDLE); TestPlayerRunHelper.runUntilPlaybackState(player, Player.STATE_IDLE);
ShadowLooper.runMainLooperToNextTask(); ShadowLooper.runMainLooperToNextTask();
player.release();
// Verify that all callbacks have been called at least once. // Verify that all callbacks have been called at least once.
verify(listener, atLeastOnce()).onTimelineChanged(any(), anyInt()); verify(listener, atLeastOnce()).onTimelineChanged(any(), anyInt());
...@@ -8920,7 +8921,7 @@ public final class ExoPlayerTest { ...@@ -8920,7 +8921,7 @@ public final class ExoPlayerTest {
verify(listener, atLeastOnce()).onIsPlayingChanged(anyBoolean()); verify(listener, atLeastOnce()).onIsPlayingChanged(anyBoolean());
verify(listener, atLeastOnce()).onPlayerError(any()); verify(listener, atLeastOnce()).onPlayerError(any());
// Verify all the same events have been recorded with onStateChanged. // Verify all the same events have been recorded with onEvents.
verify(listener, atLeastOnce()).onEvents(eq(player), eventCaptor.capture()); verify(listener, atLeastOnce()).onEvents(eq(player), eventCaptor.capture());
List<Player.Events> allEvents = eventCaptor.getAllValues(); List<Player.Events> allEvents = eventCaptor.getAllValues();
assertThat(containsEvent(allEvents, Player.EVENT_TIMELINE_CHANGED)).isTrue(); assertThat(containsEvent(allEvents, Player.EVENT_TIMELINE_CHANGED)).isTrue();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment