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.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<FrameworkMediaCrypto> drmSessionManager = null;
DefaultDrmSessionManager<FrameworkMediaCrypto> 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<FrameworkMediaCrypto> buildDrmSessionManagerV18(UUID uuid,
String licenseUrl, String[] keyRequestPropertiesArray, boolean multiSession)
private DefaultDrmSessionManager<FrameworkMediaCrypto> 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<FrameworkMediaCrypto> 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 {

View File

@ -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));
}