diff --git a/demos/main/src/main/java/com/google/android/exoplayer2/demo/IntentUtil.java b/demos/main/src/main/java/com/google/android/exoplayer2/demo/IntentUtil.java index 55f376166b..93637ce271 100644 --- a/demos/main/src/main/java/com/google/android/exoplayer2/demo/IntentUtil.java +++ b/demos/main/src/main/java/com/google/android/exoplayer2/demo/IntentUtil.java @@ -178,7 +178,7 @@ public class IntentUtil { headers.put(keyRequestPropertiesArray[i], keyRequestPropertiesArray[i + 1]); } } - @Nullable UUID drmUuid = Util.getDrmUuid(Util.castNonNull(drmSchemeExtra)); + @Nullable UUID drmUuid = Util.getDrmUuid(drmSchemeExtra); if (drmUuid != null) { builder.setDrmConfiguration( new MediaItem.DrmConfiguration.Builder(drmUuid) 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 baf9fa305b..9f26e31050 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 @@ -90,7 +90,12 @@ public class PlayerActivity extends AppCompatActivity // For ad playback only. @Nullable private AdsLoader clientSideAdsLoader; + + // TODO: Annotate this and serverSideAdsLoaderState below with @OptIn when it can be applied to + // fields (needs http://r.android.com/2004032 to be released into a version of + // androidx.annotation:annotation-experimental). @Nullable private ImaServerSideAdInsertionMediaSource.AdsLoader serverSideAdsLoader; + private ImaServerSideAdInsertionMediaSource.AdsLoader.@MonotonicNonNull State serverSideAdsLoaderState; @@ -119,12 +124,7 @@ public class PlayerActivity extends AppCompatActivity startAutoPlay = savedInstanceState.getBoolean(KEY_AUTO_PLAY); startItemIndex = savedInstanceState.getInt(KEY_ITEM_INDEX); startPosition = savedInstanceState.getLong(KEY_POSITION); - Bundle adsLoaderStateBundle = savedInstanceState.getBundle(KEY_SERVER_SIDE_ADS_LOADER_STATE); - if (adsLoaderStateBundle != null) { - serverSideAdsLoaderState = - ImaServerSideAdInsertionMediaSource.AdsLoader.State.CREATOR.fromBundle( - adsLoaderStateBundle); - } + restoreServerSideAdsLoaderState(savedInstanceState); } else { trackSelectionParameters = new TrackSelectionParameters.Builder(/* context= */ this).build(); clearStartPosition(); @@ -216,9 +216,7 @@ public class PlayerActivity extends AppCompatActivity outState.putBoolean(KEY_AUTO_PLAY, startAutoPlay); outState.putInt(KEY_ITEM_INDEX, startItemIndex); outState.putLong(KEY_POSITION, startPosition); - if (serverSideAdsLoaderState != null) { - outState.putBundle(KEY_SERVER_SIDE_ADS_LOADER_STATE, serverSideAdsLoaderState.toBundle()); - } + saveServerSideAdsLoaderState(outState); } // Activity input @@ -270,24 +268,20 @@ public class PlayerActivity extends AppCompatActivity return false; } - boolean preferExtensionDecoders = - intent.getBooleanExtra(IntentUtil.PREFER_EXTENSION_DECODERS_EXTRA, false); - RenderersFactory renderersFactory = - DemoUtil.buildRenderersFactory(/* context= */ this, preferExtensionDecoders); - lastSeenTracks = Tracks.EMPTY; - player = + ExoPlayer.Builder playerBuilder = new ExoPlayer.Builder(/* context= */ this) - .setRenderersFactory(renderersFactory) - .setMediaSourceFactory(createMediaSourceFactory()) - .build(); + .setMediaSourceFactory(createMediaSourceFactory()); + setRenderersFactory( + playerBuilder, intent.getBooleanExtra(IntentUtil.PREFER_EXTENSION_DECODERS_EXTRA, false)); + player = playerBuilder.build(); player.setTrackSelectionParameters(trackSelectionParameters); player.addListener(new PlayerEventListener()); player.addAnalyticsListener(new EventLogger()); player.setAudioAttributes(AudioAttributes.DEFAULT, /* handleAudioFocus= */ true); player.setPlayWhenReady(startAutoPlay); playerView.setPlayer(player); - serverSideAdsLoader.setPlayer(player); + configurePlayerWithServerSideAdsLoader(); debugViewHelper = new DebugTextViewHelper(player, debugTextView); debugViewHelper.start(); } @@ -322,6 +316,17 @@ public class PlayerActivity extends AppCompatActivity .setServerSideAdInsertionMediaSourceFactory(imaServerSideAdInsertionMediaSourceFactory); } + private void setRenderersFactory( + ExoPlayer.Builder playerBuilder, boolean preferExtensionDecoders) { + RenderersFactory renderersFactory = + DemoUtil.buildRenderersFactory(/* context= */ this, preferExtensionDecoders); + playerBuilder.setRenderersFactory(renderersFactory); + } + + private void configurePlayerWithServerSideAdsLoader() { + serverSideAdsLoader.setPlayer(player); + } + private List createMediaItems(Intent intent) { String action = intent.getAction(); boolean actionIsListView = IntentUtil.ACTION_VIEW_LIST.equals(action); @@ -375,8 +380,7 @@ public class PlayerActivity extends AppCompatActivity if (player != null) { updateTrackSelectorParameters(); updateStartPosition(); - serverSideAdsLoaderState = serverSideAdsLoader.release(); - serverSideAdsLoader = null; + releaseServerSideAdsLoader(); debugViewHelper.stop(); debugViewHelper = null; player.release(); @@ -391,6 +395,11 @@ public class PlayerActivity extends AppCompatActivity } } + private void releaseServerSideAdsLoader() { + serverSideAdsLoaderState = serverSideAdsLoader.release(); + serverSideAdsLoader = null; + } + private void releaseClientSideAdsLoader() { if (clientSideAdsLoader != null) { clientSideAdsLoader.release(); @@ -399,6 +408,21 @@ public class PlayerActivity extends AppCompatActivity } } + private void saveServerSideAdsLoaderState(Bundle outState) { + if (serverSideAdsLoaderState != null) { + outState.putBundle(KEY_SERVER_SIDE_ADS_LOADER_STATE, serverSideAdsLoaderState.toBundle()); + } + } + + private void restoreServerSideAdsLoaderState(Bundle savedInstanceState) { + Bundle adsLoaderStateBundle = savedInstanceState.getBundle(KEY_SERVER_SIDE_ADS_LOADER_STATE); + if (adsLoaderStateBundle != null) { + serverSideAdsLoaderState = + ImaServerSideAdInsertionMediaSource.AdsLoader.State.CREATOR.fromBundle( + adsLoaderStateBundle); + } + } + private void updateTrackSelectorParameters() { if (player != null) { trackSelectionParameters = player.getTrackSelectionParameters();