Compare commits

...

11 Commits

Author SHA1 Message Date
semantic-release-bot
c378869941 chore(release): 2.188.0-dev.24 [skip ci]
# [2.188.0-dev.24](https://github.com/ReVanced/revanced-patches/compare/v2.188.0-dev.23...v2.188.0-dev.24) (2023-08-25)

### Features

* Exclude `Custom branding` patch by default ([52e7086](52e70866d9))
2023-08-25 15:57:17 +00:00
oSumAtrIX
52e70866d9 feat: Exclude Custom branding patch by default
Due to design complexity of the patch the default branding included with the patch is mistaken as the branding soley meant for YouTube and not understood merely as the default branding.
2023-08-25 17:54:10 +02:00
semantic-release-bot
c7e1dd7563 chore(release): 2.188.0-dev.23 [skip ci]
# [2.188.0-dev.23](https://github.com/ReVanced/revanced-patches/compare/v2.188.0-dev.22...v2.188.0-dev.23) (2023-08-25)

### Features

* **Strava:** Add `Subscription features` patch ([#2872](https://github.com/ReVanced/revanced-patches/issues/2872)) ([3d4ef97](3d4ef97c1e))
2023-08-25 01:19:27 +00:00
xehpuk
3d4ef97c1e feat(Strava): Add Subscription features patch (#2872)
Co-authored-by: oSumAtrIX <johan.melkonyan1@web.de>
2023-08-25 03:16:12 +02:00
semantic-release-bot
040f612818 chore(release): 2.188.0-dev.22 [skip ci]
# [2.188.0-dev.22](https://github.com/ReVanced/revanced-patches/compare/v2.188.0-dev.21...v2.188.0-dev.22) (2023-08-24)

### Features

* Publicize resource utility functions ([520eb07](520eb07277))
* Use an extension property to create new exception when failing to resolve a fingerprint ([a471605](a471605db7))
2023-08-24 22:08:30 +00:00
oSumAtrIX
520eb07277 feat: Publicize resource utility functions
This commit adds the functions to the public API
2023-08-25 00:05:32 +02:00
oSumAtrIX
a471605db7 feat: Use an extension property to create new exception when failing to resolve a fingerprint
This commit adds the extension property to the public API
2023-08-25 00:05:30 +02:00
semantic-release-bot
31b5d506a5 chore(release): 2.188.0-dev.21 [skip ci]
# [2.188.0-dev.21](https://github.com/ReVanced/revanced-patches/compare/v2.188.0-dev.20...v2.188.0-dev.21) (2023-08-24)

### Features

* **Duolingo:** Add `Unlock Duolingo Super` patch ([#2862](https://github.com/ReVanced/revanced-patches/issues/2862)) ([1168c0c](1168c0cdf4))
2023-08-24 20:24:14 +00:00
Karol
1168c0cdf4 feat(Duolingo): Add Unlock Duolingo Super patch (#2862) 2023-08-24 22:21:33 +02:00
semantic-release-bot
eeab2fa705 chore(release): 2.188.0-dev.20 [skip ci]
# [2.188.0-dev.20](https://github.com/ReVanced/revanced-patches/compare/v2.188.0-dev.19...v2.188.0-dev.20) (2023-08-24)

### Bug Fixes

* **Enable android debugging:** Update patch description ([#2869](https://github.com/ReVanced/revanced-patches/issues/2869)) ([c10de2d](c10de2da22))
2023-08-24 16:18:34 +00:00
LisoUseInAIKyrios
c10de2da22 fix(Enable android debugging): Update patch description (#2869)
Co-authored-by: oSumAtrIX <johan.melkonyan1@web.de>
2023-08-24 20:15:48 +04:00
100 changed files with 438 additions and 254 deletions

View File

@@ -1,3 +1,39 @@
# [2.188.0-dev.24](https://github.com/ReVanced/revanced-patches/compare/v2.188.0-dev.23...v2.188.0-dev.24) (2023-08-25)
### Features
* Exclude `Custom branding` patch by default ([d6de957](https://github.com/ReVanced/revanced-patches/commit/d6de957f4efce11d9a709d4c8f500b039166fc2f))
# [2.188.0-dev.23](https://github.com/ReVanced/revanced-patches/compare/v2.188.0-dev.22...v2.188.0-dev.23) (2023-08-25)
### Features
* **Strava:** Add `Subscription features` patch ([#2872](https://github.com/ReVanced/revanced-patches/issues/2872)) ([387eb29](https://github.com/ReVanced/revanced-patches/commit/387eb29e7ed45169c89a03513af64104d0082f28))
# [2.188.0-dev.22](https://github.com/ReVanced/revanced-patches/compare/v2.188.0-dev.21...v2.188.0-dev.22) (2023-08-24)
### Features
* Publicize resource utility functions ([20aff26](https://github.com/ReVanced/revanced-patches/commit/20aff26784296517257ea19d66ffd3bdfe6b06fa))
* Use an extension property to create new exception when failing to resolve a fingerprint ([47eac14](https://github.com/ReVanced/revanced-patches/commit/47eac14f039dc466c1957470d82255bfa2c06ff0))
# [2.188.0-dev.21](https://github.com/ReVanced/revanced-patches/compare/v2.188.0-dev.20...v2.188.0-dev.21) (2023-08-24)
### Features
* **Duolingo:** Add `Unlock Duolingo Super` patch ([#2862](https://github.com/ReVanced/revanced-patches/issues/2862)) ([61a7533](https://github.com/ReVanced/revanced-patches/commit/61a7533136f38d7a308e31c9f250baad00515d6a))
# [2.188.0-dev.20](https://github.com/ReVanced/revanced-patches/compare/v2.188.0-dev.19...v2.188.0-dev.20) (2023-08-24)
### Bug Fixes
* **Enable android debugging:** Update patch description ([#2869](https://github.com/ReVanced/revanced-patches/issues/2869)) ([d9f0d08](https://github.com/ReVanced/revanced-patches/commit/d9f0d08498662e7aa18edb5201a5d60f3738e4e4))
# [2.188.0-dev.19](https://github.com/ReVanced/revanced-patches/compare/v2.188.0-dev.18...v2.188.0-dev.19) (2023-08-24)

View File

@@ -1,4 +1,4 @@
org.gradle.parallel = true
org.gradle.caching = true
kotlin.code.style = official
version = 2.188.0-dev.19
version = 2.188.0-dev.24

File diff suppressed because one or more lines are too long

View File

@@ -15,11 +15,12 @@ import com.android.tools.smali.dexlib2.util.MethodUtil
import org.w3c.dom.Node
/**
* Return [PatchException] from a [MethodFingerprint].
* The [PatchException] of failing to resolve a [MethodFingerprint].
*
* @return The [PatchException] for the [MethodFingerprint].
* @return The [PatchException].
*/
internal fun MethodFingerprint.toErrorResult() = PatchException("Failed to resolve $name")
val MethodFingerprint.exception
get() = PatchException("Failed to resolve $name")
/**
* Find the [MutableMethod] from a given [Method] in a [MutableClass].
@@ -27,27 +28,27 @@ internal fun MethodFingerprint.toErrorResult() = PatchException("Failed to resol
* @param method The [Method] to find.
* @return The [MutableMethod].
*/
internal fun MutableClass.findMutableMethodOf(method: Method) = this.methods.first {
fun MutableClass.findMutableMethodOf(method: Method) = this.methods.first {
MethodUtil.methodSignaturesMatch(it, method)
}
/**
* apply a transform to all methods of the class
* apply a transform to all methods of the class.
*
* @param transform the transformation function. original method goes in, transformed method goes out
* @param transform the transformation function. original method goes in, transformed method goes out.
*/
internal fun MutableClass.transformMethods(transform: MutableMethod.() -> MutableMethod) {
fun MutableClass.transformMethods(transform: MutableMethod.() -> MutableMethod) {
val transformedMethods = methods.map { it.transform() }
methods.clear()
methods.addAll(transformedMethods)
}
internal fun Node.doRecursively(action: (Node) -> Unit) {
fun Node.doRecursively(action: (Node) -> Unit) {
action(this)
for (i in 0 until this.childNodes.length) this.childNodes.item(i).doRecursively(action)
}
internal fun MutableMethod.injectHideViewCall(
fun MutableMethod.injectHideViewCall(
insertIndex: Int,
viewRegister: Int,
classDescriptor: String,
@@ -57,7 +58,13 @@ internal fun MutableMethod.injectHideViewCall(
"invoke-static { v$viewRegister }, $classDescriptor->$targetMethod(Landroid/view/View;)V"
)
internal fun Method.findIndexForIdResource(resourceName: String): Int {
/**
* Find the index of the first constant instruction with the id of the given resource name.
*
* @param resourceName the name of the resource to find the id for.
* @return the index of the first constant instruction with the id of the given resource name, or -1 if not found.
*/
fun Method.findIndexForIdResource(resourceName: String): Int {
fun getIdResourceId(resourceName: String) = ResourceMappingPatch.resourceMappings.single {
it.type == "id" && it.name == resourceName
}.id
@@ -66,6 +73,8 @@ internal fun Method.findIndexForIdResource(resourceName: String): Int {
}
/**
* Find the index of the first constant instruction with the given value.
*
* @return the first constant instruction with the value, or -1 if not found.
*/
fun Method.indexOfFirstConstantInstructionValue(constantValue: Long): Int {
@@ -77,6 +86,8 @@ fun Method.indexOfFirstConstantInstructionValue(constantValue: Long): Int {
}
/**
* Check if the method contains a constant with the given value.
*
* @return if the method contains a constant with the given value.
*/
fun Method.containsConstantInstructionValue(constantValue: Long): Boolean {
@@ -84,10 +95,10 @@ fun Method.containsConstantInstructionValue(constantValue: Long): Boolean {
}
/**
* traverse the class hierarchy starting from the given root class
* Traverse the class hierarchy starting from the given root class.
*
* @param targetClass the class to start traversing the class hierarchy from
* @param callback function that is called for every class in the hierarchy
* @param targetClass the class to start traversing the class hierarchy from.
* @param callback function that is called for every class in the hierarchy.
*/
fun BytecodeContext.traverseClassHierarchy(targetClass: MutableClass, callback: MutableClass.() -> Unit) {
callback(targetClass)

View File

@@ -9,7 +9,7 @@ import org.w3c.dom.Element
@Patch(false)
@Name("Enable android debugging")
@Description("Enables Android debugging capabilities.")
@Description("Enables Android debugging capabilities. This can slow down the app.")
class EnableAndroidDebuggingPatch : ResourcePatch {
override fun execute(context: ResourceContext) {
context.xmlEditor["AndroidManifest.xml"].use { dom ->

View File

@@ -1,6 +1,6 @@
package app.revanced.patches.backdrops.misc.pro.patch
import app.revanced.extensions.toErrorResult
import app.revanced.extensions.exception
import app.revanced.patcher.annotation.Description
import app.revanced.patcher.annotation.Name
import app.revanced.patcher.data.BytecodeContext
@@ -33,6 +33,6 @@ class ProUnlockPatch : BytecodePatch(
)
}
} ?: throw ProUnlockFingerprint.toErrorResult()
} ?: throw ProUnlockFingerprint.exception
}
}

View File

@@ -1,6 +1,6 @@
package app.revanced.patches.candylinkvpn.patch
import app.revanced.extensions.toErrorResult
import app.revanced.extensions.exception
import app.revanced.patcher.annotation.Description
import app.revanced.patcher.annotation.Name
import app.revanced.patcher.data.BytecodeContext
@@ -24,6 +24,6 @@ class UnlockProPatch : BytecodePatch(
const/4 v0, 0x1
return v0
"""
) ?: throw IsPremiumPurchasedFingerprint.toErrorResult()
) ?: throw IsPremiumPurchasedFingerprint.exception
}
}

View File

@@ -0,0 +1,14 @@
package app.revanced.patches.duolingo.unlocksuper.fingerprints
import app.revanced.patcher.extensions.or
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
import com.android.tools.smali.dexlib2.AccessFlags
import com.android.tools.smali.dexlib2.Opcode
object IsUserSuperMethodFingerprint : MethodFingerprint(
returnType = "Ljava/lang/Object",
parameters = listOf("Ljava/lang/Object"),
accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL,
strings = listOf("user"),
opcodes = listOf(Opcode.IGET_BOOLEAN),
)

View File

@@ -0,0 +1,20 @@
package app.revanced.patches.duolingo.unlocksuper.fingerprints
import app.revanced.patcher.extensions.or
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
import com.android.tools.smali.dexlib2.AccessFlags
import com.android.tools.smali.dexlib2.Opcode
object UserSerializationMethodFingerprint : MethodFingerprint(
returnType = "V",
accessFlags = AccessFlags.PUBLIC or AccessFlags.CONSTRUCTOR,
strings = listOf(
"betaStatus",
"coachOutfit",
"globalAmbassadorStatus",
),
opcodes = listOf(
Opcode.MOVE_FROM16,
Opcode.IPUT_BOOLEAN,
),
)

View File

@@ -0,0 +1,64 @@
package app.revanced.patches.duolingo.unlocksuper.patch
import app.revanced.extensions.exception
import app.revanced.patcher.annotation.Compatibility
import app.revanced.patcher.annotation.Description
import app.revanced.patcher.annotation.Name
import app.revanced.patcher.annotation.Package
import app.revanced.patcher.data.BytecodeContext
import app.revanced.patcher.extensions.InstructionExtensions.getInstructions
import app.revanced.patcher.extensions.InstructionExtensions.replaceInstructions
import app.revanced.patcher.patch.BytecodePatch
import app.revanced.patcher.patch.PatchException
import app.revanced.patcher.patch.annotations.Patch
import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod
import app.revanced.patches.duolingo.unlocksuper.fingerprints.IsUserSuperMethodFingerprint
import app.revanced.patches.duolingo.unlocksuper.fingerprints.UserSerializationMethodFingerprint
import com.android.tools.smali.dexlib2.Opcode
import com.android.tools.smali.dexlib2.builder.instruction.BuilderInstruction22c
import com.android.tools.smali.dexlib2.iface.reference.Reference
@Patch
@Name("Unlock Duolingo Super")
@Description("Unlocks Duolingo Super features.")
@Compatibility([Package("com.duolingo")])
class UnlockDuolingoSuperPatch : BytecodePatch(
listOf(UserSerializationMethodFingerprint, IsUserSuperMethodFingerprint)
) {
/* First find the reference to the isUserSuper field, then patch the instruction that assigns it to false.
* This strategy is used because the method that sets the isUserSuper field is difficult to fingerprint reliably.
*/
override fun execute(context: BytecodeContext) {
// Find the reference to the isUserSuper field.
val isUserSuperReference = IsUserSuperMethodFingerprint
.result
?.mutableMethod
?.getInstructions()
?.filterIsInstance<BuilderInstruction22c>()
?.firstOrNull { it.opcode == Opcode.IGET_BOOLEAN }
?.reference
?: throw IsUserSuperMethodFingerprint.exception
// Patch the instruction that assigns isUserSuper to true.
UserSerializationMethodFingerprint
.result
?.mutableMethod
?.apply {
replaceInstructions(
indexOfReference(isUserSuperReference) - 1,
"const/4 v2, 0x1"
)
}
?: throw UserSerializationMethodFingerprint.exception
}
private companion object {
private fun MutableMethod.indexOfReference(reference: Reference) = getInstructions()
.filterIsInstance<BuilderInstruction22c>()
.filter { it.opcode == Opcode.IPUT_BOOLEAN }.indexOfFirst { it.reference == reference }.let {
if (it == -1) throw PatchException("Could not find index of instruction with supplied reference.")
else it
}
}
}

View File

@@ -1,6 +1,6 @@
package app.revanced.patches.finanzonline.detection.bootloader.patch
import app.revanced.extensions.toErrorResult
import app.revanced.extensions.exception
import app.revanced.patcher.annotation.Description
import app.revanced.patcher.annotation.Name
import app.revanced.patcher.data.BytecodeContext
@@ -27,7 +27,7 @@ class BootloaderDetectionPatch : BytecodePatch(
const/4 v0, 0x1
return v0
"""
) ?: throw fingerprint.toErrorResult()
) ?: throw fingerprint.exception
}
}
}

View File

@@ -1,6 +1,6 @@
package app.revanced.patches.finanzonline.detection.root.patch
import app.revanced.extensions.toErrorResult
import app.revanced.extensions.exception
import app.revanced.patcher.annotation.Description
import app.revanced.patcher.annotation.Name
import app.revanced.patcher.data.BytecodeContext
@@ -24,6 +24,6 @@ class RootDetectionPatch : BytecodePatch(
sget-object v0, Ljava/lang/Boolean;->FALSE:Ljava/lang/Boolean;
return-object v0
"""
) ?: throw RootDetectionFingerprint.toErrorResult()
) ?: throw RootDetectionFingerprint.exception
}
}

View File

@@ -1,6 +1,6 @@
package app.revanced.patches.googlerecorder.restrictions.patch
import app.revanced.extensions.toErrorResult
import app.revanced.extensions.exception
import app.revanced.patcher.annotation.Compatibility
import app.revanced.patcher.annotation.Description
import app.revanced.patcher.annotation.Name
@@ -34,6 +34,6 @@ class RemoveDeviceRestrictions : BytecodePatch(
// Override "isPixelDevice()" to return true.
addInstruction(featureStringIndex, "const/4 v$featureAvailableRegister, 0x1")
}
} ?: throw OnApplicationCreateFingerprint.toErrorResult()
} ?: throw OnApplicationCreateFingerprint.exception
}
}

View File

@@ -1,6 +1,6 @@
package app.revanced.patches.inshorts.ad.patch
import app.revanced.extensions.toErrorResult
import app.revanced.extensions.exception
import app.revanced.patcher.data.BytecodeContext
import app.revanced.patcher.annotation.Description
import app.revanced.patcher.annotation.Name
@@ -27,6 +27,6 @@ class HideAdsPatch : BytecodePatch(
"""
)
}
} ?: throw InshortsAdsFingerprint.toErrorResult()
} ?: throw InshortsAdsFingerprint.exception
}
}

View File

@@ -1,6 +1,6 @@
package app.revanced.patches.instagram.patches.ads.timeline.patch
import app.revanced.extensions.toErrorResult
import app.revanced.extensions.exception
import app.revanced.patcher.annotation.*
import app.revanced.patcher.data.BytecodeContext
import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels
@@ -33,16 +33,16 @@ class HideTimelineAdsPatch : BytecodePatch(
override fun execute(context: BytecodeContext) {
// region Resolve required methods to check for ads.
ShowAdFingerprint.result ?: throw ShowAdFingerprint.toErrorResult()
ShowAdFingerprint.result ?: throw ShowAdFingerprint.exception
PaidPartnershipAdFingerprint.result ?: throw PaidPartnershipAdFingerprint.toErrorResult()
PaidPartnershipAdFingerprint.result ?: throw PaidPartnershipAdFingerprint.exception
MediaFingerprint.result?.let {
GenericMediaAdFingerprint.resolve(context, it.classDef)
ShoppingAdFingerprint.resolve(context, it.classDef)
return@let
} ?: throw MediaFingerprint.toErrorResult()
} ?: throw MediaFingerprint.exception
// endregion

View File

@@ -1,6 +1,6 @@
package app.revanced.patches.lightroom.misc.login.patch
import app.revanced.extensions.toErrorResult
import app.revanced.extensions.exception
import app.revanced.patcher.annotation.Name
import app.revanced.patcher.data.BytecodeContext
import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction
@@ -18,6 +18,6 @@ class DisableMandatoryLoginPatch : BytecodePatch(listOf(IsLoggedInFingerprint))
val index = implementation!!.instructions.lastIndex - 1
// Set isLoggedIn = true.
replaceInstruction(index, "const/4 v0, 0x1")
} ?: throw IsLoggedInFingerprint.toErrorResult()
} ?: throw IsLoggedInFingerprint.exception
}
}

View File

@@ -1,6 +1,6 @@
package app.revanced.patches.lightroom.misc.premium.patch
import app.revanced.extensions.toErrorResult
import app.revanced.extensions.exception
import app.revanced.patcher.annotation.Description
import app.revanced.patcher.annotation.Name
import app.revanced.patcher.data.BytecodeContext
@@ -18,6 +18,6 @@ class UnlockPremiumPatch : BytecodePatch(listOf(HasPurchasedFingerprint)) {
override fun execute(context: BytecodeContext) {
// Set hasPremium = true.
HasPurchasedFingerprint.result?.mutableMethod?.replaceInstruction(2, "const/4 v2, 0x1")
?: throw HasPurchasedFingerprint.toErrorResult()
?: throw HasPurchasedFingerprint.exception
}
}

View File

@@ -1,6 +1,6 @@
package app.revanced.patches.memegenerator.detection.license.patch
import app.revanced.extensions.toErrorResult
import app.revanced.extensions.exception
import app.revanced.patcher.annotation.Description
import app.revanced.patcher.data.BytecodeContext
import app.revanced.patcher.extensions.InstructionExtensions.replaceInstructions
@@ -20,6 +20,6 @@ class LicenseValidationPatch : BytecodePatch(
return p0
"""
)
} ?: throw LicenseValidationFingerprint.toErrorResult()
} ?: throw LicenseValidationFingerprint.exception
}
}

View File

@@ -1,6 +1,6 @@
package app.revanced.patches.memegenerator.detection.signature.patch
import app.revanced.extensions.toErrorResult
import app.revanced.extensions.exception
import app.revanced.patcher.annotation.Description
import app.revanced.patcher.data.BytecodeContext
import app.revanced.patcher.extensions.InstructionExtensions.replaceInstructions
@@ -20,6 +20,6 @@ class SignatureVerificationPatch : BytecodePatch(
return p0
"""
)
} ?: throw VerifySignatureFingerprint.toErrorResult()
} ?: throw VerifySignatureFingerprint.exception
}
}

View File

@@ -1,6 +1,6 @@
package app.revanced.patches.memegenerator.misc.pro.patch
import app.revanced.extensions.toErrorResult
import app.revanced.extensions.exception
import app.revanced.patcher.annotation.Description
import app.revanced.patcher.annotation.Name
import app.revanced.patcher.data.BytecodeContext
@@ -34,6 +34,6 @@ class UnlockProVersionPatch : BytecodePatch(
return-object p0
"""
)
} ?: throw IsFreeVersionFingerprint.toErrorResult()
} ?: throw IsFreeVersionFingerprint.exception
}
}

View File

@@ -1,6 +1,6 @@
package app.revanced.patches.messenger.ads.inbox.patch
import app.revanced.extensions.toErrorResult
import app.revanced.extensions.exception
import app.revanced.patcher.annotation.*
import app.revanced.patcher.data.BytecodeContext
import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction
@@ -18,7 +18,7 @@ class HideInboxAdsPatch : BytecodePatch(
override fun execute(context: BytecodeContext) {
LoadInboxAdsFingerprint.result?.mutableMethod?.apply {
this.replaceInstruction(0, "return-void")
} ?: throw LoadInboxAdsFingerprint.toErrorResult()
} ?: throw LoadInboxAdsFingerprint.exception
}
}

View File

@@ -1,6 +1,6 @@
package app.revanced.patches.messenger.inputfield.patch
import app.revanced.extensions.toErrorResult
import app.revanced.extensions.exception
import app.revanced.patcher.annotation.*
import app.revanced.patcher.data.BytecodeContext
import app.revanced.patcher.extensions.InstructionExtensions.getInstruction
@@ -27,6 +27,6 @@ class DisableSwitchingEmojiToStickerInMessageInputField : BytecodePatch(listOf(S
"const-string v$targetRegister, \"expression\""
)
}
} ?: throw SwitchMessangeInputEmojiButtonFingerprint.toErrorResult()
} ?: throw SwitchMessangeInputEmojiButtonFingerprint.exception
}
}

View File

@@ -1,6 +1,6 @@
package app.revanced.patches.messenger.inputfield.patch
import app.revanced.extensions.toErrorResult
import app.revanced.extensions.exception
import app.revanced.patcher.annotation.Compatibility
import app.revanced.patcher.annotation.Description
import app.revanced.patcher.annotation.Name
@@ -18,6 +18,6 @@ import app.revanced.patches.messenger.inputfield.fingerprints.SendTypingIndicato
class DisableTypingIndicator : BytecodePatch(listOf(SendTypingIndicatorFingerprint)) {
override fun execute(context: BytecodeContext) {
SendTypingIndicatorFingerprint.result?.mutableMethod?.replaceInstruction(0, "return-void")
?: throw SendTypingIndicatorFingerprint.toErrorResult()
?: throw SendTypingIndicatorFingerprint.exception
}
}

View File

@@ -1,6 +1,6 @@
package app.revanced.patches.music.interaction.permanentrepeat.patch
import app.revanced.extensions.toErrorResult
import app.revanced.extensions.exception
import app.revanced.patcher.annotation.Description
import app.revanced.patcher.annotation.Name
import app.revanced.patcher.data.BytecodeContext
@@ -31,6 +31,6 @@ class PermanentRepeatPatch : BytecodePatch(
ExternalLabel("repeat", getInstruction(repeatIndex))
)
}
} ?: throw RepeatTrackFingerprint.toErrorResult()
} ?: throw RepeatTrackFingerprint.exception
}
}

View File

@@ -1,6 +1,6 @@
package app.revanced.patches.music.interaction.permanentshuffle.patch
import app.revanced.extensions.toErrorResult
import app.revanced.extensions.exception
import app.revanced.patcher.annotation.Description
import app.revanced.patcher.annotation.Name
import app.revanced.patcher.data.BytecodeContext
@@ -20,6 +20,6 @@ class PermanentShuffleTogglePatch : BytecodePatch(
) {
override fun execute(context: BytecodeContext) {
DisableShuffleFingerprint.result?.mutableMethod?.addInstruction(0, "return-void")
?: throw DisableShuffleFingerprint.toErrorResult()
?: throw DisableShuffleFingerprint.exception
}
}

View File

@@ -1,6 +1,6 @@
package app.revanced.patches.music.misc.androidauto.patch
import app.revanced.extensions.toErrorResult
import app.revanced.extensions.exception
import app.revanced.patcher.annotation.Description
import app.revanced.patcher.annotation.Name
import app.revanced.patcher.data.BytecodeContext
@@ -25,6 +25,6 @@ class BypassCertificateChecksPatch : BytecodePatch(
return v0
"""
)
} ?: throw CheckCertificateFingerprint.toErrorResult()
} ?: throw CheckCertificateFingerprint.exception
}
}

View File

@@ -1,6 +1,6 @@
package app.revanced.patches.nfctoolsse.misc.pro.patch
import app.revanced.extensions.toErrorResult
import app.revanced.extensions.exception
import app.revanced.patcher.annotation.Description
import app.revanced.patcher.annotation.Name
import app.revanced.patcher.data.BytecodeContext
@@ -29,7 +29,7 @@ class UnlockProPatch : BytecodePatch(
return v0
"""
)
} ?: throw IsLicenseRegisteredFingerprint.toErrorResult()
} ?: throw IsLicenseRegisteredFingerprint.exception
}
}

View File

@@ -1,6 +1,6 @@
package app.revanced.patches.photomath.detection.signature.patch
import app.revanced.extensions.toErrorResult
import app.revanced.extensions.exception
import app.revanced.patcher.annotation.Description
import app.revanced.patcher.data.BytecodeContext
import app.revanced.patcher.extensions.InstructionExtensions.getInstruction
@@ -21,7 +21,7 @@ class SignatureDetectionPatch : BytecodePatch(
val checkRegister = (signatureCheckInstruction as OneRegisterInstruction).registerA
mutableMethod.replaceInstruction(signatureCheckInstruction.location.index, "const/4 v$checkRegister, 0x1")
} ?: throw CheckSignatureFingerprint.toErrorResult()
} ?: throw CheckSignatureFingerprint.exception
}
}

View File

@@ -1,6 +1,6 @@
package app.revanced.patches.photomath.misc.unlockplus.patch
import app.revanced.extensions.toErrorResult
import app.revanced.extensions.exception
import app.revanced.patcher.annotation.Description
import app.revanced.patcher.annotation.Name
import app.revanced.patcher.data.BytecodeContext
@@ -31,7 +31,7 @@ class UnlockPlusPatch : BytecodePatch(
return v0
"""
)
} ?: throw IsPlusUnlockedFingerprint.toErrorResult()
} ?: throw IsPlusUnlockedFingerprint.exception
}
}

View File

@@ -1,6 +1,6 @@
package app.revanced.patches.pixiv.ads.patch
import app.revanced.extensions.toErrorResult
import app.revanced.extensions.exception
import app.revanced.patcher.annotation.*
import app.revanced.patcher.data.BytecodeContext
import app.revanced.patcher.extensions.InstructionExtensions.addInstructions
@@ -23,6 +23,6 @@ class HideAdsPatch : BytecodePatch(listOf(IsNotPremiumFingerprint)) {
const/4 v0, 0x0
return v0
"""
) ?: throw IsNotPremiumFingerprint.toErrorResult()
) ?: throw IsNotPremiumFingerprint.exception
}
}

View File

@@ -1,7 +1,7 @@
package app.revanced.patches.reddit.customclients
import android.os.Environment
import app.revanced.extensions.toErrorResult
import app.revanced.extensions.exception
import app.revanced.patcher.data.BytecodeContext
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprintResult
@@ -47,7 +47,7 @@ abstract class AbstractSpoofClientPatch(
fun List<MethodFingerprint>?.executePatch(
patch: List<MethodFingerprintResult>.(BytecodeContext) -> Unit
) = this?.map { it.result ?: throw it.toErrorResult() }?.patch(context)
) = this?.map { it.result ?: throw it.exception }?.patch(context)
clientIdFingerprints.executePatch { patchClientId(context) }
userAgentFingerprints.executePatch { patchUserAgent(context) }

View File

@@ -1,6 +1,6 @@
package app.revanced.patches.reddit.customclients.joeyforreddit.ads.patch
import app.revanced.extensions.toErrorResult
import app.revanced.extensions.exception
import app.revanced.patcher.annotation.Compatibility
import app.revanced.patcher.annotation.Name
import app.revanced.patcher.annotation.Package
@@ -24,6 +24,6 @@ class DisableAdsPatch : BytecodePatch(listOf(IsAdFreeUserFingerprint)) {
const/4 v0, 0x1
return v0
"""
) ?: throw IsAdFreeUserFingerprint.toErrorResult()
) ?: throw IsAdFreeUserFingerprint.exception
}
}

View File

@@ -1,6 +1,6 @@
package app.revanced.patches.reddit.customclients.joeyforreddit.detection.piracy.patch
import app.revanced.extensions.toErrorResult
import app.revanced.extensions.exception
import app.revanced.patcher.data.BytecodeContext
import app.revanced.patcher.extensions.InstructionExtensions.addInstruction
import app.revanced.patcher.patch.BytecodePatch
@@ -13,6 +13,6 @@ class DisablePiracyDetectionPatch : BytecodePatch(listOf(PiracyDetectionFingerpr
"""
return-void
"""
) ?: throw PiracyDetectionFingerprint.toErrorResult()
) ?: throw PiracyDetectionFingerprint.exception
}
}

