mirror of
https://github.com/inotia00/revanced-patches.git
synced 2025-06-13 05:37:40 +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.CompatiblePackage
|
||||||
import app.revanced.patcher.patch.annotation.Patch
|
import app.revanced.patcher.patch.annotation.Patch
|
||||||
import app.revanced.patches.music.player.replace.fingerprints.CastButtonContainerFingerprint
|
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.playerresponse.PlayerResponsePatch
|
||||||
import app.revanced.patches.music.utils.resourceid.SharedResourceIdPatch
|
import app.revanced.patches.music.utils.resourceid.SharedResourceIdPatch
|
||||||
import app.revanced.patches.music.utils.resourceid.SharedResourceIdPatch.PlayerCastMediaRouteButton
|
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",
|
name = "Replace cast button",
|
||||||
description = "Replace the cast button in the player with the open music button.",
|
description = "Replace the cast button in the player with the open music button.",
|
||||||
dependencies = [
|
dependencies = [
|
||||||
|
MainActivityResolvePatch::class,
|
||||||
PlayerResponsePatch::class,
|
PlayerResponsePatch::class,
|
||||||
SettingsPatch::class,
|
SettingsPatch::class,
|
||||||
SharedResourceIdPatch::class,
|
SharedResourceIdPatch::class,
|
||||||
@ -41,10 +44,9 @@ import com.android.tools.smali.dexlib2.iface.reference.MethodReference
|
|||||||
use = false
|
use = false
|
||||||
)
|
)
|
||||||
@Suppress("unused")
|
@Suppress("unused")
|
||||||
object ReplaceCastButtonPatch : BytecodePatch(
|
object ReplaceCastButtonPatch : BytecodePatch() {
|
||||||
setOf(CastButtonContainerFingerprint)
|
|
||||||
) {
|
|
||||||
override fun execute(context: BytecodeContext) {
|
override fun execute(context: BytecodeContext) {
|
||||||
|
CastButtonContainerFingerprint.resolve(context, mainActivityClassDef)
|
||||||
|
|
||||||
CastButtonContainerFingerprint.result?.let {
|
CastButtonContainerFingerprint.result?.let {
|
||||||
it.mutableMethod.apply {
|
it.mutableMethod.apply {
|
||||||
|
@ -8,6 +8,5 @@ object CastButtonContainerFingerprint : MethodFingerprint(
|
|||||||
returnType = "V",
|
returnType = "V",
|
||||||
customFingerprint = { methodDef, _ ->
|
customFingerprint = { methodDef, _ ->
|
||||||
methodDef.isWideLiteralExists(PlayerCastMediaRouteButton)
|
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.CompatiblePackage
|
||||||
import app.revanced.patcher.patch.annotation.Patch
|
import app.revanced.patcher.patch.annotation.Patch
|
||||||
import app.revanced.patches.music.utils.fix.clientspoof.ClientSpoofPatch
|
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.MUSIC_PACKAGE_NAME
|
||||||
import app.revanced.patches.music.utils.microg.Constants.YOUTUBE_PACKAGE_NAME
|
import app.revanced.patches.music.utils.microg.Constants.YOUTUBE_PACKAGE_NAME
|
||||||
import app.revanced.patches.music.utils.microg.fingerprints.CastContextFetchFingerprint
|
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.PrimeFingerprint
|
||||||
import app.revanced.patches.music.utils.microg.fingerprints.ServiceCheckFingerprint
|
import app.revanced.patches.music.utils.microg.fingerprints.ServiceCheckFingerprint
|
||||||
import app.revanced.patches.shared.patch.packagename.PackageNamePatch
|
import app.revanced.patches.shared.patch.packagename.PackageNamePatch
|
||||||
import app.revanced.util.bytecode.BytecodeHelper.injectInit
|
|
||||||
import app.revanced.util.microg.MicroGBytecodeHelper
|
import app.revanced.util.microg.MicroGBytecodeHelper
|
||||||
|
|
||||||
@Patch(
|
@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.",
|
description = "Allows ReVanced Extended Music to run without root and under a different package name with MicroG.",
|
||||||
dependencies = [
|
dependencies = [
|
||||||
ClientSpoofPatch::class,
|
ClientSpoofPatch::class,
|
||||||
|
MainActivityResolvePatch::class,
|
||||||
MicroGResourcePatch::class,
|
MicroGResourcePatch::class,
|
||||||
PackageNamePatch::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.patcher.patch.annotation.Patch
|
||||||
import app.revanced.patches.music.utils.fingerprints.NewPlayerLayoutFingerprint
|
import app.revanced.patches.music.utils.fingerprints.NewPlayerLayoutFingerprint
|
||||||
import app.revanced.patches.music.utils.integrations.IntegrationsPatch
|
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.PreferenceFingerprint
|
||||||
import app.revanced.patches.music.utils.settings.fingerprints.SettingsHeadersFragmentFingerprint
|
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 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.FiveRegisterInstruction
|
||||||
import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
|
import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
|
||||||
|
|
||||||
@Patch(
|
@Patch(
|
||||||
dependencies = [IntegrationsPatch::class],
|
dependencies = [
|
||||||
|
IntegrationsPatch::class,
|
||||||
|
MainActivityResolvePatch::class
|
||||||
|
],
|
||||||
requiresIntegrations = true
|
requiresIntegrations = true
|
||||||
)
|
)
|
||||||
object SettingsBytecodePatch : BytecodePatch(
|
object SettingsBytecodePatch : BytecodePatch(
|
||||||
@ -79,8 +83,8 @@ object SettingsBytecodePatch : BytecodePatch(
|
|||||||
}
|
}
|
||||||
} ?: throw PreferenceFingerprint.exception
|
} ?: throw PreferenceFingerprint.exception
|
||||||
|
|
||||||
context.injectInit("InitializationPatch", "setDeviceInformation", false)
|
injectInit("InitializationPatch", "setDeviceInformation")
|
||||||
context.injectInit("InitializationPatch", "initializeReVancedSettings", false)
|
injectInit("InitializationPatch", "initializeReVancedSettings")
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,45 +1,12 @@
|
|||||||
package app.revanced.util.bytecode
|
package app.revanced.util.bytecode
|
||||||
|
|
||||||
import app.revanced.patcher.data.BytecodeContext
|
import app.revanced.patcher.data.BytecodeContext
|
||||||
import app.revanced.patcher.extensions.InstructionExtensions.addInstruction
|
|
||||||
import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction
|
import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction
|
||||||
import app.revanced.util.integrations.Constants.MUSIC_UTILS_PATH
|
import app.revanced.util.integrations.Constants.MUSIC_UTILS_PATH
|
||||||
import app.revanced.util.integrations.Constants.UTILS_PATH
|
import app.revanced.util.integrations.Constants.UTILS_PATH
|
||||||
|
|
||||||
internal object BytecodeHelper {
|
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(
|
internal fun BytecodeContext.updatePatchStatus(
|
||||||
methodName: String,
|
methodName: String,
|
||||||
isYouTube: Boolean
|
isYouTube: Boolean
|
||||||
|
Reference in New Issue
Block a user