From 1dd36ae391447613d9fb67cc514c1fb59ffbbe5a Mon Sep 17 00:00:00 2001 From: tonihei Date: Tue, 12 Feb 2019 12:20:46 +0000 Subject: [PATCH] Add TrackSelectionDialog (with swipe tabs) to demo app. PiperOrigin-RevId: 233582549 --- demos/main/build.gradle | 3 + demos/main/src/main/AndroidManifest.xml | 3 +- .../exoplayer2/demo/DownloadTracker.java | 202 ++++----------- .../demo/SampleChooserActivity.java | 10 +- .../exoplayer2/demo/TrackSelectionDialog.java | 235 ++++++++++++++++++ .../src/main/res/drawable-hdpi/ic_edit.png | Bin 304 -> 0 bytes .../src/main/res/drawable-mdpi/ic_edit.png | Bin 242 -> 0 bytes .../src/main/res/drawable-xhdpi/ic_edit.png | Bin 299 -> 0 bytes .../src/main/res/drawable-xxhdpi/ic_edit.png | Bin 413 -> 0 bytes .../src/main/res/drawable-xxxhdpi/ic_edit.png | Bin 449 -> 0 bytes ...ownload_dialog.xml => download_dialog.xml} | 12 +- .../main/res/layout/download_dialog_tab.xml | 24 ++ .../main/res/layout/download_track_item.xml | 53 ---- demos/main/src/main/res/values/strings.xml | 4 - 14 files changed, 335 insertions(+), 211 deletions(-) create mode 100644 demos/main/src/main/java/com/google/android/exoplayer2/demo/TrackSelectionDialog.java delete mode 100755 demos/main/src/main/res/drawable-hdpi/ic_edit.png delete mode 100755 demos/main/src/main/res/drawable-mdpi/ic_edit.png delete mode 100755 demos/main/src/main/res/drawable-xhdpi/ic_edit.png delete mode 100755 demos/main/src/main/res/drawable-xxhdpi/ic_edit.png delete mode 100755 demos/main/src/main/res/drawable-xxxhdpi/ic_edit.png rename demos/main/src/main/res/layout/{start_download_dialog.xml => download_dialog.xml} (66%) create mode 100644 demos/main/src/main/res/layout/download_dialog_tab.xml delete mode 100644 demos/main/src/main/res/layout/download_track_item.xml diff --git a/demos/main/build.gradle b/demos/main/build.gradle index 440dc864d6..98e8f72835 100644 --- a/demos/main/build.gradle +++ b/demos/main/build.gradle @@ -63,6 +63,9 @@ android { dependencies { implementation 'com.android.support:support-annotations:' + supportLibraryVersion + implementation 'com.android.support:support-core-ui:' + supportLibraryVersion + implementation 'com.android.support:support-fragment:' + supportLibraryVersion + implementation 'com.android.support:design:' + supportLibraryVersion implementation project(modulePrefix + 'library-core') implementation project(modulePrefix + 'library-dash') implementation project(modulePrefix + 'library-hls') diff --git a/demos/main/src/main/AndroidManifest.xml b/demos/main/src/main/AndroidManifest.xml index 1f013f5add..355ba43405 100644 --- a/demos/main/src/main/AndroidManifest.xml +++ b/demos/main/src/main/AndroidManifest.xml @@ -39,7 +39,8 @@ + android:label="@string/application_name" + android:theme="@style/Theme.AppCompat"> 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 50ec5048ce..29e7d0c19f 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 @@ -15,20 +15,12 @@ */ package com.google.android.exoplayer2.demo; -import android.app.Activity; -import android.app.AlertDialog; import android.content.Context; import android.content.DialogInterface; -import android.content.res.Resources; import android.net.Uri; import android.os.Handler; import android.os.HandlerThread; -import android.support.annotation.Nullable; -import android.view.LayoutInflater; -import android.view.View; -import android.widget.ImageButton; -import android.widget.LinearLayout; -import android.widget.TextView; +import android.support.v4.app.FragmentManager; import android.widget.Toast; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.RenderersFactory; @@ -46,11 +38,6 @@ 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.trackselection.TrackSelection; -import com.google.android.exoplayer2.trackselection.TrackSelectionUtil; -import com.google.android.exoplayer2.ui.DefaultTrackNameProvider; -import com.google.android.exoplayer2.ui.TrackNameProvider; -import com.google.android.exoplayer2.ui.TrackSelectionDialogBuilder; import com.google.android.exoplayer2.upstream.DataSource; import com.google.android.exoplayer2.util.Log; import com.google.android.exoplayer2.util.Util; @@ -81,7 +68,6 @@ public class DownloadTracker implements DownloadManager.Listener { private final Context context; private final DataSource.Factory dataSourceFactory; - private final TrackNameProvider trackNameProvider; private final CopyOnWriteArraySet listeners; private final HashMap trackedDownloadStates; private final DefaultDownloadIndex downloadIndex; @@ -92,7 +78,6 @@ public class DownloadTracker implements DownloadManager.Listener { this.context = context.getApplicationContext(); this.dataSourceFactory = dataSourceFactory; this.downloadIndex = downloadIndex; - trackNameProvider = new DefaultTrackNameProvider(context.getResources()); listeners = new CopyOnWriteArraySet<>(); trackedDownloadStates = new HashMap<>(); HandlerThread actionFileWriteThread = new HandlerThread("DownloadTracker"); @@ -122,7 +107,7 @@ public class DownloadTracker implements DownloadManager.Listener { } public void toggleDownload( - Activity activity, + FragmentManager fragmentManager, String name, Uri uri, String extension, @@ -133,7 +118,7 @@ public class DownloadTracker implements DownloadManager.Listener { startServiceWithAction(removeAction); } else { new StartDownloadDialogHelper( - activity, getDownloadHelper(uri, extension, renderersFactory), name); + fragmentManager, getDownloadHelper(uri, extension, renderersFactory), name); } } @@ -225,42 +210,23 @@ public class DownloadTracker implements DownloadManager.Listener { } } - @SuppressWarnings("UngroupedOverloads") private final class StartDownloadDialogHelper implements DownloadHelper.Callback, DialogInterface.OnClickListener, - DialogInterface.OnDismissListener, - View.OnClickListener { + DialogInterface.OnDismissListener { + private final FragmentManager fragmentManager; private final DownloadHelper downloadHelper; private final String name; - private final LayoutInflater dialogInflater; - private final AlertDialog dialog; - private final LinearLayout selectionList; + private TrackSelectionDialog trackSelectionDialog; private MappedTrackInfo mappedTrackInfo; - private DefaultTrackSelector.Parameters parameters; - private StartDownloadDialogHelper( - Activity activity, DownloadHelper downloadHelper, String name) { + public StartDownloadDialogHelper( + FragmentManager fragmentManager, DownloadHelper downloadHelper, String name) { + this.fragmentManager = fragmentManager; this.downloadHelper = downloadHelper; this.name = name; - AlertDialog.Builder builder = - new AlertDialog.Builder(activity) - .setTitle(R.string.download_preparing) - .setPositiveButton(android.R.string.ok, /* listener= */ this) - .setNegativeButton(android.R.string.cancel, /* listener= */ null); - - // Inflate with the builder's context to ensure the correct style is used. - dialogInflater = LayoutInflater.from(builder.getContext()); - selectionList = (LinearLayout) dialogInflater.inflate(R.layout.start_download_dialog, null); - builder.setView(selectionList); - dialog = builder.create(); - dialog.setOnDismissListener(/* listener= */ this); - dialog.show(); - dialog.getButton(AlertDialog.BUTTON_POSITIVE).setEnabled(false); - - parameters = DownloadHelper.DEFAULT_TRACK_SELECTOR_PARAMETERS; downloadHelper.prepare(this); } @@ -268,12 +234,19 @@ public class DownloadTracker implements DownloadManager.Listener { @Override public void onPrepared(DownloadHelper helper) { - if (helper.getPeriodCount() > 0) { - mappedTrackInfo = downloadHelper.getMappedTrackInfo(/* periodIndex= */ 0); - updateSelectionList(); + if (helper.getPeriodCount() == 0) { + onPrepareError(helper, new IOException("No periods found.")); + return; } - dialog.setTitle(R.string.exo_download_description); - dialog.getButton(AlertDialog.BUTTON_POSITIVE).setEnabled(true); + mappedTrackInfo = downloadHelper.getMappedTrackInfo(/* periodIndex= */ 0); + trackSelectionDialog = new TrackSelectionDialog(); + trackSelectionDialog.init( + mappedTrackInfo, + /* allowAdaptiveSelections =*/ false, + /* allowMultipleOverrides= */ true, + /* onClickListener= */ this, + /* onDismissListener= */ this); + trackSelectionDialog.show(fragmentManager, "download"); } @Override @@ -282,33 +255,44 @@ public class DownloadTracker implements DownloadManager.Listener { context.getApplicationContext(), R.string.download_start_error, Toast.LENGTH_LONG) .show(); Log.e(TAG, "Failed to start download", e); - dialog.cancel(); - } - - // View.OnClickListener implementation. - - @Override - public void onClick(View v) { - Integer rendererIndex = (Integer) v.getTag(); - TrackGroupArray trackGroupArray = mappedTrackInfo.getTrackGroups(rendererIndex); - String dialogTitle = getTrackTypeString(mappedTrackInfo.getRendererType(rendererIndex)); - new TrackSelectionDialogBuilder( - dialog.getContext(), - dialogTitle, - mappedTrackInfo, - rendererIndex, - (isDisabled, overrides) -> updateTracks(rendererIndex, isDisabled, overrides)) - .setShowDisableOption(true) - .setIsDisabled(parameters.getRendererDisabled(rendererIndex)) - .setOverride(parameters.getSelectionOverride(rendererIndex, trackGroupArray)) - .build() - .show(); } // DialogInterface.OnClickListener implementation. @Override public void onClick(DialogInterface dialog, int which) { + DefaultTrackSelector.ParametersBuilder builder = + DownloadHelper.DEFAULT_TRACK_SELECTOR_PARAMETERS.buildUpon(); + for (int i = 0; i < mappedTrackInfo.getRendererCount(); i++) { + builder.setRendererDisabled(/* rendererIndex= */ i, /* disabled= */ true); + } + for (int i = 0; i < downloadHelper.getPeriodCount(); i++) { + downloadHelper.clearTrackSelections(/* periodIndex = */ i); + } + for (int i = 0; i < mappedTrackInfo.getRendererCount(); i++) { + if (trackSelectionDialog.getIsDisabled(/* rendererIndex= */ i)) { + continue; + } + builder.setRendererDisabled(/* rendererIndex= */ i, /* disabled= */ false); + List overrides = + trackSelectionDialog.getOverrides(/* rendererIndex= */ i); + if (overrides.isEmpty()) { + for (int j = 0; j < downloadHelper.getPeriodCount(); j++) { + downloadHelper.addTrackSelection(/* periodIndex = */ j, builder.build()); + } + } else { + TrackGroupArray trackGroupArray = mappedTrackInfo.getTrackGroups(/* rendererIndex= */ i); + for (int overrideIndex = 0; overrideIndex < overrides.size(); overrideIndex++) { + builder.setSelectionOverride( + /* rendererIndex= */ i, trackGroupArray, overrides.get(overrideIndex)); + for (int j = 0; j < downloadHelper.getPeriodCount(); j++) { + downloadHelper.addTrackSelection(/* periodIndex = */ j, builder.build()); + } + } + builder.clearSelectionOverrides(); + } + builder.setRendererDisabled(/* rendererIndex= */ i, /* disabled= */ true); + } DownloadAction downloadAction = downloadHelper.getDownloadAction(Util.getUtf8Bytes(name)); startDownload(downloadAction); } @@ -316,86 +300,8 @@ public class DownloadTracker implements DownloadManager.Listener { // DialogInterface.OnDismissListener implementation. @Override - public void onDismiss(DialogInterface dialog) { + public void onDismiss(DialogInterface dialogInterface) { downloadHelper.release(); } - - // Internal methods. - - private void updateTracks( - int rendererIndex, boolean isDisabled, List overrides) { - parameters = - TrackSelectionUtil.updateParametersWithOverride( - parameters, - rendererIndex, - mappedTrackInfo.getTrackGroups(rendererIndex), - isDisabled, - overrides.isEmpty() ? null : overrides.get(0)); - for (int i = 0; i < downloadHelper.getPeriodCount(); i++) { - downloadHelper.replaceTrackSelections(/* periodIndex= */ i, parameters); - } - updateSelectionList(); - } - - private void updateSelectionList() { - selectionList.removeAllViews(); - for (int i = 0; i < mappedTrackInfo.getRendererCount(); i++) { - TrackGroupArray trackGroupArray = mappedTrackInfo.getTrackGroups(i); - if (trackGroupArray.length == 0) { - continue; - } - String trackTypeString = - getTrackTypeString(mappedTrackInfo.getRendererType(/* rendererIndex= */ i)); - if (trackTypeString == null) { - return; - } - String trackSelectionsString = getTrackSelectionString(/* rendererIndex= */ i); - View view = dialogInflater.inflate(R.layout.download_track_item, selectionList, false); - TextView trackTitleView = view.findViewById(R.id.track_title); - TextView trackDescView = view.findViewById(R.id.track_desc); - ImageButton editButton = view.findViewById(R.id.edit_button); - trackTitleView.setText(trackTypeString); - trackDescView.setText(trackSelectionsString); - editButton.setTag(i); - editButton.setOnClickListener(this); - selectionList.addView(view); - } - } - - private String getTrackSelectionString(int rendererIndex) { - List trackSelections = - downloadHelper.getTrackSelections(/* periodIndex= */ 0, rendererIndex); - String selectedTracks = ""; - Resources resources = selectionList.getResources(); - for (int i = 0; i < trackSelections.size(); i++) { - TrackSelection selection = trackSelections.get(i); - for (int j = 0; j < selection.length(); j++) { - String trackName = trackNameProvider.getTrackName(selection.getFormat(j)); - if (i == 0 && j == 0) { - selectedTracks = trackName; - } else { - selectedTracks = resources.getString(R.string.exo_item_list, selectedTracks, trackName); - } - } - } - return selectedTracks.isEmpty() - ? resources.getString(R.string.exo_track_selection_none) - : selectedTracks; - } - - @Nullable - private String getTrackTypeString(int trackType) { - Resources resources = selectionList.getResources(); - switch (trackType) { - case C.TRACK_TYPE_VIDEO: - return resources.getString(R.string.exo_track_selection_title_video); - case C.TRACK_TYPE_AUDIO: - return resources.getString(R.string.exo_track_selection_title_audio); - case C.TRACK_TYPE_TEXT: - return resources.getString(R.string.exo_track_selection_title_text); - default: - return null; - } - } } } diff --git a/demos/main/src/main/java/com/google/android/exoplayer2/demo/SampleChooserActivity.java b/demos/main/src/main/java/com/google/android/exoplayer2/demo/SampleChooserActivity.java index 5db52fd575..b9ea2da8db 100644 --- a/demos/main/src/main/java/com/google/android/exoplayer2/demo/SampleChooserActivity.java +++ b/demos/main/src/main/java/com/google/android/exoplayer2/demo/SampleChooserActivity.java @@ -15,7 +15,6 @@ */ package com.google.android.exoplayer2.demo; -import android.app.Activity; import android.content.Context; import android.content.Intent; import android.content.res.AssetManager; @@ -23,6 +22,7 @@ import android.net.Uri; import android.os.AsyncTask; import android.os.Bundle; import android.support.annotation.Nullable; +import android.support.v7.app.AppCompatActivity; import android.util.JsonReader; import android.view.Menu; import android.view.MenuInflater; @@ -55,7 +55,7 @@ import java.util.Collections; import java.util.List; /** An activity for selecting from a list of media samples. */ -public class SampleChooserActivity extends Activity +public class SampleChooserActivity extends AppCompatActivity implements DownloadTracker.Listener, OnChildClickListener { private static final String TAG = "SampleChooserActivity"; @@ -182,7 +182,11 @@ public class SampleChooserActivity extends Activity ((DemoApplication) getApplication()) .buildRenderersFactory(isNonNullAndChecked(preferExtensionDecodersMenuItem)); downloadTracker.toggleDownload( - this, sample.name, uriSample.uri, uriSample.extension, renderersFactory); + getSupportFragmentManager(), + sample.name, + uriSample.uri, + uriSample.extension, + renderersFactory); } } 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 new file mode 100644 index 0000000000..3048594955 --- /dev/null +++ b/demos/main/src/main/java/com/google/android/exoplayer2/demo/TrackSelectionDialog.java @@ -0,0 +1,235 @@ +/* + * Copyright (C) 2019 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.google.android.exoplayer2.demo; + +import android.app.AlertDialog; +import android.app.Dialog; +import android.content.DialogInterface; +import android.content.res.Resources; +import android.os.Bundle; +import android.support.annotation.Nullable; +import android.support.design.widget.TabLayout; +import android.support.v4.app.DialogFragment; +import android.support.v4.app.Fragment; +import android.support.v4.app.FragmentManager; +import android.support.v4.app.FragmentPagerAdapter; +import android.support.v4.view.ViewPager; +import android.util.SparseArray; +import android.view.LayoutInflater; +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.SelectionOverride; +import com.google.android.exoplayer2.trackselection.MappingTrackSelector.MappedTrackInfo; +import com.google.android.exoplayer2.ui.TrackSelectionView; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/** Dialog to select tracks. */ +public final class TrackSelectionDialog extends DialogFragment { + + private final SparseArray tabFragments; + private final List tabTitles; + + private MappedTrackInfo mappedTrackInfo; + private boolean allowAdaptiveSelections; + private boolean allowMultipleOverrides; + private DialogInterface.OnClickListener onClickListener; + private DialogInterface.OnDismissListener onDismissListener; + + /** Creates the dialog. */ + public TrackSelectionDialog() { + tabFragments = new SparseArray<>(); + tabTitles = new ArrayList<>(); + // Retain instance across orientation changes to prevent loosing access to init data. + setRetainInstance(true); + } + + /** + * Initializes the dialog. + * + * @param mappedTrackInfo The {@link MappedTrackInfo} to display. + * @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. + * @param onClickListener {@link DialogInterface.OnClickListener} called when tracks are selected. + * @param onDismissListener {@link DialogInterface.OnDismissListener} called when the dialog is + * dismissed. + */ + public void init( + MappedTrackInfo mappedTrackInfo, + boolean allowAdaptiveSelections, + boolean allowMultipleOverrides, + DialogInterface.OnClickListener onClickListener, + DialogInterface.OnDismissListener onDismissListener) { + this.mappedTrackInfo = mappedTrackInfo; + this.allowAdaptiveSelections = allowAdaptiveSelections; + this.allowMultipleOverrides = allowMultipleOverrides; + this.onClickListener = onClickListener; + this.onDismissListener = onDismissListener; + } + + /** + * Returns whether a renderer is disabled. + * + * @param rendererIndex Renderer index. + * @return Whether the renderer is disabled. + */ + public boolean getIsDisabled(int rendererIndex) { + TrackSelectionViewFragment rendererView = tabFragments.get(rendererIndex); + return rendererView != null && rendererView.trackSelectionView.getIsDisabled(); + } + + /** + * Returns the list of selected track selection overrides for the specified renderer. There will + * be at most one override for each track group. + * + * @param rendererIndex Renderer index. + * @return The list of track selection overrides for this renderer. + */ + public List getOverrides(int rendererIndex) { + TrackSelectionViewFragment rendererView = tabFragments.get(rendererIndex); + return rendererView == null + ? Collections.emptyList() + : rendererView.trackSelectionView.getOverrides(); + } + + @Override + public Dialog onCreateDialog(Bundle savedInstanceState) { + return new AlertDialog.Builder(getActivity()) + .setTitle(R.string.exo_download_description) + .setPositiveButton(android.R.string.ok, onClickListener) + .setNegativeButton(android.R.string.cancel, /* listener= */ null) + .create(); + } + + @Override + public void onDismiss(DialogInterface dialog) { + super.onDismiss(dialog); + onDismissListener.onDismiss(dialog); + } + + @Nullable + @Override + public View onCreateView( + LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + for (int i = 0; i < mappedTrackInfo.getRendererCount(); i++) { + TrackGroupArray trackGroupArray = mappedTrackInfo.getTrackGroups(i); + if (trackGroupArray.length == 0) { + continue; + } + String trackTypeString = + getTrackTypeString(mappedTrackInfo.getRendererType(/* rendererIndex= */ i)); + if (trackTypeString == null) { + continue; + } + TrackSelectionViewFragment tabFragment = new TrackSelectionViewFragment(); + tabFragment.init( + mappedTrackInfo, /* rendererIndex= */ i, allowAdaptiveSelections, allowMultipleOverrides); + tabFragments.put(i, tabFragment); + tabTitles.add(trackTypeString); + } + View dialogView = inflater.inflate(R.layout.download_dialog, container, false); + TabLayout tabLayout = dialogView.findViewById(R.id.download_dialog_tab_layout); + ViewPager viewPager = dialogView.findViewById(R.id.download_dialog_view_pager); + viewPager.setAdapter(new FragmentAdapter(getChildFragmentManager())); + tabLayout.setupWithViewPager(viewPager); + ((AlertDialog) getDialog()).setView(dialogView); + return dialogView; + } + + @Nullable + private String getTrackTypeString(int trackType) { + Resources resources = getResources(); + switch (trackType) { + case C.TRACK_TYPE_VIDEO: + return resources.getString(R.string.exo_track_selection_title_video); + case C.TRACK_TYPE_AUDIO: + return resources.getString(R.string.exo_track_selection_title_audio); + case C.TRACK_TYPE_TEXT: + return resources.getString(R.string.exo_track_selection_title_text); + default: + return null; + } + } + + private final class FragmentAdapter extends FragmentPagerAdapter { + + public FragmentAdapter(FragmentManager fragmentManager) { + super(fragmentManager); + } + + @Override + public Fragment getItem(int position) { + return tabFragments.valueAt(position); + } + + @Override + public int getCount() { + return tabFragments.size(); + } + + @Nullable + @Override + public CharSequence getPageTitle(int position) { + return tabTitles.get(position); + } + } + + /** Fragment to show a track seleciton in tab of the track selection dialog. */ + public static final class TrackSelectionViewFragment extends Fragment { + + private MappedTrackInfo mappedTrackInfo; + private int rendererIndex; + private boolean allowAdaptiveSelections; + private boolean allowMultipleOverrides; + + /* package */ TrackSelectionView trackSelectionView; + + public void init( + MappedTrackInfo mappedTrackInfo, + int rendererIndex, + boolean allowAdaptiveSelections, + boolean allowMultipleOverrides) { + this.mappedTrackInfo = mappedTrackInfo; + this.rendererIndex = rendererIndex; + this.allowAdaptiveSelections = allowAdaptiveSelections; + this.allowMultipleOverrides = allowMultipleOverrides; + } + + @Nullable + @Override + public View onCreateView( + LayoutInflater inflater, + @Nullable ViewGroup container, + @Nullable Bundle savedInstanceState) { + View rootView = + inflater.inflate(R.layout.download_dialog_tab, container, /* attachToRoot= */ false); + trackSelectionView = rootView.findViewById(R.id.download_dialog_track_selection_view); + trackSelectionView.setShowDisableOption(true); + trackSelectionView.setAllowMultipleOverrides(allowMultipleOverrides); + trackSelectionView.setAllowAdaptiveSelections(allowAdaptiveSelections); + trackSelectionView.init( + mappedTrackInfo, + rendererIndex, + /* isDisabled= */ false, + /* overrides= */ Collections.emptyList()); + return rootView; + } + } +} diff --git a/demos/main/src/main/res/drawable-hdpi/ic_edit.png b/demos/main/src/main/res/drawable-hdpi/ic_edit.png deleted file mode 100755 index 25678d6de970f4cf8d98452f9f2d184b7b126530..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 304 zcmV-00nh%4P)6_%g=JPwp^mikG-9oSGg>A)DUNEQ7GKnBdXOc zb-7*PQXg=G1UmhNg)4f(jS}LD8t3f6_9=hBO%bj@$qo^YE~3;Z;VO{SDA^HJTF32k z>v2a-zd`jA_y?&$ODY5>#aL1cp884&mek76p++sK@LxxzSW@d&RE!-3MRpVv*-=pR zeo7OY5=tGLA_{CU6$*;%C@8X{Ae5pWq0000 diff --git a/demos/main/src/main/res/drawable-mdpi/ic_edit.png b/demos/main/src/main/res/drawable-mdpi/ic_edit.png deleted file mode 100755 index dffcd9f61a79913ea289c0a255afab2494532cb8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 242 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|k0wldT1B8LpPEQxdkP61PXBycKC5SjY{LHpc zpe;qhMag4^gF=JcLh&2SJPi!CNfB)(6NCON>^}Bjm${TRdqe-a`6dbO^2MC0jl#+N zY7r|J8t`3d3|K65g zZD3lEp76xldx~nQ+rEieGdE3)+%mIs?~Fx_JF5(fLwfhjcr0%?k)OGeIhZrKMQd3? pd&@?rLlKJ1%$k;)3}VmiWn};V$;>=IlNaa-22WQ%mvv4FO#m$xRv-WX diff --git a/demos/main/src/main/res/drawable-xhdpi/ic_edit.png b/demos/main/src/main/res/drawable-xhdpi/ic_edit.png deleted file mode 100755 index 82f8563d1e2af42787d9f75cbed64d07b1358815..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 299 zcmV+`0o4A9P)Q9~FOH2gL;-(VWx_F#oH%==NEt|;90SRjV<5S545S`k zj)COD@g^BK22#5t$M6_M!O0iSj2fpnIKk26l&f(zf)kwJ1SdFo%31zv4qxPy^5=4%P)ozBbNenHI@1Es|wgB+Il&mT8eJ(*jrl zv{TKXh0}(qv?nd8+7|V_iw?9wz5nM?8$D=eH6Oc&9<=RxStZ(KLwBseD$%Z5d=<^= zM;oiUj{RvrXzK-9!z}N>;qFuMoD$|;0nYLP{waW7DinNAVW!g<^tTL_ojykhU zTdtio?TqqnP0M1HX#p(L7UEd_A9z@>MzCPbGgz>usjNd-b848%dWQuI7A#natU)U4 z4Hhg|u>Lt~E0y&M3)WwQ1#2^pRJ1r+gex5nWW+gLQCpzMa{jw zWY_t-*E4&w6lJeDmlp3{x%ZOH`8B)rt5?0fq{P4IOtZ#E1umNoCjLbSnl(N^nO~1I zzgT4D(or`xLp<<*UUtih`sY`r7ro9}F?rXjvyGkiq90YRUH6Vnttz{Fx%8ZjJ5uK_ zxTL@R$m40UF0k9iSC$W75)X8@<1#bQVkQs jLVG@3IR_GoDzyv`b*-KC%d=hrqlUrL)z4*}Q$iB}4BWod diff --git a/demos/main/src/main/res/layout/start_download_dialog.xml b/demos/main/src/main/res/layout/download_dialog.xml similarity index 66% rename from demos/main/src/main/res/layout/start_download_dialog.xml rename to demos/main/src/main/res/layout/download_dialog.xml index c182047ff8..25819c7ff5 100644 --- a/demos/main/src/main/res/layout/start_download_dialog.xml +++ b/demos/main/src/main/res/layout/download_dialog.xml @@ -14,7 +14,15 @@ limitations under the License. --> + android:layout_height="wrap_content"> + + + diff --git a/demos/main/src/main/res/layout/download_dialog_tab.xml b/demos/main/src/main/res/layout/download_dialog_tab.xml new file mode 100644 index 0000000000..1827b4738b --- /dev/null +++ b/demos/main/src/main/res/layout/download_dialog_tab.xml @@ -0,0 +1,24 @@ + + + + + diff --git a/demos/main/src/main/res/layout/download_track_item.xml b/demos/main/src/main/res/layout/download_track_item.xml deleted file mode 100644 index fe1c62b391..0000000000 --- a/demos/main/src/main/res/layout/download_track_item.xml +++ /dev/null @@ -1,53 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/demos/main/src/main/res/values/strings.xml b/demos/main/src/main/res/values/strings.xml index 7ac5a65a49..40f065b18e 100644 --- a/demos/main/src/main/res/values/strings.xml +++ b/demos/main/src/main/res/values/strings.xml @@ -51,10 +51,6 @@ Playing sample without ads, as the IMA extension was not loaded - Edit selection - - Preparing download… - Failed to start download This demo app does not support downloading playlists