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:
parent
cacec8e02f
commit
e5f2e44c29
@ -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(
|
|||||||
|
|
||||||
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;
|
|||||||
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 {
|
|||||||
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;
|
||||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -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 {
|
|||||||
|
|
||||||
@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;
|
|||||||
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 {
|
|||||||
|
|
||||||
@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;
|
|||||||
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;
|
|||||||
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 {
|
|||||||
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 {
|
|||||||
|
|
||||||
@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;
|
|||||||
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 {
|
|||||||
.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)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user