From 3a802eb06c7a3bee9e8477015a857a4ca7bcc005 Mon Sep 17 00:00:00 2001 From: tonihei Date: Mon, 3 Sep 2018 02:43:29 -0700 Subject: [PATCH] Add onDrmSessionAcquired and onDrmSessionReleased callbacks. To report DRM session metrics in the future as part of the listener, we need a callback at the end of the drm session to get the final metric state. For completion, the session acquired callback is also added. ------------- Created by MOE: https://github.com/google/moe MOE_MIGRATED_REVID=211328412 --- RELEASENOTES.md | 2 ++ .../exoplayer2/analytics/AnalyticsCollector.java | 16 ++++++++++++++++ .../exoplayer2/analytics/AnalyticsListener.java | 14 ++++++++++++++ .../exoplayer2/drm/DefaultDrmSession.java | 2 ++ .../drm/DefaultDrmSessionEventListener.java | 6 ++++++ .../android/exoplayer2/util/EventLogger.java | 10 ++++++++++ .../analytics/AnalyticsCollectorTest.java | 12 ++++++++++++ 7 files changed, 62 insertions(+) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index a2f10e90db..9ab68c92a8 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -136,6 +136,8 @@ * Prevent potential issues when reporting events for multi-period media sources ([#4492](https://github.com/google/ExoPlayer/issues/4492) and [#4634](https://github.com/google/ExoPlayer/issues/4634)). +* Add callbacks to `DefaultDrmSessionEventListener` and `AnalyticsListener` to + get notified of acquired and released DRM sessions. ### 2.8.4 ### diff --git a/library/core/src/main/java/com/google/android/exoplayer2/analytics/AnalyticsCollector.java b/library/core/src/main/java/com/google/android/exoplayer2/analytics/AnalyticsCollector.java index 3b6abaa4ef..924e5c2ed8 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/analytics/AnalyticsCollector.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/analytics/AnalyticsCollector.java @@ -534,6 +534,14 @@ public class AnalyticsCollector // DefaultDrmSessionManager.EventListener implementation. + @Override + public final void onDrmSessionAcquired() { + EventTime eventTime = generateReadingMediaPeriodEventTime(); + for (AnalyticsListener listener : listeners) { + listener.onDrmSessionAcquired(eventTime); + } + } + @Override public final void onDrmKeysLoaded() { EventTime eventTime = generateReadingMediaPeriodEventTime(); @@ -566,6 +574,14 @@ public class AnalyticsCollector } } + @Override + public final void onDrmSessionReleased() { + EventTime eventTime = generateLastReportedPlayingMediaPeriodEventTime(); + for (AnalyticsListener listener : listeners) { + listener.onDrmSessionReleased(eventTime); + } + } + // Internal methods. /** Returns read-only set of registered listeners. */ diff --git a/library/core/src/main/java/com/google/android/exoplayer2/analytics/AnalyticsListener.java b/library/core/src/main/java/com/google/android/exoplayer2/analytics/AnalyticsListener.java index adc4b3cdb9..7603f4d97c 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/analytics/AnalyticsListener.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/analytics/AnalyticsListener.java @@ -450,6 +450,13 @@ public interface AnalyticsListener { */ default void onRenderedFirstFrame(EventTime eventTime, Surface surface) {} + /** + * Called each time a drm session is acquired. + * + * @param eventTime The event time. + */ + default void onDrmSessionAcquired(EventTime eventTime) {} + /** * Called each time drm keys are loaded. * @@ -479,4 +486,11 @@ public interface AnalyticsListener { * @param eventTime The event time. */ default void onDrmKeysRemoved(EventTime eventTime) {} + + /** + * Called each time a drm session is released. + * + * @param eventTime The event time. + */ + default void onDrmSessionReleased(EventTime eventTime) {} } 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 0ce69808ab..c63b846cb2 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 @@ -184,6 +184,7 @@ import java.util.UUID; if (sessionId != null) { mediaDrm.closeSession(sessionId); sessionId = null; + eventDispatcher.dispatch(DefaultDrmSessionEventListener::onDrmSessionReleased); } return true; } @@ -279,6 +280,7 @@ import java.util.UUID; try { sessionId = mediaDrm.openSession(); + eventDispatcher.dispatch(DefaultDrmSessionEventListener::onDrmSessionAcquired); mediaCrypto = mediaDrm.createMediaCrypto(sessionId); state = STATE_OPENED; return true; diff --git a/library/core/src/main/java/com/google/android/exoplayer2/drm/DefaultDrmSessionEventListener.java b/library/core/src/main/java/com/google/android/exoplayer2/drm/DefaultDrmSessionEventListener.java index afec4b6114..fa5b60e66e 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/drm/DefaultDrmSessionEventListener.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/drm/DefaultDrmSessionEventListener.java @@ -20,6 +20,9 @@ import com.google.android.exoplayer2.Player; /** Listener of {@link DefaultDrmSessionManager} events. */ public interface DefaultDrmSessionEventListener { + /** Called each time a drm session is acquired. */ + default void onDrmSessionAcquired() {} + /** Called each time keys are loaded. */ void onDrmKeysLoaded(); @@ -42,4 +45,7 @@ public interface DefaultDrmSessionEventListener { /** Called each time offline keys are removed. */ void onDrmKeysRemoved(); + + /** Called each time a drm session is released. */ + default void onDrmSessionReleased() {} } diff --git a/library/core/src/main/java/com/google/android/exoplayer2/util/EventLogger.java b/library/core/src/main/java/com/google/android/exoplayer2/util/EventLogger.java index 626464ec69..0861e706b5 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/util/EventLogger.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/util/EventLogger.java @@ -390,6 +390,11 @@ public class EventLogger implements AnalyticsListener { logd(eventTime, "downstreamFormatChanged", Format.toLogString(mediaLoadData.trackFormat)); } + @Override + public void onDrmSessionAcquired(EventTime eventTime) { + logd(eventTime, "drmSessionAcquired"); + } + @Override public void onDrmSessionManagerError(EventTime eventTime, Exception e) { printInternalError(eventTime, "drmSessionManagerError", e); @@ -410,6 +415,11 @@ public class EventLogger implements AnalyticsListener { logd(eventTime, "drmKeysLoaded"); } + @Override + public void onDrmSessionReleased(EventTime eventTime) { + logd(eventTime, "drmSessionReleased"); + } + /** * Logs a debug message. * diff --git a/library/core/src/test/java/com/google/android/exoplayer2/analytics/AnalyticsCollectorTest.java b/library/core/src/test/java/com/google/android/exoplayer2/analytics/AnalyticsCollectorTest.java index 64274e3704..e0feae6f49 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/analytics/AnalyticsCollectorTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/analytics/AnalyticsCollectorTest.java @@ -101,6 +101,8 @@ public final class AnalyticsCollectorTest { private static final int EVENT_DRM_ERROR = 34; private static final int EVENT_DRM_KEYS_RESTORED = 35; private static final int EVENT_DRM_KEYS_REMOVED = 36; + private static final int EVENT_DRM_SESSION_ACQUIRED = 37; + private static final int EVENT_DRM_SESSION_RELEASED = 38; private static final int TIMEOUT_MS = 10000; private static final Timeline SINGLE_PERIOD_TIMELINE = new FakeTimeline(/* windowCount= */ 1); @@ -1091,6 +1093,11 @@ public final class AnalyticsCollectorTest { reportedEvents.add(new ReportedEvent(EVENT_RENDERED_FIRST_FRAME, eventTime)); } + @Override + public void onDrmSessionAcquired(EventTime eventTime) { + reportedEvents.add(new ReportedEvent(EVENT_DRM_SESSION_ACQUIRED, eventTime)); + } + @Override public void onDrmKeysLoaded(EventTime eventTime) { reportedEvents.add(new ReportedEvent(EVENT_DRM_KEYS_LOADED, eventTime)); @@ -1111,6 +1118,11 @@ public final class AnalyticsCollectorTest { reportedEvents.add(new ReportedEvent(EVENT_DRM_KEYS_REMOVED, eventTime)); } + @Override + public void onDrmSessionReleased(EventTime eventTime) { + reportedEvents.add(new ReportedEvent(EVENT_DRM_SESSION_RELEASED, eventTime)); + } + private static final class ReportedEvent { public final int eventType;