diff --git a/extensions/music/src/main/java/app/revanced/extension/music/settings/preference/MusicPreferenceFragment.java b/extensions/music/src/main/java/app/revanced/extension/music/settings/preference/MusicPreferenceFragment.java index 1ebae16df3..86e5173420 100644 --- a/extensions/music/src/main/java/app/revanced/extension/music/settings/preference/MusicPreferenceFragment.java +++ b/extensions/music/src/main/java/app/revanced/extension/music/settings/preference/MusicPreferenceFragment.java @@ -5,8 +5,10 @@ import android.widget.Toolbar; import app.revanced.extension.music.settings.MusicActivityHook; +import app.revanced.extension.shared.GmsCoreSupport; import app.revanced.extension.shared.Logger; import app.revanced.extension.shared.Utils; +import app.revanced.extension.shared.settings.BaseSettings; import app.revanced.extension.shared.settings.preference.ToolbarPreferenceFragment; /** @@ -30,6 +32,17 @@ protected void initialize() { preferenceScreen = getPreferenceScreen(); Utils.sortPreferenceGroups(preferenceScreen); setPreferenceScreenToolbar(preferenceScreen); + + // Clunky work around until preferences are custom classes that manage themselves. + // Custom branding only works with non-root install. But the preferences must be + // added during patched because of difficulties detecting during patching if it's + // a root install. So instead the non-functional preferences are removed during + // runtime if the app is mount (root) installation. + if (GmsCoreSupport.isPackageNameOriginal()) { + removePreferences( + BaseSettings.CUSTOM_BRANDING_ICON.key, + BaseSettings.CUSTOM_BRANDING_NAME.key); + } } catch (Exception ex) { Logger.printException(() -> "initialize failure", ex); } diff --git a/extensions/shared/library/src/main/java/app/revanced/extension/shared/patches/CustomBrandingPatch.java b/extensions/shared/library/src/main/java/app/revanced/extension/shared/patches/CustomBrandingPatch.java index 79a4d54849..c6cf761ca3 100644 --- a/extensions/shared/library/src/main/java/app/revanced/extension/shared/patches/CustomBrandingPatch.java +++ b/extensions/shared/library/src/main/java/app/revanced/extension/shared/patches/CustomBrandingPatch.java @@ -1,11 +1,14 @@ package app.revanced.extension.shared.patches; +import android.app.Notification; import android.content.ComponentName; import android.content.Context; import android.content.pm.PackageManager; +import android.graphics.Color; import java.util.ArrayList; import java.util.List; +import java.util.Locale; import app.revanced.extension.shared.GmsCoreSupport; import app.revanced.extension.shared.Logger; @@ -29,28 +32,56 @@ public class CustomBrandingPatch { // The most that can be done is to hide a theme from the UI and keep the alias with dummy data. public enum BrandingTheme { /** - * Original unpatched icon. Must be first enum. + * Original unpatched icon. */ - ORIGINAL("revanced_original"), - ROUNDED("revanced_rounded"), - MINIMAL("revanced_minimal"), - SCALED("revanced_scaled"), + ORIGINAL, + ROUNDED, + MINIMAL, + SCALED, /** - * User provided custom icon. Must be the last enum. + * User provided custom icon. */ - CUSTOM("revanced_custom"); - - public final String themeAlias; - - BrandingTheme(String themeAlias) { - this.themeAlias = themeAlias; - } + CUSTOM; private String packageAndNameIndexToClassAlias(String packageName, int appIndex) { if (appIndex <= 0) { throw new IllegalArgumentException("App index starts at index 1"); } - return packageName + '.' + themeAlias + '_' + appIndex; + return packageName + ".revanced_" + name().toLowerCase(Locale.US) + '_' + appIndex; + } + } + + private static final int notificationSmallIcon; + + static { + BrandingTheme branding = BaseSettings.CUSTOM_BRANDING_ICON.get(); + if (branding == BrandingTheme.ORIGINAL) { + notificationSmallIcon = 0; + } else { + // Original icon is quantum_ic_video_youtube_white_24 + String iconName = "revanced_notification_icon"; + if (branding == BrandingTheme.CUSTOM) { + iconName += "_custom"; + } + + notificationSmallIcon = Utils.getResourceIdentifier(iconName, "drawable"); + if (notificationSmallIcon == 0) { + Logger.printException(() -> "Could not load notification small icon"); + } + } + } + + /** + * Injection point. + */ + public static void setNotificationIcon(Notification.Builder builder) { + try { + if (notificationSmallIcon != 0) { + builder.setSmallIcon(notificationSmallIcon) + .setColor(Color.TRANSPARENT); // Remove YT red tint. + } + } catch (Exception ex) { + Logger.printException(() -> "setNotificationIcon failure", ex); } } diff --git a/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/preference/ToolbarPreferenceFragment.java b/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/preference/ToolbarPreferenceFragment.java index 8f1d0975af..e299613dc0 100644 --- a/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/preference/ToolbarPreferenceFragment.java +++ b/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/preference/ToolbarPreferenceFragment.java @@ -6,6 +6,7 @@ import android.graphics.drawable.Drawable; import android.os.Build; import android.preference.Preference; +import android.preference.PreferenceGroup; import android.preference.PreferenceScreen; import android.util.TypedValue; import android.view.ViewGroup; @@ -22,6 +23,24 @@ @SuppressWarnings({"deprecation", "NewApi"}) public class ToolbarPreferenceFragment extends AbstractPreferenceFragment { + + /** + * Removes the list of preferences from this fragment, if they exist. + * @param keys Preference keys. + */ + protected void removePreferences(String ... keys) { + for (String key : keys) { + Preference pref = findPreference(key); + if (pref != null) { + PreferenceGroup parent = pref.getParent(); + if (parent != null) { + Logger.printDebug(() -> "Removing preference: " + key); + parent.removePreference(pref); + } + } + } + } + /** * Sets toolbar for all nested preference screens. */ diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/preference/YouTubePreferenceFragment.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/preference/YouTubePreferenceFragment.java index 1cd1c80c47..aec00487b2 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/preference/YouTubePreferenceFragment.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/preference/YouTubePreferenceFragment.java @@ -4,8 +4,10 @@ import android.preference.PreferenceScreen; import android.widget.Toolbar; +import app.revanced.extension.shared.GmsCoreSupport; import app.revanced.extension.shared.Logger; import app.revanced.extension.shared.Utils; +import app.revanced.extension.shared.settings.BaseSettings; import app.revanced.extension.shared.settings.preference.ToolbarPreferenceFragment; import app.revanced.extension.youtube.settings.YouTubeActivityHook; @@ -30,6 +32,17 @@ protected void initialize() { preferenceScreen = getPreferenceScreen(); Utils.sortPreferenceGroups(preferenceScreen); setPreferenceScreenToolbar(preferenceScreen); + + // Clunky work around until preferences are custom classes that manage themselves. + // Custom branding only works with non-root install. But the preferences must be + // added during patched because of difficulties detecting during patching if it's + // a root install. So instead the non-functional preferences are removed during + // runtime if the app is mount (root) installation. + if (GmsCoreSupport.isPackageNameOriginal()) { + removePreferences( + BaseSettings.CUSTOM_BRANDING_ICON.key, + BaseSettings.CUSTOM_BRANDING_NAME.key); + } } catch (Exception ex) { Logger.printException(() -> "initialize failure", ex); } 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 index b1c811de25..7f7b49ca97 100644 --- 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 @@ -61,7 +61,7 @@ val customBrandingPatch = baseCustomBrandingPatch( originalLauncherIconName = "ic_launcher_release", originalAppName = "@string/app_launcher_name", originalAppPackageName = MUSIC_PACKAGE_NAME, - copyExistingIntentsToAliases = false, + isYouTubeMusic = true, numberOfPresetAppNames = 5, mainActivityOnCreateFingerprint = musicActivityOnCreateFingerprint, mainActivityName = MUSIC_MAIN_ACTIVITY_NAME, 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 index 7b46b820f6..5381131f25 100644 --- 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 @@ -2,6 +2,7 @@ package app.revanced.patches.shared.layout.branding import app.revanced.patcher.Fingerprint import app.revanced.patcher.extensions.InstructionExtensions.addInstruction +import app.revanced.patcher.extensions.InstructionExtensions.getInstruction import app.revanced.patcher.patch.PatchException import app.revanced.patcher.patch.ResourcePatch import app.revanced.patcher.patch.ResourcePatchBuilder @@ -12,14 +13,24 @@ import app.revanced.patcher.patch.stringOption import app.revanced.patches.all.misc.packagename.setOrGetFallbackPackageName import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.all.misc.resources.addResourcesPatch +import app.revanced.patches.shared.misc.mapping.resourceMappingPatch import app.revanced.patches.shared.misc.settings.preference.BasePreferenceScreen import app.revanced.patches.shared.misc.settings.preference.ListPreference import app.revanced.util.ResourceGroup import app.revanced.util.Utils.trimIndentMultiline +import app.revanced.util.addInstructionsAtControlFlowLabel import app.revanced.util.copyResources import app.revanced.util.findElementByAttributeValueOrThrow +import app.revanced.util.findInstructionIndicesReversedOrThrow +import app.revanced.util.getReference +import app.revanced.util.indexOfFirstInstructionOrThrow +import app.revanced.util.indexOfFirstInstructionReversedOrThrow import app.revanced.util.removeFromParent import app.revanced.util.returnEarly +import com.android.tools.smali.dexlib2.Opcode +import com.android.tools.smali.dexlib2.iface.instruction.ReferenceInstruction +import com.android.tools.smali.dexlib2.iface.reference.FieldReference +import com.android.tools.smali.dexlib2.iface.reference.TypeReference import org.w3c.dom.Element import org.w3c.dom.NodeList import java.io.File @@ -47,13 +58,15 @@ private const val LAUNCHER_RESOURCE_NAME_PREFIX = "revanced_launcher_" private const val LAUNCHER_ADAPTIVE_BACKGROUND_PREFIX = "revanced_adaptive_background_" private const val LAUNCHER_ADAPTIVE_FOREGROUND_PREFIX = "revanced_adaptive_foreground_" private const val LAUNCHER_ADAPTIVE_MONOCHROME_PREFIX = "revanced_adaptive_monochrome_" +private const val NOTIFICATION_ICON_NAME = "revanced_notification_icon" private val USER_CUSTOM_ADAPTIVE_FILE_NAMES = arrayOf( "$LAUNCHER_ADAPTIVE_BACKGROUND_PREFIX$CUSTOM_USER_ICON_STYLE_NAME.png", "$LAUNCHER_ADAPTIVE_FOREGROUND_PREFIX$CUSTOM_USER_ICON_STYLE_NAME.png" ) -private const val USER_CUSTOM_MONOCHROME_NAME = "$LAUNCHER_ADAPTIVE_MONOCHROME_PREFIX$CUSTOM_USER_ICON_STYLE_NAME.xml" +private const val USER_CUSTOM_MONOCHROME_FILE_NAME = "$LAUNCHER_ADAPTIVE_MONOCHROME_PREFIX$CUSTOM_USER_ICON_STYLE_NAME.xml" +private const val USER_CUSTOM_NOTIFICATION_ICON_FILE_NAME = "${NOTIFICATION_ICON_NAME}_$CUSTOM_USER_ICON_STYLE_NAME.xml" internal const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/shared/patches/CustomBrandingPatch;" @@ -65,7 +78,7 @@ internal fun baseCustomBrandingPatch( originalLauncherIconName: String, originalAppName: String, originalAppPackageName: String, - copyExistingIntentsToAliases: Boolean, + isYouTubeMusic: Boolean, numberOfPresetAppNames: Int, mainActivityOnCreateFingerprint: Fingerprint, mainActivityName: String, @@ -96,8 +109,9 @@ internal fun baseCustomBrandingPatch( Each of the folders must contain all of the following files: ${USER_CUSTOM_ADAPTIVE_FILE_NAMES.joinToString("\n")} - Optionally, the path can contain a 'drawable' folder with the monochrome icon file: - $USER_CUSTOM_MONOCHROME_NAME + Optionally, the path contains a 'drawable' folder with any of the monochrome icon files: + $USER_CUSTOM_MONOCHROME_FILE_NAME + $USER_CUSTOM_NOTIFICATION_ICON_FILE_NAME """.trimIndentMultiline() ) @@ -105,7 +119,7 @@ internal fun baseCustomBrandingPatch( dependsOn( addResourcesPatch, - + resourceMappingPatch, bytecodePatch { execute { mainActivityOnCreateFingerprint.method.addInstruction( @@ -114,25 +128,68 @@ internal fun baseCustomBrandingPatch( ) numberOfPresetAppNamesExtensionFingerprint.method.returnEarly(numberOfPresetAppNames) + + notificationFingerprint.method.apply { + val getBuilderIndex = if (isYouTubeMusic) { + // YT Music the field is not a plain object type. + indexOfFirstInstructionOrThrow { + getReference()?.type == "Landroid/app/Notification\$Builder;" + } + } else { + // Find the field name of the notification builder. Field is an Object type. + val builderCastIndex = indexOfFirstInstructionOrThrow { + val reference = getReference() + opcode == Opcode.CHECK_CAST && + reference?.type == "Landroid/app/Notification\$Builder;" + } + indexOfFirstInstructionReversedOrThrow(builderCastIndex) { + getReference()?.type == "Ljava/lang/Object;" + } + } + + val builderFieldName = getInstruction(getBuilderIndex) + .getReference() + + findInstructionIndicesReversedOrThrow( + Opcode.RETURN_VOID + ).forEach { index -> + addInstructionsAtControlFlowLabel( + index, + """ + move-object/from16 v0, p0 + iget-object v0, v0, $builderFieldName + check-cast v0, Landroid/app/Notification${'$'}Builder; + invoke-static { v0 }, $EXTENSION_CLASS_DESCRIPTOR->setNotificationIcon(Landroid/app/Notification${'$'}Builder;)V + """ + ) + } + } } - } + }, ) finalize { - val useCustomName = customName != null - val useCustomIcon = customIcon != null - - if (setOrGetFallbackPackageName(originalAppPackageName) == originalAppPackageName) { - if (useCustomName || useCustomIcon) { + // Can only check if app is root installation by checking if change package name patch is in use. + // and can only do that in the finalize block here. + // The UI preferences cannot be selectively added here, because the settings finalize block + // may have already run and the settings are already wrote to file. + // Instead, show a warning if any patch option was used (A rooted device launcher ignores the manifest changes), + // and the non-functional in-app settings are removed on app startup by extension code. + if (customName != null || customIcon != null) { + if (setOrGetFallbackPackageName(originalAppPackageName) == originalAppPackageName) { Logger.getLogger(this::class.java.name).warning( "Custom branding does not work with root installation. No changes applied." ) } - return@finalize } + } + + execute { + addResources("shared", "layout.branding.baseCustomBrandingPatch") + addResources(addResourcePatchName, "layout.branding.customBrandingPatch") preferenceScreen.addPreferences( - if (useCustomName) { + if (customName != null ) { ListPreference( key = "revanced_custom_branding_name", entriesKey = "revanced_custom_branding_name_custom_entries", @@ -141,7 +198,7 @@ internal fun baseCustomBrandingPatch( } else { ListPreference("revanced_custom_branding_name") }, - if (useCustomIcon) { + if (customIcon != null) { ListPreference( key = "revanced_custom_branding_icon", entriesKey = "revanced_custom_branding_icon_custom_entries", @@ -151,11 +208,6 @@ internal fun baseCustomBrandingPatch( ListPreference("revanced_custom_branding_icon") } ) - } - - execute { - addResources("shared", "layout.branding.baseCustomBrandingPatch") - addResources(addResourcePatchName, "layout.branding.customBrandingPatch") val useCustomName = customName != null val useCustomIcon = customIcon != null @@ -167,7 +219,7 @@ internal fun baseCustomBrandingPatch( "drawable", "$LAUNCHER_ADAPTIVE_BACKGROUND_PREFIX$style.xml", "$LAUNCHER_ADAPTIVE_FOREGROUND_PREFIX$style.xml", - "$LAUNCHER_ADAPTIVE_MONOCHROME_PREFIX$style.xml" + "$LAUNCHER_ADAPTIVE_MONOCHROME_PREFIX$style.xml", ), ResourceGroup( "mipmap-anydpi", @@ -176,20 +228,27 @@ internal fun baseCustomBrandingPatch( ) } - // Copy template user icon, because the aliases must be added even if no user icon is provided. copyResources( "custom-branding", + // Push notification 'small' icon. ResourceGroup( - "mipmap-anydpi", - "$LAUNCHER_RESOURCE_NAME_PREFIX$CUSTOM_USER_ICON_STYLE_NAME.xml", + "drawable", + "$NOTIFICATION_ICON_NAME.xml" ), + + // Copy template user icon, because the aliases must be added even if no user icon is provided. ResourceGroup( "drawable", - "$LAUNCHER_ADAPTIVE_MONOCHROME_PREFIX$CUSTOM_USER_ICON_STYLE_NAME.xml", + USER_CUSTOM_MONOCHROME_FILE_NAME, + USER_CUSTOM_NOTIFICATION_ICON_FILE_NAME + ), + ResourceGroup( + "mipmap-anydpi", + "$LAUNCHER_RESOURCE_NAME_PREFIX$CUSTOM_USER_ICON_STYLE_NAME.xml" ) ) - // Copy template icon png files. + // Copy template icon files. mipmapDirectories.forEach { dpi -> copyResources( "custom-branding", @@ -232,13 +291,7 @@ internal fun baseCustomBrandingPatch( alias.setAttribute("android:targetActivity", mainActivityName) // Copy all intents from the original alias so long press actions still work. - if (copyExistingIntentsToAliases) { - for (i in 0 until intents.length) { - alias.appendChild( - intents.item(i).cloneNode(true) - ) - } - } else { + if (isYouTubeMusic) { val intentFilter = document.createElement("intent-filter").apply { val action = document.createElement("action") action.setAttribute("android:name", "android.intent.action.MAIN") @@ -249,6 +302,12 @@ internal fun baseCustomBrandingPatch( appendChild(category) } alias.appendChild(intentFilter) + } else { + for (i in 0 until intents.length) { + alias.appendChild( + intents.item(i).cloneNode(true) + ) + } } return alias @@ -375,15 +434,20 @@ internal fun baseCustomBrandingPatch( } } - // Copy monochrome if it provided. - val monochromeRelativePath = "drawable/$USER_CUSTOM_MONOCHROME_NAME" - val monochromeFile = iconPathFile.resolve(monochromeRelativePath) - if (monochromeFile.exists()) { - monochromeFile.copyTo( - target = resourceDirectory.resolve(monochromeRelativePath), - overwrite = true - ) - copiedFiles = true + // Copy monochrome and small notification icon if it provided. + arrayOf( + USER_CUSTOM_MONOCHROME_FILE_NAME, + USER_CUSTOM_NOTIFICATION_ICON_FILE_NAME + ).forEach { fileName -> + val relativePath = "drawable/$fileName" + val file = iconPathFile.resolve(relativePath) + if (file.exists()) { + file.copyTo( + target = resourceDirectory.resolve(relativePath), + overwrite = true + ) + copiedFiles = true + } } if (!copiedFiles) { diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/layout/branding/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/shared/layout/branding/Fingerprints.kt index c46cb1a883..8e99078d5c 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/layout/branding/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/layout/branding/Fingerprints.kt @@ -11,3 +11,11 @@ internal val numberOfPresetAppNamesExtensionFingerprint = fingerprint { method.name == "numberOfPresetAppNames" && classDef.type == EXTENSION_CLASS_DESCRIPTOR } } + +// A much simpler fingerprint exists that can set the small icon (contains string "414843287017"), +// but that has limited usage and this fingerprint allows changing any part of the notification. +internal val notificationFingerprint = fingerprint { + accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) + parameters("L") + strings("key_action_priority") +} 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 2294ef9b20..09ca7481d3 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 @@ -13,7 +13,7 @@ val customBrandingPatch = baseCustomBrandingPatch( originalLauncherIconName = "ic_launcher", originalAppName = "@string/application_name", originalAppPackageName = YOUTUBE_PACKAGE_NAME, - copyExistingIntentsToAliases = true, + isYouTubeMusic = false, numberOfPresetAppNames = 5, mainActivityOnCreateFingerprint = mainActivityOnCreateFingerprint, mainActivityName = YOUTUBE_MAIN_ACTIVITY_NAME, diff --git a/patches/src/main/resources/custom-branding/drawable/revanced_adaptive_foreground_minimal.xml b/patches/src/main/resources/custom-branding/drawable/revanced_adaptive_foreground_minimal.xml index a4b14512d7..044733ee06 100644 --- a/patches/src/main/resources/custom-branding/drawable/revanced_adaptive_foreground_minimal.xml +++ b/patches/src/main/resources/custom-branding/drawable/revanced_adaptive_foreground_minimal.xml @@ -5,33 +5,39 @@ android:height="108dp" android:viewportWidth="256" android:viewportHeight="256"> - - - + - - - - - - - - - - + android:fillColor="#1B1B1B" + android:pathData="M0,0 L256,0 L256,256 L0,256 Z" /> + + + + + + + + + + + + diff --git a/patches/src/main/resources/custom-branding/drawable/revanced_adaptive_foreground_rounded.xml b/patches/src/main/resources/custom-branding/drawable/revanced_adaptive_foreground_rounded.xml index 1b4dcef311..a298919625 100644 --- a/patches/src/main/resources/custom-branding/drawable/revanced_adaptive_foreground_rounded.xml +++ b/patches/src/main/resources/custom-branding/drawable/revanced_adaptive_foreground_rounded.xml @@ -5,47 +5,59 @@ android:height="108dp" android:viewportWidth="800" android:viewportHeight="800"> - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + diff --git a/patches/src/main/resources/custom-branding/drawable/revanced_adaptive_foreground_scaled.xml b/patches/src/main/resources/custom-branding/drawable/revanced_adaptive_foreground_scaled.xml index e642003444..9a5e7944a7 100644 --- a/patches/src/main/resources/custom-branding/drawable/revanced_adaptive_foreground_scaled.xml +++ b/patches/src/main/resources/custom-branding/drawable/revanced_adaptive_foreground_scaled.xml @@ -5,33 +5,39 @@ android:height="108dp" android:viewportWidth="256" android:viewportHeight="256"> - - - + - - - - - - - - - - + android:fillColor="#000000" + android:pathData="M0,0 L256,0 L256,256 L0,256 Z" /> + + + + + + + + + + + + diff --git a/patches/src/main/resources/custom-branding/drawable/revanced_adaptive_monochrome_custom.xml b/patches/src/main/resources/custom-branding/drawable/revanced_adaptive_monochrome_custom.xml index a5eadebdcf..30c8d01bde 100644 --- a/patches/src/main/resources/custom-branding/drawable/revanced_adaptive_monochrome_custom.xml +++ b/patches/src/main/resources/custom-branding/drawable/revanced_adaptive_monochrome_custom.xml @@ -4,15 +4,16 @@ android:height="108dp" android:viewportWidth="256" android:viewportHeight="256"> - - - - + + + + diff --git a/patches/src/main/resources/custom-branding/drawable/revanced_adaptive_monochrome_minimal.xml b/patches/src/main/resources/custom-branding/drawable/revanced_adaptive_monochrome_minimal.xml index a5eadebdcf..30c8d01bde 100644 --- a/patches/src/main/resources/custom-branding/drawable/revanced_adaptive_monochrome_minimal.xml +++ b/patches/src/main/resources/custom-branding/drawable/revanced_adaptive_monochrome_minimal.xml @@ -4,15 +4,16 @@ android:height="108dp" android:viewportWidth="256" android:viewportHeight="256"> - - - - + + + + diff --git a/patches/src/main/resources/custom-branding/drawable/revanced_adaptive_monochrome_rounded.xml b/patches/src/main/resources/custom-branding/drawable/revanced_adaptive_monochrome_rounded.xml index 11979dd6a5..116f2da5d5 100644 --- a/patches/src/main/resources/custom-branding/drawable/revanced_adaptive_monochrome_rounded.xml +++ b/patches/src/main/resources/custom-branding/drawable/revanced_adaptive_monochrome_rounded.xml @@ -4,20 +4,21 @@ android:height="108dp" android:viewportWidth="800" android:viewportHeight="800"> - - - - - + + + + + diff --git a/patches/src/main/resources/custom-branding/drawable/revanced_adaptive_monochrome_scaled.xml b/patches/src/main/resources/custom-branding/drawable/revanced_adaptive_monochrome_scaled.xml index 41160d4ba3..381c59c8c3 100644 --- a/patches/src/main/resources/custom-branding/drawable/revanced_adaptive_monochrome_scaled.xml +++ b/patches/src/main/resources/custom-branding/drawable/revanced_adaptive_monochrome_scaled.xml @@ -4,15 +4,16 @@ android:height="108dp" android:viewportWidth="256" android:viewportHeight="256"> - - - - + + + + diff --git a/patches/src/main/resources/custom-branding/drawable/revanced_notification_icon.xml b/patches/src/main/resources/custom-branding/drawable/revanced_notification_icon.xml new file mode 100644 index 0000000000..942b01f5f4 --- /dev/null +++ b/patches/src/main/resources/custom-branding/drawable/revanced_notification_icon.xml @@ -0,0 +1,12 @@ + + + + + + \ No newline at end of file diff --git a/patches/src/main/resources/custom-branding/drawable/revanced_notification_icon_custom.xml b/patches/src/main/resources/custom-branding/drawable/revanced_notification_icon_custom.xml new file mode 100644 index 0000000000..942b01f5f4 --- /dev/null +++ b/patches/src/main/resources/custom-branding/drawable/revanced_notification_icon_custom.xml @@ -0,0 +1,12 @@ + + + + + + \ No newline at end of file