From 542291414efd90ec655f5fde01cfd5d69e0e41d6 Mon Sep 17 00:00:00 2001 From: inotia00 <108592928+inotia00@users.noreply.github.com> Date: Sun, 6 Oct 2024 22:09:32 +0900 Subject: [PATCH] fix(YouTube Music/Player components): `Hide Audio / Video toggle` setting not working in landscape mode --- .../components/PlayerComponentsPatch.kt | 28 +++++++++++++------ .../AudioVideoSwitchToggleFingerprint.kt | 25 +++++++++++++---- .../utils/resourceid/SharedResourceIdPatch.kt | 2 -- 3 files changed, 39 insertions(+), 16 deletions(-) diff --git a/src/main/kotlin/app/revanced/patches/music/player/components/PlayerComponentsPatch.kt b/src/main/kotlin/app/revanced/patches/music/player/components/PlayerComponentsPatch.kt index b16e361fd..ffcdedd01 100644 --- a/src/main/kotlin/app/revanced/patches/music/player/components/PlayerComponentsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/music/player/components/PlayerComponentsPatch.kt @@ -6,6 +6,7 @@ import app.revanced.patcher.extensions.InstructionExtensions.addInstructions import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels import app.revanced.patcher.extensions.InstructionExtensions.getInstruction import app.revanced.patcher.extensions.InstructionExtensions.removeInstruction +import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction import app.revanced.patcher.extensions.or import app.revanced.patcher.patch.PatchException import app.revanced.patcher.util.proxy.mutableTypes.MutableField.Companion.toMutable @@ -13,6 +14,7 @@ import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod.Companion.toMutable import app.revanced.patcher.util.smali.ExternalLabel import app.revanced.patches.music.player.components.fingerprints.AudioVideoSwitchToggleFingerprint +import app.revanced.patches.music.player.components.fingerprints.AudioVideoSwitchToggleFingerprint.AUDIO_VIDEO_SWITCH_TOGGLE_VISIBILITY import app.revanced.patches.music.player.components.fingerprints.EngagementPanelHeightFingerprint import app.revanced.patches.music.player.components.fingerprints.EngagementPanelHeightParentFingerprint import app.revanced.patches.music.player.components.fingerprints.HandleSearchRenderedFingerprint @@ -46,7 +48,6 @@ import app.revanced.patches.music.utils.integrations.Constants.INTEGRATIONS_PATH import app.revanced.patches.music.utils.integrations.Constants.PLAYER_CLASS_DESCRIPTOR import app.revanced.patches.music.utils.mainactivity.MainActivityResolvePatch import app.revanced.patches.music.utils.resourceid.SharedResourceIdPatch -import app.revanced.patches.music.utils.resourceid.SharedResourceIdPatch.AudioVideoSwitchToggle import app.revanced.patches.music.utils.resourceid.SharedResourceIdPatch.ColorGrey import app.revanced.patches.music.utils.resourceid.SharedResourceIdPatch.DarkBackground import app.revanced.patches.music.utils.resourceid.SharedResourceIdPatch.MiniPlayerPlayPauseReplayButton @@ -629,14 +630,25 @@ object PlayerComponentsPatch : BaseBytecodePatch( // region patch for hide audio video switch toggle AudioVideoSwitchToggleFingerprint.resultOrThrow().mutableMethod.apply { - val constIndex = indexOfFirstWideLiteralInstructionValueOrThrow(AudioVideoSwitchToggle) - val viewIndex = indexOfFirstInstructionOrThrow(constIndex, Opcode.MOVE_RESULT_OBJECT) - val viewRegister = getInstruction(viewIndex).registerA + implementation!!.instructions + .withIndex() + .filter { (_, instruction) -> + val reference = (instruction as? ReferenceInstruction)?.reference + instruction.opcode == Opcode.INVOKE_VIRTUAL && + reference is MethodReference && + reference.toString() == AUDIO_VIDEO_SWITCH_TOGGLE_VISIBILITY + } + .map { (index, _) -> index } + .reversed() + .forEach { index -> + val instruction = getInstruction(index) - addInstruction( - viewIndex + 1, - "invoke-static {v$viewRegister}, $PLAYER_CLASS_DESCRIPTOR->hideAudioVideoSwitchToggle(Landroid/view/View;)V" - ) + replaceInstruction( + index, + "invoke-static {v${instruction.registerC}, v${instruction.registerD}}," + + "$PLAYER_CLASS_DESCRIPTOR->hideAudioVideoSwitchToggle(Landroid/view/View;I)V" + ) + } } SettingsPatch.addSwitchPreference( diff --git a/src/main/kotlin/app/revanced/patches/music/player/components/fingerprints/AudioVideoSwitchToggleFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/player/components/fingerprints/AudioVideoSwitchToggleFingerprint.kt index 6101c89e9..1638d3f81 100644 --- a/src/main/kotlin/app/revanced/patches/music/player/components/fingerprints/AudioVideoSwitchToggleFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/music/player/components/fingerprints/AudioVideoSwitchToggleFingerprint.kt @@ -1,12 +1,25 @@ package app.revanced.patches.music.player.components.fingerprints import app.revanced.patcher.extensions.or -import app.revanced.patches.music.utils.resourceid.SharedResourceIdPatch.AudioVideoSwitchToggle -import app.revanced.util.fingerprint.LiteralValueFingerprint +import app.revanced.patcher.fingerprint.MethodFingerprint +import app.revanced.patches.music.player.components.fingerprints.AudioVideoSwitchToggleFingerprint.AUDIO_VIDEO_SWITCH_TOGGLE_VISIBILITY +import app.revanced.util.getReference +import app.revanced.util.indexOfFirstInstruction import com.android.tools.smali.dexlib2.AccessFlags +import com.android.tools.smali.dexlib2.Opcode +import com.android.tools.smali.dexlib2.iface.reference.MethodReference -internal object AudioVideoSwitchToggleFingerprint : LiteralValueFingerprint( +internal object AudioVideoSwitchToggleFingerprint : MethodFingerprint( returnType = "V", - accessFlags = AccessFlags.PUBLIC or AccessFlags.CONSTRUCTOR, - literalSupplier = { AudioVideoSwitchToggle }, -) \ No newline at end of file + accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, + parameters = emptyList(), + customFingerprint = { methodDef, _ -> + methodDef.indexOfFirstInstruction { + opcode == Opcode.INVOKE_VIRTUAL && + getReference()?.toString() == AUDIO_VIDEO_SWITCH_TOGGLE_VISIBILITY + } >= 0 + } +) { + const val AUDIO_VIDEO_SWITCH_TOGGLE_VISIBILITY = + "Lcom/google/android/apps/youtube/music/player/AudioVideoSwitcherToggleView;->setVisibility(I)V" +} \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/music/utils/resourceid/SharedResourceIdPatch.kt b/src/main/kotlin/app/revanced/patches/music/utils/resourceid/SharedResourceIdPatch.kt index 3926a3abf..bd40f4674 100644 --- a/src/main/kotlin/app/revanced/patches/music/utils/resourceid/SharedResourceIdPatch.kt +++ b/src/main/kotlin/app/revanced/patches/music/utils/resourceid/SharedResourceIdPatch.kt @@ -16,7 +16,6 @@ import app.revanced.patches.shared.mapping.ResourceType.STYLE @Patch(dependencies = [ResourceMappingPatch::class]) object SharedResourceIdPatch : ResourcePatch() { var AccountSwitcherAccessibility = -1L - var AudioVideoSwitchToggle = -1L var BottomSheetRecyclerView = -1L var ButtonContainer = -1L var ButtonIconPaddingMedium = -1L @@ -62,7 +61,6 @@ object SharedResourceIdPatch : ResourcePatch() { override fun execute(context: ResourceContext) { AccountSwitcherAccessibility = getId(STRING, "account_switcher_accessibility_label") - AudioVideoSwitchToggle = getId(ID, "audio_video_switch_toggle") BottomSheetRecyclerView = getId(LAYOUT, "bottom_sheet_recycler_view") ButtonContainer = getId(ID, "button_container") ButtonIconPaddingMedium = getId(DIMEN, "button_icon_padding_medium")