View File

@@ -1,6 +1,6 @@
package app.revanced.patches.reddit.customclients.syncforreddit.ads.patch
import app.revanced.extensions.toErrorResult
import app.revanced.extensions.exception
import app.revanced.patcher.annotation.*
import app.revanced.patcher.data.BytecodeContext
import app.revanced.patcher.extensions.InstructionExtensions.addInstructions
@@ -24,7 +24,7 @@ class DisableAdsPatch : BytecodePatch(listOf(IsAdsEnabledFingerprint)) {
return v0
"""
)
} ?: throw IsAdsEnabledFingerprint.toErrorResult()
} ?: throw IsAdsEnabledFingerprint.exception
}
}

View File

@@ -1,6 +1,6 @@
package app.revanced.patches.reddit.customclients.syncforreddit.api.patch
import app.revanced.extensions.toErrorResult
import app.revanced.extensions.exception
import app.revanced.patcher.annotation.Compatibility
import app.revanced.patcher.annotation.Description
import app.revanced.patcher.annotation.Package
@@ -48,7 +48,7 @@ class SpoofClientPatch : AbstractSpoofClientPatch(
return-object v0
"""
)
} ?: throw GetBearerTokenFingerprint.toErrorResult()
} ?: throw GetBearerTokenFingerprint.exception
}.let {
val occurrenceIndex = it.scanResult.stringsScanResult!!.matches.first().index

View File

@@ -1,6 +1,6 @@
package app.revanced.patches.reddit.layout.disablescreenshotpopup.patch
import app.revanced.extensions.toErrorResult
import app.revanced.extensions.exception
import app.revanced.patcher.annotation.Description
import app.revanced.patcher.annotation.Name
import app.revanced.patcher.data.BytecodeContext
@@ -19,6 +19,6 @@ class DisableScreenshotPopupPatch : BytecodePatch(
) {
override fun execute(context: BytecodeContext) {
DisableScreenshotPopupFingerprint.result?.mutableMethod?.addInstruction(0, "return-void")
?: throw DisableScreenshotPopupFingerprint.toErrorResult()
?: throw DisableScreenshotPopupFingerprint.exception
}
}

View File

@@ -1,6 +1,6 @@
package app.revanced.patches.reddit.misc.tracking.url.patch
import app.revanced.extensions.toErrorResult
import app.revanced.extensions.exception
import app.revanced.patcher.annotation.Description
import app.revanced.patcher.annotation.Name
import app.revanced.patcher.data.BytecodeContext
@@ -22,7 +22,7 @@ class SanitizeUrlQueryPatch : BytecodePatch(
ShareLinkFormatterFingerprint.result?.mutableMethod?.addInstructions(
0,
"return-object p0"
) ?: throw ShareLinkFormatterFingerprint.toErrorResult()
) ?: throw ShareLinkFormatterFingerprint.exception
}
}

View File

@@ -1,6 +1,6 @@
package app.revanced.patches.shared.misc.fix.verticalscroll.patch
import app.revanced.extensions.toErrorResult
import app.revanced.extensions.exception
import app.revanced.patcher.annotation.Description
import app.revanced.patcher.data.BytecodeContext
import app.revanced.patcher.extensions.InstructionExtensions.addInstruction
@@ -27,6 +27,6 @@ class VerticalScrollPatch : BytecodePatch(
"const/4 v$moveResultRegister, 0x0"
)
}
} ?: throw CanScrollVerticallyFingerprint.toErrorResult()
} ?: throw CanScrollVerticallyFingerprint.exception
}
}

View File

@@ -1,6 +1,6 @@
package app.revanced.patches.solidexplorer2.functionality.filesize.patch
import app.revanced.extensions.toErrorResult
import app.revanced.extensions.exception
import app.revanced.patcher.annotation.Compatibility
import app.revanced.patcher.annotation.Description
import app.revanced.patcher.annotation.Name
@@ -23,5 +23,5 @@ class RemoveFileSizeLimitPatch : BytecodePatch(listOf(OnReadyFingerprint)) {
val cmpResultRegister = result.mutableMethod.getInstruction<ThreeRegisterInstruction>(cmpIndex).registerA
result.mutableMethod.replaceInstruction(cmpIndex, "const/4 v${cmpResultRegister}, 0x0")
} ?: throw OnReadyFingerprint.toErrorResult()
} ?: throw OnReadyFingerprint.exception
}

View File

@@ -1,6 +1,6 @@
package app.revanced.patches.songpal.badge.patch
import app.revanced.extensions.toErrorResult
import app.revanced.extensions.exception
import app.revanced.patcher.annotation.Description
import app.revanced.patcher.annotation.Name
import app.revanced.patcher.data.BytecodeContext
@@ -50,7 +50,7 @@ class BadgeTabPatch : BytecodePatch(
"""
)
} ?: throw CreateTabsFingerprint.toErrorResult()
} ?: throw CreateTabsFingerprint.exception
}
companion object {

View File

@@ -1,6 +1,6 @@
package app.revanced.patches.songpal.badge.patch
import app.revanced.extensions.toErrorResult
import app.revanced.extensions.exception
import app.revanced.patcher.annotation.Description
import app.revanced.patcher.annotation.Name
import app.revanced.patcher.data.BytecodeContext
@@ -20,6 +20,6 @@ class RemoveNotificationBadgePatch : BytecodePatch(
override fun execute(context: BytecodeContext) {
ShowNotificationFingerprint.result?.mutableMethod?.apply {
addInstructions(0, "return-void")
} ?: throw ShowNotificationFingerprint.toErrorResult()
} ?: throw ShowNotificationFingerprint.exception
}
}

View File

@@ -1,6 +1,6 @@
package app.revanced.patches.spotify.lite.ondemand.patch
import app.revanced.extensions.toErrorResult
import app.revanced.extensions.exception
import app.revanced.patcher.annotation.Description
import app.revanced.patcher.annotation.Name
import app.revanced.patcher.data.BytecodeContext
@@ -24,6 +24,6 @@ class OnDemandPatch : BytecodePatch(
val insertIndex = scanResult.patternScanResult!!.endIndex - 1
// Spoof a premium account
mutableMethod.addInstruction(insertIndex, "const/4 v0, 0x2")
} ?: throw OnDemandFingerprint.toErrorResult()
} ?: throw OnDemandFingerprint.exception
}
}

View File

@@ -0,0 +1,11 @@
package app.revanced.patches.strava.subscription.fingerprints
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
import com.android.tools.smali.dexlib2.Opcode
object GetSubscribedFingerprint : MethodFingerprint(
opcodes = listOf(Opcode.IGET_BOOLEAN),
customFingerprint = { methodDef, classDef ->
classDef.type.endsWith("SubscriptionDetailResponse;") && methodDef.name == "getSubscribed"
}
)

View File

@@ -0,0 +1,23 @@
package app.revanced.patches.strava.subscription.patch
import app.revanced.extensions.exception
import app.revanced.patcher.annotation.Compatibility
import app.revanced.patcher.annotation.Description
import app.revanced.patcher.annotation.Name
import app.revanced.patcher.annotation.Package
import app.revanced.patcher.data.BytecodeContext
import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction
import app.revanced.patcher.patch.BytecodePatch
import app.revanced.patcher.patch.annotations.Patch
import app.revanced.patches.strava.subscription.fingerprints.GetSubscribedFingerprint
@Patch
@Name("Unlock subscription features")
@Description("Unlocks \"Matched Runs\" and \"Segment Efforts\".")
@Compatibility([Package("com.strava", ["320.12"])])
class UnlockSubscriptionPatch : BytecodePatch(listOf(GetSubscribedFingerprint)) {
override fun execute(context: BytecodeContext) = GetSubscribedFingerprint.result?.let { result ->
val isSubscribedIndex = result.scanResult.patternScanResult!!.startIndex
result.mutableMethod.replaceInstruction(isSubscribedIndex, "const/4 v0, 0x1")
} ?: throw GetSubscribedFingerprint.exception
}

View File

@@ -1,6 +1,6 @@
package app.revanced.patches.tiktok.interaction.seekbar.patch
import app.revanced.extensions.toErrorResult
import app.revanced.extensions.exception
import app.revanced.patcher.annotation.Description
import app.revanced.patcher.annotation.Name
import app.revanced.patcher.data.BytecodeContext
@@ -40,7 +40,7 @@ class ShowSeekbarPatch : BytecodePatch(
const/16 v$typeRegister, 0x64
"""
)
} ?: throw SetSeekBarShowTypeFingerprint.toErrorResult()
} ?: throw SetSeekBarShowTypeFingerprint.exception
}
}

View File

@@ -1,6 +1,6 @@
package app.revanced.patches.tiktok.misc.settings.patch
import app.revanced.extensions.toErrorResult
import app.revanced.extensions.exception
import app.revanced.patcher.annotation.Description
import app.revanced.patcher.annotation.Name
import app.revanced.patcher.data.BytecodeContext
@@ -34,9 +34,9 @@ class SettingsPatch : BytecodePatch(
override fun execute(context: BytecodeContext) {
// Find the class name of classes which construct a settings entry
val settingsButtonClass = SettingsEntryFingerprint.result?.classDef?.type?.toClassName()
?: throw SettingsEntryFingerprint.toErrorResult()
?: throw SettingsEntryFingerprint.exception
val settingsButtonInfoClass = SettingsEntryInfoFingerprint.result?.classDef?.type?.toClassName()
?: throw SettingsEntryInfoFingerprint.toErrorResult()
?: throw SettingsEntryInfoFingerprint.exception
// Create a settings entry for 'revanced settings' and add it to settings fragment
AddSettingsEntryFingerprint.result?.apply {
@@ -64,7 +64,7 @@ class SettingsPatch : BytecodePatch(
"""
)
}
} ?: throw AddSettingsEntryFingerprint.toErrorResult()
} ?: throw AddSettingsEntryFingerprint.exception
// Initialize the settings menu once the replaced setting entry is clicked.
AdPersonalizationActivityOnCreateFingerprint.result?.mutableMethod?.apply {
@@ -85,7 +85,7 @@ class SettingsPatch : BytecodePatch(
""",
ExternalLabel("notrevanced", getInstruction(initializeSettingsIndex))
)
} ?: throw AdPersonalizationActivityOnCreateFingerprint.toErrorResult()
} ?: throw AdPersonalizationActivityOnCreateFingerprint.exception
}
private fun String.toClassName(): String {

View File

@@ -1,6 +1,6 @@
package app.revanced.patches.trakt.patch
import app.revanced.extensions.toErrorResult
import app.revanced.extensions.exception
import app.revanced.patcher.annotation.Description
import app.revanced.patcher.annotation.Name
import app.revanced.patcher.data.BytecodeContext
@@ -25,13 +25,13 @@ class UnlockProPatch : BytecodePatch(
arrayOf(IsVIPFingerprint, IsVIPEPFingerprint).onEach { fingerprint ->
// Resolve both fingerprints on the same class.
if (!fingerprint.resolve(context, remoteUserClass))
throw fingerprint.toErrorResult()
throw fingerprint.exception
}.forEach { fingerprint ->
// Return true for both VIP check methods.
fingerprint.result?.mutableMethod?.addInstructions(0, RETURN_TRUE_INSTRUCTIONS)
?: throw fingerprint.toErrorResult()
?: throw fingerprint.exception
}
} ?: throw RemoteUserFingerprint.toErrorResult()
} ?: throw RemoteUserFingerprint.exception
}
private companion object {

View File

@@ -1,6 +1,6 @@
package app.revanced.patches.twelvewidgets.unlock.patch
import app.revanced.extensions.toErrorResult
import app.revanced.extensions.exception
import app.revanced.patcher.annotation.*
import app.revanced.patcher.data.BytecodeContext
import app.revanced.patcher.extensions.InstructionExtensions.addInstructions
@@ -32,7 +32,7 @@ class UnlockPaidWidgetsPatch : BytecodePatch(
ScreentimeSmallWidgetUnlockFingerprint,
WeatherWidgetUnlockFingerprint
).map { fingerprint ->
fingerprint.result?.mutableMethod ?: throw fingerprint.toErrorResult()
fingerprint.result?.mutableMethod ?: throw fingerprint.exception
}.forEach { method ->
method.apply {
removeInstructions(4, 3)

View File

@@ -1,6 +1,6 @@
package app.revanced.patches.twitch.ad.video.patch
import app.revanced.extensions.toErrorResult
import app.revanced.extensions.exception
import app.revanced.patcher.annotation.Description
import app.revanced.patcher.annotation.Name
import app.revanced.patcher.data.BytecodeContext
@@ -95,7 +95,7 @@ class VideoAdsPatch : AbstractAdPatch(
""",
ExternalLabel(skipLabelName, mutableMethod.getInstruction(0))
)
} ?: throw CheckAdEligibilityLambdaFingerprint.toErrorResult()
} ?: throw CheckAdEligibilityLambdaFingerprint.exception
GetReadyToShowAdFingerprint.result?.apply {
val adFormatDeclined = "Ltv/twitch/android/shared/display/ads/theatre/StreamDisplayAdsPresenter\$Action\$AdFormatDeclined;"
@@ -110,7 +110,7 @@ class VideoAdsPatch : AbstractAdPatch(
""",
ExternalLabel(skipLabelName, mutableMethod.getInstruction(0))
)
} ?: throw GetReadyToShowAdFingerprint.toErrorResult()
} ?: throw GetReadyToShowAdFingerprint.exception
// Spoof showAds JSON field
ContentConfigShowAdsFingerprint.result?.apply {
@@ -121,7 +121,7 @@ class VideoAdsPatch : AbstractAdPatch(
return v0
"""
)
} ?: throw ContentConfigShowAdsFingerprint.toErrorResult()
} ?: throw ContentConfigShowAdsFingerprint.exception
SettingsPatch.PreferenceScreen.ADS.CLIENT_SIDE.addPreferences(
SwitchPreference(

View File

@@ -1,6 +1,6 @@
package app.revanced.patches.twitch.chat.antidelete.patch
import app.revanced.extensions.toErrorResult
import app.revanced.extensions.exception
import app.revanced.patcher.annotation.Description
import app.revanced.patcher.annotation.Name
import app.revanced.patcher.data.BytecodeContext
@@ -51,11 +51,11 @@ class ShowDeletedMessagesPatch : BytecodePatch(
""",
ExternalLabel("no_spoiler", getInstruction(implementation!!.instructions.lastIndex))
)
} ?: throw DeletedMessageClickableSpanCtorFingerprint.toErrorResult()
} ?: throw DeletedMessageClickableSpanCtorFingerprint.exception
// Spoiler mode: Disable setHasModAccess setter
SetHasModAccessFingerprint.result?.mutableMethod?.addInstruction(0, "return-void")
?: throw SetHasModAccessFingerprint.toErrorResult()
?: throw SetHasModAccessFingerprint.exception
// Cross-out mode: Reformat span of deleted message
ChatUtilCreateDeletedSpanFingerprint.result?.mutableMethod?.apply {
@@ -69,7 +69,7 @@ class ShowDeletedMessagesPatch : BytecodePatch(
""",
ExternalLabel("no_reformat", getInstruction(0))
)
} ?: throw ChatUtilCreateDeletedSpanFingerprint.toErrorResult()
} ?: throw ChatUtilCreateDeletedSpanFingerprint.exception
SettingsPatch.PreferenceScreen.CHAT.GENERAL.addPreferences(
ListPreference(

View File

@@ -1,6 +1,6 @@
package app.revanced.patches.twitch.chat.autoclaim.patch
import app.revanced.extensions.toErrorResult
import app.revanced.extensions.exception
import app.revanced.patcher.annotation.Description
import app.revanced.patcher.annotation.Name
import app.revanced.patcher.data.BytecodeContext
@@ -60,6 +60,6 @@ class AutoClaimChannelPointPatch : BytecodePatch(
""",
ExternalLabel("auto_claim", getInstruction(lastIndex))
)
} ?: throw CommunityPointsButtonViewDelegateFingerprint.toErrorResult()
} ?: throw CommunityPointsButtonViewDelegateFingerprint.exception
}
}

View File

@@ -1,6 +1,6 @@
package app.revanced.patches.twitch.debug.patch
import app.revanced.extensions.toErrorResult
import app.revanced.extensions.exception
import app.revanced.patcher.annotation.Description
import app.revanced.patcher.annotation.Name
import app.revanced.patcher.data.BytecodeContext
@@ -44,7 +44,7 @@ class DebugModePatch : BytecodePatch(
return v0
"""
)
} ?: throw it.toErrorResult()
} ?: throw it.exception
}
SettingsPatch.PreferenceScreen.MISC.OTHER.addPreferences(

View File

@@ -1,6 +1,6 @@
package app.revanced.patches.twitch.misc.settings.bytecode.patch
import app.revanced.extensions.toErrorResult
import app.revanced.extensions.exception
import app.revanced.patcher.annotation.Description
import app.revanced.patcher.annotation.Name
import app.revanced.patcher.data.BytecodeContext
@@ -55,7 +55,7 @@ class SettingsPatch : BytecodePatch(
""",
ExternalLabel("no_rv_settings_init", mutableMethod.getInstruction(insertIndex))
)
} ?: throw SettingsActivityOnCreateFingerprint.toErrorResult()
} ?: throw SettingsActivityOnCreateFingerprint.exception
// Create new menu item for settings menu
SettingsMenuItemEnumFingerprint.result?.apply {
@@ -65,7 +65,7 @@ class SettingsPatch : BytecodePatch(
REVANCED_SETTINGS_MENU_ITEM_TITLE_RES,
REVANCED_SETTINGS_MENU_ITEM_ICON_RES
)
} ?: throw SettingsMenuItemEnumFingerprint.toErrorResult()
} ?: throw SettingsMenuItemEnumFingerprint.exception
// Intercept settings menu creation and add new menu item
MenuGroupsUpdatedFingerprint.result?.apply {
@@ -77,7 +77,7 @@ class SettingsPatch : BytecodePatch(
move-result-object p1
"""
)
} ?: throw MenuGroupsUpdatedFingerprint.toErrorResult()
} ?: throw MenuGroupsUpdatedFingerprint.exception
// Intercept onclick events for the settings menu
MenuGroupsOnClickFingerprint.result?.apply {
@@ -94,7 +94,7 @@ class SettingsPatch : BytecodePatch(
""",
ExternalLabel("no_rv_settings_onclick", mutableMethod.getInstruction(insertIndex))
)
} ?: throw MenuGroupsOnClickFingerprint.toErrorResult()
} ?: throw MenuGroupsOnClickFingerprint.exception
addString("revanced_settings", "ReVanced Settings", false)
addString("revanced_reboot_message", "Twitch needs to restart to apply your changes. Restart now?", false)

View File

@@ -1,6 +1,6 @@
package app.revanced.patches.vsco.misc.pro.patch
import app.revanced.extensions.toErrorResult
import app.revanced.extensions.exception
import app.revanced.patcher.annotation.*
import app.revanced.patcher.data.BytecodeContext
import app.revanced.patcher.extensions.InstructionExtensions.addInstruction
@@ -25,6 +25,6 @@ class UnlockProPatch : BytecodePatch(
const p1, 0x1
"""
)
} ?: throw RevCatSubscriptionFingerprint.toErrorResult()
} ?: throw RevCatSubscriptionFingerprint.exception
}
}

View File

@@ -1,6 +1,6 @@
package app.revanced.patches.youtube.ad.getpremium.bytecode.patch
import app.revanced.extensions.toErrorResult
import app.revanced.extensions.exception
import app.revanced.patcher.annotation.Name
import app.revanced.patcher.data.BytecodeContext
import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels
@@ -62,7 +62,7 @@ class HideGetPremiumPatch : BytecodePatch(listOf(GetPremiumViewFingerprint)) {
"""
)
}
} ?: throw GetPremiumViewFingerprint.toErrorResult()
} ?: throw GetPremiumViewFingerprint.exception
}
private companion object {

View File

@@ -1,6 +1,6 @@
package app.revanced.patches.youtube.interaction.seekbar.patch
import app.revanced.extensions.toErrorResult
import app.revanced.extensions.exception
import app.revanced.patcher.annotation.Description
import app.revanced.patcher.annotation.Name
import app.revanced.patcher.data.BytecodeContext
@@ -43,7 +43,7 @@ class EnableSeekbarTappingPatch : BytecodePatch(
}
}
seekbarTappingMethods ?: throw OnTouchEventHandlerFingerprint.toErrorResult()
seekbarTappingMethods ?: throw OnTouchEventHandlerFingerprint.exception
SeekbarTappingFingerprint.result?.let {
val insertIndex = it.scanResult.patternScanResult!!.endIndex - 1
@@ -72,6 +72,6 @@ class EnableSeekbarTappingPatch : BytecodePatch(
ExternalLabel("disabled", getInstruction(insertIndex))
)
}
} ?: throw SeekbarTappingFingerprint.toErrorResult()
} ?: throw SeekbarTappingFingerprint.exception
}
}

View File

@@ -3,7 +3,9 @@ package app.revanced.patches.youtube.layout.branding.icon.patch
import app.revanced.patcher.annotation.Description
import app.revanced.patcher.annotation.Name
import app.revanced.patcher.data.ResourceContext
import app.revanced.patcher.patch.*
import app.revanced.patcher.patch.OptionsContainer
import app.revanced.patcher.patch.PatchOption
import app.revanced.patcher.patch.ResourcePatch
import app.revanced.patcher.patch.annotations.Patch
import app.revanced.patches.youtube.layout.branding.icon.annotations.CustomBrandingCompatibility
import app.revanced.util.resources.ResourceUtils
@@ -11,7 +13,7 @@ import app.revanced.util.resources.ResourceUtils.copyResources
import java.io.File
import java.nio.file.Files
@Patch
@Patch(false)
@Name("Custom branding")
@Description("Changes the YouTube launcher icon and name to your choice (defaults to ReVanced).")
@CustomBrandingCompatibility

View File

