diff --git a/src/main/kotlin/app/revanced/patches/music/player/replace/ReplaceCastButtonPatch.kt b/src/main/kotlin/app/revanced/patches/music/player/replace/ReplaceCastButtonPatch.kt index 3b2419eea..812586284 100644 --- a/src/main/kotlin/app/revanced/patches/music/player/replace/ReplaceCastButtonPatch.kt +++ b/src/main/kotlin/app/revanced/patches/music/player/replace/ReplaceCastButtonPatch.kt @@ -9,6 +9,8 @@ import app.revanced.patcher.patch.BytecodePatch import app.revanced.patcher.patch.annotation.CompatiblePackage import app.revanced.patcher.patch.annotation.Patch import app.revanced.patches.music.player.replace.fingerprints.CastButtonContainerFingerprint +import app.revanced.patches.music.utils.mainactivity.MainActivityResolvePatch +import app.revanced.patches.music.utils.mainactivity.MainActivityResolvePatch.mainActivityClassDef import app.revanced.patches.music.utils.playerresponse.PlayerResponsePatch import app.revanced.patches.music.utils.resourceid.SharedResourceIdPatch import app.revanced.patches.music.utils.resourceid.SharedResourceIdPatch.PlayerCastMediaRouteButton @@ -32,6 +34,7 @@ import com.android.tools.smali.dexlib2.iface.reference.MethodReference name = "Replace cast button", description = "Replace the cast button in the player with the open music button.", dependencies = [ + MainActivityResolvePatch::class, PlayerResponsePatch::class, SettingsPatch::class, SharedResourceIdPatch::class, @@ -41,10 +44,9 @@ import com.android.tools.smali.dexlib2.iface.reference.MethodReference use = false ) @Suppress("unused") -object ReplaceCastButtonPatch : BytecodePatch( - setOf(CastButtonContainerFingerprint) -) { +object ReplaceCastButtonPatch : BytecodePatch() { override fun execute(context: BytecodeContext) { + CastButtonContainerFingerprint.resolve(context, mainActivityClassDef) CastButtonContainerFingerprint.result?.let { it.mutableMethod.apply { diff --git a/src/main/kotlin/app/revanced/patches/music/player/replace/fingerprints/CastButtonContainerFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/player/replace/fingerprints/CastButtonContainerFingerprint.kt index 9f16f0720..3d10d3aa9 100644 --- a/src/main/kotlin/app/revanced/patches/music/player/replace/fingerprints/CastButtonContainerFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/music/player/replace/fingerprints/CastButtonContainerFingerprint.kt @@ -8,6 +8,5 @@ object CastButtonContainerFingerprint : MethodFingerprint( returnType = "V", customFingerprint = { methodDef, _ -> methodDef.isWideLiteralExists(PlayerCastMediaRouteButton) - && methodDef.definingClass.endsWith("/MusicActivity;") } ) diff --git a/src/main/kotlin/app/revanced/patches/music/utils/mainactivity/MainActivityResolvePatch.kt b/src/main/kotlin/app/revanced/patches/music/utils/mainactivity/MainActivityResolvePatch.kt new file mode 100644 index 000000000..e4da8e607 --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/music/utils/mainactivity/MainActivityResolvePatch.kt @@ -0,0 +1,36 @@ +package app.revanced.patches.music.utils.mainactivity + +import app.revanced.extensions.exception +import app.revanced.patcher.data.BytecodeContext +import app.revanced.patcher.extensions.InstructionExtensions.addInstruction +import app.revanced.patcher.patch.BytecodePatch +import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod +import app.revanced.patches.music.utils.mainactivity.fingerprints.MainActivityFingerprint +import app.revanced.util.integrations.Constants.MUSIC_UTILS_PATH +import com.android.tools.smali.dexlib2.iface.ClassDef + +object MainActivityResolvePatch : BytecodePatch( + setOf(MainActivityFingerprint) +) { + lateinit var mainActivityClassDef: ClassDef + private lateinit var onCreateMethod: MutableMethod + + override fun execute(context: BytecodeContext) { + MainActivityFingerprint.result?.let { + mainActivityClassDef = it.classDef + onCreateMethod = it.mutableMethod + } ?: throw MainActivityFingerprint.exception + } + + fun injectInit( + methods: String, + descriptor: String + ) { + onCreateMethod.apply { + addInstruction( + 2, + "invoke-static/range {p0 .. p0}, $MUSIC_UTILS_PATH/$methods;->$descriptor(Landroid/content/Context;)V" + ) + } + } +} \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/music/utils/mainactivity/fingerprints/MainActivityFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/utils/mainactivity/fingerprints/MainActivityFingerprint.kt new file mode 100644 index 000000000..317db8cfc --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/music/utils/mainactivity/fingerprints/MainActivityFingerprint.kt @@ -0,0 +1,16 @@ +package app.revanced.patches.music.utils.mainactivity.fingerprints + +import app.revanced.patcher.fingerprint.MethodFingerprint + +object MainActivityFingerprint : MethodFingerprint( + returnType = "V", + parameters = listOf("Landroid/os/Bundle;"), + strings = listOf( + "android.intent.action.MAIN", + "FEmusic_home" + ), + customFingerprint = { methodDef, _ -> + methodDef.definingClass.endsWith("Activity;") + && methodDef.name == "onCreate" + } +) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/music/utils/microg/MicroGPatch.kt b/src/main/kotlin/app/revanced/patches/music/utils/microg/MicroGPatch.kt index 02dfb059a..75ee3f8ad 100644 --- a/src/main/kotlin/app/revanced/patches/music/utils/microg/MicroGPatch.kt +++ b/src/main/kotlin/app/revanced/patches/music/utils/microg/MicroGPatch.kt @@ -6,6 +6,8 @@ import app.revanced.patcher.patch.PatchException import app.revanced.patcher.patch.annotation.CompatiblePackage import app.revanced.patcher.patch.annotation.Patch import app.revanced.patches.music.utils.fix.clientspoof.ClientSpoofPatch +import app.revanced.patches.music.utils.mainactivity.MainActivityResolvePatch +import app.revanced.patches.music.utils.mainactivity.MainActivityResolvePatch.injectInit import app.revanced.patches.music.utils.microg.Constants.MUSIC_PACKAGE_NAME import app.revanced.patches.music.utils.microg.Constants.YOUTUBE_PACKAGE_NAME import app.revanced.patches.music.utils.microg.fingerprints.CastContextFetchFingerprint @@ -15,7 +17,6 @@ import app.revanced.patches.music.utils.microg.fingerprints.GooglePlayUtilityFin import app.revanced.patches.music.utils.microg.fingerprints.PrimeFingerprint import app.revanced.patches.music.utils.microg.fingerprints.ServiceCheckFingerprint import app.revanced.patches.shared.patch.packagename.PackageNamePatch -import app.revanced.util.bytecode.BytecodeHelper.injectInit import app.revanced.util.microg.MicroGBytecodeHelper @Patch( @@ -23,6 +24,7 @@ import app.revanced.util.microg.MicroGBytecodeHelper description = "Allows ReVanced Extended Music to run without root and under a different package name with MicroG.", dependencies = [ ClientSpoofPatch::class, + MainActivityResolvePatch::class, MicroGResourcePatch::class, PackageNamePatch::class ], @@ -79,7 +81,7 @@ object MicroGPatch : BytecodePatch( ) ) - context.injectInit("MicroGPatch", "checkAvailability", false) + injectInit("MicroGPatch", "checkAvailability") } } diff --git a/src/main/kotlin/app/revanced/patches/music/utils/settings/SettingsBytecodePatch.kt b/src/main/kotlin/app/revanced/patches/music/utils/settings/SettingsBytecodePatch.kt index d28dcf78d..e54ce099d 100644 --- a/src/main/kotlin/app/revanced/patches/music/utils/settings/SettingsBytecodePatch.kt +++ b/src/main/kotlin/app/revanced/patches/music/utils/settings/SettingsBytecodePatch.kt @@ -8,15 +8,19 @@ import app.revanced.patcher.patch.BytecodePatch import app.revanced.patcher.patch.annotation.Patch import app.revanced.patches.music.utils.fingerprints.NewPlayerLayoutFingerprint import app.revanced.patches.music.utils.integrations.IntegrationsPatch +import app.revanced.patches.music.utils.mainactivity.MainActivityResolvePatch +import app.revanced.patches.music.utils.mainactivity.MainActivityResolvePatch.injectInit import app.revanced.patches.music.utils.settings.fingerprints.PreferenceFingerprint import app.revanced.patches.music.utils.settings.fingerprints.SettingsHeadersFragmentFingerprint -import app.revanced.util.bytecode.BytecodeHelper.injectInit import app.revanced.util.integrations.Constants.MUSIC_INTEGRATIONS_PATH import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction @Patch( - dependencies = [IntegrationsPatch::class], + dependencies = [ + IntegrationsPatch::class, + MainActivityResolvePatch::class + ], requiresIntegrations = true ) object SettingsBytecodePatch : BytecodePatch( @@ -79,8 +83,8 @@ object SettingsBytecodePatch : BytecodePatch( } } ?: throw PreferenceFingerprint.exception - context.injectInit("InitializationPatch", "setDeviceInformation", false) - context.injectInit("InitializationPatch", "initializeReVancedSettings", false) + injectInit("InitializationPatch", "setDeviceInformation") + injectInit("InitializationPatch", "initializeReVancedSettings") } } diff --git a/src/main/kotlin/app/revanced/util/bytecode/BytecodeHelper.kt b/src/main/kotlin/app/revanced/util/bytecode/BytecodeHelper.kt index 7f9d5e9bb..1e46c4b52 100644 --- a/src/main/kotlin/app/revanced/util/bytecode/BytecodeHelper.kt +++ b/src/main/kotlin/app/revanced/util/bytecode/BytecodeHelper.kt @@ -1,45 +1,12 @@ package app.revanced.util.bytecode import app.revanced.patcher.data.BytecodeContext -import app.revanced.patcher.extensions.InstructionExtensions.addInstruction import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction import app.revanced.util.integrations.Constants.MUSIC_UTILS_PATH import app.revanced.util.integrations.Constants.UTILS_PATH internal object BytecodeHelper { - internal fun BytecodeContext.injectInit( - methods: String, - descriptor: String, - isYouTube: Boolean - ) { - val activityClass = - if (isYouTube) - "/WatchWhileActivity;" - else - "/MusicActivity;" - - val integrationPath = - if (isYouTube) - UTILS_PATH - else - MUSIC_UTILS_PATH - - classes.forEach { classDef -> - classDef.methods.forEach { method -> - if (classDef.type.endsWith(activityClass) && method.name == "onCreate") { - val hookMethod = - this.proxy(classDef).mutableClass.methods.first { it.name == "onCreate" } - - hookMethod.addInstruction( - 2, - "invoke-static/range {p0 .. p0}, $integrationPath/$methods;->$descriptor(Landroid/content/Context;)V" - ) - } - } - } - } - internal fun BytecodeContext.updatePatchStatus( methodName: String, isYouTube: Boolean