From 885f9b19ff6c141ea8b61ab389d8c7ea46d3832e Mon Sep 17 00:00:00 2001 From: inotia00 Date: Tue, 4 Jul 2023 14:39:36 +0900 Subject: [PATCH] fix(youtube/custom-video-speed): not working in new player flyout panel --- .../FlyoutPanelPatchFingerprint.kt | 12 ++ ...aybackRateBottomSheetBuilderFingerprint.kt | 12 ++ ...PlaybackRateBottomSheetClassFingerprint.kt | 12 ++ .../patch/OldSpeedLayoutPatch.kt | 119 ++++++++++++++++++ .../patch/CustomVideoSpeedPatch.kt | 2 + 5 files changed, 157 insertions(+) create mode 100644 src/main/kotlin/app/revanced/patches/youtube/flyoutpanel/oldspeedlayout/fingerprints/FlyoutPanelPatchFingerprint.kt create mode 100644 src/main/kotlin/app/revanced/patches/youtube/flyoutpanel/oldspeedlayout/fingerprints/PlaybackRateBottomSheetBuilderFingerprint.kt create mode 100644 src/main/kotlin/app/revanced/patches/youtube/flyoutpanel/oldspeedlayout/fingerprints/PlaybackRateBottomSheetClassFingerprint.kt create mode 100644 src/main/kotlin/app/revanced/patches/youtube/flyoutpanel/oldspeedlayout/patch/OldSpeedLayoutPatch.kt diff --git a/src/main/kotlin/app/revanced/patches/youtube/flyoutpanel/oldspeedlayout/fingerprints/FlyoutPanelPatchFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/flyoutpanel/oldspeedlayout/fingerprints/FlyoutPanelPatchFingerprint.kt new file mode 100644 index 000000000..60dbf1ca5 --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/youtube/flyoutpanel/oldspeedlayout/fingerprints/FlyoutPanelPatchFingerprint.kt @@ -0,0 +1,12 @@ +package app.revanced.patches.youtube.flyoutpanel.oldspeedlayout.fingerprints + +import app.revanced.patcher.extensions.or +import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint +import org.jf.dexlib2.AccessFlags + +object FlyoutPanelPatchFingerprint : MethodFingerprint( + returnType = "V", + accessFlags = AccessFlags.PRIVATE or AccessFlags.STATIC, + parameters = listOf(), + customFingerprint = { methodDef, _ -> methodDef.definingClass.endsWith("/FlyoutPanelPatch;") && methodDef.name == "openOldPlaybackRateBottomSheetFragment" } +) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/flyoutpanel/oldspeedlayout/fingerprints/PlaybackRateBottomSheetBuilderFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/flyoutpanel/oldspeedlayout/fingerprints/PlaybackRateBottomSheetBuilderFingerprint.kt new file mode 100644 index 000000000..ac0645742 --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/youtube/flyoutpanel/oldspeedlayout/fingerprints/PlaybackRateBottomSheetBuilderFingerprint.kt @@ -0,0 +1,12 @@ +package app.revanced.patches.youtube.flyoutpanel.oldspeedlayout.fingerprints + +import app.revanced.patcher.extensions.or +import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint +import org.jf.dexlib2.AccessFlags + +object PlaybackRateBottomSheetBuilderFingerprint : MethodFingerprint( + returnType = "V", + accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, + parameters = listOf(), + strings = listOf("PLAYBACK_RATE_MENU_BOTTOM_SHEET_FRAGMENT") +) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/flyoutpanel/oldspeedlayout/fingerprints/PlaybackRateBottomSheetClassFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/flyoutpanel/oldspeedlayout/fingerprints/PlaybackRateBottomSheetClassFingerprint.kt new file mode 100644 index 000000000..cb36308c0 --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/youtube/flyoutpanel/oldspeedlayout/fingerprints/PlaybackRateBottomSheetClassFingerprint.kt @@ -0,0 +1,12 @@ +package app.revanced.patches.youtube.flyoutpanel.oldspeedlayout.fingerprints + +import app.revanced.patcher.extensions.or +import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint +import org.jf.dexlib2.AccessFlags + +object PlaybackRateBottomSheetClassFingerprint : MethodFingerprint( + returnType = "V", + accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, + parameters = listOf("[L", "I"), + strings = listOf("menu_item_playback_speed") +) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/flyoutpanel/oldspeedlayout/patch/OldSpeedLayoutPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/flyoutpanel/oldspeedlayout/patch/OldSpeedLayoutPatch.kt new file mode 100644 index 000000000..e3a009a76 --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/youtube/flyoutpanel/oldspeedlayout/patch/OldSpeedLayoutPatch.kt @@ -0,0 +1,119 @@ +package app.revanced.patches.youtube.flyoutpanel.oldspeedlayout.patch + +import app.revanced.extensions.toErrorResult +import app.revanced.patcher.annotation.Description +import app.revanced.patcher.annotation.Name +import app.revanced.patcher.annotation.Version +import app.revanced.patcher.data.BytecodeContext +import app.revanced.patcher.extensions.InstructionExtensions.addInstruction +import app.revanced.patcher.extensions.InstructionExtensions.getInstruction +import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction +import app.revanced.patcher.extensions.or +import app.revanced.patcher.patch.BytecodePatch +import app.revanced.patcher.patch.PatchResult +import app.revanced.patcher.patch.PatchResultSuccess +import app.revanced.patcher.patch.annotations.DependsOn +import app.revanced.patcher.util.proxy.mutableTypes.MutableField.Companion.toMutable +import app.revanced.patches.youtube.flyoutpanel.oldspeedlayout.fingerprints.FlyoutPanelPatchFingerprint +import app.revanced.patches.youtube.flyoutpanel.oldspeedlayout.fingerprints.PlaybackRateBottomSheetBuilderFingerprint +import app.revanced.patches.youtube.flyoutpanel.oldspeedlayout.fingerprints.PlaybackRateBottomSheetClassFingerprint +import app.revanced.patches.youtube.utils.fingerprints.NewFlyoutPanelBuilderFingerprint +import app.revanced.patches.youtube.utils.litho.patch.LithoFilterPatch +import app.revanced.util.bytecode.BytecodeHelper.updatePatchStatus +import app.revanced.util.integrations.Constants.FLYOUT_PANEL +import org.jf.dexlib2.AccessFlags +import org.jf.dexlib2.iface.instruction.OneRegisterInstruction +import org.jf.dexlib2.immutable.ImmutableField + +@Name("enable-old-speed-layout") +@Description("Enables the original speed flyout menu.") +@DependsOn([LithoFilterPatch::class]) +@Version("0.0.1") +class OldSpeedLayoutPatch : BytecodePatch( + listOf( + FlyoutPanelPatchFingerprint, + NewFlyoutPanelBuilderFingerprint, + PlaybackRateBottomSheetClassFingerprint, + PlaybackRateBottomSheetBuilderFingerprint + ) +) { + override fun execute(context: BytecodeContext): PatchResult { + + /** + * Find the values we need + */ + PlaybackRateBottomSheetBuilderFingerprint.result?.let { + it.mutableMethod.apply { + PLAYBACK_RATE_BOTTOM_SHEET_CLASS = definingClass + PLAYBACK_RATE_BOTTOM_SHEET_BUILDER_METHOD = name + } + } ?: return PlaybackRateBottomSheetClassFingerprint.toErrorResult() + + /** + * Create a static field in the patch + * Add a call the Playback Speed Bottom Sheet Fragment method + */ + FlyoutPanelPatchFingerprint.result?.let { + it.mutableMethod.apply { + // Create a static field 'playbackRateBottomSheetClass' in FlyoutPanelPatch. + it.mutableClass.staticFields.add( + ImmutableField( + definingClass, + "playbackRateBottomSheetClass", + PLAYBACK_RATE_BOTTOM_SHEET_CLASS, + AccessFlags.PUBLIC or AccessFlags.STATIC, + null, + null, + null + ).toMutable() + ) + + // Add a call the Playback Speed Bottom Sheet Fragment method + replaceInstruction( + 3, + "invoke-virtual {v0}, $PLAYBACK_RATE_BOTTOM_SHEET_CLASS->$PLAYBACK_RATE_BOTTOM_SHEET_BUILDER_METHOD()V" + ) + + replaceInstruction( + 0, + "sget-object v0, $FLYOUT_PANEL->playbackRateBottomSheetClass:$PLAYBACK_RATE_BOTTOM_SHEET_CLASS" + ) + } + } ?: return FlyoutPanelPatchFingerprint.toErrorResult() + + /** + * Input 'playbackRateBottomSheetClass' in FlyoutPanelPatch. + */ + PlaybackRateBottomSheetClassFingerprint.result?.let { + it.mutableMethod.apply { + addInstruction( + 0, + "sput-object p0, $FLYOUT_PANEL->playbackRateBottomSheetClass:$PLAYBACK_RATE_BOTTOM_SHEET_CLASS" + ) + } + } ?: return PlaybackRateBottomSheetClassFingerprint.toErrorResult() + + /** + * New method + */ + NewFlyoutPanelBuilderFingerprint.result?.let { + it.mutableMethod.apply { + val insertIndex = implementation!!.instructions.size - 1 + val insertRegister = getInstruction(insertIndex).registerA + + addInstruction( + insertIndex, + "invoke-static { v$insertRegister }, $FLYOUT_PANEL->enableOldPlaybackRateMenu(Landroid/widget/LinearLayout;)V" + ) + } + } ?: return NewFlyoutPanelBuilderFingerprint.toErrorResult() + + context.updatePatchStatus("OldSpeedLayout") + + return PatchResultSuccess() + } + private companion object { + lateinit var PLAYBACK_RATE_BOTTOM_SHEET_CLASS: String + lateinit var PLAYBACK_RATE_BOTTOM_SHEET_BUILDER_METHOD: String + } +} diff --git a/src/main/kotlin/app/revanced/patches/youtube/video/customspeed/patch/CustomVideoSpeedPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/video/customspeed/patch/CustomVideoSpeedPatch.kt index ba23c4814..6a4c3d842 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/video/customspeed/patch/CustomVideoSpeedPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/video/customspeed/patch/CustomVideoSpeedPatch.kt @@ -13,6 +13,7 @@ import app.revanced.patcher.patch.PatchResult import app.revanced.patcher.patch.PatchResultSuccess import app.revanced.patcher.patch.annotations.DependsOn import app.revanced.patcher.patch.annotations.Patch +import app.revanced.patches.youtube.flyoutpanel.oldspeedlayout.patch.OldSpeedLayoutPatch import app.revanced.patches.youtube.utils.alertdialog.patch.NewLayoutAlertDialogPatch import app.revanced.patches.youtube.utils.annotations.YouTubeCompatibility import app.revanced.patches.youtube.utils.settings.resource.patch.SettingsPatch @@ -33,6 +34,7 @@ import org.jf.dexlib2.iface.reference.MethodReference @DependsOn( [ NewLayoutAlertDialogPatch::class, + OldSpeedLayoutPatch::class, SettingsPatch::class ] )