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
This commit is contained in:
olly 2018-04-06 08:45:04 -07:00 committed by Oliver Woodman
parent f5b568fc7d
commit 03a36ce6ba
2 changed files with 15 additions and 11 deletions

View File

@ -42,7 +42,6 @@ import com.google.android.exoplayer2.PlaybackPreparer;
import com.google.android.exoplayer2.Player; import com.google.android.exoplayer2.Player;
import com.google.android.exoplayer2.SimpleExoPlayer; import com.google.android.exoplayer2.SimpleExoPlayer;
import com.google.android.exoplayer2.drm.DefaultDrmSessionManager; 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.FrameworkMediaCrypto;
import com.google.android.exoplayer2.drm.FrameworkMediaDrm; import com.google.android.exoplayer2.drm.FrameworkMediaDrm;
import com.google.android.exoplayer2.drm.HttpMediaDrmCallback; import com.google.android.exoplayer2.drm.HttpMediaDrmCallback;
@ -120,7 +119,6 @@ public class PlayerActivity extends Activity
} }
private Handler mainHandler; private Handler mainHandler;
private EventLogger eventLogger;
private PlayerView playerView; private PlayerView playerView;
private LinearLayout debugRootView; private LinearLayout debugRootView;
private TextView debugTextView; private TextView debugTextView;
@ -296,7 +294,7 @@ public class PlayerActivity extends Activity
return; return;
} }
DrmSessionManager<FrameworkMediaCrypto> drmSessionManager = null; DefaultDrmSessionManager<FrameworkMediaCrypto> drmSessionManager = null;
if (intent.hasExtra(DRM_SCHEME_EXTRA) || intent.hasExtra(DRM_SCHEME_UUID_EXTRA)) { if (intent.hasExtra(DRM_SCHEME_EXTRA) || intent.hasExtra(DRM_SCHEME_UUID_EXTRA)) {
String drmLicenseUrl = intent.getStringExtra(DRM_LICENSE_URL); String drmLicenseUrl = intent.getStringExtra(DRM_LICENSE_URL);
String[] keyRequestPropertiesArray = intent.getStringArrayExtra(DRM_KEY_REQUEST_PROPERTIES); String[] keyRequestPropertiesArray = intent.getStringArrayExtra(DRM_KEY_REQUEST_PROPERTIES);
@ -341,17 +339,21 @@ public class PlayerActivity extends Activity
trackSelector = new DefaultTrackSelector(adaptiveTrackSelectionFactory); trackSelector = new DefaultTrackSelector(adaptiveTrackSelectionFactory);
trackSelectionHelper = new TrackSelectionHelper(trackSelector, adaptiveTrackSelectionFactory); trackSelectionHelper = new TrackSelectionHelper(trackSelector, adaptiveTrackSelectionFactory);
lastSeenTrackGroupArray = null; lastSeenTrackGroupArray = null;
eventLogger = new EventLogger(trackSelector);
player = player =
ExoPlayerFactory.newSimpleInstance(renderersFactory, trackSelector, drmSessionManager); ExoPlayerFactory.newSimpleInstance(renderersFactory, trackSelector, drmSessionManager);
player.addListener(new PlayerEventListener()); player.addListener(new PlayerEventListener());
EventLogger eventLogger = new EventLogger(trackSelector);
player.addListener(eventLogger); player.addListener(eventLogger);
player.addMetadataOutput(eventLogger); player.addMetadataOutput(eventLogger);
player.addAudioDebugListener(eventLogger); player.addAudioDebugListener(eventLogger);
player.addVideoDebugListener(eventLogger); player.addVideoDebugListener(eventLogger);
player.setPlayWhenReady(shouldAutoPlay); if (drmSessionManager != null) {
drmSessionManager.addListener(mainHandler, eventLogger);
}
player.setPlayWhenReady(shouldAutoPlay);
playerView.setPlayer(player); playerView.setPlayer(player);
playerView.setPlaybackPreparer(this); playerView.setPlaybackPreparer(this);
debugViewHelper = new DebugTextViewHelper(player, debugTextView); debugViewHelper = new DebugTextViewHelper(player, debugTextView);
@ -372,7 +374,8 @@ public class PlayerActivity extends Activity
releaseAdsLoader(); releaseAdsLoader();
loadedAdTagUri = adTagUri; loadedAdTagUri = adTagUri;
} }
MediaSource adsMediaSource = createAdsMediaSource(mediaSource, Uri.parse(adTagUriString)); MediaSource adsMediaSource =
createAdsMediaSource(mediaSource, Uri.parse(adTagUriString), eventLogger);
if (adsMediaSource != null) { if (adsMediaSource != null) {
mediaSource = adsMediaSource; mediaSource = adsMediaSource;
} else { } else {
@ -426,8 +429,8 @@ public class PlayerActivity extends Activity
} }
} }
private DrmSessionManager<FrameworkMediaCrypto> buildDrmSessionManagerV18(UUID uuid, private DefaultDrmSessionManager<FrameworkMediaCrypto> buildDrmSessionManagerV18(
String licenseUrl, String[] keyRequestPropertiesArray, boolean multiSession) UUID uuid, String licenseUrl, String[] keyRequestPropertiesArray, boolean multiSession)
throws UnsupportedDrmException { throws UnsupportedDrmException {
HttpMediaDrmCallback drmCallback = new HttpMediaDrmCallback(licenseUrl, HttpMediaDrmCallback drmCallback = new HttpMediaDrmCallback(licenseUrl,
buildHttpDataSourceFactory(false)); buildHttpDataSourceFactory(false));
@ -440,7 +443,6 @@ public class PlayerActivity extends Activity
DefaultDrmSessionManager<FrameworkMediaCrypto> drmSessionManager = DefaultDrmSessionManager<FrameworkMediaCrypto> drmSessionManager =
new DefaultDrmSessionManager<>( new DefaultDrmSessionManager<>(
uuid, FrameworkMediaDrm.newInstance(uuid), drmCallback, null, multiSession); uuid, FrameworkMediaDrm.newInstance(uuid), drmCallback, null, multiSession);
drmSessionManager.addListener(mainHandler, eventLogger);
return drmSessionManager; return drmSessionManager;
} }
@ -455,7 +457,6 @@ public class PlayerActivity extends Activity
mediaSource = null; mediaSource = null;
trackSelector = null; trackSelector = null;
trackSelectionHelper = 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. */ /** 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. // 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. // The ads loader is reused for multiple playbacks, so that ad playback can resume.
try { try {

View File

@ -17,6 +17,7 @@ package com.google.android.exoplayer2.drm;
import android.os.Handler; import android.os.Handler;
import com.google.android.exoplayer2.Player; import com.google.android.exoplayer2.Player;
import com.google.android.exoplayer2.util.Assertions;
import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.CopyOnWriteArrayList;
/** Listener of {@link DefaultDrmSessionManager} events. */ /** Listener of {@link DefaultDrmSessionManager} events. */
@ -57,6 +58,7 @@ public interface DefaultDrmSessionEventListener {
/** Adds listener to event dispatcher. */ /** Adds listener to event dispatcher. */
public void addListener(Handler handler, DefaultDrmSessionEventListener eventListener) { public void addListener(Handler handler, DefaultDrmSessionEventListener eventListener) {
Assertions.checkArgument(handler != null && eventListener != null);
listeners.add(new HandlerAndListener(handler, eventListener)); listeners.add(new HandlerAndListener(handler, eventListener));
} }