Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix(YouTube - Remember video quality): Correctly set default quality when changing from a low quality video #3879

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -416,7 +416,6 @@ public static void hideShortsShareButton(final View shareButtonView) {
// endregion

public static void setNavigationBar(PivotBar view) {
Logger.printDebug(() -> "Setting navigation bar");
pivotBarRef = new WeakReference<>(view);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -62,19 +62,12 @@ private static void changeDefaultQuality(int defaultQuality) {
*/
public static int setVideoQuality(Object[] qualities, final int originalQualityIndex, Object qInterface, String qIndexMethod) {
try {
if (!(qualityNeedsUpdating || userChangedDefaultQuality) || qInterface == null) {
return originalQualityIndex;
}
qualityNeedsUpdating = false;
final int preferredQuality = Utils.getNetworkType() == NetworkType.MOBILE
? mobileQualitySetting.get()
: wifiQualitySetting.get();

final int preferredQuality;
if (Utils.getNetworkType() == NetworkType.MOBILE) {
preferredQuality = mobileQualitySetting.get();
} else {
preferredQuality = wifiQualitySetting.get();
}
if (!userChangedDefaultQuality && preferredQuality == AUTOMATIC_VIDEO_QUALITY_VALUE) {
return originalQualityIndex; // nothing to do
return originalQualityIndex; // Nothing to do.
}

if (videoQualities == null || videoQualities.size() != qualities.length) {
Expand All @@ -87,7 +80,11 @@ public static int setVideoQuality(Object[] qualities, final int originalQualityI
}
}
}
Logger.printDebug(() -> "videoQualities: " + videoQualities);

// After changing videos the qualities can initially be for the prior video.
// So if the qualities have changed an update is needed.
qualityNeedsUpdating = true;
Logger.printDebug(() -> "VideoQualities: " + videoQualities);
}

if (userChangedDefaultQuality) {
Expand All @@ -98,7 +95,12 @@ public static int setVideoQuality(Object[] qualities, final int originalQualityI
return userSelectedQualityIndex;
}

// find the highest quality that is equal to or less than the preferred
if (!qualityNeedsUpdating) {
return originalQualityIndex;
}
qualityNeedsUpdating = false;

// Find the highest quality that is equal to or less than the preferred.
int qualityToUse = videoQualities.get(0); // first element is automatic mode
int qualityIndexToUse = 0;
int i = 0;
Expand All @@ -112,20 +114,18 @@ public static int setVideoQuality(Object[] qualities, final int originalQualityI

// If the desired quality index is equal to the original index,
// then the video is already set to the desired default quality.
//
// The method could return here, but the UI video quality flyout will still
// show 'Auto' (ie: Auto (480p))
// It appears that "Auto" picks the resolution on video load,
// and it does not appear to change the resolution during playback.
//
// To prevent confusion, set the video index anyways (even if it matches the existing index)
// As that will force the UI picker to not display "Auto" which may confuse the user.
final int qualityToUseFinal = qualityToUse;
if (qualityIndexToUse == originalQualityIndex) {
Logger.printDebug(() -> "Video is already preferred quality: " + preferredQuality);
// On first load of a new video, if the UI video quality flyout menu
// is not updated then it will still show 'Auto' (ie: Auto (480p)),
// even though it's already set to the desired resolution.
//
// To prevent confusion, set the video index anyways (even if it matches the existing index)
// as that will force the UI picker to not display "Auto".
Logger.printDebug(() -> "Video is already preferred quality: " + qualityToUseFinal);
} else {
final int qualityToUseLog = qualityToUse;
Logger.printDebug(() -> "Quality changed from: "
+ videoQualities.get(originalQualityIndex) + " to: " + qualityToUseLog);
Logger.printDebug(() -> "Changing video quality from: "
+ videoQualities.get(originalQualityIndex) + " to: " + qualityToUseFinal);
}

Method m = qInterface.getClass().getMethod(qIndexMethod, Integer.TYPE);
Expand Down
Loading