From 68ac8ab6b281f36096eebc38f986b6f661c630c7 Mon Sep 17 00:00:00 2001 From: inotia00 <108592928+inotia00@users.noreply.github.com> Date: Sat, 18 Jan 2025 20:09:51 +0900 Subject: [PATCH] fix(YouTube Music - Custom header): `Custom Header for YouTube Music` is causing app crashing in `8.02.53` https://github.com/inotia00/ReVanced_Extended/issues/2692 --- .../music/patches/general/GeneralPatch.java | 13 ++++++ .../music/layout/header/ChangeHeaderPatch.kt | 45 ++++++++++++++++--- 2 files changed, 53 insertions(+), 5 deletions(-) diff --git a/extensions/shared/src/main/java/app/revanced/extension/music/patches/general/GeneralPatch.java b/extensions/shared/src/main/java/app/revanced/extension/music/patches/general/GeneralPatch.java index 72d3ba3f3..3e0dd7afc 100644 --- a/extensions/shared/src/main/java/app/revanced/extension/music/patches/general/GeneralPatch.java +++ b/extensions/shared/src/main/java/app/revanced/extension/music/patches/general/GeneralPatch.java @@ -12,6 +12,7 @@ import android.widget.Button; import android.widget.ImageView; import app.revanced.extension.music.settings.Settings; +import app.revanced.extension.shared.utils.ResourceUtils; /** * @noinspection ALL @@ -19,6 +20,18 @@ import app.revanced.extension.music.settings.Settings; @SuppressWarnings("unused") public class GeneralPatch { + // region [Change header] patch + + public static int getHeaderDrawableId(int original) { + final int headerId = ResourceUtils.getDrawableIdentifier("action_bar_logo"); + + return headerId == 0 + ? original + : headerId; + } + + // endregion + // region [Change start page] patch public static String changeStartPage(final String browseId) { diff --git a/patches/src/main/kotlin/app/revanced/patches/music/layout/header/ChangeHeaderPatch.kt b/patches/src/main/kotlin/app/revanced/patches/music/layout/header/ChangeHeaderPatch.kt index 8143cfddd..e580af2b5 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/layout/header/ChangeHeaderPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/layout/header/ChangeHeaderPatch.kt @@ -4,8 +4,10 @@ import app.revanced.patcher.patch.bytecodePatch import app.revanced.patcher.patch.resourcePatch import app.revanced.patcher.patch.stringOption import app.revanced.patches.music.utils.compatibility.Constants.COMPATIBLE_PACKAGE +import app.revanced.patches.music.utils.extension.Constants.GENERAL_CLASS_DESCRIPTOR import app.revanced.patches.music.utils.patch.PatchList.CUSTOM_HEADER_FOR_YOUTUBE_MUSIC import app.revanced.patches.music.utils.playservice.is_7_06_or_greater +import app.revanced.patches.music.utils.playservice.is_7_27_or_greater import app.revanced.patches.music.utils.playservice.versionCheckPatch import app.revanced.patches.music.utils.resourceid.actionBarLogo import app.revanced.patches.music.utils.resourceid.actionBarLogoRingo2 @@ -15,14 +17,17 @@ import app.revanced.patches.music.utils.resourceid.ytmLogoRingo2 import app.revanced.patches.music.utils.settings.ResourceUtils.getIconType import app.revanced.patches.music.utils.settings.ResourceUtils.updatePatchStatus import app.revanced.patches.music.utils.settings.settingsPatch +import app.revanced.util.REGISTER_TEMPLATE_REPLACEMENT import app.revanced.util.ResourceGroup import app.revanced.util.Utils.printWarn import app.revanced.util.Utils.trimIndentMultiline import app.revanced.util.copyFile import app.revanced.util.copyResources +import app.revanced.util.doRecursively import app.revanced.util.replaceLiteralInstructionCall import app.revanced.util.underBarOrThrow import app.revanced.util.valueOrThrow +import org.w3c.dom.Element private const val DEFAULT_HEADER_KEY = "Custom branding icon" private const val DEFAULT_HEADER_VALUE = "custom_branding_icon" @@ -125,11 +130,26 @@ private val changeHeaderBytecodePatch = bytecodePatch( return@execute } - listOf( - actionBarLogoRingo2 to actionBarLogo, - ytmLogoRingo2 to ytmLogo, - ).forEach { (originalResource, replacementResource) -> - replaceLiteralInstructionCall(originalResource, replacementResource) + if (actionBarLogoRingo2 == -1L || ytmLogoRingo2 == -1L) { + printWarn("Target resource not found!") + return@execute + } + + if (is_7_27_or_greater) { + replaceLiteralInstructionCall( + actionBarLogoRingo2, + """ + invoke-static {v$REGISTER_TEMPLATE_REPLACEMENT}, $GENERAL_CLASS_DESCRIPTOR->getHeaderDrawableId(I)I + move-result v$REGISTER_TEMPLATE_REPLACEMENT + """ + ) + } else { + listOf( + actionBarLogoRingo2 to actionBarLogo, + ytmLogoRingo2 to ytmLogo, + ).forEach { (originalResource, replacementResource) -> + replaceLiteralInstructionCall(originalResource, replacementResource) + } } } } @@ -186,6 +206,21 @@ val changeHeaderPatch = resourcePatch( printWarn(warnings) } + if (is_7_27_or_greater) { + document("res/layout/signin_fragment.xml").use { document -> + document.doRecursively node@{ node -> + if (node !is Element) return@node + + if (node.attributes.getNamedItem("android:id")?.nodeValue == "@id/logo") { + node.getAttributeNode("android:src") + ?.let { attribute -> + attribute.textContent = "@drawable/ytm_logo" + } + } + } + } + } + updatePatchStatus(CUSTOM_HEADER_FOR_YOUTUBE_MUSIC) }