Commit 36060e36 by tonihei Committed by Oliver Woodman

Fix TrackSelectionView selection/deselection again.

There are 6 different situations which are now more explicitly covered to
ensure we handle them correctly:
1. Radio button (non-adaptive, single group only)
   Selected -> Do nothing.
   Unselected -> Replace override with selected track.
2. Check box (non-adaptive, but multi-group allowed)
   Selected -> Remove track (and override). If last one, set isDisabled flag.
   Unselected -> Replace override with selected track.
3. Check box (adaptive allowed, single or multi group)
   Selected -> Remove track. If last, remove override and maybe set isDisabled.
   Unselected -> Add track to override.

PiperOrigin-RevId: 236668642
parent 641c1d2a
...@@ -254,8 +254,7 @@ public class TrackSelectionView extends LinearLayout { ...@@ -254,8 +254,7 @@ public class TrackSelectionView extends LinearLayout {
// Add per-track views. // Add per-track views.
trackViews = new CheckedTextView[trackGroups.length][]; trackViews = new CheckedTextView[trackGroups.length][];
boolean enableMultipleChoiceForMultipleOverrides = boolean enableMultipleChoiceForMultipleOverrides = shouldEnableMultiGroupSelection();
allowMultipleOverrides && trackGroups.length > 1;
for (int groupIndex = 0; groupIndex < trackGroups.length; groupIndex++) { for (int groupIndex = 0; groupIndex < trackGroups.length; groupIndex++) {
TrackGroup group = trackGroups.get(groupIndex); TrackGroup group = trackGroups.get(groupIndex);
boolean enableMultipleChoiceForAdaptiveSelections = shouldEnableAdaptiveSelection(groupIndex); boolean enableMultipleChoiceForAdaptiveSelections = shouldEnableAdaptiveSelection(groupIndex);
...@@ -332,19 +331,21 @@ public class TrackSelectionView extends LinearLayout { ...@@ -332,19 +331,21 @@ public class TrackSelectionView extends LinearLayout {
int trackIndex = tag.second; int trackIndex = tag.second;
SelectionOverride override = overrides.get(groupIndex); SelectionOverride override = overrides.get(groupIndex);
Assertions.checkNotNull(mappedTrackInfo); Assertions.checkNotNull(mappedTrackInfo);
boolean adaptiveSelectionsEnabled = shouldEnableAdaptiveSelection(groupIndex); if (override == null) {
if (!allowMultipleOverrides && override == null && overrides.size() > 0) { // Start new override.
// A new override is being started and we don't allow multiple overrides. if (!allowMultipleOverrides && overrides.size() > 0) {
overrides.clear(); // Removed other overrides if we don't allow multiple overrides.
} overrides.clear();
if (override == null || !adaptiveSelectionsEnabled) { }
// Set new override for current group.
overrides.put(groupIndex, new SelectionOverride(groupIndex, trackIndex)); overrides.put(groupIndex, new SelectionOverride(groupIndex, trackIndex));
} else { } else {
// An existing override is being modified. // An existing override is being modified.
int overrideLength = override.length; int overrideLength = override.length;
int[] overrideTracks = override.tracks; int[] overrideTracks = override.tracks;
if (((CheckedTextView) view).isChecked()) { boolean isCurrentlySelected = ((CheckedTextView) view).isChecked();
boolean isAdaptiveAllowed = shouldEnableAdaptiveSelection(groupIndex);
boolean isUsingCheckBox = isAdaptiveAllowed || shouldEnableMultiGroupSelection();
if (isCurrentlySelected && isUsingCheckBox) {
// Remove the track from the override. // Remove the track from the override.
if (overrideLength == 1) { if (overrideLength == 1) {
// The last track is being removed, so the override becomes empty. // The last track is being removed, so the override becomes empty.
...@@ -356,9 +357,15 @@ public class TrackSelectionView extends LinearLayout { ...@@ -356,9 +357,15 @@ public class TrackSelectionView extends LinearLayout {
int[] tracks = getTracksRemoving(overrideTracks, trackIndex); int[] tracks = getTracksRemoving(overrideTracks, trackIndex);
overrides.put(groupIndex, new SelectionOverride(groupIndex, tracks)); overrides.put(groupIndex, new SelectionOverride(groupIndex, tracks));
} }
} else { } else if (!isCurrentlySelected) {
int[] tracks = getTracksAdding(overrideTracks, trackIndex); if (isAdaptiveAllowed) {
overrides.put(groupIndex, new SelectionOverride(groupIndex, tracks)); // Add new track to adaptive override.
int[] tracks = getTracksAdding(overrideTracks, trackIndex);
overrides.put(groupIndex, new SelectionOverride(groupIndex, tracks));
} else {
// Replace existing track in override.
overrides.put(groupIndex, new SelectionOverride(groupIndex, trackIndex));
}
} }
} }
} }
...@@ -371,6 +378,10 @@ public class TrackSelectionView extends LinearLayout { ...@@ -371,6 +378,10 @@ public class TrackSelectionView extends LinearLayout {
!= RendererCapabilities.ADAPTIVE_NOT_SUPPORTED; != RendererCapabilities.ADAPTIVE_NOT_SUPPORTED;
} }
private boolean shouldEnableMultiGroupSelection() {
return allowMultipleOverrides && trackGroups.length > 1;
}
private static int[] getTracksAdding(int[] tracks, int addedTrack) { private static int[] getTracksAdding(int[] tracks, int addedTrack) {
tracks = Arrays.copyOf(tracks, tracks.length + 1); tracks = Arrays.copyOf(tracks, tracks.length + 1);
tracks[tracks.length - 1] = addedTrack; tracks[tracks.length - 1] = addedTrack;
......
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