Skip to content

feat(YouTube - Settings): Add icons to the ReVanced settings #4496

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 14 commits into from
Apr 2, 2025
Merged
Show file tree
Hide file tree
Changes from 10 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,11 @@ public class BaseSettings {

public static final EnumSetting<AppLanguage> REVANCED_LANGUAGE = new EnumSetting<>("revanced_language", AppLanguage.DEFAULT, true, "revanced_language_user_dialog_message");

/**
* Use the icons declared in the preferences created during patching. If no icons or styles are declared then this setting does nothing.
*/
public static final BooleanSetting SHOW_MENU_ICONS = new BooleanSetting("revanced_show_menu_icons", TRUE, true);

public static final BooleanSetting SPOOF_VIDEO_STREAMS = new BooleanSetting("revanced_spoof_video_streams", TRUE, true, "revanced_spoof_video_streams_user_dialog_message");
public static final EnumSetting<AppLanguage> SPOOF_VIDEO_STREAMS_LANGUAGE = new EnumSetting<>("revanced_spoof_video_streams_language", AppLanguage.DEFAULT, new AudioStreamLanguageOverrideAvailability());
public static final BooleanSetting SPOOF_STREAMING_DATA_STATS_FOR_NERDS = new BooleanSetting("revanced_spoof_streaming_data_stats_for_nerds", TRUE, parent(SPOOF_VIDEO_STREAMS));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,6 @@ public abstract class AbstractPreferenceFragment extends PreferenceFragment {
}
};


