From adae53c787cad14ed538b2324b00f325ea2b648c Mon Sep 17 00:00:00 2001 From: ibaker Date: Mon, 23 Mar 2020 12:13:28 +0000 Subject: [PATCH] Use MediaSourceEventDispatcher in DefaultDrmSession(Manager) Remove add/removeEventListener methods & associated listener plumbing. Part of issue:#6765 PiperOrigin-RevId: 302411347 --- .../exoplayer2/drm/DefaultDrmSession.java | 41 ++++++++++++++----- .../drm/DefaultDrmSessionManager.java | 29 +++---------- .../exoplayer2/drm/OfflineLicenseHelper.java | 3 +- 3 files changed, 37 insertions(+), 36 deletions(-) diff --git a/library/core/src/main/java/com/google/android/exoplayer2/drm/DefaultDrmSession.java b/library/core/src/main/java/com/google/android/exoplayer2/drm/DefaultDrmSession.java index 9c054b12fa..59663ed1f6 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/drm/DefaultDrmSession.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/drm/DefaultDrmSession.java @@ -31,7 +31,7 @@ import com.google.android.exoplayer2.drm.ExoMediaDrm.KeyRequest; import com.google.android.exoplayer2.drm.ExoMediaDrm.ProvisionRequest; import com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy; import com.google.android.exoplayer2.util.Assertions; -import com.google.android.exoplayer2.util.EventDispatcher; +import com.google.android.exoplayer2.util.CopyOnWriteMultiset; import com.google.android.exoplayer2.util.Log; import com.google.android.exoplayer2.util.MediaSourceEventDispatcher; import com.google.android.exoplayer2.util.Util; @@ -109,7 +109,7 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; private final boolean playClearSamplesWithoutKeys; private final boolean isPlaceholderSession; private final HashMap keyRequestParameters; - private final EventDispatcher eventDispatcher; + private final CopyOnWriteMultiset eventDispatchers; private final LoadErrorHandlingPolicy loadErrorHandlingPolicy; /* package */ final MediaDrmCallback callback; @@ -144,7 +144,6 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; * @param keyRequestParameters Key request parameters. * @param callback The media DRM callback. * @param playbackLooper The playback looper. - * @param eventDispatcher The dispatcher for DRM session manager events. * @param loadErrorHandlingPolicy The {@link LoadErrorHandlingPolicy} for key and provisioning * requests. */ @@ -161,7 +160,6 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; HashMap keyRequestParameters, MediaDrmCallback callback, Looper playbackLooper, - EventDispatcher eventDispatcher, LoadErrorHandlingPolicy loadErrorHandlingPolicy) { if (mode == DefaultDrmSessionManager.MODE_QUERY || mode == DefaultDrmSessionManager.MODE_RELEASE) { @@ -182,7 +180,7 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; } this.keyRequestParameters = keyRequestParameters; this.callback = callback; - this.eventDispatcher = eventDispatcher; + this.eventDispatchers = new CopyOnWriteMultiset<>(); this.loadErrorHandlingPolicy = loadErrorHandlingPolicy; state = STATE_OPENING; responseHandler = new ResponseHandler(playbackLooper); @@ -261,6 +259,9 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; @Override public void acquire(@Nullable MediaSourceEventDispatcher eventDispatcher) { Assertions.checkState(referenceCount >= 0); + if (eventDispatcher != null) { + eventDispatchers.add(eventDispatcher); + } if (++referenceCount == 1) { Assertions.checkState(state == STATE_OPENING); requestHandlerThread = new HandlerThread("DrmRequestHandler"); @@ -269,6 +270,14 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; if (openInternal(true)) { doLicense(true); } + } else { + // TODO: Add a parameter to onDrmSessionAcquired to indicate whether the session is being + // re-used or not. + if (eventDispatcher != null) { + eventDispatcher.dispatch( + (listener, windowIndex, mediaPeriodId) -> listener.onDrmSessionAcquired(), + DrmSessionEventListener.class); + } } } @@ -289,10 +298,13 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; if (sessionId != null) { mediaDrm.closeSession(sessionId); sessionId = null; - this.eventDispatcher.dispatch(DrmSessionEventListener::onDrmSessionReleased); } releaseCallback.onSessionReleased(this); } + dispatchEvent((listener, windowIndex, mediaPeriodId) -> listener.onDrmSessionReleased()); + if (eventDispatcher != null) { + eventDispatchers.remove(eventDispatcher); + } } // Internal methods. @@ -314,7 +326,7 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; try { sessionId = mediaDrm.openSession(); mediaCrypto = mediaDrm.createMediaCrypto(sessionId); - eventDispatcher.dispatch(DrmSessionEventListener::onDrmSessionAcquired); + dispatchEvent((listener, windowIndex, mediaPeriodId) -> listener.onDrmSessionAcquired()); state = STATE_OPENED; Assertions.checkNotNull(sessionId); return true; @@ -378,7 +390,7 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; onError(new KeysExpiredException()); } else { state = STATE_OPENED_WITH_KEYS; - eventDispatcher.dispatch(DrmSessionEventListener::onDrmKeysRestored); + dispatchEvent((listener, windowIndex, mediaPeriodId) -> listener.onDrmKeysRestored()); } } break; @@ -448,7 +460,7 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; byte[] responseData = (byte[]) response; if (mode == DefaultDrmSessionManager.MODE_RELEASE) { mediaDrm.provideKeyResponse(Util.castNonNull(offlineLicenseKeySetId), responseData); - eventDispatcher.dispatch(DrmSessionEventListener::onDrmKeysRestored); + dispatchEvent((listener, windowIndex, mediaPeriodId) -> listener.onDrmKeysRestored()); } else { byte[] keySetId = mediaDrm.provideKeyResponse(sessionId, responseData); if ((mode == DefaultDrmSessionManager.MODE_DOWNLOAD @@ -459,7 +471,7 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; offlineLicenseKeySetId = keySetId; } state = STATE_OPENED_WITH_KEYS; - eventDispatcher.dispatch(DrmSessionEventListener::onDrmKeysLoaded); + dispatchEvent((listener, windowIndex, mediaPeriodId) -> listener.onDrmKeysLoaded()); } } catch (Exception e) { onKeysError(e); @@ -483,7 +495,7 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; private void onError(final Exception e) { lastException = new DrmSessionException(e); - eventDispatcher.dispatch(listener -> listener.onDrmSessionManagerError(e)); + dispatchEvent((listener, windowIndex, mediaPeriodId) -> listener.onDrmSessionManagerError(e)); if (state != STATE_OPENED_WITH_KEYS) { state = STATE_ERROR; } @@ -495,6 +507,13 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; return state == STATE_OPENED || state == STATE_OPENED_WITH_KEYS; } + private void dispatchEvent( + MediaSourceEventDispatcher.EventWithPeriodId event) { + for (MediaSourceEventDispatcher eventDispatcher : eventDispatchers.elementSet()) { + eventDispatcher.dispatch(event, DrmSessionEventListener.class); + } + } + // Internal classes. @SuppressLint("HandlerLeak") diff --git a/library/core/src/main/java/com/google/android/exoplayer2/drm/DefaultDrmSessionManager.java b/library/core/src/main/java/com/google/android/exoplayer2/drm/DefaultDrmSessionManager.java index 4e1a8a5b87..dbfde1cc9a 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/drm/DefaultDrmSessionManager.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/drm/DefaultDrmSessionManager.java @@ -29,7 +29,6 @@ import com.google.android.exoplayer2.drm.ExoMediaDrm.OnEventListener; import com.google.android.exoplayer2.upstream.DefaultLoadErrorHandlingPolicy; import com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy; import com.google.android.exoplayer2.util.Assertions; -import com.google.android.exoplayer2.util.EventDispatcher; import com.google.android.exoplayer2.util.Log; import com.google.android.exoplayer2.util.MediaSourceEventDispatcher; import com.google.android.exoplayer2.util.Util; @@ -240,7 +239,6 @@ public class DefaultDrmSessionManager implements DrmSessionManager { private final ExoMediaDrm.Provider exoMediaDrmProvider; private final MediaDrmCallback callback; private final HashMap keyRequestParameters; - private final EventDispatcher eventDispatcher; private final boolean multiSession; private final int[] useDrmSessionsForClearContentTrackTypes; private final boolean playClearSamplesWithoutKeys; @@ -356,7 +354,6 @@ public class DefaultDrmSessionManager implements DrmSessionManager { this.exoMediaDrmProvider = exoMediaDrmProvider; this.callback = callback; this.keyRequestParameters = keyRequestParameters; - this.eventDispatcher = new EventDispatcher<>(); this.multiSession = multiSession; this.useDrmSessionsForClearContentTrackTypes = useDrmSessionsForClearContentTrackTypes; this.playClearSamplesWithoutKeys = playClearSamplesWithoutKeys; @@ -367,25 +364,6 @@ public class DefaultDrmSessionManager implements DrmSessionManager { provisioningSessions = new ArrayList<>(); } - /** - * Adds a {@link DrmSessionEventListener} to listen to drm session events. - * - * @param handler A handler to use when delivering events to {@code eventListener}. - * @param eventListener A listener of events. - */ - public final void addListener(Handler handler, DrmSessionEventListener eventListener) { - eventDispatcher.addListener(handler, eventListener); - } - - /** - * Removes a {@link DrmSessionEventListener} from the list of drm session event listeners. - * - * @param eventListener The listener to remove. - */ - public final void removeListener(DrmSessionEventListener eventListener) { - eventDispatcher.removeListener(eventListener); - } - /** * Sets the mode, which determines the role of sessions acquired from the instance. This must be * called before {@link #acquireSession(Looper, MediaSourceEventDispatcher, DrmInitData)} or @@ -509,7 +487,11 @@ public class DefaultDrmSessionManager implements DrmSessionManager { schemeDatas = getSchemeDatas(drmInitData, uuid, false); if (schemeDatas.isEmpty()) { final MissingSchemeDataException error = new MissingSchemeDataException(uuid); - this.eventDispatcher.dispatch(listener -> listener.onDrmSessionManagerError(error)); + if (eventDispatcher != null) { + eventDispatcher.dispatch( + (listener, windowIndex, mediaPeriodId) -> listener.onDrmSessionManagerError(error), + DrmSessionEventListener.class); + } return new ErrorStateDrmSession(new DrmSessionException(error)); } } @@ -579,7 +561,6 @@ public class DefaultDrmSessionManager implements DrmSessionManager { keyRequestParameters, callback, Assertions.checkNotNull(playbackLooper), - eventDispatcher, loadErrorHandlingPolicy); } diff --git a/library/core/src/main/java/com/google/android/exoplayer2/drm/OfflineLicenseHelper.java b/library/core/src/main/java/com/google/android/exoplayer2/drm/OfflineLicenseHelper.java index d4b42c1ac1..a9d981742d 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/drm/OfflineLicenseHelper.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/drm/OfflineLicenseHelper.java @@ -177,7 +177,8 @@ public final class OfflineLicenseHelper { conditionVariable.open(); } }; - drmSessionManager.addListener(new Handler(handlerThread.getLooper()), eventListener); + eventDispatcher.addEventListener( + new Handler(handlerThread.getLooper()), eventListener, DrmSessionEventListener.class); } /**