diff --git a/demos/main/src/main/java/com/google/android/exoplayer2/demo/DownloadTracker.java b/demos/main/src/main/java/com/google/android/exoplayer2/demo/DownloadTracker.java index 29e7d0c19f..30a898f07e 100644 --- a/demos/main/src/main/java/com/google/android/exoplayer2/demo/DownloadTracker.java +++ b/demos/main/src/main/java/com/google/android/exoplayer2/demo/DownloadTracker.java @@ -241,12 +241,14 @@ public class DownloadTracker implements DownloadManager.Listener { mappedTrackInfo = downloadHelper.getMappedTrackInfo(/* periodIndex= */ 0); trackSelectionDialog = new TrackSelectionDialog(); trackSelectionDialog.init( + /* titleId= */ R.string.exo_download_description, mappedTrackInfo, + /* initialSelection= */ DownloadHelper.DEFAULT_TRACK_SELECTOR_PARAMETERS, /* allowAdaptiveSelections =*/ false, /* allowMultipleOverrides= */ true, /* onClickListener= */ this, /* onDismissListener= */ this); - trackSelectionDialog.show(fragmentManager, "download"); + trackSelectionDialog.show(fragmentManager, /* tag= */ null); } @Override 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 12fc5eb06f..befdff6170 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 @@ -15,13 +15,13 @@ */ package com.google.android.exoplayer2.demo; -import android.app.Activity; import android.content.Intent; import android.content.pm.PackageManager; import android.net.Uri; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.annotation.Nullable; +import android.support.v7.app.AppCompatActivity; import android.util.Pair; import android.view.KeyEvent; import android.view.View; @@ -65,7 +65,6 @@ import com.google.android.exoplayer2.trackselection.TrackSelectionArray; import com.google.android.exoplayer2.ui.DebugTextViewHelper; import com.google.android.exoplayer2.ui.PlayerControlView; import com.google.android.exoplayer2.ui.PlayerView; -import com.google.android.exoplayer2.ui.TrackSelectionDialogBuilder; import com.google.android.exoplayer2.ui.spherical.SphericalSurfaceView; import com.google.android.exoplayer2.upstream.DataSource; import com.google.android.exoplayer2.upstream.HttpDataSource; @@ -80,7 +79,7 @@ import java.util.List; import java.util.UUID; /** An activity that plays media using {@link SimpleExoPlayer}. */ -public class PlayerActivity extends Activity +public class PlayerActivity extends AppCompatActivity implements OnClickListener, PlaybackPreparer, PlayerControlView.VisibilityListener { public static final String DRM_SCHEME_EXTRA = "drm_scheme"; @@ -125,6 +124,7 @@ public class PlayerActivity extends Activity private PlayerView playerView; private LinearLayout debugRootView; + private Button selectTracksButton; private TextView debugTextView; private DataSource.Factory dataSourceFactory; @@ -160,10 +160,10 @@ public class PlayerActivity extends Activity } setContentView(R.layout.player_activity); - View rootView = findViewById(R.id.root); - rootView.setOnClickListener(this); debugRootView = findViewById(R.id.controls_root); debugTextView = findViewById(R.id.debug_text_view); + selectTracksButton = findViewById(R.id.select_tracks_button); + selectTracksButton.setOnClickListener(this); playerView = findViewById(R.id.player_view); playerView.setControllerVisibilityListener(this); @@ -272,6 +272,7 @@ public class PlayerActivity extends Activity @Override public void onSaveInstanceState(Bundle outState) { + super.onSaveInstanceState(outState); updateTrackSelectorParameters(); updateStartPosition(); outState.putParcelable(KEY_TRACK_SELECTOR_PARAMETERS, trackSelectorParameters); @@ -292,23 +293,9 @@ public class PlayerActivity extends Activity @Override public void onClick(View view) { - if (view.getParent() == debugRootView) { - MappedTrackInfo mappedTrackInfo = trackSelector.getCurrentMappedTrackInfo(); - if (mappedTrackInfo != null) { - CharSequence title = ((Button) view).getText(); - int rendererIndex = (int) view.getTag(); - int rendererType = mappedTrackInfo.getRendererType(rendererIndex); - boolean allowAdaptiveSelections = - rendererType == C.TRACK_TYPE_VIDEO - || (rendererType == C.TRACK_TYPE_AUDIO - && mappedTrackInfo.getTypeSupport(C.TRACK_TYPE_VIDEO) - == MappedTrackInfo.RENDERER_SUPPORT_NO_TRACKS); - new TrackSelectionDialogBuilder(/* context= */ this, title, trackSelector, rendererIndex) - .setShowDisableOption(true) - .setAllowAdaptiveSelections(allowAdaptiveSelections) - .build() - .show(); - } + if (view == selectTracksButton) { + TrackSelectionDialog dialog = TrackSelectionDialog.createForTrackSelector(trackSelector); + dialog.show(getSupportFragmentManager(), /* tag= */ null); } } @@ -454,7 +441,7 @@ public class PlayerActivity extends Activity player.seekTo(startWindow, startPosition); } player.prepare(mediaSource, !haveStartPosition, false); - updateButtonVisibilities(); + updateButtonVisibility(); } private MediaSource buildMediaSource(Uri uri) { @@ -605,41 +592,9 @@ public class PlayerActivity extends Activity // User controls - private void updateButtonVisibilities() { - debugRootView.removeAllViews(); - if (player == null) { - return; - } - - MappedTrackInfo mappedTrackInfo = trackSelector.getCurrentMappedTrackInfo(); - if (mappedTrackInfo == null) { - return; - } - - for (int i = 0; i < mappedTrackInfo.getRendererCount(); i++) { - TrackGroupArray trackGroups = mappedTrackInfo.getTrackGroups(i); - if (trackGroups.length != 0) { - Button button = new Button(this); - int label; - switch (player.getRendererType(i)) { - case C.TRACK_TYPE_AUDIO: - label = R.string.exo_track_selection_title_audio; - break; - case C.TRACK_TYPE_VIDEO: - label = R.string.exo_track_selection_title_video; - break; - case C.TRACK_TYPE_TEXT: - label = R.string.exo_track_selection_title_text; - break; - default: - continue; - } - button.setText(label); - button.setTag(i); - button.setOnClickListener(this); - debugRootView.addView(button); - } - } + private void updateButtonVisibility() { + selectTracksButton.setEnabled( + player != null && trackSelector.getCurrentMappedTrackInfo() != null); } private void showControls() { @@ -675,7 +630,7 @@ public class PlayerActivity extends Activity if (playbackState == Player.STATE_ENDED) { showControls(); } - updateButtonVisibilities(); + updateButtonVisibility(); } @Override @@ -694,7 +649,7 @@ public class PlayerActivity extends Activity initializePlayer(); } else { updateStartPosition(); - updateButtonVisibilities(); + updateButtonVisibility(); showControls(); } } @@ -702,7 +657,7 @@ public class PlayerActivity extends Activity @Override @SuppressWarnings("ReferenceEquality") public void onTracksChanged(TrackGroupArray trackGroups, TrackSelectionArray trackSelections) { - updateButtonVisibilities(); + updateButtonVisibility(); if (trackGroups != lastSeenTrackGroupArray) { MappedTrackInfo mappedTrackInfo = trackSelector.getCurrentMappedTrackInfo(); if (mappedTrackInfo != null) { diff --git a/demos/main/src/main/java/com/google/android/exoplayer2/demo/TrackSelectionDialog.java b/demos/main/src/main/java/com/google/android/exoplayer2/demo/TrackSelectionDialog.java index 3048594955..39e16b2ae1 100644 --- a/demos/main/src/main/java/com/google/android/exoplayer2/demo/TrackSelectionDialog.java +++ b/demos/main/src/main/java/com/google/android/exoplayer2/demo/TrackSelectionDialog.java @@ -33,9 +33,11 @@ import android.view.View; import android.view.ViewGroup; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.source.TrackGroupArray; +import com.google.android.exoplayer2.trackselection.DefaultTrackSelector; import com.google.android.exoplayer2.trackselection.DefaultTrackSelector.SelectionOverride; import com.google.android.exoplayer2.trackselection.MappingTrackSelector.MappedTrackInfo; import com.google.android.exoplayer2.ui.TrackSelectionView; +import com.google.android.exoplayer2.util.Assertions; import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -46,12 +48,54 @@ public final class TrackSelectionDialog extends DialogFragment { private final SparseArray tabFragments; private final List tabTitles; + private int titleId; private MappedTrackInfo mappedTrackInfo; + private DefaultTrackSelector.Parameters initialSelection; private boolean allowAdaptiveSelections; private boolean allowMultipleOverrides; private DialogInterface.OnClickListener onClickListener; private DialogInterface.OnDismissListener onDismissListener; + /** + * Creates and initialized a dialog with a {@link DefaultTrackSelector} and automatically updates + * the track selector's parameters when tracks are selected. + * + * @param trackSelector A {@link DefaultTrackSelector}. + */ + public static TrackSelectionDialog createForTrackSelector(DefaultTrackSelector trackSelector) { + MappedTrackInfo mappedTrackInfo = + Assertions.checkNotNull(trackSelector.getCurrentMappedTrackInfo()); + TrackSelectionDialog trackSelectionDialog = new TrackSelectionDialog(); + DefaultTrackSelector.Parameters parameters = trackSelector.getParameters(); + trackSelectionDialog.init( + /* titleId= */ R.string.track_selection_title, + mappedTrackInfo, + /* initialSelection = */ parameters, + /* allowAdaptiveSelections =*/ true, + /* allowMultipleOverrides= */ false, + /* onClickListener= */ (dialog, which) -> { + DefaultTrackSelector.ParametersBuilder builder = parameters.buildUpon(); + for (int i = 0; i < mappedTrackInfo.getRendererCount(); i++) { + builder + .clearSelectionOverrides(/* rendererIndex= */ i) + .setRendererDisabled( + /* rendererIndex= */ i, + trackSelectionDialog.getIsDisabled(/* rendererIndex= */ i)); + List overrides = + trackSelectionDialog.getOverrides(/* rendererIndex= */ i); + if (!overrides.isEmpty()) { + builder.setSelectionOverride( + /* rendererIndex= */ i, + mappedTrackInfo.getTrackGroups(/* rendererIndex= */ i), + overrides.get(0)); + } + } + trackSelector.setParameters(builder); + }, + /* onDismissListener= */ (dialog) -> {}); + return trackSelectionDialog; + } + /** Creates the dialog. */ public TrackSelectionDialog() { tabFragments = new SparseArray<>(); @@ -63,7 +107,10 @@ public final class TrackSelectionDialog extends DialogFragment { /** * Initializes the dialog. * + * @param titleId The resource id of the dialog title. * @param mappedTrackInfo The {@link MappedTrackInfo} to display. + * @param initialSelection The {@link DefaultTrackSelector.Parameters} describing the initial + * track selection. * @param allowAdaptiveSelections Whether adaptive selections (consisting of more than one track) * can be made. * @param allowMultipleOverrides Whether tracks from multiple track groups can be selected. @@ -72,12 +119,16 @@ public final class TrackSelectionDialog extends DialogFragment { * dismissed. */ public void init( + int titleId, MappedTrackInfo mappedTrackInfo, + DefaultTrackSelector.Parameters initialSelection, boolean allowAdaptiveSelections, boolean allowMultipleOverrides, DialogInterface.OnClickListener onClickListener, DialogInterface.OnDismissListener onDismissListener) { + this.titleId = titleId; this.mappedTrackInfo = mappedTrackInfo; + this.initialSelection = initialSelection; this.allowAdaptiveSelections = allowAdaptiveSelections; this.allowMultipleOverrides = allowMultipleOverrides; this.onClickListener = onClickListener; @@ -112,7 +163,7 @@ public final class TrackSelectionDialog extends DialogFragment { @Override public Dialog onCreateDialog(Bundle savedInstanceState) { return new AlertDialog.Builder(getActivity()) - .setTitle(R.string.exo_download_description) + .setTitle(titleId) .setPositiveButton(android.R.string.ok, onClickListener) .setNegativeButton(android.R.string.cancel, /* listener= */ null) .create(); @@ -140,7 +191,12 @@ public final class TrackSelectionDialog extends DialogFragment { } TrackSelectionViewFragment tabFragment = new TrackSelectionViewFragment(); tabFragment.init( - mappedTrackInfo, /* rendererIndex= */ i, allowAdaptiveSelections, allowMultipleOverrides); + mappedTrackInfo, + /* rendererIndex= */ i, + initialSelection.getRendererDisabled(/* rendererIndex= */ i), + initialSelection.getSelectionOverride(/* rendererIndex= */ i, trackGroupArray), + allowAdaptiveSelections, + allowMultipleOverrides); tabFragments.put(i, tabFragment); tabTitles.add(trackTypeString); } @@ -196,6 +252,8 @@ public final class TrackSelectionDialog extends DialogFragment { private MappedTrackInfo mappedTrackInfo; private int rendererIndex; + private boolean initialIsDisabled; + @Nullable private SelectionOverride initialOverride; private boolean allowAdaptiveSelections; private boolean allowMultipleOverrides; @@ -204,10 +262,14 @@ public final class TrackSelectionDialog extends DialogFragment { public void init( MappedTrackInfo mappedTrackInfo, int rendererIndex, + boolean initialIsDisabled, + @Nullable SelectionOverride initialOverride, boolean allowAdaptiveSelections, boolean allowMultipleOverrides) { this.mappedTrackInfo = mappedTrackInfo; this.rendererIndex = rendererIndex; + this.initialIsDisabled = initialIsDisabled; + this.initialOverride = initialOverride; this.allowAdaptiveSelections = allowAdaptiveSelections; this.allowMultipleOverrides = allowMultipleOverrides; } @@ -227,8 +289,10 @@ public final class TrackSelectionDialog extends DialogFragment { trackSelectionView.init( mappedTrackInfo, rendererIndex, - /* isDisabled= */ false, - /* overrides= */ Collections.emptyList()); + initialIsDisabled, + initialOverride == null + ? Collections.emptyList() + : Collections.singletonList(initialOverride)); return rootView; } } diff --git a/demos/main/src/main/res/layout/player_activity.xml b/demos/main/src/main/res/layout/player_activity.xml index 6b84033273..ea3de257e2 100644 --- a/demos/main/src/main/res/layout/player_activity.xml +++ b/demos/main/src/main/res/layout/player_activity.xml @@ -42,7 +42,15 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" - android:visibility="gone"/> + android:visibility="gone"> + +