/**
* Initialize this instance, and do any custom behavior.
* <p>
Expand All @@ -81,7 +80,10 @@ public abstract class AbstractPreferenceFragment extends PreferenceFragment {
* so all app specific {@link Setting} instances are loaded before this method returns.
*/
protected void initialize() {
final var identifier = Utils.getResourceIdentifier("revanced_prefs", "xml");
String preferenceResourceName = BaseSettings.SHOW_MENU_ICONS.get()
? "revanced_prefs_icons"
: "revanced_prefs";
final var identifier = Utils.getResourceIdentifier(preferenceResourceName, "xml");
if (identifier == 0) return;
addPreferencesFromResource(identifier);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@
import app.revanced.extension.tiktok.settings.preference.categories.FeedFilterPreferenceCategory;
import app.revanced.extension.tiktok.settings.preference.categories.ExtensionPreferenceCategory;
import app.revanced.extension.tiktok.settings.preference.categories.SimSpoofPreferenceCategory;
import org.jetbrains.annotations.NotNull;

/**
* Preference fragment for ReVanced settings
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ import app.revanced.patches.all.misc.resources.addResources
import app.revanced.patches.all.misc.resources.addResourcesPatch
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
import app.revanced.patches.shared.misc.settings.preference.PreferenceScreenPreference
import app.revanced.util.ResourceGroup
import app.revanced.util.copyResources
import app.revanced.util.getNode
Expand Down Expand Up @@ -36,14 +38,14 @@ fun settingsPatch (
execute {
copyResources(
"settings",
ResourceGroup("xml", "revanced_prefs.xml"),
ResourceGroup("xml", "revanced_prefs.xml", "revanced_prefs_icons.xml"),
)

addResources("shared", "misc.settings.settingsResourcePatch")
}

finalize {
fun Node.addPreference(preference: BasePreference, prepend: Boolean = false) {
fun Node.addPreference(preference: BasePreference) {
preference.serialize(ownerDocument) { resource ->
// TODO: Currently, resources can only be added to "values", which may not be the correct place.
// It may be necessary to ask for the desired resourceValue in the future.
Expand All @@ -61,7 +63,7 @@ fun settingsPatch (
val preferenceFileName = "res/xml/$fileName.xml"
if (get(preferenceFileName).exists()) {
document(preferenceFileName).use { document ->
document.getNode("PreferenceScreen").addPreference(intent, true)
document.getNode("PreferenceScreen").addPreference(intent)
}
modified = true
}
Expand All @@ -71,6 +73,30 @@ fun settingsPatch (
}

// Add all preferences to the ReVanced fragment.
document("res/xml/revanced_prefs_icons.xml").use { document ->
val revancedPreferenceScreenNode = document.getNode("PreferenceScreen")
preferences.forEach { revancedPreferenceScreenNode.addPreference(it) }
}

// Because the icon preferences require declaring a layout resource,
// there is no easy way to change to the Android default preference layout
// after the preference is inflated.
// Using two different preference files is the simplest and most robust solution.
fun removeIconsAndLayout(preferences: Collection<BasePreference>) {
preferences.forEach { preference ->
preference.icon = null
preference.layout = null

if (preference is PreferenceCategory) {
removeIconsAndLayout(preference.preferences)
}
if (preference is PreferenceScreenPreference) {
removeIconsAndLayout(preference.preferences)
}
}
}
removeIconsAndLayout(preferences)

document("res/xml/revanced_prefs.xml").use { document ->
val revancedPreferenceScreenNode = document.getNode("PreferenceScreen")
preferences.forEach { revancedPreferenceScreenNode.addPreference(it) }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,10 +19,17 @@ abstract class BasePreference(
val key: String? = null,
val titleKey: String? = "${key}_title",
val summaryKey: String? = "${key}_summary",
val icon: String? = null,
val layout: String? = null,
icon: String? = null,
layout: String? = null,
val tag: String
) {

var icon: String? = icon
internal set

var layout: String? = layout
internal set

/**
* Serialize preference element to XML.
* Overriding methods should invoke super and operate on its return value.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,8 @@ val returnYouTubeDislikePatch = bytecodePatch(
key = "revanced_settings_screen_09",
titleKey = "revanced_ryd_settings_title",
summaryKey = null,
icon = "@drawable/revanced_settings_screen_09",
layout = "@layout/preference_with_icon",
intent = newIntent("revanced_ryd_settings_intent"),
),
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,8 @@ private val sponsorBlockResourcePatch = resourcePatch {
key = "revanced_settings_screen_10",
titleKey = "revanced_sb_settings_title",
summaryKey = null,
icon = "@drawable/revanced_settings_screen_10",
layout = "@layout/preference_with_icon",
intent = newIntent("revanced_sb_settings_intent"),
),
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,22 @@ private val settingsResourcePatch = resourcePatch {
appearanceStringId = resourceMappings["string", "app_theme_appearance_dark"]

arrayOf(
ResourceGroup("drawable", "revanced_settings_icon.xml"),
ResourceGroup("drawable",
"revanced_settings_icon.xml",
"revanced_settings_screen_00_about.xml",
"revanced_settings_screen_01_ads.xml",
"revanced_settings_screen_02_alt_thumbnails.xml",
"revanced_settings_screen_03_feed.xml",
"revanced_settings_screen_04_general.xml",
"revanced_settings_screen_05_player.xml",
"revanced_settings_screen_06_shorts.xml",
"revanced_settings_screen_07_seekbar.xml",
"revanced_settings_screen_08_swipe_controls.xml",
"revanced_settings_screen_09.xml",
"revanced_settings_screen_10.xml",
"revanced_settings_screen_11_misc.xml",
"revanced_settings_screen_12_video.xml",
),
ResourceGroup("layout", "revanced_settings_with_toolbar.xml"),
).forEach { resourceGroup ->
copyResources("settings", resourceGroup)
Expand Down Expand Up @@ -159,14 +174,17 @@ val settingsPatch = bytecodePatch(
// Add an "about" preference to the top.
preferences += NonInteractivePreference(
key = "revanced_settings_screen_00_about",
icon = "@drawable/revanced_settings_screen_00_about",
layout = "@layout/preference_with_icon",
summaryKey = null,
tag = "app.revanced.extension.youtube.settings.preference.ReVancedYouTubeAboutPreference",
selectable = true,
)

if (is_19_34_or_greater) {
PreferenceScreen.GENERAL_LAYOUT.addPreferences(
SwitchPreference("revanced_restore_old_settings_menus")
SwitchPreference("revanced_restore_old_settings_menus"),
SwitchPreference("revanced_show_menu_icons")
)
}

Expand Down Expand Up @@ -277,37 +295,53 @@ object PreferenceScreen : BasePreferenceScreen() {
val ADS = Screen(
key = "revanced_settings_screen_01_ads",
summaryKey = null,
icon = "@drawable/revanced_settings_screen_01_ads",
layout = "@layout/preference_with_icon",
)
val ALTERNATIVE_THUMBNAILS = Screen(
key = "revanced_settings_screen_02_alt_thumbnails",
summaryKey = null,
icon = "@drawable/revanced_settings_screen_02_alt_thumbnails",
layout = "@layout/preference_with_icon",
sorting = Sorting.UNSORTED,
)
val FEED = Screen(
key = "revanced_settings_screen_03_feed",
summaryKey = null,
icon = "@drawable/revanced_settings_screen_03_feed",
layout = "@layout/preference_with_icon",
)
val GENERAL_LAYOUT = Screen(
key = "revanced_settings_screen_04_general",
summaryKey = null,
icon = "@drawable/revanced_settings_screen_04_general",
layout = "@layout/preference_with_icon",
)
val PLAYER = Screen(
key = "revanced_settings_screen_05_player",
summaryKey = null,
icon = "@drawable/revanced_settings_screen_05_player",
layout = "@layout/preference_with_icon",
)

val SHORTS = Screen(
key = "revanced_settings_screen_06_shorts",
summaryKey = null,
icon = "@drawable/revanced_settings_screen_06_shorts",
layout = "@layout/preference_with_icon",
)

val SEEKBAR = Screen(
key = "revanced_settings_screen_07_seekbar",
summaryKey = null,
)
icon = "@drawable/revanced_settings_screen_07_seekbar",
layout = "@layout/preference_with_icon",
)
val SWIPE_CONTROLS = Screen(
key = "revanced_settings_screen_08_swipe_controls",
summaryKey = null,
icon = "@drawable/revanced_settings_screen_08_swipe_controls",
layout = "@layout/preference_with_icon",
sorting = Sorting.UNSORTED,
)

Expand All @@ -317,10 +351,14 @@ object PreferenceScreen : BasePreferenceScreen() {
val MISC = Screen(
key = "revanced_settings_screen_11_misc",
summaryKey = null,
icon = "@drawable/revanced_settings_screen_11_misc",
layout = "@layout/preference_with_icon",
)
val VIDEO = Screen(
key = "revanced_settings_screen_12_video",
summaryKey = null,
icon = "@drawable/revanced_settings_screen_12_video",
layout = "@layout/preference_with_icon",
sorting = Sorting.BY_KEY,
)

Expand Down
3 changes: 3 additions & 0 deletions patches/src/main/resources/addresources/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,9 @@ Second \"item\" text"</string>
<string name="revanced_settings_import_reset">ReVanced settings reset to default</string>
<string name="revanced_settings_import_success">Imported %d settings</string>
<string name="revanced_settings_import_failure_parse">Import failed: %s</string>
<string name="revanced_show_menu_icons_title">Show ReVanced setting icons</string>
<string name="revanced_show_menu_icons_summary_on">Setting icons are shown</string>
<string name="revanced_show_menu_icons_summary_off">Setting icons are not shown</string>
<string name="revanced_language_title">ReVanced language</string>
<string name="revanced_language_user_dialog_message">"Translations for some languages may be missing or incomplete.

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@
https://github.com/google/material-design-icons/blob/9beae745bb758f3ad56654fb377ea5cf62be4915/symbols/android/content_copy/materialsymbolsoutlined/content_copy_wght200gradN25_24px.xml
Changes made: Icon has been resized.


Copyright 2022 Google

Licensed under the Apache License, Version 2.0 (the "License");
Expand All @@ -19,12 +18,11 @@ Copyright 2022 Google
-->

<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:tint="#FFFFFF"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="@android:color/white"
android:pathData="m 9.7348145,16.94238 q -0.5966913,0 -1.0062178,-0.39988 Q 8.319101,16.14259 8.319101,15.5599 V 5.88248 q 0,-0.58269 0.4094957,-0.9826 Q 9.1381232,4.5 9.7348145,4.5 h 7.1494615 q 0.596701,0 1.006218,0.39988 Q 18.3,5.29979 18.3,5.88248 v 9.67742 q 0,0.58269 -0.409506,0.9826 -0.409517,0.39988 -1.006218,0.39988 z m 0,-0.82949 h 7.1494615 q 0.212367,0 0.389322,-0.1728 0.176965,-0.17283 0.176965,-0.38019 V 5.88248 q 0,-0.20738 -0.176965,-0.38019 -0.176955,-0.1728 -0.389322,-0.1728 H 9.7348145 q -0.212336,0 -0.389322,0.1728 Q 9.1685373,5.6751 9.1685373,5.88248 v 9.67742 q 0,0.20736 0.1769552,0.38019 0.176986,0.1728 0.389322,0.1728 z M 7.1157237,19.5 Q 6.519022,19.5 6.1094957,19.10009 5.7,18.70021 5.7,18.1175 V 7.61058 H 6.5494363 V 18.1175 q 0,0.20738 0.1769552,0.38018 0.1769655,0.17281 0.3893322,0.17281 H 15.114611 V 19.5 Z M 9.1685373,16.11289 V 5.32949 Z"/>
android:pathData="M9.73481,16.9424 Q9.13812,16.9424,8.72859,16.5425 Q8.3191,16.1426,8.3191,15.5599 L8.3191,5.88248 Q8.3191,5.29979,8.7286,4.89988 Q9.13812,4.5,9.73481,4.5 L16.8843,4.5 Q17.481,4.5,17.8905,4.89988 Q18.3,5.29979,18.3,5.88248 L18.3,15.5599 Q18.3,16.1426,17.8905,16.5425 Q17.481,16.9424,16.8843,16.9424 Z M9.73481,16.1129 L16.8843,16.1129 Q17.0967,16.1129,17.2736,15.9401 Q17.4506,15.7673,17.4506,15.5599 L17.4506,5.88248 Q17.4506,5.6751,17.2736,5.50229 Q17.0966,5.32949,16.8843,5.32949 L9.73481,5.32949 Q9.52248,5.32949,9.34549,5.50229 Q9.16854,5.6751,9.16854,5.88248 L9.16854,15.5599 Q9.16854,15.7673,9.34549,15.9401 Q9.52248,16.1129,9.73481,16.1129 Z M7.11572,19.5 Q6.51902,19.5,6.1095,19.1001 Q5.7,18.7002,5.7,18.1175 L5.7,7.61058 L6.54944,7.61058 L6.54944,18.1175 Q6.54944,18.3249,6.72639,18.4977 Q6.90336,18.6705,7.11572,18.6705 L15.1146,18.6705 L15.1146,19.5 Z M9.16854,16.1129 L9.16854,5.32949 Z"/>
</vector>
Loading