mirror of
https://github.com/revanced/revanced-patches.git
synced 2025-12-25 10:24:08 +01:00
Compare commits
18 Commits
v4.3.0-dev
...
v4.3.0-dev
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
212a94cbb3 | ||
|
|
16eee2f03f | ||
|
|
4937fa5fbd | ||
|
|
a6f5dd933f | ||
|
|
97c4682ccc | ||
|
|
6742cd9232 | ||
|
|
5b2cc10adb | ||
|
|
dbad6252fb | ||
|
|
0f7ed841d1 | ||
|
|
d33d7d8f35 | ||
|
|
3200da8657 | ||
|
|
348e42a374 | ||
|
|
cbbac445b6 | ||
|
|
1593d1352a | ||
|
|
c6fedaa7bc | ||
|
|
d070aebec4 | ||
|
|
d583256f06 | ||
|
|
fc67d284f7 |
2
.github/workflows/build_pull_request.yml
vendored
2
.github/workflows/build_pull_request.yml
vendored
@@ -20,4 +20,6 @@ jobs:
|
||||
uses: burrunan/gradle-cache-action@v1
|
||||
|
||||
- name: Build
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
run: ./gradlew build --no-daemon
|
||||
|
||||
36
CHANGELOG.md
36
CHANGELOG.md
@@ -1,3 +1,39 @@
|
||||
# [4.3.0-dev.9](https://github.com/ReVanced/revanced-patches/compare/v4.3.0-dev.8...v4.3.0-dev.9) (2024-02-28)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **Override certificate pinning:** Always overwrite with a generic network security configuration ([2a842a1](https://github.com/ReVanced/revanced-patches/commit/2a842a1e14e1993eb028ae0bd1a93e227bb929a6))
|
||||
|
||||
# [4.3.0-dev.8](https://github.com/ReVanced/revanced-patches/compare/v4.3.0-dev.7...v4.3.0-dev.8) (2024-02-28)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* Remove extra space from patch description ([#2780](https://github.com/ReVanced/revanced-patches/issues/2780)) ([96a3f35](https://github.com/ReVanced/revanced-patches/commit/96a3f359266ff8d16ae9ee3c6ce2f16ce67a3b93))
|
||||
|
||||
# [4.3.0-dev.7](https://github.com/ReVanced/revanced-patches/compare/v4.3.0-dev.6...v4.3.0-dev.7) (2024-02-26)
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* **OpeningHours:** Add `Fix crash` patch ([#2697](https://github.com/ReVanced/revanced-patches/issues/2697)) ([0d011b8](https://github.com/ReVanced/revanced-patches/commit/0d011b876ecf05031a7daa54ab7e6d3506728a47))
|
||||
|
||||
# [4.3.0-dev.6](https://github.com/ReVanced/revanced-patches/compare/v4.3.0-dev.5...v4.3.0-dev.6) (2024-02-25)
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* **VSCO - Unlock pro:** Constrain to last working version ([6dd4a7c](https://github.com/ReVanced/revanced-patches/commit/6dd4a7c29e48c3bc517bbdd7ed160624c36c2333))
|
||||
|
||||
# [4.3.0-dev.5](https://github.com/ReVanced/revanced-patches/compare/v4.3.0-dev.4...v4.3.0-dev.5) (2024-02-25)
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* Remove unnecessary description from patch ([1a89dd9](https://github.com/ReVanced/revanced-patches/commit/1a89dd9f8cd0c614055a9da97338839b77a25ed1))
|
||||
* **Twitter - Unlock downloads:** Unlock GIF downloads ([d0f91c8](https://github.com/ReVanced/revanced-patches/commit/d0f91c8550592723e1252e1af2971b508591dd59))
|
||||
|
||||
# [4.3.0-dev.4](https://github.com/ReVanced/revanced-patches/compare/v4.3.0-dev.3...v4.3.0-dev.4) (2024-02-22)
|
||||
|
||||
|
||||
|
||||
@@ -64,15 +64,15 @@ This document describes how to contribute to ReVanced Patches.
|
||||
|
||||
## 📖 Resources to help you get started
|
||||
|
||||
* The [documentation](https://github.com/ReVanced/revanced-patches/tree/docs/docs) provides the fundamentals of patches
|
||||
and everything necessary to create your own patch from scratch
|
||||
* The [documentation](https://github.com/ReVanced/revanced-patcher/tree/docs/docs) contains the fundamentals
|
||||
of ReVanced Patcher and how to use ReVanced Patcher to create patches
|
||||
* [Our backlog](https://github.com/orgs/ReVanced/projects/12) is where we keep track of what we're working on
|
||||
* [Issues](https://github.com/ReVanced/revanced-patches/issues) are where we keep track of bugs and feature requests
|
||||
|
||||
## 🙏 Submitting a feature request
|
||||
|
||||
Features can be requested by opening an issue using the
|
||||
[Feature request issue template](https://github.com/ReVanced/revanced-patches/issues/new?assignees=&labels=Feature+request&projects=&template=feature-request.yml&title=feat%3A+).
|
||||
[Feature request issue template](https://github.com/ReVanced/revanced-patches/issues/new?assignees=&labels=Feature+request&projects=&template=feature_request.yml&title=feat%3A+).
|
||||
|
||||
> **Note**
|
||||
> Requests can be accepted or rejected at the discretion of maintainers of ReVanced Patches.
|
||||
@@ -81,7 +81,7 @@ Features can be requested by opening an issue using the
|
||||
## 🐞 Submitting a bug report
|
||||
|
||||
If you encounter a bug while using ReVanced Patches, open an issue using the
|
||||
[Bug report issue template](https://github.com/ReVanced/revanced-patches/issues/new?assignees=&labels=Bug+report&projects=&template=bug-report.yml&title=bug%3A+).
|
||||
[Bug report issue template](https://github.com/ReVanced/revanced-patches/issues/new?assignees=&labels=Bug+report&projects=&template=bug_report.yml&title=bug%3A+).
|
||||
|
||||
## 🧑⚖️ Guidelines for requesting or contributing patches
|
||||
|
||||
@@ -110,7 +110,7 @@ are unaffected by this change.
|
||||
|
||||
## 📝 How to contribute
|
||||
|
||||
1. Before contributing, it is recommended to open an issue to discuss your change
|
||||
1. Before contributing, it is recommended to open an issue to discuss your change
|
||||
with the maintainers of ReVanced Patches. This will help you determine whether your change is acceptable
|
||||
and whether it is worth your time to implement it
|
||||
2. Development happens on the `dev` branch. Fork the repository and create your branch from `dev`
|
||||
|
||||
20
README.md
20
README.md
@@ -67,7 +67,7 @@ This repository contains a collection of ReVanced Patches.
|
||||
|
||||
## ❓ About
|
||||
|
||||
Patches are small modifications to Android apps that allow you to change the behaviour of or add new features,
|
||||
Patches are small modifications to Android apps that allow you to change the behavior of or add new features,
|
||||
block ads, customize the appearance, and much more.
|
||||
|
||||
## 💪 Features
|
||||
@@ -77,11 +77,11 @@ Some of the features the patches provide are:
|
||||
* 🚫 **Block ads**: Say goodbye to ads
|
||||
* ⭐ **Customize your app**: Personalize the appearance of apps with various layouts and themes
|
||||
* 🪄 **Add new features**: Extend the functionality of apps with lots of new features
|
||||
* ⚙️ **Miscellaneous and general purpose**: Rename packages, enable debugging, disable screen capture restrictions,
|
||||
export activities, etc.
|
||||
* ⚙️ **Miscellaneous and general purpose**: Rename packages, enable debugging, disable screen capture restrictions,
|
||||
export activities, etc.
|
||||
* ✨ **And much more!**
|
||||
|
||||
For a full list of all available patches, visit [revanced.app/patches](https://revanced.app/patches).
|
||||
For a complete list of all available patches, visit [revanced.app/patches](https://revanced.app/patches).
|
||||
|
||||
## 🚀 How to get started
|
||||
|
||||
@@ -93,17 +93,13 @@ You can use [ReVanced CLI](https://github.com/ReVanced/revanced-cli) or [ReVance
|
||||
|
||||
Thank you for considering contributing to ReVanced Patches. You can find the contribution guidelines [here](CONTRIBUTING.md).
|
||||
|
||||
### 📃 Documentation
|
||||
|
||||
The documentation provides the fundamentals of patches and everything necessary to create your own patch from scratch.
|
||||
You can find it [here](https://github.com/ReVanced/revanced-patches/tree/docs/docs).
|
||||
|
||||
### 🛠️ Building
|
||||
|
||||
In order to build ReVanced Patches, you can follow the [ReVanced documentation](https://github.com/ReVanced/revanced-documentation).
|
||||
To build ReVanced Patches, you can follow the [ReVanced documentation](https://github.com/ReVanced/revanced-documentation).
|
||||
|
||||
## 📜 Licence
|
||||
|
||||
ReVanced Patches is licensed under the GPLv3 licence. Please see the [licence file](LICENSE) for more information.
|
||||
ReVanced Patches is licensed under the GPLv3 license. Please see the [license file](LICENSE) for more information.
|
||||
[tl;dr](https://www.tldrlegal.com/license/gnu-general-public-license-v3-gpl-3) you may copy, distribute and modify ReVanced Patches as long as you track changes/dates in source files.
|
||||
Any modifications to ReVanced Patches must also be made available under the GPL along with build & install instructions.
|
||||
Any modifications to ReVanced Patches must also be made available under the GPL,
|
||||
along with build & install instructions.
|
||||
@@ -410,6 +410,12 @@ public final class app/revanced/patches/nyx/misc/pro/UnlockProPatch : app/revanc
|
||||
public synthetic fun execute (Lapp/revanced/patcher/data/Context;)V
|
||||
}
|
||||
|
||||
public final class app/revanced/patches/openinghours/misc/fix/crash/FixCrashPatch : app/revanced/patcher/patch/BytecodePatch {
|
||||
public static final field INSTANCE Lapp/revanced/patches/openinghours/misc/fix/crash/FixCrashPatch;
|
||||
public fun execute (Lapp/revanced/patcher/data/BytecodeContext;)V
|
||||
public synthetic fun execute (Lapp/revanced/patcher/data/Context;)V
|
||||
}
|
||||
|
||||
public final class app/revanced/patches/photomath/detection/deviceid/SpoofDeviceIdPatch : app/revanced/patcher/patch/BytecodePatch {
|
||||
public static final field INSTANCE Lapp/revanced/patches/photomath/detection/deviceid/SpoofDeviceIdPatch;
|
||||
public fun execute (Lapp/revanced/patcher/data/BytecodeContext;)V
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
org.gradle.parallel = true
|
||||
org.gradle.caching = true
|
||||
kotlin.code.style = official
|
||||
version = 4.3.0-dev.4
|
||||
version = 4.3.0-dev.9
|
||||
|
||||
@@ -4,6 +4,7 @@ import app.revanced.patcher.data.ResourceContext
|
||||
import app.revanced.patcher.patch.ResourcePatch
|
||||
import app.revanced.patcher.patch.annotation.Patch
|
||||
import app.revanced.patches.all.misc.debugging.EnableAndroidDebuggingPatch
|
||||
import app.revanced.util.Utils.trimIndentMultiline
|
||||
import org.w3c.dom.Element
|
||||
import java.io.File
|
||||
|
||||
@@ -32,10 +33,8 @@ object OverrideCertificatePinningPatch : ResourcePatch() {
|
||||
|
||||
// In case the file does not exist create the "network_security_config.xml" file.
|
||||
File(resXmlDirectory, "network_security_config.xml").apply {
|
||||
if (!exists()) {
|
||||
createNewFile()
|
||||
writeText(
|
||||
"""
|
||||
writeText(
|
||||
"""
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<network-security-config>
|
||||
<base-config cleartextTrafficPermitted="true">
|
||||
@@ -55,21 +54,8 @@ object OverrideCertificatePinningPatch : ResourcePatch() {
|
||||
</trust-anchors>
|
||||
</debug-overrides>
|
||||
</network-security-config>
|
||||
""",
|
||||
)
|
||||
} else {
|
||||
// If the file already exists.
|
||||
readText().let { text ->
|
||||
if (!text.contains("<certificates src=\"user\" />")) {
|
||||
writeText(
|
||||
text.replace(
|
||||
"<trust-anchors>",
|
||||
"<trust-anchors>\n<certificates src=\"user\" overridePins=\"true\" />\n<certificates src=\"system\" />",
|
||||
),
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
""".trimIndentMultiline(),
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,115 @@
|
||||
package app.revanced.patches.openinghours.misc.fix.crash
|
||||
|
||||
import app.revanced.patcher.data.BytecodeContext
|
||||
import app.revanced.patcher.extensions.InstructionExtensions.getInstructions
|
||||
import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction
|
||||
import app.revanced.patcher.extensions.newLabel
|
||||
import app.revanced.patcher.patch.BytecodePatch
|
||||
import app.revanced.patcher.patch.annotation.CompatiblePackage
|
||||
import app.revanced.patcher.patch.annotation.Patch
|
||||
import app.revanced.patches.openinghours.misc.fix.crash.fingerprints.SetPlaceFingerprint
|
||||
import app.revanced.util.exception
|
||||
import app.revanced.util.getReference
|
||||
import com.android.tools.smali.dexlib2.Opcode
|
||||
import com.android.tools.smali.dexlib2.builder.instruction.BuilderInstruction21t
|
||||
import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction
|
||||
import com.android.tools.smali.dexlib2.iface.instruction.Instruction
|
||||
import com.android.tools.smali.dexlib2.iface.reference.MethodReference
|
||||
|
||||
@Patch(
|
||||
name = "Fix crash",
|
||||
compatiblePackages = [CompatiblePackage("de.simon.openinghours", ["1.0"])],
|
||||
)
|
||||
@Suppress("unused")
|
||||
object FixCrashPatch : BytecodePatch(
|
||||
setOf(SetPlaceFingerprint),
|
||||
) {
|
||||
|
||||
override fun execute(context: BytecodeContext) {
|
||||
SetPlaceFingerprint.result?.let {
|
||||
val indexedInstructions = it.mutableMethod.getInstructions().withIndex().toList()
|
||||
|
||||
/**
|
||||
* This function replaces all `checkNotNull` instructions in the integer interval
|
||||
* from [startIndex] to [endIndex], both inclusive. In place of the `checkNotNull`
|
||||
* instruction an if-null check is inserted. If the if-null check yields that
|
||||
* the value is indeed null, we jump to a newly created label at `endIndex + 1`.
|
||||
*/
|
||||
fun avoidNullPointerException(startIndex: Int, endIndex: Int) {
|
||||
val continueLabel = it.mutableMethod.newLabel(endIndex + 1)
|
||||
|
||||
for (index in startIndex..endIndex) {
|
||||
val instruction = indexedInstructions[index].value
|
||||
|
||||
if (!instruction.isCheckNotNullInstruction) {
|
||||
continue
|
||||
}
|
||||
|
||||
val checkNotNullInstruction = instruction as FiveRegisterInstruction
|
||||
val originalRegister = checkNotNullInstruction.registerC
|
||||
|
||||
it.mutableMethod.replaceInstruction(
|
||||
index,
|
||||
BuilderInstruction21t(
|
||||
Opcode.IF_EQZ,
|
||||
originalRegister,
|
||||
continueLabel,
|
||||
),
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
val getOpeningHoursIndex = getIndicesOfInvoke(
|
||||
indexedInstructions,
|
||||
"Lde/simon/openinghours/models/Place;",
|
||||
"getOpeningHours",
|
||||
)
|
||||
|
||||
val setWeekDayTextIndex = getIndexOfInvoke(
|
||||
indexedInstructions,
|
||||
"Lde/simon/openinghours/views/custom/PlaceCard;",
|
||||
"setWeekDayText",
|
||||
)
|
||||
|
||||
val startCalculateStatusIndex = getIndexOfInvoke(
|
||||
indexedInstructions,
|
||||
"Lde/simon/openinghours/views/custom/PlaceCard;",
|
||||
"startCalculateStatus",
|
||||
)
|
||||
|
||||
// Replace the Intrinsics;->checkNotNull instructions with a null check
|
||||
// and jump to our newly created label if it returns true.
|
||||
// This avoids the NullPointerExceptions.
|
||||
avoidNullPointerException(getOpeningHoursIndex[1], startCalculateStatusIndex)
|
||||
avoidNullPointerException(getOpeningHoursIndex[0], setWeekDayTextIndex)
|
||||
} ?: throw SetPlaceFingerprint.exception
|
||||
}
|
||||
|
||||
private fun isInvokeInstruction(instruction: Instruction, className: String, methodName: String): Boolean {
|
||||
val methodRef = instruction.getReference<MethodReference>() ?: return false
|
||||
return methodRef.definingClass == className && methodRef.name == methodName
|
||||
}
|
||||
|
||||
private fun getIndicesOfInvoke(
|
||||
instructions: List<IndexedValue<Instruction>>,
|
||||
className: String,
|
||||
methodName: String,
|
||||
): List<Int> = instructions.mapNotNull { (index, instruction) ->
|
||||
if (isInvokeInstruction(instruction, className, methodName)) {
|
||||
index
|
||||
} else {
|
||||
null
|
||||
}
|
||||
}
|
||||
|
||||
private fun getIndexOfInvoke(
|
||||
instructions: List<IndexedValue<Instruction>>,
|
||||
className: String,
|
||||
methodName: String,
|
||||
): Int = instructions.first { (_, instruction) ->
|
||||
isInvokeInstruction(instruction, className, methodName)
|
||||
}.index
|
||||
|
||||
private val Instruction.isCheckNotNullInstruction
|
||||
get() = isInvokeInstruction(this, "Lkotlin/jvm/internal/Intrinsics;", "checkNotNull")
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
package app.revanced.patches.openinghours.misc.fix.crash.fingerprints
|
||||
|
||||
import app.revanced.patcher.fingerprint.MethodFingerprint
|
||||
|
||||
internal object SetPlaceFingerprint : MethodFingerprint(
|
||||
"V",
|
||||
parameters = listOf("Lde/simon/openinghours/models/Place;"),
|
||||
customFingerprint = { methodDef, _ ->
|
||||
methodDef.definingClass == "Lde/simon/openinghours/views/custom/PlaceCard;" &&
|
||||
methodDef.name == "setPlace"
|
||||
},
|
||||
)
|
||||
@@ -2,27 +2,36 @@ package app.revanced.patches.twitter.interaction.downloads
|
||||
|
||||
import app.revanced.patcher.data.BytecodeContext
|
||||
import app.revanced.patcher.extensions.InstructionExtensions.addInstruction
|
||||
import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels
|
||||
import app.revanced.patcher.extensions.InstructionExtensions.getInstruction
|
||||
import app.revanced.patcher.extensions.InstructionExtensions.getInstructions
|
||||
import app.revanced.patcher.extensions.InstructionExtensions.removeInstruction
|
||||
import app.revanced.patcher.fingerprint.MethodFingerprint
|
||||
import app.revanced.patcher.fingerprint.MethodFingerprintResult
|
||||
import app.revanced.patcher.patch.BytecodePatch
|
||||
import app.revanced.patcher.patch.annotation.CompatiblePackage
|
||||
import app.revanced.patcher.patch.annotation.Patch
|
||||
import app.revanced.patcher.util.smali.ExternalLabel
|
||||
import app.revanced.patches.twitter.interaction.downloads.fingerprints.BuildMediaOptionsSheetFingerprint
|
||||
import app.revanced.patches.twitter.interaction.downloads.fingerprints.ConstructMediaOptionsSheetFingerprint
|
||||
import app.revanced.patches.twitter.interaction.downloads.fingerprints.ShowDownloadVideoUpsellBottomSheetFingerprint
|
||||
import app.revanced.util.exception
|
||||
import com.android.tools.smali.dexlib2.Opcode
|
||||
import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
|
||||
import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction
|
||||
|
||||
@Patch(
|
||||
name = "Unlock downloads",
|
||||
description = "Unlocks the ability to download any video.",
|
||||
compatiblePackages = [CompatiblePackage("com.twitter.android")]
|
||||
description = "Unlocks the ability to download any video. GIFs can be downloaded via the menu on long press.",
|
||||
compatiblePackages = [CompatiblePackage("com.twitter.android")],
|
||||
)
|
||||
@Suppress("unused")
|
||||
object UnlockDownloadsPatch : BytecodePatch(
|
||||
setOf(ConstructMediaOptionsSheetFingerprint, ShowDownloadVideoUpsellBottomSheetFingerprint)
|
||||
setOf(
|
||||
ConstructMediaOptionsSheetFingerprint,
|
||||
ShowDownloadVideoUpsellBottomSheetFingerprint,
|
||||
BuildMediaOptionsSheetFingerprint,
|
||||
),
|
||||
) {
|
||||
override fun execute(context: BytecodeContext) {
|
||||
fun MethodFingerprint.patch(getRegisterAndIndex: MethodFingerprintResult.() -> Pair<Int, Int>) = result?.let {
|
||||
@@ -46,5 +55,29 @@ object UnlockDownloadsPatch : BytecodePatch(
|
||||
|
||||
showDownloadButtonIndex to register
|
||||
}
|
||||
|
||||
// Make GIFs downloadable.
|
||||
BuildMediaOptionsSheetFingerprint.result?.let {
|
||||
val scanResult = it.scanResult.patternScanResult!!
|
||||
it.mutableMethod.apply {
|
||||
val checkMediaTypeIndex = scanResult.startIndex
|
||||
val checkMediaTypeInstruction = getInstruction<TwoRegisterInstruction>(checkMediaTypeIndex)
|
||||
|
||||
// Treat GIFs as videos.
|
||||
addInstructionsWithLabels(
|
||||
checkMediaTypeIndex + 1,
|
||||
"""
|
||||
const/4 v${checkMediaTypeInstruction.registerB}, 0x2 # GIF
|
||||
if-eq v${checkMediaTypeInstruction.registerA}, v${checkMediaTypeInstruction.registerB}, :video
|
||||
""",
|
||||
ExternalLabel("video", getInstruction(scanResult.endIndex)),
|
||||
)
|
||||
|
||||
// Remove media.isDownloadable check.
|
||||
removeInstruction(
|
||||
getInstructions().first { insn -> insn.opcode == Opcode.IGET_BOOLEAN }.location.index + 1,
|
||||
)
|
||||
}
|
||||
} ?: throw BuildMediaOptionsSheetFingerprint.exception
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,14 @@
|
||||
package app.revanced.patches.twitter.interaction.downloads.fingerprints
|
||||
|
||||
import app.revanced.patcher.fingerprint.MethodFingerprint
|
||||
import com.android.tools.smali.dexlib2.Opcode
|
||||
|
||||
internal object BuildMediaOptionsSheetFingerprint : MethodFingerprint(
|
||||
opcodes = listOf(
|
||||
Opcode.IF_EQ,
|
||||
Opcode.SGET_OBJECT,
|
||||
Opcode.GOTO_16,
|
||||
Opcode.NEW_INSTANCE,
|
||||
),
|
||||
strings = listOf("resources.getString(R.string.post_video)"),
|
||||
)
|
||||
@@ -7,9 +7,8 @@ import app.revanced.patches.twitter.misc.hook.patch.BaseHookPatch
|
||||
|
||||
@Patch(
|
||||
name = "Hide ads",
|
||||
description = "Hides ads.",
|
||||
dependencies = [JsonHookPatch::class],
|
||||
compatiblePackages = [CompatiblePackage("com.twitter.android")]
|
||||
compatiblePackages = [CompatiblePackage("com.twitter.android")],
|
||||
)
|
||||
@Suppress("unused")
|
||||
object HideAdsHookPatch : BaseHookPatch("Lapp/revanced/integrations/twitter/patches/hook/patch/ads/AdsHook;")
|
||||
object HideAdsHookPatch : BaseHookPatch("Lapp/revanced/integrations/twitter/patches/hook/patch/ads/AdsHook;")
|
||||
|
||||
@@ -1,20 +1,20 @@
|
||||
package app.revanced.patches.vsco.misc.pro
|
||||
|
||||
import app.revanced.util.exception
|
||||
import app.revanced.patcher.data.BytecodeContext
|
||||
import app.revanced.patcher.extensions.InstructionExtensions.addInstruction
|
||||
import app.revanced.patcher.patch.BytecodePatch
|
||||
import app.revanced.patcher.patch.annotation.CompatiblePackage
|
||||
import app.revanced.patcher.patch.annotation.Patch
|
||||
import app.revanced.patches.vsco.misc.pro.fingerprints.RevCatSubscriptionFingerprint
|
||||
import app.revanced.util.exception
|
||||
|
||||
@Patch(
|
||||
name = "Unlock pro",
|
||||
description = "Unlocks pro features.",
|
||||
compatiblePackages = [CompatiblePackage("com.vsco.cam")]
|
||||
compatiblePackages = [CompatiblePackage("com.vsco.cam", ["345"])],
|
||||
)
|
||||
object UnlockProPatch : BytecodePatch(
|
||||
setOf(RevCatSubscriptionFingerprint)
|
||||
setOf(RevCatSubscriptionFingerprint),
|
||||
) {
|
||||
override fun execute(context: BytecodeContext) {
|
||||
RevCatSubscriptionFingerprint.result?.mutableMethod?.apply {
|
||||
@@ -23,7 +23,7 @@ object UnlockProPatch : BytecodePatch(
|
||||
0,
|
||||
"""
|
||||
const p1, 0x1
|
||||
"""
|
||||
""",
|
||||
)
|
||||
} ?: throw RevCatSubscriptionFingerprint.exception
|
||||
}
|
||||
|
||||
@@ -17,7 +17,7 @@ import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
|
||||
|
||||
@Patch(
|
||||
name = "Enable slide to seek",
|
||||
description = "Adds an option to enable slide to seek instead of playing at 2x speed when pressing and holding in the video player. Including this patch may cause issues with tapping or double tapping the video player overlay.",
|
||||
description = "Adds an option to enable slide to seek instead of playing at 2x speed when pressing and holding in the video player. Including this patch may cause issues with tapping or double tapping the video player overlay.",
|
||||
dependencies = [IntegrationsPatch::class, SettingsPatch::class, AddResourcesPatch::class],
|
||||
compatiblePackages = [
|
||||
CompatiblePackage(
|
||||
|
||||
Reference in New Issue
Block a user