From 786edf8ecd63272b9111a8c445b49745ce723d07 Mon Sep 17 00:00:00 2001 From: ibaker Date: Mon, 18 May 2020 13:39:03 +0100 Subject: [PATCH] Tweak DefaultDrmSession acquire & release event behaviour The new behaviour: - If the session is successfully opened, an acquire event is dispatched to all attached dispatchers. - If acquire() is called but the session is already open, the acquire event is dispatched only to the dispatcher provided in to acquire() - If the session is successfully released, a release event is dispatched to all attached dispatchers (in theory at most one should ever be attached at this point). - If release() is called but the session isn't released (because referenceCount > 0) then a release event is dispatched only to the dispatcher provided to release(). PiperOrigin-RevId: 312062422 --- .../exoplayer2/drm/DefaultDrmSession.java | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 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 8f46d5945c..7a304da988 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 @@ -273,13 +273,12 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; if (openInternal(true)) { doLicense(true); } - } else { + } else if (eventDispatcher != null && isOpen()) { + // If the session is already open then send the acquire event only to the provided dispatcher. // TODO: Add a parameter to onDrmSessionAcquired to indicate whether the session is being // re-used or not. - if (eventDispatcher != null) { - eventDispatcher.dispatch( - DrmSessionEventListener::onDrmSessionAcquired, DrmSessionEventListener.class); - } + eventDispatcher.dispatch( + DrmSessionEventListener::onDrmSessionAcquired, DrmSessionEventListener.class); } } @@ -302,9 +301,15 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; sessionId = null; } releaseCallback.onSessionReleased(this); + dispatchEvent(DrmSessionEventListener::onDrmSessionReleased); } - dispatchEvent(DrmSessionEventListener::onDrmSessionReleased); if (eventDispatcher != null) { + if (isOpen()) { + // If the session is still open then send the release event only to the provided dispatcher + // before removing it. + eventDispatcher.dispatch( + DrmSessionEventListener::onDrmSessionReleased, DrmSessionEventListener.class); + } eventDispatchers.remove(eventDispatcher); } }