diff --git a/demos/cast/src/main/java/com/google/android/exoplayer2/castdemo/PlayerManager.java b/demos/cast/src/main/java/com/google/android/exoplayer2/castdemo/PlayerManager.java index 70c4831bc5..9956cc827b 100644 --- a/demos/cast/src/main/java/com/google/android/exoplayer2/castdemo/PlayerManager.java +++ b/demos/cast/src/main/java/com/google/android/exoplayer2/castdemo/PlayerManager.java @@ -79,8 +79,8 @@ import java.util.ArrayList; private final CastPlayer castPlayer; private final ArrayList mediaQueue; private final QueuePositionListener queuePositionListener; + private final ConcatenatingMediaSource concatenatingMediaSource; - private ConcatenatingMediaSource concatenatingMediaSource; private boolean castMediaQueueCreationPending; private int currentItemIndex; private Player currentPlayer; @@ -116,6 +116,7 @@ import java.util.ArrayList; this.castControlView = castControlView; mediaQueue = new ArrayList<>(); currentItemIndex = C.INDEX_UNSET; + concatenatingMediaSource = new ConcatenatingMediaSource(); DefaultTrackSelector trackSelector = new DefaultTrackSelector(BANDWIDTH_METER); RenderersFactory renderersFactory = new DefaultRenderersFactory(context, null); @@ -154,9 +155,8 @@ import java.util.ArrayList; */ public void addItem(Sample sample) { mediaQueue.add(sample); - if (currentPlayer == exoPlayer) { - concatenatingMediaSource.addMediaSource(buildMediaSource(sample)); - } else { + concatenatingMediaSource.addMediaSource(buildMediaSource(sample)); + if (currentPlayer == castPlayer) { castPlayer.addItems(buildMediaQueueItem(sample)); } } @@ -185,9 +185,8 @@ import java.util.ArrayList; * @return Whether the removal was successful. */ public boolean removeItem(int itemIndex) { - if (currentPlayer == exoPlayer) { - concatenatingMediaSource.removeMediaSource(itemIndex); - } else { + concatenatingMediaSource.removeMediaSource(itemIndex); + if (currentPlayer == castPlayer) { if (castPlayer.getPlaybackState() != Player.STATE_IDLE) { Timeline castTimeline = castPlayer.getCurrentTimeline(); if (castTimeline.getPeriodCount() <= itemIndex) { @@ -214,9 +213,8 @@ import java.util.ArrayList; */ public boolean moveItem(int fromIndex, int toIndex) { // Player update. - if (currentPlayer == exoPlayer) { - concatenatingMediaSource.moveMediaSource(fromIndex, toIndex); - } else if (castPlayer.getPlaybackState() != Player.STATE_IDLE) { + concatenatingMediaSource.moveMediaSource(fromIndex, toIndex); + if (currentPlayer == castPlayer && castPlayer.getPlaybackState() != Player.STATE_IDLE) { Timeline castTimeline = castPlayer.getCurrentTimeline(); int periodCount = castTimeline.getPeriodCount(); if (periodCount <= fromIndex || periodCount <= toIndex) { @@ -262,6 +260,7 @@ import java.util.ArrayList; public void release() { currentItemIndex = C.INDEX_UNSET; mediaQueue.clear(); + concatenatingMediaSource.clear(); castPlayer.setSessionAvailabilityListener(null); castPlayer.release(); localPlayerView.setPlayer(null); @@ -349,10 +348,6 @@ import java.util.ArrayList; // Media queue management. castMediaQueueCreationPending = currentPlayer == castPlayer; if (currentPlayer == exoPlayer) { - concatenatingMediaSource = new ConcatenatingMediaSource(); - for (int i = 0; i < mediaQueue.size(); i++) { - concatenatingMediaSource.addMediaSource(buildMediaSource(mediaQueue.get(i))); - } exoPlayer.prepare(concatenatingMediaSource); } 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 e91feaa291..97b1eb8269 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 @@ -118,6 +118,7 @@ public class PlayerActivity extends Activity private DataSource.Factory mediaDataSourceFactory; private SimpleExoPlayer player; + private MediaSource mediaSource; private DefaultTrackSelector trackSelector; private TrackSelectionHelper trackSelectionHelper; private DebugTextViewHelper debugViewHelper; @@ -253,9 +254,8 @@ public class PlayerActivity extends Activity // Internal methods private void initializePlayer() { - Intent intent = getIntent(); - boolean needNewPlayer = player == null; - if (needNewPlayer) { + if (player == null) { + Intent intent = getIntent(); TrackSelection.Factory adaptiveTrackSelectionFactory = new AdaptiveTrackSelection.Factory(BANDWIDTH_METER); trackSelector = new DefaultTrackSelector(adaptiveTrackSelectionFactory); @@ -315,52 +315,53 @@ public class PlayerActivity extends Activity playerView.setPlaybackPreparer(this); debugViewHelper = new DebugTextViewHelper(player, debugTextView); debugViewHelper.start(); - } - String action = intent.getAction(); - Uri[] uris; - String[] extensions; - if (ACTION_VIEW.equals(action)) { - uris = new Uri[]{intent.getData()}; - extensions = new String[]{intent.getStringExtra(EXTENSION_EXTRA)}; - } else if (ACTION_VIEW_LIST.equals(action)) { - String[] uriStrings = intent.getStringArrayExtra(URI_LIST_EXTRA); - uris = new Uri[uriStrings.length]; - for (int i = 0; i < uriStrings.length; i++) { - uris[i] = Uri.parse(uriStrings[i]); - } - extensions = intent.getStringArrayExtra(EXTENSION_LIST_EXTRA); - if (extensions == null) { - extensions = new String[uriStrings.length]; - } - } else { - showToast(getString(R.string.unexpected_intent_action, action)); - return; - } - if (Util.maybeRequestReadExternalStoragePermission(this, uris)) { - // The player will be reinitialized if the permission is granted. - return; - } - MediaSource[] mediaSources = new MediaSource[uris.length]; - for (int i = 0; i < uris.length; i++) { - mediaSources[i] = buildMediaSource(uris[i], extensions[i], mainHandler, eventLogger); - } - MediaSource mediaSource = mediaSources.length == 1 ? mediaSources[0] - : new ConcatenatingMediaSource(mediaSources); - String adTagUriString = intent.getStringExtra(AD_TAG_URI_EXTRA); - if (adTagUriString != null) { - Uri adTagUri = Uri.parse(adTagUriString); - if (!adTagUri.equals(loadedAdTagUri)) { - releaseAdsLoader(); - loadedAdTagUri = adTagUri; - } - MediaSource adsMediaSource = createAdsMediaSource(mediaSource, Uri.parse(adTagUriString)); - if (adsMediaSource != null) { - mediaSource = adsMediaSource; + + String action = intent.getAction(); + Uri[] uris; + String[] extensions; + if (ACTION_VIEW.equals(action)) { + uris = new Uri[] {intent.getData()}; + extensions = new String[] {intent.getStringExtra(EXTENSION_EXTRA)}; + } else if (ACTION_VIEW_LIST.equals(action)) { + String[] uriStrings = intent.getStringArrayExtra(URI_LIST_EXTRA); + uris = new Uri[uriStrings.length]; + for (int i = 0; i < uriStrings.length; i++) { + uris[i] = Uri.parse(uriStrings[i]); + } + extensions = intent.getStringArrayExtra(EXTENSION_LIST_EXTRA); + if (extensions == null) { + extensions = new String[uriStrings.length]; + } } else { - showToast(R.string.ima_not_loaded); + showToast(getString(R.string.unexpected_intent_action, action)); + return; + } + if (Util.maybeRequestReadExternalStoragePermission(this, uris)) { + // The player will be reinitialized if the permission is granted. + return; + } + MediaSource[] mediaSources = new MediaSource[uris.length]; + for (int i = 0; i < uris.length; i++) { + mediaSources[i] = buildMediaSource(uris[i], extensions[i], mainHandler, eventLogger); + } + mediaSource = + mediaSources.length == 1 ? mediaSources[0] : new ConcatenatingMediaSource(mediaSources); + String adTagUriString = intent.getStringExtra(AD_TAG_URI_EXTRA); + if (adTagUriString != null) { + Uri adTagUri = Uri.parse(adTagUriString); + if (!adTagUri.equals(loadedAdTagUri)) { + releaseAdsLoader(); + loadedAdTagUri = adTagUri; + } + MediaSource adsMediaSource = createAdsMediaSource(mediaSource, Uri.parse(adTagUriString)); + if (adsMediaSource != null) { + mediaSource = adsMediaSource; + } else { + showToast(R.string.ima_not_loaded); + } + } else { + releaseAdsLoader(); } - } else { - releaseAdsLoader(); } boolean haveResumePosition = resumeWindow != C.INDEX_UNSET; if (haveResumePosition) { @@ -424,6 +425,7 @@ public class PlayerActivity extends Activity updateResumePosition(); player.release(); player = null; + mediaSource = null; trackSelector = null; trackSelectionHelper = null; eventLogger = null;