|
|
|
@@ -3,9 +3,12 @@ package app.revanced.patches.youtube.layout.branding.header
|
|
|
|
import app.revanced.patcher.patch.PatchException
|
|
|
|
import app.revanced.patcher.patch.PatchException
|
|
|
|
import app.revanced.patcher.patch.resourcePatch
|
|
|
|
import app.revanced.patcher.patch.resourcePatch
|
|
|
|
import app.revanced.patcher.patch.stringOption
|
|
|
|
import app.revanced.patcher.patch.stringOption
|
|
|
|
|
|
|
|
import app.revanced.patches.youtube.misc.playservice.is_19_25_or_greater
|
|
|
|
|
|
|
|
import app.revanced.patches.youtube.misc.playservice.versionCheckPatch
|
|
|
|
import app.revanced.util.ResourceGroup
|
|
|
|
import app.revanced.util.ResourceGroup
|
|
|
|
import app.revanced.util.Utils.trimIndentMultiline
|
|
|
|
import app.revanced.util.Utils.trimIndentMultiline
|
|
|
|
import app.revanced.util.copyResources
|
|
|
|
import app.revanced.util.copyResources
|
|
|
|
|
|
|
|
import app.revanced.util.findElementByAttributeValueOrThrow
|
|
|
|
import java.io.File
|
|
|
|
import java.io.File
|
|
|
|
|
|
|
|
|
|
|
|
private const val HEADER_FILE_NAME = "yt_wordmark_header"
|
|
|
|
private const val HEADER_FILE_NAME = "yt_wordmark_header"
|
|
|
|
@@ -34,6 +37,8 @@ val changeHeaderPatch = resourcePatch(
|
|
|
|
description = "Applies a custom header in the top left corner within the app. Defaults to the ReVanced header.",
|
|
|
|
description = "Applies a custom header in the top left corner within the app. Defaults to the ReVanced header.",
|
|
|
|
use = false,
|
|
|
|
use = false,
|
|
|
|
) {
|
|
|
|
) {
|
|
|
|
|
|
|
|
dependsOn(versionCheckPatch)
|
|
|
|
|
|
|
|
|
|
|
|
compatibleWith("com.google.android.youtube")
|
|
|
|
compatibleWith("com.google.android.youtube")
|
|
|
|
|
|
|
|
|
|
|
|
val header by stringOption(
|
|
|
|
val header by stringOption(
|
|
|
|
@@ -79,7 +84,7 @@ val changeHeaderPatch = resourcePatch(
|
|
|
|
/**
|
|
|
|
/**
|
|
|
|
* A function that overwrites both header variants in the target resource directories.
|
|
|
|
* A function that overwrites both header variants in the target resource directories.
|
|
|
|
*/
|
|
|
|
*/
|
|
|
|
val overwriteFromTo: (String, String) -> Unit = { from: String, to: String ->
|
|
|
|
fun overwriteFromTo(from: String, to: String) {
|
|
|
|
targetResourceDirectories.forEach { directory ->
|
|
|
|
targetResourceDirectories.forEach { directory ->
|
|
|
|
variants.forEach { variant ->
|
|
|
|
variants.forEach { variant ->
|
|
|
|
val fromPath = directory.resolve("${from}_$variant.png")
|
|
|
|
val fromPath = directory.resolve("${from}_$variant.png")
|
|
|
|
@@ -91,23 +96,28 @@ val changeHeaderPatch = resourcePatch(
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Functions to overwrite the header to the different variants.
|
|
|
|
// Functions to overwrite the header to the different variants.
|
|
|
|
val toPremium = { overwriteFromTo(PREMIUM_HEADER_FILE_NAME, HEADER_FILE_NAME) }
|
|
|
|
fun toPremium() { overwriteFromTo(PREMIUM_HEADER_FILE_NAME, HEADER_FILE_NAME) }
|
|
|
|
val toHeader = { overwriteFromTo(HEADER_FILE_NAME, PREMIUM_HEADER_FILE_NAME) }
|
|
|
|
fun toHeader() { overwriteFromTo(HEADER_FILE_NAME, PREMIUM_HEADER_FILE_NAME) }
|
|
|
|
val toReVanced = {
|
|
|
|
fun toReVanced() {
|
|
|
|
// Copy the ReVanced header to the resource directories.
|
|
|
|
// Copy the ReVanced header to the resource directories.
|
|
|
|
targetResourceFiles.forEach { copyResources("change-header/revanced", it) }
|
|
|
|
targetResourceFiles.forEach { copyResources("change-header/revanced", it) }
|
|
|
|
|
|
|
|
|
|
|
|
// Overwrite the premium with the custom header as well.
|
|
|
|
// Overwrite the premium with the custom header as well.
|
|
|
|
toHeader()
|
|
|
|
toHeader()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
val toReVancedBorderless = {
|
|
|
|
fun toReVancedBorderless() {
|
|
|
|
// Copy the ReVanced borderless header to the resource directories.
|
|
|
|
// Copy the ReVanced borderless header to the resource directories.
|
|
|
|
targetResourceFiles.forEach { copyResources("change-header/revanced-borderless", it) }
|
|
|
|
targetResourceFiles.forEach {
|
|
|
|
|
|
|
|
copyResources(
|
|
|
|
|
|
|
|
"change-header/revanced-borderless",
|
|
|
|
|
|
|
|
it
|
|
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Overwrite the premium with the custom header as well.
|
|
|
|
// Overwrite the premium with the custom header as well.
|
|
|
|
toHeader()
|
|
|
|
toHeader()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
val toCustom = {
|
|
|
|
fun toCustom() {
|
|
|
|
val sourceFolders = File(header!!).listFiles { file -> file.isDirectory }
|
|
|
|
val sourceFolders = File(header!!).listFiles { file -> file.isDirectory }
|
|
|
|
?: throw PatchException("The provided path is not a directory: $header")
|
|
|
|
?: throw PatchException("The provided path is not a directory: $header")
|
|
|
|
|
|
|
|
|
|
|
|
@@ -136,11 +146,42 @@ val changeHeaderPatch = resourcePatch(
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
when (header) {
|
|
|
|
when (header) {
|
|
|
|
HEADER_OPTION -> toHeader
|
|
|
|
HEADER_OPTION -> toHeader()
|
|
|
|
PREMIUM_HEADER_OPTION -> toPremium
|
|
|
|
PREMIUM_HEADER_OPTION -> toPremium()
|
|
|
|
REVANCED_HEADER_OPTION -> toReVanced
|
|
|
|
REVANCED_HEADER_OPTION -> toReVanced()
|
|
|
|
REVANCED_BORDERLESS_HEADER_OPTION -> toReVancedBorderless
|
|
|
|
REVANCED_BORDERLESS_HEADER_OPTION -> toReVancedBorderless()
|
|
|
|
else -> toCustom
|
|
|
|
else -> toCustom()
|
|
|
|
}()
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Fix 19.25+ A/B layout with different header icons:
|
|
|
|
|
|
|
|
// yt_ringo2_wordmark_header, yt_ringo2_premium_wordmark_header
|
|
|
|
|
|
|
|
//
|
|
|
|
|
|
|
|
// These images are webp and not png, so overwriting them is not so simple.
|
|
|
|
|
|
|
|
// Instead change styles.xml to use the old drawable resources.
|
|
|
|
|
|
|
|
if (is_19_25_or_greater) {
|
|
|
|
|
|
|
|
document("res/values/styles.xml").use { document ->
|
|
|
|
|
|
|
|
arrayOf(
|
|
|
|
|
|
|
|
"CairoLightThemeRingo2Updates" to variants[0],
|
|
|
|
|
|
|
|
"CairoDarkThemeRingo2Updates" to variants[1]
|
|
|
|
|
|
|
|
).forEach { (styleName, theme) ->
|
|
|
|
|
|
|
|
val style = document.childNodes.findElementByAttributeValueOrThrow(
|
|
|
|
|
|
|
|
"name",
|
|
|
|
|
|
|
|
styleName,
|
|
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
val drawable = "@drawable/${HEADER_FILE_NAME}_${theme}"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
arrayOf(
|
|
|
|
|
|
|
|
"ytWordmarkHeader",
|
|
|
|
|
|
|
|
"ytPremiumWordmarkHeader"
|
|
|
|
|
|
|
|
).forEach { itemName ->
|
|
|
|
|
|
|
|
style.childNodes.findElementByAttributeValueOrThrow(
|
|
|
|
|
|
|
|
"name",
|
|
|
|
|
|
|
|
itemName,
|
|
|
|
|
|
|
|
).textContent = drawable
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|