diff --git a/src/main/kotlin/app/revanced/patches/music/utils/returnyoutubedislike/resource/patch/ReturnYouTubeDislikePatch.kt b/src/main/kotlin/app/revanced/patches/music/utils/returnyoutubedislike/resource/patch/ReturnYouTubeDislikePatch.kt index b6b2dbe2f..b08389001 100644 --- a/src/main/kotlin/app/revanced/patches/music/utils/returnyoutubedislike/resource/patch/ReturnYouTubeDislikePatch.kt +++ b/src/main/kotlin/app/revanced/patches/music/utils/returnyoutubedislike/resource/patch/ReturnYouTubeDislikePatch.kt @@ -9,9 +9,10 @@ import app.revanced.patcher.patch.annotations.Patch import app.revanced.patches.music.utils.annotations.MusicCompatibility import app.revanced.patches.music.utils.returnyoutubedislike.bytecode.patch.ReturnYouTubeDislikeBytecodePatch import app.revanced.patches.music.utils.settings.resource.patch.SettingsPatch -import app.revanced.util.resources.MusicResourceHelper.hookPreference -import app.revanced.util.resources.ResourceUtils -import app.revanced.util.resources.ResourceUtils.copyResources +import app.revanced.util.resources.MusicResourceHelper.RETURN_YOUTUBE_DISLIKE_SETTINGS_KEY +import app.revanced.util.resources.MusicResourceHelper.addReVancedMusicPreference +import org.w3c.dom.Element +import org.w3c.dom.Node @Patch @Name("Return YouTube Dislike") @@ -26,35 +27,93 @@ import app.revanced.util.resources.ResourceUtils.copyResources class ReturnYouTubeDislikePatch : ResourcePatch { override fun execute(context: ResourceContext) { - /** - * Copy preference - */ - arrayOf( - ResourceUtils.ResourceGroup( - "xml", - "returnyoutubedislike_prefs.xml" - ) - ).forEach { resourceGroup -> - context.copyResources("music/returnyoutubedislike", resourceGroup) - } - - /** - * Hook RYD preference - */ - context.hookPreference( - "revanced_ryd_settings", - "com.google.android.apps.youtube.music.settings.fragment.AdvancedPrefsFragmentCompat" - ) - - val publicFile = context["res/values/public.xml"] - - publicFile.writeText( - publicFile.readText() - .replace( - "\"advanced_prefs_compat\"", - "\"returnyoutubedislike_prefs\"" - ) - ) + context.addReVancedMusicPreference(RETURN_YOUTUBE_DISLIKE_SETTINGS_KEY) + context.addSwitchPreference("revanced_ryd_enabled", "true") + context.addSwitchPreference("revanced_ryd_dislike_percentage", "false", "revanced_ryd_enabled") + context.addSwitchPreference("revanced_ryd_compact_layout", "false", "revanced_ryd_enabled") + context.addPreferenceCategory("revanced_ryd_about") + context.addAboutPreference("revanced_ryd_attribution") } + + private companion object { + const val YOUTUBE_MUSIC_SETTINGS_PATH = "res/xml/settings_headers.xml" + const val SWITCH_PREFERENCE_TAG_NAME = + "com.google.android.apps.youtube.music.ui.preference.SwitchCompatPreference" + const val PREFERENCE_CATEGORY_TAG_NAME = + "com.google.android.apps.youtube.music.ui.preference.PreferenceCategoryCompat" + + private fun Node.adoptChild(tagName: String, block: Element.() -> Unit) { + val child = ownerDocument.createElement(tagName) + child.block() + appendChild(child) + } + + fun ResourceContext.addAboutPreference( + key: String + ) { + this.xmlEditor[YOUTUBE_MUSIC_SETTINGS_PATH].use { editor -> + val tags = editor.file.getElementsByTagName(PREFERENCE_CATEGORY_TAG_NAME) + List(tags.length) { tags.item(it) as Element } + .filter { it.getAttribute("android:key").contains("revanced_ryd_about") } + .forEach { + it.adoptChild("Preference") { + setAttribute("android:title", "@string/$key" + "_title") + setAttribute("android:summary", "@string/$key" + "_summary") + setAttribute("android:key", key) + this.adoptChild("intent") { + setAttribute("android:action", "android.intent.action.VIEW") + setAttribute("android:data", "https://returnyoutubedislike.com") + } + } + } + } + } + + fun ResourceContext.addPreferenceCategory( + 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(RETURN_YOUTUBE_DISLIKE_SETTINGS_KEY) } + .forEach { + it.adoptChild(PREFERENCE_CATEGORY_TAG_NAME) { + setAttribute("android:title", "@string/$category") + setAttribute("android:key", category) + } + } + } + } + + fun ResourceContext.addSwitchPreference( + key: String, + defaultValue: String + ) { + addSwitchPreference(key, defaultValue, "") + } + + fun ResourceContext.addSwitchPreference( + key: String, + defaultValue: String, + dependencyKey: 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(RETURN_YOUTUBE_DISLIKE_SETTINGS_KEY) } + .forEach { + it.adoptChild(SWITCH_PREFERENCE_TAG_NAME) { + setAttribute("android:title", "@string/$key" + "_title") + setAttribute("android:summary", "@string/$key" + "_summary") + setAttribute("android:key", key) + if (dependencyKey.isNotEmpty()) { + setAttribute("android:dependency", dependencyKey) + } + setAttribute("android:defaultValue", defaultValue) + } + } + } + } + } } \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/util/resources/MusicResourceHelper.kt b/src/main/kotlin/app/revanced/util/resources/MusicResourceHelper.kt index 04de4bbf4..92a6e80a9 100644 --- a/src/main/kotlin/app/revanced/util/resources/MusicResourceHelper.kt +++ b/src/main/kotlin/app/revanced/util/resources/MusicResourceHelper.kt @@ -31,6 +31,8 @@ internal object MusicResourceHelper { internal const val YOUTUBE_MUSIC_SETTINGS_KEY = "revanced_extended_settings" + internal const val RETURN_YOUTUBE_DISLIKE_SETTINGS_KEY = "revanced_ryd_settings" + private const val YOUTUBE_MUSIC_PREFERENCE_SCREEN_TAG_NAME = "PreferenceScreen" @@ -40,7 +42,7 @@ internal object MusicResourceHelper { private const val YOUTUBE_MUSIC_PREFERENCE_TARGET_CLASS = "com.google.android.libraries.strictmode.penalties.notification.FullStackTraceActivity" - private var targetPackage = "com.google.android.apps.youtube.music" + internal var targetPackage = "com.google.android.apps.youtube.music" internal fun ResourceContext.setMicroG(newPackage: String) { targetPackage = newPackage diff --git a/src/main/resources/music/returnyoutubedislike/xml/returnyoutubedislike_prefs.xml b/src/main/resources/music/returnyoutubedislike/xml/returnyoutubedislike_prefs.xml deleted file mode 100644 index 337246087..000000000 --- a/src/main/resources/music/returnyoutubedislike/xml/returnyoutubedislike_prefs.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - \ No newline at end of file