From 823419761f04c58a1555e8cd60fdfd73987a4ae1 Mon Sep 17 00:00:00 2001 From: tonihei Date: Wed, 15 Apr 2020 09:07:03 +0100 Subject: [PATCH] Allow custom playback session id generator. This allows users to inject their own session id logic. PiperOrigin-RevId: 306597785 --- .../DefaultPlaybackSessionManager.java | 27 ++++++++++++++++--- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/library/core/src/main/java/com/google/android/exoplayer2/analytics/DefaultPlaybackSessionManager.java b/library/core/src/main/java/com/google/android/exoplayer2/analytics/DefaultPlaybackSessionManager.java index cede01e199..e9baef37ba 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/analytics/DefaultPlaybackSessionManager.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/analytics/DefaultPlaybackSessionManager.java @@ -24,6 +24,7 @@ import com.google.android.exoplayer2.Timeline; import com.google.android.exoplayer2.analytics.AnalyticsListener.EventTime; import com.google.android.exoplayer2.source.MediaSource.MediaPeriodId; import com.google.android.exoplayer2.util.Assertions; +import com.google.android.exoplayer2.util.Supplier; import com.google.android.exoplayer2.util.Util; import java.util.HashMap; import java.util.Iterator; @@ -34,23 +35,41 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; * Default {@link PlaybackSessionManager} which instantiates a new session for each window in the * timeline and also for each ad within the windows. * - *

Sessions are identified by Base64-encoded, URL-safe, random strings. + *

By default, sessions are identified by Base64-encoded, URL-safe, random strings. */ public final class DefaultPlaybackSessionManager implements PlaybackSessionManager { + /** Default generator for unique session ids that are random, Based64-encoded and URL-safe. */ + public static final Supplier DEFAULT_SESSION_ID_GENERATOR = + DefaultPlaybackSessionManager::generateDefaultSessionId; + private static final Random RANDOM = new Random(); private static final int SESSION_ID_LENGTH = 12; private final Timeline.Window window; private final Timeline.Period period; private final HashMap sessions; + private final Supplier sessionIdGenerator; private @MonotonicNonNull Listener listener; private Timeline currentTimeline; @Nullable private String currentSessionId; - /** Creates session manager. */ + /** + * Creates session manager with a {@link #DEFAULT_SESSION_ID_GENERATOR} to generate session ids. + */ public DefaultPlaybackSessionManager() { + this(DEFAULT_SESSION_ID_GENERATOR); + } + + /** + * Creates session manager. + * + * @param sessionIdGenerator A generator for new session ids. All generated session ids must be + * unique. + */ + public DefaultPlaybackSessionManager(Supplier sessionIdGenerator) { + this.sessionIdGenerator = sessionIdGenerator; window = new Timeline.Window(); period = new Timeline.Period(); sessions = new HashMap<>(); @@ -207,14 +226,14 @@ public final class DefaultPlaybackSessionManager implements PlaybackSessionManag } } if (bestMatch == null) { - String sessionId = generateSessionId(); + String sessionId = sessionIdGenerator.get(); bestMatch = new SessionDescriptor(sessionId, windowIndex, mediaPeriodId); sessions.put(sessionId, bestMatch); } return bestMatch; } - private static String generateSessionId() { + private static String generateDefaultSessionId() { byte[] randomBytes = new byte[SESSION_ID_LENGTH]; RANDOM.nextBytes(randomBytes); return Base64.encodeToString(randomBytes, Base64.URL_SAFE | Base64.NO_WRAP);