Reshuffle the way listeners are attached to MediaSources

This better supports custom listener types defined by MediaSource
subclasses.

Part of issue:#6765

PiperOrigin-RevId: 308050575
This commit is contained in:
ibaker 2020-04-23 15:53:52 +01:00 committed by Ian Baker
parent 84faa1ae3f
commit a042346102
2 changed files with 27 additions and 32 deletions

View file

@ -22,6 +22,7 @@ import com.google.android.exoplayer2.Timeline;
import com.google.android.exoplayer2.drm.DrmSessionEventListener;
import com.google.android.exoplayer2.upstream.TransferListener;
import com.google.android.exoplayer2.util.Assertions;
import com.google.android.exoplayer2.util.MediaSourceEventDispatcher;
import java.util.ArrayList;
import java.util.HashSet;
@ -133,22 +134,44 @@ public abstract class BaseMediaSource implements MediaSource {
@Override
public final void addEventListener(Handler handler, MediaSourceEventListener eventListener) {
eventDispatcher.addEventListener(handler, eventListener);
addEventListenerInternal(handler, eventListener, MediaSourceEventListener.class);
}
@Override
public final void removeEventListener(MediaSourceEventListener eventListener) {
eventDispatcher.removeEventListener(eventListener);
removeEventListenerInternal(eventListener, MediaSourceEventListener.class);
}
@Override
public final void addDrmEventListener(Handler handler, DrmSessionEventListener eventListener) {
eventDispatcher.addEventListener(handler, eventListener, DrmSessionEventListener.class);
addEventListenerInternal(handler, eventListener, DrmSessionEventListener.class);
}
@Override
public final void removeDrmEventListener(DrmSessionEventListener eventListener) {
eventDispatcher.removeEventListener(eventListener, DrmSessionEventListener.class);
removeEventListenerInternal(eventListener, DrmSessionEventListener.class);
}
/**
* Adds a listener to the internal {@link MediaSourceEventDispatcher} with the provided type.
*
* <p>NOTE: Read the caveats on {@link MediaSourceEventDispatcher#addEventListener(Handler,
* Object, Class)} when deciding what value to pass for {@code listenerClass}.
*
* @see MediaSourceEventDispatcher#addEventListener(Handler, Object, Class)
*/
protected final <T> void addEventListenerInternal(
Handler handler, T eventListener, Class<T> listenerClass) {
eventDispatcher.addEventListener(handler, eventListener, listenerClass);
}
/**
* Removes a listener from the internal {@link MediaSourceEventDispatcher}.
*
* @see MediaSourceEventDispatcher#removeEventListener(Object, Class)
*/
protected final <T> void removeEventListenerInternal(T eventListener, Class<T> listenerClass) {
eventDispatcher.removeEventListener(eventListener, listenerClass);
}
@Override

View file

@ -16,7 +16,6 @@
package com.google.android.exoplayer2.source;
import android.net.Uri;
import android.os.Handler;
import androidx.annotation.Nullable;
import com.google.android.exoplayer2.C;
import com.google.android.exoplayer2.Format;
@ -188,33 +187,6 @@ public interface MediaSourceEventListener {
return new EventDispatcher(listenerInfos, windowIndex, mediaPeriodId, mediaTimeOffsetMs);
}
/**
* Adds a {@link MediaSourceEventListener} to the event dispatcher.
*
* <p>This is equivalent to {@link #addEventListener(Handler, Object, Class)} with {@code
* listenerClass = MediaSourceEventListener.class} and is intended to ease the transition to
* using {@link MediaSourceEventDispatcher} everywhere.
*
* @param handler A handler on the which listener events will be posted.
* @param eventListener The listener to be added.
*/
public void addEventListener(Handler handler, MediaSourceEventListener eventListener) {
addEventListener(handler, eventListener, MediaSourceEventListener.class);
}
/**
* Removes a {@link MediaSourceEventListener} from the event dispatcher.
*
* <p>This is equivalent to {@link #removeEventListener(Object, Class)} with {@code
* listenerClass = MediaSourceEventListener.class} and is intended to ease the transition to
* using {@link MediaSourceEventDispatcher} everywhere.
*
* @param eventListener The listener to be removed.
*/
public void removeEventListener(MediaSourceEventListener eventListener) {
removeEventListener(eventListener, MediaSourceEventListener.class);
}
public void mediaPeriodCreated() {
dispatch(
(listener, windowIndex, mediaPeriodId) ->