diff --git a/patches/api/patches.api b/patches/api/patches.api index 33b6ea28d..38dc2b638 100644 --- a/patches/api/patches.api +++ b/patches/api/patches.api @@ -372,6 +372,10 @@ public final class app/revanced/patches/music/interaction/permanentshuffle/Perma public static final fun getPermanentShufflePatch ()Lapp/revanced/patcher/patch/BytecodePatch; } +public final class app/revanced/patches/music/layout/branding/CustomBrandingPatchKt { + public static final fun getCustomBrandingPatch ()Lapp/revanced/patcher/patch/ResourcePatch; +} + public final class app/revanced/patches/music/layout/castbutton/HideCastButtonKt { public static final fun getHideCastButton ()Lapp/revanced/patcher/patch/BytecodePatch; } diff --git a/patches/src/main/kotlin/app/revanced/patches/music/layout/branding/CustomBrandingPatch.kt b/patches/src/main/kotlin/app/revanced/patches/music/layout/branding/CustomBrandingPatch.kt new file mode 100644 index 000000000..c85b2c0ed --- /dev/null +++ b/patches/src/main/kotlin/app/revanced/patches/music/layout/branding/CustomBrandingPatch.kt @@ -0,0 +1,81 @@ +package app.revanced.patches.music.layout.branding + +import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels +import app.revanced.patcher.extensions.InstructionExtensions.getInstruction +import app.revanced.patcher.patch.bytecodePatch +import app.revanced.patcher.util.smali.ExternalLabel +import app.revanced.patches.shared.layout.branding.baseCustomBrandingPatch +import app.revanced.patches.shared.misc.mapping.get +import app.revanced.patches.shared.misc.mapping.resourceMappingPatch +import app.revanced.patches.shared.misc.mapping.resourceMappings +import app.revanced.util.getReference +import app.revanced.util.indexOfFirstInstructionOrThrow +import app.revanced.util.indexOfFirstInstructionReversed +import app.revanced.util.indexOfFirstLiteralInstructionOrThrow +import com.android.tools.smali.dexlib2.Opcode +import com.android.tools.smali.dexlib2.iface.reference.MethodReference + +private val disableSplashAnimationPatch = bytecodePatch { + + dependsOn(resourceMappingPatch) + + execute { + // The existing YT animation usually only shows for a fraction of a second, + // and the existing animation does not match the new splash screen + // causing the original YT Music logo to momentarily flash on screen as the animation starts. + // + // Could replace the lottie animation file with our own custom animation (app_launch.json), + // but the animation is not always the same size as the launch screen and it's still + // barely shown. Instead turn off the animation entirely (app will also launch a little faster). + cairoSplashAnimationConfigFingerprint.method.apply { + val mainActivityLaunchAnimation = resourceMappings["layout", "main_activity_launch_animation"] + val literalIndex = indexOfFirstLiteralInstructionOrThrow( + mainActivityLaunchAnimation + ) + val insertIndex = indexOfFirstInstructionReversed(literalIndex) { + this.opcode == Opcode.INVOKE_VIRTUAL && + getReference()?.name == "setContentView" + } + 1 + val jumpIndex = indexOfFirstInstructionOrThrow(insertIndex) { + opcode == Opcode.INVOKE_VIRTUAL && + getReference()?.parameterTypes?.firstOrNull() == "Ljava/lang/Runnable;" + } + 1 + + addInstructionsWithLabels( + insertIndex, + "goto :skip_animation", + ExternalLabel("skip_animation", getInstruction(jumpIndex)) + ) + } + } +} + +private const val APP_NAME = "YT Music ReVanced" + +@Suppress("unused") +val customBrandingPatch = baseCustomBrandingPatch( + defaultAppName = APP_NAME, + appNameValues = mapOf( + "YT Music ReVanced" to APP_NAME, + "Music ReVanced" to "Music ReVanced", + "Music" to "Music", + "YT Music" to "YT Music", + ), + resourceFolder = "custom-branding/music", + iconResourceFileNames = arrayOf( + "adaptiveproduct_youtube_music_2024_q4_background_color_108", + "adaptiveproduct_youtube_music_2024_q4_foreground_color_108", + "ic_launcher_release", + ), + + block = { + dependsOn(disableSplashAnimationPatch) + + compatibleWith( + "com.google.android.apps.youtube.music"( + "7.29.52", + "8.10.52" + ) + ) + } +) diff --git a/patches/src/main/kotlin/app/revanced/patches/music/layout/branding/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/music/layout/branding/Fingerprints.kt new file mode 100644 index 000000000..8e8989983 --- /dev/null +++ b/patches/src/main/kotlin/app/revanced/patches/music/layout/branding/Fingerprints.kt @@ -0,0 +1,12 @@ +package app.revanced.patches.music.layout.branding + +import app.revanced.patcher.fingerprint +import app.revanced.patches.music.shared.YOUTUBE_MUSIC_MAIN_ACTIVITY_CLASS_TYPE + +internal val cairoSplashAnimationConfigFingerprint = fingerprint { + returns("V") + parameters("Landroid/os/Bundle;") + custom { method, classDef -> + method.name == "onCreate" && method.definingClass == YOUTUBE_MUSIC_MAIN_ACTIVITY_CLASS_TYPE + } +} diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/layout/branding/BaseCustomBrandingPatch.kt b/patches/src/main/kotlin/app/revanced/patches/shared/layout/branding/BaseCustomBrandingPatch.kt new file mode 100644 index 000000000..703d403ec --- /dev/null +++ b/patches/src/main/kotlin/app/revanced/patches/shared/layout/branding/BaseCustomBrandingPatch.kt @@ -0,0 +1,146 @@ +package app.revanced.patches.shared.layout.branding + +import app.revanced.patcher.patch.ResourcePatch +import app.revanced.patcher.patch.ResourcePatchBuilder +import app.revanced.patcher.patch.ResourcePatchContext +import app.revanced.patcher.patch.resourcePatch +import app.revanced.patcher.patch.stringOption +import app.revanced.util.ResourceGroup +import app.revanced.util.Utils.trimIndentMultiline +import app.revanced.util.copyResources +import java.io.File +import java.nio.file.Files +import java.util.logging.Logger + +private const val REVANCED_ICON = "ReVanced*Logo" // Can never be a valid path. + +internal val mipmapDirectories = arrayOf( + "xxxhdpi", + "xxhdpi", + "xhdpi", + "hdpi", + "mdpi", +).map { "mipmap-$it" }.toTypedArray() + +private fun formatResourceFileList(resourceNames: Array) = resourceNames.joinToString("\n") { "- $it" } + +/** + * Attempts to fix unescaped and invalid characters not allowed for an Android app name. + */ +private fun escapeAppName(name: String): String? { + // Remove ASCII control characters. + val cleanedName = name.filter { it.code >= 32 } + + // Replace invalid XML characters with escaped equivalents. + val escapedName = cleanedName + .replace("&", "&") // Must be first to avoid double-escaping. + .replace("<", "<") + .replace(">", ">") + .replace(Regex("(?, + resourceFolder: String, + iconResourceFileNames: Array, + block: ResourcePatchBuilder.() -> Unit = {}, + executeBlock: ResourcePatchContext.() -> Unit = {} +): ResourcePatch = resourcePatch( + name = "Custom branding", + description = "Applies a custom app name and icon. Defaults to \"$defaultAppName\" and the ReVanced logo.", + use = false, +) { + val iconResourceFileNamesPng = iconResourceFileNames.map { "$it.png" }.toTypedArray() + + val appName by stringOption( + key = "appName", + default = defaultAppName, + values = appNameValues, + title = "App name", + description = "The name of the app.", + ) + + val iconPath by stringOption( + key = "iconPath", + default = REVANCED_ICON, + values = mapOf("ReVanced Logo" to REVANCED_ICON), + title = "App icon", + description = """ + The icon to apply to the app. + + If a path to a folder is provided, the folder must contain the following folders: + + ${formatResourceFileList(mipmapDirectories)} + + Each of these folders must contain the following files: + + ${formatResourceFileList(iconResourceFileNamesPng)} + """.trimIndentMultiline(), + ) + + block() + + execute { + // Change the app icon and launch screen. + val iconResourceGroups = mipmapDirectories.map { directory -> + ResourceGroup( + directory, + *iconResourceFileNamesPng, + ) + } + + val iconPathTrimmed = iconPath!!.trim() + if (iconPathTrimmed == REVANCED_ICON) { + iconResourceGroups.forEach { + copyResources(resourceFolder, it) + } + } else { + val filePath = File(iconPathTrimmed) + val resourceDirectory = get("res") + + iconResourceGroups.forEach { group -> + val fromDirectory = filePath.resolve(group.resourceDirectoryName) + val toDirectory = resourceDirectory.resolve(group.resourceDirectoryName) + + group.resources.forEach { iconFileName -> + Files.write( + toDirectory.resolve(iconFileName).toPath(), + fromDirectory.resolve(iconFileName).readBytes(), + ) + } + } + } + + // Change the app name. + escapeAppName(appName!!)?.let { escapedAppName -> + val newValue = "android:label=\"$escapedAppName\"" + + val manifest = get("AndroidManifest.xml") + val original = manifest.readText() + val replacement = original + // YouTube + .replace("android:label=\"@string/application_name\"", newValue) + // YT Music + .replace("android:label=\"@string/app_launcher_name\"", newValue) + + if (original == replacement) { + Logger.getLogger(this::class.java.name).warning( + "Could not replace manifest app name" + ) + } + + manifest.writeText(replacement) + } + + executeBlock() // Must be after the main code to rename the new icons for YouTube 19.34+. + } +} diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/branding/CustomBrandingPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/branding/CustomBrandingPatch.kt index 8a9c44c30..27273680e 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/branding/CustomBrandingPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/branding/CustomBrandingPatch.kt @@ -1,141 +1,56 @@ package app.revanced.patches.youtube.layout.branding -import app.revanced.patcher.patch.resourcePatch -import app.revanced.patcher.patch.stringOption -import app.revanced.patches.youtube.misc.playservice.is_19_34_or_greater -import app.revanced.patches.youtube.misc.playservice.versionCheckPatch -import app.revanced.util.ResourceGroup -import app.revanced.util.Utils.trimIndentMultiline -import app.revanced.util.copyResources -import java.io.File +import app.revanced.patches.shared.layout.branding.baseCustomBrandingPatch +import app.revanced.patches.shared.layout.branding.mipmapDirectories import java.nio.file.Files -private const val REVANCED_ICON = "ReVanced*Logo" // Can never be a valid path. private const val APP_NAME = "YouTube ReVanced" -private val iconResourceFileNames = arrayOf( - "adaptiveproduct_youtube_background_color_108", - "adaptiveproduct_youtube_foreground_color_108", - "ic_launcher", - "ic_launcher_round", -).map { "$it.png" }.toTypedArray() - -private val iconResourceFileNamesNew = mapOf( +private val youtubeIconResourceFileNames_19_34 = mapOf( "adaptiveproduct_youtube_foreground_color_108" to "adaptiveproduct_youtube_2024_q4_foreground_color_108", "adaptiveproduct_youtube_background_color_108" to "adaptiveproduct_youtube_2024_q4_background_color_108", ) -private val mipmapDirectories = arrayOf( - "xxxhdpi", - "xxhdpi", - "xhdpi", - "hdpi", - "mdpi", -).map { "mipmap-$it" } - @Suppress("unused") -val customBrandingPatch = resourcePatch( - name = "Custom branding", - description = "Applies a custom app name and icon. Defaults to \"YouTube ReVanced\" and the ReVanced logo.", - use = false, -) { - dependsOn(versionCheckPatch) +val customBrandingPatch = baseCustomBrandingPatch( + defaultAppName = APP_NAME, + appNameValues = mapOf( + "YouTube ReVanced" to APP_NAME, + "YT ReVanced" to "YT ReVanced", + "YT" to "YT", + "YouTube" to "YouTube", + ), + resourceFolder = "custom-branding/youtube", + iconResourceFileNames = arrayOf( + "adaptiveproduct_youtube_background_color_108", + "adaptiveproduct_youtube_foreground_color_108", + "ic_launcher", + "ic_launcher_round", + ), - compatibleWith( - "com.google.android.youtube"( - "19.34.42", - "20.07.39", - "20.13.41", - "20.14.43", - ) - ) - - val appName by stringOption( - key = "appName", - default = APP_NAME, - values = mapOf( - "YouTube ReVanced" to APP_NAME, - "YT ReVanced" to "YT ReVanced", - "YT" to "YT", - "YouTube" to "YouTube", - ), - title = "App name", - description = "The name of the app.", - ) - - val icon by stringOption( - key = "iconPath", - default = REVANCED_ICON, - values = mapOf("ReVanced Logo" to REVANCED_ICON), - title = "App icon", - description = """ - The icon to apply to the app. - - If a path to a folder is provided, the folder must contain the following folders: - - ${mipmapDirectories.joinToString("\n") { "- $it" }} - - Each of these folders must contain the following files: - - ${iconResourceFileNames.joinToString("\n") { "- $it" }} - """.trimIndentMultiline(), - ) - - execute { - icon?.let { icon -> - // Change the app icon. - mipmapDirectories.map { directory -> - ResourceGroup( - directory, - *iconResourceFileNames, - ) - }.let { resourceGroups -> - if (icon != REVANCED_ICON) { - val path = File(icon) - val resourceDirectory = get("res") - - resourceGroups.forEach { group -> - val fromDirectory = path.resolve(group.resourceDirectoryName) - val toDirectory = resourceDirectory.resolve(group.resourceDirectoryName) - - group.resources.forEach { iconFileName -> - Files.write( - toDirectory.resolve(iconFileName).toPath(), - fromDirectory.resolve(iconFileName).readBytes(), - ) - } - } - } else { - resourceGroups.forEach { copyResources("custom-branding", it) } - } - } - - if (is_19_34_or_greater) { - val resourceDirectory = get("res") - - mipmapDirectories.forEach { directory -> - val targetDirectory = resourceDirectory.resolve(directory) - - iconResourceFileNamesNew.forEach { (old, new) -> - val oldFile = targetDirectory.resolve("$old.png") - val newFile = targetDirectory.resolve("$new.png") - - Files.write(newFile.toPath(), oldFile.readBytes()) - } - } - } - } - - appName?.let { name -> - // Change the app name. - val manifest = get("AndroidManifest.xml") - manifest.writeText( - manifest.readText() - .replace( - "android:label=\"@string/application_name", - "android:label=\"$name", - ), + block = { + compatibleWith( + "com.google.android.youtube"( + "19.34.42", + "20.07.39", + "20.13.41", + "20.14.43", ) + ) + }, + + executeBlock = { + val resourceDirectory = get("res") + + mipmapDirectories.forEach { directory -> + val targetDirectory = resourceDirectory.resolve(directory) + + youtubeIconResourceFileNames_19_34.forEach { (old, new) -> + val oldFile = targetDirectory.resolve("$old.png") + val newFile = targetDirectory.resolve("$new.png") + + Files.write(newFile.toPath(), oldFile.readBytes()) + } } } -} +) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playservice/VersionCheckPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playservice/VersionCheckPatch.kt index 86621209c..fd713626d 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playservice/VersionCheckPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playservice/VersionCheckPatch.kt @@ -38,6 +38,7 @@ var is_19_32_or_greater = false @Deprecated("19.34.42 is the lowest supported version") var is_19_33_or_greater = false private set +@Deprecated("19.34.42 is the lowest supported version") var is_19_34_or_greater = false private set var is_19_35_or_greater = false diff --git a/patches/src/main/resources/custom-branding/mipmap-hdpi/adaptiveproduct_youtube_background_color_108.png b/patches/src/main/resources/custom-branding/mipmap-hdpi/adaptiveproduct_youtube_background_color_108.png deleted file mode 100644 index 1813f47fe..000000000 Binary files a/patches/src/main/resources/custom-branding/mipmap-hdpi/adaptiveproduct_youtube_background_color_108.png and /dev/null differ diff --git a/patches/src/main/resources/custom-branding/mipmap-hdpi/adaptiveproduct_youtube_foreground_color_108.png b/patches/src/main/resources/custom-branding/mipmap-hdpi/adaptiveproduct_youtube_foreground_color_108.png deleted file mode 100644 index 9448e7315..000000000 Binary files a/patches/src/main/resources/custom-branding/mipmap-hdpi/adaptiveproduct_youtube_foreground_color_108.png and /dev/null differ diff --git a/patches/src/main/resources/custom-branding/mipmap-hdpi/ic_launcher.png b/patches/src/main/resources/custom-branding/mipmap-hdpi/ic_launcher.png deleted file mode 100644 index 5adf89398..000000000 Binary files a/patches/src/main/resources/custom-branding/mipmap-hdpi/ic_launcher.png and /dev/null differ diff --git a/patches/src/main/resources/custom-branding/mipmap-hdpi/ic_launcher_round.png b/patches/src/main/resources/custom-branding/mipmap-hdpi/ic_launcher_round.png deleted file mode 100644 index 5adf89398..000000000 Binary files a/patches/src/main/resources/custom-branding/mipmap-hdpi/ic_launcher_round.png and /dev/null differ diff --git a/patches/src/main/resources/custom-branding/mipmap-mdpi/adaptiveproduct_youtube_background_color_108.png b/patches/src/main/resources/custom-branding/mipmap-mdpi/adaptiveproduct_youtube_background_color_108.png deleted file mode 100644 index bfb91cced..000000000 Binary files a/patches/src/main/resources/custom-branding/mipmap-mdpi/adaptiveproduct_youtube_background_color_108.png and /dev/null differ diff --git a/patches/src/main/resources/custom-branding/mipmap-mdpi/adaptiveproduct_youtube_foreground_color_108.png b/patches/src/main/resources/custom-branding/mipmap-mdpi/adaptiveproduct_youtube_foreground_color_108.png deleted file mode 100644 index 7fd951124..000000000 Binary files a/patches/src/main/resources/custom-branding/mipmap-mdpi/adaptiveproduct_youtube_foreground_color_108.png and /dev/null differ diff --git a/patches/src/main/resources/custom-branding/mipmap-mdpi/ic_launcher.png b/patches/src/main/resources/custom-branding/mipmap-mdpi/ic_launcher.png deleted file mode 100644 index 46117b63a..000000000 Binary files a/patches/src/main/resources/custom-branding/mipmap-mdpi/ic_launcher.png and /dev/null differ diff --git a/patches/src/main/resources/custom-branding/mipmap-mdpi/ic_launcher_round.png b/patches/src/main/resources/custom-branding/mipmap-mdpi/ic_launcher_round.png deleted file mode 100644 index 46117b63a..000000000 Binary files a/patches/src/main/resources/custom-branding/mipmap-mdpi/ic_launcher_round.png and /dev/null differ diff --git a/patches/src/main/resources/custom-branding/mipmap-xhdpi/adaptiveproduct_youtube_background_color_108.png b/patches/src/main/resources/custom-branding/mipmap-xhdpi/adaptiveproduct_youtube_background_color_108.png deleted file mode 100644 index 4245fe042..000000000 Binary files a/patches/src/main/resources/custom-branding/mipmap-xhdpi/adaptiveproduct_youtube_background_color_108.png and /dev/null differ diff --git a/patches/src/main/resources/custom-branding/mipmap-xhdpi/adaptiveproduct_youtube_foreground_color_108.png b/patches/src/main/resources/custom-branding/mipmap-xhdpi/adaptiveproduct_youtube_foreground_color_108.png deleted file mode 100644 index b50442bec..000000000 Binary files a/patches/src/main/resources/custom-branding/mipmap-xhdpi/adaptiveproduct_youtube_foreground_color_108.png and /dev/null differ diff --git a/patches/src/main/resources/custom-branding/mipmap-xhdpi/ic_launcher.png b/patches/src/main/resources/custom-branding/mipmap-xhdpi/ic_launcher.png deleted file mode 100644 index 224d66434..000000000 Binary files a/patches/src/main/resources/custom-branding/mipmap-xhdpi/ic_launcher.png and /dev/null differ diff --git a/patches/src/main/resources/custom-branding/mipmap-xhdpi/ic_launcher_round.png b/patches/src/main/resources/custom-branding/mipmap-xhdpi/ic_launcher_round.png deleted file mode 100644 index 224d66434..000000000 Binary files a/patches/src/main/resources/custom-branding/mipmap-xhdpi/ic_launcher_round.png and /dev/null differ diff --git a/patches/src/main/resources/custom-branding/mipmap-xxhdpi/adaptiveproduct_youtube_background_color_108.png b/patches/src/main/resources/custom-branding/mipmap-xxhdpi/adaptiveproduct_youtube_background_color_108.png deleted file mode 100644 index da0fa7aa1..000000000 Binary files a/patches/src/main/resources/custom-branding/mipmap-xxhdpi/adaptiveproduct_youtube_background_color_108.png and /dev/null differ diff --git a/patches/src/main/resources/custom-branding/mipmap-xxhdpi/adaptiveproduct_youtube_foreground_color_108.png b/patches/src/main/resources/custom-branding/mipmap-xxhdpi/adaptiveproduct_youtube_foreground_color_108.png deleted file mode 100644 index 184eb07a5..000000000 Binary files a/patches/src/main/resources/custom-branding/mipmap-xxhdpi/adaptiveproduct_youtube_foreground_color_108.png and /dev/null differ diff --git a/patches/src/main/resources/custom-branding/mipmap-xxhdpi/ic_launcher.png b/patches/src/main/resources/custom-branding/mipmap-xxhdpi/ic_launcher.png deleted file mode 100644 index f566f259e..000000000 Binary files a/patches/src/main/resources/custom-branding/mipmap-xxhdpi/ic_launcher.png and /dev/null differ diff --git a/patches/src/main/resources/custom-branding/mipmap-xxhdpi/ic_launcher_round.png b/patches/src/main/resources/custom-branding/mipmap-xxhdpi/ic_launcher_round.png deleted file mode 100644 index f566f259e..000000000 Binary files a/patches/src/main/resources/custom-branding/mipmap-xxhdpi/ic_launcher_round.png and /dev/null differ diff --git a/patches/src/main/resources/custom-branding/mipmap-xxxhdpi/adaptiveproduct_youtube_background_color_108.png b/patches/src/main/resources/custom-branding/mipmap-xxxhdpi/adaptiveproduct_youtube_background_color_108.png deleted file mode 100644 index 865aad974..000000000 Binary files a/patches/src/main/resources/custom-branding/mipmap-xxxhdpi/adaptiveproduct_youtube_background_color_108.png and /dev/null differ diff --git a/patches/src/main/resources/custom-branding/mipmap-xxxhdpi/adaptiveproduct_youtube_foreground_color_108.png b/patches/src/main/resources/custom-branding/mipmap-xxxhdpi/adaptiveproduct_youtube_foreground_color_108.png deleted file mode 100644 index 3b066a2c3..000000000 Binary files a/patches/src/main/resources/custom-branding/mipmap-xxxhdpi/adaptiveproduct_youtube_foreground_color_108.png and /dev/null differ diff --git a/patches/src/main/resources/custom-branding/mipmap-xxxhdpi/ic_launcher.png b/patches/src/main/resources/custom-branding/mipmap-xxxhdpi/ic_launcher.png deleted file mode 100644 index 8823abe66..000000000 Binary files a/patches/src/main/resources/custom-branding/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ diff --git a/patches/src/main/resources/custom-branding/mipmap-xxxhdpi/ic_launcher_round.png b/patches/src/main/resources/custom-branding/mipmap-xxxhdpi/ic_launcher_round.png deleted file mode 100644 index 8823abe66..000000000 Binary files a/patches/src/main/resources/custom-branding/mipmap-xxxhdpi/ic_launcher_round.png and /dev/null differ diff --git a/patches/src/main/resources/custom-branding/music/mipmap-hdpi/adaptiveproduct_youtube_music_2024_q4_background_color_108.png b/patches/src/main/resources/custom-branding/music/mipmap-hdpi/adaptiveproduct_youtube_music_2024_q4_background_color_108.png new file mode 100644 index 000000000..7bc1c0b69 Binary files /dev/null and b/patches/src/main/resources/custom-branding/music/mipmap-hdpi/adaptiveproduct_youtube_music_2024_q4_background_color_108.png differ diff --git a/patches/src/main/resources/custom-branding/music/mipmap-hdpi/adaptiveproduct_youtube_music_2024_q4_foreground_color_108.png b/patches/src/main/resources/custom-branding/music/mipmap-hdpi/adaptiveproduct_youtube_music_2024_q4_foreground_color_108.png new file mode 100644 index 000000000..7b480395b Binary files /dev/null and b/patches/src/main/resources/custom-branding/music/mipmap-hdpi/adaptiveproduct_youtube_music_2024_q4_foreground_color_108.png differ diff --git a/patches/src/main/resources/custom-branding/music/mipmap-hdpi/ic_launcher_release.png b/patches/src/main/resources/custom-branding/music/mipmap-hdpi/ic_launcher_release.png new file mode 100644 index 000000000..145fdb7b5 Binary files /dev/null and b/patches/src/main/resources/custom-branding/music/mipmap-hdpi/ic_launcher_release.png differ diff --git a/patches/src/main/resources/custom-branding/music/mipmap-mdpi/adaptiveproduct_youtube_music_2024_q4_background_color_108.png b/patches/src/main/resources/custom-branding/music/mipmap-mdpi/adaptiveproduct_youtube_music_2024_q4_background_color_108.png new file mode 100644 index 000000000..d4361b79c Binary files /dev/null and b/patches/src/main/resources/custom-branding/music/mipmap-mdpi/adaptiveproduct_youtube_music_2024_q4_background_color_108.png differ diff --git a/patches/src/main/resources/custom-branding/music/mipmap-mdpi/adaptiveproduct_youtube_music_2024_q4_foreground_color_108.png b/patches/src/main/resources/custom-branding/music/mipmap-mdpi/adaptiveproduct_youtube_music_2024_q4_foreground_color_108.png new file mode 100644 index 000000000..a58d8026f Binary files /dev/null and b/patches/src/main/resources/custom-branding/music/mipmap-mdpi/adaptiveproduct_youtube_music_2024_q4_foreground_color_108.png differ diff --git a/patches/src/main/resources/custom-branding/music/mipmap-mdpi/ic_launcher_release.png b/patches/src/main/resources/custom-branding/music/mipmap-mdpi/ic_launcher_release.png new file mode 100644 index 000000000..f4fe022da Binary files /dev/null and b/patches/src/main/resources/custom-branding/music/mipmap-mdpi/ic_launcher_release.png differ diff --git a/patches/src/main/resources/custom-branding/music/mipmap-xhdpi/adaptiveproduct_youtube_music_2024_q4_background_color_108.png b/patches/src/main/resources/custom-branding/music/mipmap-xhdpi/adaptiveproduct_youtube_music_2024_q4_background_color_108.png new file mode 100644 index 000000000..8d2f3ad80 Binary files /dev/null and b/patches/src/main/resources/custom-branding/music/mipmap-xhdpi/adaptiveproduct_youtube_music_2024_q4_background_color_108.png differ diff --git a/patches/src/main/resources/custom-branding/music/mipmap-xhdpi/adaptiveproduct_youtube_music_2024_q4_foreground_color_108.png b/patches/src/main/resources/custom-branding/music/mipmap-xhdpi/adaptiveproduct_youtube_music_2024_q4_foreground_color_108.png new file mode 100644 index 000000000..8b975c4aa Binary files /dev/null and b/patches/src/main/resources/custom-branding/music/mipmap-xhdpi/adaptiveproduct_youtube_music_2024_q4_foreground_color_108.png differ diff --git a/patches/src/main/resources/custom-branding/music/mipmap-xhdpi/ic_launcher_release.png b/patches/src/main/resources/custom-branding/music/mipmap-xhdpi/ic_launcher_release.png new file mode 100644 index 000000000..ff75d19cb Binary files /dev/null and b/patches/src/main/resources/custom-branding/music/mipmap-xhdpi/ic_launcher_release.png differ diff --git a/patches/src/main/resources/custom-branding/music/mipmap-xxhdpi/adaptiveproduct_youtube_music_2024_q4_background_color_108.png b/patches/src/main/resources/custom-branding/music/mipmap-xxhdpi/adaptiveproduct_youtube_music_2024_q4_background_color_108.png new file mode 100644 index 000000000..04db6b4c2 Binary files /dev/null and b/patches/src/main/resources/custom-branding/music/mipmap-xxhdpi/adaptiveproduct_youtube_music_2024_q4_background_color_108.png differ diff --git a/patches/src/main/resources/custom-branding/music/mipmap-xxhdpi/adaptiveproduct_youtube_music_2024_q4_foreground_color_108.png b/patches/src/main/resources/custom-branding/music/mipmap-xxhdpi/adaptiveproduct_youtube_music_2024_q4_foreground_color_108.png new file mode 100644 index 000000000..f88bbd248 Binary files /dev/null and b/patches/src/main/resources/custom-branding/music/mipmap-xxhdpi/adaptiveproduct_youtube_music_2024_q4_foreground_color_108.png differ diff --git a/patches/src/main/resources/custom-branding/music/mipmap-xxhdpi/ic_launcher_release.png b/patches/src/main/resources/custom-branding/music/mipmap-xxhdpi/ic_launcher_release.png new file mode 100644 index 000000000..38c2d58fb Binary files /dev/null and b/patches/src/main/resources/custom-branding/music/mipmap-xxhdpi/ic_launcher_release.png differ diff --git a/patches/src/main/resources/custom-branding/music/mipmap-xxxhdpi/adaptiveproduct_youtube_music_2024_q4_background_color_108.png b/patches/src/main/resources/custom-branding/music/mipmap-xxxhdpi/adaptiveproduct_youtube_music_2024_q4_background_color_108.png new file mode 100644 index 000000000..f4983a04e Binary files /dev/null and b/patches/src/main/resources/custom-branding/music/mipmap-xxxhdpi/adaptiveproduct_youtube_music_2024_q4_background_color_108.png differ diff --git a/patches/src/main/resources/custom-branding/music/mipmap-xxxhdpi/adaptiveproduct_youtube_music_2024_q4_foreground_color_108.png b/patches/src/main/resources/custom-branding/music/mipmap-xxxhdpi/adaptiveproduct_youtube_music_2024_q4_foreground_color_108.png new file mode 100644 index 000000000..cb34be6b8 Binary files /dev/null and b/patches/src/main/resources/custom-branding/music/mipmap-xxxhdpi/adaptiveproduct_youtube_music_2024_q4_foreground_color_108.png differ diff --git a/patches/src/main/resources/custom-branding/music/mipmap-xxxhdpi/ic_launcher_release.png b/patches/src/main/resources/custom-branding/music/mipmap-xxxhdpi/ic_launcher_release.png new file mode 100644 index 000000000..6666edb3c Binary files /dev/null and b/patches/src/main/resources/custom-branding/music/mipmap-xxxhdpi/ic_launcher_release.png differ diff --git a/patches/src/main/resources/custom-branding/youtube/mipmap-hdpi/adaptiveproduct_youtube_background_color_108.png b/patches/src/main/resources/custom-branding/youtube/mipmap-hdpi/adaptiveproduct_youtube_background_color_108.png new file mode 100644 index 000000000..87c762874 Binary files /dev/null and b/patches/src/main/resources/custom-branding/youtube/mipmap-hdpi/adaptiveproduct_youtube_background_color_108.png differ diff --git a/patches/src/main/resources/custom-branding/youtube/mipmap-hdpi/adaptiveproduct_youtube_foreground_color_108.png b/patches/src/main/resources/custom-branding/youtube/mipmap-hdpi/adaptiveproduct_youtube_foreground_color_108.png new file mode 100644 index 000000000..cffd3342f Binary files /dev/null and b/patches/src/main/resources/custom-branding/youtube/mipmap-hdpi/adaptiveproduct_youtube_foreground_color_108.png differ diff --git a/patches/src/main/resources/custom-branding/youtube/mipmap-hdpi/ic_launcher.png b/patches/src/main/resources/custom-branding/youtube/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..c96afea8c Binary files /dev/null and b/patches/src/main/resources/custom-branding/youtube/mipmap-hdpi/ic_launcher.png differ diff --git a/patches/src/main/resources/custom-branding/youtube/mipmap-hdpi/ic_launcher_round.png b/patches/src/main/resources/custom-branding/youtube/mipmap-hdpi/ic_launcher_round.png new file mode 100644 index 000000000..c96afea8c Binary files /dev/null and b/patches/src/main/resources/custom-branding/youtube/mipmap-hdpi/ic_launcher_round.png differ diff --git a/patches/src/main/resources/custom-branding/youtube/mipmap-mdpi/adaptiveproduct_youtube_background_color_108.png b/patches/src/main/resources/custom-branding/youtube/mipmap-mdpi/adaptiveproduct_youtube_background_color_108.png new file mode 100644 index 000000000..d4361b79c Binary files /dev/null and b/patches/src/main/resources/custom-branding/youtube/mipmap-mdpi/adaptiveproduct_youtube_background_color_108.png differ diff --git a/patches/src/main/resources/custom-branding/youtube/mipmap-mdpi/adaptiveproduct_youtube_foreground_color_108.png b/patches/src/main/resources/custom-branding/youtube/mipmap-mdpi/adaptiveproduct_youtube_foreground_color_108.png new file mode 100644 index 000000000..85d837785 Binary files /dev/null and b/patches/src/main/resources/custom-branding/youtube/mipmap-mdpi/adaptiveproduct_youtube_foreground_color_108.png differ diff --git a/patches/src/main/resources/custom-branding/youtube/mipmap-mdpi/ic_launcher.png b/patches/src/main/resources/custom-branding/youtube/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..cc5996657 Binary files /dev/null and b/patches/src/main/resources/custom-branding/youtube/mipmap-mdpi/ic_launcher.png differ diff --git a/patches/src/main/resources/custom-branding/youtube/mipmap-mdpi/ic_launcher_round.png b/patches/src/main/resources/custom-branding/youtube/mipmap-mdpi/ic_launcher_round.png new file mode 100644 index 000000000..cc5996657 Binary files /dev/null and b/patches/src/main/resources/custom-branding/youtube/mipmap-mdpi/ic_launcher_round.png differ diff --git a/patches/src/main/resources/custom-branding/youtube/mipmap-xhdpi/adaptiveproduct_youtube_background_color_108.png b/patches/src/main/resources/custom-branding/youtube/mipmap-xhdpi/adaptiveproduct_youtube_background_color_108.png new file mode 100644 index 000000000..9dc71239e Binary files /dev/null and b/patches/src/main/resources/custom-branding/youtube/mipmap-xhdpi/adaptiveproduct_youtube_background_color_108.png differ diff --git a/patches/src/main/resources/custom-branding/youtube/mipmap-xhdpi/adaptiveproduct_youtube_foreground_color_108.png b/patches/src/main/resources/custom-branding/youtube/mipmap-xhdpi/adaptiveproduct_youtube_foreground_color_108.png new file mode 100644 index 000000000..5612d99d6 Binary files /dev/null and b/patches/src/main/resources/custom-branding/youtube/mipmap-xhdpi/adaptiveproduct_youtube_foreground_color_108.png differ diff --git a/patches/src/main/resources/custom-branding/youtube/mipmap-xhdpi/ic_launcher.png b/patches/src/main/resources/custom-branding/youtube/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..df88da0c7 Binary files /dev/null and b/patches/src/main/resources/custom-branding/youtube/mipmap-xhdpi/ic_launcher.png differ diff --git a/patches/src/main/resources/custom-branding/youtube/mipmap-xhdpi/ic_launcher_round.png b/patches/src/main/resources/custom-branding/youtube/mipmap-xhdpi/ic_launcher_round.png new file mode 100644 index 000000000..df88da0c7 Binary files /dev/null and b/patches/src/main/resources/custom-branding/youtube/mipmap-xhdpi/ic_launcher_round.png differ diff --git a/patches/src/main/resources/custom-branding/youtube/mipmap-xxhdpi/adaptiveproduct_youtube_background_color_108.png b/patches/src/main/resources/custom-branding/youtube/mipmap-xxhdpi/adaptiveproduct_youtube_background_color_108.png new file mode 100644 index 000000000..cbf45f81a Binary files /dev/null and b/patches/src/main/resources/custom-branding/youtube/mipmap-xxhdpi/adaptiveproduct_youtube_background_color_108.png differ diff --git a/patches/src/main/resources/custom-branding/youtube/mipmap-xxhdpi/adaptiveproduct_youtube_foreground_color_108.png b/patches/src/main/resources/custom-branding/youtube/mipmap-xxhdpi/adaptiveproduct_youtube_foreground_color_108.png new file mode 100644 index 000000000..4d9634be0 Binary files /dev/null and b/patches/src/main/resources/custom-branding/youtube/mipmap-xxhdpi/adaptiveproduct_youtube_foreground_color_108.png differ diff --git a/patches/src/main/resources/custom-branding/youtube/mipmap-xxhdpi/ic_launcher.png b/patches/src/main/resources/custom-branding/youtube/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..d9c5832ad Binary files /dev/null and b/patches/src/main/resources/custom-branding/youtube/mipmap-xxhdpi/ic_launcher.png differ diff --git a/patches/src/main/resources/custom-branding/youtube/mipmap-xxhdpi/ic_launcher_round.png b/patches/src/main/resources/custom-branding/youtube/mipmap-xxhdpi/ic_launcher_round.png new file mode 100644 index 000000000..d9c5832ad Binary files /dev/null and b/patches/src/main/resources/custom-branding/youtube/mipmap-xxhdpi/ic_launcher_round.png differ diff --git a/patches/src/main/resources/custom-branding/youtube/mipmap-xxxhdpi/adaptiveproduct_youtube_background_color_108.png b/patches/src/main/resources/custom-branding/youtube/mipmap-xxxhdpi/adaptiveproduct_youtube_background_color_108.png new file mode 100644 index 000000000..f4983a04e Binary files /dev/null and b/patches/src/main/resources/custom-branding/youtube/mipmap-xxxhdpi/adaptiveproduct_youtube_background_color_108.png differ diff --git a/patches/src/main/resources/custom-branding/youtube/mipmap-xxxhdpi/adaptiveproduct_youtube_foreground_color_108.png b/patches/src/main/resources/custom-branding/youtube/mipmap-xxxhdpi/adaptiveproduct_youtube_foreground_color_108.png new file mode 100644 index 000000000..1185ff2d8 Binary files /dev/null and b/patches/src/main/resources/custom-branding/youtube/mipmap-xxxhdpi/adaptiveproduct_youtube_foreground_color_108.png differ diff --git a/patches/src/main/resources/custom-branding/youtube/mipmap-xxxhdpi/ic_launcher.png b/patches/src/main/resources/custom-branding/youtube/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..af56c5bb9 Binary files /dev/null and b/patches/src/main/resources/custom-branding/youtube/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/patches/src/main/resources/custom-branding/youtube/mipmap-xxxhdpi/ic_launcher_round.png b/patches/src/main/resources/custom-branding/youtube/mipmap-xxxhdpi/ic_launcher_round.png new file mode 100644 index 000000000..af56c5bb9 Binary files /dev/null and b/patches/src/main/resources/custom-branding/youtube/mipmap-xxxhdpi/ic_launcher_round.png differ