From 178eed7fcd11ac2c03eefbb1c6e179a059df943e Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Mon, 4 Aug 2025 13:21:02 -0400 Subject: [PATCH] fix(YouTube - Video quality): Fix wrong qualities sometimes shown in player button dialog --- .../quality/RememberVideoQualityPatch.java | 29 +++++++------------ .../videoplayer/VideoQualityDialogButton.java | 20 +++++++++---- 2 files changed, 24 insertions(+), 25 deletions(-) diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/playback/quality/RememberVideoQualityPatch.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/playback/quality/RememberVideoQualityPatch.java index dcbad858b..1c6746b3b 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/playback/quality/RememberVideoQualityPatch.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/playback/quality/RememberVideoQualityPatch.java @@ -8,7 +8,6 @@ import androidx.annotation.Nullable; import com.google.android.libraries.youtube.innertube.model.media.VideoQuality; import java.util.Arrays; -import java.util.List; import app.revanced.extension.shared.Logger; import app.revanced.extension.shared.Utils; @@ -45,13 +44,11 @@ public class RememberVideoQualityPatch { private static final IntegerSetting shortsQualityWifi = Settings.SHORTS_QUALITY_DEFAULT_WIFI; private static final IntegerSetting shortsQualityMobile = Settings.SHORTS_QUALITY_DEFAULT_MOBILE; - private static boolean qualityNeedsUpdating; - /** * The available qualities of the current video. */ @Nullable - private static List currentQualities; + private static VideoQuality[] currentQualities; /** * The current quality of the video playing. @@ -67,7 +64,7 @@ public class RememberVideoQualityPatch { private static VideoQualityMenuInterface currentMenuInterface; @Nullable - public static List getCurrentQualities() { + public static VideoQuality[] getCurrentQualities() { return currentQualities; } @@ -138,11 +135,11 @@ public class RememberVideoQualityPatch { Utils.verifyOnMainThread(); currentMenuInterface = menu; - final boolean availableQualitiesChanged = currentQualities == null - || currentQualities.size() != qualities.length; + final boolean availableQualitiesChanged = (currentQualities == null) + || !Arrays.equals(currentQualities, qualities); if (availableQualitiesChanged) { - currentQualities = Arrays.asList(qualities); - Logger.printDebug(() -> "VideoQualities: " + currentQualities); + currentQualities = qualities; + Logger.printDebug(() -> "VideoQualities: " + Arrays.toString(currentQualities)); } VideoQuality updatedCurrentQuality = qualities[originalQualityIndex]; @@ -155,17 +152,12 @@ public class RememberVideoQualityPatch { VideoQualityDialogButton.updateButtonIcon(updatedCurrentQuality); } - final int preferredQuality = getDefaultQualityResolution(); - if (preferredQuality == AUTOMATIC_VIDEO_QUALITY_VALUE) { - return originalQualityIndex; // Nothing to do. - } - // After changing videos the qualities can initially be for the prior video. // If the qualities have changed and the default is not auto then an update is needed. - if (!qualityNeedsUpdating && !availableQualitiesChanged) { - return originalQualityIndex; + final int preferredQuality = getDefaultQualityResolution(); + if (preferredQuality == AUTOMATIC_VIDEO_QUALITY_VALUE || !availableQualitiesChanged) { + return originalQualityIndex; // Nothing to do. } - qualityNeedsUpdating = false; // Find the highest quality that is equal to or less than the preferred. int i = 0; @@ -213,7 +205,7 @@ public class RememberVideoQualityPatch { Logger.printDebug(() -> "Cannot save default quality, qualities is null"); return; } - VideoQuality quality = currentQualities.get(userSelectedQualityIndex); + VideoQuality quality = currentQualities[userSelectedQualityIndex]; saveDefaultQuality(quality.patch_getResolution()); } } catch (Exception ex) { @@ -243,7 +235,6 @@ public class RememberVideoQualityPatch { currentQualities = null; currentQuality = null; currentMenuInterface = null; - qualityNeedsUpdating = true; // Hide the quality button until playback starts and the qualities are available. VideoQualityDialogButton.updateButtonIcon(null); diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/videoplayer/VideoQualityDialogButton.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/videoplayer/VideoQualityDialogButton.java index 924f1ce7b..e4f58b42a 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/videoplayer/VideoQualityDialogButton.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/videoplayer/VideoQualityDialogButton.java @@ -127,7 +127,7 @@ public class VideoQualityDialogButton { }, view -> { try { - List qualities = RememberVideoQualityPatch.getCurrentQualities(); + VideoQuality[] qualities = RememberVideoQualityPatch.getCurrentQualities(); VideoQualityMenuInterface menu = RememberVideoQualityPatch.getCurrentMenuInterface(); if (qualities == null || menu == null) { Logger.printDebug(() -> "Cannot reset quality, videoQualities is null"); @@ -186,13 +186,13 @@ public class VideoQualityDialogButton { */ private static void showVideoQualityDialog(Context context) { try { - List currentQualities = RememberVideoQualityPatch.getCurrentQualities(); + VideoQuality[] currentQualities = RememberVideoQualityPatch.getCurrentQualities(); VideoQuality currentQuality = RememberVideoQualityPatch.getCurrentQuality(); if (currentQualities == null || currentQuality == null) { Logger.printDebug(() -> "Cannot show qualities dialog, videoQualities is null"); return; } - if (currentQualities.size() < 2) { + if (currentQualities.length < 2) { // Should never happen. Logger.printException(() -> "Cannot show qualities dialog, no qualities available"); return; @@ -205,9 +205,17 @@ public class VideoQualityDialogButton { } // -1 adjustment for automatic quality at first index. - final int listViewSelectedIndex = currentQualities.indexOf(currentQuality) - 1; + int listViewSelectedIndex = 0; + for (VideoQuality quality : currentQualities) { + if (quality == currentQuality) { + // -1 adjustment for the missing automatic quality in the dialog list. + listViewSelectedIndex--; + break; + } + listViewSelectedIndex++; + } - List qualityLabels = new ArrayList<>(currentQualities.size() - 1); + List qualityLabels = new ArrayList<>(currentQualities.length - 1); for (VideoQuality availableQuality : currentQualities) { if (availableQuality.patch_getResolution() != AUTOMATIC_VIDEO_QUALITY_VALUE) { qualityLabels.add(availableQuality.patch_getQualityName()); @@ -310,7 +318,7 @@ public class VideoQualityDialogButton { listView.setOnItemClickListener((parent, view, which, id) -> { try { final int originalIndex = which + 1; // Adjust for automatic. - VideoQuality selectedQuality = currentQualities.get(originalIndex); + VideoQuality selectedQuality = currentQualities[originalIndex]; Logger.printDebug(() -> "User clicked on quality: " + selectedQuality); if (RememberVideoQualityPatch.shouldRememberVideoQuality()) {