From a042346102d651c04b313b25d97082c8ea184383 Mon Sep 17 00:00:00 2001 From: ibaker Date: Thu, 23 Apr 2020 15:53:52 +0100 Subject: [PATCH] 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 --- .../exoplayer2/source/BaseMediaSource.java | 31 ++++++++++++++++--- .../source/MediaSourceEventListener.java | 28 ----------------- 2 files changed, 27 insertions(+), 32 deletions(-) diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/BaseMediaSource.java b/library/core/src/main/java/com/google/android/exoplayer2/source/BaseMediaSource.java index a10bd038d7..461b146b8d 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/BaseMediaSource.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/BaseMediaSource.java @@ -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. + * + *

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 void addEventListenerInternal( + Handler handler, T eventListener, Class listenerClass) { + eventDispatcher.addEventListener(handler, eventListener, listenerClass); + } + + /** + * Removes a listener from the internal {@link MediaSourceEventDispatcher}. + * + * @see MediaSourceEventDispatcher#removeEventListener(Object, Class) + */ + protected final void removeEventListenerInternal(T eventListener, Class listenerClass) { + eventDispatcher.removeEventListener(eventListener, listenerClass); } @Override diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/MediaSourceEventListener.java b/library/core/src/main/java/com/google/android/exoplayer2/source/MediaSourceEventListener.java index 61bb55d8d7..90de956929 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/MediaSourceEventListener.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/MediaSourceEventListener.java @@ -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. - * - *

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. - * - *

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) ->