mirror of
https://github.com/inotia00/revanced-patches.git
synced 2025-05-29 21:30:19 +02:00
feat(reddit/reddit-settings): preferences are added to settings only when options.json
values are specified
This commit is contained in:
parent
d771589db1
commit
498e5d2001
@ -16,8 +16,8 @@ import app.revanced.patcher.util.smali.ExternalLabel
|
|||||||
import app.revanced.patches.reddit.layout.screenshotpopup.fingerprints.ScreenshotTakenBannerFingerprint
|
import app.revanced.patches.reddit.layout.screenshotpopup.fingerprints.ScreenshotTakenBannerFingerprint
|
||||||
import app.revanced.patches.reddit.utils.annotations.RedditCompatibility
|
import app.revanced.patches.reddit.utils.annotations.RedditCompatibility
|
||||||
import app.revanced.patches.reddit.utils.resourceid.patch.SharedResourceIdPatch
|
import app.revanced.patches.reddit.utils.resourceid.patch.SharedResourceIdPatch
|
||||||
import app.revanced.patches.reddit.utils.settings.bytecode.patch.SettingsPatch
|
import app.revanced.patches.reddit.utils.settings.bytecode.patch.SettingsBytecodePatch.Companion.updateSettingsStatus
|
||||||
import app.revanced.patches.reddit.utils.settings.bytecode.patch.SettingsPatch.Companion.updateSettingsStatus
|
import app.revanced.patches.reddit.utils.settings.resource.patch.SettingsPatch
|
||||||
|
|
||||||
@Patch
|
@Patch
|
||||||
@Name("disable-screenshot-popup")
|
@Name("disable-screenshot-popup")
|
||||||
|
@ -13,8 +13,8 @@ import app.revanced.patcher.patch.annotations.DependsOn
|
|||||||
import app.revanced.patcher.patch.annotations.Patch
|
import app.revanced.patcher.patch.annotations.Patch
|
||||||
import app.revanced.patches.reddit.misc.openlink.fingerprints.ScreenNavigatorFingerprint
|
import app.revanced.patches.reddit.misc.openlink.fingerprints.ScreenNavigatorFingerprint
|
||||||
import app.revanced.patches.reddit.utils.annotations.RedditCompatibility
|
import app.revanced.patches.reddit.utils.annotations.RedditCompatibility
|
||||||
import app.revanced.patches.reddit.utils.settings.bytecode.patch.SettingsPatch
|
import app.revanced.patches.reddit.utils.settings.bytecode.patch.SettingsBytecodePatch.Companion.updateSettingsStatus
|
||||||
import app.revanced.patches.reddit.utils.settings.bytecode.patch.SettingsPatch.Companion.updateSettingsStatus
|
import app.revanced.patches.reddit.utils.settings.resource.patch.SettingsPatch
|
||||||
|
|
||||||
@Patch
|
@Patch
|
||||||
@Name("open-links-directly")
|
@Name("open-links-directly")
|
||||||
|
@ -15,8 +15,8 @@ import app.revanced.patcher.patch.annotations.Patch
|
|||||||
import app.revanced.patcher.util.smali.ExternalLabel
|
import app.revanced.patcher.util.smali.ExternalLabel
|
||||||
import app.revanced.patches.reddit.misc.openlink.fingerprints.ScreenNavigatorFingerprint
|
import app.revanced.patches.reddit.misc.openlink.fingerprints.ScreenNavigatorFingerprint
|
||||||
import app.revanced.patches.reddit.utils.annotations.RedditCompatibility
|
import app.revanced.patches.reddit.utils.annotations.RedditCompatibility
|
||||||
import app.revanced.patches.reddit.utils.settings.bytecode.patch.SettingsPatch
|
import app.revanced.patches.reddit.utils.settings.bytecode.patch.SettingsBytecodePatch.Companion.updateSettingsStatus
|
||||||
import app.revanced.patches.reddit.utils.settings.bytecode.patch.SettingsPatch.Companion.updateSettingsStatus
|
import app.revanced.patches.reddit.utils.settings.resource.patch.SettingsPatch
|
||||||
import app.revanced.util.bytecode.getStringIndex
|
import app.revanced.util.bytecode.getStringIndex
|
||||||
|
|
||||||
@Patch
|
@Patch
|
||||||
|
@ -15,8 +15,8 @@ import app.revanced.patcher.patch.annotations.Patch
|
|||||||
import app.revanced.patcher.util.smali.ExternalLabel
|
import app.revanced.patcher.util.smali.ExternalLabel
|
||||||
import app.revanced.patches.reddit.misc.tracking.url.fingerprints.ShareLinkFormatterFingerprint
|
import app.revanced.patches.reddit.misc.tracking.url.fingerprints.ShareLinkFormatterFingerprint
|
||||||
import app.revanced.patches.reddit.utils.annotations.RedditCompatibility
|
import app.revanced.patches.reddit.utils.annotations.RedditCompatibility
|
||||||
import app.revanced.patches.reddit.utils.settings.bytecode.patch.SettingsPatch
|
import app.revanced.patches.reddit.utils.settings.bytecode.patch.SettingsBytecodePatch.Companion.updateSettingsStatus
|
||||||
import app.revanced.patches.reddit.utils.settings.bytecode.patch.SettingsPatch.Companion.updateSettingsStatus
|
import app.revanced.patches.reddit.utils.settings.resource.patch.SettingsPatch
|
||||||
|
|
||||||
@Patch
|
@Patch
|
||||||
@Name("sanitize-sharing-links")
|
@Name("sanitize-sharing-links")
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
package app.revanced.patches.reddit.utils.settings.bytecode.patch
|
package app.revanced.patches.reddit.utils.settings.bytecode.patch
|
||||||
|
|
||||||
import app.revanced.extensions.toErrorResult
|
import app.revanced.extensions.toErrorResult
|
||||||
import app.revanced.patcher.annotation.Description
|
|
||||||
import app.revanced.patcher.annotation.Name
|
import app.revanced.patcher.annotation.Name
|
||||||
import app.revanced.patcher.annotation.Version
|
import app.revanced.patcher.annotation.Version
|
||||||
import app.revanced.patcher.data.BytecodeContext
|
import app.revanced.patcher.data.BytecodeContext
|
||||||
@ -10,27 +9,16 @@ import app.revanced.patcher.extensions.InstructionExtensions.addInstructions
|
|||||||
import app.revanced.patcher.patch.BytecodePatch
|
import app.revanced.patcher.patch.BytecodePatch
|
||||||
import app.revanced.patcher.patch.PatchResult
|
import app.revanced.patcher.patch.PatchResult
|
||||||
import app.revanced.patcher.patch.PatchResultSuccess
|
import app.revanced.patcher.patch.PatchResultSuccess
|
||||||
import app.revanced.patcher.patch.annotations.DependsOn
|
|
||||||
import app.revanced.patcher.patch.annotations.Patch
|
|
||||||
import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod
|
import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod
|
||||||
import app.revanced.patches.reddit.utils.annotations.RedditCompatibility
|
import app.revanced.patches.reddit.utils.annotations.RedditCompatibility
|
||||||
import app.revanced.patches.reddit.utils.integrations.patch.IntegrationsPatch
|
|
||||||
import app.revanced.patches.reddit.utils.settings.bytecode.fingerprints.OssLicensesMenuActivityOnCreateFingerprint
|
import app.revanced.patches.reddit.utils.settings.bytecode.fingerprints.OssLicensesMenuActivityOnCreateFingerprint
|
||||||
import app.revanced.patches.reddit.utils.settings.bytecode.fingerprints.SettingsStatusLoadFingerprint
|
import app.revanced.patches.reddit.utils.settings.bytecode.fingerprints.SettingsStatusLoadFingerprint
|
||||||
import app.revanced.patches.reddit.utils.settings.resource.patch.SettingsResourcePatch
|
import kotlin.properties.Delegates
|
||||||
|
|
||||||
@Patch
|
@Name("settings-bytecode-patch")
|
||||||
@Name("settings")
|
|
||||||
@Description("Adds ReVanced settings to Reddit.")
|
|
||||||
@DependsOn(
|
|
||||||
[
|
|
||||||
IntegrationsPatch::class,
|
|
||||||
SettingsResourcePatch::class
|
|
||||||
]
|
|
||||||
)
|
|
||||||
@RedditCompatibility
|
@RedditCompatibility
|
||||||
@Version("0.0.1")
|
@Version("0.0.1")
|
||||||
class SettingsPatch : BytecodePatch(
|
class SettingsBytecodePatch : BytecodePatch(
|
||||||
listOf(
|
listOf(
|
||||||
OssLicensesMenuActivityOnCreateFingerprint,
|
OssLicensesMenuActivityOnCreateFingerprint,
|
||||||
SettingsStatusLoadFingerprint
|
SettingsStatusLoadFingerprint
|
||||||
@ -39,19 +27,11 @@ class SettingsPatch : BytecodePatch(
|
|||||||
override fun execute(context: BytecodeContext): PatchResult {
|
override fun execute(context: BytecodeContext): PatchResult {
|
||||||
|
|
||||||
OssLicensesMenuActivityOnCreateFingerprint.result?.let {
|
OssLicensesMenuActivityOnCreateFingerprint.result?.let {
|
||||||
it.mutableMethod.apply {
|
activityMethod = it.mutableMethod
|
||||||
val insertIndex = it.scanResult.patternScanResult!!.startIndex + 1
|
activityIndex = it.scanResult.patternScanResult!!.startIndex + 1
|
||||||
|
|
||||||
addInstructions(
|
|
||||||
insertIndex, """
|
|
||||||
invoke-static {p0}, $INTEGRATIONS_METHOD_DESCRIPTOR
|
|
||||||
return-void
|
|
||||||
"""
|
|
||||||
)
|
|
||||||
}
|
|
||||||
} ?: return OssLicensesMenuActivityOnCreateFingerprint.toErrorResult()
|
} ?: return OssLicensesMenuActivityOnCreateFingerprint.toErrorResult()
|
||||||
|
|
||||||
targetMethod = SettingsStatusLoadFingerprint.result?.mutableMethod
|
settingsMethod = SettingsStatusLoadFingerprint.result?.mutableMethod
|
||||||
?: return SettingsStatusLoadFingerprint.toErrorResult()
|
?: return SettingsStatusLoadFingerprint.toErrorResult()
|
||||||
|
|
||||||
return PatchResultSuccess()
|
return PatchResultSuccess()
|
||||||
@ -61,10 +41,23 @@ class SettingsPatch : BytecodePatch(
|
|||||||
private const val INTEGRATIONS_METHOD_DESCRIPTOR =
|
private const val INTEGRATIONS_METHOD_DESCRIPTOR =
|
||||||
"Lapp/revanced/reddit/settingsmenu/ReVancedSettingActivity;->initializeSettings(Landroid/app/Activity;)V"
|
"Lapp/revanced/reddit/settingsmenu/ReVancedSettingActivity;->initializeSettings(Landroid/app/Activity;)V"
|
||||||
|
|
||||||
private lateinit var targetMethod: MutableMethod
|
private lateinit var activityMethod: MutableMethod
|
||||||
|
private var activityIndex by Delegates.notNull<Int>()
|
||||||
|
private lateinit var settingsMethod: MutableMethod
|
||||||
|
|
||||||
|
fun injectActivity() {
|
||||||
|
activityMethod.apply {
|
||||||
|
addInstructions(
|
||||||
|
activityIndex, """
|
||||||
|
invoke-static {p0}, $INTEGRATIONS_METHOD_DESCRIPTOR
|
||||||
|
return-void
|
||||||
|
"""
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fun updateSettingsStatus(description: String) {
|
fun updateSettingsStatus(description: String) {
|
||||||
targetMethod.apply {
|
settingsMethod.apply {
|
||||||
addInstruction(
|
addInstruction(
|
||||||
0,
|
0,
|
||||||
"invoke-static {}, Lapp/revanced/reddit/settingsmenu/SettingsStatus;->$description()V"
|
"invoke-static {}, Lapp/revanced/reddit/settingsmenu/SettingsStatus;->$description()V"
|
@ -0,0 +1,122 @@
|
|||||||
|
package app.revanced.patches.reddit.utils.settings.resource.patch
|
||||||
|
|
||||||
|
import app.revanced.patcher.annotation.Description
|
||||||
|
import app.revanced.patcher.annotation.Name
|
||||||
|
import app.revanced.patcher.annotation.Version
|
||||||
|
import app.revanced.patcher.data.ResourceContext
|
||||||
|
import app.revanced.patcher.patch.OptionsContainer
|
||||||
|
import app.revanced.patcher.patch.PatchOption
|
||||||
|
import app.revanced.patcher.patch.PatchResult
|
||||||
|
import app.revanced.patcher.patch.PatchResultError
|
||||||
|
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.reddit.utils.annotations.RedditCompatibility
|
||||||
|
import app.revanced.patches.reddit.utils.integrations.patch.IntegrationsPatch
|
||||||
|
import app.revanced.patches.reddit.utils.settings.bytecode.patch.SettingsBytecodePatch
|
||||||
|
import app.revanced.util.resources.ResourceUtils.copyXmlNode
|
||||||
|
import java.io.FileWriter
|
||||||
|
import java.nio.file.Files
|
||||||
|
import kotlin.io.path.exists
|
||||||
|
|
||||||
|
@Patch
|
||||||
|
@Name("reddit-settings")
|
||||||
|
@Description("Adds ReVanced settings to Reddit.")
|
||||||
|
@DependsOn(
|
||||||
|
[
|
||||||
|
IntegrationsPatch::class,
|
||||||
|
SettingsBytecodePatch::class
|
||||||
|
]
|
||||||
|
)
|
||||||
|
@RedditCompatibility
|
||||||
|
@Version("0.0.1")
|
||||||
|
class SettingsPatch : ResourcePatch {
|
||||||
|
override fun execute(context: ResourceContext): PatchResult {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* For some reason, when you try to compile in ReVanced Manager you'll get an error
|
||||||
|
* It is presumed to be an APKTOOL issue, but it cannot be fixed right now
|
||||||
|
* So it has been changed so that settings can be added only through options.json
|
||||||
|
*/
|
||||||
|
if (!AddRedditSettings.equals("true"))
|
||||||
|
return PatchResultSuccess()
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Copy strings.xml
|
||||||
|
*/
|
||||||
|
context.copyXmlNode("reddit/settings/host", "values/strings.xml", "resources")
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initialize settings activity
|
||||||
|
*/
|
||||||
|
SettingsBytecodePatch.injectActivity()
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Replace settings icon
|
||||||
|
*/
|
||||||
|
arrayOf("preferences", "preferences_logged_in").forEach { targetXML ->
|
||||||
|
val resDirectory = context["res"]
|
||||||
|
val targetXml = resDirectory.resolve("xml").resolve("$targetXML.xml").toPath()
|
||||||
|
|
||||||
|
if (!targetXml.exists())
|
||||||
|
return PatchResultError("The preferences can not be found.")
|
||||||
|
|
||||||
|
val preference = context["res/xml/$targetXML.xml"]
|
||||||
|
|
||||||
|
preference.writeText(
|
||||||
|
preference.readText()
|
||||||
|
.replace(
|
||||||
|
"\"@drawable/icon_text_post\" android:title=\"@string/label_acknowledgements\"",
|
||||||
|
"\"@drawable/icon_beta_planet\" android:title=\"@string/label_acknowledgements\""
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Replace settings label
|
||||||
|
*/
|
||||||
|
val resDirectory = context["res"]
|
||||||
|
if (!resDirectory.isDirectory)
|
||||||
|
return PatchResultError("The res folder can not be found.")
|
||||||
|
|
||||||
|
arrayOf(
|
||||||
|
"values",
|
||||||
|
"values-de-rDE",
|
||||||
|
"values-en-rXA",
|
||||||
|
"values-es-rES",
|
||||||
|
"values-es-rMX",
|
||||||
|
"values-fr-rCA",
|
||||||
|
"values-fr-rFR",
|
||||||
|
"values-it-rIT",
|
||||||
|
"values-nl-rNL",
|
||||||
|
"values-pt-rBR",
|
||||||
|
"values-pt-rPT",
|
||||||
|
"values-sv-rSE"
|
||||||
|
).forEach { path ->
|
||||||
|
val directory = resDirectory.resolve("$path-v21")
|
||||||
|
Files.createDirectories(directory.toPath())
|
||||||
|
|
||||||
|
FileWriter(directory.resolve("strings.xml")).use {
|
||||||
|
it.write("<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"no\"?><resources><string name=\"label_acknowledgements\">ReVanced Extended</string></resources>")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return PatchResultSuccess()
|
||||||
|
}
|
||||||
|
|
||||||
|
companion object : OptionsContainer() {
|
||||||
|
internal var AddRedditSettings: String? by option(
|
||||||
|
PatchOption.StringOption(
|
||||||
|
key = "AddRedditSettings",
|
||||||
|
default = "false",
|
||||||
|
title = "Add settings to Reddit",
|
||||||
|
description = "Defaults to false to avoid exceptions in ReVanced Manager"
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
@ -1,72 +0,0 @@
|
|||||||
package app.revanced.patches.reddit.utils.settings.resource.patch
|
|
||||||
|
|
||||||
import app.revanced.extensions.doRecursively
|
|
||||||
import app.revanced.extensions.startsWithAny
|
|
||||||
import app.revanced.patcher.annotation.Name
|
|
||||||
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.patches.shared.patch.settings.AbstractSettingsResourcePatch
|
|
||||||
import org.w3c.dom.Element
|
|
||||||
import kotlin.io.path.exists
|
|
||||||
|
|
||||||
@Name("settings-resource-patch")
|
|
||||||
@Version("0.0.1")
|
|
||||||
class SettingsResourcePatch : AbstractSettingsResourcePatch(
|
|
||||||
"reddit/settings",
|
|
||||||
"reddit/settings/host",
|
|
||||||
false
|
|
||||||
) {
|
|
||||||
override fun execute(context: ResourceContext): PatchResult {
|
|
||||||
super.execute(context)
|
|
||||||
|
|
||||||
fun setIcon(targetXML: String) {
|
|
||||||
context.xmlEditor["res/xml/$targetXML.xml"].use { editor ->
|
|
||||||
editor.file.doRecursively loop@{
|
|
||||||
if (it !is Element) return@loop
|
|
||||||
|
|
||||||
it.getAttributeNode("android:key")?.let { attribute ->
|
|
||||||
if (attribute.textContent.endsWith("key_pref_acknowledgements")) {
|
|
||||||
it.getAttributeNode("android:icon").textContent =
|
|
||||||
"@drawable/icon_beta_planet"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
arrayOf("preferences", "preferences_logged_in").forEach { targetXML ->
|
|
||||||
val resDirectory = context["res"]
|
|
||||||
val targetXml = resDirectory.resolve("xml").resolve("$targetXML.xml").toPath()
|
|
||||||
|
|
||||||
if (targetXml.exists())
|
|
||||||
setIcon(targetXML)
|
|
||||||
}
|
|
||||||
|
|
||||||
// App name
|
|
||||||
val resourceFileNames = arrayOf("strings.xml")
|
|
||||||
|
|
||||||
context.forEach {
|
|
||||||
if (!it.name.startsWithAny(*resourceFileNames)) return@forEach
|
|
||||||
|
|
||||||
// for each file in the "layouts" directory replace all necessary attributes content
|
|
||||||
context.xmlEditor[it.absolutePath].use { editor ->
|
|
||||||
val resourcesNode = editor.file.getElementsByTagName("resources").item(0) as Element
|
|
||||||
|
|
||||||
for (i in 0 until resourcesNode.childNodes.length) {
|
|
||||||
val node = resourcesNode.childNodes.item(i)
|
|
||||||
if (node !is Element) continue
|
|
||||||
|
|
||||||
val element = resourcesNode.childNodes.item(i) as Element
|
|
||||||
element.textContent = when (element.getAttribute("name")) {
|
|
||||||
"label_acknowledgements" -> "@string/revanced_extended_settings_title"
|
|
||||||
else -> continue
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return PatchResultSuccess()
|
|
||||||
}
|
|
||||||
}
|
|
Loading…
x
Reference in New Issue
Block a user