From e52114076ed2e5b9929f9b952860e9ff3727c323 Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Sat, 21 Mar 2026 19:40:38 +0100 Subject: [PATCH] fix(YouTube - Playback speed): Old playback speed menu does not show with experimental app targets Co-authored-by: LisoUseInAIKyrios <118716522+lisouseinaikyrios@users.noreply.github.com> --- .../playback/speed/CustomPlaybackSpeedPatch.java | 8 ++++++++ .../video/speed/custom/CustomPlaybackSpeedPatch.kt | 13 ++++++++++++- .../youtube/video/speed/custom/Fingerprints.kt | 7 +++++++ 3 files changed, 27 insertions(+), 1 deletion(-) diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/playback/speed/CustomPlaybackSpeedPatch.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/playback/speed/CustomPlaybackSpeedPatch.java index e2c2353783..2b3784bcc8 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/playback/speed/CustomPlaybackSpeedPatch.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/playback/speed/CustomPlaybackSpeedPatch.java @@ -126,6 +126,14 @@ public class CustomPlaybackSpeedPatch { return !DISABLE_TAP_AND_HOLD_SPEED && original; } + /** + * Injection point. + */ + public static boolean useNewFlyoutMenu(boolean useNewFlyout) { + // If using old speed turn off A/B flyout that breaks old playback speed menu. + return useNewFlyout && !Settings.RESTORE_OLD_SPEED_MENU.get(); + } + /** * Injection point. */ diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/custom/CustomPlaybackSpeedPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/custom/CustomPlaybackSpeedPatch.kt index b048d53f0b..d7837d0794 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/custom/CustomPlaybackSpeedPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/custom/CustomPlaybackSpeedPatch.kt @@ -21,12 +21,14 @@ import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch import app.revanced.patches.youtube.misc.litho.filter.lithoFilterPatch import app.revanced.patches.youtube.misc.playservice.is_19_47_or_greater import app.revanced.patches.youtube.misc.playservice.is_20_34_or_greater +import app.revanced.patches.youtube.misc.playservice.is_21_02_or_greater import app.revanced.patches.youtube.misc.playservice.versionCheckPatch import app.revanced.patches.youtube.misc.recyclerviewtree.hook.addRecyclerViewTreeHook import app.revanced.patches.youtube.misc.recyclerviewtree.hook.recyclerViewTreeHookPatch import app.revanced.patches.youtube.misc.settings.settingsPatch import app.revanced.patches.youtube.video.speed.settingsMenuVideoSpeedGroup import app.revanced.util.indexOfFirstLiteralInstructionOrThrow +import app.revanced.util.insertLiteralOverride import app.revanced.util.returnEarly import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction @@ -88,7 +90,7 @@ internal val customPlaybackSpeedPatch = bytecodePatch( serverSideMaxSpeedFeatureFlagMethod.returnEarly(false) } - // region Force old video quality menu. + // region Force old playback speed menu. // Replace the speeds float array with custom speeds. speedArrayGeneratorMethodMatch.let { @@ -161,6 +163,15 @@ internal val customPlaybackSpeedPatch = bytecodePatch( // endregion + if (is_21_02_or_greater) { + flyoutMenuNonLegacyFeatureFlagMethodMatch.let { + it.method.insertLiteralOverride( + it[0], + "$EXTENSION_CLASS_DESCRIPTOR->useNewFlyoutMenu(Z)Z" + ) + } + } + // Close the unpatched playback dialog and show the custom speeds. addRecyclerViewTreeHook(EXTENSION_CLASS_DESCRIPTOR) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/custom/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/custom/Fingerprints.kt index e431b77c37..ee8e067dd6 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/custom/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/custom/Fingerprints.kt @@ -32,6 +32,13 @@ internal val BytecodePatchContext.serverSideMaxSpeedFeatureFlagMethod by getting ) } +internal val BytecodePatchContext.flyoutMenuNonLegacyFeatureFlagMethodMatch by composingFirstMethod { + accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) + returnType("V") + parameterTypes() + instructions(45731126L()) +} + internal val BytecodePatchContext.speedArrayGeneratorMethodMatch by composingFirstMethod { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) returnType("[L")