From 03a36ce6bae8ec00d19bb7386a4b87a882434f33 Mon Sep 17 00:00:00 2001 From: olly Date: Fri, 6 Apr 2018 08:45:04 -0700 Subject: [PATCH] Fix NPE cause by demo app adding null listener to drm manager Also added an assertion to the DRM event dispatcher to cause immediate failure when this happens. This is consistent with the assertion in the equivalent MediaSource class. ------------- Created by MOE: https://github.com/google/moe MOE_MIGRATED_REVID=191892735 --- .../exoplayer2/demo/PlayerActivity.java | 24 ++++++++++--------- .../drm/DefaultDrmSessionEventListener.java | 2 ++ 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/demos/main/src/main/java/com/google/android/exoplayer2/demo/PlayerActivity.java b/demos/main/src/main/java/com/google/android/exoplayer2/demo/PlayerActivity.java index d462ab72d9..562ba7919a 100644 --- a/demos/main/src/main/java/com/google/android/exoplayer2/demo/PlayerActivity.java +++ b/demos/main/src/main/java/com/google/android/exoplayer2/demo/PlayerActivity.java @@ -42,7 +42,6 @@ import com.google.android.exoplayer2.PlaybackPreparer; import com.google.android.exoplayer2.Player; import com.google.android.exoplayer2.SimpleExoPlayer; import com.google.android.exoplayer2.drm.DefaultDrmSessionManager; -import com.google.android.exoplayer2.drm.DrmSessionManager; import com.google.android.exoplayer2.drm.FrameworkMediaCrypto; import com.google.android.exoplayer2.drm.FrameworkMediaDrm; import com.google.android.exoplayer2.drm.HttpMediaDrmCallback; @@ -120,7 +119,6 @@ public class PlayerActivity extends Activity } private Handler mainHandler; - private EventLogger eventLogger; private PlayerView playerView; private LinearLayout debugRootView; private TextView debugTextView; @@ -296,7 +294,7 @@ public class PlayerActivity extends Activity return; } - DrmSessionManager drmSessionManager = null; + DefaultDrmSessionManager drmSessionManager = null; if (intent.hasExtra(DRM_SCHEME_EXTRA) || intent.hasExtra(DRM_SCHEME_UUID_EXTRA)) { String drmLicenseUrl = intent.getStringExtra(DRM_LICENSE_URL); String[] keyRequestPropertiesArray = intent.getStringArrayExtra(DRM_KEY_REQUEST_PROPERTIES); @@ -341,17 +339,21 @@ public class PlayerActivity extends Activity trackSelector = new DefaultTrackSelector(adaptiveTrackSelectionFactory); trackSelectionHelper = new TrackSelectionHelper(trackSelector, adaptiveTrackSelectionFactory); lastSeenTrackGroupArray = null; - eventLogger = new EventLogger(trackSelector); player = ExoPlayerFactory.newSimpleInstance(renderersFactory, trackSelector, drmSessionManager); player.addListener(new PlayerEventListener()); + + EventLogger eventLogger = new EventLogger(trackSelector); player.addListener(eventLogger); player.addMetadataOutput(eventLogger); player.addAudioDebugListener(eventLogger); player.addVideoDebugListener(eventLogger); - player.setPlayWhenReady(shouldAutoPlay); + if (drmSessionManager != null) { + drmSessionManager.addListener(mainHandler, eventLogger); + } + player.setPlayWhenReady(shouldAutoPlay); playerView.setPlayer(player); playerView.setPlaybackPreparer(this); debugViewHelper = new DebugTextViewHelper(player, debugTextView); @@ -372,7 +374,8 @@ public class PlayerActivity extends Activity releaseAdsLoader(); loadedAdTagUri = adTagUri; } - MediaSource adsMediaSource = createAdsMediaSource(mediaSource, Uri.parse(adTagUriString)); + MediaSource adsMediaSource = + createAdsMediaSource(mediaSource, Uri.parse(adTagUriString), eventLogger); if (adsMediaSource != null) { mediaSource = adsMediaSource; } else { @@ -426,8 +429,8 @@ public class PlayerActivity extends Activity } } - private DrmSessionManager buildDrmSessionManagerV18(UUID uuid, - String licenseUrl, String[] keyRequestPropertiesArray, boolean multiSession) + private DefaultDrmSessionManager buildDrmSessionManagerV18( + UUID uuid, String licenseUrl, String[] keyRequestPropertiesArray, boolean multiSession) throws UnsupportedDrmException { HttpMediaDrmCallback drmCallback = new HttpMediaDrmCallback(licenseUrl, buildHttpDataSourceFactory(false)); @@ -440,7 +443,6 @@ public class PlayerActivity extends Activity DefaultDrmSessionManager drmSessionManager = new DefaultDrmSessionManager<>( uuid, FrameworkMediaDrm.newInstance(uuid), drmCallback, null, multiSession); - drmSessionManager.addListener(mainHandler, eventLogger); return drmSessionManager; } @@ -455,7 +457,6 @@ public class PlayerActivity extends Activity mediaSource = null; trackSelector = null; trackSelectionHelper = null; - eventLogger = null; } } @@ -494,7 +495,8 @@ public class PlayerActivity extends Activity } /** Returns an ads media source, reusing the ads loader if one exists. */ - private @Nullable MediaSource createAdsMediaSource(MediaSource mediaSource, Uri adTagUri) { + private @Nullable MediaSource createAdsMediaSource( + MediaSource mediaSource, Uri adTagUri, EventLogger eventLogger) { // Load the extension source using reflection so the demo app doesn't have to depend on it. // The ads loader is reused for multiple playbacks, so that ad playback can resume. try { 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 8a060c5db7..7cdee7c537 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 @@ -17,6 +17,7 @@ package com.google.android.exoplayer2.drm; import android.os.Handler; import com.google.android.exoplayer2.Player; +import com.google.android.exoplayer2.util.Assertions; import java.util.concurrent.CopyOnWriteArrayList; /** Listener of {@link DefaultDrmSessionManager} events. */ @@ -57,6 +58,7 @@ public interface DefaultDrmSessionEventListener { /** Adds listener to event dispatcher. */ public void addListener(Handler handler, DefaultDrmSessionEventListener eventListener) { + Assertions.checkArgument(handler != null && eventListener != null); listeners.add(new HandlerAndListener(handler, eventListener)); }