refactor: better method is used for settings-framework

This commit is contained in:
inotia00 2023-02-18 01:53:18 +09:00
parent b3cd3d4fb8
commit 723fa2b97c
15 changed files with 176 additions and 68 deletions

View File

@ -32,6 +32,8 @@ class MusicVideoAdsPatch : BytecodePatch() {
GeneralVideoAdsPatch.injectMainstreamAds(INTEGRATIONS_CLASS_DESCRIPTOR)
MusicSettingsPatch.addMusicPreference("ads", "revanced_hide_music_ads", "true")
return PatchResultSuccess()
}
private companion object {

View File

@ -63,6 +63,8 @@ class CodecsUnlockPatch : BytecodePatch(
}
} ?: return CodecsLockFingerprint.toErrorResult()
MusicSettingsPatch.addMusicPreference("listening", "revanced_enable_opus_codec", "true")
return PatchResultSuccess()
}

View File

@ -59,6 +59,8 @@ class BlackNavbarPatch : BytecodePatch(
}
} ?: return TabLayoutFingerprint.toErrorResult()
MusicSettingsPatch.addMusicPreference("design", "revanced_enable_black_navbar", "true")
return PatchResultSuccess()
}
}

View File

@ -40,6 +40,8 @@ class HideCastButtonPatch : BytecodePatch(
) ?: return HideCastButtonFingerprint.toErrorResult()
} ?: return HideCastButtonParentFingerprint.toErrorResult()
MusicSettingsPatch.addMusicPreference("navigation", "revanced_hide_cast_button", "true")
return PatchResultSuccess()
}
}

View File

@ -64,6 +64,8 @@ class CompactHeaderPatch : BytecodePatch() {
"invoke-static { v$register }, $MUSIC_SETTINGS_PATH->hideCompactHeader(Landroid/view/View;)V"
)
MusicSettingsPatch.addMusicPreference("navigation", "revanced_hide_compact_header", "true")
patchSuccessArray[0] = true;
}
}

View File

@ -48,6 +48,8 @@ class MinimizedPlayerPatch : BytecodePatch(
}
} ?: return MinimizedPlayerFingerprint.toErrorResult()
MusicSettingsPatch.addMusicPreference("listening", "revanced_enable_force_minimized_player", "true")
return PatchResultSuccess()
}
}

View File

@ -92,6 +92,8 @@ class MiniplayerColorPatch : BytecodePatch(
} ?: return MiniplayerColorFingerprint.toErrorResult()
} ?: return MiniplayerColorParentFingerprint.toErrorResult()
MusicSettingsPatch.addMusicPreference("design", "revanced_enable_color_match_player", "true")
return PatchResultSuccess()
}
private companion object {

View File

@ -158,6 +158,8 @@ class EnforceShufflePatch : BytecodePatch(
)
} ?: return MusicPlaybackControlsFingerprint.toErrorResult()
MusicSettingsPatch.addMusicPreference("listening", "revanced_enable_force_shuffle", "true")
return PatchResultSuccess()
}

View File

@ -43,6 +43,8 @@ class TabletModePatch : BytecodePatch(
)
} ?: return TabletLayoutFingerprint.toErrorResult()
MusicSettingsPatch.addMusicPreference("navigation", "revanced_enable_tablet_mode", "true")
return PatchResultSuccess()
}
}

View File

@ -67,6 +67,8 @@ class ZenModePatch : BytecodePatch(
} ?: return ZenModeFingerprint.toErrorResult()
} ?: return MiniplayerColorParentFingerprint.toErrorResult()
MusicSettingsPatch.addMusicPreference("design", "revanced_enable_zen_mode", "false")
return PatchResultSuccess()
}
}

View File

