diff --git a/src/main/kotlin/app/revanced/patches/music/layout/branding/icon/CustomBrandingIconPatch.kt b/src/main/kotlin/app/revanced/patches/music/layout/branding/icon/CustomBrandingIconPatch.kt index e1f67deb8..e206022dd 100644 --- a/src/main/kotlin/app/revanced/patches/music/layout/branding/icon/CustomBrandingIconPatch.kt +++ b/src/main/kotlin/app/revanced/patches/music/layout/branding/icon/CustomBrandingIconPatch.kt @@ -9,8 +9,10 @@ import app.revanced.patches.music.utils.settings.ResourceUtils.setIconType import app.revanced.util.ResourceGroup import app.revanced.util.Utils.trimIndentMultiline import app.revanced.util.copyResources +import app.revanced.util.getResourceGroup import app.revanced.util.patch.BaseResourcePatch import app.revanced.util.underBarOrThrow +import org.w3c.dom.Element import java.io.File import java.nio.file.Files @@ -71,17 +73,11 @@ object CustomBrandingIconPatch : BaseResourcePatch( "record" ).map { "$it.png" }.toTypedArray() - private val launcherIconResourceGroups = mipmapDirectories.map { directory -> - ResourceGroup( - directory, *launcherIconResourceFileNames - ) - } + private val launcherIconResourceGroups = + mipmapDirectories.getResourceGroup(launcherIconResourceFileNames) - private val splashIconResourceGroups = largeDrawableDirectories.map { directory -> - ResourceGroup( - directory, *splashIconResourceFileNames - ) - } + private val splashIconResourceGroups = + largeDrawableDirectories.getResourceGroup(splashIconResourceFileNames) private val AppIcon = stringPatchOption( key = "AppIcon", @@ -110,6 +106,20 @@ object CustomBrandingIconPatch : BaseResourcePatch( required = true ) + private val RestoreOldSplashIcon by booleanPatchOption( + key = "RestoreOldSplashIcon", + default = false, + title = "Restore old splash icon", + description = """ + Restore the old style splash icon. + + If you enable both the old style splash icon and the Cairo splash animation, + + Old style splash icon will appear first and then the Cairo splash animation will start. + """.trimIndentMultiline(), + required = true + ) + override fun execute(context: ResourceContext) { // Check patch options first. @@ -117,6 +127,7 @@ object CustomBrandingIconPatch : BaseResourcePatch( .underBarOrThrow() val appIconResourcePath = "music/branding/$appIcon" + val youtubeMusicIconResourcePath = "music/branding/youtube_music" // Check if a custom path is used in the patch options. if (!availableIcon.containsValue(appIcon)) { @@ -160,6 +171,39 @@ object CustomBrandingIconPatch : BaseResourcePatch( context.copyResources("$appIconResourcePath/monochrome", resourceGroup) } + // Change splash icon. + if (RestoreOldSplashIcon == true) { + var oldSplashIconNotExists: Boolean + + context.xmlEditor["res/drawable/splash_screen.xml"].use { editor -> + editor.file.apply { + val node = getElementsByTagName("layer-list").item(0) + oldSplashIconNotExists = (node as Element) + .getElementsByTagName("item") + .length == 1 + + if (oldSplashIconNotExists) { + createElement("item").also { itemNode -> + itemNode.appendChild( + createElement("bitmap").also { bitmapNode -> + bitmapNode.setAttribute("android:gravity", "center") + bitmapNode.setAttribute("android:src", "@drawable/record") + } + ) + node.appendChild(itemNode) + } + } + } + } + if (oldSplashIconNotExists) { + splashIconResourceGroups.let { resourceGroups -> + resourceGroups.forEach { + context.copyResources("$youtubeMusicIconResourcePath/splash", it, createDirectoryIfNotExist = true) + } + } + } + } + // Change splash icon. if (ChangeSplashIcon == true) { // Some resources have been removed in the latest YouTube Music. diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/branding/icon/CustomBrandingIconPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/branding/icon/CustomBrandingIconPatch.kt index 1b32eb836..956b6f320 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/branding/icon/CustomBrandingIconPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/branding/icon/CustomBrandingIconPatch.kt @@ -11,6 +11,7 @@ import app.revanced.util.Utils.trimIndentMultiline import app.revanced.util.copyFile import app.revanced.util.copyResources import app.revanced.util.copyXmlNode +import app.revanced.util.getResourceGroup import app.revanced.util.patch.BaseResourcePatch import app.revanced.util.underBarOrThrow @@ -73,12 +74,6 @@ object CustomBrandingIconPatch : BaseResourcePatch( "avd_anim" ).map { "$it.xml" }.toTypedArray() - private fun List.getResourceGroup(fileNames: Array) = map { directory -> - ResourceGroup( - directory, *fileNames - ) - } - private val launcherIconResourceGroups = mipmapDirectories.getResourceGroup(launcherIconResourceFileNames) diff --git a/src/main/kotlin/app/revanced/util/ResourceUtils.kt b/src/main/kotlin/app/revanced/util/ResourceUtils.kt index 6a7a21458..38ddccbd3 100644 --- a/src/main/kotlin/app/revanced/util/ResourceUtils.kt +++ b/src/main/kotlin/app/revanced/util/ResourceUtils.kt @@ -63,6 +63,12 @@ fun String.startsWithAny(vararg prefixes: String): Boolean { return false } +fun List.getResourceGroup(fileNames: Array) = map { directory -> + ResourceGroup( + directory, *fileNames + ) +} + fun ResourceContext.copyFile( resourceGroup: List, path: String, @@ -98,16 +104,25 @@ fun ResourceContext.copyFile( * * @param sourceResourceDirectory The source resource directory name. * @param resources The resources to copy. + * @param createDirectoryIfNotExist Whether to create a new directory if it does not exist. */ fun ResourceContext.copyResources( sourceResourceDirectory: String, vararg resources: ResourceGroup, + createDirectoryIfNotExist: Boolean = false, ) { val targetResourceDirectory = this["res"] for (resourceGroup in resources) { resourceGroup.resources.forEach { resource -> - val resourceFile = "${resourceGroup.resourceDirectoryName}/$resource" + val resourceDirectoryName = resourceGroup.resourceDirectoryName + + if (createDirectoryIfNotExist) { + val targetDirectory = targetResourceDirectory.resolve(resourceDirectoryName) + if (!targetDirectory.isDirectory) Files.createDirectories(targetDirectory.toPath()) + } + + val resourceFile = "$resourceDirectoryName/$resource" inputStreamFromBundledResource( sourceResourceDirectory, diff --git a/src/main/resources/music/branding/youtube_music/splash/drawable-hdpi/action_bar_logo_release.png b/src/main/resources/music/branding/youtube_music/splash/drawable-hdpi/action_bar_logo_release.png new file mode 100644 index 000000000..59c91455a Binary files /dev/null and b/src/main/resources/music/branding/youtube_music/splash/drawable-hdpi/action_bar_logo_release.png differ diff --git a/src/main/resources/music/branding/youtube_music/splash/drawable-hdpi/record.png b/src/main/resources/music/branding/youtube_music/splash/drawable-hdpi/record.png new file mode 100644 index 000000000..d0cbf34e6 Binary files /dev/null and b/src/main/resources/music/branding/youtube_music/splash/drawable-hdpi/record.png differ diff --git a/src/main/resources/music/branding/youtube_music/splash/drawable-large-hdpi/record.png b/src/main/resources/music/branding/youtube_music/splash/drawable-large-hdpi/record.png new file mode 100644 index 000000000..90472fa9f Binary files /dev/null and b/src/main/resources/music/branding/youtube_music/splash/drawable-large-hdpi/record.png differ diff --git a/src/main/resources/music/branding/youtube_music/splash/drawable-large-mdpi/record.png b/src/main/resources/music/branding/youtube_music/splash/drawable-large-mdpi/record.png new file mode 100644 index 000000000..a43ced19a Binary files /dev/null and b/src/main/resources/music/branding/youtube_music/splash/drawable-large-mdpi/record.png differ diff --git a/src/main/resources/music/branding/youtube_music/splash/drawable-large-xhdpi/record.png b/src/main/resources/music/branding/youtube_music/splash/drawable-large-xhdpi/record.png new file mode 100644 index 000000000..711c10127 Binary files /dev/null and b/src/main/resources/music/branding/youtube_music/splash/drawable-large-xhdpi/record.png differ diff --git a/src/main/resources/music/branding/youtube_music/splash/drawable-mdpi/record.png b/src/main/resources/music/branding/youtube_music/splash/drawable-mdpi/record.png new file mode 100644 index 000000000..23d6fddd0 Binary files /dev/null and b/src/main/resources/music/branding/youtube_music/splash/drawable-mdpi/record.png differ diff --git a/src/main/resources/music/branding/youtube_music/splash/drawable-xhdpi/record.png b/src/main/resources/music/branding/youtube_music/splash/drawable-xhdpi/record.png new file mode 100644 index 000000000..ff4651b17 Binary files /dev/null and b/src/main/resources/music/branding/youtube_music/splash/drawable-xhdpi/record.png differ diff --git a/src/main/resources/music/branding/youtube_music/splash/drawable-xlarge-hdpi/record.png b/src/main/resources/music/branding/youtube_music/splash/drawable-xlarge-hdpi/record.png new file mode 100644 index 000000000..d77949306 Binary files /dev/null and b/src/main/resources/music/branding/youtube_music/splash/drawable-xlarge-hdpi/record.png differ diff --git a/src/main/resources/music/branding/youtube_music/splash/drawable-xlarge-mdpi/record.png b/src/main/resources/music/branding/youtube_music/splash/drawable-xlarge-mdpi/record.png new file mode 100644 index 000000000..ff4651b17 Binary files /dev/null and b/src/main/resources/music/branding/youtube_music/splash/drawable-xlarge-mdpi/record.png differ diff --git a/src/main/resources/music/branding/youtube_music/splash/drawable-xxhdpi/record.png b/src/main/resources/music/branding/youtube_music/splash/drawable-xxhdpi/record.png new file mode 100644 index 000000000..d77949306 Binary files /dev/null and b/src/main/resources/music/branding/youtube_music/splash/drawable-xxhdpi/record.png differ