mirror of
https://github.com/ReVanced/revanced-patches.git
synced 2026-01-16 07:43:56 +00:00
Compare commits
11 Commits
v2.174.0-d
...
v2.174.0-d
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
018bf78e85 | ||
|
|
1a72c9b6b0 | ||
|
|
d72c68e3a0 | ||
|
|
074279ad3d | ||
|
|
1b8a1ef5b1 | ||
|
|
3c324bfe3d | ||
|
|
386d687ca1 | ||
|
|
8399eaa288 | ||
|
|
63460542d0 | ||
|
|
ba52570ad6 | ||
|
|
bb303713bd |
30
CHANGELOG.md
30
CHANGELOG.md
@@ -1,3 +1,33 @@
|
||||
# [2.174.0-dev.27](https://github.com/revanced/revanced-patches/compare/v2.174.0-dev.26...v2.174.0-dev.27) (2023-05-14)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **youtube/video-speed:** add compatibility annotation ([#2156](https://github.com/revanced/revanced-patches/issues/2156)) ([ffa2e5d](https://github.com/revanced/revanced-patches/commit/ffa2e5d7eb0b90bb5c7a6854bab4caf9f810d917))
|
||||
|
||||
# [2.174.0-dev.26](https://github.com/revanced/revanced-patches/compare/v2.174.0-dev.25...v2.174.0-dev.26) (2023-05-14)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **youtube/return-youtube-dislikes:** fix temporarily frozen video after opening a shorts ([#2126](https://github.com/revanced/revanced-patches/issues/2126)) ([e0877e3](https://github.com/revanced/revanced-patches/commit/e0877e33814ba396e64e18a577064aa5be952413))
|
||||
|
||||
# [2.174.0-dev.25](https://github.com/revanced/revanced-patches/compare/v2.174.0-dev.24...v2.174.0-dev.25) (2023-05-14)
|
||||
|
||||
# [2.174.0-dev.24](https://github.com/revanced/revanced-patches/compare/v2.174.0-dev.23...v2.174.0-dev.24) (2023-05-13)
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* **twitch/auto-claim-channel-points:** use correct casing for "Channel Points" ([#2138](https://github.com/revanced/revanced-patches/issues/2138)) ([76a3bf2](https://github.com/revanced/revanced-patches/commit/76a3bf23b5e5591ae635e612af07cbbd78d49f53))
|
||||
|
||||
# [2.174.0-dev.23](https://github.com/revanced/revanced-patches/compare/v2.174.0-dev.22...v2.174.0-dev.23) (2023-05-13)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **youtube/custom-video-speed:** add missing class for `video-speeds` patch ([#2137](https://github.com/revanced/revanced-patches/issues/2137)) ([758ef42](https://github.com/revanced/revanced-patches/commit/758ef42f9cd36d665b1737b67bcdde22d3e3eb98))
|
||||
|
||||
# [2.174.0-dev.22](https://github.com/revanced/revanced-patches/compare/v2.174.0-dev.21...v2.174.0-dev.22) (2023-05-12)
|
||||
|
||||
|
||||
|
||||
@@ -59,6 +59,7 @@ The official ReVanced Patches.
|
||||
| `tablet-mini-player` | Enables the tablet mini player layout. | 18.16.37 |
|
||||
| `vanced-microg-support` | Allows YouTube ReVanced to run without root and under a different package name with Vanced MicroG. | 18.16.37 |
|
||||
| `video-ads` | Removes ads in the video player. | 18.16.37 |
|
||||
| `video-speed` | Adds custom video speeds and ability to remember the playback speed you chose in the video playback speed flyout. | 18.16.37 |
|
||||
| `wide-searchbar` | Replaces the search icon with a wide search bar. This will hide the YouTube logo when active. | 18.16.37 |
|
||||
</details>
|
||||
|
||||
@@ -117,7 +118,7 @@ The official ReVanced Patches.
|
||||
|
||||
| 💊 Patch | 📜 Description | 🏹 Target Version |
|
||||
|:--------:|:--------------:|:-----------------:|
|
||||
| `auto-claim-channel-points` | Automatically claim channel points. | all |
|
||||
| `auto-claim-channel-points` | Automatically claim Channel Points. | all |
|
||||
| `block-audio-ads` | Blocks audio ads in streams and VODs. | 14.6.1 |
|
||||
| `block-embedded-ads` | Blocks embedded stream ads using services like TTV.lol or PurpleAdBlocker. | 14.6.1 |
|
||||
| `block-video-ads` | Blocks video ads in streams and VODs. | 14.6.1 |
|
||||
|
||||
@@ -27,7 +27,7 @@ repositories {
|
||||
}
|
||||
|
||||
dependencies {
|
||||
implementation("app.revanced:revanced-patcher:7.1.1")
|
||||
implementation("app.revanced:revanced-patcher:8.0.0")
|
||||
implementation("app.revanced:multidexlib2:2.5.3-a3836654")
|
||||
// Required for meta
|
||||
implementation("com.google.code.gson:gson:2.10.1")
|
||||
|
||||
@@ -1,2 +1,2 @@
|
||||
kotlin.code.style = official
|
||||
version = 2.174.0-dev.22
|
||||
version = 2.174.0-dev.27
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -11,5 +11,8 @@ object ProUnlockFingerprint : MethodFingerprint(
|
||||
Opcode.MOVE_RESULT,
|
||||
Opcode.IF_EQZ
|
||||
),
|
||||
customFingerprint = { it.definingClass == "Lcom/backdrops/wallpapers/data/local/DatabaseHandlerIAB;" && it.name == "lambda\$existPurchase\$0" }
|
||||
customFingerprint = { methodDef, _ ->
|
||||
methodDef.definingClass == "Lcom/backdrops/wallpapers/data/local/DatabaseHandlerIAB;"
|
||||
&& methodDef.name == "lambda\$existPurchase\$0"
|
||||
}
|
||||
)
|
||||
@@ -3,5 +3,7 @@ package app.revanced.patches.citra.misc.premium.fingerprints
|
||||
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
||||
|
||||
object PremiumUnlockFingerprint : MethodFingerprint(
|
||||
customFingerprint = { it.definingClass == "Lorg/citra/citra_emu/ui/main/MainActivity;" && it.name == "isPremiumActive" }
|
||||
customFingerprint = { methodDef, _ ->
|
||||
methodDef.definingClass == "Lorg/citra/citra_emu/ui/main/MainActivity;" && methodDef.name == "isPremiumActive"
|
||||
}
|
||||
)
|
||||
@@ -7,7 +7,7 @@ object BootStateFingerprint : MethodFingerprint(
|
||||
"Z",
|
||||
access = AccessFlags.PUBLIC.value,
|
||||
strings = listOf("Boot state of device: %s"),
|
||||
customFingerprint = { methodDef ->
|
||||
customFingerprint = { methodDef, _ ->
|
||||
methodDef.definingClass.endsWith("/AttestationHelper;")
|
||||
}
|
||||
)
|
||||
|
||||
@@ -7,7 +7,7 @@ object BootloaderDetectionFingerprint : MethodFingerprint(
|
||||
"Z",
|
||||
access = AccessFlags.PUBLIC.value,
|
||||
strings = listOf("Creation of attestation key succeeded", "Creation of attestation key failed"),
|
||||
customFingerprint = { methodDef ->
|
||||
customFingerprint = { methodDef, _ ->
|
||||
methodDef.definingClass.endsWith("/AttestationHelper;")
|
||||
}
|
||||
)
|
||||
|
||||
@@ -4,7 +4,7 @@ import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
||||
|
||||
object RootDetectionFingerprint : MethodFingerprint(
|
||||
"L",
|
||||
customFingerprint = { methodDef ->
|
||||
customFingerprint = { methodDef, _ ->
|
||||
methodDef.definingClass == "Lat/gv/bmf/bmf2go/tools/utils/z;"
|
||||
}
|
||||
)
|
||||
|
||||
@@ -3,7 +3,7 @@ package app.revanced.patches.hexeditor.ad.fingerprints
|
||||
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
||||
|
||||
object PrimaryAdsFingerprint : MethodFingerprint(
|
||||
customFingerprint = { methodDef ->
|
||||
customFingerprint = { methodDef, _ ->
|
||||
methodDef.definingClass.endsWith("PreferencesHelper;") && methodDef.name == "isAdsDisabled"
|
||||
}
|
||||
)
|
||||
@@ -4,5 +4,5 @@ import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
||||
|
||||
object CheckProFingerprint : MethodFingerprint(
|
||||
"Z",
|
||||
customFingerprint = { it.definingClass.endsWith("IPSPurchaseRepository;")}
|
||||
customFingerprint = { methodDef, _ -> methodDef.definingClass.endsWith("IPSPurchaseRepository;")}
|
||||
)
|
||||
|
||||
@@ -6,7 +6,7 @@ import org.jf.dexlib2.AccessFlags
|
||||
object RootDetectionFingerprint : MethodFingerprint(
|
||||
"V",
|
||||
access = AccessFlags.PUBLIC.value,
|
||||
customFingerprint = { methodDef ->
|
||||
customFingerprint = { methodDef, _ ->
|
||||
methodDef.definingClass.endsWith("/DeviceIntegrityCheck;")
|
||||
}
|
||||
)
|
||||
|
||||
@@ -7,7 +7,7 @@ object SpoofSignatureFingerprint : MethodFingerprint(
|
||||
"L",
|
||||
parameters = listOf("L"),
|
||||
access = AccessFlags.PRIVATE.value,
|
||||
customFingerprint = { methodDef ->
|
||||
customFingerprint = { methodDef, _ ->
|
||||
methodDef.definingClass.endsWith("/SL2Step1Task;") && methodDef.name == "getPubKey"
|
||||
}
|
||||
)
|
||||
|
||||
@@ -4,6 +4,7 @@ import app.revanced.patcher.extensions.or
|
||||
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
||||
import org.jf.dexlib2.AccessFlags
|
||||
import org.jf.dexlib2.Opcode
|
||||
import org.jf.dexlib2.iface.ClassDef
|
||||
import org.jf.dexlib2.iface.Method
|
||||
|
||||
abstract class MediaAdFingerprint(
|
||||
@@ -11,7 +12,7 @@ abstract class MediaAdFingerprint(
|
||||
access: Int? = AccessFlags.PUBLIC or AccessFlags.FINAL,
|
||||
parameters: Iterable<String>? = listOf(),
|
||||
opcodes: Iterable<Opcode>?,
|
||||
customFingerprint: ((methodDef: Method) -> Boolean)? = null
|
||||
customFingerprint: ((methodDef: Method, classDef: ClassDef) -> Boolean)? = null
|
||||
) : MethodFingerprint(
|
||||
returnType,
|
||||
access,
|
||||
|
||||
@@ -14,7 +14,7 @@ object PaidPartnershipAdFingerprint : MediaAdFingerprint(
|
||||
Opcode.IPUT_BOOLEAN,
|
||||
Opcode.IPUT_BOOLEAN
|
||||
),
|
||||
customFingerprint = { methodDef ->
|
||||
customFingerprint = { methodDef, _ ->
|
||||
methodDef.definingClass.endsWith("ClipsEditMetadataController;")
|
||||
}
|
||||
) {
|
||||
|
||||
@@ -11,8 +11,8 @@ object LoadInboxAdsFingerprint : MethodFingerprint(
|
||||
"inbox_ads_fetch_start"
|
||||
),
|
||||
access = AccessFlags.PUBLIC or AccessFlags.STATIC,
|
||||
customFingerprint = {
|
||||
it.definingClass == "Lcom/facebook/messaging/business/inboxads/plugins/inboxads/itemsupplier/InboxAdsItemSupplierImplementation;"
|
||||
customFingerprint = { methodDef, _ ->
|
||||
methodDef.definingClass == "Lcom/facebook/messaging/business/inboxads/plugins/inboxads/itemsupplier/InboxAdsItemSupplierImplementation;"
|
||||
}
|
||||
)
|
||||
|
||||
|
||||
@@ -13,7 +13,7 @@ object UnlockProFingerprint : MethodFingerprint(
|
||||
Opcode.IGET_BOOLEAN,
|
||||
Opcode.RETURN
|
||||
),
|
||||
customFingerprint = { methodDef ->
|
||||
customFingerprint = { methodDef, _ ->
|
||||
methodDef.definingClass.endsWith("MainActivity;")
|
||||
}
|
||||
)
|
||||
@@ -3,7 +3,7 @@ package app.revanced.patches.nyx.misc.pro.fingerprints
|
||||
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
||||
|
||||
object CheckProFingerprint : MethodFingerprint(
|
||||
customFingerprint = { methodDef ->
|
||||
customFingerprint = { methodDef, _ ->
|
||||
methodDef.definingClass.endsWith("BillingManager;") && methodDef.name == "isProVersion"
|
||||
}
|
||||
)
|
||||
|
||||
@@ -8,10 +8,10 @@ import org.jf.dexlib2.Opcode
|
||||
object CheckSignatureFingerprint : MethodFingerprint(
|
||||
returnType = "V",
|
||||
access = AccessFlags.PUBLIC or AccessFlags.FINAL,
|
||||
customFingerprint = {
|
||||
(it.definingClass == "Lcom/microblink/photomath/main/activity/LauncherActivity;" ||
|
||||
it.definingClass == "Lcom/microblink/photomath/PhotoMath;") &&
|
||||
it.name == "onCreate"
|
||||
customFingerprint = { methodDef, _ ->
|
||||
(methodDef.definingClass == "Lcom/microblink/photomath/main/activity/LauncherActivity;" ||
|
||||
methodDef.definingClass == "Lcom/microblink/photomath/PhotoMath;") &&
|
||||
methodDef.name == "onCreate"
|
||||
},
|
||||
strings = listOf(
|
||||
"currentSignature"
|
||||
|
||||
@@ -11,6 +11,6 @@ object IsPlusUnlockedFingerprint : MethodFingerprint(
|
||||
"genius"
|
||||
),
|
||||
customFingerprint = {
|
||||
methodDef -> methodDef.definingClass.endsWith("/User;")
|
||||
methodDef, _ -> methodDef.definingClass.endsWith("/User;")
|
||||
}
|
||||
)
|
||||
@@ -4,7 +4,7 @@ import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
||||
|
||||
object PremiumIconFingerprint : MethodFingerprint(
|
||||
"Z",
|
||||
customFingerprint = { methodDef ->
|
||||
customFingerprint = { methodDef, _ ->
|
||||
methodDef.definingClass.endsWith("MyAccount;") && methodDef.name == "isPremiumSubscriber"
|
||||
}
|
||||
)
|
||||
@@ -4,5 +4,5 @@ package app.revanced.patches.shared.fingerprints
|
||||
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
||||
|
||||
object SeekbarOnDrawFingerprint : MethodFingerprint(
|
||||
customFingerprint = { it.name == "onDraw" }
|
||||
customFingerprint = { methodDef, _ -> methodDef.name == "onDraw" }
|
||||
)
|
||||
@@ -4,7 +4,7 @@ package app.revanced.patches.shared.fingerprints
|
||||
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
||||
|
||||
object WatchWhileActivityFingerprint : MethodFingerprint(
|
||||
customFingerprint = { methodDef ->
|
||||
customFingerprint = { methodDef, _ ->
|
||||
methodDef.definingClass.endsWith("WatchWhileActivity;") && methodDef.name == "<init>"
|
||||
}
|
||||
)
|
||||
|
||||
@@ -10,6 +10,7 @@ import app.revanced.patcher.patch.PatchResult
|
||||
import app.revanced.patcher.patch.PatchResultError
|
||||
import app.revanced.patcher.patch.PatchResultSuccess
|
||||
import org.jf.dexlib2.Opcode
|
||||
import org.jf.dexlib2.iface.ClassDef
|
||||
import org.jf.dexlib2.iface.Method
|
||||
|
||||
@Description("Applies mandatory patches to implement the ReVanced integrations into the application.")
|
||||
@@ -30,7 +31,7 @@ abstract class AbstractIntegrationsPatch(
|
||||
parameters: Iterable<String>? = null,
|
||||
opcodes: Iterable<Opcode?>? = null,
|
||||
strings: Iterable<String>? = null,
|
||||
customFingerprint: ((methodDef: Method) -> Boolean)? = null,
|
||||
customFingerprint: ((methodDef: Method, classDef: ClassDef) -> Boolean)? = null,
|
||||
private val contextRegisterResolver: (Method) -> Int = object : RegisterResolver {}
|
||||
) : MethodFingerprint(
|
||||
returnType,
|
||||
|
||||
@@ -13,5 +13,5 @@ object CanScrollVerticallyFingerprint : MethodFingerprint(
|
||||
Opcode.INVOKE_VIRTUAL,
|
||||
Opcode.MOVE_RESULT,
|
||||
),
|
||||
customFingerprint = { methodDef -> methodDef.definingClass.endsWith("SwipeRefreshLayout;") }
|
||||
customFingerprint = { methodDef, _ -> methodDef.definingClass.endsWith("SwipeRefreshLayout;") }
|
||||
)
|
||||
|
||||
@@ -18,7 +18,7 @@ object DisableCaptureRestrictionAudioDriverFingerprint : MethodFingerprint(
|
||||
Opcode.MOVE_RESULT_OBJECT,
|
||||
Opcode.RETURN_OBJECT
|
||||
),
|
||||
customFingerprint = { methodDef ->
|
||||
customFingerprint = { methodDef, _ ->
|
||||
// Check for method call to AudioAttributes$Builder.setAllowedCapturePolicy Android API
|
||||
methodDef.implementation?.instructions?.any {
|
||||
((it as? ReferenceInstruction)?.reference as? MethodReference)?.name == "setAllowedCapturePolicy"
|
||||
|
||||
@@ -17,7 +17,7 @@ object PiracyDetectionFingerprint : MethodFingerprint(
|
||||
Opcode.INVOKE_DIRECT,
|
||||
Opcode.INVOKE_VIRTUAL
|
||||
),
|
||||
customFingerprint = { method ->
|
||||
customFingerprint = { method, _ ->
|
||||
method.implementation?.instructions?.any {
|
||||
if (it.opcode != Opcode.NEW_INSTANCE) return@any false
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@ package app.revanced.patches.ticktick.misc.themeunlock.fingerprints
|
||||
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
||||
|
||||
object CheckLockedThemesFingerprint : MethodFingerprint(
|
||||
customFingerprint = { methodDef ->
|
||||
customFingerprint = { methodDef, _ ->
|
||||
methodDef.definingClass.endsWith("Theme;") && methodDef.name == "isLockedTheme"
|
||||
}
|
||||
)
|
||||
|
||||
@@ -3,7 +3,7 @@ package app.revanced.patches.ticktick.misc.themeunlock.fingerprints
|
||||
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
||||
|
||||
object SetThemeFingerprint : MethodFingerprint(
|
||||
customFingerprint = { methodDef ->
|
||||
customFingerprint = { methodDef, _ ->
|
||||
methodDef.definingClass.endsWith("ThemePreviewActivity;") && methodDef.name == "lambda\$updateUserBtn\$1"
|
||||
}
|
||||
)
|
||||
|
||||
@@ -3,7 +3,7 @@ package app.revanced.patches.tiktok.ad.fingerprints
|
||||
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
||||
|
||||
object ConvertHelpFeedItemListFingerprint : MethodFingerprint(
|
||||
customFingerprint = { methodDef ->
|
||||
customFingerprint = { methodDef, _ ->
|
||||
methodDef.definingClass.endsWith("/ConvertHelp;") &&
|
||||
methodDef.name.endsWith("${'$'}FeedItemList")
|
||||
}
|
||||
|
||||
@@ -3,7 +3,7 @@ package app.revanced.patches.tiktok.ad.fingerprints
|
||||
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
||||
|
||||
object FeedItemListCloneFingerprint : MethodFingerprint(
|
||||
customFingerprint = { methodDef ->
|
||||
customFingerprint = { methodDef, _ ->
|
||||
methodDef.definingClass.endsWith("/FeedItemList;") && methodDef.name == "clone"
|
||||
}
|
||||
)
|
||||
@@ -6,7 +6,7 @@ import org.jf.dexlib2.AccessFlags
|
||||
|
||||
object FeedApiServiceLIZFingerprint : MethodFingerprint(
|
||||
access = AccessFlags.PUBLIC or AccessFlags.STATIC or AccessFlags.SYNTHETIC,
|
||||
customFingerprint = { methodDef ->
|
||||
customFingerprint = { methodDef, _ ->
|
||||
methodDef.definingClass.endsWith("/FeedApiService;") && methodDef.name == "LIZ"
|
||||
}
|
||||
)
|
||||
@@ -7,7 +7,7 @@ import org.jf.dexlib2.AccessFlags
|
||||
object ACLCommonShareFingerprint : MethodFingerprint(
|
||||
"I",
|
||||
AccessFlags.PUBLIC or AccessFlags.FINAL,
|
||||
customFingerprint = { methodDef ->
|
||||
customFingerprint = { methodDef, _ ->
|
||||
methodDef.definingClass.endsWith("/ACLCommonShare;") &&
|
||||
methodDef.name == "getCode"
|
||||
}
|
||||
|
||||
@@ -13,7 +13,7 @@ import org.jf.dexlib2.AccessFlags
|
||||
object ACLCommonShareFingerprint2 : MethodFingerprint(
|
||||
"I",
|
||||
AccessFlags.PUBLIC or AccessFlags.FINAL,
|
||||
customFingerprint = { methodDef ->
|
||||
customFingerprint = { methodDef, _ ->
|
||||
methodDef.definingClass.endsWith("/ACLCommonShare;") &&
|
||||
methodDef.name == "getShowType"
|
||||
}
|
||||
|
||||
@@ -13,7 +13,7 @@ import org.jf.dexlib2.AccessFlags
|
||||
object ACLCommonShareFingerprint3 : MethodFingerprint(
|
||||
"I",
|
||||
AccessFlags.PUBLIC or AccessFlags.FINAL,
|
||||
customFingerprint = { methodDef ->
|
||||
customFingerprint = { methodDef, _ ->
|
||||
methodDef.definingClass.endsWith("/ACLCommonShare;") &&
|
||||
methodDef.name == "getTranscode"
|
||||
}
|
||||
|
||||
@@ -6,7 +6,7 @@ import org.jf.dexlib2.AccessFlags
|
||||
object AwemeGetVideoControlFingerprint : MethodFingerprint(
|
||||
"L",
|
||||
AccessFlags.PUBLIC.value,
|
||||
customFingerprint = { methodDef ->
|
||||
customFingerprint = { methodDef, _ ->
|
||||
methodDef.definingClass.endsWith("/Aweme;") && methodDef.name == "getVideoControl"
|
||||
}
|
||||
)
|
||||
@@ -3,7 +3,7 @@ package app.revanced.patches.tiktok.misc.integrations.fingerprints
|
||||
import app.revanced.patches.shared.integrations.patch.AbstractIntegrationsPatch.IntegrationsFingerprint
|
||||
|
||||
object InitFingerprint : IntegrationsFingerprint(
|
||||
customFingerprint = { methodDef ->
|
||||
customFingerprint = { methodDef, _ ->
|
||||
methodDef.definingClass.endsWith("/AwemeHostApplication;") &&
|
||||
methodDef.name == "onCreate"
|
||||
}
|
||||
|
||||
@@ -2,7 +2,7 @@ package app.revanced.patches.tiktok.misc.login.disablerequirement.fingerprints
|
||||
|
||||
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
||||
object MandatoryLoginServiceFingerprint : MethodFingerprint(
|
||||
customFingerprint = { methodDef ->
|
||||
customFingerprint = { methodDef, _ ->
|
||||
methodDef.definingClass.endsWith("/MandatoryLoginService;") &&
|
||||
methodDef.name == "enableForcedLogin"
|
||||
}
|
||||
|
||||
@@ -9,7 +9,7 @@ import app.revanced.patches.tiktok.misc.login.disablerequirement.annotations.Dis
|
||||
@DisableLoginRequirementCompatibility
|
||||
@Version("0.0.1")
|
||||
object MandatoryLoginServiceFingerprint2 : MethodFingerprint(
|
||||
customFingerprint = { methodDef ->
|
||||
customFingerprint = { methodDef, _ ->
|
||||
methodDef.definingClass.endsWith("/MandatoryLoginService;") &&
|
||||
methodDef.name == "shouldShowForcedLogin"
|
||||
}
|
||||
|
||||
@@ -8,7 +8,7 @@ object GoogleAuthAvailableFingerprint : MethodFingerprint(
|
||||
returnType = "Z",
|
||||
access = AccessFlags.PUBLIC or AccessFlags.FINAL,
|
||||
parameters = listOf(),
|
||||
customFingerprint = { methodDef ->
|
||||
customFingerprint = { methodDef, _ ->
|
||||
methodDef.definingClass == "Lcom/bytedance/lobby/google/GoogleAuth;"
|
||||
}
|
||||
)
|
||||
@@ -8,7 +8,7 @@ object GoogleOneTapAuthAvailableFingerprint : MethodFingerprint(
|
||||
returnType = "Z",
|
||||
access = AccessFlags.PUBLIC or AccessFlags.FINAL,
|
||||
parameters = listOf(),
|
||||
customFingerprint = { methodDef ->
|
||||
customFingerprint = { methodDef, _ ->
|
||||
methodDef.definingClass == "Lcom/bytedance/lobby/google/GoogleOneTapAuth;"
|
||||
}
|
||||
)
|
||||
@@ -3,7 +3,7 @@ package app.revanced.patches.tiktok.misc.settings.fingerprints
|
||||
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
||||
|
||||
object AdPersonalizationActivityOnCreateFingerprint : MethodFingerprint(
|
||||
customFingerprint = { methodDef ->
|
||||
customFingerprint = { methodDef, _ ->
|
||||
methodDef.definingClass.endsWith("/AdPersonalizationActivity;") &&
|
||||
methodDef.name == "onCreate"
|
||||
}
|
||||
|
||||
@@ -3,7 +3,7 @@ package app.revanced.patches.tiktok.misc.settings.fingerprints
|
||||
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
||||
|
||||
object SettingsOnViewCreatedFingerprint : MethodFingerprint(
|
||||
customFingerprint = { methodDef ->
|
||||
customFingerprint = { methodDef, _ ->
|
||||
methodDef.definingClass.endsWith("/SettingNewVersionFragment;") &&
|
||||
methodDef.name == "onViewCreated"
|
||||
}
|
||||
|
||||
@@ -3,7 +3,7 @@ package app.revanced.patches.tiktok.misc.settings.fingerprints
|
||||
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
||||
|
||||
object SettingsStatusLoadFingerprint : MethodFingerprint(
|
||||
customFingerprint = { methodDef ->
|
||||
customFingerprint = { methodDef, _ ->
|
||||
methodDef.definingClass.endsWith("Lapp/revanced/tiktok/settingsmenu/SettingsStatus;") &&
|
||||
methodDef.name == "load"
|
||||
}
|
||||
|
||||
@@ -5,7 +5,7 @@ import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
||||
abstract class MethodUnlockFingerprint(private val className: String) : MethodFingerprint(
|
||||
"L",
|
||||
strings = listOf("binding.addButton"),
|
||||
customFingerprint = { methodDef ->
|
||||
customFingerprint = { methodDef, _ ->
|
||||
methodDef.definingClass.endsWith("/$className;")
|
||||
}
|
||||
)
|
||||
|
||||
@@ -4,7 +4,7 @@ package app.revanced.patches.twitch.ad.audio.fingerprints
|
||||
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
||||
|
||||
object AudioAdsPresenterPlayFingerprint : MethodFingerprint(
|
||||
customFingerprint = { method ->
|
||||
customFingerprint = { method, _ ->
|
||||
method.definingClass.endsWith("AudioAdsPlayerPresenter;") && method.name == "playAd"
|
||||
}
|
||||
)
|
||||
@@ -3,7 +3,7 @@ package app.revanced.patches.twitch.ad.embedded.fingerprints
|
||||
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
||||
|
||||
object CreateUsherClientFingerprint : MethodFingerprint(
|
||||
customFingerprint = { method ->
|
||||
customFingerprint = { method, _ ->
|
||||
method.definingClass.endsWith("Ltv/twitch/android/network/OkHttpClientFactory;") && method.name == "buildOkHttpClient"
|
||||
}
|
||||
)
|
||||
@@ -8,7 +8,7 @@ object CheckAdEligibilityLambdaFingerprint : MethodFingerprint(
|
||||
"L",
|
||||
AccessFlags.PRIVATE or AccessFlags.FINAL or AccessFlags.STATIC,
|
||||
listOf("L", "L", "L"),
|
||||
customFingerprint = { method ->
|
||||
customFingerprint = { method, _ ->
|
||||
method.definingClass.endsWith("AdEligibilityFetcher;") &&
|
||||
method.name.contains("shouldRequestAd")
|
||||
}
|
||||
|
||||
@@ -4,7 +4,7 @@ package app.revanced.patches.twitch.ad.video.fingerprints
|
||||
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
||||
|
||||
object ContentConfigShowAdsFingerprint : MethodFingerprint(
|
||||
customFingerprint = { method ->
|
||||
customFingerprint = { method, _ ->
|
||||
method.definingClass.endsWith("ContentConfigData;") && method.name == "getShowAds"
|
||||
}
|
||||
)
|
||||
@@ -3,7 +3,7 @@ package app.revanced.patches.twitch.ad.video.fingerprints
|
||||
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
||||
|
||||
object GetReadyToShowAdFingerprint : MethodFingerprint(
|
||||
customFingerprint = { method ->
|
||||
customFingerprint = { method, _ ->
|
||||
method.definingClass.endsWith("/StreamDisplayAdsPresenter;") && method.name == "getReadyToShowAdOrAbort"
|
||||
}
|
||||
)
|
||||
@@ -3,7 +3,7 @@ package app.revanced.patches.twitch.chat.antidelete.fingerprints
|
||||
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
||||
|
||||
object ChatUtilCreateDeletedSpanFingerprint : MethodFingerprint(
|
||||
customFingerprint = { methodDef ->
|
||||
customFingerprint = { methodDef, _ ->
|
||||
methodDef.definingClass.endsWith("/ChatUtil\$Companion;") && methodDef.name == "createDeletedSpanFromChatMessageSpan"
|
||||
}
|
||||
)
|
||||
@@ -6,7 +6,7 @@ import org.jf.dexlib2.AccessFlags
|
||||
|
||||
object DeletedMessageClickableSpanCtorFingerprint : MethodFingerprint(
|
||||
"V", AccessFlags.PUBLIC or AccessFlags.CONSTRUCTOR,
|
||||
customFingerprint = { methodDef ->
|
||||
customFingerprint = { methodDef, _ ->
|
||||
methodDef.definingClass.endsWith("DeletedMessageClickableSpan;")
|
||||
}
|
||||
)
|
||||
@@ -4,7 +4,7 @@ package app.revanced.patches.twitch.chat.antidelete.fingerprints
|
||||
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
||||
|
||||
object SetHasModAccessFingerprint : MethodFingerprint(
|
||||
customFingerprint = { methodDef ->
|
||||
customFingerprint = { methodDef, _ ->
|
||||
methodDef.definingClass.endsWith("DeletedMessageClickableSpan;") && methodDef.name == "setHasModAccess"
|
||||
}
|
||||
)
|
||||
@@ -3,7 +3,7 @@ package app.revanced.patches.twitch.chat.autoclaim.fingerprints
|
||||
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
||||
|
||||
object CommunityPointsButtonViewDelegateFingerprint : MethodFingerprint(
|
||||
customFingerprint = { methodDef ->
|
||||
customFingerprint = { methodDef, _ ->
|
||||
methodDef.definingClass.endsWith("CommunityPointsButtonViewDelegate;")
|
||||
&& methodDef.name == "showClaimAvailable"
|
||||
}
|
||||
|
||||
@@ -22,7 +22,7 @@ import app.revanced.patches.twitch.misc.settings.bytecode.patch.SettingsPatch
|
||||
@Patch
|
||||
@DependsOn([SettingsPatch::class])
|
||||
@Name("auto-claim-channel-points")
|
||||
@Description("Automatically claim channel points.")
|
||||
@Description("Automatically claim Channel Points.")
|
||||
@AutoClaimChannelPointsCompatibility
|
||||
@Version("0.0.1")
|
||||
class AutoClaimChannelPointPatch : BytecodePatch(
|
||||
@@ -34,16 +34,16 @@ class AutoClaimChannelPointPatch : BytecodePatch(
|
||||
"revanced_auto_claim_channel_points",
|
||||
StringResource(
|
||||
"revanced_auto_claim_channel_points",
|
||||
"Automatically claim channel points"
|
||||
"Automatically claim Channel Points"
|
||||
),
|
||||
true,
|
||||
StringResource(
|
||||
"revanced_auto_claim_channel_points_on",
|
||||
"Channel points are claimed automatically"
|
||||
"Channel Points are claimed automatically"
|
||||
),
|
||||
StringResource(
|
||||
"revanced_auto_claim_channel_points_off",
|
||||
"Channel points are not claimed automatically"
|
||||
"Channel Points are not claimed automatically"
|
||||
),
|
||||
)
|
||||
)
|
||||
|
||||
@@ -4,7 +4,7 @@ package app.revanced.patches.twitch.debug.fingerprints
|
||||
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
||||
|
||||
object IsDebugConfigEnabledFingerprint : MethodFingerprint(
|
||||
customFingerprint = { methodDef ->
|
||||
customFingerprint = { methodDef, _ ->
|
||||
methodDef.definingClass.endsWith("BuildConfigUtil;") && methodDef.name == "isDebugConfigEnabled"
|
||||
}
|
||||
)
|
||||
@@ -4,7 +4,7 @@ package app.revanced.patches.twitch.debug.fingerprints
|
||||
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
||||
|
||||
object IsOmVerificationEnabledFingerprint : MethodFingerprint(
|
||||
customFingerprint = { methodDef ->
|
||||
customFingerprint = { methodDef, _ ->
|
||||
methodDef.definingClass.endsWith("BuildConfigUtil;") && methodDef.name == "isOmVerificationEnabled"
|
||||
}
|
||||
)
|
||||
@@ -4,7 +4,7 @@ package app.revanced.patches.twitch.debug.fingerprints
|
||||
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
||||
|
||||
object ShouldShowDebugOptionsFingerprint : MethodFingerprint(
|
||||
customFingerprint = { methodDef ->
|
||||
customFingerprint = { methodDef, _ ->
|
||||
methodDef.definingClass.endsWith("BuildConfigUtil;") && methodDef.name == "shouldShowDebugOptions"
|
||||
}
|
||||
)
|
||||
@@ -9,7 +9,7 @@ import app.revanced.patches.shared.integrations.patch.AbstractIntegrationsPatch.
|
||||
@IntegrationsCompatibility
|
||||
@Version("0.0.1")
|
||||
object InitFingerprint : IntegrationsFingerprint(
|
||||
customFingerprint = { methodDef ->
|
||||
customFingerprint = { methodDef, _ ->
|
||||
methodDef.definingClass.endsWith("/TwitchApplication;") &&
|
||||
methodDef.name == "onCreate"
|
||||
}
|
||||
|
||||
@@ -8,7 +8,7 @@ object MenuGroupsOnClickFingerprint : MethodFingerprint(
|
||||
"V",
|
||||
AccessFlags.PRIVATE or AccessFlags.STATIC or AccessFlags.FINAL,
|
||||
listOf("L", "L", "L"),
|
||||
customFingerprint = { methodDef ->
|
||||
customFingerprint = { methodDef, _ ->
|
||||
methodDef.definingClass.endsWith("/SettingsMenuViewDelegate;")
|
||||
&& methodDef.name.contains("render")
|
||||
}
|
||||
|
||||
@@ -3,7 +3,7 @@ package app.revanced.patches.twitch.misc.settings.fingerprints
|
||||
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
||||
|
||||
object MenuGroupsUpdatedFingerprint : MethodFingerprint(
|
||||
customFingerprint = { methodDef ->
|
||||
customFingerprint = { methodDef, _ ->
|
||||
methodDef.definingClass.endsWith("/SettingsMenuPresenter\$Event\$MenuGroupsUpdated;")
|
||||
&& methodDef.name == "<init>"
|
||||
}
|
||||
|
||||
@@ -3,7 +3,7 @@ package app.revanced.patches.twitch.misc.settings.fingerprints
|
||||
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
||||
|
||||
object SettingsActivityOnCreateFingerprint : MethodFingerprint(
|
||||
customFingerprint = { methodDef ->
|
||||
customFingerprint = { methodDef, _ ->
|
||||
methodDef.definingClass.endsWith("/SettingsActivity;") &&
|
||||
methodDef.name == "onCreate"
|
||||
}
|
||||
|
||||
@@ -3,7 +3,7 @@ package app.revanced.patches.twitch.misc.settings.fingerprints
|
||||
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
||||
|
||||
object SettingsMenuItemEnumFingerprint : MethodFingerprint(
|
||||
customFingerprint = { methodDef ->
|
||||
customFingerprint = { methodDef, _ ->
|
||||
methodDef.definingClass.endsWith("/SettingsMenuItem;") && methodDef.name == "<clinit>"
|
||||
}
|
||||
)
|
||||
|
||||
@@ -4,6 +4,6 @@ import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
||||
import org.jf.dexlib2.Opcode
|
||||
|
||||
object JsonHookPatchFingerprint : MethodFingerprint(
|
||||
customFingerprint = { methodDef -> methodDef.name == "<clinit>" },
|
||||
customFingerprint = { methodDef, _ -> methodDef.name == "<clinit>" },
|
||||
opcodes = listOf(Opcode.IGET_OBJECT)
|
||||
)
|
||||
@@ -3,7 +3,7 @@ package app.revanced.patches.twitter.misc.hook.json.fingerprints
|
||||
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
||||
|
||||
object JsonInputStreamFingerprint : MethodFingerprint(
|
||||
customFingerprint = { methodDef ->
|
||||
customFingerprint = { methodDef, _ ->
|
||||
if (methodDef.parameterTypes.size == 0) false
|
||||
else methodDef.parameterTypes.first() == "Ljava/io/InputStream;"
|
||||
}
|
||||
|
||||
@@ -3,5 +3,5 @@ package app.revanced.patches.twitter.misc.hook.json.fingerprints
|
||||
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
||||
|
||||
object LoganSquareFingerprint : MethodFingerprint(
|
||||
customFingerprint = { methodDef -> methodDef.definingClass.endsWith("LoganSquare;") }
|
||||
customFingerprint = { methodDef, _ -> methodDef.definingClass.endsWith("LoganSquare;") }
|
||||
)
|
||||
@@ -2,7 +2,7 @@ package app.revanced.patches.warnwetter.misc.promocode.fingerprints
|
||||
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
||||
|
||||
object PromoCodeUnlockFingerprint : MethodFingerprint(
|
||||
customFingerprint = { methodDef ->
|
||||
customFingerprint = { methodDef, _ ->
|
||||
methodDef.definingClass.endsWith("PromoTokenVerification;") && methodDef.name == "isValid"
|
||||
}
|
||||
)
|
||||
@@ -4,7 +4,7 @@ import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
||||
|
||||
object CheckProFingerprint : MethodFingerprint(
|
||||
"I",
|
||||
customFingerprint = { methodDef ->
|
||||
customFingerprint = { methodDef, _ ->
|
||||
methodDef.definingClass.endsWith("RawUserData;") && methodDef.name == "isPro"
|
||||
}
|
||||
)
|
||||
|
||||
@@ -9,7 +9,7 @@ object ReelConstructorFingerprint : MethodFingerprint(
|
||||
opcodes = listOf(
|
||||
Opcode.INVOKE_VIRTUAL
|
||||
),
|
||||
customFingerprint = { method ->
|
||||
customFingerprint = { method, _ ->
|
||||
method.implementation?.instructions?.any {
|
||||
it.opcode == Opcode.CONST && (it as WideLiteralInstruction).wideLiteral == GeneralAdsResourcePatch.reelMultipleItemShelfId
|
||||
} ?: false
|
||||
|
||||
@@ -4,7 +4,7 @@ package app.revanced.patches.youtube.interaction.swipecontrols.fingerprints
|
||||
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
||||
|
||||
object SwipeControlsHostActivityFingerprint : MethodFingerprint(
|
||||
customFingerprint = { methodDef ->
|
||||
customFingerprint = { methodDef, _ ->
|
||||
methodDef.definingClass == "Lapp/revanced/integrations/swipecontrols/SwipeControlsHostActivity;" && methodDef.name == "<init>"
|
||||
}
|
||||
)
|
||||
|
||||
@@ -4,7 +4,7 @@ import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
||||
|
||||
object LayoutConstructorFingerprint : MethodFingerprint(
|
||||
strings = listOf("1.0x"),
|
||||
customFingerprint = { methodDef ->
|
||||
customFingerprint = { methodDef, _ ->
|
||||
methodDef.definingClass.endsWith("YouTubeControlsOverlay;")
|
||||
}
|
||||
)
|
||||
@@ -6,7 +6,7 @@ import org.jf.dexlib2.Opcode
|
||||
import org.jf.dexlib2.iface.instruction.WideLiteralInstruction
|
||||
|
||||
object InitializeButtonsFingerprint : MethodFingerprint(
|
||||
customFingerprint = { methodDef ->
|
||||
customFingerprint = { methodDef, _ ->
|
||||
methodDef.implementation?.instructions?.any {
|
||||
it.opcode == Opcode.CONST && (it as WideLiteralInstruction).wideLiteral ==
|
||||
ResolvePivotBarFingerprintsPatch.imageOnlyTabResourceId
|
||||
|
||||
@@ -14,7 +14,7 @@ object AlbumCardsFingerprint : MethodFingerprint(
|
||||
Opcode.MOVE_RESULT_OBJECT,
|
||||
Opcode.CHECK_CAST,
|
||||
),
|
||||
customFingerprint = { methodDef ->
|
||||
customFingerprint = { methodDef, _ ->
|
||||
methodDef.implementation?.instructions?.any { instruction ->
|
||||
instruction.opcode.ordinal == Opcode.CONST.ordinal &&
|
||||
(instruction as? WideLiteralInstruction)?.wideLiteral == AlbumCardsResourcePatch.albumCardId
|
||||
|
||||
@@ -14,7 +14,7 @@ object BreakingNewsFingerprint : MethodFingerprint(
|
||||
Opcode.CHECK_CAST,
|
||||
Opcode.IPUT_OBJECT,
|
||||
),
|
||||
customFingerprint = { methodDef ->
|
||||
customFingerprint = { methodDef, _ ->
|
||||
methodDef.implementation?.instructions?.any { instruction ->
|
||||
instruction.opcode.ordinal == Opcode.CONST.ordinal &&
|
||||
(instruction as? WideLiteralInstruction)?.wideLiteral == BreakingNewsResourcePatch.horizontalCardListId
|
||||
|
||||
@@ -9,7 +9,7 @@ import org.jf.dexlib2.iface.instruction.WideLiteralInstruction
|
||||
|
||||
object ShortsCommentsButtonFingerprint : MethodFingerprint(
|
||||
"V", AccessFlags.PRIVATE or AccessFlags.FINAL, listOf("Z", "Z", "L"),
|
||||
customFingerprint = { methodDef ->
|
||||
customFingerprint = { methodDef, _ ->
|
||||
methodDef.implementation?.instructions?.any {
|
||||
it.opcode.ordinal == Opcode.CONST.ordinal && (it as WideLiteralInstruction).wideLiteral == CommentsResourcePatch.shortsCommentsButtonId
|
||||
} == true
|
||||
|
||||
@@ -11,7 +11,7 @@ object CrowdfundingBoxFingerprint : MethodFingerprint(
|
||||
Opcode.MOVE_RESULT_OBJECT,
|
||||
Opcode.IPUT_OBJECT,
|
||||
),
|
||||
customFingerprint = { methodDef ->
|
||||
customFingerprint = { methodDef, _ ->
|
||||
methodDef.implementation?.instructions?.any { instruction ->
|
||||
instruction.opcode.ordinal == Opcode.CONST.ordinal &&
|
||||
(instruction as? WideLiteralInstruction)?.wideLiteral == CrowdfundingBoxResourcePatch.crowdfundingBoxId
|
||||
|
||||
@@ -13,7 +13,7 @@ object LayoutCircleFingerprint : MethodFingerprint(
|
||||
Opcode.MOVE_RESULT_OBJECT,
|
||||
Opcode.CHECK_CAST,
|
||||
),
|
||||
customFingerprint = { methodDef ->
|
||||
customFingerprint = { methodDef, _ ->
|
||||
methodDef.implementation?.instructions?.any { instruction ->
|
||||
instruction.opcode.ordinal == Opcode.CONST.ordinal &&
|
||||
(instruction as? WideLiteralInstruction)?.wideLiteral == HideEndscreenCardsResourcePatch.layoutCircle
|
||||
|
||||
@@ -13,7 +13,7 @@ object LayoutIconFingerprint : MethodFingerprint(
|
||||
Opcode.MOVE_RESULT_OBJECT,
|
||||
Opcode.CHECK_CAST,
|
||||
),
|
||||
customFingerprint = { methodDef ->
|
||||
customFingerprint = { methodDef, _ ->
|
||||
methodDef.implementation?.instructions?.any { instruction ->
|
||||
instruction.opcode.ordinal == Opcode.CONST.ordinal &&
|
||||
(instruction as? WideLiteralInstruction)?.wideLiteral == HideEndscreenCardsResourcePatch.layoutIcon
|
||||
|
||||
@@ -13,7 +13,7 @@ object LayoutVideoFingerprint : MethodFingerprint(
|
||||
Opcode.MOVE_RESULT_OBJECT,
|
||||
Opcode.CHECK_CAST,
|
||||
),
|
||||
customFingerprint = { methodDef ->
|
||||
customFingerprint = { methodDef, _ ->
|
||||
methodDef.implementation?.instructions?.any { instruction ->
|
||||
instruction.opcode.ordinal == Opcode.CONST.ordinal &&
|
||||
(instruction as? WideLiteralInstruction)?.wideLiteral == HideEndscreenCardsResourcePatch.layoutVideo
|
||||
|
||||
@@ -7,8 +7,8 @@ import org.jf.dexlib2.iface.instruction.WideLiteralInstruction
|
||||
|
||||
abstract class LiteralOpcodesFingerprint(opcodes: List<Opcode>, literal: Long) : MethodFingerprint(
|
||||
opcodes = opcodes,
|
||||
customFingerprint = {
|
||||
it.implementation?.instructions?.any { instruction ->
|
||||
customFingerprint = { methodDef, _ ->
|
||||
methodDef.implementation?.instructions?.any { instruction ->
|
||||
if (instruction.opcode != Opcode.CONST) return@any false
|
||||
|
||||
val wideLiteral = (instruction as WideLiteralInstruction).wideLiteral
|
||||
|
||||
@@ -11,7 +11,7 @@ object ShowFloatingMicrophoneButtonFingerprint : MethodFingerprint(
|
||||
Opcode.IF_EQZ,
|
||||
Opcode.RETURN_VOID
|
||||
),
|
||||
customFingerprint = { methodDef ->
|
||||
customFingerprint = { methodDef, _ ->
|
||||
methodDef.implementation?.instructions?.any {
|
||||
(it as? WideLiteralInstruction)?.wideLiteral == HideFloatingMicrophoneButtonResourcePatch.fabButtonId
|
||||
} == true
|
||||
|
||||
@@ -10,7 +10,7 @@ object GetPremiumViewFingerprint : MethodFingerprint(
|
||||
Opcode.INVOKE_VIRTUAL,
|
||||
Opcode.RETURN_VOID
|
||||
),
|
||||
customFingerprint = { methodDef ->
|
||||
customFingerprint = { methodDef, _ ->
|
||||
methodDef.definingClass == "Lcom/google/android/apps/youtube/app/red/presenter/CompactYpcOfferModuleView;"
|
||||
&& methodDef.name == "onMeasure"
|
||||
}
|
||||
|
||||
@@ -11,7 +11,7 @@ object InfocardsMethodCallFingerprint : MethodFingerprint(
|
||||
Opcode.IGET_OBJECT,
|
||||
Opcode.INVOKE_INTERFACE,
|
||||
),
|
||||
customFingerprint = { methodDef ->
|
||||
customFingerprint = { methodDef, _ ->
|
||||
methodDef.implementation?.instructions?.any { instruction ->
|
||||
(instruction as? WideLiteralInstruction)?.wideLiteral == HideInfocardsResourcePatch.drawerResourceId
|
||||
} == true
|
||||
|
||||
@@ -17,7 +17,7 @@ object HideLoadMoreButtonFingerprint : MethodFingerprint(
|
||||
Opcode.INVOKE_STATIC,
|
||||
Opcode.MOVE_RESULT_OBJECT
|
||||
),
|
||||
customFingerprint = { methodDef ->
|
||||
customFingerprint = { methodDef, _ ->
|
||||
methodDef.implementation?.instructions?.any {
|
||||
if (it.opcode != Opcode.CONST) return@any false
|
||||
|
||||
|
||||
@@ -15,7 +15,7 @@ object AccountSwitcherAccessibilityLabelFingerprint : MethodFingerprint(
|
||||
Opcode.APUT_OBJECT,
|
||||
Opcode.CONST,
|
||||
),
|
||||
customFingerprint = { methodDef ->
|
||||
customFingerprint = { methodDef, _ ->
|
||||
methodDef.implementation?.instructions?.any { instruction ->
|
||||
instruction.opcode.ordinal == Opcode.CONST.ordinal &&
|
||||
(instruction as? WideLiteralInstruction)?.wideLiteral == HideEmailAddressResourcePatch.accountSwitcherAccessibilityLabelId
|
||||
|
||||
@@ -16,7 +16,7 @@ object CreatePlayerOverviewFingerprint : MethodFingerprint(
|
||||
Opcode.MOVE_RESULT_OBJECT,
|
||||
Opcode.CHECK_CAST
|
||||
),
|
||||
customFingerprint = { methodDef ->
|
||||
customFingerprint = { methodDef, _ ->
|
||||
methodDef.implementation?.instructions?.any {
|
||||
if (it.opcode != Opcode.CONST) return@any false
|
||||
|
||||
|
||||
@@ -14,5 +14,7 @@ object FullscreenViewAdderParentFingerprint : MethodFingerprint(
|
||||
Opcode.CONST_4,
|
||||
Opcode.INVOKE_VIRTUAL,
|
||||
),
|
||||
customFingerprint = { it.definingClass.endsWith("FullscreenEngagementPanelOverlay;") }
|
||||
customFingerprint = { methodDef, _ ->
|
||||
methodDef.definingClass.endsWith("FullscreenEngagementPanelOverlay;")
|
||||
}
|
||||
)
|
||||
|
||||
@@ -19,7 +19,7 @@ object DislikesOldLayoutTextViewFingerprint : MethodFingerprint(
|
||||
Opcode.IF_NEZ, // textview register
|
||||
Opcode.GOTO,
|
||||
),
|
||||
customFingerprint = { methodDef ->
|
||||
customFingerprint = { methodDef, _ ->
|
||||
methodDef.implementation?.instructions?.any { instruction ->
|
||||
instruction.opcode.ordinal == Opcode.CONST.ordinal &&
|
||||
(instruction as? WideLiteralInstruction)?.wideLiteral == ReturnYouTubeDislikeResourcePatch.oldUIDislikeId
|
||||
|
||||
@@ -1,23 +0,0 @@
|
||||
package app.revanced.patches.youtube.layout.returnyoutubedislike.fingerprints
|
||||
|
||||
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
||||
import org.jf.dexlib2.Opcode
|
||||
|
||||
object ShortsTextComponentParentFingerprint : MethodFingerprint(
|
||||
returnType = "V",
|
||||
parameters = listOf("L", "L"),
|
||||
opcodes = listOf(
|
||||
Opcode.INVOKE_STATIC,
|
||||
Opcode.MOVE_RESULT_OBJECT,
|
||||
Opcode.GOTO,
|
||||
Opcode.INVOKE_STATIC,
|
||||
Opcode.MOVE_RESULT_OBJECT,
|
||||
Opcode.INVOKE_VIRTUAL,
|
||||
Opcode.RETURN_VOID,
|
||||
Opcode.IGET_OBJECT,
|
||||
Opcode.CHECK_CAST,
|
||||
Opcode.IGET_BOOLEAN,
|
||||
Opcode.IF_EQZ,
|
||||
Opcode.INVOKE_STATIC
|
||||
)
|
||||
)
|
||||
@@ -0,0 +1,30 @@
|
||||
package app.revanced.patches.youtube.layout.returnyoutubedislike.fingerprints
|
||||
|
||||
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
||||
import org.jf.dexlib2.Opcode
|
||||
|
||||
object ShortsTextViewFingerprint : MethodFingerprint(
|
||||
returnType = "V",
|
||||
parameters = listOf("L", "L"),
|
||||
opcodes = listOf(
|
||||
Opcode.INVOKE_SUPER, // first instruction of method
|
||||
Opcode.IF_NEZ,
|
||||
Opcode.RETURN_VOID,
|
||||
Opcode.INVOKE_VIRTUAL,
|
||||
Opcode.MOVE_RESULT_OBJECT,
|
||||
Opcode.CHECK_CAST,
|
||||
Opcode.SGET_OBJECT, // insertion point, must be after constructor call to parent class
|
||||
Opcode.INVOKE_VIRTUAL,
|
||||
Opcode.MOVE_RESULT,
|
||||
Opcode.CONST_4,
|
||||
Opcode.IF_EQZ,
|
||||
Opcode.CONST_4,
|
||||
Opcode.IF_EQ,
|
||||
Opcode.CONST_4,
|
||||
Opcode.IF_EQ,
|
||||
Opcode.RETURN_VOID,
|
||||
Opcode.IGET_OBJECT, // TextView field
|
||||
Opcode.CHECK_CAST,
|
||||
Opcode.IGET_BOOLEAN, // boolean field
|
||||
)
|
||||
)
|
||||
@@ -5,7 +5,6 @@ import app.revanced.patcher.annotation.Description
|
||||
import app.revanced.patcher.annotation.Name
|
||||
import app.revanced.patcher.annotation.Version
|
||||
import app.revanced.patcher.data.BytecodeContext
|
||||
import app.revanced.patcher.data.toMethodWalker
|
||||
import app.revanced.patcher.extensions.MethodFingerprintExtensions.name
|
||||
import app.revanced.patcher.extensions.addInstruction
|
||||
import app.revanced.patcher.extensions.addInstructions
|
||||
@@ -19,14 +18,12 @@ import app.revanced.patcher.patch.PatchResultError
|
||||
import app.revanced.patcher.patch.PatchResultSuccess
|
||||
import app.revanced.patcher.patch.annotations.DependsOn
|
||||
import app.revanced.patcher.patch.annotations.Patch
|
||||
import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod
|
||||
import app.revanced.patches.youtube.layout.returnyoutubedislike.annotations.ReturnYouTubeDislikeCompatibility
|
||||
import app.revanced.patches.youtube.layout.returnyoutubedislike.fingerprints.*
|
||||
import app.revanced.patches.youtube.layout.returnyoutubedislike.resource.patch.ReturnYouTubeDislikeResourcePatch
|
||||
import app.revanced.patches.youtube.misc.integrations.patch.IntegrationsPatch
|
||||
import app.revanced.patches.youtube.misc.playertype.patch.PlayerTypeHookPatch
|
||||
import app.revanced.patches.youtube.video.videoid.patch.VideoIdPatch
|
||||
import org.jf.dexlib2.builder.instruction.BuilderInstruction35c
|
||||
import org.jf.dexlib2.iface.instruction.FiveRegisterInstruction
|
||||
import org.jf.dexlib2.iface.instruction.OneRegisterInstruction
|
||||
import org.jf.dexlib2.iface.instruction.ReferenceInstruction
|
||||
@@ -48,7 +45,7 @@ import org.jf.dexlib2.iface.instruction.TwoRegisterInstruction
|
||||
class ReturnYouTubeDislikePatch : BytecodePatch(
|
||||
listOf(
|
||||
TextComponentConstructorFingerprint,
|
||||
ShortsTextComponentParentFingerprint,
|
||||
ShortsTextViewFingerprint,
|
||||
DislikesOldLayoutTextViewFingerprint,
|
||||
LikeFingerprint,
|
||||
DislikeFingerprint,
|
||||
@@ -137,35 +134,40 @@ class ReturnYouTubeDislikePatch : BytecodePatch(
|
||||
|
||||
// region Hook for Short videos.
|
||||
|
||||
ShortsTextComponentParentFingerprint.result?.let {
|
||||
context
|
||||
.toMethodWalker(it.method)
|
||||
.nextMethod(it.scanResult.patternScanResult!!.endIndex, true)
|
||||
.getMethod().let { method ->
|
||||
with(method as MutableMethod) {
|
||||
// After walking, verify the found method is what's expected.
|
||||
if (returnType != ("Ljava/lang/CharSequence;") || parameterTypes.size != 1)
|
||||
return PatchResultError("Method signature did not match: $this $parameterTypes")
|
||||
ShortsTextViewFingerprint.result?.let {
|
||||
it.mutableMethod.apply {
|
||||
val patternResult = it.scanResult.patternScanResult!!
|
||||
|
||||
val insertIndex = implementation!!.instructions.size - 1
|
||||
val spannedParameterRegister = instruction<OneRegisterInstruction>(insertIndex).registerA
|
||||
val parameter = instruction<BuilderInstruction35c>(insertIndex - 2).reference
|
||||
// If the field is true, the TextView is for a dislike button.
|
||||
val isDisLikesBooleanReference = instruction<ReferenceInstruction>(patternResult.endIndex).reference
|
||||
|
||||
if (!parameter.toString().endsWith("Landroid/text/Spanned;"))
|
||||
return PatchResultError("Method signature parameter did not match: $parameter")
|
||||
val textViewFieldReference = // Like/Dislike button TextView field
|
||||
instruction<ReferenceInstruction>(patternResult.endIndex - 2).reference
|
||||
|
||||
insertShorts(insertIndex, spannedParameterRegister)
|
||||
}
|
||||
}
|
||||
|
||||
// Additional hook, called after user dislikes.
|
||||
with(it.mutableMethod) {
|
||||
val insertIndex = it.scanResult.patternScanResult!!.startIndex + 2
|
||||
val overwriteRegister = (implementation!!.instructions.elementAt(insertIndex - 1)
|
||||
as OneRegisterInstruction).registerA
|
||||
insertShorts(insertIndex, overwriteRegister)
|
||||
// Check if the hooked TextView object is that of the dislike button.
|
||||
// If RYD is disabled, or the TextView object is not that of the dislike button, the execution flow is not interrupted.
|
||||
// Otherwise, the TextView object is modified, and the execution flow is interrupted to prevent it from being changed afterward.
|
||||
val insertIndex = patternResult.startIndex + 6
|
||||
addInstructions(
|
||||
insertIndex, """
|
||||
# Check, if the TextView is for a dislike button
|
||||
iget-boolean v0, p0, $isDisLikesBooleanReference
|
||||
if-eqz v0, :is_like
|
||||
|
||||
# Hook the TextView, if it is for the dislike button
|
||||
iget-object v0, p0, $textViewFieldReference
|
||||
invoke-static {v0}, $INTEGRATIONS_CLASS_DESCRIPTOR->setShortsDislikes(Landroid/view/View;)Z
|
||||
move-result v0
|
||||
if-eqz v0, :ryd_disabled
|
||||
return-void
|
||||
|
||||
:is_like
|
||||
:ryd_disabled
|
||||
nop
|
||||
"""
|
||||
)
|
||||
}
|
||||
} ?: return ShortsTextComponentParentFingerprint.toErrorResult()
|
||||
} ?: return ShortsTextViewFingerprint.toErrorResult()
|
||||
|
||||
// endregion
|
||||
|
||||
@@ -201,14 +203,5 @@ class ReturnYouTubeDislikePatch : BytecodePatch(
|
||||
DISLIKE(-1),
|
||||
REMOVE_LIKE(0)
|
||||
}
|
||||
|
||||
private fun MutableMethod.insertShorts(index: Int, register: Int) {
|
||||
addInstructions(
|
||||
index, """
|
||||
invoke-static {v$register}, $INTEGRATIONS_CLASS_DESCRIPTOR->onShortsComponentCreated(Landroid/text/Spanned;)Landroid/text/Spanned;
|
||||
move-result-object v$register
|
||||
"""
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -18,5 +18,5 @@ object SetWordmarkHeaderFingerprint : MethodFingerprint(
|
||||
Opcode.CONST,
|
||||
Opcode.INVOKE_STATIC,
|
||||
),
|
||||
customFingerprint = { methodDef -> methodDef.parameterTypes.first() == "Landroid/widget/ImageView;" }
|
||||
customFingerprint = { methodDef, _ -> methodDef.parameterTypes.first() == "Landroid/widget/ImageView;" }
|
||||
)
|
||||
@@ -8,7 +8,7 @@ import org.jf.dexlib2.AccessFlags
|
||||
|
||||
object CreateDarkThemeSeekbarFingerprint : MethodFingerprint(
|
||||
access = AccessFlags.PUBLIC or AccessFlags.CONSTRUCTOR,
|
||||
customFingerprint = { method ->
|
||||
customFingerprint = { method, _ ->
|
||||
method.indexOfFirstConstantInstruction(SeekbarColorResourcePatch.inlineTimeBarColorizedBarPlayedColorDarkId) != -1
|
||||
&& method.indexOfFirstConstantInstruction(SeekbarColorResourcePatch.inlineTimeBarPlayedNotHighlightedColorId) != -1
|
||||
}
|
||||
|
||||
@@ -21,7 +21,7 @@ object ControlsOverlayFingerprint : MethodFingerprint(
|
||||
Opcode.CHECK_CAST,
|
||||
Opcode.NEW_INSTANCE,
|
||||
),
|
||||
customFingerprint = { methodDef ->
|
||||
customFingerprint = { methodDef, _ ->
|
||||
methodDef.definingClass == "Lcom/google/android/apps/youtube/app/player/overlay/YouTubeControlsOverlay;"
|
||||
}
|
||||
)
|
||||
@@ -7,7 +7,7 @@ import org.jf.dexlib2.iface.reference.MethodReference
|
||||
|
||||
object RectangleFieldInvalidatorFingerprint : MethodFingerprint(
|
||||
"V",
|
||||
customFingerprint = custom@{ methodDef ->
|
||||
customFingerprint = custom@{ methodDef, _ ->
|
||||
val instructions = methodDef.implementation?.instructions!!
|
||||
val instructionCount = instructions.count()
|
||||
|
||||
|
||||
@@ -8,5 +8,7 @@ object AutoRepeatFingerprint : MethodFingerprint(
|
||||
"V",
|
||||
AccessFlags.PUBLIC or AccessFlags.FINAL,
|
||||
listOf(),
|
||||
customFingerprint = { methodDef -> methodDef.implementation!!.instructions.count() == 3 && methodDef.annotations.isEmpty()}
|
||||
customFingerprint = { methodDef, _ ->
|
||||
methodDef.implementation!!.instructions.count() == 3 && methodDef.annotations.isEmpty()
|
||||
}
|
||||
)
|
||||
@@ -7,7 +7,7 @@ object OnBackPressedFingerprint : MethodFingerprint(
|
||||
opcodes = listOf(
|
||||
Opcode.RETURN_VOID
|
||||
),
|
||||
customFingerprint = { methodDef ->
|
||||
customFingerprint = { methodDef, _ ->
|
||||
methodDef.definingClass.endsWith("WatchWhileActivity;")
|
||||
&& methodDef.name == "onBackPressed"
|
||||
}
|
||||
|
||||
@@ -14,7 +14,7 @@ object RecyclerViewTopScrollingParentFingerprint : MethodFingerprint(
|
||||
Opcode.INVOKE_VIRTUAL,
|
||||
Opcode.NEW_INSTANCE
|
||||
),
|
||||
customFingerprint = { methodDef ->
|
||||
customFingerprint = { methodDef, _ ->
|
||||
methodDef.name == "<init>"
|
||||
}
|
||||
)
|
||||
@@ -4,7 +4,7 @@ import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
||||
|
||||
object SubtitleWindowSettingsConstructorFingerprint : MethodFingerprint(
|
||||
parameters = listOf("I", "I", "I", "Z", "Z"),
|
||||
customFingerprint = { methodDef ->
|
||||
customFingerprint = { methodDef, _ ->
|
||||
methodDef.definingClass == "Lcom/google/android/libraries/youtube/player/subtitles/model/SubtitleWindowSettings;"
|
||||
&& methodDef.name == "<init>"
|
||||
}
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user