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 03d816af75..2a0a3ceb6c 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
@@ -116,6 +116,12 @@ public class PlayerActivity extends Activity
// For backwards compatibility only.
private static final String DRM_SCHEME_UUID_EXTRA = "drm_scheme_uuid";
+ // Saved instance state keys.
+ private static final String KEY_TRACK_SELECTOR_PARAMETERS = "track_selector_parameters";
+ private static final String KEY_WINDOW = "window";
+ private static final String KEY_POSITION = "position";
+ private static final String KEY_AUTO_PLAY = "auto_play";
+
private static final DefaultBandwidthMeter BANDWIDTH_METER = new DefaultBandwidthMeter();
private static final CookieManager DEFAULT_COOKIE_MANAGER;
static {
@@ -132,14 +138,15 @@ public class PlayerActivity extends Activity
private SimpleExoPlayer player;
private MediaSource mediaSource;
private DefaultTrackSelector trackSelector;
+ private DefaultTrackSelector.Parameters trackSelectorParameters;
private TrackSelectionHelper trackSelectionHelper;
private DebugTextViewHelper debugViewHelper;
private boolean inErrorState;
private TrackGroupArray lastSeenTrackGroupArray;
- private boolean shouldAutoPlay;
- private int resumeWindow;
- private long resumePosition;
+ private boolean startAutoPlay;
+ private int startWindow;
+ private long startPosition;
// Fields used only for ad playback. The ads loader is loaded via reflection.
@@ -152,8 +159,6 @@ public class PlayerActivity extends Activity
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
- shouldAutoPlay = true;
- clearResumePosition();
mediaDataSourceFactory = buildDataSourceFactory(true);
mainHandler = new Handler();
if (CookieHandler.getDefault() != DEFAULT_COOKIE_MANAGER) {
@@ -169,13 +174,22 @@ public class PlayerActivity extends Activity
playerView = findViewById(R.id.player_view);
playerView.setControllerVisibilityListener(this);
playerView.requestFocus();
+
+ if (savedInstanceState != null) {
+ trackSelectorParameters = savedInstanceState.getParcelable(KEY_TRACK_SELECTOR_PARAMETERS);
+ startAutoPlay = savedInstanceState.getBoolean(KEY_AUTO_PLAY);
+ startWindow = savedInstanceState.getInt(KEY_WINDOW);
+ startPosition = savedInstanceState.getLong(KEY_POSITION);
+ } else {
+ trackSelectorParameters = new DefaultTrackSelector.ParametersBuilder().build();
+ clearStartPosition();
+ }
}
@Override
public void onNewIntent(Intent intent) {
releasePlayer();
- shouldAutoPlay = true;
- clearResumePosition();
+ clearStartPosition();
setIntent(intent);
}
@@ -233,6 +247,16 @@ public class PlayerActivity extends Activity
}
}
+ @Override
+ public void onSaveInstanceState(Bundle outState) {
+ updateTrackSelectorParameters();
+ updateStartPosition();
+ outState.putParcelable(KEY_TRACK_SELECTOR_PARAMETERS, trackSelectorParameters);
+ outState.putBoolean(KEY_AUTO_PLAY, startAutoPlay);
+ outState.putInt(KEY_WINDOW, startWindow);
+ outState.putLong(KEY_POSITION, startPosition);
+ }
+
// Activity input
@Override
@@ -365,6 +389,7 @@ public class PlayerActivity extends Activity
new DefaultRenderersFactory(this, extensionRendererMode);
trackSelector = new DefaultTrackSelector(trackSelectionFactory);
+ trackSelector.setParameters(trackSelectorParameters);
trackSelectionHelper = new TrackSelectionHelper(trackSelector);
lastSeenTrackGroupArray = null;
@@ -381,7 +406,7 @@ public class PlayerActivity extends Activity
drmSessionManager.addListener(mainHandler, eventLogger);
}
- player.setPlayWhenReady(shouldAutoPlay);
+ player.setPlayWhenReady(startAutoPlay);
playerView.setPlayer(player);
playerView.setPlaybackPreparer(this);
debugViewHelper = new DebugTextViewHelper(player, debugTextView);
@@ -421,11 +446,11 @@ public class PlayerActivity extends Activity
}
mediaSource.addEventListener(mainHandler, eventLogger);
}
- boolean haveResumePosition = resumeWindow != C.INDEX_UNSET;
- if (haveResumePosition) {
- player.seekTo(resumeWindow, resumePosition);
+ boolean haveStartPosition = startWindow != C.INDEX_UNSET;
+ if (haveStartPosition) {
+ player.seekTo(startWindow, startPosition);
}
- player.prepare(mediaSource, !haveResumePosition, false);
+ player.prepare(mediaSource, !haveStartPosition, false);
inErrorState = false;
updateButtonVisibilities();
}
@@ -483,10 +508,10 @@ public class PlayerActivity extends Activity
private void releasePlayer() {
if (player != null) {
+ updateTrackSelectorParameters();
+ updateStartPosition();
debugViewHelper.stop();
debugViewHelper = null;
- shouldAutoPlay = player.getPlayWhenReady();
- updateResumePosition();
player.release();
player = null;
mediaSource = null;
@@ -495,14 +520,24 @@ public class PlayerActivity extends Activity
}
}
- private void updateResumePosition() {
- resumeWindow = player.getCurrentWindowIndex();
- resumePosition = Math.max(0, player.getContentPosition());
+ private void updateTrackSelectorParameters() {
+ if (trackSelector != null) {
+ trackSelectorParameters = trackSelector.getParameters();
+ }
}
- private void clearResumePosition() {
- resumeWindow = C.INDEX_UNSET;
- resumePosition = C.TIME_UNSET;
+ private void updateStartPosition() {
+ if (player != null) {
+ startAutoPlay = player.getPlayWhenReady();
+ startWindow = player.getCurrentWindowIndex();
+ startPosition = Math.max(0, player.getContentPosition());
+ }
+ }
+
+ private void clearStartPosition() {
+ startAutoPlay = true;
+ startWindow = C.INDEX_UNSET;
+ startPosition = C.TIME_UNSET;
}
/**
@@ -661,7 +696,7 @@ public class PlayerActivity extends Activity
// This will only occur if the user has performed a seek whilst in the error state. Update
// the resume position so that if the user then retries, playback will resume from the
// position to which they seeked.
- updateResumePosition();
+ updateStartPosition();
}
}
@@ -695,10 +730,10 @@ public class PlayerActivity extends Activity
}
inErrorState = true;
if (isBehindLiveWindow(e)) {
- clearResumePosition();
+ clearStartPosition();
initializePlayer();
} else {
- updateResumePosition();
+ updateStartPosition();
updateButtonVisibilities();
showControls();
}
diff --git a/demos/main/src/main/java/com/google/android/exoplayer2/demo/TrackSelectionHelper.java b/demos/main/src/main/java/com/google/android/exoplayer2/demo/TrackSelectionHelper.java
index d70e554473..66bef48500 100644
--- a/demos/main/src/main/java/com/google/android/exoplayer2/demo/TrackSelectionHelper.java
+++ b/demos/main/src/main/java/com/google/android/exoplayer2/demo/TrackSelectionHelper.java
@@ -30,6 +30,8 @@ import com.google.android.exoplayer2.RendererCapabilities;
import com.google.android.exoplayer2.source.TrackGroup;
import com.google.android.exoplayer2.source.TrackGroupArray;
import com.google.android.exoplayer2.trackselection.DefaultTrackSelector;
+import com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters;
+import com.google.android.exoplayer2.trackselection.DefaultTrackSelector.ParametersBuilder;
import com.google.android.exoplayer2.trackselection.DefaultTrackSelector.SelectionOverride;
import com.google.android.exoplayer2.trackselection.MappingTrackSelector.MappedTrackInfo;
import java.util.Arrays;
@@ -79,8 +81,9 @@ import java.util.Arrays;
!= RendererCapabilities.ADAPTIVE_NOT_SUPPORTED
&& trackGroups.get(i).length > 1;
}
- isDisabled = selector.getRendererDisabled(rendererIndex);
- override = selector.getSelectionOverride(rendererIndex, trackGroups);
+ Parameters parameters = selector.getParameters();
+ isDisabled = parameters.getRendererDisabled(rendererIndex);
+ override = parameters.getSelectionOverride(rendererIndex, trackGroups);
AlertDialog.Builder builder = new AlertDialog.Builder(activity);
builder.setTitle(title)
@@ -170,12 +173,14 @@ import java.util.Arrays;
@Override
public void onClick(DialogInterface dialog, int which) {
- selector.setRendererDisabled(rendererIndex, isDisabled);
+ ParametersBuilder parametersBuilder = selector.buildUponParameters();
+ parametersBuilder.setRendererDisabled(rendererIndex, isDisabled);
if (override != null) {
- selector.setSelectionOverride(rendererIndex, trackGroups, override);
+ parametersBuilder.setSelectionOverride(rendererIndex, trackGroups, override);
} else {
- selector.clearSelectionOverrides(rendererIndex);
+ parametersBuilder.clearSelectionOverrides(rendererIndex);
}
+ selector.setParameters(parametersBuilder);
}
// View.OnClickListener
diff --git a/library/core/src/main/java/com/google/android/exoplayer2/trackselection/DefaultTrackSelector.java b/library/core/src/main/java/com/google/android/exoplayer2/trackselection/DefaultTrackSelector.java
index 6c5e3dace5..9f7985b22b 100644
--- a/library/core/src/main/java/com/google/android/exoplayer2/trackselection/DefaultTrackSelector.java
+++ b/library/core/src/main/java/com/google/android/exoplayer2/trackselection/DefaultTrackSelector.java
@@ -45,24 +45,91 @@ import java.util.Map;
import java.util.concurrent.atomic.AtomicReference;
/**
- * A default {@link TrackSelector} suitable for most use cases.
+ * A default {@link TrackSelector} suitable for most use cases. Track selections are made according
+ * to configurable {@link Parameters}, which can be set by calling {@link
+ * #setParameters(Parameters)}.
+ *
+ *
Note that an override applies only when the track groups available to the renderer match the
- * {@link TrackGroupArray} for which the override was specified. Overrides can be cleared using the
- * {@code clearSelectionOverride} methods.
- *
- *