Compare commits

...

8 Commits

Author SHA1 Message Date
semantic-release-bot
12e7c0943a chore: Release v5.45.0-dev.4 [skip ci]
# [5.45.0-dev.4](https://github.com/ReVanced/revanced-patches/compare/v5.45.0-dev.3...v5.45.0-dev.4) (2025-10-30)

### Bug Fixes

* **YouTube - Change header:** Do not mirror header graphic with RTL languages ([a0c5604](a0c5604951))
2025-10-30 08:32:28 +00:00
LisoUseInAIKyrios
a0c5604951 fix(YouTube - Change header): Do not mirror header graphic with RTL languages 2025-10-30 09:27:27 +01:00
LisoUseInAIKyrios
38d9299dfe chore: Add branding license text file (#6179) 2025-10-30 09:26:18 +01:00
semantic-release-bot
dfdbbfa047 chore: Release v5.45.0-dev.3 [skip ci]
# [5.45.0-dev.3](https://github.com/ReVanced/revanced-patches/compare/v5.45.0-dev.2...v5.45.0-dev.3) (2025-10-27)

### Features

* **YouTube - Change Header:** Use SVG for header logo ([#6178](https://github.com/ReVanced/revanced-patches/issues/6178)) ([e9f45ce](e9f45ce926))
2025-10-27 17:14:52 +00:00
MarcaD
e9f45ce926 feat(YouTube - Change Header): Use SVG for header logo (#6178)
Co-authored-by: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com>
2025-10-27 21:10:49 +04:00
semantic-release-bot
1b38b1a3c8 chore: Release v5.45.0-dev.2 [skip ci]
# [5.45.0-dev.2](https://github.com/ReVanced/revanced-patches/compare/v5.45.0-dev.1...v5.45.0-dev.2) (2025-10-26)

### Bug Fixes

* **YouTube - Force original audio:** Fall back to visionOS and not Android Studio if Android VR is not available ([6d01863](6d01863ec7))
* **YouTube Music - Hide category bar:** Correctly hide the category bar in newer app targets ([#6175](https://github.com/ReVanced/revanced-patches/issues/6175)) ([13cf172](13cf1724bf))
2025-10-26 15:27:23 +00:00
MarcaD
13cf1724bf fix(YouTube Music - Hide category bar): Correctly hide the category bar in newer app targets (#6175) 2025-10-26 19:23:40 +04:00
LisoUseInAIKyrios
6d01863ec7 fix(YouTube - Force original audio): Fall back to visionOS and not Android Studio if Android VR is not available 2025-10-26 19:23:04 +04:00
49 changed files with 462 additions and 200 deletions

View File

@@ -1,3 +1,25 @@
# [5.45.0-dev.4](https://github.com/ReVanced/revanced-patches/compare/v5.45.0-dev.3...v5.45.0-dev.4) (2025-10-30)
### Bug Fixes
* **YouTube - Change header:** Do not mirror header graphic with RTL languages ([a0c5604](https://github.com/ReVanced/revanced-patches/commit/a0c56049510ce040e1ccd49257864672c343344d))
# [5.45.0-dev.3](https://github.com/ReVanced/revanced-patches/compare/v5.45.0-dev.2...v5.45.0-dev.3) (2025-10-27)
### Features
* **YouTube - Change Header:** Use SVG for header logo ([#6178](https://github.com/ReVanced/revanced-patches/issues/6178)) ([e9f45ce](https://github.com/ReVanced/revanced-patches/commit/e9f45ce92695d5857473ff71c14b190bded28a73))
# [5.45.0-dev.2](https://github.com/ReVanced/revanced-patches/compare/v5.45.0-dev.1...v5.45.0-dev.2) (2025-10-26)
### Bug Fixes
* **YouTube - Force original audio:** Fall back to visionOS and not Android Studio if Android VR is not available ([6d01863](https://github.com/ReVanced/revanced-patches/commit/6d01863ec70617d9abc864ce6686ed9764dd151d))
* **YouTube Music - Hide category bar:** Correctly hide the category bar in newer app targets ([#6175](https://github.com/ReVanced/revanced-patches/issues/6175)) ([13cf172](https://github.com/ReVanced/revanced-patches/commit/13cf1724bf2f946c7129cab0db96721c90f9fe89))
# [5.45.0-dev.1](https://github.com/ReVanced/revanced-patches/compare/v5.44.0...v5.45.0-dev.1) (2025-10-26)

View File

@@ -19,6 +19,6 @@ public class HideCastButtonPatch {
* Injection point
*/
public static void hideCastButton(View view) {
hideViewBy0dpUnderCondition(Settings.HIDE_CAST_BUTTON.get(), view);
hideViewBy0dpUnderCondition(Settings.HIDE_CAST_BUTTON, view);
}
}

View File

@@ -1,5 +1,8 @@
package app.revanced.extension.music.patches;
import static app.revanced.extension.shared.Utils.hideViewBy0dpUnderCondition;
import android.view.View;
import app.revanced.extension.music.settings.Settings;
@SuppressWarnings("unused")
@@ -8,7 +11,7 @@ public class HideCategoryBarPatch {
/**
* Injection point
*/
public static boolean hideCategoryBar() {
return Settings.HIDE_CATEGORY_BAR.get();
public static void hideCategoryBar(View view) {
hideViewBy0dpUnderCondition(Settings.HIDE_CATEGORY_BAR, view);
}
}

View File

@@ -150,14 +150,14 @@ public class CustomBrandingPatch {
}
for (ComponentName disable : componentsToDisable) {
// Use info logging because if the alias status become corrupt the app cannot launch.
Logger.printInfo(() -> "Disabling: " + disable.getClassName());
pm.setComponentEnabledSetting(disable,
PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);
}
// Use info logging because if the alias status become corrupt the app cannot launch.
ComponentName componentToEnableFinal = componentToEnable;
Logger.printInfo(() -> "Enabling: " + componentToEnableFinal.getClassName());
pm.setComponentEnabledSetting(componentToEnable,
PackageManager.COMPONENT_ENABLED_STATE_ENABLED, 0);
} catch (Exception ex) {

View File

@@ -17,15 +17,25 @@ public class ChangeHeaderPatch {
DEFAULT(null, null),
REGULAR("ytWordmarkHeader", "yt_ringo2_wordmark_header"),
PREMIUM("ytPremiumWordmarkHeader", "yt_ringo2_premium_wordmark_header"),
REVANCED("revanced_header_logo", "revanced_header_logo"),
REVANCED_MINIMAL("revanced_header_logo_minimal", "revanced_header_logo_minimal"),
CUSTOM("custom_header", "custom_header");
ROUNDED("revanced_header_rounded"),
MINIMAL("revanced_header_minimal"),
CUSTOM("revanced_header_custom"),
// Old enum names for data migration. TODO: Eventually delete these.
@Deprecated
REVANCED(ROUNDED.attributeName),
@Deprecated
REVANCED_MINIMAL(MINIMAL.attributeName);
@Nullable
private final String attributeName;
@Nullable
private final String drawableName;
HeaderLogo(String attributeName) {
this(Objects.requireNonNull(attributeName), Objects.requireNonNull(attributeName));
}
HeaderLogo(@Nullable String attributeName, @Nullable String drawableName) {
this.attributeName = attributeName;
this.drawableName = drawableName;
@@ -42,9 +52,8 @@ public class ChangeHeaderPatch {
final int identifier = Utils.getResourceIdentifier(attributeName, "attr");
if (identifier == 0) {
// Identifier is zero if custom header setting was included in imported settings
// and a custom image was not included during patching.
Logger.printDebug(() -> "Could not find attribute: " + drawableName);
// Should never happen.
Logger.printException(() -> "Could not find attribute: " + drawableName);
Settings.HEADER_LOGO.resetToDefault();
return null;
}
@@ -63,12 +72,14 @@ public class ChangeHeaderPatch {
: "_light");
final int identifier = Utils.getResourceIdentifier(drawableFullName, "drawable");
if (identifier == 0) {
Logger.printDebug(() -> "Could not find drawable: " + drawableFullName);
Settings.HEADER_LOGO.resetToDefault();
return null;
if (identifier != 0) {
return Utils.getContext().getDrawable(identifier);
}
return Utils.getContext().getDrawable(identifier);
// Should never happen.
Logger.printException(() -> "Could not find drawable: " + drawableFullName);
Settings.HEADER_LOGO.resetToDefault();
return null;
}
}

View File

@@ -38,9 +38,9 @@ public class SpoofVideoStreamsPatch {
}
List<ClientType> availableClients = List.of(
VISIONOS,
ANDROID_CREATOR,
ANDROID_VR_1_43_32,
VISIONOS,
IPADOS);
app.revanced.extension.shared.spoof.SpoofVideoStreamsPatch.setClientsToUse(

View File

@@ -2,7 +2,6 @@ package app.revanced.extension.youtube.settings;
import static java.lang.Boolean.FALSE;
import static java.lang.Boolean.TRUE;
import static app.revanced.extension.shared.settings.Setting.migrateOldSettingToNew;
import static app.revanced.extension.shared.settings.Setting.parent;
import static app.revanced.extension.shared.settings.Setting.parentsAll;
import static app.revanced.extension.shared.settings.Setting.parentsAny;
@@ -17,7 +16,6 @@ import static app.revanced.extension.youtube.patches.MiniplayerPatch.MiniplayerH
import static app.revanced.extension.youtube.patches.MiniplayerPatch.MiniplayerHideSubtextsAvailability;
import static app.revanced.extension.youtube.patches.MiniplayerPatch.MiniplayerHorizontalDragAvailability;
import static app.revanced.extension.youtube.patches.MiniplayerPatch.MiniplayerType;
import static app.revanced.extension.youtube.patches.MiniplayerPatch.MiniplayerType.MINIMAL;
import static app.revanced.extension.youtube.patches.OpenShortsInRegularPlayerPatch.ShortsPlayerType;
import static app.revanced.extension.youtube.patches.SeekbarThumbnailsPatch.SeekbarThumbnailsHighQualityAvailability;
import static app.revanced.extension.youtube.patches.components.PlayerFlyoutMenuItemsFilter.HideAudioFlyoutMenuAvailability;
@@ -41,7 +39,6 @@ import app.revanced.extension.shared.settings.IntegerSetting;
import app.revanced.extension.shared.settings.LongSetting;
import app.revanced.extension.shared.settings.Setting;
import app.revanced.extension.shared.settings.StringSetting;
import app.revanced.extension.shared.settings.preference.SharedPrefCategory;
import app.revanced.extension.shared.spoof.ClientType;
import app.revanced.extension.youtube.patches.AlternativeThumbnailsPatch.DeArrowAvailability;
import app.revanced.extension.youtube.patches.AlternativeThumbnailsPatch.StillImagesAvailability;
@@ -452,14 +449,7 @@ public class Settings extends BaseSettings {
public static final StringSetting SB_CATEGORY_UNSUBMITTED_COLOR = new StringSetting("sb_unsubmitted_color", "#FFFFFFFF", false, false);
// Deprecated migrations
private static final BooleanSetting DEPRECATED_AUTO_REPEAT = new BooleanSetting("revanced_auto_repeat", FALSE);
private static final BooleanSetting DEPRECATED_HIDE_PLAYER_BUTTONS = new BooleanSetting("revanced_hide_player_buttons", FALSE, true);
private static final BooleanSetting DEPRECATED_HIDE_PLAYER_FLYOUT_VIDEO_QUALITY_FOOTER = new BooleanSetting("revanced_hide_video_quality_menu_footer", FALSE);
private static final IntegerSetting DEPRECATED_SWIPE_OVERLAY_BACKGROUND_ALPHA = new IntegerSetting("revanced_swipe_overlay_background_alpha", 127);
private static final StringSetting DEPRECATED_SEEKBAR_CUSTOM_COLOR_PRIMARY = new StringSetting("revanced_seekbar_custom_color_value", "#FF0033");
private static final BooleanSetting DEPRECATED_DISABLE_SUGGESTED_VIDEO_END_SCREEN = new BooleanSetting("revanced_disable_suggested_video_end_screen", FALSE);
private static final BooleanSetting DEPRECATED_RESTORE_OLD_VIDEO_QUALITY_MENU = new BooleanSetting("revanced_restore_old_video_quality_menu", TRUE);
private static final BooleanSetting DEPRECATED_AUTO_CAPTIONS = new BooleanSetting("revanced_auto_captions", FALSE);
private static final FloatSetting DEPRECATED_SB_CATEGORY_SPONSOR_OPACITY = new FloatSetting("sb_sponsor_opacity", 0.8f, false, false);
private static final FloatSetting DEPRECATED_SB_CATEGORY_SELF_PROMO_OPACITY = new FloatSetting("sb_selfpromo_opacity", 0.8f, false, false);
@@ -475,17 +465,12 @@ public class Settings extends BaseSettings {
static {
// region Migration
migrateOldSettingToNew(DEPRECATED_AUTO_REPEAT, LOOP_VIDEO);
migrateOldSettingToNew(DEPRECATED_HIDE_PLAYER_BUTTONS, HIDE_PLAYER_PREVIOUS_NEXT_BUTTONS);
migrateOldSettingToNew(DEPRECATED_HIDE_PLAYER_FLYOUT_VIDEO_QUALITY_FOOTER, HIDE_PLAYER_FLYOUT_VIDEO_QUALITY_FOOTER);
migrateOldSettingToNew(DEPRECATED_DISABLE_SUGGESTED_VIDEO_END_SCREEN, HIDE_END_SCREEN_SUGGESTED_VIDEO);
migrateOldSettingToNew(DEPRECATED_RESTORE_OLD_VIDEO_QUALITY_MENU, ADVANCED_VIDEO_QUALITY_MENU);
migrateOldSettingToNew(DEPRECATED_AUTO_CAPTIONS, DISABLE_AUTO_CAPTIONS);
// Migrate renamed enum.
//noinspection deprecation
if (MINIPLAYER_TYPE.get() == MiniplayerType.PHONE) {
MINIPLAYER_TYPE.save(MINIMAL);
// Migrate renamed change header enums.
if (HEADER_LOGO.get() == HeaderLogo.REVANCED) {
HEADER_LOGO.save(HeaderLogo.ROUNDED);
}
if (HEADER_LOGO.get() == HeaderLogo.REVANCED_MINIMAL) {
HEADER_LOGO.save(HeaderLogo.MINIMAL);
}
// Migrate old single color seekbar with a slightly brighter accent color based on the primary.
@@ -512,11 +497,6 @@ public class Settings extends BaseSettings {
DEPRECATED_SEEKBAR_CUSTOM_COLOR_PRIMARY.resetToDefault();
}
if (!DEPRECATED_SWIPE_OVERLAY_BACKGROUND_ALPHA.isSetToDefault()) {
SWIPE_OVERLAY_OPACITY.save(DEPRECATED_SWIPE_OVERLAY_BACKGROUND_ALPHA.get() / 255);
DEPRECATED_SWIPE_OVERLAY_BACKGROUND_ALPHA.resetToDefault();
}
// Old spoof versions that no longer work,
// or is spoofing to a version the same or newer than this app.
if (!SPOOF_APP_VERSION_TARGET.isSetToDefault() &&
@@ -534,13 +514,7 @@ public class Settings extends BaseSettings {
// RYD requires manually migrating old settings since the lack of
// a "revanced_" on the old setting causes duplicate key exceptions during export.
SharedPrefCategory revancedPrefs = Setting.preferences;
Setting.migrateFromOldPreferences(revancedPrefs, RYD_USER_ID, "ryd_user_id");
Setting.migrateFromOldPreferences(revancedPrefs, RYD_ENABLED, "ryd_enabled");
Setting.migrateFromOldPreferences(revancedPrefs, RYD_DISLIKE_PERCENTAGE, "ryd_dislike_percentage");
Setting.migrateFromOldPreferences(revancedPrefs, RYD_COMPACT_LAYOUT, "ryd_compact_layout");
Setting.migrateFromOldPreferences(revancedPrefs, RYD_ESTIMATED_LIKE, "ryd_estimated_like");
Setting.migrateFromOldPreferences(revancedPrefs, RYD_TOAST_ON_CONNECTION_ERROR, "ryd_toast_on_connection_error");
Setting.migrateFromOldPreferences(Setting.preferences, RYD_USER_ID, "ryd_user_id");
// Migrate old saved data. Must be done here before the settings can be used by any other code.
applyOldSbOpacityToColor(SB_CATEGORY_SPONSOR_COLOR, DEPRECATED_SB_CATEGORY_SPONSOR_OPACITY);

View File

@@ -3,4 +3,4 @@ org.gradle.jvmargs = -Xms512M -Xmx2048M
org.gradle.parallel = true
android.useAndroidX = true
kotlin.code.style = official
version = 5.45.0-dev.1
version = 5.45.0-dev.4

View File

@@ -1,20 +1,16 @@
package app.revanced.patches.music.layout.compactheader
import com.android.tools.smali.dexlib2.Opcode
import com.android.tools.smali.dexlib2.AccessFlags
import app.revanced.patcher.fingerprint
import app.revanced.util.literal
internal val constructCategoryBarFingerprint = fingerprint {
accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR)
internal val chipCloudFingerprint = fingerprint {
returns("V")
parameters("Landroid/content/Context;", "L", "L", "L")
opcodes(
Opcode.IPUT_OBJECT,
Opcode.CONST,
Opcode.INVOKE_VIRTUAL,
Opcode.MOVE_RESULT_OBJECT,
Opcode.IPUT_OBJECT,
Opcode.CONST,
Opcode.INVOKE_VIRTUAL
Opcode.CONST_4,
Opcode.INVOKE_STATIC,
Opcode.MOVE_RESULT_OBJECT
)
literal { chipCloud }
}

View File

@@ -1,6 +1,6 @@
package app.revanced.patches.music.layout.compactheader
import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels
import app.revanced.patcher.extensions.InstructionExtensions.addInstruction
import app.revanced.patcher.extensions.InstructionExtensions.getInstruction
import app.revanced.patcher.patch.bytecodePatch
import app.revanced.patches.all.misc.resources.addResources
@@ -8,10 +8,14 @@ import app.revanced.patches.all.misc.resources.addResourcesPatch
import app.revanced.patches.music.misc.extension.sharedExtensionPatch
import app.revanced.patches.music.misc.settings.PreferenceScreen
import app.revanced.patches.music.misc.settings.settingsPatch
import app.revanced.patches.shared.misc.mapping.get
import app.revanced.patches.shared.misc.mapping.resourceMappings
import app.revanced.patches.shared.misc.settings.preference.SwitchPreference
import app.revanced.util.findFreeRegister
import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
internal var chipCloud = -1L
private set
private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/music/patches/HideCategoryBarPatch;"
@Suppress("unused")
@@ -33,28 +37,21 @@ val hideCategoryBar = bytecodePatch(
)
execute {
chipCloud = resourceMappings["layout", "chip_cloud"]
addResources("music", "layout.compactheader.hideCategoryBar")
PreferenceScreen.GENERAL.addPreferences(
SwitchPreference("revanced_music_hide_category_bar"),
)
constructCategoryBarFingerprint.method.apply {
val insertIndex = constructCategoryBarFingerprint.patternMatch!!.startIndex
val register = getInstruction<OneRegisterInstruction>(insertIndex - 1).registerA
val freeRegister = findFreeRegister(insertIndex, register)
chipCloudFingerprint.method.apply {
val targetIndex = chipCloudFingerprint.patternMatch!!.endIndex
val targetRegister = getInstruction<OneRegisterInstruction>(targetIndex).registerA
addInstructionsWithLabels(
insertIndex,
"""
invoke-static { }, $EXTENSION_CLASS_DESCRIPTOR->hideCategoryBar()Z
move-result v$freeRegister
if-eqz v$freeRegister, :show
const/16 v$freeRegister, 0x8
invoke-virtual { v$register, v$freeRegister }, Landroid/view/View;->setVisibility(I)V
:show
nop
"""
addInstruction(
targetIndex + 1,
"invoke-static { v$targetRegister }, $EXTENSION_CLASS_DESCRIPTOR->hideCategoryBar(Landroid/view/View;)V"
)
}
}

View File

@@ -0,0 +1,25 @@
package app.revanced.patches.shared.layout.branding
import app.revanced.patcher.patch.rawResourcePatch
import app.revanced.util.inputStreamFromBundledResource
import java.nio.file.Files
/**
* Copies a branding license text file to the target apk.
*
* This patch must be a dependency for all patches that add ReVanced branding to the target app.
*/
internal val addBrandLicensePatch = rawResourcePatch {
execute {
val brandingLicenseFileName = "LICENSE_REVANCED.TXT"
val inputFileStream = inputStreamFromBundledResource(
"branding-license",
brandingLicenseFileName
)!!
val targetFile = get(brandingLicenseFileName, false).toPath()
Files.copy(inputFileStream, targetFile)
}
}

View File

@@ -36,13 +36,13 @@ import org.w3c.dom.NodeList
import java.io.File
import java.util.logging.Logger
private val mipmapDirectories = arrayOf(
private val mipmapDirectories = mapOf(
// Target app does not have ldpi icons.
"mipmap-mdpi",
"mipmap-hdpi",
"mipmap-xhdpi",
"mipmap-xxhdpi",
"mipmap-xxxhdpi"
"mipmap-mdpi" to "108x108 px",
"mipmap-hdpi" to "162x162 px",
"mipmap-xhdpi" to "216x216 px",
"mipmap-xxhdpi" to "324x324 px",
"mipmap-xxxhdpi" to "432x432 px"
)
private val iconStyleNames = arrayOf(
@@ -104,10 +104,13 @@ internal fun baseCustomBrandingPatch(
Folder with images to use as a custom icon.
The folder must contain one or more of the following folders, depending on the DPI of the device:
${mipmapDirectories.joinToString("\n") { "- $it" }}
${mipmapDirectories.keys.joinToString("\n") { "- $it" }}
Each of the folders must contain all of the following files:
${USER_CUSTOM_ADAPTIVE_FILE_NAMES.joinToString("\n")}
The image dimensions must be as follows:
${mipmapDirectories.map { (dpi, dim) -> "- $dpi: $dim" }.joinToString("\n")}
Optionally, the path contains a 'drawable' folder with any of the monochrome icon files:
$USER_CUSTOM_MONOCHROME_FILE_NAME
@@ -120,6 +123,7 @@ internal fun baseCustomBrandingPatch(
dependsOn(
addResourcesPatch,
resourceMappingPatch,
addBrandLicensePatch,
bytecodePatch {
execute {
mainActivityOnCreateFingerprint.method.addInstruction(
@@ -249,7 +253,7 @@ internal fun baseCustomBrandingPatch(
)
// Copy template icon files.
mipmapDirectories.forEach { dpi ->
mipmapDirectories.keys.forEach { dpi ->
copyResources(
"custom-branding",
ResourceGroup(
@@ -405,23 +409,24 @@ internal fun baseCustomBrandingPatch(
)
}
val sourceFolders = iconPathFile.listFiles { file -> file.isDirectory }
?: throw PatchException("The custom icon path contains no subfolders: " +
iconPathFile.absolutePath)
val resourceDirectory = get("res")
var copiedFiles = false
// For each source folder, copy the files to the target resource directories.
sourceFolders.forEach { dpiSourceFolder ->
iconPathFile.listFiles {
file -> file.isDirectory && file.name in mipmapDirectories
}!!.forEach { dpiSourceFolder ->
val targetDpiFolder = resourceDirectory.resolve(dpiSourceFolder.name)
if (!targetDpiFolder.exists()) return@forEach
if (!targetDpiFolder.exists()) {
// Should never happen.
throw IllegalStateException("Resource not found: $dpiSourceFolder")
}
val customFiles = dpiSourceFolder.listFiles { file ->
file.isFile && file.name in USER_CUSTOM_ADAPTIVE_FILE_NAMES
}!!
if (customFiles.size > 0 && customFiles.size != USER_CUSTOM_ADAPTIVE_FILE_NAMES.size) {
if (customFiles.isNotEmpty() && customFiles.size != USER_CUSTOM_ADAPTIVE_FILE_NAMES.size) {
throw PatchException("Must include all required icon files " +
"but only found " + customFiles.map { it.name })
}
@@ -451,8 +456,9 @@ internal fun baseCustomBrandingPatch(
}
if (!copiedFiles) {
throw PatchException("Could not find any replacement images in " +
"patch option path: " + iconPathFile.absolutePath)
throw PatchException("Expected to find directories and files: "
+ USER_CUSTOM_ADAPTIVE_FILE_NAMES.contentToString()
+ "\nBut none were found in the provided option file path: " + iconPathFile.absolutePath)
}
}

View File

@@ -6,6 +6,7 @@ import app.revanced.patcher.patch.resourcePatch
import app.revanced.patches.all.misc.resources.addResource
import app.revanced.patches.all.misc.resources.addResources
import app.revanced.patches.all.misc.resources.addResourcesPatch
import app.revanced.patches.shared.layout.branding.addBrandLicensePatch
import app.revanced.patches.shared.misc.settings.preference.BasePreference
import app.revanced.patches.shared.misc.settings.preference.IntentPreference
import app.revanced.patches.shared.misc.settings.preference.PreferenceCategory
@@ -61,7 +62,11 @@ fun settingsPatch (
rootPreferences: List<Pair<BasePreference, String>>? = null,
preferences: Set<BasePreference>,
) = resourcePatch {
dependsOn(addResourcesPatch, settingsColorPatch)
dependsOn(
addResourcesPatch,
settingsColorPatch,
addBrandLicensePatch
)
execute {
copyResources(

View File

@@ -5,6 +5,7 @@ import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWith
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.addBrandLicensePatch
import app.revanced.patches.tiktok.misc.extension.sharedExtensionPatch
import com.android.tools.smali.dexlib2.Opcode
import com.android.tools.smali.dexlib2.iface.instruction.formats.Instruction22c
@@ -18,7 +19,7 @@ val settingsPatch = bytecodePatch(
name = "Settings",
description = "Adds ReVanced settings to TikTok.",
) {
dependsOn(sharedExtensionPatch)
dependsOn(sharedExtensionPatch, addBrandLicensePatch)
compatibleWith(
"com.ss.android.ugc.trill"("36.5.4"),

View File

@@ -9,6 +9,7 @@ import app.revanced.patcher.patch.stringOption
import app.revanced.patcher.util.Document
import app.revanced.patches.all.misc.resources.addResources
import app.revanced.patches.all.misc.resources.addResourcesPatch
import app.revanced.patches.shared.layout.branding.addBrandLicensePatch
import app.revanced.patches.shared.misc.mapping.get
import app.revanced.patches.shared.misc.mapping.resourceMappingPatch
import app.revanced.patches.shared.misc.mapping.resourceMappings
@@ -24,15 +25,43 @@ import java.io.File
private val variants = arrayOf("light", "dark")
private const val EXTENSION_CLASS_DESCRIPTOR =
"Lapp/revanced/extension/youtube/patches/ChangeHeaderPatch;"
private val targetResourceDirectoryNames = mapOf(
"drawable-hdpi" to "194x72 px",
"drawable-xhdpi" to "258x96 px",
"drawable-xxhdpi" to "387x144 px",
"drawable-xxxhdpi" to "512x192 px"
)
/**
* Header logos built into this patch.
*/
private val logoResourceNames = arrayOf(
"revanced_header_minimal",
"revanced_header_rounded",
)
/**
* Custom header resource/file name.
*/
private const val CUSTOM_HEADER_RESOURCE_NAME = "revanced_header_custom"
/**
* Custom header resource/file names.
*/
private val customHeaderResourceFileNames = variants.map { variant ->
"${CUSTOM_HEADER_RESOURCE_NAME}_$variant.png"
}.toTypedArray()
private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/youtube/patches/ChangeHeaderPatch;"
private val changeHeaderBytecodePatch = bytecodePatch {
dependsOn(resourceMappingPatch)
dependsOn(
resourceMappingPatch,
addBrandLicensePatch
)
execute {
// Resources are not used during patching, but extension code uses these
// images so verify they exist.
// Verify images exist. Resources are not used during patching but extension code does.
arrayOf(
"yt_ringo2_wordmark_header",
"yt_ringo2_premium_wordmark_header"
@@ -62,28 +91,6 @@ private val changeHeaderBytecodePatch = bytecodePatch {
}
}
private val targetResourceDirectoryNames = mapOf(
"xxxhdpi" to "512px x 192px",
"xxhdpi" to "387px x 144px",
"xhdpi" to "258px x 96px",
"hdpi" to "194px x 72px",
"mdpi" to "129px x 48px"
).mapKeys { (dpi, _) -> "drawable-$dpi" }
/**
* Header logos built into this patch.
*/
private val logoResourceNames = arrayOf(
"revanced_header_logo_minimal",
"revanced_header_logo",
)
/**
* Custom header resource/file name.
*/
private const val CUSTOM_HEADER_RESOURCE_NAME = "custom_header"
@Suppress("unused")
val changeHeaderPatch = resourcePatch(
name = "Change header",
@@ -110,7 +117,7 @@ val changeHeaderPatch = resourcePatch(
${targetResourceDirectoryNames.keys.joinToString("\n") { "- $it" }}
Each of the folders must contain all of the following files:
${variants.joinToString("\n") { variant -> "- ${CUSTOM_HEADER_RESOURCE_NAME}_$variant.png" }}
${customHeaderResourceFileNames.joinToString("\n")}
The image dimensions must be as follows:
${targetResourceDirectoryNames.map { (dpi, dim) -> "- $dpi: $dim" }.joinToString("\n")}
@@ -120,67 +127,41 @@ val changeHeaderPatch = resourcePatch(
execute {
addResources("youtube", "layout.branding.changeHeaderPatch")
fun getLightDarkFileNames(vararg resourceNames: String): Array<String> =
variants.flatMap { variant ->
resourceNames.map { resource -> "${resource}_$variant.png" }
}.toTypedArray()
val logoResourceFileNames = getLightDarkFileNames(*logoResourceNames)
copyResources(
"change-header",
ResourceGroup("drawable-hdpi", *logoResourceFileNames),
ResourceGroup("drawable-mdpi", *logoResourceFileNames),
ResourceGroup("drawable-xhdpi", *logoResourceFileNames),
ResourceGroup("drawable-xxhdpi", *logoResourceFileNames),
ResourceGroup("drawable-xxxhdpi", *logoResourceFileNames),
)
if (custom != null) {
val customFile = File(custom!!)
if (!customFile.exists()) {
throw PatchException("The custom icon path cannot be found: " +
customFile.absolutePath
PreferenceScreen.GENERAL_LAYOUT.addPreferences(
if (custom == null) {
ListPreference("revanced_header_logo")
} else {
ListPreference(
key = "revanced_header_logo",
entriesKey = "revanced_header_logo_custom_entries",
entryValuesKey = "revanced_header_logo_custom_entry_values"
)
}
)
if (!customFile.isDirectory) {
throw PatchException("The custom icon path must be a folder: "
+ customFile.absolutePath)
logoResourceNames.forEach { logo ->
variants.forEach { variant ->
copyResources(
"change-header",
ResourceGroup(
"drawable",
logo + "_" + variant + ".xml"
)
)
}
}
val sourceFolders = customFile.listFiles { file -> file.isDirectory }
?: throw PatchException("The custom icon path contains no subfolders: " +
customFile.absolutePath)
val customResourceFileNames = getLightDarkFileNames(CUSTOM_HEADER_RESOURCE_NAME)
var copiedFiles = false
// For each source folder, copy the files to the target resource directories.
sourceFolders.forEach { dpiSourceFolder ->
val targetDpiFolder = get("res").resolve(dpiSourceFolder.name)
if (!targetDpiFolder.exists()) return@forEach
val customFiles = dpiSourceFolder.listFiles { file ->
file.isFile && file.name in customResourceFileNames
}!!
if (customFiles.size > 0 && customFiles.size != variants.size) {
throw PatchException("Both light/dark mode images " +
"must be specified but only found: " + customFiles.map { it.name })
}
customFiles.forEach { imgSourceFile ->
val imgTargetFile = targetDpiFolder.resolve(imgSourceFile.name)
imgSourceFile.copyTo(imgTargetFile)
copiedFiles = true
}
}
if (!copiedFiles) {
throw PatchException("No custom header images found in " +
"the provided path: " + customFile.absolutePath)
// Copy custom template. Images are only used if settings
// are imported and a custom header is enabled.
targetResourceDirectoryNames.keys.forEach { dpi ->
variants.forEach { variant ->
copyResources(
"change-header",
ResourceGroup(
dpi,
*customHeaderResourceFileNames
)
)
}
}
@@ -199,9 +180,7 @@ val changeHeaderPatch = resourcePatch(
addAttributeReference(logoName)
}
if (custom != null) {
addAttributeReference(CUSTOM_HEADER_RESOURCE_NAME)
}
addAttributeReference(CUSTOM_HEADER_RESOURCE_NAME)
}
// Add custom drawables to all styles that use the regular and premium logo.
@@ -227,22 +206,58 @@ val changeHeaderPatch = resourcePatch(
addDrawableElement(document, logoName, mode)
}
if (custom != null) {
addDrawableElement(document, CUSTOM_HEADER_RESOURCE_NAME, mode)
}
addDrawableElement(document, CUSTOM_HEADER_RESOURCE_NAME, mode)
}
}
PreferenceScreen.GENERAL_LAYOUT.addPreferences(
if (custom == null) {
ListPreference("revanced_header_logo")
} else {
ListPreference(
key = "revanced_header_logo",
entriesKey = "revanced_header_logo_custom_entries",
entryValuesKey = "revanced_header_logo_custom_entry_values"
// Copy user provided images last, so if an exception is thrown due to bad input.
if (custom != null) {
val customFile = File(custom!!.trim())
if (!customFile.exists()) {
throw PatchException("The custom header path cannot be found: " +
customFile.absolutePath
)
}
)
if (!customFile.isDirectory) {
throw PatchException("The custom header path must be a folder: "
+ customFile.absolutePath)
}
var copiedFiles = false
// For each source folder, copy the files to the target resource directories.
customFile.listFiles {
file -> file.isDirectory && file.name in targetResourceDirectoryNames
}!!.forEach { dpiSourceFolder ->
val targetDpiFolder = get("res").resolve(dpiSourceFolder.name)
if (!targetDpiFolder.exists()) {
// Should never happen.
throw IllegalStateException("Resource not found: $dpiSourceFolder")
}
val customFiles = dpiSourceFolder.listFiles { file ->
file.isFile && file.name in customHeaderResourceFileNames
}!!
if (customFiles.isNotEmpty() && customFiles.size != variants.size) {
throw PatchException("Both light/dark mode images " +
"must be specified but only found: " + customFiles.map { it.name })
}
customFiles.forEach { imgSourceFile ->
val imgTargetFile = targetDpiFolder.resolve(imgSourceFile.name)
imgSourceFile.copyTo(target = imgTargetFile, overwrite = true)
copiedFiles = true
}
}
if (!copiedFiles) {
throw PatchException("Expected to find directories and files: "
+ customHeaderResourceFileNames.contentToString()
+ "\nBut none were found in the provided option file path: " + customFile.absolutePath)
}
}
}
}

View File

@@ -397,8 +397,8 @@
<item>DEFAULT</item>
<item>REGULAR</item>
<item>PREMIUM</item>
<item>REVANCED</item>
<item>REVANCED_MINIMAL</item>
<item>ROUNDED</item>
<item>MINIMAL</item>
</string-array>
<string-array name="revanced_header_logo_custom_entries">
<item>@string/revanced_header_logo_entry_1</item>
@@ -412,8 +412,8 @@
<item>DEFAULT</item>
<item>REGULAR</item>
<item>PREMIUM</item>
<item>REVANCED</item>
<item>REVANCED_MINIMAL</item>
<item>ROUNDED</item>
<item>MINIMAL</item>
<item>CUSTOM</item>
</string-array>
</patch>

View File

@@ -0,0 +1,5 @@
The ReVanced branding found in this software is copyrighted and not covered under the GPL.
To use or distribute ReVanced branding, you must obtain permission by contacting branding@revanced.app
For more information see https://github.com/ReVanced/revanced-branding

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.7 KiB

View File

@@ -0,0 +1,40 @@
<!-- Copyright 2024 ReVanced. Not licensed under GPL. See https://github.com/ReVanced/revanced-branding -->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:aapt="http://schemas.android.com/aapt"
android:width="129dp"
android:height="48dp"
android:autoMirrored="false"
android:viewportWidth="129"
android:viewportHeight="48">
<path
android:fillColor="#1B1B1B"
android:pathData="M23,11.5C29.9,11.5 35.5,17.1 35.5,24C35.5,30.9 29.9,36.5 23,36.5C16.1,36.5 10.5,30.9 10.5,24C10.5,17.1 16.1,11.5 23,11.5ZM23,11.5" />
<path
android:fillColor="#FFFFFF"
android:pathData="M27.34,19.93C27.38,19.83 27.37,19.71 27.31,19.61C27.25,19.51 27.14,19.45 27.02,19.45C26.86,19.45 26.7,19.45 26.58,19.45C26.48,19.45 26.39,19.51 26.36,19.6C25.96,20.49 23.91,25.17 23.22,26.73C23.18,26.82 23.1,26.88 23,26.88C22.9,26.88 22.82,26.82 22.78,26.73C22.09,25.17 20.04,20.49 19.64,19.6C19.61,19.51 19.52,19.45 19.42,19.45C19.3,19.45 19.14,19.45 18.98,19.45C18.86,19.45 18.75,19.51 18.69,19.61C18.63,19.71 18.62,19.83 18.66,19.93C19.4,21.61 21.85,27.2 22.35,28.34C22.4,28.46 22.52,28.55 22.66,28.55C22.86,28.55 23.14,28.55 23.34,28.55C23.48,28.55 23.6,28.46 23.65,28.34C24.15,27.2 26.6,21.61 27.34,19.93ZM27.34,19.93" />
<path
android:pathData="M23.25,23.85C23.2,23.95 23.11,24 23,24C22.89,24 22.8,23.95 22.75,23.85C22.21,22.93 20.99,20.81 20.46,19.89C20.41,19.8 20.41,19.69 20.46,19.6C20.51,19.51 20.61,19.45 20.71,19.45L25.29,19.45C25.39,19.45 25.49,19.51 25.54,19.6C25.59,19.69 25.59,19.8 25.54,19.89C25.01,20.81 23.79,22.93 23.25,23.85ZM23.25,23.85">
<aapt:attr name="android:fillColor">
<gradient
android:startX="23"
android:startY="19.45"
android:endX="23"
android:endY="28.5"
android:type="linear">
<item
android:offset="0"
android:color="#F04E98"/>
<item
android:offset="0.5"
android:color="#5F65D4"/>
<item
android:offset="1"
android:color="#4E98F0"/>
</gradient>
</aapt:attr>
</path>
<path
android:fillColor="#FFFFFF"
android:pathData="M39.89,29.96L39.89,17.84L45.04,17.84C46.34,17.84 47.28,17.95 47.86,18.17C48.45,18.39 48.93,18.77 49.28,19.33C49.63,19.89 49.8,20.52 49.8,21.24C49.8,22.15 49.54,22.9 49,23.5C48.47,24.09 47.67,24.46 46.61,24.61C47.14,24.92 47.57,25.26 47.91,25.63C48.26,26 48.73,26.65 49.31,27.6L50.79,29.96L47.86,29.96L46.09,27.32C45.46,26.38 45.04,25.79 44.8,25.55C44.57,25.3 44.33,25.13 44.07,25.04C43.81,24.95 43.4,24.9 42.84,24.9L42.34,24.9L42.34,29.96ZM42.34,22.97L44.15,22.97C45.32,22.97 46.06,22.92 46.35,22.82C46.64,22.72 46.87,22.55 47.04,22.3C47.2,22.06 47.29,21.76 47.29,21.39C47.29,20.99 47.18,20.66 46.95,20.41C46.74,20.16 46.43,20 46.04,19.93C45.84,19.91 45.24,19.89 44.25,19.89L42.34,19.89ZM57.18,27.17L59.49,27.55C59.2,28.4 58.72,29.05 58.08,29.5C57.44,29.94 56.64,30.16 55.68,30.16C54.15,30.16 53.02,29.66 52.29,28.66C51.71,27.86 51.42,26.86 51.42,25.64C51.42,24.18 51.8,23.04 52.56,22.22C53.32,21.39 54.28,20.98 55.44,20.98C56.75,20.98 57.78,21.41 58.54,22.28C59.29,23.14 59.65,24.46 59.62,26.24L53.8,26.24C53.81,26.93 54,27.46 54.36,27.85C54.72,28.23 55.16,28.42 55.7,28.42C56.06,28.42 56.37,28.32 56.62,28.13C56.86,27.93 57.05,27.61 57.18,27.17ZM57.31,24.82C57.29,24.14 57.12,23.64 56.79,23.29C56.46,22.94 56.06,22.76 55.58,22.76C55.08,22.76 54.66,22.95 54.33,23.31C54,23.68 53.83,24.18 53.84,24.82ZM64.62,29.96L60.29,17.84L62.94,17.84L66.01,26.81L68.97,17.84L71.57,17.84L67.23,29.96ZM73.6,23.86L71.5,23.48C71.73,22.63 72.14,22 72.72,21.59C73.3,21.19 74.16,20.98 75.3,20.98C76.33,20.98 77.11,21.11 77.61,21.36C78.12,21.6 78.47,21.91 78.68,22.29C78.89,22.66 78.99,23.36 78.99,24.36L78.97,27.07C78.97,27.85 79,28.42 79.07,28.79C79.15,29.15 79.29,29.54 79.5,29.96L77.2,29.96C77.14,29.8 77.06,29.58 76.98,29.27C76.94,29.14 76.91,29.05 76.89,29C76.5,29.39 76.07,29.68 75.62,29.87C75.17,30.06 74.68,30.16 74.17,30.16C73.27,30.16 72.55,29.91 72.03,29.42C71.52,28.93 71.25,28.31 71.25,27.56C71.25,27.07 71.38,26.63 71.61,26.24C71.85,25.85 72.18,25.55 72.6,25.35C73.03,25.14 73.65,24.96 74.45,24.8C75.54,24.6 76.29,24.41 76.71,24.23L76.71,24C76.71,23.55 76.6,23.24 76.38,23.05C76.16,22.86 75.74,22.76 75.13,22.76C74.72,22.76 74.39,22.84 74.16,23.01C73.93,23.17 73.75,23.45 73.6,23.86ZM76.71,25.75C76.41,25.84 75.94,25.96 75.3,26.1C74.65,26.24 74.23,26.37 74.03,26.5C73.73,26.72 73.58,26.99 73.58,27.32C73.58,27.65 73.7,27.93 73.94,28.17C74.18,28.4 74.49,28.52 74.87,28.52C75.29,28.52 75.68,28.38 76.07,28.11C76.35,27.9 76.53,27.64 76.62,27.34C76.68,27.14 76.71,26.77 76.71,26.21ZM89.27,29.96L86.94,29.96L86.94,25.48C86.94,24.53 86.89,23.92 86.79,23.64C86.7,23.36 86.53,23.14 86.31,22.99C86.09,22.84 85.82,22.76 85.5,22.76C85.1,22.76 84.74,22.87 84.42,23.09C84.1,23.31 83.88,23.6 83.76,23.97C83.64,24.33 83.59,25 83.59,25.98L83.59,29.96L81.27,29.96L81.27,21.18L83.42,21.18L83.42,22.47C84.19,21.48 85.15,20.98 86.32,20.98C86.83,20.98 87.3,21.08 87.72,21.27C88.14,21.45 88.46,21.68 88.68,21.96C88.9,22.25 89.05,22.58 89.13,22.94C89.22,23.3 89.27,23.83 89.27,24.5ZM99.28,23.78L96.98,24.19C96.91,23.73 96.73,23.39 96.46,23.16C96.19,22.93 95.84,22.81 95.4,22.81C94.82,22.81 94.36,23.01 94.01,23.41C93.67,23.81 93.5,24.48 93.5,25.41C93.5,26.46 93.67,27.19 94.02,27.62C94.37,28.05 94.84,28.27 95.43,28.27C95.87,28.27 96.23,28.14 96.52,27.89C96.8,27.64 97,27.21 97.11,26.6L99.39,26.98C99.16,28.03 98.7,28.82 98.03,29.36C97.36,29.89 96.45,30.16 95.32,30.16C94.04,30.16 93.02,29.75 92.25,28.94C91.49,28.13 91.11,27.01 91.11,25.58C91.11,24.13 91.49,23 92.26,22.2C93.02,21.39 94.06,20.98 95.37,20.98C96.43,20.98 97.29,21.21 97.91,21.68C98.55,22.14 99,22.84 99.28,23.78ZM106.12,27.17L108.43,27.55C108.14,28.4 107.66,29.05 107.02,29.5C106.38,29.94 105.58,30.16 104.62,30.16C103.09,30.16 101.96,29.66 101.23,28.66C100.65,27.86 100.36,26.86 100.36,25.64C100.36,24.18 100.74,23.04 101.5,22.22C102.26,21.39 103.22,20.98 104.38,20.98C105.69,20.98 106.72,21.41 107.48,22.28C108.23,23.14 108.59,24.46 108.56,26.24L102.74,26.24C102.75,26.93 102.94,27.46 103.3,27.85C103.66,28.23 104.11,28.42 104.64,28.42C105,28.42 105.31,28.32 105.56,28.13C105.8,27.93 105.99,27.61 106.12,27.17ZM106.25,24.82C106.23,24.14 106.06,23.64 105.73,23.29C105.4,22.94 105,22.76 104.52,22.76C104.02,22.76 103.6,22.95 103.27,23.31C102.94,23.68 102.77,24.18 102.78,24.82ZM118.5,29.96L116.34,29.96L116.34,28.67C115.98,29.17 115.56,29.55 115.07,29.79C114.59,30.04 114.1,30.16 113.6,30.16C112.59,30.16 111.73,29.75 111,28.94C110.29,28.13 109.93,26.99 109.93,25.54C109.93,24.05 110.28,22.92 110.98,22.15C111.68,21.37 112.56,20.98 113.63,20.98C114.61,20.98 115.46,21.39 116.18,22.21L116.18,17.84L118.5,17.84ZM112.3,25.38C112.3,26.32 112.43,27 112.69,27.41C113.07,28.02 113.59,28.32 114.26,28.32C114.8,28.32 115.25,28.1 115.63,27.64C116,27.19 116.19,26.51 116.19,25.61C116.19,24.59 116,23.87 115.64,23.43C115.28,22.98 114.81,22.76 114.25,22.76C113.7,22.76 113.23,22.98 112.86,23.42C112.49,23.86 112.3,24.51 112.3,25.38ZM112.3,25.38" />
</vector>

View File

@@ -0,0 +1,40 @@
<!-- Copyright 2024 ReVanced. Not licensed under GPL. See https://github.com/ReVanced/revanced-branding -->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:aapt="http://schemas.android.com/aapt"
android:width="129dp"
android:height="48dp"
android:autoMirrored="false"
android:viewportWidth="129"
android:viewportHeight="48">
<path
android:fillColor="#1B1B1B"
android:pathData="M23,11.5C29.9,11.5 35.5,17.1 35.5,24C35.5,30.9 29.9,36.5 23,36.5C16.1,36.5 10.5,30.9 10.5,24C10.5,17.1 16.1,11.5 23,11.5ZM23,11.5" />
<path
android:fillColor="#FFFFFF"
android:pathData="M27.34,19.93C27.38,19.83 27.37,19.71 27.31,19.61C27.25,19.51 27.14,19.45 27.02,19.45C26.86,19.45 26.7,19.45 26.58,19.45C26.48,19.45 26.39,19.51 26.36,19.6C25.96,20.49 23.91,25.17 23.22,26.73C23.18,26.82 23.1,26.88 23,26.88C22.9,26.88 22.82,26.82 22.78,26.73C22.09,25.17 20.04,20.49 19.64,19.6C19.61,19.51 19.52,19.45 19.42,19.45C19.3,19.45 19.14,19.45 18.98,19.45C18.86,19.45 18.75,19.51 18.69,19.61C18.63,19.71 18.62,19.83 18.66,19.93C19.4,21.61 21.85,27.2 22.35,28.34C22.4,28.46 22.52,28.55 22.66,28.55C22.86,28.55 23.14,28.55 23.34,28.55C23.48,28.55 23.6,28.46 23.65,28.34C24.15,27.2 26.6,21.61 27.34,19.93ZM27.34,19.93" />
<path
android:pathData="M23.25,23.85C23.2,23.95 23.11,24 23,24C22.89,24 22.8,23.95 22.75,23.85C22.21,22.93 20.99,20.81 20.46,19.89C20.41,19.8 20.41,19.69 20.46,19.6C20.51,19.51 20.61,19.45 20.71,19.45L25.29,19.45C25.39,19.45 25.49,19.51 25.54,19.6C25.59,19.69 25.59,19.8 25.54,19.89C25.01,20.81 23.79,22.93 23.25,23.85ZM23.25,23.85">
<aapt:attr name="android:fillColor">
<gradient
android:startX="23"
android:startY="19.45"
android:endX="23"
android:endY="28.5"
android:type="linear">
<item
android:offset="0"
android:color="#F04E98"/>
<item
android:offset="0.5"
android:color="#5F65D4"/>
<item
android:offset="1"
android:color="#4E98F0"/>
</gradient>
</aapt:attr>
</path>
<path
android:fillColor="#000000"
android:pathData="M39.89,29.96L39.89,17.84L45.04,17.84C46.34,17.84 47.28,17.95 47.86,18.17C48.45,18.39 48.93,18.77 49.28,19.33C49.63,19.89 49.8,20.52 49.8,21.24C49.8,22.15 49.54,22.9 49,23.5C48.47,24.09 47.67,24.46 46.61,24.61C47.14,24.92 47.57,25.26 47.91,25.63C48.26,26 48.73,26.65 49.31,27.6L50.79,29.96L47.86,29.96L46.09,27.32C45.46,26.38 45.04,25.79 44.8,25.55C44.57,25.3 44.33,25.13 44.07,25.04C43.81,24.95 43.4,24.9 42.84,24.9L42.34,24.9L42.34,29.96ZM42.34,22.97L44.15,22.97C45.32,22.97 46.06,22.92 46.35,22.82C46.64,22.72 46.87,22.55 47.04,22.3C47.2,22.06 47.29,21.76 47.29,21.39C47.29,20.99 47.18,20.66 46.95,20.41C46.74,20.16 46.43,20 46.04,19.93C45.84,19.91 45.24,19.89 44.25,19.89L42.34,19.89ZM57.18,27.17L59.49,27.55C59.2,28.4 58.72,29.05 58.08,29.5C57.44,29.94 56.64,30.16 55.68,30.16C54.15,30.16 53.02,29.66 52.29,28.66C51.71,27.86 51.42,26.86 51.42,25.64C51.42,24.18 51.8,23.04 52.56,22.22C53.32,21.39 54.28,20.98 55.44,20.98C56.75,20.98 57.78,21.41 58.54,22.28C59.29,23.14 59.65,24.46 59.62,26.24L53.8,26.24C53.81,26.93 54,27.46 54.36,27.85C54.72,28.23 55.16,28.42 55.7,28.42C56.06,28.42 56.37,28.32 56.62,28.13C56.86,27.93 57.05,27.61 57.18,27.17ZM57.31,24.82C57.29,24.14 57.12,23.64 56.79,23.29C56.46,22.94 56.06,22.76 55.58,22.76C55.08,22.76 54.66,22.95 54.33,23.31C54,23.68 53.83,24.18 53.84,24.82ZM64.62,29.96L60.29,17.84L62.94,17.84L66.01,26.81L68.97,17.84L71.57,17.84L67.23,29.96ZM73.6,23.86L71.5,23.48C71.73,22.63 72.14,22 72.72,21.59C73.3,21.19 74.16,20.98 75.3,20.98C76.33,20.98 77.11,21.11 77.61,21.36C78.12,21.6 78.47,21.91 78.68,22.29C78.89,22.66 78.99,23.36 78.99,24.36L78.97,27.07C78.97,27.85 79,28.42 79.07,28.79C79.15,29.15 79.29,29.54 79.5,29.96L77.2,29.96C77.14,29.8 77.06,29.58 76.98,29.27C76.94,29.14 76.91,29.05 76.89,29C76.5,29.39 76.07,29.68 75.62,29.87C75.17,30.06 74.68,30.16 74.17,30.16C73.27,30.16 72.55,29.91 72.03,29.42C71.52,28.93 71.25,28.31 71.25,27.56C71.25,27.07 71.38,26.63 71.61,26.24C71.85,25.85 72.18,25.55 72.6,25.35C73.03,25.14 73.65,24.96 74.45,24.8C75.54,24.6 76.29,24.41 76.71,24.23L76.71,24C76.71,23.55 76.6,23.24 76.38,23.05C76.16,22.86 75.74,22.76 75.13,22.76C74.72,22.76 74.39,22.84 74.16,23.01C73.93,23.17 73.75,23.45 73.6,23.86ZM76.71,25.75C76.41,25.84 75.94,25.96 75.3,26.1C74.65,26.24 74.23,26.37 74.03,26.5C73.73,26.72 73.58,26.99 73.58,27.32C73.58,27.65 73.7,27.93 73.94,28.17C74.18,28.4 74.49,28.52 74.87,28.52C75.29,28.52 75.68,28.38 76.07,28.11C76.35,27.9 76.53,27.64 76.62,27.34C76.68,27.14 76.71,26.77 76.71,26.21ZM89.27,29.96L86.94,29.96L86.94,25.48C86.94,24.53 86.89,23.92 86.79,23.64C86.7,23.36 86.53,23.14 86.31,22.99C86.09,22.84 85.82,22.76 85.5,22.76C85.1,22.76 84.74,22.87 84.42,23.09C84.1,23.31 83.88,23.6 83.76,23.97C83.64,24.33 83.59,25 83.59,25.98L83.59,29.96L81.27,29.96L81.27,21.18L83.42,21.18L83.42,22.47C84.19,21.48 85.15,20.98 86.32,20.98C86.83,20.98 87.3,21.08 87.72,21.27C88.14,21.45 88.46,21.68 88.68,21.96C88.9,22.25 89.05,22.58 89.13,22.94C89.22,23.3 89.27,23.83 89.27,24.5ZM99.28,23.78L96.98,24.19C96.91,23.73 96.73,23.39 96.46,23.16C96.19,22.93 95.84,22.81 95.4,22.81C94.82,22.81 94.36,23.01 94.01,23.41C93.67,23.81 93.5,24.48 93.5,25.41C93.5,26.46 93.67,27.19 94.02,27.62C94.37,28.05 94.84,28.27 95.43,28.27C95.87,28.27 96.23,28.14 96.52,27.89C96.8,27.64 97,27.21 97.11,26.6L99.39,26.98C99.16,28.03 98.7,28.82 98.03,29.36C97.36,29.89 96.45,30.16 95.32,30.16C94.04,30.16 93.02,29.75 92.25,28.94C91.49,28.13 91.11,27.01 91.11,25.58C91.11,24.13 91.49,23 92.26,22.2C93.02,21.39 94.06,20.98 95.37,20.98C96.43,20.98 97.29,21.21 97.91,21.68C98.55,22.14 99,22.84 99.28,23.78ZM106.12,27.17L108.43,27.55C108.14,28.4 107.66,29.05 107.02,29.5C106.38,29.94 105.58,30.16 104.62,30.16C103.09,30.16 101.96,29.66 101.23,28.66C100.65,27.86 100.36,26.86 100.36,25.64C100.36,24.18 100.74,23.04 101.5,22.22C102.26,21.39 103.22,20.98 104.38,20.98C105.69,20.98 106.72,21.41 107.48,22.28C108.23,23.14 108.59,24.46 108.56,26.24L102.74,26.24C102.75,26.93 102.94,27.46 103.3,27.85C103.66,28.23 104.11,28.42 104.64,28.42C105,28.42 105.31,28.32 105.56,28.13C105.8,27.93 105.99,27.61 106.12,27.17ZM106.25,24.82C106.23,24.14 106.06,23.64 105.73,23.29C105.4,22.94 105,22.76 104.52,22.76C104.02,22.76 103.6,22.95 103.27,23.31C102.94,23.68 102.77,24.18 102.78,24.82ZM118.5,29.96L116.34,29.96L116.34,28.67C115.98,29.17 115.56,29.55 115.07,29.79C114.59,30.04 114.1,30.16 113.6,30.16C112.59,30.16 111.73,29.75 111,28.94C110.29,28.13 109.93,26.99 109.93,25.54C109.93,24.05 110.28,22.92 110.98,22.15C111.68,21.37 112.56,20.98 113.63,20.98C114.61,20.98 115.46,21.39 116.18,22.21L116.18,17.84L118.5,17.84ZM112.3,25.38C112.3,26.32 112.43,27 112.69,27.41C113.07,28.02 113.59,28.32 114.26,28.32C114.8,28.32 115.25,28.1 115.63,27.64C116,27.19 116.19,26.51 116.19,25.61C116.19,24.59 116,23.87 115.64,23.43C115.28,22.98 114.81,22.76 114.25,22.76C113.7,22.76 113.23,22.98 112.86,23.42C112.49,23.86 112.3,24.51 112.3,25.38ZM112.3,25.38" />
</vector>

View File

@@ -0,0 +1,61 @@
<!-- Copyright 2024 ReVanced. Not licensed under GPL. See https://github.com/ReVanced/revanced-branding -->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:aapt="http://schemas.android.com/aapt"
android:width="129dp"
android:height="48dp"
android:autoMirrored="false"
android:viewportWidth="129"
android:viewportHeight="48">
<group>
<path android:pathData="M23,11.5C29.9,11.5 35.5,17.1 35.5,24C35.5,30.9 29.9,36.5 23,36.5C16.1,36.5 10.5,30.9 10.5,24C10.5,17.1 16.1,11.5 23,11.5Z">
<aapt:attr name="android:fillColor">
<gradient
android:endX="23"
android:endY="36.5"
android:startX="23"
android:startY="11.5"
android:type="linear">
<item
android:color="#F04E98"
android:offset="0" />
<item
android:color="#5F65D4"
android:offset="0.5" />
<item
android:color="#4E98F0"
android:offset="1" />
</gradient>
</aapt:attr>
</path>
<path
android:fillColor="#1B1B1B"
android:pathData="M23,12.63C29.28,12.63 34.38,17.72 34.38,24C34.38,30.28 29.28,35.38 23,35.38C16.72,35.38 11.63,30.28 11.63,24C11.63,17.72 16.72,12.63 23,12.63Z" />
</group>
<path
android:fillColor="#FFFFFF"
android:pathData="M27.34,19.93C27.38,19.83 27.37,19.71 27.31,19.61C27.25,19.51 27.14,19.45 27.02,19.45C26.86,19.45 26.7,19.45 26.58,19.45C26.48,19.45 26.39,19.51 26.36,19.6C25.96,20.49 23.91,25.17 23.22,26.73C23.18,26.82 23.1,26.88 23,26.88C22.9,26.88 22.82,26.82 22.78,26.73C22.09,25.17 20.04,20.49 19.64,19.6C19.61,19.51 19.52,19.45 19.42,19.45C19.3,19.45 19.14,19.45 18.98,19.45C18.86,19.45 18.75,19.51 18.69,19.61C18.63,19.71 18.62,19.83 18.66,19.93C19.4,21.61 21.85,27.2 22.35,28.34C22.4,28.46 22.52,28.55 22.66,28.55C22.86,28.55 23.14,28.55 23.34,28.55C23.48,28.55 23.6,28.46 23.65,28.34C24.15,27.2 26.6,21.61 27.34,19.93ZM27.34,19.93" />
<path android:pathData="M23.25,23.85C23.2,23.95 23.11,24 23,24C22.89,24 22.8,23.95 22.75,23.85C22.21,22.93 20.99,20.81 20.46,19.89C20.41,19.8 20.41,19.69 20.46,19.6C20.51,19.51 20.61,19.45 20.71,19.45L25.29,19.45C25.39,19.45 25.49,19.51 25.54,19.6C25.59,19.69 25.59,19.8 25.54,19.89C25.01,20.81 23.79,22.93 23.25,23.85ZM23.25,23.85">
<aapt:attr name="android:fillColor">
<gradient
android:endX="23"
android:endY="28.5"
android:startX="23"
android:startY="19.45"
android:type="linear">
<item
android:color="#F04E98"
android:offset="0" />
<item
android:color="#5F65D4"
android:offset="0.5" />
<item
android:color="#4E98F0"
android:offset="1" />
</gradient>
</aapt:attr>
</path>
<path
android:fillColor="#FFFFFF"
android:pathData="M39.89,29.96L39.89,17.84L45.04,17.84C46.34,17.84 47.28,17.95 47.86,18.17C48.45,18.39 48.93,18.77 49.28,19.33C49.63,19.89 49.8,20.52 49.8,21.24C49.8,22.15 49.54,22.9 49,23.5C48.47,24.09 47.67,24.46 46.61,24.61C47.14,24.92 47.57,25.26 47.91,25.63C48.26,26 48.73,26.65 49.31,27.6L50.79,29.96L47.86,29.96L46.09,27.32C45.46,26.38 45.04,25.79 44.8,25.55C44.57,25.3 44.33,25.13 44.07,25.04C43.81,24.95 43.4,24.9 42.84,24.9L42.34,24.9L42.34,29.96ZM42.34,22.97L44.15,22.97C45.32,22.97 46.06,22.92 46.35,22.82C46.64,22.72 46.87,22.55 47.04,22.3C47.2,22.06 47.29,21.76 47.29,21.39C47.29,20.99 47.18,20.66 46.95,20.41C46.74,20.16 46.43,20 46.04,19.93C45.84,19.91 45.24,19.89 44.25,19.89L42.34,19.89ZM57.18,27.17L59.49,27.55C59.2,28.4 58.72,29.05 58.08,29.5C57.44,29.94 56.64,30.16 55.68,30.16C54.15,30.16 53.02,29.66 52.29,28.66C51.71,27.86 51.42,26.86 51.42,25.64C51.42,24.18 51.8,23.04 52.56,22.22C53.32,21.39 54.28,20.98 55.44,20.98C56.75,20.98 57.78,21.41 58.54,22.28C59.29,23.14 59.65,24.46 59.62,26.24L53.8,26.24C53.81,26.93 54,27.46 54.36,27.85C54.72,28.23 55.16,28.42 55.7,28.42C56.06,28.42 56.37,28.32 56.62,28.13C56.86,27.93 57.05,27.61 57.18,27.17ZM57.31,24.82C57.29,24.14 57.12,23.64 56.79,23.29C56.46,22.94 56.06,22.76 55.58,22.76C55.08,22.76 54.66,22.95 54.33,23.31C54,23.68 53.83,24.18 53.84,24.82ZM64.62,29.96L60.29,17.84L62.94,17.84L66.01,26.81L68.97,17.84L71.57,17.84L67.23,29.96ZM73.6,23.86L71.5,23.48C71.73,22.63 72.14,22 72.72,21.59C73.3,21.19 74.16,20.98 75.3,20.98C76.33,20.98 77.11,21.11 77.61,21.36C78.12,21.6 78.47,21.91 78.68,22.29C78.89,22.66 78.99,23.36 78.99,24.36L78.97,27.07C78.97,27.85 79,28.42 79.07,28.79C79.15,29.15 79.29,29.54 79.5,29.96L77.2,29.96C77.14,29.8 77.06,29.58 76.98,29.27C76.94,29.14 76.91,29.05 76.89,29C76.5,29.39 76.07,29.68 75.62,29.87C75.17,30.06 74.68,30.16 74.17,30.16C73.27,30.16 72.55,29.91 72.03,29.42C71.52,28.93 71.25,28.31 71.25,27.56C71.25,27.07 71.38,26.63 71.61,26.24C71.85,25.85 72.18,25.55 72.6,25.35C73.03,25.14 73.65,24.96 74.45,24.8C75.54,24.6 76.29,24.41 76.71,24.23L76.71,24C76.71,23.55 76.6,23.24 76.38,23.05C76.16,22.86 75.74,22.76 75.13,22.76C74.72,22.76 74.39,22.84 74.16,23.01C73.93,23.17 73.75,23.45 73.6,23.86ZM76.71,25.75C76.41,25.84 75.94,25.96 75.3,26.1C74.65,26.24 74.23,26.37 74.03,26.5C73.73,26.72 73.58,26.99 73.58,27.32C73.58,27.65 73.7,27.93 73.94,28.17C74.18,28.4 74.49,28.52 74.87,28.52C75.29,28.52 75.68,28.38 76.07,28.11C76.35,27.9 76.53,27.64 76.62,27.34C76.68,27.14 76.71,26.77 76.71,26.21ZM89.27,29.96L86.94,29.96L86.94,25.48C86.94,24.53 86.89,23.92 86.79,23.64C86.7,23.36 86.53,23.14 86.31,22.99C86.09,22.84 85.82,22.76 85.5,22.76C85.1,22.76 84.74,22.87 84.42,23.09C84.1,23.31 83.88,23.6 83.76,23.97C83.64,24.33 83.59,25 83.59,25.98L83.59,29.96L81.27,29.96L81.27,21.18L83.42,21.18L83.42,22.47C84.19,21.48 85.15,20.98 86.32,20.98C86.83,20.98 87.3,21.08 87.72,21.27C88.14,21.45 88.46,21.68 88.68,21.96C88.9,22.25 89.05,22.58 89.13,22.94C89.22,23.3 89.27,23.83 89.27,24.5ZM99.28,23.78L96.98,24.19C96.91,23.73 96.73,23.39 96.46,23.16C96.19,22.93 95.84,22.81 95.4,22.81C94.82,22.81 94.36,23.01 94.01,23.41C93.67,23.81 93.5,24.48 93.5,25.41C93.5,26.46 93.67,27.19 94.02,27.62C94.37,28.05 94.84,28.27 95.43,28.27C95.87,28.27 96.23,28.14 96.52,27.89C96.8,27.64 97,27.21 97.11,26.6L99.39,26.98C99.16,28.03 98.7,28.82 98.03,29.36C97.36,29.89 96.45,30.16 95.32,30.16C94.04,30.16 93.02,29.75 92.25,28.94C91.49,28.13 91.11,27.01 91.11,25.58C91.11,24.13 91.49,23 92.26,22.2C93.02,21.39 94.06,20.98 95.37,20.98C96.43,20.98 97.29,21.21 97.91,21.68C98.55,22.14 99,22.84 99.28,23.78ZM106.12,27.17L108.43,27.55C108.14,28.4 107.66,29.05 107.02,29.5C106.38,29.94 105.58,30.16 104.62,30.16C103.09,30.16 101.96,29.66 101.23,28.66C100.65,27.86 100.36,26.86 100.36,25.64C100.36,24.18 100.74,23.04 101.5,22.22C102.26,21.39 103.22,20.98 104.38,20.98C105.69,20.98 106.72,21.41 107.48,22.28C108.23,23.14 108.59,24.46 108.56,26.24L102.74,26.24C102.75,26.93 102.94,27.46 103.3,27.85C103.66,28.23 104.11,28.42 104.64,28.42C105,28.42 105.31,28.32 105.56,28.13C105.8,27.93 105.99,27.61 106.12,27.17ZM106.25,24.82C106.23,24.14 106.06,23.64 105.73,23.29C105.4,22.94 105,22.76 104.52,22.76C104.02,22.76 103.6,22.95 103.27,23.31C102.94,23.68 102.77,24.18 102.78,24.82ZM118.5,29.96L116.34,29.96L116.34,28.67C115.98,29.17 115.56,29.55 115.07,29.79C114.59,30.04 114.1,30.16 113.6,30.16C112.59,30.16 111.73,29.75 111,28.94C110.29,28.13 109.93,26.99 109.93,25.54C109.93,24.05 110.28,22.92 110.98,22.15C111.68,21.37 112.56,20.98 113.63,20.98C114.61,20.98 115.46,21.39 116.18,22.21L116.18,17.84L118.5,17.84ZM112.3,25.38C112.3,26.32 112.43,27 112.69,27.41C113.07,28.02 113.59,28.32 114.26,28.32C114.8,28.32 115.25,28.1 115.63,27.64C116,27.19 116.19,26.51 116.19,25.61C116.19,24.59 116,23.87 115.64,23.43C115.28,22.98 114.81,22.76 114.25,22.76C113.7,22.76 113.23,22.98 112.86,23.42C112.49,23.86 112.3,24.51 112.3,25.38ZM112.3,25.38" />
</vector>

View File

@@ -0,0 +1,61 @@
<!-- Copyright 2024 ReVanced. Not licensed under GPL. See https://github.com/ReVanced/revanced-branding -->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:aapt="http://schemas.android.com/aapt"
android:width="129dp"
android:height="48dp"
android:autoMirrored="false"
android:viewportWidth="129"
android:viewportHeight="48">
<group>
<path android:pathData="M23,11.5C29.9,11.5 35.5,17.1 35.5,24C35.5,30.9 29.9,36.5 23,36.5C16.1,36.5 10.5,30.9 10.5,24C10.5,17.1 16.1,11.5 23,11.5Z">
<aapt:attr name="android:fillColor">
<gradient
android:endX="23"
android:endY="36.5"
android:startX="23"
android:startY="11.5"
android:type="linear">
<item
android:color="#F04E98"
android:offset="0" />
<item
android:color="#5F65D4"
android:offset="0.5" />
<item
android:color="#4E98F0"
android:offset="1" />
</gradient>
</aapt:attr>
</path>
<path
android:fillColor="#1B1B1B"
android:pathData="M23,12.63C29.28,12.63 34.38,17.72 34.38,24C34.38,30.28 29.28,35.38 23,35.38C16.72,35.38 11.63,30.28 11.63,24C11.63,17.72 16.72,12.63 23,12.63Z" />
</group>
<path
android:fillColor="#FFFFFF"
android:pathData="M27.34,19.93C27.38,19.83 27.37,19.71 27.31,19.61C27.25,19.51 27.14,19.45 27.02,19.45C26.86,19.45 26.7,19.45 26.58,19.45C26.48,19.45 26.39,19.51 26.36,19.6C25.96,20.49 23.91,25.17 23.22,26.73C23.18,26.82 23.1,26.88 23,26.88C22.9,26.88 22.82,26.82 22.78,26.73C22.09,25.17 20.04,20.49 19.64,19.6C19.61,19.51 19.52,19.45 19.42,19.45C19.3,19.45 19.14,19.45 18.98,19.45C18.86,19.45 18.75,19.51 18.69,19.61C18.63,19.71 18.62,19.83 18.66,19.93C19.4,21.61 21.85,27.2 22.35,28.34C22.4,28.46 22.52,28.55 22.66,28.55C22.86,28.55 23.14,28.55 23.34,28.55C23.48,28.55 23.6,28.46 23.65,28.34C24.15,27.2 26.6,21.61 27.34,19.93ZM27.34,19.93" />
<path android:pathData="M23.25,23.85C23.2,23.95 23.11,24 23,24C22.89,24 22.8,23.95 22.75,23.85C22.21,22.93 20.99,20.81 20.46,19.89C20.41,19.8 20.41,19.69 20.46,19.6C20.51,19.51 20.61,19.45 20.71,19.45L25.29,19.45C25.39,19.45 25.49,19.51 25.54,19.6C25.59,19.69 25.59,19.8 25.54,19.89C25.01,20.81 23.79,22.93 23.25,23.85ZM23.25,23.85">
<aapt:attr name="android:fillColor">
<gradient
android:endX="23"
android:endY="28.5"
android:startX="23"
android:startY="19.45"
android:type="linear">
<item
android:color="#F04E98"
android:offset="0" />
<item
android:color="#5F65D4"
android:offset="0.5" />
<item
android:color="#4E98F0"
android:offset="1" />
</gradient>
</aapt:attr>
</path>
<path
android:fillColor="#000000"
android:pathData="M39.89,29.96L39.89,17.84L45.04,17.84C46.34,17.84 47.28,17.95 47.86,18.17C48.45,18.39 48.93,18.77 49.28,19.33C49.63,19.89 49.8,20.52 49.8,21.24C49.8,22.15 49.54,22.9 49,23.5C48.47,24.09 47.67,24.46 46.61,24.61C47.14,24.92 47.57,25.26 47.91,25.63C48.26,26 48.73,26.65 49.31,27.6L50.79,29.96L47.86,29.96L46.09,27.32C45.46,26.38 45.04,25.79 44.8,25.55C44.57,25.3 44.33,25.13 44.07,25.04C43.81,24.95 43.4,24.9 42.84,24.9L42.34,24.9L42.34,29.96ZM42.34,22.97L44.15,22.97C45.32,22.97 46.06,22.92 46.35,22.82C46.64,22.72 46.87,22.55 47.04,22.3C47.2,22.06 47.29,21.76 47.29,21.39C47.29,20.99 47.18,20.66 46.95,20.41C46.74,20.16 46.43,20 46.04,19.93C45.84,19.91 45.24,19.89 44.25,19.89L42.34,19.89ZM57.18,27.17L59.49,27.55C59.2,28.4 58.72,29.05 58.08,29.5C57.44,29.94 56.64,30.16 55.68,30.16C54.15,30.16 53.02,29.66 52.29,28.66C51.71,27.86 51.42,26.86 51.42,25.64C51.42,24.18 51.8,23.04 52.56,22.22C53.32,21.39 54.28,20.98 55.44,20.98C56.75,20.98 57.78,21.41 58.54,22.28C59.29,23.14 59.65,24.46 59.62,26.24L53.8,26.24C53.81,26.93 54,27.46 54.36,27.85C54.72,28.23 55.16,28.42 55.7,28.42C56.06,28.42 56.37,28.32 56.62,28.13C56.86,27.93 57.05,27.61 57.18,27.17ZM57.31,24.82C57.29,24.14 57.12,23.64 56.79,23.29C56.46,22.94 56.06,22.76 55.58,22.76C55.08,22.76 54.66,22.95 54.33,23.31C54,23.68 53.83,24.18 53.84,24.82ZM64.62,29.96L60.29,17.84L62.94,17.84L66.01,26.81L68.97,17.84L71.57,17.84L67.23,29.96ZM73.6,23.86L71.5,23.48C71.73,22.63 72.14,22 72.72,21.59C73.3,21.19 74.16,20.98 75.3,20.98C76.33,20.98 77.11,21.11 77.61,21.36C78.12,21.6 78.47,21.91 78.68,22.29C78.89,22.66 78.99,23.36 78.99,24.36L78.97,27.07C78.97,27.85 79,28.42 79.07,28.79C79.15,29.15 79.29,29.54 79.5,29.96L77.2,29.96C77.14,29.8 77.06,29.58 76.98,29.27C76.94,29.14 76.91,29.05 76.89,29C76.5,29.39 76.07,29.68 75.62,29.87C75.17,30.06 74.68,30.16 74.17,30.16C73.27,30.16 72.55,29.91 72.03,29.42C71.52,28.93 71.25,28.31 71.25,27.56C71.25,27.07 71.38,26.63 71.61,26.24C71.85,25.85 72.18,25.55 72.6,25.35C73.03,25.14 73.65,24.96 74.45,24.8C75.54,24.6 76.29,24.41 76.71,24.23L76.71,24C76.71,23.55 76.6,23.24 76.38,23.05C76.16,22.86 75.74,22.76 75.13,22.76C74.72,22.76 74.39,22.84 74.16,23.01C73.93,23.17 73.75,23.45 73.6,23.86ZM76.71,25.75C76.41,25.84 75.94,25.96 75.3,26.1C74.65,26.24 74.23,26.37 74.03,26.5C73.73,26.72 73.58,26.99 73.58,27.32C73.58,27.65 73.7,27.93 73.94,28.17C74.18,28.4 74.49,28.52 74.87,28.52C75.29,28.52 75.68,28.38 76.07,28.11C76.35,27.9 76.53,27.64 76.62,27.34C76.68,27.14 76.71,26.77 76.71,26.21ZM89.27,29.96L86.94,29.96L86.94,25.48C86.94,24.53 86.89,23.92 86.79,23.64C86.7,23.36 86.53,23.14 86.31,22.99C86.09,22.84 85.82,22.76 85.5,22.76C85.1,22.76 84.74,22.87 84.42,23.09C84.1,23.31 83.88,23.6 83.76,23.97C83.64,24.33 83.59,25 83.59,25.98L83.59,29.96L81.27,29.96L81.27,21.18L83.42,21.18L83.42,22.47C84.19,21.48 85.15,20.98 86.32,20.98C86.83,20.98 87.3,21.08 87.72,21.27C88.14,21.45 88.46,21.68 88.68,21.96C88.9,22.25 89.05,22.58 89.13,22.94C89.22,23.3 89.27,23.83 89.27,24.5ZM99.28,23.78L96.98,24.19C96.91,23.73 96.73,23.39 96.46,23.16C96.19,22.93 95.84,22.81 95.4,22.81C94.82,22.81 94.36,23.01 94.01,23.41C93.67,23.81 93.5,24.48 93.5,25.41C93.5,26.46 93.67,27.19 94.02,27.62C94.37,28.05 94.84,28.27 95.43,28.27C95.87,28.27 96.23,28.14 96.52,27.89C96.8,27.64 97,27.21 97.11,26.6L99.39,26.98C99.16,28.03 98.7,28.82 98.03,29.36C97.36,29.89 96.45,30.16 95.32,30.16C94.04,30.16 93.02,29.75 92.25,28.94C91.49,28.13 91.11,27.01 91.11,25.58C91.11,24.13 91.49,23 92.26,22.2C93.02,21.39 94.06,20.98 95.37,20.98C96.43,20.98 97.29,21.21 97.91,21.68C98.55,22.14 99,22.84 99.28,23.78ZM106.12,27.17L108.43,27.55C108.14,28.4 107.66,29.05 107.02,29.5C106.38,29.94 105.58,30.16 104.62,30.16C103.09,30.16 101.96,29.66 101.23,28.66C100.65,27.86 100.36,26.86 100.36,25.64C100.36,24.18 100.74,23.04 101.5,22.22C102.26,21.39 103.22,20.98 104.38,20.98C105.69,20.98 106.72,21.41 107.48,22.28C108.23,23.14 108.59,24.46 108.56,26.24L102.74,26.24C102.75,26.93 102.94,27.46 103.3,27.85C103.66,28.23 104.11,28.42 104.64,28.42C105,28.42 105.31,28.32 105.56,28.13C105.8,27.93 105.99,27.61 106.12,27.17ZM106.25,24.82C106.23,24.14 106.06,23.64 105.73,23.29C105.4,22.94 105,22.76 104.52,22.76C104.02,22.76 103.6,22.95 103.27,23.31C102.94,23.68 102.77,24.18 102.78,24.82ZM118.5,29.96L116.34,29.96L116.34,28.67C115.98,29.17 115.56,29.55 115.07,29.79C114.59,30.04 114.1,30.16 113.6,30.16C112.59,30.16 111.73,29.75 111,28.94C110.29,28.13 109.93,26.99 109.93,25.54C109.93,24.05 110.28,22.92 110.98,22.15C111.68,21.37 112.56,20.98 113.63,20.98C114.61,20.98 115.46,21.39 116.18,22.21L116.18,17.84L118.5,17.84ZM112.3,25.38C112.3,26.32 112.43,27 112.69,27.41C113.07,28.02 113.59,28.32 114.26,28.32C114.8,28.32 115.25,28.1 115.63,27.64C116,27.19 116.19,26.51 116.19,25.61C116.19,24.59 116,23.87 115.64,23.43C115.28,22.98 114.81,22.76 114.25,22.76C113.7,22.76 113.23,22.98 112.86,23.42C112.49,23.86 112.3,24.51 112.3,25.38ZM112.3,25.38" />
</vector>