add custom-branding-icon-manual patch

This commit is contained in:
inotia00
2023-04-30 18:32:08 +09:00
parent 0a74e14f1e
commit 9848499496
3 changed files with 121 additions and 8 deletions

View File

@ -0,0 +1,61 @@
package app.revanced.patches.youtube.layout.etc.branding.icon.patch
import app.revanced.patcher.annotation.Description
import app.revanced.patcher.annotation.Name
import app.revanced.patcher.annotation.Version
import app.revanced.patcher.data.ResourceContext
import app.revanced.patcher.patch.PatchResult
import app.revanced.patcher.patch.PatchResultError
import app.revanced.patcher.patch.PatchResultSuccess
import app.revanced.patcher.patch.ResourcePatch
import app.revanced.patcher.patch.annotations.DependsOn
import app.revanced.patcher.patch.annotations.Patch
import app.revanced.patches.shared.annotation.YouTubeCompatibility
import app.revanced.patches.youtube.misc.settings.resource.patch.SettingsPatch
import app.revanced.util.resources.IconHelper.YOUTUBE_LAUNCHER_ICON_ARRAY
import app.revanced.util.resources.IconHelper.copyFiles
import app.revanced.util.resources.IconHelper.makeDirectoryAndCopyFiles
import app.revanced.util.resources.ResourceHelper.updatePatchStatusIcon
import app.revanced.util.resources.ResourceUtils
@Patch(false)
@Name("custom-branding-icon-manual")
@Description("Changes the YouTube Music launcher icon specified in the 'branding' directory.")
@DependsOn([SettingsPatch::class])
@YouTubeCompatibility
@Version("0.0.1")
class CustomBrandingIconManualPatch : ResourcePatch {
override fun execute(context: ResourceContext): PatchResult {
fun copyResources(resourceGroups: List<ResourceUtils.ResourceGroup>) {
val iconPath = "branding"
try {
context.copyFiles(resourceGroups, iconPath)
} catch (_: Exception) {
context.makeDirectoryAndCopyFiles(resourceGroups, iconPath)
throw PatchResultError("icon not found!")
}
}
val iconResourceFileNames =
YOUTUBE_LAUNCHER_ICON_ARRAY
.map { "$it.png" }
.toTypedArray()
fun createGroup(directory: String) = ResourceUtils.ResourceGroup(
directory, *iconResourceFileNames
)
// change the app icon
arrayOf("xxxhdpi", "xxhdpi", "xhdpi", "hdpi", "mdpi")
.map { "mipmap-$it" }
.map(::createGroup)
.let(::copyResources)
context.updatePatchStatusIcon("custom")
return PatchResultSuccess()
}
}

View File

@ -1,19 +1,74 @@
package app.revanced.util.resources
import app.revanced.patcher.data.ResourceContext
import java.io.File
import java.nio.file.Files
import java.nio.file.Paths
import java.nio.file.StandardCopyOption
internal object IconHelper {
internal fun ResourceContext.customIcon(iconName: String) {
val launchIcon = arrayOf(
internal var YOUTUBE_LAUNCHER_ICON_ARRAY =
arrayOf(
"adaptiveproduct_youtube_background_color_108",
"adaptiveproduct_youtube_foreground_color_108",
"ic_launcher",
"ic_launcher_round"
)
internal var YOUTUBE_MUSIC_LAUNCHER_ICON_ARRAY =
arrayOf(
"adaptiveproduct_youtube_music_background_color_108",
"adaptiveproduct_youtube_music_foreground_color_108",
"ic_launcher_release"
)
internal fun ResourceContext.copyFiles(
resourceGroups: List<ResourceUtils.ResourceGroup>,
path: String
) {
val iconPath = File(Paths.get("").toAbsolutePath().toString()).resolve(path)
val resourceDirectory = this["res"]
resourceGroups.forEach { group ->
val fromDirectory = iconPath.resolve(group.resourceDirectoryName)
val toDirectory = resourceDirectory.resolve(group.resourceDirectoryName)
group.resources.forEach { iconFileName ->
Files.write(
toDirectory.resolve(iconFileName).toPath(),
fromDirectory.resolve(iconFileName).readBytes()
)
}
}
}
internal fun ResourceContext.makeDirectoryAndCopyFiles(
resourceGroups: List<ResourceUtils.ResourceGroup>,
path: String
) {
val newDirectory = Paths.get("").toAbsolutePath().toString() + "/$path"
this[newDirectory].mkdir()
val iconPath = File(Paths.get("").toAbsolutePath().toString()).resolve(path)
val resourceDirectory = this["res"]
resourceGroups.forEach { group ->
this[newDirectory + "/${group.resourceDirectoryName}"].mkdir()
val fromDirectory = iconPath.resolve(group.resourceDirectoryName)
val toDirectory = resourceDirectory.resolve(group.resourceDirectoryName)
group.resources.forEach { iconFileName ->
Files.write(
fromDirectory.resolve(iconFileName).toPath(),
toDirectory.resolve(iconFileName).readBytes()
)
}
}
}
internal fun ResourceContext.customIcon(iconName: String) {
val launchIcon = YOUTUBE_LAUNCHER_ICON_ARRAY
val splashIcon = arrayOf(
"product_logo_youtube_color_24",
"product_logo_youtube_color_36",
@ -49,11 +104,7 @@ internal object IconHelper {
}
internal fun ResourceContext.customIconMusic(iconName: String) {
val launchIcon = arrayOf(
"adaptiveproduct_youtube_music_background_color_108",
"adaptiveproduct_youtube_music_foreground_color_108",
"ic_launcher_release"
)
val launchIcon = YOUTUBE_MUSIC_LAUNCHER_ICON_ARRAY
copyResources(
"music",