Commit e5f2e44c by krocard Committed by Ian Baker

Split AnalyticsCollector in interface and default Impl

This will allow R8 to strip out the implementation
if it is not needed for an app.

#minor-release

PiperOrigin-RevId: 427983730
parent cacec8e0
...@@ -54,6 +54,8 @@ ...@@ -54,6 +54,8 @@
`ExoPlayer.Builder.setUsePlatformDiagnostics(false)`. `ExoPlayer.Builder.setUsePlatformDiagnostics(false)`.
* Updated some `AnalyticsListener.EventFlags` constant values to match * Updated some `AnalyticsListener.EventFlags` constant values to match
values in `Player.EventFlags`. values in `Player.EventFlags`.
* Split `AnalyticsCollector` into an interface and default implementation
to allow it to be stripped by R8 if an app doesn't need it.
* Android 12 compatibility: * Android 12 compatibility:
* Upgrade the Cast extension to depend on * Upgrade the Cast extension to depend on
`com.google.android.gms:play-services-cast-framework:20.1.0`. Earlier `com.google.android.gms:play-services-cast-framework:20.1.0`. Earlier
......
...@@ -225,16 +225,16 @@ new PlaybackStatsListener( ...@@ -225,16 +225,16 @@ new PlaybackStatsListener(
In case you need to add custom events to the analytics data, you need to save In case you need to add custom events to the analytics data, you need to save
these events in your own data structure and combine them with the reported these events in your own data structure and combine them with the reported
`PlaybackStats` later. If it helps, you can extend `AnalyticsCollector` to be `PlaybackStats` later. If it helps, you can extend `DefaultAnalyticsCollector`
able to generate `EventTime` instances for your custom events and send them to to be able to generate `EventTime` instances for your custom events and send
the already registered listeners as shown in the following example. them to the already registered listeners as shown in the following example.
~~~ ~~~
interface ExtendedListener extends AnalyticsListener { interface ExtendedListener extends AnalyticsListener {
void onCustomEvent(EventTime eventTime); void onCustomEvent(EventTime eventTime);
} }
class ExtendedCollector extends AnalyticsCollector { class ExtendedCollector extends DefaultAnalyticsCollector {
public void customEvent() { public void customEvent() {
EventTime eventTime = generateCurrentPlayerMediaPeriodEventTime(); EventTime eventTime = generateCurrentPlayerMediaPeriodEventTime();
sendEvent(eventTime, CUSTOM_EVENT_ID, listener -> { sendEvent(eventTime, CUSTOM_EVENT_ID, listener -> {
......
...@@ -32,6 +32,7 @@ import androidx.annotation.Nullable; ...@@ -32,6 +32,7 @@ import androidx.annotation.Nullable;
import androidx.annotation.VisibleForTesting; import androidx.annotation.VisibleForTesting;
import com.google.android.exoplayer2.analytics.AnalyticsCollector; import com.google.android.exoplayer2.analytics.AnalyticsCollector;
import com.google.android.exoplayer2.analytics.AnalyticsListener; import com.google.android.exoplayer2.analytics.AnalyticsListener;
import com.google.android.exoplayer2.analytics.DefaultAnalyticsCollector;
import com.google.android.exoplayer2.audio.AudioAttributes; import com.google.android.exoplayer2.audio.AudioAttributes;
import com.google.android.exoplayer2.audio.AudioSink; import com.google.android.exoplayer2.audio.AudioSink;
import com.google.android.exoplayer2.audio.AuxEffectInfo; import com.google.android.exoplayer2.audio.AuxEffectInfo;
...@@ -565,7 +566,7 @@ public interface ExoPlayer extends Player { ...@@ -565,7 +566,7 @@ public interface ExoPlayer extends Player {
this.analyticsCollectorSupplier = this.analyticsCollectorSupplier =
analyticsCollectorSupplier != null analyticsCollectorSupplier != null
? analyticsCollectorSupplier ? analyticsCollectorSupplier
: () -> new AnalyticsCollector(checkNotNull(clock)); : () -> new DefaultAnalyticsCollector(checkNotNull(clock));
looper = Util.getCurrentOrMainLooper(); looper = Util.getCurrentOrMainLooper();
audioAttributes = AudioAttributes.DEFAULT; audioAttributes = AudioAttributes.DEFAULT;
wakeMode = C.WAKE_MODE_NONE; wakeMode = C.WAKE_MODE_NONE;
......
...@@ -25,6 +25,7 @@ import android.os.Looper; ...@@ -25,6 +25,7 @@ import android.os.Looper;
import androidx.test.core.app.ApplicationProvider; import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.ext.junit.runners.AndroidJUnit4;
import com.google.android.exoplayer2.analytics.AnalyticsCollector; import com.google.android.exoplayer2.analytics.AnalyticsCollector;
import com.google.android.exoplayer2.analytics.DefaultAnalyticsCollector;
import com.google.android.exoplayer2.analytics.PlayerId; import com.google.android.exoplayer2.analytics.PlayerId;
import com.google.android.exoplayer2.source.MediaSource.MediaPeriodId; import com.google.android.exoplayer2.source.MediaSource.MediaPeriodId;
import com.google.android.exoplayer2.source.MediaSource.MediaSourceCaller; import com.google.android.exoplayer2.source.MediaSource.MediaSourceCaller;
...@@ -77,7 +78,7 @@ public final class MediaPeriodQueueTest { ...@@ -77,7 +78,7 @@ public final class MediaPeriodQueueTest {
@Before @Before
public void setUp() { public void setUp() {
AnalyticsCollector analyticsCollector = new AnalyticsCollector(Clock.DEFAULT); AnalyticsCollector analyticsCollector = new DefaultAnalyticsCollector(Clock.DEFAULT);
analyticsCollector.setPlayer( analyticsCollector.setPlayer(
new ExoPlayer.Builder(ApplicationProvider.getApplicationContext()).build(), new ExoPlayer.Builder(ApplicationProvider.getApplicationContext()).build(),
Looper.getMainLooper()); Looper.getMainLooper());
......
...@@ -29,6 +29,7 @@ import android.os.Looper; ...@@ -29,6 +29,7 @@ import android.os.Looper;
import androidx.test.core.app.ApplicationProvider; import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.ext.junit.runners.AndroidJUnit4;
import com.google.android.exoplayer2.analytics.AnalyticsCollector; import com.google.android.exoplayer2.analytics.AnalyticsCollector;
import com.google.android.exoplayer2.analytics.DefaultAnalyticsCollector;
import com.google.android.exoplayer2.analytics.PlayerId; import com.google.android.exoplayer2.analytics.PlayerId;
import com.google.android.exoplayer2.source.MediaSource; import com.google.android.exoplayer2.source.MediaSource;
import com.google.android.exoplayer2.source.ShuffleOrder; import com.google.android.exoplayer2.source.ShuffleOrder;
...@@ -55,7 +56,7 @@ public class MediaSourceListTest { ...@@ -55,7 +56,7 @@ public class MediaSourceListTest {
@Before @Before
public void setUp() { public void setUp() {
AnalyticsCollector analyticsCollector = new AnalyticsCollector(Clock.DEFAULT); AnalyticsCollector analyticsCollector = new DefaultAnalyticsCollector(Clock.DEFAULT);
analyticsCollector.setPlayer( analyticsCollector.setPlayer(
new ExoPlayer.Builder(ApplicationProvider.getApplicationContext()).build(), new ExoPlayer.Builder(ApplicationProvider.getApplicationContext()).build(),
Looper.getMainLooper()); Looper.getMainLooper());
......
...@@ -55,12 +55,12 @@ import static org.mockito.ArgumentMatchers.anyBoolean; ...@@ -55,12 +55,12 @@ import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.ArgumentMatchers.anyFloat; import static org.mockito.ArgumentMatchers.anyFloat;
import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.anyLong; import static org.mockito.ArgumentMatchers.anyLong;
import static org.mockito.ArgumentMatchers.argThat;
import static org.mockito.ArgumentMatchers.eq; import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.argThat; import static org.mockito.ArgumentMatchers.same;
import static org.mockito.Mockito.atLeastOnce; import static org.mockito.Mockito.atLeastOnce;
import static org.mockito.Mockito.inOrder; import static org.mockito.Mockito.inOrder;
import static org.mockito.Mockito.mock; import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.same;
import static org.mockito.Mockito.spy; import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verify;
...@@ -134,11 +134,11 @@ import org.mockito.ArgumentCaptor; ...@@ -134,11 +134,11 @@ import org.mockito.ArgumentCaptor;
import org.mockito.InOrder; import org.mockito.InOrder;
import org.robolectric.shadows.ShadowLooper; import org.robolectric.shadows.ShadowLooper;
/** Integration test for {@link AnalyticsCollector}. */ /** Integration test for {@link DefaultAnalyticsCollector}. */
@RunWith(AndroidJUnit4.class) @RunWith(AndroidJUnit4.class)
public final class AnalyticsCollectorTest { public final class DefaultAnalyticsCollectorTest {
private static final String TAG = "AnalyticsCollectorTest"; private static final String TAG = "DefaultAnalyticsCollectorTest";
// Deprecated event constants. // Deprecated event constants.
private static final long EVENT_PLAYER_STATE_CHANGED = 1L << 63; private static final long EVENT_PLAYER_STATE_CHANGED = 1L << 63;
...@@ -193,14 +193,14 @@ public final class AnalyticsCollectorTest { ...@@ -193,14 +193,14 @@ public final class AnalyticsCollectorTest {
private EventWindowAndPeriodId window1Period0Seq1; private EventWindowAndPeriodId window1Period0Seq1;
@Test @Test
public void analyticsCollector_overridesAllPlayerListenerMethods() throws Exception { public void defaultAnalyticsCollector_overridesAllPlayerListenerMethods() throws Exception {
// Verify that AnalyticsCollector forwards all Player.Listener methods to AnalyticsListener. // Verify that AnalyticsCollector forwards all Player.Listener methods to AnalyticsListener.
for (Method method : Player.Listener.class.getDeclaredMethods()) { for (Method method : Player.Listener.class.getDeclaredMethods()) {
assertThat( assertThat(
AnalyticsCollector.class DefaultAnalyticsCollector.class
.getMethod(method.getName(), method.getParameterTypes()) .getMethod(method.getName(), method.getParameterTypes())
.getDeclaringClass()) .getDeclaringClass())
.isEqualTo(AnalyticsCollector.class); .isEqualTo(DefaultAnalyticsCollector.class);
} }
} }
...@@ -1964,7 +1964,7 @@ public final class AnalyticsCollectorTest { ...@@ -1964,7 +1964,7 @@ public final class AnalyticsCollectorTest {
@Test @Test
public void recursiveListenerInvocation_arrivesInCorrectOrder() { public void recursiveListenerInvocation_arrivesInCorrectOrder() {
AnalyticsCollector analyticsCollector = new AnalyticsCollector(Clock.DEFAULT); AnalyticsCollector analyticsCollector = new DefaultAnalyticsCollector(Clock.DEFAULT);
analyticsCollector.setPlayer( analyticsCollector.setPlayer(
new ExoPlayer.Builder(ApplicationProvider.getApplicationContext()).build(), new ExoPlayer.Builder(ApplicationProvider.getApplicationContext()).build(),
Looper.myLooper()); Looper.myLooper());
......
...@@ -26,7 +26,7 @@ import com.google.android.exoplayer2.LoadControl; ...@@ -26,7 +26,7 @@ import com.google.android.exoplayer2.LoadControl;
import com.google.android.exoplayer2.Renderer; import com.google.android.exoplayer2.Renderer;
import com.google.android.exoplayer2.RenderersFactory; import com.google.android.exoplayer2.RenderersFactory;
import com.google.android.exoplayer2.SimpleExoPlayer; import com.google.android.exoplayer2.SimpleExoPlayer;
import com.google.android.exoplayer2.analytics.AnalyticsCollector; import com.google.android.exoplayer2.analytics.DefaultAnalyticsCollector;
import com.google.android.exoplayer2.source.MediaSource; import com.google.android.exoplayer2.source.MediaSource;
import com.google.android.exoplayer2.trackselection.DefaultTrackSelector; import com.google.android.exoplayer2.trackselection.DefaultTrackSelector;
import com.google.android.exoplayer2.upstream.BandwidthMeter; import com.google.android.exoplayer2.upstream.BandwidthMeter;
...@@ -300,7 +300,7 @@ public class TestExoPlayerBuilder { ...@@ -300,7 +300,7 @@ public class TestExoPlayerBuilder {
.setTrackSelector(trackSelector) .setTrackSelector(trackSelector)
.setLoadControl(loadControl) .setLoadControl(loadControl)
.setBandwidthMeter(bandwidthMeter) .setBandwidthMeter(bandwidthMeter)
.setAnalyticsCollector(new AnalyticsCollector(clock)) .setAnalyticsCollector(new DefaultAnalyticsCollector(clock))
.setClock(clock) .setClock(clock)
.setUseLazyPreparation(useLazyPreparation) .setUseLazyPreparation(useLazyPreparation)
.setLooper(looper) .setLooper(looper)
......
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