Commit c6195dbb by tonihei Committed by Andrew Lewis

Handle recreation of TrackSelectionView instances.

TrackSelectionView requires an initialization with a call to init(...).
That's why we shouldn't let the view retain its view hierarchy automatically
as the views won't be backed by data if restored. Instead add a listener
which lets the containing activity/fragment save and restore the state if
needed.

PiperOrigin-RevId: 234152491
parent f9f55ae4
...@@ -261,15 +261,17 @@ public final class TrackSelectionDialog extends DialogFragment { ...@@ -261,15 +261,17 @@ public final class TrackSelectionDialog extends DialogFragment {
} }
/** Fragment to show a track seleciton in tab of the track selection dialog. */ /** Fragment to show a track seleciton in tab of the track selection dialog. */
public static final class TrackSelectionViewFragment extends Fragment { public static final class TrackSelectionViewFragment extends Fragment
implements TrackSelectionView.TrackSelectionListener {
private MappedTrackInfo mappedTrackInfo; private MappedTrackInfo mappedTrackInfo;
private int rendererIndex; private int rendererIndex;
private boolean initialIsDisabled;
@Nullable private SelectionOverride initialOverride;
private boolean allowAdaptiveSelections; private boolean allowAdaptiveSelections;
private boolean allowMultipleOverrides; private boolean allowMultipleOverrides;
private boolean isDisabled;
private List<SelectionOverride> overrides;
/* package */ TrackSelectionView trackSelectionView; /* package */ TrackSelectionView trackSelectionView;
public void init( public void init(
...@@ -281,8 +283,11 @@ public final class TrackSelectionDialog extends DialogFragment { ...@@ -281,8 +283,11 @@ public final class TrackSelectionDialog extends DialogFragment {
boolean allowMultipleOverrides) { boolean allowMultipleOverrides) {
this.mappedTrackInfo = mappedTrackInfo; this.mappedTrackInfo = mappedTrackInfo;
this.rendererIndex = rendererIndex; this.rendererIndex = rendererIndex;
this.initialIsDisabled = initialIsDisabled; this.isDisabled = initialIsDisabled;
this.initialOverride = initialOverride; this.overrides =
initialOverride == null
? Collections.emptyList()
: Collections.singletonList(initialOverride);
this.allowAdaptiveSelections = allowAdaptiveSelections; this.allowAdaptiveSelections = allowAdaptiveSelections;
this.allowMultipleOverrides = allowMultipleOverrides; this.allowMultipleOverrides = allowMultipleOverrides;
} }
...@@ -301,13 +306,14 @@ public final class TrackSelectionDialog extends DialogFragment { ...@@ -301,13 +306,14 @@ public final class TrackSelectionDialog extends DialogFragment {
trackSelectionView.setAllowMultipleOverrides(allowMultipleOverrides); trackSelectionView.setAllowMultipleOverrides(allowMultipleOverrides);
trackSelectionView.setAllowAdaptiveSelections(allowAdaptiveSelections); trackSelectionView.setAllowAdaptiveSelections(allowAdaptiveSelections);
trackSelectionView.init( trackSelectionView.init(
mappedTrackInfo, mappedTrackInfo, rendererIndex, isDisabled, overrides, /* listener= */ this);
rendererIndex,
initialIsDisabled,
initialOverride == null
? Collections.emptyList()
: Collections.singletonList(initialOverride));
return rootView; return rootView;
} }
@Override
public void onTrackSelectionChanged(boolean isDisabled, List<SelectionOverride> overrides) {
this.isDisabled = isDisabled;
this.overrides = overrides;
}
} }
} }
...@@ -219,7 +219,7 @@ public final class TrackSelectionDialogBuilder { ...@@ -219,7 +219,7 @@ public final class TrackSelectionDialogBuilder {
if (trackNameProvider != null) { if (trackNameProvider != null) {
selectionView.setTrackNameProvider(trackNameProvider); selectionView.setTrackNameProvider(trackNameProvider);
} }
selectionView.init(mappedTrackInfo, rendererIndex, isDisabled, overrides); selectionView.init(mappedTrackInfo, rendererIndex, isDisabled, overrides, /* listener= */ null);
Dialog.OnClickListener okClickListener = Dialog.OnClickListener okClickListener =
(dialog, which) -> (dialog, which) ->
callback.onTracksSelected(selectionView.getIsDisabled(), selectionView.getOverrides()); callback.onTracksSelected(selectionView.getIsDisabled(), selectionView.getOverrides());
......
...@@ -41,6 +41,18 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; ...@@ -41,6 +41,18 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
/** A view for making track selections. */ /** A view for making track selections. */
public class TrackSelectionView extends LinearLayout { public class TrackSelectionView extends LinearLayout {
/** Listener for changes to the selected tracks. */
public interface TrackSelectionListener {
/**
* Called when the selected tracks changed.
*
* @param isDisabled Whether the renderer is disabled.
* @param overrides List of selected track selection overrides for the renderer.
*/
void onTrackSelectionChanged(boolean isDisabled, List<SelectionOverride> overrides);
}
private final int selectableItemBackgroundResourceId; private final int selectableItemBackgroundResourceId;
private final LayoutInflater inflater; private final LayoutInflater inflater;
private final CheckedTextView disableView; private final CheckedTextView disableView;
...@@ -54,10 +66,11 @@ public class TrackSelectionView extends LinearLayout { ...@@ -54,10 +66,11 @@ public class TrackSelectionView extends LinearLayout {
private TrackNameProvider trackNameProvider; private TrackNameProvider trackNameProvider;
private CheckedTextView[][] trackViews; private CheckedTextView[][] trackViews;
private @MonotonicNonNull MappedTrackInfo mappedTrackInfo; @MonotonicNonNull private MappedTrackInfo mappedTrackInfo;
private int rendererIndex; private int rendererIndex;
private TrackGroupArray trackGroups; private TrackGroupArray trackGroups;
private boolean isDisabled; private boolean isDisabled;
@Nullable private TrackSelectionListener listener;
/** Creates a track selection view. */ /** Creates a track selection view. */
public TrackSelectionView(Context context) { public TrackSelectionView(Context context) {
...@@ -76,6 +89,9 @@ public class TrackSelectionView extends LinearLayout { ...@@ -76,6 +89,9 @@ public class TrackSelectionView extends LinearLayout {
super(context, attrs, defStyleAttr); super(context, attrs, defStyleAttr);
overrides = new SparseArray<>(); overrides = new SparseArray<>();
// Don't save view hierarchy as it needs to be reinitialized with a call to init.
setSaveFromParentEnabled(false);
TypedArray attributeArray = TypedArray attributeArray =
context context
.getTheme() .getTheme()
...@@ -177,15 +193,18 @@ public class TrackSelectionView extends LinearLayout { ...@@ -177,15 +193,18 @@ public class TrackSelectionView extends LinearLayout {
* @param overrides List of initial overrides to be shown for this renderer. There must be at most * @param overrides List of initial overrides to be shown for this renderer. There must be at most
* one override for each track group. If {@link #setAllowMultipleOverrides(boolean)} hasn't * one override for each track group. If {@link #setAllowMultipleOverrides(boolean)} hasn't
* been set to {@code true}, only the first override is used. * been set to {@code true}, only the first override is used.
* @param listener An optional listener for track selection updates.
*/ */
public void init( public void init(
MappedTrackInfo mappedTrackInfo, MappedTrackInfo mappedTrackInfo,
int rendererIndex, int rendererIndex,
boolean isDisabled, boolean isDisabled,
List<SelectionOverride> overrides) { List<SelectionOverride> overrides,
@Nullable TrackSelectionListener listener) {
this.mappedTrackInfo = mappedTrackInfo; this.mappedTrackInfo = mappedTrackInfo;
this.rendererIndex = rendererIndex; this.rendererIndex = rendererIndex;
this.isDisabled = isDisabled; this.isDisabled = isDisabled;
this.listener = listener;
int maxOverrides = allowMultipleOverrides ? overrides.size() : Math.min(overrides.size(), 1); int maxOverrides = allowMultipleOverrides ? overrides.size() : Math.min(overrides.size(), 1);
for (int i = 0; i < maxOverrides; i++) { for (int i = 0; i < maxOverrides; i++) {
SelectionOverride override = overrides.get(i); SelectionOverride override = overrides.get(i);
...@@ -291,6 +310,9 @@ public class TrackSelectionView extends LinearLayout { ...@@ -291,6 +310,9 @@ public class TrackSelectionView extends LinearLayout {
onTrackViewClicked(view); onTrackViewClicked(view);
} }
updateViewStates(); updateViewStates();
if (listener != null) {
listener.onTrackSelectionChanged(getIsDisabled(), getOverrides());
}
} }
private void onDisableViewClicked() { private void onDisableViewClicked() {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment