Merge remote-tracking branch 'Ushie/refactor/modernize-api-ushie' into fork/Ushie/refactor/modernize-api-ushie

# Conflicts:
#	patches/src/main/kotlin/app/revanced/patches/amazon/DeepLinkingPatch.kt
#	patches/src/main/kotlin/app/revanced/patches/cieid/restrictions/root/BypassRootChecksPatch.kt
#	patches/src/main/kotlin/app/revanced/patches/duolingo/debug/EnableDebugMenuPatch.kt
#	patches/src/main/kotlin/app/revanced/patches/facebook/ads/story/HideStoryAdsPatch.kt
#	patches/src/main/kotlin/app/revanced/patches/finanzonline/detection/bootloader/BootloaderDetectionPatch.kt
#	patches/src/main/kotlin/app/revanced/patches/hexeditor/ad/DisableAdsPatch.kt
#	patches/src/main/kotlin/app/revanced/patches/inshorts/ad/InshortsAdsPatch.kt
#	patches/src/main/kotlin/app/revanced/patches/lightroom/misc/bypassVersionCheck/DisableVersionCheckPatch.kt
#	patches/src/main/kotlin/app/revanced/patches/music/layout/buttons/HideButtons.kt
#	patches/src/main/kotlin/app/revanced/patches/music/layout/compactheader/HideCategoryBar.kt
#	patches/src/main/kotlin/app/revanced/patches/music/layout/navigationbar/NavigationBarPatch.kt
#	patches/src/main/kotlin/app/revanced/patches/music/misc/backgroundplayback/BackgroundPlaybackPatch.kt
#	patches/src/main/kotlin/app/revanced/patches/protonvpn/splittunneling/UnlockSplitTunneling.kt
#	patches/src/main/kotlin/app/revanced/patches/strava/upselling/DisableSubscriptionSuggestionsPatch.kt
#	patches/src/main/kotlin/app/revanced/patches/tiktok/interaction/cleardisplay/RememberClearDisplayPatch.kt
#	patches/src/main/kotlin/app/revanced/patches/tiktok/interaction/downloads/DownloadsPatch.kt
#	patches/src/main/kotlin/app/revanced/patches/tiktok/interaction/speed/PlaybackSpeedPatch.kt
#	patches/src/main/kotlin/app/revanced/patches/tiktok/misc/login/fixgoogle/FixGoogleLoginPatch.kt
#	patches/src/main/kotlin/app/revanced/patches/tumblr/annoyances/popups/DisableGiftMessagePopupPatch.kt
#	patches/src/main/kotlin/app/revanced/patches/twitch/chat/autoclaim/AutoClaimChannelPointsPatch.kt
#	patches/src/main/kotlin/app/revanced/patches/twitter/layout/viewcount/HideViewCountPatch.kt
#	patches/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt
#	patches/src/main/kotlin/app/revanced/patches/youtube/misc/navigation/Fingerprints.kt
This commit is contained in:
oSumAtrIX
2026-01-23 18:00:45 +01:00
191 changed files with 550 additions and 777 deletions

View File

