From 36060e36cb01dc80067a6f6ccd09cd0cdeb6beb0 Mon Sep 17 00:00:00 2001 From: tonihei Date: Mon, 4 Mar 2019 17:38:27 +0000 Subject: [PATCH] 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 --- .../exoplayer2/ui/TrackSelectionView.java | 37 ++++++++++++------- 1 file changed, 24 insertions(+), 13 deletions(-) diff --git a/library/ui/src/main/java/com/google/android/exoplayer2/ui/TrackSelectionView.java b/library/ui/src/main/java/com/google/android/exoplayer2/ui/TrackSelectionView.java index 621eeda1dd..e83a4abdfb 100644 --- a/library/ui/src/main/java/com/google/android/exoplayer2/ui/TrackSelectionView.java +++ b/library/ui/src/main/java/com/google/android/exoplayer2/ui/TrackSelectionView.java @@ -254,8 +254,7 @@ public class TrackSelectionView extends LinearLayout { // Add per-track views. trackViews = new CheckedTextView[trackGroups.length][]; - boolean enableMultipleChoiceForMultipleOverrides = - allowMultipleOverrides && trackGroups.length > 1; + boolean enableMultipleChoiceForMultipleOverrides = shouldEnableMultiGroupSelection(); for (int groupIndex = 0; groupIndex < trackGroups.length; groupIndex++) { TrackGroup group = trackGroups.get(groupIndex); boolean enableMultipleChoiceForAdaptiveSelections = shouldEnableAdaptiveSelection(groupIndex); @@ -332,19 +331,21 @@ public class TrackSelectionView extends LinearLayout { int trackIndex = tag.second; SelectionOverride override = overrides.get(groupIndex); Assertions.checkNotNull(mappedTrackInfo); - boolean adaptiveSelectionsEnabled = shouldEnableAdaptiveSelection(groupIndex); - if (!allowMultipleOverrides && override == null && overrides.size() > 0) { - // A new override is being started and we don't allow multiple overrides. - overrides.clear(); - } - if (override == null || !adaptiveSelectionsEnabled) { - // Set new override for current group. + if (override == null) { + // Start new override. + if (!allowMultipleOverrides && overrides.size() > 0) { + // Removed other overrides if we don't allow multiple overrides. + overrides.clear(); + } overrides.put(groupIndex, new SelectionOverride(groupIndex, trackIndex)); } else { // An existing override is being modified. int overrideLength = override.length; 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. if (overrideLength == 1) { // The last track is being removed, so the override becomes empty. @@ -356,9 +357,15 @@ public class TrackSelectionView extends LinearLayout { int[] tracks = getTracksRemoving(overrideTracks, trackIndex); overrides.put(groupIndex, new SelectionOverride(groupIndex, tracks)); } - } else { - int[] tracks = getTracksAdding(overrideTracks, trackIndex); - overrides.put(groupIndex, new SelectionOverride(groupIndex, tracks)); + } else if (!isCurrentlySelected) { + if (isAdaptiveAllowed) { + // 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 { != RendererCapabilities.ADAPTIVE_NOT_SUPPORTED; } + private boolean shouldEnableMultiGroupSelection() { + return allowMultipleOverrides && trackGroups.length > 1; + } + private static int[] getTracksAdding(int[] tracks, int addedTrack) { tracks = Arrays.copyOf(tracks, tracks.length + 1); tracks[tracks.length - 1] = addedTrack;