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
This commit is contained in:
krocard 2022-02-11 13:58:30 +00:00 committed by Ian Baker
parent cacec8e02f
commit e5f2e44c29
9 changed files with 1268 additions and 1162 deletions

View File

@ -54,6 +54,8 @@
`ExoPlayer.Builder.setUsePlatformDiagnostics(false)`.
* Updated some `AnalyticsListener.EventFlags` constant values to match
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:
* Upgrade the Cast extension to depend on
`com.google.android.gms:play-services-cast-framework:20.1.0`. Earlier

View File

@ -225,16 +225,16 @@ new PlaybackStatsListener(
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
`PlaybackStats` later. If it helps, you can extend `AnalyticsCollector` to be
able to generate `EventTime` instances for your custom events and send them to
the already registered listeners as shown in the following example.
`PlaybackStats` later. If it helps, you can extend `DefaultAnalyticsCollector`
to be able to generate `EventTime` instances for your custom events and send
them to the already registered listeners as shown in the following example.
~~~
interface ExtendedListener extends AnalyticsListener {
void onCustomEvent(EventTime eventTime);
}
class ExtendedCollector extends AnalyticsCollector {
class ExtendedCollector extends DefaultAnalyticsCollector {
public void customEvent() {
EventTime eventTime = generateCurrentPlayerMediaPeriodEventTime();
sendEvent(eventTime, CUSTOM_EVENT_ID, listener -> {

View File

@ -32,6 +32,7 @@ import androidx.annotation.Nullable;
import androidx.annotation.VisibleForTesting;
import com.google.android.exoplayer2.analytics.AnalyticsCollector;
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.AudioSink;
import com.google.android.exoplayer2.audio.AuxEffectInfo;
@ -565,7 +566,7 @@ public interface ExoPlayer extends Player {
this.analyticsCollectorSupplier =
analyticsCollectorSupplier != null
? analyticsCollectorSupplier
: () -> new AnalyticsCollector(checkNotNull(clock));
: () -> new DefaultAnalyticsCollector(checkNotNull(clock));
looper = Util.getCurrentOrMainLooper();
audioAttributes = AudioAttributes.DEFAULT;
wakeMode = C.WAKE_MODE_NONE;

View File

@ -25,6 +25,7 @@ import android.os.Looper;
import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4;
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.source.MediaSource.MediaPeriodId;
import com.google.android.exoplayer2.source.MediaSource.MediaSourceCaller;
@ -77,7 +78,7 @@ public final class MediaPeriodQueueTest {
@Before
public void setUp() {
AnalyticsCollector analyticsCollector = new AnalyticsCollector(Clock.DEFAULT);
AnalyticsCollector analyticsCollector = new DefaultAnalyticsCollector(Clock.DEFAULT);
analyticsCollector.setPlayer(
new ExoPlayer.Builder(ApplicationProvider.getApplicationContext()).build(),
Looper.getMainLooper());

View File

@ -29,6 +29,7 @@ import android.os.Looper;
import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4;
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.source.MediaSource;
import com.google.android.exoplayer2.source.ShuffleOrder;
@ -55,7 +56,7 @@ public class MediaSourceListTest {
@Before
public void setUp() {
AnalyticsCollector analyticsCollector = new AnalyticsCollector(Clock.DEFAULT);
AnalyticsCollector analyticsCollector = new DefaultAnalyticsCollector(Clock.DEFAULT);
analyticsCollector.setPlayer(
new ExoPlayer.Builder(ApplicationProvider.getApplicationContext()).build(),
Looper.getMainLooper());

View File

@ -55,12 +55,12 @@ import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.ArgumentMatchers.anyFloat;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.anyLong;
import static org.mockito.ArgumentMatchers.argThat;
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.inOrder;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.same;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
@ -134,11 +134,11 @@ import org.mockito.ArgumentCaptor;
import org.mockito.InOrder;
import org.robolectric.shadows.ShadowLooper;
/** Integration test for {@link AnalyticsCollector}. */
/** Integration test for {@link DefaultAnalyticsCollector}. */
@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.
private static final long EVENT_PLAYER_STATE_CHANGED = 1L << 63;
@ -193,14 +193,14 @@ public final class AnalyticsCollectorTest {
private EventWindowAndPeriodId window1Period0Seq1;
@Test
public void analyticsCollector_overridesAllPlayerListenerMethods() throws Exception {
public void defaultAnalyticsCollector_overridesAllPlayerListenerMethods() throws Exception {
// Verify that AnalyticsCollector forwards all Player.Listener methods to AnalyticsListener.
for (Method method : Player.Listener.class.getDeclaredMethods()) {
assertThat(
AnalyticsCollector.class
DefaultAnalyticsCollector.class
.getMethod(method.getName(), method.getParameterTypes())
.getDeclaringClass())
.isEqualTo(AnalyticsCollector.class);
.isEqualTo(DefaultAnalyticsCollector.class);
}
}
@ -1964,7 +1964,7 @@ public final class AnalyticsCollectorTest {
@Test
public void recursiveListenerInvocation_arrivesInCorrectOrder() {
AnalyticsCollector analyticsCollector = new AnalyticsCollector(Clock.DEFAULT);
AnalyticsCollector analyticsCollector = new DefaultAnalyticsCollector(Clock.DEFAULT);
analyticsCollector.setPlayer(
new ExoPlayer.Builder(ApplicationProvider.getApplicationContext()).build(),
Looper.myLooper());

View File

@ -26,7 +26,7 @@ import com.google.android.exoplayer2.LoadControl;
import com.google.android.exoplayer2.Renderer;
import com.google.android.exoplayer2.RenderersFactory;
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.trackselection.DefaultTrackSelector;
import com.google.android.exoplayer2.upstream.BandwidthMeter;
@ -300,7 +300,7 @@ public class TestExoPlayerBuilder {
.setTrackSelector(trackSelector)
.setLoadControl(loadControl)
.setBandwidthMeter(bandwidthMeter)
.setAnalyticsCollector(new AnalyticsCollector(clock))
.setAnalyticsCollector(new DefaultAnalyticsCollector(clock))
.setClock(clock)
.setUseLazyPreparation(useLazyPreparation)
.setLooper(looper)