@ -6,12 +6,15 @@ import app.revanced.patcher.annotation.Version
import app.revanced.patcher.data.ResourceContext
import app.revanced.patcher.patch.PatchResult
import app.revanced.patcher.patch.PatchResultSuccess
import app.revanced.patcher.patch.ResourcePatch
import app.revanced.patcher.patch.annotations.DependsOn
import app.revanced.patcher.patch.annotations.Patch
import app.revanced.patches.music.misc.integrations.patch.MusicIntegrationsPatch
import app.revanced.patches.shared.annotation.YouTubeMusicCompatibility
import app.revanced.util.resources.ResourceUtils.copyXmlNode
import app.revanced.patches.shared.patch.settings.AbstractSettingsResourcePatch
import app.revanced.util.resources.MusicResourceHelper.addMusicPreference
import app.revanced.util.resources.MusicResourceHelper.addMusicPreferenceCategory
import app.revanced.util.resources.MusicResourceHelper.addReVancedMusicPreference
import app.revanced.util.resources.MusicResourceHelper.sortMusicPreferenceCategory
import org.w3c.dom.Element
@Patch
@ -20,14 +23,14 @@ import org.w3c.dom.Element
@DependsOn([MusicIntegrationsPatch::class])
@YouTubeMusicCompatibility
@Version("0.0.1")
class MusicSettingsPatch : ResourcePatch {
class MusicSettingsPatch : AbstractSettingsResourcePatch(
"music/settings",
"music/settings/host",
false
) {
override fun execute(context: ResourceContext): PatchResult {
/*
* Copy strings
*/
context.copyXmlNode("music/settings/host", "values/strings.xml", "resources")
super.execute(context)
contexts = context
/*
* Copy colors
@ -47,19 +50,21 @@ class MusicSettingsPatch : ResourcePatch {
}
}
/*
* Copy preference fragments
*/
context.copyXmlNode("music/settings/host", "xml/settings_headers.xml", "PreferenceScreen")
// Removed since YouTube Music v5.38.xx
try {
context.copyXmlNode("music/settings/host", "xml/settings_prefs_compat.xml", "com.google.android.apps.youtube.music.ui.preference.PreferenceCategoryCompat")
} catch (_: Exception) {}
context.addReVancedMusicPreference()
return PatchResultSuccess()
}
companion object {
private lateinit var contexts: ResourceContext
internal fun addMusicPreference(
category: String,
key: String,
defaultValue: String
) {
contexts.addMusicPreferenceCategory(category)
contexts.sortMusicPreferenceCategory()
contexts.addMusicPreference(category, key, defaultValue)
}
}
}

View File

@ -0,0 +1,129 @@
package app.revanced.util.resources
import app.revanced.extensions.doRecursively
import app.revanced.patcher.data.ResourceContext
import org.w3c.dom.Element
import org.w3c.dom.Node
private fun Node.adoptChild(tagName: String, block: Element.() -> Unit) {
val child = ownerDocument.createElement(tagName)
child.block()
appendChild(child)
}
private fun Node.cloneNodes(parent: Node) {
val node = cloneNode(true)
parent.appendChild(node)
parent.removeChild(this)
}
private fun Node.insertNode(tagName: String, targetNode: Node, block: Element.() -> Unit) {
val child = ownerDocument.createElement(tagName)
child.block()
parentNode.insertBefore(child, targetNode)
}
internal object MusicResourceHelper {
private const val YOUTUBE_MUSIC_SETTINGS_PATH = "res/xml/settings_headers.xml"
private const val YOUTUBE_MUSIC_SETTINGS_KEY = "revanced_extended_settings"
private const val YOUTUBE_MUSIC_CATEGORY_TAG_NAME = "com.google.android.apps.youtube.music.ui.preference.PreferenceCategoryCompat"
private const val YOUTUBE_MUSIC_PREFERENCE_TAG_NAME = "com.google.android.apps.youtube.music.ui.preference.SwitchCompatPreference"
private var currentMusicPreferenceCategory = emptyArray<String>()
private fun setMusicPreferenceCategory (newCategory: String) {
currentMusicPreferenceCategory += listOf(newCategory)
}
internal fun ResourceContext.addMusicPreferenceCategory(
category: String
) {
this.xmlEditor[YOUTUBE_MUSIC_SETTINGS_PATH].use { editor ->
val tags = editor.file.getElementsByTagName("PreferenceScreen")
List(tags.length) { tags.item(it) as Element }
.filter { it.getAttribute("android:key").contains(YOUTUBE_MUSIC_SETTINGS_KEY) }
.forEach {
if (!currentMusicPreferenceCategory.contains(category)) {
it.adoptChild(YOUTUBE_MUSIC_CATEGORY_TAG_NAME) {
setAttribute("android:title", "@string/revanced_category_$category")
setAttribute("android:key", "revanced_settings_$category")
}
setMusicPreferenceCategory(category)
}
}
}
}
internal fun ResourceContext.sortMusicPreferenceCategory() {
this.xmlEditor[YOUTUBE_MUSIC_SETTINGS_PATH].use { editor ->
editor.file.doRecursively loop@{
if (it !is Element) return@loop
currentMusicPreferenceCategory.forEach { category ->
it.getAttributeNode("android:key")?.let { attribute ->
if (attribute.textContent == "revanced_settings_$category") {
it.cloneNodes(it.parentNode)
}
}
}
}
}
}
internal fun ResourceContext.addMusicPreference(
category: String,
key: String,
defaultValue: String
) {
this.xmlEditor[YOUTUBE_MUSIC_SETTINGS_PATH].use { editor ->
val tags = editor.file.getElementsByTagName(YOUTUBE_MUSIC_CATEGORY_TAG_NAME)
List(tags.length) { tags.item(it) as Element }
.filter { it.getAttribute("android:key").contains("revanced_settings_$category") }
.forEach {
it.adoptChild(YOUTUBE_MUSIC_PREFERENCE_TAG_NAME) {
setAttribute("android:title", "@string/$key" + "_title")
setAttribute("android:summary", "@string/$key" + "_summary")
setAttribute("android:key", key)
setAttribute("android:defaultValue", defaultValue)
}
}
}
}
internal fun ResourceContext.addReVancedMusicPreference() {
this.xmlEditor[YOUTUBE_MUSIC_SETTINGS_PATH].use { editor ->
with (editor.file) {
doRecursively loop@{
if (it !is Element) return@loop
it.getAttributeNode("android:key")?.let { attribute ->
if (attribute.textContent == "settings_header_about_youtube_music" && it.getAttributeNode("app:allowDividerBelow").textContent == "false") {
it.insertNode("PreferenceScreen", it) {
setAttribute("android:title", "@string/" + YOUTUBE_MUSIC_SETTINGS_KEY + "_title")
setAttribute("android:summary", "@string/" + YOUTUBE_MUSIC_SETTINGS_KEY + "_summary")
setAttribute("android:key", YOUTUBE_MUSIC_SETTINGS_KEY)
}
it.getAttributeNode("app:allowDividerBelow").textContent = "true"
return@loop
}
}
}
doRecursively loop@{
if (it !is Element) return@loop
it.getAttributeNode("app:allowDividerBelow")?.let { attribute ->
if (attribute.textContent == "true") {
attribute.textContent = "false"
}
}
}
}
}
}
}

View File

@ -21,6 +21,8 @@
<string name="revanced_enable_tablet_mode_title">Enable tablet mode</string>
<string name="revanced_enable_zen_mode_summary">Adds a grey tint to the video player to reduce eye strain.</string>
<string name="revanced_enable_zen_mode_title">Enable zen mode</string>
<string name="revanced_extended_settings_summary">ReVanced Extended specific settings</string>
<string name="revanced_extended_settings_title">ReVanced Extended settings</string>
<string name="revanced_hide_cast_button_summary">Hides the cast button at the top of the homepage and at the top of the player.</string>
<string name="revanced_hide_cast_button_title">Hide cast button</string>
<string name="revanced_hide_compact_header_summary">"Hides the music category bar at the top of the homepage.
@ -29,5 +31,4 @@
<string name="revanced_hide_music_ads_summary">"Hide ads before playing a track.
(requires an app restart)"</string>
<string name="revanced_hide_music_ads_title">Hide music ads</string>
<string name="revanced_revanced_settings_title">ReVanced settings</string>
</resources>

View File

@ -1,24 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto">
<PreferenceScreen android:title="@string/revanced_revanced_settings_title" android:key="revanced_extended_settings" android:summary="ReVanced Music Extended">
<com.google.android.apps.youtube.music.ui.preference.PreferenceCategoryCompat android:title="@string/revanced_category_ads" android:key="revanced_settings_ads">
<com.google.android.apps.youtube.music.ui.preference.SwitchCompatPreference android:title="@string/revanced_hide_music_ads_title" android:key="revanced_hide_music_ads" android:summary="@string/revanced_hide_music_ads_summary" android:defaultValue="true" />
</com.google.android.apps.youtube.music.ui.preference.PreferenceCategoryCompat>
<com.google.android.apps.youtube.music.ui.preference.PreferenceCategoryCompat android:title="@string/revanced_category_design" android:key="revanced_settings_design">
<com.google.android.apps.youtube.music.ui.preference.SwitchCompatPreference android:title="@string/revanced_enable_black_navbar_title" android:key="revanced_enable_black_navbar" android:summary="@string/revanced_enable_black_navbar_summary" android:defaultValue="true" />
<com.google.android.apps.youtube.music.ui.preference.SwitchCompatPreference android:title="@string/revanced_enable_color_match_player_title" android:key="revanced_enable_color_match_player" android:summary="@string/revanced_enable_color_match_player_summary" android:defaultValue="true" />
<com.google.android.apps.youtube.music.ui.preference.SwitchCompatPreference android:title="@string/revanced_enable_zen_mode_title" android:key="revanced_enable_zen_mode" android:summary="@string/revanced_enable_zen_mode_summary" android:defaultValue="false" />
</com.google.android.apps.youtube.music.ui.preference.PreferenceCategoryCompat>
<com.google.android.apps.youtube.music.ui.preference.PreferenceCategoryCompat android:title="@string/revanced_category_listening" android:key="revanced_settings_listening">
<com.google.android.apps.youtube.music.ui.preference.SwitchCompatPreference android:title="@string/revanced_enable_opus_codec_title" android:key="revanced_enable_opus_codec" android:summary="@string/revanced_enable_opus_codec_summary" android:defaultValue="true" />
<com.google.android.apps.youtube.music.ui.preference.SwitchCompatPreference android:title="@string/revanced_enable_force_minimized_player_title" android:key="revanced_enable_force_minimized_player" android:summary="@string/revanced_enable_force_minimized_player_summary" android:defaultValue="true" />
<com.google.android.apps.youtube.music.ui.preference.SwitchCompatPreference android:title="@string/revanced_enable_force_shuffle_title" android:key="revanced_enable_force_shuffle" android:summary="@string/revanced_enable_force_shuffle_summary" android:defaultValue="true" />
</com.google.android.apps.youtube.music.ui.preference.PreferenceCategoryCompat>
<com.google.android.apps.youtube.music.ui.preference.PreferenceCategoryCompat android:title="@string/revanced_category_navigation" android:key="revanced_settings_navigation">
<com.google.android.apps.youtube.music.ui.preference.SwitchCompatPreference android:title="@string/revanced_hide_cast_button_title" android:key="revanced_hide_cast_button" android:summary="@string/revanced_hide_cast_button_summary" android:defaultValue="true" />
<com.google.android.apps.youtube.music.ui.preference.SwitchCompatPreference android:title="@string/revanced_hide_compact_header_title" android:key="revanced_hide_compact_header" android:summary="@string/revanced_hide_compact_header_summary" android:defaultValue="true" />
<com.google.android.apps.youtube.music.ui.preference.SwitchCompatPreference android:title="@string/revanced_enable_tablet_mode_title" android:key="revanced_enable_tablet_mode" android:summary="@string/revanced_enable_tablet_mode_summary" android:defaultValue="true" />
</com.google.android.apps.youtube.music.ui.preference.PreferenceCategoryCompat>
</PreferenceScreen>
</PreferenceScreen>

View File

@ -1,23 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<com.google.android.apps.youtube.music.ui.preference.PreferenceCategoryCompat>
<PreferenceScreen android:title="@string/revanced_revanced_settings_title" android:key="revanced_extended_settings" android:summary="ReVanced Music Extended">
<com.google.android.apps.youtube.music.ui.preference.PreferenceCategoryCompat android:title="@string/revanced_category_ads" android:key="revanced_settings_ads">
<com.google.android.apps.youtube.music.ui.preference.SwitchCompatPreference android:title="@string/revanced_hide_music_ads_title" android:key="revanced_hide_music_ads" android:summary="@string/revanced_hide_music_ads_summary" android:defaultValue="true" />
</com.google.android.apps.youtube.music.ui.preference.PreferenceCategoryCompat>
<com.google.android.apps.youtube.music.ui.preference.PreferenceCategoryCompat android:title="@string/revanced_category_design" android:key="revanced_settings_design">
<com.google.android.apps.youtube.music.ui.preference.SwitchCompatPreference android:title="@string/revanced_enable_black_navbar_title" android:key="revanced_enable_black_navbar" android:summary="@string/revanced_enable_black_navbar_summary" android:defaultValue="true" />
<com.google.android.apps.youtube.music.ui.preference.SwitchCompatPreference android:title="@string/revanced_enable_color_match_player_title" android:key="revanced_enable_color_match_player" android:summary="@string/revanced_enable_color_match_player_summary" android:defaultValue="true" />
<com.google.android.apps.youtube.music.ui.preference.SwitchCompatPreference android:title="@string/revanced_enable_zen_mode_title" android:key="revanced_enable_zen_mode" android:summary="@string/revanced_enable_zen_mode_summary" android:defaultValue="false" />
</com.google.android.apps.youtube.music.ui.preference.PreferenceCategoryCompat>
<com.google.android.apps.youtube.music.ui.preference.PreferenceCategoryCompat android:title="@string/revanced_category_listening" android:key="revanced_settings_listening">
<com.google.android.apps.youtube.music.ui.preference.SwitchCompatPreference android:title="@string/revanced_enable_opus_codec_title" android:key="revanced_enable_opus_codec" android:summary="@string/revanced_enable_opus_codec_summary" android:defaultValue="true" />
<com.google.android.apps.youtube.music.ui.preference.SwitchCompatPreference android:title="@string/revanced_enable_force_minimized_player_title" android:key="revanced_enable_force_minimized_player" android:summary="@string/revanced_enable_force_minimized_player_summary" android:defaultValue="true" />
<com.google.android.apps.youtube.music.ui.preference.SwitchCompatPreference android:title="@string/revanced_enable_force_shuffle_title" android:key="revanced_enable_force_shuffle" android:summary="@string/revanced_enable_force_shuffle_summary" android:defaultValue="true" />
</com.google.android.apps.youtube.music.ui.preference.PreferenceCategoryCompat>
<com.google.android.apps.youtube.music.ui.preference.PreferenceCategoryCompat android:title="@string/revanced_category_navigation" android:key="revanced_settings_navigation">
<com.google.android.apps.youtube.music.ui.preference.SwitchCompatPreference android:title="@string/revanced_hide_cast_button_title" android:key="revanced_hide_cast_button" android:summary="@string/revanced_hide_cast_button_summary" android:defaultValue="true" />
<com.google.android.apps.youtube.music.ui.preference.SwitchCompatPreference android:title="@string/revanced_hide_compact_header_title" android:key="revanced_hide_compact_header" android:summary="@string/revanced_hide_compact_header_summary" android:defaultValue="true" />
<com.google.android.apps.youtube.music.ui.preference.SwitchCompatPreference android:title="@string/revanced_enable_tablet_mode_title" android:key="revanced_enable_tablet_mode" android:summary="@string/revanced_enable_tablet_mode_summary" android:defaultValue="true" />
</com.google.android.apps.youtube.music.ui.preference.PreferenceCategoryCompat>
</PreferenceScreen>
</com.google.android.apps.youtube.music.ui.preference.PreferenceCategoryCompat>