mirror of
https://github.com/inotia00/revanced-patches.git
synced 2025-05-15 05:47:17 +02:00
fix(YouTube Music - Custom header): Not working on YouTube Music 7.25.53 https://github.com/inotia00/ReVanced_Extended/issues/2612
This commit is contained in:
parent
87a6aec1dc
commit
8d045bc618
@ -5,6 +5,13 @@ import app.revanced.patcher.patch.resourcePatch
|
|||||||
import app.revanced.patcher.patch.stringOption
|
import app.revanced.patcher.patch.stringOption
|
||||||
import app.revanced.patches.music.utils.compatibility.Constants.COMPATIBLE_PACKAGE
|
import app.revanced.patches.music.utils.compatibility.Constants.COMPATIBLE_PACKAGE
|
||||||
import app.revanced.patches.music.utils.patch.PatchList.CUSTOM_HEADER_FOR_YOUTUBE_MUSIC
|
import app.revanced.patches.music.utils.patch.PatchList.CUSTOM_HEADER_FOR_YOUTUBE_MUSIC
|
||||||
|
import app.revanced.patches.music.utils.playservice.is_7_06_or_greater
|
||||||
|
import app.revanced.patches.music.utils.playservice.versionCheckPatch
|
||||||
|
import app.revanced.patches.music.utils.resourceid.actionBarLogo
|
||||||
|
import app.revanced.patches.music.utils.resourceid.actionBarLogoRingo2
|
||||||
|
import app.revanced.patches.music.utils.resourceid.sharedResourceIdPatch
|
||||||
|
import app.revanced.patches.music.utils.resourceid.ytmLogo
|
||||||
|
import app.revanced.patches.music.utils.resourceid.ytmLogoRingo2
|
||||||
import app.revanced.patches.music.utils.settings.ResourceUtils.getIconType
|
import app.revanced.patches.music.utils.settings.ResourceUtils.getIconType
|
||||||
import app.revanced.patches.music.utils.settings.ResourceUtils.updatePatchStatus
|
import app.revanced.patches.music.utils.settings.ResourceUtils.updatePatchStatus
|
||||||
import app.revanced.patches.music.utils.settings.settingsPatch
|
import app.revanced.patches.music.utils.settings.settingsPatch
|
||||||
@ -13,8 +20,7 @@ import app.revanced.util.Utils.printWarn
|
|||||||
import app.revanced.util.Utils.trimIndentMultiline
|
import app.revanced.util.Utils.trimIndentMultiline
|
||||||
import app.revanced.util.copyFile
|
import app.revanced.util.copyFile
|
||||||
import app.revanced.util.copyResources
|
import app.revanced.util.copyResources
|
||||||
import app.revanced.util.fingerprint.injectLiteralInstructionBooleanCall
|
import app.revanced.util.replaceLiteralInstructionCall
|
||||||
import app.revanced.util.fingerprint.resolvable
|
|
||||||
import app.revanced.util.underBarOrThrow
|
import app.revanced.util.underBarOrThrow
|
||||||
import app.revanced.util.valueOrThrow
|
import app.revanced.util.valueOrThrow
|
||||||
|
|
||||||
@ -100,24 +106,31 @@ private val getDescription = {
|
|||||||
private val changeHeaderBytecodePatch = bytecodePatch(
|
private val changeHeaderBytecodePatch = bytecodePatch(
|
||||||
description = "changeHeaderBytecodePatch"
|
description = "changeHeaderBytecodePatch"
|
||||||
) {
|
) {
|
||||||
|
dependsOn(
|
||||||
|
sharedResourceIdPatch,
|
||||||
|
versionCheckPatch,
|
||||||
|
)
|
||||||
|
|
||||||
execute {
|
execute {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* New Header has been added from YouTube Music v7.04.51.
|
* New Header has been added from YouTube Music v7.04.51.
|
||||||
*
|
*
|
||||||
* The new header's file names are 'action_bar_logo_ringo2.png' and 'ytm_logo_ringo2.png'.
|
* The new header's file names are 'action_bar_logo_ringo2.png' and 'ytm_logo_ringo2.png'.
|
||||||
* The only difference between the existing header and the new header is the dimensions of the image.
|
* The only difference between the existing header and the new header is the dimensions of the image.
|
||||||
*
|
*
|
||||||
* The affected patch is [changeHeaderPatch].
|
* The affected patch is [changeHeaderPatch].
|
||||||
*
|
|
||||||
* TODO: Add a new header image file to [changeHeaderPatch] later.
|
|
||||||
*/
|
*/
|
||||||
if (!headerSwitchConfigFingerprint.resolvable()) {
|
if (!is_7_06_or_greater) {
|
||||||
return@execute
|
return@execute
|
||||||
}
|
}
|
||||||
headerSwitchConfigFingerprint.injectLiteralInstructionBooleanCall(
|
|
||||||
45617851L,
|
listOf(
|
||||||
"0x0"
|
actionBarLogoRingo2 to actionBarLogo,
|
||||||
)
|
ytmLogoRingo2 to ytmLogo,
|
||||||
|
).forEach { (originalResource, replacementResource) ->
|
||||||
|
replaceLiteralInstructionCall(originalResource, replacementResource)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,12 +0,0 @@
|
|||||||
package app.revanced.patches.music.layout.header
|
|
||||||
|
|
||||||
import app.revanced.util.fingerprint.legacyFingerprint
|
|
||||||
import app.revanced.util.or
|
|
||||||
import com.android.tools.smali.dexlib2.AccessFlags
|
|
||||||
|
|
||||||
internal val headerSwitchConfigFingerprint = legacyFingerprint(
|
|
||||||
name = "headerSwitchConfigFingerprint",
|
|
||||||
returnType = "Z",
|
|
||||||
accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL,
|
|
||||||
literals = listOf(45617851L)
|
|
||||||
)
|
|
@ -4,6 +4,7 @@ import app.revanced.patcher.patch.resourcePatch
|
|||||||
import app.revanced.patches.shared.mapping.ResourceType.BOOL
|
import app.revanced.patches.shared.mapping.ResourceType.BOOL
|
||||||
import app.revanced.patches.shared.mapping.ResourceType.COLOR
|
import app.revanced.patches.shared.mapping.ResourceType.COLOR
|
||||||
import app.revanced.patches.shared.mapping.ResourceType.DIMEN
|
import app.revanced.patches.shared.mapping.ResourceType.DIMEN
|
||||||
|
import app.revanced.patches.shared.mapping.ResourceType.DRAWABLE
|
||||||
import app.revanced.patches.shared.mapping.ResourceType.ID
|
import app.revanced.patches.shared.mapping.ResourceType.ID
|
||||||
import app.revanced.patches.shared.mapping.ResourceType.LAYOUT
|
import app.revanced.patches.shared.mapping.ResourceType.LAYOUT
|
||||||
import app.revanced.patches.shared.mapping.ResourceType.STRING
|
import app.revanced.patches.shared.mapping.ResourceType.STRING
|
||||||
@ -14,6 +15,10 @@ import app.revanced.patches.shared.mapping.resourceMappings
|
|||||||
|
|
||||||
var accountSwitcherAccessibility = -1L
|
var accountSwitcherAccessibility = -1L
|
||||||
private set
|
private set
|
||||||
|
var actionBarLogo = -1L
|
||||||
|
private set
|
||||||
|
var actionBarLogoRingo2 = -1L
|
||||||
|
private set
|
||||||
var bottomSheetRecyclerView = -1L
|
var bottomSheetRecyclerView = -1L
|
||||||
private set
|
private set
|
||||||
var buttonContainer = -1L
|
var buttonContainer = -1L
|
||||||
@ -94,6 +99,10 @@ var trimSilenceSwitch = -1L
|
|||||||
private set
|
private set
|
||||||
var varispeedUnavailableTitle = -1L
|
var varispeedUnavailableTitle = -1L
|
||||||
private set
|
private set
|
||||||
|
var ytmLogo = -1L
|
||||||
|
private set
|
||||||
|
var ytmLogoRingo2 = -1L
|
||||||
|
private set
|
||||||
|
|
||||||
internal val sharedResourceIdPatch = resourcePatch(
|
internal val sharedResourceIdPatch = resourcePatch(
|
||||||
description = "sharedResourceIdPatch"
|
description = "sharedResourceIdPatch"
|
||||||
@ -105,6 +114,14 @@ internal val sharedResourceIdPatch = resourcePatch(
|
|||||||
STRING,
|
STRING,
|
||||||
"account_switcher_accessibility_label",
|
"account_switcher_accessibility_label",
|
||||||
]
|
]
|
||||||
|
actionBarLogo = resourceMappings[
|
||||||
|
DRAWABLE,
|
||||||
|
"action_bar_logo",
|
||||||
|
]
|
||||||
|
actionBarLogoRingo2 = resourceMappings[
|
||||||
|
DRAWABLE,
|
||||||
|
"action_bar_logo_ringo2",
|
||||||
|
]
|
||||||
bottomSheetRecyclerView = resourceMappings[
|
bottomSheetRecyclerView = resourceMappings[
|
||||||
LAYOUT,
|
LAYOUT,
|
||||||
"bottom_sheet_recycler_view"
|
"bottom_sheet_recycler_view"
|
||||||
@ -265,5 +282,13 @@ internal val sharedResourceIdPatch = resourcePatch(
|
|||||||
STRING,
|
STRING,
|
||||||
"varispeed_unavailable_title"
|
"varispeed_unavailable_title"
|
||||||
]
|
]
|
||||||
|
ytmLogo = resourceMappings[
|
||||||
|
DRAWABLE,
|
||||||
|
"ytm_logo",
|
||||||
|
]
|
||||||
|
ytmLogoRingo2 = resourceMappings[
|
||||||
|
DRAWABLE,
|
||||||
|
"ytm_logo_ringo2",
|
||||||
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -263,6 +263,34 @@ fun MutableMethod.injectLiteralInstructionViewCall(
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun BytecodePatchContext.replaceLiteralInstructionCall(
|
||||||
|
originalLiteral: Long,
|
||||||
|
replaceLiteral: Long
|
||||||
|
) {
|
||||||
|
classes.forEach { classDef ->
|
||||||
|
classDef.methods.forEach { method ->
|
||||||
|
method.implementation.apply {
|
||||||
|
this?.instructions?.forEachIndexed { _, instruction ->
|
||||||
|
if (instruction.opcode != Opcode.CONST)
|
||||||
|
return@forEachIndexed
|
||||||
|
if ((instruction as Instruction31i).wideLiteral != originalLiteral)
|
||||||
|
return@forEachIndexed
|
||||||
|
|
||||||
|
proxy(classDef)
|
||||||
|
.mutableClass
|
||||||
|
.findMutableMethodOf(method).apply {
|
||||||
|
val index = indexOfFirstLiteralInstructionOrThrow(originalLiteral)
|
||||||
|
val register =
|
||||||
|
(instruction as OneRegisterInstruction).registerA
|
||||||
|
|
||||||
|
replaceInstruction(index, "const v$register, $replaceLiteral")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fun BytecodePatchContext.replaceLiteralInstructionCall(
|
fun BytecodePatchContext.replaceLiteralInstructionCall(
|
||||||
literal: Long,
|
literal: Long,
|
||||||
smaliInstruction: String
|
smaliInstruction: String
|
||||||
|
Loading…
x
Reference in New Issue
Block a user