mirror of
https://github.com/revanced/revanced-patches.git
synced 2025-12-15 13:42:28 +01:00
fix(YouTube - Custom branding): Use ReVanced icon for status bar notification icon (#6108)
This commit is contained in:
committed by
GitHub
parent
5bd0f11630
commit
10ea250d4a
@@ -5,8 +5,10 @@ import android.preference.PreferenceScreen;
|
|||||||
import android.widget.Toolbar;
|
import android.widget.Toolbar;
|
||||||
|
|
||||||
import app.revanced.extension.music.settings.MusicActivityHook;
|
import app.revanced.extension.music.settings.MusicActivityHook;
|
||||||
|
import app.revanced.extension.shared.GmsCoreSupport;
|
||||||
import app.revanced.extension.shared.Logger;
|
import app.revanced.extension.shared.Logger;
|
||||||
import app.revanced.extension.shared.Utils;
|
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.shared.settings.preference.ToolbarPreferenceFragment;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -30,6 +32,17 @@ public class MusicPreferenceFragment extends ToolbarPreferenceFragment {
|
|||||||
preferenceScreen = getPreferenceScreen();
|
preferenceScreen = getPreferenceScreen();
|
||||||
Utils.sortPreferenceGroups(preferenceScreen);
|
Utils.sortPreferenceGroups(preferenceScreen);
|
||||||
setPreferenceScreenToolbar(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) {
|
} catch (Exception ex) {
|
||||||
Logger.printException(() -> "initialize failure", ex);
|
Logger.printException(() -> "initialize failure", ex);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,11 +1,14 @@
|
|||||||
package app.revanced.extension.shared.patches;
|
package app.revanced.extension.shared.patches;
|
||||||
|
|
||||||
|
import android.app.Notification;
|
||||||
import android.content.ComponentName;
|
import android.content.ComponentName;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.pm.PackageManager;
|
import android.content.pm.PackageManager;
|
||||||
|
import android.graphics.Color;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Locale;
|
||||||
|
|
||||||
import app.revanced.extension.shared.GmsCoreSupport;
|
import app.revanced.extension.shared.GmsCoreSupport;
|
||||||
import app.revanced.extension.shared.Logger;
|
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.
|
// The most that can be done is to hide a theme from the UI and keep the alias with dummy data.
|
||||||
public enum BrandingTheme {
|
public enum BrandingTheme {
|
||||||
/**
|
/**
|
||||||
* Original unpatched icon. Must be first enum.
|
* Original unpatched icon.
|
||||||
*/
|
*/
|
||||||
ORIGINAL("revanced_original"),
|
ORIGINAL,
|
||||||
ROUNDED("revanced_rounded"),
|
ROUNDED,
|
||||||
MINIMAL("revanced_minimal"),
|
MINIMAL,
|
||||||
SCALED("revanced_scaled"),
|
SCALED,
|
||||||
/**
|
/**
|
||||||
* User provided custom icon. Must be the last enum.
|
* User provided custom icon.
|
||||||
*/
|
*/
|
||||||
CUSTOM("revanced_custom");
|
CUSTOM;
|
||||||
|
|
||||||
public final String themeAlias;
|
|
||||||
|
|
||||||
BrandingTheme(String themeAlias) {
|
|
||||||
this.themeAlias = themeAlias;
|
|
||||||
}
|
|
||||||
|
|
||||||
private String packageAndNameIndexToClassAlias(String packageName, int appIndex) {
|
private String packageAndNameIndexToClassAlias(String packageName, int appIndex) {
|
||||||
if (appIndex <= 0) {
|
if (appIndex <= 0) {
|
||||||
throw new IllegalArgumentException("App index starts at index 1");
|
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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import android.graphics.Insets;
|
|||||||
import android.graphics.drawable.Drawable;
|
import android.graphics.drawable.Drawable;
|
||||||
import android.os.Build;
|
import android.os.Build;
|
||||||
import android.preference.Preference;
|
import android.preference.Preference;
|
||||||
|
import android.preference.PreferenceGroup;
|
||||||
import android.preference.PreferenceScreen;
|
import android.preference.PreferenceScreen;
|
||||||
import android.util.TypedValue;
|
import android.util.TypedValue;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
@@ -22,6 +23,24 @@ import app.revanced.extension.shared.settings.BaseActivityHook;
|
|||||||
|
|
||||||
@SuppressWarnings({"deprecation", "NewApi"})
|
@SuppressWarnings({"deprecation", "NewApi"})
|
||||||
public class ToolbarPreferenceFragment extends AbstractPreferenceFragment {
|
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.
|
* Sets toolbar for all nested preference screens.
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -4,8 +4,10 @@ import android.app.Dialog;
|
|||||||
import android.preference.PreferenceScreen;
|
import android.preference.PreferenceScreen;
|
||||||
import android.widget.Toolbar;
|
import android.widget.Toolbar;
|
||||||
|
|
||||||
|
import app.revanced.extension.shared.GmsCoreSupport;
|
||||||
import app.revanced.extension.shared.Logger;
|
import app.revanced.extension.shared.Logger;
|
||||||
import app.revanced.extension.shared.Utils;
|
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.shared.settings.preference.ToolbarPreferenceFragment;
|
||||||
import app.revanced.extension.youtube.settings.YouTubeActivityHook;
|
import app.revanced.extension.youtube.settings.YouTubeActivityHook;
|
||||||
|
|
||||||
@@ -30,6 +32,17 @@ public class YouTubePreferenceFragment extends ToolbarPreferenceFragment {
|
|||||||
preferenceScreen = getPreferenceScreen();
|
preferenceScreen = getPreferenceScreen();
|
||||||
Utils.sortPreferenceGroups(preferenceScreen);
|
Utils.sortPreferenceGroups(preferenceScreen);
|
||||||
setPreferenceScreenToolbar(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) {
|
} catch (Exception ex) {
|
||||||
Logger.printException(() -> "initialize failure", ex);
|
Logger.printException(() -> "initialize failure", ex);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -61,7 +61,7 @@ val customBrandingPatch = baseCustomBrandingPatch(
|
|||||||
originalLauncherIconName = "ic_launcher_release",
|
originalLauncherIconName = "ic_launcher_release",
|
||||||
originalAppName = "@string/app_launcher_name",
|
originalAppName = "@string/app_launcher_name",
|
||||||
originalAppPackageName = MUSIC_PACKAGE_NAME,
|
originalAppPackageName = MUSIC_PACKAGE_NAME,
|
||||||
copyExistingIntentsToAliases = false,
|
isYouTubeMusic = true,
|
||||||
numberOfPresetAppNames = 5,
|
numberOfPresetAppNames = 5,
|
||||||
mainActivityOnCreateFingerprint = musicActivityOnCreateFingerprint,
|
mainActivityOnCreateFingerprint = musicActivityOnCreateFingerprint,
|
||||||
mainActivityName = MUSIC_MAIN_ACTIVITY_NAME,
|
mainActivityName = MUSIC_MAIN_ACTIVITY_NAME,
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ package app.revanced.patches.shared.layout.branding
|
|||||||
|
|
||||||
import app.revanced.patcher.Fingerprint
|
import app.revanced.patcher.Fingerprint
|
||||||
import app.revanced.patcher.extensions.InstructionExtensions.addInstruction
|
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.PatchException
|
||||||
import app.revanced.patcher.patch.ResourcePatch
|
import app.revanced.patcher.patch.ResourcePatch
|
||||||
import app.revanced.patcher.patch.ResourcePatchBuilder
|
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.packagename.setOrGetFallbackPackageName
|
||||||
import app.revanced.patches.all.misc.resources.addResources
|
import app.revanced.patches.all.misc.resources.addResources
|
||||||
import app.revanced.patches.all.misc.resources.addResourcesPatch
|
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.BasePreferenceScreen
|
||||||
import app.revanced.patches.shared.misc.settings.preference.ListPreference
|
import app.revanced.patches.shared.misc.settings.preference.ListPreference
|
||||||
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.addInstructionsAtControlFlowLabel
|
||||||
import app.revanced.util.copyResources
|
import app.revanced.util.copyResources
|
||||||
import app.revanced.util.findElementByAttributeValueOrThrow
|
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.removeFromParent
|
||||||
import app.revanced.util.returnEarly
|
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.Element
|
||||||
import org.w3c.dom.NodeList
|
import org.w3c.dom.NodeList
|
||||||
import java.io.File
|
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_BACKGROUND_PREFIX = "revanced_adaptive_background_"
|
||||||
private const val LAUNCHER_ADAPTIVE_FOREGROUND_PREFIX = "revanced_adaptive_foreground_"
|
private const val LAUNCHER_ADAPTIVE_FOREGROUND_PREFIX = "revanced_adaptive_foreground_"
|
||||||
private const val LAUNCHER_ADAPTIVE_MONOCHROME_PREFIX = "revanced_adaptive_monochrome_"
|
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(
|
private val USER_CUSTOM_ADAPTIVE_FILE_NAMES = arrayOf(
|
||||||
"$LAUNCHER_ADAPTIVE_BACKGROUND_PREFIX$CUSTOM_USER_ICON_STYLE_NAME.png",
|
"$LAUNCHER_ADAPTIVE_BACKGROUND_PREFIX$CUSTOM_USER_ICON_STYLE_NAME.png",
|
||||||
"$LAUNCHER_ADAPTIVE_FOREGROUND_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;"
|
internal const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/shared/patches/CustomBrandingPatch;"
|
||||||
|
|
||||||
@@ -65,7 +78,7 @@ internal fun baseCustomBrandingPatch(
|
|||||||
originalLauncherIconName: String,
|
originalLauncherIconName: String,
|
||||||
originalAppName: String,
|
originalAppName: String,
|
||||||
originalAppPackageName: String,
|
originalAppPackageName: String,
|
||||||
copyExistingIntentsToAliases: Boolean,
|
isYouTubeMusic: Boolean,
|
||||||
numberOfPresetAppNames: Int,
|
numberOfPresetAppNames: Int,
|
||||||
mainActivityOnCreateFingerprint: Fingerprint,
|
mainActivityOnCreateFingerprint: Fingerprint,
|
||||||
mainActivityName: String,
|
mainActivityName: String,
|
||||||
@@ -96,8 +109,9 @@ internal fun baseCustomBrandingPatch(
|
|||||||
Each of the folders must contain all of the following files:
|
Each of the folders must contain all of the following files:
|
||||||
${USER_CUSTOM_ADAPTIVE_FILE_NAMES.joinToString("\n")}
|
${USER_CUSTOM_ADAPTIVE_FILE_NAMES.joinToString("\n")}
|
||||||
|
|
||||||
Optionally, the path can contain a 'drawable' folder with the monochrome icon file:
|
Optionally, the path contains a 'drawable' folder with any of the monochrome icon files:
|
||||||
$USER_CUSTOM_MONOCHROME_NAME
|
$USER_CUSTOM_MONOCHROME_FILE_NAME
|
||||||
|
$USER_CUSTOM_NOTIFICATION_ICON_FILE_NAME
|
||||||
""".trimIndentMultiline()
|
""".trimIndentMultiline()
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -105,7 +119,7 @@ internal fun baseCustomBrandingPatch(
|
|||||||
|
|
||||||
dependsOn(
|
dependsOn(
|
||||||
addResourcesPatch,
|
addResourcesPatch,
|
||||||
|
resourceMappingPatch,
|
||||||
bytecodePatch {
|
bytecodePatch {
|
||||||
execute {
|
execute {
|
||||||
mainActivityOnCreateFingerprint.method.addInstruction(
|
mainActivityOnCreateFingerprint.method.addInstruction(
|
||||||
@@ -114,25 +128,68 @@ internal fun baseCustomBrandingPatch(
|
|||||||
)
|
)
|
||||||
|
|
||||||
numberOfPresetAppNamesExtensionFingerprint.method.returnEarly(numberOfPresetAppNames)
|
numberOfPresetAppNamesExtensionFingerprint.method.returnEarly(numberOfPresetAppNames)
|
||||||
|
|
||||||
|
notificationFingerprint.method.apply {
|
||||||
|
val getBuilderIndex = if (isYouTubeMusic) {
|
||||||
|
// YT Music the field is not a plain object type.
|
||||||
|
indexOfFirstInstructionOrThrow {
|
||||||
|
getReference<FieldReference>()?.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<TypeReference>()
|
||||||
|
opcode == Opcode.CHECK_CAST &&
|
||||||
|
reference?.type == "Landroid/app/Notification\$Builder;"
|
||||||
|
}
|
||||||
|
indexOfFirstInstructionReversedOrThrow(builderCastIndex) {
|
||||||
|
getReference<FieldReference>()?.type == "Ljava/lang/Object;"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
val builderFieldName = getInstruction<ReferenceInstruction>(getBuilderIndex)
|
||||||
|
.getReference<FieldReference>()
|
||||||
|
|
||||||
|
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 {
|
finalize {
|
||||||
val useCustomName = customName != null
|
// Can only check if app is root installation by checking if change package name patch is in use.
|
||||||
val useCustomIcon = customIcon != null
|
// 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) {
|
if (setOrGetFallbackPackageName(originalAppPackageName) == originalAppPackageName) {
|
||||||
if (useCustomName || useCustomIcon) {
|
|
||||||
Logger.getLogger(this::class.java.name).warning(
|
Logger.getLogger(this::class.java.name).warning(
|
||||||
"Custom branding does not work with root installation. No changes applied."
|
"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(
|
preferenceScreen.addPreferences(
|
||||||
if (useCustomName) {
|
if (customName != null ) {
|
||||||
ListPreference(
|
ListPreference(
|
||||||
key = "revanced_custom_branding_name",
|
key = "revanced_custom_branding_name",
|
||||||
entriesKey = "revanced_custom_branding_name_custom_entries",
|
entriesKey = "revanced_custom_branding_name_custom_entries",
|
||||||
@@ -141,7 +198,7 @@ internal fun baseCustomBrandingPatch(
|
|||||||
} else {
|
} else {
|
||||||
ListPreference("revanced_custom_branding_name")
|
ListPreference("revanced_custom_branding_name")
|
||||||
},
|
},
|
||||||
if (useCustomIcon) {
|
if (customIcon != null) {
|
||||||
ListPreference(
|
ListPreference(
|
||||||
key = "revanced_custom_branding_icon",
|
key = "revanced_custom_branding_icon",
|
||||||
entriesKey = "revanced_custom_branding_icon_custom_entries",
|
entriesKey = "revanced_custom_branding_icon_custom_entries",
|
||||||
@@ -151,11 +208,6 @@ internal fun baseCustomBrandingPatch(
|
|||||||
ListPreference("revanced_custom_branding_icon")
|
ListPreference("revanced_custom_branding_icon")
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
}
|
|
||||||
|
|
||||||
execute {
|
|
||||||
addResources("shared", "layout.branding.baseCustomBrandingPatch")
|
|
||||||
addResources(addResourcePatchName, "layout.branding.customBrandingPatch")
|
|
||||||
|
|
||||||
val useCustomName = customName != null
|
val useCustomName = customName != null
|
||||||
val useCustomIcon = customIcon != null
|
val useCustomIcon = customIcon != null
|
||||||
@@ -167,7 +219,7 @@ internal fun baseCustomBrandingPatch(
|
|||||||
"drawable",
|
"drawable",
|
||||||
"$LAUNCHER_ADAPTIVE_BACKGROUND_PREFIX$style.xml",
|
"$LAUNCHER_ADAPTIVE_BACKGROUND_PREFIX$style.xml",
|
||||||
"$LAUNCHER_ADAPTIVE_FOREGROUND_PREFIX$style.xml",
|
"$LAUNCHER_ADAPTIVE_FOREGROUND_PREFIX$style.xml",
|
||||||
"$LAUNCHER_ADAPTIVE_MONOCHROME_PREFIX$style.xml"
|
"$LAUNCHER_ADAPTIVE_MONOCHROME_PREFIX$style.xml",
|
||||||
),
|
),
|
||||||
ResourceGroup(
|
ResourceGroup(
|
||||||
"mipmap-anydpi",
|
"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(
|
copyResources(
|
||||||
"custom-branding",
|
"custom-branding",
|
||||||
ResourceGroup(
|
// Push notification 'small' icon.
|
||||||
"mipmap-anydpi",
|
|
||||||
"$LAUNCHER_RESOURCE_NAME_PREFIX$CUSTOM_USER_ICON_STYLE_NAME.xml",
|
|
||||||
),
|
|
||||||
ResourceGroup(
|
ResourceGroup(
|
||||||
"drawable",
|
"drawable",
|
||||||
"$LAUNCHER_ADAPTIVE_MONOCHROME_PREFIX$CUSTOM_USER_ICON_STYLE_NAME.xml",
|
"$NOTIFICATION_ICON_NAME.xml"
|
||||||
|
),
|
||||||
|
|
||||||
|
// Copy template user icon, because the aliases must be added even if no user icon is provided.
|
||||||
|
ResourceGroup(
|
||||||
|
"drawable",
|
||||||
|
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 ->
|
mipmapDirectories.forEach { dpi ->
|
||||||
copyResources(
|
copyResources(
|
||||||
"custom-branding",
|
"custom-branding",
|
||||||
@@ -232,13 +291,7 @@ internal fun baseCustomBrandingPatch(
|
|||||||
alias.setAttribute("android:targetActivity", mainActivityName)
|
alias.setAttribute("android:targetActivity", mainActivityName)
|
||||||
|
|
||||||
// Copy all intents from the original alias so long press actions still work.
|
// Copy all intents from the original alias so long press actions still work.
|
||||||
if (copyExistingIntentsToAliases) {
|
if (isYouTubeMusic) {
|
||||||
for (i in 0 until intents.length) {
|
|
||||||
alias.appendChild(
|
|
||||||
intents.item(i).cloneNode(true)
|
|
||||||
)
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
val intentFilter = document.createElement("intent-filter").apply {
|
val intentFilter = document.createElement("intent-filter").apply {
|
||||||
val action = document.createElement("action")
|
val action = document.createElement("action")
|
||||||
action.setAttribute("android:name", "android.intent.action.MAIN")
|
action.setAttribute("android:name", "android.intent.action.MAIN")
|
||||||
@@ -249,6 +302,12 @@ internal fun baseCustomBrandingPatch(
|
|||||||
appendChild(category)
|
appendChild(category)
|
||||||
}
|
}
|
||||||
alias.appendChild(intentFilter)
|
alias.appendChild(intentFilter)
|
||||||
|
} else {
|
||||||
|
for (i in 0 until intents.length) {
|
||||||
|
alias.appendChild(
|
||||||
|
intents.item(i).cloneNode(true)
|
||||||
|
)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return alias
|
return alias
|
||||||
@@ -375,16 +434,21 @@ internal fun baseCustomBrandingPatch(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Copy monochrome if it provided.
|
// Copy monochrome and small notification icon if it provided.
|
||||||
val monochromeRelativePath = "drawable/$USER_CUSTOM_MONOCHROME_NAME"
|
arrayOf(
|
||||||
val monochromeFile = iconPathFile.resolve(monochromeRelativePath)
|
USER_CUSTOM_MONOCHROME_FILE_NAME,
|
||||||
if (monochromeFile.exists()) {
|
USER_CUSTOM_NOTIFICATION_ICON_FILE_NAME
|
||||||
monochromeFile.copyTo(
|
).forEach { fileName ->
|
||||||
target = resourceDirectory.resolve(monochromeRelativePath),
|
val relativePath = "drawable/$fileName"
|
||||||
|
val file = iconPathFile.resolve(relativePath)
|
||||||
|
if (file.exists()) {
|
||||||
|
file.copyTo(
|
||||||
|
target = resourceDirectory.resolve(relativePath),
|
||||||
overwrite = true
|
overwrite = true
|
||||||
)
|
)
|
||||||
copiedFiles = true
|
copiedFiles = true
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (!copiedFiles) {
|
if (!copiedFiles) {
|
||||||
throw PatchException("Could not find any replacement images in " +
|
throw PatchException("Could not find any replacement images in " +
|
||||||
|
|||||||
@@ -11,3 +11,11 @@ internal val numberOfPresetAppNamesExtensionFingerprint = fingerprint {
|
|||||||
method.name == "numberOfPresetAppNames" && classDef.type == EXTENSION_CLASS_DESCRIPTOR
|
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")
|
||||||
|
}
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ val customBrandingPatch = baseCustomBrandingPatch(
|
|||||||
originalLauncherIconName = "ic_launcher",
|
originalLauncherIconName = "ic_launcher",
|
||||||
originalAppName = "@string/application_name",
|
originalAppName = "@string/application_name",
|
||||||
originalAppPackageName = YOUTUBE_PACKAGE_NAME,
|
originalAppPackageName = YOUTUBE_PACKAGE_NAME,
|
||||||
copyExistingIntentsToAliases = true,
|
isYouTubeMusic = false,
|
||||||
numberOfPresetAppNames = 5,
|
numberOfPresetAppNames = 5,
|
||||||
mainActivityOnCreateFingerprint = mainActivityOnCreateFingerprint,
|
mainActivityOnCreateFingerprint = mainActivityOnCreateFingerprint,
|
||||||
mainActivityName = YOUTUBE_MAIN_ACTIVITY_NAME,
|
mainActivityName = YOUTUBE_MAIN_ACTIVITY_NAME,
|
||||||
|
|||||||
@@ -9,27 +9,33 @@
|
|||||||
The dark background is needed to see the V shape in day mode. To prevent hiding
|
The dark background is needed to see the V shape in day mode. To prevent hiding
|
||||||
the layer it must be added to the foreground. -->
|
the layer it must be added to the foreground. -->
|
||||||
<path
|
<path
|
||||||
android:pathData="M0,0 L256,0 L256,256 L0,256 Z"
|
android:fillColor="#1B1B1B"
|
||||||
android:fillColor="#1B1B1B" />
|
android:pathData="M0,0 L256,0 L256,256 L0,256 Z" />
|
||||||
<group android:scaleX="0.24"
|
<group
|
||||||
|
android:scaleX="0.24"
|
||||||
android:scaleY="0.24"
|
android:scaleY="0.24"
|
||||||
android:translateX="97.28"
|
android:translateX="97.28"
|
||||||
android:translateY="97.28">
|
android:translateY="97.28">
|
||||||
<path
|
<path
|
||||||
android:pathData="M250.09,13.49C251.39,10.51 251.11,7.08 249.33,4.36C247.55,1.64 244.52,0 241.27,0L228.81,0C226.08,0 223.61,1.62 222.51,4.11C211.54,29.1 153.63,160.99 134.29,205.04C133.2,207.54 130.73,209.15 128,209.15C125.27,209.15 122.8,207.54 121.7,205.04C102.36,160.99 44.46,29.1 33.49,4.11C32.39,1.62 29.92,0 27.19,0L14.73,0C11.48,0 8.45,1.64 6.67,4.36C4.89,7.08 4.61,10.51 5.91,13.49C26.64,60.8 95.56,218.1 109.63,250.24C111.17,253.74 114.63,256 118.45,256L137.55,256C141.37,256 144.83,253.74 146.36,250.24C160.44,218.1 229.36,60.8 250.09,13.49Z"
|
android:fillColor="#FFFFFF"
|
||||||
android:fillColor="#FFFFFF"/>
|
android:pathData="M250.09,13.49C251.39,10.51 251.11,7.08 249.33,4.36C247.55,1.64 244.52,0 241.27,0L228.81,0C226.08,0 223.61,1.62 222.51,4.11C211.54,29.1 153.63,160.99 134.29,205.04C133.2,207.54 130.73,209.15 128,209.15C125.27,209.15 122.8,207.54 121.7,205.04C102.36,160.99 44.46,29.1 33.49,4.11C32.39,1.62 29.92,0 27.19,0L14.73,0C11.48,0 8.45,1.64 6.67,4.36C4.89,7.08 4.61,10.51 5.91,13.49C26.64,60.8 95.56,218.1 109.63,250.24C111.17,253.74 114.63,256 118.45,256L137.55,256C141.37,256 144.83,253.74 146.36,250.24C160.44,218.1 229.36,60.8 250.09,13.49Z" />
|
||||||
<path
|
<path android:pathData="M135.14,123.87C133.67,126.43 130.94,128 128,128C125.05,128 122.33,126.43 120.85,123.87C105.89,97.97 71.44,38.28 56.48,12.37C55,9.82 55,6.68 56.48,4.12C57.95,1.57 60.68,-0 63.62,-0L192.37,-0C195.32,-0 198.04,1.57 199.52,4.12C200.99,6.68 200.99,9.82 199.52,12.37C184.56,38.28 150.1,97.97 135.14,123.87Z">
|
||||||
android:pathData="M135.14,123.87C133.67,126.43 130.94,128 128,128C125.05,128 122.33,126.43 120.85,123.87C105.89,97.97 71.44,38.28 56.48,12.37C55,9.82 55,6.68 56.48,4.12C57.95,1.57 60.68,-0 63.62,-0L192.37,-0C195.32,-0 198.04,1.57 199.52,4.12C200.99,6.68 200.99,9.82 199.52,12.37C184.56,38.28 150.1,97.97 135.14,123.87Z">
|
|
||||||
<aapt:attr name="android:fillColor">
|
<aapt:attr name="android:fillColor">
|
||||||
<gradient
|
<gradient
|
||||||
android:startX="128"
|
|
||||||
android:startY="-0"
|
|
||||||
android:endX="128"
|
android:endX="128"
|
||||||
android:endY="254.6"
|
android:endY="254.6"
|
||||||
|
android:startX="128"
|
||||||
|
android:startY="-0"
|
||||||
android:type="linear">
|
android:type="linear">
|
||||||
<item android:offset="0" android:color="#FFF04E98"/>
|
<item
|
||||||
<item android:offset="0.5" android:color="#FF5F65D4"/>
|
android:color="#FFF04E98"
|
||||||
<item android:offset="1" android:color="#FF4E98F0"/>
|
android:offset="0" />
|
||||||
|
<item
|
||||||
|
android:color="#FF5F65D4"
|
||||||
|
android:offset="0.5" />
|
||||||
|
<item
|
||||||
|
android:color="#FF4E98F0"
|
||||||
|
android:offset="1" />
|
||||||
</gradient>
|
</gradient>
|
||||||
</aapt:attr>
|
</aapt:attr>
|
||||||
</path>
|
</path>
|
||||||
|
|||||||
@@ -5,45 +5,57 @@
|
|||||||
android:height="108dp"
|
android:height="108dp"
|
||||||
android:viewportWidth="800"
|
android:viewportWidth="800"
|
||||||
android:viewportHeight="800">
|
android:viewportHeight="800">
|
||||||
<group android:scaleX="0.5"
|
<group
|
||||||
|
android:scaleX="0.5"
|
||||||
android:scaleY="0.5"
|
android:scaleY="0.5"
|
||||||
android:translateX="200"
|
android:translateX="200"
|
||||||
android:translateY="200">
|
android:translateY="200">
|
||||||
<path
|
<path
|
||||||
android:pathData="M400,400m-400,0a400,400 0,1 1,800 0a400,400 0,1 1,-800 0"
|
android:fillColor="#1B1B1B"
|
||||||
android:fillColor="#1B1B1B"/>
|
android:pathData="M400,400m-400,0a400,400 0,1 1,800 0a400,400 0,1 1,-800 0" />
|
||||||
<path
|
<path
|
||||||
|
android:fillType="evenOdd"
|
||||||
android:pathData="M400,0c220.77,0 400,179.23 400,400c-0,220.77 -179.23,400 -400,400c-220.77,-0 -400,-179.23 -400,-400c0,-220.77 179.23,-400 400,-400ZM400,36c200.9,-0 364,163.1 364,364c0,200.9 -163.1,364 -364,364c-200.9,0 -364,-163.1 -364,-364c-0,-200.9 163.1,-364 364,-364Z"
|
android:pathData="M400,0c220.77,0 400,179.23 400,400c-0,220.77 -179.23,400 -400,400c-220.77,-0 -400,-179.23 -400,-400c0,-220.77 179.23,-400 400,-400ZM400,36c200.9,-0 364,163.1 364,364c0,200.9 -163.1,364 -364,364c-200.9,0 -364,-163.1 -364,-364c-0,-200.9 163.1,-364 364,-364Z"
|
||||||
android:strokeLineJoin="round"
|
android:strokeLineJoin="round">
|
||||||
android:fillType="evenOdd">
|
|
||||||
<aapt:attr name="android:fillColor">
|
<aapt:attr name="android:fillColor">
|
||||||
<gradient
|
<gradient
|
||||||
android:startX="400"
|
|
||||||
android:startY="0"
|
|
||||||
android:endX="400"
|
android:endX="400"
|
||||||
android:endY="800"
|
android:endY="800"
|
||||||
|
android:startX="400"
|
||||||
|
android:startY="0"
|
||||||
android:type="linear">
|
android:type="linear">
|
||||||
<item android:offset="0" android:color="#FFF04E98"/>
|
<item
|
||||||
<item android:offset="0.5" android:color="#FF5F65D4"/>
|
android:color="#FFF04E98"
|
||||||
<item android:offset="1" android:color="#FF4E98F0"/>
|
android:offset="0" />
|
||||||
|
<item
|
||||||
|
android:color="#FF5F65D4"
|
||||||
|
android:offset="0.5" />
|
||||||
|
<item
|
||||||
|
android:color="#FF4E98F0"
|
||||||
|
android:offset="1" />
|
||||||
</gradient>
|
</gradient>
|
||||||
</aapt:attr>
|
</aapt:attr>
|
||||||
</path>
|
</path>
|
||||||
<path
|
<path
|
||||||
android:pathData="M538.74,269.87c1.48,-3.38 1.16,-7.28 -0.86,-10.37c-2.02,-3.09 -5.46,-4.95 -9.16,-4.95c-5.15,0 -10.44,0 -14.16,0c-3.1,0 -5.91,1.83 -7.15,4.67c-12.47,28.4 -78.27,178.27 -100.25,228.33c-1.25,2.84 -4.05,4.67 -7.15,4.67c-3.1,0 -5.91,-1.83 -7.15,-4.67c-21.98,-50.06 -87.78,-199.93 -100.25,-228.33c-1.25,-2.84 -4.05,-4.67 -7.15,-4.67c-3.73,0 -9.02,0 -14.16,0c-3.69,0 -7.14,1.86 -9.16,4.95c-2.02,3.09 -2.34,6.99 -0.86,10.37c23.56,53.77 101.87,232.52 117.87,269.03c1.74,3.98 5.67,6.55 10.02,6.55c6.29,-0 15.41,-0 21.7,-0c4.34,-0 8.27,-2.57 10.02,-6.55c16,-36.51 94.32,-215.27 117.87,-269.03Z"
|
android:fillColor="#FFFFFF"
|
||||||
android:fillColor="#FFFFFF"/>
|
android:pathData="M538.74,269.87c1.48,-3.38 1.16,-7.28 -0.86,-10.37c-2.02,-3.09 -5.46,-4.95 -9.16,-4.95c-5.15,0 -10.44,0 -14.16,0c-3.1,0 -5.91,1.83 -7.15,4.67c-12.47,28.4 -78.27,178.27 -100.25,228.33c-1.25,2.84 -4.05,4.67 -7.15,4.67c-3.1,0 -5.91,-1.83 -7.15,-4.67c-21.98,-50.06 -87.78,-199.93 -100.25,-228.33c-1.25,-2.84 -4.05,-4.67 -7.15,-4.67c-3.73,0 -9.02,0 -14.16,0c-3.69,0 -7.14,1.86 -9.16,4.95c-2.02,3.09 -2.34,6.99 -0.86,10.37c23.56,53.77 101.87,232.52 117.87,269.03c1.74,3.98 5.67,6.55 10.02,6.55c6.29,-0 15.41,-0 21.7,-0c4.34,-0 8.27,-2.57 10.02,-6.55c16,-36.51 94.32,-215.27 117.87,-269.03Z" />
|
||||||
<path
|
<path android:pathData="M408.12,395.31c-1.67,2.9 -4.77,4.69 -8.12,4.69c-3.35,-0 -6.44,-1.79 -8.12,-4.69c-17,-29.44 -56.16,-97.26 -73.15,-126.7c-1.67,-2.9 -1.67,-6.47 0,-9.38c1.67,-2.9 4.77,-4.69 8.12,-4.69c33.99,0 112.31,0 146.31,0c3.35,0 6.44,1.79 8.12,4.69c1.67,2.9 1.67,6.47 -0,9.38c-17,29.44 -56.16,97.26 -73.15,126.7Z">
|
||||||
android:pathData="M408.12,395.31c-1.67,2.9 -4.77,4.69 -8.12,4.69c-3.35,-0 -6.44,-1.79 -8.12,-4.69c-17,-29.44 -56.16,-97.26 -73.15,-126.7c-1.67,-2.9 -1.67,-6.47 0,-9.38c1.67,-2.9 4.77,-4.69 8.12,-4.69c33.99,0 112.31,0 146.31,0c3.35,0 6.44,1.79 8.12,4.69c1.67,2.9 1.67,6.47 -0,9.38c-17,29.44 -56.16,97.26 -73.15,126.7Z">
|
|
||||||
<aapt:attr name="android:fillColor">
|
<aapt:attr name="android:fillColor">
|
||||||
<gradient
|
<gradient
|
||||||
android:startX="400"
|
|
||||||
android:startY="254.54"
|
|
||||||
android:endX="400"
|
android:endX="400"
|
||||||
android:endY="543.86"
|
android:endY="543.86"
|
||||||
|
android:startX="400"
|
||||||
|
android:startY="254.54"
|
||||||
android:type="linear">
|
android:type="linear">
|
||||||
<item android:offset="0" android:color="#FFF04E98"/>
|
<item
|
||||||
<item android:offset="0.5" android:color="#FF5F65D4"/>
|
android:color="#FFF04E98"
|
||||||
<item android:offset="1" android:color="#FF4E98F0"/>
|
android:offset="0" />
|
||||||
|
<item
|
||||||
|
android:color="#FF5F65D4"
|
||||||
|
android:offset="0.5" />
|
||||||
|
<item
|
||||||
|
android:color="#FF4E98F0"
|
||||||
|
android:offset="1" />
|
||||||
</gradient>
|
</gradient>
|
||||||
</aapt:attr>
|
</aapt:attr>
|
||||||
</path>
|
</path>
|
||||||
|
|||||||
@@ -9,27 +9,33 @@
|
|||||||
The dark background is needed to see the V shape in day mode. To prevent hiding
|
The dark background is needed to see the V shape in day mode. To prevent hiding
|
||||||
the layer it must be added to the foreground. -->
|
the layer it must be added to the foreground. -->
|
||||||
<path
|
<path
|
||||||
android:pathData="M0,0 L256,0 L256,256 L0,256 Z"
|
android:fillColor="#000000"
|
||||||
android:fillColor="#000000" />
|
android:pathData="M0,0 L256,0 L256,256 L0,256 Z" />
|
||||||
<group android:scaleX="0.3"
|
<group
|
||||||
|
android:scaleX="0.3"
|
||||||
android:scaleY="0.3"
|
android:scaleY="0.3"
|
||||||
android:translateX="89.6"
|
android:translateX="89.6"
|
||||||
android:translateY="89.6">
|
android:translateY="89.6">
|
||||||
<path
|
<path
|
||||||
android:pathData="M250.09,13.49C251.39,10.51 251.11,7.08 249.33,4.36C247.55,1.64 244.52,0 241.27,0L228.81,0C226.08,0 223.61,1.62 222.51,4.11C211.54,29.1 153.63,160.99 134.29,205.04C133.2,207.54 130.73,209.15 128,209.15C125.27,209.15 122.8,207.54 121.7,205.04C102.36,160.99 44.46,29.1 33.49,4.11C32.39,1.62 29.92,0 27.19,0L14.73,0C11.48,0 8.45,1.64 6.67,4.36C4.89,7.08 4.61,10.51 5.91,13.49C26.64,60.8 95.56,218.1 109.63,250.24C111.17,253.74 114.63,256 118.45,256L137.55,256C141.37,256 144.83,253.74 146.36,250.24C160.44,218.1 229.36,60.8 250.09,13.49Z"
|
android:fillColor="#FFFFFF"
|
||||||
android:fillColor="#FFFFFF"/>
|
android:pathData="M250.09,13.49C251.39,10.51 251.11,7.08 249.33,4.36C247.55,1.64 244.52,0 241.27,0L228.81,0C226.08,0 223.61,1.62 222.51,4.11C211.54,29.1 153.63,160.99 134.29,205.04C133.2,207.54 130.73,209.15 128,209.15C125.27,209.15 122.8,207.54 121.7,205.04C102.36,160.99 44.46,29.1 33.49,4.11C32.39,1.62 29.92,0 27.19,0L14.73,0C11.48,0 8.45,1.64 6.67,4.36C4.89,7.08 4.61,10.51 5.91,13.49C26.64,60.8 95.56,218.1 109.63,250.24C111.17,253.74 114.63,256 118.45,256L137.55,256C141.37,256 144.83,253.74 146.36,250.24C160.44,218.1 229.36,60.8 250.09,13.49Z" />
|
||||||
<path
|
<path android:pathData="M135.14,123.87C133.67,126.43 130.94,128 128,128C125.05,128 122.33,126.43 120.85,123.87C105.89,97.97 71.44,38.28 56.48,12.37C55,9.82 55,6.68 56.48,4.12C57.95,1.57 60.68,-0 63.62,-0L192.37,-0C195.32,-0 198.04,1.57 199.52,4.12C200.99,6.68 200.99,9.82 199.52,12.37C184.56,38.28 150.1,97.97 135.14,123.87Z">
|
||||||
android:pathData="M135.14,123.87C133.67,126.43 130.94,128 128,128C125.05,128 122.33,126.43 120.85,123.87C105.89,97.97 71.44,38.28 56.48,12.37C55,9.82 55,6.68 56.48,4.12C57.95,1.57 60.68,-0 63.62,-0L192.37,-0C195.32,-0 198.04,1.57 199.52,4.12C200.99,6.68 200.99,9.82 199.52,12.37C184.56,38.28 150.1,97.97 135.14,123.87Z">
|
|
||||||
<aapt:attr name="android:fillColor">
|
<aapt:attr name="android:fillColor">
|
||||||
<gradient
|
<gradient
|
||||||
android:startX="128"
|
|
||||||
android:startY="0"
|
|
||||||
android:endX="128"
|
android:endX="128"
|
||||||
android:endY="254.6"
|
android:endY="254.6"
|
||||||
|
android:startX="128"
|
||||||
|
android:startY="0"
|
||||||
android:type="linear">
|
android:type="linear">
|
||||||
<item android:offset="0" android:color="#FFF04E98"/>
|
<item
|
||||||
<item android:offset="0.5" android:color="#FF5F65D4"/>
|
android:color="#FFF04E98"
|
||||||
<item android:offset="1" android:color="#FF4E98F0"/>
|
android:offset="0" />
|
||||||
|
<item
|
||||||
|
android:color="#FF5F65D4"
|
||||||
|
android:offset="0.5" />
|
||||||
|
<item
|
||||||
|
android:color="#FF4E98F0"
|
||||||
|
android:offset="1" />
|
||||||
</gradient>
|
</gradient>
|
||||||
</aapt:attr>
|
</aapt:attr>
|
||||||
</path>
|
</path>
|
||||||
|
|||||||
@@ -4,15 +4,16 @@
|
|||||||
android:height="108dp"
|
android:height="108dp"
|
||||||
android:viewportWidth="256"
|
android:viewportWidth="256"
|
||||||
android:viewportHeight="256">
|
android:viewportHeight="256">
|
||||||
<group android:scaleX="0.24"
|
<group
|
||||||
|
android:scaleX="0.24"
|
||||||
android:scaleY="0.24"
|
android:scaleY="0.24"
|
||||||
android:translateX="97.28"
|
android:translateX="97.28"
|
||||||
android:translateY="97.28">
|
android:translateY="97.28">
|
||||||
<path
|
<path
|
||||||
android:fillColor="#ff000000"
|
android:fillColor="#FF000000"
|
||||||
android:pathData="M250.09,13.49C251.39,10.51 251.11,7.08 249.33,4.36C247.55,1.64 244.52,0 241.27,0L228.81,0C226.08,0 223.61,1.62 222.51,4.11C211.54,29.1 153.63,160.99 134.29,205.04C133.2,207.54 130.73,209.15 128,209.15C125.27,209.15 122.8,207.54 121.7,205.04C102.36,160.99 44.46,29.1 33.49,4.11C32.39,1.62 29.92,0 27.19,0L14.73,0C11.48,0 8.45,1.64 6.67,4.36C4.89,7.08 4.61,10.51 5.91,13.49C26.64,60.8 95.56,218.1 109.63,250.24C111.17,253.74 114.63,256 118.45,256L137.55,256C141.37,256 144.83,253.74 146.36,250.24C160.44,218.1 229.36,60.8 250.09,13.49Z"/>
|
android:pathData="M250.09,13.49C251.39,10.51 251.11,7.08 249.33,4.36C247.55,1.64 244.52,0 241.27,0L228.81,0C226.08,0 223.61,1.62 222.51,4.11C211.54,29.1 153.63,160.99 134.29,205.04C133.2,207.54 130.73,209.15 128,209.15C125.27,209.15 122.8,207.54 121.7,205.04C102.36,160.99 44.46,29.1 33.49,4.11C32.39,1.62 29.92,0 27.19,0L14.73,0C11.48,0 8.45,1.64 6.67,4.36C4.89,7.08 4.61,10.51 5.91,13.49C26.64,60.8 95.56,218.1 109.63,250.24C111.17,253.74 114.63,256 118.45,256L137.55,256C141.37,256 144.83,253.74 146.36,250.24C160.44,218.1 229.36,60.8 250.09,13.49Z" />
|
||||||
<path
|
<path
|
||||||
android:fillColor="#ff000000"
|
android:fillColor="#FF000000"
|
||||||
android:pathData="M135.14,123.87C133.67,126.43 130.94,128 128,128C125.05,128 122.33,126.43 120.85,123.87C105.89,97.97 71.44,38.28 56.48,12.37C55,9.82 55,6.68 56.48,4.12C57.95,1.57 60.68,-0 63.62,-0L192.37,-0C195.32,-0 198.04,1.57 199.52,4.12C200.99,6.68 200.99,9.82 199.52,12.37C184.56,38.28 150.1,97.97 135.14,123.87Z"/>
|
android:pathData="M135.14,123.87C133.67,126.43 130.94,128 128,128C125.05,128 122.33,126.43 120.85,123.87C105.89,97.97 71.44,38.28 56.48,12.37C55,9.82 55,6.68 56.48,4.12C57.95,1.57 60.68,-0 63.62,-0L192.37,-0C195.32,-0 198.04,1.57 199.52,4.12C200.99,6.68 200.99,9.82 199.52,12.37C184.56,38.28 150.1,97.97 135.14,123.87Z" />
|
||||||
</group>
|
</group>
|
||||||
</vector>
|
</vector>
|
||||||
|
|||||||
@@ -4,15 +4,16 @@
|
|||||||
android:height="108dp"
|
android:height="108dp"
|
||||||
android:viewportWidth="256"
|
android:viewportWidth="256"
|
||||||
android:viewportHeight="256">
|
android:viewportHeight="256">
|
||||||
<group android:scaleX="0.24"
|
<group
|
||||||
|
android:scaleX="0.24"
|
||||||
android:scaleY="0.24"
|
android:scaleY="0.24"
|
||||||
android:translateX="97.28"
|
android:translateX="97.28"
|
||||||
android:translateY="97.28">
|
android:translateY="97.28">
|
||||||
<path
|
<path
|
||||||
android:fillColor="#ff000000"
|
android:fillColor="#FF000000"
|
||||||
android:pathData="M250.09,13.49C251.39,10.51 251.11,7.08 249.33,4.36C247.55,1.64 244.52,0 241.27,0L228.81,0C226.08,0 223.61,1.62 222.51,4.11C211.54,29.1 153.63,160.99 134.29,205.04C133.2,207.54 130.73,209.15 128,209.15C125.27,209.15 122.8,207.54 121.7,205.04C102.36,160.99 44.46,29.1 33.49,4.11C32.39,1.62 29.92,0 27.19,0L14.73,0C11.48,0 8.45,1.64 6.67,4.36C4.89,7.08 4.61,10.51 5.91,13.49C26.64,60.8 95.56,218.1 109.63,250.24C111.17,253.74 114.63,256 118.45,256L137.55,256C141.37,256 144.83,253.74 146.36,250.24C160.44,218.1 229.36,60.8 250.09,13.49Z"/>
|
android:pathData="M250.09,13.49C251.39,10.51 251.11,7.08 249.33,4.36C247.55,1.64 244.52,0 241.27,0L228.81,0C226.08,0 223.61,1.62 222.51,4.11C211.54,29.1 153.63,160.99 134.29,205.04C133.2,207.54 130.73,209.15 128,209.15C125.27,209.15 122.8,207.54 121.7,205.04C102.36,160.99 44.46,29.1 33.49,4.11C32.39,1.62 29.92,0 27.19,0L14.73,0C11.48,0 8.45,1.64 6.67,4.36C4.89,7.08 4.61,10.51 5.91,13.49C26.64,60.8 95.56,218.1 109.63,250.24C111.17,253.74 114.63,256 118.45,256L137.55,256C141.37,256 144.83,253.74 146.36,250.24C160.44,218.1 229.36,60.8 250.09,13.49Z" />
|
||||||
<path
|
<path
|
||||||
android:fillColor="#ff000000"
|
android:fillColor="#FF000000"
|
||||||
android:pathData="M135.14,123.87C133.67,126.43 130.94,128 128,128C125.05,128 122.33,126.43 120.85,123.87C105.89,97.97 71.44,38.28 56.48,12.37C55,9.82 55,6.68 56.48,4.12C57.95,1.57 60.68,-0 63.62,-0L192.37,-0C195.32,-0 198.04,1.57 199.52,4.12C200.99,6.68 200.99,9.82 199.52,12.37C184.56,38.28 150.1,97.97 135.14,123.87Z"/>
|
android:pathData="M135.14,123.87C133.67,126.43 130.94,128 128,128C125.05,128 122.33,126.43 120.85,123.87C105.89,97.97 71.44,38.28 56.48,12.37C55,9.82 55,6.68 56.48,4.12C57.95,1.57 60.68,-0 63.62,-0L192.37,-0C195.32,-0 198.04,1.57 199.52,4.12C200.99,6.68 200.99,9.82 199.52,12.37C184.56,38.28 150.1,97.97 135.14,123.87Z" />
|
||||||
</group>
|
</group>
|
||||||
</vector>
|
</vector>
|
||||||
|
|||||||
@@ -4,20 +4,21 @@
|
|||||||
android:height="108dp"
|
android:height="108dp"
|
||||||
android:viewportWidth="800"
|
android:viewportWidth="800"
|
||||||
android:viewportHeight="800">
|
android:viewportHeight="800">
|
||||||
<group android:scaleX="0.5"
|
<group
|
||||||
|
android:scaleX="0.5"
|
||||||
android:scaleY="0.5"
|
android:scaleY="0.5"
|
||||||
android:translateX="200"
|
android:translateX="200"
|
||||||
android:translateY="200">
|
android:translateY="200">
|
||||||
<path
|
<path
|
||||||
android:fillColor="#ff000000"
|
android:fillColor="#FF000000"
|
||||||
|
android:fillType="evenOdd"
|
||||||
android:pathData="M400,0c220.77,0 400,179.23 400,400c-0,220.77 -179.23,400 -400,400c-220.77,-0 -400,-179.23 -400,-400c0,-220.77 179.23,-400 400,-400ZM400,36c200.9,-0 364,163.1 364,364c0,200.9 -163.1,364 -364,364c-200.9,0 -364,-163.1 -364,-364c-0,-200.9 163.1,-364 364,-364Z"
|
android:pathData="M400,0c220.77,0 400,179.23 400,400c-0,220.77 -179.23,400 -400,400c-220.77,-0 -400,-179.23 -400,-400c0,-220.77 179.23,-400 400,-400ZM400,36c200.9,-0 364,163.1 364,364c0,200.9 -163.1,364 -364,364c-200.9,0 -364,-163.1 -364,-364c-0,-200.9 163.1,-364 364,-364Z"
|
||||||
android:strokeLineJoin="round"
|
android:strokeLineJoin="round" />
|
||||||
android:fillType="evenOdd"/>
|
|
||||||
<path
|
<path
|
||||||
android:fillColor="#ff000000"
|
android:fillColor="#FF000000"
|
||||||
android:pathData="M538.74,269.87c1.48,-3.38 1.16,-7.28 -0.86,-10.37c-2.02,-3.09 -5.46,-4.95 -9.16,-4.95c-5.15,0 -10.44,0 -14.16,0c-3.1,0 -5.91,1.83 -7.15,4.67c-12.47,28.4 -78.27,178.27 -100.25,228.33c-1.25,2.84 -4.05,4.67 -7.15,4.67c-3.1,0 -5.91,-1.83 -7.15,-4.67c-21.98,-50.06 -87.78,-199.93 -100.25,-228.33c-1.25,-2.84 -4.05,-4.67 -7.15,-4.67c-3.73,0 -9.02,0 -14.16,0c-3.69,0 -7.14,1.86 -9.16,4.95c-2.02,3.09 -2.34,6.99 -0.86,10.37c23.56,53.77 101.87,232.52 117.87,269.03c1.74,3.98 5.67,6.55 10.02,6.55c6.29,-0 15.41,-0 21.7,-0c4.34,-0 8.27,-2.57 10.02,-6.55c16,-36.51 94.32,-215.27 117.87,-269.03Z"/>
|
android:pathData="M538.74,269.87c1.48,-3.38 1.16,-7.28 -0.86,-10.37c-2.02,-3.09 -5.46,-4.95 -9.16,-4.95c-5.15,0 -10.44,0 -14.16,0c-3.1,0 -5.91,1.83 -7.15,4.67c-12.47,28.4 -78.27,178.27 -100.25,228.33c-1.25,2.84 -4.05,4.67 -7.15,4.67c-3.1,0 -5.91,-1.83 -7.15,-4.67c-21.98,-50.06 -87.78,-199.93 -100.25,-228.33c-1.25,-2.84 -4.05,-4.67 -7.15,-4.67c-3.73,0 -9.02,0 -14.16,0c-3.69,0 -7.14,1.86 -9.16,4.95c-2.02,3.09 -2.34,6.99 -0.86,10.37c23.56,53.77 101.87,232.52 117.87,269.03c1.74,3.98 5.67,6.55 10.02,6.55c6.29,-0 15.41,-0 21.7,-0c4.34,-0 8.27,-2.57 10.02,-6.55c16,-36.51 94.32,-215.27 117.87,-269.03Z" />
|
||||||
<path
|
<path
|
||||||
android:fillColor="#ff000000"
|
android:fillColor="#FF000000"
|
||||||
android:pathData="M408.12,395.31c-1.67,2.9 -4.77,4.69 -8.12,4.69c-3.35,-0 -6.44,-1.79 -8.12,-4.69c-17,-29.44 -56.16,-97.26 -73.15,-126.7c-1.67,-2.9 -1.67,-6.47 0,-9.38c1.67,-2.9 4.77,-4.69 8.12,-4.69c33.99,0 112.31,0 146.31,0c3.35,0 6.44,1.79 8.12,4.69c1.67,2.9 1.67,6.47 -0,9.38c-17,29.44 -56.16,97.26 -73.15,126.7Z"/>
|
android:pathData="M408.12,395.31c-1.67,2.9 -4.77,4.69 -8.12,4.69c-3.35,-0 -6.44,-1.79 -8.12,-4.69c-17,-29.44 -56.16,-97.26 -73.15,-126.7c-1.67,-2.9 -1.67,-6.47 0,-9.38c1.67,-2.9 4.77,-4.69 8.12,-4.69c33.99,0 112.31,0 146.31,0c3.35,0 6.44,1.79 8.12,4.69c1.67,2.9 1.67,6.47 -0,9.38c-17,29.44 -56.16,97.26 -73.15,126.7Z" />
|
||||||
</group>
|
</group>
|
||||||
</vector>
|
</vector>
|
||||||
|
|||||||
@@ -4,15 +4,16 @@
|
|||||||
android:height="108dp"
|
android:height="108dp"
|
||||||
android:viewportWidth="256"
|
android:viewportWidth="256"
|
||||||
android:viewportHeight="256">
|
android:viewportHeight="256">
|
||||||
<group android:scaleX="0.3"
|
<group
|
||||||
|
android:scaleX="0.3"
|
||||||
android:scaleY="0.3"
|
android:scaleY="0.3"
|
||||||
android:translateX="89.6"
|
android:translateX="89.6"
|
||||||
android:translateY="89.6">
|
android:translateY="89.6">
|
||||||
<path
|
<path
|
||||||
android:fillColor="#ff000000"
|
android:fillColor="#FF000000"
|
||||||
android:pathData="M250.09,13.49C251.39,10.51 251.11,7.08 249.33,4.36C247.55,1.64 244.52,0 241.27,0L228.81,0C226.08,0 223.61,1.62 222.51,4.11C211.54,29.1 153.63,160.99 134.29,205.04C133.2,207.54 130.73,209.15 128,209.15C125.27,209.15 122.8,207.54 121.7,205.04C102.36,160.99 44.46,29.1 33.49,4.11C32.39,1.62 29.92,0 27.19,0L14.73,0C11.48,0 8.45,1.64 6.67,4.36C4.89,7.08 4.61,10.51 5.91,13.49C26.64,60.8 95.56,218.1 109.63,250.24C111.17,253.74 114.63,256 118.45,256L137.55,256C141.37,256 144.83,253.74 146.36,250.24C160.44,218.1 229.36,60.8 250.09,13.49Z"/>
|
android:pathData="M250.09,13.49C251.39,10.51 251.11,7.08 249.33,4.36C247.55,1.64 244.52,0 241.27,0L228.81,0C226.08,0 223.61,1.62 222.51,4.11C211.54,29.1 153.63,160.99 134.29,205.04C133.2,207.54 130.73,209.15 128,209.15C125.27,209.15 122.8,207.54 121.7,205.04C102.36,160.99 44.46,29.1 33.49,4.11C32.39,1.62 29.92,0 27.19,0L14.73,0C11.48,0 8.45,1.64 6.67,4.36C4.89,7.08 4.61,10.51 5.91,13.49C26.64,60.8 95.56,218.1 109.63,250.24C111.17,253.74 114.63,256 118.45,256L137.55,256C141.37,256 144.83,253.74 146.36,250.24C160.44,218.1 229.36,60.8 250.09,13.49Z" />
|
||||||
<path
|
<path
|
||||||
android:fillColor="#ff000000"
|
android:fillColor="#FF000000"
|
||||||
android:pathData="M135.14,123.87C133.67,126.43 130.94,128 128,128C125.05,128 122.33,126.43 120.85,123.87C105.89,97.97 71.44,38.28 56.48,12.37C55,9.82 55,6.68 56.48,4.12C57.95,1.57 60.68,-0 63.62,-0L192.37,-0C195.32,-0 198.04,1.57 199.52,4.12C200.99,6.68 200.99,9.82 199.52,12.37C184.56,38.28 150.1,97.97 135.14,123.87Z"/>
|
android:pathData="M135.14,123.87C133.67,126.43 130.94,128 128,128C125.05,128 122.33,126.43 120.85,123.87C105.89,97.97 71.44,38.28 56.48,12.37C55,9.82 55,6.68 56.48,4.12C57.95,1.57 60.68,-0 63.62,-0L192.37,-0C195.32,-0 198.04,1.57 199.52,4.12C200.99,6.68 200.99,9.82 199.52,12.37C184.56,38.28 150.1,97.97 135.14,123.87Z" />
|
||||||
</group>
|
</group>
|
||||||
</vector>
|
</vector>
|
||||||
|
|||||||
@@ -0,0 +1,12 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!-- Copyright 2024 ReVanced. Not licensed under GPL. See https://github.com/ReVanced/revanced-branding -->
|
||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="24dp"
|
||||||
|
android:height="24dp"
|
||||||
|
android:viewportWidth="24"
|
||||||
|
android:viewportHeight="24">
|
||||||
|
|
||||||
|
<path
|
||||||
|
android:fillColor="#000000"
|
||||||
|
android:pathData="M4.03516,3 C3.80859,3,3.59375,3.11719,3.46875,3.30469 C3.34375,3.49609,3.32422,3.73828,3.41406,3.94922 C4.87109,7.27344,9.71875,18.3359,10.707,20.5938 C10.8164,20.8398,11.0586,21,11.3281,21 L12.6719,21 C12.9375,21,13.1836,20.8398,13.293,20.5938 C14.2813,18.3359,19.1289,7.27344,20.5859,3.94922 C20.6758,3.73828,20.6563,3.49609,20.5313,3.30469 C20.4063,3.11719,20.1914,3,19.9648,3 L19.0898,3 C18.8984,3,18.7227,3.11328,18.6445,3.28906 C17.875,5.04688,13.8008,14.3203,12.4414,17.418 C12.3672,17.5938,12.1914,17.707,12,17.707 C11.8086,17.707,11.6328,17.5938,11.5586,17.418 C10.1992,14.3203,6.125,5.04688,5.35547,3.28906 C5.27734,3.11328,5.10156,3,4.91016,3 Z M7.47266,3 C7.26563,3,7.07422,3.10938,6.97266,3.28906 C6.86719,3.46875,6.86719,3.69141,6.97266,3.87109 C8.02344,5.69141,10.4453,9.88672,11.4961,11.7109 C11.6016,11.8906,11.793,12,12,12 C12.207,12,12.3984,11.8906,12.5039,11.7109 C13.5547,9.88672,15.9766,5.69141,17.0273,3.87109 C17.1328,3.69141,17.1328,3.46875,17.0273,3.28906 C16.9258,3.10938,16.7344,3,16.5273,3 Z M7.47266,3" />
|
||||||
|
</vector>
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!-- Copyright 2024 ReVanced. Not licensed under GPL. See https://github.com/ReVanced/revanced-branding -->
|
||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="24dp"
|
||||||
|
android:height="24dp"
|
||||||
|
android:viewportWidth="24"
|
||||||
|
android:viewportHeight="24">
|
||||||
|
|
||||||
|
<path
|
||||||
|
android:fillColor="#000000"
|
||||||
|
android:pathData="M4.03516,3 C3.80859,3,3.59375,3.11719,3.46875,3.30469 C3.34375,3.49609,3.32422,3.73828,3.41406,3.94922 C4.87109,7.27344,9.71875,18.3359,10.707,20.5938 C10.8164,20.8398,11.0586,21,11.3281,21 L12.6719,21 C12.9375,21,13.1836,20.8398,13.293,20.5938 C14.2813,18.3359,19.1289,7.27344,20.5859,3.94922 C20.6758,3.73828,20.6563,3.49609,20.5313,3.30469 C20.4063,3.11719,20.1914,3,19.9648,3 L19.0898,3 C18.8984,3,18.7227,3.11328,18.6445,3.28906 C17.875,5.04688,13.8008,14.3203,12.4414,17.418 C12.3672,17.5938,12.1914,17.707,12,17.707 C11.8086,17.707,11.6328,17.5938,11.5586,17.418 C10.1992,14.3203,6.125,5.04688,5.35547,3.28906 C5.27734,3.11328,5.10156,3,4.91016,3 Z M7.47266,3 C7.26563,3,7.07422,3.10938,6.97266,3.28906 C6.86719,3.46875,6.86719,3.69141,6.97266,3.87109 C8.02344,5.69141,10.4453,9.88672,11.4961,11.7109 C11.6016,11.8906,11.793,12,12,12 C12.207,12,12.3984,11.8906,12.5039,11.7109 C13.5547,9.88672,15.9766,5.69141,17.0273,3.87109 C17.1328,3.69141,17.1328,3.46875,17.0273,3.28906 C16.9258,3.10938,16.7344,3,16.5273,3 Z M7.47266,3" />
|
||||||
|
</vector>
|
||||||
Reference in New Issue
Block a user