Skip to content

Commit

Permalink
Migrate changes from old repo branch
Browse files Browse the repository at this point in the history
  • Loading branch information
LisoUseInAIKyrios committed Dec 15, 2023
1 parent 7d6340c commit d41d14e
Show file tree
Hide file tree
Showing 253 changed files with 6,665 additions and 2,044 deletions.
148 changes: 86 additions & 62 deletions api/revanced-patches.api

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ package app.revanced.patches.music.misc.gms

import app.revanced.patches.music.misc.gms.Constants.MUSIC_PACKAGE_NAME
import app.revanced.patches.music.misc.gms.Constants.REVANCED_MUSIC_PACKAGE_NAME
import app.revanced.patches.music.misc.gms.GmsCoreSupportResourcePatch.gmsCoreVendorOption
import app.revanced.patches.music.misc.gms.YTMusicGmsCoreSupportResourcePatch.gmsCoreVendorOption
import app.revanced.patches.music.misc.gms.fingerprints.*
import app.revanced.patches.shared.misc.gms.AbstractGmsCoreSupportPatch
import app.revanced.patches.youtube.misc.gms.fingerprints.CastContextFetchFingerprint
Expand All @@ -19,7 +19,7 @@ object GmsCoreSupportPatch : AbstractGmsCoreSupportPatch(
CastDynamiteModuleV2Fingerprint,
CastContextFetchFingerprint,
),
abstractGmsCoreSupportResourcePatch = GmsCoreSupportResourcePatch,
abstractGmsCoreSupportResourcePatch = YTMusicGmsCoreSupportResourcePatch,
compatiblePackages = setOf(CompatiblePackage("com.google.android.apps.youtube.music")),
fingerprints = setOf(
ServiceCheckFingerprint,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,18 @@
package app.revanced.patches.music.misc.gms

import app.revanced.patcher.data.ResourceContext
import app.revanced.patches.music.misc.gms.Constants.MUSIC_PACKAGE_NAME
import app.revanced.patches.music.misc.gms.Constants.REVANCED_MUSIC_PACKAGE_NAME
import app.revanced.patches.youtube.misc.strings.StringsPatch
import app.revanced.patches.shared.misc.gms.AbstractGmsCoreSupportResourcePatch

object GmsCoreSupportResourcePatch : AbstractGmsCoreSupportResourcePatch(
object YTMusicGmsCoreSupportResourcePatch : AbstractGmsCoreSupportResourcePatch(
fromPackageName = MUSIC_PACKAGE_NAME,
toPackageName = REVANCED_MUSIC_PACKAGE_NAME,
spoofedPackageSignature = "afb0fed5eeaebdd86f56a97742f4b6b33ef59875"
)
) {
override fun execute(context: ResourceContext) {
// Strings used by different target apps.
StringsPatch.includeSharedPatchStrings("GmsCoreSupport");
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package app.revanced.patches.music.misc.strings

import app.revanced.patches.shared.strings.AbstractStringsResourcePatch

object StringsPatch : AbstractStringsResourcePatch(
"music/stringspatch/values"
)
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ import app.revanced.patcher.data.ResourceContext
import app.revanced.patcher.patch.ResourcePatch
import app.revanced.patcher.patch.options.PatchOption.PatchExtensions.stringPatchOption
import app.revanced.patches.all.misc.packagename.ChangePackageNamePatch
import app.revanced.util.mergeStrings
import org.w3c.dom.Element
import org.w3c.dom.Node

Expand Down Expand Up @@ -39,7 +38,6 @@ abstract class AbstractGmsCoreSupportResourcePatch(
protected val gmsCoreVendor by gmsCoreVendorOption

override fun execute(context: ResourceContext) {
context.mergeStrings("gms/host/values/strings.xml")
context.patchManifest()
context.addSpoofingMetadata()
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,9 @@ import app.revanced.patcher.data.ResourceContext
import app.revanced.patcher.patch.ResourcePatch
import app.revanced.patcher.util.DomFileEditor
import app.revanced.patches.shared.settings.preference.BasePreference
import app.revanced.patches.shared.settings.preference.BaseResource
import app.revanced.patches.shared.settings.preference.addPreference
import app.revanced.patches.shared.settings.preference.addResource
import app.revanced.patches.shared.settings.preference.impl.ArrayResource
import app.revanced.patches.shared.settings.preference.impl.StringResource
import app.revanced.util.ResourceGroup
import app.revanced.util.copyResources
import org.w3c.dom.Node
Expand All @@ -24,6 +22,10 @@ abstract class AbstractSettingsResourcePatch(
private val preferenceFileName: String,
private val sourceDirectory: String,
) : ResourcePatch(), Closeable {

private lateinit var arraysEditor: DomFileEditor
private lateinit var revancedPreferencesEditor: DomFileEditor

override fun execute(context: ResourceContext) {
/* copy preference template from source dir */
context.copyResources(
Expand All @@ -34,88 +36,37 @@ abstract class AbstractSettingsResourcePatch(
)

/* prepare xml editors */
stringsEditor = context.xmlEditor["res/values/strings.xml"]
arraysEditor = context.xmlEditor["res/values/arrays.xml"]
arraysNode = arraysEditor.getNode("resources")

revancedPreferencesEditor = context.xmlEditor["res/xml/$preferenceFileName.xml"]
revancedPreferenceNode = revancedPreferencesEditor.getNode("PreferenceScreen")
}

internal companion object {
private var revancedPreferenceNode: Node? = null
private var stringsNode: Node? = null
private var arraysNode: Node? = null

private var strings = mutableListOf<StringResource>()

private var revancedPreferencesEditor: DomFileEditor? = null
set(value) {
field = value
revancedPreferenceNode = value.getNode("PreferenceScreen")
}
private var stringsEditor: DomFileEditor? = null
set(value) {
field = value
stringsNode = value.getNode("resources")
}
private var arraysEditor: DomFileEditor? = null
set(value) {
field = value
arraysNode = value.getNode("resources")
}
override fun close() {
revancedPreferencesEditor.close()
arraysEditor.close()
}

/**
* Add a new string to the resources.
*
* @param identifier The key of the string.
* @param value The value of the string.
* @throws IllegalArgumentException if the string already exists.
*/
fun addString(identifier: String, value: String, formatted: Boolean) =
StringResource(identifier, value, formatted).include()
internal companion object {
private lateinit var arraysNode: Node
private lateinit var revancedPreferenceNode: Node

/**
* Add an array to the resources.
*
* @param arrayResource The array resource to add.
*/
fun addArray(arrayResource: ArrayResource) =
arraysNode!!.addResource(arrayResource) { it.include() }
internal fun addArray(arrayResource: ArrayResource) = arraysNode.addResource(arrayResource)

/**
* Add a preference to the settings.
*
* @param preference The preference to add.
*/
fun addPreference(preference: BasePreference) =
revancedPreferenceNode!!.addPreference(preference) { it.include() }

/**
* Add a new resource to the resources.
*
* @throws IllegalArgumentException if the resource already exists.
*/
internal fun BaseResource.include() {
when (this) {
is StringResource -> {
if (strings.any { it.name == name }) return
strings.add(this)
}

is ArrayResource -> addArray(this)
else -> throw NotImplementedError("Unsupported resource type")
}
}

internal fun DomFileEditor?.getNode(tagName: String) = this!!.file.getElementsByTagName(tagName).item(0)
}

override fun close() {
// merge all strings, skip duplicates
strings.forEach {
stringsNode!!.addResource(it)
}
fun addPreference(preference: BasePreference) = revancedPreferenceNode.addPreference(preference)

revancedPreferencesEditor?.close()
stringsEditor?.close()
arraysEditor?.close()
internal fun DomFileEditor?.getNode(tagName: String) =
this!!.file.getElementsByTagName(tagName).item(0)
}
}
Original file line number Diff line number Diff line change
@@ -1,34 +1,32 @@
package app.revanced.patches.shared.settings.preference

import app.revanced.patches.shared.settings.preference.impl.StringResource
import org.w3c.dom.Document
import org.w3c.dom.Element

/**
* Base preference class for all preferences.
*
* @param key The key of the preference.
* @param title The title of the preference.
* @param titleKey The title of the preference.
* @param tag The full class name for the preference.
* @param summary The summary of the preference.
* @param summaryKey The summary of the preference.
*/
abstract class BasePreference(
val key: String?,
val title: StringResource,
val summary: StringResource? = null,
val titleKey: String,
val summaryKey: String? = null,
val tag: String
) {
/**
* Serialize preference element to XML.
* Overriding methods should invoke super and operate on its return value.
* @param ownerDocument Target document to create elements from.
* @param resourceCallback Called when a resource has been processed.
* @return The serialized element.
*/
open fun serialize(ownerDocument: Document, resourceCallback: (BaseResource) -> Unit): Element =
open fun serialize(ownerDocument: Document): Element =
ownerDocument.createElement(tag).apply {
if (key != null) setAttribute("android:key", key)
setAttribute("android:title", "@string/${title.also { resourceCallback.invoke(it) }.name}")
addSummary(summary?.also { resourceCallback.invoke(it) })
setAttribute("android:title", "@string/$titleKey")
addSummary(summaryKey)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,8 @@ abstract class BaseResource(
* Serialize resource element to XML.
* Overriding methods should invoke super and operate on its return value.
* @param ownerDocument Target document to create elements from.
* @param resourceCallback Called when a resource has been processed.
*/
open fun serialize(ownerDocument: Document, resourceCallback: (BaseResource) -> Unit = { }): Element {
open fun serialize(ownerDocument: Document): Element {
return ownerDocument.createElement(tag).apply {
setAttribute("name", name)
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,33 +1,31 @@
package app.revanced.patches.shared.settings.preference

import app.revanced.patches.shared.settings.preference.impl.StringResource
import org.w3c.dom.Element
import org.w3c.dom.Node

/**
* Add a resource node child
*
* @param resource The resource to add.
* @param resourceCallback Called when a resource has been processed.
*/
internal fun Node.addResource(resource: BaseResource, resourceCallback: (BaseResource) -> Unit = { }) {
appendChild(resource.serialize(ownerDocument, resourceCallback))
internal fun Node.addResource(resource: BaseResource) {
appendChild(resource.serialize(ownerDocument))
}

/**
* Add a preference node child to the settings.
*
* @param preference The preference to add.
* @param resourceCallback Called when a resource has been processed.
*/
internal fun Node.addPreference(preference: BasePreference, resourceCallback: ((BaseResource) -> Unit) = { }) {
appendChild(preference.serialize(ownerDocument, resourceCallback))
internal fun Node.addPreference(preference: BasePreference) {
appendChild(preference.serialize(ownerDocument))
}

internal fun Element.addSummary(summaryResource: StringResource?, summaryType: SummaryType = SummaryType.DEFAULT) =
summaryResource?.let { summary ->
setAttribute("android:${summaryType.type}", "@string/${summary.name}")
internal fun Element.addSummary(summaryResourceKey: String?, summaryType: SummaryType = SummaryType.DEFAULT) {
if (summaryResourceKey != null) {
setAttribute("android:${summaryType.type}", "@string/$summaryResourceKey")
}
}

internal fun <T> Element.addDefault(default: T) {
if (default is Boolean && !(default as Boolean)) return // No need to include the default, as no value already means 'false'
Expand Down
Original file line number Diff line number Diff line change
@@ -1,32 +1,30 @@
package app.revanced.patches.shared.settings.preference

import app.revanced.patches.shared.settings.preference.impl.StringResource
import org.w3c.dom.Document

/**
* Base preference class that also has a default value.
*
* @param key The key of the preference.
* @param title The title of the preference.
* @param titleKey The title of the preference.
* @param tag The tag of the preference.
* @param summary The summary of the preference.
* @param summaryKey The summary of the preference.
* @param default The default value of the preference.
*/
abstract class DefaultBasePreference<T>(
key: String?,
title: StringResource,
summary: StringResource? = null,
titleKey: String,
summaryKey: String? = null,
tag: String,
val default: T? = null,
) : BasePreference(key, title, summary, tag) {
) : BasePreference(key, titleKey, summaryKey, tag) {

/**
* Serialize preference element to XML.
* Overriding methods should invoke super and operate on its return value.
* @param ownerDocument Target document to create elements from.
* @param resourceCallback Called when a resource has been processed.
* @return The serialized element.
*/
override fun serialize(ownerDocument: Document, resourceCallback: (BaseResource) -> Unit) =
super.serialize(ownerDocument, resourceCallback).apply { addDefault(default) }
override fun serialize(ownerDocument: Document) =
super.serialize(ownerDocument).apply { addDefault(default) }
}
Original file line number Diff line number Diff line change
@@ -1,29 +1,37 @@
package app.revanced.patches.shared.settings.preference.impl

import app.revanced.patches.shared.settings.AbstractSettingsResourcePatch
import app.revanced.patches.shared.settings.preference.BaseResource
import org.w3c.dom.Document

// TODO: allow specifying an array resource file instead of using a list of StringResources
/**
* An array resource.
*
* @param name The name of the array resource.
* @param items The items of the array resource.
* @param literalValues If the values are to be used exactly as is.
* If false, the values are treated as string resource names.
*/
class ArrayResource(
name: String,
val items: List<StringResource>
val items: Iterable<String>,
val literalValues : Boolean = false
) : BaseResource(name, "string-array") {
override fun serialize(ownerDocument: Document, resourceCallback: (BaseResource) -> Unit) =
super.serialize(ownerDocument, resourceCallback).apply {

override fun serialize(ownerDocument: Document) =
super.serialize(ownerDocument).apply {
setAttribute("name", name)

items.forEach { item ->
resourceCallback.invoke(item)

this.appendChild(ownerDocument.createElement("item").also { itemNode ->
itemNode.textContent = "@string/${item.name}"
itemNode.textContent = if (literalValues) item else "@string/$item"
})
}
}

/**
* Bundles this array with the target app.
*/
fun include() = AbstractSettingsResourcePatch.addArray(this)

}
Loading

0 comments on commit d41d14e

Please sign in to comment.