@@ -1,12 +1,11 @@
package app.revanced.patches.all.misc.build
import app.revanced.patcher.patch.bytecodePatch
import app.revanced.patcher.patch.creatingBytecodePatch
import app.revanced.patcher.patch.longOption
import app.revanced.patcher.patch.stringOption
@Suppress("unused")
val spoofBuildInfoPatch = bytecodePatch(
name = "Spoof build info",
val `Spoof build info` by creatingBytecodePatch(
description = "Spoofs the information about the current build.",
use = false,
) {

View File

@@ -2,8 +2,8 @@ package app.revanced.patches.all.misc.connectivity.telephony.sim.spoof
import app.revanced.patcher.patch.bytecodePatch
@Deprecated("Patch was renamed", ReplaceWith("spoofSimProviderPatch"))
@Deprecated("Patch was renamed", ReplaceWith("`Spoof SIM provider`"))
@Suppress("unused")
val spoofSimCountryPatch = bytecodePatch {
dependsOn(spoofSimProviderPatch)
dependsOn(`Spoof SIM provider`)
}

View File

@@ -2,7 +2,7 @@ package app.revanced.patches.all.misc.connectivity.telephony.sim.spoof
import app.revanced.patcher.extensions.getInstruction
import app.revanced.patcher.extensions.replaceInstruction
import app.revanced.patcher.patch.bytecodePatch
import app.revanced.patcher.patch.creatingBytecodePatch
import app.revanced.patcher.patch.intOption
import app.revanced.patcher.patch.stringOption
import app.revanced.patches.all.misc.transformation.transformInstructionsPatch
@@ -15,8 +15,7 @@ import com.android.tools.smali.dexlib2.util.MethodUtil
import java.util.*
@Suppress("unused")
val spoofSimProviderPatch = bytecodePatch(
name = "Spoof SIM provider",
val `Spoof SIM provider` by creatingBytecodePatch(
description = "Spoofs information about the SIM card provider.",
use = false,
) {

View File

@@ -1,6 +1,6 @@
package app.revanced.patches.all.misc.connectivity.wifi.spoof
import app.revanced.patcher.patch.bytecodePatch
import app.revanced.patcher.patch.creatingBytecodePatch
import app.revanced.patches.all.misc.transformation.IMethodCall
import app.revanced.patches.all.misc.transformation.filterMapInstruction35c
import app.revanced.patches.all.misc.transformation.transformInstructionsPatch
@@ -11,8 +11,7 @@ private const val EXTENSION_CLASS_DESCRIPTOR_PREFIX =
private const val EXTENSION_CLASS_DESCRIPTOR = "$EXTENSION_CLASS_DESCRIPTOR_PREFIX;"
@Suppress("unused")
val spoofWifiPatch = bytecodePatch(
name = "Spoof Wi-Fi connection",
val `Spoof Wi-Fi connection` by creatingBytecodePatch(
description = "Spoofs an existing Wi-Fi connection.",
use = false,
) {

View File

@@ -2,15 +2,14 @@ package app.revanced.patches.all.misc.customcertificates
import app.revanced.patcher.patch.PatchException
import app.revanced.patcher.patch.booleanOption
import app.revanced.patcher.patch.resourcePatch
import app.revanced.patcher.patch.creatingResourcePatch
import app.revanced.patcher.patch.stringsOption
import app.revanced.util.Utils.trimIndentMultiline
import app.revanced.util.getNode
import org.w3c.dom.Element
import java.io.File
val customNetworkSecurityPatch = resourcePatch(
name = "Custom network security",
val `Custom network security` = creatingResourcePatch(
description = "Allows trusting custom certificate authorities for a specific domain.",
use = false
) {

View File

@@ -1,15 +1,14 @@
package app.revanced.patches.all.misc.directory.documentsprovider
import app.revanced.patcher.patch.bytecodePatch
import app.revanced.patcher.patch.resourcePatch
import app.revanced.patcher.patch.creatingResourcePatch
import app.revanced.util.asSequence
import app.revanced.util.getNode
@Suppress("unused")
val exportInternalDataDocumentsProviderPatch = resourcePatch(
name = "Export internal data documents provider",
val `Export internal data documents provider` = creatingResourcePatch(
description = "Exports a documents provider that grants access to the internal data directory of this app " +
"to file managers and other apps that support the Storage Access Framework.",
"to file managers and other apps that support the Storage Access Framework.",
use = false,
) {
dependsOn(

View File

@@ -1,15 +1,14 @@
package app.revanced.patches.all.misc.hex
import app.revanced.patcher.patch.PatchException
import app.revanced.patcher.patch.rawResourcePatch
import app.revanced.patcher.patch.creatingRawResourcePatch
import app.revanced.patcher.patch.stringsOption
import app.revanced.patches.shared.misc.hex.HexPatchBuilder
import app.revanced.patches.shared.misc.hex.hexPatch
import app.revanced.util.Utils.trimIndentMultiline
@Suppress("unused")
val hexPatch = rawResourcePatch(
name = "Hex",
val Hex = creatingRawResourcePatch(
description = "Replaces a hexadecimal patterns of bytes of files in an APK.",
use = false,
) {

View File

@@ -26,10 +26,9 @@ fun setOrGetFallbackPackageName(fallbackPackageName: String): String {
}
}
val changePackageNamePatch = resourcePatch(
name = "Change package name",
val `Change package name` = creatingResourcePatch(
description = "Appends \".revanced\" to the package name by default. " +
"Changing the package name of the app can lead to unexpected issues.",
"Changing the package name of the app can lead to unexpected issues.",
use = false,
) {
packageNameOption = stringOption(
@@ -46,14 +45,14 @@ val changePackageNamePatch = resourcePatch(
default = false,
name = "Update permissions",
description = "Update compatibility receiver permissions. " +
"Enabling this can fix installation errors, but this can also break features in certain apps.",
"Enabling this can fix installation errors, but this can also break features in certain apps.",
)
val updateProviders by booleanOption(
default = false,
name = "Update providers",
description = "Update provider names declared by the app. " +
"Enabling this can fix installation errors, but this can also break features in certain apps.",
"Enabling this can fix installation errors, but this can also break features in certain apps.",
)
afterDependents {

View File

@@ -1,7 +1,7 @@
package app.revanced.patches.all.misc.playintegrity
import app.revanced.patcher.extensions.replaceInstruction
import app.revanced.patcher.patch.bytecodePatch
import app.revanced.patcher.patch.creatingBytecodePatch
import app.revanced.patches.all.misc.transformation.transformInstructionsPatch
import app.revanced.util.getReference
import com.android.tools.smali.dexlib2.iface.instruction.formats.Instruction35c
@@ -20,8 +20,7 @@ private val CONTEXT_BIND_SERVICE_METHOD_REFERENCE = ImmutableMethodReference(
@Suppress("unused")
val disablePlayIntegrityPatch = bytecodePatch(
name = "Disable Play Integrity",
val `Disable Play Integrity` by creatingBytecodePatch(
description = "Prevents apps from using Play Integrity by pretending it is not available.",
use = false,
) {
@@ -42,7 +41,8 @@ val disablePlayIntegrityPatch = bytecodePatch(
transform = { method, entry ->
val (instruction, index, parameterTypes) = entry
val parameterString = parameterTypes.joinToString(separator = "")
val registerString = "v${instruction.registerC}, v${instruction.registerD}, v${instruction.registerE}, v${instruction.registerF}"
val registerString =
"v${instruction.registerC}, v${instruction.registerD}, v${instruction.registerE}, v${instruction.registerF}"
method.replaceInstruction(
index,

View File

@@ -1,6 +1,6 @@
package app.revanced.patches.all.misc.shortcut.sharetargets
import app.revanced.patcher.patch.resourcePatch
import app.revanced.patcher.patch.creatingResourcePatch
import app.revanced.util.asSequence
import app.revanced.util.getNode
import org.w3c.dom.Element
@@ -8,8 +8,7 @@ import java.io.FileNotFoundException
import java.util.logging.Logger
@Suppress("unused")
val removeShareTargetsPatch = resourcePatch(
name = "Remove share targets",
val `Remove share targets` = creatingResourcePatch(
description = "Removes share targets like directly sharing to a frequent contact.",
use = false,
) {
@@ -18,7 +17,8 @@ val removeShareTargetsPatch = resourcePatch(
document("res/xml/shortcuts.xml")
} catch (_: FileNotFoundException) {
return@apply Logger.getLogger(this::class.java.name).warning(
"The app has no shortcuts. No changes applied.")
"The app has no shortcuts. No changes applied."
)
}.use { document ->
val rootNode = document.getNode("shortcuts") as? Element ?: return@use

View File

@@ -1,11 +1,10 @@
package app.revanced.patches.all.misc.spoof
import app.revanced.patcher.patch.resourcePatch
import app.revanced.patcher.patch.creatingResourcePatch
import app.revanced.patcher.patch.stringOption
import app.revanced.util.getNode
import com.android.apksig.ApkVerifier
import com.android.apksig.apk.ApkFormatException
import org.w3c.dom.Element
import java.io.File
import java.io.IOException
import java.nio.file.InvalidPathException
@@ -15,8 +14,8 @@ import java.security.cert.CertificateFactory
import java.util.*
@Suppress("unused")
val enableRomSignatureSpoofing = resourcePatch(
name = "Enable ROM signature spoofing",
val `Enable ROM signature spoofing` = creatingResourcePatch(
name = "",
description = "Spoofs the signature via the manifest meta-data \"fake-signature\". " +
"This patch only works with ROMs that support signature spoofing.",
use = false,

View File

@@ -1,13 +1,12 @@
package app.revanced.patches.all.misc.targetSdk
import app.revanced.patcher.patch.resourcePatch
import app.revanced.patcher.patch.creatingResourcePatch
import app.revanced.util.getNode
import org.w3c.dom.Element
import java.util.logging.Logger
@Suppress("unused")
val setTargetSdkVersion34 = resourcePatch(
name = "Set target SDK version 34",
val `Set target SDK version 34` = creatingResourcePatch(
description = "Changes the target SDK to version 34 (Android 14). " +
"For devices running Android 15+, this will disable edge-to-edge display.",
use = false,

View File

@@ -1,13 +1,12 @@
package app.revanced.patches.all.misc.versioncode
import app.revanced.patcher.patch.creatingResourcePatch
import app.revanced.patcher.patch.intOption
import app.revanced.patcher.patch.resourcePatch
import app.revanced.util.getNode
import org.w3c.dom.Element
@Suppress("unused")
val changeVersionCodePatch = resourcePatch(
name = "Change version code",
val `Change version code` = creatingResourcePatch(
description = "Changes the version code of the app. This will turn off app store updates " +
"and allows downgrading an existing app install to an older app version.",
use = false,

View File

@@ -1,11 +1,10 @@
package app.revanced.patches.amazon
import app.revanced.patcher.patch.bytecodePatch
import app.revanced.patcher.patch.creatingBytecodePatch
import app.revanced.util.returnEarly
@Suppress("unused")
val deepLinkingPatch = bytecodePatch(
name = "Always allow deep-linking",
val `Always allow deep-linking` by creatingBytecodePatch(
description = "Open Amazon links, even if the app is not set to handle Amazon links.",
) {
compatibleWith("com.amazon.mShop.android.shopping")

View File

@@ -1,14 +1,14 @@
package app.revanced.patches.angulus.ads
import app.revanced.patcher.patch.bytecodePatch
import app.revanced.patches.shared.misc.pairip.license.disableLicenseCheckPatch
import app.revanced.patcher.patch.creatingBytecodePatch
import app.revanced.patches.shared.misc.pairip.license.`Disable Pairip license check`
import app.revanced.util.returnEarly
@Suppress("unused")
val angulusPatch = bytecodePatch(name = "Hide ads") {
val `Hide ads` by creatingBytecodePatch {
compatibleWith("com.drinkplusplus.angulus")
dependsOn(disableLicenseCheckPatch)
dependsOn(`Disable Pairip license check`)
apply {
// Always return 0 as the daily measurement count.

View File

@@ -1,11 +1,10 @@
package app.revanced.patches.bandcamp.limitations
import app.revanced.patcher.patch.bytecodePatch
import app.revanced.patcher.patch.creatingBytecodePatch
import app.revanced.util.returnEarly
@Suppress("unused")
val removePlayLimitsPatch = bytecodePatch(
name = "Remove play limits",
val `Remove play limits` by creatingBytecodePatch(
description = "Disables purchase nagging and playback limits of not purchased tracks.",
) {
compatibleWith("com.bandcamp.android")

View File

@@ -1,11 +1,11 @@
package app.revanced.patches.cieid.restrictions.root
import app.revanced.patcher.patch.bytecodePatch
import app.revanced.patcher.extensions.addInstruction
import app.revanced.patcher.patch.creatingBytecodePatch
import app.revanced.util.returnEarly
@Suppress("unused")
val bypassRootChecksPatch = bytecodePatch(
name = "Bypass root checks",
val `Bypass root checks` by creatingBytecodePatch(
description = "Removes the restriction to use the app with root permissions or on a custom ROM.",
) {
compatibleWith("it.ipzs.cieid")

View File

@@ -1,18 +1,17 @@
package app.revanced.patches.com.sbs.ondemand.tv
import app.revanced.patcher.extensions.addInstructions
import app.revanced.patcher.patch.bytecodePatch
import app.revanced.patches.shared.misc.pairip.license.disableLicenseCheckPatch
import app.revanced.patcher.patch.creatingBytecodePatch
import app.revanced.patches.shared.misc.pairip.license.`Disable Pairip license check`
import app.revanced.util.returnEarly
@Suppress("unused")
val removeAdsPatch = bytecodePatch(
name = "Remove ads",
val `Remove ads` by creatingBytecodePatch(
description = "Removes pre-roll, pause and on-demand advertisements from SBS On Demand TV.",
) {
compatibleWith("com.sbs.ondemand.tv")
dependsOn(disableLicenseCheckPatch)
dependsOn(`Disable Pairip license check`)
apply {
shouldShowAdvertisingTVMethod.returnEarly(true)
@@ -25,7 +24,7 @@ val removeAdsPatch = bytecodePatch(
// 3. Exception triggers fallbackToAkamaiProvider() which loads actual content.
// 4. This preserves the intended app flow: first try ads, then fail gracefully, then load content.
requestAdStreamMethod.addInstructions(
0,
0,
"""
new-instance v0, Ljava/lang/RuntimeException;
const-string v1, "Ad stream disabled"

View File

@@ -2,7 +2,7 @@ package app.revanced.patches.cricbuzz.ads
import app.revanced.patcher.extensions.addInstruction
import app.revanced.patcher.extensions.getInstruction
import app.revanced.patcher.patch.bytecodePatch
import app.revanced.patcher.patch.creatingBytecodePatch
import app.revanced.patches.cricbuzz.misc.extension.sharedExtensionPatch
import app.revanced.util.getReference
import app.revanced.util.indexOfFirstInstructionOrThrow
@@ -15,9 +15,7 @@ private const val EXTENSION_CLASS_DESCRIPTOR =
"Lapp/revanced/extension/cricbuzz/ads/HideAdsPatch;"
@Suppress("unused")
val disableAdsPatch = bytecodePatch (
name = "Hide ads",
) {
val `Hide ads` by creatingBytecodePatch {
compatibleWith("com.cricbuzz.android"("6.24.01"))
dependsOn(sharedExtensionPatch)
@@ -28,12 +26,13 @@ val disableAdsPatch = bytecodePatch (
// Remove region-specific Cricbuzz11 elements.
cb11ConstructorMethod.addInstruction(0, "const/4 p7, 0x0")
getBottomBarMethod.apply {
val getIndex = indexOfFirstInstructionOrThrow() {
val getIndex = indexOfFirstInstructionOrThrow {
opcode == Opcode.IGET_OBJECT && getReference<FieldReference>()?.name == "bottomBar"
}
val getRegister = getInstruction<TwoRegisterInstruction>(getIndex).registerA
addInstruction(getIndex + 1,
addInstruction(
getIndex + 1,
"invoke-static { v$getRegister }, $EXTENSION_CLASS_DESCRIPTOR->filterCb11(Ljava/util/List;)V"
)
}

View File

@@ -4,7 +4,7 @@ import app.revanced.patcher.classDef
import app.revanced.patcher.extensions.addInstructions
import app.revanced.patcher.extensions.getInstruction
import app.revanced.patcher.extensions.instructions
import app.revanced.patcher.patch.bytecodePatch
import app.revanced.patcher.patch.creatingBytecodePatch
import app.revanced.util.getReference
import app.revanced.util.indexOfFirstInstruction
import app.revanced.util.removeFlags
@@ -14,9 +14,7 @@ import com.android.tools.smali.dexlib2.iface.instruction.ReferenceInstruction
import com.android.tools.smali.dexlib2.iface.reference.FieldReference
@Suppress("unused")
val hideAdsPatch = bytecodePatch(
name = "Hide ads"
) {
val `Hide ads` by creatingBytecodePatch {
compatibleWith("com.crunchyroll.crunchyroid")
apply {
@@ -42,6 +40,7 @@ val hideAdsPatch = bytecodePatch(
move-object/from16 v0, p0
const/4 v1, 0x0
iput-boolean v1, v0, $enableAdsField
""")
"""
)
}
}

View File

@@ -1,11 +1,10 @@
package app.revanced.patches.disneyplus
import app.revanced.patcher.extensions.addInstructions
import app.revanced.patcher.patch.bytecodePatch
import app.revanced.patcher.patch.creatingBytecodePatch
@Suppress("unused")
val skipAdsPatch = bytecodePatch(
name = "Skip ads",
val `Skip ads` by creatingBytecodePatch(
description = "Automatically skips ads.",
) {
compatibleWith("com.disney.disneyplus")
@@ -13,8 +12,8 @@ val skipAdsPatch = bytecodePatch(
apply {
arrayOf(insertionGetPointsMethod, insertionGetRangesMethod).forEach {
it.addInstructions(
0,
"""
0,
"""
new-instance v0, Ljava/util/ArrayList;
invoke-direct {v0}, Ljava/util/ArrayList;-><init>()V
return-object v0

View File

@@ -3,13 +3,11 @@ package app.revanced.patches.duolingo.ad
import app.revanced.patcher.classDef
import app.revanced.patcher.extensions.addInstructions
import app.revanced.patcher.extensions.getInstruction
import app.revanced.patcher.patch.bytecodePatch
import app.revanced.patcher.patch.creatingBytecodePatch
import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction
@Suppress("unused")
val disableAdsPatch = bytecodePatch(
"Disable ads",
) {
val `Disable ads` by creatingBytecodePatch {
// 6.55.3 and higher can show ads after each exercise.
compatibleWith("com.duolingo"("6.54.5"))

View File

@@ -3,13 +3,12 @@ package app.revanced.patches.duolingo.debug
import app.revanced.patcher.classDef
import app.revanced.patcher.extensions.addInstruction
import app.revanced.patcher.extensions.getInstruction
import app.revanced.patcher.patch.bytecodePatch
import app.revanced.patcher.patch.creatingBytecodePatch
import app.revanced.util.returnEarly
import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
@Suppress("unused")
val enableDebugMenuPatch = bytecodePatch(
name = "Enable debug menu",
val `Enable debug menu` by creatingBytecodePatch(
use = false,
) {
compatibleWith("com.duolingo")

View File

@@ -2,12 +2,11 @@ package app.revanced.patches.duolingo.energy
import app.revanced.patcher.classDef
import app.revanced.patcher.extensions.addInstructions
import app.revanced.patcher.patch.bytecodePatch
import app.revanced.patcher.patch.creatingBytecodePatch
import app.revanced.util.findFieldFromToString
@Suppress("unused")
val skipEnergyRechargeAdsPatch = bytecodePatch(
name = "Skip energy recharge ads",
val `Skip energy recharge ads` by creatingBytecodePatch(
description = "Skips watching ads to recharge energy."
) {
compatibleWith("com.duolingo")

View File

@@ -2,18 +2,16 @@ package app.revanced.patches.facebook.ads.mainfeed
import app.revanced.patcher.extensions.addInstructions
import app.revanced.patcher.extensions.addInstructionsWithLabels
import app.revanced.patcher.patch.bytecodePatch
import com.android.tools.smali.dexlib2.mutable.MutableMethod.Companion.toMutable
import app.revanced.patcher.patch.creatingBytecodePatch
import com.android.tools.smali.dexlib2.AccessFlags
import com.android.tools.smali.dexlib2.builder.MutableMethodImplementation
import com.android.tools.smali.dexlib2.iface.instruction.formats.Instruction31i
import com.android.tools.smali.dexlib2.immutable.ImmutableMethod
import com.android.tools.smali.dexlib2.immutable.ImmutableMethodParameter
import com.android.tools.smali.dexlib2.mutable.MutableMethod.Companion.toMutable
@Suppress("unused")
val hideSponsoredStoriesPatch = bytecodePatch(
name = "Hide 'Sponsored Stories'",
) {
val `Hide 'Sponsored Stories'` by creatingBytecodePatch {
compatibleWith("com.facebook.katana"("490.0.0.63.82"))
apply {

View File

@@ -1,12 +1,11 @@
package app.revanced.patches.facebook.ads.story
import app.revanced.patcher.patch.bytecodePatch
import app.revanced.patcher.patch.creatingBytecodePatch
import app.revanced.util.returnEarly
import com.android.tools.smali.dexlib2.mutable.MutableMethod
@Suppress("unused")
val hideStoryAdsPatch = bytecodePatch(
name = "Hide story ads",
val `Hide story ads` by creatingBytecodePatch(
description = "Hides the ads in the Facebook app stories.",
) {
compatibleWith("com.facebook.katana")

View File

@@ -1,11 +1,10 @@
package app.revanced.patches.finanzonline.detection.bootloader
import app.revanced.patcher.patch.bytecodePatch
import app.revanced.util.returnEarly
import app.revanced.patcher.patch.creatingBytecodePatch
@Suppress("unused")
val bootloaderDetectionPatch = bytecodePatch(
name = "Remove bootloader detection",
val `Remove bootloader detection` by creatingBytecodePatch(
description = "Removes the check for an unlocked bootloader.",
) {
compatibleWith("at.gv.bmf.bmf2go")

View File

@@ -2,12 +2,11 @@ package app.revanced.patches.googlenews.customtabs
import app.revanced.patcher.extensions.getInstruction
import app.revanced.patcher.extensions.replaceInstruction
import app.revanced.patcher.patch.bytecodePatch
import app.revanced.patcher.patch.creatingBytecodePatch
import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
@Suppress("unused")
val enableCustomTabsPatch = bytecodePatch(
name = "Enable CustomTabs",
val `Enable CustomTabs` by creatingBytecodePatch(
description = "Enables CustomTabs to open articles in your default browser.",
) {
compatibleWith("com.google.android.apps.magazines")

View File

@@ -1,11 +1,10 @@
package app.revanced.patches.googlephotos.misc.backup
import app.revanced.patcher.patch.bytecodePatch
import app.revanced.patcher.patch.creatingBytecodePatch
import app.revanced.util.returnEarly
@Suppress("unused")
val enableDCIMFoldersBackupControlPatch = bytecodePatch(
name = "Enable DCIM folders backup control",
val `Enable DCIM folders backup control` by creatingBytecodePatch(
description = "Disables always on backup for the Camera and other DCIM folders, allowing you to control backup " +
"for each folder individually. This will make the app default to having no folders backed up.",
use = false,

View File

@@ -2,7 +2,7 @@ package app.revanced.patches.googlephotos.misc.features
import app.revanced.patcher.extensions.instructions
import app.revanced.patcher.extensions.replaceInstruction
import app.revanced.patcher.patch.bytecodePatch
import app.revanced.patcher.patch.creatingBytecodePatch
import app.revanced.patcher.patch.stringsOption
import app.revanced.util.getReference
import com.android.tools.smali.dexlib2.Opcode
@@ -10,8 +10,7 @@ import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
import com.android.tools.smali.dexlib2.iface.reference.StringReference
@Suppress("unused")
val spoofFeaturesPatch = bytecodePatch(
name = "Spoof features",
val `Spoof features` by creatingBytecodePatch(
description = "Spoofs the device to enable Google Pixel exclusive features, including unlimited storage.",
) {
compatibleWith("com.google.android.apps.photos")
@@ -49,7 +48,7 @@ val spoofFeaturesPatch = bytecodePatch(
),
name = "Features to disable",
description = "Google Pixel exclusive features to disable." +
"Features after Pixel XL may have to be disabled for unlimited storage depending on the device.",
"Features after Pixel XL may have to be disabled for unlimited storage depending on the device.",
required = true,
)

View File

@@ -3,12 +3,11 @@ package app.revanced.patches.googlerecorder.restrictions
import app.revanced.patcher.extensions.addInstruction
import app.revanced.patcher.extensions.getInstruction
import app.revanced.patcher.extensions.removeInstructions
import app.revanced.patcher.patch.bytecodePatch
import app.revanced.patcher.patch.creatingBytecodePatch
import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
@Suppress("unused")
val removeDeviceRestrictionsPatch = bytecodePatch(
name = "Remove device restrictions",
val `Remove device restrictions` by creatingBytecodePatch(
description = "Removes restrictions from using the app on any device. Requires mounting patched app over original.",
) {
compatibleWith("com.google.android.apps.recorder")

View File

@@ -1,12 +1,10 @@
package app.revanced.patches.hexeditor.ad
import app.revanced.patcher.patch.bytecodePatch
import app.revanced.util.returnEarly
import app.revanced.patcher.patch.creatingBytecodePatch
@Suppress("unused")
val disableAdsPatch = bytecodePatch(
name = "Disable ads",
) {
val `Disable ads` by creatingBytecodePatch {
compatibleWith("com.myprog.hexedit")
apply {

View File

@@ -1,12 +1,10 @@
package app.revanced.patches.iconpackstudio.misc.pro
import app.revanced.patcher.extensions.addInstructions
import app.revanced.patcher.patch.bytecodePatch
import app.revanced.patcher.patch.creatingBytecodePatch
@Suppress("unused")
val unlockProPatch = bytecodePatch(
name = "Unlock pro",
) {
val `Unlock pro` by creatingBytecodePatch {
compatibleWith("ginlemon.iconpackstudio"("2.2 build 016"))
apply {

View File

@@ -1,12 +1,11 @@
package app.revanced.patches.idaustria.detection.deviceintegrity
import app.revanced.patcher.extensions.addInstructions
import app.revanced.patcher.patch.bytecodePatch
import app.revanced.patcher.patch.creatingBytecodePatch
import app.revanced.util.returnEarly
@Suppress("unused")
val removeDeviceIntegrityChecksPatch = bytecodePatch(
name = "Remove device integrity checks",
val `Remove device integrity checks` by creatingBytecodePatch(
description = "Removes the check for root permissions and unlocked bootloader.",
) {
compatibleWith("at.gv.oe.app")

View File

@@ -1,10 +1,10 @@
package app.revanced.patches.idaustria.detection.root
import app.revanced.patcher.patch.bytecodePatch
import app.revanced.patches.idaustria.detection.deviceintegrity.removeDeviceIntegrityChecksPatch
import app.revanced.patcher.patch.creatingBytecodePatch
import app.revanced.patches.idaustria.detection.deviceintegrity.`Remove device integrity checks`
@Deprecated("Patch was superseded", ReplaceWith("removeDeviceIntegrityChecksPatch"))
@Deprecated("Patch was superseded", ReplaceWith("`Remove device integrity checks`"))
@Suppress("unused")
val rootDetectionPatch = bytecodePatch {
dependsOn(removeDeviceIntegrityChecksPatch)
val rootDetectionPatch by creatingBytecodePatch {
dependsOn(`Remove device integrity checks`)
}

View File

@@ -1,11 +1,10 @@
package app.revanced.patches.idaustria.detection.signature
import app.revanced.patcher.patch.bytecodePatch
import app.revanced.patcher.patch.creatingBytecodePatch
import app.revanced.util.returnEarly
@Suppress("unused")
val spoofSignaturePatch = bytecodePatch(
name = "Spoof signature",
val `Spoof signature` by creatingBytecodePatch(
description = "Spoofs the signature of the app.",
) {
compatibleWith("at.gv.oe.app")
@@ -13,16 +12,16 @@ val spoofSignaturePatch = bytecodePatch(
apply {
val expectedSignature =
"OpenSSLRSAPublicKey{modulus=ac3e6fd6050aa7e0d6010ae58190404cd89a56935b44f6fee" +
"067c149768320026e10b24799a1339e414605e448e3f264444a327b9ae292be2b62ad567dd1800dbed4a88f718a33dc6db6b" +
"f5178aa41aa0efff8a3409f5ca95dbfccd92c7b4298966df806ea7a0204a00f0e745f6d9f13bdf24f3df715d7b62c1600906" +
"15de1c8a956b9286764985a3b3c060963c435fb9481a5543aaf0671fc2dba6c5c2b17d1ef1d85137f14dc9bbdf3490288087" +
"324cd48341cce64fabf6a9b55d1a7bf23b2fcdff451fd85bf0c7feb0a5e884d7c5c078e413149566a12a686e6efa70ae5161" +
"a0201307692834cda336c55157fef125e67c01c1359886f94742105596b42a790404bbcda5dad6a65f115aaff5e45ef3c28b" +
"2316ff6cef07aa49a45aa58c07bf258051b13ef449ccb37a3679afd5cfb9132f70bb9d931a937897544f90c3bcc80ed012e9" +
"f6ba020b8cdc23f8c29ac092b88f0e370ff9434e4f0f359e614ae0868dc526fa41e4b7596533e8d10279b66e923ecd9f0b20" +
"0def55be2c1f6f9c72c92fb45d7e0a9ac571cb38f0a9a37bb33ea06f223fde8c7a92e8c47769e386f9799776e8f110c21df2" +
"77ef1be61b2c01ebdabddcbf53cc4b6fd9a3c445606ee77b3758162c80ad8f8137b3c6864e92db904807dcb2be9d7717dd21" +
"bf42c121d620ddfb7914f7a95c713d9e1c1b7bdb4a03d618e40cf7e9e235c0b5687e03b7ab3,publicExponent=10001}"
"067c149768320026e10b24799a1339e414605e448e3f264444a327b9ae292be2b62ad567dd1800dbed4a88f718a33dc6db6b" +
"f5178aa41aa0efff8a3409f5ca95dbfccd92c7b4298966df806ea7a0204a00f0e745f6d9f13bdf24f3df715d7b62c1600906" +
"15de1c8a956b9286764985a3b3c060963c435fb9481a5543aaf0671fc2dba6c5c2b17d1ef1d85137f14dc9bbdf3490288087" +
"324cd48341cce64fabf6a9b55d1a7bf23b2fcdff451fd85bf0c7feb0a5e884d7c5c078e413149566a12a686e6efa70ae5161" +
"a0201307692834cda336c55157fef125e67c01c1359886f94742105596b42a790404bbcda5dad6a65f115aaff5e45ef3c28b" +
"2316ff6cef07aa49a45aa58c07bf258051b13ef449ccb37a3679afd5cfb9132f70bb9d931a937897544f90c3bcc80ed012e9" +
"f6ba020b8cdc23f8c29ac092b88f0e370ff9434e4f0f359e614ae0868dc526fa41e4b7596533e8d10279b66e923ecd9f0b20" +
"0def55be2c1f6f9c72c92fb45d7e0a9ac571cb38f0a9a37bb33ea06f223fde8c7a92e8c47769e386f9799776e8f110c21df2" +
"77ef1be61b2c01ebdabddcbf53cc4b6fd9a3c445606ee77b3758162c80ad8f8137b3c6864e92db904807dcb2be9d7717dd21" +
"bf42c121d620ddfb7914f7a95c713d9e1c1b7bdb4a03d618e40cf7e9e235c0b5687e03b7ab3,publicExponent=10001}"
spoofSignatureMethod.returnEarly(expectedSignature)
}

View File

@@ -1,12 +1,10 @@
package app.revanced.patches.inshorts.ad
import app.revanced.patcher.patch.bytecodePatch
import app.revanced.util.returnEarly
import app.revanced.patcher.patch.creatingBytecodePatch
@Suppress("unused")
val hideAdsPatch = bytecodePatch(
name = "Hide ads",
) {
val `Hide ads` by creatingBytecodePatch {
compatibleWith("com.nis.app")
apply {

View File

@@ -1,13 +1,11 @@
package app.revanced.patches.instagram.ads
import app.revanced.patcher.patch.bytecodePatch
import app.revanced.patcher.patch.creatingBytecodePatch
import app.revanced.patches.meta.ads.adInjectorMethod
import app.revanced.util.returnEarly
@Suppress("unused")
val hideAdsPatch = bytecodePatch(
name = "Hide ads",
) {
val `Hide ads` by creatingBytecodePatch {
compatibleWith("com.instagram.android")
apply {

View File

@@ -4,7 +4,7 @@ import app.revanced.patcher.classDef
import app.revanced.patcher.extensions.addInstructions
import app.revanced.patcher.extensions.getInstruction
import app.revanced.patcher.fingerprint
import app.revanced.patcher.patch.bytecodePatch
import app.revanced.patcher.patch.creatingBytecodePatch
import app.revanced.patches.instagram.misc.extension.sharedExtensionPatch
import app.revanced.util.getReference
import app.revanced.util.indexOfFirstInstructionOrThrow
@@ -14,8 +14,7 @@ import com.android.tools.smali.dexlib2.iface.reference.FieldReference
internal const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/instagram/feed/LimitFeedToFollowedProfiles;"
@Suppress("unused")
val limitFeedToFollowedProfiles = bytecodePatch(
name = "Limit feed to followed profiles",
val `Limit feed to followed profiles` by creatingBytecodePatch(
description = "Filters the home feed to display only content from profiles you follow.",
use = false,
) {

View File

@@ -1,12 +1,11 @@
package app.revanced.patches.instagram.ghost.story
import app.revanced.patcher.patch.bytecodePatch
import app.revanced.patcher.patch.creatingBytecodePatch
import app.revanced.util.Utils.trimIndentMultiline
import app.revanced.util.returnEarly
@Suppress("unused")
val anonymousStoryViewingPatch = bytecodePatch(
name = "Anonymous story viewing",
val `Anonymous story viewing` by creatingBytecodePatch(
description = """
View stories without sending any information to the server.
Your view will not appear in the story viewers list.

View File

@@ -4,7 +4,7 @@ import app.revanced.patcher.Fingerprint
import app.revanced.patcher.extensions.getInstruction
import app.revanced.patcher.extensions.replaceInstruction
import app.revanced.patcher.patch.BytecodePatchContext
import app.revanced.patcher.patch.bytecodePatch
import app.revanced.patcher.patch.creatingBytecodePatch
import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
context(BytecodePatchContext)
@@ -26,8 +26,7 @@ internal fun Fingerprint.replaceJsonFieldWithBogus(
}
@Suppress("unused")
val hideExploreFeedPatch = bytecodePatch(
name = "Hide explore feed",
val `Hide explore feed` by creatingBytecodePatch(
description = "Hides posts and reels from the explore/search page.",
use = false,
) {

View File

@@ -1,10 +1,10 @@
package app.revanced.patches.instagram.hide.stories
import app.revanced.patcher.extensions.removeInstruction
import app.revanced.patcher.patch.bytecodePatch
import app.revanced.patcher.patch.creatingBytecodePatch
@Suppress("unused")
val hideStoriesPatch = bytecodePatch(
name = "Hide Stories from Home",
val `Hide Stories from Home` by creatingBytecodePatch(
description = "Hides Stories from the main page, by removing the buttons.",
use = false
) {

View File

@@ -1,11 +1,10 @@
package app.revanced.patches.instagram.hide.suggestions
import app.revanced.patcher.patch.bytecodePatch
import app.revanced.patcher.patch.creatingBytecodePatch
import app.revanced.patches.instagram.hide.explore.replaceJsonFieldWithBogus
@Suppress("unused")
val hideSuggestedContent = bytecodePatch(
name = "Hide suggested content",
val `Hide suggested content` by creatingBytecodePatch(
description = "Hides suggested stories, reels, threads and survey from feed (Suggested posts will still be shown).",
use = false,
) {

View File

@@ -1,6 +1,6 @@
package app.revanced.patches.instagram.misc.devmenu
import app.revanced.patcher.patch.bytecodePatch
import app.revanced.patcher.patch.creatingBytecodePatch
import app.revanced.util.Utils.trimIndentMultiline
import app.revanced.util.getReference
import app.revanced.util.indexOfFirstInstructionReversedOrThrow
@@ -9,8 +9,7 @@ import com.android.tools.smali.dexlib2.Opcode
import com.android.tools.smali.dexlib2.iface.reference.MethodReference
@Suppress("unused")
val enableDeveloperMenuPatch = bytecodePatch(
name = "Enable developer menu",
val `Enable developer menu` by creatingBytecodePatch(
description = """
Enables the developer menu, which can be found at the bottom of settings menu with name 'Internal Settings'.

View File

@@ -2,7 +2,7 @@ package app.revanced.patches.instagram.misc.links
import app.revanced.patcher.extensions.addInstructions
import app.revanced.patcher.extensions.getInstruction
import app.revanced.patcher.patch.bytecodePatch
import app.revanced.patcher.patch.creatingBytecodePatch
import app.revanced.patches.instagram.misc.extension.sharedExtensionPatch
import app.revanced.util.indexOfFirstInstructionOrThrow
import com.android.tools.smali.dexlib2.Opcode
@@ -11,8 +11,7 @@ import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction
private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/instagram/misc/links/OpenLinksExternallyPatch;"
@Suppress("unused")
val openLinksExternallyPatch = bytecodePatch(
name = "Open links externally",
val `Open links externally` by creatingBytecodePatch(
description = "Changes links to always open in your external browser, instead of the in-app browser.",
use = false,
) {

View File

@@ -1,7 +1,7 @@
package app.revanced.patches.instagram.misc.share.domain
import app.revanced.patcher.extensions.addInstructions
import app.revanced.patcher.patch.bytecodePatch
import app.revanced.patcher.patch.creatingBytecodePatch
import app.revanced.patcher.patch.stringOption
import app.revanced.patches.instagram.misc.extension.sharedExtensionPatch
import app.revanced.patches.instagram.misc.share.editShareLinksPatch
@@ -11,8 +11,7 @@ internal const val EXTENSION_CLASS_DESCRIPTOR =
"Lapp/revanced/extension/instagram/misc/share/domain/ChangeLinkSharingDomainPatch;"
@Suppress("unused")
val changeLinkSharingDomainPatch = bytecodePatch(
name = "Change link sharing domain",
val `Change link sharing domain` by creatingBytecodePatch(
description = "Replaces the domain name of shared links.",
use = false
) {

View File

@@ -1,11 +1,10 @@
package app.revanced.patches.instagram.misc.signature
import app.revanced.patcher.patch.bytecodePatch
import app.revanced.patcher.patch.creatingBytecodePatch
import app.revanced.util.returnEarly
@Suppress("unused")
val signatureCheckPatch = bytecodePatch(
name = "Disable signature check",
val `Disable signature check` by creatingBytecodePatch(
description = "Disables the signature check that can cause the app to crash on startup. " +
"Using this patch may cause issues with sharing or opening external Instagram links.",
use = false

View File

@@ -2,12 +2,11 @@ package app.revanced.patches.instagram.reels
import app.revanced.patcher.classDef
import app.revanced.patcher.extensions.addInstructions
import app.revanced.patcher.patch.bytecodePatch
import app.revanced.patcher.patch.creatingBytecodePatch
import app.revanced.util.returnEarly
@Suppress("unused")
val disableReelsScrollingPatch = bytecodePatch(
name = "Disable Reels scrolling",
val `Disable Reels scrolling` by creatingBytecodePatch(
description = "Disables the endless scrolling behavior in Instagram Reels, preventing swiping to the next Reel. " +
"Note: On a clean install, the 'Tip' animation may appear but will stop on its own after a few seconds.",
use = true

View File

@@ -1,11 +1,10 @@
package app.revanced.patches.instagram.story.flipping
import app.revanced.patcher.patch.bytecodePatch
import app.revanced.patcher.patch.creatingBytecodePatch
import app.revanced.util.returnEarly
@Suppress("unused")
val disableStoryAutoFlippingPatch = bytecodePatch(
name = "Disable story auto flipping",
val `Disable story auto flipping` by creatingBytecodePatch(
description = "Disable stories automatically flipping/skipping after some seconds.",
use = false
) {

View File

@@ -1,12 +1,10 @@
package app.revanced.patches.irplus.ad
import app.revanced.patcher.extensions.addInstruction
import app.revanced.patcher.patch.bytecodePatch
import app.revanced.patcher.patch.creatingBytecodePatch
@Suppress("unused")
val removeAdsPatch = bytecodePatch(
name = "Remove ads",
) {
val `Remove ads` by creatingBytecodePatch {
compatibleWith("net.binarymode.android.irplus")
apply {

View File

@@ -1,13 +1,11 @@
package app.revanced.patches.letterboxd.ads
import app.revanced.patcher.extensions.addInstruction
import app.revanced.patcher.patch.bytecodePatch
import app.revanced.patcher.patch.creatingBytecodePatch
import app.revanced.util.returnEarly
@Suppress("unused")
val hideAdsPatch = bytecodePatch(
name = "Hide ads",
) {
val `Hide ads` by creatingBytecodePatch {
compatibleWith("com.letterboxd.letterboxd")
apply {

View File

@@ -1,12 +1,10 @@
package app.revanced.patches.letterboxd.unlock.unlockAppIcons
import app.revanced.patcher.patch.bytecodePatch
import app.revanced.patcher.patch.creatingBytecodePatch
import app.revanced.util.returnEarly
@Suppress("unused")
val unlockAppIconsPatch = bytecodePatch(
name = "Unlock app icons",
) {
val `Unlock app icons` by creatingBytecodePatch {
compatibleWith("com.letterboxd.letterboxd")
apply {

View File

@@ -2,12 +2,10 @@ package app.revanced.patches.lightroom.misc.login
import app.revanced.patcher.extensions.instructions
import app.revanced.patcher.extensions.replaceInstruction
import app.revanced.patcher.patch.bytecodePatch
import app.revanced.patcher.patch.creatingBytecodePatch
@Suppress("unused")
val disableMandatoryLoginPatch = bytecodePatch(
name = "Disable mandatory login",
) {
val `Disable mandatory login` by creatingBytecodePatch {
compatibleWith("com.adobe.lrmobile"("9.3.0"))
apply {

View File

@@ -1,12 +1,10 @@
package app.revanced.patches.lightroom.misc.premium
import app.revanced.patcher.extensions.replaceInstruction
import app.revanced.patcher.patch.bytecodePatch
import app.revanced.patcher.patch.creatingBytecodePatch
@Suppress("unused")
val unlockPremiumPatch = bytecodePatch(
name = "Unlock Premium",
) {
val `Unlock Premium` by creatingBytecodePatch {
compatibleWith("com.adobe.lrmobile"("9.3.0"))
apply {

View File

@@ -1,14 +1,12 @@
package app.revanced.patches.memegenerator.misc.pro
import app.revanced.patcher.extensions.replaceInstructions
import app.revanced.patcher.patch.bytecodePatch
import app.revanced.patcher.patch.creatingBytecodePatch
import app.revanced.patches.memegenerator.detection.license.licenseValidationPatch
import app.revanced.patches.memegenerator.detection.signature.signatureVerificationPatch
@Suppress("unused")
val unlockProVersionPatch = bytecodePatch(
name = "Unlock pro",
) {
val `Unlock pro` by creatingBytecodePatch {
dependsOn(signatureVerificationPatch, licenseValidationPatch)
compatibleWith("com.zombodroid.MemeGenerator"("4.6364", "4.6370", "4.6375", "4.6377"))

View File

@@ -1,11 +1,10 @@
package app.revanced.patches.messenger.inbox
import app.revanced.patcher.extensions.replaceInstruction
import app.revanced.patcher.patch.bytecodePatch
import app.revanced.patcher.patch.creatingBytecodePatch
@Suppress("unused")
val hideInboxAdsPatch = bytecodePatch(
name = "Hide inbox ads",
val `Hide inbox ads` by creatingBytecodePatch(
description = "Hides ads in inbox.",
) {
compatibleWith("com.facebook.orca")

View File

@@ -1,11 +1,10 @@
package app.revanced.patches.messenger.inbox
import app.revanced.patcher.extensions.replaceInstruction
import app.revanced.patcher.patch.bytecodePatch
import app.revanced.patcher.patch.creatingBytecodePatch
@Suppress("unused")
val hideInboxSubtabsPatch = bytecodePatch(
name = "Hide inbox subtabs",
val `Hide inbox subtabs` by creatingBytecodePatch(
description = "Hides Home and Channels tabs between active now tray and chats.",
) {
compatibleWith("com.facebook.orca")

View File

@@ -1,11 +1,10 @@
package app.revanced.patches.messenger.layout
import app.revanced.patcher.patch.bytecodePatch
import app.revanced.patcher.patch.creatingBytecodePatch
import app.revanced.util.returnEarly
@Suppress("unused")
val hideFacebookButtonPatch = bytecodePatch(
name = "Hide Facebook button",
val `Hide Facebook button` by creatingBytecodePatch(
description = "Hides the Facebook button in the top toolbar."
) {
compatibleWith("com.facebook.orca")

View File

@@ -4,7 +4,7 @@ import app.revanced.patcher.extensions.addInstructions
import app.revanced.patcher.extensions.getInstruction
import app.revanced.patcher.extensions.replaceInstruction
import app.revanced.patcher.method
import app.revanced.patcher.patch.bytecodePatch
import app.revanced.patcher.patch.creatingBytecodePatch
import app.revanced.patches.messenger.misc.extension.sharedExtensionPatch
import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
import com.android.tools.smali.dexlib2.iface.instruction.WideLiteralInstruction
@@ -13,8 +13,7 @@ internal const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/messeng
internal const val EXTENSION_METHOD_NAME = "overrideBooleanFlag"
@Suppress("unused")
val removeMetaAIPatch = bytecodePatch(
name = "Remove Meta AI",
val `Remove Meta AI` by creatingBytecodePatch(
description = "Removes UI elements related to Meta AI."
) {
compatibleWith("com.facebook.orca")

View File

@@ -2,18 +2,17 @@ package app.revanced.patches.mifitness.misc.locale
import app.revanced.patcher.extensions.getInstruction
import app.revanced.patcher.extensions.replaceInstruction
import app.revanced.patcher.patch.bytecodePatch
import app.revanced.patches.mifitness.misc.login.fixLoginPatch
import app.revanced.patcher.patch.creatingBytecodePatch
import app.revanced.patches.mifitness.misc.login.`Fix login`
import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
@Suppress("unused")
val forceEnglishLocalePatch = bytecodePatch(
name = "Force English locale",
val `Force English locale` by creatingBytecodePatch(
description = "Forces wearable devices to use the English locale.",
) {
compatibleWith("com.xiaomi.wearable")
dependsOn(fixLoginPatch)
dependsOn(`Fix login`)
apply {
syncBluetoothLanguageMethod.apply {

View File

@@ -1,10 +1,9 @@
package app.revanced.patches.mifitness.misc.login
import app.revanced.patcher.extensions.addInstruction
import app.revanced.patcher.patch.bytecodePatch
import app.revanced.patcher.patch.creatingBytecodePatch
val fixLoginPatch = bytecodePatch(
name = "Fix login",
val `Fix login` by creatingBytecodePatch(
description = "Fixes login for uncertified Mi Fitness app",
) {
compatibleWith("com.xiaomi.wearable")

View File

@@ -1,7 +1,7 @@
package app.revanced.patches.music.ad.video
import app.revanced.patcher.extensions.addInstructions
import app.revanced.patcher.patch.bytecodePatch
import app.revanced.patcher.patch.creatingBytecodePatch
import app.revanced.patches.all.misc.resources.addResources
import app.revanced.patches.all.misc.resources.addResourcesPatch
import app.revanced.patches.music.misc.extension.sharedExtensionPatch
@@ -12,8 +12,7 @@ import app.revanced.patches.shared.misc.settings.preference.SwitchPreference
private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/music/patches/HideVideoAdsPatch;"
@Suppress("unused")
val hideVideoAdsPatch = bytecodePatch(
name = "Hide music video ads",
val `Hide music video ads` by creatingBytecodePatch(
description = "Adds an option to hide ads that appear while listening to or streaming music videos, podcasts, or songs.",
) {
dependsOn(

View File

@@ -1,13 +1,12 @@
package app.revanced.patches.music.audio.exclusiveaudio
import app.revanced.patcher.patch.bytecodePatch
import app.revanced.patcher.patch.creatingBytecodePatch
import app.revanced.patches.music.misc.extension.sharedExtensionPatch
import app.revanced.patches.music.misc.settings.settingsPatch
import app.revanced.util.returnEarly
@Suppress("unused")
val enableExclusiveAudioPlaybackPatch = bytecodePatch(
name = "Enable exclusive audio playback",
val `Enable exclusive audio playback` by creatingBytecodePatch(
description = "Enables the option to play audio without video.",
) {
dependsOn(

View File

@@ -3,7 +3,7 @@ package app.revanced.patches.music.interaction.permanentrepeat
import app.revanced.patcher.extensions.ExternalLabel
import app.revanced.patcher.extensions.addInstructionsWithLabels
import app.revanced.patcher.extensions.instructions
import app.revanced.patcher.patch.bytecodePatch
import app.revanced.patcher.patch.creatingBytecodePatch
import app.revanced.patches.all.misc.resources.addResources
import app.revanced.patches.all.misc.resources.addResourcesPatch
import app.revanced.patches.music.misc.extension.sharedExtensionPatch
@@ -15,8 +15,7 @@ import app.revanced.util.findFreeRegister
private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/music/patches/PermanentRepeatPatch;"
@Suppress("unused")
val permanentRepeatPatch = bytecodePatch(
name = "Permanent repeat",
val `Permanent repeat` by creatingBytecodePatch(
description = "Adds an option to always repeat even if the playlist ends or another track is played."
) {
dependsOn(

View File

@@ -3,7 +3,7 @@ package app.revanced.patches.music.layout.buttons
import app.revanced.patcher.extensions.addInstruction
import app.revanced.patcher.extensions.addInstructions
import app.revanced.patcher.extensions.getInstruction
import app.revanced.patcher.patch.bytecodePatch
import app.revanced.patcher.patch.creatingBytecodePatch
import app.revanced.patches.all.misc.resources.addResources
import app.revanced.patches.all.misc.resources.addResourcesPatch
import app.revanced.patches.music.misc.extension.sharedExtensionPatch
@@ -32,8 +32,7 @@ internal var topBarMenuItemImageView = -1L
private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/music/patches/HideButtonsPatch;"
@Suppress("unused")
val hideButtons = bytecodePatch(
name = "Hide buttons",
val `Hide buttons` by creatingBytecodePatch(
description = "Adds options to hide the cast, history, notification, and search buttons.",
) {
dependsOn(

View File

@@ -2,7 +2,7 @@ package app.revanced.patches.music.layout.compactheader
import app.revanced.patcher.extensions.addInstruction
import app.revanced.patcher.extensions.getInstruction
import app.revanced.patcher.patch.bytecodePatch
import app.revanced.patcher.patch.creatingBytecodePatch
import app.revanced.patches.all.misc.resources.addResources
import app.revanced.patches.all.misc.resources.addResourcesPatch
import app.revanced.patches.music.misc.extension.sharedExtensionPatch
@@ -18,8 +18,7 @@ internal var chipCloud = -1L
private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/music/patches/HideCategoryBarPatch;"
@Suppress("unused")
val hideCategoryBar = bytecodePatch(
name = "Hide category bar",
val `Hide category bar` by creatingBytecodePatch(
description = "Adds an option to hide the category bar at the top of the homepage.",
) {
dependsOn(

View File

@@ -3,7 +3,7 @@
package app.revanced.patches.music.layout.miniplayercolor
import app.revanced.patcher.extensions.getInstruction
import app.revanced.patcher.patch.bytecodePatch
import app.revanced.patcher.patch.creatingBytecodePatch
import app.revanced.patches.all.misc.resources.addResources
import app.revanced.patches.all.misc.resources.addResourcesPatch
import app.revanced.patches.music.misc.extension.sharedExtensionPatch
@@ -11,11 +11,7 @@ import app.revanced.patches.music.misc.settings.PreferenceScreen
import app.revanced.patches.music.misc.settings.settingsPatch
import app.revanced.patches.shared.misc.mapping.resourceMappingPatch
import app.revanced.patches.shared.misc.settings.preference.SwitchPreference
import app.revanced.util.addInstructionsAtControlFlowLabel
import app.revanced.util.findFreeRegister
import app.revanced.util.getReference
import app.revanced.util.indexOfFirstInstructionOrThrow
import app.revanced.util.indexOfFirstInstructionReversedOrThrow
import app.revanced.util.*
import com.android.tools.smali.dexlib2.AccessFlags
import com.android.tools.smali.dexlib2.Opcode
import com.android.tools.smali.dexlib2.iface.instruction.ReferenceInstruction
@@ -25,8 +21,7 @@ import com.android.tools.smali.dexlib2.iface.reference.MethodReference
private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/music/patches/ChangeMiniplayerColorPatch;"
@Suppress("unused")
val changeMiniplayerColor = bytecodePatch(
name = "Change miniplayer color",
val `Change miniplayer color` by creatingBytecodePatch(
description = "Adds an option to change the miniplayer background color to match the fullscreen player."
) {
dependsOn(

View File

@@ -3,7 +3,7 @@ package app.revanced.patches.music.layout.navigationbar
import app.revanced.patcher.extensions.addInstruction
import app.revanced.patcher.extensions.getInstruction
import app.revanced.patcher.patch.PatchException
import app.revanced.patcher.patch.bytecodePatch
import app.revanced.patcher.patch.creatingBytecodePatch
import app.revanced.patcher.patch.resourcePatch
import app.revanced.patches.all.misc.resources.addResources
import app.revanced.patches.all.misc.resources.addResourcesPatch
@@ -27,8 +27,7 @@ internal var text1 = -1L
private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/music/patches/NavigationBarPatch;"
@Suppress("unused")
val navigationBarPatch = bytecodePatch(
name = "Navigation bar",
val `Navigation bar` by creatingBytecodePatch(
description = "Adds options to hide navigation bar, labels and buttons.",
) {
dependsOn(

View File

@@ -4,7 +4,7 @@ import app.revanced.patcher.extensions.addInstruction
import app.revanced.patcher.extensions.addInstructionsWithLabels
import app.revanced.patcher.extensions.getInstruction
import app.revanced.patcher.extensions.replaceInstruction
import app.revanced.patcher.patch.bytecodePatch
import app.revanced.patcher.patch.creatingBytecodePatch
import app.revanced.patches.all.misc.resources.addResources
import app.revanced.patches.all.misc.resources.addResourcesPatch
import app.revanced.patches.music.misc.extension.sharedExtensionPatch
@@ -16,8 +16,7 @@ import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction
private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/music/patches/HideGetPremiumPatch;"
@Suppress("unused")
val hideGetPremiumPatch = bytecodePatch(
name = "Hide 'Get Music Premium'",
val `Hide 'Get Music Premium'` by creatingBytecodePatch(
description = "Adds an option to hide the \"Get Music Premium\" label in the settings and account menu.",
) {
dependsOn(

View File

@@ -1,13 +1,12 @@
package app.revanced.patches.music.misc.androidauto
import app.revanced.patcher.patch.bytecodePatch
import app.revanced.patcher.patch.creatingBytecodePatch
import app.revanced.patches.music.misc.extension.sharedExtensionPatch
import app.revanced.patches.music.misc.settings.settingsPatch
import app.revanced.util.returnEarly
@Suppress("unused")
val bypassCertificateChecksPatch = bytecodePatch(
name = "Bypass certificate checks",
val `Bypass certificate checks` by creatingBytecodePatch(
description = "Bypasses certificate checks which prevent YouTube Music from working on Android Auto.",
) {
dependsOn(

View File

@@ -1,12 +1,11 @@
package app.revanced.patches.music.misc.backgroundplayback
import app.revanced.patcher.patch.bytecodePatch
import app.revanced.patcher.patch.creatingBytecodePatch
import app.revanced.patches.music.misc.extension.sharedExtensionPatch
import app.revanced.patches.music.misc.settings.settingsPatch
import app.revanced.util.returnEarly
val backgroundPlaybackPatch = bytecodePatch(
name = "Remove background playback restrictions",
val `Remove background playback restrictions` by creatingBytecodePatch(
description = "Removes restrictions on background playback, including playing kids videos in the background.",
) {
dependsOn(

View File

@@ -1,14 +1,13 @@
package app.revanced.patches.piccomafr.misc
import app.revanced.patcher.patch.bytecodePatch
import app.revanced.patcher.patch.creatingBytecodePatch
import app.revanced.patcher.patch.stringOption
import app.revanced.util.returnEarly
@Suppress("unused")
val spoofAndroidDeviceIdPatch = bytecodePatch(
name = "Spoof Android device ID",
val `Spoof Android device ID` by creatingBytecodePatch(
description = "Spoofs the Android device ID used by the app for account authentication." +
"This can be used to copy the account to another device.",
"This can be used to copy the account to another device.",
use = false,
) {
compatibleWith(

View File

@@ -3,32 +3,29 @@ package app.revanced.patches.protonvpn.splittunneling
import app.revanced.patcher.extensions.getInstruction
import app.revanced.patcher.extensions.removeInstruction
import app.revanced.patcher.extensions.replaceInstruction
import app.revanced.patcher.patch.bytecodePatch
import app.revanced.patcher.patch.creatingBytecodePatch
import app.revanced.util.getReference
import app.revanced.util.indexOfFirstInstructionOrThrow
import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
import com.android.tools.smali.dexlib2.iface.reference.MethodReference
@Suppress("unused")
val unlockSplitTunnelingPatch =
bytecodePatch(
name = "Unlock split tunneling",
) {
compatibleWith("ch.protonvpn.android")
val `Unlock split tunneling` by creatingBytecodePatch {
compatibleWith("ch.protonvpn.android")
apply {
val registerIndex = enableSplitTunnelingUiMethod.patternMatch!!.endIndex - 1 // TODO
apply {
val registerIndex = enableSplitTunnelingUiMethod.patternMatch!!.endIndex - 1 // TODO
enableSplitTunnelingUiMethod.apply {
val register = getInstruction<OneRegisterInstruction>(registerIndex).registerA
replaceInstruction(registerIndex, "const/4 v$register, 0x0")
}
initializeSplitTunnelingSettingsUIMethod.apply {
val initSettingsIndex = indexOfFirstInstructionOrThrow {
getReference<MethodReference>()?.name == "getSplitTunneling"
}
removeInstruction(initSettingsIndex - 1)
enableSplitTunnelingUiMethod.apply {
val register = getInstruction<OneRegisterInstruction>(registerIndex).registerA
replaceInstruction(registerIndex, "const/4 v$register, 0x0")
}
initializeSplitTunnelingSettingsUIMethod.apply {
val initSettingsIndex = indexOfFirstInstructionOrThrow {
getReference<MethodReference>()?.name == "getSplitTunneling"
}
removeInstruction(initSettingsIndex - 1)
}
}
}

View File

@@ -15,7 +15,7 @@ fun spoofClientPatch(
redirectUri: String,
block: BytecodePatchBuilder.(Option<String>) -> Unit = {},
) = bytecodePatch(
name = "Spoof client",
name = "Spoof client", // TODO
description = "Restores functionality of the app by using custom client ID.",
) {
block(

View File

@@ -1,12 +1,10 @@
package app.revanced.patches.reddit.customclients.sync.ads
import app.revanced.patcher.patch.BytecodePatchBuilder
import app.revanced.patcher.patch.bytecodePatch
import app.revanced.patcher.patch.creatingBytecodePatch
import app.revanced.util.returnEarly
fun disableAdsPatch(block: BytecodePatchBuilder.() -> Unit = {}) = bytecodePatch(
name = "Disable ads",
) {
fun `Disable ads`(block: BytecodePatchBuilder.() -> Unit = {}) = creatingBytecodePatch {
apply {
isAdsEnabledMethod.returnEarly(false)
}

View File

@@ -1,10 +1,10 @@
package app.revanced.patches.reddit.customclients.sync.syncforlemmy.ads
import app.revanced.patches.reddit.customclients.sync.ads.disableAdsPatch
import app.revanced.patches.reddit.customclients.sync.ads.`Disable ads`
import app.revanced.patches.reddit.customclients.sync.detection.piracy.disablePiracyDetectionPatch
@Suppress("unused")
val disableAdsPatch = disableAdsPatch {
val disableAdsPatch = `Disable ads` {
dependsOn(disablePiracyDetectionPatch)
compatibleWith("com.laurencedawson.reddit_sync")

View File

@@ -1,8 +1,8 @@
package app.revanced.patches.reddit.customclients.sync.syncforreddit.ads
import app.revanced.patches.reddit.customclients.sync.ads.disableAdsPatch
import app.revanced.patches.reddit.customclients.sync.ads.`Disable ads`
@Suppress("unused")
val disableAdsPatch = disableAdsPatch {
val disableAdsPatch = `Disable ads` {
compatibleWith("io.syncapps.lemmy_sync")
}

View File

@@ -5,7 +5,7 @@ import app.revanced.patcher.extensions.removeInstruction
import app.revanced.patcher.patch.creatingBytecodePatch
@Suppress("unused", "ObjectPropertyName")
val `Disable Sync for Lemmy bottom sheet` = creatingBytecodePatch(
val `Disable Sync for Lemmy bottom sheet` by creatingBytecodePatch(
description = "Disables the bottom sheet at the startup that asks you to signup to \"Sync for Lemmy\".",
) {
compatibleWith(

View File

@@ -3,12 +3,11 @@ package app.revanced.patches.reddit.customclients.sync.syncforreddit.fix.user
import app.revanced.patcher.extensions.getInstruction
import app.revanced.patcher.extensions.replaceInstruction
import app.revanced.patcher.extensions.stringReference
import app.revanced.patcher.patch.bytecodePatch
import app.revanced.patcher.patch.creatingBytecodePatch
import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
@Suppress("unused")
val useUserEndpointPatch = bytecodePatch(
name = "Use /user/ endpoint",
val `Use /user/ endpoint` by creatingBytecodePatch(
description = "Replaces the deprecated endpoint for viewing user profiles /u with /user, that used to fix a bug.",
use = false,

View File

@@ -2,7 +2,7 @@ package app.revanced.patches.reddit.customclients.sync.syncforreddit.fix.video
import app.revanced.patcher.extensions.addInstructions
import app.revanced.patcher.extensions.getInstruction
import app.revanced.patcher.patch.bytecodePatch
import app.revanced.patcher.patch.creatingBytecodePatch
import app.revanced.patches.reddit.customclients.sync.syncforreddit.extension.sharedExtensionPatch
import com.android.tools.smali.dexlib2.iface.instruction.formats.Instruction35c
@@ -11,8 +11,7 @@ private const val EXTENSION_CLASS_DESCRIPTOR =
private const val GET_LINKS_METHOD = "getLinks([B)[Ljava/lang/String;"
@Suppress("unused")
val fixVideoDownloadsPatch = bytecodePatch(
name = "Fix video downloads",
val `Fix video downloads` by creatingBytecodePatch(
description = "Fixes a bug in Sync's MPD parser resulting in only the audio-track being saved.",
) {
dependsOn(sharedExtensionPatch)

View File

@@ -4,7 +4,7 @@ package app.revanced.patches.samsung.radio.misc.fix.crash
import app.revanced.patcher.extensions.addInstructions
import app.revanced.patcher.extensions.getInstruction
import app.revanced.patcher.patch.bytecodePatch
import app.revanced.patcher.patch.creatingBytecodePatch
import app.revanced.patches.samsung.radio.restrictions.device.`Bypass device checks`
import app.revanced.util.findInstructionIndicesReversedOrThrow
import app.revanced.util.indexOfFirstInstruction
@@ -13,8 +13,8 @@ import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/samsung/radio/misc/fix/crash/FixCrashPatch;"
val fixCrashPatch = bytecodePatch(
name = "Fix crashes", description = "Prevents the app from crashing because of missing system permissions."
val `Fix crashes` by creatingBytecodePatch(
description = "Prevents the app from crashing because of missing system permissions."
) {
dependsOn(addManifestPermissionsPatch, `Bypass device checks`)
extendWith("extensions/samsung/radio.rve")

View File

@@ -39,7 +39,7 @@ internal fun forceOriginalAudioPatch(
subclassExtensionClassDescriptor: String,
preferenceScreen: BasePreferenceScreen.Screen
) = bytecodePatch(
name = "Force original audio",
name = "Force original audio", // TODO
description = "Adds an option to always use the original audio track.",
) {

View File

@@ -28,7 +28,7 @@ internal fun enableDebuggingPatch(
preferenceScreen: BasePreferenceScreen.Screen,
additionalDebugPreferences: List<BasePreference> = emptyList()
) = bytecodePatch(
name = "Enable debugging",
name = "Enable debugging", // TODO
description = "Adds options for debugging and exporting ReVanced logs to the clipboard.",
) {

View File

@@ -18,7 +18,7 @@ internal fun checkWatchHistoryDomainNameResolutionPatch(
executeBlock: BytecodePatchContext.() -> Unit = {},
getMainActivityMethod: BytecodePatchContext.() -> MutableMethod
) = bytecodePatch(
name = "Check watch history domain name resolution",
name = "Check watch history domain name resolution", // TODO
description = "Checks if the device DNS server is preventing user watch history from being saved.",
) {
block()

View File

@@ -5,7 +5,7 @@ import app.revanced.patcher.extensions.instructions
import app.revanced.patcher.extensions.replaceInstruction
import app.revanced.patcher.patch.*
import app.revanced.patcher.patch.BytecodePatchContext
import app.revanced.patches.all.misc.packagename.changePackageNamePatch
import app.revanced.patches.all.misc.packagename.`Change package name`
import app.revanced.patches.all.misc.packagename.setOrGetFallbackPackageName
import app.revanced.patches.all.misc.resources.addResources
import app.revanced.patches.all.misc.resources.addResourcesPatch
@@ -55,7 +55,7 @@ fun gmsCoreSupportPatch(
executeBlock: BytecodePatchContext.() -> Unit = {},
block: BytecodePatchBuilder.() -> Unit = {},
) = bytecodePatch(
name = "GmsCore support",
name = "GmsCore support", // TODO
description = "Allows the app to work without root by using a different package name when patched " +
"using a GmsCore instead of Google Play Services.",
) {
@@ -71,7 +71,7 @@ fun gmsCoreSupportPatch(
) { it!!.matches(Regex(PACKAGE_NAME_REGEX_PATTERN)) }
dependsOn(
changePackageNamePatch,
`Change package name`,
gmsCoreSupportResourcePatchFactory(gmsCoreVendorGroupIdOption),
extensionPatch,
)
@@ -519,7 +519,7 @@ fun gmsCoreSupportResourcePatch(
block: ResourcePatchBuilder.() -> Unit = {},
) = resourcePatch {
dependsOn(
changePackageNamePatch,
`Change package name`,
addResourcesPatch,
)

View File

@@ -1,13 +1,12 @@
package app.revanced.patches.shared.misc.pairip.license
import app.revanced.patcher.extensions.addInstruction
import app.revanced.patcher.patch.bytecodePatch
import app.revanced.patcher.patch.creatingBytecodePatch
import app.revanced.util.returnEarly
import java.util.logging.Logger
@Suppress("unused")
val disableLicenseCheckPatch = bytecodePatch(
name = "Disable Pairip license check",
val `Disable Pairip license check` by creatingBytecodePatch(
description = "Disables Play Integrity API (Pairip) client-side license check.",
use = false
) {

View File

@@ -1,13 +1,12 @@
package app.revanced.patches.shared.misc.privacy
import app.revanced.patcher.patch.resourcePatch
import app.revanced.patcher.patch.creatingResourcePatch
import app.revanced.util.asSequence
import app.revanced.util.getNode
import org.w3c.dom.Element
@Suppress("unused")
val disableSentryTelemetryPatch = resourcePatch(
name = "Disable Sentry telemetry",
val `Disable Sentry telemetry` = creatingResourcePatch(
description = "Disables Sentry telemetry. See https://sentry.io/for/android/ for more information.",
use = false,
) {

View File

@@ -28,7 +28,7 @@ internal fun sanitizeSharingLinksPatch(
preferenceScreen: BasePreferenceScreen.Screen,
replaceMusicLinksWithYouTube: Boolean = false,
) = bytecodePatch(
name = "Sanitize sharing links",
name = "Sanitize sharing links", // TODO
description = "Removes the tracking query parameters from shared links.",
) {
block()

View File

@@ -36,7 +36,7 @@ internal fun spoofVideoStreamsPatch(
block: BytecodePatchBuilder.() -> Unit,
executeBlock: BytecodePatchContext.() -> Unit = {},
) = bytecodePatch(
name = "Spoof video streams",
name = "Spoof video streams", // TODO
description = "Adds options to spoof the client video streams to fix playback.",
) {
block()

View File

@@ -2,12 +2,11 @@ package app.revanced.patches.solidexplorer2.functionality.filesize
import app.revanced.patcher.extensions.getInstruction
import app.revanced.patcher.extensions.replaceInstruction
import app.revanced.patcher.patch.bytecodePatch
import app.revanced.patcher.patch.creatingBytecodePatch
import com.android.tools.smali.dexlib2.iface.instruction.ThreeRegisterInstruction
@Suppress("unused")
val removeFileSizeLimitPatch = bytecodePatch(
name = "Remove file size limit",
val `Remove file size limit` by creatingBytecodePatch(
description = "Allows opening files larger than 2 MB in the text editor.",
) {
compatibleWith("pl.solidexplorer2")

View File

@@ -2,13 +2,12 @@ package app.revanced.patches.songpal.badge
import app.revanced.patcher.extensions.addInstructions
import app.revanced.patcher.extensions.removeInstructions
import app.revanced.patcher.patch.bytecodePatch
import app.revanced.patcher.patch.creatingBytecodePatch
internal const val ACTIVITY_TAB_DESCRIPTOR = "Ljp/co/sony/vim/framework/ui/yourheadphones/YhContract\$Tab;"
@Suppress("unused")
val badgeTabPatch = bytecodePatch(
name = "Remove badge tab",
val `Remove badge tab` by creatingBytecodePatch(
description = "Removes the badge tab from the activity tab.",
) {
compatibleWith("com.sony.songpal.mdr")

View File

@@ -1,11 +1,10 @@
package app.revanced.patches.songpal.badge
import app.revanced.patcher.extensions.addInstructions
import app.revanced.patcher.patch.bytecodePatch
import app.revanced.patcher.patch.creatingBytecodePatch
@Suppress("unused")
val removeNotificationBadgePatch = bytecodePatch(
name = "Remove notification badge",
val `Remove notification badge` by creatingBytecodePatch(
description = "Removes the red notification badge from the activity tab.",
) {
compatibleWith("com.sony.songpal.mdr"("10.1.0"))

View File

@@ -1,13 +1,11 @@
package app.revanced.patches.soundcloud.ad
import app.revanced.patcher.extensions.*
import app.revanced.patcher.patch.bytecodePatch
import app.revanced.patcher.patch.creatingBytecodePatch
import app.revanced.patches.soundcloud.shared.featureConstructorMethod
@Suppress("unused")
val hideAdsPatch = bytecodePatch(
name = "Hide ads",
) {
val `Hide ads` by creatingBytecodePatch {
compatibleWith("com.soundcloud.android"("2025.05.27-release"))
apply {

View File

@@ -1,11 +1,10 @@
package app.revanced.patches.soundcloud.analytics
import app.revanced.patcher.extensions.addInstruction
import app.revanced.patcher.patch.bytecodePatch
import app.revanced.patcher.patch.creatingBytecodePatch
@Suppress("unused")
val disableTelemetryPatch = bytecodePatch(
name = "Disable telemetry",
val `Disable telemetry` by creatingBytecodePatch(
description = "Disables SoundCloud's telemetry system.",
) {
compatibleWith("com.soundcloud.android"("2025.05.27-release"))

View File

@@ -1,7 +1,7 @@
package app.revanced.patches.soundcloud.offlinesync
import app.revanced.patcher.extensions.*
import app.revanced.patcher.patch.bytecodePatch
import app.revanced.patcher.patch.creatingBytecodePatch
import app.revanced.patches.soundcloud.shared.featureConstructorMethod
import app.revanced.util.getReference
import com.android.tools.smali.dexlib2.Opcode
@@ -9,9 +9,7 @@ import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
import com.android.tools.smali.dexlib2.iface.reference.FieldReference
@Suppress("unused")
val enableOfflineSync = bytecodePatch(
name = "Enable offline sync",
) {
val `Enable offline sync` by creatingBytecodePatch {
compatibleWith("com.soundcloud.android"("2025.05.27-release"))
apply {

View File

@@ -1,11 +1,10 @@
package app.revanced.patches.spotify.misc.fix.login
import app.revanced.patcher.patch.bytecodePatch
import app.revanced.patcher.patch.creatingBytecodePatch
import app.revanced.util.returnEarly
@Suppress("unused")
val fixFacebookLoginPatch = bytecodePatch(
name = "Fix Facebook login",
val `Fix Facebook login` by creatingBytecodePatch(
description =
"Fix logging in with Facebook when the app is patched by always opening the login in a web browser window.",
) {

View File

@@ -4,9 +4,8 @@ import app.revanced.patcher.extensions.addInstruction
import app.revanced.patcher.extensions.getInstruction
import app.revanced.patcher.extensions.replaceInstruction
import app.revanced.patcher.fingerprint
import app.revanced.patcher.patch.bytecodePatch
import app.revanced.patcher.patch.creatingBytecodePatch
import app.revanced.patcher.patch.stringOption
import com.android.tools.smali.dexlib2.mutable.MutableMethod
import app.revanced.util.getReference
import app.revanced.util.indexOfFirstInstruction
import app.revanced.util.indexOfFirstInstructionOrThrow
@@ -15,6 +14,7 @@ import com.android.tools.smali.dexlib2.builder.instruction.BuilderInstruction35c
import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction
import com.android.tools.smali.dexlib2.iface.reference.MethodReference
import com.android.tools.smali.dexlib2.immutable.reference.ImmutableMethodReference
import com.android.tools.smali.dexlib2.mutable.MutableMethod
import java.net.InetAddress
import java.net.URI
import java.net.URISyntaxException
@@ -22,8 +22,7 @@ import java.net.UnknownHostException
import java.util.logging.Logger
@Suppress("unused")
val changeLyricsProviderPatch = bytecodePatch(
name = "Change lyrics provider",
val `Change lyrics provider` by creatingBytecodePatch(
description = "Changes the lyrics provider to a custom one.",
use = false,
) {

View File

@@ -1,11 +1,10 @@
package app.revanced.patches.spotify.misc.widgets
import app.revanced.patcher.patch.bytecodePatch
import app.revanced.patcher.patch.creatingBytecodePatch
import app.revanced.util.returnEarly
@Suppress("unused")
val fixThirdPartyLaunchersWidgets = bytecodePatch(
name = "Fix third party launchers widgets",
val `Fix third party launchers widgets` by creatingBytecodePatch(
description = "Fixes Spotify widgets not working in third party launchers, like Nova Launcher.",
) {
compatibleWith("com.spotify.music")

View File

@@ -1,13 +1,11 @@
package app.revanced.patches.stocard.layout
import app.revanced.patcher.patch.resourcePatch
import app.revanced.patcher.patch.creatingResourcePatch
import app.revanced.util.childElementsSequence
import app.revanced.util.getNode
@Suppress("unused")
val hideOffersTabPatch = resourcePatch(
name = "Hide offers tab",
) {
val `Hide offers tab` by creatingResourcePatch {
compatibleWith("de.stocard.stocard")
apply {

View File

@@ -1,12 +1,10 @@
package app.revanced.patches.stocard.layout
import app.revanced.patcher.patch.resourcePatch
import app.revanced.patcher.patch.creatingResourcePatch
import app.revanced.util.getNode
@Suppress("unused")
val hideStoryBubblesPatch = resourcePatch(
name = "Hide story bubbles",
) {
val `Hide story bubbles` by creatingResourcePatch {
compatibleWith("de.stocard.stocard")
apply {

Some files were not shown because too many files have changed in this diff Show More