mirror of
https://github.com/inotia00/revanced-patches.git
synced 2025-06-12 05:07:41 +02:00
feat(YouTube Music): add compatibility for next year's release
This commit is contained in:
@ -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 {
|
||||
|
@ -8,6 +8,5 @@ object CastButtonContainerFingerprint : MethodFingerprint(
|
||||
returnType = "V",
|
||||
customFingerprint = { methodDef, _ ->
|
||||
methodDef.isWideLiteralExists(PlayerCastMediaRouteButton)
|
||||
&& methodDef.definingClass.endsWith("/MusicActivity;")
|
||||
}
|
||||
)
|
||||
|
@ -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"
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
@ -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"
|
||||
}
|
||||
)
|
@ -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")
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -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")
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -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
|
||||
|
Reference in New Issue
Block a user