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

This commit is contained in:
MarcaD
2025-04-02 12:39:53 +03:00
committed by GitHub
parent 4d02f6cf14
commit d0c85f0440
45 changed files with 506 additions and 110 deletions

View File

@ -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
@ -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.
@ -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
}
@ -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) }

View File

@ -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.

View File

@ -70,6 +70,8 @@ val returnYouTubeDislikePatch = bytecodePatch(
key = "revanced_settings_screen_09",
titleKey = "revanced_ryd_settings_title",
summaryKey = null,
icon = "@drawable/revanced_settings_screen_09_ryd",
layout = "@layout/preference_with_icon",
intent = newIntent("revanced_ryd_settings_intent"),
),
)

View File

@ -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_sb",
layout = "@layout/preference_with_icon",
intent = newIntent("revanced_sb_settings_intent"),
),
)

View File

@ -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_ryd.xml",
"revanced_settings_screen_10_sb.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)
@ -159,6 +174,8 @@ 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,
@ -170,6 +187,10 @@ val settingsPatch = bytecodePatch(
)
}
PreferenceScreen.GENERAL_LAYOUT.addPreferences(
SwitchPreference("revanced_show_menu_icons")
)
PreferenceScreen.MISC.addPreferences(
TextPreference(
key = null,
@ -277,37 +298,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,
)
@ -317,10 +354,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,
)