feat(YouTube Music): add compatibility for next year's release

This commit is contained in:
inotia00
2023-12-02 11:48:27 +09:00
parent 9ce734ffd7
commit 894b60cbe9
7 changed files with 69 additions and 43 deletions

View File

@ -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 {

View File

@ -8,6 +8,5 @@ object CastButtonContainerFingerprint : MethodFingerprint(
returnType = "V",
customFingerprint = { methodDef, _ ->
methodDef.isWideLiteralExists(PlayerCastMediaRouteButton)
&& methodDef.definingClass.endsWith("/MusicActivity;")
}
)

View File

@ -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"
)
}
}
}

View File

@ -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"
}
)

View File

@ -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")
}
}

View File

@ -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")
}
}

View File

@ -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