@@ -1,7 +1,7 @@
package app.revanced.patches.youtube.layout.buttons.autoplay.patch
import app.revanced.extensions.findIndexForIdResource
import app.revanced.extensions.toErrorResult
import app.revanced.extensions.exception
import app.revanced.patcher.annotation.Description
import app.revanced.patcher.annotation.Name
import app.revanced.patcher.data.BytecodeContext
@@ -68,6 +68,6 @@ class HideAutoplayButtonPatch : BytecodePatch(
""",
ExternalLabel("hidden", jumpInstruction)
)
} ?: throw LayoutConstructorFingerprint.toErrorResult()
} ?: throw LayoutConstructorFingerprint.exception
}
}

View File

@@ -1,6 +1,6 @@
package app.revanced.patches.youtube.layout.buttons.navigation.patch
import app.revanced.extensions.toErrorResult
import app.revanced.extensions.exception
import app.revanced.patcher.annotation.Description
import app.revanced.patcher.annotation.Name
import app.revanced.patcher.data.BytecodeContext
@@ -101,7 +101,7 @@ class NavigationButtonsPatch : BytecodePatch(listOf(AddCreateButtonViewFingerpri
initializeButtonsResult.mutableClass
)
)
throw it.toErrorResult()
throw it.exception
}
.map { it.result!!.scanResult.patternScanResult!! }
@@ -150,7 +150,7 @@ class NavigationButtonsPatch : BytecodePatch(listOf(AddCreateButtonViewFingerpri
"""
)
}
} ?: throw AddCreateButtonViewFingerprint.toErrorResult()
} ?: throw AddCreateButtonViewFingerprint.exception
/*
* Resolve fingerprints
@@ -158,7 +158,7 @@ class NavigationButtonsPatch : BytecodePatch(listOf(AddCreateButtonViewFingerpri
InitializeButtonsFingerprint.result!!.let {
if (!PivotBarCreateButtonViewFingerprint.resolve(context, it.mutableMethod, it.mutableClass))
throw PivotBarCreateButtonViewFingerprint.toErrorResult()
throw PivotBarCreateButtonViewFingerprint.exception
}
PivotBarCreateButtonViewFingerprint.result!!.apply {

View File

@@ -1,6 +1,6 @@
package app.revanced.patches.youtube.layout.buttons.navigation.patch
import app.revanced.extensions.toErrorResult
import app.revanced.extensions.exception
import app.revanced.patcher.annotation.Description
import app.revanced.patcher.data.BytecodeContext
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint.Companion.resolve
@@ -28,8 +28,8 @@ class ResolvePivotBarFingerprintsPatch : BytecodePatch(
context,
it.classDef
)
) throw InitializeButtonsFingerprint.toErrorResult()
} ?: throw PivotBarConstructorFingerprint.toErrorResult()
) throw InitializeButtonsFingerprint.exception
} ?: throw PivotBarConstructorFingerprint.exception
}
internal companion object {

View File

@@ -1,6 +1,6 @@
package app.revanced.patches.youtube.layout.buttons.player.hide.patch
import app.revanced.extensions.toErrorResult
import app.revanced.extensions.exception
import app.revanced.patcher.annotation.Description
import app.revanced.patcher.annotation.Name
import app.revanced.patcher.data.BytecodeContext
@@ -67,6 +67,6 @@ class HidePlayerButtonsPatch : BytecodePatch(
move-result v$hasPreviousParameterRegister
"""
)
} ?: throw PlayerControlsVisibilityModelFingerprint.toErrorResult()
} ?: throw PlayerControlsVisibilityModelFingerprint.exception
}
}

View File

@@ -1,6 +1,6 @@
package app.revanced.patches.youtube.layout.hide.albumcards.bytecode.patch
import app.revanced.extensions.toErrorResult
import app.revanced.extensions.exception
import app.revanced.patcher.annotation.Description
import app.revanced.patcher.annotation.Name
import app.revanced.patcher.data.BytecodeContext
@@ -41,6 +41,6 @@ class AlbumCardsPatch : BytecodePatch(
"hideAlbumCard(Landroid/view/View;)V"
)
}
} ?: throw AlbumCardsFingerprint.toErrorResult()
} ?: throw AlbumCardsFingerprint.exception
}
}

View File

@@ -1,6 +1,6 @@
package app.revanced.patches.youtube.layout.hide.breakingnews.bytecode.patch
import app.revanced.extensions.toErrorResult
import app.revanced.extensions.exception
import app.revanced.patcher.annotation.Description
import app.revanced.patcher.annotation.Name
import app.revanced.patcher.data.BytecodeContext
@@ -42,7 +42,7 @@ class BreakingNewsPatch : BytecodePatch(
)
}
} ?: throw BreakingNewsFingerprint.toErrorResult()
} ?: throw BreakingNewsFingerprint.exception
}
}

View File

@@ -1,6 +1,6 @@
package app.revanced.patches.youtube.layout.hide.crowdfundingbox.bytecode.patch
import app.revanced.extensions.toErrorResult
import app.revanced.extensions.exception
import app.revanced.patcher.annotation.Description
import app.revanced.patcher.annotation.Name
import app.revanced.patcher.data.BytecodeContext
@@ -33,7 +33,7 @@ class CrowdfundingBoxPatch : BytecodePatch(
addInstruction(insertIndex, "invoke-static {v$objectRegister}, $INTEGRATIONS_METHOD_DESCRIPTOR")
}
} ?: throw CrowdfundingBoxFingerprint.toErrorResult()
} ?: throw CrowdfundingBoxFingerprint.exception
}
private companion object {

View File

@@ -1,6 +1,6 @@
package app.revanced.patches.youtube.layout.hide.endscreencards.bytecode.patch
import app.revanced.extensions.toErrorResult
import app.revanced.extensions.exception
import app.revanced.patcher.annotation.Description
import app.revanced.patcher.annotation.Name
import app.revanced.patcher.data.BytecodeContext
@@ -32,7 +32,7 @@ class HideEndscreenCardsPatch : BytecodePatch(
) {
override fun execute(context: BytecodeContext) {
fun MethodFingerprint.injectHideCall() {
val layoutResult = result ?: throw toErrorResult()
val layoutResult = result ?: throw exception
layoutResult.mutableMethod.apply {
val insertIndex = layoutResult.scanResult.patternScanResult!!.endIndex + 1
val viewRegister = getInstruction<Instruction21c>(insertIndex - 1).registerA

View File

@@ -1,6 +1,6 @@
package app.revanced.patches.youtube.layout.hide.filterbar.patch
import app.revanced.extensions.toErrorResult
import app.revanced.extensions.exception
import app.revanced.patcher.annotation.Description
import app.revanced.patcher.annotation.Name
import app.revanced.patcher.data.BytecodeContext
@@ -76,6 +76,6 @@ class HideFilterBarPatch : BytecodePatch(
addInstructions(insertIndex, instructions(register))
}
} ?: throw toErrorResult()
} ?: throw exception
}
}

View File

@@ -1,6 +1,6 @@
package app.revanced.patches.youtube.layout.hide.floatingmicrophone.patch
import app.revanced.extensions.toErrorResult
import app.revanced.extensions.exception
import app.revanced.patcher.annotation.Description
import app.revanced.patcher.annotation.Name
import app.revanced.patcher.data.BytecodeContext
@@ -35,7 +35,7 @@ class HideFloatingMicrophoneButtonPatch : BytecodePatch(
"""
)
}
} ?: throw ShowFloatingMicrophoneButtonFingerprint.toErrorResult()
} ?: throw ShowFloatingMicrophoneButtonFingerprint.exception
}
private companion object {

View File

@@ -1,6 +1,6 @@
package app.revanced.patches.youtube.layout.hide.general.patch
import app.revanced.extensions.toErrorResult
import app.revanced.extensions.exception
import app.revanced.patcher.annotation.Description
import app.revanced.patcher.annotation.Name
import app.revanced.patcher.data.BytecodeContext
@@ -272,7 +272,7 @@ class HideLayoutComponentsPatch : BytecodePatch(
addInstruction(0, "move-object/from16 v$freeRegister, p3")
}
} ?: throw ConvertElementToFlatBufferFingerprint.toErrorResult()
} ?: throw ConvertElementToFlatBufferFingerprint.exception
// endregion
}

View File

@@ -1,6 +1,6 @@
package app.revanced.patches.youtube.layout.hide.loadmorebutton.bytecode.patch
import app.revanced.extensions.toErrorResult
import app.revanced.extensions.exception
import app.revanced.patcher.annotation.Description
import app.revanced.patcher.annotation.Name
import app.revanced.patcher.data.BytecodeContext
@@ -33,7 +33,7 @@ class HideLoadMoreButtonPatch : BytecodePatch(listOf(HideLoadMoreButtonFingerpri
"$INTEGRATIONS_CLASS_DESCRIPTOR->hideLoadMoreButton(Landroid/view/View;)V"
)
}
} ?: throw HideLoadMoreButtonFingerprint.toErrorResult()
} ?: throw HideLoadMoreButtonFingerprint.exception
}
private companion object {

View File

@@ -1,6 +1,6 @@
package app.revanced.patches.youtube.layout.hide.personalinformation.bytecode.patch
import app.revanced.extensions.toErrorResult
import app.revanced.extensions.exception
import app.revanced.patcher.annotation.Description
import app.revanced.patcher.annotation.Name
import app.revanced.patcher.data.BytecodeContext
@@ -41,6 +41,6 @@ class HideEmailAddressPatch : BytecodePatch(
"""
)
}
} ?: throw AccountSwitcherAccessibilityLabelFingerprint.toErrorResult()
} ?: throw AccountSwitcherAccessibilityLabelFingerprint.exception
}
}

View File

@@ -1,7 +1,7 @@
package app.revanced.patches.youtube.layout.hide.player.overlay.bytecode.patch
import app.revanced.extensions.indexOfFirstConstantInstructionValue
import app.revanced.extensions.toErrorResult
import app.revanced.extensions.exception
import app.revanced.patcher.annotation.Description
import app.revanced.patcher.annotation.Name
import app.revanced.patcher.data.BytecodeContext
@@ -35,7 +35,7 @@ class HidePlayerOverlayPatch : BytecodePatch(listOf(CreatePlayerOverviewFingerpr
"$INTEGRATIONS_CLASS_DESCRIPTOR->hidePlayerOverlay(Landroid/widget/ImageView;)V"
)
}
} ?: throw CreatePlayerOverviewFingerprint.toErrorResult()
} ?: throw CreatePlayerOverviewFingerprint.exception
}
private companion object {

View File

@@ -2,7 +2,7 @@ package app.revanced.patches.youtube.layout.hide.shorts.bytecode.patch
import app.revanced.extensions.findIndexForIdResource
import app.revanced.extensions.injectHideViewCall
import app.revanced.extensions.toErrorResult
import app.revanced.extensions.exception
import app.revanced.patcher.annotation.Description
import app.revanced.patcher.annotation.Name
import app.revanced.patcher.data.BytecodeContext
@@ -61,7 +61,7 @@ class HideShortsComponentsPatch : BytecodePatch(
"hideShortsShelf"
)
}
} ?: throw ReelConstructorFingerprint.toErrorResult()
} ?: throw ReelConstructorFingerprint.exception
// endregion
@@ -70,7 +70,7 @@ class HideShortsComponentsPatch : BytecodePatch(
// Some Shorts buttons are views, hide them by setting their visibility to GONE.
CreateShortsButtonsFingerprint.result?.let {
ShortsButtons.values().forEach { button -> button.injectHideCall(it.mutableMethod) }
} ?: throw CreateShortsButtonsFingerprint.toErrorResult()
} ?: throw CreateShortsButtonsFingerprint.exception
// endregion
@@ -79,7 +79,7 @@ class HideShortsComponentsPatch : BytecodePatch(
// Hook to get the pivotBar view.
SetPivotBarVisibilityParentFingerprint.result?.let {
if (!SetPivotBarVisibilityFingerprint.resolve(context, it.classDef))
throw SetPivotBarVisibilityFingerprint.toErrorResult()
throw SetPivotBarVisibilityFingerprint.exception
SetPivotBarVisibilityFingerprint.result!!.let { result ->
result.mutableMethod.apply {
@@ -92,17 +92,17 @@ class HideShortsComponentsPatch : BytecodePatch(
)
}
}
} ?: throw SetPivotBarVisibilityParentFingerprint.toErrorResult()
} ?: throw SetPivotBarVisibilityParentFingerprint.exception
// Hook to hide the navigation bar when Shorts are being played.
RenderBottomNavigationBarParentFingerprint.result?.let {
if (!RenderBottomNavigationBarFingerprint.resolve(context, it.classDef))
throw RenderBottomNavigationBarFingerprint.toErrorResult()
throw RenderBottomNavigationBarFingerprint.exception
RenderBottomNavigationBarFingerprint.result!!.mutableMethod.apply {
addInstruction(0, "invoke-static { }, $FILTER_CLASS_DESCRIPTOR->hideNavigationBar()V")
}
} ?: throw RenderBottomNavigationBarParentFingerprint.toErrorResult()
} ?: throw RenderBottomNavigationBarParentFingerprint.exception
// Required to prevent a black bar from appearing at the bottom of the screen.
BottomNavigationBarFingerprint.result?.let {
@@ -117,7 +117,7 @@ class HideShortsComponentsPatch : BytecodePatch(
"hideNavigationBar(Landroid/view/View;)Landroid/view/View;"
)
}
} ?: throw BottomNavigationBarFingerprint.toErrorResult()
} ?: throw BottomNavigationBarFingerprint.exception
// endregion
}

View File

@@ -1,6 +1,6 @@
package app.revanced.patches.youtube.layout.hide.time.patch
import app.revanced.extensions.toErrorResult
import app.revanced.extensions.exception
import app.revanced.patcher.annotation.Description
import app.revanced.patcher.annotation.Name
import app.revanced.patcher.data.BytecodeContext
@@ -47,6 +47,6 @@ class HideTimestampPatch : BytecodePatch(
nop
"""
)
} ?: throw TimeCounterFingerprint.toErrorResult()
} ?: throw TimeCounterFingerprint.exception
}
}

View File

@@ -1,6 +1,6 @@
package app.revanced.patches.youtube.layout.panels.popup.patch
import app.revanced.extensions.toErrorResult
import app.revanced.extensions.exception
import app.revanced.patcher.annotation.Description
import app.revanced.patcher.annotation.Name
import app.revanced.patcher.data.BytecodeContext
@@ -36,7 +36,7 @@ class PlayerPopupPanelsPatch : BytecodePatch(
)
val engagementPanelControllerMethod = EngagementPanelControllerFingerprint
.result?.mutableMethod ?: throw EngagementPanelControllerFingerprint.toErrorResult()
.result?.mutableMethod ?: throw EngagementPanelControllerFingerprint.exception
engagementPanelControllerMethod.addInstructionsWithLabels(
0,

View File

@@ -1,6 +1,6 @@
package app.revanced.patches.youtube.layout.returnyoutubedislike.patch
import app.revanced.extensions.toErrorResult
import app.revanced.extensions.exception
import app.revanced.patcher.annotation.Description
import app.revanced.patcher.annotation.Name
import app.revanced.patcher.data.BytecodeContext
@@ -89,7 +89,7 @@ class ReturnYouTubeDislikePatch : BytecodePatch(
)
}.result?.also { result ->
if (!TextComponentAtomicReferenceFingerprint.resolve(context, result.method, result.classDef))
throw TextComponentAtomicReferenceFingerprint.toErrorResult()
throw TextComponentAtomicReferenceFingerprint.exception
}?.let { textComponentContextFingerprintResult ->
val conversionContextIndex = textComponentContextFingerprintResult
.scanResult.patternScanResult!!.startIndex
@@ -126,7 +126,7 @@ class ReturnYouTubeDislikePatch : BytecodePatch(
"""
)
}
} ?: throw TextComponentContextFingerprint.toErrorResult()
} ?: throw TextComponentContextFingerprint.exception
// endregion
@@ -166,7 +166,7 @@ class ReturnYouTubeDislikePatch : BytecodePatch(
"""
)
}
} ?: throw ShortsTextViewFingerprint.toErrorResult()
} ?: throw ShortsTextViewFingerprint.exception
// endregion
@@ -184,7 +184,7 @@ class ReturnYouTubeDislikePatch : BytecodePatch(
"invoke-static {v$resourceIdentifierRegister, v$textViewRegister}, $INTEGRATIONS_CLASS_DESCRIPTOR->setOldUILayoutDislikes(ILandroid/widget/TextView;)V"
)
}
} ?: throw DislikesOldLayoutTextViewFingerprint.toErrorResult()
} ?: throw DislikesOldLayoutTextViewFingerprint.exception
// endregion
}

View File

@@ -1,6 +1,6 @@
package app.revanced.patches.youtube.layout.searchbar.patch
import app.revanced.extensions.toErrorResult
import app.revanced.extensions.exception
import app.revanced.patcher.annotation.Description
import app.revanced.patcher.annotation.Name
import app.revanced.patcher.data.BytecodeContext
@@ -38,7 +38,7 @@ class WideSearchbarPatch : BytecodePatch(
)
)
val result = CreateSearchSuggestionsFingerprint.result ?: throw CreateSearchSuggestionsFingerprint.toErrorResult()
val result = CreateSearchSuggestionsFingerprint.result ?: throw CreateSearchSuggestionsFingerprint.exception
// patch methods
mapOf(
@@ -60,7 +60,7 @@ class WideSearchbarPatch : BytecodePatch(
fun BytecodeContext.walkMutable(index: Int, fromFingerprint: MethodFingerprint) =
fromFingerprint.result?.let {
toMethodWalker(it.method).nextMethod(index, true).getMethod() as MutableMethod
} ?: throw fromFingerprint.toErrorResult()
} ?: throw fromFingerprint.exception
/**

View File

@@ -1,7 +1,7 @@
package app.revanced.patches.youtube.layout.seekbar.bytecode.patch
import app.revanced.extensions.indexOfFirstConstantInstructionValue
import app.revanced.extensions.toErrorResult
import app.revanced.extensions.exception
import app.revanced.patcher.annotation.Description
import app.revanced.patcher.data.BytecodeContext
import app.revanced.patcher.extensions.InstructionExtensions.addInstructions
@@ -42,11 +42,11 @@ class SeekbarColorBytecodePatch : BytecodePatch(
PlayerSeekbarColorFingerprint.result?.mutableMethod?.apply {
addColorChangeInstructions(SeekbarColorResourcePatch.inlineTimeBarColorizedBarPlayedColorDarkId)
addColorChangeInstructions(SeekbarColorResourcePatch.inlineTimeBarPlayedNotHighlightedColorId)
} ?: throw PlayerSeekbarColorFingerprint.toErrorResult()
} ?: throw PlayerSeekbarColorFingerprint.exception
ShortsSeekbarColorFingerprint.result?.mutableMethod?.apply {
addColorChangeInstructions(SeekbarColorResourcePatch.reelTimeBarPlayedColorId)
} ?: throw ShortsSeekbarColorFingerprint.toErrorResult()
} ?: throw ShortsSeekbarColorFingerprint.exception
SetSeekbarClickedColorFingerprint.result?.let { result ->
result.mutableMethod.let {
@@ -67,7 +67,7 @@ class SeekbarColorBytecodePatch : BytecodePatch(
)
}
}
} ?: throw SetSeekbarClickedColorFingerprint.toErrorResult()
} ?: throw SetSeekbarClickedColorFingerprint.exception
lithoColorOverrideHook(INTEGRATIONS_CLASS_DESCRIPTOR, "getLithoColor")
}

View File

@@ -1,6 +1,6 @@
package app.revanced.patches.youtube.layout.sponsorblock.bytecode.patch
import app.revanced.extensions.toErrorResult
import app.revanced.extensions.exception
import app.revanced.patcher.annotation.Description
import app.revanced.patcher.annotation.Name
import app.revanced.patcher.data.BytecodeContext
@@ -64,8 +64,8 @@ class SponsorBlockBytecodePatch : BytecodePatch(
override fun execute(context: BytecodeContext) {
LayoutConstructorFingerprint.result?.let {
if (!ControlsOverlayFingerprint.resolve(context, it.classDef))
throw ControlsOverlayFingerprint.toErrorResult()
} ?: throw LayoutConstructorFingerprint.toErrorResult()
throw ControlsOverlayFingerprint.exception
} ?: throw LayoutConstructorFingerprint.exception
/*
* Hook the video time methods
@@ -219,7 +219,7 @@ class SponsorBlockBytecodePatch : BytecodePatch(
"invoke-static {v$frameLayoutRegister}, $INTEGRATIONS_SPONSORBLOCK_VIEW_CONTROLLER_CLASS_DESCRIPTOR->initialize(Landroid/view/ViewGroup;)V"
)
}
} ?: throw ControlsOverlayFingerprint.toErrorResult()
} ?: throw ControlsOverlayFingerprint.exception
// get rectangle field name
RectangleFieldInvalidatorFingerprint.resolve(context, seekbarSignatureResult.classDef)
@@ -258,13 +258,13 @@ class SponsorBlockBytecodePatch : BytecodePatch(
// The vote and create segment buttons automatically change their visibility when appropriate,
// but if buttons are showing when the end of the video is reached then they will not automatically hide.
// Add a hook to forcefully hide when the end of the video is reached.
AutoRepeatParentFingerprint.result ?: throw AutoRepeatParentFingerprint.toErrorResult()
AutoRepeatParentFingerprint.result ?: throw AutoRepeatParentFingerprint.exception
AutoRepeatFingerprint.also {
it.resolve(context, AutoRepeatParentFingerprint.result!!.classDef)
}.result?.mutableMethod?.addInstruction(
0,
"invoke-static {}, $INTEGRATIONS_SPONSORBLOCK_VIEW_CONTROLLER_CLASS_DESCRIPTOR->endOfVideoReached()V"
) ?: throw AutoRepeatFingerprint.toErrorResult()
) ?: throw AutoRepeatFingerprint.exception
// TODO: isSBChannelWhitelisting implementation
}

View File

@@ -1,6 +1,6 @@
package app.revanced.patches.youtube.layout.spoofappversion.bytecode.patch
import app.revanced.extensions.toErrorResult
import app.revanced.extensions.exception
import app.revanced.patcher.annotation.Description
import app.revanced.patcher.annotation.Name
import app.revanced.patcher.data.BytecodeContext
@@ -77,7 +77,7 @@ class SpoofAppVersionPatch : BytecodePatch(
move-result-object v$buildOverrideNameRegister
"""
)
} ?: throw SpoofAppVersionFingerprint.toErrorResult()
} ?: throw SpoofAppVersionFingerprint.exception
}
private companion object {

View File

@@ -1,6 +1,6 @@
package app.revanced.patches.youtube.layout.tabletminiplayer.patch
import app.revanced.extensions.toErrorResult
import app.revanced.extensions.exception
import app.revanced.patcher.annotation.Description
import app.revanced.patcher.annotation.Name
import app.revanced.patcher.data.BytecodeContext
@@ -47,7 +47,7 @@ class TabletMiniPlayerPatch : BytecodePatch(
)
// First resolve the fingerprints via the parent fingerprint.
MiniPlayerDimensionsCalculatorParentFingerprint.result ?: throw MiniPlayerDimensionsCalculatorParentFingerprint.toErrorResult()
MiniPlayerDimensionsCalculatorParentFingerprint.result ?: throw MiniPlayerDimensionsCalculatorParentFingerprint.exception
val miniPlayerClass = MiniPlayerDimensionsCalculatorParentFingerprint.result!!.classDef
/*
@@ -89,7 +89,7 @@ class TabletMiniPlayerPatch : BytecodePatch(
}
return@let
} ?: throw MiniPlayerOverrideFingerprint.toErrorResult()
} ?: throw MiniPlayerOverrideFingerprint.exception
/*
* Size check return value override.

View File

@@ -1,6 +1,6 @@
package app.revanced.patches.youtube.layout.theme.bytecode.patch
import app.revanced.extensions.toErrorResult
import app.revanced.extensions.exception
import app.revanced.patcher.annotation.Description
import app.revanced.patcher.annotation.Name
import app.revanced.patcher.data.BytecodeContext
@@ -19,7 +19,7 @@ class LithoColorHookPatch : BytecodePatch(listOf(LithoThemeFingerprint)) {
insertionIndex = it.scanResult.patternScanResult!!.endIndex - 1
colorRegister = "p1"
insertionMethod = it.mutableMethod
} ?: throw LithoThemeFingerprint.toErrorResult()
} ?: throw LithoThemeFingerprint.exception
}
companion object {
private var insertionIndex : Int = -1

View File

@@ -1,6 +1,6 @@
package app.revanced.patches.youtube.layout.thumbnails.patch
import app.revanced.extensions.toErrorResult
import app.revanced.extensions.exception
import app.revanced.patcher.annotation.Description
import app.revanced.patcher.annotation.Name
import app.revanced.patcher.data.BytecodeContext
@@ -73,23 +73,23 @@ class AlternativeThumbnailsPatch : BytecodePatch(
)
MessageDigestImageUrlParentFingerprint.result
?: throw MessageDigestImageUrlParentFingerprint.toErrorResult()
?: throw MessageDigestImageUrlParentFingerprint.exception
MessageDigestImageUrlFingerprint.resolve(context, MessageDigestImageUrlParentFingerprint.result!!.classDef)
MessageDigestImageUrlFingerprint.result?.apply {
loadImageUrlMethod = mutableMethod
} ?: throw MessageDigestImageUrlFingerprint.toErrorResult()
} ?: throw MessageDigestImageUrlFingerprint.exception
addImageUrlHook(INTEGRATIONS_CLASS_DESCRIPTOR, true)
CronetURLRequestCallbackOnResponseStartedFingerprint.result
?: throw CronetURLRequestCallbackOnResponseStartedFingerprint.toErrorResult()
?: throw CronetURLRequestCallbackOnResponseStartedFingerprint.exception
CronetURLRequestCallbackOnSucceededFingerprint.resolve(
context,
CronetURLRequestCallbackOnResponseStartedFingerprint.result!!.classDef
)
CronetURLRequestCallbackOnSucceededFingerprint.result?.apply {
loadImageSuccessCallbackMethod = mutableMethod
} ?: throw CronetURLRequestCallbackOnSucceededFingerprint.toErrorResult()
} ?: throw CronetURLRequestCallbackOnSucceededFingerprint.exception
addImageUrlSuccessCallbackHook(INTEGRATIONS_CLASS_DESCRIPTOR)
@@ -99,7 +99,7 @@ class AlternativeThumbnailsPatch : BytecodePatch(
)
CronetURLRequestCallbackOnFailureFingerprint.result?.apply {
loadImageErrorCallbackMethod = mutableMethod
} ?: throw CronetURLRequestCallbackOnFailureFingerprint.toErrorResult()
} ?: throw CronetURLRequestCallbackOnFailureFingerprint.exception
}
internal companion object {

View File

@@ -1,6 +1,6 @@
package app.revanced.patches.youtube.misc.bottomsheet.hook.patch
import app.revanced.extensions.toErrorResult
import app.revanced.extensions.exception
import app.revanced.patcher.data.BytecodeContext
import app.revanced.patcher.extensions.InstructionExtensions.addInstruction
import app.revanced.patcher.extensions.InstructionExtensions.getInstruction
@@ -29,7 +29,7 @@ class BottomSheetHookPatch : BytecodePatch(
)
}
}
} ?: throw CreateBottomSheetFingerprint.toErrorResult()
} ?: throw CreateBottomSheetFingerprint.exception
}
internal companion object {

View File

@@ -1,6 +1,6 @@
package app.revanced.patches.youtube.misc.fix.backtoexitgesture.patch
import app.revanced.extensions.toErrorResult
import app.revanced.extensions.exception
import app.revanced.patcher.annotation.Description
import app.revanced.patcher.data.BytecodeContext
import app.revanced.patcher.extensions.InstructionExtensions.addInstruction
@@ -27,7 +27,7 @@ class FixBackToExitGesturePatch : BytecodePatch(
resolve(
context,
RecyclerViewTopScrollingParentFingerprint.result?.classDef
?: throw RecyclerViewTopScrollingParentFingerprint.toErrorResult()
?: throw RecyclerViewTopScrollingParentFingerprint.exception
)
}
@@ -68,6 +68,6 @@ class FixBackToExitGesturePatch : BytecodePatch(
mutableMethod.addInstruction(
scanResult.patternScanResult!!.endIndex, targetMethod.toString()
)
} ?: throw this.toErrorResult()
} ?: throw this.exception
}
}

View File

@@ -1,6 +1,6 @@
package app.revanced.patches.youtube.misc.fix.playback.patch
import app.revanced.extensions.toErrorResult
import app.revanced.extensions.exception
import app.revanced.patcher.annotation.Description
import app.revanced.patcher.annotation.Name
import app.revanced.patcher.data.BytecodeContext
@@ -30,7 +30,7 @@ class ClientSpoofPatch : BytecodePatch(
addInstruction(insertIndex, "const-string v$packageNameRegister, \"$ORIGINAL_PACKAGE_NAME\"")
}
} ?: throw UserAgentHeaderBuilderFingerprint.toErrorResult()
} ?: throw UserAgentHeaderBuilderFingerprint.exception
}
private companion object {

View File

@@ -1,6 +1,6 @@
package app.revanced.patches.youtube.misc.fix.playback.patch
import app.revanced.extensions.toErrorResult
import app.revanced.extensions.exception
import app.revanced.patcher.annotation.Description
import app.revanced.patcher.annotation.Name
import app.revanced.patcher.data.BytecodeContext
@@ -52,14 +52,14 @@ class SpoofSignatureVerificationPatch : BytecodePatch(
"""
)
}
} ?: throw ProtobufParameterBuilderFingerprint.toErrorResult()
} ?: throw ProtobufParameterBuilderFingerprint.exception
// When signature spoofing is enabled, the seekbar when tapped does not show
// the video time, chapter names, or the video thumbnail.
// Changing the value returned of this method forces all of these to show up,
// except the thumbnails are blank, which is handled with the patch below.
StoryboardThumbnailParentFingerprint.result ?: throw StoryboardThumbnailParentFingerprint.toErrorResult()
StoryboardThumbnailParentFingerprint.result ?: throw StoryboardThumbnailParentFingerprint.exception
StoryboardThumbnailFingerprint.resolve(context, StoryboardThumbnailParentFingerprint.result!!.classDef)
StoryboardThumbnailFingerprint.result?.apply {
val endIndex = scanResult.patternScanResult!!.endIndex
@@ -81,7 +81,7 @@ class SpoofSignatureVerificationPatch : BytecodePatch(
return v0
"""
)
} ?: throw StoryboardThumbnailFingerprint.toErrorResult()
} ?: throw StoryboardThumbnailFingerprint.exception
// Seekbar thumbnail now show up but are always a blank image.
@@ -99,7 +99,7 @@ class SpoofSignatureVerificationPatch : BytecodePatch(
"""
)
}
} ?: throw ScrubbedPreviewLayoutFingerprint.toErrorResult()
} ?: throw ScrubbedPreviewLayoutFingerprint.exception
}
private companion object {

View File

@@ -1,6 +1,6 @@
package app.revanced.patches.youtube.misc.links.open.patch
import app.revanced.extensions.toErrorResult
import app.revanced.extensions.exception
import app.revanced.patcher.annotation.Description
import app.revanced.patcher.annotation.Name
import app.revanced.patcher.data.BytecodeContext
@@ -42,7 +42,7 @@ class OpenLinksExternallyPatch : BytecodePatch(
BindSessionServiceFingerprint,
InitializeCustomTabSupportFingerprint
).forEach {
val result = it.result ?: throw it.toErrorResult()
val result = it.result ?: throw it.exception
val insertIndex = result.scanResult.patternScanResult!!.endIndex + 1
with(result.mutableMethod) {
val register = (implementation!!.instructions[insertIndex - 1] as Instruction21c).registerA

View File

@@ -1,6 +1,6 @@
package app.revanced.patches.youtube.misc.litho.filter.patch
import app.revanced.extensions.toErrorResult
import app.revanced.extensions.exception
import app.revanced.patcher.annotation.Description
import app.revanced.patcher.data.BytecodeContext
import app.revanced.patcher.extensions.InstructionExtensions.addInstruction
@@ -66,7 +66,7 @@ class LithoFilterPatch : BytecodePatch(
ReadComponentIdentifierFingerprint
).forEach { fingerprint ->
if (fingerprint.resolve(context, it.mutableMethod, it.mutableClass)) return@forEach
throw fingerprint.toErrorResult()
throw fingerprint.exception
}
}?.let { bytesToComponentContextMethod ->
@@ -75,7 +75,7 @@ class LithoFilterPatch : BytecodePatch(
ProtobufBufferReferenceFingerprint.result
?.mutableMethod?.addInstruction(0,
" invoke-static { p2 }, $INTEGRATIONS_CLASS_DESCRIPTOR->setProtoBuffer(Ljava/nio/ByteBuffer;)V")
?: throw ProtobufBufferReferenceFingerprint.toErrorResult()
?: throw ProtobufBufferReferenceFingerprint.exception
// endregion
@@ -141,7 +141,7 @@ class LithoFilterPatch : BytecodePatch(
}
// endregion
} ?: throw ComponentContextParserFingerprint.toErrorResult()
} ?: throw ComponentContextParserFingerprint.exception
LithoFilterFingerprint.result?.mutableMethod?.apply {
removeInstructions(2, 4) // Remove dummy filter.
@@ -157,7 +157,7 @@ class LithoFilterPatch : BytecodePatch(
"""
)
}
} ?: throw LithoFilterFingerprint.toErrorResult()
} ?: throw LithoFilterFingerprint.exception
}
override fun close() = LithoFilterFingerprint.result!!

View File

@@ -1,6 +1,6 @@
package app.revanced.patches.youtube.misc.minimizedplayback.patch
import app.revanced.extensions.toErrorResult
import app.revanced.extensions.exception
import app.revanced.patcher.annotation.Description
import app.revanced.patcher.annotation.Name
import app.revanced.patcher.data.BytecodeContext
@@ -54,10 +54,10 @@ class MinimizedPlaybackPatch : BytecodePatch(
return v0
"""
)
} ?: throw MinimizedPlaybackManagerFingerprint.toErrorResult()
} ?: throw MinimizedPlaybackManagerFingerprint.exception
// Enable minimized playback option in YouTube settings
MinimizedPlaybackSettingsParentFingerprint.result ?: throw MinimizedPlaybackSettingsParentFingerprint.toErrorResult()
MinimizedPlaybackSettingsParentFingerprint.result ?: throw MinimizedPlaybackSettingsParentFingerprint.exception
MinimizedPlaybackSettingsFingerprint.resolve(context, MinimizedPlaybackSettingsParentFingerprint.result!!.classDef)
MinimizedPlaybackSettingsFingerprint.result?.apply {
val booleanCalls = method.implementation!!.instructions.withIndex()
@@ -75,7 +75,7 @@ class MinimizedPlaybackPatch : BytecodePatch(
return v0
"""
)
} ?: throw MinimizedPlaybackSettingsFingerprint.toErrorResult()
} ?: throw MinimizedPlaybackSettingsFingerprint.exception
// Force allowing background play for videos labeled for kids.
// Some regions and YouTube accounts do not require this patch.
@@ -84,7 +84,7 @@ class MinimizedPlaybackPatch : BytecodePatch(
0,
"return-void"
)
} ?: throw KidsMinimizedPlaybackPolicyControllerFingerprint.toErrorResult()
} ?: throw KidsMinimizedPlaybackPolicyControllerFingerprint.exception
}
private companion object {

View File

@@ -1,6 +1,6 @@
package app.revanced.patches.youtube.misc.playercontrols.bytecode.patch
import app.revanced.extensions.toErrorResult
import app.revanced.extensions.exception
import app.revanced.patcher.annotation.Description
import app.revanced.patcher.annotation.Name
import app.revanced.patcher.data.BytecodeContext
@@ -29,8 +29,8 @@ class PlayerControlsBytecodePatch : BytecodePatch(
override fun execute(context: BytecodeContext) {
LayoutConstructorFingerprint.result?.let {
if (!PlayerControlsVisibilityFingerprint.resolve(context, it.classDef))
throw LayoutConstructorFingerprint.toErrorResult()
} ?: throw LayoutConstructorFingerprint.toErrorResult()
throw LayoutConstructorFingerprint.exception
} ?: throw LayoutConstructorFingerprint.exception
showPlayerControlsFingerprintResult = PlayerControlsVisibilityFingerprint.result!!
inflateFingerprintResult = BottomControlsInflateFingerprint.result!!

View File

@@ -1,6 +1,6 @@
package app.revanced.patches.youtube.misc.playertype.patch
import app.revanced.extensions.toErrorResult
import app.revanced.extensions.exception
import app.revanced.patcher.annotation.Description
import app.revanced.patcher.annotation.Name
import app.revanced.patcher.data.BytecodeContext
@@ -24,7 +24,7 @@ class PlayerTypeHookPatch : BytecodePatch(
PlayerTypeFingerprint.result?.mutableMethod?.addInstruction(
0,
"invoke-static {p1}, $INTEGRATIONS_CLASS_DESCRIPTOR->setPlayerType(Ljava/lang/Enum;)V"
) ?: throw PlayerTypeFingerprint.toErrorResult()
) ?: throw PlayerTypeFingerprint.exception
VideoStateFingerprint.result?.let {
it.mutableMethod.apply {
@@ -39,7 +39,7 @@ class PlayerTypeHookPatch : BytecodePatch(
"""
)
}
} ?: throw VideoStateFingerprint.toErrorResult()
} ?: throw VideoStateFingerprint.exception
}
companion object {

View File

@@ -1,6 +1,6 @@
package app.revanced.patches.youtube.misc.settings.bytecode.patch
import app.revanced.extensions.toErrorResult
import app.revanced.extensions.exception
import app.revanced.patcher.annotation.Description
import app.revanced.patcher.annotation.Name
import app.revanced.patcher.data.BytecodeContext
@@ -55,7 +55,7 @@ class SettingsPatch : BytecodePatch(
addInstruction(returnIndex + 1, "return-object v0")
}
}
} ?: throw SetThemeFingerprint.toErrorResult()
} ?: throw SetThemeFingerprint.exception
// Modify the license activity and remove all existing layout code.

View File

@@ -1,6 +1,6 @@
package app.revanced.patches.youtube.video.information.patch
import app.revanced.extensions.toErrorResult
import app.revanced.extensions.exception
import app.revanced.patcher.annotation.Description
import app.revanced.patcher.annotation.Name
import app.revanced.patcher.data.BytecodeContext
@@ -133,7 +133,7 @@ class VideoInformationPatch : BytecodePatch(
getReference(speedSelectionMethodInstructions, 1, Opcode.IGET)
setPlaybackSpeedMethodReference =
getReference(speedSelectionMethodInstructions, 2, Opcode.IGET)
} ?: throw OnPlaybackSpeedItemClickFingerprint.toErrorResult()
} ?: throw OnPlaybackSpeedItemClickFingerprint.exception
userSelectedPlaybackSpeedHook(INTEGRATIONS_CLASS_DESCRIPTOR, "userSelectedPlaybackSpeed")
}

View File

@@ -1,6 +1,6 @@
package app.revanced.patches.youtube.video.quality.patch
import app.revanced.extensions.toErrorResult
import app.revanced.extensions.exception
import app.revanced.patcher.annotation.Description
import app.revanced.patcher.annotation.Name
import app.revanced.patcher.data.BytecodeContext
@@ -158,7 +158,7 @@ class RememberVideoQualityPatch : BytecodePatch(
move-result p2
""",
)
} ?: throw VideoQualitySetterFingerprint.toErrorResult()
} ?: throw VideoQualitySetterFingerprint.exception
// Inject a call to remember the selected quality.
@@ -173,7 +173,7 @@ class RememberVideoQualityPatch : BytecodePatch(
"invoke-static {p$listItemIndexParameter}, $INTEGRATIONS_CLASS_DESCRIPTOR->userChangedQuality(I)V"
)
} ?: throw PatchException("Failed to find onItemClick method")
} ?: throw VideoQualityItemOnClickParentFingerprint.toErrorResult()
} ?: throw VideoQualityItemOnClickParentFingerprint.exception
// Remember video quality if not using old layout menu.
@@ -187,7 +187,7 @@ class RememberVideoQualityPatch : BytecodePatch(
"invoke-static {v$qualityRegister}, $INTEGRATIONS_CLASS_DESCRIPTOR->userChangedQualityInNewFlyout(I)V"
)
}
} ?: throw NewVideoQualityChangedFingerprint.toErrorResult()
} ?: throw NewVideoQualityChangedFingerprint.exception
}

View File

@@ -1,6 +1,6 @@
package app.revanced.patches.youtube.video.speed.custom.patch
import app.revanced.extensions.toErrorResult
import app.revanced.extensions.exception
import app.revanced.patcher.annotation.Description
import app.revanced.patcher.annotation.Name
import app.revanced.patcher.data.BytecodeContext
@@ -156,7 +156,7 @@ class CustomPlaybackSpeedPatch : BytecodePatch(
// This is later called on the field INSTANCE.
val showOldPlaybackSpeedMenuMethod = ShowOldPlaybackSpeedMenuFingerprint.also {
if (!it.resolve(context, result.classDef))
throw ShowOldPlaybackSpeedMenuFingerprint.toErrorResult()
throw ShowOldPlaybackSpeedMenuFingerprint.exception
}.result!!.method.toString()
// Insert the call to the "showOldPlaybackSpeedMenu" method on the field INSTANCE.
@@ -171,8 +171,8 @@ class CustomPlaybackSpeedPatch : BytecodePatch(
invoke-virtual { v0 }, $showOldPlaybackSpeedMenuMethod
"""
)
} ?: throw ShowOldPlaybackSpeedMenuIntegrationsFingerprint.toErrorResult()
} ?: throw GetOldPlaybackSpeedsFingerprint.toErrorResult()
} ?: throw ShowOldPlaybackSpeedMenuIntegrationsFingerprint.exception
} ?: throw GetOldPlaybackSpeedsFingerprint.exception
// endregion
}

View File

@@ -1,6 +1,6 @@
package app.revanced.patches.youtube.video.speed.remember.patch
import app.revanced.extensions.toErrorResult
import app.revanced.extensions.exception
import app.revanced.patcher.annotation.Description
import app.revanced.patcher.annotation.Name
import app.revanced.patcher.data.BytecodeContext
@@ -103,7 +103,7 @@ class RememberPlaybackSpeedPatch : BytecodePatch(
""".trimIndent(),
ExternalLabel("do_not_override", mutableMethod.getInstruction(0))
)
} ?: throw InitializePlaybackSpeedValuesFingerprint.toErrorResult()
} ?: throw InitializePlaybackSpeedValuesFingerprint.exception
}
private companion object {

View File

@@ -1,6 +1,6 @@
package app.revanced.patches.youtube.video.videoid.patch
import app.revanced.extensions.toErrorResult
import app.revanced.extensions.exception
import app.revanced.patcher.annotation.Description
import app.revanced.patcher.annotation.Name
import app.revanced.patcher.data.BytecodeContext
@@ -38,7 +38,7 @@ class VideoIdPatch : BytecodePatch(
consumer(it, insertIndex, videoIdRegister)
}
} ?: throw VideoIdFingerprint.toErrorResult()
} ?: throw VideoIdFingerprint.exception
VideoIdFingerprint.setFields { method, insertIndex, videoIdRegister ->
insertMethod = method

View File

@@ -1,6 +1,6 @@
package app.revanced.patches.youtubevanced.ad.general.patch
import app.revanced.extensions.toErrorResult
import app.revanced.extensions.exception
import app.revanced.patcher.annotation.Description
import app.revanced.patcher.annotation.Name
import app.revanced.patcher.data.BytecodeContext
@@ -54,6 +54,6 @@ class HideAdsPatch : BytecodePatch(
)
}
}
} ?: throw ContainsAdFingerprint.toErrorResult()
} ?: throw ContainsAdFingerprint.exception
}
}

View File

@@ -1,6 +1,6 @@
package app.revanced.util.microg
import app.revanced.extensions.toErrorResult
import app.revanced.extensions.exception
import app.revanced.patcher.data.BytecodeContext
import app.revanced.patcher.extensions.InstructionExtensions.addInstruction
import app.revanced.patcher.extensions.InstructionExtensions.addInstructions
@@ -237,7 +237,7 @@ internal object MicroGBytecodeHelper {
result.mutableMethod.addInstructions(
0, stringInstructions
)
} ?: throw fingerprint.toErrorResult()
} ?: throw fingerprint.exception
}
}
}

View File

@@ -8,13 +8,15 @@ import org.w3c.dom.Node
import java.nio.file.Files
import java.nio.file.StandardCopyOption
internal object ResourceUtils {
@Suppress("MemberVisibilityCanBePrivate")
object ResourceUtils {
/**
* Merge strings. This manages [StringResource]s automatically.
*
* @param host The hosting xml resource. Needs to be a valid strings.xml resource.
*/
internal fun ResourceContext.mergeStrings(host: String) {
fun ResourceContext.mergeStrings(host: String) {
this.iterateXmlNodeChildren(host, "resources") {
// TODO: figure out why this is needed
if (!it.hasAttributes()) return@iterateXmlNodeChildren
@@ -31,10 +33,11 @@ internal object ResourceUtils {
/**
* Copy resources from the current class loader to the resource directory.
*
* @param sourceResourceDirectory The source resource directory name.
* @param resources The resources to copy.
*/
internal fun ResourceContext.copyResources(sourceResourceDirectory: String, vararg resources: ResourceGroup) {
fun ResourceContext.copyResources(sourceResourceDirectory: String, vararg resources: ResourceGroup) {
val classLoader = ResourceUtils.javaClass.classLoader
val targetResourceDirectory = this["res"]
@@ -54,7 +57,7 @@ internal object ResourceUtils {
* @param resourceDirectoryName The name of the directory of the resource.
* @param resources A list of resource names.
*/
internal class ResourceGroup(val resourceDirectoryName: String, vararg val resources: String)
class ResourceGroup(val resourceDirectoryName: String, vararg val resources: String)
/**
* Iterate through the children of a node by its tag.
@@ -62,7 +65,7 @@ internal object ResourceUtils {
* @param targetTag The target xml node.
* @param callback The callback to call when iterating over the nodes.
*/
internal fun ResourceContext.iterateXmlNodeChildren(
fun ResourceContext.iterateXmlNodeChildren(
resource: String,
targetTag: String,
callback: (node: Node) -> Unit