From c6022a4cecb0687e5d96a96afd15bbca287a1bff Mon Sep 17 00:00:00 2001 From: inotia00 <108592928+inotia00@users.noreply.github.com> Date: Sat, 23 Mar 2024 19:32:10 +0900 Subject: [PATCH] fix(YouTube/Enable old quality layout): patch does not apply to quality menu in shorts player --- .../oldqualitylayout/OldQualityLayoutPatch.kt | 36 ++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git a/src/main/kotlin/app/revanced/patches/youtube/flyoutpanel/oldqualitylayout/OldQualityLayoutPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/flyoutpanel/oldqualitylayout/OldQualityLayoutPatch.kt index d74c7bf60..c7ee76c2b 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/flyoutpanel/oldqualitylayout/OldQualityLayoutPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/flyoutpanel/oldqualitylayout/OldQualityLayoutPatch.kt @@ -2,20 +2,30 @@ package app.revanced.patches.youtube.flyoutpanel.oldqualitylayout import app.revanced.patcher.data.BytecodeContext import app.revanced.patcher.extensions.InstructionExtensions.addInstruction +import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels import app.revanced.patcher.extensions.InstructionExtensions.getInstruction import app.revanced.patcher.patch.BytecodePatch +import app.revanced.patcher.patch.PatchException import app.revanced.patcher.patch.annotation.CompatiblePackage import app.revanced.patcher.patch.annotation.Patch +import app.revanced.patcher.util.smali.ExternalLabel import app.revanced.patches.youtube.flyoutpanel.recyclerview.BottomSheetRecyclerViewPatch import app.revanced.patches.youtube.utils.fingerprints.QualityMenuViewInflateFingerprint import app.revanced.patches.youtube.utils.fingerprints.RecyclerViewTreeObserverFingerprint +import app.revanced.patches.youtube.utils.fingerprints.VideoQualitySetterFingerprint import app.revanced.patches.youtube.utils.integrations.Constants.COMPONENTS_PATH import app.revanced.patches.youtube.utils.integrations.Constants.FLYOUT_PANEL import app.revanced.patches.youtube.utils.litho.LithoFilterPatch import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch import app.revanced.patches.youtube.utils.settings.SettingsPatch import app.revanced.util.exception +import app.revanced.util.getReference +import app.revanced.util.getTargetIndex +import app.revanced.util.indexOfFirstInstruction +import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction +import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction +import com.android.tools.smali.dexlib2.iface.reference.FieldReference @Patch( name = "Enable old quality layout", @@ -62,7 +72,8 @@ import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction object OldQualityLayoutPatch : BytecodePatch( setOf( RecyclerViewTreeObserverFingerprint, - QualityMenuViewInflateFingerprint + QualityMenuViewInflateFingerprint, + VideoQualitySetterFingerprint ) ) { override fun execute(context: BytecodeContext) { @@ -70,6 +81,9 @@ object OldQualityLayoutPatch : BytecodePatch( /** * Old method */ + val videoQualityClass = VideoQualitySetterFingerprint.result?.mutableMethod?.definingClass + ?: throw VideoQualitySetterFingerprint.exception + QualityMenuViewInflateFingerprint.result?.let { it.mutableMethod.apply { val insertIndex = it.scanResult.patternScanResult!!.endIndex @@ -80,6 +94,26 @@ object OldQualityLayoutPatch : BytecodePatch( "invoke-static { v$insertRegister }, $FLYOUT_PANEL->enableOldQualityMenu(Landroid/widget/ListView;)V" ) } + val onItemClickMethod = + it.mutableClass.methods.find { method -> method.name == "onItemClick" } + + onItemClickMethod?.apply { + val insertIndex = getTargetIndex(Opcode.IGET_OBJECT) + val insertRegister = getInstruction(insertIndex).registerA + + val jumpIndex = indexOfFirstInstruction { + opcode == Opcode.IGET_OBJECT + && this.getReference()?.type == videoQualityClass + } + + addInstructionsWithLabels( + insertIndex, """ + invoke-static {}, $FLYOUT_PANEL->enableOldQualityMenu()Z + move-result v$insertRegister + if-nez v$insertRegister, :show + """, ExternalLabel("show", getInstruction(jumpIndex)) + ) + } ?: throw PatchException("Failed to find onItemClick method") } ?: throw QualityMenuViewInflateFingerprint.exception /**