mirror of
https://github.com/inotia00/revanced-patches.git
synced 2025-05-05 17:14:35 +02:00
feat(YouTube Music): add support versions 7.15.52
~ 7.16.52
This commit is contained in:
parent
4c22853295
commit
010a19fc9e
@ -162,11 +162,16 @@ object CustomBrandingIconPatch : BaseResourcePatch(
|
|||||||
|
|
||||||
// Change splash icon.
|
// Change splash icon.
|
||||||
if (ChangeSplashIcon == true) {
|
if (ChangeSplashIcon == true) {
|
||||||
|
// Some resources have been removed in the latest YouTube Music.
|
||||||
|
// For compatibility, use try...catch.
|
||||||
|
try {
|
||||||
splashIconResourceGroups.let { resourceGroups ->
|
splashIconResourceGroups.let { resourceGroups ->
|
||||||
resourceGroups.forEach {
|
resourceGroups.forEach {
|
||||||
context.copyResources("$appIconResourcePath/splash", it)
|
context.copyResources("$appIconResourcePath/splash", it)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
} catch (_: Exception) {
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
setIconType(appIcon)
|
setIconType(appIcon)
|
||||||
|
@ -20,7 +20,7 @@ import app.revanced.util.literalInstructionBooleanHook
|
|||||||
"com.google.android.apps.youtube.music",
|
"com.google.android.apps.youtube.music",
|
||||||
[
|
[
|
||||||
"7.08.54",
|
"7.08.54",
|
||||||
"7.13.52",
|
"7.16.52",
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
]
|
]
|
||||||
|
@ -34,6 +34,8 @@ import app.revanced.patches.music.player.components.fingerprints.QuickSeekOverla
|
|||||||
import app.revanced.patches.music.player.components.fingerprints.RemixGenericButtonFingerprint
|
import app.revanced.patches.music.player.components.fingerprints.RemixGenericButtonFingerprint
|
||||||
import app.revanced.patches.music.player.components.fingerprints.RepeatTrackFingerprint
|
import app.revanced.patches.music.player.components.fingerprints.RepeatTrackFingerprint
|
||||||
import app.revanced.patches.music.player.components.fingerprints.ShuffleClassReferenceFingerprint
|
import app.revanced.patches.music.player.components.fingerprints.ShuffleClassReferenceFingerprint
|
||||||
|
import app.revanced.patches.music.player.components.fingerprints.ShuffleClassReferenceFingerprint.indexOfImageViewInstruction
|
||||||
|
import app.revanced.patches.music.player.components.fingerprints.ShuffleClassReferenceFingerprint.indexOfOrdinalInstruction
|
||||||
import app.revanced.patches.music.player.components.fingerprints.SwipeToCloseFingerprint
|
import app.revanced.patches.music.player.components.fingerprints.SwipeToCloseFingerprint
|
||||||
import app.revanced.patches.music.player.components.fingerprints.SwitchToggleColorFingerprint
|
import app.revanced.patches.music.player.components.fingerprints.SwitchToggleColorFingerprint
|
||||||
import app.revanced.patches.music.player.components.fingerprints.ZenModeFingerprint
|
import app.revanced.patches.music.player.components.fingerprints.ZenModeFingerprint
|
||||||
@ -740,28 +742,53 @@ object PlayerComponentsPatch : BaseBytecodePatch(
|
|||||||
it.mutableMethod.apply {
|
it.mutableMethod.apply {
|
||||||
rememberShuffleStateObjectClass = definingClass
|
rememberShuffleStateObjectClass = definingClass
|
||||||
|
|
||||||
val startIndex = it.scanResult.patternScanResult!!.startIndex
|
val constIndex = getWideLiteralInstructionIndex(45468)
|
||||||
val endIndex = it.scanResult.patternScanResult!!.endIndex
|
val iGetObjectIndex = getTargetIndexOrThrow(constIndex, Opcode.IGET_OBJECT)
|
||||||
val imageViewIndex =
|
val checkCastIndex = getTargetIndexOrThrow(iGetObjectIndex, Opcode.CHECK_CAST)
|
||||||
getTargetIndexWithFieldReferenceTypeOrThrow("Landroid/widget/ImageView;")
|
|
||||||
|
val ordinalIndex = indexOfOrdinalInstruction(this)
|
||||||
|
val imageViewIndex = indexOfImageViewInstruction(this)
|
||||||
|
|
||||||
|
val iGetObjectReference =
|
||||||
|
getInstruction<ReferenceInstruction>(iGetObjectIndex).reference
|
||||||
|
val invokeInterfaceReference =
|
||||||
|
getInstruction<ReferenceInstruction>(iGetObjectIndex + 1).reference
|
||||||
|
val checkCastReference =
|
||||||
|
getInstruction<ReferenceInstruction>(checkCastIndex).reference
|
||||||
|
val getOrdinalClassReference =
|
||||||
|
getInstruction<ReferenceInstruction>(checkCastIndex + 1).reference
|
||||||
|
val ordinalReference =
|
||||||
|
getInstruction<ReferenceInstruction>(ordinalIndex).reference
|
||||||
|
|
||||||
val shuffleReference1 = getInstruction<ReferenceInstruction>(startIndex).reference
|
|
||||||
val shuffleReference2 =
|
|
||||||
getInstruction<ReferenceInstruction>(startIndex + 1).reference
|
|
||||||
val shuffleReference3 = getInstruction<ReferenceInstruction>(endIndex).reference
|
|
||||||
val shuffleFieldReference = shuffleReference3 as FieldReference
|
|
||||||
rememberShuffleStateImageViewReference =
|
rememberShuffleStateImageViewReference =
|
||||||
getInstruction<ReferenceInstruction>(imageViewIndex).reference
|
getInstruction<ReferenceInstruction>(imageViewIndex).reference
|
||||||
|
|
||||||
rememberShuffleStateShuffleStateLabel = """
|
rememberShuffleStateShuffleStateLabel = """
|
||||||
iget-object v1, v0, $shuffleReference1
|
iget-object v1, v0, $iGetObjectReference
|
||||||
invoke-interface {v1}, $shuffleReference2
|
invoke-interface {v1}, $invokeInterfaceReference
|
||||||
move-result-object v1
|
move-result-object v1
|
||||||
check-cast v1, ${shuffleFieldReference.definingClass}
|
check-cast v1, $checkCastReference
|
||||||
iget-object v1, v1, $shuffleReference3
|
|
||||||
invoke-virtual {v1}, ${shuffleFieldReference.type}->ordinal()I
|
|
||||||
move-result v1
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
rememberShuffleStateShuffleStateLabel += if (getInstruction(checkCastIndex + 1).opcode == Opcode.INVOKE_VIRTUAL) {
|
||||||
|
// YouTube Music 7.16.52+
|
||||||
|
"""
|
||||||
|
invoke-virtual {v1}, $getOrdinalClassReference
|
||||||
|
move-result-object v1
|
||||||
|
|
||||||
|
""".trimIndent()
|
||||||
|
} else {
|
||||||
|
"""
|
||||||
|
iget-object v1, v1, $getOrdinalClassReference
|
||||||
|
|
||||||
|
""".trimIndent()
|
||||||
|
}
|
||||||
|
|
||||||
|
rememberShuffleStateShuffleStateLabel += """
|
||||||
|
invoke-virtual {v1}, $ordinalReference
|
||||||
|
move-result v1
|
||||||
|
|
||||||
|
""".trimIndent()
|
||||||
}
|
}
|
||||||
|
|
||||||
val constructorMethod =
|
val constructorMethod =
|
||||||
@ -770,7 +797,7 @@ object PlayerComponentsPatch : BaseBytecodePatch(
|
|||||||
|
|
||||||
constructorMethod.apply {
|
constructorMethod.apply {
|
||||||
addInstruction(
|
addInstruction(
|
||||||
implementation!!.instructions.size - 1,
|
implementation!!.instructions.lastIndex,
|
||||||
"sput-object p0, $MUSIC_PLAYBACK_CONTROLS_CLASS_DESCRIPTOR->shuffleClass:$rememberShuffleStateObjectClass"
|
"sput-object p0, $MUSIC_PLAYBACK_CONTROLS_CLASS_DESCRIPTOR->shuffleClass:$rememberShuffleStateObjectClass"
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@ -836,9 +863,10 @@ object PlayerComponentsPatch : BaseBytecodePatch(
|
|||||||
sget-object v0, $MUSIC_PLAYBACK_CONTROLS_CLASS_DESCRIPTOR->shuffleClass:$rememberShuffleStateObjectClass
|
sget-object v0, $MUSIC_PLAYBACK_CONTROLS_CLASS_DESCRIPTOR->shuffleClass:$rememberShuffleStateObjectClass
|
||||||
""" + rememberShuffleStateShuffleStateLabel + """
|
""" + rememberShuffleStateShuffleStateLabel + """
|
||||||
iget-object v3, v0, $rememberShuffleStateImageViewReference
|
iget-object v3, v0, $rememberShuffleStateImageViewReference
|
||||||
invoke-virtual {v3}, Landroid/widget/ImageView;->performClick()Z
|
if-eqz v3, :dont_shuffle
|
||||||
|
invoke-virtual {v3}, Landroid/view/View;->callOnClick()Z
|
||||||
if-eqz v1, :dont_shuffle
|
if-eqz v1, :dont_shuffle
|
||||||
invoke-virtual {v3}, Landroid/widget/ImageView;->performClick()Z
|
invoke-virtual {v3}, Landroid/view/View;->callOnClick()Z
|
||||||
:dont_shuffle
|
:dont_shuffle
|
||||||
return-void
|
return-void
|
||||||
"""
|
"""
|
||||||
|
@ -2,20 +2,38 @@ package app.revanced.patches.music.player.components.fingerprints
|
|||||||
|
|
||||||
import app.revanced.patcher.extensions.or
|
import app.revanced.patcher.extensions.or
|
||||||
import app.revanced.patcher.fingerprint.MethodFingerprint
|
import app.revanced.patcher.fingerprint.MethodFingerprint
|
||||||
|
import app.revanced.patches.music.player.components.fingerprints.ShuffleClassReferenceFingerprint.indexOfImageViewInstruction
|
||||||
|
import app.revanced.patches.music.player.components.fingerprints.ShuffleClassReferenceFingerprint.indexOfOrdinalInstruction
|
||||||
|
import app.revanced.util.containsWideLiteralInstructionIndex
|
||||||
|
import app.revanced.util.getReference
|
||||||
|
import app.revanced.util.indexOfFirstInstruction
|
||||||
import com.android.tools.smali.dexlib2.AccessFlags
|
import com.android.tools.smali.dexlib2.AccessFlags
|
||||||
import com.android.tools.smali.dexlib2.Opcode
|
import com.android.tools.smali.dexlib2.Opcode
|
||||||
|
import com.android.tools.smali.dexlib2.iface.Method
|
||||||
|
import com.android.tools.smali.dexlib2.iface.reference.FieldReference
|
||||||
|
import com.android.tools.smali.dexlib2.iface.reference.MethodReference
|
||||||
|
|
||||||
internal object ShuffleClassReferenceFingerprint : MethodFingerprint(
|
internal object ShuffleClassReferenceFingerprint : MethodFingerprint(
|
||||||
returnType = "V",
|
returnType = "V",
|
||||||
accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL,
|
accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL,
|
||||||
parameters = emptyList(),
|
parameters = emptyList(),
|
||||||
opcodes = listOf(
|
strings = listOf("Unknown shuffle mode"),
|
||||||
Opcode.IGET_OBJECT,
|
customFingerprint = { methodDef, _ ->
|
||||||
Opcode.INVOKE_INTERFACE,
|
methodDef.containsWideLiteralInstructionIndex(45468) &&
|
||||||
Opcode.MOVE_RESULT_OBJECT,
|
indexOfOrdinalInstruction(methodDef) >= 0 &&
|
||||||
Opcode.CHECK_CAST,
|
indexOfImageViewInstruction(methodDef) >= 0
|
||||||
Opcode.IGET_OBJECT
|
}
|
||||||
),
|
) {
|
||||||
strings = listOf("Unknown shuffle mode")
|
fun indexOfOrdinalInstruction(methodDef: Method) =
|
||||||
)
|
methodDef.indexOfFirstInstruction {
|
||||||
|
opcode == Opcode.INVOKE_VIRTUAL &&
|
||||||
|
getReference<MethodReference>()?.name == "ordinal"
|
||||||
|
}
|
||||||
|
|
||||||
|
fun indexOfImageViewInstruction(methodDef: Method) =
|
||||||
|
methodDef.indexOfFirstInstruction {
|
||||||
|
opcode == Opcode.IGET_OBJECT &&
|
||||||
|
getReference<FieldReference>()?.type == "Landroid/widget/ImageView;"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@ -11,8 +11,8 @@ object Constants {
|
|||||||
"6.33.52", // This is the latest version with the legacy code of YouTube Music.
|
"6.33.52", // This is the latest version with the legacy code of YouTube Music.
|
||||||
"6.42.55", // This is the latest version that supports Android 7.0
|
"6.42.55", // This is the latest version that supports Android 7.0
|
||||||
"6.51.53", // This is the latest version of YouTube Music 6.xx.xx
|
"6.51.53", // This is the latest version of YouTube Music 6.xx.xx
|
||||||
"7.12.52", // This was the latest version that was supported by the previous patch.
|
"7.15.52", // This was the latest version that was supported by the previous patch.
|
||||||
"7.13.52", // This is the latest version supported by the RVX patch.
|
"7.16.52", // This is the latest version supported by the RVX patch.
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user